diff --git a/.all-contributorsrc b/.all-contributorsrc index 96154441279..238b168cf4c 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" ] @@ -5873,7 +5873,8 @@ "profile": "https://github.com/MiConnell", "contributions": [ "content", - "code" + "code", + "bug" ] }, { @@ -8829,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" ] @@ -8838,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" ] @@ -10965,6 +10966,150 @@ "contributions": [ "content" ] + }, + { + "login": "sminempepe", + "name": "sminempepe", + "avatar_url": "https://avatars.githubusercontent.com/u/76882704?v=4", + "profile": "https://github.com/sminempepe", + "contributions": [ + "doc" + ] + }, + { + "login": "aslikaya", + "name": "aslikaya", + "avatar_url": "https://avatars.githubusercontent.com/u/9151261?v=4", + "profile": "https://github.com/aslikaya", + "contributions": [ + "doc" + ] + }, + { + "login": "lucas-amberg", + "name": "Lucas Amberg", + "avatar_url": "https://avatars.githubusercontent.com/u/102396588?v=4", + "profile": "http://lucasamberg.dev", + "contributions": [ + "doc" + ] + }, + { + "login": "a-hagi613", + "name": "Abdullahi", + "avatar_url": "https://avatars.githubusercontent.com/u/92589940?v=4", + "profile": "https://a-hagi.dev/", + "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" + ] + }, + { + "login": "MohitKambli", + "name": "Mohit Kambli", + "avatar_url": "https://avatars.githubusercontent.com/u/31406633?v=4", + "profile": "https://github.com/MohitKambli", + "contributions": [ + "code" + ] + }, + { + "login": "oleksandr-hyriavets", + "name": "Oleksandr Hyriavets", + "avatar_url": "https://avatars.githubusercontent.com/u/19614509?v=4", + "profile": "https://github.com/oleksandr-hyriavets", + "contributions": [ + "code" + ] + }, + { + "login": "titanism", + "name": "titanism", + "avatar_url": "https://avatars.githubusercontent.com/u/101466223?v=4", + "profile": "https://github.com/titanism", + "contributions": [ + "doc" + ] + }, + { + "login": "Maxservais", + "name": "Maxime Servais", + "avatar_url": "https://avatars.githubusercontent.com/u/43566493?v=4", + "profile": "https://www.ethereum-ecosystem.com/", + "contributions": [ + "code" + ] + }, + { + "login": "nebolax", + "name": "Alexey Nebolsin", + "avatar_url": "https://avatars.githubusercontent.com/u/63492346?v=4", + "profile": "https://t.me/nebolax", + "contributions": [ + "doc" + ] + }, + { + "login": "jimgreen2013", + "name": "jimgreen2013", + "avatar_url": "https://avatars.githubusercontent.com/u/15890793?v=4", + "profile": "https://github.com/jimgreen2013", + "contributions": [ + "doc" + ] + }, + { + "login": "gabrieltemtsen", + "name": "Gabriel Temsten", + "avatar_url": "https://avatars.githubusercontent.com/u/57184013?v=4", + "profile": "https://github.com/gabrieltemtsen", + "contributions": [ + "code" + ] + }, + { + "login": "jennyg0", + "name": "Jen ", + "avatar_url": "https://avatars.githubusercontent.com/u/60794961?v=4", + "profile": "https://github.com/jennyg0", + "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" + ] + }, + { + "login": "rimtaex", + "name": "RimTaeX", + "avatar_url": "https://avatars.githubusercontent.com/u/155366533?v=4", + "profile": "https://github.com/rimtaex", + "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, 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 diff --git a/.github/workflows/get-translation-progress.yml b/.github/workflows/get-translation-progress.yml new file mode 100644 index 00000000000..a476785c909 --- /dev/null +++ b/.github/workflows/get-translation-progress.yml @@ -0,0 +1,64 @@ +name: Update Crowdin translation progression + +on: + schedule: + - cron: "20 16 * * FRI" + workflow_dispatch: + +jobs: + create_pr: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install dependencies + run: yarn install + + - name: Install ts-node + run: yarn global add ts-node + + - name: Set up git + run: | + git config --global user.email "actions@github.com" + git config --global user.name "GitHub Action" + + - name: Generate timestamp and readable date + id: date + run: | + echo "TIMESTAMP=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV + echo "READABLE_DATE=$(date +'%B %-d')" >> $GITHUB_ENV + + - name: Fetch latest dev and create new branch + run: | + git fetch origin dev + git checkout -b "automated-update-${{ env.TIMESTAMP }}" origin/dev + + - name: Run script + run: npx ts-node -O '{"module":"commonjs"}' ./src/scripts/crowdin/getTranslationProgress.ts + env: + CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }} + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + + - name: Commit and push + run: | + git add -A + git commit -m "Update Crowdin translation progress" + git push origin "automated-update-${{ env.TIMESTAMP }}" + + - name: Create PR body + run: | + echo "This PR was automatically created to update Crowdin translation progress." > pr_body.txt + echo "This workflows runs every Friday at 16:20 (UTC)." >> pr_body.txt + echo "" >> pr_body.txt + echo "Thank you to everyone contributing to translate ethereum.org ❤️" >> pr_body.txt + + - name: Create Pull Request + run: | + gh auth login --with-token <<< ${{ secrets.GITHUB_TOKEN }} + gh pr create --base dev --head "automated-update-${{ env.TIMESTAMP }}" --title "Update translation progress from Crowdin - ${{ env.READABLE_DATE }}" --body-file pr_body.txt diff --git a/README.md b/README.md index 3f21484ed93..2557145741c 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!

@@ -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

💻 @@ -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

💻 @@ -1409,8 +1409,8 @@ 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

🌍 Lohan
Lohan

💻 @@ -1711,6 +1711,26 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Tarun Mohandas Daryanani
Tarun Mohandas Daryanani

🖋 Shubh
Shubh

🖋 duckdegen
duckdegen

🖋 + sminempepe
sminempepe

📖 + aslikaya
aslikaya

📖 + + + Lucas Amberg
Lucas Amberg

📖 + Abdullahi
Abdullahi

🐛 + Pranav Konde
Pranav Konde

🖋 + Mohit Kambli
Mohit Kambli

💻 + Oleksandr Hyriavets
Oleksandr Hyriavets

💻 + titanism
titanism

📖 + Maxime Servais
Maxime Servais

💻 + + + Alexey Nebolsin
Alexey Nebolsin

📖 + jimgreen2013
jimgreen2013

📖 + Gabriel Temsten
Gabriel Temsten

💻 + Jen
Jen

💻 + Eugene
Eugene

🖋 + RimTaeX
RimTaeX

🖋 + Daniel Zarifpour
Daniel Zarifpour

🖋 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. diff --git a/i18n.config.json b/i18n.config.json index 06b6c673ced..f6b9d006b66 100644 --- a/i18n.config.json +++ b/i18n.config.json @@ -297,7 +297,7 @@ }, { "code": "ne-np", - "crowdinCode": "ne-np", + "crowdinCode": "ne-NP", "name": "Nepali", "localName": "नेपाली", "langDir": "ltr", @@ -457,7 +457,7 @@ }, { "code": "ur", - "crowdinCode": "ur", + "crowdinCode": "ur-IN", "name": "Urdu", "localName": "اردو", "langDir": "rtl", diff --git a/netlify.toml b/netlify.toml index 3e26ef59558..22bd377bb8e 100644 --- a/netlify.toml +++ b/netlify.toml @@ -22,4 +22,5 @@ "./src/intl/**/*", "!./public/**/*", "!./node_modules/@swc/core-linux-x64-musl/**/*", + "!./node_modules/@swc/core-linux-x64-gnu/**/*", ] \ No newline at end of file diff --git a/next-i18next.config.js b/next-i18next.config.js index bacf8af4049..c9ea46a265b 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -9,9 +9,12 @@ 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], + localeDetection: false, }, // 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..2223e7718aa 100644 --- a/next.config.js +++ b/next.config.js @@ -34,6 +34,7 @@ module.exports = (phase, { defaultConfig }) => { return config }, i18n, + trailingSlash: true, images: { deviceSizes: [640, 750, 828, 1080, 1200, 1504, 1920], }, diff --git a/package.json b/package.json index 6561db6fbfb..629842197e4 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,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/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 diff --git a/public/_redirects b/public/_redirects index 5ee30bff053..9d12486501d 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! @@ -74,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! @@ -150,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! @@ -175,9 +173,3 @@ /*/staking/withdraws /:splat/staking/withdrawals/ 301! /*/guides/how-to-register-an-ethereum-account /:splat/guides/how-to-create-an-ethereum-account/ 301! - -/studio /en/deprecated-software/#ethereum-studio 301! - -/*/studio /:splat/deprecated-software/#ethereum-studio 301! - -/en/stablecoins /stablecoins 301! \ No newline at end of file diff --git a/public/assets/manifest-homepage-screenshot-mobile.png b/public/assets/manifest-homepage-screenshot-mobile.png deleted file mode 100644 index 319e45b3955..00000000000 Binary files a/public/assets/manifest-homepage-screenshot-mobile.png and /dev/null differ diff --git a/public/assets/manifest-homepage-screenshot.png b/public/assets/manifest-homepage-screenshot.png deleted file mode 100644 index a09426f4b1a..00000000000 Binary files a/public/assets/manifest-homepage-screenshot.png and /dev/null differ 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/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/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/) diff --git a/public/content/community/grants/index.md b/public/content/community/grants/index.md index 88a227b64ec..0b69aac8c3a 100644 --- a/public/content/community/grants/index.md +++ b/public/content/community/grants/index.md @@ -27,14 +27,14 @@ 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://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/) ecosystem fund_ +- [Balancer](https://grants.balancer.community/) – _[Balancer](https://balancer.fi/) ecosystem fund_ - [Chainlink Grants Program](https://chain.link/community/grants) - _[Chainlink](https://chain.link/) community grants_ - [Decentraland Grants Program](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/) DAO Metaverse_ - [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) finance ecosystem_ - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ - [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_ -- [Uniswap Grants Program](https://www.uniswapfoundation.org/apply-for-a-grant) - _[Uniswap](https://uniswap.org/) community_ +- [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/) ecosystem_ +- [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} 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. 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/contributing/design/index.md b/public/content/contributing/design/index.md index d1798c4d56c..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/contributing/style-guide/content-standardization/index.md b/public/content/contributing/style-guide/content-standardization/index.md index aaa30266316..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} @@ -155,6 +157,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/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/) 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. diff --git a/public/content/deprecated-software/index.md b/public/content/deprecated-software/index.md deleted file mode 100644 index e9386b322bb..00000000000 --- a/public/content/deprecated-software/index.md +++ /dev/null @@ -1,428 +0,0 @@ ---- -title: Deprecated software -description: Software which has been deprecated by its maintainers -lang: en -sidebarDepth: 2 ---- - -# Deprecated software {#summary-deprecated-software} - -This is a list of key Ethereum-related projects and resources which have been deprecated or are no longer maintained. It is important to highlight deprecated work so that users can find viable alternatives and to prevent malicious versions from being distributed. - -This list is curated by our community. If there's something missing or incorrect, please edit this page! - -## Proof-of-work {#pow} - -[Proof of work](/developers/docs/consensus-mechanisms/pow) is a consensus engine that was implemented in Ethereum until September 2022. It was deprecated when Ethereum swapped to a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) based consensus mechanism. This was achieved by deprecating the parts of the client software related to proof-of-work mining, including [Ethhash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethhash) (the mining algorithm) and all the consensus logic and block gossiping functionality that was originally built in to execution clients. The clients themselves were not deprecated but several of their core components were. The concept of proof-of-work was deprecated as the total effect of removing the related components of the client software. - -## Software {#software} - -This section is for software for the desktop, command line, or server which has been deprecated. The main types are wallets, integrated development environments, languages, and Ethereum clients. Definitely be careful to not install deprecated software unless you are certain it is from the original source, e.g. a repo hosted under https://github.com/ethereum. - -### OpenEthereum {#open-ethereum} - -Deprecated July 2021 - -**Summary** - -OpenEthereum was the second largest Ethereum implementation by node count. OpenEthereum played an important role in being a key piece of infrastructure for some of the largest users in Ethereum like Etherscan and Gnosis Safe. Its tracing capabilities set it apart from other clients, ensuring reliable and fast synchronization for data providers. - -**Archives** - -[Archived GitHub repo](https://github.com/openethereum/openethereum) - -**History** - -OpenEthereum was built for miners, service providers, and exchanges which need fast synchronization and maximum uptime. OpenEthereum provided the core infrastructure essential for speedy and reliable services. - -**Alternatives** - -[Compare all Ethereum execution client options](/developers/docs/nodes-and-clients/#execution-clients). - -### Grid {#grid} - -Deprecated on December 10, 2020 - -**Summary** - -Grid was a JavaScript-based desktop application that allowed you to securely access Ethereum, IPFS, and other decentralized networks. It provided a user-friendly interface to assist a less technical audience in safely interacting with dapps, which increased accessibility for everyone. - -**Archives** - -[Archived GitHub repo](https://github.com/ethereum/grid) - -**History** - -Grid could be seen as a successor to Mist, also a standalone, JavaScript-based desktop app which included a Geth node. Grid removed the wallet aspect, and added a plugin-style approach for running different kinds of nodes. - -**Alternatives** - -[DAppNode](https://dappnode.io/) is a platform for deploying and hosting dapps, P2P clients, and blockchain nodes. - -### Ethereum Studio {#ethereum-studio} - -Deprecated on December 7, 2020 - -**Summary** - -Ethereum Studio was a web-based IDE which allowed users to create and test smart contracts, as well as build front-ends for them. - -**Archives** - -[Archived GitHub repo](https://github.com/SuperblocksHQ/ethereum-studio) - -**History** - -Ethereum Studio was developed to provide users with an IDE that had a built-in Ethereum blockchain and Solidity compiler. In addition to this it provided the ability to live edit code and export full dapps without the need for a terminal. - -**Alternatives** - -[Remix](https://remix.ethereum.org/) is an alternative web IDE for Solidity development. Additionally, the [Developer Portal](/developers/) has tools for web and local development, documentation, and more. - -### Meteor Dapp Wallet {#meteor-dapp-wallet} - -Deprecated on March 27, 2019 - -**Summary** - -Meteor Dapp Wallet was a component of Mist, an Ethereum wallet for managing Ethereum accounts and interacting with smart contracts. For many years the Meteor Dapp Wallet web UI was hosted as a subdomain "wallet.ethereum.org". - -The Mist Multisig Contract (solidity code) was also included, and Meteor Dapp Wallet featured a user interface for configuring and deploying it. - -**Not deprecated: deployed Mist Multisigs** - -The Mist Multisig -- deployed as bytecode to Ethereum Mainnet by thousands of users -- continues to be used to store and manage value without incident. [How to Interact with a Mist Multisig Contract](https://support.mycrypto.com/how-to/sending/how-to-interact-with-a-multisig-contract) provides a good overview for how to use these smart contracts. - -**Archives** - -[Archived GitHub repo](https://github.com/ethereum/meteor-dapp-wallet) - -**History** - -See Mist below. - -**Alternatives** - -See the [Ethereum Wallets](/wallets/) page on ethereum.org. - -### Mist {#mist} - -Deprecated on March 27, 2019 - -**Summary** - -Mist was a specialized browser built with Electron that enabled users to manage Ethereum accounts and interact with dapps hosted on the traditional web. - -**Archives** - -[Archived GitHub repo](https://github.com/ethereum/mist) - -**History** - -Mist was an important early experiment because it explored how to manage Ethereum keys, introduced users to financial tools, like multisigs, and demonstrated how the Web3 would work. It also introduced users to innovations like blockies, cute and memorable 8-bit style graphics representing Ethereum keys. - -**Alternatives** - -[MetaMask](https://metamask.io/) is an in-browser wallet enabling you to manage Ethereum keys and interact with dapps. It is available as an extension for Google Chrome and Firefox, and is included in [Brave Browser](https://brave.com/). - -### Mix {#mix} - -Deprecated on August 11, 2016 - -**Summary** - -Mix was an IDE built in C++ that allowed developers to build and deploy smart contracts to Ethereum. - -**Archives** - -[Archived GitHub repo](https://github.com/ethereum/mix) - -**History** - -Mix was of the earliest Ethereum-related applications. See this [presentation by Gavin Wood at Devcon0](https://www.youtube.com/watch?v=hcP_z_wBlaM). - -**Alternatives** - -[Remix](https://remix.ethereum.org/) is a browser-hosted IDE for Solidity / smart contract development, testing, and deployment. It also has a desktop option. - -### Minimal {#minimal} - -Deprecated in 2020. - -**Summary** - -Minimal was a modular implementation of the Ethereum blockchain written in Go. - -**Archives** - -[Archived GitHub repo](https://github.com/umbracle/minimal) - -**History** - -Minimal was replaced by [polgon-sdk](https://github.com/0xPolygon/polygon-edge) - -### Hyperledger Burrow {#hyperledger-burrow} - -Deprecated in 2022. - -**Summary** - -Hyperledger Burrow was a permissioned Ethereum smart-contract blockchain node. It executed Ethereum EVM and WASM smart contract code on permissioned virtual machines. - -**Archives** - -[Archived GitHub repo](https://github.com/hyperledger/burrow) - -### Mana-Ethereum {#mana-ethereum} - -**Summary** - -Mana-Ethereum was an Ethereum client built using Elixir. - -**Archives** - -[Archived GitHub repo](https://github.com/mana-ethereum/mana) - -**History** - -Mana-Ethereum's GitHub repository has not been explicitly archived, but the last commit was in 2019. - -### Aleth (cpp-ethereum) {#aleth} - -Deprecated on October 6, 2021 - -**Summary** - -Aleth (formerly known as cpp-ethereum) was an Ethereum client written in C++. - -**Archives** - -[Archived GitHub repo](https://github.com/ethereum/aleth) - -**History** - -Aleth was the third most popular client for Ethereum before being deprecated on October 6, 2021. - -**Alternatives** - -[Geth](https://geth.ethereum.org/) is a well-known alternative Ethereum client. - -### Ethereum-H {#ethereum-h} - -**Archives** - -The Ethereum-H archives have been removed from GitHub. - -**History** - -Ethereum-H was an Ethereum client written in Haskell. It was deprecated around 2015. - -**Alternatives** - -[Geth](https://geth.ethereum.org/), [Nethermind](http://nethermind.io/), [Besu](https://besu.hyperledger.org/en/stable/) and [Erigon](https://github.com/ledgerwatch/erigon) are viable alternative Ethereum clients - there is no current Haskell client. - -### ruby-ethereum {#ruby-ethereum} - -**Archives** - -[ruby-ethereum GitHub repo](https://github.com/cryptape/ruby-ethereum) - -**History** - -ruby-ethereum was an Ethereum client written in Ruby. It was deprecated around 2018. - -**Alternatives** - -[Geth](https://geth.ethereum.org/), [Nethermind](http://nethermind.io/), [Besu](https://besu.hyperledger.org/en/stable/) and [Erigon](https://github.com/ledgerwatch/erigon) are viable alternative Ethereum clients. There is no current Ruby client. - -### Parity {#parity} - -Deprecated on June 2, 2020 - -**Summary** - -Parity was an Ethereum client written in Rust. - -**Archives** - -[Archived GitHub repo](https://github.com/openethereum/parity-ethereum) - -**History** - -As one of two major, viable clients in the early years of Ethereum (the other being Geth), Parity was a crucial part of the ecosystem. During the Shanghai Attacks of 2016 Parity enabled Ethereum network to continue operating when clients like Geth were taken down by the attack, proving the importance of client diversity. - -**Alternatives** - -[Erigon](https://github.com/ledgerwatch/erigon) Erigon (previously called Turbo-Geth) is a next generation Ethereum client on the efficiency frontier, written in Go. - -**Note:** _The successor project to Parity Ethereum client was [OpenEthereum](https://github.com/openethereum/openethereum) **which has since been deprecated.**_ - -The ["Spin up your own Ethereum node"](/developers/docs/nodes-and-clients/run-a-node/#getting-the-client) resource on ethereum.org includes a section for downloading, installing, and running an Ethereum client. - -### Trinity {#trinity} - -Deprecated on July 1, 2021 - -**Summary** - -Trinity was a python-based Ethereum client which served as a research and educational tool for the community. A large number of python-based modules related to Trinity continue to be maintained by the same team, including [Py-EVM](https://github.com/ethereum/py-evm). - -**Archives** - -[Archived GitHub repo](https://github.com/ethereum/trinity) - -**History** - -Trinity was the successor project to [pyethereum](https://github.com/ethereum/pyethereum/tree/b704a5c6577863edc539a1ec3d2620a443b950fb), an early python-based Ethereum client. - -**Alternatives** - -The ["Spin up your own Ethereum node"](/developers/docs/nodes-and-clients/run-a-node/#getting-the-client) resource on ethereum.org includes a section for downloading, installing, and running an Ethereum client. - -The [EthereumJS](https://github.com/ethereumjs) project has a similar research and educational use-case as Trinity did. - -## Dapps and Services {#dapps-and-services} - -This section is for services deployed to Ethereum Mainnet and other EVM-based networks. Be aware that the dapps and services here may include DeFi applications which have been hacked or may suffer security vulnerabilities due to lack of maintenance, changes in the protocol, etc. - -### Cover Protocol {#cover-protocol} - -Shut down in Fall 2021 - -**Summary** - -Cover was a DeFi insurance protocol running on Ethereum and other EVM-based networks. - -**Archives** - -[Website](https://wayback.archive-it.org/17679/20211004074635/https://www.coverprotocol.com/) - -[Medium articles](https://wayback.archive-it.org/17679/20211004074633/https://coverprotocol.medium.com/) - -[GitHub repos](https://github.com/CoverProtocol/cover-core-v1) - -[Documentation](https://wayback.archive-it.org/17679/20211004074634/https://docs.coverprotocol.com/) - -### The DAO {#the-dao} - -Hacked and shut down in Summer 2016 - -**Summary** - -The DAO was a smart contract, dapp, and forum for organizing the funding of projects. A vulnerability was exploited and much of the ETH was drained, leading to a community-organized hard fork in order to return ETH to those who had deposited to The DAO. The UX front-end and forum are discontinued. - -**Archives** - -[Internet Archive of "daohub.org" on May 14, 2016](https://web.archive.org/web/20160514105232/https://daohub.org/) - -**History** - -While The DAO failed, the concept endured. The basic technical, social, and governance model innovated for The DAO is widely in use in DeFi, NFT, and project-funding communities. - -["DAO Fork" on ethereum.org](/history/#dao-fork) - -[Wikipedia entry for "The DAO"]() - -**Alternatives** - -["DAOs" on ethereum.org](/dao/) - -[MolochDAO](https://www.molochdao.com/) - -[Gitcoin Grants](https://gitcoin.co/grants/) - -### SparkPool {#sparkpool} - -Shut down in Fall 2021 - -**Summary** - -Headquartered in Hangzhou, the SparkPool service and community was one of the largest Ethereum-centered mining pools in the world. - -**Archives** - -**History** - -Associated with the EthFans community, the service was launched in 2015. SparkPool was disbanded in Fall, 2021 as a result of stricter legal regulations. - -**Alternatives** - -[Ethermine](https://ethermine.org/) - -## Documentation and Information Sources {#documentation-and-information-sources} - -There are numerous sources of documentation, articles, tutorials, and forums which are now removed or live but no longer maintained. We have selected a few which are significant or whose current status as deprecated may lead to confusion or scam attempts. - -### Legacy Wiki and eth.wiki {#eth-wiki} - -**Summary** - -Legacy Wiki and eth.wiki were wikis maintained by the Ethereum Foundation for the wider community. They were mainly oriented toward hosting detailed descriptions of key aspects of the Ethereum platform and summarizations of technical roadmaps. - -**Archives** - -[Archived GitHub repo for eth.wiki](https://github.com/ethereum/eth-wiki) - -[Archived GitHub repo for Legacy Wiki](https://github.com/ethereum/wiki/wiki) - -**History** - -Legacy Wiki was a GitHub wiki and a very early locus of technical content (including the original Ethereum Whitepaper). Over time, Ethereum developers migrated their documentation, specifications, and technical description work to other platforms like [Read the Docs](https://readthedocs.org/) and GitHub-hosted content. - -In 2019 and 2020, eth.wiki became the successor to Legacy Wiki, but an enduring community of contributors did not materialize. - -**Alternatives** - -Community-driven content: [Ethereum.org Website](/) - -Ethereum software projects often host their documentation on [Read the Docs](https://readthedocs.org/) - -GitHub-hosted technical specifications: [EIPs](https://github.com/ethereum/EIPs), [Execution Specs](https://github.com/ethereum/execution-specs), [Consensus Specs](https://github.com/ethereum/consensus-specs) - -### forum.ethereum.org {#forum-ethereum-org} - -**Summary** - -Ethereum Community Forum was a discussion board maintained by the Ethereum Foundation and hosted on Vanilla Forums. It used the subdomain "forum.ethereum.org". - -**Archives** - -Archive URL: [https://wayback.archive-it.org/16516/20210618210825/https://forum.ethereum.org/](https://wayback.archive-it.org/16516/20210618210825/https://forum.ethereum.org/) - -**History** - -This Forum was an early, "official" discussion board for the Ethereum community. Along with [/r/ethereum](https://reddit.com/r/ethereum) and a handful of Skype channels, it was an important point of coordination for developers, designers, and organizers. Over the years the participants of the Forum moved on and it became more of a place for the mining community. - -**Alternatives** - -[/r/ethereum](https://reddit.com/r/ethereum), and a large number of DAO Forums and Discord servers. - -## Gitter Channels {#gitter-channels} - -### AllCoreDevs {#allcorewdevs-gitter} - -**Summary** - -AllCoreDevs Gitter was the main public coordination comms channel for [Ethereum client core developers](https://github.com/ethereum/pm/). - -**Archives** - -[ethereum/AllCoreDevs Gitter Channel](https://gitter.im/ethereum/AllCoreDevs) - -**Alternatives** - -Please use the "allcoredevs" channel on the [EthR&D Discord Server](https://discord.gg/qHv7AjTDuK) - -### EthereumJS {#ethereumjs-gitter} - -**Summary** - -EthereumJS Gitter was the main public coordination comms channel for the [EthereumJS project](https://ethereumjs.github.io/). - -**Archives** - -[ethereum/EthereumJS Gitter Channel](https://gitter.im/ethereum/ethereumjs) - -**Alternatives** - -Please use the [EthereumJS Discord Server](https://discord.gg/TNwARpR) diff --git a/public/content/desci/index.md b/public/content/desci/index.md index c5bc80a3dd6..c9e7ae8f6ea 100644 --- a/public/content/desci/index.md +++ b/public/content/desci/index.md @@ -93,22 +93,18 @@ 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/) - [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/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 +118,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) 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._** 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/developers/docs/bridges/index.md b/public/content/developers/docs/bridges/index.md index 8fc4ee0fb17..fe97e455db5 100644 --- a/public/content/developers/docs/bridges/index.md +++ b/public/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: 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} 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!_ 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`. 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 98% 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 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/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/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/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/developers/docs/data-and-analytics/block-explorers/index.md index 494aba59cc6..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 @@ -25,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} @@ -237,6 +238,7 @@ The consensus layer top-level data includes the following: - [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} 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/) diff --git a/public/content/developers/docs/development-networks/index.md b/public/content/developers/docs/development-networks/index.md index b2469a80fa1..9e7c76efc66 100644 --- a/public/content/developers/docs/development-networks/index.md +++ b/public/content/developers/docs/development-networks/index.md @@ -66,9 +66,9 @@ 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 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/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/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._** diff --git a/public/content/developers/docs/gas/index.md b/public/content/developers/docs/gas/index.md index 5e4ad237a91..0d0db6ae680 100644 --- a/public/content/developers/docs/gas/index.md +++ b/public/content/developers/docs/gas/index.md @@ -119,22 +119,6 @@ The Ethereum [scalability upgrades](/roadmap/) should ultimately address some of Layer 2 scaling is a primary initiative to greatly improve gas costs, user experience and scalability. [More on layer 2 scaling](/developers/docs/scaling/#layer-2-scaling). -## What was the London Upgrade / EIP-1559? {#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: - - - ## Monitoring gas fees {#moitoring-gas-fees} If you want to monitor gas prices, so you can send your ETH for less, you can use many different tools such as: 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. 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/). 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 596983b16c4..47ccea3f503 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 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/developers/docs/scaling/sidechains/index.md b/public/content/developers/docs/scaling/sidechains/index.md index 73ca67a2373..ba246c90a25 100644 --- a/public/content/developers/docs/scaling/sidechains/index.md +++ b/public/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. | | diff --git a/public/content/developers/docs/scaling/zk-rollups/index.md b/public/content/developers/docs/scaling/zk-rollups/index.md index da040a6d34a..8a2405d25dc 100644 --- a/public/content/developers/docs/scaling/zk-rollups/index.md +++ b/public/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 --- diff --git a/public/content/developers/docs/standards/tokens/erc-4626/index.md b/public/content/developers/docs/standards/tokens/erc-4626/index.md index 8ad804fbed8..249219e846a 100644 --- a/public/content/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/developers/docs/standards/tokens/erc-4626/index.md @@ -204,4 +204,4 @@ Where `sender` is the user who triggered the withdrawal and exchanged `shares`, ## Further reading {#further-reading} - [EIP-4626: Tokenized vault Standard](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626: GitHub Repo](https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol) +- [ERC-4626: GitHub Repo](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) diff --git a/public/content/developers/tutorials/erc20-annotated-code/index.md b/public/content/developers/tutorials/erc20-annotated-code/index.md index a0f189acf81..198e266d5df 100644 --- a/public/content/developers/tutorials/erc20-annotated-code/index.md +++ b/public/content/developers/tutorials/erc20-annotated-code/index.md @@ -308,7 +308,7 @@ This line attaches the `SafeMath` library to the `uint256` type. You can find th ### Variable Definitions {#variable-definitions} -These definitions specify the contract's state variables. There variables are declared `private`, but +These definitions specify the contract's state variables. These variables are declared `private`, but that only means that other contracts on the blockchain can't read them. _There are no secrets on the blockchain_, the software on every node has the state of every contract at every block. By convention, state variables are named `_`. @@ -794,7 +794,7 @@ Make sure to update `_totalSupply` when the total number of tokens changes.   -``` +```solidity /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. diff --git a/public/content/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/developers/tutorials/erc20-with-safety-rails/index.md index 9ad412ca33c..0d23224e3a8 100644 --- a/public/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -23,7 +23,7 @@ If you want to see the complete source code: ## Creating an ERC-20 contract {#creating-an-erc-20-contract} -Before we can add the safety rail functionality we need an ERC-20 contract. In this article we'll use [the OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/4.x/wizard). Open it in another browser and follow these instructions: +Before we can add the safety rail functionality we need an ERC-20 contract. In this article we'll use [the OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/5.x/wizard). Open it in another browser and follow these instructions: 1. Select **ERC20**. 2. Enter these settings: @@ -92,7 +92,7 @@ We want to add these requirements to the function: - The `to` address cannot equal `address(this)`, the address of the ERC-20 contract itself. - The `to` address cannot be empty, it has to be either: - - An externally owned accounts (EOA). We can't check if an address is an EOA directly, but we can check an address's ETH balance. EOAs almost always have a balance, even if they are no longer used - it's difficult to clear them to the last wei. + - An externally owned account (EOA). We can't check if an address is an EOA directly, but we can check an address's ETH balance. EOAs almost always have a balance, even if they are no longer used - it's difficult to clear them to the last wei. - A smart contract. Testing if an address is a smart contract is a bit harder. There is an opcode that checks the external code length, called [`EXTCODESIZE`](https://www.evm.codes/#3b), but it is not available directly in Solidity. We have to use [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html), which is EVM assembly, for it. There are other values we could use from Solidity ([`
.code` and `
.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), but they cost more. Lets go over the new code line by line: @@ -209,4 +209,4 @@ This is a cleanup function, so presumably we don't want to leave any tokens. Ins ## Conclusion {#conclusion} -This is not a perfect solution - there is no perfect solution for the "user made a mistake" problem. However, using these kind of checks can at least prevent some mistakes. The ability to freeze accounts, while dangerous, can be used to limit the damage of certain hacks by denying the hacker the stolen funds. +This is not a perfect solution - there is no perfect solution for the "user made a mistake" problem. However, using these kinds of checks can at least prevent some mistakes. The ability to freeze accounts, while dangerous, can be used to limit the damage of certain hacks by denying the hacker the stolen funds. 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/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/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/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/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: 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 diff --git a/public/content/history/index.md b/public/content/history/index.md index 353277ebc52..517b84c81b7 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? {#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) 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/roadmap/index.md b/public/content/roadmap/index.md index 6a218c2e655..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: @@ -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/) diff --git a/public/content/roadmap/pbs/index.md b/public/content/roadmap/pbs/index.md index 645759b68a2..d9f79124074 100644 --- a/public/content/roadmap/pbs/index.md +++ b/public/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. 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/ar/roadmap/beacon-chain/index.md b/public/content/translations/ar/roadmap/beacon-chain/index.md index dd2f4105f05..a7bad82b3c3 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/)، لكنه مختلف من عدة جوانب. ويتطلب التنقيب نفقات أولية طائلة في شكل أجهزة قوية واستهلاك كبير للطاقة، ما يؤدي إلى تحقيق وفورات للتوسع وتعزيز المركزية. ولا يفرض التنقيب أيضًا أي شروط لحجز الأصول كضمان إضافي، ما يحد من قدرة البروتوكول على معاقبة الأطراف المسيئة بعد الهجوم. وقد جعل الانتقال إلى إثبات الحصة إثيريوم أكثر أمنًا ولا مركزية بالمقارنة مع إثبات العمل. وكلما زاد عدد الأشخاص الذين يشاركون في الشبكة، زادت اللامركزية وأصبحت الشبكة أكثر أمانًا ضد الهجمات. @@ -72,5 +72,5 @@ summaryPoint3: قدمت سلسلة المنارة منطق إجماع الآرا ## قراءة إضافية -- [المزيد عن ترقيات إثيريوم في المستقبل](/roapmap/vision) +- [المزيد عن ترقيات إثيريوم في المستقبل](/roadmap/vision/) - [المزيد عن إثبات الحصة](/developers/docs/consensus-mechanisms/pos) 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، فيمكنك المراهنة من المنزل. 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/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/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/community/code-of-conduct/index.md b/public/content/translations/de/community/code-of-conduct/index.md index a8cb0f0031b..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. @@ -52,7 +54,7 @@ Beispiele für inakzeptables Verhalten von Teilnehmenden: - Körperliche Gewalt, Androhung körperlicher Gewalt oder Aufforderung zu körperlicher Gewalt jeglicher Art - Verwendung einer sexualisierten Sprache oder Bildsprache oder Signalisierung unerwünschter sexueller Aufmerksamkeit -- Sich als eine andere Person auszugeben oder auf andere Weise unredlich zu behaupten, eine Verbindung zu einer Person oder Organisation zu haben. +- Sich als eine andere Person auszugeben oder auf andere Weise unredlich zu behaupten, eine Verbindung zu einer Person oder Organisation zu haben - Trolling, beleidigende/abwertende Kommentare und persönliche oder politische Angriffe - Belästigung anderer Community-Mitglieder in öffentlichen oder privaten Kanälen - Veröffentlichung privater Informationen anderer, wie z. B. einer physischen oder elektronischen Adresse, ohne ausdrückliche Erlaubnis 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/de/community/get-involved/index.md b/public/content/translations/de/community/get-involved/index.md index 0e4d4d6ca66..38762ee7236 100644 --- a/public/content/translations/de/community/get-involved/index.md +++ b/public/content/translations/de/community/get-involved/index.md @@ -28,7 +28,7 @@ Haben Sie einen Hintergrund in Mathematik, Kryptographie oder Wirtschaftswissens - Ethereum-Verbesserungsvorschläge formulieren oder prüfen - Ein EIP schreiben 1. Reichen Sie Ihre Idee auf [Ethereum Magicians](https://ethereum-magicians.org) ein. - 2. Lesen Sie [EIP-1](https://eip.ethereum.org/EIPS/eip-1) – **Ja, das ist das _ganze_ Dokument**. + 2. Lesen Sie [EIP-1](https://eips.ethereum.org/EIPS/eip-1) – **Ja, das ist das _ganze_ Dokument**. 3. Folgen Sie den Anweisungen in EIP-1. Beziehen Sie sich auf die darin enthaltenen Informationen, während Sie Ihren Entwurf schreiben. - Erfahren Sie, wie Sie ein [EIP Editor](https://eips.ethereum.org/EIPS/eip-5069) werden. - Sie können direkt in das Peer-Review von EIPs einsteigen. Sehen Sie [Öffnen von PRs mit dem `e-review`-Tag](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Geben Sie technisches Feedback über den `discussion-to`-Link. @@ -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/de/community/grants/index.md b/public/content/translations/de/community/grants/index.md index 03ad25bd0f7..0759da1e17b 100644 --- a/public/content/translations/de/community/grants/index.md +++ b/public/content/translations/de/community/grants/index.md @@ -15,31 +15,27 @@ Diese Liste wird von unserer Community verwaltet. Wenn Informationen fehlen oder Diese Programme unterstützen das breit gefächerte Ethereum-Ökosystem, indem sie Finanzierungen für zahlreiche Projekte bereitstellen. Dazu gehören unter anderem Lösungen zu Skalierbarkeit, Community-Aufbau, Sicherheit und Privatsphäre. Diese Fördermaßnahmen sind nicht spezifisch für eine bestimmte Ethereum-Plattform und sind ein guter Ausgangspunkt, wenn Sie unsicher sind. - [EF-Ökosystem Unterstützungsprogramm](https://esp.ethereum.foundation) - _Finanzierung von Open-Source-Projekten, die Ethereum zugutekommen, mit besonderem Fokus auf universelle Werkzeuge, Infrastruktur, Forschung und öffentliche Güter_ -- [Ethereum RFPs](https://github.com/ethereum/requests-for-proposals) – _Ausschreibungen der Ethereum Foundation für Arbeiten und Projekte im Ethereum-Ökosystem_ - [MetaCartel](https://www.metacartel.org/grants/) - _DApp-Entwicklung, DAO-Erstellung_ -- [Moloch DAO](https://www.molochdao.com/) – _Datenschutz, Layer-2-Skalierung, Kundensicherheit und mehr_ -- [Offene Zuschüsse](https://opengrants.com/explore) -- [DAO-Stipendien](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _Google-Tabelle der Organisationen, die Stipendien anbieten_ -- [Crunchbase für Web3-Grants](https://www.cryptoneur.xyz/web3-grants) - _Filter und suche nach Grants nach Kategorie, Anwendungsfall, Betrag und mehr. Hilf anderen dabei, die richtige Zuwendung zu finden._ +- [Moloch DAO](https://www.molochdao.com/) – _Datenschutz, Layer-2-Skalierung, Client-Sicherheit und mehr_ +- [DAO-Zuschüsse](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) – _Google-Tabelle der Organisationen, die Zuschüsse anbieten_ +- [Crunchbase für Web3-Zuschüsse](https://www.cryptoneur.xyz/web3-grants) – _Filtere und suche nach Zuschüssen nach Kategorie, Anwendungsfall, Betrag und mehr. Hilf anderen dabei, den richtigen Zuschuss zu finden._ - [Akademische Stipendien](https://esp.ethereum.foundation/academic-grants) – _Stipendien zur Untstützung akademischer Arbeiten in Bezug auf Ethereum_ +- [Blockworks Grantfarm](https://blockworks.co/grants/programs) - _Blockworks hat ein umfassendes Verzeichnis aller Zuschüsse, Ausschreibungen und Bug-Bounties zusammengestellt._ ## Projektspezifisch {#project-specific} Diese Projekte haben ihre eigenen Zuschüsse für Projektvorhaben zur Entwicklung und Erprobung ihrer eigenen Technologie geschaffen. - [Aave-Zuschussprogramm](https://aavegrants.org/) – _[Aave](https://aave.com/) Grants DAO_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/)-Ökosystemfonds_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/)-Ökosystemfonds_ - [Chainlink-Förderprogramm](https://chain.link/community/grants) - _[Chainlink](https://chain.link/) Gemeinschaftsförderungen_ -- [Programm für Verbundzuschüsse](https://compoundgrants.org/) – _[Verbund](https://compound.finance/)-Finanzökosystem_ -- [Decentraland-Zuschussprogramm](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/) DAO Metaverse_ -- [Lido Ecosystem Grants Organisation (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/)-Finanzökosystem_ -- [MetaMask-Programm](https://metamaskgrants.org/) – _Von Mitarbeitern geleitete DAO für[MetaMask](https://metamask.io/)-Stipendien_ -- [mStable-Zuschussprogram](https://docs.mstable.org/advanced/grants-program) – _[mStable](https://mstable.org/)-Gemeinschaft_ -- [SKALE Network-Förderprogramm](https://skale.space/developers#grants) – _[SKALE Network](https://skale.space/)-Ökosystem_ -- [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/)-Ökosystem_ -- [UMA Grants Program](https://grants.umaproject.org/) – _[UMA](https://umaproject.org/)-Entwicklerunterstützung_ -- [Uniswap-Zuschussprogramm](https://www.unigrants.org/) – _[Uniswap](https://uniswap.org/)-Community_ -- [Web3-Förderung](https://web3grants.net) – _Eine umfangreiche Liste von Web3-/Krypto-verwandten Förderprogrammen_ +- [Decentraland-Zuschussprogramm](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/)-DAO-Metaverse_ +- [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/)-Finanzökosystem_ +- [MetaMask-Programm](https://metamaskgrants.org/) – _Mitarbeitergeleitete DAO für[MetaMask](https://metamask.io/)-Zuschüsse_ +- [SKALE-Network-Förderprogramm](https://skale.space/developers#grants) – _[SKALE-Network](https://skale.space/)-Ökosystem_ +- [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The-Graph](https://thegraph.com/)-Ökosystem_ +- [Uniswap-Förderprogramm](https://www.uniswapfoundation.org/apply-for-a-grant) – _[Uniswap](https://uniswap.org/)-Community_ +- [Web3-Zuschüsse](https://web3grants.net) – _Eine umfangreiche Liste von Förderprogrammen mit Bezug zu Web3/Krypto_ ## Quadratische Finanzierung {#quadratic-funding} diff --git a/public/content/translations/de/community/language-resources/index.md b/public/content/translations/de/community/language-resources/index.md index a75323bbcd7..2afd16f4719 100644 --- a/public/content/translations/de/community/language-resources/index.md +++ b/public/content/translations/de/community/language-resources/index.md @@ -72,7 +72,7 @@ Wenn Sie zweisprachig sind und uns helfen möchten, mehr Menschen zu erreichen, - [Gwei.cz](https://gwei.cz) - Lokale Gemeinschaft für Web3, die akademische Inhalte erstellt und Veranstaltungen organisiert, sowohl online als auch persönlich - [Gwei.cz Leitfaden](https://prirucka.gwei.cz/) - Ethereum Leitfaden für Anfänger - [DAO Leitfaden](https://dao.gwei.cz/) - Leitfaden über DAOs für Anfänger -- [Ethereum meistern](https://ipfs.infura-ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - Ethereum meistern auf Tschechisch +- [Ethereum meistern](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) – Ethereum meistern auf Tschechisch ### Französisch {#fr} diff --git a/public/content/translations/de/community/online/index.md b/public/content/translations/de/community/online/index.md index 567cadbb4c1..66d0cdcdeb6 100644 --- a/public/content/translations/de/community/online/index.md +++ b/public/content/translations/de/community/online/index.md @@ -24,13 +24,13 @@ Hunderttausende von Ethereum-Enthusiasten treffen sich in diesen Online-Foren, u Ethereum Cat Herders - Gemeinschaft orientiert am Angebot von Projekt-Management-Unterstützung für Ethereum-Entwickler Ethereum-Hacker - Von ETHGlobal geführter Discord Chat: Eine Online-Gemeinschaft für Ethereum-Hacker auf der ganzen Welt CryptoDevs - Auf Ethereum Entwicklung fokussierte Discord-Community -EthStaker Discord – Beratung, Bildung, Unterstützung und Ressourcen für bestehende und potenzielle Staker auf Community-Ebene -Ethereum.org Website-Team - Kommen Sie vorbei and schreiben Sie mit dem Team und anderen aus der Gemeinschaft über Ethereum.org Web-Entwicklung und Design +EthStaker Discord – Beratung, Bildung, Unterstützung und Ressourcen für bestehende und potenzielle Staker auf Community-Ebene +Ethereum.org Website-Team - Kommen Sie vorbei and schreiben Sie mit dem Team und anderen aus der Gemeinschaft über Ethereum.org Web-Entwicklung und Design Matos Discord - Web3-Creator-Community, wo sich Entwickler, industrielle Führer, und Ethereum Enthusiasten aufhalten. Wir sind begeistert von Web3-Entwicklung, Design und Kultur. Kommen Sie mit uns bauen. -Solidity-Gitter - Unterhaltungen über Solidity-Entwicklung (Gitter) +Solidity-Gitter - Unterhaltungen über Solidity-Entwicklung (Gitter) Solidity-Matrix - Unterhaltungen über Solidity-Entwicklung (Matrix) -Ethereum Stack Exchange _– Forum für Fragen und Antworten_ -Peeranha _– dezentrales Forum für Fragen und Antworten_ +Ethereum Stack Exchange *– Forum für Fragen und Antworten* +Peeranha *– dezentrales Forum für Fragen und Antworten* ## YouTube und Twitter {#youtube-and-twitter} diff --git a/public/content/translations/de/community/research/index.md b/public/content/translations/de/community/research/index.md index fefdfc6193d..28abf078d3b 100644 --- a/public/content/translations/de/community/research/index.md +++ b/public/content/translations/de/community/research/index.md @@ -124,7 +124,7 @@ Die sicheren und leistungsfähigen Brücken sind ein bestimmter Bereich der Eben - [Einführung in Blockchain-Brücken](/bridges/) - [Vitalik zu Brücken](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - [Artikel zu Blockchain-Brücken](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [Der Wert von Brücken]() +- [Der Wert von Brücken](https://dune.com/eliasimos/Bridge-Away-(from-Ethereum)) #### Aktuelle Forschung {#recent-research-3} @@ -156,7 +156,7 @@ Das Sharding war auf der Ethereum-Blockchain lange Teil des Entwicklungs-Fahrpla #### Aktuelle Forschung {#recent-research-5} -- [ecdsa zu FGPAs](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) +- [ecdsa auf FPGAs](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) ## Sicherheit {#security} @@ -346,7 +346,6 @@ Die Tools für Ethereum-Entwickler verbessern sich rasant. In diesem Bereich gib - [Entwickler-Frameworks](/developers/docs/frameworks/) - [Tools-Liste für Entwickler der Konsensebene](https://github.com/ConsenSys/ethereum-developer-tools-list) - [Tokenstandards](/developers/docs/standards/tokens/) -- [Biastek: Tools für Ethereum](https://biastek.com/ethereum-tools/) - [CryptoDevHub: EVM-Tools](https://cryptodevhub.io/wiki/ethereum-virtual-machine-tools) #### Aktuelle Forschung {#recent-research-17} diff --git a/public/content/translations/de/community/support/index.md b/public/content/translations/de/community/support/index.md index 6d1426d2b70..1b2d0b2f056 100644 --- a/public/content/translations/de/community/support/index.md +++ b/public/content/translations/de/community/support/index.md @@ -30,7 +30,7 @@ Haben Sie Probleme mit Ihrer Wallet? Die meisten Wallets haben spezielle Support - [Argent](https://support.argent.xyz/hc/) - [MyEtherWallet](https://help.myetherwallet.com/) -_Das ist keine vollständige Liste. Brauchen Sie Hilfe bei der Suche nach Unterstützung für eine bestimmte Wallet? Treten Sie dem [ethereum.org-Discord](https://discord.gg/ethereum-org) bei, dann versuchen wir, Ihnen zu helfen._ +_Das ist keine vollständige Liste. Brauchen Sie Hilfe bei der Suche nach Unterstützung für eine bestimmte Wallet? Treten Sie dem [ethereum.org-Discord](https://discord.gg/rZz26QWfCg) bei, dann versuchen wir, Ihnen zu helfen._ Suchen Sie eine Ethereum-Wallet? [Sehen Sie sich unsere vollständige Liste der Ethereum-Wallets an](/wallets/find-wallet/). @@ -39,7 +39,7 @@ Suchen Sie eine Ethereum-Wallet? [Sehen Sie sich unsere vollständige Liste der Erstellen kann durchaus schwer sein. Hier finden Sie einige Breiche mit Schwerpunkt auf Entwicklung mit erfahrenen Ethereum-Entwicklern, die Ihnen gerne helfen. - [Alchemy University](https://university.alchemy.com/#starter_code) -- [CryptoDevs-Discord](https://discord.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 @@ Bezieht sich Ihre Frage auf ein bestimmtes Tool, Projekt oder eine Bibliothek? D Hier sind einige beliebte Beispiele: -- [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 @@ Hier sind einige beliebte Beispiele: Wenn Sie einen Knoten oder Validator betreiben, finden Sie hier einige Communitys, die Ihnen den Einstieg erleichtern. -- [EthStaker-Discord](https://discord.io/ethstaker) +- [EthStaker-Discord](https://discord.gg/ethstaker) - [EthStaker-Reddit](https://www.reddit.com/r/ethstaker) Die meisten Teams, die Ethereum-Clients entwickeln, haben auch eigene, öffentlich zugängliche Bereiche, in denen Sie Unterstützung erhalten und Fragen stellen können. 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} 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/de/contributing/design/index.md b/public/content/translations/de/contributing/design/index.md index 9a5a771bae7..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/de/decentralized-identity/index.md b/public/content/translations/de/decentralized-identity/index.md index 62e32e4ee06..e4214ec592e 100644 --- a/public/content/translations/de/decentralized-identity/index.md +++ b/public/content/translations/de/decentralized-identity/index.md @@ -161,6 +161,7 @@ Es gibt viele ehrgeizige Projekte, die Ethereum als Grundlage für dezentrale Id - **[Proof of Humanity](https://www.proofofhumanity.id)** - _Proof of Humanity (Beweis des Menschseins) ist ein auf Ethereum basierendes System zur Überprüfung der sozialen Identität._ - **[BrightID](https://www.brightid.org/)**- _Ein dezentralisiertes quelloffenes Netzwerk zur sozialen Identität, das versucht, die Identitätsüberprüfung durch die Schaffung und Analyse eines sozialen Diagramms zu reformieren._ - **[Personennachweis-Passport](https://proofofpersonhood.com/)** - _Ein dezentraler digitaler Identitätsaggregator._ +- **[walt.id](https://walt.id)** — _Open-Source-Infrastruktur für dezentrale Identität und Wallets, die es Entwicklern und Organisationen ermöglicht, selbstbestimmte Identität und NFTs/SBTs zu nutzen._ ## Weiterführende Informationen {#further-reading} @@ -170,6 +171,7 @@ Es gibt viele ehrgeizige Projekte, die Ethereum als Grundlage für dezentrale Id - [Was ist Ethereum ERC725? Eigenständiges Identitätsmanagement in der Blockchain](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam-Stadt_ - [Wie die Blockchain das Problem der digitalen Identität lösen könnte](https://time.com/6142810/proof-of-humanity/)— _Andrew R. Chow_ - [Was sind dezentralisierte Identitäten und warum sollten sie Sie interessieren?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ +- [Einführung in die dezentrale Identität](https://walt.id/white-paper/digital-identity) – _Dominik Beron_ ### Videos {#videos} @@ -177,9 +179,11 @@ Es gibt viele ehrgeizige Projekte, die Ethereum als Grundlage für dezentrale Id - [Anmelden mit Ethereum und dezentralisierter Identität mit Ceramic, IDX, React, und 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _YouTube-Tutorial zum Aufbau eines Identitätsmanagementsystems zum Erstellen, Lesen und Aktualisieren des Profils von Benutzern mit ihrer Ethereum-Wallet von Nader Dabit_ - [BrightID - Dezentralisierte Identität auf Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Podcast Bankless Episode über BrightID, eine dezentrale Identitätslösung für Ethereum_ - [Das Off-Chain-Internet: Dezentralisierte Identität & Überprüfbare Berechtigungsnachweise](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — EthDenver 2022 Präsentation von Evin McMullen +- [Erklärung zu überprüfbaren Anmeldeinformationen](https://www.youtube.com/watch?v=ce1IdSr-Kig) – YouTube-Erklärvideo mit Demo von Tamino Baumann ### Communities {#communities} - [ERC-725 Allianz auf GitHub](https://github.com/erc725alliance) — _Unterstützer des ERC725-Standards zur Identitätsverwaltung in der Ethereum-Blockchain_ - [SpruceID Discord Server](https://discord.com/invite/Sf9tSFzrnt) — _Community für Enthusiasten und Entwickler, die am Anmelden mit Ethereum arbeiten_ - [Veramo Labs](https://discord.gg/sYBUXpACh4) — _Eine Community von Entwicklern, die zum Aufbau eines Rahmens für überprüfbare Daten für Anwendungen beitragen_ +- [walt.id](https://discord.com/invite/AW8AgqJthZ) – _Eine Gemeinschaft von Entwicklern und Erstellern, die an Anwendungsfällen für dezentrale Identität in verschiedenen Branchen arbeiten_ diff --git a/public/content/translations/de/desci/index.md b/public/content/translations/de/desci/index.md index 1afff22ee61..058bf9280b8 100644 --- a/public/content/translations/de/desci/index.md +++ b/public/content/translations/de/desci/index.md @@ -103,7 +103,7 @@ Erkunden Sie Projekte und werden Sie Teil der DeSci-Gemeinschaft. - [OceanDAO: DAO regelte die Finanzierung der datenbezogenen Wissenschaft](https://oceanprotocol.com/dao) - [OpScientia: offene dezentrale wissenschaftliche Workflows](https://opsci.io/research/) - [LabDAO: Falten eines Proteins in Silizium](https://alphafodl.vercel.app/) -- [Bio.xyz: Erhalten Sie Mittel für Ihr Biotech-DAO oder desci-Projekt](https://www.molecule.to/) +- [Bio.xyz: Erhalten Sie Mittel für Ihr Biotech-DAO oder desci-Projekt](https://www.bio.xyz/) - [ResearchHub: Poste ein wissenschaftliches Ergebnis und führe ein Gespräch mit Partnern](https://www.researchhub.com/) - [VitaDAO: Langfristige Forschung finanziert durch gesponserte Forschungsverträge](https://www.vitadao.com/) - [Flamming-Protokoll: Open-Source-Datenwirtschaft, die die kollaborative biomedizinische Entdeckung fördert](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) 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/de/developers/docs/blocks/index.md b/public/content/translations/de/developers/docs/blocks/index.md index 71c2cbeb275..3b2490d6203 100644 --- a/public/content/translations/de/developers/docs/blocks/index.md +++ b/public/content/translations/de/developers/docs/blocks/index.md @@ -40,7 +40,7 @@ Proof-of-Stake bedeutet Folgendes: Ein Block enthält viele verschiedene Informationen. Auf oberster Ebene enthält ein Block folgende Felder: | Feld | Beschreibung | -| :------------------ | :---------------------------------------------------------- | +|:------------------- |:----------------------------------------------------------- | | `Zeitspanne (Slot)` | Der Slot, zu dem der Block gehört | | `proposer_index` | Die ID des Validators, der den Block vorschlägt | | `parent_root` | Der Hash des vorausgehenden Blocks | @@ -50,7 +50,7 @@ Ein Block enthält viele verschiedene Informationen. Auf oberster Ebene enthält Der `Body` eines Blocks enthält selbst mehrere Felder: | Feld | Beschreibung | -| :------------------- | :------------------------------------------------------------------------------- | +|:-------------------- |:-------------------------------------------------------------------------------- | | `randao_reveal` | Ein Wert, der zur Auswahl des nächsten Block-Vorschlagenden verwendet wird | | `eth1_data` | Informationen zum Einzahlungsvertrag | | `graffiti` | Beliebige Daten, die zum Markieren von Blöcken verwendet werden | @@ -65,7 +65,7 @@ Der `Body` eines Blocks enthält selbst mehrere Felder: Das Feld `attestations` enthält eine Liste aller Attestierungen im Block. Attestierungen haben ihren eigenen Datentyp der mehrere Datenteile enthält. Jede Attestierung enthält: | Feld | Beschreibung | -| :----------------- | :------------------------------------------------------------------------ | +|:------------------ |:------------------------------------------------------------------------- | | `aggregation_bits` | Eine Liste der Validatoren, die an dieser Attestierung teilgenommen haben | | `daten` | Ein Container mit mehreren Unterfeldern | | `signature` | Kollektivsignatur aller bescheinigenden Validatoren | @@ -73,7 +73,7 @@ Das Feld `attestations` enthält eine Liste aller Attestierungen im Block. Attes Das Feld `data` in `attestation` enthält folgende Elemente: | Feld | Beschreibung | -| :------------------ | :---------------------------------------------------------- | +|:------------------- |:----------------------------------------------------------- | | `Zeitspanne (Slot)` | Der Slot, auf den sich die Attestierung bezieht | | `Index` | Indizes für die bescheinigenden Validatoren | | `beacon_block_root` | Der Stamm-Hash des Beacon-Blocks, der dieses Objekt enthält | @@ -85,7 +85,7 @@ Die Ausführung der Transaktionen in der `execution_payload` aktualisiert den gl Der `execution_payload_header` enthält die folgenden Felder: | Feld | Beschreibung | -| :-------------------- | :------------------------------------------------------------------------------------ | +|:--------------------- |:------------------------------------------------------------------------------------- | | `übergeordneter_hash` | Hash des übergeordneten Blocks | | `fee_recipient` | Kontoadresse, an die die Transaktionsgebühren gezahlt werden | | `state_root` | Stamm-Hash für den globalen Zustand nach der Anwendung der Änderungen in diesem Block | @@ -105,7 +105,7 @@ Der `execution_payload_header` enthält die folgenden Felder: Die `execution_payload` selbst enthält Folgendes (das ist identisch zum Header, außer dass es anstatt des Stamm-Hash der Transaktionen die Liste der Transaktions- und Abhebungsinformationen enthält) : | Feld | Beschreibung | -| :-------------------- | :------------------------------------------------------------------------------------ | +|:--------------------- |:------------------------------------------------------------------------------------- | | `übergeordneter_hash` | Hash des übergeordneten Blocks | | `fee_recipient` | Kontoadresse, an die die Transaktionsgebühren gezahlt werden | | `state_root` | Stamm-Hash für den globalen Zustand nach der Anwendung der Änderungen in diesem Block | @@ -125,7 +125,7 @@ Die `execution_payload` selbst enthält Folgendes (das ist identisch zum Header, Die Liste `withdrawals` enthält `withdrawal`-Objekte, die wie folgt strukturiert sind: | Feld | Beschreibung | -| :--------------- | :--------------------------------------------- | +|:---------------- |:---------------------------------------------- | | `address` | Kontoadresse, für die die Abhebung erfolgt ist | | `amount` | Abgehobener Betrag | | `Index` | Abhebungsindexwert | 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/evm/index.md b/public/content/translations/de/developers/docs/evm/index.md index 6204d6d4187..15b14e94051 100644 --- a/public/content/translations/de/developers/docs/evm/index.md +++ b/public/content/translations/de/developers/docs/evm/index.md @@ -10,7 +10,7 @@ Das Ethereum-Protokoll selbst dient ausschließlich dem Zweck, den kontinuierlic ## Voraussetzungen {#prerequisites} -Um den EVM zu verstehen, sind ein paar grundlegende Kenntnisse der gängigen Informatikterminologie wie [Bytes](https://wikipedia.org/wiki/Byte), [Speicher](https://wikipedia.org/wiki/Computer_memory) und [Stack]() notwendig. Es wäre auch hilfreich, wenn Sie sich mit Kryptografie-/Blockchain-Konzepten wie [Hash-Funktionen](https://wikipedia.org/wiki/Cryptographic_hash_function) und dem [Merkle-Baum](https://wikipedia.org/wiki/Merkle_tree) auskennen. +Um den EVM zu verstehen, sind ein paar grundlegende Kenntnisse der gängigen Informatikterminologie wie [Bytes](https://wikipedia.org/wiki/Byte), [Speicher](https://wikipedia.org/wiki/Computer_memory) und [Stack](https://wikipedia.org/wiki/Stack_(abstract_data_type)) notwendig. Es wäre auch hilfreich, wenn Sie sich mit Kryptografie-/Blockchain-Konzepten wie [Hash-Funktionen](https://wikipedia.org/wiki/Cryptographic_hash_function) und dem [Merkle-Baum](https://wikipedia.org/wiki/Merkle_tree) auskennen. ## Vom Ledger zur Zustandsmaschine {#from-ledger-to-state-machine} @@ -46,7 +46,7 @@ Die EVM wird als [Stackmaschine](https://wikipedia.org/wiki/Stack_machine) mit e Während der Ausführung behält die EVM einen transienten _-Speicher_ (als wortadressiertes Byte-Array), der zwischen Transaktionen nicht vorhanden ist. -Verträge enthalten jedoch eine Merkle-Patricia*-Speicher*-Trie (als wortadressierbares Wort-Array), mit der das betreffende Konto und ein Teil des globalen Zustands verbunden sind. +Verträge enthalten jedoch eine Merkle-Patricia_-Speicher_-Trie (als wortadressierbares Wort-Array), mit der das betreffende Konto und ein Teil des globalen Zustands verbunden sind. Kompilierter Smart-Contract-Bytecode wird als eine Anzahl von EVM-[Opcodes ausgeführt](/developers/docs/evm/opcodes), die standardmäßige Stackoperationen wie `XOR`, `UND`, `ADD`, `SUB` etc. ausführen. Die EVM implementiert auch eine Reihe von Blockchain-spezifischen Stack-Operationen, wie `ADDRESS`, `BALANCE`, `BLOCKHASH` usw. @@ -64,6 +64,7 @@ Während der siebenjährigen Geschichte von Ethereum hat die EVM mehrere Revisio - [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_ ## Weiterführende Informationen {#further-reading} diff --git a/public/content/translations/de/developers/docs/evm/opcodes/index.md b/public/content/translations/de/developers/docs/evm/opcodes/index.md index f6f6ab2d273..a8ab5e1f52d 100644 --- a/public/content/translations/de/developers/docs/evm/opcodes/index.md +++ b/public/content/translations/de/developers/docs/evm/opcodes/index.md @@ -14,157 +14,157 @@ Für Operationen mit dynamischen Gaskosten, siehe [gas.md](https://github.com/wo 💡 Kurztipp: Um ganze Zeilen einzusehen, verwenden Sie `[shift] + scroll`, um horizontal auf dem Desktop zu scrollen. -| Stack | Name | Gas | Anfangs-Stack | Ergebnis-Stack | Speicher | Anmerkungen | -| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------- | :------------------------------ | :---------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -| 00 | STOP | 0 | | | | halt execution | -| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 addition modulo 2\*\*256 | -| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 multiplication modulo 2\*\*256 | -| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 addition modulo 2\*\*256 | -| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 division | -| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 division | -| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 modulus | -| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 modulus | -| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 addition modulo N | -| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 multiplication modulo N | -| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 exponentiation modulo 2\*\*256 | -| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [sign extend](https://wikipedia.org/wiki/Sign_extension) `x` from `(b+1)` bytes to 32 bytes | -| 0C-0F | _invalid_ | | | | | | -| 10 | LT | 3 | `a, b` | `a < b` | | uint256 less-than | -| 11 | GT | 3 | `a, b` | `a > b` | | uint256 greater-than | -| 12 | SLT | 3 | `a, b` | `a < b` | | int256 less-than | -| 13 | SGT | 3 | `a, b` | `a > b` | | int256 greater-than | -| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 equality | -| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 iszero | -| 16 | AND | 3 | `a, b` | `a && b` | | bitwise AND | -| 17 | OR | 3 | `a, b` | `a \|\| b` | | bitwise OR | -| 18 | XOR | 3 | `a, b` | `a ^ b` | | bitwise XOR | -| 19 | NOT | 3 | `a` | `~a` | | bitwise NOT | -| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`th byte of (u)int256 `x`, from the left | -| 1B | SHL | 3 | `shift, val` | `val << shift` | | shift left | -| 1C | SHR | 3 | `shift, val` | `val >> shift` | | logical shift right | -| 1D | SAR | 3 | `shift, val` | `val >> shift` | | arithmetic shift right | -| 1E-1F | _invalid_ | | | | | | -| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | -| 21-2F | _invalid_ | | | | | | -| 30 | ADDRESS | 2 | `.` | `address(this)` | | address of executing contract | -| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | balance, in wei | -| 32 | ORIGIN | 2 | `.` | `tx.origin` | | address that originated the tx | -| 33 | CALLER | 2 | `.` | `msg.sender` | | address of msg sender | -| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg value, in wei | -| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | read word from msg data at index `idx` | -| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | length of msg data, in bytes | -| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copy msg data | -| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | length of executing contract's code, in bytes | -| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | copy executing contract's bytecode | -| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | gas price of tx, in wei per unit gas [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | -| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | size of code at addr, in bytes | -| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copy code from `addr` | -| 3D | RETURNDATASIZE | 2 | `.` | `size` | | size of returned data from last external call, in bytes | -| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copy returned data from last external call | -| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `Hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | -| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | -| 41 | COINBASE | 2 | `.` | `block.coinbase` | | 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` | | Bringen Sie den konstanten Wert 0 in den Stack ein | -| 60 | PUSH1 | 3 | `.` | `uint8` | | push 1-byte value onto stack | -| 61 | PUSH2 | 3 | `.` | `uint16` | | push 2-byte value onto stack | -| 62 | PUSH3 | 3 | `.` | `uint24` | | push 3-byte value onto stack | -| 63 | PUSH4 | 3 | `.` | `uint32` | | push 4-byte value onto stack | -| 64 | PUSH5 | 3 | `.` | `uint40` | | push 5-byte value onto stack | -| 65 | PUSH6 | 3 | `.` | `uint48` | | push 6-byte value onto stack | -| 66 | PUSH7 | 3 | `.` | `uint56` | | push 7-byte value onto stack | -| 67 | PUSH8 | 3 | `.` | `uint64` | | push 8-byte value onto stack | -| 68 | PUSH9 | 3 | `.` | `uint72` | | push 9-byte value onto stack | -| 69 | PUSH10 | 3 | `.` | `uint80` | | push 10-byte value onto stack | -| 6A | PUSH11 | 3 | `.` | `uint88` | | push 11-byte value onto stack | -| 6B | PUSH12 | 3 | `.` | `uint96` | | push 12-byte value onto stack | -| 6C | PUSH13 | 3 | `.` | `uint104` | | push 13-byte value onto stack | -| 6D | PUSH14 | 3 | `.` | `uint112` | | push 14-byte value onto stack | -| 6E | PUSH15 | 3 | `.` | `uint120` | | push 15-byte value onto stack | -| 6F | PUSH16 | 3 | `.` | `uint128` | | push 16-byte value onto stack | -| 70 | PUSH17 | 3 | `.` | `uint136` | | push 17-byte value onto stack | -| 71 | PUSH18 | 3 | `.` | `uint144` | | push 18-byte value onto stack | -| 72 | PUSH19 | 3 | `.` | `uint152` | | push 19-byte value onto stack | -| 73 | PUSH20 | 3 | `.` | `uint160` | | push 20-byte value onto stack | -| 74 | PUSH21 | 3 | `.` | `uint168` | | push 21-byte value onto stack | -| 75 | PUSH22 | 3 | `.` | `uint176` | | push 22-byte value onto stack | -| 76 | PUSH23 | 3 | `.` | `uint184` | | push 23-byte value onto stack | -| 77 | PUSH24 | 3 | `.` | `uint192` | | push 24-byte value onto stack | -| 78 | PUSH25 | 3 | `.` | `uint200` | | push 25-byte value onto stack | -| 79 | PUSH26 | 3 | `.` | `uint208` | | push 26-byte value onto stack | -| 7A | PUSH27 | 3 | `.` | `uint216` | | push 27-byte value onto stack | -| 7B | PUSH28 | 3 | `.` | `uint224` | | push 28-byte value onto stack | -| 7C | PUSH29 | 3 | `.` | `uint232` | | push 29-byte value onto stack | -| 7D | PUSH30 | 3 | `.` | `uint240` | | push 30-byte value onto stack | -| 7E | PUSH31 | 3 | `.` | `uint248` | | push 31-byte value onto stack | -| 7F | PUSH32 | 3 | `.` | `uint256` | | push 32-byte value onto stack | -| 80 | DUP1 | 3 | `a` | `a, a` | | clone 1st value on stack | -| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | clone 2nd value on stack | -| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | clone 3rd value on stack | -| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | clone 4th value on stack | -| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | clone 5th value on stack | -| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | clone 6th value on stack | -| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | clone 7th value on stack | -| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | clone 8th value on stack | -| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | clone 9th value on stack | -| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | clone 10th value on stack | -| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | clone 11th value on stack | -| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | clone 12th value on stack | -| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | clone 13th value on stack | -| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | clone 14th value on stack | -| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | clone 15th value on stack | -| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | clone 16th value on stack | -| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | -| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | -| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | -| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | -| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | -| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | -| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | -| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | -| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | -| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | -| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | -| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | -| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | 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` | +| Stack | Name | Gas | Anfangs-Stack | Ergebnis-Stack | Speicher | Anmerkungen | +|:-----:|:-------------- |:-----------------------------------------------------------------------------------------------:|:------------------------------------------------ |:-------------------------------------------- |:----------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 00 | STOP | 0 | | | | halt execution | +| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 addition modulo 2\*\*256 | +| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 multiplication modulo 2\*\*256 | +| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 addition modulo 2\*\*256 | +| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 division | +| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 division | +| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 modulus | +| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 modulus | +| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 addition modulo N | +| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 multiplication modulo N | +| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 exponentiation modulo 2\*\*256 | +| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [sign extend](https://wikipedia.org/wiki/Sign_extension) `x` from `(b+1)` bytes to 32 bytes | +| 0C-0F | _invalid_ | | | | | | +| 10 | LT | 3 | `a, b` | `a < b` | | uint256 less-than | +| 11 | GT | 3 | `a, b` | `a > b` | | uint256 greater-than | +| 12 | SLT | 3 | `a, b` | `a < b` | | int256 less-than | +| 13 | SGT | 3 | `a, b` | `a > b` | | int256 greater-than | +| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 equality | +| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 iszero | +| 16 | AND | 3 | `a, b` | `a && b` | | bitwise AND | +| 17 | OR | 3 | `a, b` | `a \|\| b` | | bitwise OR | +| 18 | XOR | 3 | `a, b` | `a ^ b` | | bitwise XOR | +| 19 | NOT | 3 | `a` | `~a` | | bitwise NOT | +| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`th byte of (u)int256 `x`, from the left | +| 1B | SHL | 3 | `shift, val` | `val << shift` | | shift left | +| 1C | SHR | 3 | `shift, val` | `val >> shift` | | logical shift right | +| 1D | SAR | 3 | `shift, val` | `val >> shift` | | arithmetic shift right | +| 1E-1F | _invalid_ | | | | | | +| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | +| 21-2F | _invalid_ | | | | | | +| 30 | ADDRESS | 2 | `.` | `address(this)` | | address of executing contract | +| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | balance, in wei | +| 32 | ORIGIN | 2 | `.` | `tx.origin` | | address that originated the tx | +| 33 | CALLER | 2 | `.` | `msg.sender` | | address of msg sender | +| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg value, in wei | +| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | read word from msg data at index `idx` | +| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | length of msg data, in bytes | +| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copy msg data | +| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | length of executing contract's code, in bytes | +| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | copy executing contract's bytecode | +| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | gas price of tx, in wei per unit gas [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | +| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | size of code at addr, in bytes | +| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copy code from `addr` | +| 3D | RETURNDATASIZE | 2 | `.` | `size` | | size of returned data from last external call, in bytes | +| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copy returned data from last external call | +| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `Hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | +| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | +| 41 | COINBASE | 2 | `.` | `block.coinbase` | | 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` | | Bringen Sie den konstanten Wert 0 in den Stack ein | +| 60 | PUSH1 | 3 | `.` | `uint8` | | push 1-byte value onto stack | +| 61 | PUSH2 | 3 | `.` | `uint16` | | push 2-byte value onto stack | +| 62 | PUSH3 | 3 | `.` | `uint24` | | push 3-byte value onto stack | +| 63 | PUSH4 | 3 | `.` | `uint32` | | push 4-byte value onto stack | +| 64 | PUSH5 | 3 | `.` | `uint40` | | push 5-byte value onto stack | +| 65 | PUSH6 | 3 | `.` | `uint48` | | push 6-byte value onto stack | +| 66 | PUSH7 | 3 | `.` | `uint56` | | push 7-byte value onto stack | +| 67 | PUSH8 | 3 | `.` | `uint64` | | push 8-byte value onto stack | +| 68 | PUSH9 | 3 | `.` | `uint72` | | push 9-byte value onto stack | +| 69 | PUSH10 | 3 | `.` | `uint80` | | push 10-byte value onto stack | +| 6A | PUSH11 | 3 | `.` | `uint88` | | push 11-byte value onto stack | +| 6B | PUSH12 | 3 | `.` | `uint96` | | push 12-byte value onto stack | +| 6C | PUSH13 | 3 | `.` | `uint104` | | push 13-byte value onto stack | +| 6D | PUSH14 | 3 | `.` | `uint112` | | push 14-byte value onto stack | +| 6E | PUSH15 | 3 | `.` | `uint120` | | push 15-byte value onto stack | +| 6F | PUSH16 | 3 | `.` | `uint128` | | push 16-byte value onto stack | +| 70 | PUSH17 | 3 | `.` | `uint136` | | push 17-byte value onto stack | +| 71 | PUSH18 | 3 | `.` | `uint144` | | push 18-byte value onto stack | +| 72 | PUSH19 | 3 | `.` | `uint152` | | push 19-byte value onto stack | +| 73 | PUSH20 | 3 | `.` | `uint160` | | push 20-byte value onto stack | +| 74 | PUSH21 | 3 | `.` | `uint168` | | push 21-byte value onto stack | +| 75 | PUSH22 | 3 | `.` | `uint176` | | push 22-byte value onto stack | +| 76 | PUSH23 | 3 | `.` | `uint184` | | push 23-byte value onto stack | +| 77 | PUSH24 | 3 | `.` | `uint192` | | push 24-byte value onto stack | +| 78 | PUSH25 | 3 | `.` | `uint200` | | push 25-byte value onto stack | +| 79 | PUSH26 | 3 | `.` | `uint208` | | push 26-byte value onto stack | +| 7A | PUSH27 | 3 | `.` | `uint216` | | push 27-byte value onto stack | +| 7B | PUSH28 | 3 | `.` | `uint224` | | push 28-byte value onto stack | +| 7C | PUSH29 | 3 | `.` | `uint232` | | push 29-byte value onto stack | +| 7D | PUSH30 | 3 | `.` | `uint240` | | push 30-byte value onto stack | +| 7E | PUSH31 | 3 | `.` | `uint248` | | push 31-byte value onto stack | +| 7F | PUSH32 | 3 | `.` | `uint256` | | push 32-byte value onto stack | +| 80 | DUP1 | 3 | `a` | `a, a` | | clone 1st value on stack | +| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | clone 2nd value on stack | +| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | clone 3rd value on stack | +| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | clone 4th value on stack | +| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | clone 5th value on stack | +| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | clone 6th value on stack | +| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | clone 7th value on stack | +| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | clone 8th value on stack | +| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | clone 9th value on stack | +| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | clone 10th value on stack | +| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | clone 11th value on stack | +| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | clone 12th value on stack | +| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | clone 13th value on stack | +| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | clone 14th value on stack | +| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | clone 15th value on stack | +| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | clone 16th value on stack | +| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | +| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | +| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | +| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | +| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | +| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | +| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | +| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | +| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | +| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | +| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | +| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | +| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | +| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | +| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | +| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | +| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | +| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | +| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | 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/de/developers/docs/gas/index.md b/public/content/translations/de/developers/docs/gas/index.md index b669b72079d..a368ee37592 100644 --- a/public/content/translations/de/developers/docs/gas/index.md +++ b/public/content/translations/de/developers/docs/gas/index.md @@ -55,7 +55,7 @@ Jeder Block hat seine eigene Basisgebühr, welche als reservierter Preis erschei Die Grundgebühr wird anhand einer Formel berechnet, die die Größe des vorherigen Blocks (die für alle Transaktionen verwendete Gasmenge) mit der Zielgröße vergleicht. Die Grundgebühr erhöht sich um maximal 12,5 % pro Block, wenn die Zielblockgröße überschritten wird. Dieses exponentielle Wachstum macht es wirtschaftlich unrentabel, die Blockgröße unbegrenzt hoch zu halten. | Blocknummer | Enthaltenes Gas | Gebührenerhöhung | Aktuelle Grundgebühr | -| ----------- | --------------: | ---------------: | -------------------: | +| ----------- | ---------------:| ----------------:| --------------------:| | 1 | 15 m | 0 % | 100 gwei | | 2 | 30 m | 0 % | 100 gwei | | 3 | 30 m | 12,5 % | 112,5 gwei | @@ -70,7 +70,7 @@ Der obigen Tabelle folgend: Um eine Transaktion auf Block Nummer 9 zu erstellen, Außerdem ist es unwahrscheinlich, dass es zu längeren Zeiträumen mit vollen Blöcken kommt, da die Grundgebühr vor einem vollen Block schnell ansteigt. | Blocknummer | Enthaltenes Gas | Gebührenerhöhung | Aktuelle Grundgebühr | -| ----------- | --------------: | ---------------: | -------------------: | +| ----------- | ---------------:| ----------------:| --------------------:| | 30 | 30 m | 12,5 % | 2705,6 gwei | | ... | ... | 12,5 % | ... | | 50 | 30 m | 12,5 % | 28531,3 gwei | diff --git a/public/content/translations/de/developers/docs/networks/index.md b/public/content/translations/de/developers/docs/networks/index.md index 4a32ec80066..0131cc16499 100644 --- a/public/content/translations/de/developers/docs/networks/index.md +++ b/public/content/translations/de/developers/docs/networks/index.md @@ -56,12 +56,11 @@ Die beiden öffentlichen Testnets, die die Client-Entwickler derzeit betreiben, - [QuickNode Sepolia Faucet](https://faucet.quicknode.com/drip) - [Grabteeth](https://grabteeth.xyz/) - [PoW-Faucet](https://sepolia-faucet.pk910.de/) -- [Sepolia-Faucet](https://faucet.sepolia.dev/) -- [FaucETH](https://fauceth.komputing.org) -- [Coinbase Wallet Faucet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) -- [Alchemy Sepolia-Faucet](https://sepoliafaucet.com/) -- [Infura Sepolia-Faucet](https://www.infura.io/faucet) -- [Chainstack Sepolia-Faucet](https://faucet.chainstack.com/sepolia-faucet) +- [Faucet für Coinbase-Wallet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) +- [Faucet für Alchemy Sepolia](https://sepoliafaucet.com/) +- [Faucet für Infura Sepolia](https://www.infura.io/faucet) +- [Faucet für Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [Testnetz-Faucet | Sepolia](https://testnet-faucet.com/sepolia/) #### Goerli _(Langzeit-Support)_ {#goerli} @@ -113,9 +112,17 @@ Ein Testnet für [Optimism](https://www.optimism.io/). - [Paradigm-Faucet](https://faucet.paradigm.xyz/) - [Coinbase Wallet Faucet | Optimism Goerli](https://coinbase.com/faucets/optimism-goerli-faucet) +#### Starknet Goerli {#starknet-goerli} + +Ein Testnetz für [Starknet](https://www.starknet.io). + +##### Faucets + +- [Starknet-Faucet](https://faucet.goerli.starknet.io) + ## Private Netzwerke {#private-networks} -Ein Ethereum-Netzwerk ist ein privates Netzwerk, wenn seine Knoten nicht mit einem öffentlichen Netzwerk verbunden sind (d. h. Mainnet oder ein Testnet). In diesem Zusammenhang bedeutet privat nur reserviert oder isoliert statt geschützt oder sicher. +Ein Ethereum-Netzwerk ist ein privates Netzwerk, wenn seine Knoten nicht mit einem öffentlichen Netzwerk verbunden sind (z. B. mit Mainnet oder einem Testnet). In diesem Zusammenhang bedeutet privat nur reserviert oder isoliert statt geschützt oder sicher. ### Entwicklungsnetzwerke {#development-networks} @@ -125,7 +132,7 @@ Es gibt Projekte und Tools, die dabei hilfreich sind. Erfahren Sie mehr über [E ### Konsortium-Netzwerke {#consortium-networks} -Der Konsensprozess wird von einer vordefinierten Gruppe von Knoten gesteuert, die vertrauenswürdig sind. Zum Beispiel ein privates Netzwerk bekannter akademischer Institutionen, die jeweils einen einzelnen Knoten stellen, wodurch Blöcke mit einer Schwelle von Unterzeichnern innerhalb des Netzwerks validiert werden. +Der Konsensprozess wird von einer vordefinierten Gruppe von Nodes gesteuert, die vertrauenswürdig sind. Beispielsweise ein privates Netzwerk bekannter akademischer Institutionen, die jeweils eine einzelne Node stellen, sowie Blöcke werden mithilfe einer Schwelle von Unterzeichnern innerhalb des Netzwerks validiert. Wenn ein öffentliches Ethereum-Netzwerk wie das öffentliche Internet ist, dann ist ein Konsortialnetzwerk wie ein privates Intranet. @@ -137,4 +144,4 @@ Wenn ein öffentliches Ethereum-Netzwerk wie das öffentliche Internet ist, dann ## Weiterführende Informationen {#further-reading} - [Vorschlag: vorhersehbarer Ethereum-Testnet-Lebenszyklus](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) -- [Die Evolution der Ethereum-Testnets](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) +- [Die Entwicklung der Ethereum-Testnets](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md index 49f6b56c0f0..2a1bab7cc38 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md @@ -56,7 +56,7 @@ Bevor Sie ihren eigenen Archivierungsknoten starten, sollten Sie die Unterschied ## Empfohlene Verfahren -Neben den generellen [Empfehlungen zum Betreiben eines Knotens](/developers/docs/nodes-and-clients/run-a-node/) kann ein Archivierungsknoten höhere Anforderungen an Hardware und Wartung stellen. In Anbetracht von Erigons [Schlüsselfunktionen](https://github.com/ledgerwatch/erigon#key-features) ist der praktischste Ansatz, die [Erigon](/developers/docs/nodes-and-clients/#erigon)-Client-Implementation zu verwenden. +Abgesehen von den generellen [Empfehlungen zum Betreiben einer Node](/developers/docs/nodes-and-clients/run-a-node/) kann eine Archivierungs-Node höhere Anforderungen an Hardware und Wartung stellen. In Anbetracht von Erigons [Schlüsselfunktionen](https://github.com/ledgerwatch/erigon#key-features) ist der praktischste Ansatz, die [Erigon](/developers/docs/nodes-and-clients/#erigon)-Client-Implementation zu verwenden. ### Hardware diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md index 38bb734b15e..9dd6b3ba85b 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md @@ -31,7 +31,7 @@ Die Client-Vielfalt bietet auch eine gewisse Widerstandsfähigkeit gegen Angriff Ein Fehler in einem Konsensclient mit mehr als 33 % der Ethereum-Knoten könnte verhindern, dass die Konsensebene finalisieren kann. Das bedeutet, dass die Nutzer nicht darauf vertrauen können, dass Transaktionen nicht irgendwann rückgängig gemacht oder geändert werden. Dies wäre für viele der auf Ethereum aufbauenden Anwendungen, insbesondere DeFi, sehr problematisch. - Schlimmer noch, ein kritischer Fehler in einem Client mit einer Zweidrittelmehrheit könnte dazu führen, dass die Chain nicht korrekt geteilt und finalisiert wird. Dies wiederum würde dazu führen, dass eine große Anzahl von Validatoren auf einer ungültigen Chain stecken bleibt. Wenn sie sich der korrekten Chain wieder anschließen möchten, müssen diese Validatoren mit Slashing oder einem langsamen und teuren freiwilligen Rückzug und Reaktivierung rechnen. Das Ausmaß eines Slashings skaliert mit der Anzahl der schuldigen Knoten, wobei maximal eine Zweidrittelmehrheit geslashed werden kann (32 ETH). + Schlimmer noch, ein kritischer Fehler in einem Client mit einer Zweidrittelmehrheit könnte dazu führen, dass die Chain nicht korrekt geteilt und finalisiert wird. Dies wiederum würde dazu führen, dass eine große Anzahl von Validatoren auf einer ungültigen Chain stecken bleibt. Wenn sie sich der korrekten Chain wieder anschließen möchten, müssen diese Validatoren mit Slashing oder einem langsamen und teuren freiwilligen Rückzug und Reaktivierung rechnen. Das Ausmaß eines Slashings skaliert mit der Anzahl der schuldigen Knoten, wobei maximal eine Zweidrittelmehrheit geslashed werden kann (32 ETH). Obwohl dies unwahrscheinliche Szenarien sind, kann das Ethereum-Ökosystem das Risiko mindern, indem es die Verteilung der Clients auf die aktiven Knoten ausgleicht. Im Idealfall würde kein Konsensclient jemals einen Anteil von 33 % an der Gesamtzahl der Nodes erreichen. diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/index.md index 9a268da2f34..b9ba9692b62 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/index.md @@ -136,6 +136,7 @@ Diese Tabelle gibt einen Überblick über die verschiedenen Clients. Sie alle be | [Nethermind](http://nethermind.io/) | C#, .NET | Linux, Windows, MacOS | Mainnet, Sepolia, Goerli und weitere | Snap (ohne Serving), Fast, Full | Archive, Pruned | | [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux, Windows, MacOS | Mainnet, Sepolia, Goerli und weitere | Snap, Fast, Full | Archive, Pruned | | [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux, Windows, MacOS | Mainnet, Sepolia, Goerli und weitere | Full | Archive, Pruned | +| [Reth](https://github.com/paradigmxyz/reth) | Rust | Linux, Windows, MacOS | Mainnet, Sepolia, Goerli und weitere | Full | Archiv, Reduziert | Weitere Informationen zu unterstützten Netzwerken finden Sie unter [Ethereum-Netzwerke](/developers/docs/networks/). diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md index c29b90a4adc..e2cc50bf1ce 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md @@ -1,5 +1,5 @@ --- -title: Light Clients +title: Leichte Clients description: Einführung zu leichten Clients von Ethereum. lang: de --- 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 1522866987d..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 @@ -1,5 +1,5 @@ --- -title: Node-Architektur +title: Knotenarchitektur description: Einleitung zum Aufbau von Ethereum-Knoten. lang: de --- @@ -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} @@ -55,5 +55,5 @@ Knotenbetreiber können Validatoren zu ihren Konsensclients hinzufügen, indem s ## Weiterführende Informationen {#further-reading} - [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) -- [Blockvorschlag](/developers/docs/consensus-mechanisms/pos/block-proposal) +- [Block-Vorschlag](/developers/docs/consensus-mechanisms/pos/block-proposal) - [Prämien und Strafen für Validatoren](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md index e41f72495f8..2d3dfba12d8 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md @@ -151,7 +151,7 @@ Dort finden Sie die Versionsseiten der Clients, auf denen Sie die vorgefertigten ##### Clients auf Ausführungsebene - [Besu](https://github.com/hyperledger/besu/releases) -- [Erigon](https://github.com/ledgerwatch/erigon#usage) (Bietet keine vorgefertigte Binärdatei, muss kompiliert werden) +- [Erigon](https://github.com/ledgerwatch/erigon/releases) - [Geth](https://geth.ethereum.org/downloads/) - [Nethermind](https://downloads.nethermind.io/) 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/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/de/guides/how-to-create-an-ethereum-account/index.md b/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md index b547c07f2c6..80a7886110f 100644 --- a/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md +++ b/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md @@ -4,37 +4,39 @@ description: Eine Schritt-für-Schritt-Anleitung für die Erstellung eines Ether lang: de --- -# So "registrieren" Sie ein Ethereum-Konto +# So erstellen Sie ein Ethereum-Konto -Jeder kann ein Ethereum-Konto kostenlos erstellen mit einer speziellen Art App, allgemein als „Wallet" bezeichnet. Wallets erstellen und sichern die Schlüssel die ein Halten, Senden und Empfangen von Kryptowährungen ermöglichen. Außerdem kann man sich mit Projekten auf Ethereum verbinden, um beispielsweise NFTs oder Token zu handeln, wie auch den Zugang zu Spielen zu öffnen, und noch viel mehr. +Jeder kann zu jeder Zeit ein kostenloses Ethereum-Konto einrichten. Es gibt mehrere Möglichkeiten, aber die einfachste und gebräuchlichste ist die Verwendung einer App, die als Wallet bekannt ist. Wallets erstellen und sichern den Schlüssel, mit dem Sie Ethereum nutzen können. Mit Ihrer Wallet können Sie Transaktionen senden, Ihren Token-Saldo überprüfen und sich mit Anwendungen verbinden, die auf Ethereum aufgebaut sind, wie zum Beispiel Token-Börsen, Spiele, NFT-Marktplätze und mehr. Einige "web2"-Anwendungen erlauben es nun auch, sich mit Ethereum anzumelden. -Im Gegensatz zur Eröffnung eines neuen Kontos bei einer Firma erfolgt die Erstellung eines Ethereum Kontos frei, privat und ohne gesonderte Erlaubnis. Die Konten werden durch Schlüssel kontrolliert, die Sie mit Hilfe Ihrer Wallet-Software erstellen. Sie werden weder von einer dritten Partei ausgestellt noch in einem zentralen Register gespeichert. +Im Gegensatz zur Eröffnung eines neuen Kontos bei einem Unternehmen erfolgt die Einrichtung eines Ethereum-Kontos freiwillig, privat und ohne Genehmigungspflicht. Die Konten werden durch Schlüssel kontrolliert, die Sie mit Hilfe Ihrer Wallet-Software erstellen. Sie werden weder von einer dritten Partei ausgestellt noch in einem zentralen Register gespeichert. -## Schritt 1: Durchsuchen Sie unsere Liste der Wallets (Geldbörsen) +## Schritt 1: Eine Wallet auswählen -Eine Wallet ist wie ein Online-Bankkonto für Ethereum. Es gibt Dutzende von verschiedenen Wallets (Geldbörsen) zur Auswahl - für das Handy, für den Desktop oder sogar für Browser-Erweiterungen. Unsere Liste mit vertrauenswürdigen Geldbörsen ist ein guter Anfang. +Eine Wallet ist eine App, mit der Sie Ihr Ethereum-Konto verwalten können. Die App verwendet Ihre Schlüssel, um Transaktionen zu senden oder entgegenzunehmen und sich bei Anwendungen anzumelden. Es gibt Dutzende von verschiedenen Wallets (Geldbörsen) zur Auswahl - für das Handy, für den Desktop oder sogar für Browser-Erweiterungen. Finden Sie eine Wallet -## Schritt 2: Wählen Sie eine Wallet, die Ihren Anforderungen entspricht +Wenn Sie noch keine Erfahrung mit Kryptowährungen haben, können Sie den Filter "New to Crypto" (Neu im Bereich Kryptowährungen) auf der Seite "Find a Wallet" (Geldbörse finden) auswählen, um die Wallets zu finden, die alle notwendigen Funktionen für Einsteiger enthalten. -Wenn Sie neu sind, können Sie den Filter „New to crypto" aktivieren, um nur die Wallets zu sehen, die alle notwendigen Funktionen enthalten, von denen wir glauben, dass sie für Anfänger besonders geeignet sind. Es gibt auch andere Profilfilter, die auf Ihre Bedürfnisse abgestimmt sind. +![Filterauswahl auf der Seite „Wallet finden“](./wallet-box.png) -## Schritt 3: Laden Sie Ihre Wallet-App herunter und installieren Sie sie. +Es gibt auch andere Profilfilter, die auf Ihre Bedürfnisse abgestimmt sind. Das sind Beispiele für gängige Wallets – Sie sollten jedoch selbst recherchieren, bevor Sie einer Software vertrauen. + +## Schritt 2: Wallet-App herunterladen und installieren Wenn Sie sich für eine bestimmte Wallet entschieden haben, besuchen Sie die offizielle Website oder den App-Store, laden Sie es herunter und installieren Sie es. Sie alle sollten kostenlos sein. -## Schritt 4: Öffnen Sie die App und erstellen oder importieren Sie Ihr Ethereum-Konto +## Schritt 3: App öffnen und ein Ethereum-Konto erstellen oder importieren Wenn Sie Ihre neue Wallet zum ersten Mal öffnen, werden Sie möglicherweise gefragt, ob Sie ein neues Konto anlegen oder ein bestehendes importieren möchten. Klicken Sie auf neues Konto erstellen. -## Schritt 5: Speichern Sie Ihren Wiederherstellungssatz +## Schritt 4: Wiederherstellungssatz speichern -Einige Anwendungen fordern Sie auf, einen geheimen Wiederherstellungssatz zu speichern. Es ist extrem wichtig, diesen geheimen Wiederherstellungssatz sicher aufzubewahren! Jede Person, die diesen geheimen Wiederherstellungssatz kennt, kann die Kontrolle über alle Ihre Konten übernehmen, die mit diesen Wörtern erstellt wurden. Geben Sie diese niemals weiter. Dieser Satz sollte 12 bis 24 zufällig generierte Wörter enthalten (die Reihenfolge der Wörter ist wichtig). +Einige Anwendungen fordern Sie auf, eine geheime "Seed-Phrase" zu speichern (diese wird auch als "Recovery-Phrase" oder "Mnemonic" bezeichnet). Es ist extrem wichtig, diese "Seed-Phrase " sicher aufzubewahren! Die Seed-Phrase wird verwendet, um einen geheimen Schlüssel für ein Konto zu generieren, der zum Signieren und Senden von Transaktionen verwendet werden kann. Jede Person, die die Seed-Phrase kennt, kann alle Konten kontrollieren, die damit erstellt wurden. Teilen Sie die Seed-Phrase niemals mit anderen. Die Seed-Phrase sollte 12 bis 24 zufällig generierte Wörter enthalten (die Reihenfolge der Wörter ist wichtig). -Sobald Sie Ihren Wiederherstellungssatz gespeichert haben, sollten Sie das Dashboard Ihrer Brieftasche mit Ihrem Guthaben sehen. Schauen Sie sich unsere Anleitung an: [Wie verwenden Sie ein Wallet.](/guides/how-to-use-a-wallet) +Sobald Sie Ihre Seed-Phrase gespeichert haben, sollten Sie Ihr Wallet-Dashboard mit Ihrem Guthaben sehen können. Schauen Sie sich unsere Anleitung an: [Wie verwenden Sie ein Wallet.](/guides/how-to-use-a-wallet)
@@ -49,20 +51,22 @@ Sobald Sie Ihren Wiederherstellungssatz gespeichert haben, sollten Sie das Dashb ### Ist meine Wallet auch mein Ethereum-Konto? -Nein, genau wie beim Online-Banking auch kann man mehrere unterschiedliche Konten besitzen, die in einer Wallet-Anwendung gespeichert sind. Die 1aus 24 bzw. 24 Wörtern bestehende Phrase sichert sie alle: Man kann sie mit dem Samen eines großen Baumes vergleichen (weshalb sie stets sicher verwahrt werden muss). Jeder Ast des Baumes enthält einen Schlüssel, und jeder Schlüssel ist einer Ihrer Konten. Wenn Sie den Zugang zu Ihrer Wallet verlieren (also der Baum gefällt wird), können Sie jederzeit alle verschiedenen Konten durch andere Software und den gleichen Seed wiederherstellen (es wächst immer der gleiche Baum daraus). +Nein. Die Wallet ist ein Verwaltungsinstrument, mit dem Sie Ihre Konten verwalten können. Eine einzige Wallet kann Zugang zu mehreren Konten gewähren, und ein einziges Konto kann von mehreren Wallets genutzt werden. Die Seed-Phrase wird verwendet, um Konten zu erstellen, die dann von der Wallet verwaltet werden. + +Sie können sich die Konten als Blätter an einem Baum vorstellen, die alle aus einer einzigen Seed-Phrase "erwachsen". Jedes einzelne "Seed" bringt einen völlig anderen Konto-Baum hervor. ### Kann ich Bitcoin an eine Ethereum-Adresse senden oder Ether an eine Bitcoin-Adresse? -Nein, das können Sie nicht. Bitcoin und Ether befinden sich auf zwei separaten Netzwerken (also unterschiedlichen Blockchains) mit jeweils eigenen Modellen der Buchführung und des Formats der Adresse. Es gab verschiedene Versuche, eine Brücke zwischen den Netzwerken zu bauen, von welchen der Aktivste derzeit [Wrapped bitcoin bzw. WBTC](https://www.bitcoin.com/get-started/what-is-wbtc/) ist. Dies ist keine Unterstützung, da WBTC eine treuhänderische Lösung ist (was bedeutet, dass eine einzelne Personengruppe bestimmte kritische Funktionen kontrolliert) und wird hier nur zu Informationszwecken bereitgestellt. +Nein, das ist nicht möglich. Bitcoin und Ether befinden sich auf zwei separaten Netzwerken (also unterschiedlichen Blockchains) mit jeweils eigenen Modellen der Buchführung und des Formats der Adresse. Es gab verschiedene Versuche, eine Brücke zwischen den Netzwerken zu bauen, von welchen der Aktivste derzeit [Wrapped bitcoin bzw. WBTC](https://www.bitcoin.com/get-started/what-is-wbtc/) ist. Dies ist keine Unterstützung, da WBTC eine treuhänderische Lösung ist (was bedeutet, dass eine einzelne Personengruppe bestimmte kritische Funktionen kontrolliert) und wird hier nur zu Informationszwecken bereitgestellt. ### Wenn ich eine ETH-Adresse besitze, besitze ich dann die gleiche Adresse auf anderen Blockchains? -Sie können dieselbe Adresse auf allen EVM-kompatiblen Blockchains verwenden (wenn Sie eine Wallet mit einem Wiederherstellungssatz haben). Diese [Liste](https://chainlist.org/) zeigt Ihnen, welche Blockchains Sie mit der gleichen Adresse verwenden können. Einige Blockchains, wie z. B. Bitcoin, implementieren einen komplett separaten Satz von Netzwerkregeln und Sie benötigen eine andere Adresse mit einem anderen Format. Wenn Sie eine Smart Contract Wallet haben, sollten Sie auf der Produktwebsite nachsehen, welche Blockchains unterstützt werden. +Sie können dieselbe Adresse auf allen Blockchains verwenden, die eine ähnliche zugrunde liegende Software wie Ethereum verwenden (bekannt als "EVM-kompatibel"). Diese [Liste](https://chainlist.org/) zeigt Ihnen, welche Blockchains Sie mit der gleichen Adresse verwenden können. Einige Blockchains, wie z. B. Bitcoin, implementieren einen komplett separaten Satz von Netzwerkregeln und Sie benötigen eine andere Adresse mit einem anderen Format. Wenn Sie eine Smart Contract Wallet haben, sollten Sie auf der Produktwebsite nachsehen, welche Blockchains unterstützt werden. ### Ist eine eigene Wallet sicherer als die Beträge auf einer Börse zu halten? -Ja, das ist eine viel sicherere Option, da niemand sonst Zugriff auf Ihre Gelder haben wird. Leider gibt es viele Beispiele für gescheiterte Börsen, die Konkurs angemeldet haben, was dazu führte, dass die Nutzer ihre verwahrten Ersparnisse verloren. Hacks, eingefrorene Konten oder blockierte Auszahlungen sind weitere häufige Risiken. Der Besitz einer Wallet (mit einem Wiederherstellungssatz) ist der beste Weg, um Ihr Vermögen zu schützen. Ein schlecht gesicherter Wiederherstellungssatz birgt jedoch potenziell mehr Risiken als die Verwaltung Ihrer Schlüssel durch eine Börse. Bewahren Sie Ihren Wiederherstellungssatz an einem sicheren Ort auf. +Eine eigene Wallet zu besitzen bedeutet, dass Sie die Verantwortung für die Sicherheit Ihrer Vermögenswerte übernehmen. Leider gibt es viele Beispiele für gescheiterte Börsen, die das Geld ihrer Kunden verloren haben. Wenn Sie eine Wallet besitzen (mit einer Seed-Phrase), ist es nicht erforderlich, dass Sie Ihr Vermögen einem anderen Unternehmen anvertrauen. Allerdings müssen Sie Ihre eigenen Schlüssel sichern und Phishing-Betrug, die versehentliche Genehmigung von Transaktionen oder die Preisgabe von Schlüsseln, die Interaktion mit gefälschten Websites und andere Risiken bei der Selbstverwahrung vermeiden. Risiken und Nutzen sind unterschiedlich. ### Wenn ich mein/e Telefon/Hardware-Wallet verliere, muss ich dann dieselbe Wallet-App erneut verwenden, um das verlorene Geld wiederzuerlangen? -Nein, Sie können nahezu jede Wallet verwenden, da der Wiederherstellungsprozess weitestgehend standardisiert ist. Das bedeutet, dass die Eingabe des gleichen Satzes aus 12 bzw. 24 Wörtern in den meisten Wallets zur Wiederherstellung desselben Kontos genutzt werden kann. Seien Sie vorsichtig, falls Sie dies einmal tun müssen: Stellen Sie am besten sicher, dass Sie während der Wiederherstellung Ihrer Wallet nicht mit dem Internet verbunden sind, um ein versehentliches Durchsickern Ihres Wiederherstellungscodes zu vermeiden. Es ist meist unmöglich, verlorene Guthaben ohne den Wiederherstellungssatz wiederzuerlangen. +Nein, es ist möglich, eine andere Wallet zu verwenden. Solange Sie die Seed-Phrase haben, können Sie diese in den meisten Wallets eingeben. Die Wallet stellt dann Ihr Konto wieder her. Seien Sie vorsichtig, wenn das einmal erforderlich werden sollte: Stellen Sie sicher, dass Sie bei der Wiederherstellung Ihrer Wallet nicht mit dem Internet verbunden sind, damit Ihre Seed-Phrase nicht versehentlich veröffentlicht wird. Meist ist es nicht möglich, verlorene Gelder ohne die Seed-Phrase wiederzuerlangen. diff --git a/public/content/translations/de/guides/how-to-id-scam-tokens/index.md b/public/content/translations/de/guides/how-to-id-scam-tokens/index.md new file mode 100644 index 00000000000..947a5773e95 --- /dev/null +++ b/public/content/translations/de/guides/how-to-id-scam-tokens/index.md @@ -0,0 +1,97 @@ +--- +title: So erkennen Sie betrügerische Token +description: Erkennen von betrügerischen Token, wie sie sich legitim erscheinen lassen und wie sie sich vermeiden lassen. +lang: de +--- + +# So erkennen Sie betrügerische Token {#identify-scam-tokens} + +Eine der häufigsten Verwendungen von Ethereum ist die Schaffung eines handelbaren Tokens durch eine Gruppe, gewissermaßen ihre eigene Währung. Diese Token folgen in der Regel dem Standard, [ERC-20](/developers/docs/standards/tokens/erc-20/). Jedoch gibt es überall, wo es legitime wertschöpfende Anwendungsmöglichkeiten gibt, auch Kriminelle, die diese Werte stehlen möchten. + +Die beiden folgenden Täuschungsversuche sind dabei gängig: + +- **Verkaufen eines betrügerischen Tokens**, der im Aussehen einem legitimen Token ähnelt und den Sie kaufen möchten, jedoch von einem Betrüger erstellt wurde und keinen Wert hat. +- **Sie werden dazu verleitet, unzulässige Transaktionen zu unterzeichnen**, indem Sie für gewöhnlich auf die Benutzeroberfläche der Betrüger geleitet wird. Sie könnten versuchen, Sie dazu zu bringen, ihren Verträgen einen Freibetrag für Ihre ERC-20-Token zu gewähren, sensible Informationen preiszugeben, über die sie Zugang zu Ihren Vermögenswerten erhalten usw. Solche Benutzeroberflächen können nahezu perfekte Klone von legitimen Websites sein, jedoch mit versteckten Tricks. + +Um zu veranschaulichen, was Betrugs-Token sind und wie man sie erkennt, sehen wir uns ein Beispiel an: [`wARB`](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82). Dieser Token immitiert das Aussehen eines legitimen [`ARB`](https://etherscan.io/address/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1) -Tokens. + + + +Arbitrum ist eine Organisation zur Entwicklung und Verwaltung von optimistischen Rollups. Ursprünglich war Arbitrum als gewinnorientiertes Unternehmen organisiert, unternahm dann aber Schritte zur Dezentralisierung. Im Rahmen dieses Prozesses wurde ein handelbarer Governance-Token ausgegeben. + + + + + +In Ethereum gibt es eine Konvention: Wird ein Asset erstellt, das nicht ERC-20-kompatibel ist, wird eine " Wrapped"-Version erstellt wird, deren Name mit "w" beginnt. So gibt es beispielsweise wBTC für Bitcoin und wETH für Ether. + +Es ergibt keinen Sinn, eine Wrapped-Version eines ERC-20-Tokens zu erstellen, der bereits auf Ethereum vorhanden ist, aber Betrüger verlassen sich eher auf den Anschein von Legitimität als auf die zugrunde liegende Realität. + + + +## Wie funktionieren betrügerische Token? {#how-do-scam-tokens-work} + +Dezentralisierung ist das zentrale Element von Ethereum. Das bedeutet, dass es keine zentrale Autorität gibt, die Ihre Anlagen konfiszieren oder Sie daran hindern könnte, einen Smart Contract bereitzustellen. Doch das bedeutet auch, dass Betrüger jeden beliebigen Smart Contract bereitstellen können. + + + +Smart Contracts sind die Programme, die auf der Ethereum-Blockchain laufen. Jeder ERC-20 Token ist beispielsweise als Smart Contract implementiert. + + + +Insbesondere Arbitrum setzt so einen Contract ein, der das Symbol `ARB` nutzt. Doch das hält andere Menschen nicht davon ab, ebenfalls einen Contract einzusetzen, der dasselbe oder ein ähnliches Symbol nutzt. Wer den Contract schreibt, kann bestimmen, wofür er verwendet wird. + +## Legitimes Erscheinungsbild {#appearing-legitimate} + +Es gibt einige Tricks, die die Ersteller von betrügerischen Tokens nutzen, um ein legitimes Erscheinungsbild zu imitieren. + +- **Legitimer Name und legitimes Symbol**. Wie bereits beschrieben, können ERC-20-Contracts dasselbe Symbol und denselben Namen wie andere ERC-20-Contracts aufweisen. Es ist nicht möglich, darüber auf die Sicherheit der Token zu schließen. + +- **Legitime Besitzer**. Betrügerische Token senden oft signifikante Beträge an Adressen, die als legitime Besitzer des echten Tokens angenommen werden. + + Kommen wir nochmals auf `wARB` zurück. [Ungefähr 16 % der Token](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82?a=0x1c8db745abe3c8162119b9ef2c13864cd1fdd72f) werden von einer Adresse verwaltet, deren öffentlicher Tag ["Arbitrum Foundation: Deployer"](https://etherscan.io/address/0x1c8db745abe3c8162119b9ef2c13864cd1fdd72f) ist. Das ist _keine_ falsche Adresse, es ist vielmehr die Adresse, die [den echten ARB-Contract auf dem Ethereum-Mainnet](https://etherscan.io/tx/0x242b50ab4fe9896cb0439cfe6e2321d23feede7eeceb31aa2dbb46fc06ed2670) eingesetzt hat. + + Da das ERC-20-Guthaben einer Adresse Teil des ERC-20-Vertragsspeichers ist, kann dafür festgelegt werden, was sich der Entwickler wünscht. Es ist für einen Contract auch möglich, Transfers zu verbieten, sodass der legitime Nutzer keine Chance hat, die betrügerischen Token zu entfernen. + +- **Legitime Transfers**. _Legitime Besitzer würden nicht dafür bezahlen, einen betrügerischen Token auf andere zu übertragen. Daher muss der Token, sofern er Transfers ausführt, legitim sein, oder?_ **Falsch**. `Transfer`-Ereignisse werden auch durch den ERC-20-Contract produziert. Ein Betrüger kann einfach den Contract so schreiben, dass er diese Aktionen produziert. + +## Betrügerische Websites {#websites} + +Betrüger können auch sehr überzeugende Websites produzieren, manchmal sogar präzise Klone von authentischen Seiten mit einer identischen Benutzeroberfläche, aber mit subtilen Tricks. Beispiele könnten externe links sein, die legitim aussehen, jedoch den Nutzer zu einer externen betrügerischen Seite senden. Es könnten auch falsche Anweisungen sein, die den Nutzer dazu bringen, seine Schlüssel freizugeben oder dem Angreifer Gelder zu senden. + +Die beste Art das zu vermeiden, ist es, die URL vorsichtig auf von Ihnen besuchte Seiten zu überprüfen. Dafür können Sie authentische Seiten in ihren Lesezeichen speichern. Dann können Sie die Seiten über Ihre Lesezeichen aufrufen, ohne versehentlich Rechtschreibfehler zu machen oder sich auf externe Links verlassen zu müssen. + +## Wie können Sie sich schützen? {#protect-yourself} + +1. **Überprüfen der Contract-Adresse**. Legitime Token stammen von legitimen Organisationen und Sie können die Contract-Adressen auf der Website dieser Organisation nachschauen. Zum Beispiel können Sie[ die legitimen Adressen für `ARB` hier nachsehen](https://docs.arbitrum.foundation/deployment-addresses#token). + +2. **Echte Token weisen Liquidität auf**. Eine weitere Option ist, sich die Liquidität-Poolgröße auf [Uniswap](https://uniswap.org/) anzuschauen – eines der gängigsten Token-Tauschprotokolle. Dieses Protokoll funktioniert, indem es Liquiditätspools nutzt, in die ihre Token investieren, in der Hoffnung, mit Handelsgebühren Gewinne zu machen. + +Betrügerische Tokens habe, wenn überhaupt, klassischerweise kleine Liquiditätspools, da die Betrüger keine echten Anlagen riskieren wollen. Der `ARB`/`ETH` Uniswap Pool hält beispielsweise ungefähr eine halbe Millionen Dollar ([schlagen Sie hier den aktuellen Wert nach](https://info.uniswap.org/#/pools/0x755e5a186f0469583bd2e80d1216e02ab88ec6ca)) und das Kaufen oder Verkaufen einer kleinen Menge wird den Preis nicht beeinflussen: + +![Einen legitimen Token kaufen](./uniswap-real.png) + +Doch wenn Sie versuchen würden, den betrügerischen `wARB`-Token zu kaufen, könnte sogar eine kleine Investition den Preis um über 90 % steigern: + +![Einen betrügerischen Token kaufen](./uniswap-scam.png) + +Das ist ein weiterer Beweis, der uns zeigt, dass `wARB` wahrscheinlich kein legitimer Token ist. + +3. **Sehen Sie auf Etherscan nach**. Viele betrügerische Token wurden bereits identifiziert und von der Community gemeldet. Solche Token werden in [Etherscan gekennzeichnet](https://info.etherscan.com/etherscan-token-reputation/). Während Etherscan keine unfehlbare Quelle ist (es ist normal für dezentralisierte Netzwerke, dass es so etwas nicht gibt), sind Token, die von Etherscan als Betrug gekennzeichnet wurden, wahrscheinlich betrügerisch. + + ![Betrügerische Token in Etherscan](./etherscan-scam.png) + +## Fazit {#conclusion} + +Solange es Werte in der Welt gibt, wird es immer Betrüger geben, die diese stehlen wollen. In einer dezentralisierten Welt gibt es niemanden, der Sie beschützt, außer Sie selbst. Hoffentlich helfen Ihnen diese Informationen dabei, betrügerische und legitime Token auseinanderzuhalten: + +- Betrügerische Token kopieren legitime Token, sie können denselben Namen, dasselbe Symbol etc. verwenden. +- Betrügerische Token _können nicht_ dieselbe Contract-Adresse verwenden. +- Die beste Quelle für die Adresse des legitimen Tokens ist die Organisation, um deren Token es sich handelt. +- Sie können zudem sichere Anwendungen wie [Uniswap](https://app.uniswap.org/#/swap) und [Etherscan](https://etherscan.io/) nutzen. diff --git a/public/content/translations/de/guides/how-to-swap-tokens/index.md b/public/content/translations/de/guides/how-to-swap-tokens/index.md index 0ded6458ae4..4c6b5e92f9d 100644 --- a/public/content/translations/de/guides/how-to-swap-tokens/index.md +++ b/public/content/translations/de/guides/how-to-swap-tokens/index.md @@ -12,7 +12,7 @@ Ein Token-Swap beinhaltet den Austausch von zwei verschiedenen Assets im Ethereu **Voraussetzung:** -- Haben Sie eine Krypto-Wallet. Sie können diesem Tutorium folgen: [Wie man ein Ethereum-Konto anmelden kann](/guides/how-to-create-an-ethereum-account/) +- Haben Sie eine Krypto-Wallet, können Sie sich dieses Tutorium ansehen: [So "registrieren" Sie ein Ethereum-Konto](/guides/how-to-create-an-ethereum-account/) - Laden Sie Ihre Krypto-Wallet auf ## 1. Verbinden Sie Ihre Krypto-Wallet mit einem Exchange (DEX) Ihrer Wahl diff --git a/public/content/translations/de/guides/how-to-use-a-bridge/index.md b/public/content/translations/de/guides/how-to-use-a-bridge/index.md index bb61f69da67..f04b434aba7 100644 --- a/public/content/translations/de/guides/how-to-use-a-bridge/index.md +++ b/public/content/translations/de/guides/how-to-use-a-bridge/index.md @@ -10,7 +10,7 @@ Wenn eine hohe Auslastung auf Ethereum herrscht, kann es teuer werden. Eine Lös **Voraussetzung:** -- Haben Sie eine Krypto-Wallet. Sie können diesem Tutorium folgen: [Wie man ein Ethereum-Konto anmelden kann](/guides/how-to-create-an-ethereum-account/) +- Haben Sie eine Krypto-Wallet, können Sie sich dieses Tutorium ansehen: [So "registrieren" Sie ein Ethereum-Konto](/guides/how-to-create-an-ethereum-account/) - Laden Sie Ihre Krypto-Wallet auf ## 1. Bestimmen Sie, welches Layer-2-Netzwerk Sie verwenden möchten diff --git a/public/content/translations/de/guides/how-to-use-a-wallet/index.md b/public/content/translations/de/guides/how-to-use-a-wallet/index.md index b69035ee381..d671c8fc6bb 100644 --- a/public/content/translations/de/guides/how-to-use-a-wallet/index.md +++ b/public/content/translations/de/guides/how-to-use-a-wallet/index.md @@ -6,7 +6,7 @@ lang: de # So verwenden Sie eine Wallet -Lernen Sie die grundlegenden Funktionen einer Krypto-Wallet kennen. Falls Sie noch keine besitzen, schauen Sie sich mal die Seite [Wie erstelle ich einen Ethereum "Account"](/guides/how-to-create-an-ethereum-account/) an. +Lernen Sie die grundlegenden Funktionen einer Krypto-Wallet kennen. Wenn Sie noch keine haben, werfen Sie einen blick auf unseren [Leitfaden zur Erstellung eines Ethereum-Kontos](/guides/how-to-create-an-ethereum-account/) an. ## Öffnen Sie Ihre Wallet @@ -18,7 +18,7 @@ Möchten Sie Kryptowährungen in ihrer Wallet empfangen? Jedes Ethereum Account hat seine eigene Empfangsadresse, welche eine einzigartige Abfolge von Zahlen und Buchstaben enthält. Die Adresse funktioniert wie eine Bankkontonummer. Ethereum-Adressen beginnen immer mit „0x“. Sie können diese Adresse mit jedem teilen: Es besteht kein Sicherheitsrisiko. -Ihre Adresse (die auch als „public key" bezeichnet wird) ist wie Ihre Wohnanschrift: Sie müssen sie den Leuten mitteilen, damit sie Sie finden können. Es besteht keine Gefahr, dies zu tun, weil Sie immer noch Ihre Haustür mit einem anderen Schlüssel, den Sie kontrollieren, abschließen können, sodass keiner hereinkommen kann, auch wenn sie wissen, wo Sie wohnen. +Mit Ihrer Adresse verhält es sich wie mit Ihrer Privatadresse: Sie müssen diese angeben, damit man Sie finden kann. Es besteht keine Gefahr, dies zu tun, weil Sie immer noch Ihre Haustür mit einem anderen Schlüssel, den Sie kontrollieren, abschließen können, sodass keiner hereinkommen kann, auch wenn sie wissen, wo Sie wohnen. Sie müssen jedem, der Ihnen Geld schicken möchten, Ihre öffentliche Adresse zur Verfügung stellen. Viele Wallet-Apps lassen Sie zur vereinfachten Handhabung Ihre Adresse kopieren oder zeigen einen QR-Code an, der gescannt werden kann. Vermeiden Sie die manuelle Eingabe einer Ethereum-Adresse. Dies kann leichtfertig zu Schreibfehlern und damit zum Verlust Ihres Vermögens führen. @@ -51,7 +51,7 @@ Ihre Adresse wird auf allen Ethereum Projekten dieselbe sein. Sie brauchen sich 1. Besuchen Sie die Webseite eines Projekts. 2. Wenn die Zielseite des Projekts nur eine statische Beschreibung des Projekts ist, sollten Sie in der Lage sein, auf eine Schaltfläche „App öffnen" im Menü zu klicken, die Sie zur eigentlichen Web-App navigiert. -3. Sobald Sie sich in der App befinden, klicken Sie auf „Verbinden" +3. Sobald Sie in der App sind, klicken Sie auf "Verbinden". ![Schaltfläche zum Verbinden mit einer Wallet](./connect1.png) @@ -77,7 +77,7 @@ Sie können dieselbe Adresse auf allen EVM-kompatiblen Blockchains verwenden (we ### Kann ich dieselbe Adresse auf mehreren Geräten verwenden? -Ja, Sie können dieselbe Adresse auf mehreren Geräten verwenden. Wallets sind technisch gesehen nur eine Schnittstelle, um Ihnen Ihr Guthaben zu zeigen und Transaktionen zu tätigen, Ihr Konto ist nicht in der Wallet gespeichert, sondern auf der Blockchain. +Ja, Sie können die gleiche Adresse auf mehreren Geräten verwenden. Wallets sind technisch gesehen nur eine Schnittstelle, um Ihnen Ihr Guthaben zu zeigen und Transaktionen zu tätigen, Ihr Konto ist nicht in der Wallet gespeichert, sondern auf der Blockchain. ### Ich habe kein Krypto erhalten, wo kann ich den Status einer Transaktion überprüfen? diff --git a/public/content/translations/de/guides/index.md b/public/content/translations/de/guides/index.md index 31c7d634305..b43574d37b3 100644 --- a/public/content/translations/de/guides/index.md +++ b/public/content/translations/de/guides/index.md @@ -6,7 +6,7 @@ lang: de # Ethereum Leitfäden -Wollen Sie Ihre Ethereum Reise starten? Ethereum ist kein Unternehmen mit einem Skript-gebundenen Helpdesk, aber diese praktischen Anleitungen helfen Ihnen zu lernen, wie Sie anfangen können. +Möchten Sie Ihre Ethereum Reise starten? Unsere praktischen Leitfäden führen Sie Schritt für Schritt durch den Einstieg und erleichtern Ihnen den Umgang mit dieser neuen Technologie. ## Erste Schritte @@ -16,14 +16,12 @@ Wollen Sie Ihre Ethereum Reise starten? Ethereum ist kein Unternehmen mit einem ## Grundlagen zur Sicherheit -1. [Wie man einen Smart-Contract-Zugriff widerrufen kann](/guides/how-to-revoke-token-access/) - Falls Sie plötzlich eine Transaktion in ihrer Wallet sehen, welche sie nicht initiiert haben, wird Ihnen diese Anleitung erklären, wie Sie das in Zukunft verhindern können. +1. [Wie man einen Smart-Contract-Zugriff widerrufen kann](/guides/how-to-revoke-token-access/) – Falls Sie plötzlich eine Transaktion in Ihrer Wallet sehen, die Sie nicht initiiert haben, finden Sie in diesem Leitfaden eine Anleitung, wie sich das in Zukunft verhinden lässt. + +2. [Wie man betrügerische Token (Scam-Token) erkennt](/guides/how-to-id-scam-tokens/) – Was scams sind, welche Taktiken dabei eingesetzt werden und wie man sie erkennen kann, um sich zu schützen und nicht betrogen zu werden. ## Ethereum verwenden 1. [Wie man Token in Layer 2 überführt](/guides/how-to-use-a-bridge/) - Sind Ethereum-Transaktionen zu teuer? Betrachten Sie den Wechsel auf sogenannte Layer-2 Skalierungslösungen. 2. [Wie man Token tauscht](/guides/how-to-swap-tokens/) - Wollen Sie Ihre Token gegen andere austauschen? Dieser simple Leitfaden zeigt Ihnen, wie Sie das machen. - -## Dezentralisierte Denkfähigkeiten - -Sobald Sie eine Wallet haben und einige der Features genutzt haben, verstehen Sie mehr über Ethereum, indem Sie sich fragen: "_Warum_ ist das eigentlich so wichtig?" Was macht Geld so wertvoll, wenn es niemand kontrolliert? Was ist Vertrauen? Trägt das zur Freiheit bei? Welche Arten von neuen Governance- und Organisationsstrukturen ermöglicht Ethereum? Diese und weitere Fragen werden offen in Gemeinschaften wie [Kernel](https://www.kernel.community/) diskutiert. diff --git a/public/content/translations/de/refi/index.md b/public/content/translations/de/refi/index.md index 7fa127d3f34..44bb7506994 100644 --- a/public/content/translations/de/refi/index.md +++ b/public/content/translations/de/refi/index.md @@ -18,7 +18,7 @@ summaryPoint3: Ein Instrument zur drastischen Skalierung von Gütern für ökolo Stattdessen zielt ReFi darauf ab, ökologische, kommunale oder soziale Probleme zu lösen, indem es regenerative Kreisläufe schafft. Diese Systeme schaffen Werte für die Teilnehmer und kommen gleichzeitig den Ökosystemen und Gemeinschaften zugute. -Eine der Grundlagen von ReFi ist das Konzept der regenerativen Wirtschaft, das von John Fullerton vom [Capital Institute](https://capitalinstitute.org) erdacht wurde. Er schlug acht miteinander verknüpfte Grundsätze vor, die der systemischen Gesundheit zugrunde liegen: +Eine der Grundlagen von ReFi ist das Konzept der regenerativen Wirtschaft, das von John Fullerton vom Capital Institute erdacht wurde. Er schlug [acht miteinander verknüpfte Grundsätze](https://capitalinstitute.org/8-principles-regenerative-economy/) vor, die der systemischen Gesundheit zugrunde liegen: ![Acht miteinander verknüpfte Grundsätze](./refi-regenerative-economy-diagram.png) diff --git a/public/content/translations/de/roadmap/account-abstraction/index.md b/public/content/translations/de/roadmap/account-abstraction/index.md index b85eabcf00e..f2ade84be2b 100644 --- a/public/content/translations/de/roadmap/account-abstraction/index.md +++ b/public/content/translations/de/roadmap/account-abstraction/index.md @@ -47,8 +47,8 @@ Zum Beispiel können Backup-Schlüssel zu einer Wallet hinzugefügt werden, soda - **Multisig-Autorisierung**: Sie können Autorisierungsdaten über mehrere vertrauenswürdige Personen oder Geräte verteilen. Dann kann der Vertrag so konfiguriert werden, dass Transaktionen über einem bestimmten vordefinierten Wert die Autorisierung von einem bestimmten Anteil (z.B. 3/5) der vertrauenswürdigen Parteien erfordern. Zum Beispiel könnten Transaktionen mit hohem Wert die Zustimmung sowohl von einem mobilen Gerät als auch von einer Hardware-Wallet erfordern, oder Signaturen von Konten, die an vertrauenswürdige Familienmitglieder verteilt wurden. - **Kontosperrung**: Wenn ein Gerät verloren geht oder kompromittiert wird, kann das Konto von einem anderen autorisierten Gerät aus gesperrt werden, um die Vermögenswerte des Benutzers zu schützen. - **Kontowiederherstellung**: Haben Sie ein Gerät verloren oder ein Passwort vergessen? Im aktuellen Paradigma könnte dies bedeuten, dass Ihre Vermögenswerte für immer eingefroren werden könnten. Mit einer Smart-Contract-Wallet können Sie einige vorab genehmigte Konten festlegen, die neue Geräte autorisieren und den Zugriff zurücksetzen können. -- **Transaktionslimits festlegen**: Legen Sie tägliche Grenzwerte fest, wie viel Wert innerhalb eines Tages/einer Woche/eines Monats vom Konto übertragen werden kann. Das bedeutet, wenn ein Angreifer Zugang zu Ihrem Konto erlangt, kann er nicht alles auf einmal abziehen und Sie haben die Möglichkeit, den Zugang zu sperren und zurückzusetzen. -- **Erstellen Sie Whitelists**: Erlauben Sie Transaktionen nur zu bestimmten Adressen, die Sie als sicher einstufen. Das bedeutet, dass _selbst wenn_ Ihr privater Schlüssel gestohlen wurde, der Angreifer keine Mittel an nicht-whitelistete Zielkonten senden könnte. Diese Whitelists würden mehrere Unterschriften zur Änderung erfordern, sodass ein Angreifer seine eigene Adresse nicht zur Liste hinzufügen könnte, es sei denn, er hätte Zugang zu mehreren Ihrer Backup-Schlüssel. +- **Transaktionslimits festlegen**: Legen Sie tägliche Obergrenzen dafür fest, wie viel Wert innerhalb eines Tages/einer Woche/eines Monats von dem Konto überwiesen werden kann. Das bedeutet, wenn ein Angreifer Zugang zu Ihrem Konto erlangt, kann er nicht alles auf einmal abziehen und Sie haben die Möglichkeit, den Zugang zu sperren und zurückzusetzen. +- **Whitelists erstellen**: Erlauben Sie Transaktionen nur zu bestimmten Adressen, von denen Sie wissen, dass sie sicher sind. Das bedeutet, dass _selbst wenn_ Ihr privater Schlüssel gestohlen wurde, der Angreifer keine Mittel an nicht-whitelistete Zielkonten senden könnte. Diese Whitelists würden mehrere Unterschriften zur Änderung erfordern, sodass ein Angreifer seine eigene Adresse nicht zur Liste hinzufügen könnte, es sei denn, er hätte Zugang zu mehreren Ihrer Backup-Schlüssel. ## Bessere Nutzererfahrung {#better-user-experience} 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/de/roadmap/index.md b/public/content/translations/de/roadmap/index.md index c172f67d16e..beb3fceb6ea 100644 --- a/public/content/translations/de/roadmap/index.md +++ b/public/content/translations/de/roadmap/index.md @@ -3,13 +3,15 @@ title: Ethereum-Roadmap description: Der Weg zu mehr Skalierbarkeit, Sicherheit und Nachhaltigkeit für Ethereum. lang: de template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "Ethereum-Roadmap" summaryPoints: buttons: - - label: Weitere Upgrades + - + label: Weitere Upgrades toId: welche-veränderungen-kommen-werden - - label: Bisherige Upgrades + - + label: Bisherige Upgrades to: /history/ variant: Übersicht --- @@ -59,7 +61,7 @@ Ethereum erhält regelmäßig Upgrades, die seine Skalierbarkeit, Sicherheit ode -Die Roadmap ist vor allem das Ergebnis jahrelanger Arbeit von Forschern und Entwicklern - da das Protokoll sehr technisch ist - aber jede motivierte Person kann sich daran beteiligen. Die Ideen beginnen in der Regel als Diskussionen in einem Forum wie [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) oder dem Eth R&D Discord Server. Dabei kann es sich um Reaktionen auf neu entdeckte Schwachstellen handeln, um Vorschläge von Organisationen, die auf der Anwendungsebene arbeiten (z. B. Dapps und Börsen), oder um bekannte Schwierigkeiten für Endnutzer (z. B. Kosten oder Transaktionsgeschwindigkeit). Wenn diese Ideen ausgereift sind, können sie als [Ethereum Improvement Proposals](https://eips.ethereum.org/) vorgeschlagen werden. Dies alles geschieht öffentlich, so dass sich jeder aus der Community jederzeit einbringen kann. +Die Roadmap ist vor allem das Ergebnis jahrelanger Arbeit von Forschern und Entwicklern - da das Protokoll sehr technisch ist - aber jede motivierte Person kann sich daran beteiligen. Ideen beginnen in der Regel als Diskussionen in einem Forum wie [ethresear.ch](https://ethresear.ch/), [Ethereum Magicians](https://ethereum-magicians.org/) oder dem Eth R&D-Discord-Server. Dabei kann es sich um Reaktionen auf neu entdeckte Schwachstellen handeln, um Vorschläge von Organisationen, die auf der Anwendungsebene arbeiten (z. B. Dapps und Börsen), oder um bekannte Schwierigkeiten für Endnutzer (z. B. Kosten oder Transaktionsgeschwindigkeit). Wenn diese Ideen ausgereift sind, können sie als [Ethereum Improvement Proposals](https://eips.ethereum.org/) vorgeschlagen werden. Dies alles geschieht öffentlich, so dass sich jeder aus der Community jederzeit einbringen kann. [Mehr über Ethereum-Governance](/governance/) @@ -114,4 +116,4 @@ Beim Sharding wird die Ethereum-Blockchain so aufgeteilt, dass Untergruppen von - [Secret leader election](/roadmap/secret-leader-election) - Durch geschickte Kryptographie kann sichergestellt werden, dass die Identität des aktuellen Blockantragstellers nicht bekannt gegeben wird, wodurch er vor bestimmten Arten von Angriffen geschützt ist. - [Account abstraction](/roadmap/account-abstraction)- Die Kontoabstraktion ist eine Klasse von Upgrades, die Smart-Contract-Wallets direkt auf Ethereum unterstützen, anstatt komplexe Middleware zu verwenden. - [Verkle trees](/roadmap/verkle-trees) - Verkle-Bäume sind eine Datenstruktur, die verwendet werden kann, um zustandslose Clients auf Ethereum zu ermöglichen. Diese "zustandslosen" Clients benötigen nur wenig Speicherplatz, sind aber dennoch in der Lage, neue Blöcke zu verifizieren. -- [Statelessness](/roadmap/statelessness) - zustandslose Clients können neue Blöcke verifizieren, ohne große Datenmengen speichern zu müssen. Dies bietet alle Vorteile des Betriebs einer Node mit nur einem kleinen Bruchteil der heutigen Kosten. +- [Statuslosigkeit](/roadmap/statelessness) – Statuslose Clients werden in der Lage sein, neue Blöcke zu überprüfen, ohne große Mengen an Daten speichern zu müssen. Dies bietet alle Vorteile des Betriebs einer Node mit nur einem kleinen Bruchteil der heutigen Kosten. diff --git a/public/content/translations/de/roadmap/merge/index.md b/public/content/translations/de/roadmap/merge/index.md index 334d178eae9..4a3e3794535 100644 --- a/public/content/translations/de/roadmap/merge/index.md +++ b/public/content/translations/de/roadmap/merge/index.md @@ -4,7 +4,6 @@ description: Erfahren Sie mehr über die Zusammenführung, als Mainnet Ethereum lang: de template: upgrade image: /upgrades/merge.png -alt: summaryPoint1: Ethereum Mainnet verwendet Proof-of-Stake, aber das war nicht immer der Fall. summaryPoint2: Der Wechsel vom ursprünglichen Proof-of-Work Mechanismus zu Proof-of-Stake wurde Zusammenführung genannt. summaryPoint3: Die Zusammenführung bezieht sich auf das ursprüngliche Ethereum Mainnet, welches mit einer separaten Proof-of-Stake-Blockchain namens Beacon Chain vereinigt wurde, und somit nun beide als eine Blockchain existieren. @@ -179,18 +178,18 @@ Dadurch wird ein Massenexodus der für Staking eingesetzten Mittel verhindert. D Der effektive Jahreszins ist auch bewusst dynamisch, damit ein Markt von Stakern abwägen kann, wie viel sie bereit sind, für die Sicherung des Netzwerks zu zahlen. Wenn die Rate zu niedrig ist, werden die Validatoren mit einer durch das Protokoll begrenzten Rate aussteigen. Nach und nach wird dadurch die APR für alle erhöht, die bleiben und wieder neue oder wiederkehrende Staker anziehen. -## Was ist mit "Eth2" passiert? {#eth2} +## Was ist mit „Eth2“ passiert? {#eth2} Der Begriff "Eth2" ist veraltet. Nach der Zusammenführung von "Eth1" und "Eth2" in eine einzelne Chain gibt es keinen Grund mehr zwischen zwei Ethereum Netzwerken zu unterscheiden. Es gibt nur Ethereum. Um Unklarheiten zu minimieren, hat die Community diese Begriffe aktualisiert: -- „Eth1“ ist nun der „Ausführungslayer“, der Transaktionen verarbeitet und ausführt. -- „Eth2“ ist nun der „Konsenslayer“, der den Proof-of-Stake-Konsens regelt. +- „Eth1“ ist nun die „Ausführungsebene“, die Transaktionen und Ausführungen verarbeitet. +- „Eth2“ ist nun die „Konsensebene“, die den Proof-of-Stake-Konsens regelt. -Diese aktualisierte Terminologie ändert lediglich die Benennungskonventionen. Die Ziele von Ethereum oder die Roadmap ändern sich dadurch nicht. +Diese aktualisierte Terminologie ändert lediglich die Benennungskonventionen. Die Ziele und der Fahrplan von Ethereum ändern sich dadurch nicht. -[Mehr erfahren über die „Eth2“-Umbenennung](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) +[Mehr über die „Eth2“-Umbenennung erfahren](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) ## Beziehung zwischen den Upgrades {#relationship-between-upgrades} diff --git a/public/content/translations/de/roadmap/merge/issuance/index.md b/public/content/translations/de/roadmap/merge/issuance/index.md index 01dd5dcfa82..cc2c4c36ba2 100644 --- a/public/content/translations/de/roadmap/merge/issuance/index.md +++ b/public/content/translations/de/roadmap/merge/issuance/index.md @@ -44,7 +44,7 @@ Gesamt ETH Angebot: **~120,520,000 ETH** (zum Zeitpunkt von The Merge im Septemb **Ausgabe in der Ausführungsschicht:** -- Wurde auf 2,08 ETH pro 13,3 Sekunden\* geschätzt: **~4,930,000** ETH wurden in einem Jahr ausgegeben +- Wurde auf 2,08 ETH pro 13,3 Sekunden* geschätzt: **~4,930,000** ETH wurden in einem Jahr ausgegeben - Führte zu einer Inflationsrate von **etwa 4.09%** (4,93 Mio. pro Jahr / 120,5 Mio. Gesamt) - \*Dies beinhaltet die 2 ETH pro kanonischem Block, plus durchschnittlich 0,08 ETH über die Zeit von Ommer-Blöcken. Es verwendet auch 13,3 Sekunden, die Zielzeit für den Baseline-Block ohne jeglichen Einfluss durch eine ["Difficulty Bomb"](/glossary/#difficulty-bomb). ([Siehe Quelle](https://bitinfocharts.com/ethereum/)) 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} 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 da54f9301a0..b988eafe741 100644 --- a/public/content/translations/de/roadmap/single-slot-finality/index.md +++ b/public/content/translations/de/roadmap/single-slot-finality/index.md @@ -37,7 +37,7 @@ Mit dem derzeitigen Aufbau des Mechanismus müssen, um die Zeit zur Endlichkeit Der derzeitige Konsensmechanismus verbindet Attestierungen mehrerer Validatoren, welche Komitees genannt werden, um die Anzahl an Nachrichten, die jeder Validator in einem Block verarbeiten muss, um jenen zu validieren, zu verringern. Jeder Validator hat in jeder Epoche (32 Plätze) die Möglichkeit zur Attestierung. In jedem Platz haben jedoch nur eine Untergruppe von Validatoren, bekannt als Komitee-Attestierung diese Möglichkeit. Das machen sie, indem sie in Unternetzwerke unterteilt werden, in denen wenige Validatoren als "Aggregatoren" ausgewählt werden. Diese Aggregatoren verbinden alle die Unterschriften, welche sie von anderen Validatoren bekommen in, in ihrem Netzwerk zu einer einzelnen aggregierten Unterschrift. Der Aggregator, welcher die größte Anzahl an einzelnen Teilnahmen beinhaltet, gibt dann die aggregierte Unterschrift an den Blockantragsteller (Block Proposer) weiter, welcher sie dann in seinem Block mit den aggregierten Unterschriften anderer Komitees einschließt. -Dieser Prozess gibt für jeden Validatoren ausreichende Kapazität, in jeder Epoche abzustimmen, da 32 Plätze _ 64 Komitees _ 256 Validator pro Komitee 524 288 Validatoren pro Epoche ergeben. Zum Zeitpunkt der Erstellung dieses Artikels (Februar 2023) gibt es ~513 000 aktive Validatoren. +Dieser Prozess gibt für jeden Validatoren ausreichende Kapazität, in jeder Epoche abzustimmen, da 32 Plätze * 64 Komitees * 256 Validator pro Komitee 524 288 Validatoren pro Epoche ergeben. Zum Zeitpunkt der Erstellung dieses Artikels (Februar 2023) gibt es ~513 000 aktive Validatoren. In diesem Schema ist es für jeden Validatoren möglich für einen Block abzustimmen, indem er seine Attestierungen über die gesamte Epoche verteilen. Jedoch gibt es potentielle Wege diesen Mechanismus zu verbessern, sodass _jeder Validator die Chance hat in jedem Platz zu attestieren_. @@ -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/de/roadmap/statelessness/index.md b/public/content/translations/de/roadmap/statelessness/index.md index 49b4454e2ca..4c751c46b65 100644 --- a/public/content/translations/de/roadmap/statelessness/index.md +++ b/public/content/translations/de/roadmap/statelessness/index.md @@ -66,7 +66,7 @@ Schwache Zustandslosigkeit beinhaltet Änderungen dazu, wie Ethereum Nodes Zusta **Bei der schwachen Zustandslosigkeit brauchen Blöcke Zugriff auf die vollen Zustandsdaten, jedoch benötigt das Verifizieren von Blöcken keine Zustandsdaten** -Damit dies passieren kann, müssten [Verkle Bäume](/roadmap/verkle-trees/) bereits in Ethereum Clients implementiert sein. Verkle-Bäume sind eine Datenersetzungsstruktur um Ethereums Zustandsdaten zu speichern. Sie erlauben kleine "Zeugen" fester Größe, die dazu da sind Daten zwischen Peers zu vermitteln und Blöcke direkt, anstatt gegen lokale Datenbanken zu verifizieren. [Proposer-Builder Separation](/roadmap/pbs/) wird zudem benötigt, da es Blockerzeugern erlaubt spezialisierte Nodes mit leistungsfähigerer Hardware zu sein und da sie es sind, die Zugriff auf die vollen Zustandsdaten brauchen. +Damit dies passieren kann, müssen [Verkle Trees](/roadmap/verkle-trees/) bereits in Ethereum Clients implementiert sein. Verkle-Bäume sind eine Datenersetzungsstruktur um Ethereums Zustandsdaten zu speichern. Sie erlauben kleine "Zeugen" fester Größe, die dazu da sind Daten zwischen Peers zu vermitteln und Blöcke direkt, anstatt gegen lokale Datenbanken zu verifizieren. [Proposer-Builder Separation](/roadmap/pbs/) wird zudem benötigt, da es Blockerzeugern erlaubt spezialisierte Nodes mit leistungsfähigerer Hardware zu sein und da sie es sind, die Zugriff auf die vollen Zustandsdaten brauchen. @@ -81,7 +81,7 @@ Schwache Zustandslosigkeit ist in einem fortgeschrittenem Forschungsstand, aber ### Starke Zustandslosigkeit {#strong-statelessness} -Starke Zustandslosigkeit entfernt jegliche Notwendigkeit für irgendeinen Node die Zustandsdaten zu speichern. Stattdessen werden Transaktionen mit Zeugen, welche von Blockerzeugern aggregiert werden können, versendet. Die Blockerzeuger sind dann verantwortlich, nur den für die Generierung von Zeugen für relevante Accounts gebrauchten Zustand zu speichern. Die Verantwortung für den Zustand ist fast komplett an den Nutzer verschoben, da diese Zeugen senden und 'Listen aufrufen' um zu erklären, mit welchen Account- und Speicherschlüsseln sie interagieren. +Starke Zustandslosigkeit entfernt jegliche Notwendigkeit für irgendeinen Node die Zustandsdaten zu speichern. Stattdessen werden Transaktionen mit Zeugen, welche von Blockerzeugern aggregiert werden können, versendet. Die Blockerzeuger sind dann verantwortlich, nur den für die Generierung von Zeugen für relevante Accounts gebrauchten Zustand zu speichern. Die Verantwortung für den Zustand ist fast komplett an den Nutzer verschoben, da diese Zeugen senden und 'Listen aufrufen' um zu erklären, mit welchen Account- und Speicherschlüsseln sie interagieren. Dies würde extrem leichte Nodes ermöglichen, aber es gibt auch Nachteile, einschließlich der Erschwerung von Transaktionen mit Smart Contracts. Starke Zustandslosigkeit wurde von Forschern untersucht, wird aber wahrscheinlich kein Teil der Ethereum Roadmap sein - es ist wahrscheinlicher, dass die schwache Zustandslosigkeit für Ethereums Skalierungsbedürfnisse ausreicht. diff --git a/public/content/translations/de/staking/pools/index.md b/public/content/translations/de/staking/pools/index.md index 3a14c6acf00..8cfcd9f10ba 100644 --- a/public/content/translations/de/staking/pools/index.md +++ b/public/content/translations/de/staking/pools/index.md @@ -26,7 +26,7 @@ Zusätzlich zu den Vorteilen, die wir in unserer [Einführung zum Staking](/stak - + @@ -53,14 +53,14 @@ Es gibt eine Vielzahl von Optionen, die Ihnen bei der Einrichtung helfen. Anhand -Hinweis: Es ist wichtig, einen Dienst zu wählen, der [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity/) ernst nimmt, da das die Sicherheit des Netzwerks verbessert und Ihr Risiko begrenzt. Dienste, die nachweislich die Nutzung von Mehrheits-Clients einschränken, sind gekennzeichnet mit "Vielfalt der Ausführungskunden" and "Vielfalt der Konsenskunden". +Hinweis: Es ist wichtig, einen Dienst zu wählen, der [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity/) ernst nimmt, da das die Sicherheit des Netzwerks verbessert und Ihr Risiko begrenzt. Dienste, die nachweislich die Nutzung von Mehrheits-Clients einschränken, sind gekennzeichnet mit "Vielfalt der Ausführungs-Clients" and "Vielfalt der Konsens-Clients". Haben Sie einen Vorschlag für einen Staking-Tool, der noch fehlt? Machen Sie sich mit unserer [Richtlinie zum Aufführen von Produkten](/contributing/adding-staking-products/) vertraut, um beurteilen zu können, ob Ihr Vorschlag geeignet ist. Senden Sie ihn uns dann zur Prüfung zu. ## Häufig gestellte Fragen {#faq} -Typischerweise werden ERC-20 Staking-Token an Staker ausgegeben, die den Wert ihrer eingesetzten ETH plus Belohnungen darstellen. Denken Sie daran, dass Staking-Belohnungen grundsätzlich etabliert sind, verschiedene Pools Staking-Belohnungen allerdings nach leicht unterschiedlichen Methoden an ihre Benutzer verteilen. +Typischerweise werden ERC-20-Staking-Token an die Staker ausgegeben und repräsentieren den Wert ihres eingesetzten ETH sowie Belohnungen. Denken Sie daran, dass Staking-Belohnungen grundsätzlich etabliert sind, verschiedene Pools Staking-Belohnungen allerdings nach leicht unterschiedlichen Methoden an ihre Benutzer verteilen. @@ -81,5 +81,6 @@ Einige Pooling-Optionen sind im Hinblick auf die Nodes, die sie unterstützen, s ## Weiterführende Informationen {#further-reading} +- [Das Ethereum-Staking-Verzeichnis](https://www.staking.directory/) - _Eridian und Spacesider_ - [Staking mit Rocket Pool – Staking-Übersicht](https://docs.rocketpool.net/guides/staking/overview.html) – _RocketPool-Dokumentation_ - [Staking von Ethereum mit Lido](https://help.lido.fi/en/collections/2947324-staking-ethereum-with-lido) - _Lido Hilfedokumente_ diff --git a/public/content/translations/de/staking/saas/index.md b/public/content/translations/de/staking/saas/index.md index 24c0a75e96b..3bc772cdcf9 100644 --- a/public/content/translations/de/staking/saas/index.md +++ b/public/content/translations/de/staking/saas/index.md @@ -47,7 +47,7 @@ Nachfolgend finden Sie einige verfügbare SaaS-Anbieter. Verwenden Sie die obige -Hinweis: Es ist wichtig, dass sie die [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity/) unterstützen, denn das erhöht die Netzsicherheit und begrenzt Ihre Risiken. Dienste, die nachweislich die Nutzung von Mehrheits-Clients einschränken, sind gekennzeichnet mit "Vielfalt der Ausführungskunden" and "Vielfalt der Konsenskunden". +Hinweis: Es ist wichtig, dass sie die [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity/) unterstützen, denn das erhöht die Netzsicherheit und begrenzt Ihre Risiken. Dienste, die nachweislich die Nutzung von Mehrheits-Clients einschränken, sind gekennzeichnet mit "Vielfalt der Ausführungs-Clients" and "Vielfalt der Konsens-Clients". ### Schlüssel-Generatoren @@ -91,4 +91,5 @@ Für weitere Informationen zu Garantien oder Versicherungsoptionen sowie zur Anl ## Weiterführende Informationen {#further-reading} +- [Das Ethereum-Staking-Verzeichnis](https://www.staking.directory/) - _Eridian und Spacesider_ - [Bewertung von Staking-Diensten](https://www.attestant.io/posts/evaluating-staking-services/) – _Jim McDonald 2020_ diff --git a/public/content/translations/de/staking/solo/index.md b/public/content/translations/de/staking/solo/index.md index 9cb0960f8f9..9d8d1d7906a 100644 --- a/public/content/translations/de/staking/solo/index.md +++ b/public/content/translations/de/staking/solo/index.md @@ -109,7 +109,7 @@ Es gibt eine Vielzahl von Optionen, die Ihnen bei der Einrichtung helfen. Verwen -Bitte beachten Sie, wie wichtig es ist, einen [Minderheits-Client](/developers/docs/nodes-and-clients/client-diversity/) zu wählen, da er die Sicherheit des Netzwerks verbessert und Ihr Risiko begrenzt. Tools, mit denen Sie einen Minderheit-Client einrichten können, werden als „Multi-Client" bezeichnet. +Bitte beachten Sie, wie wichtig es ist, einen [Minderheits-Client](/developers/docs/nodes-and-clients/client-diversity/) zu wählen, da er die Sicherheit des Netzwerks verbessert und Ihr Risiko begrenzt. Tools, mit denen Sie einen Minderheits-Client einrichten können, werden als „Multi-Client" bezeichnet. ### Schlüssel-Generatoren @@ -195,6 +195,7 @@ Um Ihr gesamtes Guthaben zu entsperren und zu erhalten, müssen Sie auch den Pro ## Weiterführende Informationen {#further-reading} +- [Das Ethereum-Staking-Verzeichnis](https://www.staking.directory/) - _Eridian und Spacesider_ - [Ethereums Client-Diversitätsproblem](https://hackernoon.com/Ethereums-Client-Diversitätsproblem) – _@emmanuelawosika 2022_ - [Client-Diversität fördern](https://www.attestant.io/Posts/Client-Diversität-fördern/) – _Jim McDonald 2022_ - [Client-Diversität auf der Konsensebene von Ethereum](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA) – _jmcook.eth 2022_ diff --git a/public/content/translations/de/staking/withdrawals/index.md b/public/content/translations/de/staking/withdrawals/index.md index 7c017a5be48..df9e0425e6c 100644 --- a/public/content/translations/de/staking/withdrawals/index.md +++ b/public/content/translations/de/staking/withdrawals/index.md @@ -114,12 +114,12 @@ Indem wir diese Berechnung erweitern, können wir die Zeit abschätzen, die ben | Anzahl der Auszahlungen | Zeit bis zum Abschluss | -| :---------------------: | :--------------------: | -| 400,000 | 3,5 Tage | -| 500,000 | 4,3 Tage | -| 600,000 | 5,2 Tage | -| 700,000 | 6,1 Tage | -| 800,000 | 7,0 Tage | +| :-------------------: | :--------------: | +| 400,000 | 3,5 Tage | +| 500,000 | 4,3 Tage | +| 600,000 | 5,2 Tage | +| 700,000 | 6,1 Tage | +| 800,000 | 7,0 Tage | @@ -194,7 +194,7 @@ eventCategory="FAQ" eventAction="I operate a validator. Where can I find more information on enabling withdrawals?" eventName="read more"> -Es wird empfohlen, dass Validatoren die Seite Staking Launchpad Withdrawals besuchen, auf der Sie weitere Details dazu finden, wie Sie Ihren Validator auf Auszahlungen vorbereiten können. Vorbereitung, Zeitpunkt der Ereignisse und weitere Details darüber, wie Auszahlungen funktionieren. +Validator-Betreibern wird empfohlen, die Seite Startplattform für Staking-Auszahlungen zu besuchen. Dort können sie mehr Details darüber erfahren, wie Sie Ihren Validator auf Auszahlungen vorbereiten, sowie Informationen zum Zeitpunkt der Ereignisse und zur Funktionsweise von Auszahlungen erhalten. Um Ihre Einrichtung zunächst auf einem Testnetz auszuprobieren, können Sie mit dem Goerli Testnet Staking Launchpad beginnen. @@ -214,5 +214,5 @@ Nein. Sobald ein Validator ausgetreten ist und sein gesamtes Guthaben abgehoben - [EIP-4895: Beacon-Kette implementiert Abhebungen als Operationen](https://eips.ethereum.org/EIPS/eip-4895) - [Ethereum Cat Herders - Shanghai](https://www.ethereumcatherders.com/shanghai_upgrade/index.html) - [PEEPanEIP #94: Auszahlung von gestaktem ETH (Testing) mit Potuz & Hsiao-Wei Wang](https://www.youtube.com/watch?v=G8UstwmGtyE) -- [PEEPanEIP#68: EIP-4895: Beacon-Kette implementiert Abhebungen als Operationen mit Alex Stokes](https://www.youtube.com/watch?v=CcL9RJBljUs) +- [PEEPanEIP#68: EIP-4895: Auszahlungen per Beacon Chain Push als Operationen mit Alex Stokes](https://www.youtube.com/watch?v=CcL9RJBljUs) - [Verständnis der effektiven Bilanz des Validators](https://www.attestant.io/posts/understanding-validator-effective-balance/) 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/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/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/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/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/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/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/es/contributing/design/index.md b/public/content/translations/es/contributing/design/index.md index 59d7c1c9ce9..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/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/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/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/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/docs/standards/tokens/erc-4626/index.md b/public/content/translations/es/developers/docs/standards/tokens/erc-4626/index.md index 962127d559b..af2754e8cf2 100644 --- a/public/content/translations/es/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/translations/es/developers/docs/standards/tokens/erc-4626/index.md @@ -204,4 +204,4 @@ Donde `sender` es el usuario que desencadenó el retiro e intercambió `shares`, ## Más información {#further-reading} - [EIP-4626: estándar de bóveda tokenizada](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626: repositorio de GitHub](https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol) +- [ERC-4626: repositorio de GitHub](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) 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..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 @@ -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": [...] } @@ -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. +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. -![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..07511ef0c15 --- /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/5.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/fr/developers/tutorials/send-token-etherjs/index.md b/public/content/translations/es/developers/tutorials/send-token-ethersjs/index.md similarity index 59% rename from public/content/translations/fr/developers/tutorials/send-token-etherjs/index.md rename to public/content/translations/es/developers/tutorials/send-token-ethersjs/index.md index 8352a365b03..cd4dd34a040 100644 --- a/public/content/translations/fr/developers/tutorials/send-token-etherjs/index.md +++ b/public/content/translations/es/developers/tutorials/send-token-ethersjs/index.md @@ -1,35 +1,35 @@ --- -title: Envoyer des jetons avec ethers.js -description: Guide à l'intention des débutants sur l'envoi de jetons à l'aide d'ether.js. +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" - - "JETONS" + - "TOKENS" skill: beginner -lang: fr +lang: es published: 2021-04-06 --- -## Envoyer un jeton avec ethers.js (5.0) {#send-token} +## Enviar token usando ethers.js(5.0) {#send-token} -### Dans ce tutoriel, vous allez apprendre à {#you-learn-about} +### En este tutorial aprenderá: {#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 +- 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 -### Pour commencer {#to-get-started} +### Para comenzar {#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) +Para comenzar, primero debemos importar la biblioteca de ethers.js en nuestro javascript Incluya ethers.js(5.0) -### Installation {#install-ethersjs} +### Instalación {#install-ethersjs} ```shell /home/ricmoo> npm install --save ethers ``` -ES6 dans le navigateur : +ES6 en el navegador ```html ``` -ES3 (UMD) dans le navigateur : +ES3(UMD) en el navegador ```html ``` -### Paramètres {#param} +### Parámetros {#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 +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 -## Remarque {#notice} +## Aviso {#notice} -`signTransaction(tx)` est retiré car `sendTransaction()` le fait en interne. +`signTransaction(tx)` se eliminó porque `sendTransaction()` lo hace internamente. -## Procédure d'envoi {#procedure} +## Procedimientos de envío {#procedure} -### 1. Se connecter au réseau (testnet) {#connect-to-network} +### 1. Conectarse a la red de prueba (testnet) {#connect-to-network} -#### Définir le fournisseur (Infura) {#set-provider} +#### Establecer el proveedor (Infura) {#set-provider} -Se connecter au réseau de test Ropsten +Conectarse a la red de prueba Ropsten ```javascript window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") ``` -### 2. Créer un portefeuille {#create-wallet} +### 2. Crear una billetera {#create-wallet} ```javascript let wallet = new ethers.Wallet(private_key) ``` -### 3. Connecter le portefeuille au réseau {#connect-wallet-to-net} +### 3. Conectar la billetera a la red {#connect-wallet-to-net} ```javascript let walletSigner = wallet.connect(window.ethersProvider) ``` -### 4. Obtenir le prix actuel du gaz {#get-gas} +### 4. Obtener el precio actual de gas {#get-gas} ```javascript window.ethersProvider.getGasPrice() // gasPrice ``` -### 5. Définir la transaction {#define-transaction} +### 5. Definir la transacción {#define-transaction} -Les variables définies ci-dessous sont dépendantes de `send_token()` +Estas variables definidas a continuación dependen del `send_token()` -### Paramètres de la transaction {#transaction-params} +### Parámetros de transacción {#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 +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 -[Voir ci-dessous pour savoir comment les utiliser](#how-to-use) +[Vea a continuación cómo usar](#how-to-use) ```javascript const tx = { @@ -114,7 +114,7 @@ const tx = { } ``` -### 6. Transférer {#transfer} +### 6. Transferir {#transfer} ```javascript walletSigner.sendTransaction(tx).then((transaction) => { @@ -123,7 +123,7 @@ walletSigner.sendTransaction(tx).then((transaction) => { }) ``` -## Comment l’utiliser  {#how-to-use} +## Cómo utilizarlo {#how-to-use} ```javascript let private_key = @@ -146,9 +146,9 @@ send_token( ) ``` -### Réussi ! {#success} +### ¡Éxito! {#success} -![image de la transaction effectuée avec succès](./successful-transaction.png) +![imagen de transacción realizada con éxito](./successful-transaction.png) ## send_token() {#send-token-method} 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..e02dbacd6dd --- /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/waffle-test-simple-smart-contract//) 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..b503f867578 --- /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-say-hello-world-with-hardhat-and-ethers//) 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/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/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/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/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/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/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/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/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/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/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/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/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/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/fr/community/get-involved/index.md b/public/content/translations/fr/community/get-involved/index.md index e55e1e06f64..66dd715d425 100644 --- a/public/content/translations/fr/community/get-involved/index.md +++ b/public/content/translations/fr/community/get-involved/index.md @@ -135,4 +135,4 @@ Les « DAO » sont des organisations autonomes décentralisées. Ces groupes t - [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/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/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/fr/contributing/design/index.md b/public/content/translations/fr/contributing/design/index.md index bd19a4231e6..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/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/deprecated-software/index.md b/public/content/translations/fr/deprecated-software/index.md deleted file mode 100644 index 89a987b180a..00000000000 --- a/public/content/translations/fr/deprecated-software/index.md +++ /dev/null @@ -1,482 +0,0 @@ ---- -title: Logiciels obsolètes -description: Logiciel qui a été rendu obsolète par ses mainteneurs -lang: fr -sidebarDepth: 2 ---- - -# Logiciels obsolètes {#summary-deprecated-software} - -Il s'agit d'une liste des principaux projets et ressources liés à Ethereum qui ont été abandonnés ou qui ne sont plus actualisés. Il est important de mettre en évidence les outils obsolètes afin que les utilisateurs puissent trouver des alternatives viables et pour éviter que des versions malveillantes ne soient distribuées. - -Elle est supervisée par notre communauté. S'il y a quelque chose manquant ou incorrect, veuillez modifier cette page! - -## Preuve de travail {#pow} - -[Proof of work](/developers/docs/consensus-mechanisms/pow) est un moteur de consensus qui était implémenté sur Ethereum jusqu'en septembre 2022. Il a été abandonné lorsque Ethereum est passé à un mécanisme de consensus basé sur la [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos) (proof-of-stake). Cela a été réalisé en dépréciant les parties du logiciel client liées au minage en preuve de travail, y compris [Ethhash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethhash) (l'algorithme de minage) et toute la logique de consensus et la fonctionnalité de diffusion de blocs qui étaient initialement intégrées dans les clients d'exécution. Les clients eux-mêmes n'ont pas été supprimés, mais plusieurs de leurs composants essentiels l'ont été. Le concept de preuve de travail a été abandonné en raison de l'effet total de la suppression des composants associés du logiciel client. - -## Logiciel {#software} - -Cette section concerne les logiciels de bureau, en ligne de commande ou de serveur qui ont été dépréciés. Les principaux types sont les portefeuilles, les environnements de développement intégrés, les langages et les clients Ethereum. Veillez à ne pas installer de logiciels obsolètes à moins d'être certain qu'ils proviennent de la source d'origine, par exemple d'un dépôt hébergé sur https://github.com/ethereum. - -### OpenEthereum {#open-ethereum} - -

- -

- -Rendu obsolète en juillet 2021 - -**Résumé** - -OpenEthereum était la deuxième implémentation d'Ethereum en termes de nombre de nœuds. OpenEthereum a joué un rôle important en étant un élément clé de l'infrastructure pour certains des plus importants utilisateurs d'Ethereum comme Etherscan et Gnosis Safe. Ses capacités de traçage le distinguent des autres clients, garantissant une synchronisation fiable et rapide pour les fournisseurs de données. - -**Archives** - -[Repo GitHub archivé](https://github.com/openethereum/openethereum) - -**Historique** - -OpenEthereum a été conçu pour les mineurs, les fournisseurs de services et les échanges qui ont besoin d'une synchronisation rapide et d'une disponibilité maximale. OpenEthereum a fourni l'infrastructure de base indispensable à la rapidité et à la fiabilité des services. - -**Alternatives** - -[Comparer toutes les options de clients d'exécution Ethereum](/developers/docs/nodes-and-clients/#execution-clients). - -### Grid {#grid} - -

- -

- -Rendu obsolète le 10 décembre 2020 - -**Résumé** - -Grid était une application de bureau basée sur JavaScript qui vous permettait d'accéder en toute sécurité à Ethereum, IPFS et à d'autres réseaux décentralisés. Il proposait une interface conviviale pour aider un public moins technique à interagir en toute sécurité avec les dapps, améliorant ainsi l'accessibilité pour tous. - -**Archives** - -[Repo GitHub archivé](https://github.com/ethereum/grid) - -**Historique** - -Grid pourrait être considéré comme le successeur de Mist, également une application de bureau autonome, basée sur JavaScript, qui comprenait un nœud Geth. Grid a supprimé l'aspect portefeuille et a ajouté une approche de type plugin pour exécuter différents types de nœuds. - -**Alternatives** - -[DAppNode](https://dappnode.io/) est une plateforme de déploiement et d'hébergement de dApps, de clients P2P et de nœuds blockchain. - -### Ethereum Studio {#ethereum-studio} - -

- -

- -Rendu obsolète le 7 décembre 2020 - -**Résumé** - -Ethereum Studio était un IDE en ligne qui permettait aux utilisateurs de créer et de tester des contrats intelligents, ainsi que de construire des interfaces pour eux. - -**Archives** - -[Repo GitHub archivé](https://github.com/SuperblocksHQ/ethereum-studio) - -**Historique** - -Ethereum Studio a été développé pour fournir aux utilisateurs un IDE doté d'une blockchain Ethereum intégrée et d'un compilateur Solidity. De plus, il offrait la possibilité de modifier en direct le code et d'exporter des dApps complets sans avoir besoin d'un terminal. - -**Alternatives** - -[Remix](https://remix.ethereum.org/) est un IDE web alternatif pour le développement Solidity. Le [portail développeur](/developers/) propose des outils pour le développement web et local, la documentation et bien plus encore. - -### Portefeuille Dapp Meteor {#meteor-dapp-wallet} - -

- -

- -Rendu obsolète le 27 mars 2019 - -**Résumé** - -Le portefeuille Meteor Dapp était un composant de Mist, un portefeuille Ethereum pour gérer les comptes Ethereum et interagir avec des contrats intelligents. Pendant de nombreuses années, l'interface web du Meteor Dapp Wallet était hébergée en tant que sous-domaine « wallet.ethereum.org ». - -Le contrat multisignataire Mist (code solidity) était également inclus, et Meteor Dapp Wallet présentait une interface utilisateur pour le configurer et le déployer. - -**Non obsolète : Mist Multisigs déployés** - -Le multi-signataire Mist -- déployé sous forme de bytecode sur le réseau principal d'Ethereum par des milliers d'utilisateurs -- continue d'être utilisé pour stocker et gérer de la valeur sans incident. [Comment interagir avec un contrat multisignataire Mist](https://support.mycrypto.com/how-to/sending/how-to-interact-with-a-multisig-contract) offre une bonne vue d'ensemble de la manière d'utiliser ces contrats intelligents. - -**Archives** - -[Repo GitHub archivé](https://github.com/ethereum/meteor-dapp-wallet) - -**Historique** - -Voir Mist ci-dessous. - -**Alternatives** - -Voir la page [Portefeuilles Ethereum](/wallets/) sur ethereum.org. - -### Mist {#mist} - -

- -

- -Rendu obsolète le 27 mars 2019 - -**Résumé** - -Mist était un navigateur spécialisé construit grâce à Electron qui permettait aux utilisateurs de gérer des comptes Ethereum et d'interagir avec des dApps hébergées sur le web conventionnel. - -**Archives** - -[Repo GitHub archivé](https://github.com/ethereum/mist) - -**Historique** - -Mist a été une première expérience importante qui a permis d'explorer la manière de gérer les clés Ethereum, d'initier les utilisateurs aux outils financiers, tels que les multisigs, et de démontrer le fonctionnement du Web3. Des innovations ont également été révélées aux utilisateurs, comme les blockies, des graphiques mignons et mémorables de style 8 bits représentant les clés Ethereum. - -**Alternatives** - -[MetaMask](https://metamask.io/) est un portefeuille intégré au navigateur qui vous permet de gérer des clés Ethereum et d'interagir avec des DApps. Il est disponible en tant qu'extension pour Google Chrome et Firefox, et est inclus dans [Brave Browser](https://brave.com/). - -### Mix {#mix} - -Rendu obsolète le 11 août 2016 - -**Résumé** - -Mix était un IDE développé en C++ qui permettait aux développeurs de construire et de déployer des contrats intelligents sur Ethereum. - -**Archives** - -[Repo GitHub archivé](https://github.com/ethereum/mix) - -**Historique** - -Mix était une des premières applications en lien avec Ethereum. Voir la [présentation de Gavin Wood à Devcon0](https://www.youtube.com/watch?v=hcP_z_wBlaM). - -**Alternatives** - -[Remix](https://remix.ethereum.org/) est un IDE hébergé dans un navigateur pour le développement, le test et le déploiement de contrats Solidity / intelligents. Il dispose également d'une option de bureau. - -### Minimal {#minimal} - -Rendu obsolète en 2020. - -**Résumé** - -Minimal était une implémentation modulaire de la blockchain Ethereum écrite en Go. - -**Archives** - -[Repo GitHub archivé](https://github.com/umbracle/minimal) - -**Historique** - -Minimal a été remplacé par [polgon-sdk](https://github.com/0xPolygon/polygon-edge) - -### Hyperledger Burrow {#hyperledger-burrow} - -Rendu obsolète en 2022. - -**Résumé** - -Hyperledger Burrow était un nœud de blockchain de contrat intelligent Ethereum avec autorisation. Il exécutait le code de contrat intelligent Ethereum EVM et WASM sur des machines virtuelles autorisées. - -**Archives** - -[Repo GitHub archivé](https://github.com/hyperledger/burrow) - -### Mana-Ethereum {#mana-ethereum} - -**Résumé** - -Mana-Ethereum était un client Ethereum construit avec Elixir. - -**Archives** - -[Repo GitHub archivé](https://github.com/mana-ethereum/mana) - -**Historique** - -Le dépôt GitHub de Mana-Ethereum n'a pas été explicitement archivé, mais le dernier engagement date de 2019. - -### Aleth (cpp-ethereum) {#aleth} - -Rendu obsolète le 6 octobre 2021 - -**Résumé** - -Aleth (anciennement connu sous le nom de cpp-ethereum) était un client Ethereum écrit en C++. - -**Archives** - -[Repo GitHub archivé](https://github.com/ethereum/aleth) - -**Historique** - -Aleth était le troisième client le plus populaire pour Ethereum avant d'être rendu obsolète le 6 octobre 2021. - -**Alternatives** - -[Geth](https://geth.ethereum.org/) est un client Ethereum alternatif bien connu. - -### Ethereum-H {#ethereum-h} - -**Archives** - -Les archives d'Ethereum-H ont été retirées de GitHub. - -**Historique** - -Ethereum-H était un client Ethereum écrit en Haskell. Il a été rendu obsolète aux alentours de 2015. - -**Alternatives** - -[Geth](https://geth.ethereum.org/), [Nethermind](http://nethermind.io/), [Besu](https://besu.hyperledger.org/en/stable/) et [Erigon](https://github.com/ledgerwatch/erigon) sont des clients Ethereum alternatifs viables - il n'y a actuellement aucun client Haskell. - -### ruby-ethereum {#ruby-ethereum} - -**Archives** - -[repo GitHub de ruby-ethereum](https://github.com/cryptape/ruby-ethereum) - -**Historique** - -ruby-ethereum était un client Ethereum écrit en Ruby. Il a été rendu obsolète aux alentours de 2018. - -**Alternatives** - -[Geth](https://geth.ethereum.org/), [Nethermind](http://nethermind.io/), [Besu](https://besu.hyperledger.org/en/stable/) et [Erigon](https://github.com/ledgerwatch/erigon) sont des clients Ethereum alternatifs viables. Il n'y a actuellement aucun client Ruby. - -### Parity {#parity} - -

- -

- -Rendu obsolète le 2 juin 2020 - -**Résumé** - -Parity était un client Ethereum écrit en Rust. - -**Archives** - -[Repo GitHub archivé](https://github.com/openethereum/parity-ethereum) - -**Historique** - -En tant que l'un des deux principaux clients viables dans les premières années d'Ethereum (l'autre étant Geth), Parity était une partie cruciale de l'écosystème. Lors des attaques de Shanghai en 2016, Parity a permis au réseau Ethereum de continuer à fonctionner lorsque des clients comme Geth ont été détruits par l'attaque, prouvant ainsi l'importance de la diversité des clients. - -**Alternatives** - -[Erigon](https://github.com/ledgerwatch/erigon) (auparavant appelé Turbo-Geth) est un client Ethereum de nouvelle génération à la pointe de l'efficacité, écrit en Go. - -**Note :** _Le projet successeur du client Ethereum Parity était [OpenEthereum](https://github.com/openethereum/openethereum) **qui a depuis été rendu obsolète.**_ - -La ressource ["Lancez votre propre nœud Ethereum"](/developers/docs/nodes-and-clients/run-a-node/#getting-the-client) sur ethereum.org comprend une section pour télécharger, installer et exécuter un client Ethereum. - -### Trinity {#trinity} - -

- -

- -Rendu obsolète le premier juillet 2021 - -**Résumé** - -Trinity était un client Ethereum Python qui a servi d'outil de recherche éducatif pour la communauté. Un grand nombre de modules basés en Python en rapport avec Trinity continuent à être maintenus par la même équipe, comme [Py-EVM](https://github.com/ethereum/py-evm). - -**Archives** - -[Repo GitHub archivé](https://github.com/ethereum/trinity) - -**Historique** - -Trinity était le projet successeur de [pyethereum](https://github.com/ethereum/pyethereum/tree/b704a5c6577863edc539a1ec3d2620a443b950fb), un client Ethereum basé sur python des débuts. - -**Alternatives** - -La ressource ["Lancez votre propre nœud Ethereum"](/developers/docs/nodes-and-clients/run-a-node/#getting-the-client) sur ethereum.org comprend une section pour télécharger, installer et exécuter un client Ethereum. - -Le projet [EthereumJS](https://github.com/ethereumjs) a un cas d'utilisation de recherche et éducatif similaire à celui de Trinity. - -## DApps et Services {#dapps-and-services} - -Cette section est destinée aux services déployés sur le réseau principal Ethereum et d'autres réseaux basés sur EVM. Soyez conscient que les DApps et les services ici peuvent inclure des applications DeFi qui ont été piratées ou qui peuvent présenter des vulnérabilités de sécurité en raison du manque de maintenance, des changements dans le protocole, etc. - -### Cover Protocol {#cover-protocol} - -

- -

- -Fermé à l'automne 2021 - -**Résumé** - -Cover était un protocole d'assurance DeFi fonctionnant sur Ethereum et d'autres réseaux basés sur EVM. - -**Archives** - -[Site Web](https://wayback.archive-it.org/17679/20211004074635/https://www.coverprotocol.com/) - -[Articles Medium](https://wayback.archive-it.org/17679/20211004074633/https://coverprotocol.medium.com/) - -[Répertoire GitHub](https://github.com/CoverProtocol/cover-core-v1) - -[Documentation](https://wayback.archive-it.org/17679/20211004074634/https://docs.coverprotocol.com/) - -### La DAO {#the-dao} - -Piraté et fermé à l'été 2016 - -**Résumé** - -The DAO était un contrat intelligent, une DApp, et un forum pour organiser le financement de projets. Une vulnérabilité a été exploitée et une grande partie de l'ETH a été vidée, conduisant à un hard fork organisé par la communauté afin de restituer l'ETH à ceux qui avaient déposé dans The DAO. L'interface utilisateur et le forum sont arrêtés. - -**Archives** - -[Archive Internet de « daohub.org » le 14 mai 2016](https://web.archive.org/web/20160514105232/https://daohub.org/) - -**Historique** - -Bien que The DAO ait échoué, le concept a perduré. Le modèle technique, social et de gouvernance innovant pour The DAO est largement utilisé dans les communautés DeFi, NFT et de financement de projets. - -[« DAO Fork » sur ethereum.org](/history/#dao-fork) - -[Entrée Wikipedia pour « The DAO »]() - -**Alternatives** - -[« DAOs » sur ethereum.org](/dao/) - -[MolochDAO](https://www.molochdao.com/) - -[Gitcoin Grants](https://gitcoin.co/grants/) - -### SparkPool {#sparkpool} - -

- -

- -Fermé à l'automne 2021 - -**Résumé** - -Basé à Hangzhou, le service et la communauté SparkPool constituaient l'un des plus grands pools de minage centrés sur Ethereum au monde. - -**Archives** - -**Historique** - -Associé à la communauté EthFans, le service a été lancé en 2015. SparkPool a été dissous à l'automne 2021 à la suite de régulations légales plus strictes. - -**Alternatives** - -[Ethermine](https://ethermine.org/) - -## Documentation et Sources d'Informations {#documentation-and-information-sources} - -Il y a de nombreuses sources de documentations, des articles, des tutoriels et des forums qui sont maintenant supprimés ou vivants mais plus maintenus. Nous en avons sélectionné quelques-uns qui sont significatifs ou dont le statut actuel en tant que déprécié peut conduire à la confusion ou aux tentatives d'escroquerie. - -### Ancien Wiki et eth.wiki {#eth-wiki} - -**Résumé** - -Legacy Wiki et eth.wiki étaient des wikis entretenus par la Fondation Ethereum pour la communauté élargie. Ils étaient principalement orientés vers l'hébergement de descriptions détaillées des aspects clés de la plateforme Ethereum et des résumés des feuilles de route techniques. - -**Archives** - -[Repo GitHub archivé pour eth.wiki](https://github.com/ethereum/eth-wiki) - -[Repo GitHub archivé pour Legacy Wiki](https://github.com/ethereum/wiki/wiki) - -**Historique** - -Legacy Wiki était un wiki GitHub et un tout premier lieu de contenu technique (incluant le livre blanc original d'Ethereum). Avec le temps, les développeurs d'Ethereum ont transféré leur documentation, leurs spécifications et leur travail de description technique vers d'autres plateformes comme [Read the Docs](https://readthedocs.org/) et le contenu hébergé sur GitHub. - -En 2019 et 2020, eth.wiki est devenu le successeur de Legacy Wiki, mais une communauté durable de contributeurs n'a pas vu le jour. - -**Alternatives** - -Contenu dirigé par la communauté : [Site web Ethereum.org](/) - -Les projets logiciels Ethereum hébergent souvent leur documentation sur [Read the Docs](https://readthedocs.org/) - -Spécifications techniques hébergées sur GitHub : [EIPs](https://github.com/ethereum/EIPs), [Spécifications d'Exécution](https://github.com/ethereum/execution-specs), [Spécifications de Consensus](https://github.com/ethereum/consensus-specs) - -### forum.ethereum.org {#forum-ethereum-org} - -**Résumé** - -Le Forum Communautaire Ethereum était un forum de discussion entretenu par la Fondation Ethereum et hébergé sur Vanilla Forums. Il utilisait le sous-domaine « forum.ethereum.org ». - -**Archives** - -URL d'archive : [https://wayback.archive-it.org/16516/20210618210825/https://forum.ethereum.org/](https://wayback.archive-it.org/16516/20210618210825/https://forum.ethereum.org/) - -**Historique** - -Ce forum était un forum de discussion « officiel » et précoce pour la communauté Ethereum. Avec [/r/ethereum](https://reddit.com/r/ethereum) et quelques chaînes Skype, c'était un point de coordination important pour les développeurs, designers et organisateurs. Au fil des ans, les participants du Forum se sont dispersés et il est devenu davantage un lieu pour la communauté de minage. - -**Alternatives** - -[/r/ethereum](https://reddit.com/r/ethereum), et un grand nombre de forums DAO et de serveurs Discord. - -## Canaux Gitter {#gitter-channels} - -### AllCoreDevs {#allcorewdevs-gitter} - -**Résumé** - -AllCoreDevs Gitter était le principal canal de communication public pour la coordination des [développeurs principaux des clients Ethereum](https://github.com/ethereum/pm/). - -**Archives** - -[le canal Gitter ethereum/AllCoreDevs](https://gitter.im/ethereum/AllCoreDevs) - -**Alternatives** - -Veuillez utiliser le canal « allcoredevs » sur le [EthR&D Serveur Discord EthR&D](https://discord.gg/qHv7AjTDuK) - -### EthereumJS {#ethereumjs-gitter} - -**Résumé** - -EthereumJS Gitter était le principal canal de communication publique pour la coordination du [projet EthereumJS](https://ethereumjs.github.io/). - -**Archives** - -[le canal Gitter ethereum/EthereumJS](https://gitter.im/ethereum/ethereumjs) - -**Alternatives** - -Veuillez utiliser le [Serveur Discord EthereumJS](https://discord.gg/TNwARpR) 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/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/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/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/docs/standards/tokens/erc-4626/index.md b/public/content/translations/fr/developers/docs/standards/tokens/erc-4626/index.md index 07129f04a2d..20d6b4feb96 100644 --- a/public/content/translations/fr/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/translations/fr/developers/docs/standards/tokens/erc-4626/index.md @@ -204,4 +204,4 @@ Où `sender` est l'utilisateur qui a déclenché le retrait et échangé `shares ## Complément d'information {#further-reading} - [EIP-4626 : Standard de coffre-fort tokenisé](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626 : Répertoire GitHub](https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol) +- [ERC-4626 : Répertoire GitHub](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) diff --git a/public/content/translations/fr/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/fr/developers/tutorials/erc20-with-safety-rails/index.md index e16a55fd4bb..fee27446296 100644 --- a/public/content/translations/fr/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/fr/developers/tutorials/erc20-with-safety-rails/index.md @@ -24,7 +24,7 @@ Si vous souhaitez consulter le code source complet : ## Création d'un contrat ERC-20 {#creating-an-erc-20-contract} -Avant de pouvoir ajouter la fonctionnalité de sécurité, nous avons besoin d'un contrat ERC-20. Dans cet article, nous utiliserons [l'assistant de contrats OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/wizard). Ouvrez-le dans un autre navigateur et suivez ces instructions : +Avant de pouvoir ajouter la fonctionnalité de sécurité, nous avons besoin d'un contrat ERC-20. Dans cet article, nous utiliserons [l'assistant de contrats OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/wizard). Ouvrez-le dans un autre navigateur et suivez ces instructions : 1. Sélectionnez **ERC20**. 2. Entrez ces paramètres : 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/uniswap-v2-annotated-code/index.md b/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md index 76ef87e5f32..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 @@ -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 } @@ -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'); @@ -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/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/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/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..599357519ef 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 :
  • EIP-145Optimise le coût de certaines actions en chaîne.
  • EIP-1014vous permet d'interagir avec des adresses qui n'ont pas encore été créées.
  • EIP-1052optimise le coût de certaines actions en chaîne.
  • -
  • EIP-1234s'assure que la blockchain ne gèle pas 'avant la preuve d'enjeu.
  • +
  • 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.
  • 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/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/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
    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/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/hi/roadmap/merge/index.md b/public/content/translations/hi/roadmap/merge/index.md index 725361016e7..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} @@ -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 मेननेट को एक सुरक्षित विकेंद्रीत सेटमलमेंट परत के रूप में सक्षम करते हुए रोलअप डेटा स्टोरेज के लिए अनुकूलित किया गया है, ताकि रोलअप लेनदेन को तेज़ी से किफ़ायती बनाया जा सके। इसे समझने के लिए हिस्सेदारी के सबूत में ट्रांज़िशन की महत्वपूर्ण भूमिका होती है। [गैस और फीस के बारे में और जानकारी।](/developers/docs/gas/) 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/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/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/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/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..8573bc7ccee --- /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/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/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/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/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/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/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/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/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/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/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/decentralized-identity/index.md b/public/content/translations/id/decentralized-identity/index.md index f74fbd257db..3b451cc89bc 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](https://walt.id/white-paper/digital-identity) — _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/developers/docs/apis/javascript/index.md b/public/content/translations/id/developers/docs/apis/javascript/index.md index cbf960f4b40..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/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/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/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/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/id/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/id/developers/tutorials/uniswap-v2-annotated-code/index.md index 9bdb7c2d11c..35059ed062b 100644 --- a/public/content/translations/id/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/id/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -743,7 +743,7 @@ Ini adalah fungsi utama dari pabrik, untuk membuat bursa pasangan di antara dua (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); ``` -Kita menginginkan alamat dari bursa baru yang bersifat deterministik, sehingga dapat dihitung sebelum di luar rantai (dapat bermanfaat untuk [transaksi lapisan ke-2](/developers/docs/layer-2-scaling/)). Untuk melakukan hal tersebut, kita perlu memiliki urutan alamat token yang konsisten, terlepas dari urutan di mana kita menerimanya, sehingga kita memilahnya di sini. +Kita menginginkan alamat dari bursa baru yang bersifat deterministik, sehingga dapat dihitung sebelum di luar rantai (dapat bermanfaat untuk [transaksi lapisan ke-2](/developers/docs/scaling/)). Untuk melakukan hal tersebut, kita perlu memiliki urutan alamat token yang konsisten, terlepas dari urutan di mana kita menerimanya, sehingga kita memilahnya di sini. ```solidity require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); 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..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/testing-smart-contract-with-waffle/) +- [Menguji kontrak pintar dengan Waffle](/developers/tutorials/waffle-test-simple-smart-contract/) diff --git a/public/content/translations/id/enterprise/index.md b/public/content/translations/id/enterprise/index.md index 5b0060ce92c..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). 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. 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/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/id/roadmap/index.md b/public/content/translations/id/roadmap/index.md index 91b0879f1dd..1d426ea829b 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: @@ -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/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/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/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/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/it/contributing/design/index.md b/public/content/translations/it/contributing/design/index.md index 0706c6b385b..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/it/deprecated-software/index.md b/public/content/translations/it/deprecated-software/index.md deleted file mode 100644 index 32924949333..00000000000 --- a/public/content/translations/it/deprecated-software/index.md +++ /dev/null @@ -1,428 +0,0 @@ ---- -title: Software obsoleto -description: Software che è stato abbandonato dai suoi manutentori -lang: it -sidebarDepth: 2 ---- - -# Software obsoleto {#summary-deprecated-software} - -Questo è un elenco dei progetti e delle risorse chiave relativi ad Ethereum che sono diventati obsoleti o che non sono più mantenuti. È importante mettere in evidenza il lavoro obsoleto così che gli utenti possano trovare alternative valide e per evitare che vengano distribuite versioni malevoli. - -Questo elenco è curato dalla nostra comunità. Se c'è qualcosa di mancante o incorretto, si prega di modificare la pagina! - -## Proof of Work {#pow} - -[Proof of work ](/developers/docs/consensus-mechanisms/pow) è il motore di consenso che è stato implementato in Ethereum fino a settembre 2022. È diventato obsoleto quando Ethereum è passato al meccanismo di consenso basato su [proof-of-stake](/developers/docs/consensus-mechanisms/pos). Questo è stato raggiunto abbandonando le parti del software del client relative al mining in proof-of-work, incluso [Ethhash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethhash) (l'algoritmo di mining) e tutta la logica di consenso e la funzionalità di gossip del blocco che era stata originariamente integrata nei client di esecuzione. I client stessi non sono diventati obsoleti ma lo sono molti dei loro componenti principali. Il concetto di proof-of-work è stato abbandonato come effetto globale della rimozione delle relative componenti del software del client. - -## Software {#software} - -Questa sezione è dedicata ai software per desktop, per riga di comando o per server che sono diventati obsoleti. I tipi principali sono portafogli, ambienti di sviluppo integrati, linguaggi e client Ethereum. È assolutamente necessario fare attenzione a non installare software obsoleto a meno che non si sia certi che provenga dalla fonte originale, per esempio: un repository contenuto all'interno di https://github.com/ethereum. - -### OpenEthereum {#open-ethereum} - -Obsoleto dal luglio 2021 - -**Riepilogo** - -OpenEthereum è stata la seconda implementazione principale di Ethereum per numero di nodi. OpenEthereum ha svolto un ruolo importante come infrastruttura chiave per alcuni dei maggiori utenti di Ethereum come Etherscan e Gnosis Safe. La sua capacità di tracciamento lo distinguono dagli altri client, garantendo una sincronizzazione affidabile e veloce per i fornitori di dati. - -**Archivi** - -[Repo Github archiviati](https://github.com/openethereum/openethereum) - -**Storia** - -OpenEthereum è stata costruita da miner, fornitori di servizi e borse che necessitano di una sincronizzazione veloce e un tempo di attività massimo. OpenEthereum ha fornito l'infrastruttura di base essenziale per servizi veloci ed affidabili. - -**Alternative** - -[Confronta tutte le opzioni del client di esecuzione di Ethereum](/developers/docs/nodes-and-clients/#execution-clients). - -### Grid {#grid} - -Obsoldeto dal 10 dicembre 2020 - -**Riepilogo** - -Grid era una applicazione desktop basata su JavaScript che permetteva di accedere in modo sicuro ad Ethereum, IPFS e ad altre reti decentralizzate. Ha fornito un'interfaccia intuitiva per aiutare un pubblico meno tecnico ad interagire in modo sicuro con le dapp, aumentando l'accessibilità per tutti. - -**Archivi** - -[Repo Github archiviati](https://github.com/ethereum/grid) - -**Storia** - -Grid potrebbe essere visto come il successore di Mist, anche essa un'applicazione desktop standalone basata su JavaScript che includeva un nodo Geth. Grid ha rimosso l'aspetto del portafoglio e ha aggiunto un approccio in stile plugin per l'esecuzione di diversi tipi di nodi. - -**Alternative** - -[DAppNode](https://dappnode.io/) è una piattaforma per distribuire e ospitare dapp, client P2P e nodi blockchain. - -### Ethereum Studio {#ethereum-studio} - -Obsoleto dal 7 dicembre 2020 - -**Riepilogo** - -Ethereum Studio era un IDE basato sul web che permetteva agli utenti di creare e testare contratti intelligenti, così come di costruire i front-end per essi. - -**Archivi** - -[Repo Github archiviati](https://github.com/SuperblocksHQ/ethereum-studio) - -**Storia** - -Ethereum Studio è stato sviluppato per fornire agli utenti un IDE con una blockchain Ethereum ed un compilatore Solidity integrati. In aggiunta a questo ha fornito la possibilità di modificare il codice in tempo reale e di esportare dapp complete senza bisogno di un terminale. - -**Alternative** - -[Remix](https://remix.ethereum.org/) è un IDE web alternativo per lo sviluppo in Solidity. Inoltre il [Portale per sviluppatori](/developers/) ha strumenti per lo sviluppo su web e in locale, documentazione e molto altro. - -### Portafoglio Meteor Dapp {#meteor-dapp-wallet} - -Obsoleto dal 27 marzo 2019 - -**Riepilogo** - -Il portafoglio Meteor Dapp era un componente di Mist, un portafoglio di Ethereum per gestire i conti di Ethereum ed interagire con i contratti intelligenti. Per tanti anni l'interfaccia utente web del portafoglio Mereor Dapp è stata ospitata come sottodominio, "wallet.ethereum.org". - -Era incluso anche il contratto multifirma di Mist (codice Solidity), e il portafoglio Meteor Dapp presentava un'interfaccia utente per la sua configurazione e distribuzione. - -**Non obsoleto: multifirma di Mist distribuiti** - -Il contratto multifirma di Mist - distribuito come bytecode sulla Rete Principale di Ethereum da migliaia di utenti - continua ad essere usato per memorizzare e gestire valore senza incidenti. [Come interagire con un contratto multifirma di Mist](https://support.mycrypto.com/how-to/sending/how-to-interact-with-a-multisig-contract) fornisce una buona panoramica su come usare i contratti intelligenti. - -**Archivi** - -[Repo Github archiviati](https://github.com/ethereum/meteor-dapp-wallet) - -**Storia** - -Vedi Mist qui sotto. - -**Alternative** - -Visita la pagina dei [Portafogli di Ethereum](/wallets/) su ethereum.org. - -### Mist {#mist} - -Obsoleto dal 27 marzo 2019 - -**Riepilogo** - -Mist era un browser specializzato costruito con Electron che permetteva agli utenti di gestire conti di Ethereum e di interagire con dapp ospitate nel web tradizionale. - -**Archivi** - -[Repo Github archiviati](https://github.com/ethereum/mist) - -**Storia** - -Mist è stato un importante esperimento iniziale perché ha esplorato come gestire le chiavi di Ethereum, ha fatto conoscere agli utenti gli strumenti finanziari, come i contratti multifirma, e ha dimostrato com avrebbe funzionato il Web3. Ha anche mostrato agli utenti innovazioni come i blockies, grafiche carine e memorabili in stile 8-bit che rappresentano le chiavi di Ethereum. - -**Alternative** - -[MetaMask](https://metamask.io/) è un portafoglio nel browser che permette di gestire le chiavi di Ethereum e di interagire con le dapp. È disponibile come un'estensione per Google Chrome e Firefox ed è incluso nel [Browser Brave](https://brave.com/). - -### Mix {#mix} - -Obsoleto dall'11 agosto 2016 - -**Riepilogo** - -Mix era un IDE sviluppato in C++ che permetteva agli sviluppatori di costruire e distribuire contratti intelligenti su Ethrerum. - -**Archivi** - -[Repo Github archiviati](https://github.com/ethereum/mix) - -**Storia** - -Mix è stato la prima delle applicazioni legate ad Ethereum. Guarda questa [presentazione di Gavin Wood al Devcon0](https://www.youtube.com/watch?v=hcP_z_wBlaM). - -**Alternative** - -[Remix](https://remix.ethereum.org/) è un IDE ospitato su browser per lo sviluppo, il testing e la distribuzione di contratti intelligenti in Solidity. Ha anche una soluzione desktop. - -### Minimal {#minimal} - -Obsoleto dal 2020. - -**Riepilogo** - -Minimal era un'implementazione modulare della blockchain di Ethereum scritta in Go. - -**Archivi** - -[Repo Github archiviati](https://github.com/umbracle/minimal) - -**Storia** - -Minimal è stato sostituito da [polgon-sdk](https://github.com/0xPolygon/polygon-edge) - -### Hyperledger Burrow {#hyperledger-burrow} - -Obsoleto dal 2022. - -**Riepilogo** - -Hyperledger Burrow era un nodo blockchain autorizzato di contratti intelligenti di Ethereum. Eseguiva il codice dei contratti intelligenti dell'EVM di Ethereum e di WASM su macchine virtuali autorizzate. - -**Archivi** - -[Repo Github archiviati](https://github.com/hyperledger/burrow) - -### Mana-Ethereum {#mana-ethereum} - -**Riepilogo** - -Mana-Ethereum era un client Ethereum costruito usando Elixir. - -**Archivi** - -[Repo Github archiviati](https://github.com/mana-ethereum/mana) - -**Storia** - -Il repository GitHub di Mana-Ethereum non è stato esplicitamente archiviato, ma l'ultimo commit è del 2019. - -### Aleth (cpp-ethereum) {#aleth} - -Obsoleto dal 6 ottobre 2021 - -**Riepilogo** - -Aleth (precedentemente noto come cpp-ethereum) era un client di Ethereum scritto in C++. - -**Archivi** - -[Repo Github archiviati](https://github.com/ethereum/aleth) - -**Storia** - -Aleth è stato il terzo client più popolare per Ethereum prima di essere abbandonato il 6 ottobre 2021. - -**Alternative** - -[Geth](https://geth.ethereum.org/) è un noto client Ethereum alternativo. - -### Ethereum-H {#ethereum-h} - -**Archivi** - -Gli archivi di Ethereum-H sono stati rimossi da GitHub. - -**Storia** - -Ethereum-H era un client Ethereum scritto in Haskell. È stato abbandonato intorno al 2015. - -**Alternative** - -[Geth](https://geth.ethereum.org/), [Nethermind](http://nethermind.io/), [Besu](https://besu.hyperledger.org/en/stable/) e [Erigon](https://github.com/ledgerwatch/erigon) sono valide alternative di client Ethereum - non esiste attualmente un client in Haskell. - -### ruby-ethereum {#ruby-ethereum} - -**Archivi** - -[Repo GitHib di ruby-ethereum](https://github.com/cryptape/ruby-ethereum) - -**Storia** - -ruby-ethereum era un client Ethereum scritto in Ruby. È stato abbandonato intorno al 2018. - -**Alternative** - -[Geth](https://geth.ethereum.org/), [Nethermind](http://nethermind.io/), [Besu](https://besu.hyperledger.org/en/stable/) e [Erigon](https://github.com/ledgerwatch/erigon) sono valide alternative di client Ethereum. Non esiste più un client in Ruby attivo. - -### Parity {#parity} - -Obsoleto dal 2 giugno 2020 - -**Riepilogo** - -Parity era un client Ethereum scritto in Rust. - -**Archivi** - -[Repo Github archiviati](https://github.com/openethereum/parity-ethereum) - -**Storia** - -Essendo uno dei due principali client validi nei primi anni di Ethereum (l'altro era Geth), Parity costituiva una parte fondamentale dell'ecosistema. Durante gli attacchi di Shanghai del 2016, Parity ha permesso alla rete di Ethereum di continuare a operare mentre il funzionamento di client come Geth era stato interrotto dall'attacco, dimostrando l'importanza della diverstià dei client. - -**Alternative** - -[Erigon](https://github.com/ledgerwatch/erigon) Erigon (precedentemente chiamato Turbo-Geth) è un client Ethereum di nuova generazione sulla frontiera dell'efficienza scritto in Go. - -**Nota:** _il progetto successore al client Ethereum Parity era [OpenEthereum](https://github.com/openethereum/openethereum) **che intanto diventato obsoleto.**_ - -La risorsa ["Avvia il tuo nodo di Ethereum"](/developers/docs/nodes-and-clients/run-a-node/#getting-the-client) su ethereum.org include una sezione per scaricare, installare ed eseguire un client Ethereum. - -### Trinity {#trinity} - -Obsoleto dal 1° luglio 2021 - -**Riepilogo** - -Trinity era un client Ethereum basato su python che fungeva da strumento di ricerca e di formazione per la community. Un elevato numero di moduli basati su python legati a Trinity continuano ad essere mantenuti dallo stesso team, incluso [Py-EVM](https://github.com/ethereum/py-evm). - -**Archivi** - -[Repo Github archiviati](https://github.com/ethereum/trinity) - -**Storia** - -Trinity è stato il progetto successivo a [pyethereum](https://github.com/ethereum/pyethereum/tree/b704a5c6577863edc539a1ec3d2620a443b950fb), un client Ethereum iniziale basato su python. - -**Alternative** - -La risorsa ["Avvia il tuo nodo di Ethereum"](/developers/docs/nodes-and-clients/run-a-node/#getting-the-client) su ethereum.org include una sezione per scaricare, installare ed eseguire un client Ethereum. - -Il progetto [EthereumJS](https://github.com/ethereumjs) ha uno scopo di ricerca e formazione simile a Trinity. - -## Dapp e Servizi {#dapps-and-services} - -Questa sezione riguarda i servizi distribuiti sulla Rete Principale di Ethereum e su altre reti baste sull'EVM. Si tenga presente che le dapp e i servizi qui elencati potrebbero includere applicazioni DeFi che sono state hackerate o che potrebbero soffrire di vulnerabilità di sicurezza dovute alla mancanza di manutenzione, di cambiamenti nel protocollo, ecc. - -### Protocollo Cover {#cover-protocol} - -Chiuso nell'autunno del 2021 - -**Riepilogo** - -Cover era un protocollo assicurativo Defi che funziona su Ethereum e altre reti basate sull'EVM. - -**Archivi** - -[Sito Web](https://wayback.archive-it.org/17679/20211004074635/https://www.coverprotocol.com/) - -[Articoli Medium](https://wayback.archive-it.org/17679/20211004074633/https://coverprotocol.medium.com/) - -[Repo GitHub](https://github.com/CoverProtocol/cover-core-v1) - -[Documentazione](https://wayback.archive-it.org/17679/20211004074634/https://docs.coverprotocol.com/) - -### The DAO {#the-dao} - -Hackerato e chiuso nell'estate del 2016 - -**Riepilogo** - -The DAO era un contratto intelligente, una dapp e un forum per organizzare il finanziamento di progetti. Sfruttando una vulnerabilità, è stato svuotato della maggior parte degli ETH, portando ad una biforcazione dura organizzata dalla community per restituire gli ETH a chi li aveva depositati in The DAO. Il front-end della UX e il forum sono stati dismessi. - -**Archivi** - -[Archivio internet di "daohub.org" del 14 maggio 2016](https://web.archive.org/web/20160514105232/https://daohub.org/) - -**Storia** - -Sebbene The DAO sia fallito, il concetto è sopravvissuto. L'innovativo modello tecnico, sociale e di governance di base di The DAO è ampiamente utilizzato nelle community Defi, NFT e di progetti di finanziamento. - -["Biforcazione DAO" su ethereum.org](/history/#dao-fork) - -[Voce Wikipedia per "The DAO"]() - -**Alternative** - -["DAO" su ethereum.org](/dao/) - -[MolochDAO](https://www.molochdao.com/) - -[Gitcoin Grants](https://gitcoin.co/grants/) - -### SparkPool {#sparkpool} - -Chiuso nell'autunno del 2021 - -**Riepilogo** - -Con sede a Hangzhou, il servizio e la community di SparkPool sono stati uno dei più grandi pool di mining incentrati su Ethereum al mondo. - -**Archivi** - -**Storia** - -Associato alla community EthFans, il servizio è stato lanciato nel 2015. SparkPool è stato smantellato nell'autunno del 2021 a causa di norme giuridiche più rigorose. - -**Alternative** - -[Ethermine](https://ethermine.org/) - -## Documentazione e fonti informative {#documentation-and-information-sources} - -Esistono numerose fonti di documentazione, articoli, tutorial e forum che sono stati rimossi o ancora online ma non più mantenuti. Ne abbiamo selezionati alcuni che sono significativi o il cui attuale stato di "obsoleto" potrebbe portare a confusione o tentativi di truffe. - -### Legacy Wiki ed eth.wiki {#eth-wiki} - -**Riepilogo** - -Legacy Wiki ed eth.wiki erano wiki mantenute dalla Ethereum Foundation per la community più ampia. Erano principalmente orientate ad ospitare descrizioni dettagliate degli aspetti chiave della piattaforma Ethereum e al riepilogo delle tabelle di marcia tecniche. - -**Archivi** - -[Repo Github archiviato per eth.wiki](https://github.com/ethereum/eth-wiki) - -[Repo Github archiviato per Legacy Wiki](https://github.com/ethereum/wiki/wiki) - -**Storia** - -Legacy Wiki era un wiki GitHub ed un primissimo centro di contenuti tecnici (incluso il Whitepaper originale di Ethereum). Nel corso del tempo, gli sviluppatori di Ethereum hanno migrato la loro documentazione, le specifiche e le descrizioni tecniche ad altre piattaforme quali [Leggi la documentazione](https://readthedocs.org/) e i contenuti ospitati su GitHub. - -Nel 2019 e nel 2020, eth.wiki è divenuto il successore di Legacy Wiki, ma non si è creata una community duratura di collaboratori. - -**Alternative** - -Contenuto basato sulla community: [sito web Ethereum.org](/) - -I progetti software di Ethereum spesso ospitano la loro documentazione in [Leggi la documentazione](https://readthedocs.org/) - -Specifiche tecniche ospitate su GitHub: [EIP](https://github.com/ethereum/EIPs), [Specifiche di esecuzione](https://github.com/ethereum/execution-specs), [Specifiche di consenso](https://github.com/ethereum/consensus-specs) - -### forum.ethereum.org {#forum-ethereum-org} - -**Riepilogo** - -Il Forum della Community di Ethereum era un forum di discussione mantenuto dalla Ethereum Foundation ed ospitato su forum Vanilla. Usava il sottodominio "forum.ethereum.org". - -**Archivi** - -URL dell'archivio: [https://wayback.archive-it.org/16516/20210618210825/https://forum.ethereum.org/](https://wayback.archive-it.org/16516/20210618210825/https://forum.ethereum.org/) - -**Storia** - -Questo Forum è stato il primo forum "ufficiale" di discussione per la community di Ethereum. Insieme a [/r/ethereum](https://reddit.com/r/ethereum) e ad alcuni canali Skype, è stato un importante punto di coordinamento per sviluppatori, progettisti e organizzatori. Nel corso degli anni i partecipanti al Forum si sono spostati ed è divenuto più un posto per la community dei miner. - -**Alternative** - -[/r/ethereum](https://reddit.com/r/ethereum), e un gran numero di forum di DAO e di server Discord. - -## Canali Gitter {#gitter-channels} - -### AllCoreDevs {#allcorewdevs-gitter} - -**Riepilogo** - -AllCoreDevs su Gitter era il principale canale di comunicazione pubblico di coordinamento per gli [sviluppatori del nucleo dei client Ethereum](https://github.com/ethereum/pm/). - -**Archivi** - -[Canale ethereum/AllCoreDevs su Gitter](https://gitter.im/ethereum/AllCoreDevs) - -**Alternative** - -Si prega di utilizzare il canale "allcoredevs" sul [server Discord in EthR&D](https://discord.gg/qHv7AjTDuK) - -### EthereumJS {#ethereumjs-gitter} - -**Riepilogo** - -EthereumJS su Gitter era il principale canale di comunicazione pubblico di coordinamento per il [progetto EthereumJS](https://ethereumjs.github.io/). - -**Archivi** - -[canale ethereum/EthereumJS su Gitter](https://gitter.im/ethereum/ethereumjs) - -**Alternative** - -Utilizzare il [server Discord di EthereumJS](https://discord.gg/TNwARpR) 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/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/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/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/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/it/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/it/developers/docs/scaling/zk-rollups/index.md index 148bbb485aa..db7c0ea8508 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 @@ -30,7 +30,7 @@ L'architettura principale del rollup ZK si compone dei seguenti componenti: 2. **Macchina virtuale (VM) off-chain**: benché il protocollo del rollup ZK risieda su Ethereum, l'esecuzione della transazione e l'archiviazione di stato si verificano su una macchina virtuale separata e indipendente dall'[EVM](/developers/docs/evm/). Questa VM off-chain è l'ambiente di esecuzione per le transazioni sul rollup ZK e serve da livello secondario o "livello 2" per il protocollo rollup ZK. Le prove di validità verificate sulla Rete principale di Ethereum garantiscono la correttezza delle transizioni di stato nella VM off-chain. -I rollup ZK sono "soluzioni di ridimensionamento ibride": protocolli off-chain che operano indipendentemente ma derivano la sicurezza da Ethereum. Nello specifico, la rete di Ethereum impone la validità degli aggiornamenti di stato sul rollup ZK e garantisce la disponibilità dei dati dietro ogni aggiornamento allo stato del rollup. Di conseguenza, i rollup ZK sono considerevolmente più sicuri delle soluzioni di ridimensionamento off-chain, come le [sidechain](/developers/docs/scaling/sidechains/), responsabili delle proprie proprietà di sicurezza, o i [validium](/developers/docs/scaling/validiums/), che pur verificando le transazioni su Ethereum con le prove di validità, memorizzano altrove i dati della transazione. +I rollup ZK sono "soluzioni di ridimensionamento ibride": protocolli off-chain che operano indipendentemente ma derivano la sicurezza da Ethereum. Nello specifico, la rete di Ethereum impone la validità degli aggiornamenti di stato sul rollup ZK e garantisce la disponibilità dei dati dietro ogni aggiornamento allo stato del rollup. Di conseguenza, i rollup ZK sono considerevolmente più sicuri delle soluzioni di ridimensionamento off-chain, come le [sidechain](/developers/docs/scaling/sidechains/), responsabili delle proprie proprietà di sicurezza, o i [validium](/developers/docs/scaling/validium/), che pur verificando le transazioni su Ethereum con le prove di validità, memorizzano altrove i dati della transazione. I rollup ZK si affidano al protocollo principale di Ethereum per quanto segue: diff --git a/public/content/translations/it/developers/docs/standards/tokens/erc-4626/index.md b/public/content/translations/it/developers/docs/standards/tokens/erc-4626/index.md index 907ccc0df3c..e5bc871f47f 100644 --- a/public/content/translations/it/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/translations/it/developers/docs/standards/tokens/erc-4626/index.md @@ -204,4 +204,4 @@ Dove `sender` è l'utente che ha innescato il prelievo e scambiato `shares`, pos ## Letture consigliate {#further-reading} - [EIP-4626: Tokenized vault Standard](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626: GitHub Repo](https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol) +- [ERC-4626: GitHub Repo](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) diff --git a/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md index d5b3b070e99..3bd263bc34d 100644 --- a/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md @@ -24,7 +24,7 @@ Se desideri visualizzare il codice sorgente completo: ## Creare un contratto ERC-20 {#creating-an-erc-20-contract} -Prima di poter aggiungere la funzionalità della barriera di sicurezza, ci occorre un contratto ERC-20. In questo articolo utilizzeremo [la procedura guidata dei contratti di OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/wizard). Aprila in un altro browser e segui queste istruzioni: +Prima di poter aggiungere la funzionalità della barriera di sicurezza, ci occorre un contratto ERC-20. In questo articolo utilizzeremo [la procedura guidata dei contratti di OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/wizard). Aprila in un altro browser e segui queste istruzioni: 1. Seleziona **ERC20**. 2. Inserisci queste impostazioni: 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/uniswap-v2-annotated-code/index.md b/public/content/translations/it/developers/tutorials/uniswap-v2-annotated-code/index.md index 3a19781a424..e7dc3c70025 100644 --- a/public/content/translations/it/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/it/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -743,7 +743,7 @@ Questa è la funzione principale della factory, per creare uno scambio in pari t (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); ``` -Vogliamo che l'indirizzo del nuovo scambio sia deterministico, quindi calcolabile in anticipo al di fuori della catena (questo può essere utile per le [transazioni di livello 2](/developers/docs/layer-2-scaling/)). Per farlo, dobbiamo avere un ordine coerente degli indirizzi del token, indipendentemente dall'ordine in cui li abbiamo ricevuti, quindi li ordiniamo qui. +Vogliamo che l'indirizzo del nuovo scambio sia deterministico, quindi calcolabile in anticipo al di fuori della catena (questo può essere utile per le [transazioni di livello 2](/developers/docs/scaling/)). Per farlo, dobbiamo avere un ordine coerente degli indirizzi del token, indipendentemente dall'ordine in cui li abbiamo ricevuti, quindi li ordiniamo qui. ```solidity require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); 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..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/testing-smart-contract-with-waffle/) +- [Test di Smart Contract con Waffle](/developers/tutorials/waffle-test-simple-smart-contract/) 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..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-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/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/it/roadmap/index.md b/public/content/translations/it/roadmap/index.md index b427fd00185..8d944589f1e 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: @@ -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/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/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/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/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/ja/developers/docs/bridges/index.md b/public/content/translations/ja/developers/docs/bridges/index.md index 5869c8e9a05..f5c8777ef55 100644 --- a/public/content/translations/ja/developers/docs/bridges/index.md +++ b/public/content/translations/ja/developers/docs/bridges/index.md @@ -4,7 +4,7 @@ description: デベロッパー向けのブリッジ概要 lang: ja --- -L1 のブロックチェーンおよび L2 の[スケーリング](/developers/docs/scaling/)ソリューションが一般化し、ますます多くの分散型アプリケーションがクロスチェーンで運用されつつある現在、複数のチェーン間における通信および資産移動を実現する機能がネットワークインフラにおける不可欠な要素となっています。 この機能を提供するために、さまざまな種類のブリッジが開発されています。 +L1のブロックチェーンおよびL2の[スケーリング](/developers/docs/scaling/)ソリューションが一般化し、ますます多くの分散型アプリケーションがクロスチェーンで運用されつつある現在、複数のチェーン間における通信および資産移動を実現する機能がネットワークインフラにおける不可欠な要素となっています。 この機能を提供するために、さまざまな種類のブリッジが開発されています。 ## ブリッジがなぜ必要か? {#need-for-bridges} @@ -23,14 +23,14 @@ L1 のブロックチェーンおよび L2 の[スケーリング](/developers/d デベロッパーは、ブリッジを通して以下を実現できます: - あらゆる種類のデータ、情報、および資産をチェーンを超えて転送できる。 -- ブリッジが個別のプロトコルで提供可能な機能の設計範囲を拡張するため、新たな機能やユースケースが可能になる。 例えば、当初イーサリアムメインネットでデプロイされたイールドファーミング用のプロトコルは、EVM 互換のすべてのチェーンに流動性プールを提供できる。 -- 様々なブロックチェーンが持つ独自の強みを活用できる機会を提供する。 例えば、複数のロールアップやサイドチェーン上で Dapp をデプロイし、ユーザーがそれらをまたいで利用できるようにすることで、様々な L2 ソリューションが提供する安価な手数料を提供できる。 +- ブリッジが個別のプロトコルで提供可能な機能の設計範囲を拡張するため、新たな機能やユースケースが可能になる。 例えば、当初イーサリアムメインネットでデプロイされたイールドファーミング用のプロトコルは、EVM互換のすべてのチェーンに流動性プールを提供できる。 +- 様々なブロックチェーンが持つ独自の強みを活用できる機会を提供する。 例えば、複数のロールアップやサイドチェーン上でDappをデプロイし、ユーザーがそれらをまたいで利用できるようにすることで、様々なL2ソリューションが提供する安価な手数料を提供できる。 - 様々なブロックチェーンエコシステムに関与しているデベロッパーが連携して、新たなプロダクトを構築できる。 -- 様々なエコシステムから、自社 Dapp にユーザーやコミュニティを呼び込むことができる。 +- 様々なエコシステムから、自社Dappにユーザーやコミュニティを呼び込むことができる。 ## ブリッジはどのように機能するのか? {#how-do-bridges-work} -[ブリッジの設計](https://blog.li.fi/what-are-blockchain-bridges-and-how-can-we-classify-them-560dc6ec05fa)には多くの種類がありますが、特に、クロスチェーンで資産を移転する以下の 3 つの方法が重要です: +[ブリッジの設計](https://li.fi/knowledge-hub/blockchain-bridges-and-classification/)には多くの種類がありますが、特に、クロスチェーンで資産を移転する以下の3つの方法が重要です。 - **ロックとミント** - ソースチェーン上のアセットをロックした上で、宛先チェーン上でアセットをミントする方式。 - **バーンとミント** - ソースチェーン上のトークンをバーンした上で、宛先チェーン上で新たにトークンをミントする方式。 @@ -40,10 +40,10 @@ L1 のブロックチェーンおよび L2 の[スケーリング](/developers/d ブリッジは通常、以下のカテゴリーに分類されます: -- **ネイティブブリッジ** - 通常、特定のブロックチェーンにおいて流動性を自動供給するための構築されたブリッジであり、当該エコシステムに対する資金の転送を容易にするものです。 例えば、[Arbitrum ブリッジ](https://bridge.arbitrum.io/)は、イーサリアムから Arbitrum への資金転送を容易にするために開発されたブリッジです。 この種類のブリッジとしては、Polygon PoS ブリッジや[Optimism ゲートウェイ](https://app.optimism.io/bridge)等があります。 -- **バリデータ/オラクルベースのブリッジ** - クロスチェーン間の転送につき、外部のバリデータ群またはオラクルによる検証に依存するブリッジです。 Multichain や Across が含まれます。 -- **一般的なメッセージの受け渡しを伴うブリッジ** - チェーン間の資産転送につき、メッセージおよび任意のデータと共に実行するもの。 Nomad や LayerZero が含まれます。 -- **流動性ネットワーク** - 主に、アトミック・スワップによるチェーン間の資産転送に焦点をあてたブリッジです。 通常、この種類のブリッジはチェーン間のメッセージの受け渡しには対応しません。 Conext や Hop が含まれます。 +- **ネイティブブリッジ** - 通常、特定のブロックチェーンにおいて流動性を自動供給するための構築されたブリッジであり、当該エコシステムに対する資金の転送を容易にするものです。 例えば、[ Arbitrumブリッジ](https://bridge.arbitrum.io/)は、イーサリアムからArbitrumへの資金転送を容易にするために開発されたブリッジです。 この種類のブリッジとしては、Polygon PoSブリッジや[Optimismゲートウェイ](https://app.optimism.io/bridge)等があります。 +- **バリデータ/オラクルベースのブリッジ** - クロスチェーン間の転送につき、外部のバリデータ群またはオラクルによる検証に依存するブリッジです。 MultichainやAcrossが含まれます。 +- **一般的なメッセージの受け渡しを伴うブリッジ** - チェーン間の資産転送につき、メッセージおよび任意のデータと共に実行するもの。 NomadやLayerZeroが含まれます。 +- **流動性ネットワーク** - 主に、アトミック・スワップによるチェーン間の資産転送に焦点をあてたブリッジです。 通常、この種類のブリッジはチェーン間のメッセージの受け渡しには対応しません。 ConextやHopが含まれます。 ## 考慮すべきトレードオフ {#trade-offs} @@ -51,11 +51,11 @@ L1 のブロックチェーンおよび L2 の[スケーリング](/developers/d - **セキュリティ** - システムの検証を誰が担うか? 一般に、外部のバリデータによりセキュリティを保証するブリッジは、当該ブロックチェーンのバリデータがローカル/ネイティブにセキュリティを保証する場合よりもセキュリティが低くなります。 - **利便性** - トランザクションの実行にかかる時間と、ユーザーが署名する必要があるトランザクションの数はどの程度か? デベロッパーにとっては、ブリッジを組み込むプロセスの時間や複雑さを検討する必要があります。 -- **接続性** - 様々な宛先チェーン(ロールアップ、サイドチェーン、他の L1 ブロックチェーン等)にどれだけ接続でき、新規ブロックチェーンとの統合がどの程度難しいかについて検討が必要です。 +- **接続性** - 様々な宛先チェーン(ロールアップ、サイドチェーン、他のL1ブロックチェーン等)にどれだけ接続でき、新規ブロックチェーンとの統合がどの程度難しいかについて検討が必要です。 - **複雑なデータの伝達能力** - チェーン間におけるメッセージやより複雑な任意データの転送が可能か、あるいは、チェーン間の資産移転のみに対応しているかが問題になります。 - **コスト効率** - ブリッジによるチェーン間の資産転送において、どの程度コストが発生するかです。 ブリッジは一般に、固定の手数料またはガス代および特定の転送レートの流動性に基づく変動料金を請求します。 さらに、セキュリティを確保するのにどれだけの手数料が必要になるかに基づき、特定のブリッジにおけるコスト効率を評価することが非常に重要です。 -より大まかに見れば、ブリッジはトラステッドとトラストレスの 2 種類に分類できます。 +より大まかに見れば、ブリッジはトラステッドとトラストレスの2種類に分類できます。 - **トラステッド** - トラステッドのブリッジとは、外部による検証に依存するブリッジです。 つまり、チェーン間のデータ送信につき、外部の検証者セット(マルチシグによるフェデレーション、マルチパーティの計算システム、オラクルネットワーク)が介在するブリッジを指します。 これにより、接続性に優れ、完全に汎用化されたメッセージをチェーン間でやりとりすることができます。 さらに、速度やコスト効率の面からも優れている場合が多いです。 ただし、ユーザーはブリッジ自体のセキュリティに依存するため、セキュリティが損なわれる可能性があります。 - **トラストレス** - これらのブリッジは、接続するブロックチェーンならびに転送するメッセージやトークンに対するバリデータに依存しています。 これらのブリッジが「トラストレス」と呼ばれるのは、(ブロックチェーン自体で想定するものを除き)、新たな信頼想定を追加しないためです。 これにより、トラステッドのブリッジと比較してセキュリティが高いと評価されます。 @@ -67,53 +67,53 @@ L1 のブロックチェーンおよび L2 の[スケーリング](/developers/d ## ブリッジに伴うリスク {#risk-with-bridges} -ブリッジは、[DeFi における最悪のハッキング事例](https://rekt.news/leaderboard/)上位 3 位における原因となっており、現在も開発途上の技術です。 ブリッジの利用は、以下のようなリスクを伴います: +ブリッジは、[DeFiにおける最悪のハッキング事例](https://rekt.news/leaderboard/)上位3位における原因となっており、現在も開発途上の技術です。 ブリッジの利用は、以下のようなリスクを伴います: -- **スマートコントラクトのリスク** - 多くのブリッジは監査に合格しているものの、スマートコントラクトに欠陥がひとつでも含まれていれば、資産に対するハッキング攻撃が可能になります(例: [Solana のワームホールブリッジ](https://rekt.news/wormhole-rekt/))。 +- **スマートコントラクトのリスク** - 多くのブリッジは監査に合格しているものの、スマートコントラクトに欠陥がひとつでも含まれていれば、資産に対するハッキング攻撃が可能になります(例: [Solanaのワームホールブリッジ](https://rekt.news/wormhole-rekt/))。 - **システミックな財務リスク** - 多くのブリッジでは、原資産の正規バージョンを新規チェーンでミントするためにラップ資産を用います。 ラップされたトークンが悪用された事例はすでに発生しており、エコシステム全体にシステミックリスクをもたらします。 - **カウンターパーティリスク** - 一部のブリッジでは、複数のバリデータが共謀してユーザーの資金を奪い取ろうと考えることはないという信頼の想定をユーザーに要求する、信頼ベースの設計を採用しています。 ユーザーは、これらのサードパーティアクターを信頼しなければならないため、ラグプル、検閲、およびその他の悪意の行為が発生するリスクにさらされています。 - **未解決の問題** - 現在でもブリッジは開発の初期段階にあるため、様々な市場環境(ネットワーク混雑時や、ネットワーク全体への攻撃やステートのロールバックといった予見できないイベントの発生時)においてブリッジがどのように機能するかについては、未確認の事項が多く残っています。 この不確実性は様々なリスクをもたらすものですが、その影響の度合いはまだ不明です。 -## Dapp でブリッジを利用する方法 {#how-can-dapps-use-bridges} +## Dappでブリッジを利用する方法 {#how-can-dapps-use-bridges} -以下では、デベロッパがブリッジを活用して Dapp のクロスチェーン化を検討する際の実践的な応用例について紹介します: +以下では、デベロッパがブリッジを活用してDappのクロスチェーン化を検討する際の実践的な応用例について紹介します: ### ブリッジとの統合 {#integrating-bridges} -開発中の Dapp をブリッジに対応させるには、多くの方法が存在します: +開発中のDappをブリッジに対応させるには、多くの方法が存在します: 1. **独自のブリッジを構築する** - 安全で信頼性が高いブリッジの開発は、特にトラストレスのアプローチを採用した場合、容易ではありません。 さらに、スケーラビリティや相互運用性に関する豊富な経験や技術的な知識が必要です。 また、ブリッジを管理し、実務上要求される十分な流動性を維持するためには常駐チームが必要です。 -2. **ユーザーが様々なブリッジから選択できるようにする** - 多くの[Dapp](/developers/docs/dapps/)では、ユーザーに対してネイティブトークンでのやりとりを要求しています。 ユーザーが所有するトークンを利用できるようにするために、Dapp のウェブサイトでは様々なブリッジのオプションを提供しています。 しかしこの方法は、自社の Dapp のインターフェイスだけでプロセスを完結できず、他の Dapp やブリッジとのやりとりが必要になるため、その場しのぎの対策と言わざるを得ません。 また、ユーザーのオンボーディングが複雑になり、ミスが発生する可能性も高まります。 +2. **ユーザーが様々なブリッジから選択できるようにする** - 多くの[Dapp](/developers/docs/dapps/)では、ユーザーに対してネイティブトークンでのやりとりを要求しています。 ユーザーが所有するトークンを利用できるようにするために、Dappのウェブサイトでは様々なブリッジのオプションを提供しています。 しかしこの方法は、自社のDappのインターフェイスだけでプロセスを完結できず、他のDappやブリッジとのやりとりが必要になるため、その場しのぎの対策と言わざるを得ません。 また、ユーザーのオンボーディングが複雑になり、ミスが発生する可能性も高まります。 -3. **Dapp 内にブリッジを組み込む** - このアプローチでは、ユーザーは外部のブリッジや DEX インターフェイスとやりとりする必要がなくなります。 このため、ユーザーのオンボーディング体験が向上します。 しかし、このアプローチにも以下のような制限があります: +3. **Dapp内にブリッジを組み込む** - このアプローチでは、ユーザーは外部のブリッジやDEXインターフェイスとやりとりする必要がなくなります。 このため、ユーザーのオンボーディング体験が向上します。 しかし、このアプローチにも以下のような制限があります: - ブリッジに対する評価やメンテナンスは、手間や時間がかかる。 - ひとつのブリッジを選択することで、単一障害点や依存関係が発生する。 - - 当該ブリッジの機能により、Dapp のサービスが制限される。 - - ブリッジだけでは対応できない機能が必要になる場合がある。 チェーン間のスワップなどの機能を追加するには、DEX を含める必要があるかもしれない。 + - 当該ブリッジの機能により、Dappのサービスが制限される。 + - ブリッジだけでは対応できない機能が必要になる場合がある。 チェーン間のスワップなどの機能を追加するには、DEXを含める必要がある場合がある。 4. **複数のブリッジを組み込む** - このアプローチは、ひとつのブリッジを統合する場合の多くの問題を解消できます。 一方で、複数のブリッジとの統合は多くのリソースを消費し、暗号資産の分野において最も希少性が高いリソースであるデベロッパーにとって、技術面およびコミュニケーション面での負担が増加してしまいます。 -5. **ブリッジアグリゲーターを導入する** - 複数のブリッジにアクセスできる、ブリッジアグリゲーションを活用するのもひとつの方法です。 ブリッジアグリゲーターはすべてのブリッジの強みを継承するため、各ブリッジが提供する機能のみに制限されなくなります。 特に、通常はブリッジアグリゲーターが Dapp とブリッジとの統合を管理するため、Dapp のデベロッパー側はブリッジとの統合における技術的/運用的な側面を管理する作業から解放されます。 +5. **ブリッジアグリゲーターを導入する** - 複数のブリッジにアクセスできる、ブリッジアグリゲーションを活用するのもひとつの方法です。 ブリッジアグリゲーターはすべてのブリッジの強みを継承するため、各ブリッジが提供する機能のみに制限されなくなります。 特に、通常はブリッジアグリゲーターがDappとブリッジとの統合を管理するため、Dappのデベロッパー側はブリッジとの統合における技術的/運用的な側面を管理する作業から解放されます。 ブリッジアグリゲーターは、このような利点を持つ一方で、欠点もあります。 例えば、より多くのブリッジを活用するオプションを提供することは事実ですが、特定のアグリゲーターのプラットフォームが提供するブリッジよりもさらに多くのブリッジが市場で提供されています。 さらに、ブリッジの場合と同じように、ブリッジアグリゲーターもスマートコントラクトやテクノロジーに由来するリスクにさらされています(対応するコントラクトが多くなれば、リスクも拡大します)。 -Dapp にブリッジやブリッジアグリゲーターを組み込む場合、統合の度合いに応じて様々なオプションが考えられます。 例えば、ユーザーにおけるオンボーディング体験の向上を目的とするフロントエンドのみの統合では、ウィジェットを搭載すればよいでしょう。 しかし、ステーキングやイールドファーミング等のより複雑なチェーン間のやりとりを実現するには、SDK や API を統合する必要があります。 +Dappにブリッジやブリッジアグリゲーターを組み込む場合、統合の度合いに応じて様々なオプションが考えられます。 例えば、ユーザーにおけるオンボーディング体験の向上を目的とするフロントエンドのみの統合では、ウィジェットを搭載すればよいでしょう。 しかし、ステーキングやイールドファーミング等のより複雑なチェーン間のやりとりを実現するには、SDKやAPIを統合する必要があります。 -### 複数のチェーン上で Dapp をデプロイする {#deploying-a-dapp-on-multiple-chains} +### 複数のチェーン上でDappをデプロイする {#deploying-a-dapp-on-multiple-chains} -複数のブロックチェーン上で Dapp をデプロイするには、[Alchemy](https://www.alchemy.com/)、[Hardhat](https://hardhat.org/)、あるいは[Truffle](https://trufflesuite.com/), [Moralis](https://moralis.io/)などの開発プラットフォームを利用することができます。 一般にこれらのプラットフォームには、Dapp のクロスチェーン化を実現するコンポーザブルなプラグインが含まれています。 例えば、 [hardhat-deploy plugin](https://github.com/wighawag/hardhat-deploy)で提供される決定論的なデプロイ用プロキシを活用することができます。 +複数のブロックチェーン上でDappをデプロイするには、[Alchemy](https://www.alchemy.com/)、[Hardhat](https://hardhat.org/)、あるいは[Truffle](https://trufflesuite.com/), [Moralis](https://moralis.io/)などの開発プラットフォームを利用することができます。 一般にこれらのプラットフォームには、Dappのクロスチェーン化を実現するコンポーザブルなプラグインが含まれています。 例えば、 [hardhat-deploy plugin](https://github.com/wighawag/hardhat-deploy)で提供される決定論的なデプロイ用プロキシを活用することができます。 #### 例: -- [クロスチェーン対応の Dapp を開発する方法](https://moralis.io/how-to-build-cross-chain-dapps/) -- [クロスチェーン対応の NFT マーケットプレイスを開発する方法](https://youtu.be/WZWCzsB1xUE) -- [Moralis: クロスチェーン対応の DApps を開発する](https://www.youtube.com/watch?v=ehv70kE1QYo) +- [クロスチェーン対応のDappを開発する方法](https://moralis.io/how-to-build-cross-chain-dapps/) +- [クロスチェーン対応のNFTマーケットプレイスを開発する方法](https://youtu.be/WZWCzsB1xUE) +- [Moralis: クロスチェーン対応のDAppsを開発する](https://www.youtube.com/watch?v=ehv70kE1QYo) ### コントラクトにおけるチェーン間のやりとりを監視する {#monitoring-contract-activity-across-chains} -コントラクトにおけるチェーン間のやりとりを監視するには、サブグラフや、Tenderly 等の開発プラットフォームを用いて、スマートコントラクトの状態をリアルタイムで観察することができます。 これらのプラットフォームにはさらに、[コントラクトが発行したイベント](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events)をチェックするなど、チェーン間のやりとりを対象としてより充実したデータ監視機能を実現できるツールが含まれています。 +コントラクトにおけるチェーン間のやりとりを監視するには、サブグラフや、Tenderly等の開発プラットフォームを用いて、スマートコントラクトの状態をリアルタイムで観察することができます。 これらのプラットフォームにはさらに、[コントラクトが発行したイベント](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events)をチェックするなど、チェーン間のやりとりを対象としてより充実したデータ監視機能を実現できるツールが含まれています。 #### ツール @@ -123,10 +123,10 @@ Dapp にブリッジやブリッジアグリゲーターを組み込む場合、 ## さらに学びたい方へ {#further-reading} - [ブロックチェーンにおけるブリッジ](/bridges/) - ethereum.org -- [ブロックチェーンにおけるブリッジ: クリプトネットワークのネットワーク構築](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) 2021 年 9 月 8 日、ドミトリー・ベレンゾン作成。 -- [相互運用性のトリレンマ](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) 2021 年 10 月 1 日、アルジュン・ブプタニ作成。 -- [クラスタ: 信頼ベースおよび信頼最小化のブリッジは、マルチチェーン環境をどのように変化させるか](https://blog.celestia.org/clusters/) 2021 年 10 月 4 日、ムスタファ・アル=バッサム作成。 -- [LI.FI: ブリッジの信頼依存度は様々に異なる](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) 2022 年 4 月 28 日 、アルジュン・チャンド作成。 +- [ブロックチェーンにおけるブリッジ: クリプトネットワークのネットワーク構築](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) 2021年9月8日、ドミトリー・ベレンゾン作成。 +- [相互運用性のトリレンマ](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) 2021年10月1日、アルジュン・ブプタニ作成。 +- [クラスタ: 信頼ベースおよび信頼最小化のブリッジは、マルチチェーン環境をどのように変化させるか](https://blog.celestia.org/clusters/) 2021年10月4日、ムスタファ・アル=バッサム作成。 +- [LI.FI: ブリッジの信頼依存度は様々に異なる](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) 2022年4月28日 、アルジュン・チャンド作成。 ブリッジについてさらに理解を深めたい方は、 [ジェイムズ・プレストウィッチ](https://twitter.com/_prestwich)による洞察溢れる講演をご覧ください: 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/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/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/ja/developers/docs/data-availability/index.md b/public/content/translations/ja/developers/docs/data-availability/index.md index 3c6a5f19d09..6fd0f527182 100644 --- a/public/content/translations/ja/developers/docs/data-availability/index.md +++ b/public/content/translations/ja/developers/docs/data-availability/index.md @@ -1,167 +1,83 @@ --- title: データ可用性 -description: イーサリアムにおけるデータの可用性に関する問題および解決策の概要 +description: イーサリアムにおけるデータ可用性に関する問題および解決策の概要 lang: ja --- -トラストレスであることは、パブリックブロックチェーンにおける大前提であると言えます(「信頼せず、検証せよ」)。 イーサリアムにおいて信頼性の前提を引き下げる方法のひとつに、データの可用性に関するルールの強制的な適用があります。 ブロックを生成するユーザーは各ブロックのデータを公開しなければならず、これをイーサリアムのコンセンサスに参加するノードがローカルで保存するのです。 +「信頼するな、検証せよ」は、イーサリアムでよく使われる格言です。 この考え方は、あなたのノードで独自に検証できることを指しています。情報が正しいのかどうかをピアから受け取ったブロックのトランザクションを全て実行することで、提案された変更がノードによって個別に計算された変更と正確に一致することを保証することが可能です。 これにより、ノードがブロックの送信者が正直であると信頼する必要がないことを意味します。 データが欠落している場合は、信頼することができまません。 -イーサリアムネットワーク上のすべてのノードは、他のノードから受け取ったブロック内のトランザクションを実行することで、ブロック生成者が提案した変更が、各ノードにおいて独立して計算されたものと正確に一致することを確認することができます。 これにより各ノードは、ブロック生成者の誠実性を信頼する必要を伴わずに、新たな情報が正当なものであることを確認できます。 この確認は、データが欠落していると実行できません。 - -ブロックチェーンにおいてデータの可用性が重要な理由は、参照可能なデータで再現できない物は存在しないと見なされるためです。 検証するノードは、ブロックデータにアクセスすることで、各ノードにおけるイーサリアムのワールドステートを用いてトラストレスにトランザクションを再生し、各ブロックの正確性を独立して検証することができます。 +**データ可用性**は、ユーザーがブロックを検証するために必要なデータがすべてのネットワーク参加者で実際に利用可能であるという確実性を指しています。 イーサリアムのレイヤー1にあるフルノードの場合は比較的シンプルです。 フルノードは、各ブロック内のすべてのデータのコピーをダウンロードします。ダウンロードが可能であるには、 データが入手可能であることが_必要_です。 データが欠落しているブロックは、ブロックチェーンに加えられることはなく、破棄されます。 これは「オンチェーンにおけるデータ可用性」であり、モノリシックブロックチェーンの機能です。 フルノードでは、すべてのトランザクションを自分でダウンロードして実行するため、だまされて無効なトランザクションを受け入れることはありません。 ただし、モジュラー型のブロックチェーン、レイヤー2ロールアップ、ライトノードの場合では、データ可用性の状勢がより複雑になり、より高度な検証手順が必要になります。 ## 前提知識 {#prerequisites} [ブロックチェーンの基礎](/developers/docs/intro-to-ethereum/)、特に[コンセンサス・メカニズム](/developers/docs/consensus-mechanisms/)をよく理解している必要があります。 さらに、[ブロック](/developers/docs/blocks/)、[トランザクション](/developers/docs/transactions/)、[ノード](/developers/docs/nodes-and-clients/)、[スケーリングソリューション](/developers/docs/scaling/)、およびその他の関連トピックについての知識が必要です。 -## データの可用性とは何か? {#what-is-data-availability} - -データの可用性とは、ブロック提案者が当該ブロックに関するすべてのトランザクションデータを公開し、このトランザクションデータをネットワークの他の参加者も利用可能であることを保証することです。 イーサリアムのトランザクションは、[ブロック](/developers/docs/blocks/)で処理されます。 複数のブロックをチェーンでつなぐことで、「ブロックチェーン」が作られます。 - -各ブロックは、主に以下の 2 つのパーツで構成されます: - -- **ブロックヘッダー**:タイムスタンプ、ブロックハッシュ、ブロック番号など、ブロックに関する一般的な情報(メタデータ)を含む部分です。 -- **ブロックボディ**:当該ブロックの一部として処理された実際のトランザクションを含む部分です。 - -ブロック生成者が新しいブロックを提案する場合、(ブロックボディ内の)トランザクションデータを含むブロック全体を公開しなければなりません。 コンセンサスに参加している各ノードは、それを受けて、このブロックのデータをダウンロードし、トランザクションを再実行することで、新規ブロックの正当性を確認します。 トランザクションを検証する他のノードが存在しなければ、ブロック提案者がブロックに悪意のトランザクションを紛れ込ませることが可能になります。 - -### データの可用性に関する問題点 {#the-data-availability-problem} - -データの可用性に関する問題は、「新たに生成されたデータの参照可能性をどのように検証できるか」という問いに要約できます。 イーサリアムでは、フルノードがブロックデータにアクセスできるという前提によりセキュリティを確保しているため、データが参照可能であることが死活的に重要です。 - -ブロックの生成者がすべてのデータを提供せずにブロックを提案する場合、このブロックは無効なトランザクションを含んだままでファイナリティに達してしまうかもしれません。 仮に適切なブロックであったとしても、検証に必要なデータがすべて参照できない場合、イーサリアムネットワークのユーザーおよび機能に対して悪影響を及ぼします。 - -データの可用性に関する問題は同時に、ロールアップをはじめとする[スケーリング・ソリューション](/developers/docs/scaling/)に関する議論においても重要です。 スケーリングのためのプロトコルは、イーサリアムメインネット以外でトランザクションを実行することで、スループットを増大させます。 しかし、これらのプロトコルがイーサリアムを通じてセキュリティを確保するためには、トランザクションデータをメインネットに送信して、メインチェーン以外で実行された処理の正確性を誰もが検証できるようにしなければなりません。 - -#### データの可用性とライトクライアント - -データの可用性に関する従来の考え方では、検証を行うノードにおけるトランザクションデータの可視性について議論を進めてきましたが、最近は、ライトクライアントにおけるデータの可用性を検証する方法に焦点を当てる傾向が強まっています。 ライトクライアントにおけるデータの可用性の問題は、ブロック全体をダウンロードせずにブロックの可用性を検証できるか、という点にあります。 - -イーサリアムにおけるライトクライアントとは、最新のブロックヘッダーのみに同期し、フルノードに対して他の情報をリクエストするノードです。 ライトクライアントは、ブロック全体をダウンロードしないため、トランザクションを検証したり、イーサリアムのセキュリティ向上に貢献することはできません。 - -しかし、ライトクライアントがブロックをダウンロードしないでもデータの可用性を証明できる方法についての研究が進められています。 ライトクライアントがブロックの可用性を検証できるようになれば、可用性がないブロックについて他のノードに警告を発することで、イーサリアム全体のセキュリティ向上に貢献することができます。 - -これに関連して、ステートレスのイーサリアムにおいてデータの可用性を検証可能にするためのメカニズムについても研究が進められています。 [ステートレス・クライアント・コンセプト](https://ethresear.ch/t/the-stateless-client-concept/172) は、提案中のイーサリアムのバージョンであり、検証を行うノードはブロックを検証する前に状態データを保存する必要がなくなります。 - -ステートレス性により、イーサリアムのセキュリティ、スケーラビリティ、および長期的なサステナビリティが向上できると期待されています。 ノードを検証するためのハードウェア要件を引き下げることで、より多くのバリデータがネットワークに参加できるようになるため、悪意のアクターからネットワークを保護できるようになります。 - -### データの可用性と取り出し可能性の違いとは? {#data-availability-vs-data-retrievability} - -データの可用性は、データの取り出し可能性とは異なる概念です。 データの可用性とは、チェーンに追加するために処理中であるブロックのトランザクションデータを、ノードがダウンロードできる機能を指します。 つまり、データの可用性が問題になるのは、コンセンサスに達していないブロックを対象とする場合です。 - -一方、データの取り出し可能性とは、ブロックチェーンにおける*過去の情報*をノードが取り出すことができる機能を指します。 ブロックチェーンの履歴は、過去のブロックおよび、過去のイベントに関する情報が保存されているレシートにより構成されます。 過去のブロックチェーンデータは、アーカイブ化のために必要となる場合がありますが、各ノードは、この履歴なしでブロックチェーンを検証し、トランザクションを処理することができます。 - -イーサリアムのコアプロトコルでは、主に、データの取り出し可能性についてではなく、可用性について取り上げています。 イーサリアムでは、処理済みのすべてのトランザクションを永遠に保存することはありません。そうすると、フルノードにおけるストレージ要件が厳格化され、イーサリアムの分散化にとって有害だからです。 - -幸いなことに、データの取り出し可能性は、データの可用性よりもはるかに解決しやすい問題です。 過去のブロックチェーンデータを取り出すためには、履歴情報を保存している正直なノードがひとつ存在すればよいからです。 さらに、ブロックチェーン・エクスプローラーなどの組織は、アーカイブデータを保存して、他のユーザーからのリクエストに基づいて提供するというインセンティブを持っています。 - -[データの取り出し可能性に関するソリューションの詳細](https://notes.ethereum.org/@vbuterin/data_sharding_roadmap#Who-would-store-historical-data-under-sharding) - -## データの可用性が重要である理由 {#why-is-data-availability-important} - -### ブロックチェーンのセキュリティ {#blockchain-security} +## データ可用性問題 {#the-data-availability-problem} -データの可用性は、ブロックチェーンのセキュリティを維持する上で死活的に重要であり、可用性が存在しなければ、「データ秘匿による攻撃」が一般化してしまうでしょう。 データ隠し持ち攻撃とは、ブロックの生成者が、当該ブロックを構築するために用いたトランザクションデータを共有せずにブロックを公開するものです。 +データ可用性問題とは、すべてのノードがすべてのデータをダウンロードすることなく、有効なトランザクションのセットを表すブロックチェーンが追加されたことを要約された形式のいくつかのトランザクションデータからネットワーク全体を証明する必要があることを指します。 ブロックを個別に検証するには完全なトランザクションデータが必要になりますが、すべてのノードがすべてのトランザクションデータをダウンロードする必要があると、スケーリングの障壁になります。 データ可用性問題に対する解決策としては、自分自身でデータをダウンロードして保存しないネットワーク参加者に対して、完全なトランザクションデータが検証のために利用可能であることを十分に保証する状態を目指すことです。 -データ隠し持ち攻撃が発生した場合、フルノードは、イーサリアムのワールドステートに対するアップデートが適切であるかを検証することが不可能になります。 これにより、悪意のブロック提案者は、プロトコルのルールをかいくぐり、イーサリアムネットワークにおいて無効な状態遷移を実行させることができます。 +ネットワーク参加者が強力なデータ可用性保証を必要としているものの、自分自身でダウンロードやトランザクションデータを処理することができない重要な例としては、[ライトノード](/developers/docs/nodes-and-clients/light-clients)や[レイヤー2ロールアップ](/developers/docs/scaling)があります。 トランザクションデータのダウンロードを避けることでライトノードは軽量になり、ロールアップは効果的なスケーリングソリューションになることができます。 -フルノードにおけるブロックデータの可視性が重要なのは、ライトクライアントをはじめとする他のネットワーク参加者におけるネットワーク状態の検証がフルノードに依存しているためです。 ライトクライアントは、フルノードとは異なり、ブロックヘッダーのみを確認し、ブロックボディはダウンロードしません。 このため、データ可用性に関するルールは、フルノードがブロックを検証可能であり、チェーンの不正利用を防止できることを保証するのです。 +データ可用性は、ブロックを検証するために状態データをダウンロードして保存する必要のない今後の[「ステートレス」](/roadmap/statelessness)イーサリアムクライアントにとっても重要な課題事項になっています。 ステートレスクライアントでは、データが_どこか_で入手可能であることおよびデータが正しく処理されていることを依然として確認する必要があります。 -### 分散型のスケーラビリティ {#decentralized-scalability} - -[イーサリアムでは、分散化とセキュリティを犠牲にすることなく、処理能力のスケーラビリティを実現することを目標としています。](/roadmap/vision/) ブロックチェーンのアーキテクチャにおけるモノリシックな限界により、分散型のスケーラビリティを実現するにはデータの可用性が非常に重要になります。 - -#### データの可用性と L2 のスケーリング {#data-availability-and-layer-2-scaling} - -[ロールアップ](/glossary/#rollups)などの[L2 のスケーリング・ソリューション](/layer-2/)は、イーサリアムのメイン実行レイヤー以外でトランザクションを処理することで、ネットワークのスループットおよびレイテンシーにおけるスケーラビリティを実現します。 オフチェーンのトランザクションは、圧縮されたデータがバッチでイーサリアムに投稿されるため、オフチェーンで数千件のトランザクションが実行される場合でも、イーサリアムは提出された各バッチに関連した*1 件*のトランザクションをオンチェーンで処理すればよいのです。 これにより、ベースレイヤーにおける処理の混雑を軽減し、ユーザーの手数料を引き下げられると同時に、トランザクションの処理速度を高めることができます。 - -しかし、イーサリアムがロールアップのセキュリティを保証するには、オフチェーンで実行されるトランザクションの正当性を検証するメカニズムが必要になります。 ここで、データの可用性が重要になってきます。 - -[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups/)の場合、圧縮されたトランザクションデータは`calldata`としてイーサリアムに送信されます。 これにより、すべてのユーザーがロールアップの状態を検証でき、トランザクションの正当性を保証することができます。 トランザクションが無効である場合、検証者は、参照できるトランザクションデータを用いて<[不正証明](/glossary/#fraud-proof)を構築し、異議を申し立てることができます。 - -[ゼロ知識 (ZK) ロールアップ](/developers/docs/scaling/zk-rollups)では、[ゼロ知識有効性証明](/glossary/#zk-proof)を用いて状態遷移の正当性を保証できるため、トランザクションデータを投稿する必要はありません。 ただし、状態データにアクセスできない場合、ゼロ知識ロールアップの機能(またはロールアップとのやりとり)を保証することはできません。 - -具体的には、オペレーターがロールアップの状態に関する詳細を公開しない場合、ユーザーは自分の残高を確認できません。 さらに、新たに追加されたブロックに含まれる情報を用いて、状態アップデートを実行することもできません。 - -## ブロックチェーンにおけるデータ可用性システムの種類 {#types-of-data-availability-systems-in-blockchains} - -### オンチェーンにおけるデータの可用性 {#on-chain-data-availability} - -データの可用性に関する問題に対する標準的な解決策は、ブロック生成者に対し、すべてのトランザクションデータをオンチェーンで公開させ、検証するノードにこのデータをダウンロードさせるという方法です。 オンチェーンにおけるデータの可用性は、データの可用性、トランザクションの実行、およびコンセンサスを 1 つのレイヤーで管理するという「モノリシックなブロックチェーン」の特徴だと言えます。 イーサリアムのプロトコルでは、ネットワーク全体において冗長的に状態データを保存することで、各ノードは、トランザクションを再現し、状態アップデートを検証し、無効な状態遷移をフラッグするために必要なデータにアクセスすることができます。 - -しかし、オンチェーンにおけるデータの可用性を維持する場合、スケーラビリティのボトルネックが発生します。 モノリシックなブロックチェーンでは、各ノードがすべてのブロックをダウンロードし、同じトランザクションを再生する必要があるため、処理速度が低下する場合が多いためです。 さらに、フルノードに対して常に増化する状態の保存を要求するため、分散化という目標に反したトレンドとも言えます。 イーサリアムの状態が加速度的に増化する場合、検証者はより高性能のマシンに投資しなければならず、最終的には検証ノードを実行するユーザーの数が減少するでしょう。 - -### オフチェーンにおけるデータの可用性 {#off-chain-data-availability} - -オフチェーンのデータ可用性システムは、データの保存場所をブロックチェーン外に移動させます。ブロックの生成者は、トランザクションデータをオンチェーンで公開するのではなく、当該データの可用性を証明する暗号化されたコミットメントを提供します。 これは、 [モジュラー型ブロックチェーン](https://celestia.org/learn/basics-of-modular-blockchains/modular-and-monolithic-blockchains/)で用いられている方法であり、ブロックチェーンは、トランザクションの実行やコンセンサスといった一部のタスクを管理する一方で、その他のタスク(データの可用性など)は他のレイヤーで処理させます。 - -スケーリングを実現する多くのソリューションでは、データの可用性をコンセンサスや実行と分離するというモジュラー型のアプローチを採用しており、ノードの要件を強化することなくブロックチェーンのスケーラビリティを実現する上で最適の方法だと考えられています。 例えば、[バリディウム](/developers/docs/scaling/validium/)や[プラズマ](/developers/docs/scaling/plasma/)では、オフチェーンのストレージを使用してオンチェーンで投稿されるデータの量を軽減しています。 - -オフチェーンにおけるデータの可用性は、効率性の向上をもたらすものの、分散化、セキュリティ、およびトラストレス性といった事項に対しては悪影響を及ぼします。 例えば、バリディウムやプラズマにおける参加者は、ブロックの生成者が提案したブロックに無効なトランザクションを含めていないことを信頼する必要があります。 ブロックの生成者は悪意の行為(つまり、無効な状態遷移)を行う可能性があり、状態データを秘匿することで、悪意のトランザクションに対する異議申立の試みを無効化しようとすることができます。 - -オフチェーンのデータストレージに伴う様々な問題により、一部のスケーリング・ソリューションでは、イーサリアムのような親ブロックチェーン上でトランザクションデータを保存しています。 例えば、オプティミスティック・ロールアップやゼロ知識ロールアップでは、トランザクションデータを保存せず、イーサリアムメインネットをデータ可用性レイヤーとして使用します。 - -## データ可用性の問題点を解決するソリューションには、どのようなものがあるか? {#solutions-to-data-availability-problem} - -すでに述べたように、データの可用性に関する問題とは、新たに提案されたブロックにおけるトランザクションデータが検証可能かという点に関わっています。 この問題に対する解決策は、データの可用性を保証するためのメカニズムを提供するものです。 +## データ可用性ソリューション {#data-availability-solutions} ### データ可用性サンプリング(DAS) {#data-availability-sampling} -データ可用性サンプリング(DAS)とは、暗号化メカニズムを使ってデータの可用性を保証するものです。 Das により、ブロックチェーンの各ノードは、ブロック全体をダウンロードせずに提案されたブロックのデータ可用性を検証することができます。 - -DAS システムでは、各ノードが対象ブロックから小規模なチャンクを複数回サンプリングしてデータの可用性を検証します。 対象ブロックの異なる部分を多くのノードが同時にサンプリングすることで、統計的に高い確実性に基づいて可用性を検証することができます。 - -DAS は、イーサリアムをはじめとするブロックチェーンに適用した場合、ライトクライアントもチェーンのセキュリティおよび機能性を保証するために貢献できるようになります。 ライトクライアントも高価なハードウェアを導入せずに検証を実行できるため、イーサリアムネットワーク上のあらゆるユーザーが検証作業に参加することができます。 +データ可用性サンプリング (DAS) は、各ノードに過度な負担をかけずに、ネットワークでデータが取得可能であることを確認する方法です。 各ノード (非ステーキングノードを含む) は、すべてのデータからランダムに選択された小さなサブセットをダウンロードします。 サンプルのダウンロードが成功することで、すべてのデータが取得可能であることを高い信頼性をもって確認できます。 これは、データイレイジャーディングコーディングに依存しています。データイレイジャーコーディングとは、指定された冗長な情報を展開します (_多項式_として知られる関数をデータに当てはめ、追加の点において、その多項式を評価する方法をとります) 。 これにより、必要に応じて冗長データから元のデータを復元できます。 このデータ作成の結果、元のデータの_いずれか_が取得できない場合、 展開されたデータの_半分_が行方不明になります! 各ノードによってダウンロードされるデータサンプリングの量が、実際に取得可能なデータの半分未満である_場合_では、各クライアントからサンプリングされた少なくとも1つのデータフラグメントが欠落している可能性が_極めて_高くなるように調整されています。 -[データ可用性サンプリングに関する詳細。](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +DASは、[EIP-4844](/roadmap/danksharding)が実装された後、ロールアップオペレータがトランザクションデータを取得できることを確実にするために使われます。 イーサリアムノードでは、上述した冗長性スキームを使い、ブロブで提供されるトランザクションデータをランダムにサンプリングし、すべてのデータが存在することを確認します。 同じ手法を採用することで、ブロック生成者がすべてのデータをライトノードへ使用可能にしていることを保証できます。 同様に、[プロポーザー/ビルダーセパレーション(PBS)](/roadmap/pbs)では、ブロックビルダーはブロック全体を処理することのみが求められ、他のバリデータはデータ可用性サンプリングを用いて検証します。 -#### データ可用性証明 {#data-availability-proofs} +### データ可用性委員会(DAC) {#data-availability-committees} -データ可用性サンプリングを通じて、対象ブロックの可用性を統計的に保証することができるものの、悪意のノードがデータを秘匿する可能性を完全に消し去ることはできません。 DAS のテクニックは、当該ブロックにおける大部分のデータの可用性を証明するだけであり、ブロック全体の可用性を保証しません。 そして、ブロックの生成者がトランザクションデータのごく一部を秘匿するだけでも、多くの被害が発生しうるのです。 +データ可用性委員会 (DAC) は、データ可用性を提供もしくは証明する信頼できる当事者です。 DACは、DASの代わりに使うことができたり、DASと[組み合わせること](https://hackmd.io/@vbuterin/sharding_proposal#Why-not-use-just-committees-and-not-DAS)ができます。 この委員会が持つ安全性の保証は、具体的な設定によって異なります。 例えばイーサリアムでは、ランダムにサンプリングされたバリデータのサブセットを使い、ライトノードのデータ可用性を証明します。 -私たちはこの問題を解決するために、データ可用性サンプリングと[イレイジャーコード](https://en.wikipedia.org/wiki/Erasure_code)を組み合わせることで、「データ可用性証明」というプロセスを開発しました。 イレイジャーコーディングとは、ブロックに冗長な部分を追加することで、データセットを二重化する技術です。 これにより、本来のデータセットが失われた場合も、イレイジャーコードを用いて元々のデータを再構築することができます。 +DACは一部のバリディアムでも使われています。 DACは、データのコピーをオフラインに保存する信頼できるノードの集合です。 紛争が発生した場合、データを取得可能にすることがDACに求めらます。 DACのメンバーはさらに、当該データが実際に提供可能であることを証明するために、オンチェーン上で誓約を公開します。 一部のバリディアムでは、DACの代わりに、プルーフ・オブ・ステーク(PoS)のバリデータシステムを導入しています。 このシステムでは、すべてのユーザーがバリデータとなり、オフチェーンでデータを保存することが可能になります。 ただし、バリデータとなるためには、スマートコントラクトに対して担保となる「ボンド」を預け入れる必要があります。 バリデータがデータを秘匿するなどの悪意の行為が発生した場合、預け入れられたボンドを没収することができます。 プルーフ・オブ・ステークのデータ可用性委員会は、正直な行動に直接インセンティブが働くため、通常のDACよりもさらに安全になっています。 -ブロックチェーンにイレイジャーコードを実装することで、データセット全体のごく一部のみを用いてブロックに含まれるトランザクション全体を再構築することができるため、データの可用性を向上させることができます。 このシステムでは、悪意のブロック生成者がデータ隠し持ち攻撃を実行するには、ブロック全体の 50%以上を隠し持つ必要があります。 イレイジャーコードを実装しない場合、ブロック生成者は全体のうちわずか 1%のデータを秘匿するだけで悪意の行動が可能でした。 +## データ可用性とライトノード {#data-availability-and-light-nodes} -イレイジャーコーディングを実行したブロックの場合、ライトクライアントは、ブロック全体のデータがネットワーク上で公開済みであるという統計的な確証を得ることができます。 さらに、ライトクライアントは、フルノードに依存せずに、ブロックが可用性を持たないという警告を受け取ることができます。 +[ライトノード](/developers/docs/nodes-and-clients/light-clients)では、ブロックデータをダウンロードせずに、受信したブロックヘッダーの正確性を検証しなければなりません。 この軽量であることの代償として、フルノードのようにローカルでトランザクションを再実行してブロックヘッダーを独自に検証できないことがあります。 -[データ可用性証明の詳細。](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) +イーサリアムのライトノードでは、_同期委員会_に割り当てられたバリデータのランダムなセットである512台を信頼します。 同期委員会は、暗号署名を使用してヘッダー内のデータが正しいことをライトノードに通知するデータ可用性員会(DAC)として振る舞います。 同期委員会は毎日更新されます。 同期委員会は、暗号署名を使用してヘッダー内のデータが正しいことをライトノードに通知するデータ可用性員会(DAC)として振る舞います。 -### データ可用性委員会(DAC) {#data-availability-committees} +しかし、攻撃者が何らかの方法で悪意のあるブロックヘッダーをライトノードに渡し、それが正直な同期委員会によって承認されたブロックヘッダーであると信じ込ませることが_できた_場合に何が起こるでしょうか? このケースでは、攻撃者は無効なトランザクションを含め、ライトクライアントはブロック ヘッダーに要約されているすべての状態変更を個別にチェックしないため、それらを盲目的に受け入れてしまう可能性があります。 これを防ぐために、ライトノードでは、不正証明を使うことができます。 -ピュア・バリディアムでは、ブロックの生成者はトランザクションデータをオフチェーンで保存するため、ブロックチェーンはある程度一元化されます。 これにより、ブロックの生成者は無効なトランザクションを公開でき、トランザクションデータを秘匿することでロールアップの真の状態を隠すことができるため、ブロックチェーンの分散性やセキュリティが低下します。 +この不正証明は、次のように機能します。ネットワーク上でゴシップされている無効な状態遷移を認識したフルノードは、提案された状態遷移が特定のトランザクションのセットにおいて発生する可能性がありえないことを明示した小さなデータを素早く生成し、データをピアにブロードキャストします。 ライトノードでは、これらの不正証明を取得して無効なブロックヘッダーを破棄するために使用します。これにより、フルノードと同じ正直なチェーン上に確実に存在することができます。 -一部のバリディアムでは、ブロック生成者に対して、トランザクションデータを信頼できるユーザーで構成されたデータ可用性委員会(DAC)で保存するように指示することで、この問題を解決しようと試みています。 この DAC は、オフチェーンのデータのコピーをオフラインで保存した上で、紛争が発生した場合にはこのデータを提供することが義務付けられています。 DAC のメンバーはさらに、当該データが実際に提供可能であることを証明するために、オンチェーン上で誓約を公開します。 +これは、完全なトランザクションデータにアクセスできるフルノードに依存しています。 無向なブロックヘッダーをブロードキャストし、そのトランザクションデータ使用させることに失敗した攻撃者は、フルノードが不正証明を生成することを阻止する可能性もありえます。 フルノードは無効なブロックに対して警告を出せるかもしれませんが、証明を生成するためのデータが使用可能になっていないため、その警告を証明で裏付けることができません! -[データ可用性委員会(DAC)の詳細。](https://medium.com/starkware/data-availability-e5564c416424) +このデータ可用性問題の解決策がDASです。 ライトノードは、すべての状態データに対する非常に少量なチャンクをランダムにダウンロードして、そのサンプルを検証することで全てのデータセットが使用可能であることを確認します。 N個のチャンクをランダムにダウンロードした後にフルデータの可用性を誤って推測してしまう実際の可能性を計算できます ([100個のチャンクでは、確率は10のマイナス30乗](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html)であり、非常に低い確率です) 。 -### プルーフ・オブ・ステークを用いたデータ可用性委員会 {#proof-of-stake-data-availability-committees} +このシナリオでさえも、ほんの数バイトを保留する攻撃において、ランダムにデータリクエストを行うクライアントでは、気付くことが出来ない可能性があります。 イレイジャーコーディングでは、提案された状態変化をチェックするために使用するデータの小さな欠落を再構築することで解決します。 その後、再構築されたデータを使い不正証明を構築し、ライトノードが不正なヘッダーを受け入れるのを防ぎます。 -データ可用性委員会(DAC)は、バリディウムの従来のアプローチよりも優れていますが、信頼を前提にするという問題点は解消されていません。 つまり、DAC がブロック生成者と結託してトランザクションデータを秘匿しようとした場合には、問題が解決できません。 多くの場合 DAC の構成メンバーは少数であるため、共謀のリスクや、外部アクターが DAC を乗っ取る可能性が高まります。 +**注意:** DASと不正証明は、プルーフ・オブ・ステークにおけるイーサリアムのライトクライアントでは未実装ですが、ロードマップには含まれています。これは、ZK- SNARKベースの証明形式をとる可能性が最も高くなっています。 現在のライトクライアントでは、DAC形式に依存しています。このDAC形式では、同期委員会のIDを検証し、受信した署名付きブロックヘッダーを信頼します。 -一部のバリディアムでは、DAC の代わりに、プルーフ・オブ・ステーク(PoS)のバリデータシステムを導入しています。 このシステムでは、すべてのユーザーがバリデータとなり、オフチェーンでデータを保存することが可能になります。 ただし、バリデータとなるためには、スマートコントラクトに対して担保となる「ボンド」を預け入れる必要があります。 バリデータがデータを秘匿するなどの悪意の行為が発生した場合、預け入れられたボンドを没収することができます。 +## データ可用性とレイヤー2ロールアップ {#data-availability-and-layer-2-rollups} -プルーフ・オブ・ステークを用いた DAC は、通常の DAC よりもセキュリティが大幅に強化されます。 この方法は、許可なし、信頼なしであるだけでなく、正直な行動を促すためのインセンティブがうまく設計されています。 +[ロールアップ](/glossary/#rollups)などの[レイヤー2スケーリングソリューション](/layer-2/)では、トランザクションコストを削減したり、トランザクションをオフチェーンで処理することによりイーサリアムのスループットを向上させています。 ロールアップトランザクションは圧縮され、イーサリアムへバッチでポストされます。 バッチは、イーサリアム上の一つのトランザクション内にある数千の個々のオフチェーントランザクションに相当します。 この圧縮により、ベースレイヤーの混雑状態が軽減され、ユーザーの料金が削減されます。 -[プルーフ・オブ・ステークを用いた DAC の詳細。](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) +ただし、イーサリアムにポストされた「要約」トランザクションを信頼できるのは、提案された状態変更を自律的に検証することができ、すべての個別のオフチェーントランザクションを適用した結果を確認できる場合においてのみです。 ロールアップオペレータがこの検証に対してトランザクションデータを入手可能にしていなければ、ロールアップオペレータは、不正なデータを送信することができます。 -## イーサリアムと今後のデータ可用性 {#ethereum-and-the-future-of-data-availability} +[オプティミスティックロールアップ](/developers/docs/scaling/optimistic-rollups/)では、圧縮されたトランザクションデータをイーサリアムにポストし、独立した検証者がデータをチェックできるよう一定期間 (通常は7日間) 待機します。 検証者が問題を特定した場合、不正証明を生成し、それを使用してロールアップに対して異議申立ができます。 これにより、チェーンがロールバックされ、無効なブロックが除外されます。 これは、データが入手可能でないとできません。 現状のデータは、オンチェーンに永続的に存在する `CALLDATA`として永続的に入手可能になっています。 しかし、EIP-4844によって、ロールアップがトランザクションデータをCALLDATAの代わりに安価なBLOBストレージにポストできるようになる予定です。 これは永続ストレージではありません。 独立した検証者では、データがイーサリアムレイヤー1から削除される前の約1~3か月以内にBLOBへクエリを実行し、異議申立を提起しなければなりません。 データ可用性は、イーサリアムプロトコルによって、その短い一定の窓口期間内においてのみ保証されます。 それ以降は、イーサリアムエコシステム内の他のエンティティの責任になります。 どのノードでもDASを使い (すなわち、ブロブデータのランダムなサンプルをダウンロードすることによって) データ可用性を検証することができます。 -ロールアップでは、オフチェーンでの処理を通じてスループットの規模を拡大することができますが、この規模は、基盤となるブロックチェーンのデータスループットにより制限されます。 イーサリアムをデータ可用性レイヤーとして使用してロールアップを行うには、イーサリアムにおけるデータストレージおよび処理の能力を強化する必要があります。 +[ゼロ知識 (ZK) ロールアップ](/developers/docs/scaling/zk-rollups)では、[ゼロ知識有効性証明](/glossary/#zk-proof)を用いて状態遷移の正当性を保証できるため、トランザクションデータを投稿する必要はありません。 ただし、データ可用性に対して依然として問題があります。なぜなら、状態データにアクセスできない場合、ゼロ知識ロールアップの機能(またはロールアップとのやりとり)を保証することができないからです。 具体的には、オペレータがロールアップの状態に関する詳細を公開しない場合、ユーザーは自分の残高を確認できません。 さらに、新たに追加されたブロックに含まれる情報を用いて、状態アップデートを実行することもできません。 -[シャーディング](/upgrades/shard-chains/)は、イーサリアムの実行レイヤーにおいてデータのスループットを向上させるために提案されている方法です。 シャーディングでは、イーサリアムのネットワークを一定数のサブチェーンに分割し、各サブチェーンごとに専用のバリデータを割り振ります。 +## データ可用性と取り出し可能性の違いとは? {#data-availability-vs-data-retrievability} -バリデータは、割り当てられたシャードに対してのみフルノードを実行する必要があり、他のシャードについては軽量クライアントとして実行すればよくなります。 シャーディングでは、データを保存するジョブが異なるシャードに分割されるため、ロールアップに使用できるデータ領域を拡大することができます。 +データ可用性は、データの取り出し可能性とは異なる概念です。 フルノードが特定のブロックに関連付けられたトランザクションの完全なセットにアクセスし、検証できることを保証するのがデータ可用性です。 データが永久にアクセス可能である必要はありません。 -しかし、このようなデータのシャーディングは同時に、「特定のシャードを担当するバリデータたちが悪意を持ち、無効な状態遷移を処理しはじめたらどうなるのか」という新たな問題を生み出します。 このような問題が発生しうるのは、現在とは異なり、特定のトランザクションデータにフルノードがアクセスするのが不可能になるためです。 データのシャーディングを実装するには、各ノードが、ブロックをダウンロードすることなく、他のシャードにおけるデータの可用性を検証できるシステムを構築する必要があり、これを実現できなければシャーディングの目的を達成することはできません。 +一方、データの取り出し可能性とは、ブロックチェーンにおける_過去の情報_をノードが取り出すことができる機能を指します。 この履歴データは、新しいブロックの検証には不要です。ジェネシスブロックからフルノードを同期する場合、または特定の履歴に対するリクエストを処理する場合にのみ必要になります。 -この問題を解決するために、イーサリアムでは[ダンクシャーディング](https://notes.ethereum.org/@vbuterin/proto_danksharding_faq)などの新たなスケーリングソリューションが提案されています。これは、データ可用性をサンプリングすることで、ブログのコンテンツ全体をネットワークが確認したことを検証するというアプローチです。 このシステムでは、各ノードにおいてすべてのコンテンツを直接ダウンロードし、検証するという負荷を軽減することができます。 +イーサリアムのコアプロトコルでは、主に、データの取り出し可能性についてではなく、可用性について取り上げています。 データ取り出し可能性については、サードパーティが運用する少数のアーカイブノードによって提供したり、[ポータルネットワーク](https://www.ethportal.net/)等の分散ファイルストレージを使ってネットワーク全体に分配することができます。 ## 参考文献 {#further-reading} -- [データの可用性とは一体何ですか?](https://medium.com/blockchain-capital-blog/wtf-is-data-availability-80c2c95ded0f) +- [データ可用性とは一体何ですか?](https://medium.com/blockchain-capital-blog/wtf-is-data-availability-80c2c95ded0f) - [データ可用性とは?](https://coinmarketcap.com/alexandria/article/what-is-data-availability) -- [データ可用性プラットフォーム](https://blog.polygon.technology/the-data-availability-problem-6b74b619ffcc/) - [イーサリアムにおけるオフチェーンのデータ可用性に関する現況](https://blog.celestia.org/ethereum-off-chain-data-availability-landscape/) - [データ可用性チェックの入門](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html) -- [シャーディング+ DAS 提案とは何か?](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +- [シャーディング+ DAS提案とは何か?](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +- [データ可用性とイレイジャーコードディングの注意事項](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding#can-an-attacker-not-circumvent-this-scheme-by-releasing-a-full-unavailable-block-but-then-only-releasing-individual-bits-of-data-as-clients-query-for-them) +- [データ可用性委員会(DAC)](https://medium.com/starkware/data-availability-e5564c416424) +- [プルーフ・オブ・ステークを用いたデータ可用性委員会.](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) +- [データの取り出し可能性問題の解決策](https://notes.ethereum.org/@vbuterin/data_sharding_roadmap#Who-would-store-historical-data-under-sharding) diff --git a/public/content/translations/ja/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/translations/ja/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md index 678ca3a386c..bc4d7b2ce01 100644 --- a/public/content/translations/ja/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md +++ b/public/content/translations/ja/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -7,7 +7,7 @@ sidebarDepth: 2 マークル・パトリシア・ツリー(Patricia Merkle Trie)は、暗号的に認証されたデータ構造を提供し、すべての `(key, value)`バインディングを保存するために使用できます。 -マークル・パトリシア・ツリーは完全に決定的です。つまり、同じ `(key, value)` バインディングを持つツリーは、最後のバイトまで必ず同一です。 それらが同じルートハッシュを持ち、挿入、検索、削除において`O(log(n))`という優れた効率を発揮します。 さらに、レッド・ブラック・ツリーのような比較に基づく複雑な代替案よりも、理解やコーディングが簡単です。 +マークル・パトリシア・ツリーは、完全に決定的な構造であり、同じ`(key, value)`バインディングを持つツリーは、最後のバイトまで必ず同一になります。 それらが同じルートハッシュを持ち、挿入、検索、削除において`O(log(n))`という優れた効率を発揮します。 さらに、レッド・ブラック・ツリーのような比較に基づく複雑な代替案よりも、理解やコーディングが簡単です。 ## 前提知識 {#prerequisites} @@ -21,11 +21,11 @@ sidebarDepth: 2 [i_0, i_1 ... i_n, value] ``` -`i_0 ... i_n`は、アルファベットの記号列(通常は 2 進数または 16 進数)を表し、`value`はノードの最終値、スロット `i_0, i_1 ... i_n`の値は、`NULL`または他のノードへのポインタ(イーサリアムの場合はハッシュ値)です。 これにより、基本的な`(key, value)`型ストアが形成されます。 +`i_0 ... i_n`は、アルファベットの記号列(通常は2進数または16進数)を表し、`value`はノードの最終値、スロット `i_0, i_1 ... i_n`の値は、`NULL`または他のノードへのポインタ(イーサリアムの場合はハッシュ値)です。 これにより、基本的な`(key, value)`型ストアが形成されます。 -キーバリューセットに対する順序を永続化するために、基数ツリーのデータ構造を使用するとします。 ツリーで現在`dog`に対応する値を知るには、最初に`dog`のアルファベットの文字を変換します(`64 6f 67`)。次に、値が見つかるまで 64 6f 67 のパスをたどってツリーを下ります。 つまり、ツリーのルートノードを見つけるために、フラットなキーバリュー DB のルートハッシュを調べることから始めます。 これは、他のノードを指すキーの配列として表現されます。 インデックス`6`の値をキーとして使用し、フラットなキーバリュー DB で検索し、ノードを 1 レベル下げます。 次にインデックス`4`を選択して次の値を検索し、次にインデックス`6`を選択します。 `root -> 6 -> 4 -> 6 -> 15 -> 6 -> 7`のパスをたどり、ノードの値を参照して結果を返します。 +キーバリューセットに対する順序を永続化するために、基数ツリーのデータ構造を使用するとします。 ツリーで現在`dog`に対応する値を知るには、最初に`dog`のアルファベットの文字を変換します(`64 6f 67`)。次に、値が見つかるまで64 6f 67のパスをたどってツリーを下ります。 つまり、ツリーのルートノードを見つけるために、フラットなキーバリューDBのルートハッシュを調べることから始めます。 これは、他のノードを指すキーの配列として表現されます。 インデックス`6`の値をキーとして使用し、フラットなキーバリューDBで検索し、ノードを1レベル下げます。 次にインデックス`4`を選択して次の値を検索し、次にインデックス`6`を選択します。 `root -> 6 -> 4 -> 6 -> 15 -> 6 -> 7`のパスをたどり、ノードの値を参照して結果を返します。 -「ツリー」で何かを検索することと、下層のフラットなキーバリュー型「データベース」で検索することには、違いがあります。 どちらもキーバリューの配列を定義しますが、下層のデータベースは従来の 1 ステップのキー検索が実行できます。 ツリーでキーを検索するには、複数のデータベースを検索して上記の最終値を得る必要があります。 あいまいさをなくすために、後者を`path`としましょう。 +「ツリー」で何かを検索することと、下層のフラットなキーバリュー型「データベース」で検索することには、違いがあります。 どちらもキーバリューの配列を定義しますが、下層のデータベースは従来の1ステップのキー検索が実行できます。 ツリーでキーを検索するには、複数のデータベースを検索して上記の最終値を得る必要があります。 あいまいさをなくすために、後者を`path`としましょう。 基数ツリーの更新操作と削除操作は、次のように定義できます。 @@ -62,26 +62,26 @@ sidebarDepth: 2 return hash(newnode) ``` -「マークル」基数ツリーは、決定論的に生成された暗号ハッシュダイジェストを使用してノードをリンクすることによって構築されます。 このコンテンツアドレッシング(キーバリュー DB で `key == keccak256(rlp(value))`)は、格納されたデータの暗号認証を提供します。 特定のツリーのルートハッシュが公に知られている場合、特定の値をツリールートに結合する各ノードのハッシュ値を提供することにより、特定のパスに特定の値がツリーに含まれていることを証明できます。 +「マークル」基数ツリーは、決定論的に生成された暗号ハッシュダイジェストを使用してノードをリンクすることによって構築されます。 このコンテンツアドレッシング(キーバリューDBで`key == keccak256(rlp(value))`)は、格納されたデータの暗号完全性保証を提供します。 特定のツリーのルートハッシュが公に知られている場合、特定の値をツリールートに結合する各ノードのハッシュ値を提供することで、ツリーの内部にあるリーフデータにアクセスして、特定のパスに特定の値が存在していることを証明できます。 -攻撃者は、存在しない `(path, value)` のペアの証明を提供することは不可能です。これはルートハッシュは、結局のところその下のにあるすべてのハッシュ値に基づいているためです。 下層の変更はルートハッシュを変更します。 +攻撃者は、存在しない`(path, value)`のペアの証明を提供することは不可能です。これはルートハッシュは、結局のところその下のにあるすべてのハッシュ値に基づいているためです。 下層の変更はルートハッシュを変更します。 ハッシュについては、データの構造情報を圧縮して表現し、ハッシュ関数の事前イメージによって保護されていると考えることができます。 -基数ツリーの最小単位 (1 つの 16 進数文字、すなわち 4 ビットの 2 進数) を「ニブル」と呼びます。 上記のように一度に 1 つのニブルでパスを横断している間、ノードは最大で 16 の子を参照することができますが`value`要素を含んでいます。 このため、それらを長さのある配列として表します。 これらの 17 要素配列を「ブランチノード」と呼びます。 +基数ツリーの最小単位(1つの16 進数文字、すなわち4ビットの2進数)を「ニブル」と呼びます。 上記のように一度に1つのニブルでパスを横断している間、ノードは最大で16の子を参照することができますが`value`要素を含んでいます。 そのため、ノードは長さ17の配列として表されます。 これらの17要素配列を「ブランチノード」と呼びます。 ## マークル・パトリシア・ツリー {#merkle-patricia-trees} -基数ツリーには、1 つの大きな制限があります。それは、非効率的であることです。 イーサリアムのようにパスが 64 文字長 (`bytes32`単位のニブル数)の 1 つの`(path, value)`のバインディングを格納する場合、1 文字を格納する 1 レベルに、1 キロバイト以上のスペースが必要となり、また、それぞれの検索または削除には、64 ステップが必要です。 次に紹介するパトリシア・ツリーは、この問題を解決します。 +基数ツリーには、1つの大きな制限があります。それは、非効率的であることです。 イーサリアムのようにパスが64文字長 (`bytes32`単位のニブル数)の1つの`(path, value)`のバインディングを格納する場合、1文字を格納する1レベルに、1キロバイト以上のスペースが必要となり、また、それぞれの検索または削除には、64ステップが必要です。 次に紹介するパトリシア・ツリーは、この問題を解決します。 ### 最適化 {#optimization} マークル・パトリシア・ツリーのノードは、以下のいずれかです。 1. `NULL` (空文字列を表す) -2. `branch` 17 アイテムのノード `[ v0 ... v15, vt ]` -3. `leaf` 2 アイテムのノード `[ encodedPath, value ]` -4. `extension` 2 アイテムのノード `[ encodedPath, key ]` +2. `branch` 17アイテムのノード `[ v0 ... v15, vt ]` +3. `leaf` 2アイテムのノード `[ encodedPath, value ]` +4. `extension` 2アイテムのノード `[ encodedPath, key ]` -64 文字のパスでは、ツリーの最初のいくつかのレイヤーを横断した後、少なくとも下方の一部に分岐パスが存在しないノードに到達することは避けらません。 パスに沿って最大 15 の`NULL`のスパースノードを作成する必要性を回避するために、`[ encodedPath, key ]`フォームの`extension`ノードを設定することで下りへショートカットをします。この`encodedPath`は、次へスキップするための「部分パス」を含みます(後述のコンパクトエンコーディングを使用)。そして、`key` は、次の DB ルックアップ用です。 +64文字のパスでは、ツリーの最初のいくつかのレイヤーを横断した後、少なくとも下方の一部に分岐パスが存在しないノードに到達することは避けらません。 パスに沿って最大15の`NULL`のスパースノードを作成する必要性を回避するために、`[ encodedPath, key ]`フォームの`extension`ノードを設定することで下りへショートカットをします。この`encodedPath`は、次へスキップするための「部分パス」を含みます(後述のコンパクトエンコーディングを使用)。そして、`key` は、次のDBルックアップ用です。 `leaf`ノードは、`encodedPath`の最初のニブルのフラグでマークできます。パスは、前のノードのすべてのパスのフラグメントをエンコードし、`value`を直接調べることができます。 @@ -89,9 +89,9 @@ sidebarDepth: 2 パスをニブルで横断する場合、すべてのデータが`bytes`形式で格納されているため、ニブルの数が奇数になる場合があります。 例えば、ニブル`1`とニブル`01`を区別することはできません(両方とも`<01>`として格納される必要があります)。 奇数の長さを指定するには、部分パスの前にフラグをつけます。 -### 仕様: オプショナルターミネーターを使用した 16 進数シーケンスのコンパクトエンコーディング {#specification} +### 仕様: オプショナルターミネーターを使用した16進数シーケンスのコンパクトエンコーディング {#specification} -上記の*残りの部分パス長が偶数または奇数*かと、*リーフまたは拡張ノード*かを表すフラグは両方、あらゆる「2 アイテムのノード」の部分パスの最初のニブルにあります。 結果は、次の通りになります。 +上記の_残りの部分パス長が偶数または奇数_かと、_リーフまたは拡張ノード_かを表すフラグは両方、あらゆる「2アイテムのノード」の部分パスの最初のニブルにあります。 結果は、次の通りになります。 hex char bits | node type partial path length ---------------------------------------------------------- @@ -160,9 +160,9 @@ sidebarDepth: 2 ### ツリーの例 {#example-trie} -次の 4 つのパスバリューのペアを含むツリーが必要だとします。 `('do', 'verb')`、`('dog', 'puppy')`、`('doge', 'coin')`、`('horse', 'stallion')` +次の4つのパスバリューのペアを含むツリーが必要だとします。 `('do', 'verb')`、`('dog', 'puppy')`、`('doge', 'coin')`、`('horse', 'stallion')` -まず、パスと値(バリュー)の両方を`bytes`に変換します。 以下では、*paths*を実際のバイト表現 `<>`によって表示しています。しかし、 *values*は、分かりやすいように文字列として`''`で表示しています(実際は`bytes`) 。 +まず、パスと値(バリュー)の両方を`bytes`に変換します。 以下では、_paths_を実際のバイト表現 `<>`によって表示しています。しかし、 _values_は、分かりやすいように文字列として`''`で表示しています(実際は`bytes`) 。 ``` <64 6f> : 'verb' @@ -181,27 +181,27 @@ sidebarDepth: 2 hashE: [ <17>, [ <>, <>, <>, <>, <>, <>, [ <35>, 'coin' ], <>, <>, <>, <>, <>, <>, <>, <>, <>, 'puppy' ] ] ``` -1 つのノードが内部の別のノードから参照されるとき、含まれているのは、`H(rlp.encode(x))`であり、`H(x) = keccak256(x) if len(x) >= 32 else x`と`rlp.encode`は、[RLP](/developers/docs/data-structures-and-encoding/rlp)エンコーディング関数です。 +1つのノードが内部の別のノードから参照されるとき、含まれているのは、`H(rlp.encode(x))`であり、`H(x) = keccak256(x) if len(x) >= 32 else x`と`rlp.encode`は、[RLP](/developers/docs/data-structures-and-encoding/rlp)エンコーディング関数です。 -ツリーを更新するとき、新しく作成されたノードの長さが 32 以上の*場合*、キーバリューのペア`(keccak256(x), x)`を永続的なルックアップテーブルに格納する必要があることに注意してください。 ただし、ノードがそれよりも短い場合、関数 function f(x) = x は可逆であるため、何も格納する必要はありません。 +ツリーを更新するとき、新しく作成されたノードの長さが32以上の_場合_、キーバリューのペア`(keccak256(x), x)`を永続的なルックアップテーブルに格納する必要があることに注意してください。 ただし、ノードがそれよりも短い場合、関数 function f(x) = x は可逆であるため、何も格納する必要はありません。 ## イーサリアムのツリー {#tries-in-ethereum} イーサリアムの実行レイヤーのすべてのマークルツリーは、マークル・パトリシア・ツリーを使用しています。 -ブロックヘッダーに、これらのツリーの 3 つから、3 つのルートがあります。 +ブロックヘッダーに、これらのツリーの3つから、3つのルートがあります。 1. stateRoot (ステートルート) 2. transactionsRoot (トランザクションルート) 3. receiptsRoot (レシートルート) -### ステート(状態)ツリー {#state-trie} +### ステート(状態)ツリー {#state-trie} -グローバルの状態ツリーが 1 つあり、クライアントがブロックを処理するたびに更新されます。 その中では、 `path`は常に`keccak256(ethereumAddress)`であり、`value`は常に`rlp(ethereumAccount)`です。 より具体的には、イーサリアムの`account`は、4 つのアイテムの配列`[nonce,balance,storageRoot,codeHash]`です。 この点において、この`storageRoot`が、もう一つのパトリシア・ツリーであることは非常に重要です。 +グローバルの状態ツリーが1つあり、クライアントがブロックを処理するたびに更新されます。 その中では、 `path`は常に`keccak256(ethereumAddress)`であり、`value`は常に`rlp(ethereumAccount)`です。 より具体的には、イーサリアムの`account`は、4つのアイテムの配列`[nonce,balance,storageRoot,codeHash]`です。 この点において、この`storageRoot`が、もう一つのパトリシア・ツリーであることは非常に重要です。 ### ストレージツリー {#storage-trie} -ストレージツリーは、 *すべて*のコントラクトデータが存在する場所です。 アカウントごとに個別のストレージツリーがあります。 与えられたアドレスにある、特定のストレージポジションの値を取得するには、ストレージアドレスであるストレージに格納されたデータの整数のポジションと、ブロック ID が必要です。 これらは、JSON-RPC API で定義されている`eth_getStorageAt`に引数として渡すことができます。アドレス`0x295a70b2de5e3953354a6a8344e616ed314d7251`ストレージスロット 0 のデータを取得する例は、次のようになります。 +ストレージツリーは、 _すべて_のコントラクトデータが存在する場所です。 アカウントごとに個別のストレージツリーがあります。 与えられたアドレスにある、特定のストレージポジションの値を取得するには、ストレージアドレスであるストレージに格納されたデータの整数のポジションと、ブロックIDが必要です。 これらは、JSON-RPC APIで定義されている`eth_getStorageAt`に引数として渡すことができます。アドレス`0x295a70b2de5e3953354a6a8344e616ed314d7251`ストレージスロット0のデータを取得する例は、次のようになります。 ``` curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 @@ -210,13 +210,13 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ ``` -ストレージの他の要素を取得するのは、ストレージツリーのポジションを最初に計算する必要があるため、より複雑になります。 ポジションは、アドレスとストレージポジションの`keccak256`ハッシュとして計算され、両方とも長さ 32 バイト長になるように左からゼロが足されます。 例えば、アドレス `0x391694e7e0b0cce554cb130d723a9d27458f9298`のストレージスロット 1 のデータの位置は、次のようになります。 +ストレージの他の要素を取得するのは、ストレージツリーのポジションを最初に計算する必要があるため、より複雑になります。 ポジションは、アドレスとストレージポジションの`keccak256`ハッシュとして計算され、両方とも長さ32バイト長になるように左からゼロが足されます。 例えば、アドレス `0x391694e7e0b0cce554cb130d723a9d27458f9298`のストレージスロット1のデータの位置は、次のようになります。 ``` keccak256(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001")) ``` -Geth コンソールでは、これは次のように計算できます。 +Gethコンソールでは、これは次のように計算できます。 ``` > var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" @@ -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`は、マイニングされたブロックのインデックスです。 レシートツリーは更新されることはありません。 トランザクションと同様に、現在のレシートとレガシーのレシートがあります。 レシートツリーで特定のレシートをクエリーするには、ブロックのトランザクションのインデックス、レシートのペイロード、トランザクションタイプが必要となります。 返されるレシートは、`transaction type`と`transaction payload`の集まったものとして定義される`Receipt`タイプまたは、`rlp([status, cumulativeGasUsed, logsBloom, logs])`として定義される`LegacyReceipt`タイプとなります。 +すべてのブロックは、それぞれのレシートツリーを持っています。 ここでの`path`は、`rlp(transactionIndex)`です。 `transactionIndex`は、マイニングされたブロックのインデックスです。 レシートツリーは更新されることはありません。 トランザクションと同様に、現在のレシートとレガシーのレシートがあります。 レシートツリーで特定のレシートをクエリーするには、ブロックのトランザクションのインデックス、レシートのペイロード、トランザクションタイプが必要となります。 返されるレシートは、`TransactionType`と`ReceiptPayload`の集まったものとして定義される`Receipt`タイプまたは、`rlp([status, cumulativeGasUsed, logsBloom, logs])`として定義される`LegacyReceipt`タイプとなります。 詳細については、[EIP 2718](https://eips.ethereum.org/EIPS/eip-2718)のドキュメントを参照してください。 diff --git a/public/content/translations/ja/developers/docs/data-structures-and-encoding/rlp/index.md b/public/content/translations/ja/developers/docs/data-structures-and-encoding/rlp/index.md index 76f5161320f..3f8c550c4b7 100644 --- a/public/content/translations/ja/developers/docs/data-structures-and-encoding/rlp/index.md +++ b/public/content/translations/ja/developers/docs/data-structures-and-encoding/rlp/index.md @@ -5,18 +5,18 @@ lang: ja sidebarDepth: 2 --- -再帰的な長さのプレフィックス(RLP)シリアライゼーションは、イーサリアムの実行クライアントで広く使われています。 RLP はスペース効率に優れたフォーマットで、ノード間のデータ転送を標準化します。 RLP の目的は、任意のネストされたバイナリデータの配列をエンコード(符号化)することです。また、RLP はイーサリアムの実行レイヤーのオブジェクトのシリアライズに用いられる主要なエンコーディング方式です。 RLP の唯一の目的は、構造をエンコードすることです。特定のデータ型(例: 文字列型、浮動小数点型など)のエンコーディングは、上位のプロトコルが行いますが、正の RLP 整数は、先頭にゼロのないビッグエンディアン・バイナリ形式で表されます(そのため、整数値ゼロは空のバイト配列となります) 。 先頭がゼロのデシリアル化された正の整数は、無効として扱われます。 文字列長の整数表現は、ペイロード内の整数と同様にこの方法でエンコードする必要があります。 +再帰的な長さのプレフィックス(RLP)シリアライゼーションは、イーサリアムの実行クライアントで広く使われています。 RLPはスペース効率に優れたフォーマットで、ノード間のデータ転送を標準化します。 RLPの目的は、任意のネストされたバイナリデータの配列をエンコード(符号化)することです。また、RLPはイーサリアムの実行レイヤーのオブジェクトのシリアライズに用いられる主要なエンコーディング方式です。 RLPの唯一の目的は、構造をエンコードすることです。特定のデータ型(例: 文字列型、浮動小数点型など)のエンコーディングは、上位のプロトコルが行いますが、正のRLP整数は、先頭にゼロのないビッグエンディアン・バイナリ形式で表されます(そのため、整数値ゼロは空のバイト配列となります) 。 先頭がゼロのデシリアル化された正の整数は、無効として扱われます。 文字列長の整数表現は、ペイロード内の整数と同様にこの方法でエンコードする必要があります。 -詳細については、[イーサリアムイエローペーパー (付録 B)](https://ethereum.github.io/yellowpaper/paper.pdf#page=19)を参照してください。 +詳細については、[イーサリアムイエローペーパー (付録B)](https://ethereum.github.io/yellowpaper/paper.pdf#page=19)を参照してください。 -RLP を使用して辞書をエンコードするのに、次の 2 つの正規の方法があります。 +RLPを使用して辞書をエンコードするのに、次の2つの正規の方法があります。 - `[[k1,v1],[k2,v2]...]`のように辞書順にキーを並べて使用する - イーサリアムのように上位レベルのパトリシア・ツリー・エンコーディングを使用する ## 定義 {#definition} -RLP エンコーディング関数は、アイテムを取ります。 アイテムは次のように定義されます。 +RLPエンコーディング関数は、アイテムを取ります。 アイテムは次のように定義されます。 - 文字列型(すなわちバイト配列) はアイテム - アイテムのリストはアイテム @@ -30,58 +30,58 @@ RLP エンコーディング関数は、アイテムを取ります。 アイテ 本ページのこれ以降では、「文字列」は「あるバイト数のバイナリデータ」を意味することに注意してください。特別なエンコーディングは使用されておらず、文字列が何を指すのかの知識は必要ありません。 -RLP エンコーディングは以下のように定義されます。 +RLPエンコーディングは以下のように定義されます。 -- `[0x00, 0x7f]`(10 進数`[0, 127]`)の範囲にある 1 バイトは、そのバイト自体が RLP エンコーディングとなる。 -- その他、文字列が 0 ~ 55 バイトの場合、RLP エンコーディングは値が**0x80**(10 進数 128)に、文字列の長さを足した 1 バイト、続いて文字列で構成される。 したがって、最初の 1 バイトの範囲は`[0x80, 0xb7]`(10 進数`[128, 183]`)となる。 -- 文字列の長さが 55 バイトを超える場合、RLP エンコーディングは、**0xb7**(10 進数 183)にバイナリ形式の文字列長をバイト数を加えた 1 バイト、続けて文字列の長さ、次に文字列で構成される。 例えば、1024 バイトの長さの文字列は、`\xb9\x04\x00` (10 進数`185, 4, 0`)にエンコードされ、その後文字列となる。 ここでは、最初の 1 バイトとして`0xb9` (183 + 2 = 185)、次に実際の文字列の長さを示す 2 バイトの`0x0400` (10 進数 1024)が続く。 したがって、最初の 1 バイトの範囲は、`[0xb8, 0xbf]` (10 進数`[184, 191]`)となる。 -- リストの全ペイロード(RLP エンコードされるすべてのアイテムを合わせた長さ)が、0 ~ 55 バイトである場合、RLP エンコーディングは、**0xc0**にリストの長さを加えた 1 バイト、続けてアイテムを RLP エンコーディングして続けたもので構成される。 したがって、最初のバイトの範囲は`[0xc0, 0xf7]` (10 進数`[192, 247]`)となる。 -- リストの全ペイロードが、55 バイトを超える場合、RLP エンコーディングは、**0xf7**にバイナリ形式のペイロードの長さのバイト数を加えた 1 バイト、次にペイロードの長さ、アイテムの RLP エンコーディングしたものを続けたもので構成される。 したがって、最初のバイトの範囲は、`[0xf8, 0xff]` (10 進数`[248, 255]`)となる 。 +- `[0x00, 0x7f]`(10進数`[0, 127]`)の範囲にある1バイトは、そのバイト自体がRLPエンコーディングとなる。 +- その他、文字列が0~55バイトの場合、RLPエンコーディングは値が**0x80**(10進数128)に、文字列の長さを足した1バイト、続いて文字列で構成される。 したがって、最初の1バイトの範囲は`[0x80, 0xb7]`(10進数`[128, 183]`)となる。 +- 文字列の長さが55バイトを超える場合、RLPエンコーディングは、**0xb7**(10進数 183)にバイナリ形式の文字列長をバイト数を加えた1バイト、続けて文字列の長さ、次に文字列で構成される。 例えば、1024バイトの長さの文字列は、`\xb9\x04\x00` (10進数`185, 4, 0`)にエンコードされ、その後文字列となる。 ここでは、最初の1バイトとして`0xb9` (183 + 2 = 185)、次に実際の文字列の長さを示す2バイトの`0x0400` (10進数1024)が続く。 したがって、最初の1バイトの範囲は、`[0xb8, 0xbf]` (10進数`[184, 191]`)となる。 +- リストの全ペイロード(例えば、RLPエンコードされるすべてのアイテムを合わせた長さ)が0~55バイトである場合、RLPエンコーディングは、**0xc0**にペイロードの長さを加えた1バイト、続けてアイテムをRLPエンコーディングして続けたもので構成される。 したがって、最初のバイトの範囲は`[0xc0, 0xf7]` (10進数`[192, 247]`)となる。 +- リストの全ペイロードが、55バイトを超える場合、RLPエンコーディングは、**0xf7**にバイナリ形式のペイロードの長さのバイト数を加えた1バイト、次にペイロードの長さ、アイテムのRLPエンコーディングしたものを続けたもので構成される。 したがって、最初のバイトの範囲は、`[0xf8, 0xff]` (10進数`[248, 255]`)となる 。 コードでは、これは次のようになります。 ```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} - 文字列「dog」= [ 0x83, 'd', 'o', 'g' ] -- リスト [ "cat", "dog" ] = `[ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]` +- リスト [ "cat", "dog" ] = `[ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]` - 空文字列 ('null') = `[ 0x80 ]` - 空リスト = `[ 0xc0 ]` -- 整数 0 = `[ 0x80 ]` -- 整数 0 ('\\x00')のエンコード = `[ 0x00 ]` -- 整数 15 ('\\x0f')エンコード = `[ 0x0f ]` -- 整数 1024 ('\\x04\\x00')のエンコード = `[ 0x82, 0x04, 0x00 ]` -- 3 の[集合論的表現](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers) `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]` +- 整数0 = `[ 0x80 ]` +- 整数0 ('\\x00')のエンコード = `[ 0x00 ]` +- 整数15 ('\\x0f')エンコード = `[ 0x0f ]` +- 整数1024 ('\\x04\\x00')のエンコード = `[ 0x82, 0x04, 0x00 ]` +- 3の[集合論的表現](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers) `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]` - 文字列「Lorem ipsum dolor sit amet, consectetur adipisicing elit」= `[ 0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... , 'e', 'l', 'i', 't' ]` -## RLP デコードディング {#rlp-decoding} +## RLPデコーディング {#rlp-decoding} -RLP エンコーディング規則とプロセスに従って、RLP デコードの入力は、バイナリデータ配列とみなされます。 RLP のデコーディングプロセスは、次のようになります。 +RLPエンコーディング規則とプロセスに従って、RLPデコードの入力は、バイナリデータ配列とみなされます。 RLPのデコーディングプロセスは、次のようになります。 1. 入力データの最初のバイト(プレフィックス) とデコーディングするデータ型に従った実際のデータ長とオフセット @@ -91,15 +91,15 @@ RLP エンコーディング規則とプロセスに従って、RLP デコード その中で、データ型とオフセットのデコード規則は次のようになります。 -1. 最初の 1 バイト(プレフィックス)の範囲が [0x00, 0x7f]の場合は、データは文字列型で、文字列はそのバイトそのもの。 +1. 最初の1バイト(プレフィックス)の範囲が [0x00, 0x7f]の場合は、データは文字列型で、文字列はそのバイトそのもの。 -2. 最初の 1 バイトの範囲が[0x80, 0xb7]の場合、データは文字列型。最初の 1 バイト、続いて最初の 1 バイトから 0x80 を引いた長さの文字列となる。 +2. 最初の1バイトの範囲が[0x80, 0xb7]の場合、データは文字列型。最初の1バイト、続いて最初の1バイトから 0x80 を引いた長さの文字列となる。 -3. 最初の 1 バイトの範囲が[0xb8, 0xbf]の場合は、データは文字列型。最初の 1 バイト、続いて最初の 1 バイトから 0xb7 を引いた文字列長(バイトで表す)、最後に文字列となる。 +3. 最初の1バイトの範囲が[0xb8, 0xbf]の場合は、データは文字列型。最初の1バイト、続いて最初の1バイトから0xb7を引いた文字列長(バイトで表す)、最後に文字列となる。 -4. 最初の 1 バイトの範囲が[0xc0, 0xf7]の場合は、データはリスト型。最初の 1 バイト、続いて全ペイロードが最初のバイトから 0xc0 を引いたものに等しい、リストの全アイテムを RLP エンコーディングして続けたものとなる。 +4. 最初の1バイトの範囲が[0xc0, 0xf7]の場合は、データはリスト型。最初の1バイト、続いて全ペイロードが最初のバイトから0xc0を引いたものに等しい、リストの全アイテムをRLPエンコーディングして続けたものとなる。 -5. 最初の 1 バイトの範囲が[0xf8, 0xff]の場合は、データはリスト型。最初の 1 バイト、続いてリストの長さが最初の 1 バイトから 0xf7 を引いたリストの全ペイロード、最後にリストのすべてのアイテムを RLP エンコーディングして続けたものとなる。 +5. 最初の1バイトの範囲が[0xf8, 0xff]の場合は、データはリスト型。最初の1バイト、続いてリストの長さが最初の1バイトから0xf7を引いたリストの全ペイロード、最後にリストのすべてのアイテムをRLPエンコーディングして続けたものとなる。 コードでは、これは次のようになります。 @@ -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,15 +145,14 @@ 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} -- [イーサリアムの RLP](https://medium.com/coinmonks/data-structure-in-ethereum-episode-1-recursive-length-prefix-rlp-encoding-decoding-d1016832f919) +- [イーサリアムのRLP](https://medium.com/coinmonks/data-structure-in-ethereum-episode-1-recursive-length-prefix-rlp-encoding-decoding-d1016832f919) - [イーサリアムの内部: RLP](https://medium.com/coinmonks/ethereum-under-the-hood-part-3-rlp-decoding-df236dc13e58) -- [Coglio, A. (2020). ACL2 のイーサリアムの再帰的な長さのプレフィックス arXiv preprint arXiv:2009.13769.](https://arxiv.org/abs/2009.13769) +- [Coglio, A. (2020). ACL2のイーサリアムの再帰的な長さのプレフィックス arXiv preprint arXiv:2009.13769.](https://arxiv.org/abs/2009.13769) ## 関連トピック {#related-topics} diff --git a/public/content/translations/ja/developers/docs/data-structures-and-encoding/ssz/index.md b/public/content/translations/ja/developers/docs/data-structures-and-encoding/ssz/index.md index 530622ae987..78f09c33af8 100644 --- a/public/content/translations/ja/developers/docs/data-structures-and-encoding/ssz/index.md +++ b/public/content/translations/ja/developers/docs/data-structures-and-encoding/ssz/index.md @@ -5,13 +5,13 @@ lang: ja sidebarDepth: 2 --- -**シンプル・シリアライゼーション(SSZ)**とは、ビーコンチェーンで使用されているシリアライゼーション方法です。 これは、ピア検出プロトコルを除くコンセンサスレイヤー全体の実行レイヤーで使われた RLP シリアライゼーションに取って代わるものです。 SSZ は決定的であり、効率的にマークル化するように設計されています。 SSZ には、次の 2 つのコンポーネントがあると見なすことができます。シリアライゼーション・スキームと、シリアル化されたデータ構造を効率的に処理するように設計されたマークライゼーション・スキームです。 +**シンプル・シリアライゼーション(SSZ)**とは、ビーコンチェーンで使用されているシリアライゼーション方法です。 これは、ピア検出プロトコルを除くコンセンサスレイヤー全体の実行レイヤーで使われたRLPシリアライゼーションに取って代わるものです。 SSZは決定的であり、効率的にマークル化するように設計されています。 SSZには、次の2つのコンポーネントがあると見なすことができます。シリアライゼーション・スキームと、シリアル化されたデータ構造を効率的に処理するように設計されたマークライゼーション・スキームです。 ## シンプル・シリアライゼーション(SSZ) {#how-does-ssz-work} ### シリアライゼーション {#serialization} -シンプル・シリアライゼーション(SSZ)は自己記述型ではなく、むしろ事前に知らされているスキーマに依存するシリアライゼーション・スキームです。 SSZ シリアル化の目的は、任意の複雑なオブジェクトをバイト列で表すことです。 「基本型」の場合は、非常に簡単な処理です。 エレメントは、単に 16 進数のバイトに変換されます。 基本型には、次のものがあります。 +シンプル・シリアライゼーション(SSZ)は自己記述型ではなく、むしろ事前に知らされているスキーマに依存するシリアライゼーション・スキームです。 SSZシリアル化の目的は、任意の複雑なオブジェクトをバイト列で表すことです。 「基本型」の場合は、非常に簡単な処理です。 エレメントは、単に16進数のバイトに変換されます。 基本型には、次のものがあります。 - 符号なし整数型 - ブール型 @@ -44,7 +44,7 @@ sidebarDepth: 2 ``` -`serialized`は、次のような構造になります。 ここでは、4 ビットにしていますが、実際は 32 ビットに付け足されます。また、分かりやすくするために `int`(整数型)で表しています。 +`serialized`は、次のような構造になります。 ここでは、4ビットにしていますが、実際は32ビットに付け足されます。また、分かりやすくするために `int`(整数型)で表しています。 ``` [37, 0, 0, 0, 55, 0, 0, 0, 16, 0, 0, 0, 22, 0, 0, 0, 1, 2, 3, 4] @@ -81,17 +81,17 @@ sidebarDepth: 2 可変長型の実際の値は、シリアル化されたオブジェクトの末尾にあるヒープに格納され、オフセット値はフィールドの順序付けられたリストの正しい位置に格納されます。 -また、特別な対応が必要となる特殊ケースもあります。例えば、`BitList`型のように、シリアル化時に長さの上限を追加し、デシリアル化時に削除する必要があるような型です。 詳細については、[SSZ の仕様](https://github.com/ethereum/consensus-specs/blob/dev/ssz/simple-serialize.md)を参照してください。 +また、特別な対応が必要となる特殊ケースもあります。例えば、`BitList`型のように、シリアル化時に長さの上限を追加し、デシリアル化時に削除する必要があるような型です。 詳細については、[SSZの仕様](https://github.com/ethereum/consensus-specs/blob/dev/ssz/simple-serialize.md)を参照してください。 ### デシリアライゼーション {#deserialization} このオブジェクトをデシリアライズするには、スキーマが必要になります。 スキーマに、シリアル化されたデータの正確なレイアウトを定義することで、特定の各要素をバイトのブロブ(blob)から適切な型、値、サイズ、位置を持つ意味のあるオブジェクトにデシリアル化できるようにします。 どれがオフセット値でどれが実際の値であるか伝えるのは、デシリアライザーです。 全フィールド名は、オブジェクトがシリアル化されたときに消えますが、スキーマによりデシリアライゼーション時に再インスタンス化されます。 -SSZ に関するインタラクティブな説明については、[ssz.dev](https://www.ssz.dev/overview)を参照してください。 +SSZに関するインタラクティブな説明については、[ssz.dev](https://www.ssz.dev/overview)を参照してください。 ## マークライゼーション(Merkleization) {#merkleization} -この SSZ でシリアル化されたオブジェクトは、次にマークル化でき、つまり同データをマークルツリー表現に変換できます。 最初に、シリアル化されたオブジェクトの 32 バイトのチャンク数が決定されます。 これらは、ツリー (木) の「リーフ (葉) 」です。 リーフの合計数が、2 の冪乗でなければなりません。これにより、リーフをまとめてハッシュ化すると、最終的に単一のハッシュ・ツリー・ルートが生成されます。 2 の冪乗にならない場合は、32 バイトのゼロを持つリーフが追加されます。 図式化すると次のようになります。 +このSSZでシリアル化されたオブジェクトは、次にマークル化でき、つまり同データをマークルツリー表現に変換できます。 最初に、シリアル化されたオブジェクトの32バイトのチャンク数が決定されます。 これらは、ツリー (木) の「リーフ (葉) 」です。 リーフの合計数が、2の冪乗でなければなりません。これにより、リーフをまとめてハッシュ化すると、最終的に単一のハッシュ・ツリー・ルートが生成されます。 2の冪乗にならない場合は、32バイトのゼロを持つリーフが追加されます。 図式化すると次のようになります。 ``` hash tree root @@ -107,9 +107,9 @@ SSZ に関するインタラクティブな説明については、[ssz.dev](htt leaf1 leaf2 leaf3 leaf4 ``` -また、上の例のように自然にツリーのリーフが均等とならない場合があります。 例えば、リーフ 4 (leaf4)が複数の要素を持ちマークルツリーに「深さ」を追加する必要があるコンテナだとすると、不均一なツリーになる場合があります。 +また、上の例のように自然にツリーのリーフが均等とならない場合があります。 例えば、リーフ4 (leaf4)が複数の要素を持ちマークルツリーに「深さ」を追加する必要があるコンテナだとすると、不均一なツリーになる場合があります。 -これらのツリーの要素をリーフ X (leaf X)やノード X (node X)などと呼ぶ代わりに、ルートを 1 (root=1) として開始し、左から右へ各レベルごとにカウントする一般化インデックスを付与することができます。 先で述べたインデックスが、この一般化インデックスです。 シリアル化されたリストの各要素は、`2**depth + idx`に等しい一般化インデックスを持ちます。ここで、idx は、シリアル化されたオブジェクトのゼロインデックスの位置です。深さはマークルツリーのレベル数で、要素 (リーフ) の数の平方根として決定することができます。 +これらのツリーの要素をリーフX(leaf X)やノードX(node X)などと呼ぶ代わりに、ルートを1(root=1)として開始し、左から右へ各レベルごとにカウントする一般化インデックスを付与することができます。 先で述べたインデックスが、この一般化インデックスです。 シリアル化されたリストの各要素は、`2**depth + idx`に等しい一般化インデックスを持ちます。ここで、idxは、シリアル化されたオブジェクトのゼロインデックスの位置です。深さはマークルツリーのレベル数で、要素(リーフ)の数である2を底とする対数として決定することができます。 ## 一般化インデックス {#generalized-indices} @@ -128,7 +128,7 @@ SSZ に関するインタラクティブな説明については、[ssz.dev](htt 特定の要素を表す一般化インデックスのリストを提供することで、ハッシュ・ツリー・ルートに対して検証することができます。 このルートは、受け入れられた真実のバージョンです。 提供されたすべてのデータは、(一般化インデックスによって決定された)マークルツリー内の適切な場所に挿入し、ルートが一定のままであることを確認することで、真実性に対して検証することができます。 [こちら](https://github.com/ethereum/consensus-specs/blob/dev/ssz/merkle-proofs.md#merkle-multiproofs)の仕様書に、一般化インデックスの特定のセットの内容を検証するために必要なノードの最小セットを計算する方法として、関数が示されています。 -例えば、下記のツリーのインデックス 9 のデータを検証する場合、インデックス 8、9、5、3、1 のデータのハッシュが必要です。 (8,9)のハッシュは、(4)のハッシュと等しい必要があり、これは 5 とハッシュして 2 を生成し、3 とハッシュしてツリールート 1 を生成します。 もし、9 に誤ったデータが提供された場合、ルートが変更されることになります。これを検知し、ブランチの検証が失敗します。 +例えば、下記のツリーのインデックス9のデータを検証する場合、インデックス8、9、5、3、1のデータのハッシュが必要です。 (8,9)のハッシュは、(4)のハッシュと等しい必要があり、これは5とハッシュして2を生成し、3とハッシュしてツリールート1を生成します。 もし、9に誤ったデータが提供された場合、ルートが変更されることになります。これを検知し、ブランチの検証が失敗します。 ``` * = data required to generate proof @@ -144,6 +144,6 @@ SSZ に関するインタラクティブな説明については、[ssz.dev](htt - [イーサリアムのアップグレード: SSZ](https://eth2book.info/altair/part2/building_blocks/ssz) - [イーサリアムのアップグレード: マークライゼーション](https://eth2book.info/altair/part2/building_blocks/merkleization) -- [SSZ の実装](https://github.com/ethereum/consensus-specs/issues/2138) -- [SSZ 計算器](https://simpleserialize.com/) +- [SSZの実装](https://github.com/ethereum/consensus-specs/issues/2138) +- [SSZ計算器](https://simpleserialize.com/) - [SSZ.dev](https://www.ssz.dev/) diff --git a/public/content/translations/ja/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md b/public/content/translations/ja/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md index 790f13cd823..d96a9f05263 100644 --- a/public/content/translations/ja/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md +++ b/public/content/translations/ja/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md @@ -5,7 +5,7 @@ lang: ja sidebarDepth: 2 --- -アプリをイーサリアムで動作させるために、web3.js ライブラリが提供する Web3 オブジェクトを使用できます。 これは、内部で RPC 呼び出しを介してローカルノードと通信します。 [Web3](https://github.com/ethereum/web3.js/)は、RPC レイヤーを公開しているイーサリアムノードと連携します。 +アプリをイーサリアムで動作させるために、web3.jsライブラリが提供するWeb3オブジェクトを使用できます。 これは、内部でRPC呼び出しを介してローカルノードと通信します。 [Web3](https://github.com/ethereum/web3.js/)は、RPCレイヤーを公開しているイーサリアムノードと連携します。 `web3`には、`eth`オブジェクト「web3.eth」が含まれています。 @@ -25,28 +25,28 @@ fs.readFile("keyfile.json", (err, data) => { */ ``` -このドキュメントは、**バージョン 3**の Web3 シークレットストレージの定義です。 +このドキュメントは、**バージョン3**のWeb3シークレットストレージの定義です。 ## 定義 {#definition} -ファイルのエンコードとデコードは、暗号化アルゴリズムが AES-128-CBC に固定されなくなったことを除いて(AES-128-CTR が最小要件になりました)、実際にはバージョン 1 からほとんど変更されていません 。 ほとんどの意味またはアルゴリズムは、バージョン 1 と似ていますが、`mac`を除きます。これは、完全な`ciphertext`と共に導出鍵の左から 2 番目の 16 バイトを連結した SHA3 (keccak-256) として指定されます。 +ファイルのエンコードとデコードは、暗号化アルゴリズムがAES-128-CBCに固定されなくなったことを除いて(AES-128-CTR が最小要件になりました)、実際にはバージョン1からほとんど変更されていません 。 ほとんどの意味またはアルゴリズムは、バージョン1と似ていますが、`mac`を除きます。これは、完全な`ciphertext`と共に導出鍵の左から2番目の16バイトを連結したSHA3 (keccak-256) として指定されます。 -秘密鍵ファイルは、`~/.web3/keystore` (Unix のようなシステム環境)と `~/AppData/Web3/keystore` (Windows 環境)に直接保存されます。 任意の名前を付けることができますが、適切な規則としては`.json`とすることが望ましいです。ここで、``は、秘密鍵(秘密鍵のアドレスのプライバシーを保護するプロキシ)に付与された 128 ビットの UUID です。 +秘密鍵ファイルは、`~/.web3/keystore` (Unixのようなシステム環境)と `~/AppData/Web3/keystore` (Windows環境)に直接保存されます。 任意の名前を付けることができますが、適切な規則としては`.json`とすることが望ましいです。ここで、``は、秘密鍵(秘密鍵のアドレスのプライバシーを保護するプロキシ)に付与された128ビットのUUIDです。 -これらのファイルはすべて、関連付けられたパスワードを持っています。 ある`.json`ファイルの秘密鍵を導出するには、まずファイルの暗号化鍵を導出します。これはファイルのパスワードを取得し、それを`kdf`鍵で記述された鍵導出関数に渡すことによって行われます。 KDF 関数への KDF 依存の静的パラメータおよび動的パラメータは、`kdfparams`鍵に記述されています。 +これらのファイルはすべて、関連付けられたパスワードを持っています。 ある`.json`ファイルの秘密鍵を導出するには、まずファイルの暗号化鍵を導出します。これはファイルのパスワードを取得し、それを`kdf`鍵で記述された鍵導出関数に渡すことによって行われます。 KDF関数へのKDF依存の静的パラメータおよび動的パラメータは、`kdfparams`鍵に記述されています。 -次に示される PBKDF2 は、最小限に準拠したすべての実装でサポートされている必要があります。 +次に示されるPBKDF2は、最小限に準拠したすべての実装でサポートされている必要があります。 - `kdf`: `pbkdf2` -PBKDF2 の場合、kdfparams は次を含みます。 +PBKDF2の場合、kdfparamsは次を含みます。 - `prf`: `hmac-sha256`でなければならない(将来的には拡張される場合ががある) - `c`: 反復回数 -- `salt`: PBKDF に渡されるソルト -- `dklen`: 導出鍵の長さ (32 以上でなければならない) +- `salt`: PBKDFに渡されるソルト +- `dklen`: 導出鍵の長さ (32以上でなければならない) -ファイルの鍵が導出されたら、MAC の導出によってそれを検証する必要があります。 MAC は、`ciphertext`鍵の内容を持つ導出鍵の左から 2 番目の 16 バイトの連結として形成されたバイト配列の SHA3 (keccak-256) ハッシュとして計算されるべきです。 すなわち次のようになります。 +ファイルの鍵が導出されたら、MACの導出によってそれを検証する必要があります。 MACは、`ciphertext`鍵の内容を持つ導出鍵の左から2番目の16バイトの連結として形成されたバイト配列のSHA3 (keccak-256) ハッシュとして計算されるべきです。 すなわち次のようになります。 ```js KECCAK(DK[16..31] ++ ) @@ -58,15 +58,15 @@ KECCAK(DK[16..31] ++ ) ファイルの鍵が検証された後、暗号テキスト(ファイル内の `ciphertext`鍵)は、`cipher`キーで指定された対称暗号アルゴリズムを使用して復号化され、`cipherparams`鍵によってパラメータ化されます。 導出鍵のサイズとアルゴリズムの鍵のサイズが一致しない場合、ゼロが付け足され、導出鍵の右端のバイトをアルゴリズムのキーとして使用する必要があります。 -最小限の準拠をしたすべての実装は、次に示される AES-128-CTR アルゴリズムをサポートする必要があります。 +最小限の準拠をしたすべての実装は、次に示されるAES-128-CTRアルゴリズムをサポートする必要があります。 - `cipher: aes-128-ctr` -この暗号は、cipherparams 鍵への鍵として与えられる次のパラメーターを取ります。 +この暗号は、cipherparams鍵への鍵として与えられる次のパラメーターを取ります。 -- `iv`: 暗号の 128 ビット初期化ベクトル。 +- `iv`: 暗号の128ビット初期化ベクトル。 -暗号鍵は、導出鍵の左端の 16 バイト、つまり`DK[0..15]`です。 +暗号鍵は、導出鍵の左端の16バイト、つまり`DK[0..15]`です。 秘密鍵の作成/暗号化は、本質的にはこれらの命令の逆であるべきです。 `uuid`、`salt`、`iv`が実際にランダムであることを確認してください。 @@ -116,25 +116,25 @@ KECCAK(DK[16..31] ++ ) ### スクリプト {#scrypt} -AES-128-CTR とスクリプトを使用したテストベクトル +AES-128-CTRとスクリプトを使用したテストベクトル ```json { "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,16 +143,16 @@ AES-128-CTR とスクリプトを使用したテストベクトル **中間体**: -`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} +## バージョン1からの変更点 {#alterations-from-v2} -このバージョンでは、[こちら](https://github.com/ethereum/homestead-guide/blob/master/old-docs-for-reference/go-ethereum-wiki.rst/Passphrase-protected-key-store-spec.rst)に公開されているバージョン 1 のいくつかの矛盾点が解消されています。 簡単には次のとおりです。 +このバージョンでは、[こちら](https://github.com/ethereum/homestead-guide/blob/master/old-docs-for-reference/go-ethereum-wiki.rst/Passphrase-protected-key-store-spec.rst)に公開されているバージョン1のいくつかの矛盾点が解消されています。 簡単には次のとおりです。 -- 大文字の使用が正当化されていなく、一貫性がない(scrypt の小文字、Kdf の大文字と小文字の混合、MAC の大文字) 。 +- 大文字の使用が正当化されていなく、一貫性がない(scryptの小文字、Kdfの大文字と小文字の混合、MACの大文字) 。 - 不必要な対処とプライバシーの侵害。 - `Salt`は、本質的に鍵導出関数のパラメーターであり、一般的な暗号ではなく、鍵導出関数のパラメーターに関連付ける方がふさわしい。 -- *SaltLen*が不要(Salt から導出) 。 +- _SaltLen_が不要(Saltから導出) 。 - 鍵導出関数が与えられているが、暗号アルゴリズムは厳密に指定されている。 - `Version`は、本質的には数値であるものの文字列(構造化されたバージョン管理は、文字列でできるが、ほとんど変更されない構成ファイル形式の範囲外と考えられる) 。 - `KDF`と `cipher`は、概念的には兄弟であるが、構造は異なる。 @@ -184,6 +184,6 @@ AES-128-CTR とスクリプトを使用したテストベクトル } ``` -## バージョン 2 からの変更点 {#alterations-from-v2} +## バージョン2からの変更点 {#alterations-from-v2} -バージョン 2 は、初期の C++実装で多くのバグがありました。 すべての必須機能は、バージョン 2 から変更ありません。 +バージョン2は、初期のC++実装で多くのバグがありました。 すべての必須機能は、バージョン2から変更ありません。 diff --git a/public/content/translations/ja/developers/docs/design-and-ux/index.md b/public/content/translations/ja/developers/docs/design-and-ux/index.md new file mode 100644 index 00000000000..0cd9f239de0 --- /dev/null +++ b/public/content/translations/ja/developers/docs/design-and-ux/index.md @@ -0,0 +1,86 @@ +--- +title: Web3のデザインとUX +description: Web3におけるUXデザインおよびリサーチの紹介とイーサリアム +lang: ja +--- + +イーサリアムを使ったデザインは初めてでしょうか? そうならば、ここはあなたに適した場所です。 イーサリアムコミュニティでは、Web3のデザインとリサーチの基礎を紹介するためのリソースを作っています。 ここでは、あなたがよく知っている他のアプリのデザインとは異なる可能性があるコア・コンセプトについて学びます。 + +それより前に、Web3の基礎を理解したいでしょうか? でしたら[**学習ハブ**](/learn/)を参照ください。 + +## ユーザーリサーチを始める {#start-with-user-research} + +効果的なデザインは、視覚的に魅力的なユーザーインターフェイスを作成するだけにとどまりません。 ユーザーのニーズ、目的、推進要因などを深く理解することが伴います。 そのため、すべてのデザイナーが[**ダイヤモンドプロセス**](https://en.wikipedia.org/wiki/Double_Diamond_(design_process_model))などのデザインプロセスを採用することをお勧めします。これは、仕事が意図的であることを確実にします。 + +- [Web3では、より多くのUXリサーチャーとデザイナーが必要](https://akasha.org/blog/2022/10/11/akasha-conversation-09-web3-ux-researchers-and-designers) - 現在のデザイン成熟度の概要 +- [web3におけるUXリサーチの簡単なガイド](https://uxplanet.org/a-complete-guide-to-ux-research-for-web-3-0-products-d6bead20ebb1) - リサーチ方法の簡単なガイド +- [Web3におけるUXデザインのアプローチ方法](https://archive.devcon.org/archive/watch/6/data-empathy-how-to-approach-ux-decisions-in-web3/) - 定量的リサーチと定性的リサーチの概要とその2つの違い (6分間のビデオ) +- [Web3のUXリサーチャーになること](https://medium.com/@georgia.rakusen/what-its-like-being-a-user-researcher-in-web3-6a4bcc096849) - Web3のUXリサーチャーがどのようなものかついての個人的な見解 + +## Web3の調査研究 {#research-in-web3} + +ここにあるのは、Web3の分野で行われたユーザー調査についての収集したリストです。デザインや製品の決定に役立てることができます。もしくは、独自調査におけるインスピレーションとして役立ちます。 + +| フォーカス分野 | 名前 | +|:---------------------------------------------------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 暗号通過へのオンボーディング | [CRADL: クリプトの研究開発ラボ](https://project-cradl.notion.site/Crypto-Research-and-Design-Lab-50a7127f34ed4c88ad95c7cedf7fbe36) | +| 暗号通過へのオンボーディング | [CRADL: 暗号通貨のUX](https://docs.google.com/presentation/d/1s2OPSH5sMJzxRYaJSSRTe8W2iIoZx0PseIV-WeZWD1s/edit?usp=sharing) | +| 暗号通過へのオンボーディング | [CRADL: 暗号通貨の勉強会](https://docs.google.com/presentation/d/1R9nFuzA-R6SxaGCKhoMbE4Vxe0JxQSTiHXind3LVq_w/edit?usp=sharing) | +| 暗号通過へのオンボーディング | [ビットコインUXレポート](https://github.com/patestevao/BitcoinUX-report/blob/master/report.md) | +| 暗号通過へのオンボーディング | [ConSensys: 2023年の世界におけるWeb3への認識に関する状態](https://consensys.io/insight-report/web3-and-crypto-global-survey-2023) | +| ステーキング | [ステーキング: 主要なトレンド、要点、予測 - ETHステーカー](https://lookerstudio.google.com/u/0/reporting/cafcee00-e1af-4148-bae8-442a88ac75fa/page/p_ja2srdhh2c?s=hmbTWDh9hJo) | +| ステーキング | [複数のアプリのステーキング](https://github.com/threshold-network/UX-User-Research/blob/main/Multi-App%20Staking%20(MAS)/iterative-user-study/MAS%20Iterative%20User%20Study.pdf) | +| 自律分散型組織 | [2022年DAOリサーチのアップデート: DAOビルダーが必要なことは何か?](https://blog.aragon.org/2022-dao-research-update/) | +| 分散型金融(DeFi) | [2023年のDefiの状態](https://stateofdefi.org/) | +| 分散型金融(DeFi) | [カバレッジプール](https://github.com/threshold-network/UX-User-Research/tree/main/Keep%20Coverage%20Pool) | +| 分散型金融(DeFi) | [ConSensys: 2022年DeFiユーザーリサーチレポート](https://cdn2.hubspot.net/hubfs/4795067/ConsenSys%20Codefi-Defi%20User%20ResearchReport.pdf) | +| Metaverse | [メタバース: ユーザーリサーチレポート](https://www.politico.com/f/?id=00000187-7685-d820-a7e7-7e85d1420000) | +| Metaverse | [Going on Safari: メタバースでのユーザリサーチ](https://archive.devcon.org/archive/watch/6/going-on-safari-researching-users-in-the-metaverse/?tab=YouTube) (27分間のビデオ) | +| Ethereum.org UXの状況 | [ユーザビリティとユーザ満足度調査ダッシュボード - Ethereum.org](https://lookerstudio.google.com/reporting/0a189a7c-a890-40db-a5c6-009db52c81c9) | + +## Web3のデザイン {#design-for-web3} + +- [Web3デザイン原則](https://medium.com/@lyricalpolymath/web3-design-principles-f21db2f240c1) - ブロックチェーンベースのDappsにおけるUXルールのフレームワーク +- [ブロックチェーンデザイン原則](https://medium.com/design-ibm/blockchain-design-principles-599c5c067b6e) - IBMのブロックチェーン設計チームが学んだ教訓 +- [Web3 UXの特徴](https://uxdesign.cc/the-levels-of-web3-user-experience-4f2ad113e37d) - Web3 UXの異なるレイヤーとその課題の分析 +- [Web3デザインパターン](https://www.web3designpatterns.io/)- 実際のWeb3製品から収集されたデザインパターンのライブラリ +- [W3design.io](https://w3design.io/) - エコシステム内のさまざまなプロジェクトのUIフローを収集したライブラリ +- [Neueux.com](https://neueux.com/apps) - 多様なフィルタリングオプションを備えたユーザーフローのUIライブラリ + +## Web3デザインのケーススタディ {#design-case-studies} + +- [Web3エラーメッセージの適切な記述方法](https://medium.com/@JonCrabb/how-to-design-better-web3-error-messages-bd96e12fa582) +- [Defiデザインのヒント](https://medium.com/@JonCrabb/defi-design-tips-vol-12-8600f4374714) +- [Deep Work Studio](https://deepwork.studio/case-studies/) +- [Crypto UXハンドブック](https://www.cryptouxhandbook.com/) +- [OpenSeaでのNFT販売方法](https://builtformars.com/case-studies/opensea) +- [ウォレットのUX分析: ウォレットをどのように展開させるべきか](https://www.youtube.com/watch?v=oTpuxYj8JWI&ab_channel=ETHDenver) (20分間のビデオ) + +## デザイン報奨金 {#bounties} + +- [Dework](https://app.dework.xyz/bounties) +- [Gitcoin](https://bounties.gitcoin.co/explorer) +- [Buildboxハッカソン](https://gitcoin.co/hackathons) +- [ETHGlobal](https://ethglobal.com/) + +## DAOとコミュニティのデザイン {#design-daos-and-communities} + +プロフェッショナルによるコミュニティ主導の組織に参加したり、デザイングループに参加して、他のメンバーとデザインについて話し合ったり、関連するトピックやトレンドについて研究したりしましょう。 + +- [Vectordao.com](https://vectordao.com/) +- [Deepwork.studio](https://www.deepwork.studio/) +- [Designer-dao.xyz](https://www.designer-dao.xyz/) +- [We3.co](https://we3.co/) +- [Openux.xyz](https://openux.xyz/about) +- [web3trends.org](https://web3trends.org/) +- [オープンソースWeb3デザイン](https://www.web3designers.org/) + +## デザインシステム {#design-systems} + +- [オプティミズムデザイン](https://www.figma.com/@oplabs) (Figma) +- [Ethereum.orgデザインシステム](https://www.figma.com/@ethdotorg) (Figma) +- [Finity: ポリゴンによるWeb3デザインシステム](https://finity.polygon.technology/) (Figma) +- [ENSデザインシステム](https://thorin.ens.domains/) +- [Mirrorデザインシステム](https://degen-xyz.vercel.app/) + +**このページに掲載されている記事の内容やプロジェクトを公式に推薦しているわけではありません**。情報提供のみを目的としています。 [掲載ポリシー](/contributing/design/adding-design-resources)の基準に基づいて、このページにリンクを追加しています。 このページへプロジェクトや記事を追加したい場合は、 [GitHub](https://github.com/ethereum/ethereum-org-website/blob/dev/src/content/developers/docs/design-and-ux/index.md)にあるこのページを編集してください。 diff --git a/public/content/translations/ja/developers/docs/mev/index.md b/public/content/translations/ja/developers/docs/mev/index.md index ea260897d61..d55f801a720 100644 --- a/public/content/translations/ja/developers/docs/mev/index.md +++ b/public/content/translations/ja/developers/docs/mev/index.md @@ -8,214 +8,214 @@ lang: ja ## 採掘可能価値(MEV) {#miner-extractable-value} -最大抽出可能価値(MEV)は、 [プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow/)に基づき導入された概念であり、当初は「採掘可能価値(MEV)」と呼ばれていました。 プルーフ・オブ・ワークでは、トランザクションの追加、削除、および順序決定をマイナーが管理していたためです。 しかし、[マージ](/upgrades/merge)によるプルーフ・オブ・ステークへの移行後、バリデータがこれらの役割を担うようになり、マイニングはイーサリアムのプロトコルから削除されました。 しかし、価値採掘のための手段は依然として存在するため、現在は「最大抽出可能価値」という用語を用います。 +最大抽出可能価値(MEV)は、 [プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow/)に基づき導入された概念であり、当初は「採掘可能価値(MEV)」と呼ばれていました。 プルーフ・オブ・ワークでは、トランザクションの追加、削除、および順序決定をマイナーが管理していたためです。 しかし、[マージ](/roadmap/merge)によるプルーフ・オブ・ステークへの移行後、バリデータがこれらの役割を担うようになり、マイニングはイーサリアムのプロトコルから削除されました。 しかし、価値採掘のための手段は依然として存在するため、現在は「最大抽出可能価値」という用語を用います。 ## 前提知識 {#prerequisites} -[トランザクション](/developers/docs/transactions/)、[ブロック](/developers/docs/blocks/)、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)、および[ガス](/developers/docs/gas/)について理解している必要があります。 また、[分散アプリケーション(Dapp)](/dapps/)や[分散型金融(DeFi)](/defi/)の知識も有用です。 +[トランザクション](/developers/docs/transactions/) 、[ブロック](/developers/docs/blocks/)、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)、および[ガス](/developers/docs/gas/)について理解している必要があります。 また、[分散アプリケーション(Dapp)](/dapps/)や[分散型金融(DeFi)](/defi/)の知識も有用です。 -## MEV の抽出 {#mev-extraction} +## MEVの抽出 {#mev-extraction} -理論的に言えば、利益を伴う MEV の抽出の実行を保証できるのはバリデータのみであるため、MEV が蓄積するのはバリデータにおいてのみです。 しかし実際には、抽出される MEV の大部分は「サーチャー」と呼ばれる独立したネットワーク参加者が獲得しています。 サーチャーは、ブロックチェーンのデータに対して複雑なアルゴリズムを実行して利益を伴う MEV の抽出機会を検出し、ボットを利用してこれらの利益を伴うトランザクションをネットワークに自動的に送信します。 +理論的に言えば、利益を伴うMEVの抽出の実行を保証できるのはバリデータのみであるため、MEVが蓄積するのはバリデータにおいてのみです。 しかし実際には、抽出されるMEVの大部分は「サーチャー」と呼ばれる独立したネットワーク参加者が獲得しています。 サーチャーは、ブロックチェーンのデータに対して複雑なアルゴリズムを実行して利益を伴うMEVの抽出機会を検出し、ボットを利用してこれらの利益を伴うトランザクションをネットワークに自動的に送信します。 -サーチャーは、高額のガス代を(バリデータに)支払ってでも、発見した利益が期待できるトランザクションがブロックに追加される可能性を高めたいと考えるため、バリデータは発生した MEV 全体からその一部を獲得することができます。 サーチャーが経済的に合理的に行動すると仮定した場合、サーチャーが支払いたいと考えるガス代は、サーチャーが獲得できる MEV の 100%までになります(ガス代が MEV の 100%を越えれば、サーチャーは赤字になるため)。 +サーチャーは、高額のガス代を(バリデータに)支払ってでも、発見した利益が期待できるトランザクションがブロックに追加される可能性を高めたいと考えるため、バリデータは発生したMEV全体からその一部を獲得することができます。 サーチャーが経済的に合理的に行動すると仮定した場合、サーチャーが支払いたいと考えるガス代は、サーチャーが獲得できるMEVの100%までになります(ガス代がMEVの100%を越えれば、サーチャーは赤字になるため)。 -ただし、[分散型取引所(DEX)の裁定取引](#mev-examples-dex-arbitrage)のように競争が激しい MEV の抽出機会の場合、非常に多くのユーザーが利益を伴う裁定取引を実行したいと考えるため、サーチャーは、この MEV における全収益の 90%あるいはそれ以上をバリデータに支払う必要がある場合があります。 裁定取引が実行できる唯一の保証は、最も高いガス代を持つトランザクションを送信することだからです。 +ただし、[分散型取引所(DEX)の裁定取引](#mev-examples-dex-arbitrage)のように競争が激しいMEVの抽出機会の場合、非常に多くのユーザーが利益を伴う裁定取引を実行したいと考えるため、サーチャーは、このMEVにおける全収益の90%あるいはそれ以上をバリデータに支払う必要がある場合があります。 裁定取引が実行できる唯一の保証は、最も高いガス代を持つトランザクションを送信することだからです。 ### ガス・ゴルフ {#mev-extraction-gas-golfing} -上記の力学に基づき、「ガス・ゴルフ(gas golfing)」(ガス代が最も安価になるようにトランザクションをプログラミングすること)の能力が競合上の優位性として確立されています。ガス・ゴルフにより、サーチャーはより高価なガス代を設定しつつ、ガス代の合計額を一定に抑えられるためです(ガス代=ガス価格 ÷ 使用ガス量)。 +上記の力学に基づき、「ガス・ゴルフ(gas golfing)」(ガス代が最も安価になるようにトランザクションをプログラミングすること)の能力が競合上の優位性として確立されています。ガス・ゴルフにより、サーチャーはより高価なガス代を設定しつつ、ガス代の合計額を一定に抑えられるためです(ガス代=ガス価格÷使用ガス量)。 -よく知られているガス・ゴルフのテクニックとしては、以下があります:多くのゼロを持つ文字列で始まるアドレス (例: [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://etherscan.io/address/0x0000000000c521824eaff97eac7b73b084ef9306)) を使う方法では、保存スペースが小さくなるためガス代も低くなります。あるいは、少額の[ERC-20](/developers/docs/standards/tokens/erc-20/) トークン残高をコントラクトに残しておく方法もありますが、これは(残高が 0 の場合に)ストレージスロットを初期化すると、 ストレージスロットを更新する場合よりも多くのガスが消費される点を利用したものです。 サーチャーのコミュニティでは、ガスの使用量を減らすためのテクニックが活発に研究されています。 +よく知られているガス・ゴルフのテクニックとしては、以下があります:多くのゼロを持つ文字列で始まるアドレス (例: [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://etherscan.io/address/0x0000000000c521824eaff97eac7b73b084ef9306)) を使う方法では、保存スペースが小さくなるためガス代も低くなります。あるいは、少額の[ERC-20](/developers/docs/standards/tokens/erc-20/) トークン残高をコントラクトに残しておく方法もありますが、これは(残高が0の場合に)ストレージスロットを初期化すると、 ストレージスロットを更新する場合よりも多くのガスが消費される点を利用したものです。 サーチャーのコミュニティでは、ガスの使用量を減らすためのテクニックが活発に研究されています。 ### 汎用フロントランナー {#mev-extraction-generalized-frontrunners} -一部のサーチャーは、利益を伴う MEV 機会を検出するために複雑なアルゴリズムを開発する代わりに、汎用的なフロントランナーを実行します。 汎用フロントランナーとは、利益を伴うトランザクションを検出するためにメモリプールを監視するボットです。 汎用フロントランナーは、潜在的に利益を伴うトランザクションのコードをコピーし、フロントランナーのアドレスで置き換えた上でトランザクションをローカルで実行することで、修正後のトランザクションがフロントランナーのアドレスに収益をもたらすことをダブルチェックします。 このトランザクションが実際に利益をもたらすことが確認できれば、フロントランナーはアドレスを置き換えた修正後のトランザクションをより高いガス代と共に送信し、本来のトランザクションよりも「優位に立つ」ことで、本来のサーチャーが得ようとした MEV を獲得することができるのです。 +一部のサーチャーは、利益を伴うMEV機会を検出するために複雑なアルゴリズムを開発する代わりに、汎用的なフロントランナーを実行します。 汎用フロントランナーとは、利益を伴うトランザクションを検出するためにメモリプールを監視するボットです。 汎用フロントランナーは、潜在的に利益を伴うトランザクションのコードをコピーし、フロントランナーのアドレスで置き換えた上でトランザクションをローカルで実行することで、修正後のトランザクションがフロントランナーのアドレスに収益をもたらすことをダブルチェックします。 このトランザクションが実際に利益をもたらすことが確認できれば、フロントランナーはアドレスを置き換えた修正後のトランザクションをより高いガス代と共に送信し、本来のトランザクションよりも「優位に立つ」ことで、本来のサーチャーが得ようとしたMEVを獲得することができるのです。 ### フラッシュボット {#mev-extraction-flashbots} -フラッシュボットは、実行クライアントを拡張する独立したプロジェクトであり、サーチャーに対して、パブリックのメモリプールに公開することなく、MEV トランザクションをバリデータに送信できるサービスを提供します。 このサービスを使用すれば、汎用フロントランナーを用いたトランザクションに実行を先回りされることを防ぐことができます。 +フラッシュボットは、実行クライアントを拡張する独立したプロジェクトであり、サーチャーに対して、パブリックのメモリプールに公開することなく、MEVトランザクションをバリデータに送信できるサービスを提供します。 このサービスを使用すれば、汎用フロントランナーを用いたトランザクションに実行を先回りされることを防ぐことができます。 -## MEV の実例 {#mev-examples} +## MEVの実例 {#mev-examples} -ブロックチェーンにおいて MEV が発生するケースは、いくつかの種類があります。 +ブロックチェーンにおいてMEVが発生するケースは、いくつかの種類があります。 -### DEX における裁定取引 {#mev-examples-dex-arbitrage} +### DEXにおける裁定取引 {#mev-examples-dex-arbitrage} -[分散型取引所 (DEX)](/glossary/#dex)における裁定取引は、最もシンプルでよく知られている MEV の機会です。 このため、ユーザー間の競争も最も激しくなっています。 +[分散型取引所 (DEX) ](/glossary/#dex)における裁定取引は、最もシンプルでよく知られているMEVの機会です。 このため、ユーザー間の競争も最も激しくなっています。 -具体的には、以下のように発生します:2 カ所の DEX が同じトークンを異なる価格で提供している場合、より安価に設定した DEX でトークンを購入し、より高価に設定した DEX で売却すれば、1 回の不可分な取引で利益を得ることができます。 ブロックチェーンの仕組みにより、全くリスクを伴わない裁定取引が可能になります。 +具体的には、以下のように発生します:2カ所のDEXが同じトークンを異なる価格で提供している場合、より安価に設定したDEXでトークンを購入し、より高価に設定したDEXで売却すれば、1回の不可分な取引で利益を得ることができます。 ブロックチェーンの仕組みにより、全くリスクを伴わない裁定取引が可能になります。 -[これは](https://etherscan.io/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4)、Uniswap および Sushiswap における ETH/DAI ペアの価格差を利用して、サーチャーが 1,000ETH を 1,045ETH に変換して収益を得た裁定取引の例です。 +[これは](https://etherscan.io/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4)、UniswapおよびSushiswapにおけるETH/DAIペアの価格差を利用して、サーチャーが1,000ETHを1,045ETHに変換して収益を得た裁定取引の例です。 ### 清算 {#mev-examples-liquidations} -貸出プロトコルによる精算も、よく知られた MEV 獲得機会のひとつです。 +貸出プロトコルによる精算も、よく知られたMEV獲得機会のひとつです。 -Maker や Aave のような貸出プロトコルでは、ユーザーは何らかの担保(例: ETH)を預入しなければなりません。 預け入れられた担保は、他のユーザーに貸し出されます。 +MakerやAaveのような貸出プロトコルでは、ユーザーは何らかの担保(例: ETH)を預入しなければなりません。 預け入れられた担保は、他のユーザーに貸し出されます。 -ユーザーは、この仕組みを活用して、預け入れた担保に対する一定の上限額まで、自らの必要に応じて他のユーザーから資産やトークンを借り入れることができます(例: MakerDAO のガバナンス提案に投票するために、MKR を借り入れる場合)。 例えば、借入可能額が預け入れた担保の 30%までの場合、プロトコルに 100 DAI を預け入れれば、30 DAI の価値を持つ他の資産を借り入れることができます。 貸出プロトコルは、具体的な借入能力(担保に対する割合)を決定します。 +ユーザーは、この仕組みを活用して、預け入れた担保に対する一定の上限額まで、自らの必要に応じて他のユーザーから資産やトークンを借り入れることができます(例: MakerDAOのガバナンス提案に投票するために、MKRを借り入れる場合)。 例えば、借入可能額が預け入れた担保の30%までの場合、プロトコルに100 DAIを預け入れれば、30 DAIの価値を持つ他の資産を借り入れることができます。 貸出プロトコルは、具体的な借入能力(担保に対する割合)を決定します。 -借り手の担保価値が変動すれば、借入能力も上下します。 具体的には、市場の変動により借入資産の価値が担保価値の(例えば)30%を越えた場合(上述したように、実際の借入可能な割合は貸出プロトコルが決定します)、貸出プロトコルは通常、あらゆるユーザーに対してこの担保を精算し、瞬時に貸し手に払い戻すことを許可します(これは、伝統的な金融市場における[マージンコール](https://www.investopedia.com/terms/m/margincall.asp)の仕組みと同様です)。 一般に、担保が精算される場合に借り手は高額の精算手数料を支払う必要があり、この手数料の一部は清算人に支払われるため、MEV を獲得する機会が発生するのです。 +借り手の担保価値が変動すれば、借入能力も上下します。 具体的には、市場の変動により借入資産の価値が担保価値の(例えば)30%を越えた場合(上述したように、実際の借入可能な割合は貸出プロトコルが決定します)、貸出プロトコルは通常、あらゆるユーザーに対してこの担保を精算し、瞬時に貸し手に払い戻すことを許可します(これは、伝統的な金融市場における[マージンコール](https://www.investopedia.com/terms/m/margincall.asp)の仕組みと同様です)。 一般に、担保が精算される場合に借り手は高額の精算手数料を支払う必要があり、この手数料の一部は清算人に支払われるため、MEVを獲得する機会が発生するのです。 サーチャーは、可能なかぎり高速にブロックチェーンのデータを分析することで、精算の対象となりうる借り手を特定し、精算トランザクションを他に先がけて送信し、精算手数料を回収するための競争を行っています。 ### サンドイッチ取引 {#mev-examples-sandwich-trading} -サンドイッチ取引もまた、一般的な MEV 抽出の方法です。 +サンドイッチ取引もまた、一般的なMEV抽出の方法です。 -サーチャーは、サンドイッチ取引を念頭に置いて DEX における大型取引のメモリプールを監視します。 例えば、あるユーザーが Uniswap で、DAI を使って 10000 UNI を購入したい場合を考えてみましょう。 これほど大きな取引は、UNI/DAI ペアの為替レートに有意な影響を与えるものであり、対 DAI の UNI 価格を大きく上昇させる可能性があります。 +サーチャーは、サンドイッチ取引を念頭に置いてDEXにおける大型取引のメモリプールを監視します。 例えば、あるユーザーがUniswapで、DAIを使って10000 UNIを購入したい場合を考えてみましょう。 これほど大きな取引は、UNI/DAIペアの為替レートに有意な影響を与えるものであり、対DAIのUNI価格を大きく上昇させる可能性があります。 -サーチャーは、この大口取引による UNI/DAI ペアに対する大まかな価格効果を計算し、大口取引の*直前に*最適な買い注文を実行して UNI を安価で購入した上で、大口取引の*直後に* 売り注文を実行し、大口注文により値上がりした価格で売却することができます。 +サーチャーは、この大口取引によるUNI/DAIペアに対する大まかな価格効果を計算し、大口取引の_直前に_最適な買い注文を実行してUNIを安価で購入した上で、大口取引の_直後に_ 売り注文を実行し、大口注文により値上がりした価格で売却することができます。 -しかし、サンドイッチ取引は 1 回で完結できない取引であるため(この点が、上述の DEX における裁定取引とは異なります)よりリスクが大きく、[サルモネラ攻撃](https://github.com/Defi-Cartel/salmonella)の対象となりやすい欠点を持ちます。 +しかし、サンドイッチ取引は1回で完結できない取引であるため(この点が、上述のDEXにおける裁定取引とは異なります)よりリスクが大きく、[サルモネラ攻撃](https://github.com/Defi-Cartel/salmonella)の対象となりやすい欠点を持ちます。 -### NFT を利用した MEV {#mev-examples-nfts} +### NFTを利用したMEV {#mev-examples-nfts} -NFT を用いた MEV の抽出は、最近発生しつつある現象であり、必ずしも利益を伴う取引ではありません。 +NFTを用いたMEVの抽出は、最近発生しつつある現象であり、必ずしも利益を伴う取引ではありません。 -しかし、NFT のトランザクションは、その他すべてのイーサリアムのトランザクションと同一のブロックチェーン上で実行されるため、サーチャーは上記で紹介した従来の MEV 獲得のためのテクニックを NFT 市場でも応用することができます。 +しかし、NFTのトランザクションは、その他すべてのイーサリアムのトランザクションと同一のブロックチェーン上で実行されるため、サーチャーは上記で紹介した従来のMEV獲得のためのテクニックをNFT市場でも応用することができます。 -例えば、人気が高い NFT ドロップが実行され、サーチャーが特定の NFT あるいは複数の NFT を持つセットを獲得したい場合、この NFT の購入リストの先頭になるようにトランザクションをプログラミングしたり、1 回のトランザクションで当該 NFT のセット全体を購入したりすることができます。 また、NFT が [ミスにより低価格で出品](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent)されている場合、サーチャーは他の購入者を先回りして取引を実行し、安価で手に入れることができます。 +例えば、人気が高いNFTドロップが実行され、サーチャーが特定のNFTあるいは複数のNFTを持つセットを獲得したい場合、このNFTの購入リストの先頭になるようにトランザクションをプログラミングしたり、1回のトランザクションで当該NFTのセット全体を購入したりすることができます。 また、NFTが [ミスにより低価格で出品](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent)されている場合、サーチャーは他の購入者を先回りして取引を実行し、安価で手に入れることができます。 -NFT を使った MEV 抽出の顕著な事例としては、あるサーチャーが 700 万ドルを投じて、Cryptopunk を底値ですべて[購入した](https://etherscan.io/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5)ケースがあります。 この事例については、買い手が MEV プロバイダーと連携してどのようにこの購入を秘匿したかについて、あるブロックチェーン研究者が[ツイッター](https://twitter.com/IvanBogatyy/status/1422232184493121538)上で説明しています。 +NFTを使ったMEV抽出の顕著な事例としては、あるサーチャーが700万ドルを投じて、Cryptopunkを底値ですべて[購入した](https://etherscan.io/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5)ケースがあります。 この事例については、買い手がMEVプロバイダーと連携してどのようにこの購入を秘匿したかについて、あるブロックチェーン研究者が[ツイッター](https://twitter.com/IvanBogatyy/status/1422232184493121538)上で説明しています。 ### ロングテール {#mev-examples-long-tail} -DEX における裁定取引、精算、およびサンドイッチ取引はいずれも、よく知られた MEV の獲得機会であり、新規参入のサーチャーが利益を得られる可能性は低いです。 しかし、数は少ないものの、まだ一般的でない MEV の獲得機会も存在します(NFT による MEV 獲得も、そのひとつだと言えるかもしれません)。 +DEXにおける裁定取引、精算、およびサンドイッチ取引はいずれも、よく知られたMEVの獲得機会であり、新規参入のサーチャーが利益を得られる可能性は低いです。 しかし、数は少ないものの、まだ一般的でないMEVの獲得機会も存在します(NFTによるMEV獲得も、そのひとつだと言えるかもしれません)。 -サーチャーの分野に新たに参入したい方は、このロングテールの部分に焦点を当てることで、MEV を獲得できる可能性が高まるかもしれません。 フラッシュボットの[MEV 求人板](https://github.com/flashbots/mev-job-board)には、最近発生しつつある新たな MEV 獲得機会が掲載されています。 +サーチャーの分野に新たに参入したい方は、このロングテールの部分に焦点を当てることで、MEVを獲得できる可能性が高まるかもしれません。 フラッシュボットの[MEV求人板](https://github.com/flashbots/mev-job-board)には、最近発生しつつある新たなMEV獲得機会が掲載されています。 -## MEV の影響 {#effects-of-mev} +## MEVの影響 {#effects-of-mev} -MEV は必ずしも絶対悪ではなく、イーサリアムにとってはよい影響と悪い影響の両方を持ちます。 +MEVは必ずしも絶対悪ではなく、イーサリアムにとってはよい影響と悪い影響の両方を持ちます。 ### よい影響 {#effects-of-mev-the-good} -多くの分散型金融(DeFi)プロジェクトは、プロトコルの有用性と安定性を確保するために、経済的合理性に基づいて行動するユーザーに依存しています。 DEX における裁定取引は、ユーザーが各自のトークンに対して最善かつ最も適切な価格を得られることを保証するメカニズムであり、貸出プロトコルは、借入可能な比率を超過した借り手にただちに精算を迫ることで、貸し手に対する返済を保証しています。 +多くの分散型金融(DeFi)プロジェクトは、プロトコルの有用性と安定性を確保するために、経済的合理性に基づいて行動するユーザーに依存しています。 DEXにおける裁定取引は、ユーザーが各自のトークンに対して最善かつ最も適切な価格を得られることを保証するメカニズムであり、貸出プロトコルは、借入可能な比率を超過した借り手にただちに精算を迫ることで、貸し手に対する返済を保証しています。 -経済合理性に基づき行動するサーチャーが、経済的な非効率性を発見し、それを修正することで、当該プロトコルにおける経済的なインセンティブを獲得することができなければ、DeFi のプロトコルや Dapp は現在実現されている強じん性を維持できないでしょう。 +経済合理性に基づき行動するサーチャーが、経済的な非効率性を発見し、それを修正することで、当該プロトコルにおける経済的なインセンティブを獲得することができなければ、DeFiのプロトコルやDappは現在実現されている強じん性を維持できないでしょう。 ### 悪い影響 {#effects-of-mev-the-bad} -アプリケーションレイヤーにおいては、サンドイッチ取引をはじめとする一部の MEV 獲得方法はユーザーの利用体験を明らかに低下させます。 サンドイッチ取引に巻き込まれたユーザーは、スリッページの被害を受け、取引条件が悪化するでしょう。 +アプリケーションレイヤーにおいては、サンドイッチ取引をはじめとする一部のMEV獲得方法はユーザーの利用体験を明らかに低下させます。 サンドイッチ取引に巻き込まれたユーザーは、スリッページの被害を受け、取引条件が悪化するでしょう。 ネットワークレイヤーにおいては、汎用フロントランナーやガス価格のオークションが頻繁に用いられるため(複数のフロントランナーが、次のブロックに追加されるトランザクションのガス代を吊り上げる競争を行う場合)、ネットワークの混雑が悪化するだけでなく、通常のトランザクションを実行したい他のすべてのユーザーにとってもガス代が上昇してしまいます。 -MEV は、ブロック *内部における影響に加えて、複数のブロック*間においても悪影響をもたらす場合があります。 特定のブロック内において獲得できる MEV が標準的なブロック報酬を大きく上回る場合、バリデータにとっては、ブロックを再編成し、バリデータ自身が MEV を獲得しようというインセンティブが発生しうるため、ブロックチェーンの再編成を促し、コンセンサスの安定性が損なわれる可能性があります。 +MEVは、ブロック _内部__における影響に加えて、複数のブロック_間_においても悪影響をもたらす場合があります。 特定のブロック内において獲得できるMEVが標準的なブロック報酬を大きく上回る場合、バリデータにとっては、ブロックを再編成し、バリデータ自身がMEVを獲得しようというインセンティブが発生しうるため、ブロックチェーンの再編成を促し、コンセンサスの安定性が損なわれる可能性があります。 -このブロックチェーンが再編成される可能性は、 [すでにビットコインのブロックチェーンにおいて発生しています](https://dl.acm.org/doi/10.1145/2976749.2978408)。 ビットコインのブロック報酬が半減し、ブロック報酬においてトランザクション手数料が占める割合がますます大きくなると、マイナーにとっては、次のブロックで得られる報酬よりも、より高額な手数料が期待できる過去のブロックを再採掘する方が経済的に合理的である状況が発生します。 MEV の抽出が一般化した場合、イーサリアムにおいても類似の状況が発生し、イーサリアム・ブロックチェーンの健全性が損なわれる可能性があります。 +このブロックチェーンが再編成される可能性は、 [すでにビットコインのブロックチェーンにおいて発生しています](https://dl.acm.org/doi/10.1145/2976749.2978408)。 ビットコインのブロック報酬が半減し、ブロック報酬においてトランザクション手数料が占める割合がますます大きくなると、マイナーにとっては、次のブロックで得られる報酬よりも、より高額な手数料が期待できる過去のブロックを再採掘する方が経済的に合理的である状況が発生します。 MEVの抽出が一般化した場合、イーサリアムにおいても類似の状況が発生し、イーサリアム・ブロックチェーンの健全性が損なわれる可能性があります。 -## MEV の現況 {#state-of-mev} +## MEVの現況 {#state-of-mev} -MEV の抽出は、2021 年初頭から爆発的に増加し、同年 1 月から数ヶ月にわたりガス価格が大きく高騰しました。 しかし、フラッシュボットの MEV リレーが登場した結果、汎用フロントランナーの効果が薄れ、ガス代のオークションがオフチェーンで実行されるようになったため、通常のユーザーが支払うガス価格は低下しました。 +MEVの抽出は、2021年初頭から爆発的に増加し、同年1月から数ヶ月にわたりガス価格が大きく高騰しました。 しかし、フラッシュボットのMEVリレーが登場した結果、汎用フロントランナーの効果が薄れ、ガス代のオークションがオフチェーンで実行されるようになったため、通常のユーザーが支払うガス価格は低下しました。 -現在も多くのサーチャーが MEV により充分な利益を得ているものの、MEV の抽出機会に対する認知度が高まり、同じ機会により多くのサーチャーが参加するようになるにつれ、MEV の総収益のうちバリデータの利益が占める割合はますます大きくなるでしょう(と言うのも、上記で説明したガス代のオークションと同様の状況は、非公開の取引を通じてフラッシュボットでも発生するため、その結果発生するガス収益はバリデータが獲得するためです)。 また、MEV が発生するのはイーサリアムに限りません。イーサリアムにおける MEV の獲得機会に対する競争が激化するにつれ、サーチャーは、同じような機会が存在し、より競争相手が少ないバイナンス・スマートチェーンなどの他のブロックチェーンに移行する傾向を強めています。 +現在も多くのサーチャーがMEVにより充分な利益を得ているものの、MEVの抽出機会に対する認知度が高まり、同じ機会により多くのサーチャーが参加するようになるにつれ、MEVの総収益のうちバリデータの利益が占める割合はますます大きくなるでしょう(と言うのも、上記で説明したガス代のオークションと同様の状況は、非公開の取引を通じてフラッシュボットでも発生するため、その結果発生するガス収益はバリデータが獲得するためです)。 また、MEVが発生するのはイーサリアムに限りません。イーサリアムにおけるMEVの獲得機会に対する競争が激化するにつれ、サーチャーは、同じような機会が存在し、より競争相手が少ないバイナンス・スマートチェーンなどの他のブロックチェーンに移行する傾向を強めています。 -一方、プルーフ・オブ・ワークからプルーフ・オブ・ステークへの移行や、ロールアップならびにシャーディングを活用してイーサリアムのスケーリングを実現するための継続的な取り組みなどはいずれも、MEV を取り巻く環境を一変させるものですが、それらがどのような影響を及ぼすかは現時点では明確ではありません。 プルーフ・オブ・ワークの確率論的モデルとの比較において、保証済みのブロック提案者に対してやや事前に通知することが MEV 抽出の力学をどのように変化させるのか、あるいは、[1 名のシークレットリーダー選挙](https://ethresear.ch/t/secret-non-single-leader-election/11789)および[分散型バリデータ技術](https://github.com/ethereum/distributed-validator-specs)が実装された場合に、この環境がどのような影響を被るのかは、現在のところはっきりしていません。 同様に、大部分のユーザーアクティビティがイーサリアムの外部に移行し、L2 におけるロールアップやシャードで実行される場合、どのような MEV の抽出機会が残存するのかも不明です。 +一方、プルーフ・オブ・ワークからプルーフ・オブ・ステークへの移行や、ロールアップを活用してイーサリアムのスケーリングを実現するための継続的な取り組みなどはいずれも、MEVを取り巻く環境を一変させるものですが、それらがどのような影響を及ぼすかは現時点では明確ではありません。 プルーフ・オブ・ワークの確率論的モデルとの比較において、保証済みのブロック提案者に対してやや事前に通知することがMEV抽出の力学をどのように変化させるのか、あるいは、[1名のシークレットリーダー選挙](https://ethresear.ch/t/secret-non-single-leader-election/11789)および[分散型バリデータ技術](/staking/dvt/)が実装された場合に、この環境がどのような影響を被るのかは、現在のところはっきりしていません。 同様に、大部分のユーザーアクティビティがイーサリアムの外部に移行し、L2におけるロールアップやシャードで実行される場合、どのようなMEVの抽出機会が残存するのかも不明です。 -## イーサリアムのプルーフ・オブ・ステーク(PoS)における MEV {#mev-in-ethereum-proof-of-stake} +## イーサリアムのプルーフ・オブ・ステーク(PoS)におけるMEV {#mev-in-ethereum-proof-of-stake} -上述したように、MEV は全般的なユーザー体験やコンセンサスレイヤーのセキュリティに悪影響を及ぼします。 しかし、イーサリアムにおけるプルーフ・オブ・ステークへの移行(「マージ」と呼ぶ)に伴い、MEV に関連して以下のような新たなリスクが発生する可能性があります: +上述したように、MEVは全般的なユーザー体験やコンセンサスレイヤーのセキュリティに悪影響を及ぼします。 しかし、イーサリアムにおけるプルーフ・オブ・ステークへの移行(「マージ」と呼ぶ)に伴い、MEVに関連して以下のような新たなリスクが発生する可能性があります: ### バリデータの集中 {#validator-centralization} -マージ後のイーサリアムにおいては、バリデータ(32 ETH のセキュリティ・デポジットを行ったユーザー)は、ビーコンチェーンに追加されたブロックの検証に対するコンセンサスに参加します。 多くのユーザーにとっては、32 ETH の負担は大きすぎるため、[ステーキングプールへの参加](/staking/pools/)がより現実的なオプションとなるかもしれません。 しかし、特定のユーザーのみにバリデータが集中することを回避し、イーサリアムのセキュリティを向上させるには、[ソロステーカー](/staking/solo/)の割合を健全に保つことが望ましいと言えます。 +マージ後のイーサリアムにおいては、バリデータ(32 ETHのセキュリティ・デポジットを行ったユーザー)は、ビーコンチェーンに追加されたブロックの検証に対するコンセンサスに参加します。 多くのユーザーにとっては、32 ETHの負担は大きすぎるため、[ステーキングプールへの参加](/staking/pools/)がより現実的なオプションとなるかもしれません。 しかし、特定のユーザーのみにバリデータが集中することを回避し、イーサリアムのセキュリティを向上させるには、[ソロステーカー](/staking/solo/)の割合を健全に保つことが望ましいと言えます。 -しかし、MEV の抽出機会により、特定のユーザーのみがバリデータとなる傾向が強まると考えられています。 この原因のひとつとして、現在のところ、バリデータはマイナーと比較すると[ブロックの提案により得られる収入が少ない](/upgrades/merge/issuance/#how-the-merge-impacts-ETH-supply)ため、MEV の抽出がマージ後における[バリデータの収益](https://github.com/flashbots/eth2-research/blob/main/notebooks/mev-in-eth2/eth2-mev-calc.ipynb)に対して大きな影響を与えると予想されるためです。 +しかし、MEVの抽出機会により、特定のユーザーのみがバリデータとなる傾向が強まると考えられています。 この原因のひとつとして、現在のところ、バリデータはマイナーと比較すると[ブロックの提案により得られる収入が少ない](/roadmap/merge/issuance/#how-the-merge-impacts-ETH-supply)ため、MEVの抽出がマージ後における[バリデータの収益](https://github.com/flashbots/eth2-research/blob/main/notebooks/mev-in-eth2/eth2-mev-calc.ipynb)に対して大きな影響を与えると予想されるためです。 -ステーキングプールの規模が大きくなればなるほど、MEV の抽出機会を活用するために必要な最適化に対してより多くのリソースを投じる傾向が高まるでしょう。 これらのプールから抽出できる MEV が大きくなればなるほど、バリデータは MEV の抽出能力を向上させるためにより多くのリソースを投じ、(さらに全体的な収益増を実現する)ことになるため、結果的に[規模の経済](https://www.investopedia.com/terms/e/economiesofscale.asp#)が実現されます。 +ステーキングプールの規模が大きくなればなるほど、MEVの抽出機会を活用するために必要な最適化に対してより多くのリソースを投じる傾向が高まるでしょう。 これらのプールから抽出できるMEVが大きくなればなるほど、バリデータはMEVの抽出能力を向上させるためにより多くのリソースを投じ、(さらに全体的な収益増を実現する)ことになるため、結果的に[規模の経済](https://www.investopedia.com/terms/e/economiesofscale.asp#)が実現されます。 -ソロステーカーは、利用できるリソースが少ないために、MEV の機会から利益を得られなくなるかもしれません。 これにより、独立系のバリデータが収益を高めるために大規模なステーキングプールに参加する傾向が強まり、イーサリアムにおける分散化が損なわれる可能性があります。 +ソロステーカーは、利用できるリソースが少ないために、MEVの機会から利益を得られなくなるかもしれません。 これにより、独立系のバリデータが収益を高めるために大規模なステーキングプールに参加する傾向が強まり、イーサリアムにおける分散化が損なわれる可能性があります。 ### 許可済みのメモリプール {#permissioned-mempools} -サンドイッチ取引やフロントランナー攻撃に対処するため、取引を行うユーザーは、トランザクションのプライバシーを維持するためにバリデータを伴う取引をオフチェーンで実行するようになるかもしれません。 MEV 抽出の可能性があるトランザクションを公開メモリプールに送信するのではなく、バリデータにトランザクションを直接送信する方法では、ブロックへの追加を担うバリデータと利益を共有することができます。 +サンドイッチ取引やフロントランナー攻撃に対処するため、取引を行うユーザーは、トランザクションのプライバシーを維持するためにバリデータを伴う取引をオフチェーンで実行するようになるかもしれません。 MEV抽出の可能性があるトランザクションを公開メモリプールに送信するのではなく、バリデータにトランザクションを直接送信する方法では、ブロックへの追加を担うバリデータと利益を共有することができます。 このような取り決めをより大規模にしたものが「ダークプール」であり、一定の手数料を支払う意思があるユーザーのみが参加する、許可済みでアクセスのみ可能なメモリプールとして機能します。 このようなメモリプールを活用する傾向が強まれば、イーサリアムにおけるパーミッションレス、トラストレスの特性が失われ、ブロックチェーンが最高額入札者にとって有利な「ペイ・トゥ・プレイ」のメカニズムに変質してしまう可能性があります。 -さらに、許可済みのメモリプールは、上述したようにユーザーの集中化というリスクを強めます。 複数のバリデータが大規模なプールを実行する場合、取引者およびユーザーにとってはトランザクションのプライバシーを維持できるという利益が発生するため、MEV の収益が増加するでしょう。 +さらに、許可済みのメモリプールは、上述したようにユーザーの集中化というリスクを強めます。 複数のバリデータが大規模なプールを実行する場合、取引者およびユーザーにとってはトランザクションのプライバシーを維持できるという利益が発生するため、MEVの収益が増加するでしょう。 -マージ後のイーサリアムにおいては、これらの MEV 関連の問題にどう対処するかがリサーチコミュニティにおける核心的な課題となっています。 現在のところ、マージ後のイーサリアムにおいて MEV が及ぼす分散化およびセキュリティへの悪影響を軽減するためのソリューションとしては、**提案者と作成者の分離(PBS)**および**ビルダー API**が提案されています。 +マージ後のイーサリアムにおいては、これらのMEV関連の問題にどう対処するかがリサーチコミュニティにおける核心的な課題となっています。 現在のところ、マージ後のイーサリアムにおいてMEVが及ぼす分散化およびセキュリティへの悪影響を軽減するためのソリューションとしては、**提案者と作成者の分離(PBS)**および**ビルダーAPI**が提案されています。 ### ブロックにおける提案者と作成者の分離(PBS) {#proposer-builder-separation} プルーフ・オブ・ワークであれプルーフ・オブ・ステークであれ、ブロックを作成するノードは、作成したブロックをチェーンに追加することをコンセンサスに参加する他のノードに提案します。 新しいブロックは、他のマイナーがさらにその上にブロックを構築した場合(プルーフ・オブ・ワーク)、あるいは過半数のバリデータからアテステーションを受け取った場合(プルーフ・オブ・ステーク)に、正規のブロックチェーンに追加されます。 -この記事で紹介した MEV に関する問題点の多くは、ブロックの作成者と提案者の役割が分離されていないことに由来しています。 例えば、コンセンサスに参加しているノードは、MEV による収益を最大化するために、タイムバンディット攻撃を使ってチェーンの再編成をトリガーするインセンティブを持っています。 +この記事で紹介したMEVに関する問題点の多くは、ブロックの作成者と提案者の役割が分離されていないことに由来しています。 例えば、コンセンサスに参加しているノードは、MEVによる収益を最大化するために、タイムバンディット攻撃を使ってチェーンの再編成をトリガーするインセンティブを持っています。 -[提案者と作成者の分離(PBS)](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) は、特にコンセンサスレイヤーにおける MEV の影響を軽減するように設計されています。 PBS の主な機能は、ブロックの作成者と提案者に対するルールを分離することです。 バリデータがブロックの提案と投票に責任を負う点は変わりませんが、**ブロックビルダー**と呼ばれる専門の新たなエンティティ・クラスが導入され、トランザクションの順番付けと構築を担当することになります。 +[提案者と作成者の分離(PBS)](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) は、特にコンセンサスレイヤーにおけるMEVの影響を軽減するように設計されています。 PBSの主な機能は、ブロックの作成者と提案者に対するルールを分離することです。 バリデータがブロックの提案と投票に責任を負う点は変わりませんが、**ブロックビルダー**と呼ばれる専門の新たなエンティティ・クラスが導入され、トランザクションの順番付けと構築を担当することになります。 -PBS では、ブロックビルダーがトランザクションバンドルを作成し、ビーコンチェーン・ブロックへの追加に対して(「実行ペイロード」として)入札を行います。 次のブロック提案者として選択されたバリデータは、これを受けて、様々な入札をチェックし、最も高額な手数料のバンドルを選択します。 つまり PBS は、ブロックスペースの販売価格についてビルダーとバリデーターが交渉するオークション市場を構築するものです。 +PBSでは、ブロックビルダーがトランザクションバンドルを作成し、ビーコンチェーン・ブロックへの追加に対して(「実行ペイロード」として)入札を行います。 次のブロック提案者として選択されたバリデータは、これを受けて、様々な入札をチェックし、最も高額な手数料のバンドルを選択します。 つまりPBSは、ブロックスペースの販売価格についてビルダーとバリデーターが交渉するオークション市場を構築するものです。 -現在の PBS の設計では、ブロックビルダーは入札において、当該ブロックのコンテンツ(ブロックヘッダー)に対する暗号コミットメントのみを公開する[コミットメント=公開スキーム](https://gitcoin.co/blog/commit-reveal-scheme-on-ethereum/)が採用されています。 提案者は、最高額の入札を受け入れた上で、ブロックヘッダーを含む署名済みのブロック提案を作成します。 ブロックビルダーは、署名済みのブロック提案を確認した後にブロック全体を公開すると想定されており、ブロック提案が最終決定される前に、バリデータから充分な数の[アテステーション](/glossary/#attestation)を得なければなりません。 +現在のPBSの設計では、ブロックビルダーは入札において、当該ブロックのコンテンツ(ブロックヘッダー)に対する暗号コミットメントのみを公開する[コミットメント=公開スキーム](https://gitcoin.co/blog/commit-reveal-scheme-on-ethereum/)が採用されています。 提案者は、最高額の入札を受け入れた上で、ブロックヘッダーを含む署名済みのブロック提案を作成します。 ブロックビルダーは、署名済みのブロック提案を確認した後にブロック全体を公開すると想定されており、ブロック提案が最終決定される前に、バリデータから充分な数の[アテステーション](/glossary/#attestation)を得なければなりません。 -#### 提案者と作成者の分離は、MEV の悪影響をどの程度緩和するか? {#how-does-pbs-curb-mev-impact} +#### 提案者と作成者の分離は、MEVの悪影響をどの程度緩和するか? {#how-does-pbs-curb-mev-impact} -プロトコルにおいて提案者と作成者を分離することで、MEV の抽出がバリデータの作業範囲に含まれなくなるため、コンセンサスに対する MEV の影響を軽減することができます。 これにより、今後は専用のハードウェアを稼働させているブロックビルダーが MEV の抽出機会を得ることになります。 +プロトコルにおいて提案者と作成者を分離することで、MEVの抽出がバリデータの作業範囲に含まれなくなるため、コンセンサスに対するMEVの影響を軽減することができます。 これにより、今後は専用のハードウェアを稼働させているブロックビルダーがMEVの抽出機会を得ることになります。 -ただし、ブロックビルダーはバリデータによる承認を得るために入札額を高くしなければならないため、バリデータにとっても MEV に伴う収益がまったくゼロになるわけではありません。 しかし、バリデータは MEV による収益増を直接的な目標として行動しなくなるため、タイムバンディット攻撃の脅威を低下させることができます。 +ただし、ブロックビルダーはバリデータによる承認を得るために入札額を高くしなければならないため、バリデータにとってもMEVに伴う収益がまったくゼロになるわけではありません。 しかし、バリデータはMEVによる収益増を直接的な目標として行動しなくなるため、タイムバンディット攻撃の脅威を低下させることができます。 -PBS はさらに、MEV による集中化のリスクを引き下げます。 例えば、コミット=公開スキームにより、ブロックビルダーは、バリデータが MEV の抽出機会を奪い取ったり、他の構築者に公開することを行わないユーザーである信頼する必要がなくなります。 これにより、ソロステーカーが MEV 抽出による利益を得る上での障壁が低くなります。そうでなければ、ブロックビルダーはオフチェーンでの評判が高い大規模なプールを選好し、オフチェーンでの取引が増加するトレンドが発生するでしょう。 +PBSはさらに、MEVによる集中化のリスクを引き下げます。 例えば、コミット=公開スキームにより、ブロックビルダーは、バリデータがMEVの抽出機会を奪い取ったり、他の構築者に公開することを行わないユーザーである信頼する必要がなくなります。 これにより、ソロステーカーがMEV抽出による利益を得る上での障壁が低くなります。そうでなければ、ブロックビルダーはオフチェーンでの評判が高い大規模なプールを選好し、オフチェーンでの取引が増加するトレンドが発生するでしょう。 -同じように、バリデータの側も、支払いが必須であるため、ブロックビルダーがブロックボディを秘匿したり、無効なブロックを公開しないユーザーである信頼する必要がなくなります。 つまり、提案されたブロックが参照できない場合や、他のバリデータにより無効と宣言された場合でも、当初のバリデータの手数料は処理されるのです。 他のバリデータが無効と宣言した場合、当該ブロックは単に破棄され、ブロックビルダーはすべての取引手数料および MEV 収益を失うことになります。 +同じように、バリデータの側も、支払いが必須であるため、ブロックビルダーがブロックボディを秘匿したり、無効なブロックを公開しないユーザーである信頼する必要がなくなります。 つまり、提案されたブロックが参照できない場合や、他のバリデータにより無効と宣言された場合でも、当初のバリデータの手数料は処理されるのです。 他のバリデータが無効と宣言した場合、当該ブロックは単に破棄され、ブロックビルダーはすべての取引手数料およびMEV収益を失うことになります。 -### ビルダー API {#builder-api} +### ビルダーAPI {#builder-api} -PBS(提案者と作成者の分離)は、MEV の抽出に伴う悪影響を減らす効果が期待される一方で、実装にはコンセンサス・プロトコルの変更が必要です。 具体的には、ビーコンチェーンにおける[分岐の選択](/developers/docs/consensus-mechanisms/pos/#fork-choice)ルールを変更する必要があります。 [ビルダー API](https://github.com/ethereum/builder-specs)は、信頼性の前提がより高くなるものの、提案者と作成者を実務的に分離するための一時的なソリューションです。 +PBS(提案者と作成者の分離)は、MEVの抽出に伴う悪影響を減らす効果が期待される一方で、実装にはコンセンサス・プロトコルの変更が必要です。 具体的には、ビーコンチェーンにおける[分岐の選択](/developers/docs/consensus-mechanisms/pos/#fork-choice)ルールを変更する必要があります。 [ビルダーAPI](https://github.com/ethereum/builder-specs)は、信頼性の前提がより高くなるものの、提案者と作成者を実務的に分離するための一時的なソリューションです。 -ビルダー API は、コンセンサスレイヤーのクライアントが実行レイヤーのクライアントに対して実行ペイロードを請求する際に用いられる[エンジン API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md)の修正バージョンです。 [正直なバリデータの仕様](https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/validator.md)に概要が記述されている通り、ブロック提案に関する職責のために選択されたバリデータは、接続された実行クライアントにトランザクションバンドルを要求し、そのバンドルを提案されたビーコンチェーンのブロックに追加します。 +ビルダーAPIは、コンセンサスレイヤーのクライアントが実行レイヤーのクライアントに対して実行ペイロードを請求する際に用いられる[エンジンAPI](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md)の修正バージョンです。 [正直なバリデータの仕様](https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/validator.md)に概要が記述されている通り、ブロック提案に関する職責のために選択されたバリデータは、接続された実行クライアントにトランザクションバンドルを要求し、そのバンドルを提案されたビーコンチェーンのブロックに追加します。 -ビルダー API はさらに、バリデータと実行レイヤーのクライアントとの間のミドルウェアとして機能します。ただし、ビーコンチェーン上のバリデータが外部エンティティからブロックを調達できる(実行クライアントを用いてローカルでブロックを構築するのではない)点が異なります。 +ビルダーAPIはさらに、バリデータと実行レイヤーのクライアントとの間のミドルウェアとして機能します。ただし、ビーコンチェーン上のバリデータが外部エンティティからブロックを調達できる(実行クライアントを用いてローカルでブロックを構築するのではない)点が異なります。 -以下に、ビルダー API の仕組みについて簡単に説明します: +以下に、ビルダーAPIの仕組みについて簡単に説明します: -1. ビルダー API により、バリデータは、実行レイヤーのクライアントを実行しているブロックビルダーのネットワークに接続されます。 PBS の場合と同様に、ビルダーは、リソース集約型のブロック構築への投資に特化し、MEV や優先度チップを通じた収益最大化のために様々な戦略を用いるユーザーで構成されます。 +1. ビルダーAPIにより、バリデータは、実行レイヤーのクライアントを実行しているブロックビルダーのネットワークに接続されます。 PBSの場合と同様に、ビルダーは、リソース集約型のブロック構築への投資に特化し、MEVや優先度チップを通じた収益最大化のために様々な戦略を用いるユーザーで構成されます。 2. (コンセンサスレイヤーのクライアントを実行中である)バリデータは、ビルダーのネットワークからの入札と同時に、実行ペイロードを要求します。 ビルダーからの入札には、実行ペイロードヘッダー(ペイロードのコンテンツに対する暗号コミットメント)と、バリデータに支払う手数料が含まれています。 -3. バリデータは、送信された入札をレビューした上で、最も手数料が高い実行ペイロードを選択します。 バリデータは、ビルダー API を用いて、各自の署名と実行ペイロードヘッダーのみが含まれている「ブラインド」のビーコン用ブロック提案を作成し、ビルダーに送り返します。 +3. バリデータは、送信された入札をレビューした上で、最も手数料が高い実行ペイロードを選択します。 バリデータは、ビルダーAPIを用いて、各自の署名と実行ペイロードヘッダーのみが含まれている「ブラインド」のビーコン用ブロック提案を作成し、ビルダーに送り返します。 -4. ビルダー API を実行しているビルダーは、ブラインドのブロック提案を確認した上で、完全な実行ペイロードで対応すると想定されています。 これにより、バリデータは「署名済み」のビーコンブロックを作成し、ネットワークに拡散することができます。 +4. ビルダーAPIを実行しているビルダーは、ブラインドのブロック提案を確認した上で、完全な実行ペイロードで対応すると想定されています。 これにより、バリデータは「署名済み」のビーコンブロックを作成し、ネットワークに拡散することができます。 -5. ビルダー API を使用するバリデータの場合でも、ブロックビルダーが迅速に対応しない場合にブロック提案に伴う報酬が受け取れない場合を避けるために、ローカルでブロックを構築する必要があります。 しかしバリデータは、この時点で公開されたトランザクションあるいは他のセットを用いて別のブロックを作成することはできません。これは*曖昧化*(同じスロット内の 2 つのブロックに署名すること)を発生させるため、スラッシングの対象である違反行為です。 +5. ビルダーAPIを使用するバリデータの場合でも、ブロックビルダーが迅速に対応しない場合にブロック提案に伴う報酬が受け取れない場合を避けるために、ローカルでブロックを構築する必要があります。 しかしバリデータは、この時点で公開されたトランザクションあるいは他のセットを用いて別のブロックを作成することはできません。これは_曖昧化_(同じスロット内の2つのブロックに署名すること)を発生させるため、スラッシングの対象である違反行為です。 -ビルダー API の実装例としては、イーサリアムに対する MEV の悪影響を軽減するように[フラッシュボットのオークション機能](https://docs.flashbots.net/Flashbots-auction/overview/)を改善した[MEV Boost](https://github.com/flashbots/mev-boost)があります。 フラッシュボットのオークションでは、プルーフ・オブ・ワークを行うマイナーに対し、利益を伴うブロックを作成する作業を**サーチャー**と呼ばれる専門のユーザーに外注することが認められています。 +ビルダーAPIの実装例としては、イーサリアムに対するMEVの悪影響を軽減するように[フラッシュボットのオークション機能](https://docs.flashbots.net/Flashbots-auction/overview/)を改善した[MEV Boost](https://github.com/flashbots/mev-boost)があります。 フラッシュボットのオークションでは、プルーフ・オブ・ワークを行うマイナーに対し、利益を伴うブロックを作成する作業を**サーチャー**と呼ばれる専門のユーザーに外注することが認められています。 -サーチャーは、利益性が高い MEV の機会を発見するために、マイナーに対して[非公開の入札価格](https://en.wikipedia.org/wiki/First-price_sealed-bid_auction)と共にトランザクションバンドルを送信してブロックへの追加を求めます。 Go-Ethereum(Geth)クライアントの分岐後のバージョンである mev-geth を実行しているマイナーは、最も収益が大きいバンドルを選択し、それを新たなブロックの一部としてマイニングすればよいのです。 マイナーからスパムや無効のトランザクションから保護するため、トランザクションバンドルは、マイナーが受信する前に、**リレイヤー**による検証が行われます。 +サーチャーは、利益性が高いMEVの機会を発見するために、マイナーに対して[非公開の入札価格](https://en.wikipedia.org/wiki/First-price_sealed-bid_auction)と共にトランザクションバンドルを送信してブロックへの追加を求めます。 Go-Ethereum(Geth)クライアントの分岐後のバージョンであるmev-gethを実行しているマイナーは、最も収益が大きいバンドルを選択し、それを新たなブロックの一部としてマイニングすればよいのです。 マイナーからスパムや無効のトランザクションから保護するため、トランザクションバンドルは、マイナーが受信する前に、**リレイヤー**による検証が行われます。 -MEV Boost は、フラッシュボットにおける従来のオークションと同一の仕組みを採用していますが、イーサリアムにおけるプルーフ・オブ・ステークへの移行に対応した新機能が追加されています。 サーチャーが利益を伴う MEV トランザクションをブロックに追加しようとする点は同じですが、**ビルダー**と呼ばれる新たな専門ユーザーがトランザクションおよびバンドルをブロックにまとめる役割を担います。 ビルダーは、サーチャーから送信された非公開の入札価格を受け入れ、最適化を実行することで最も利益性が高い注文を決定します。 +MEV Boostは、フラッシュボットにおける従来のオークションと同一の仕組みを採用していますが、イーサリアムにおけるプルーフ・オブ・ステークへの移行に対応した新機能が追加されています。 サーチャーが利益を伴うMEVトランザクションをブロックに追加しようとする点は同じですが、**ビルダー**と呼ばれる新たな専門ユーザーがトランザクションおよびバンドルをブロックにまとめる役割を担います。 ビルダーは、サーチャーから送信された非公開の入札価格を受け入れ、最適化を実行することで最も利益性が高い注文を決定します。 -ここでもリレイヤーは、提案者に送信する事前にトランザクションを検証する責任を負う点は変わりません。 しかし MEV Boost では、ビルダーから送信されたブロックボディおよびバリデータから送信されたブロックヘッダーを保存することで、[データの可用性](/developers/docs/data-availability/)を提供する仕組みである**エスクロー**が導入されています。 エスクローでは、リレーに接続されたバリデータが利用可能な実行ペイロードを要求し、MEV Boost の注文アルゴリズムを用いて、入札価格および MEV チップが最も高いペイロードヘッダーを選択します。 +ここでもリレイヤーは、提案者に送信する事前にトランザクションを検証する責任を負う点は変わりません。 しかしMEV Boostでは、ビルダーから送信されたブロックボディおよびバリデータから送信されたブロックヘッダーを保存することで、[データの可用性](/developers/docs/data-availability/)を提供する仕組みである**エスクロー**が導入されています。 エスクローでは、リレーに接続されたバリデータが利用可能な実行ペイロードを要求し、MEV Boostの注文アルゴリズムを用いて、入札価格およびMEVチップが最も高いペイロードヘッダーを選択します。 -#### ビルダー API は、どのように MEV の悪影響を軽減するのか? {#how-does-builder-api-curb-mev-impact} +#### ビルダーAPIは、どのようにMEVの悪影響を軽減するのか? {#how-does-builder-api-curb-mev-impact} -ビルダー API がもたらす利点の核心は、MEV の抽出機会を利用できるユーザー層を民主化しうるという点にあります。 コミット=公開スキームを採用することで、信頼性の前提が必要なくなり、MEV から利益を得たいと考えるバリデータにおける参入障壁が低くなります。 このため、ソロステーカーが MEV による収益増を目指す場合に、大規模なステーキングプールに参入しなければならないという圧力が少なくなるでしょう。 +ビルダーAPIがもたらす利点の核心は、MEVの抽出機会を利用できるユーザー層を民主化しうるという点にあります。 コミット=公開スキームを採用することで、信頼性の前提が必要なくなり、MEVから利益を得たいと考えるバリデータにおける参入障壁が低くなります。 このため、ソロステーカーがMEVによる収益増を目指す場合に、大規模なステーキングプールに参入しなければならないという圧力が少なくなるでしょう。 -ビルダー API の実装が一般化すれば、ブロックビルダー間の競争が促進され、検閲耐性が高まるでしょう。 バリデータは、複数のビルダーからの入札をレビューするようになるため、1 件または複数のユーザートランザクションを検閲したいと考えるビルダーは、検閲の意図を持たないその他すべてのビルダーよりも高値を提示しなければならなくなります。 これにより、ユーザーを検閲するコストが劇的に上昇するため、検閲できるユーザーが減ると予想されます。 +ビルダーAPIの実装が一般化すれば、ブロックビルダー間の競争が促進され、検閲耐性が高まるでしょう。 バリデータは、複数のビルダーからの入札をレビューするようになるため、1件または複数のユーザートランザクションを検閲したいと考えるビルダーは、検閲の意図を持たないその他すべてのビルダーよりも高値を提示しなければならなくなります。 これにより、ユーザーを検閲するコストが劇的に上昇するため、検閲できるユーザーが減ると予想されます。 -MEV Boost をはじめとするいくつかのプロジェクトでは、フロントランニングやサンドイッチ取引などを開始したいトレーダーなど、特定のユーザーにトランザクションのプライバシーを提供するという全般的な構造設計の一環としてビルダー API を採用しています。 これは、ユーザーとブロックビルダー間に非公開のコミュニケーションチャネルを提供することで達成されます。 上述の許可済みメモリプールの場合とは異なり、このアプローチは以下の点で有益だと言えます: +MEV Boostをはじめとするいくつかのプロジェクトでは、フロントランニングやサンドイッチ取引などを開始したいトレーダーなど、特定のユーザーにトランザクションのプライバシーを提供するという全般的な構造設計の一環としてビルダーAPIを採用しています。 これは、ユーザーとブロックビルダー間に非公開のコミュニケーションチャネルを提供することで達成されます。 上述の許可済みメモリプールの場合とは異なり、このアプローチは以下の点で有益だと言えます: 1. 複数のビルダーが市場で共存することで、実務上検閲の意味がなくなるため、ユーザーにとって有益です。 反対に、集中型で信頼ベースのダークプールが存在する場合、数名のブロックビルダーに権力が集中し、検閲が発生する可能性が高まります。 -2. ビルダー API のソフトウェアはオープンソースであるため、どのユーザーでもブロックビルダー関連のサービスを提供できます。 これにより、ユーザーは特定のブロックビルダーの使用を強制されることがないため、イーサリアムの中立性やパーミッションレス性が向上します。 さらい、MEV の獲得を目指すトレーダーが、非公開のトランザクションチャネルを利用することで意図せずに集中化を促進してしまうことがなくなります。 +2. ビルダーAPIのソフトウェアはオープンソースであるため、どのユーザーでもブロックビルダー関連のサービスを提供できます。 これにより、ユーザーは特定のブロックビルダーの使用を強制されることがないため、イーサリアムの中立性やパーミッションレス性が向上します。 さらに、MEVの獲得を目指すトレーダーが、非公開のトランザクションチャネルを利用することで意図せずに集中化を促進してしまうことがなくなります。 ## 関連リソース {#related-resources} - [フラッシュボット関連文書](https://docs.flashbots.net/) -- [フラッシュボットの GitHub](https://github.com/flashbots/pm) -- [MEV-Explore](https://explore.flashbots.net/) - _MEV のトランザクションを対象とするダッシュボードおよび同時検索プログラム_ -- [mevboost.org](https://www.mevboost.org/) - _MEV-Boost リレーとブロックビルダーに関するリアルタイムの統計を提供するトラッカー_ +- [フラッシュボットのGitHub](https://github.com/flashbots/pm) +- [MEV-Explore](https://explore.flashbots.net/) - _MEVのトランザクションを対象とするダッシュボードおよび同時検索プログラム_ +- [mevboost.org](https://www.mevboost.org/) - _MEV-Boostリレーとブロックビルダーに関するリアルタイムの統計を提供するトラッカー_ ## 参考文献 {#further-reading} - [採掘可能価値(MEV)とは何か?](https://blog.chain.link/what-is-miner-extractable-value-mev/) -- [MEV と私](https://research.paradigm.xyz/MEV) +- [MEVと私](https://www.paradigm.xyz/2021/02/mev-and-me) - [イーサリアムはダークな森である](https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest/) - [ダークな森から抜け出すには](https://samczsun.com/escaping-the-dark-forest/) -- [フラッシュボッツ: MEV 危機をフロントランニングするには](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752) -- [@bertcmiller の MEV 関連スレッド](https://twitter.com/bertcmiller/status/1402665992422047747) -- [MEV-Boost: マージに対応した Flashbots のアーキテクチャ](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177) -- [MEV Boost とは](https://www.alchemy.com/overviews/mev-boost) -- [mev-boost を実行する理由](https://writings.flashbots.net/writings/why-run-mevboost/) +- [フラッシュボッツ: MEV危機をフロントランニングするには](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752) +- [@bertcmillerのMEV関連スレッド](https://twitter.com/bertcmiller/status/1402665992422047747) +- [MEV-Boost: マージに対応したFlashbotsのアーキテクチャ](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177) +- [MEV Boostとは](https://www.alchemy.com/overviews/mev-boost) +- [mev-boostを実行する理由](https://writings.flashbots.net/writings/why-run-mevboost/) - [イーサリアムへのヒッチハイク・ガイド](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) diff --git a/public/content/translations/ja/developers/docs/networking-layer/index.md b/public/content/translations/ja/developers/docs/networking-layer/index.md index 2e0de61d9b4..04c4127b861 100644 --- a/public/content/translations/ja/developers/docs/networking-layer/index.md +++ b/public/content/translations/ja/developers/docs/networking-layer/index.md @@ -5,11 +5,11 @@ lang: ja sidebarDepth: 2 --- -イーサリアムは、何千ものノードからなるピアツーピアネットワークですが、標準プロトコルを使用して、複数のノード間で直接的に相互に通信できる必要があります。 「ネットワークレイヤー」とは、これらのノードが互いを見つけて情報を交換可能とする為のプロトコルが集まったものです。 イーサリアムのネットワークレイヤーには、特定のノード間でのリクエストとレスポンスの交換(1 対 1 の通信)だけでなく、ネットワーク上での情報の「ゴシップ」(1 対多の通信)も含まれます。 各ノードは、正しい情報を送受信するために、特定のネットワークルールを遵守する必要があります。 +イーサリアムは、何千ものノードからなるピアツーピアネットワークですが、標準プロトコルを使用して、複数のノード間で直接的に相互に通信できる必要があります。 「ネットワークレイヤー」とは、これらのノードが互いを見つけて情報を交換可能とする為のプロトコルが集まったものです。 イーサリアムのネットワークレイヤーには、特定のノード間でのリクエストとレスポンスの交換(1対1の通信)だけでなく、ネットワーク上での情報の「ゴシップ」(1対多の通信)も含まれます。 各ノードは、正しい情報を送受信するために、特定のネットワークルールを遵守する必要があります。 -クライアントソフトウェアには 2 つの部分(実行クライアントとコンセンサスクライアント)があり、それぞれ独自のネットワークスタックを備えています。 他のイーサリアムノードと通信するだけでなく、実行クライアントとコンセンサスクライアントは互いに通信する必要があります。 このページでは、初心者向けに、この通信を可能にするプロトコルを説明をします。 +クライアントソフトウェアには2つの部分(実行クライアントとコンセンサスクライアント)があり、それぞれ独自のネットワークスタックを備えています。 他のイーサリアムノードと通信するだけでなく、実行クライアントとコンセンサスクライアントは互いに通信する必要があります。 このページでは、初心者向けに、この通信を可能にするプロトコルを説明をします。 -実行クライアントは、実行レイヤーのピアツーピアネットワーク上でトランザクションをゴシップします。 これには、認証されたピア同士の暗号化通信が必要です。 ブロックを提案するバリデータが選ばれると、そのノードのローカルトランザクションプールからトランザクションがローカル RPC 接続を介してコンセンサスクライアントに渡され、ビーコンブロックにパッケージ化されます。 コンセンサスクライアントはその後、ピアツーピアネットワーク上でビーコンブロックをゴシップします。 これは 2 つの別々のピアツーピアネットワークを必要とします。1 つはトランザクションゴシップのための実行クライアントを接続するもので、もう 1 つはブロックゴシップのためのコンセンサスクライアントを接続するものです。 +実行クライアントは、実行レイヤーのピアツーピアネットワーク上でトランザクションをゴシップします。 これには、認証されたピア同士の暗号化通信が必要です。 ブロックを提案するバリデータが選ばれると、そのノードのローカルトランザクションプールからトランザクションがローカルRPC接続を介してコンセンサスクライアントに渡され、ビーコンブロックにパッケージ化されます。 コンセンサスクライアントはその後、ピアツーピアネットワーク上でビーコンブロックをゴシップします。 これは2つの別々のピアツーピアネットワークを必要とします。1つはトランザクションゴシップのための実行クライアントを接続するもので、もう1つはブロックゴシップのためのコンセンサスクライアントを接続するものです。 ## 前提知識 {#prerequisites} @@ -17,25 +17,25 @@ sidebarDepth: 2 ## 実行レイヤー {#execution-layer} -実行レイヤーのネットワークプロトコルは、2 つのスタックに分割されています: +実行レイヤーのネットワークプロトコルは、2つのスタックに分割されています: -- ディスカバリースタック: UDP 上に構築され、新しいノードがピアに接続できるようにする +- ディスカバリースタック: UDP上に構築され、新しいノードがピアに接続できるようにする -- DevP2P スタック:TCP 上に構築され、ノードが情報交換できるようにする +- DevP2Pスタック:TCP上に構築され、ノードが情報交換できるようにする -両スタックは、並列的に動作します。 ディスカバリースタックは新しいネットワーク参加者をネットワークに送り込み、DevP2P スタックによって相互通信が可能になります。 +両スタックは、並列的に動作します。 ディスカバリースタックは新しいネットワーク参加者をネットワークに送り込み、DevP2Pスタックによって相互通信が可能になります。 ### ディスカバリー(Discovery) {#discovery} ディスカバリーとは、ネットワークの他のノードを見つけるプロセスです。 これは、小規模なブートノード(クライアントをすぐに見つけピアに接続できるように、アドレスがクライアントに [ハードコードされている](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go)ノード)を使用してブートストラップされています。 これらのブートノードは、新しいノードをピアのセットに追加するためにのみ存在します。これが唯一の目的で、チェーンの同期などの通常のクライアントタスクには参加せず、クライアントが初回起動した時にのみ使用されます。 -ノードとブートノードとのやり取りに使用されるプロトコルは、[Kademlia](https://medium.com/coinmonks/a-brief-overview-of-kademlia-and-its-use-in-various-decentralized-platforms-da08a7f72b8f)が修正された形式です。これは、[分散ハッシュテーブル](https://en.wikipedia.org/wiki/Distributed_hash_table)を使用してノードのリストを共有します。 各ノードには、最も近いピアに接続するために必要な情報を含む、分散ハッシュテーブルのバージョンがあります。 この「近さ」とは地理的なものではありません。ここでの距離はノードの ID の類似性によって定義されるものです。 各ノードのテーブルは、セキュリティ機能として定期的に更新されます。 例えば、 [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5)では、ディスカバリープロトコルのノードは、クライアントがサポートするサブプロトコルを表示する「広告」を送信することもでき、ピアは両者が通信に使用できるプロトコルについて取り決めることができます。 +ノードとブートノードとのやり取りに使用されるプロトコルは、[Kademlia](https://medium.com/coinmonks/a-brief-overview-of-kademlia-and-its-use-in-various-decentralized-platforms-da08a7f72b8f)が修正された形式です。これは、[分散ハッシュテーブル](https://en.wikipedia.org/wiki/Distributed_hash_table)を使用してノードのリストを共有します。 各ノードには、最も近いピアに接続するために必要な情報を含む、分散ハッシュテーブルのバージョンがあります。 この「近さ」とは地理的なものではありません。ここでの距離はノードのIDの類似性によって定義されるものです。 各ノードのテーブルは、セキュリティ機能として定期的に更新されます。 例えば、 [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5)では、ディスカバリープロトコルのノードは、クライアントがサポートするサブプロトコルを表示する「広告」を送信することもでき、ピアは両者が通信に使用できるプロトコルについて取り決めることができます。 -ディスカバリーは、PING-PONG から始まります。 ピンポンが成功すると、新しいノードはブートノードに「結合」されます。 ネットワークに入る新しいノードの存在をブートノードに通知する最初のメッセージは `PING` です。 この`PING`には、新しいノード、ブートノード、および期限切れのタイムスタンプに関するハッシュ化された情報が含まれています。 ブートノードは`PING`を受信し、 `PING` のハッシュを含む`PONG`を返します。 `PING`と`PONG`のハッシュが一致すると、新しいノードとブートノードの接続が確認され、「結合」されたと言うことになります。 +ディスカバリーは、PING-PONGから始まります。 ピンポンが成功すると、新しいノードはブートノードに「結合」されます。 ネットワークに入る新しいノードの存在をブートノードに通知する最初のメッセージは `PING` です。 この`PING`には、新しいノード、ブートノード、および期限切れのタイムスタンプに関するハッシュ化された情報が含まれています。 ブートノードは`PING`を受信し、 `PING` のハッシュを含む`PONG`を返します。 `PING`と`PONG`のハッシュが一致すると、新しいノードとブートノードの接続が確認され、「結合」されたと言うことになります。 一度結合されると、新しいノードはブートノードに`FIND-NEIGHBOURS`リクエストを送信できるようになります。 ブートノードから返されるデータには、新しいノードが接続できるピアのリストが含まれています。 ノードが結合されていない場合、`FIND-NEIGHBOURS`リクエストは失敗となるため、新しいノードはネットワークに入ることができません。 -新しいノードは、ブートノードから近隣ノードのリストを受け取ると、それぞれのノードと PING-PONG を開始します。 PING-PONG が成功すると、新しいノードとその隣接ノードが結合され、メッセージの交換が可能になります。 +新しいノードは、ブートノードから近隣ノードのリストを受け取ると、それぞれのノードとPING-PONGを開始します。 PING-PONGが成功すると、新しいノードとその隣接ノードが結合され、メッセージの交換が可能になります。 ``` start client --> connect to bootnode --> bond to bootnode --> find neighbours --> bond to neighbours @@ -45,39 +45,39 @@ start client --> connect to bootnode --> bond to bootnode --> find neighbours -- #### ENR: イーサリアムノードレコード(Ethereum Node Record) {#enr} -[イーサリアムノードレコード (ENR)](/developers/docs/networking-layer/network-addresses/) とは、署名(合意された 認証スキームに従って作成されたレコード内容のハッシュ)、レコードへの変更を追跡するシーケンス番号、およびキーと値のペアの任意のリストという 3 つの基本要素を含むオブジェクトのことです。 これは、新しいピア間で識別情報の交換を容易にする、将来性のあるフォーマットで、イーサリアムノードの[ネットワークアドレス](/developers/docs/networking-layer/network-addresses)の優先フォーマットです。 +[イーサリアムノードレコード (ENR)](/developers/docs/networking-layer/network-addresses/) とは、署名(合意された 認証スキームに従って作成されたレコード内容のハッシュ)、レコードへの変更を追跡するシーケンス番号、およびキーと値のペアの任意のリストという3つの基本要素を含むオブジェクトのことです。 これは、新しいピア間で識別情報の交換を容易にする、将来性のあるフォーマットで、イーサリアムノードの[ネットワークアドレス](/developers/docs/networking-layer/network-addresses)の優先フォーマットです。 -#### ディスカバリーが UDP で構築されている理由 {#why-udp} +#### ディスカバリーがUDPで構築されている理由 {#why-udp} -UDP はエラーチェック、失敗したパケットの再送、接続の動的な開閉をサポートしません。UDP は、受信に成功したかどうかにかかわらず、単にターゲットに対して連続的な情報ストリームを送信するだけです。 こうした最小限の機能により、オーバーヘッドも最小限に抑えられ、接続は非常に高速になります。 ノードが単に自分の存在を知らせ、相手との正式な接続を確立するためのディスカバリーにとっては、UDP で十分に要件を満たすことができます。 しかし、ディスカバリー以外の残りのネットワークスタックにとっては、UDP では目的を満たすことはできません。 ノード間の情報交換は非常に複雑であるため、再送信やエラーチェックなどに対応できる、より高機能なプロトコルが必要です。 TCP に付随する追加のオーバーヘッドは、まさにこうした追加機能として必要な要件を満たしています。 したがって、P2P スタックの大部分は TCP で動作することになります。 +UDPはエラーチェック、失敗したパケットの再送、接続の動的な開閉をサポートしません。UDPは、受信に成功したかどうかにかかわらず、単にターゲットに対して連続的な情報ストリームを送信するだけです。 こうした最小限の機能により、オーバーヘッドも最小限に抑えられ、接続は非常に高速になります。 ノードが単に自分の存在を知らせ、相手との正式な接続を確立するためのディスカバリーにとっては、UDPで十分に要件を満たすことができます。 しかし、ディスカバリー以外の残りのネットワークスタックにとっては、UDPでは目的を満たすことはできません。 ノード間の情報交換は非常に複雑であるため、再送信やエラーチェックなどに対応できる、より高機能なプロトコルが必要です。 TCPに付随する追加のオーバーヘッドは、まさにこうした追加機能として必要な要件を満たしています。 したがって、P2Pスタックの大部分はTCPで動作することになります。 ### DevP2P {#devp2p} -DevP2P は、それ自体がピアツーピアネットワークの確立と維持するためにイーサリアムが実装しているプロトコルのスタックをすべてを包括しています。 新しいノードがネットワークに参加した後、その相互通信は[DevP2P](https://github.com/ethereum/devp2p)スタックのプロトコルによって制御されます。 これらはすべて TCP 上にあり、RLPx トランスポートプロトコル、ワイヤプロトコル、およびいくつかのサブプロトコルが含まれています。 [RLPx](https://github.com/ethereum/devp2p/blob/master/rlpx.md)は、ノード間のセッションを開始、認証、維持するためのプロトコルです。 RLPx はデータをノード間で送信するための最小限の構造にエンコードする非常にスペース効率の良い RLP (再帰的な長さのプレフィックス)を使ってメッセージをエンコードします。 +DevP2Pは、それ自体がピアツーピアネットワークの確立と維持するためにイーサリアムが実装しているプロトコルのスタックをすべてを包括しています。 新しいノードがネットワークに参加した後、その相互通信は[DevP2P](https://github.com/ethereum/devp2p)スタックのプロトコルによって制御されます。 これらはすべてTCP上にあり、RLPxトランスポートプロトコル、ワイヤプロトコル、およびいくつかのサブプロトコルが含まれています。 [RLPx](https://github.com/ethereum/devp2p/blob/master/rlpx.md)は、ノード間のセッションを開始、認証、維持するためのプロトコルです。 RLPxはデータをノード間で送信するための最小限の構造にエンコードする非常にスペース効率の良いRLP (再帰的な長さのプレフィックス)を使ってメッセージをエンコードします。 -2 つのノード間の RLPx セッションは、最初の暗号化ハンドシェイクで始まります。 このプロセスには、ノードが auth メッセージを送信し、ピアによって検証されることが含まれます。 検証に成功すると、ピアは auth-acknowledgement メッセージを生成し、イニシエーター・ノードに返します。 これは、ノードが非公開で安全に通信できるようにするための鍵交換プロセスです。 暗号化ハンドシェイクが成功すると、両ノードに「Hello」メッセージを互いに「ワイヤ上」で送信するようにトリガーします。 Hello メッセージの交換に成功すると、ワイヤプロトコルが開始されます。 +2つのノード間のRLPxセッションは、最初の暗号化ハンドシェイクで始まります。 このプロセスには、ノードがauthメッセージを送信し、ピアによって検証されることが含まれます。 検証に成功すると、ピアはauth-acknowledgementメッセージを生成し、イニシエーター・ノードに返します。 これは、ノードが非公開で安全に通信できるようにするための鍵交換プロセスです。 暗号化ハンドシェイクが成功すると、両ノードに「Hello」メッセージを互いに「ワイヤ上」で送信するようにトリガーします。 Helloメッセージの交換に成功すると、ワイヤプロトコルが開始されます。 -Hello メッセージには以下が含まれます。 +Helloメッセージには以下が含まれます。 - プロトコルバージョン -- クライアント ID +- クライアントID - ポート -- ノード ID +- ノードID - サポートされるサブプロトコルのリスト これらは両ノード間で相互作用を成功させるために、共有される機能を定義し、通信を構成するのに必要な情報です。 各ノードがサポートするサブプロトコルのリストを比較し、両ノードに共通するものをセッションで使用できるようにするサブプロトコルネゴシエーションというプロセスがあります。 -ワイヤプロトコルは、Hello メッセージとともに、接続が終了することを相手に警告する「切断」メッセージも送信することができます。 ワイヤプロトコルは、セッションを開いたままにするために定期的に送信される PING と PONG メッセージも含んでいます。 したがって、RLPx とワイヤプロトコルの交換は、ノード間の通信の基礎を確立し、特定のサブプロトコルに従って交換される有用な情報のための土台を提供します。 +ワイヤプロトコルは、Helloメッセージとともに、接続が終了することを相手に警告する「切断」メッセージも送信することができます。 ワイヤプロトコルは、セッションを開いたままにするために定期的に送信されるPINGとPONGメッセージも含んでいます。 したがって、RLPxとワイヤプロトコルの交換は、ノード間の通信の基礎を確立し、特定のサブプロトコルに従って交換される有用な情報のための土台を提供します。 ### サブプロトコル {#sub-protocols} #### ワイヤプロトコル {#wire-protocol} -ピアが接続され、RLPx セッションが開始されると、ワイヤプロトコルはピアがどのように通信するかを定義します。 当初、ワイヤプロトコルは、チェーンの同期、ブロックの伝搬、トランザクションの交換という 3 つの主要なタスクを定義していました。 しかし、イーサリアムがプルーフ・オブ・ステーク(PoS)に移行すると、ブロック伝搬とチェーン同期はコンセンサスレイヤーの一部となりました。 トランザクションの交換は、依然として実行クライアントの範疇にあります。 トランザクションの交換とは、保留中のトランザクションをノード間で交換し、マイナーがその一部を次のブロックに含めるために選択できるようにすることです。 これらのタスクの詳細については、[こちら](https://github.com/ethereum/devp2p/blob/master/caps/eth.md)をご覧ください。 これらのサブプロトコルをサポートするクライアントは、[JSON-RPC](/developers/docs/apis/json-rpc/)を介してそれらを公開します。 +ピアが接続され、RLPxセッションが開始されると、ワイヤプロトコルはピアがどのように通信するかを定義します。 当初、ワイヤプロトコルは、チェーンの同期、ブロックの伝搬、トランザクションの交換という3つの主要なタスクを定義していました。 しかし、イーサリアムがプルーフ・オブ・ステーク(PoS)に移行すると、ブロック伝搬とチェーン同期はコンセンサスレイヤーの一部となりました。 トランザクションの交換は、依然として実行クライアントの範疇にあります。 トランザクションの交換とは、保留中のトランザクションをノード間で交換し、マイナーがその一部を次のブロックに含めるために選択できるようにすることです。 これらのタスクの詳細については、[こちら](https://github.com/ethereum/devp2p/blob/master/caps/eth.md)をご覧ください。 これらのサブプロトコルをサポートするクライアントは、[JSON-RPC](/developers/docs/apis/json-rpc/)を介してそれらを公開します。 #### ライト・イーサリアム・サブプロトコル(les) {#les} -これは、ライトクライアントの同期用の最小限のプロトコルです。 フルノードはインセンティブなしにライトクライアントにデータを提供する必要があるため、従来このプロトコルはほとんど使用されてきませんでした。 実行クライアントのデフォルトの動作は、les でライトクライアントのデータを提供しないようになっています。 詳細については、les [仕様](https://github.com/ethereum/devp2p/blob/master/caps/les.md)をご確認ください。 +これは、ライトクライアントの同期用の最小限のプロトコルです。 フルノードはインセンティブなしにライトクライアントにデータを提供する必要があるため、従来このプロトコルはほとんど使用されてきませんでした。 実行クライアントのデフォルトの動作は、lesでライトクライアントのデータを提供しないようになっています。 詳細については、les [仕様](https://github.com/ethereum/devp2p/blob/master/caps/les.md)をご確認ください。 #### スナップ(Snap) {#snap} @@ -89,7 +89,7 @@ Hello メッセージには以下が含まれます。 #### ウィスパー(Whisper) {#whisper} -ウィスパーは、ブロックチェーンに情報を書き込むことなくピア間で安全なメッセージングを提供することを目的としたプロトコルです。 DevP2P ワイヤープロトコルの一部でしたが、現在は非推奨となっています。 他にも同様の目的を持つ[関連プロジェクト](https://wakunetwork.com/)があります。 +ウィスパーは、ブロックチェーンに情報を書き込むことなくピア間で安全なメッセージングを提供することを目的としたプロトコルです。 DevP2Pワイヤープロトコルの一部でしたが、現在は非推奨となっています。 他にも同様の目的を持つ[関連プロジェクト](https://wakunetwork.com/)があります。 ## コンセンサスレイヤー(consensus layer) {#consensus-layer} @@ -97,52 +97,52 @@ Hello メッセージには以下が含まれます。 ### ディスカバリ {#consensus-discovery} -実行クライアントと同様に、コンセンサスクライアントもピアを見つけるために UDP 上の [discv5](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-discovery-domain-discv5) を使用します。 コンセンサスレイヤーの discv5 の実装は、discv5 を[libP2P](https://libp2p.io/)スタックに接続するアダプターを含んでおり、DevP2P を非推奨としている点のみ、実行クライアントの実装と異なります。 実行レイヤーの RLPx セッションは廃止され、libP2P のノイズセキュアチャネル・ハンドシェイクが採用されています。 +実行クライアントと同様に、コンセンサスクライアントもピアを見つけるためにUDP上の [discv5](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-discovery-domain-discv5) を使用します。 コンセンサスレイヤーのdiscv5の実装は、discv5を[libP2P](https://libp2p.io/)スタックに接続するアダプターを含んでおり、DevP2Pを非推奨としている点のみ、実行クライアントの実装と異なります。 実行レイヤーのRLPxセッションは廃止され、libP2Pのノイズセキュアチャネル・ハンドシェイクが採用されています。 ### ENR {#consensus-enr} -コンセンサスノードの ENR には、ノードの公開鍵、IP アドレス、UDP および TCP ポート、コンセンサス特有の 2 つのフィールド(認証サブネットビットフィールドと`eth2`)が含まれます。 前者は、ノードが特定の認証ゴシップ・サブネットワークに参加しているピアを見つけやすくします。 `eth2`キーには、ノードが使用しているイーサリアムフォークのバージョンに関する情報が含まれており、ピアが正しいイーサリアムに接続していることを確認できます。 +コンセンサスノードのENRには、ノードの公開鍵、IPアドレス、UDPおよび TCP ポート、コンセンサス特有の2つのフィールド(認証サブネットビットフィールドと`eth2`)が含まれます。 前者は、ノードが特定の認証ゴシップ・サブネットワークに参加しているピアを見つけやすくします。 `eth2`キーには、ノードが使用しているイーサリアムフォークのバージョンに関する情報が含まれており、ピアが正しいイーサリアムに接続していることを確認できます。 ### libP2P {#libp2p} -libP2P スタックは、ディスカバリー後のすべての通信をサポートします。 クライアントは、ENR で定義された IPv4 および/または IPv6 でダイヤルおよびリッスンできます。 libP2P レイヤーのプロトコルは、ゴシップとリクエスト/レスポンスのドメインに細分化されます。 +libP2Pスタックは、ディスカバリー後のすべての通信をサポートします。 クライアントは、ENRで定義されたIPv4および/またはIPv6でダイヤルおよびリッスンできます。 libP2Pレイヤーのプロトコルは、ゴシップとリクエスト/レスポンスのドメインに細分化されます。 ### ゴシップ(Gossip) {#gossip} -ゴシップドメインは、ネットワーク全体に直ぐに広まる必要のあるすべての情報を含みます。 これには、ビーコンブロック、証明、アテステーション、イグジット、スラッシングが含まれます。 これは libP2P ゴシップサブ v1 を使って送信され、受信・送信するゴシップペイロードの最大サイズなどの各ノードにローカルに保存されている様々なメタデータに依存します。 ゴシップドメインに関する詳細な情報は、[こちら](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub)をご覧ください。 +ゴシップドメインは、ネットワーク全体に直ぐに広まる必要のあるすべての情報を含みます。 これには、ビーコンブロック、証明、アテステーション、イグジット、スラッシングが含まれます。 これはlibP2Pゴシップサブ v1を使って送信され、受信・送信するゴシップペイロードの最大サイズなどの各ノードにローカルに保存されている様々なメタデータに依存します。 ゴシップドメインに関する詳細な情報は、[こちら](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub)をご覧ください。 ### リクエスト/レスポンス(Request-response) {#request-response} -リクエスト/レスポンス・ドメインには、クライアントがピアに特定の情報を要求するためのプロトコルが含まれます。 例えば、あるルートハッシュに一致する特定のビーコンブロックや、スロット範囲内のビーコンブロックのリクエストなどがあります。 レスポンスは常に snappy(圧縮アルゴリズムの一つ)圧縮された SSZ エンコードバイトとして返されます。 +リクエスト/レスポンス・ドメインには、クライアントがピアに特定の情報を要求するためのプロトコルが含まれます。 例えば、あるルートハッシュに一致する特定のビーコンブロックや、スロット範囲内のビーコンブロックのリクエストなどがあります。 レスポンスは常にsnappy(圧縮アルゴリズムの一つ)圧縮されたSSZエンコードバイトとして返されます。 -## コンセンサスクライアントで RLP より SSZ が好まれる理由 {#ssz-vs-rlp} +## コンセンサスクライアントでRLPよりSSZが好まれる理由 {#ssz-vs-rlp} -SSZ は、シンプル・シリアライゼーションの略です。 SSZ は、固定オフセットを使うことで、構造全体をデコードすることなく、エンコードされたメッセージの個々の部分を簡単にデコードすることができます。これは、エンコードされたメッセージから特定の情報を効率的に取得できるため、コンセンサスクライアントにとって非常に便利な機能です。 また、マークルプロトコルと統合するように特別に設計されており、マークル化に関連した効率化も得られます。 コンセンサスレイヤーのハッシュはすべてマークルルートであるため、これは大きな改善となります。 また、SSZ は値の一意性も保証します。 +SSZは、シンプル・シリアライゼーションの略です。 SSZは、固定オフセットを使うことで、構造全体をデコードすることなく、エンコードされたメッセージの個々の部分を簡単にデコードすることができます。これは、エンコードされたメッセージから特定の情報を効率的に取得できるため、コンセンサスクライアントにとって非常に便利な機能です。 また、マークルプロトコルと統合するように特別に設計されており、マークル化に関連した効率化も得られます。 コンセンサスレイヤーのハッシュはすべてマークルルートであるため、これは大きな改善となります。 また、SSZは値の一意性も保証します。 ## 実行クライアントとコンセンサスクライアントの接続 {#connecting-clients} -コンセンサスクライアントと実行クライアントは、並列に動作します。 コンセンサスクライアントが実行クライアントに指示を出し、実行クライアントがコンセンサスクライアントにトランザクション・バンドルを渡してビーコンブロックに含めることができるように、両者は接続されている必要があります。 両クライアント間の通信は、ローカル RPC 接続を使用して実現することができます。 [「エンジン API」](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) と呼ばれる API が、両クライアント間で送信される命令を定義します。 両クライアントは単一のネットワーク ID の背後に位置するため、各クライアントの個別のキー(eth1 キーと eth2 キー)を含む ENR(イーサリアムノードレコード)を共有します。 +コンセンサスクライアントと実行クライアントは、並列に動作します。 コンセンサスクライアントが実行クライアントに指示を出し、実行クライアントがコンセンサスクライアントにトランザクション・バンドルを渡してビーコンブロックに含めることができるように、両者は接続されている必要があります。 両クライアント間の通信は、ローカルRPC接続を使用して実現することができます。 [「エンジンAPI」](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) と呼ばれるAPIが、両クライアント間で送信される命令を定義します。 両クライアントは単一のネットワークIDの背後に位置するため、各クライアントの個別のキー(eth1キーとeth2キー)を含むENR(イーサリアムノードレコード)を共有します。 制御フローの概要を以下に示します。括弧内は関連するネットワークスタックです。 ### コンセンサスクライアントがブロック生成者でない場合: -- コンセンサスクライアントがブロック・ゴシップ・プロトコル(コンセンサス p2p)を介してブロックを受信する +- コンセンサスクライアントがブロック・ゴシップ・プロトコル(コンセンサスp2p)を介してブロックを受信する - コンセンサスクライアントはブロックを事前に検証し、確正しいメタデータを持つ有効な送信者からのものであることを確実にする -- ブロックのトランザクションが実行ペイロードとして実行レイヤーに送信される(ローカル RPC 接続) +- ブロックのトランザクションが実行ペイロードとして実行レイヤーに送信される(ローカルRPC接続) - 実行レイヤーはトランザクションを実行し、ブロックヘッダーの状態を検証する(ハッシュ値の一致をチェックする) -- 実行レイヤーは検証データをコンセンサスレイヤーに返し、ブロックは検証済みとみなされる(ローカル RPC 接続) -- コンセンサスレイヤーはブロックを自分のブロックチェーンの先頭に追加して証明し、そのアテステーション(証明)をネットワーク上にブロードキャストする(コンセンサス p2p) +- 実行レイヤーは検証データをコンセンサスレイヤーに返し、ブロックは検証済みとみなされる(ローカルRPC接続) +- コンセンサスレイヤーはブロックを自分のブロックチェーンの先頭に追加して証明し、そのアテステーション(証明)をネットワーク上にブロードキャストする(コンセンサスp2p) ### コンセンサスクライアントがブロック生成者の場合: - コンセンサスクライアントが次のブロック生成者であることを通知される(consensus p2p) -- コンセンサスレイヤーが実行クライアントの`create block`メソッドを呼び出す(ローカル RPC) -- 実行レイヤーは、トランザクション・ゴシップ・プロトコルによって生成されたトランザクション・メンプールにアクセスする(実行 p2p) +- コンセンサスレイヤーが実行クライアントの`create block`メソッドを呼び出す(ローカルRPC) +- 実行レイヤーは、トランザクション・ゴシップ・プロトコルによって生成されたトランザクション・メンプールにアクセスする(実行p2p) - 実行クライアントはトランザクションをブロックにまとめ、トランザクションを実行し、ブロックハッシュを生成する -- コンセンサスクライアントは実行クライアントからトランザクションとブロックハッシュを取得し、ビーコンブロックに追加する(ローカル RPC) -- コンセンサスクライアントは、ブロック・ゴシップ・プロトコルでブロックをブロードキャストする(コンセンサス p2p) -- 他のクライアントが、ブロック・ゴシップ・プロトコルで提案されたブロックを受信し、上記のように検証する(コンセンサス p2p) +- コンセンサスクライアントは実行クライアントからトランザクションとブロックハッシュを取得し、ビーコンブロックに追加する(ローカルRPC) +- コンセンサスクライアントは、ブロック・ゴシップ・プロトコルでブロックをブロードキャストする(コンセンサスp2p) +- 他のクライアントが、ブロック・ゴシップ・プロトコルで提案されたブロックを受信し、上記のように検証する(コンセンサスp2p) 十分な数のバリデータによってブロックが認証されると、チェーンの先頭に追加され、正当性が確認された後、最終的に確定(ファイナライズ)される。 @@ -152,4 +152,4 @@ SSZ は、シンプル・シリアライゼーションの略です。 SSZ は ## 参考文献 {#further-reading} -[DevP2P](https://github.com/ethereum/devp2p) [LibP2p](https://github.com/libp2p/specs) [コンセンサスレイヤーネットワークの仕様](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure) カデムリアから discv5[discv5](https://vac.dev/kademlia-to-discv5) [カデムリアペーパー](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf) [Ethereum ピアツーピア入門](https://p2p.paris/en/talks/intro-ethereum-networking/) [eth1eth2 の関係](http://ethresear.ch/t/eth1-eth2-client-relationship/7248) [マージと eth2 クライアントの詳細に関するビデオ](https://www.youtube.com/watch?v=zNIrIninMgg) +[DevP2P](https://github.com/ethereum/devp2p) [LibP2p](https://github.com/libp2p/specs) [コンセンサスレイヤーネットワークの仕様](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure) カデムリアからdiscv5[discv5](https://vac.dev/kademlia-to-discv5) [カデムリアペーパー](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf) [Ethereumピアツーピア入門](https://p2p.paris/en/talks/intro-ethereum-networking/) [eth1eth2の関係](http://ethresear.ch/t/eth1-eth2-client-relationship/7248) [マージとeth2クライアントの詳細に関するビデオ](https://www.youtube.com/watch?v=zNIrIninMgg) diff --git a/public/content/translations/ja/developers/docs/networking-layer/network-addresses/index.md b/public/content/translations/ja/developers/docs/networking-layer/network-addresses/index.md index 987bb67327d..8f73d42338a 100644 --- a/public/content/translations/ja/developers/docs/networking-layer/network-addresses/index.md +++ b/public/content/translations/ja/developers/docs/networking-layer/network-addresses/index.md @@ -5,7 +5,7 @@ lang: ja sidebarDepth: 2 --- -イーサリアムノードがピアに接続するには、いくつかの基本情報で自分自身を識別する必要があります。 潜在的なピアがこの情報を解釈できるようにするため、イーサリアムノードが理解できる 3 つの標準化されたフォーマット(multiaddr、enode、イーサリアム・ノード・レコード(ENR))のいずれかで伝えられます。 なお、イーサリアム・ノード・レコード(ENR)はイーサリアム・ネットワークアドレスの現在の標準です。 +イーサリアムノードがピアに接続するには、いくつかの基本情報で自分自身を識別する必要があります。 潜在的なピアがこの情報を解釈できるようにするため、イーサリアムノードが理解できる3つの標準化されたフォーマット(multiaddr、enode、イーサリアム・ノード・レコード(ENR))のいずれかで伝えられます。 なお、イーサリアム・ノード・レコード(ENR)はイーサリアム・ネットワークアドレスの現在の標準です。 ## 前提知識 {#prerequisites} @@ -13,25 +13,25 @@ sidebarDepth: 2 ## マルチアドレス(Multiaddr) {#multiaddr} -元々、イーサリアムノードのアドレス形式は「multiaddr」(マルチアドレスの略)でした。 Multiaddr は、ピアツーピアネットワーク用に設計された汎用フォーマットです。 アドレスは、キーと値をスラッシュで区切った key-value のペアで表現されます。 例えば、IPv4 アドレス`192.168.22.27`で TCP ポート`33000`をリッスンしているノードの multiaddr は、次のようになります。 +元々、イーサリアムノードのアドレス形式は「multiaddr」(マルチアドレスの略)でした。 Multiaddrは、ピアツーピアネットワーク用に設計された汎用フォーマットです。 アドレスは、キーと値をスラッシュで区切ったkey-valueのペアで表現されます。 例えば、IPv4アドレス`192.168.22.27`でTCPポート`33000`をリッスンしているノードのmultiaddrは、次のようになります。 `/ip4/192.168.22.27/tcp/33000` -イーサリアムノードの場合、multiaddr にノード ID(公開鍵のハッシュ値)が含まれます。 +イーサリアムノードの場合、multiaddrにノードID(公開鍵のハッシュ値)が含まれます。 `/ip4/192.168.22.27/tcp/33000/p2p/5t7Nv7dG2d6ffbvAiewVsEwWweU3LdebSqX2y1bPrW8br` ## enode {#enode} -enode とは、URL アドレス形式を用いたイーサリアムノードの識別方法です。 16 進数のノード ID は、URL のユーザーネーム部分がエンコードされ、@記号を用いてホストと区切られます。 ホスト名には IP アドレスのみを指定することができ、DNS 名は指定できません。 ホスト名セクションのポートは、TCP リスニングポートです。 TCP ポートと UDP(ディスカバリー)ポートが異なる場合は、UDP ポートをクエリパラメータ 「discport 」で指定します。 +enodeとは、URLアドレス形式を用いたイーサリアムノードの識別方法です。 16進数のノードIDは、URLのユーザーネーム部分がエンコードされ、@記号を用いてホストと区切られます。 ホスト名にはIPアドレスのみを指定することができ、DNS名は指定できません。 ホスト名セクションのポートは、TCPリスニングポートです。 TCPポートとUDP(ディスカバリー)ポートが異なる場合は、UDPポートをクエリパラメータ 「discport 」で指定します。 -次の例では、ノード URL は IP アドレス`10.3.58.6`、TCP ポート`30303`、UDP ディスカバリーポート `30301`のノードを記述しています。 +次の例では、ノードURLはIPアドレス`10.3.58.6`、TCPポート`30303`、UDPディスカバリーポート `30301`のノードを記述しています。 `enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303?discport=30301` ## イーサリアム・ノード・レコード(ENR) {#enr} -イーサリアム・ノード・レコード(ENR) は、イーサリアム 上のネットワークアドレス用に標準化されたフォーマットです。 ENR は、multiaddr と enode に取って代わるものです。 ENR はノード間でより大きな情報交換を可能にするため、特に有用です。 ENR には署名、シーケンス番号、および署名の生成と検証に使用される ID スキームの詳細を示すフィールドが含まれます。 ENR には、key-value ペアとして編成された任意のデータを入力することも可能です。 これらの key-value ペアには、ノードの IP アドレスと、ノードが使用できるサブプロトコルの情報が含まれています。 コンセンサスクライアントは、ブートノードを特定するために [固有の ENR 構造](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure)を使用し、現在のイーサリアムフォークとアテステーション(認証)ゴシップサブネットに関する情報を含む`eth2`フィールドを含みます(これにより、アテステーションが集約されている特定のピアセットにノードを接続します)。 +イーサリアム・ノード・レコード(ENR) は、イーサリアム 上のネットワークアドレス用に標準化されたフォーマットです。 ENRは、multiaddrとenodeに取って代わるものです。 ENRはノード間でより大きな情報交換を可能にするため、特に有用です。 ENRには署名、シーケンス番号、および署名の生成と検証に使用されるIDスキームの詳細を示すフィールドが含まれます。 ENRには、key-valueペアとして編成された任意のデータを入力することも可能です。 これらのkey-valueペアには、ノードのIPアドレスと、ノードが使用できるサブプロトコルの情報が含まれています。 コンセンサスクライアントは、ブートノードを特定するために [固有のENR構造](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure)を使用し、現在のイーサリアムフォークとアテステーション(認証)ゴシップサブネットに関する情報を含む`eth2`フィールドを含みます(これにより、アテステーションが集約されている特定のピアセットにノードを接続します)。 ## 参考文献 {#further-reading} diff --git a/public/content/translations/ja/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/ja/developers/docs/networking-layer/portal-network/index.md new file mode 100644 index 00000000000..8b2327ad5ac --- /dev/null +++ b/public/content/translations/ja/developers/docs/networking-layer/portal-network/index.md @@ -0,0 +1,82 @@ +--- +title: ポータルネットワーク +description: リソースが少ないクライアントをサポートするように設計され、現在開発中のネットワークである「ポータルネットワーク」の概要 +lang: ja +--- + +イーサリアムは、イーサリアムクライアントソフトウェアを実行するコンピュータによって構成されるネットワークです。 これらの各コンピュータは、「ノード」と呼ばれます。 クライアントソフトウェアは、イーサリアムネットワーク上でデータの送受信を行い、イーサリアムプロトコルのルールに従ってデータを検証します。 ノードは、自身のディスクストレージ内に大量の履歴データを保存し、ネットワーク上にある他のノードからブロックとして知られる新しいパケット情報を受信すると、その履歴データに追加します。 このデータは、ノードが他のネットワークと一貫した情報を持っていることを常時確認するために必要となります。 つまり、ノードの実行には大量のディスクスペースが必要ということになります。 また、一部のノードの操作では、大量のRAMが必要になる場合があります。 + +そこで、このディスクストレージに関する問題を回避するために、すべての情報をクライアント自身に保存する代わりに、フルノードへ情報をリクエストする「ライト」ノードが開発されました。 しかし、ライトノードは自分で情報を検証できないため、代わりに別のノードを信用する必要があります。 つまり、ライトノードに情報を提供するために、フルノードが追加の処理を行う必要があるということになります。 + +ポータルネットワークは、イーサリアムにおける新たなネットワーク設計です。フルノードを信頼することなく、余計な負担をかけずに、必要なデータをネットワーク全体で小さな塊に分けて共有することで、「ライト」ノードのデータ可用性問題を解決することを目指しています。 + +[ノードとクライアントの詳細](/developers/docs/nodes-and-clients/) + +## ポータルネットワークが必要な理由 {#why-do-we-need-portal-network} + +イーサリアムノードは、イーサリアムブロックチェーンの全部または一部のコピーを保存します。 このローカルコピーを使って、トランザクションを検証し、ノードが正しいチェーンに進むよう徹底します。 また、このローカルに保存したデータにより、受信データが有効かつ正当であることを、他のエンティティを信頼せずに独立して検証できます。 + +ブロックチェーンのローカルコピーや、それに関連付いた状態およびレシートデータなどは、ノードのハードディスク容量を大量に消費します。 例えば、コンセンサスクライアントをペアにした[Geth](https://geth.ethereum.org)ノードを立ち上げるには、2 TBのハードディスクが推奨されています。 スナップ同期を使用すると、比較的最近のブロックのセットがもつチェーンデータのみを保存しますが、Gethでは一般的に、約650 GBのディスク容量を使います。また、一週間で約14 GB増加します(ノードを定期的に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 API](/developers/docs/apis/json-rpc/)を通して特定のデータを提供することもできます。このAPIにより、アプリやウォレットは、イーサリアムノードと情報を交換できます。 しかし、ライトクライアントへデータを提供する理想的なプロトコルは存在していません。 + +現状では、ライトクライアントは、DevP2PまたはlibP2pを使って、特定のチェーンデータの一部分をリクエストすることができません。これらのプロトコルは、チェーンの同期、ブロックとトランザクションのゴシップのみを目的に設計されているからです。 ライトクライアントがこの情報をダウンロードすると、クライアントが「ライト」でなくなるため、適切ではありません。 + +JSON-RPC APIは、ライトクライアントのデータリクエストに理想的な選択肢ではありません。データを提供する特定のフルノードまたは集中型のRPCプロバイダーへの接続に依存しているためです。 これでは、ライトクライアントは、特定のノードもしくはプロバイダーが正直であることを信頼する必要があります。また、フルノードは、多数のライトクライアントから来る大量のリクエストを処理する必要があります。これでは、通信帯域要件が増えてしまいます。 + +ポータルネットワークのポイントとしては、既存のイーサリアムクライアントの設計制約を除き、全体を再設計し、軽量化に焦点を合わせて構築することです。 + +ポータルネットワークのコアとなるアイデアは、現在のネットワークスタックの最良の部分を活用することです。これを実現するには、[DHT](https://en.wikipedia.org/wiki/Distributed_hash_table)(Bittorrentと類似)を使って、履歴データや現在のチェーンヘッドのアイデンティティを軽量のDevP2P形式のピアツーピア分散型ネットワークを介して提供し、ライトクライアントによって必要とされる情報を有効化します。 + +このアイデアは、各ノードにイーサリアム全体の履歴データの一部を割り当て、特定の具体的な役割を追加することです。 その結果、リクエストされた特定のデータが保存されているノードを探し出し、そのデータを取得して提供することができます。 + +ライトノードは、これまでは1つのノードに大量のデータをフィルタリングしてもらっていました。しかし、今後は、ライトノードのネットワーク全体で素早くフィルタリングを行うことで、各ノードのデータ処理量を小さくしていきます。 + +目標は、ライトウェイトポータルクライアントの分散ネットワークで次のことを可能にすることです。 + +- チェーンヘッドの追跡 +- 直近と過去のチェーンデータの同期 +- 状態データの検索 +- トランザクションのブロードキャスト +- [EVM](/developers/docs/evm/)を使ったトランザクションの実行 + +このネットワーク設計による利点は、次の通りです。 + +- 集中化したプロバイダーへの依存が減る +- インターネット帯域使用量が減る +- 同期が短くなる、または同期が不要になる +- リソースに制約のあるデバイスでもアクセスできる(1GB以下のメモリ、100MB以下のディスク、1CPU) + +以下の図は、ポータルネットワークでやり取りできる現行のクライアントの機能を示しています。ユーザーは、非常に少ないリソースのデバイスでも、これらの機能にアクセスできます。 + +![ポータルネットワークテーブル](portal-network-table2.png) + +## デフォルトのクライアント多様性 {#client-diversity-as-default} + +ポータルネットワークのデベロッパーは、最初から3種類のポータルネットワーククライアントを構築することを決めていました。 + +ポータルネットワークのクライアントは、以下の通りです。 + +- [Trin](https://github.com/ethereum/trin): Rustで開発 +- [Fluffy](https://nimbus.team/docs/fluffy.html): Nimで開発 +- [Ultralight](https://github.com/ethereumjs/ultralight): Typescriptで開発 + +依存しないクライアント実装が複数存在することで、イーサリアムネットワークの回復力と分散化が強化されます。 + +1つのクライアントに問題や脆弱性が生じても、他のクライアントは通常通り運用を続けられるため、単一障害点を防ぐことができます。 また、多様なクライアントの実装により、イノベーションと競争が促進されるだけでなく、エコシステム内の改善が促進され、単一文化によるリスクが軽減されます。 + +## 参考文献 {#futher-reading} + +- [ポータルネットワーク(ボゴタ開発者会議でのPiper Merriamによる発表)](https://www.youtube.com/watch?v=0stc9jnQLXA) +- [ポータルネットワークのDiscord](https://discord.gg/CFFnmE7Hbs) +- [ポータルネットワークのウェブサイト](https://www.ethportal.net/) diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/archive-nodes/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/archive-nodes/index.md new file mode 100644 index 00000000000..c850d1e148b --- /dev/null +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/archive-nodes/index.md @@ -0,0 +1,80 @@ +--- +title: イーサリアム・アーカイブノード +description: アーカイブノードの概要 +lang: ja +sidebarDepth: 2 +--- + +アーカイブノードは、すべての状態の履歴をもつアーカイブをビルドするように構成されたイーサリアムクライアントのインスタンスです。 特定のユースケースにおいて、アーカイブノードは便利なツールですが、フルノードよりも実行する難易度が高くなっています。 + +## 前提知識 {#prerequisites} + +[イーサリアムノード](/developers/docs/nodes-and-clients/)のコンセプト、 [アーキテクチャ](/developers/docs/nodes-and-clients/node-architecture/)、[同期戦略](/developers/docs/nodes-and-clients/#sync-modes)、[実行](/developers/docs/nodes-and-clients/run-a-node/)の経験、[ノードの使用](/developers/docs/apis/json-rpc/)などの知識があることを前提にしています。 + +## アーカイブノードとは + +アーカイブノードの重要性を理解するには、まず「状態」の概念を明確にする必要があります。 イーサリアムは、_トランザクションベースの状態マシン_と言えます。 トランザクションを実行するアカウントとアプリケーションで構成され、トランザクションはイーサリアムの状態を変更します。 各アカウントおよびコントラクトに関する情報を持つグローバルデータは、状態と呼ばれるツリーデータベースに保存されます。 グローバルデータは、実行レイヤー(EL)クライアントが管理します。具体的には、以下のものが含まれます。 + +- アカウント残高とノンス +- コントラクトコードとストレージ +- コンセンサス関連のデータ(例: ステーキングデポジットコントラクト) + +イーサリアムクライアントでは、ネットワークとやり取りし、新しいブロックを検証・生成するために、常に最新の状態である「最新の変更(チェーンの先端)」を把握している必要があります。 フルノードとして構成された実行レイヤークライアントは、ネットワークの最新の状態を検証・追跡しますが、一部の過去の状態のみをキャッシュします。例えば、 最後の128ブロックに関連付けられた状態では、チェーンの再編成を処理して、最新のデータに素早くアクセスすることができます。 この最新の状態は、すべてのクライアントにおいて受信したトランザクションを検証するのに必要であり、ネットワークで使用されます。 + +状態は、特定のブロックにおけるネットワークの状態を瞬間的に記録したスナップショットであり、アーカイブは、ネットワークの状態の履歴を再生したものと考えることができます。 + +状態の履歴は、安全に取り除くことができます。これは、ネットワークの動作には関係なく、クライアントが古いデータをすべて保持しても意味がないためです。 最近のブロック(例: 先頭から128ブロック)より前の状態は、事実上破棄されます。 フルノードは、ブロックチェーンの履歴データ(ブロックとトランザクション)と、リクエストに応じて古い状態を再生成するのに使用する予備のスナップショットの履歴のみを保存しています。 再生成は、EVMで過去のトランザクションを再実行することによって行われます。取得したい状態が最も近いスナップショットからか遠く離れている場合、計算負荷が高くなる傾向があります。 + +フルノードで状態の履歴にアクセスするには、大量の計算が必要です。 クライアントでは、過去のトランザクションをすべて実行して、ジェネシスから1つの状態の履歴を計算する必要があるかもしれません。 アーカイブノードは、最新の状態だけでなく、各ブロックの後に作成されたすべての状態の履歴を保存することで、計算負荷の問題を解決します。 ただし、ディスク容量が大きくなってしまうというデメリットもあります。 + +ネットワークでは、すべての履歴データを保存・提供するのに、アーカイブノードに依存していないことが重要です。 上記で述べたように、すべての状態の一時的な履歴は、フルノードから導出することができます。 トランザクションは、どのフルノード(現在は400G未満)にも保存されています。これらのトランザクションを再実行することで、アーカイブ全体を構築することができます。 + +### ユースケース + +トランザクションの送信、コントラクトのデプロイ、コンセンサスの検証など、通常のイーサリアムの用途では、状態の履歴にアクセスする必要はありません。 そのため、通常のネットワークでのやり取りにおいて、ユーザーはアーカイブノードを必要としません。 + +状態のアーカイブによる主なメリットは、状態の履歴に関するクエリに素早くアクセスできることです。 例えば、アーカイブノードは、次の結果を即座に返します。 + +- _ブロック15537393におけるアカウント 0x1337... が持っているETHの残高はいくらか?_ +- _ブロック1920000におけるコントラクト0xのトークン0xの残高はいくらか?_ + +上述したように、フルノードでは、EVMを実行してこのデータを生成する必要があります。これはCPUを使用し、処理に時間がかかります。 一方、アーカイブノードでは、ディスク上のデータにアクセスするため、即座に応答を返すことができます。 これは、インフラストラクチャの側面において、以下の役割を担う人に役立ちます。 + +- ブロックエクスプローラなどのサービスプロバイダー +- 研究者 +- セキュリティアナリスト +- Dappデベロッパー +- 監査とコンプライアンス + +履歴データにアクセスできる無料の[サービス](/developers/docs/nodes-and-clients/nodes-as-a-service/)がいくつかあります。 アーカイブノードは実行時に要求事項が多く、その大半にアクセス制限があるため、頻度の低いアクセスには適していますが、 履歴データに常時アクセスが必要なプロジェクトにおいては、独自で実行することを検討してください。 + +## 実装と利用方法 + +この文脈でのアーカイブノードとは、状態データベースを処理してJSON-RPCエンドポイントを提供する、ユーザー向けの実行レイヤークライアントによって提供されるデータを指します。 設定オプション、同期時間、データベースサイズなどは、クライアントによって異なる場合があります。 詳細は、クライアントのドキュメントを参照してください。 + +独自にアーカイブノードを立ち上げる前に、各クライアントの[ハードウェア要件](/developers/docs/nodes-and-clients/run-a-node/#requirements)などの違いを把握しておきましょう。 ほとんどのクライアントにおいて、アーカイブ機能は最適化されていないため、12TB以上のスペースが必要になります。 その一方で、エリゴンのような実装では、同じデータを3TB未満に保存できるため、アーカイブノードを実行するのに最適な方法となります。 + +## 推奨実行環境 + +アーカイブノードは、[ノードの実行における一般的な推奨事項](/developers/docs/nodes-and-clients/run-a-node/)とは異なり、ハードウェアとメンテナンスの要件がより厳しくなっています。 そのため、エリゴンの[主要な機能](https://github.com/ledgerwatch/erigon#key-features)を考慮すると、[エリゴン](/developers/docs/nodes-and-clients/#erigon)のクライアント実装を使うのが最も実用的であると言えます。 + +### ハードウェア + +クライアントのドキュメントで、所定のモードの要件を必ず確認するようにしてください。 アーカイブノードでは、ディスクスペースが最大の要件となります。 クライアントにもよりますが、3TBから12TBが必要になります。 HDDは、大容量データの保存には適しているかもしれませんが、同期して常にチェーンの先頭を更新するには、SSDドライブが必要です。 [SATA](https://www.cleverfiles.com/help/sata-hard-drive.html)ドライブでも十分ですが、最低でも [TLC](https://blog.synology.com/tlc-vs-qlc-ssds-what-are-the-differences)以上の品質のものを選びましょう。 ディスクは、十分なスロットがあるデスクトップコンピュータまたはサーバーが適しています。 このような専用デバイスは、稼働時間の長いノードに最適です。 ノートパソコンで実行しても全く問題ありませんが、移植性の面で追加コストがかかります。 + +全データを1つのボリュームに収めるため、複数のディスクを [RAID0](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0)や[LVM](https://web.mit.edu/rhel-doc/5/RHEL-5-manual/Deployment_Guide-en-US/ch-lvm.html)を使って結合する必要があります。 [ZFS](https://en.wikipedia.org/wiki/ZFS)では、低レベルのエラーの影響を受けずに正しいデータを確実に書き込む「コピーオンライト」をサポートしているため、検討する価値があるかもしれません。 + +特に専門的なセットアップにおいては、さらなる安定性とセキュリティのために、偶発的なデータベースの破損を防ぐ[ECCメモリ](https://en.wikipedia.org/wiki/ECC_memory)の使用を検討してください。 RAMのサイズは通常、フルノードと同等のサイズにすることが推奨されますが、RAMのサイズが大きいほど、同期の速度は向上します。 + +アーカイブモードのクライアントは、最初の同期中に、ジェネシス以降のすべてのトランザクションを実行します。 CPUによって実行速度が異なるため、CPUが高速であれば、最初の同期にかかる時間を短くすることができます。 通常のコンシューマー向けのコンピューターでは、最初の同期に最大1か月程度かかる場合があります。 + +## 参考文献 {#further-reading} + +- [イーサリアムフルノードとアーカイブノードの比較](https://www.quicknode.com/guides/infrastructor/ethereum-full-node-vs-archive-node) - *QuickNode、2022年9月* +- [自分のイーサリアムアーカイブノードを構築する](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) - _Thomas Jay Rush、2021年8月_ +- [エリゴン、エリゴンのRPC、TrueBlocks(スクレイピングとAPI)をサービスとしてセットアップする方法](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _ – Magnus Hansson、2022年9月更新_ + +## 関連トピック {#related-topics} + +- [ ノードとクライアント](/developers/docs/nodes-and-clients/) +- [ノードの運用](/developers/docs/nodes-and-clients/run-a-node/) diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/bootnodes/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/bootnodes/index.md new file mode 100644 index 00000000000..9953360a995 --- /dev/null +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/bootnodes/index.md @@ -0,0 +1,31 @@ +--- +title: イーサリアムブートノードの概要 +description: ブートノードを理解するための基礎知識。 +lang: ja +--- + +新しいノードがイーサリアムのネットワークに参加する際には、既存のノードに接続して、新しいピアを検出しなければなりません。 イーサリアムネットワークへのエントリポイントとなるこれらのノードをブートノードと呼びます。 クライアントは通常、ブートノードのリストをハードコードしています。 これらのブートノードは通常、イーサリアム・ファウンデーションのDevopsチームまたはクライアントチームによって実行されています。 ブートノードは、静的ノードとは異なるという点に注意してください。 静的ノードは何度も呼び出されますが、ブートノードは、接続するピアが十分にない場合や、ノードが自力で新しい接続をする必要がある場合にのみ呼び出されます。 + +## ブートノードへの接続 {#connect-to-a-bootnode} + +クライアントには、ほとんどブートノードのリストが組み込まれていますが、自分のブートノードを実行したり、クライアントにハードコードされているリストに載っていないブートノードも使用することができます。 そのような場合は、クライアントの起動時に、以下のように指定します。これはGethの例です。各クライアントのドキュメントを確認してください 。 + +``` +geth --bootnodes "enode://@:" +``` + +## ブートノードの起動 {#run-a-bootnode} + +ブートノードとは、NAT([ネットワークアドレス変換](https://www.geeksforgeeks.org/network-address-translation-nat/))の背後にないフルノードのことを指します。 公開されているフルノードは、すべてブートノードとして動作します。 + +ノードを起動すると、[enode](/developers/docs/networking-layer/network-addresses/#enode)がログに記録されます。これは、他のユーザーがあなたのノードに接続するための公開識別子です。 + +通常、enodeは再起動するたびに再び生成されます。ブートノードで永続的なenodeを生成する方法については、クライアントのドキュメントを必ず参照してください。 + +ブートノードの性能を高めるには、接続可能なピアの最大数を増やすことをお勧めします。 多数のピアでブートノードを実行すると、必要な帯域幅が大幅に増加することに注意してください。 + +## 使用可能なブートノード {#available-bootnodes} + +go-ethereum内にある組み込みブートノードのリストは、[こちら](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go#L23)で確認できます。 これらのブートノードは、イーサリアム・ファウンデーションとgo-ethereumチームによってメンテナンスされています。 + +ボランティアによって管理されている、他のブートノードのリストもあります。 少なくとも1つの公式ブートノードを必ず含めるようにしてください。公式ブートノードを含めないと、イクリプス攻撃を受ける可能性があります。 diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/client-diversity/index.md index 18a2d42bb82..e45dead9146 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/client-diversity/index.md @@ -25,15 +25,15 @@ sidebarDepth: 2 ### 攻撃耐性 {#resilience} -クライアントの多様性は、攻撃に対する耐性も同時にもたらします。 例えば、[特定のクライアントに対する攻撃](https://twitter.com/vdWijden/status/1437712249926393858)で不正なチェーンへと改ざんしようとする試みが成功する可能性は低くなります。これは、他のクライアントに同じような攻撃ができる可能性は低く、正規のチェーンは壊れないためです。 クライアントの多様性が低いほど、多数派のクライアントへの攻撃に関するリスクが高まります。 クライアントの多様性がネットワーク上の悪意のある攻撃に対する重要な防御となることは、既に証明されています。例えば、2016 年の上海 DOS 攻撃の事例は、多数派のクライアント(Geth)に対して、ブロックごとに何万回も遅いディスク i/o 操作を実行したため起こりました。 この脆弱性を持たない他のクライアントもオンラインであったため、イーサリアムは Geth の脆弱性が修正されている間も攻撃に耐え、稼働を続けることができました。 +クライアントの多様性は、攻撃に対する耐性も同時にもたらします。 例えば、[特定のクライアントに対する攻撃](https://twitter.com/vdWijden/status/1437712249926393858)で不正なチェーンへと改ざんしようとする試みが成功する可能性は低くなります。これは、他のクライアントに同じような攻撃ができる可能性は低く、正規のチェーンは壊れないためです。 クライアントの多様性が低いほど、多数派のクライアントへの攻撃に関するリスクが高まります。 クライアントの多様性がネットワーク上の悪意のある攻撃に対する重要な防御となることは、既に証明されています。例えば、2016年の上海DOS攻撃の事例は、多数派のクライアント(Geth)に対して、ブロックごとに何万回も遅いディスクi/o操作を実行したため起こりました。 この脆弱性を持たない他のクライアントもオンラインであったため、イーサリアムはGethの脆弱性が修正されている間も攻撃に耐え、稼働を続けることができました。 ### プルーフ・オブ・ステークにおけるファイナリティ {#finality} -イーサリアムノードの 33%以上を占めるコンセンサスクライアントのバグがあると、ビーコンチェーンのファイナライズを妨げる可能性があります。つまり、トランザクションの取り消しや改ざんが発生するおそれがあります。 これはイーサリアム上に構築された多くのアプリ、特に分散型金融(DeFi)にとって非常に大きな問題となります。 +イーサリアムノードの33%以上を占めるコンセンサスクライアントのバグがあると、コンセンサスレイヤーのファイナライズを妨げる可能性があります。つまり、トランザクションの取り消しや改ざんが発生するおそれがあります。 これはイーサリアム上に構築された多くのアプリ、特に分散型金融(DeFi)にとって非常に大きな問題となります。 - さらに、3 分の 2 のマジョリティを占めるクライアントの重大なバグにより、チェーンが誤って スプリットし、ファイナライズされ、大量のバリデータが無効なチェーン上で立ち往生する可能性があります。 これらのバリデータが正しいチェーンに再び参加しようとする場合、スラッシングのペナルティを受けるか、時間がかかり高額となる任意退出後に、再度アクティベーションを行います。 スラッシングの規模は過失のあるノードの数に比例し、3 分の 2 のマジョリティが最大のスラッシング(32 ETH)を受けます。 + さらに、3分の2のマジョリティを占めるクライアントの重大なバグにより、チェーンが誤って スプリットし、ファイナライズされ、大量のバリデータが無効なチェーン上で立ち往生する可能性があります。 これらのバリデータが正しいチェーンに再び参加しようとする場合、スラッシングのペナルティを受けるか、時間がかかり高額となる任意退出後に、再度アクティベーションを行います。 スラッシングの規模は過失のあるノードの数に比例し、3分の2のマジョリティが最大のスラッシング(32 ETH)を受けます。 -これらは可能性が低いシナリオですが、アクティブなノードにクライアントを均等に分散することで、イーサリアムのエコシステムはリスクを軽減することが出来ます。 特定のコンセンサスクライアントが、全ノードの 33%のシェアを占めないことが理想です。 +これらは可能性が低いシナリオですが、アクティブなノードにクライアントを均等に分散することで、イーサリアムのエコシステムはリスクを軽減することが出来ます。 特定のコンセンサスクライアントが、全ノードの33%のシェアを占めないことが理想です。 ### 責任の共有 {#responsibility} @@ -43,15 +43,15 @@ sidebarDepth: 2 ![クライアントの多様性を示す円グラフ](./client-diversity.png) _図のデータは[ethernodes.org](https://ethernodes.org)と[clientdiversity.org](https://clientdiversity.org/)から引用_ -上の 2 つの円グラフは、実行レイヤーとコンセンサスレイヤーの現在(2022 年 1 月の執筆時点)のクライアントの多様性のスナップショットを示しています。 実行レイヤーの大多数は[Geth](https://geth.ethereum.org/)が占めており、1 位と大差をつけて[Open Ethereum](https://openethereum.github.io/)が 2 位、次に[Erigon](https://github.com/ledgerwatch/erigon)、[Nethermind](https://nethermind.io/)と続きますが、その他のクライアントはネットワークの 1%未満に過ぎません。 コンセンサスレイヤーで最も一般的に使用されている[Prysm](https://prysmaticlabs.com/#projects)は、Geth ほど独占しているわけではありませんが、それでもネットワークの 60%以上を占めています。 [Lighthouse](https://lighthouse.sigmaprime.io/)と[Teku](https://consensys.net/knowledge-base/ethereum-2/teku/)がそれぞれ約 20%と約 14%を占め、他のクライアントはほとんど使われていません。 +上の2つの円グラフは、実行レイヤーとコンセンサスレイヤーの現在(2022年1月の執筆時点)のクライアントの多様性のスナップショットを示しています。 実行レイヤーの大多数は[Geth](https://geth.ethereum.org/)が占めており、1位と大差をつけて[Open Ethereum](https://openethereum.github.io/)が2位、次に[Erigon](https://github.com/ledgerwatch/erigon)、[Nethermind](https://nethermind.io/)と続きますが、その他のクライアントはネットワークの1%未満に過ぎません。 コンセンサスレイヤーで最も一般的に使用されている[Prysm](https://prysmaticlabs.com/#projects)は、Gethほど独占しているわけではありませんが、それでもネットワークの60%以上を占めています。 [Lighthouse](https://lighthouse.sigmaprime.io/)と[Teku](https://consensys.net/knowledge-base/ethereum-2/teku/)がそれぞれ約20%と約14%を占め、他のクライアントはほとんど使われていません。 -実行レイヤーのデータは[Ethernodes](https://ethernodes.org)から 2022 年 1 月 23 日に、 コンセンサスクライアントのデータは[Michael Sproul](https://github.com/sigp/blockprint)から取得されました。 ビーコンチェーンのクライアントは、コンセンサスクライアントを識別するための明確な痕跡を常に持っている訳ではないため、コンセンサスクライアントのデータを取得することはより困難です。 データはマイノリティクライアントの一部を混同する場合がある分類アルゴリズムを用いて生成されました(詳細は[こちら](https://twitter.com/sproulM_/status/1440512518242197516)を参照)。 上の図では、これらの曖昧な分類は、どちらか一方のラベル(Nimbus/Teku など)で記載されています。 いずれにせよ、ネットワークのマジョリティが Prysm を実行していることは明白です。 データは固定されたブロック群(この場合はスロット 2048001 から 2164916) のスナップショットです。Prysm の占める割合が高まり、68%を超えることもありました。 これはスナップショットに過ぎませんが、図中の値は、クライアントの多様性の現状をよく表すものです。 +実行レイヤーのデータは、2022年1月23日に[Ethernodes](https://ethernodes.org)から、 コンセンサスクライアントのデータは[Michael Sproul](https://github.com/sigp/blockprint)から取得しました。 コンセンサスレイヤーのクライアントは、コンセンサスクライアントを識別するための明確な痕跡を常に持っているわけではないため、コンセンサスクライアントのデータを取得することが難しい場合があります。 データはマイノリティクライアントの一部を混同する場合がある分類アルゴリズムを用いて生成されました(詳細は[こちら](https://twitter.com/sproulM_/status/1440512518242197516)を参照)。 上の図では、これらの曖昧な分類は、どちらか一方のラベル(Nimbus/Tekuなど)で記載されています。 いずれにせよ、ネットワークのマジョリティがPrysmを実行していることは明白です。 データは固定されたブロック群(この場合はスロット2048001から2164916) のスナップショットです。Prysmの占める割合が高まり、68%を超えることもありました。 これはスナップショットに過ぎませんが、図中の値は、クライアントの多様性の現状をよく表すものです。 コンセンサスレイヤーのクライアントの多様性についての最新のデータは、[clientdiversity.org](https://clientdiversity.org/)から入手できます。 ## 実行レイヤー {#execution-layer} -これまでクライアントの多様性に関する議論は、主にコンセンサスレイヤーに焦点が当てられていました。 しかし、実行クライアント[Geth](https://geth.ethereum.org)は現在、すべてのノードの 85%を占めています。 この高い占有率は、コンセンサスクライアントと同じ理由で問題になります。 例えば、トランザクション処理や実行ペイロードの構築に影響を与えるバグが Geth にあると、コンセンサスクライアントが問題や不具合のあるトランザクションをファイナライズする可能性があります。 そのため、使われる実行クライアントがより均一に分散されると、イーサリアムの健全性が高まります。ネットワークの 33%以上を占めるクライアントが存在しないことが理想です。 +これまでクライアントの多様性に関する議論は、主にコンセンサスレイヤーに焦点が当てられていました。 しかし、実行クライアント[Geth](https://geth.ethereum.org)は現在、すべてのノードの 85%を占めています。 この高い占有率は、コンセンサスクライアントと同じ理由で問題になります。 例えば、トランザクション処理や実行ペイロードの構築に影響を与えるバグがGethにあると、コンセンサスクライアントが問題や不具合のあるトランザクションをファイナライズする可能性があります。 そのため、使われる実行クライアントがより均一に分散されると、イーサリアムの健全性が高まります。ネットワークの33%以上を占めるクライアントが存在しないことが理想です。 ## マイノリティクライアントの使用 {#use-minority-client} @@ -75,7 +75,9 @@ sidebarDepth: 2 [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) -[Lodester](https://github.com/ChainSafe/lodestar) - _レビューおよび監査中_ +[ロードスター](https://github.com/ChainSafe/lodestar) + +[プリズム](https://docs.prylabs.network/docs/getting-started) ノードオペレーターを大多数を占めるクライアントからの移行を奨励し、移行プロセスを加速できるよう、技術系のユーザーはマイノリティクライアント向けのチュートリアルやドキュメントの作成にご協力ください。 マイノリティコンセンサスクライアントへの移行に関するガイドは、 [clientdiversity.org](https://clientdiversity.org/)から入手できます。 @@ -86,9 +88,7 @@ sidebarDepth: 2 **コンセンサスレイヤー:** - [Rated.network](https://www.rated.network/) -- [clientdiversity.org](https://clientdiversity.org/) - -**実行レイヤー:** +- [clientdiversity.org](https://clientdiversity.org/) **実行レイヤー:** - [execution-diversity.info](https://execution-diversity.info/) - [Ethernodes](https://ethernodes.org/) @@ -96,11 +96,11 @@ sidebarDepth: 2 ## 参考文献 {#further-reading} - [イーサリアムのコンセンサスレイヤーにおけるクライアントの多様性について](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA) -- [イーサリアムマージ: マジョリティクライアントは自己責任での実行](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _Dankrad Fiest、2022 年 3 月 24 日_ +- [イーサリアムマージ: マジョリティクライアントは自己責任での実行](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _Dankrad Fiest、2022年3月24日_ - [クライアントの多様性の重要性](https://our.status.im/the-importance-of-client-diversity/) - [イーサリアムノードサービスのリスト](https://ethereumnodes.com/) -- [クライアントの多様性問題の「5 つの理由」](https://notes.ethereum.org/@afhGjrKfTKmksTOtqhB9RQ/BJGj7uh08) -- [イーサリアムの多様性と解決方法(Youtube)](https://www.youtube.com/watch?v=1hZgCaiqwfU) +- [クライアントの多様性問題の「5つの理由」](https://notes.ethereum.org/@afhGjrKfTKmksTOtqhB9RQ/BJGj7uh08) +- [イーサリアムの多様性と解決方法(YouTube)](https://www.youtube.com/watch?v=1hZgCaiqwfU) - [clientdiversity.org](https://clientdiversity.org/) ## 関連トピック {#related-topics} 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 367ef3b41b6..b97515d3694 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 @@ -1,46 +1,38 @@ --- title: ノードとクライアント -description: イーサリアムノードとクライアントソフトの概要、およびノードを設定する方法、およびその必要性 +description: イーサリアムノードとクライアントソフトの概要、ノードを設定する方法とその必要性 lang: ja sidebarDepth: 2 --- -イーサリアムは、「ノード」と呼ばれるコンピュータの分散型ネットワークです。ノードで実行されているソフトウェアが、ブロックとトランザクションデータを検証します。 このソフトウェア・アプリケーションは「クライアント」と呼ばれ、コンピュータをイーサリアムノードにするために、必ず実行されなければならないものです。 - -**注意: 現在、実行クライアントを単独で実行することはできません。 [マージ](/roadmap/merge)以降、イーサリアムネットワークにアクセスするには、実行クライアントとコンセンサスクライアントの両方を実行する必要があります。** +イーサリアムは、「ノード」と呼ばれるコンピュータの分散型ネットワークです。ノードで実行されているソフトウェアが、ブロックとトランザクションデータを検証します。 このソフトウェアは、コンピュータをイーサリアムノードにするために、必ず実行する必要があります。 ノードを構成するには、 別々のソフトウェア (「クライアント」と呼ばれる) が2つ必要です。 ## 前提知識 {#prerequisites} -イーサリアムクライアントの独自のインスタンスを実行する前に、ピアツーピア・ネットワークの概念と[EVM の基本](/developers/docs/evm/)の理解が必要です。 まずは[イーサリアム入門](/developers/docs/intro-to-ethereum/)をご覧ください。 +イーサリアムクライアントの詳細を学び、自分で動かすには、P2Pネットワークの概念と[EVMの基本](/developers/docs/evm/)を理解する必要があります。 まずは[イーサリアム入門](/developers/docs/intro-to-ethereum/)を読んでください。 -初めてノードを運用する場合は、まず[イーサリアムノードの運用](/run-a-node)というユーザーフレンドリーな説明を確認してください。 +ノード運用初心者の方は、まず[イーサリアムノードの運用](/run-a-node)というユーザーフレンドリーな導入方法をチェックすることをお勧めします。 ## ノードとクライアントとは {#what-are-nodes-and-clients} -「ノード」とは、イーサリアムソフトウェアを実行している他のコンピュータに接続されているイーサリアムクライアントソフトウェアの何らかのインスタンスであり、ネットワークを形成します。 「クライアント」とは、プロトコルルールに対してデータを検証し、安全なネットワークを維持するイーサリアムの実装です。 - -マージを経て、イーサリアムは実行レイヤーとコンセンサスレイヤーの 2 つの要素で構成されています。 両方のレイヤーは異なるクライアントソフトウェアによって実行されています。 このページでは、これらを実行クライアントとコンセンサスクライアントと呼びます。 - -- 実行クライアントは(EL クライアントや実行エンジンとも呼ばれ、過去の名称は Eth1 クライアント)、ネットワークでブロードキャストされた新たなトランザクションを受け取り、EVM(イーサリアム仮想マシン)でトランザクションを実行し、すべての現在のイーサリアムデータの最新の状態とデータベースを保持する。 -- コンセンサスクライアントは(ビーコンノードや CL クライアントとも呼ばれる、旧称は ETh2 クライアント)、プルーフ・オブ・ステークのコンセンサスアルゴリズムを実行し、実行クライアントからの検証されたデータに基づき、ネットワークの合意を形成する。 - -[マージ](/roadmap/merge/)前は、コンセンサスレイヤーと実行レイヤーは別々のネットワークでした。イーサリアム上のすべてのトランザクションとユーザーアクティビティは、現在の実行レイヤーで行われていました。 1 つのクライアントソフトウェアが、実行環境を提供しとマイナーが生成するブロックのコンセンサス検証の両方を行っていました。 コンセンサスレイヤーの[ビーコンチェーン](/roadmap/beacon-chain/)は、2020 年 12 月から別個に実行されてきました。 ビーコンチェーンにより、プルーフ・オブ・ステークの導入とイーサリアムネットワークからのデータに基づくバリデータのネットワークの調整が始まりました。 +「ノード」とは、イーサリアムソフトウェアを実行している他のコンピュータと接続されたイーサリアムクライアントソフトウェアの任意のインスタンスであり、ネットワークを形成します。 「クライアント」とは、プロトコルルールに従ってデータを検証し、安全なネットワークを維持するイーサリアムの実装です。 ノードでは、コンセンサスクライアントと実行クライアントの2つのクライアントを実行する必要があります。 -マージにより、イーサリアムはこれらのネットワークを接続し、プルーフ・オブ・ステークへ移行しました。 イーサリアムの状態を検証するために、実行クライアントとコンセンサスクライアントは、同時に稼働します。 +- 実行クライアント(ELクライアントや実行エンジンとも呼ばれ、過去の名称はEth1クライアント)は、ネットワークでブロードキャストされた新たなトランザクションを受け取り、EVM(イーサリアム仮想マシン)でトランザクションを実行し、すべての現在のイーサリアムデータの最新の状態とデータベースを保持します。 +- コンセンサスクライアント(ビーコンノードやCLクライアントとも呼ばれ、過去の名称はETh2クライアント)は、プルーフ・オブ・ステークのコンセンサスアルゴリズムを実行し、実行クライアントからの検証されたデータに基づき、ネットワークの合意を形成します。 「バリデータ」と呼ばれる3つ目のソフトウェアもあります。バリデータをコンセンサスクライアントに追加することで、ネットワークのセキュリティの確保にノードを参加させることができます。 -様々なソフトウェアを組み合わせたモジュラー型設計は、[カプセル化された複雑さ](https://vitalik.eth.limo/general/2022/02/28/complexity.html)と呼ばれます。 このアプローチにより、マージをシームレスに実行でき、[レイヤー 2 エコシステム](/layer-2/)などの個々のクライアントを再利用することができました。 +これらのクライアントは、連携してイーサリアムチェーンのヘッドを追跡し、ユーザーがイーサリアムネットワークとやり取りできるようにします。 複数のソフトウェアを組み合わせたモジュラー型設計は、[カプセル化された複雑性](https://vitalik.ca/general/2022/02/28/complexity.html)と呼ばれます。 このアプローチにより、[マージ](/roadmap/merge)をシームレスに実行できるようになりました。また、クライアントソフトウェアの保守や開発が容易になり、[レイヤー2エコシステム](/layer-2/)などの各クライアントを再利用できるようになりました。 ![実行クライアントとコンセンサスクライアントの連結](./eth1eth2client.png) 実行クライアントとコンセンサスクライアントの統合の簡略図 ### クライアントの多様性 {#client-diversity} -[実行クライアント](/developers/docs/nodes-and-clients/#execution-clients)と[コンセンサスクライアント](/developers/docs/nodes-and-clients/#consensus-clients)の両方は、異なるチームがさまざまなプログラミング言語で開発しています。 +[実行クライアント](/developers/docs/nodes-and-clients/#execution-clients)と[コンセンサスクライアント](/developers/docs/nodes-and-clients/#consensus-clients)は、それぞれ異なるチームが、さまざまなプログラミング言語を使って開発しています。 -複数のクライアント実装が、単一のコードベースへの依存を減らし、ネットワークをより強固にします。 理想的な目標としては、どのクライアントもネットワークの大多数を占めることなく、多様性を達成し、単一障害点を減らすことです。 また、言語の多様性はより広範なデベロッパーコミュニティを招くことにつながり、デベロッパーの希望言語で開発できます。 +複数のクライアント実装が、単一のコードベースへの依存を減らし、ネットワークをより強固にします。 理想は、どのクライアントもネットワークの大多数を占めることなく、多様性を実現し、単一障害点を減らすことです。 また、多様な言語を揃えることで、デベロッパーコミュニティがより広範になり、デベロッパーの希望言語で開発できるようになります。 -[クライアントの多様性](/developers/docs/nodes-and-clients/client-diversity/)についてもっと詳しく +[クライアントの多様性についての詳細](/developers/docs/nodes-and-clients/client-diversity/) -これらのクライアント実装に共通しているのは、一つの仕様に則っているということです。 仕様がイーサリアムネットワークとブロックチェーンの機能を規定しており、 すべての技術的な詳細が定義されています。仕様は下記で確認することができます。 +これらのクライアント実装は、すべて同じ仕様に従っています。 仕様はイーサリアムネットワークとブロックチェーンの機能や技術的な詳細を定義しており、 下記で確認することができます。 - 元々は[イーサリアムイエローペーパー](https://ethereum.github.io/yellowpaper/paper.pdf) - [実行クライアントの仕様](https://github.com/ethereum/execution-specs/) @@ -49,55 +41,59 @@ sidebarDepth: 2 ### ネットワークのノードの追跡 {#network-overview} -イーサリアムネットワークのノードの概要をリアルタイムで提供するトラッカーが複数あります。 分散型ネットワークの性質上、これらのクローラーはネットワークの限定されたビューしか提供できず、異なる結果を報告する可能性があることに注意してください。 +イーサリアムネットワークのノードの概要をリアルタイムで提供しているトラッカーが複数あります。 しかし、分散型ネットワークの性質上、これらのクローラーはネットワークの一部しか把握できず、異なる結果を報告する可能性があることに注意してください。 -- Etherscan による[ノードのマップ](https://etherscan.io/nodetracker) -- Bitfly による[Ethernodes](https://ethernodes.org/) +- Etherscanによる[ノードのマップ](https://etherscan.io/nodetracker) +- Bitflyによる[Ethernodes](https://ethernodes.org/) - [イーサリアムノードクローラー](https://crawler.ethereum.org/) -- [Nodewatch](https://www.nodewatch.io/): Chainsafe によるコンセンサスノードのクローリング +- [Nodewatch](https://www.nodewatch.io/): Chainsafeによるコンセンサスノードのクローリング ## ノードの類型 {#node-types} -[自分でノードを実行](/developers/docs/nodes-and-clients/run-a-node/)したい場合、ノードにはいくつかの種類があり、それぞれデータの扱い方が異なります。 実際に、クライアントが実行できるノードには、ライトノード、フルノード、アーカイブノードの 3 種類があります。 また、異なる同期戦略のオプションがあり、同期時間を短縮できます。 同期とは、イーサリアムの状態についての最新情報をどれだけ迅速に取得できるかを指します。 +[自分でノードを実行](/developers/docs/nodes-and-clients/run-a-node/)したい場合、ノードの種類を選ぶ必要があります。ノードにはいくつかの種類があり、それぞれデータの扱い方が異なります。 実際に、クライアントが実行できるノードには、ライトノード、フルノード、アーカイブノードの3種類があります。 また、同期時間を短縮する同期戦略のオプションを選ぶこともできます。 同期とは、イーサリアムの状態についての最新情報をどれだけ迅速に取得できるかを意味します。 ### フルノード {#full-node} +フルノードは、各ブロックごとのブロックボディーと状態データのダウンロードおよび検証に加え、ブロックチェーンの各ブロックの検証を行います。 フルノードにはさまざまな種類があります。ジェネシスブロックから開始してブロックチェーンの履歴にあるすべてのブロックを1つずつ検証するものや、 直近のブロックで有効性が信頼できるものから検証を開始するものがあります(例: Gethの「スナップ同期」) 。 ディスク領域を節約するため、フルノードは検証の開始位置に関係なく、比較的最近のデータ(通常は直近の128ブロック)のローカルコピーのみを保存し、古いデータを削除できるようにしています。 古いデータは、必要に応じて再生成されます。 + - 完全なブロックチェーンデータを保存(ただし、フルノードは定期的にプルーニングされており、最初のジェネシス(誕生)までさかのぼる状態は保存されていない) - ブロック検証に参加し、すべてのブロックと状態を検証する -- フルノードからすべての状態が得られる(ただし、非常に古い状態はアーカイブノードへのリクエストから再構築) +- すべての状態は、ローカルストレージから取得するか、フルノードによって「スナップショット」から再生成できます。 - ネットワークに貢献し、リクエストに応じてデータを提供する -### ライトノード {#light-node} +### アーカイブノード {#archive-node} -すべてのブロックをダウンロードするのではなく、ライトノードはブロックヘッダーをダウンロードします。 これらのヘッダーには、ブロックの内容に関するサマリー情報のみが含まれます。 ライトノードが必要とするその他の情報は、フルノードから取得します。 ライトノードは受信したデータをブロック ヘッダーの状態ルートに対して個別に検証できます。 ライトノードでは、フルノードを実行するために必要な強力なハードウェアや高帯域幅がなくても、イーサリアムネットワークに参加できます。 最終的には、ライトノードは携帯電話や組み込み機器で動作できるようになる可能性があります。 ライトノードはコンセンサスには参加せず、マイナーやバリデータにはなれませんが、フルノードと同じ機能でイーサリアムブロックチェーンにアクセスできます。 +アーカイブノードは、ジェネシスからすべてのブロックを検証し、ダウンロードしたデータを永久に保存するフルノードです。 -実行クライアントの Geth には、[ライト同期(Light sync)](https://github.com/ethereum/devp2p/blob/master/caps/les.md)オプションがあります。 しかし、ライト Geth ノードはデータを取得する上で、フルノードに依存しています。 ライトノードへデータを提供するフルノードはほとんどなく、ライトノードはしばしばピアを見つけることができません。 現在、コンセンサスレイヤーには本番使用可能なライトクライアントは存在しませんが、開発中のクライアントはいくつかあります。 +- フルノードに保存されているすべてを保持し、過去の状態のアーカイブを構築する。 例えば、ブロック4,000,000のアカウント残高をクエリしたい場合、または簡単にかつ確実にトレースを使用してマイニングを行うことなく、自分のトランザクションセットをテストしたい場合などに必要。 +- データがテラバイト単位になるため、平均的なユーザーにとってアーカイブノードは魅力的なものではないが、ブロックエクスプローラー、ウォレットベンダー、チェーン分析などのサービスに有用。 -また、[ゴシップネットワーク](https://www.ethportal.net/)を介してライトクライアントデータを提供する方法もあります。 ゴシップネットワークは、フルノードがリクエストに応答することなくライトノードのネットワークをサポートできるため好都合です。 +アーカイブ以外の任意のモードでクライアントを同期すると、ブロックチェーンデータがプルーニングされます。 つまり、すべての過去の状態を保存するアーカイブは存在しませんが、フルノードは必要に応じて構築できます。 -イーサリアムはまだ多数のライトノードをサポートしていませんが、ライトノードのサポートは近い将来急速に発展すると予想される領域です。 +[アーカイブノードの詳細](/developers/docs/nodes-and-clients/archive-nodes) -### アーカイブノード {#archive-node} +### ライトノード {#light-node} -- フルノードに保存されているすべてを保持し、過去の状態のアーカイブを構築する。 例えば、ブロック 4,000,000 のアカウント残高をクエリしたい場合、または簡単にかつ確実にトレースを使用してマイニングを行うことなく、自分のトランザクションセットをテストしたい場合などに必要。 -- データがテラバイト単位になるため、平均的なユーザーにとってアーカイブノードは魅力的なものではないが、ブロックエクスプローラー、ウォレットベンダー、チェーン分析などのサービスに有用。 +ライトノードは、すべてのブロックをダウンロードする代わりに、ブロックヘッダーのみをダウンロードします。 ブロックヘッダーには、ブロックの内容に関するサマリー情報が含まれています。 ライトノードは、必要に応じて、フルノードからブロックヘッダー以外の情報を取得します。 また、受信したデータをブロックヘッダーの状態ルートに対して個別に検証できます。 ライトノードでは、フルノードを実行するために必要な強力なハードウェアや高帯域幅がなくても、イーサリアムネットワークに参加できます。 最終的には、ライトノードは携帯電話や組み込み機器で動作できるようになる可能性があります。 ライトノードはコンセンサスには参加せず、マイナーやバリデータにはなれませんが、フルノードと同じ機能とセキュリティ保証でイーサリアムブロックチェーンにアクセスできます。 -アーカイブ以外の任意のモードでクライアントを同期すると、ブロックチェーンデータがプルーニングされます。 つまり、すべての過去の状態を保存するアーカイブは存在しませんが、フルノードは必要に応じて構築できます。 +イーサリアムでは、ライトクライアントの開発が活発に行われています。コンセンサスレイヤーと実行レイヤーの新しいライトクライアントが、まもなくリリースされる予定です。 また、[ゴシップネットワーク](https://www.ethportal.net/)を介して、ライトクライアントデータを提供する方法もあります。 ゴシップネットワークは、フルノードがリクエストに応答することなくライトノードのネットワークをサポートできるため効率的です。 + +イーサリアムでは現在、ライトノードは多数サポートされていませんが、今後急速に普及していくと考えられています。 特に、[Nimbus](https://nimbus.team/)、[Helios](https://github.com/a16z/helios)、[LodeStar](https://lodestar.chainsafe.io/)などのクライアントは、現在ライトノードを重点的に開発しています。 ## イーサリアムノードを運用する必要性 {#why-should-i-run-an-ethereum-node} -ノードを運用することで、直接的にトラストレスで、かつプライベートにイーサリアムを利用できると同時に、イーサリアムをより強固にし、分散化に貢献することができます。 +ノードを実行することで、イーサリアムを直接、トラストレスかつプライベートに利用することができます。また、イーサリアムのネットワークをより強固にし、分散化の促進に貢献することができます。 ### メリット {#benefits-to-you} -自分のノードを運用すると、プライベートで自己完結したトラストレスな形でイーサリアムを利用することができます。 クライアントを使って自分でデータを検証できるので、ネットワークを信頼する必要はありません。 「信頼せず検証」はブロックチェーンでよく言われるマントラです。 +自分のノードを実行すると、プライベートで自己完結したトラストレスな形でイーサリアムを利用することができます。 クライアントを使って自分でデータを検証できるので、ネットワークを信頼する必要はありません。 「信頼するな、検証せよ」はブロックチェーンで頻繁に唱えられるマントラです。 - ノードはすべてのトランザクションとブロックをコンセンサスルールに対して検証する。 つまり、ネットワークの他のノードに依存したり、完全に信頼する必要がない。 -- 自分のノードでイーサリアムウォレットを使用可能。 ランダムなノードに自分のアドレスや残高を漏らす必要がないため、より安全かつプライベートに分散型アプリ(Dapp)を利用できる。 自身のクライアントですべてをチェックできる。 [MetaMask](https://metamask.io)、[Frame](https://frame.sh/)、[他の多くのウォレット](/wallets/find-wallet/)は RPC インポート機能を提供し、自分のノードを使用できる。 -- イーサリアムからのデータに依存する他のサービスを実行および自分でホスト可能 (例えば、ビーコンチェーンのバリデータ、レイヤー 2 などのソフトウェア、インフラストラクチャ、ブロックエクスプローラー、ペイメントプロセッサーなど)。 -- 独自のカスタム[RPC エンドポイント](/developers/docs/apis/json-rpc/)を提供できる。 それがコミュニティ向けに公開されたイーサリアムエンドポイント、または非公開のエンドポイントであっても、あなたのノードを他の人が使用でき、結果として中央集権的な大手プロバイダを回避できる。 -- **プロセス間通信(IPC)**を利用してノードに接続、またはノードを書き換えプラグインとしてプログラムの読み込みが可能。 これにより、レイテンシーが低くなり、Web3 ライブラリを使用して大量のデータを処理する場合、またはトランザクションをできるだけ早く置き換える必要がある場合に(フロントランニング)、非常に有用。 -- ETH を直接ステーキングでき、ネットワークの安全性に貢献し、同時に報酬を得ることができる。 始めるには[ソロステーキング](/staking/solo/)を参照。 +- 自分のノードでイーサリアムウォレットを使用可能。 仲介業者に自分のアドレスや残高情報を渡す必要がないため、より安全かつプライベートに分散型アプリ(Dapp)を利用できる。 自身のクライアントですべてをチェックできる。 [MetaMask](https://metamask.io)、[Frame](https://frame.sh/)、[他の多くのウォレット](/wallets/find-wallet/)はRPCインポート機能を提供し、自分のノードを使用できる。 +- イーサリアムからのデータに依存する他のサービスを実行および自分でホスト可能 (例えば、ビーコンチェーンのバリデータ、レイヤー2などのソフトウェア、インフラストラクチャ、ブロックエクスプローラー、ペイメントプロセッサーなど)。 +- 独自のカスタム[RPCエンドポイント](/developers/docs/apis/json-rpc/)を提供できる。 このエンドポイントをコミュニティに公開することで、巨大な中央集権型プロバイダーへの依存を減らすことができる。 +- **プロセス間通信(IPC)**を利用してノードに接続、またはノードを書き換えプラグインとしてプログラムの読み込みが可能。 これにより、レイテンシーが低くなり、Web3ライブラリを使用して大量のデータを処理する場合、またはトランザクションをできるだけ早く置き換える必要がある場合に(フロントランニング)、非常に有用。 +- ETHを直接ステーキングでき、ネットワークの安全性に貢献し、同時に報酬を得ることができる。 始めるには[ソロステーキング](/staking/solo/)を参照。 ![アプリケーションやノードを介してイーサリアムにアクセスする方法](./nodes.png) @@ -108,188 +104,171 @@ sidebarDepth: 2 - フルノードがコンセンサスルールを強制するため、ルールに従わないブロックが受け入れられることはない。 これはネットワークのセキュリティ強化につながる(すべてのノードが完全な検証ができないライトノードの場合では、バリデータがネットワークに対して攻撃できる恐れがあるため)。 - [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/#what-is-pos)の暗号経済的な防御を上回る攻撃の場合、正しいチェーンを選ぶフルノードによって、社会的回復が行われる。 - ネットワークのノード数が増えることで、分散化の究極の目標である多様で堅牢なネットワークとなり、検閲耐性があり、信頼性の高いシステムになる。 -- フルノードからのブロックチェーンデータに依存するライトクライアントに、ブロックチェーンデータへのアクセスを提供する。 ネットワークの使用量が高いとき、ライトノードが同期するのに十分な数のフルノードが必要。 ライトノードはブロックチェーン全体を保持せず、[ブロックヘッダーのステートルート](/developers/docs/blocks/#block-anatomy)を利用してデータを検証する。 必要に応じて、ライトノードはブロックからより多くの情報のリクエストを行う。 +- フルノードからのブロックチェーンデータに依存するライトクライアントに、ブロックチェーンデータへのアクセスを提供する。 ライトノードはブロックチェーンの全データを保持せず、代わりに、[ブロックヘッダーのステートルート](/developers/docs/blocks/#block-anatomy)を利用してデータを検証する。 また、必要に応じて、フルノードから追加情報のリクエストを行う。 -あなたがフルノードを運用すると、イーサリアムのネットワーク全体がその恩恵を受けることになります。 +フルノードを実行すると、バリデータを実行しなくても、イーサリアムネットワーク全体がそのメリットを享受することができます。 ## 自分のノードの運用 {#running-your-own-node} -自分のイーサリアムクライアントの運用に興味がありますか? +自分のイーサリアムクライアントを運用してみませんか? -初心者にやさしい導入方法については、[ノードの運用](/run-a-node)ページで詳細を確認してください。 +初心者向けの導入方法については、[ノードの運用](/run-a-node)ページをご覧ください。 -技術的な方向けには、[自分のノードを立ち上げる](/developers/docs/nodes-and-clients/run-a-node/)を参照し、詳細やオプションを確認してください。 +上級者の方は、[自分のノードを立ち上げる](/developers/docs/nodes-and-clients/run-a-node/)を参照し、詳細やオプションを確認してください。 ## 代替手段 {#alternatives} -自分のノードを設定するには時間とリソースがかかりますが、常に独自のインスタンスを実行する必要はありません。 この場合では、[Infura](https://infura.io)、[Alchemy](https://alchemyapi.io)、[Chainstack](https://chainstack.com)、または[QuikNode](https://www.quiknode.io)のようなサードパーティーの API プロバイダーを利用できます。 あるいは、[ArchiveNode](https://archivenode.io/)というコミュニティが資金提供しているアーカイブノードがあり、時間とリソースに余裕のない独立デベロッパーのためにイーサリアムブロックチェーンのアーカイブデータを提供しています。 これらのサービスの概要については、 [ノード・アズ・ア・サービス(NaaS)](/developers/docs/nodes-and-clients/nodes-as-a-service/)で確認してください。 +自分のノードを設定するには、時間とリソースがかかりますが、必ずしも独自のインスタンスを実行する必要はありません。 サードパーティのAPIプロバイダーを利用すれば負担を軽減できます。 これらのサービスの概要については、 [ノード・アズ・ア・サービス(NaaS)](/developers/docs/nodes-and-clients/nodes-as-a-service/)で確認してください。 -コミュニティでパブリックな API を持つイーサリアムノードが運用されている場合、MetaMask のようなライトウォレットを[カスタム RPC を介して](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node)コミュニティノードに向けることができ、ランダムなサードパーティを使うよりも、よりプライバシーを確保できます。 +コミュニティでパブリックなAPIを持つイーサリアムノードが運用されている場合、カスタムRPCを介してウォレットをコミュニティノードに向けることができ、ランダムなサードパーティを使うよりも、プライバシーを確保することができます。 一方で、自分のクライアントを運用している場合は、必要としている友人とクライアントを共有できます。 -## 実行クライアント(旧 「Eth1 クライアント」) {#execution-clients} +## 実行クライアント {#execution-clients} -イーサリアムコミュニティは、異なるプログラミング言語で、さまざまなチームによって開発された、複数のオープンソースの実行クライアント(旧称は「Eth1 クライアント」または「イーサリアムクライアント」) を維持しています。 これにより、ネットワークがより強固になり、[多様性](/developers/docs/nodes-and-clients/client-diversity/)を実現します。 理想的な目標としては、どのクライアントもネットワークの大多数を占めることなく、多様性を達成し、単一障害点を減らすことです。 +イーサリアムコミュニティでは、異なるプログラミング言語で、さまざまなチームが開発した、複数のオープンソースの実行クライアント(旧称は「Eth1クライアント」または「イーサリアムクライアント」)を維持しています。 これにより、ネットワークがより強固になり、[多様性](/developers/docs/nodes-and-clients/client-diversity/)を実現しています。 理想は、どのクライアントもネットワークの大部分を占めることなく、多様性を実現し、単一障害点を減らすことです。 -この表は、いくつかのクライアントをまとめたものです。 これらはすべて[クライアントテスト](https://github.com/ethereum/tests)に合格し、アクティブにネットワークのアップグレードで最新の状態に維持されています。 +この表は、いくつかのクライアントの情報をまとめたものです。 これらのクライアントはすべて、[クライアントテスト](https://github.com/ethereum/tests)に合格しており、ネットワークのアップグレードによって最新の状態に維持されています。 -| クライアント | 言語 | オペレーティングシステム | ネットワーク | 同期戦略 | 状態剪定 | -| ----------------------------------------------- | -------- | ------------------------ | --------------------------------------------------- | ------------------------------- | -------------------- | -| [Geth](https://geth.ethereum.org/) | Go | Linux、Windows、macOS | メインネット、Sepolia、Görli、Ropsten、Rinkeby | スナップ、フル | アーカイブ、プルーン | -| [Nethermind](http://nethermind.io/) | C#、.NET | Linux、Windows、macOS | メインネット、Sepolia、Görli、Ropsten、Rinkeby など | スナップ(配信なし) 、高速、フル | アーカイブ、プルーン | -| [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux、Windows、macOS | メインネット、Sepolia、Görli、Ropsten、Rinkeby など | 高速、フル | アーカイブ、プルーン | -| [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux、Windows、macOS | メインネット、Sepolia、Görli、Rinkeby、Ropsten など | フル | アーカイブ、プルーン | - -**OpenEthereum は[非推奨](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd)となり、メンテナンスされていません。**注意して使用し、できれば他のクライアントに切り替えてください。 +| クライアント | 言語 | オペレーティングシステム | ネットワーク | 同期戦略 | 状態剪定 | +| ----------------------------------------------- | ------- | ------------------- | ----------------------- | ----------------- | ---------- | +| [Geth](https://geth.ethereum.org/) | Go | Linux、Windows、macOS | メインネット、Sepolia、Goerli | スナップ、フル | アーカイブ、プルーン | +| [Nethermind](http://nethermind.io/) | C#、.NET | Linux、Windows、macOS | メインネット、Sepolia、Goerliなど | スナップ(配信なし) 、高速、フル | アーカイブ、プルーン | +| [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux、Windows、macOS | メインネット、Sepolia、Goerliなど | スナップ、高速、フル | アーカイブ、プルーン | +| [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux、Windows、macOS | メインネット、Sepolia、Goerliなど | フル | アーカイブ、プルーン | +| [Reth](https://github.com/paradigmxyz/reth) | Rust | Linux、Windows、macOS | メインネット、Sepolia、Goerliなど | フル | アーカイブ、プルーン | サポートされているネットワークの詳細については、[イーサリアムネットワーク](/developers/docs/networks/)をご覧ください。 -各クライアントには独自のユースケースとメリットがあります。自分の好みに基づいて選択してください。 多様性により、クライアントが異なる機能やユーザー対象に特化することができます。 機能、サポート、プログラミング言語、またはライセンスに基づいて、クライアントを選択することをお勧めします。 +各クライアントには、それぞれに応じたユースケースとメリットがあります。自分に合ったクライアントを選択してください。 多様性により、さまざまな機能やユーザー層に合わせた実装が可能です。 機能、サポート、プログラミング言語、またはライセンスなどの観点から、クライアントを選択することをお勧めします。 ### Besu {#besu} -ハイパーレジャー・ベスは、パブリックネットワークと許可型ネットワーク向けのエンタープライズグレードのイーサリアムクライアントです。 トレースから GraphQL まで、イーサリアムメインネットのすべての機能を実行し、広範なモニタリングを行い、公開コミュニティチャンネルと企業向けの商用 SLA の両方で、ConsenSys 社によりサポートされています。 Java 実装で、Apache 2.0 ライセンスです。 +ハイパーレジャーBesuは、パブリックネットワークと許可型ネットワークの両方に対応する、エンタープライズグレードのイーサリアムクライアントです。 イーサリアムメインネットのすべての機能を実行するクライアントは、ConsenSys社によりサポートされています。トレースからGraphQLまで、幅広いモニタリング機能を備えており、公開コミュニティチャンネルと企業向けの商用SLAの両方に対応しています。 また、Javaで実装されており、Apache 2.0ライセンスです。 -機能とセットアップの詳細については、Besu の広範な[ドキュメント](https://besu.hyperledger.org/en/stable/)に記載されています。 +機能とセットアップの詳細については、Besuの完全版[ドキュメント](https://besu.hyperledger.org/en/stable/)に記載されています。 ### Erigon {#erigon} -Erigon(旧称: Turbo-Geth)は、Go Ethereum のフォークとして始まり、速度とディスク容量の効率に特化しています。 Erigon はイーサリアムを完全に再構築された実装で、現在は Go 実装ですが など他の言語でも開発中です。 Erigon は、より高速、よりモジュラー型、より最適化されたイーサリアムの実装を提供することを目的としています。 2TB 程度のディスク容量で、3 日以内にフルアーカイブノードの同期ができます。 +Erigon(旧称: Turbo-Geth)は、Go Ethereumのフォークから派生したものであり、速度とディスク容量の効率を重視しています。 イーサリアムの完全に再設計された実装であり、現在はGoで書かれていますが、他の言語での実装も開発中です。 Erigonは、より高速で、よりモジュール化されており、より最適化されたイーサリアムの実装を目指しています。 2TB程度のディスク容量があれば、3日以内にフルアーカイブノードの同期が可能です。 -### Go Ethereum (Geth) {#geth} +### Go Ethereum(Geth) {#geth} -Go Ethereum(略して Geth) は、イーサリアムプロトコルのオリジナルの実装の 1 つです。 現在、最も普及しているクライアントであり、ユーザーやデベロッパー向けのツールの種類も豊富です。 Go 実装で、完全にオープンソースで、GNU LGPL v3 の下でライセンスされています。 +Go Ethereum(略してGeth)は、イーサリアムプロトコルのオリジナルの実装の1つです。 現在、最も普及しているクライアントであり、ユーザーやデベロッパー向けのツールの種類も豊富です。 Go言語で実装されており、完全にオープンソースで、GNU LGPL v3ライセンスの下で提供されています。 -詳細については、Geth の[ドキュメント](https://geth.ethereum.org/docs/)を参照してください。 +Gethの詳細については、[ドキュメント](https://geth.ethereum.org/docs/)を参照してください。 ### Nethermind {#nethermind} -Nethermind は C# .NET の技術スタックで開発されたイーサリアムの実装で、LGPL-3.0 ライセンスです。ARM を含むすべての主要なプラットフォームで稼働します。 以下のような優れたパフォーマンスを提供します。 +Nethermindは、C# .NETの技術スタックで開発されたイーサリアムの実装で、LGPL-3.0ライセンスの下で提供されています。ARMを含むすべての主要なプラットフォームに対応しており、 以下のような優れたパフォーマンスを発揮します。 - 最適化された仮想マシン - 状態アクセス -- ネットワーク機能と、Prometheus/Grafana ダッシュボード、シークエンス・エンタープライズ・ロギング・サポート、JSON RPC トレース、分析プラグインなどの豊富な機能 +- ネットワーク機能と、Prometheus/Grafanaダッシュボード、シークエンス・エンタープライズ・ロギング・サポート、JSON RPCトレース、分析プラグインなどの豊富な機能 -また、Nethermind には[詳細なドキュメント](https://docs.nethermind.io)、強力な開発サポート、オンラインコミュニティ、プレミアムユーザー向けの 24 時間年中無休のサポートもあります。 +また、Nethermindは、[詳細なドキュメント](https://docs.nethermind.io)、強力な開発サポート、オンラインコミュニティ、プレミアムユーザー向けの24時間年中無休のサポートなど、充実したサポート体制を整えています。 -## コンセンサスクライアント(旧「Eth2」クライアント) {#consensus-clients} +## コンセンサスクライアント {#consensus-clients} -[コンセンサスアップグレード](/roadmap/beacon-chain/)に対応する複数のコンセンサスクライアント(旧称: 「Eth2」クライアント) があります。 ビーコンチェーンを実行しており、[マージ](/roadmap/merge/)以降、実行クライアントにプルーフ・オブ・ステークの合意メカニズムを提供します。 +[コンセンサスアップグレード](/roadmap/beacon-chain/)に対応する複数のコンセンサスクライアント(旧称: 「Eth2」クライアント) があります。 コンセンサスクライアントは、フォーク選択アルゴリズム、アテステーションの処理、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)の報酬とペナルティの管理など、コンセンサスに関連するロジックをすべて担っています。 -| クライアント | 言語 | オペレーティングシステム | ネットワーク | -| ------------------------------------------------------------- | ---------- | ------------------------ | ---------------------------------------------------------------- | -| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux、Windows、macOS | ビーコンチェーン、Goerli、Pyrmont、Sepolia、Ropsten など | -| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux、Windows、macOS | ビーコンチェーン、Goerli、Sepolia、Ropsten など | -| [Nimbus](https://nimbus.team/) | Nim | Linux、Windows、macOS | ビーコンチェーン、Goerli、Sepolia、Ropsten など | -| [Prysm](https://docs.prylabs.network/docs/getting-started/) | Go | Linux、Windows、macOS | ビーコンチェーン、Gnosis、Goerli、Pyrmont、Sepolia、Ropsten など | -| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux、Windows、macOS | ビーコンチェーン、Gnosis、Goerli、Sepolia、Ropsten など | +| クライアント | 言語 | オペレーティングシステム | ネットワーク | +| ------------------------------------------------------------- | ---------- | ------------------- | ------------------------------------------------ | +| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux、Windows、macOS | ビーコンチェーン、Goerli、Pyrmont、Sepolia、Ropstenなど | +| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux、Windows、macOS | ビーコンチェーン、Goerli、Sepolia、Ropstenなど | +| [Nimbus](https://nimbus.team/) | Nim | Linux、Windows、macOS | ビーコンチェーン、Goerli、Sepolia、Ropstenなど | +| [Prysm](https://docs.prylabs.network/docs/getting-started/) | Go | Linux、Windows、macOS | ビーコンチェーン、Gnosis、Goerli、Pyrmont、Sepolia、Ropstenなど | +| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux、Windows、macOS | ビーコンチェーン、Gnosis、Goerli、Sepolia、Ropstenなど | ### Lighthouse {#lighthouse} -Lighthouse は、Apache-2.0 ライセンスの下、Rust で書かれたコンセンサスクライアントの実装です。 Sigma Prime により管理され、ビーコンチェーンの誕生以降安定し、本番リリースされています。 様々なエンタープライズ、ステーキングプール、個人からの信頼を得ています。 デスクトップ PC から高度な自動デプロイまで、幅広い環境における安全性、パフォーマンス、相互運用性を目指しています。 +Lighthouseは、Apache-2.0ライセンスの下、Rustで書かれたコンセンサスクライアントの実装です。 Sigma Primeによって管理されており、ビーコンチェーン誕生以降、安定したパフォーマンスで稼働しています。 また、さまざまなエンタープライズやステーキングプール、個人からの信頼を得ています。 デスクトップPCから高度な自動デプロイまで、あらゆる環境における安全性、パフォーマンス、相互運用性を目指しています。 -ドキュメントは、[Lighthouse Book](https://lighthouse-book.sigmaprime.io/)にあります。 +ドキュメントは、[Lighthouse Book](https://lighthouse-book.sigmaprime.io/)で参照できます。 ### Lodestar {#lodestar} -Lodestar は LGPL-3.0 ライセンスの下、Typescript で書かれ、本番対応のコンセンサスクライアントの実装です。 ChainSafe Systems 社により管理され、ソロステーカー、デベロッパー、研究者向けのコンセンサスクライアントの中で最も新しいものです。 Loadstar は、イーサリアムプロトコルを JavaScript で実装したビーコンノードとバリデータクライアントで構成されています。 ライトクライアントでのイーサリアムの使いやすさを向上させ、より多くのデベロッパーグループがアクセスできるようし、エコシステムの多様性にさらに貢献することを目指しています。 +Lodestarは、LGPL-3.0ライセンスの下、Typescriptで書かれた、本番環境に対応したコンセンサスクライアントの実装です。 ChainSafe Systems社によって管理されており、ソロステーカー、デベロッパー、研究者向けのコンセンサスクライアントの中で最も新しいものです。 Loadstarは、イーサリアムプロトコルをJavaScriptで実装した、ビーコンノードとバリデータクライアントから構成されています。 ライトクライアントでのイーサリアムの使いやすさを向上させ、より多くのデベロッパーグループがアクセスできるようにすることで、エコシステムの多様性にさらに貢献することを目指しています。 -詳細については、[Lodestar のウェブサイト](https://lodestar.chainsafe.io/)をご覧ください。 +詳細については、[Lodestarのウェブサイト](https://lodestar.chainsafe.io/)をご覧ください。 ### Nimbus {#nimbus} -Nimbus は Apache-2.0 ライセンスの下、Nim で書かれたコンセンサスクライアントの実装です。 ソロステーカーやステーキングプールで使用されており、本番対応のクライアントです。 Nimbus はリソース効率を重視して設計されており、リソースに制限のあるデバイスや企業のインフラストラクチャ上でも、安定性や報酬のパフォーマンスを損なわずに簡単に実行できます。 リソース利用量が少ないということは、ネットワークに負荷がかかったときでも、クライアントの安全域が大きくなることを意味します。 - -Trinity により実装されています。 高速同期のように機能しますが、最新のブロックを実行するために必要なデータもダウンロードします。開始から数分以内にチェーンをクエリできます。 +Nimbusは、Apache-2.0ライセンスの下、Nimで書かれたコンセンサスクライアントの実装です。 ソロステーカーやステーキングプールで使用されており、本番環境に対応したクライアントです。 Nimbusはリソース効率を重視して設計されており、リソースに制限のあるデバイスや企業のインフラストラクチャ上でも、安定性や報酬のパフォーマンスを損なわずに簡単に実行できます。 リソース利用量が少ないと、ネットワークに負荷がかかっても、クライアントは安全に動作します。 -- 最初に状態を同期し、数分で RPC にクエリ可能 -- まだ開発中で、完全に信頼できるわけではなく、バックグラウンド同期が遅くなり、RPC 応答が失敗する可能性がある - -詳しくは、[Nimbus のドキュメント](https://nimbus.guide/)をご覧ください。 +詳しくは、[Nimbusのドキュメント](https://nimbus.guide/)をご覧ください。 ### Prysm {#prysm} -Prysm は GPL-3.0 ライセンスの下、Go で書かれたフル機能のオープンソースのコンセンサスクライアントです。 オプションのウェブアプリの UI を備え、自宅でステーキングするユーザーと機関ユーザー両方向けに、ユーザーエクスペリエンス、ドキュメント、設定可能性を優先しているのが特徴です。 +Prysmは、GPL-3.0ライセンスの下、Goで書かれたフル機能のオープンソースのコンセンサスクライアントです。 オプションのWebアプリのUIを備え、自宅でステーキングするユーザーと機関ユーザーの両方に向けて、ユーザーエクスペリエンス、ドキュメント、設定可能性を優先しているのが特徴です。 -詳しくは、[Prysm のドキュメント](https://docs.prylabs.network/docs/getting-started/)をご覧ください。 +詳しくは、[Prysmのドキュメント](https://docs.prylabs.network/docs/getting-started/)をご覧ください。 ### Teku {#teku} -Teku はオリジナルのビーコンチェーンで誕生したクライアントの 1 つです。 セキュリティ、堅牢性、安定性、使いやすさ、パフォーマンスのよくある目標に加えて、Teku はさまざまなコンセンサスクライアント標準に完全に準拠することを特に目指しています。 +Tekuは、オリジナルのビーコンチェーンで誕生したクライアントの1つです。 セキュリティ、堅牢性、安定性、使いやすさ、パフォーマンスなどの基本的な目標に加えて、Tekuはさまざまなコンセンサスクライアント標準に完全に準拠することを特に重視しています。 -Teku は非常に柔軟なデプロイメントオプションを提供しています。 ビーコンノードとバリデータクライアントをシングルプロセスとして一緒に実行でき、ソロステーカーにとって非常に便利です。または、高度なステーキング操作用にノードを個別に実行することもできます。 さらに、署名キーのセキュリティとスラッシング保護のため、[Web3Signer](https://github.com/ConsenSys/web3signer/)と完全に相互運用可能です。 +Tekuは、非常に柔軟なデプロイメントオプションを提供しています。 ビーコンノードとバリデータクライアントをシングルプロセスとして実行できるので、ソロステーカーにとって非常に便利です。または、高度なステーキング操作を行う場合は、個別にノードを実行することもできます。 さらに、署名キーのセキュリティとスラッシング保護のために、[Web3Signer](https://github.com/ConsenSys/web3signer/)と完全に互換性があります。 -Teku は Java 実装で、Apache 2.0 ライセンスです。 Besu や Web3Signer を手がける ConsenSys 社のプロトコルチームによる開発です。 詳しくは、[Teku のドキュメント](https://docs.teku.consensys.net/en/latest/)をご覧ください。 +Tekuは、Javaで実装されており、Apache 2.0でライセンスされています。 BesuやWeb3Signerを手がけるConsenSys社のプロトコルチームによって開発されています。 詳しくは、[Tekuのドキュメント](https://docs.teku.consensys.net/en/latest/)をご覧ください。 ## 同期モード {#sync-modes} -ネットワークの現在のデータを追って検証するには、イーサリアムクライアントは最新のネットワーク状態と同期する必要があります。 これは、ピアからデータをダウンロードし、暗号的に完全性を検証し、ローカルのブロックチェーンデータベースを構築することで行われます。 +イーサリアムクライアントがネットワークの現在のデータを追って検証するには、最新のネットワーク状態と同期する必要があります。 そのためには、ピアからデータをダウンロードし、暗号的に完全性を検証した上で、ローカルのブロックチェーンデータベースを構築する必要があります。 -同期モードには、さまざまなトレードオフを持つ異なるアプローチがあります。 また、各クライアントにより、同期アルゴリズムの実装に違いがあります。 実装の詳細については、常にクライアントの公式ドキュメントを参照してください。 +同期モードには、さまざまなトレードオフを持つ異なるアプローチがあります。 また、各クライアントによって、同期アルゴリズムの実装が異なります。 そのため、実装の詳細については、必ずクライアントの公式ドキュメントを参照してください。 ### 実行レイヤーの同期モード {#execution-layer-sync-modes} -#### フル同期(Full sync) {#full-sync} +#### フルアーカイブ同期 {#full-sync} フル同期は、ヘッダー、トランザクション、レシートを含むすべてのブロックをダウンロードし、最初のジェネシス(誕生)からの全ブロックを実行することで、ブロックチェーンの状態を段階的に生成します。 - すべてのトランザクションを検証することにより、信用する必要性を最小限に抑え、最高のセキュリティを提供 - トランザクション数が増えると、全トランザクションを処理するのに数日から数週間かかることがある -#### 高速同期(Fast sync) {#fast-sync} +#### フルスナップ同期 {#snap-sync} -高速同期は、ヘッダー、トランザクション、レシートを含むすべてのブロックをダウンロードし、全ヘッダーを検証の上、状態をダウンロードし、検証したヘッダーに対して状態を検証します。 +スナップ同期は、フルアーカイブ同期と同様に、ブロックごとにチェーンを検証します。ただし、ジェネシスブロックからではなく、本物のブロックチェーンの一部であることが確認されている、より直近の「信頼できる」チェックポイントから始めます。 ノードは、一定期間を経過したデータを削除しますが、定期的にチェックポイントを保存します。 これらのスナップショットは、すべての状態データを永久に保存するのではなく、必要なときに再生成するために使用されます。 -- 合意メカニズムのセキュリティに依存 -- 同期には数時間しかかからない +- 現在イーサリアムメインネットでデフォルトとなっている最速の同期戦略 +- セキュリティを損なうことなく、ディスク使用量とネットワーク帯域幅を大幅に節約可能 + +[スナップ同期の詳細](https://github.com/ethereum/devp2p/blob/master/caps/snap.md) #### 軽量同期(Light sync) {#light-sync} -軽量クライアントモード(Light client mode)は、すべてのブロックヘッダー、ブロックデータをダウンロードし、ランダムに検証を行います。 信頼できるチェックポイントからのチェーンの先端のみを同期します。 +ライトクライアントモードでは、すべてのブロックヘッダーとブロックデータをダウンロードし、ランダムに検証を行います。 信頼できるチェックポイントからチェーンの先端までのみを同期します。 - デベロッパーへの信頼と合意メカニズムに依存し、最新の状態のみを取得 - クライアントは数分で現在のネットワーク状態で使用できるようになる -[ライトクライアントの詳細](https://www.parity.io/blog/what-is-a-light-client/) +**注: ** 現在、プルーフ・オブ・ステークのイーサリアムでは、軽量同期は利用できません。軽量同期の新しいバージョンが、まもなくリリースされる予定です。 -#### スナップ同期(Snap sync) {#snap-sync} - -スナップ同期はクライアント同期の最新のアプローチであり、Geth チームによって開発されました。 ピアが提供するダイナミック・スナップショットを使用して、中間ツリーノードをダウンロードすることなく、すべてのアカウントデータとストレージデータを取得し、ローカルでマークルツリーを再構築します。 - -- 現在イーサリアムメインネットでデフォルトとなっている最速の同期戦略 -- セキュリティを損なうことなく、ディスク使用量とネットワーク帯域幅を大幅に節約可能 - -[スナップ同期の詳細](https://github.com/ethereum/devp2p/blob/master/caps/snap.md) +[ライトクライアントの詳細](/developers/docs/nodes-and-clients/light-clients/) -| クライアント | ディスクサイズ(高速同期) | ディスクサイズ(フルアーカイブ) | -| ------------ | ------------------------ | ------------------------------ | -| Geth | 400GB 以上 | 6TB 以上 | -| OpenEthereum | 280GB 以上 | 6TB 以上 | -| Nethermind | 500GB 以上 | 12TB 以上 | -| Besu | 750GB 以上 | 5TB 以上 | -| Erigon | N/A | 1TB 以上 | +### コンセンサスレイヤーの同期モード {#consensus-layer-sync-modes} -#### オプティミスティック同期(Optimistic sync) {#optimistic-sync} +#### オプティミスティック同期 {#optimistic-sync} -オプティミスティック同期はマージ後の同期戦略で、オプトインで下位互換性(他の同期モードと互換性がある)があるように設計されており、実行ノードが確立された方法で同期できます。 実行エンジンはビーコンブロックを完全に検証せず、*オプティミスティックに(楽観的に)*インポートでき、最新の先頭を探し、上記の方法でチェーンの同期を開始します。 次に、実行クライアントが追いつくと、ビーコンチェーンのトランザクションの有効性をコンセンサスクライアントに通知します。 +オプティミスティック同期はマージ後の同期戦略で、オプトインで下位互換性を備えており、実行ノードが確立された方法で同期できます。 実行エンジンは、ビーコンブロックを完全に検証せず、_オプティミスティックに(楽観的に)_インポートすることができます。そして、最新のブロックの先頭を探し、上記の方法でチェーンの同期を開始します。 次に、実行クライアントが追いつくと、ビーコンチェーンのトランザクションの有効性をコンセンサスクライアントに通知します。 [オプティミスティック同期の詳細](https://github.com/ethereum/consensus-specs/blob/dev/sync/optimistic.md) -#### チェックポイント同期(Checkpoint sync) {#checkpoint-sync} +#### チェックポイント同期 {#checkpoint-sync} -チェックポイント同期は、弱い主観性同期(Weak Subjectivity Sync)とも呼ばれ、ビーコンノードの同期でユーザーエクスペリエンスが優れています。 これは[弱い主観性(Weak Subjectivity)](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/)の前提に基づいており、最初のジェネシスブロック からではなく、最新の「弱い主観性チェックポイント」からビーコンチェーンを同期します。 [ジェネシスブロック](/glossary/#genesis-block)からの同期と同様の信頼性を仮定したチェックポイント同期により、初期同期の時間を大幅に短縮できます。 +チェックポイント同期は、弱い主観性同期とも呼ばれ、ビーコンノードの同期において優れたユーザーエクスペリエンスを実現します。 これは[弱い主観性](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/)の前提に基づいており、最初のジェネシスブロックからではなく、最新の「弱い主観性チェックポイント」からビーコンチェーンを同期します。 [ジェネシスブロック](/glossary/#genesis-block)からの同期と同様の信頼性を保ちつつ、初期同期の時間を大幅に短縮できます。 -実運用では、ノードがリモートサービスに接続して最新のファイナライズされた状態をダウンロードし、その時点からのデータの検証を続けます。 データを提供しているサードパーティは信頼できるものであり、慎重に選ばれる必要があります。 +実運用では、ノードがリモートサービスに接続して最新のファイナライズされた状態をダウンロードし、その時点からデータの検証を続けます。 データ提供元のサードパーティは信頼できるものである必要があるため、慎重に選ぶ必要があります。 [チェックポイント同期](https://notes.ethereum.org/@djrtwo/ws-sync-in-practice)の詳細 ## 参考文献 {#further-reading} -インターネットには、イーサリアムクライアントに関する情報がたくさんあります。 ここでは、参考になりそうなリソースをいくつか紹介します。 +インターネット上には、イーサリアムクライアントに関する情報がたくさんあります。 その中から、特に参考になりそうなリソースをいくつか紹介します。 -- [イーサリアム 101 - パート 2 - ノードについての理解](https://kauri.io/ethereum-101-part-2-understanding-nodes/48d5098292fd4f11b251d1b1814f0bba/a) _– 2019 年 2 月 13 日 - Wil Barnes_ -- [イーサリアムフルノードの運用: 手間を省きたい人向けのガイド](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _2019 年 11 月 7 日 - Justin Leroux_ +- [イーサリアム101 - パート2 - ノードについての理解](https://kauri.io/ethereum-101-part-2-understanding-nodes/48d5098292fd4f11b251d1b1814f0bba/a) _– 2019年2月13日 - Wil Barnes_ +- [イーサリアムフルノードの運用: 手間を省きたい人向けのガイド](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _2019年11月7日 - Justin Leroux_ ## 関連トピック {#related-topics} @@ -298,5 +277,4 @@ Teku は Java 実装で、Apache 2.0 ライセンスです。 Besu や Web3Signe ## 関連チュートリアル {#related-tutorials} -- [Geth](/developers/tutorials/run-light-node-geth/)でノードを運用 _– Geth のダウンロード、インストール、実行方法。 同期モード、Javascript コンソールなど。_ -- [MicroSD カードを挿入するだけで、Raspberry Pi 4 をバリデータノードにする – インストールガイド](/developers/tutorials/run-node-raspberry-pi/) _– Raspberry Pi 4 をフラッシュし、イーサネットケーブルを接続し、SSD ディスクを接続して、電源を入れることで、Raspberry Pi 4 を、実行レイヤー(メインネット)とコンセンサスレイヤー(ビーコンチェーン / バリデータ)の両方もしくは片方を実行するフルイーサリアムノードにする。_ +- [MicroSDカードを挿入するだけで、Raspberry Pi 4をバリデータノードにする – インストールガイド](/developers/tutorials/run-node-raspberry-pi/) _– Raspberry Pi 4をフラッシュし、イーサネットケーブルを接続し、SSDディスクを接続して電源を入れることで、Raspberry Pi 4を、実行レイヤー(メインネット)とコンセンサスレイヤー(ビーコンチェーン/バリデータ)の両方もしくは片方を実行するフルイーサリアムノードにする。_ diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/light-clients/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/light-clients/index.md new file mode 100644 index 00000000000..587be2b2d34 --- /dev/null +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/light-clients/index.md @@ -0,0 +1,61 @@ +--- +title: ライトクライアント +description: イーサリアムライトクライアントの概要 +lang: ja +--- + +イーサリアムとやり取りする最もトラストレスで、プライバシーが保護され、分散化され、検閲耐性のある方法は、フルノードを実行することです。 フルノードを持っていると、ブロックチェーンのコピーを自分自身で保持するため、即座にクエリを投げられます。また、イーサリアムのピアツーピアネットワークにも直接アクセスすることができます。 しかし、フルノードの実行には、大容量のメモリとストレージ、そしてCPUが必要です。 そのため、すべての人が自分のノードを実行できるわけではありません。 イーサリアムのロードマップには、これを解決するためのステートレスなどの解決策がありますが、実装には数年かかる見通しです。 短期的な解決策としては、フルノードの利点を一部犠牲にして、ハードウェア要件を大幅に低下させ、 パフォーマンスを向上させるライトクライアントがあります。 + +## ライトクライアントとは {#what-is-a-light-client} + +ライトノードとは、ライトクライアントのソフトウェアを実行しているノードです。 ブロックチェーンデータのコピーを保存して、すべての変更を自分で検証するかわりに、ライトクライアントは、必要なデータをいくつかのプロバイダーにリクエストをします。 プロバイダーは、フルノードに直接接続するか、中央集権型のRPCサーバーを通して接続する場合があります。 このデータは、ライトノードによって検証され、チェーンの先頭に追いつくことができます。 ライトノードは、ブロックヘッダーのみを処理し、必要に応じて実際のブロックのコンテンツをダウンロードします。 ノードがどの程度軽量になるかは、実行するライトクライアントソフトウェアとフルクライアントソフトウェアの組み合わせによって決まります。 例えば、最も軽量なノードは、ライト実行クライアントとライトコンセンサスクライアントを実行します。 また、多くのノードは、フル実行クライアントとライトコンセンサスクライアントを組み合わせて実行したり、その逆を選択したりするかもしれません。 + +## ライトクライアントが動作する仕組み {#how-do-light-clients-work} + +イーサリアムがプルーフ・オブ・ステークに基づいたコンセンサスメカニズムを使い始めた当時、ライトクライアントを特別にサポートするための新しいインフラストラクチャが導入されました。 この仕組みは、**同期委員会**として機能する512台あるバリデータのサブセットを1.1日ごとにランダムに選ぶことで機能します。 同期委員会は、最新のブロックのヘッダーに署名します。 すべてのブロックヘッダーには、同期委員会のバリデータによる集約された署名と、どのバリデータが署名し、どのバリデーターが署名しなかったかを示す「ビットフィールド」があります。 また、各ヘッダーには、次のブロックの署名に参加することになっているバリデータのリストもあります。 つまり、ライトクライアントでは、受信したデータの署名が同期委員会のものであることがすぐに確認できます。また、前のブロックから予想したデータと受信したデータを比較することで、同期委員会が本物であることも確認できます。 この方法で、ライトクライアントは、実際にブロック自体をダウンロードせずに、要約された情報を含むヘッダーだけで、最新のイーサリアムのブロックが持つ情報を更新し続けることができます。 + +実行レイヤーでは、ライト実行クライアントの仕様が統一されていません。 ライト実行クライアントの範囲は、フル実行クライアントの「ライトモード」とは異なる場合があります。「ライトモード」では、フルノードと同じEVMとネットワーク機能をすべて備えています。しかし、関連するデータをダウンロードせずにブロックヘッダーのみを検証するか、イーサリアムとのやり取りにおいてリクエストをRPCプロバイダーへ転送することに依存した、よりシンプルなクライアントになるかもしれません。 + +## ライトクライアントが重要である理由 {#why-are-light-clients-important} + +ライトクライアントが重要な理由は、ユーザーがデータプロバイダーを妄信せず、受信したデータを自分で検証できるようになるからです。また、ライトクライアントはフルノードに比べて、計算リソースを大幅に節約できます。 ライトクライアントが受信するデータは、ランダムに選ばれたイーサリアムのバリデータ512台のうち、少なくとも3分の2の署名が付いたブロックヘッダーで確認できます。 このブロックヘッダーは、データが正しいことの非常に強力な証明です。 + +ライトクライアントは、コンピューティングパワー、メモリ、ストレージをそれほど必要としないため、携帯電話で実行したり、アプリに埋め込んだり、ブラウザの一部として実行したりできます。 サードパーティプロバイダーに依存するのと変わらないほどスムーズに、信頼を最小限に抑えてイーサリアムへアクセスできるのがライトクライアントです。 + +ここで簡単な例を上げてみましょう。 例えば、自分のアカウントの残高を確認したい場合を考えてみましょう。 確認するには、イーサリアムノードにリクエストを送信する必要があります。 リクエストされたノードは、イーサリアムが持つ状態のローカルコピーをチェックして残高を確認し、結果を返します。 ノードに直接アクセスできない場合は、中央集権化されたオペレーターが提供するデータを使用することになります。 中央集権化されたオペレーターへリクエストを送信すると、彼らはノードを確認し、その結果を返します。 ここで問題となるのは、このプロバイダーが正しい情報を提供していると信頼しなければならないことです。 自分自身で検証できなければ、その情報が正しいかどうかは決してわかりません。 + +ライトクライアントは、この問題を解決します。 外部のプロバイダーにデータを要求する必要はありますが、データを受信すると、証明が添付されており、ライトノードはこの証明を使って、ブロックヘッダーで受信した情報と照合することができます。 これにより、信頼できるオペレーターに代わって、イーサリアムでデータの正確性を検証することができます。 + +## ライトクライアントが可能にするイノベーション {#what-innovations-do-light-clients-enable} + +ライトクライアントの主な利点は、ハードウェアの要件を問わず、サードパーティへの依存を最小限に抑え、より多くの人が単独でイーサリアムにアクセスできるようになることです。 ユーザーにとっては、自分でデータを検証できるというメリットがあります。ネットワークにとっても、チェーンを検証するノードの数と多様性が増加するメリットがあります。 + +ストレージやメモリ、処理能力が小さいデバイスでも、イーサリアムノードを実行できるようになることは、ライトクライアントによって実現される重要なイノベーションひとつです。 現在のイーサリアムノードは、大量のコンピューティングリソースを必要としますが、ライトクライアントはブラウザに埋め込むことができ、携帯電話、さらにはスマートウォッチなどの小型デバイスでも実行できる可能性があります。 つまり、携帯電話でイーサリアムウォレットと組み込みクライアントを実行できるということです。 その結果、モバイルウォレットはデータに関して中央集権的なデータプロバイダーに依存する必要がなくなり、より分散化された運用が可能になります。 + +この拡張により、**IoT(モノのインターネット)**デバイスでもライトクライアントを実行できるようになります。 ライトクライアントでは、同期委員会によって提供されるセキュリティ保証を活用して、トークンの残高やNFTの所有権を即座に証明できます。これは、IoTネットワーク上でのさまざまな用途につながります。 例えば、[自転車のレンタルサービス](https://youtu.be/ZHNrAXf3RDE?t=929)を想像してみてください。ライトクライアントが組み込まれているアプリを使用して、そのレンタルサービスのNFTを所有していることをすぐに確認し、自転車のロックを解除して、乗ることができます。 + +ライトクライアントは、イーサリアムのロールアップにもメリットがあります。 ロールアップの大きな問題のひとつは、イーサリアムメインネットからロールアップに資金を移動するブリッジを標的としたハッキングです。 脆弱性のひとつが、ユーザーがブリッジに入金したことを検出するためにロールアップが使用するオラクルです。 オラクルが不正なデータを提供すると、ロールアップはブリッジに入金があったと誤解し、誤って資金をリリースしてしまう可能性があります。 ロールアップに組み込まれたライトクライアントは、汚染されたオラクルを保護するのに役立ちます。なぜなら、ブリッジへの入金時に、トークンをリリースする前に、ロールアップで検証できる証明を添付できるからです。 このコンセプトは、他のチェーン間ブリッジにも適用できます。 + +ライトクライアントは、イーサリアムウォレットのアップグレードにも使えます。 RPCプロバイダーから提供されるデータを信頼する代わりに、組み込みのライトクライアントを使用して、ウォレットに送信されたデータを直接検証できます。 これでウォレットのセキュリティが高まります。 RPC プロバイダーが誤ったデータを不正に提供した場合、組み込みのライトクライアントは、それを検出できるでしょう。 + +## ライトクライアント開発の現状 {#current-state-of-development} + +現在、さまざまなライトクライアントの開発が進められています。ライトクライアントには、実行クライアント、コンセンサスクライアント、実行およびコンセンサスクライアントを結合したものがあります。 本ページの執筆時点で周知となっているライトクライアントの実装は、次の通りです。 + +- [Lodestar](https://github.com/ChainSafe/lodestar/tree/unstable/packages/light-client): TypeScriptで実装されたコンセンサスライトクライアント +- [Helios](https://github.com/a16z/helios): Rustで実装された実行およびコンセンサスを結合したライトクライアント +- [Geth](https://github.com/ethereum/go-ethereum/tree/master/light): Goで実装された実行クライアントのライトモード(開発中) +- [Nimbus](https://nimbus.guide/el-light-client.html): Nimで実装されたコンセンサスライトクライアント + +現時点では、これらはまだ本番環境で使用できるものではありません。 + +また、ライトクライアントがイーサリアムのデータにアクセスする方法の改善にも、多くの作業が必要です。 現状、ライトクライアントは、クライアント/サーバーモデルを使用したフルノードへのRPCリクエストが必要ですが、将来的には、[ポータルネットワーク](https://www.ethportal.net/)などのピアツーピアのゴシッププロトコルを使用して、ライトクライアントに対してデータを提供できるようになります。 + +[バークルツリー](/roadmap/verkle-trees/)や[ステートレス](/roadmap/statelessness/)などの[ロードマップ](/roadmap/)アイテムの導入により、ライトクライアントのセキュリティ保証もフルクライアントと同等になるでしょう。 + +## 参考文献 {#further-reading} + +- [Zsolt FelfodhiによるGethライトクライアントの説明](https://www.youtube.com/watch?v=EPZeFXau-RE) +- [Etan Kisslingによるライトクライアントネットワークの説明](https://www.youtube.com/watch?v=85MeiMA4dD8) +- [Etan Kisslingによるマージ後のライトクライアントの説明](https://www.youtube.com/watch?v=ZHNrAXf3RDE) +- [Piper Merriamによる記事『機能的なライトクライアントを実現するための困難な道のり』](https://snakecharmers.ethereum.org/the-winding-road-to-functional-light-clients/) diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/node-architecture/index.md new file mode 100644 index 00000000000..d69bd1572cd --- /dev/null +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/node-architecture/index.md @@ -0,0 +1,59 @@ +--- +title: ノードアーキテクチャ +description: イーサリアムノードの構成についての概要 +lang: ja +--- + +イーサリアムノードは、[実行クライアント](/developers/docs/nodes-and-clients/#execution-clients)と[コンセンサスクライアント](/developers/docs/nodes-and-clients/#consensus-clients)の2つのクライアントで構成されています。 + +イーサリアムが[プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow/)を使っていた時は、フルイーサリアムノードを実行するためには、実行クライアントだけで十分でした。 しかし、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pow/)の実装以降、実行クライアントに加えて、[「コンセンサスクライアント」](/developers/docs/nodes-and-clients/#consensus-clients)と呼ばれる別のソフトウェアも必要になりました。 + +以下の図は、2つのイーサリアムクライアント間の関係を示しています。 それぞれのクライアントは、独自のピアツーピア(P2P)・ネットワークに接続しています。 実行クライアントは、ピアツーピア・ネットワークでトランザクションをゴシップし、ローカルのトランザクションプールを管理することができます。一方、コンセンサスクライアントは、ピアツーピア・ネットワークでブロックをゴシップし、コンセンサスを確立し、チェーンの成長を促進します。そのため、別々のピアツーピア・ネットワークが必要になります。 + +![](node-architecture-text-background.png) + +_この画像は、 geth.ethereum.orgから提供されたものです。Gethのロゴを使用して、実行クライアントを表しています。実行クライアントには、他にErigon、Nethermind、Besuなどがあります。_ + +この2つのクライアント構造を実現するには、コンセンサスクライアントがトランザクションのバンドルを実行クライアントに渡す必要があります。 実行クライアントは、トランザクションがイーサリアムのルールに違反していないこと、提案されたイーサリアムの状態に対する更新が正しいことを確認するために、トランザクションをローカルで実行します。 同様に、ノードがブロック生成者に選ばれた場合、コンセンサスクライアントは、新しいブロックに含めるトランザクションのバンドルをGethに要求し、それらのトランザクションを実行してグローバル状態を更新する必要があります。 このクライアント間の通信は、[エンジンAPI](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md)使ったローカルRPC接続で行われます。 + +## 実行クライアントの役割 {#execution-client} + +実行クライアントは、トランザクションの処理、トランザクションのゴシップ、状態の管理、イーサリアム仮想マシン([EVM](/developers/docs/evm/))のサポートを行います。 しかし、ブロックの構築、ブロックのゴシップ、またはコンセンサスロジックの処理は、**行いません**。 これらは、コンセンサスクライアントが行います。 + +実行クライアントは、トランザクションのリスト、更新された状態ツリー、その他の実行に関わるデータ等の実行ペイロードを作成します。 コンセンサスクライアントは、各ブロックごとに実行ペイロードを取り込みます。 実行クライアントには、新しいブロックでトランザクションを再実行して、トランザクションが有効であることを確認する役割もあります。 [イーサリアム仮想マシン(EVM)](/developers/docs/evm)と呼ばれる、実行クライアントに組み込まれたコンピュータ上でトランザクションが実行されます。 + +また、実行クライアントは、[RPCメソッド](/developers/docs/apis/json-rpc)を通じてイーサリアムへのユーザーインターフェースを提供します。これにより、ユーザーは、イーサリアムブロックチェーンにクエリを実行したり、トランザクションを送信したり、スマートコントラクトをデプロイしたりすることができます。 [Web3js](https://docs.web3js.org/)や[Web3py](https://web3py.readthedocs.io/en/v5/)などのライブラリや、ブラウザウォレットなどのユーザーインターフェースでは、RPC呼び出しを処理するのが一般的です。 + +要約すると、実行クライアントは、以下の役割を担っています。 + +- イーサリアムへのユーザーゲートウェイ +- イーサリアム仮想マシン、イーサリアムの状態およびトランザクションプールのホーム + +## コンセンサスクライアントの役割 {#consensus-client} + +コンセンサスクライアントは、ノードがイーサリアムネットワークとの同期を維持するための、すべてのロジックを扱います。 具体的には、ピアからブロックを受信し、フォーク選択アルゴリズムを実行して、バリデータの有効残高に応じて最も多くのアテステーションを蓄積しているチェーンを常時フォローします。 実行クライアントと同様に、コンセンサスクライアントにも独自のピアツーピア・ネットワークがあります。そのネットワークを通じて、ブロックとアテステーションを共有します。 + +コンセンサスクライアントは、ブロックの証明やブロックの提案には参加しません。これは、バリデータが行います。バリデータは、コンセンサスクライアントにあるオプションのアドオンです。 バリデータがないコンセンサスクライアントは、チェーンの先頭に追い付き、ノードを同期するだけです。 これにより、ユーザーは正しいチェーン上にいることを確認でき、実行クライアントを使用してイーサリアムでトランザクションを行うことができます。 + +## バリデータ {#validators} + +ノードオペレーターは、デポジットコントラクトに32ETHを入金することで、コンセンサスクライアントにバリデータを追加することができます。 バリデータクライアントは、コンセンサスクライアントにバンドルされており、いつでもノードに追加することができます。 バリデータは、アテステーションとブロック提案を行います。 ノードがETHで報酬を得たり、ペナルティやスラッシングによってETHを失うのは、バリデータが担う責任です。 バリデータソフトウェアを実行することで、ノードは新しいブロックの提案候補者となることができます。 + +[ステーキングの詳細](/staking/) + +## ノードのコンポーネントの比較 {#node-comparison} + +| 実行クライアント | コンセンサスクライアント | バリデータ | +| --------------------------------- | ------------------------------- | ----------------- | +| ピアツーピア・ネットワークを介したトランザクションのゴシップを行う | ピアツーピアを介したブロックとアテステーションのゴシップを行う | ブロックの提案を行う | +| トランザクションを実行/再実行する | フォークチョイスアルゴリズムを実行する | 報酬またはペナルティを発生させる | +| 受信した状態の変更を検証する | チェーンの先頭を追跡する | アテステーションを作成する | +| 状態ツリーとレシートツリーを管理する | ビーコン状態(コンセンサス情報や実行情報を含む) を管理する | ステークには32ETHが必要となる | +| 実行ペイロードを作成する | RANDAO内に蓄積しているランダム性を追跡する | スラッシュされる可能性がある | +| イーサリアムとやり取りできるJSON-RPC APIを公開する | 正当化とファイナライズを追跡する | | + +## 参考文献 {#further-reading} + +- [プルーフオブステーク](/developers/docs/consensus-mechanisms/pos) +- [ブロック提案](/developers/docs/consensus-mechanisms/pos/block-proposal) +- [バリデータの報酬とペナルティ](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index bcc56e423a6..eb61adfbdf7 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -15,7 +15,7 @@ sidebarDepth: 2 ## ステーカー {#stakoooooooooooooors} -ソロステーカーは、サードパーティプロバイダーを使用せず、自分のインフラストラクチャを運用する必要があります。 これは、実行クライアントとコンセンサスクライアントの両方を実行することを意味します。 [マージ](/roadmap/merge)前は、コンセンサスクライアントのみを実行し、実行データに関しては中央集中型のプロバイダーを使用できましたが、これはもうできなくなり、ソロステーカーは、両方のクライアントを実行する必要があります。 しかし、このプロセスを容易にするために利用できるサービスがあります。 +ソロステーカーは、サードパーティプロバイダーを使用せず、自分のインフラストラクチャを運用する必要があります。 これは、実行クライアントとコンセンサスクライアントの両方を実行することを意味します。 [マージ](/roadmap/merge)前は、コンセンサスクライアントのみを実行し、実行データは中央集権型のプロバイダーから取得できました。マージ後は、両方のクライアントを実行する必要はありますが、 ステーキングを容易にするサービスが提供されています。 詳細については、[ノードの運用](/developers/docs/nodes-and-clients/run-a-node/)をご覧ください。 @@ -25,13 +25,13 @@ sidebarDepth: 2 ノード運用サービスプロバイダーは、分散ノードクライアントの実行を代行し、利用者の負担を軽減してくれます。 -これらのサービスは通常、ブロックチェーンへの書き込みと読み込みに使用できる API キーを提供します。 多くの場合、メインネットに加えて [イーサリアムテストネット](/developers/docs/networks/#ethereum-testnets)にもアクセスできます。 +これらのサービスは通常、ブロックチェーンへの書き込みと読み込みに使用できる APIキーを提供します。 多くの場合、メインネットに加えて [イーサリアムテストネット](/developers/docs/networks/#ethereum-testnets)にもアクセスできます。 サービスによっては、自分専用ノードの運用を提供するものもあり、ロードバランサーを使用してノード間のアクティビティを分散するものもあります。 -ほとんどのノードサービスとの統合は非常に簡単で、自己ホストノードを交換、またはサービス自体を切り替えるには、コードを 1 行変更するだけです。 +ほとんどのノードサービスとの統合は非常に簡単で、自己ホストノードを交換、またはサービス自体を切り替えるには、コードを1行変更するだけです。 -多くの場合、ノード運用サービスは様々な[ノードクライアント](/developers/docs/nodes-and-clients/#execution-clients)と[型](/developers/docs/nodes-and-clients/#node-types)を実行します。1 つの API でクライアント固有のメソッドに加えて、フルノードとアーカイブノードにアクセスできます。 +多くの場合、ノード運用サービスは様々な[ノードクライアント](/developers/docs/nodes-and-clients/#execution-clients)と[型](/developers/docs/nodes-and-clients/#node-types)を実行します。1つのAPI でクライアント固有のメソッドに加えて、フルノードとアーカイブノードにアクセスできます。 ノード運用サービスには秘密鍵やあなたの情報を保管してはいけないことにご留意ください。 @@ -39,7 +39,7 @@ sidebarDepth: 2 ノード運用サービスの利用の主なメリットは、自分でノードの保守と管理に時間を費やす必要がないことです。 これにより、インフラストラクチャのメンテナンスを心配する必要がなくなり、製品の構築に集中することができます。 -独自のノードの運用は、ストレージから処理能力、貴重なエンジニアリング時間など、非常に高価になります。 スケーリング時にノードを多数立ち上げたり、最新バージョンにアップグレードしたり、状態の一貫性を確実にするなどの作業は、望んでいる Web3 製品の作成に必要なリソースや時間を削いでしまいます。 +独自のノードの運用は、ストレージから処理能力、貴重なエンジニアリング時間など、非常に高価になります。 スケーリング時にノードを多数立ち上げたり、最新バージョンにアップグレードしたり、状態の一貫性を確実にするなどの作業は、望んでいるWeb3製品の作成に必要なリソースや時間を削いでしまいます。 ## ノード運用サービス利用のデメリット {#cons-of-using-a-node-service} @@ -54,66 +54,118 @@ sidebarDepth: 2 - [**Alchemy**](https://alchemy.com/) - [ドキュメント](https://docs.alchemyapi.io/) - 機能 - - 月間 3 億のコンピュートユニット(約 3 千万件の getLatestBlock リクエスト)の最大無料ティア - - Polygon、Starknet、Optimism、Arbitrum などの複数のチェーン対応 - - イーサリアム分散型アプリ(Dapp)と分散型金融(DeFi)のトランザクション量の約 70%を供給 - - Alchemy Notify によるリアルタイム Webhook アラート + - 月間3億のコンピュートユニット(約3千万件のgetLatestBlockリクエスト)の最大無料ティア + - Polygon、Starknet、Optimism、Arbitrumなどの複数のチェーン対応 + - イーサリアム分散型アプリ(Dapp)と分散型金融(DeFi)のトランザクション量の約70%を供給 + - Alchemy NotifyによるリアルタイムWebhookアラート - クラス最高のサポートと信頼性/安定性 - - Alchemy の NFT API + - AlchemyのNFT API - リクエストエクスプローラー、メンプールウォッチャー、および コンポーザーを備えたダッシュボード - 統合されたテストネットフォーセットのアクセス - - 18,000 人のアクティブユーザーを持つ開発者のための Discord コミュニティ + - 18,000人のアクティブユーザーを持つ開発者のためのDiscordコミュニティ +- [**All That Node**](https://allthatnode.com/) + - [ドキュメント](https://docs.allthatnode.com/) + - 機能 + - 1日あたり15万リクエストの最大の無料ティア + - 24以上のブロックチェーンノードへのアクセス + - RPC、HTTPS、WSSエンドポイント + - アーカイブデータへの無制限アクセス + - 24時間年中無休のサポートと99.9%超の稼働時間 + - 複数のチェーンで利用可能なフォーセット + - 無制限のAPIキー数でエンドポイントに無制限アクセス + - トレース/デバッグ名前空間が利用可能 + - 自動アップデート + - 技術サポート - [**Ankr**](https://www.ankr.com/) - [ドキュメント](https://docs.ankr.com/) - 機能 - - Ankr Protocol - 8 チェーン以上の Public RPC API エンドポイントへのオープンアクセス + - Ankr Protocol - 8チェーン以上の公開RPC APIエンドポイントへのオープンアクセス - ロードバランシングとノードのヘルスモニタリングにより、最も近い利用可能なノードへの高速で信頼性の高いゲートウェイを実現 - - プレミアムティアは WSS エンドポイント、レートリミットの上限なし - - ワンクリックで 40 チェーン以上のフルノードとバリデータノードをデプロイ可能 + - WSSエンドポイントと上限なしのレートリミットを実現するプレミアムティア + - 40チェーン以上のフルノードとバリデータノードをワンクリックでデプロイ - 従量課金制 - 分析ツール - ダッシュボード - - RPC、HTTPS および WSS エンドポイント + - RPC、HTTPSおよびWSSエンドポイント - ダイレクトサポート +- [**Blast**](https://blastapi.io/) + - [ドキュメント](https://docs.blastapi.io/) + - 機能 + - RPCとWSSのサポート + - マルチリージョンでのノードホスティング + - 分散型インフラストラクチャ + - 公開API + - 専用無料プラン + - マルチチェーンサポート(17種類以上のブロックチェーン) + - アーカイブノード + - 年中無休のDiscordサポート + - 年中無休のモニタリングとアラート + - 全体的なSLAは99.9% + - 暗号資産での支払い - [**BlockDaemon**](https://blockdaemon.com/) - [ドキュメント](https://ubiquity.docs.blockdaemon.com/) - - メリット + - 利点 - ダッシュボード - - ノード単位での課金 + - ノード単位ごと - 分析 +- [**BlockPI**](https://blockpi.io/) + - [ドキュメント](https://docs.blockpi.io/) + - 機能 + - ロバストで分散型のノード構造 + - HTTPSとWSSで最大40までのエンドポイント + - 無料の入会パッケージと月額パッケージ + - トレースメソッドおよびアーカイブデータのサポート + - パッケージの有効期限は最大90日 + - カスタムプランおよび従量課金制 + - 暗号資産での支払い + - ダイレクトサポートおよび技術サポート - [**Chainstack**](https://chainstack.com/) - [ドキュメント](https://docs.chainstack.com/) - 機能 - 無料共有ノード - 共有アーカイブノード - - GraphQL サポート - - RPC と WSS エンドポイント + - GraphQLサポート + - RPCとWSSエンドポイント - 専用フルノードとアーカイブノード - 専用デプロイの高速同期 - - BYOC (Bring your own cloud、クラウド持ち込み) + - BYOC(Bring your own cloud、クラウド持ち込み) - 時間課金制 - - 24 時間年中無休のダイレクトサポート + - 24時間年中無休のダイレクトサポート - [**DataHub**](https://datahub.figment.io) - [ドキュメント](https://docs.figment.io/) - 機能 - - 毎月 3 百万件のリクエストの無料ティアオプション - - RPC と WSS エンドポイント - - 専用のフルノードとアーカイブノード + - 毎月300万件のリクエストの無料ティアオプション + - RPCとWSSエンドポイント + - 専用フルノードとアーカイブノード - 自動スケーリング(ボリューム割引) - 無料のアーカイブデータ - サービス分析 - ダッシュボード - - 24 時間年中無休のダイレクトサポート + - 24時間年中無休のダイレクトサポート - 暗号通貨での支払い(エンタープライズ) +- [DRPC](https://drpc.org/) + - [ドキュメント](https://docs.drpc.org/) + - 機能 + - 分散型RPCノード + - 15以上のノードプロバイダー + - ノードバランシング + - 無料ティアで毎月無制限のコンピューティングユニット + - データ検証 + - カスタムエンドポイント + - httpおよびWSSエンドポイント + - キー無制限(無料および有料ティア) + - 柔軟なフォールバックオプション + - [公開エンドポイント](https://eth.drpc.org) + - 無料共有アーカイブノード - [**GetBlock**](https://getblock.io/) - [ドキュメント](https://getblock.io/docs/get-started/authentication-with-api-key/) - 機能 - - 40 以上のブロックチェーンノードへのアクセス - - 4 万の無料デイリーリクエスト - - 無制限の API キー + - 40以上のブロックチェーンノードへのアクセス + - 毎日4万件の無料リクエスト + - APIキー無制限 - 高速接続(1GB/秒) - トレース+アーカイブ - - 高度な分析 + - 高度な解析 - 自動アップデート - 技術サポート - [**InfStones**](https://infstones.com/) @@ -122,11 +174,11 @@ sidebarDepth: 2 - 従量課金制 - 分析 - ダッシュボード - - 独自の API エンドポイント + - 独自のAPIエンドポイント - 専用フルノード - 専用デプロイの高速同期 - - 24 時間年中無休のダイレクトサポート - - 50 以上のブロックチェーンノードへのアクセス + - 24時間年中無休のダイレクトサポート + - 50以上のブロックチェーンノードへのアクセス - [**Infura**](https://infura.io/) - [ドキュメント](https://infura.io/docs) - 機能 @@ -139,22 +191,33 @@ sidebarDepth: 2 - [ドキュメント](https://docs.kaleido.io/) - 機能 - 無料スターターティア - - イーサリアムノードのワンクリック・デプロイ + - イーサリアムノードのワンクリックデプロイ - カスタマイズ可能なクライアントとアルゴリズム(Geth、Quorum & Besu || PoA、IBFT & Raft) - - 500 以上の管理 API とサービス API - - イーサリアムトランザクション送信のための RESTful インターフェイス(Apache Kafka のサポート) - - イベント配信のためのアウトバウンドストリーム(Apache Kafka のサポート) + - 500以上の管理APIとサービス API + - イーサリアムトランザクション送信のためのRESTfulインターフェイス(Apache Kafkaのサポート) + - イベント配信のためのアウトバウンドストリーム(Apache Kafkaのサポート) - 「オフチェーン」の付随サービスの豊富なコレクション(例: 双方向の暗号化されたメッセージングトランスポート) - ガバナンスとロールベースのアクセス制御を備えた簡単なネットワーク・オンボーディング - - 管理者とエンドユーザーの両方の高度なユーザー管理 - - スケーラビリティと復元力に優れたエンタープライズ レベルのインフラストラクチャ - - Cloud HSM 秘密鍵管理 + - 管理者およびエンドユーザー向けの高度なユーザー管理 + - スケーラビリティと回復力に優れたエンタープライズレベルのインフラストラクチャ + - Cloud HSM秘密鍵管理 - イーサリアムメインネットテザリング - - ISO 27k および SOC 2 Type 2 認証 + - ISO 27kおよびSOC 2 Type 2認証 - 動的ランタイム設定(例: クラウド統合の追加、ノードイングレスの変更など) - - マルチクラウド、マルチリージョン、ハイブリッド展開オーケストレーションのサポート - - シンプルな時間単位の SaaS ベース価格 - - SLA と 24 時間年中無休のサポート + - マルチクラウド、マルチリージョン、ハイブリッド・デプロイ・オーケストレーションのサポート + - SaaSベースのシンプルな価格設定(時間単位) + - SLAと24時間年中無休のサポート +- [**Lava Network**](https://www.lavanet.xyz/) + - [ドキュメント](https://docs.lavanet.xyz/) + - 機能 + - テストネットの無料利用 + - 分散型冗長性による高い稼働時間 + - オープンソース + - 完全に分散化されたSDK + - Ethers.jsとの統合 + - 直観的なプロジェクト・マネージメント・インターフェース + - コンセンサスベースのデータ整合性 + - マルチチェーンサポート - [**Moralis**](https://moralis.io/) - [ドキュメント](https://docs.moralis.io/) - 機能 @@ -164,107 +227,160 @@ sidebarDepth: 2 - クロスチェーンサポート - 従量課金制 - ダッシュボード - - 独自のイーサリアム SDK - - 独自の API エンドポイント + - 独自のイーサリアムSDK + - 独自のAPIエンドポイント - ダイレクト技術サポート +- [**NodeReal MegaNode**](https://nodereal.io/) + - [ドキュメント](https://docs.nodereal.io/nodereal/meganode/introduction) + - 機能 + - 信頼性の高い、高速かつスケーラブルなRPC APIサービス + - Web3デベロッパー向けに改良されたAPI + - マルチチェーンサポート + - 無料で開始 - [**NOWNodes**](https://nownodes.io/) - [ドキュメント](https://documenter.getpostman.com/view/13630829/TVmFkLwy) - 機能 - - 50 以上のブロックチェーンノードへのアクセス - - 無料の API キー + - 50以上のブロックチェーンノードへのアクセス + - APIキー無料 - ブロックエクスプローラー - - API 応答時間 1 秒以下 - - 24 時間年中無休のサポートチーム + - API応答時間: 1秒未満 + - 24時間年中無休のサポートチーム - パーソナルアカウントマネージャー - 共有、アーカイブ、バックアップ、専用ノード - [**Pocket Network**](https://www.pokt.network/) - [ドキュメント](https://docs.pokt.network/home/) - 機能 - - 分散 RPC プロトコルとマーケットプレイス - - 1 日あたり百万件のリクエスト無料ティア(エンドポイントあたり最大 2) + - 分散型RPCプロトコルとマーケットプレイス + - 1日あたり100万件のリクエストができる無料ティア(エンドポイントあたり最大2件) - [パブリックエンドポイント](https://docs.pokt.network/home/resources/public-rpc-endpoints) - - プレステーク+プログラム(1 日に百万件を超えるリクエストが必要な場合) - - 15 以上のブロックチェーン対応 - - アプリケーションへのサービスで POKT を獲得する 6400 以上のノード + - プレステーク+プログラム(1日に100万件を超えるリクエストが必要な場合) + - 15以上のブロックチェーン対応 + - アプリケーションへのサービスでPOKTを獲得する6400以上のノード - アーカイブノード、トレース付きアーカイブノード、テストネットノードサポート - - イーサリアムメインネットノードクライアントの多様性 + - イーサリアムメインネットのノードクライアントの多様性 - 単一障害点なし - ゼロダウンタイム - - 費用対効果の高いほぼゼロ・トークノミクス(ネットワーク参加に POKT を 1 回ステーキング) + - 高コスト効率のゼロに近いトークノミクス(ネットワーク帯域幅を利用するためにPOKTを1回ステーキング) - 月々のコストなし、インフラストラクチャを資産に変更 - プロトコルに組み込まれたロードバランシング - - 1 日あたりのリクエスト件数と、1 時間あたりのノード数を無限に拡張可 + - 1日あたりのリクエスト件数と、1時間あたりのノード数を無限に拡張 - 最もプライベートで検閲耐性のあるオプション - ハンズオンデベロッパーサポート - [Pocket Portal](https://bit.ly/ETHorg_POKTportal)ダッシュボードと分析 - [**QuickNode**](https://www.quicknode.com) - - [ドキュメント](https://www.quicknode.com/docs/) + - [ドキュメンテーション](https://www.quicknode.com/docs/) - 機能 - - 業界をリードする性能と信頼性 - - 24 時間年中無休のテクニカルサポートとデベロッパーの Discord コミュニティ - - 地理的なバランスを考慮した、マルチ クラウド/メタル、低遅延ネットワーク - - マルチチェーンサーポート(Optimism、Arbitrum、Polygon 他 11 種以上) - - スピードと安定性を考慮したミドルレイヤー (コールルーティング、キャッシュ、インデックス作成) - - Webhook によるスマートコントラクト・モニタリング - - 直感的なダッシュボード、分析スイート、RPC コンポーザー - - 高度なセキュリティ機能 (JWT、マスキング、ホワイトリスト) - - NFT データと分析 API - - [SOC2 認証](https://www.quicknode.com/security) - - デベロッパーからエンタープライズまで適する + - 24時間年中無休の技術サポートとデベロッパーのDiscordコミュニティ + - 地理的なバランスを考慮した、マルチクラウド/メタルの低遅延ネットワーク + - マルチチェーンサーポート(Optimism、Arbitrum、Polygon他11種以上) + - スピードと安定性を考慮したミドルレイヤー(コールルーティング、キャッシュ、インデックス作成) + - Webhookによるスマートコントラクト・モニタリング + - 直感的なダッシュボード、分析スイート、RPCコンポーザー + - 高度なセキュリティ機能(JWT、マスキング、ホワイトリスト) + - NFTデータと分析API + - [SOC2認証](https://www.quicknode.com/security) + - デベロッパーからエンタープライズまで幅広く対応 - [**Rivet**](https://rivet.cloud/) - - [ドキュメント](https://rivet.readthedocs.io/en/latest/) + - [ドキュメンテーション](https://rivet.readthedocs.io/en/latest/) - 機能 - 無料ティアオプション - 従量課金制 - [**SenseiNode**](https://senseinode.com) - - [ドキュメント](https://docs.senseinode.com/) + - [ドキュメンテーション](https://docs.senseinode.com/) - 機能 - 専用ノードと共有ノード - ダッシュボード - - ラテンアメリカの様々な地域で、AWS 外の複数のホスティングプロバイダーを使ったホスティング - - Prysm と Lighthouse クライアント + - ラテンアメリカの様々な地域に拠点を置く複数のホスティングプロバイダーを利用して、AWS外部でホスティング + - PrysmとLighthouseクライアント - [**SettleMint**](https://console.settlemint.com/) - - [ドキュメント](https://docs.settlemint.com/) + - [ドキュメンテーション](https://docs.settlemint.com/) - 機能 - 無料トライアル - 従量課金制 - - GraphQL サポート - - RPC と WSS エンドポイント + - GraphQLサポート + - RPCとWSSエンドポイント - 専用フルノード - - BYOC (Bring your own cloud、クラウド持ち込み) + - BYOC(Bring your own cloud、クラウド持ち込み) - 分析ツール - ダッシュボード - 時間課金制 - ダイレクトサポート +- [**Tenderly**](https://tenderly.co/web3-gateway) + - [ドキュメンテーション](https://docs.tenderly.co/web3-gateway/web3-gateway) + - 機能 + - 1か月あたり2,500万Tenderlyユニットを含む無料ティア + - 履歴データへの無料アクセス + - 読込負荷の高いワークロードの処理速度を最大で8倍に高速化 + - 100%一貫性のある読み取りアクセス + - JSON RPCエンドポイント + - UIベースのRPCリクエストビルダーおよびリクエストプレビュー + - 密接に統合されたTenderly開発、デバック、テストツール + - トランザクションのシミュレーション + - 使用量分析およびフィルタリング + - 鍵管理への簡単なアクセス + - チャット、メール、Discordによる専用エンジニアリングサポート - [**Watchdata**](https://watchdata.io/) - [ドキュメント](https://docs.watchdata.io/) - 機能 - データの信頼性 - - ダウンタイムがなく、途切れない接続 + - ダウンタイムなしの途切れない接続 - プロセスの自動化 - 無料プラン - - 高制限でどのユーザーにも適する - - 様々なノードに対応 + - すべてのユーザーに対応する上限 + - さまざまなノードに対応 - リソーススケーリング - 高速処理速度 - [**ZMOK**](https://zmok.io/) - [ドキュメント](https://docs.zmok.io/) - 機能 - - サービス化の先駆者 - - 検索/フィルタリング機能があるグローバルトランザクションメンプール - - トランザクション送信のトランザクションフィーとガス代の制限なし + - サービスとしてのフロントランニング + - 検索/フィルタリング機能を備えたグローバルトランザクションメンプール + - トランザクション送信時のトランザクションフィーとガス代が無制限 - 新規ブロックの最速の取得とブロックチェーンの読み取り - - API 呼び出しあたりのベストプライス保証 + - API呼び出しあたりのベストプライス保証 +- [**Chainbase**](https://www.chainbase.com/) + - [ドキュメント](https://docs.chainbase.com) + - 機能 + - 高可用性、高速、スケーラブルなRPCサービス + - マルチチェーンサポート + - 無料プラン + - ユーザーフレンドリーなダッシュボード + - RPCを超えたブロックチェーンデータサービスの提供 + +[**Zeeve**](https://www.zeeve.io/) + +- [ドキュメント](https://www.zeeve.io/docs/) +- 機能 + - エンタープライズグレードのノーコード自動化プラットフォームで、デプロイメント、モニタリング、ブロックチェーンノードの管理、ネットワークを提供 + - 30以上のプロトコルと統合をサポート、さらに追加中 + - 実世界のユースケースに合わせた分散型ストレージ、分散型ID、ブロックチェーンレジャーデータAPIなどの付加価値のあるWeb3インフラストラクチャサービス + - 年中無休のサポートとプロアクティブなモニタリングにより、ノードの正常性を常に確保 + - RPCエンドポイントでは、APIへのアクセス認証、直感的なダッシュボードと分析機能により手間をかけずに管理 + - マネージドクラウドおよび、自身のクラウドオプションを持ち込み両方を提供します。メジャーなプロバイダーであるAWS、Azure、Google Cloud、Digital Ocean、およびオンプレミスなどすべてをサポート + - 常にユーザーに最も近いノードに接続するために、インテリジェントルーティングを利用 + +[**Tokenview**](https://services.tokenview.io/) + +- [ドキュメント](https://services.tokeniew/docs?type=nodeService) +- 機能 + - 年中無休の技術サポートおよび開発者向けテレグラムコミュニティ + - マルチチェーンサポート(ビットコイン、イーサリアム、トロン、BNBスマートチェーン、イーサリアムクラシック) + - RPCおよびWSSの両方のエンドポイントが利用可能 + - アーカイブデータAPIへの無制限アクセス + - リクエストエクスプローラーとメンプールウォッチャーを備えたダッシュボード + - NFTデータAPIおよびウェブフック通知 + - 暗号資産での支払い + - 追加の動作要件のための外部支援 ## 参考文献 {#further-reading} -- [イーサリアムノードサービスの一覧](https://ethereumnodes.com/) +- [イーサリアムノードサービスのリスト](https://ethereumnodes.com/) ## 関連トピック {#related-topics} -- [ノードとクライアント](/developers/docs/nodes-and-clients/) +- [ ノードとクライアント](/developers/docs/nodes-and-clients/) ## 関連チュートリアル {#related-tutorials} -- [Alchemy を使用したイーサリアム開発入門](/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/) -- [Web3 と Alchemy を使用したトランザクションの送信ガイド](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) +- [Alchemyを使用したイーサリアム開発入門](/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/) +- [Web3とAlchemyを使用したトランザクションの送信ガイド](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md index 5bc9f33adbe..83b5d819d6a 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/run-a-node/index.md @@ -7,7 +7,7 @@ sidebarDepth: 2 自分自身のノードを立ち上げ、運用することは、さまざまなメリットがあります。新しい可能性が開かれ、エコシステムのサポートへの貢献にもつながります。 このページは、自分のノードを立ち上げ、イーサリアムのトランザクション検証に参加する方法について説明します。 -[マージ](/roadmap/merge)以降、イーサリアムノードの運用には、**実行レイヤー(EL)**クライアントと**コンセンサスレイヤー(CL)**クライアントの 2 つが必要であることに注意してください。 このページでは、この 2 つのクライアントをインストール、設定、接続してイーサリアムノードを立ち上げる方法を紹介します。 +[マージ](/roadmap/merge)以降、イーサリアムノードの運用には、**実行レイヤー(EL)**クライアントと**コンセンサスレイヤー(CL)**クライアントの2つが必要であることに注意してください。 このページでは、この2つのクライアントをインストール、設定、接続してイーサリアムノードを立ち上げる方法を紹介します。 ## 前提知識 {#prerequisites} @@ -27,7 +27,7 @@ sidebarDepth: 2 環境を整えたら、[初心者向けのインターフェース](#automatized-setup)か、高度なオプションが使用できるターミナルを使った[手動](#manual-setup)かを選び、クライアントをインストールします。 -ノードが実行して同期が取れたら、使用する準備が整いますが、メンテナンスには常に意識を向ける必要があります。 +ノードが実行され同期が完了したら、[使用](#using-the-node)できる状態になりますが、[メンテナンス](#operating-the-node)は常に意識しておく必要があります。 ![クライアントのセットアップ](./diagram.png) @@ -38,149 +38,144 @@ sidebarDepth: 2 イーサリアムクライアントは、コンシューマーグレードのコンピュータで動作します。マイニング専用マシンのような特別なハードウェアは必要ありません。 そのため、ノードのデプロイメントには、ニーズに合わせた様々なオプションがあります。 簡単にするため、ローカルの物理マシンとクラウドサーバの両方でノードを実行することしましょう。 - クラウド - - プロバイダーは高可用性のサーバと静的なパブリック IP アドレスを提供 + - プロバイダーは高可用性のサーバと静的なパブリックIPアドレスを提供 - 専用または仮想サーバを構築するよりも容易に利用可能 - サードパーティであるサーバプロバイダーを信頼しなければならないトレードオフが発生 - フルノードに必要なストレージ容量により、レンタルサーバの価格が高くなることがある - 自分のハードウェア - トラストレスで主権的なアプローチ - - 1 回限りの投資 + - 1回限りの投資 - 事前設定された専用マシンを購入することも可能 - マシンやネットワークの物理的な準備、メンテナンス、トラブルシューティングが必要 -どちらの選択肢も、上記のような異なるメリットがあります。 従来型のクラウドコンピューティングプロバイダに加えて、クラウドソリューションを探している場合は、ノードのデプロイに焦点を当てたサービスもあります。 例: - -- [QuikNode](https://www.quiknode.io/) -- [BlockDaemon](https://blockdaemon.com) -- [Alchemy](https://www.alchemy.com/) - -ホスティングされたノードのオプションについては、[ノード・アズ・ア・サービス](/developers/docs/nodes-and-clients/nodes-as-a-service/)も参照してください。 +どちらの選択肢も、上記のような異なるメリットがあります。 従来型のクラウドコンピューティングプロバイダーに加えて、クラウドソリューションを探している場合は、ノードのデプロイに焦点を当てたサービスもあります。 ホスティングされたノードのオプションについての詳細は、[ノード・アズ・ア・サービス](/developers/docs/nodes-and-clients/nodes-as-a-service/)を参照してください。 #### ハードウェア {#hardware} -しかし、検閲耐性をもつ分散型ネットワークは、クラウドプロバイダに依存すべきではありません。 クラウドではなく、ローカルハードウェア上でノードを実行することが、エコシステムにとってより健全となります。 [推計](https://www.ethernodes.org/networkType/Hosting)によると、クラウド上で動作するノードの割合が多く、単一障害点となる可能性があることが示唆されています。 +しかし、検閲耐性を備えた分散型ネットワークは、クラウドプロバイダーに依存すべきではありません。 クラウドではなく、ローカルハードウェア上でノードを実行することが、エコシステムにとってより健全です。 [推計](https://www.ethernodes.org/networkType/Hosting)によると、クラウド上で動作するノードの割合が多く、単一障害点となる可能性があります。 イーサリアムクライアントは、デスクトップパソコン、ノートパソコン、サーバ、あるいはシングルボードコンピュータ上で動作させることができます。 パーソナルコンピュータでクライアントを実行することも可能ですが、ノード専用マシンを用意することで、プライマリコンピュータへの影響を最小限に抑えながら、パフォーマンスとセキュリティを大幅に向上させることができます。 -自分のハードウェアの使用は非常に簡単です。 シンプルなオプションだけでなく、より技術的な方向けの高度なセットアップ方法も多数用意されています。 それでは、自分自身のマシンでイーサリアムクライアントを実行するための要件と方法を見てみましょう。 +自分のハードウェアを使うのは非常に簡単です。 シンプルなオプションだけでなく、より技術的な方向けの高度なセットアップ方法も多数用意されています。 それでは、自分のマシンでイーサリアムクライアントを実行するための要件と方法を見ていきましょう。 #### 必要条件 {#requirements} -ハードウェア要件はクライアントによって異なりますが、ノードは同期を維持する必要があるだけなので、通常、要件はそれほど高くありません。 より多くの計算能力を必要とするマイニングと混同しないでください。 ただし、より強力なハードウェアでは同期時間とパフォーマンスは改善します。 +ハードウェア要件はクライアントによって異なりますが、ノードは同期を維持する必要があるだけなので、通常はそれほど高くありません。 マイニングとは異なり、ノードは多くの計算能力を必要としないため、混同しないでください。 ただし、より強力なハードウェアでは、同期時間とパフォーマンスは向上します。 クライアントをインストールする前に、コンピュータに十分なリソースがあることを確認してください。 最小システム要件と推奨システム要件は以下のとおりです。 -ハードウェアのボトルネックは、主にディスク容量です。 イーサリアムブロックチェーンの同期は、非常に多くの入出力を必要とし、多くのディスクスペースが必要です。 同期後も数百 GB の空き容量を確保できる、ソリッド・ステート・ドライブ(SSD)を用意することをお勧めします。 +ハードウェアのボトルネックは、主にディスク容量です。 イーサリアムブロックチェーンの同期は、非常に多くの入出力を必要とし、多くのディスクスペースが必要です。 そのため、同期後も数百GBの空き容量を確保できる、ソリッド・ステート・ドライブ(SSD)を用意することをお勧めします。 データベースのサイズと初期同期の速度は、選択したクライアント、設定、[同期戦略](/developers/docs/nodes-and-clients/#sync-modes)によって異なります。 -また、インターネット接続が[帯域幅の上限](https://wikipedia.org/wiki/Data_cap)により制限されていないことを確認してください。 ネットワークにブロードキャストされたデータが制限を超える可能性があるため、従量非制限の接続を使用することをお勧めします。 +また、インターネット接続が[帯域幅の上限](https://wikipedia.org/wiki/Data_cap)により制限されていないことを確認してください。 ネットワークにブロードキャストされたデータが制限を超える可能性があるため、従量制限のない接続を使用することをお勧めします。 -##### オペレーティングシステム {#operating-system} +##### オペレーティングシステム -すべてのクライアントは、Linux、MacOS、Windows などの主要なオペレーティングシステムに対応しています。 自分に最適なオペレーティングシステム(OS)を使って、通常のデスクトップまたはサーバマシンでノードを実行できます。 潜在的な問題やセキュリティの脆弱性を回避するために、お使いの OS が最新の状態になっていることを確認してください。 +すべてのクライアントは、Linux、MacOS、Windowsなどの主要なオペレーティングシステムに対応しています。 自分に最適なオペレーティングシステム(OS)を使って、通常のデスクトップまたはサーバマシンでノードを実行できます。 潜在的な問題やセキュリティの脆弱性を回避するために、お使いのOSが最新の状態になっていることを確認してください。 -##### 最小システム要件 {#minimum-requirements} +##### 最小システム要件 - CPU: デュアルコア以上 -- RAM 8GB -- ディスク空き容量 700GB -- 帯域幅 10MB/秒以上 +- RAM: 8GB +- 2TB: SSD +- 帯域幅: 10MB/秒以上 -##### 推奨される仕様 {#recommended-hardware} +##### 推奨される仕様 -- 高速 CPU クアッドコア以上 -- RAM 16GB 以上 -- 高速 SSD 1TB 以上 -- 帯域幅 25MB/秒以上 +- 高速CPU: クアッドコア以上 +- RAM: 16GB以上 +- 高速SSD: 2TB以上 +- 帯域幅: 25MB/秒以上 選択した同期モードとクライアントによって必要容量が変わります。以下に各クライアントに必要なディスク容量の概算を記載します。 -| クライアント | ディスクサイズ(スナップ同期) | ディスクサイズ(フルアーカイブ) | -| ------------ | ---------------------------- | ------------------------------ | -| Geth | 500GB 以上 | 12TB 以上 | -| Nethermind | 500GB 以上 | 12TB 以上 | -| Besu | 800GB 以上 | 12TB 以上 | -| Erigon | N/A | 2.5TB 以上 | +| クライアント | ディスクサイズ(スナップ同期) | ディスクサイズ(フルアーカイブ) | +| ---------- | --------------- | ---------------- | +| Geth | 500GB以上 | 12TB以上 | +| Nethermind | 500GB以上 | 12TB以上 | +| Besu | 800GB以上 | 12TB以上 | +| Erigon | N/A | 2.5TB以上 | -- 注: エリゴンにはスナップ同期はありませんが、フルプルーニングが可能(約 500GB) +- 注: エリゴンにはスナップ同期機能はありませんが、フルプルーニングは可能です(約500GB) -コンセンサスクライアントには、必要な容量はクライアントの実装や有効にした機能(バリデータスラッシャーなど)によって変わりますが、概ねビーコンデータ用にさらに 200GB を必要とします。 多数のバリデータを実行すると、帯域幅への負荷も大きくなります。 こちらの分析に、[コンセンサスクライアントの要件詳細](https://medium.com/@migalabs/analysis-of-ethereum-2-consensus-clients-dfede8e0145e)が記載されています。 +コンセンサスクライアントの必要な容量は、クライアントの実装や有効にした機能(バリデータスラッシャーなど)によって変わりますが、概ねビーコンデータ用にさらに200GB必要です。 また、多数のバリデータを実行すると、帯域幅への負荷も大きくなります。 [こちら](https://medium.com/@migalabs/analysis-of-ethereum-2-consensus-clients-dfede8e0145e)に、本分析のコンセンサスクライアントの要件詳細が記載されています。 #### プラグ・アンド・プレイ・ソリューション {#plug-and-play} -自分のハードウェアでノードを実行するのに最も簡単な方法は、プラグ・アンド・プレイ・ボックスを使用することです。 事前設定されたマシンを使うと、注文、接続、実行と最も簡単に実行することができます。 何もかもが事前設定されており、自動実行され、直感的なガイドとダッシュボードでソフトウェアを監視・制御できます。 +自分のハードウェアでノードを実行する最も簡単な方法は、プラグ・アンド・プレイ・ボックスを使用することです。 事前に設定されたマシンを使うと、注文、接続、実行まで、最も簡単に実行することができます。 すべてが事前設定されており、自動実行され、直感的なガイドとダッシュボードでソフトウェアを監視・制御できます。 - [DappNode](https://dappnode.io/) - [Avado](https://ava.do/) #### シングルボードコンピュータ {#ethereum-on-a-single-board-computer} -Raspberry Pi のような ARM アーキテクチャを持つシングルボードコンピュータを使用すると、イーサリアムノードを簡単かつ安価に実行できます。 [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/)は、Raspberry Pi やその他の ARM ボード向けに、実行クライアントとコンセンサスクライアントが容易に実行できるイメージを複数提供しています。 +Raspberry PiのようなARMアーキテクチャのシングルボードコンピュータを使用すると、イーサリアムノードを簡単かつ安価に実行できます。 [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/)は、Raspberry Piやその他のARMボード向けに、実行クライアントとコンセンサスクライアントが容易に実行できるイメージを複数提供しています。 -これらのようなデバイスは、小型、価格が手頃、効率が良く、自宅でノードを運用するのに理想的な反面、性能には限界があることに留意してください。 +これらのデバイスは、小型で価格も手頃、効率も良く、自宅でノードを運用するのに適していますが、性能には限界があることに注意が必要です。 ## ノードの立ち上げ {#spinning-up-node} 実際のクライアント設定は、自動ランチャーを使うか、または手動で直接設定できます。 -上級者でない場合は、ランチャー(インストールをガイドし、クライアントのセットアッププロセスを自動化するソフトウェア)を使用することをお勧めします。 とはいえ、ターミナルの使用経験があれば、手動設定は簡単です。 +上級者でない場合は、ランチャー(インストールをガイドし、クライアントの設定を自動化するソフトウェア)を使用することをお勧めします。 ターミナルの操作に慣れている方は、手動設定も可能です。 ### ガイド付き設定 {#automatized-setup} -複数プロジェクトが、クライアント設定のユーザーエクスペリエンスの向上を目指しています。 ランチャーはクライアントのインストールと設定を自動的に行います。クライアントのガイド付きセットアップと監視用にグラフィック・インターフェイスを提供しているランチャーもあります。 +複数のプロジェクトが、クライアント設定のユーザーエクスペリエンスの向上を目指しています。 ランチャーは、クライアントのインストールと設定を自動化します。また、クライアントのガイド付きセットアップと監視用にグラフィック・インターフェースを提供しているランチャーもあります。 -数回クリックするだけでクライアントをインストールし、制御できる便利なプロジェクトを下記に紹介します。 +数回クリックするだけで、クライアントのインストールや制御ができる便利なプロジェクトを紹介します。 -- [DappNode](https://docs.dappnode.io/get-started/installation/custom-hardware/installation/overview/) - DappNode はベンダーからのマシンだけに提供されているのではなく、 ノードランチャーやコントロールセンターのソフトウェアは多くの機能があり、任意のハードウェアで使用可能。 -- [eth-docker](https://eth-docker.net/docs/About/Overview/) - Docker を使った自動設定は、簡単で安全なステーキングに焦点を当てており、ターミナルと Docker の基本的な知識が必要。少し上級のユーザー向け。 -- [Stereum](https://stereum.net/ethereum-node-setup/) - SSH 接続でリモートサーバにクライアントをインストールするためのランチャー。GUI セットアップガイド、コントロールセンター、その他多くの機能搭載。 +- [DappNode](https://docs.dappnode.io/user/quick-start/first-steps/) - DappNodeはベンダーから提供されるマシンに限らず、 ノードランチャーやコントロールセンターのソフトウェアは多くの機能があり、任意のハードウェアで使用可能。 +- [eth-docker](https://eth-docker.net/) - Dockerを使った自動設定は、簡単で安全なステーキングに焦点を当てており、ターミナルとDockerの基本的な知識が必要。少し上級のユーザー向け。 +- [Stereum](https://stereum.net/ethereum-node-setup/) - SSH接続でリモートサーバにクライアントをインストールするためのランチャー。GUIセットアップガイド、コントロールセンター、その他多くの機能搭載。 - [NiceNode](https://www.nicenode.xyz/) - コンピュータ上でノードを実行するためのランチャー。分かりやすいユーザーエクスペリエンスが特徴。 クライアントを選択し、数回クリックするだけで開始可能。 現在、開発中。 +- [Sedge](https://docs.sedge.nethermind.io/docs/intro) - ノードのセットアップツールでCLIのウィザードを使いDocker構成を自動生成。 NethermindによってGoで開発。 ### 手動でのクライアント設定 {#manual-setup} -もう一つのオプションは、手動でクライアントソフトウェアをダウンロードし、確認・設定することです。 グラフィック・インターフェイスを提供しているクライアントはありますが、手動設定はターミナルの基本的なスキルが必要となりますが、はるかに汎用性があります。 +もう1つのオプションは、クライアントソフトウェアを手動でダウンロードして、確認・設定することです。 グラフィック・インターフェースを提供するクライアントもありますが、手動設定にはターミナルの基本的なスキルが必要となります。ただし、より幅広い用途に対応できます。 -前述したように、自分のイーサリアムノードを立ち上げるには、コンセンサスクライアントと実行クライアントをペアで実行する必要があります。 一部のクライアントには、他の種類のライトクライアントが含まれいるものがあり、それ以外のソフトウェアを必要とせず同期します。 しかし、完全にトラストレスな検証にはコンセンサスクライアントと実行クライアントの両方が必要です。 +前述したように、自分のイーサリアムノードを立ち上げるには、コンセンサスクライアントと実行クライアントをペアで実行する必要があります。 一部のクライアントには、他の種類のライトクライアントが含まれているものがあり、それ以外のソフトウェアをインストールする必要なく同期できます。 しかし、完全にトラストレスな検証を行うためには、コンセンサスクライアントと実行クライアントの両方が必要です。 #### クライアントソフトウェアの取得 {#getting-the-client} まず、希望する[実行クライアント](/developers/docs/nodes-and-clients/#execution-clients)と[コンセンサスクライアント](/developers/docs/nodes-and-clients/#consensus-clients)ソフトウェアを取得する必要があります。 -オペレーティングシステムとアーキテクチャに適した、実行可能なアプリケーションやインストールパッケージをダウンロードするだけです。 必ず、ダウンロードしたパッケージの署名とチェックサムを確認してください。 インストールやアップデートを簡単にするためのリポジトリや Docker イメージを提供するクライアントもあります。 クライアントはすべてオープンソースなので、ソースからビルドすることもできます。 これはより高度な方法ですが、場合によっては必要な場合があります。 +オペレーティングシステムとアーキテクチャに適した、実行可能なアプリケーションやインストールパッケージをダウンロードするだけです。 ダウンロードしたパッケージの署名とチェックサムも必ず確認してください。 インストールやアップデートを簡単に行うためのリポジトリやDockerイメージを提供するクライアントもあります。 クライアントはすべてオープンソースなので、ソースからビルドすることもできます。 これはより高度な方法ですが、場合によっては必要になることがあります。 クライアントごとの手順は、上記のクライアントリストにリンクされているドキュメントに記載されています。 ここでは、ビルド済みのバイナリやインストール方法が掲載されているクライアントのリリースページを紹介します。 -##### 実行クライアント {#execution-clients} +##### 実行クライアント - [Besu](https://github.com/hyperledger/besu/releases) -- [Erigon](https://github.com/ledgerwatch/erigon#usage) (ビルド済みのバイナリを提供していないためコンパイル要) +- [Erigon](https://github.com/ledgerwatch/erigon/releases) - [Geth](https://geth.ethereum.org/downloads/) - [Nethermind](https://downloads.nethermind.io/) -また、クライアントの多様性は[実行レイヤーで問題](/developers/docs/nodes-and-clients/client-diversity/#execution-layer)となっていることにも注意が必要です。 マイノリティの実行クライアントの運用を検討することをお勧めします。 +また、[実行レイヤーにおいても](/developers/docs/nodes-and-clients/client-diversity/#execution-layer)、クライアントの多様性が問題となっていることにも注意が必要です。 マイノリティの実行クライアントの運用を検討することをお勧めします。 -##### コンセンサスクライアント {#consensus-clients} +##### コンセンサスクライアント - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/install/source/) (ビルド済みのバイナリを提供していないため、Docker イメージを使用またはソースからビルド) +- [Lodestar](https://chainsafe.github.io/lodestar/install/source/)(ビルド済みのバイナリを提供していないため、Dockerイメージを使用またはソースからビルド) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) -[クライアントの多様性](/developers/docs/nodes-and-clients/client-diversity/)は、バリデータを実行しているコンセンサスノードにとって重要です。 マジョリティのバリデータが単一のクライアントを実行していると、ネットワークのセキュリティが危険にさらされます。 そのため、マイノリティクライアントを選択することをお勧めします。 +バリデータを実行しているコンセンサスノードにとって、[クライアントの多様性](/developers/docs/nodes-and-clients/client-diversity/)は重要です。 マジョリティのバリデータが単一のクライアントを実行していると、ネットワークのセキュリティが危険にさらされます。 そのため、マイノリティクライアントを選択することをお勧めします。 [最新のネットワーククライアントの使用状況](https://clientdiversity.org/)を参照し、[クライアントの多様性](/developers/docs/nodes-and-clients/client-diversity)についてご覧ください。 -##### ソフトウェアの検証 {#verifying-the-software} +##### ソフトウェアの検証 -インターネットからソフトウェアをダウンロードする場合は、ダウンロードしたファイルの完全性を検証することをお勧めします。 このステップは任意ですが、特にイーサリアムクライアントのような重要なインフラストラクチャの一部では、潜在的な攻撃ベクトルを認識し、回避することが重要です。 ビルド済みのバイナリをダウンロードした場合、それを信頼する必要がありますが、攻撃者が実行ファイルを悪意のあるものにすり替えるというリスクがあります。 +インターネットからソフトウェアをダウンロードする場合は、ダウンロードしたファイルの完全性を検証することをお勧めします。 このステップは任意ですが、特にイーサリアムクライアントのような重要なインフラストラクチャの一部では、潜在的な攻撃ベクトルを認識し、回避することが重要です。 ビルド済みのバイナリをダウンロードした場合、その出所を信頼する必要がありますが、攻撃者が実行ファイルを悪意のあるものにすり替えるというリスクもあります。 -デベロッパーはリリースしたバイナリに、デベロッパーの PGP キーで署名しているためめ、デベロッパーが作ったソフトウェアそのものを間違いなく実行していることを暗号的に検証できます。 デベロッパーが使用した公開鍵は、クライアントのリリースページやドキュメントに記載されており、そこから入手できます。 リリースされているクライアントと署名をダウンロードした後、[GnuPG](https://gnupg.org/download/index.html)などの PGP 実装を使って、簡単に検証できます。 [Linux](https://www.tecmint.com/verify-pgp-signature-downloaded-software/)または[Windows/MacOS](https://freedom.press/training/verifying-open-source-software/)の`gpg`を使って、オープンソースソフトウェアを検証するチュートリアルを確認してください。 +デベロッパーはリリースしたバイナリに、デベロッパーのPGPキーで署名しています。そのため、デベロッパーが作成したソフトウェアそのものを間違いなく実行していることを暗号的に検証できます。 デベロッパーが使用した公開鍵は、クライアントのリリースページやドキュメントに記載されており、そこから入手できます。 リリースされたクライアントと署名をダウンロードしたら、[GnuPG](https://gnupg.org/download/index.html)などのPGP実装を使って、簡単に検証できます。 [Linux](https://www.tecmint.com/verify-pgp-signature-downloaded-software/)または[Windows/MacOS](https://freedom.press/training/verifying-open-source-software/)の`gpg`を使って、オープンソースソフトウェアを検証するチュートリアルを確認してください。 -ダウンロードしたソフトウェアを検証するもう 1 つの方法としては、ハッシュが(一意の暗号論的指紋)、デベロッパーによって提供されたものと一致するかどうかを確認することです。 これは PGP を使うよりもさらに簡単で、ハッシュだけを提供するクライアントもあります。 ダウンロードしたソフトウェアに対しハッシュ関数を実行し、リリースページに載っているものと比較してください。 例: +ダウンロードしたソフトウェアを検証するもう1つの方法は、ハッシュが(一意の暗号論的指紋)、デベロッパーによって提供されたものと一致するかどうかを確認することです。 これはPGPを使うよりもさらに簡単で、ハッシュだけを提供するクライアントもあります。 ダウンロードしたソフトウェアに対しハッシュ関数を実行し、リリースページに記載されているものと比較してください。 以下の例を確認してください: ``` sha256sum teku-22.6.1.tar.gz @@ -190,33 +185,33 @@ sha256sum teku-22.6.1.tar.gz #### クライアントのセットアップ {#client-setup} -クライアントソフトウェアのインストール、ダウンロード、またはコンパイルが完了したら、実行する準備が整い、 あとは適切な設定を行うだけです。 クライアントは豊富な設定オプションを提供しており、様々な機能を有効化できます。 +クライアントソフトウェアのインストール、ダウンロード、またはコンパイルが完了したら、実行する準備が整い、 あとは適切な設定を行うだけです。 クライアントには、さまざまな機能を有効化できる豊富な設定オプションが提供されています。 -まずは、クライアントのパフォーマンスやデータ使用量に大きく影響するオプションから紹介します。 [同期モード](/developers/docs/nodes-and-clients/#sync-modes)とは、ブロックチェーンデータのダウンロードと検証のさまざまな方法を表します。 ノードを開始する前に、使用するネットワークと同期モードを決める必要があります。 考慮すべき最も重要なことは、クライアントに必要なディスク容量と同期時間です。 どの同期モードがデフォルトであるかをクライアントのドキュメントで確認してください。 デフォルトの同期モードが適切でなければ、セキュリティレベル、利用可能なデータ、およびコストに基づいて別の同期モードを選択します。 同期アルゴリズムとは別に、さまざまな種類の古いデータをプルーニングすることもできます。 プルーニングは、最近のブロックから利用できない状態ツリーノードなど、古いデータを削除します。 +まずは、クライアントのパフォーマンスやデータ使用量に大きく影響するオプションから紹介します。 [同期モード](/developers/docs/nodes-and-clients/#sync-modes)とは、ブロックチェーンデータのダウンロードと検証のさまざまな方法のことです。 ノードを開始する前に、使用するネットワークと同期モードを決める必要があります。 考慮すべき最も重要なことは、クライアントに必要なディスク容量と同期にかかる時間です。 クライアントのドキュメントで、デフォルトの同期モードを確認してください。 デフォルトの同期モードが適切でない場合は、セキュリティレベル、利用可能なデータ、コストを考慮して、別の同期モードを選択します。 同期アルゴリズムとは別に、さまざまな種類の古いデータを剪定することもできます。 剪定により古いデータが削除されます。例えば、最近のブロックから到達できない状態のtrieノードを削除します。 -その他の基本設定オプションは、例えば ネットワークの選択(メインネットまたはテストネット)、RPC または WebSocket などの HTTP エンドポイントの有効化などです。 クライアントのドキュメントには、すべての機能とオプションが載っています。 CLI (コマンドラインインターフェース)または設定ファイルに直接、対応するフラグを指定してクライアントを実行することで、さまざまなクライアント設定ができます。 各クライアントによって多少異なりますので、設定オプションの詳細については、公式ドキュメントまたはヘルプページを必ず参照してください。 +その他の基本設定オプションとしては、ネットワークの選択(メインネットまたはテストネット)、HTTPエンドポイント(RPCまたはWebSocketなど)の有効化などがあります。 クライアントのドキュメントには、すべての機能とオプションが記載されています。 CLI(コマンドラインインターフェース)または設定ファイルに直接、対応するフラグを指定してクライアントを実行することで、さまざまなクライアント設定ができます。 ただし、各クライアントによって設定オプションが多少異なるため、詳細については、公式ドキュメントまたはヘルプページを必ず参照してください。 -テストのため、テストネットの 1 つでクライアントを実行することを推奨します。 詳しくは、[対応ネットワークの概要](/developers/docs/nodes-and-clients/#execution-clients)を参照してください。 +テストを行う場合は、テストネットの1つでクライアントを実行することをお勧めします。 詳しくは、[対応ネットワークの概要](/developers/docs/nodes-and-clients/#execution-clients)をご覧ください。 基本設定による実行クライアントの実行例は、次のセクションに記載されています。 #### 実行クライアントの開始 {#starting-the-execution-client} -イーサリアムクライアントソフトウェアを開始する前に、環境の準備ができているか最終チェックをしてください。 以下の事項などを確認してください。 +イーサリアムクライアントソフトウェアを起動する前に、環境が整っていることを最終チェックします。 具体的には、以下の事項などを確認してください。 - 選択したネットワークと同期モードを考慮した十分なディスク容量があること。 -- メモリと CPU が他のプログラムによって停止されないこと。 +- メモリやCPUが他のプログラムによって妨害されないこと。 - オペレーティングシステムが最新バージョンに更新されていること。 - システムが正しい時刻と日付になっていること。 -- ルーターとファイアウォールは、リスニングポートの接続を受け付けること。 デフォルトでは、イーサリアムクライアントはリスナー (TCP) ポートとディスカバリー(UDP)ポートを使用し、ポート番号はともに 30303 がデフォルト。 +- リスニングポートに接続できるようにルーターとファイアウォールを設定していること。 イーサリアムクライアントは、デフォルトでリスナー(TCP)ポートとディスカバリー(UDP)ポートを使用し、30303に設定していること。 最初にテストネットでクライアントを実行して、すべてが正常に動作していることを確認します。 -最初にデフォルトではないクライアントを設定する必要があります。 フラグまたは設定ファイルを使って、希望の設定に変更できます。 各クライアントにより機能や設定構文は異なります。 具体的な内容については、お使いのクライアントのドキュメントを確認してください。 +最初にデフォルトではないクライアントを設定する必要があります。 フラグや設定ファイルを使って、希望の設定に変更できます。 各クライアントにより機能や設定構文が異なるため、 具体的な内容については、お使いのクライアントのドキュメントを確認してください。 -実行クライアントとコンセンサスクライアントは、[Engine API](https://github.com/ethereum/execution-apis/tree/main/src/engine)で指定された認証済みエンドポイントを介して通信します。 実行クライアントはコンセンサスクライアントに接続するために、既知のパスで[`jwtsecret`](https://jwt.io/)を生成する必要があります。 セキュリティと安定性の理由から、両方のクライアントは同じマシン上で実行する必要があり、ローカル RPC 接続で相互に認証するので、両方のクライアントがこのパスを知っていなければなりません。 また、実行クライアントは認証された API のリスニングポートを定義する必要があります。 +実行クライアントとコンセンサスクライアントは、[エンジンAPI](https://github.com/ethereum/execution-apis/tree/main/src/engine)で指定された認証済みエンドポイントを介して通信します。 実行クライアントはコンセンサスクライアントに接続するために、既知のパスで[`jwtsecret`](https://jwt.io/)を生成する必要があります。 セキュリティと安定性の理由から、両方のクライアントは同じマシン上で実行する必要があり、ローカルRPC接続で相互認証を行うため、両方のクライアントがこのパスを共有していなければなりません。 また、実行クライアントは認証されたAPIのリスニングポートを定義する必要があります。 -このトークンはクライアントソフトウェアによって自動的に生成されます。場合によっては、自分で作成することもあります。 [OpenSSL](https://www.openssl.org/)を使って生成できます。 +このトークンは、通常はクライアントソフトウェアによって自動的に生成されます。ただし、自分で作成しなければならないこともあります。その場合は、 [OpenSSL](https://www.openssl.org/)を使用してください。 ``` openssl rand -hex 32 > jwtsecret @@ -227,21 +222,21 @@ openssl rand -hex 32 > jwtsecret このセクションでは、実行クライアントの開始について説明します。 あくまでも基本的な設定例となりますが、以下の設定でクライアントを起動します。 - この例では、メインネットに接続するネットワークを指定 - - [テストネット](/developers/docs/networks/)のいずれか 1 つを選択して、セットアップの予備テストも実行可 + - [テストネット](/developers/docs/networks/)のいずれか1つを選択して、セットアップの予備テストも実行可 - ブロックチェーンを含むすべてのデータが格納されるデータディレクトリを定義 - パスは必ず実際のものに変更する(例: 外付けドライブのディレクトリの指定など) -- クライアントと通信するためのインターフェイスを有効化 - - コンセンサスクライアントとの通信で利用する JSON RPC と Engine API を含む -- API 認証で使う`jwtsecret`のパスを定義 +- クライアントと通信するためのインターフェースを有効化 + - コンセンサスクライアントとの通信で利用するJSON RPCとエンジンAPIを含む +- API認証で使う`jwtsecret`のパスを定義 - 例えば、`/tmp/jwtsecret`など、クライアントがアクセス可能な実際のパスにする -これは基本的な例であることに注意してください。それ以外の設定はすべてデフォルトになっています。 各クライアントのドキュメントをよく読み、デフォルト、設定、機能について学びましょう。 バリデータの実行、モニタリングなど、その他の機能の詳細については、各クライアントのドキュメントを参考にしてください。 +これは基本的な例であることに注意してください。それ以外の設定はすべてデフォルトになっています。 各クライアントのドキュメントをよく読み、デフォルト、設定、機能について理解しましょう。 バリデータの実行やモニタリングなど、その他の機能の詳細については、各クライアントのドキュメントを参照してください。 -> 注意: 例のバックスラッシュ`\`は見やすさのために記載しており、設定フラグは 1 行で定義できます。 +> 注: 例のバックスラッシュ`\`は見やすさのために記載しており、設定フラグは1行で定義できます。 -##### Besu の実行 +##### Besuの実行 -この例では、メインネットで Besu を起動し、ブロックチェーンデータをデフォルトフォーマットで`/data/ethereum`に保存し、コンセンサスクライアントへの接続のために JSON RPC と Engine RPC を有効にしています。 Engine API は、トークン`jwtsecret`で認証され、`localhost`からのみ呼び出しが許可されます。 +この例では、メインネットでBesuを起動し、ブロックチェーンデータをデフォルトフォーマットで`/data/ethereum`に保存し、コンセンサスクライアントへの接続のためにJSON RPCとEngine RPCを有効にしています。 エンジンAPIは、トークン`jwtsecret`で認証され、`localhost`からの呼び出しのみが許可されます。 ``` besu --network=mainnet \ @@ -253,17 +248,17 @@ besu --network=mainnet \ --engine-jwt-secret=/path/to/jwtsecret ``` -Besu には、一連の質問に答えることで設定ファイルを生成できるランチャーオプションもあります。 対話型ランチャーを実行するには、以下の通りです。 +Besuには、一連の質問に答えることで設定ファイルを生成できるランチャーオプションもあります。 対話型ランチャーは、以下のように実行できます。 ``` besu --Xlauncher ``` -[Besu のドキュメント](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/)で、追加のオプションと設定の詳細を参照してください。 +[Besuのドキュメント](https://besu.hyperledger.org/en/latest/HowTo/Get-Started/Starting-node/)で、追加のオプションと設定の詳細を参照してください。 -##### Erigon の実行 +##### Erigonの実行 -この例では、Erigon をメインネットで起動、ブロックチェーンデータを`/data/ethereum`に保存、JSON RPC を有効化、許可するネームスペースを定義、また`jwtsecret`パスで定義されるコンセンサスクライアントへの接続認証を有効にしています。 +この例では、Erigonをメインネットで起動して、ブロックチェーンデータを`/data/ethereum`に保存します。また、JSON RPCを有効にして、許可するネームスペースを定義します。さらに、`jwtsecret`パスで定義されるコンセンサスクライアントへの接続認証を有効にしています。 ``` erigon --chain mainnet \ @@ -272,25 +267,26 @@ erigon --chain mainnet \ --authrpc.jwtsecret=/path/to/jwtsecret ``` -Erigon はデフォルトで 8GB の HDD でフル同期を行い、アーカイブデータは 2TB 以上となります。 `datadir`が十分な空き容量のあるディスクを指していることを確認するか、さまざまな種類のデータを削除する`--prune`フラグを検討してください。 詳細については、Erigon の`--help`オプションを参照してください。 +Erigonは、デフォルトで8GBのHDDでフル同期を行います。アーカイブデータは2TB以上になるので、 `datadir`が十分な空き容量のあるディスクを指していることを確認するか、さまざまな種類のデータを削除する`--prune`フラグを検討してください。 詳細については、Erigonの`--help`オプションを参照してください。 -##### Geth の実行 +##### Gethの実行 -この例では、Geth をメインネットで起動、ブロックチェーンデータを`/data/ethereum`に保存、JSON RPC を有効化、許可するネームスペースを定義しています。 また、コンセンサスクライアントに接続するための認証を有効化し、認証に必要な`jwtsecret`を定義し、許可する接続のオプションも合わせて(この例では`localhost`からのみ)定義しています。 +この例では、Gethをメインネットで起動し、ブロックチェーンデータを`/data/ethereum`に保存します。また、JSON RPCを有効にして、許可するネームスペースを定義します。 さらに、コンセンサスクライアントに接続するための認証を有効にし、認証に必要な`jwtsecret`を定義し、許可する接続のオプションも合わせて(この例では`localhost`からのみ)定義しています。 ``` geth --mainnet \ --datadir "/data/ethereum" \ - --http --http.api="eth,web3,net" \ + --http --authrpc.addr localhost \ --authrpc.vhosts="localhost" \ + --authrpc.port 8551 --authrpc.jwtsecret=/path/to/jwtsecret ``` -[すべての設定オプションのドキュメント](https://geth.ethereum.org/docs/interface/command-line-options)と[コンセンサスクライアントと Geth を実行する方法](https://geth.ethereum.org/docs/interface/consensus-clients)を参照してください。 +[すべての設定オプションのドキュメント](https://geth.ethereum.org/docs/fundamentals/command-line-options)を確認し、[コンセンサスクライアントとGethを実行する方法](https://geth.ethereum.org/docs/getting-started/consensus-clients)についての詳細を参照してください。 -##### Nethermind の実行 +##### Nethermindの実行 -Nethermind は、様々な[インストールオプション](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started)を提供しています。 ガイド付きセットアップ機能を備えたランチャーを含むさまざまなバイナリがパッケージに含まれており、インタラクティブに設定できます。 あるいは、実行ファイルそのものであるランナーもあり、設定フラグを付けて実行することもできます。 JSON RPC はデフォルトで有効になっています。 +Nethermindは、さまざまな[インストールオプション](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/getting-started)を提供しています。 パッケージには、ガイド付きセットアップ機能を備えたランチャーなどのさまざまなバイナリが含まれており、インタラクティブに設定できます。 他にも、設定フラグを付けて実行できるランナーなどがあります。 JSON RPCはデフォルトで有効になっています。 ``` Nethermind.Runner --config mainnet \ @@ -298,38 +294,38 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Nethermind は、Nethermind とコンセンサスクライアントを実行するための[完全ガイド](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge)を提供しています。 +Nethermindのドキュメントは、Nethermindとコンセンサスクライアントの実行方法をすべて網羅した[完全ガイド](https://docs.nethermind.io/nethermind/first-steps-with-nethermind/running-nethermind-post-merge)です。 -実行クライアントはコア機能と選択されたエンドポイントを開始し、ピアを探し始めます。 ピアが正常に見つかった後、クライアントは同期を開始します。 実行クライアントは、コンセンサスクライアントからの接続を待機します。 クライアントが正常に現在の状態に同期されると、現在のブロックチェーンデータが利用可能になります。 +実行クライアントは、コア機能と選択したエンドポイントを起動し、ピアを探し始めます。 ピアが見つかったら、同期を開始します。 また、コンセンサスクライアントからの接続を待ちます。 クライアントが正常に現在の状態に同期されると、現在のブロックチェーンデータが利用できるようになります。 #### コンセンサスクライアントの開始 {#starting-the-consensus-client} -実行クライアントへのローカル RPC 接続を確立させために、コンセンサスクライアントを正しいポート設定で起動する必要があります。 コンセンサスクライアントは、公開した実行クライアントのポートを引数に設定して実行する必要があります。 +実行クライアントへのローカルRPC接続を確立させるために、コンセンサスクライアントを正しいポート設定で起動する必要があります。 コンセンサスクライアントは、公開した実行クライアントのポートを引数に設定して実行します。 -コンセンサスクライアントは、RPC 接続を認証するために実行クライアントの`jwt-secret`へのパスも必要です。 上記の実行例と同様に、各コンセンサスクライアントは、jwt トークンファイルパスを引数とする設定フラグを持っています。 これは実行クライアントに使われる`jwtsecret`のパスと一致しなければなりません。 +コンセンサスクライアントは、RPC接続を認証するために実行クライアントの`jwt-secret`へのパスも必要です。 上記の実行例と同様に、各コンセンサスクライアントには、jwtトークンファイルパスを引数とする設定フラグがあります。 このパスは、実行クライアントに使われる`jwtsecret`のパスと一致しなければなりません。 -バリデータを運用する予定がある場合は、フィーを受け取るイーサリアムアドレスを指定する設定フラグを必ず追加してください。 これはバリデータのイーサ報酬が蓄積されるアドレスになります。 各コンセンサスクライアントは、例えば`--suggested-fee-recipient=0xabcd1`のように、イーサリアムアドレスを引数に取るオプションがあります。 +バリデータを実行する予定がある場合は、フィーを受け取るイーサリアムアドレスを指定する設定フラグを必ず追加してください。 このアドレスは、バリデータのイーサ報酬が蓄積されるアドレスです。 各コンセンサスクライアントは、`--suggested-fee-recipient=0xabcd1`のように、イーサリアムアドレスを引数に取るオプションがあります。 テストネットでビーコンノードを起動する場合、[チェックポイント同期](https://notes.ethereum.org/@launchpad/checkpoint-sync)にパブリックエンドポイントを使用すると、同期時間が大幅に短縮されます。 #### コンセンサスクライアントの実行 -##### Lighthouse の実行 +##### Lighthouseの実行 -Lighthouse を実行する前に、[Lighthouse Book](https://lighthouse-book.sigmaprime.io/installation.html)でインストールと設定方法の詳細を参照してください。 +Lighthouseを実行する前に、[Lighthouse Book](https://lighthouse-book.sigmaprime.io/installation.html)でインストールと設定方法の詳細を参照してください。 ``` -lighthouse beacon_node +lighthouse beacon_node \ --network mainnet \ --datadir /data/ethereum \ --http \ --execution-endpoint http://127.0.0.1:8551 \ - --execution-jwt /path/to/jwtsecret \ + --execution-jwt /path/to/jwtsecret ``` -##### Lodestar の実行 +##### Lodestarの実行 -Lodestar ソフトウェアをコンパイルするか、Docker イメージをダウンロードしてインストールしてください。 詳細については、[ドキュメント](https://chainsafe.github.io/lodestar/)、およびより包括的な[セットアップガイド](https://hackmd.io/@philknows/rk5cDvKmK)を参照してください。 +Lodestarソフトウェアをコンパイルするか、Dockerイメージをダウンロードしてインストールしてください。 詳細については、[ドキュメント](https://chainsafe.github.io/lodestar/)または総合[セットアップガイド](https://hackmd.io/@philknows/rk5cDvKmK)を参照してください。 ``` lodestar beacon \ @@ -340,9 +336,9 @@ lodestar beacon \ --jwt-secret="/path/to/jwtsecret" ``` -##### Nimbus の実行 +##### Nimbusの実行 -Nimbus には、コンセンサスクライアントと実行クライアントの両方が含まれています。 Nimbus は計算能力の低いデバイスでも実行できます。 [必要なものと Nimbus 自体のインストール後](https://nimbus.guide/quick-start.html)、コンセンサスクライアントを実行できます。 +Nimbusには、コンセンサスクライアントと実行クライアントの両方を備えています。 計算能力の低いデバイスでも実行可能です。 [必要なものをインストールした後](https://nimbus.guide/quick-start.html)、コンセンサスクライアントを実行できます。 ``` nimbus_beacon_node \ @@ -352,119 +348,118 @@ nimbus_beacon_node \ --jwt-secret="/path/to/jwtsecret" ``` -##### Prysm の実行 +##### Prysmの実行 -Prysm には、簡単に自動インストールできるスクリプトがあります。 詳細については、[Prysm ドキュメント](https://docs.prylabs.network/docs/install/install-with-script)を参照してください。 +Prysmには、簡単に自動インストールできるスクリプトがあります。 詳細については、[Prysmドキュメント](https://docs.prylabs.network/docs/install/install-with-script)を参照してください。 ``` ./prysm.sh beacon-chain \ - --mainnet + --mainnet \ --datadir /data/ethereum \ --execution-endpoint=http://localhost:8551 \ --jwt-secret=/path/to/jwtsecret ``` -##### Teku の実行 +##### Tekuの実行 ``` teku --network mainnet \ --data-path "/data/ethereum" \ --ee-endpoint http://localhost:8551 \ - --ee-jwt-secret-file "/path/to/jwtsecret" \ + --ee-jwt-secret-file "/path/to/jwtsecret" ``` -コンセンサスクライアントが実行クライアントに接続し、デポジットコントラクトを読み込みバリデータを識別します。また、他のビーコンノードのピアにも接続し、ジェネシスブロック(最初のブロック)からコンセンサススロットの同期を開始します。 ビーコンノードが現在のエポックに達すると、ビーコン API がバリデータで使用できるようになります。 詳細については、[ビーコンノード API](https://eth2docs.vercel.app/)を参照してください。 +コンセンサスクライアントが実行クライアントに接続し、デポジットコントラクトを読み込みバリデータを識別します。同時に、他のビーコンノードのピアにも接続し、ジェネシスブロック(最初のブロック)からコンセンサススロットの同期を開始します。 ビーコンノードが現在のエポックに到達すると、バリデータはビーコンAPIを使用できるようになります。 詳細については、[ビーコンノードAPI](https://eth2docs.vercel.app/)を参照してください。 ### バリデータの追加 {#adding-validators} -コンセンサスクライアントは、バリデータが接続するビーコンノードとして機能します。 各コンセンサスクライアントは、それぞれのバリデータ・ソフトウェアを搭載しています。詳細については、各ドキュメントに記載されています。 +コンセンサスクライアントは、バリデータが接続するビーコンノードとして機能します。 各コンセンサスクライアントは、それぞれのバリデータソフトウェアを搭載しています。詳細については、各ドキュメントに記載されています。 -自分でバリデータを実行すると、[ソロステーキング](/staking/solo/)ができます。これはイーサリアムネットワークをサポートする上で、最も影響があり、トラストレスな方法です。 しかし、これには 32 ETH のデポジットが必要になります。 より少ない金額で自分のノードでバリデータを実行するには、[Rocket Pool](https://rocketpool.net/node-operators)など、パーミッションレスなノードオペレータの分散型プールに関心を持つかもしれません。 +自分でバリデータを実行すると、[ソロステーキング](/staking/solo/)ができます。これはイーサリアムネットワークをサポートする上で、最も影響力があり、トラストレスな方法です。 ただし、32 ETHのデポジットが必要となります。 費用を抑えたい場合は、[Rocket Pool](https://rocketpool.net/node-operators)など、パーミッションレスなノードオペレータの分散型プールに参加することで、少ない費用でバリデータを実行することもできます。 -ステーキングとバリデータのキー生成の最も簡単な方法は、[Goerli テストネット・ステーキングランチパッド](https://goerli.launchpad.ethereum.org/)を使うことです。これにより、[Goerli でノードを実行](https://notes.ethereum.org/@launchpad/goerli)し、自分のセットアップをテストすることができます。 メインネットへの準備ができたら、今度は[メインネット・ステーキングランチパッド](https://launchpad.ethereum.org/)を使って、同じ手順を繰り返します。 +ステーキングとバリデータのキーを生成するには、[Goerliテストネット・ステーキングランチパッド](https://goerli.launchpad.ethereum.org/)を使うのが最も簡単です。Goerliテストネットでは、実際に[ノードを実行](https://notes.ethereum.org/@launchpad/goerli)して、自分のセットアップをテストすることができます。 メインネットに移行する準備ができたら、今度は[メインネット・ステーキングランチパッド](https://launchpad.ethereum.org/)を使って、同じ手順を繰り返します。 ステーキングオプションの概要については、[ステーキング](/staking)ページをご覧ください。 ### ノードの使用 {#using-the-node} -実行クライアントは、トランザクションの送信、イーサリアムネットワーク上のスマートコントラクトとの対話やデプロイなど、様々な用途で使用可能な[RPC API エンドポイント](/developers/docs/apis/json-rpc/)を提供します。 +実行クライアントは、トランザクションの送信や、イーサリアムネットワーク上のスマートコントラクトとの対話やデプロイなど、さまざまな用途で使用可能な[RPC APIエンドポイント](/developers/docs/apis/json-rpc/)を提供します。 - 適切なプロトコルで手動呼び出し(例: `curl`) - 指定したコンソールの接続(例: `geth attach`) -- Web3 ライブラリを用いたアプリケーションへの実装(例: [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview)、[ethers](https://github.com/ethers-io/ethers.js/)) +- Web3ライブラリを用いたアプリケーションへの実装(例: [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview)、[ethers](https://github.com/ethers-io/ethers.js/)) -クライアントが異なれば、RPC エンドポイントの実装も異なります。 しかし、すべてのクライアントで使用できる標準的な JSON-RPC があります。 概要については、[JSON-RPC ドキュメント](/developers/docs/apis/json-rpc/)を参照してください。 イーサリアムネットワークからの情報を必要とするアプリケーションは、この RPC を使用できます。 例えば、人気のウォレットである MetaMask では、[自分自身の RPC エンドポイントに接続](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node)することができ、プライバシーとセキュリティに大きな利点があります。 +クライアントによって、RPCエンドポイントの実装は異なります。 しかし、すべてのクライアントで使用できる標準的なJSON-RPCがあります。 概要については、[JSON-RPCドキュメント](/developers/docs/apis/json-rpc/)を参照してください。 イーサリアムネットワークからの情報を必要とするアプリケーションは、このRPCを使用できます。 例えば、人気のウォレットであるMetaMaskでは、[自分自身のRPCエンドポイントに接続](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node)することができ、プライバシーとセキュリティの向上を実現できます。 -コンセンサスクライアントは、すべて[Beacon API](https://ethereum.github.io/beacon-APIs)を公開しており、これを利用してコンセンサスクライアントの状態を確認したり、[Curl](https://curl.se)などのツールを使ってリクエストを送り、ブロックやコンセンサスデータをダウンロードすることができます。 これに関する詳細については、各コンセンサスクライアントのドキュメントを参照してください。 +コンセンサスクライアントは、すべて[ビーコンAPI](https://ethereum.github.io/beacon-APIs)を公開しており、これを利用してコンセンサスクライアントの状態を確認したり、[Curl](https://curl.se)などのツールを使ってリクエストを送り、ブロックやコンセンサスデータをダウンロードしたりすることができます。 詳細については、各コンセンサスクライアントのドキュメントを参照してください。 -#### RPC への接続 {#reaching-rpc} +#### RPCへの接続 {#reaching-rpc} -実行クライアントの JSON-RPC デフォルトポートは`8545`ですが、設定でローカルエンドポイントのポート番号を変更できます。 デフォルトでは、RPC インターフェイスはコンピュータのローカルホストからのみアクセス可能です。 リモートからアクセスできるようにするには、アドレスを`0.0.0.0`に変更し、パブリックに公開することができます。 これにより、ローカルネットワークおよびパブリック IP アドレスで接続可能になります。 ほとんどの場合、ルーターでポート転送も設定する必要があります。 +実行クライアントのJSON-RPCデフォルトポートは`8545`ですが、設定でローカルエンドポイントのポートを変更することもできます。 デフォルトでは、RPCインターフェースはコンピュータのローカルホストからしかアクセスできません。 リモートからアクセスするには、アドレスを`0.0.0.0`に変更して、パブリックに公開します。 これにより、ローカルネットワーク内だけでなく、パブリックIPアドレスでも接続できるようになります。 また、ほとんどの場合、ルーターでポート転送を設定する必要があります。 インターネットにポートを公開するアプローチは、インターネット上の誰でもノードをコントロールできるようになるため、注意が必要です。 悪意のある者がノードにアクセスしてシステムをダウンさせたり、クライアントをウォレットとして使用している場合は、資金が盗まれる可能性があります。 -これを回避するには、危険性のある RPC メソッドを変更できないようにすることです。 例えば、Geth の場合、フラグで変更可能なメソッドを明示することができます。`--http.api web3,eth,txpool`. +これを回避するには、危険性のあるRPCメソッドを変更できないようにすることです。 例えば、Gethの場合、フラグで変更可能なメソッドを明示することができます。`--http.api web3,eth,txpool`. -RPC インターフェイスへのアクセスは、エッジレイヤー API の開発、もしくは Nginx のようなウェブサーバアプリケーションからクライアントのローカルアドレスやポートに接続することで拡張できます。 デベロッパーは、ミドルレイヤーを活用することで、RPC インターフェースへセキュアな`https`接続用の証明書を設定することもできます。 +RPCインターフェースへのアクセスは、エッジレイヤーAPIの開発、もしくはNginxのようなWebサーバアプリケーションから、クライアントのローカルアドレスやポートに接続することで拡張できます。 デベロッパーは、ミドルレイヤーを活用することで、RPCインターフェースを安全に`https`接続で使えるように、証明書を設定することもできます。 -ノードの RPC エンドポイントへのアクセスを付与する方法は、ウェブサーバ、プロキシ、または外向けの REST API の設定だけではありません。 別の方法として、独自の[Tor](https://www.torproject.org/)オニオンサービス上でノードをホストすると、プライバシーを保護しつつ、パブリックからアクセス可能なエンドポイントを設定することができます。 これにより、静的なパブリック IP アドレスやオープンポートを使用せずに、ローカルネットワーク外から RPC に到達できます。 ただし、Tor ネットワークはすべてのアプリケーションでサポートされているわけではなく、接続問題が発生する可能性があるネットワーク経由からのみ、RPC エンドポイントがアクセス可能になることに注意してください。 +ノードのRPCエンドポイントへのアクセスを付与する方法は、Webサーバやプロキシ、外向けのREST APIを設定するだけではありません。 独自の[Tor](https://www.torproject.org/)オニオンサービス上でノードをホストすれば、プライバシーを保護しつつ、パブリックからアクセス可能なエンドポイントを設定することができます。 これにより、静的なパブリックIPアドレスやオープンポートを使用せずに、ローカルネットワーク外からRPCにアクセスできます。 ただし、Torネットワークはすべてのアプリケーションでサポートされているわけではなく、接続が不安定なネットワーク経由からのみRPCエンドポイントにアクセスできる点に注意してください。 -これを行うには、自身の[オニオンサービス](https://community.torproject.org/onion-services/)を作成する必要があります。 自分自身のオニオンサービスをセットアップするには、[ドキュメント](https://community.torproject.org/onion-services/setup/)を参照してください。 RPC ポートへのプロキシを使って Web サーバを指すか、直接 RPC を指すことができます。 +これを行うには、自身の[オニオンサービス](https://community.torproject.org/onion-services/)を作成する必要があります。 オニオンサービスのセットアップ方法は、[ドキュメント](https://community.torproject.org/onion-services/setup/)を参照してください。 RPCポートへのプロキシを使ってWebサーバを指すか、直接RPCを指すことができます。 -最後に、最も一般的な VPN を使って、内部ネットワークへのアクセスを提供することもできます。 ユースケースとノードへアクセスが必要なユーザーの人数にもよりますが、安全な VPN 接続は選択肢の一つとなります。 [OpenVPN](https://openvpn.net/)は、フル機能の SSL VPN です。OSI レイヤー 2 やレイヤー 3 の安全なネットワーク拡張機能を実装し、業界標準の SSL/TLS プロトコルを使います。また、証明書ベースの柔軟なクライアント認証方法もサポートしており、スマートカード認証またはユーザ名/パスワード認証の組み合わせも可能で、ユーザーやグループ固有のアクセスコントロールポリシーをファイヤーウォールルールを使い VPN の仮想インターフェースに適用できます。 +最後に、最も一般的なVPNを使って、内部ネットワークへのアクセスを提供することもできます。 ユースケースやノードへのアクセスが必要なユーザーの人数によっては、安全なVPN接続は選択肢の1つとなります。 [OpenVPN](https://openvpn.net/)は、OSIレイヤー2やレイヤー3の安全なネットワーク拡張機能を実装した、フル機能のSSL VPNです。業界標準のSSL/TLSプロトコルを用いており、証明書ベースの認証やスマートカード認証、ユーザ名/パスワード認証など、さまざまな柔軟なクライアント認証方法に対応しています。また、ファイアウォールルールを使って、ユーザーやグループ固有のアクセスコントロールポリシーを設定し、VPNの仮想インターフェースに適用することもできます。 ### ノードの運用 {#operating-the-node} -ノードが正常に動作するように、定期的に監視する必要があります。 時折メンテナンスが必要になる場合があります。 +ノードが正常に動作するためには、定期的に監視し、 必要に応じてメンテナンスを行う必要があります。 #### ノードのオンライン状態の維持 {#keeping-node-online} -ノードが常時オンラインになっている必要はありませんが、ネットワークと同期させるためにできるだけオンラインにしておく必要があります。 シャットダウンして再起動することもできますが、以下の点に留意してください。 +ノードが常時オンラインになっている必要はありませんが、ネットワークと同期させるためにできるだけオンラインにしておく必要があります。 シャットダウンして再起動することもできますが、以下の点に注意してください。 -- 最新の状態をディスクに書き込みれ中の場合は、シャットダウンには数分程度かかることがある。 +- 最新の状態をディスクに書き込み中の場合は、シャットダウンには数分程度かかることがある。 - 強制シャットダウンを行うと、データベースに損傷を与え、ノード全体の再同期が必要になることがある。 -- クライアントはネットワークとの同期が解除され、再起動時に再同期が必要。 ノードは最後にシャットダウンされたところから同期を開始できるが、オフラインになっていた時間に応じて処理時間が増加。 +- クライアントはネットワークとの同期が解除され、再起動時に再同期が必要になる。 ノードは最後にシャットダウンされたところから同期を開始できるが、オフラインになっていた時間に応じて処理時間が増加する。 -*これはコンセンサスレイヤーのバリデータノードには適用されません。*ノードをオフラインにすると、ノードに依存するすべてのサービスに影響を及ぼします。 *ステーキング*目的でノードを実行している場合は、可能な限りダウンタイムを最小限に抑えるようにしてください。 +_これはコンセンサスレイヤーのバリデータノードには適用されません。_ノードをオフラインにすると、ノードに依存するすべてのサービスに影響を及ぼします。 _ステーキング_目的でノードを実行している場合は、可能な限りダウンタイムを最小限に抑えるようにしてください。 #### クライアントサービスの作成 {#creating-client-services} -起動時にクライアントを自動起動するサービスを作成することを検討してください。 例えば、Linux サーバでは`systemd`などでサービスを作成し、権限が制限されたユーザーの下で、適切な設定でクライアントを実行し、自動的に再起動するように作成するのが最善の方法でしょう。 +起動時にクライアントを自動起動するサービスを作成することを検討してください。 例えば、Linuxサーバでは`systemd`などでサービスを作成し、権限が制限されたユーザーの下で、適切な設定でクライアントを実行し、自動的に再起動するように作成するのがお勧めです。 #### クライアントの更新 {#updating-clients} -クライアントソフトウェアを最新のセキュリティパッチ、機能、 [EIP](/eips/)で、最新の状態に保つ必要があります。 特に、[ハードフォーク](/history/)の前に、正しいクライアントバージョンを実行していることを確認してください。 +クライアントソフトウェアは、最新のセキュリティパッチ、機能、 [EIP](/eips/)の最新バージョンを常にインストールしておく必要があります。 特に、[ハードフォーク](/history/)が行われる前に、正しいクライアントバージョンを実行していることを確認してください。 > 重要なネットワーク更新の前には、イーサリアム・ファウンデーション(EF)の[ブログ](https://blog.ethereum.org)で投稿されます。 [これらのお知らせを購読する](https://groups.google.com/a/ethereum.org/g/announcements)ことで、ノードの更新が必要なときにメールで通知を受け取ることができます。 -クライアントの更新は非常に簡単です。 各クライアントのドキュメントに具体的な手順が記載されていますが、一般的には最新版をダウンロードし、新しい実行ファイルを使ってクライアントを再起動するだけです。 アップデートが適用され、クライアントは前回終了したところから再開するはずです。 +クライアントの更新は非常に簡単です。 各クライアントのドキュメントに具体的な手順が記載されていますが、一般的には、最新版をダウンロードし、新しい実行ファイルを使ってクライアントを再起動するだけです。 アップデートが適用され、クライアントは前回終了したところから再開します。 -各クライアントは、ピアツーピアプロトコルで使用される人間が判読できるバージョン文字列を持っていますが、コマンドラインからもアクセスできます。 このバージョン文字列を使って、ユーザーは自分が正しいバージョンを実行していることを確認でき、ブロックエクスプローラーやその他の分析ツールは、ネットワーク上で特定のクライアントの分散を定量化します。 バージョン文字列の詳細については、個々のクライアントのドキュメントを参照してください。 +各クライアントは、ピアツーピアプロトコルで使用される、人間が判読できるバージョン文字列を持っており、この文字列はコマンドラインからもアクセスできます。 このバージョン文字列を使って、ユーザーは自分が正しいバージョンを実行していることを確認できるほか、ネットワーク上で特定のクライアントの分散を定量化するために使われるブロックエクスプローラーやその他の分析ツールにも役立ちます。 バージョン文字列の詳細については、個々のクライアントのドキュメントを参照してください。 #### その他のサービスの実行 {#running-additional-services} -自分でノードを実行すると、イーサリアムクライアント RPC に直接アクセスを必要とするサービスを利用できます。 これらは[レイヤー 2 ソリューション](/developers/docs/scaling/#layer-2-scaling)、ウォレットのバックエンド、ブロックエクスプローラー、デベロッパーツール、その他のイーサリアムインフラストラクチャのようなイーサリアム上に構築されたサービスです。 +自分でノードを実行すると、イーサリアムクライアントRPCへの直接アクセスを必要とするサービスを利用できます。 これらは、[レイヤー2ソリューション](/developers/docs/scaling/#layer-2-scaling)、ウォレットのバックエンド、ブロックエクスプローラー、デベロッパーツール、その他のイーサリアムインフラストラクチャのような、イーサリアム上に構築されたサービスです。 #### ノードの監視 {#monitoring-the-node} -ノードを適切に監視するために、メトリクスの収集を検討してください。 クライアントが提供するメトリクス・エンドポイントから、ノードに関する包括的なデータを取得できます。 [InfluxDB](https://www.influxdata.com/get-influxdb/)や[Prometheus](https://prometheus.io/) のようなツールを使用して、データベースを作成でき、[Grafana](https://grafana.com/)のようなソフトウェアで視覚化やグラフ化ができます。 このソフトウェアを使用するための多くのセットアップと、ノードとネットワーク全体を視覚化するためのさまざまな Grafana ダッシュボードがあります。 一例として、[Geth の監視に関するグチュートリアル](/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/)を参照してください。 +ノードを適切に監視するために、メトリクスの収集を検討してください。 クライアントが提供するメトリクスエンドポイントから、ノードに関する包括的なデータを取得できます。 [InfluxDB](https://www.influxdata.com/get-influxdb/)や[Prometheus](https://prometheus.io/)などのツールを使用して、データベースを作成することができます。また、[Grafana](https://grafana.com/)などのソフトウェアを使って、データの視覚化やグラフ化を行うことができます。 このソフトウェアを使用するには、さまざまなセットアップ方法があり、ノードやネットワーク全体を視覚化するためのGrafanaダッシュボードも多種用意されています。 一例として、[Gethの監視に関するチュートリアル](/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/)を参照してください。 -モニタリングの一環として、必ずマシンのパフォーマンスを監視してください。 ノードの初期の同期中、クライアントソフトウェアは CPU と RAM に非常に大きな負荷がかかる場合があります。 Grafana に加えて、OS が提供する`htop`や`uptime`などのツールを使用して監視を行うこともできます。 +モニタリングを行う際は、必ずマシンのパフォーマンスも監視してください。 ノードの初期同期中は、クライアントソフトウェアがCPUとRAMに大きな負荷をかけることがあります。 Grafanaに加えて、OSが提供する`htop`や`uptime`などのツールでも監視できます。 ## 参考文献 {#further-reading} - [イーサリアムステーキングガイド](https://github.com/SomerEsat/ethereum-staking-guides) _– Somer Esat、頻繁に更新_ - [ガイド|イーサリアムメインネットでステーキングをするためのバリデータのセットアップ方法](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _CoinCashew、定期的に更新_ -- [ETHStaker によるテストネットでのバリデータ運用ガイド](https://github.com/remyroy/ethstaker#guides) - _ETHStaker、定期的に更新_ -- [イーサリアムステーキングガイド](https://github.com/SomerEsat/ethereum-staking-guides) _– Somer Esat、定期的に更新_ -- [ノード運用者向けのマージに関するよくある質問](https://notes.ethereum.org/@launchpad/node-faq-merge) - _2022 年 7 月_ -- [イーサリアムのフル検証ノードになるためのハードウェア要件の分析](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau、2018 年 9 月 24 日_ -- [イーサリアムフルノードの運用: 完全ガイド](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _2019 年 11 月 7 日 - Justin Leroux_ -- [イーサリアムメインネットでハイパーレジャー Besu ノードの運用: メリット・要件・セットアップ](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– Felipe Faraggi、2020 年 5 月 7 日_ -- [モニタリングスタックで Nethermind イーサリアムクアイアントのデプロイ](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth、2020 年 7 月 8 日_ +- [ETHStakerによるテストネットでのバリデータ運用ガイド](https://github.com/remyroy/ethstaker#guides) - _ETHStaker、定期的に更新_ +- [ノード運用者向けのマージに関するよくある質問](https://notes.ethereum.org/@launchpad/node-faq-merge) - _2022年7月_ +- [イーサリアムのフル検証ノードになるためのハードウェア要件の分析](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau、2018年9月24日_ +- [イーサリアムフルノードの運用: 手間を省きたい人向けのガイド](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _2019年11月7日 - Justin Leroux_ +- [イーサリアムメインネットでハイパーレジャーBesuノードの運用: メリット、要件、セットアップ](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– Felipe Faraggi、2020年5月7日_ +- [モニタリングスタックでNethermindイーサリアムクライアントのデプロイ](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth、2020年7月8日_ ## 関連トピック {#related-topics} -- [ノードとクライアント](/developers/docs/nodes-and-clients/) +- [ ノードとクライアント](/developers/docs/nodes-and-clients/) - [ブロック](/developers/docs/blocks/) - [ネットワーク](/developers/docs/networks/) diff --git a/public/content/translations/ja/developers/docs/oracles/index.md b/public/content/translations/ja/developers/docs/oracles/index.md index 2bd074657cf..c6744b93de9 100644 --- a/public/content/translations/ja/developers/docs/oracles/index.md +++ b/public/content/translations/ja/developers/docs/oracles/index.md @@ -4,9 +4,9 @@ description: オラクルを通じて、イーサリアムのスマートコン lang: ja --- -オラクルは、ブロックチェーンの外部(オフチェーン)のデータソースからデータを取り出し、ブロックチェーンの内部(オンチェーン)に記入することで、スマートコントラクトで利用できるようにするためのデータフィードです。 オラクルが必要なのは、イーサリアム上で実行されるスマートコントラクトは、ブロックチェーンネットワークの外部に保存された情報にアクセスできないためです。 +オラクルは、ブロックチェーンでオフチェーンのデータソースを利用可能にするスマートコントラクト向けのデータフィードです。 イーサリアムベースのスマートコントラクトでは、デフォルトでブロックチェーンのネットワークの外に保存されている情報にアクセスできないため必要になります。 -スマートコントラクトにオフチェーンの入力データを実行する機能を与えることで、分散型アプリケーションの価値が高まります。 例えば分散型の予測市場は、予測結果に関する情報につきオラクルに依存しており、これによってユーザーの予測を検証することが可能になります。 アメリカの次期大統領が誰になるかという予測に、アリスさんが 20 ETH を賭けたと仮定してみましょう。 このユースケースの場合、予測市場を提供する Dapp は、選挙結果を確認し、ユーザー(例えば、アリス)が支払対象に含まれるかを確認するためにオラクルが必要になります。 +オフチェーンのデータを使用してスマートコントラクトを実行できるようにすることで、分散型アプリケーションの実用性と価値を高めることができます。 例えば、オンチェーンの予測市場では、オラクルに依存しており、結果に関する情報を提供することでユーザーの予測を検証します。 アメリカの次期大統領が誰になるかという予測に、アリスさんが20 ETHを賭けたと仮定してみましょう。 このユースケースの場合、予測市場を提供するDappは、選挙結果を確認し、ユーザー(例えば、アリス)が支払対象に含まれるかを確認するためにオラクルが必要になります。 ## 前提知識 {#prerequisites} @@ -14,51 +14,51 @@ lang: ja ## ブロックチェーンにおけるオラクルとは何か? {#what-is-a-blockchain-oracle} -オラクルとは、ブロックチェーン上で実行されるスマートコントラクトに対し、外部情報(チェーン外部に保存された情報)を取得し、検証し、送信するアプリケーションです。 オラクルは、オフチェーンのデータを「引き出し」、送信するだけでなく、ブロックチェーン内部の情報を外部システムに「送り出す」ことも可能です。 この「プッシュ」の例としては、イーサリアムのトランザクションを通じてユーザーが手数料を送信した際に、スマートロックを解除するオラクルが挙げられます。 +オラクルとは、ブロックチェーン上で実行されるスマートコントラクトに対し、外部情報(チェーン外部に保存された情報)を取得し、検証し、送信するアプリケーションです。 オラクルは、オフチェーンデータを「プル」して、イーサリアムにブロードキャストすることに加え、ブロックチェーンの情報を外部のシステムに「プッシュ」することもできます。例えば、ユーザがイーサリムのトランザクションを経由して料金を送金するとスマートロックを解除するなどです。 -オラクルは、ブロックチェーン上のコントラクトと、オフチェーンのデータ提供者との間を接続する「ブリッジ」として機能します。 オラクルを活用しない場合、スマートコントラクトのアプリケーションはオンチェーンのデータしかアクセスできません。 オラクルは、オフチェーンのデータを活用するスマートコントラクトの機能をトリガーするメカニズムを提供するのです。 +オラクルが無いと、スマートコントラクトは完全にオンチェーンのデータだけに限定されてしまいます。 -オラクルには、データソースの種類(ソースが 1 つであるか複数であるか)、信頼モデル(集中型か分散型か)、およびシステムのアーキテクチャ(即時読み取り型、公開/講読型、および要求/対応型)により様々な種類があります。 さらに、オンチェーンのコントラクトで使用するために外部データを取得するタイプ(入力用のオラクル)、ブロックチェーン上の情報をオフチェーンのアプリケーションに送信するタイプ(出力用のオラクル)、あるいはオフチェーンの処理タスクを実行するタイプ(処理用のオラクル)に区別することが可能です。 +オラクルには、データソースの種類(ソースが1つであるか複数であるか)、信頼モデル(集中型か分散型か)、およびシステムのアーキテクチャ(即時読み取り型、公開/講読型、および要求/対応型)により様々な種類があります。 さらに、オンチェーンのコントラクトで使用するために外部データを取得するタイプ(入力用のオラクル)、ブロックチェーン上の情報をオフチェーンのアプリケーションに送信するタイプ(出力用のオラクル)、あるいはオフチェーンの処理タスクを実行するタイプ(処理用のオラクル)に区別することが可能です。 ## スマートコントラクトにオラクルが必要な理由 {#why-do-smart-contracts-need-oracles} -大部分の開発者にとって、スマートコントラクトとは、ブロックチェーン上の特定のアドレスで実行されるコードの集合に過ぎません。 しかし、[より一般的なスマートコントラクトの定義](/smart-contracts/)は、「特定の条件を満たすことで、当事者間の合意を強制できる自己実行型のソフトウェアプログラム」というものです。このため、「スマートコントラクト」と呼ばれます。 +多くの開発者にとって、スマートコントラクトとは、ブロックチェーン上の特定のアドレスで実行されるコードの集合に過ぎません。 しかし、[より一般的なスマートコントラクトの定義](/smart-contracts/)は、「特定の条件を満たすことで、当事者間の合意を強制できる自己実行型のソフトウェアプログラム」というものです。このため、「スマートコントラクト」と呼ばれます。 しかし、イーサリアムは決定論的なシステムであるため、スマートコントラクトを用いてユーザー間の合意を強制するプロセスは簡単には実現できません。 [決定論的なシステム](https://en.wikipedia.org/wiki/Deterministic_algorithm)とは、特定の初期状態と入力を与えられた場合に常に同一の結果を出力するシステムを指し、入力から出力を計算する過程においてランダム性や変化が発生しません。 -ブロックチェーンでは、ユーザーに対して、ブロックチェーン上で保存されたデータ*のみ*に基づく単純な二項対立(真または偽)の質問に基づいてコンセンサスに達するように制限することで、決定論的な実行を実現しています。 このような質問の例としては、以下のようなものがあります: +ブロックチェーンでは、ユーザーに対して、ブロックチェーン上で保存されたデータ_のみ_に基づく単純な二項対立(真または偽)の質問に基づいてコンセンサスに達するように制限することで、決定論的な実行を実現しています。 このような質問の例としては、以下のようなものがあります: - 「 (公開鍵で特定された) アカウント所有者は、このトランザクションにペアの秘密鍵で署名したか?」 - 「このアカウントは、このトランザクションの実行に必要な十分な資金を持つか?」 - 「このトランザクションは、このスマートコントラクトの文脈において有効か?」 等々。 -ブロックチェーンでは、外部ソースからの情報(つまり、現実世界の情報)を参照する場合、決定論的な処理が不可能になり、ブロックチェーンの状態変化が正当であるか否かについて各ノードが合意できなくなります。 価格情報を提供する一般的な API を通じて現在の ETH/USD の交換レートを取得し、トランザクションを実行するスマートコントラクトの例を考えてみましょう。 この為替レートは頻繁に変化すると予想されるため(この API 自体が非推奨となったり、ハッキングされる可能性を無視したとしても)、このスマートコントラクトにおける同一のコードを実行するノードが得る出力は常に異なる可能性があります。 +ブロックチェーンでは、外部ソースからの情報(つまり、現実世界の情報)を参照する場合、決定論的な処理が不可能になり、ブロックチェーンの状態変化が正当であるか否かについて各ノードが合意できなくなります。 価格情報を提供する一般的なAPIを通じて現在のETH/USDの交換レートを取得し、トランザクションを実行するスマートコントラクトの例を考えてみましょう。 この為替レートは頻繁に変化すると予想されるため(このAPI自体が非推奨となったり、ハッキングされる可能性を無視したとしても)、このスマートコントラクトにおける同一のコードを実行するノードが得る出力は常に異なる可能性があります。 -イーサリアムのように、世界中に数千ものノードがトランザクションを処理するパブリックブロックチェーンにとっては、決定論的な処理は欠くことができません。 真実性を担保する中心的な権威が存在しないため、各ノードは、ひとつのトランザクションにおいて同一の状態に到達すると想定されているためです。 例えば、A というノードがスマートコントラクトのコードを実行した場合の出力が「3」である一方で、B というノードの出力が「7」である場合、コンセンサスが崩壊するため、イーサリアムが持つ分散型のコンピューティングプラットフォームとしての価値が損なわれます。 +イーサリアムのように、世界中に数千ものノードがトランザクションを処理するパブリックブロックチェーンにとっては、決定論的な処理は欠くことができません。 真実性を担保する中心的な権威が存在しないため、同じトランザクションを適用した後に同じ状態に到達するメカニズムがノードに必要になります。 例えば、Aというノードがスマートコントラクトのコードを実行した場合の出力が「3」である一方で、Bというノードの出力が「7」である場合、コンセンサスが崩壊するため、イーサリアムが持つ分散型のコンピューティングプラットフォームとしての価値が損なわれます。 このシナリオはさらに、外部ソースから情報を引き出すことが可能なブロックチェーンを設計する際の問題点を浮き彫りにします。 オラクルは、オフチェーンのソースから情報を取り出し、ブロックチェーン上で保存してスマートコントラクトで使用できるようにすることで、この問題を解消します。 オンチェーンで保存された情報は改変不能な状態で公開されているため、イーサリアムのノードは、コンセンサスを破壊することなく、安全にオフチェーンのデータを読み込んで状態変化を計算できるのです。 通常オラクルは、この機能を提供するために、オンチェーンで実行されるスマートコントラクトと、何らかのオフチェーンのコンポーネントで構成されています。 オンチェーンのスマートコントラクトは、他のスマートコントラクトから提供されるデータリクエストを受け取ると、オラクルノードと呼ばれるオフチェーンのコンポーネントにこのリクエストを引き渡します。 このオラクルノードは、アプリケーション・プログラミング・インターフェース(API)などを用いてデータソースをクエリし、トランザクションを送信することで、リクエストされたデータをスマートコントラクトのストレージに保存することができます。 -つまり、ブロックチェーンにおけるオラクルとは、ブロックチェーンと外部環境の間に存在する情報のギャップを橋渡しする役割を提供することで、「ハイブリッド型のスマートコントラクト」を実現するものです。 ハイブリッド型のスマートコントラクトとは、オンチェーンのコントラクトコードとオフチェーンのインフラを組み合わせて機能するスマートコントラクトです。 本記事の冒頭で紹介した分散型の予測市場は、ハイブリッド型のスマートコントラクトの代表例だと言えます。 その他の例としては、複数のオラクルを通じて特定の気候現象が発生したことが確認できた場合に保険金を支払うことができる農作物保険のスマートコントラクトが挙げられるでしょう。 +つまり、ブロックチェーンにおけるオラクルとは、ブロックチェーンと外部環境の間に存在する情報のギャップを橋渡しする役割を提供することで、「ハイブリッド型のスマートコントラクト」を実現するものです。 ハイブリッド型のスマートコントラクトとは、オンチェーンのコントラクトコードとオフチェーンのインフラを組み合わせて機能するスマートコントラクトです。 分散型の予測市場は、ハイブリッド型のスマートコントラクトの代表例だと言えます。 その他の例としては、複数のオラクルを通じて特定の気候現象が発生したことが確認できた場合に保険金を支払うことができる農作物保険のスマートコントラクトが挙げられるでしょう。 ## オラクル問題とは何か? {#the-oracle-problem} -スマートコントラクトでは、ひとつまたは複数のエンティティに依存してオフチェーンのデータへのアクセスを提供し、トランザクションのデータペイロードを保存することで、ブロックチェーンの外部にある情報を簡単に取得することができます。 しかしこの方法では、以下のような新たな問題が発生します: +オラクルは重要な問題を解決する一方で、次のような複雑な問題も生じます。 - コントラクトに読み込まれた情報が、適切なソースから抽出されているかや、改変されていないかを検証するにはどうすればよいか? - このデータが、常に参照可能で定期的に更新されることを保証するにはどうすればよいか? -このいわゆる「オラクル問題」は、ブロックチェーンのオラクルを用いてスマートコントラクトに情報を送信する際にどのような問題が発生するかを示しています。 オラクルからのデータの適切性を確認することは非常に重要であり、データが適切でなければ、スマートコントラクトを実行した際に正しくない結果が出力されてしまいます。 また、トラストレス性を維持することも同様に重要です。特定のオラクル運用者が正確な情報を提供するという「信頼」が必要になる場合、スマートコントラクトの最も根本的な特性が失われるからです。 +このいわゆる「オラクル問題」は、ブロックチェーンのオラクルを用いてスマートコントラクトに情報を送信する際にどのような問題が発生するかを示しています。 スマートコントラクトが正しく実行されるためには、オラクルからのデータが正しい必要があります。 さらに、正確な情報を提供するためにオラクルのオペレータを「信頼」しなければならないことは、スマートコントラクトの「トラストレス」の側面を損なうことになります。 -実際のオラクルは、このオラクル問題を解決するために様々なアプローチを採用しており、個別のアプローチについては以下のセクションで紹介します。 完璧なソリューションを提供するオラクルは存在しませんが、以下のような課題にどのように対処しているかに従って、各オラクルの利点を検討すべきだと言えるでしょう: +さまざまなオラクルが、オラクル問題に対して異なる解決策を用意しています。これについては後ほど説明します。 オラクルは通常、次の課題にどのように対処するかによって評価されます。 -1. **正確性**:オラクルは、オフチェーン上の無効なデータに基づいてスマートコントラクトの状態変化をトリガーしてはなりません。 このため、オラクルはデータの*真正性*および*完全性*を保証する必要があります。データの真正性とは、適切な情報ソースから取得されたことを意味し、完全性とはオンチェーンで送信されるまで取得した状態に手を加えられない(改変されない)ことを意味します。 +1. **正確性**:オラクルは、オフチェーン上の無効なデータに基づいてスマートコントラクトの状態変化をトリガーしてはなりません。 オラクルは、 データの_真正性_と_整合性_を保証する必要があります。 真正性とは、適切な情報ソースから取得されたことを意味し、完全性とはオンチェーンで送信されるまで取得した状態に手を加えられない(改変されない)ことを意味します。 -2. **可用性**:オラクルは、スマートコントラクトがアクションを実行し、状態変化をトリガーするのを遅延させたり、妨害してはなりません。 可用性を維持するためには、オラクルから取得されるデータは常に*リクエストに基づき取得可能*である必要があります。 +2. **可用性**:オラクルは、スマートコントラクトがアクションを実行し、状態変化をトリガーするのを遅延させたり、妨害してはなりません。 つまり、オラクル由来のデータは中断することなく_リクエストに応じて利用可能_でなければなりません。 -3. **インセンティブとの両立性**:オラクルは、オフチェーンのデータ提供者に対し、スマートコントラクトに正しい情報を提供する意欲を高めるようなインセンティブを提供するものでなければなりません。 インセンティブの両立性には、*アトリビュータビリティ*と *アカウンタビリティ*が含まれます。 アトリビュータビリティとは、当該の外部情報とその提供者を相互に関連付けできる性質を指し、アカウンタビリティとは、データ提供者に対して提供するデータの品質について責任を負わせる(つまり、データの品質に応じて報酬/罰金を課す)性質を指します。 +3. **インセンティブとの両立性**:オラクルは、オフチェーンのデータ提供者に対し、スマートコントラクトに正しい情報を提供する意欲を高めるようなインセンティブを提供するものでなければなりません。 インセンティブの両立性には、_アトリビュータビリティ_と _アカウンタビリティ_が含まれます。 アトリビュータビリティとは、当該の外部情報とその提供者を相互に関連付けできる性質を指し、アカウンタビリティとは、データ提供者に対して提供するデータの品質について責任を負わせる性質を指します。そのため、提供された情報の質に基づいて報酬を与えたり、ペナルティを与えたりすることができます。 ## ブロックチェーンにおけるオラクルサービスの仕組み {#how-does-a-blockchain-oracle-service-work} @@ -78,11 +78,11 @@ lang: ja ### オラクルコントラクト {#oracle-contract} -オラクルコントラクトとは、オラクルサービスを提供するオンチェーンのコンポーネントであり、その他のスマートコントラクトからのデータリクエストをリッスンし、データクエリをオラクルノードにリレーした上で、返送されたデータをクライアントであるスマートコントラクトにブロードキャストします。 オラクルコントラクトはさらに、返送されたデータポイントに対して一定の処理を実行し、リクエスト元のスマートコントラクトに集計値を送信することができます。 +オラクルコントラクトは、オラクルサービス用のオンチェーンコンポーネントです。 他のコントラクトからのデータのリクエストをリッスンしており、データクエリーをオラクルーノードへ中継します。そして、オラクルノードから返送されたデータをクライアントコントラクトへブロードキャストします。 さらに、オラクルコントラクトでは、返送されたデータポイントに対して一定の処理を実行し、リクエスト元のスマートコントラクトに集計値を送信することができます。 オラクルコントラクトは、クライアントのコントラクトがデータリクエストを行う際に呼び出す関数の一部を公開します。 新たなクエリを受け取ったスマートコントラクトは、このデータリクエストの詳細を含む[ログイベント](/developers/docs/smart-contracts/anatomy/#events-and-logs)を発行します。 ログイベントが発行されると、このログを講読しているオフチェーンのノードに対して通知が送信され(通常は、JSON-RPC`eth_subscribe`コマンドを用いる)、これらのノードはログイベントで定義されたデータを取得する作業を開始します。 -以下は、Pedro Costa が作成した[オラクルコントラクトのサンプルコード](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e)です。 このコードは、他のスマートコントラクトからのリクエストに応じて、オフチェーンの API をクエリし、リクエストされた情報をブロックチェーンで保存するというシンプルなオラクルサービスを提供します: +以下は、Pedro Costaが作成した[オラクルコントラクトのサンプルコード](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e)です。 このコードは、他のスマートコントラクトからのリクエストに応じて、オフチェーンのAPIをクエリし、リクエストされた情報をブロックチェーンで保存するというシンプルなオラクルサービスを提供します: ```solidity pragma solidity >=0.4.21 <0.6.0; @@ -198,49 +198,45 @@ contract Oracle { ### オラクルノード {#oracle-nodes} -オラクルノードとは、オラクルサービスにおけるオフチェーンのコンポーネントであり、サードパーティのサーバ上でホスティングされた API などの外部ソースから情報を抽出し、オンチェーンに置くことで、スマートコントラクトが消費できるようにします。 オラクルノードは、オンチェーンのオラクルコントラクトからのイベントをリッスンし、ログに記載されたタスクを実行します。 +オラクルノードは、オラクルサービス用のオフチェーンコンポーネントです。 オラクルノードは、サードパーティのサーバーでホストされているAP などの外部ソースから情報を抽出します。そして、スマートコントラクで使用できるようにオンチェーンへ送信します。 オラクルノードは、オンチェーンのオラクルコントラクトからのイベントをリッスンし、ログに記載されたタスクを実行します。 -オラクルノードにおける一般的なタスクとしては、API サービスに対して[HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp)を送信し、レスポンスを解析して適切なデータを抽出した上で、ブロックチェーンが読み取り可能な出力としてフォーマットし、オラクルコントラクトへのトランザクションに含めることでオンチェーンに送信するというものがあります。 オラクルノードはまた、「真正性証明」を用いて、提出された情報の正当性および完全性を証明するように要求される場合がありますが、これについては以下のセクションで説明します。 +オラクルノードにおける一般的なタスクとしては、APIサービスに対して[HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp)を送信し、レスポンスを解析して適切なデータを抽出した上で、ブロックチェーンが読み取り可能な出力としてフォーマットし、オラクルコントラクトへのトランザクションに含めることでオンチェーンに送信するというものがあります。 オラクルノードはまた、「真正性証明」を用いて、提出された情報の正当性および完全性を証明するように要求される場合がありますが、これについては以下のセクションで説明します。 -計算型のオラクルも、負荷が大きい計算タスク(ガス代およびブロックサイズの制限により、オンチェーンでの実行が非現実的であるため)を実行するためにオフチェーンのノードに依存します。 例えば、ランダムであることが検証可能な値を生成するタスク(ブロックチェーンベースのゲームで用いる)につき、オラクルノードが活用される場合があります。 +計算型のオラクルも、計算タスク(ガス代およびブロックサイズの制限により、オンチェーンでの実行が非現実的であるため)を実行するためにオフチェーンのノードに依存します。 例えば、ランダムであることが検証可能な値を生成するタスク(ブロックチェーンベースのゲームで用いる)につき、オラクルノードが活用される場合があります。 ## オラクルの設計パターン {#oracle-design-patterns} -オラクルには、_即時読み取り型_、_公開=講読型_、および*要求=対応型*などの様々な種類があり、イーサリアムのスマートコントラクトでは、公開=講読型および要求=対応型が広く活用されています。 以下に、これら 2 つのオラクルサービスについて簡単に紹介します: +オラクルには、_即時読み取り型_、_出版/講読型_、および_リクエスト/レスポンス型_などの様々な種類があり、イーサリアムのスマートコントラクトでは、出版/講読型およびリクエスト/レスポンス型が広く活用されています。 ここでは、出版/購読型モデルとリクエスト/レスポンス型モデルについて簡単に説明します。 -### 公開=講読型のオラクル {#publish-subscribe-oracles} +### 出版/購読型のオラクル {#publish-subscribe-oracles} -公開=講読のメカニズムに基づくオラクルサービスは、他のコントラクトが定期的に読み込むことができる情報を提供する「データフィード」を公開するものです。 このデータフィードにおけるデータは頻繁に変化すると想定されるため、クライアントであるコントラクトは、オラクルのストレージに含まれるデータが更新されたかどうかをリッスンする必要があります。 このようなデータフィードの代表例としては、ETH/USD 交換レートの最新情報を提供するオラクルがあります。 +このタイプのオラクルでは、他のコントラクトが定期的に情報を読み込むことが可能な「データフィード」を提供します。 このデータフィードにおけるデータは頻繁に変化すると想定されるため、クライアントであるコントラクトは、オラクルのストレージに含まれるデータが更新されたかどうかをリッスンする必要があります。 例えば、最新の ETH-USDにおける価格情報をユーザーに提供するオラクルがあります。 -### 要求=応答型のオラクル {#request-response-oracles} +### リクエスト/レスポンス型のオラクル {#request-response-oracles} -要求=応答型のメカニズムにおいては、クライアントのコントラクトは公開=講読型のオラクルでは提供されない任意のデータをリクエストできます。 要求=応答型のオラクルは、以下の場合に最も適しています: +リクエスト/レスポンス型のメカニズムにおいては、クライアントのコントラクトは出版/購読型のオラクルでは提供されない任意のデータをリクエストできます。 リクエスト/レスポンス型のオラクルは、データセットが大きすぎてスマート コントラクトのストレージに保存できない場合や、ユーザーが常時データのごく一部しか必要としない場合に適しています。 -- データセットが大規模すぎるために、スマートコントラクト内のストレージに保存できない。 - -- ユーザーがある時点で必要とするのは、データセット全体のごく一部のみである - -要求=応答型のオラクルは、公開=講読型よりも複雑ですが、基本的な機能は上記セクションで説明した通りです。 この種類のオラクルは、データリクエストを受け取るオンチェーンのコンポーネントを持ち、オフチェーンのノードによる処理のためにリクエストを転送します。 +リクエスト/レスポンス型のオラクルは、出版/購読型よりも複雑ですが、基本的な機能は上記セクションで説明した通りです。 この種類のオラクルは、データリクエストを受け取るオンチェーンのコンポーネントを持ち、オフチェーンのノードによる処理のためにリクエストを転送します。 データのクエリを開始するユーザーは、オフチェーンの情報ソースから情報を取得するコストを負担しなければなりません。 クライアントのコントラクトはさらに、オラクルコントラクトが当該リクエストで指定されたコールバック機能を通じてレスポンスを提供する際に発生するガス代につき、これを負担するのに十分な資金を持つ必要があります。 -## オラクルの種類 {#types-of-oracles} +## 集権型オラクルと分散型オラクルの比較 {#types-of-oracles} ### 集中型のオラクル {#centralized-oracles} -集中型のオラクルとは、オフチェーンの情報を集約し、リクエストに応じてオラクルコントラクトのデータを更新する作業に責任を負う単一のエンティティによって管理されたオラクルを指します。 集中型のオラクルは、単一の真実ソースを持つため、効率的であると言えます。 集中型のオラクルは、広く承認された署名を持つ所有者が直接、独自のデータセットを公開する場合においては望ましいとも言えるでしょう。 その一方で、集中型のオラクルにはいくつかの問題も存在します。 +集中型のオラクルとは、オフチェーンの情報を集約し、リクエストに応じてオラクルコントラクトのデータを更新する作業に責任を負う単一のエンティティによって管理されたオラクルを指します。 集中型のオラクルは、単一の真実ソースを持つため、効率的であると言えます。 集中型のオラクルは、広く承認された署名を持つ所有者が直接、独自のデータセットを公開する場合においてはよく機能します。 しかし、次のような欠点があります。 #### 正確性を保証しにくい {#low-correctness-guarantees} -集中型のオラクルでは、提供された情報が正しいか否かを確認する方法がありません。 オラクルの提供者は「名声を持つ」かもしれませんが、その評判は、提供者が不正行為を絶対に行わないことや、ハッカーがシステムを改ざんするという可能性を除去するものではありません。 当該オラクルが改ざんされた場合、スマートコントラクトは不適切なデータに基づいて実行されることになります。 +集中型のオラクルでは、提供された情報が正しいか否かを確認する方法がありません。 たとえ「評判の良い」プロバイダーであっても、不正が行われたり、ハッキングを受ける可能性はあります。 当該オラクルが改ざんされた場合、スマートコントラクトは不適切なデータに基づいて実行されることになります。 #### 可用性が低い {#poor-availability} -集中型のオラクルは、他のスマートコントラクトに対してオフチェーンのデータを常に提供することを保証しません。 オラクルの提供者が当該サービスを廃止したり、ハッカーがオラクルのオフチェーン・コンポーネントを乗っ取ってしまった場合、あなたのスマートコントラクトは Dos 攻撃の被害を受ける可能性があります。 +集中型のオラクルは、他のスマートコントラクトに対してオフチェーンのデータを常に提供することを保証しません。 オラクルの提供者が当該サービスを廃止したり、ハッカーがオラクルのオフチェーン・コンポーネントを乗っ取ってしまった場合、あなたのスマートコントラクトはDos攻撃の被害を受ける可能性があります。 #### インセンティブと両立しにくい {#poor-incentive-compatibility} -集中型のオラクルでは、データ提供者に対して正確/未改変の情報を送信するようにインセンティブを提要する仕組みが存在しないか、設計が不十分な場合が少なくありません。 オラクルサービスの代価として手数料を支払うことにより、サービス提供者に対して正直な行動を促すことは可能ですが、このようなインセンティブでは不十分な場合もあり得ます。 スマートコントラクトは莫大な規模の価値を管理するものであるため、オラクルデータを改ざんすることで得られる利益もかつてなく大きくなっているのです。 +集中型のオラクルでは、データ提供者に対して正確/未改変の情報を送信するようにインセンティブを提要する仕組みが存在しないか、設計が不十分な場合が少なくありません。 正確性に対してオラクルに支払っても、公正であることが保証されるわけではありません。 この問題は、スマートコントラクトによって管理される金額が増加するにつれて大きくなります。 ### 分散型のオラクル {#decentralized-oracles} @@ -260,11 +256,11 @@ contract Oracle { 真正性の証明には、以下のようなものがあります: -**トランスポートレイヤー・セキュリティ(TLS)証明**:オラクルノードでは、トランスポートレイヤー・セキュリティ(TLS)プロトコルに基づくセキュアな HTTP 接続を使用して、外部ソースからデータを取得することが多いです。 一部の分散型オラクルでは、TLS セッションを検証し(つまり、ノードが特定のサーバーとの間で情報を交換したことを確認し)、当該セッションにおける内容が未改変であることを確認するために、真正性証明を利用します。 +**トランスポートレイヤー・セキュリティ(TLS)証明**:オラクルノードでは、トランスポートレイヤー・セキュリティ(TLS)プロトコルに基づくセキュアなHTTP接続を使用して、外部ソースからデータを取得することが多いです。 一部の分散型オラクルでは、TLSセッションを検証し(つまり、ノードが特定のサーバーとの間で情報を交換したことを確認し)、当該セッションにおける内容が未改変であることを確認するために、真正性証明を利用します。 -**信頼された実行環境(TEE)のアテステーション**:[信頼された実行環境](https://en.wikipedia.org/wiki/Trusted_execution_environment)(TEE)とは、ホストシステムの運用プロセスから分離された、サンドボックス化された計算環境です。 TEE では、当該の計算環境においおて保存/使用されるアプリケーションコードまたはデータの完全性、機密性、および不変性が保証されます。 ユーザーはまた、当該のアプリケーション・インスタンスが信頼された実行環境において実行されていることを証明するアテステーションを生成することもできます。 +**信頼された実行環境(TEE)のアテステーション**:[信頼された実行環境](https://en.wikipedia.org/wiki/Trusted_execution_environment)(TEE)とは、ホストシステムの運用プロセスから分離された、サンドボックス化された計算環境です。 TEEでは、当該の計算環境においおて保存/使用されるアプリケーションコードまたはデータの完全性、機密性、および不変性が保証されます。 ユーザーはまた、当該のアプリケーション・インスタンスが信頼された実行環境において実行されていることを証明するアテステーションを生成することもできます。 -分散型オラクルの中には、オラクルノードの運用者に対して TEE のアテステーションを要求するものもあります。 このアテステーションは、ノードの運用者がオラクルクライアントのインスタンスを信頼された実行環境で実行していることを、ユーザーに保証するものです。 TEE では、当該アプリケーションのコードおよびデータを改変したり、読み取るような外部プロセスが実行できないため、このようなアテステーションを通じて、オラクルノードが当該情報を未改変かつ機密の状態に保ったことを証明できます。 +分散型オラクルの中には、オラクルノードの運用者に対してTEEのアテステーションを要求するものもあります。 このアテステーションは、ノードの運用者がオラクルクライアントのインスタンスを信頼された実行環境で実行していることを、ユーザーに保証するものです。 TEEでは、当該アプリケーションのコードおよびデータを改変したり、読み取るような外部プロセスが実行できないため、このようなアテステーションを通じて、オラクルノードが当該情報を未改変かつ機密の状態に保ったことを証明できます。 #### コンセンサスに基づく情報の検証 {#consensus-based-validation-of-information} @@ -274,7 +270,7 @@ contract Oracle { ##### データの正確性に関する投票/ステーキング -一部の分散型オラクルでは、参加者に対し、データクエリ(例:「2020 年の米国大統領選挙では誰が当選したか?」)への回答に対して、投票またはステーキングを要求します。 この際の投票/ステーキングには、当該ネットワークのネイティブトークンが使用されます。 この投票およびステーキングは、集計プロトコルにより集約され、多数派が支持した回答が正当な回答とされます。 +一部の分散型オラクルでは、参加者に対し、データクエリ(例:「2020年の米国大統領選挙では誰が当選したか?」)への回答に対して、投票またはステーキングを要求します。 この際の投票/ステーキングには、当該ネットワークのネイティブトークンが使用されます。 この投票およびステーキングは、集計プロトコルにより集約され、多数派が支持した回答が正当な回答とされます。 多数派の回答とは異なる回答を提供したノードは、ペナルティとして、より適切な値を提供したユーザーに保有トークンを奪われることになります。 各ノードに対して、データ提供前に担保の差し出しを義務付けることで、リターン最大化を目指す合理的な経済アクターと想定されるユーザーに対し、正直な行動を取るように誘導するインセンティブを与えることができます。 @@ -282,29 +278,29 @@ contract Oracle { ##### シェリングポイントのメカニズム -[シェリングポイント]()とは、特定の問題につき複数のエンティティ間におけるコミュニケーションが存在しない場合、常に同一のソリューションに回帰するというゲーム理論上の概念です。 シェリングポイントのメカニズムは、分散型のオラクルネットワークにおいて、データリクエストへの回答について各ノードがコンセンサスを得るためにしばしば利用されます。 +[シェリングポイント](https://en.wikipedia.org/wiki/Focal_point_(game_theory))とは、特定の問題につき複数のエンティティ間におけるコミュニケーションが存在しない場合、常に同一のソリューションに回帰するというゲーム理論上の概念です。 シェリングポイントのメカニズムは、分散型のオラクルネットワークにおいて、データリクエストへの回答について各ノードがコンセンサスを得るためにしばしば利用されます。 -シェリングポイントの初期の実例としては、[SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed/)があります。これは、「スケーラー」質問(「ETH の価格はいくらか」といった大きさで回答できる質問)に対して、参加者がデポジットを入金することで回答できるデータフィードの提案でした。 全体の回答値のうち 25%から 75%の[パーセンタイル](https://en.wikipedia.org/wiki/Percentile)を提出した回答者に報酬が提供される一方で、中央値から大きく外れた回答を提供したユーザーには罰金が課せられます。 +シェリングポイントの初期の発想としては、[SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed/)があります。これは、「スケーラー」質問(「ETHの価格はいくらか」といった大きさで回答できる質問)に対して、参加者がデポジットを入金することで回答できるデータフィードの提案でした。 全体の回答値のうち25%から75%の[パーセンタイル](https://en.wikipedia.org/wiki/Percentile)を提出した回答者に報酬が提供される一方で、中央値から大きく外れた回答を提供したユーザーには罰金が課せられます。 -SchellingCoin は現存していませんが、多くの分散型オラクル、特に[Maker Protocol を使用するオラクル](https://docs.makerdao.com/smart-contract-modules/oracle-module)では、シェリングポイントのメカニズムを活用することでオラクルデータの正確性を向上させています。 Maker プロトコルを採用したオラクルは、担保資産の市場価格を提出するノード(「リレイヤー」および「フィード」)で構成されるオフチェーンの P2P ネットワークと、提供された全ての値の中央値を算出するオンチェーンの「メディアナイザー」コントラクトで構成されます。 定められた遅延期間が経過すると、この中央値が当該資産における新たな参照価格になります。 +SchellingCoinは現存していませんが、多くの分散型オラクル、特に[Maker Protocolを使用するオラクル](https://docs.makerdao.com/smart-contract-modules/oracle-module)では、シェリングポイントのメカニズムを活用することでオラクルデータの正確性を向上させています。 Makerプロトコルを採用したオラクルは、担保資産の市場価格を提出するノード(「リレイヤー」および「フィード」)で構成されるオフチェーンのP2Pネットワークと、提供された全ての値の中央値を算出するオンチェーンの「メディアナイザー」コントラクトで構成されます。 定められた遅延期間が経過すると、この中央値が当該資産における新たな参照価格になります。 -シェリングポイントのメカニズムを採用している他のオラクルの例としては、[Chainlink オフチェーン報告](https://docs.chain.link/docs/off-chain-reporting/)および Witnet があります。 どちらのシステムでも、P2P ネットワークに含まれるオラクルノードからの回答は、平均値あるいは中央値といった単一の値に集約されます。 各ノードは、自らの回答がこの集約値とどれほど一致/乖離しているかに応じて、報酬/罰金を受けます。 +シェリングポイントのメカニズムを採用している他のオラクルの例としては、[Chainlinkオフチェーン報告](https://docs.chain.link/docs/off-chain-reporting/)および[Witnet](https://witnet.io/)があります。 どちらのシステムでも、P2Pネットワークに含まれるオラクルノードからの回答は、平均値あるいは中央値といった単一の値に集約されます。 各ノードは、自らの回答がこの集約値とどれほど一致/乖離しているかに応じて、報酬/罰金を受けます。 -シェリングポイントのメカニズムは、分散化を保証しつつ、オンチェーンのフットプリントを最小化できる(1 つのトランザクションのみ送信すればよい)点が魅力的だと言えます。 このメカニズムで分散化が可能なのは、各ノードに対して、提出済みの回答リストが平均値/中央値を算出するアルゴリズムに投入される事前に、同リストにサインオフすることが要求されるためです。 +シェリングポイントのメカニズムは、分散化を保証しつつ、オンチェーンのフットプリントを最小化できる(1つのトランザクションのみ送信すればよい)点が魅力的だと言えます。 このメカニズムで分散化が可能なのは、各ノードに対して、提出済みの回答リストが平均値/中央値を算出するアルゴリズムに投入される事前に、同リストにサインオフすることが要求されるためです。 ### 可用性 {#availability} 分散型のオラクルサービスでは、スマートコントラクトに対するオフチェーンデータの提供可能性が高くなります。 これは、オフチェーンの情報ソースと、この情報をオンチェーンに転送する役割を担うノードの両方を分散化することによって実現されています。 -この可用性により、オラクルコントラクトは、他のコントラクトのクエリを実行するために複数のノードに依存でき、これらの複数のノード自体もまた複数のデータソースに依存するため、障害耐性が高まります。 情報ソース*および*ノード=オペレーターの両方において分散化を実現することが必須であり、同一の情報ソースから取得した情報を複数のオラクルノードが提出するようなネットワークでは、集中型オラクルの場合と同じ問題が発生してしまいます。 +この可用性により、オラクルコントラクトは、他のコントラクトのクエリを実行するために複数のノードに依存でき、これらの複数のノード自体もまた複数のデータソースに依存するため、障害耐性が高まります。 情報ソース_および_ノード=オペレーターの両方において分散化を実現することが必須であり、同一の情報ソースから取得した情報を複数のオラクルノードが提出するようなネットワークでは、集中型オラクルの場合と同じ問題が発生してしまいます。 さらに、ステーキングベースのオラクルでは、データリクエストに迅速に対応しないノードペレーターに対してスラッシングを行うことも可能です。 これにより、オラクルノードに対して障害耐性を持つインフラに投資し、迅速にデータを提供するように促すことができます。 ### インセンティブと両立しやすい {#good-incentive-compatibility} -分散型のオラクルでは、オラクルノード間における[ビザンチン将軍問題](https://en.wikipedia.org/wiki/Byzantine_fault)動作を防ぐために、様々なインセンティブの仕組みを導入しています。 具体的には、以下の方法で*アトリビュータビリティ*と*アカウンタビリティ*を実現しています: +分散型のオラクルでは、オラクルノード間における[ビザンチン将軍問題](https://en.wikipedia.org/wiki/Byzantine_fault)動作を防ぐために、様々なインセンティブの仕組みを導入しています。 具体的には、以下の方法で_アトリビュータビリティ_と_アカウンタビリティ_を実現しています: -1. 分散型オラクルのノードに対しては、データリクエストに対してレスポンスを提供する際に当該データに対する証明が要求される場合が多いです。 この署名情報は、データをリクエストする際に信頼性が低いオラクルノードを排除するなど、オラクルノードの過去の行動を評価する際に有益です。 具体的な導入例としては、Chainlink の[オラクル・レビュテーション](https://oracle.reputation.link/)や、Witnet の[アルゴリズム・レピュテーション・システム](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system)があります。 +1. 分散型オラクルのノードに対しては、データリクエストに対してレスポンスを提供する際に当該データに対する証明が要求される場合が多いです。 この署名情報は、データをリクエストする際に信頼性が低いオラクルノードを排除するなど、オラクルノードの過去の行動を評価する際に有益です。 Witnetの例としては、[アルゴリズミック評判システム](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system)があります。 2. すでに述べたように、分散型のオラクルでは、提出するデータの真実性に対するノード本人の確信に対してステーキングを義務付ける場合があります。 このノードのクレームが確認されれば、このステークは、正直な行動への報酬と共に返却されます。 ただし、提出した情報が正しくない場合には没収される可能性があるため、一定の説明責任を担保する手段となります。 @@ -314,13 +310,15 @@ SchellingCoin は現存していませんが、多くの分散型オラクル、 ### 金融データを取り出す {#retrieving-financial-data} -[分散型ファイナンス](/defi/)(DeFi)の アプリケーションは、P2P による資産の貸出、借入、および取引を可能にするものです。 これらのサービスを提供するには、為替データ(仮想通貨における法定通貨建ての価値を算出するため、あるいは 2 種類のトークンの価格を比較するため)や、資本市場に関するデータ(トークン化された金や米ドル等の資産の価値を算出するため)など、様々な金融情報を取得する必要があります。 +[分散型ファイナンス](/defi/)(DeFi)の アプリケーションは、P2Pによる資産の貸出、借入、および取引を可能にするものです。 これらのサービスを提供するには、為替データ(仮想通貨における法定通貨建ての価値を算出するため、あるいはトークンの価格を比較するため)や、資本市場に関するデータ(トークン化された金や米ドル等の資産の価値を算出するため)など、様々な金融情報を取得する必要があります。 -例えば DeFi の貸出プロトコルを開発したい場合には、担保として預け入れられた様々な資産(例:ETH)の現在の市場価格をクエリできる機能が必要になります。 これは、スマートコントラクトに対して、担保資産の価値を評価し、ユーザーがシステムからどれだけ借入可能かを決定する機能を提供するためです。 +例えばDeFiの貸出プロトコルでは、担保として預け入れられた様々な資産(例:ETH)の現在の市場価格をクエリできる機能が必要になります。 これは、コントラクトに対して、担保資産の価値を評価し、ユーザーがシステムからどれだけ借入可能かを決定する機能を提供するためです。 -DeFi の分野でよく利用される「価格オラクル」(多くの場合、こう呼ばれます)の例としては、Chainlin の価格フィード、Compound Protocol の[公開価格フィード](https://compound.finance/docs/prices)、Uniswap の[時間加重平均価格(TWAPs)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles)、および[Maker Oracles](https://docs.makerdao.com/smart-contract-modules/oracle-module)が挙げられます。 ただし、プロジェクトにこれらの価格オラクルを組み込む前に、導入に伴う注意事項についてよく理解しておく必要があります。 この[記事](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/)では、これらの価格オラクルを使用したい場合に検討すべき事項について詳細に分析しています。 +DeFiの分野でよく利用される「価格オラクル」(多くの場合、こう呼ばれます)の例としては、Chainlinの価格フィード、Compound Protocolの[公開価格フィード](https://compound.finance/docs/prices)、Uniswapの[時間加重平均価格(TWAPs)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles)、および[Maker Oracles](https://docs.makerdao.com/smart-contract-modules/oracle-module)が挙げられます。 -以下のサンプルコードは、Chainlink の価格フォードを使用してスマートコントラクト上で最新の ETH 価格を取得するものです: +ビルダーは、プロジェクトにこれらの価格オラクルを組み込む前に、導入に伴う注意事項についてよく理解しておく必要があります。 この[記事](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/)では、これらの価格オラクルを使用したい場合に検討すべき事項について詳細に分析しています。 + +以下のサンプルコードは、Chainlinkの価格フォードを使用してスマートコントラクト上で最新のETH価格を取得するものです: ```solidity pragma solidity ^0.6.7; @@ -360,51 +358,49 @@ contract PriceConsumerV3 { ブロックチェーンベースのゲームや宝くじなど、一部のブロックチェーン・アプリケーションでは、適切に機能するために高度な予測不可能性およびランダム性が要求されます。 しかし、ブロックチェーンは決定論的な実行という特性を持つため、ランダム性を獲得する手段がありません。 -このような場合の通常のアプローチでは、`blockhash`などの擬似的な暗号機能を用いますが、[他のアクターによる操作](https://ethereum.stackexchange.com/questions/3140/risk-of-using-blockhash-other-miners-preventing-attack#:~:text=So%20while%20the%20miners%20can,to%20one%20of%20the%20players.)、つまりプルーフ・オブ・ワークのアルゴリズムを解決するマイナーによりランダム性が損なわれる可能性があります。 また、イーサリアムにおける[プルーフ・オブ・ステークへの移行](/upgrades/merge/)に伴い、開発者は、`blockhash`によるオンチェーンのランダム性を活用することができなくなりました(ただし、ビーコンチェーンの[RANDAO メカニズム](https://eth2book.info/altair/part2/building_blocks/randomness)は、ランダム性を提供する代替ソースとして機能します)。 +このような場合の通常のアプローチでは、`blockhash`などの擬似的な暗号機能を用いますが、[他のアクターによる操作](https://ethereum.stackexchange.com/questions/3140/risk-of-using-blockhash-other-miners-preventing-attack#:~:text=So%20while%20the%20miners%20can,to%20one%20of%20the%20players.)、つまりプルーフ・オブ・ワークのアルゴリズムを解決するマイナーによりランダム性が操作される可能性があります。 また、イーサリアムにおける[プルーフ・オブ・ステークへの移行](/roadmap/merge/)に伴い、開発者は、`blockhash`によるオンチェーンのランダム性を活用することができなくなりました(ただし、ビーコンチェーンの[RANDAOメカニズム](https://eth2book.info/altair/part2/building_blocks/randomness)は、ランダム性を提供する代替ソースとして機能します)。 ランダムな値をオフチェーンで生成した上でオンチェーンに送信することは可能ですが、このアプローチではユーザーに対する信頼性の要件が高くなります。 ユーザーは、生成された値が本当に予測不可能なメカニズムによって生成され、転送に伴う改変が生じていないことを信じなければならないためです。 -オフチェーンでの計算を念頭に置いて設計されたオラクルでは、オフチェーンでランダムな値をセキュアに生成した上で、生成プロセスの予測不可能性を確証する暗号化された証明と共にオンチェーンでブロードキャストすることで、この問題を解決します。 このようなアプローチの例としては、[Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/) (検証可能なランダム関数)があります。これは、証明可能な形で、公平かつ操作不可の乱数を生成する機能(RNG)であり、予測不可能な計算値を必要とする用途を持つ信頼性が高いスマートコントラクトを開発する上で有益です。 +オフチェーンでの計算を念頭に置いて設計されたオラクルでは、オフチェーンでランダムな値をセキュアに生成した上で、生成プロセスの予測不可能性を確証する暗号化された証明と共にオンチェーンでブロードキャストすることで、この問題を解決します。 このようなアプローチの例としては、[Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/) (検証可能なランダム関数)があります。これは、証明可能な形で、公平かつ操作不可の乱数を生成する機能(RNG)であり、予測不可能な計算値を必要とする用途を持つ信頼性が高いスマートコントラクトを開発する上で有益です。 例をもう一つあげると、 [API3 QRNG](https://docs.api3.org/explore/qrng/)が量子乱数生成器 (QRNG) を提供しています。これは、量子現象に基づくWeb3 RNGの公開メソッドであり、オーストラリア国立大学 (ANU) の好意により提供されています。 ### イベントの結果を取得する {#getting-outcomes-for-events} -オラクルを活用することで、現実世界で発生したイベントに応答できるスマートコントラクトを手軽に開発できます。 オラクルサービスでは、オラクルのオフチェーン・コンポーネントを通じて外部 API と接続し、外部のデータソースから取得した情報を消費することで、現実のイベントへの応答を可能にしています。 例えば、すでに紹介した予測用の Dapp の場合、信頼できるオフチェーンの情報ソース(例:AP)から選挙結果を取得するようにオラクルに要求することができます。 +オラクルを活用することで、現実世界で発生したイベントに応答できるスマートコントラクトを手軽に開発できます。 オラクルサービスでは、オラクルのオフチェーン・コンポーネントを通じて外部APIと接続し、外部のデータソースから取得した情報を消費することで、現実のイベントへの応答を可能にしています。 例えば、すでに紹介した予測用のDappの場合、信頼できるオフチェーンの情報ソース(例:AP)から選挙結果を取得するようにオラクルに要求することができます。 -オラクルを使って現実世界における結果に基づくデータを取得することで、分散型の保険サービスなどの新しいユースケースが可能になります。 保険サービスを提供するスマートコントラクトでは、正確な情報(例:気象データ、災害に関する報告など)がなければ正しく機能しません。 +オラクルを使用して現実世界の結果に基づいてデータを取得することで、斬新なユースケースを可能になります。ユースケースの例として、 分散型保険商品が効果的に機能させることがあります。この分野では、天気、災害などに関する正確な情報を必要としています。 ### スマートコントラクトの自動化 {#automating-smart-contracts} -スマートコントラクトは、一般的な誤解とは異なり、自動的に実行される訳ではありません。スマートコントラクトのコードを実行するには、外部所有アカウント(EOA)まあたはその他のコントラクトアカウントが適切な関数をトリガーする必要があるのです。 大部分の場合、スマートコントラクトに含まれる関数の大部分は公開されており、EOA およびその他のコントラクトにより呼び出すことができます。 +スマートコントラクトは、自動的に実行される訳ではありません。正確に言うと、スマートコントラクトのコードを実行するには、外部所有アカウント(EOA)まあたはその他のコントラクトアカウントが適切な関数をトリガーする必要があります。 大部分の場合、スマートコントラクトに含まれる関数の大部分は公開されており、EOAおよびその他のコントラクトにより呼び出すことができます。 -しかしスマートコントラクトには、他のコントラクトからはアクセスできない*プライベート関数*も含まれており、これらは Dapp の全般的な機能を実現する上で欠かせない関数である場合が多いです。 このようなプライベート関数の例としては、新規の NFT を定期的にミントする`mintERC721Token()`関数、予測市場で報酬を支払う関数、あるいは DEX においてステーキングされたトークンをアンロックする関数などが想定できるでしょう。 +しかしスマートコントラクトには、他のコントラクトからはアクセスできない_プライベート関数_も含まれており、これらはDappの全般的な機能を実現する上で欠かせない関数になっています。 このようなプライベート関数の例としては、新規のNFTを定期的にミントする`mintERC721Token()`関数、予測市場で報酬を支払う関数、あるいはDEXにおいてステーキングされたトークンをアンロックする関数などが想定できるでしょう。 開発者は、アプリケーションのスムーズな動作を保証するために、これらの関数を一定の間隔でトリガーする必要があります。 しかし、このようなアプローチでは、開発者が反復的なタスクのために費やす時間が増加してしまうため、スマートコントラクトを自動的に実行するアプローチが有益なのです。 一部の分散型オラクルのネットワークでは、ユーザーが定義したパラメータに従って、オフチェーンのオラクルノードがスマートコントラクトの関数をトリガーできる自動化サービスを提供しています。 このような自動化サービスは通常、ターゲットとなるコントラクトを当該のオラクルサービスに「登録」する必要がある他、オラクルの運用者に対して手数料を支払い、当該コントラクトをトリガーする際の条件または時間を指定する必要があります。 -このようなサービスの例としては、Chainlink の[Keeper Network](https://chain.link/keepers)があり、スマートコントラクトに対して、最小限の信頼性に基づき分散化された手法で定期的な保全タスクを実行するためのオプションが提供されています。 開発中のコントラクトを Keeper 互換にしたり、Upkeep サービスを利用したい場合は、Keeper の[公式ドキュメンテーション](https://docs.chain.link/docs/chainlink-keepers/introduction/)を参照してください。 +Chainlinkの[Keeper Network](https://chain.link/keepers)では、スマートコントラクトに対して、最小限の信頼性に基づき分散化された手法で定期的な保全タスクを実行するためのオプションが提供されています。 開発中のコントラクトをKeeper互換にしたり、Upkeepサービスを利用したい場合は、Keeperの[公式ドキュメント](https://docs.chain.link/docs/chainlink-keepers/introduction/)を参照してください。 ## ブロックチェーン・オラクルを使用する {#use-blockchain-oracles} -イーサリアムの Dapp で使用できるオラクル・アプリケーションとしては、以下があります: - -**[Chainlink](https://chain.link/)** - _Chainlink の分散型オラクルネットワークでは、インプット情報、アウトプット情報、および計算処理における改ざん防止を徹底することで、あらゆるブロックチェーンにおける複雑なスマートコントラクトをサポートしています。_ +イーサリアムのDappで使用できるオラクル・アプリケーションとしては、以下があります: -**[Witnet](https://witnet.io/)** - _Witnet は、パーミッションレス性、分散性、および耐検閲性を持つオラクルであり、スマートコントラクトを強力な暗号経済的な保証に基づいて現実世界のイベントに反応できるようにすることができます。_ +**[Chainlink](https://chain.link/)** - _Chainlinkの分散型オラクルネットワークでは、インプット情報、アウトプット情報、および計算処理における改ざん防止を徹底することで、あらゆるブロックチェーンにおける複雑なスマートコントラクトをサポートしています。_ -**[UMA オラクル](https://uma.xyz)** - _UMA のオプティミスティック・オラクルでは、保険、金融派生商品、および予測市場などのさまざまな用途を持つスマートコントラクトに対して、あらゆる種類のデータを迅速に取得する機能を追加することができます。_ +**[Witnet](https://witnet.io/)** - _Witnetは、パーミッションレス性、分散性、および耐検閲性を持つオラクルであり、スマートコントラクトを強力な暗号経済的な保証に基づいて現実世界のイベントに反応できるようにすることができます。_ -**[Tellor](https://tellor.io/)** - _Tellor は、あなたのスマートコントラクトが必要とする際に、常にどんな種類のデータでも取得可能にするための、透明性が高くパーミッションレスのオラクル・プロトコルです。_ +**[UMAオラクル](https://uma.xyz)** - _UMAのオプティミスティック・オラクルでは、保険、金融派生商品、および予測市場などのさまざまな用途を持つスマートコントラクトに対して、あらゆる種類のデータを迅速に取得する機能を追加することができます。_ -**[Band Protocol](https://bandprotocol.com/)** - _Band Protocol は、現実世界のデータを集約し、各種 API とスマートコントラクトを接続するための、クロスチェーンデータを対象とするオラクルプラットフォームです。_ +**[Tellor](https://tellor.io/)** - _Tellorは、あなたのスマートコントラクトが必要とする際に、常にどんな種類のデータでも取得可能にするための、透明性が高くパーミッションレスのオラクル・プロトコルです。_ -**[Provable](https://provable.xyz/)** - _Provable は、ブロックチェーンを利用した Dapp とあらゆる種類の外部 Web API を接続するサービスで、TLSNotary proof、信頼される実行環境(TEE)およびセキュアな暗号プリミティブを活用してデータの真正性を保証しています。_ +**[Band Protocol](https://bandprotocol.com/)** - _Band Protocolは、現実世界のデータを集約し、各種APIとスマートコントラクトを接続するための、クロスチェーンデータを対象とするオラクルプラットフォームです。_ -**[Paralink](https://paralink.network/)** - _Paralink は、イーサリアムおよびその他のメジャーなブロックチェーン上で実行されるスマートコントラクトを対象とする、オープンソースで分散化されたオラクルプラットフォームです。_ +**[Paralink](https://paralink.network/)** - _Paralinkは、イーサリアムおよびその他のメジャーなブロックチェーン上で実行されるスマートコントラクトを対象とする、オープンソースで分散化されたオラクルプラットフォームです。_ -**[Dos.Network](https://dos.network/)** - _DOS Network は、現実世界におけるデータや処理能力を活用することでブロックチェーンの使いやすさを向上させる、分散型のオラクルサービスネットワークです。_ +**[Pyth Network](https://pyth.network/)** - _Pyth Networkは、改ざん不可、分散化、および自己持続可能な特徴を持つ環境において、現実世界のデータを継続的にオンチェーンで公開するために設計された、ファーストパーティの金融オラクルネットワークです。_ -**[Pyth Network](https://pyth.network/)** - _Pyth Network は、改ざん不可、分散化、および自己持続可能な特徴を持つ環境において、現実世界のデータを継続的にオンチェーンで公開するために設計された、ファーストパーティの金融オラクルネットワークです。_ +**[API3 DAO](https://www.api3.org/)** - _API3 DAOでは、ファーストパーティのオラクルソリューションを提供しています。スマートコントラクトの分散型ソリューションにより、ソースの透明性、セキュリティ、スケーラビリティを向上させることができます。_ ## 参考文献 {#further-reading} @@ -414,18 +410,19 @@ contract PriceConsumerV3 { - [ブロックチェーン・オラクルとは?](https://betterprogramming.pub/what-is-a-blockchain-oracle-f5ccab8dbd72) — _パトリック・コリンズ作成。_ - [分散型オラクル:包括的な概要](https://medium.com/fabric-ventures/decentralised-oracles-a-comprehensive-overview-d3168b9a8841) — _ジュリアン・テヴェナード作成。_ - [イーサリアムにおける ブロックチェーン・オラクルの実装](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) – _ペドロ・コスタ作成。_ -- [スマートコントラクトが API コールを行えないのはなぜか?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) — _StackExchange_ +- [スマートコントラクトがAPIコールを行えないのはなぜか?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) — _StackExchange_ - [分散型のオラクルが必要な理由](https://newsletter.banklesshq.com/p/why-we-need-decentralized-oracles) — _Bankless_ - [価格オラクルを使用したい場合の検討事項](https://samczsun.com/so-you-want-to-use-a-price-oracle/) — _samczsun_ **ビデオ** - [オラクルによるブロックチェーンの有用性の拡大](https://youtu.be/BVUZpWa8vpw) — _Real Vision Finance_ +- [ファーストパーティーオラクルとサードバーティーオラクルの違い](https://blockchainoraclesummit.io/first-party-vs-third-party-oracles/) - _ブロックチェーン・オラクル・サミット_ **チュートリアル** -- [Solidity 上でイーサリアムの現在価格を取得する方法](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) — _Chainlink_ +- [Solidity上でイーサリアムの現在価格を取得する方法](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) — _Chainlink_ **プロジェクト実例** -- [Solidity を用いてイーサリアムに Chainlin をフルに導入する際のスタータープロジェクト](https://github.com/hackbg/chainlink-fullstack) — _HackBG_ +- [Solidityを用いてイーサリアムにChainlinをフルに導入する際のスタータープロジェクト](https://github.com/hackbg/chainlink-fullstack) — _HackBG_ diff --git a/public/content/translations/ja/developers/docs/scaling/index.md b/public/content/translations/ja/developers/docs/scaling/index.md index 3ed3642262a..e340dc20b5a 100644 --- a/public/content/translations/ja/developers/docs/scaling/index.md +++ b/public/content/translations/ja/developers/docs/scaling/index.md @@ -1,6 +1,6 @@ --- title: スケーリング -description: 現在イーサリアムコミュニティにおいて開発中の様々なスケーリングのオプションを紹介する。 +description: 現在イーサリアムコミュニティにおいて開発中のさまざまなスケーリングのオプションを紹介する。 lang: ja sidebarDepth: 3 --- @@ -9,7 +9,7 @@ sidebarDepth: 3 イーサリアムのユーザー規模が拡大するにつれ、イーサリアムブロックチェーンの処理能力は限界に達しつつあります。 これにより、イーサリアムネットワークの使用コストが増加しているため、「スケーリングソリューション」の必要性が高まってきました。 スケーリングを達成するという目標の下で、異なるアプローチを用いた様々なソリューションが研究、テスト、および実装されています。 -スケーラビリティの取り組みにおける主な目標は、分散化やセキュリティを犠牲にすることなく、トランザクション速度の向上(ファイナリティ到達までの時間短縮)ならびにトランザクションスループットの向上(毎秒あたりの処理件数の向上)を実現することです(詳細については、[イーサリアムのビジョン](/roadmap/vision/)をご覧ください)。 レイヤー 1 のイーサリアムブロックチェーンでは、需要が増化するとトランザクションが遅延し、[ガス価格](/developers/docs/gas/)が高騰します。 イーサリアムが有意義かつ大規模に利用されるようになるためには、ネットワークの速度とスループットを改善することが不可欠です。 +スケーラビリティの取り組みにおける主な目標は、分散化やセキュリティを犠牲にすることなく、トランザクション速度の向上(ファイナリティ到達までの時間短縮)ならびにトランザクションスループットの向上(毎秒あたりの処理件数の向上)を実現することです(詳細については、[イーサリアムのビジョン](/roadmap/vision/)をご覧ください)。 レイヤー1のイーサリアムブロックチェーンでは、需要が増化するとトランザクションが遅延し、[ガス価格](/developers/docs/gas/)が高騰します。 イーサリアムが有意義かつ大規模に利用されるようになるためには、ネットワークの速度とスループットを改善することが不可欠です。 速度とスループットが重要である一方で、スケーリングのソリューションはこれらの目標を、分散化とセキュリティという特性を失わずに実現しなければなりません。 中央集権化およびセキュリティの低下を防ぐためには、どんなユーザーでもノードとして参加できるように参入障壁を低くしておくことが重要です。 @@ -21,95 +21,93 @@ sidebarDepth: 3 ## オンチェーンにおけるスケーリング {#on-chain-scaling} -この手法は、イーサリアムプロトコル(レイヤー 1 の[メインネット](/glossary/#mainnet))の変更を必要とします。 この手法によるスケーリングは、現在シャーディングが主流になっています。 +オンチェーンスケーリングでは、イーサリアムプロトコル(レイヤー1の[メインネット](/glossary/#mainnet))を変更する必要があります。 長い間、ブロックチェーンのシャーディングによってイーサリアムが拡張されると期待されていました。 シャーディングとは、ブロックチェーンを複数の部分(シャード)に分割する技術であり、バリデータのサブセットによって検証される予定でした。 しかし、主要なスケーリング技術として、レイヤー2ロールアップによるスケーリングが引き継がれており、 より安く新しいデータ形式を追加することでサポートされています。このデータ形式は、ユーザーにとってロールアップを安価にするために特別に設計されています。 ### シャーディング {#sharding} -シャーディングとは、負荷を分散するためにデータベースを水平的に分割するプロセスを指します。 イーサリアムにおけるシャーディングとは、「シャード」と呼ばれる新たなチェーンを作成することで、ネットワークの混雑を解消し、毎秒あたりのトランザクション数を増加させる手法を指します。 これにより、バリデータは、イーサリアムネットワーク全体に含まれるすべてのトランザクションを処理する必要がなくなるため、負荷が軽減されます。 - -[シャーディング](/upgrades/sharding/) について詳しく知る。 +シャーディングは、データベースを分割するプロセスです。 バリデータのサブセットは、イーサリアム全体を追跡するのではなく、個々のシャードに対して責任を持ちます。 シャーディングは、長い間、イーサリアムの[ロードマップ](/roadmap/)に記載されていました。また、かつては、プルーフ・オブ・ステークへ切り替わるマージの前にリリースされる予定でした。 しかし、[レイヤー2ロールアップ](#layer-2-scaling)の急速な開発と、[ダンクシャーディング](/roadmap/danksharding)(バリデータが非常に効率的に検証できるロールアップデータであるブロブをイーサリアムブロックに追加すること)の開発により、イーサリアムコミュニティの関心は、シャーディングによるスケーリングからロールアップ中心のスケーリングへとシフトしました。 これにより、イーサリアムのコンセンサスロジックは比較的シンプルに保たれることになりました。 ## オフチェーンにおけるスケーリング {#off-chain-scaling} -オフチェーンのスケーリングソリューションは、レイヤー 1 のメインネットとは別個に実装されるため、既存のイーサリアムプロトコルを変更する必要がありません。 「レイヤー 2」ソリューションと呼ばれる一部のソリューションでは、[オプティミスティックロールアップ](/developers/docs/scaling/optimistic-rollups/)、[ゼロ知識ロールアップ](/developers/docs/scaling/zk-rollups/)、あるいは[ステートチャンネル](/developers/docs/scaling/state-channels/)のように、セキュリティ保護につきレイヤー 1 のイーサリアムコンセンサスに依存するものもあります。 一方、[サイドチェーン](#sidechains)、[バリディアム](#validium)、あるいは[プラズマチェーン](#plasma)といったソリューションでは、メインネットとは別個にセキュリティを保証する様々な形式の新規チェーンを作成します。 後者のソリューションでは、メインネットとやりとりするものの、各ソリューションの目標に合わせて様々な方法でセキュリティを維持しようとします。 +オフチェーンのスケーリングソリューションは、レイヤー1のメインネットとは別個に実装されるため、既存のイーサリアムプロトコルを変更する必要がありません。 「レイヤー2」ソリューションと呼ばれる一部のソリューションでは、[オプティミスティックロールアップ](/developers/docs/scaling/optimistic-rollups/)、[ゼロ知識ロールアップ](/developers/docs/scaling/zk-rollups/)、[ステートチャンネル](/developers/docs/scaling/state-channels/)など、レイヤー1のイーサリアムコンセンサスに依存してセキュリティを保護するものもあります。 一方、[サイドチェーン](#sidechains)、[バリディアム](#validium)、あるいは[プラズマチェーン](#plasma)などのソリューションでは、メインネットとは別に、さまざまな形式の新規チェーンを作成してセキュリティを保証します。 これらのソリューションでは、メインネットとやり取りするものの、各ソリューションの目標に合わせて、セキュリティを維持する方法は異なります。 -### レイヤー 2 のスケーリング {#layer-2-scaling} +### レイヤー2のスケーリング {#layer-2-scaling} -オフチェーンのソリューションのうち、セキュリティをイーサリアムメインネットに依存するものをレイヤー 2 のスケーリングソリューションと呼びます。 +オフチェーンのソリューションのうち、セキュリティをイーサリアムメインネットに依存するものをレイヤー2のスケーリングソリューションと呼びます。 -レイヤー 2 とは、メインネットが提供する堅牢かつ分散型のセキュリティモデルを活用しつつ、イーサリアムメインネット(レイヤー 1)外でトランザクションを実行することでアプリケーションのスケーラビリティを実現しようとするソリューションの総称です。 ネットワークの混雑によりトランザクション速度が低下すると、一部の Dapp では優れたユーザー体験を提供できなくなります。 さらに、ネットワークが混雑すると、トランザクションの送信者が価格をつり上げることでガス価格が上昇します。 これにより、イーサリアムの使用コストが非常に高額になる可能性があります。 +レイヤー2とは、メインネットが提供する堅牢かつ分散型のセキュリティモデルを活用しつつ、イーサリアムメインネット(レイヤー1)外でトランザクションを実行することでアプリケーションのスケーラビリティを実現しようとするソリューションの総称です。 ネットワークの混雑によりトランザクション速度が低下すると、一部のDappでは優れたユーザー体験を提供できなくなります。 また、ネットワークが混雑すると、トランザクションの送信者がガス代を高く支払うようになります。そのため、ガス代が上昇し、 イーサリアムの使用コストが非常に高額になる可能性があります。 -大部分のレイヤー 2 ソリューションは、1 台または複数のサーバークラスタで構成され、各サーバーはノード、バリデータ、オペレーター、シーケンサー、ブロック生成者といった名称で呼ばれます。 これらのレイヤー 2 のノードは、実装により、ノードを使用する個人、企業、または組織が実行する場合、サードパーティ事業者が実行する場合、あるいは多数の個人が参加するグループが実行する場合(メインネットの場合と同様)があります。 トランザクションは通常、レイヤー 1(メインネット)に直接送信されるのではなく、これらのレイヤー 2 のノードに送信されます。 一部のソリューションでは、トランザクションは送信先のレイヤー 2 のインスタンスにおいてバッチとしてグループ化されてからレイヤー 1 に固定されるため、その後はレイヤー 1 において確定され、改変できなくなります。 このプロセスが具体的にどう実行されるかは、様々なレイヤー 2 のテクノロジー/実装により大きく異なります。 +ほとんどのレイヤー2ソリューションは、サーバーまたはサーバー群を中心に構成されており、それぞれのサーバーは、ノード、バリデータ、オペレーター、シーケンサー、ブロックプロデューサーなどと呼ばれています。 これらのレイヤー2ノードは、実装方法によって、利用する個人や企業、団体、サードパーティのオペレーター、大規模な個人のグループなどが運営する場合があります(メインネットと同様)。 通常、取引はレイヤー1(メインネット)に直接送信されるのではなく、レイヤー2のノードに送信されます。 ソリューションによっては、レイヤー2のインスタンスがトランザクションをグループ化してレイヤー1に固定します。その後、レイヤー1によって安全性が確保されると、それ以降は変更できなくなります。 このプロセスの具体的な実行方法は、レイヤー2のテクノロジーや実装によって大きく異なります。 -個別のレイヤー 2 インスタンスは、多くのアプリケーションに解放され、共有される場合と、特定のプロジェクトによりデプロイされ、関連アプリケーションのみを専用でサポートする場合があります。 +特定のレイヤー2インスタンスは、オープンで多くのアプリケーションが共有するものもあれば、1つのプロジェクトがデプロイし、そのアプリケーションのみをサポートするものもあります。 -#### レイヤー 2 が必要な理由 {#why-is-layer-2-needed} +#### レイヤー2が必要な理由 {#why-is-layer-2-needed} - 毎秒あたりのトランザクション数を増加させることで、ユーザー体験が向上し、イーサリアムメインネットの混雑を軽減できる。 -- 複数のトランザクションを 1 つのトランザクションにロールアップしてメインネットに送信するため、ガス代が軽減でき、イーサリアムの包摂性が高まり、すべての人が利用できるようになる。 -- スケーラビリティを実現するためのアップデートは、分散化やセキュリティを犠牲にしてはならないが、レイヤー 2 はイーサリアムの基盤に基づくネットワークである。 -- アプリケーションごとに特化されたレイヤー 2 のネットワークでは、大規模な資産を取り扱う際に独自の効率性アップが実現できる。 +- 複数のトランザクションを1つのトランザクションにロールアップしてメインネットに送信するため、ガス代が軽減でき、イーサリアムの包摂性が高まり、すべての人が利用できるようになる。 +- スケーラビリティを実現するためのアップデートは、分散化やセキュリティを犠牲にしてはならないが、レイヤー2はイーサリアムの基盤に基づくネットワークである。 +- アプリケーションごとに特化されたレイヤー2のネットワークでは、大規模な資産を取り扱う際に独自の効率性アップが実現できる。 -[レイヤー 2 の詳細](/layer-2/) +[レイヤー2の詳細](/layer-2/) #### ロールアップ {#rollups} -ロールアップとは、レイヤー 1 の外部でトランザクションを実行した上で、データをレイヤー 1 に送信し、そこでコンセンサスを得るという手段です。 トランザクションデータはレイヤー 1 のブロックに含まれるため、ロールアップの安全性はイーサリアムのネイティブセキュリティにより保証されます。 +ロールアップとは、レイヤー1の外部でトランザクションを実行し、データをレイヤー1に送信して、そこでコンセンサスを得るという手段です。 トランザクションデータはレイヤー1のブロックに含まれるため、ロールアップの安全性はイーサリアムのネイティブセキュリティにより保証されます。 -ロールアップには、異なるセキュリティモデルを採用した以下の 2 種類があります: +ロールアップには、異なるセキュリティモデルを採用した以下の2種類があります。 - **オプティミスティック・ロールアップ**: トランザクションはデフォルトで有効であると仮定し、チャレンジが提起された場合のみ[**不正証明**](/glossary/#fraud-proof)を通じて計算を実行します。 [オプティミスティック・ロールアップの詳細](/developers/docs/scaling/optimistic-rollups/)。 - **ゼロ知識ロールアップ**: オフチェーンで計算を実行し、[**有効性証明**](/glossary/#validity-proof)をチェーンに送信します。 [ゼロ知識ロールアップの詳細](/developers/docs/scaling/zk-rollups/)。 #### ステートチャンネル {#channels} -ステートチャネルでは、マルチシグのコントラクトを通じて、参加者はオフチェーンで迅速かつ自由に取引を行うことでき、その上でメインネット上でファイナリティを実現します。 これにより、ネットワークの混雑、手数料、および遅延を最小限に抑えることができます。 現在利用されているチャネルとしては、ステートチャネルとペイメントチャネルがあります。 +ステートチャンネルでは、マルチシグのコントラクトを通じて、参加者はオフチェーンで迅速かつ自由に取引を行うことでき、その上でメインネット上でファイナリティを実現します。 これにより、ネットワークの混雑、手数料、遅延を最小限に抑えることができます。 現在利用されているチャンネルは、ステートチャンネルとペイメントチャンネルの2つです。 -[ステートチャネル](/developers/docs/scaling/state-channels/)について詳しく知る。 +[ステートチャンネル](/developers/docs/scaling/state-channels/)の詳細 ### サイドチェーン {#sidechains} -サイドチェーンは、EVM 互換の独立したブロックチェーンであり、メインネットと並行して実行されます。 イーサリアムとの互換性は双方向ブリッジで実現され、トランザクションは独自に選択したコンセンサスルールとブロックパラメータに基づいて実行されます。 +サイドチェーンは、EVM互換の独立したブロックチェーンであり、メインネットと並行して実行されます。 イーサリアムとの互換性は双方向ブリッジで実現され、トランザクションは独自に選択したコンセンサスルールとブロックパラメータに基づいて実行されます。 -[サイドチェーン](/developers/docs/scaling/sidechains/)について詳しく知る。 +[サイドチェーン](/developers/docs/scaling/sidechains/)の詳細 ### プラズマ {#plasma} -プラズマチェーンとは、メインのイーサリアムチェーンにおいて固定された別個のブロックチェーンで、不正証明([オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups/)など)を用いて紛争を仲裁します。 +プラズマチェーンとは、メインのイーサリアムチェーンにおいて固定された別個のブロックチェーンで、不正証明([オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups/)など)を用いて紛争を仲裁します。 -[プラズマ](/developers/docs/scaling/plasma/)について詳しく知る。 +[プラズマ](/developers/docs/scaling/plasma/)の詳細 ### バリディアム {#validium} -バリディアムチェーンは、ゼロ知識ロールアップと同様に有効性証明を使用しますが、データはレイヤー 1 であるメインのイーサリアムチェーン上に保存されません。 これにより、バリディアムチェーンごとの毎秒あたりのトランザクション数は 1 万件に達し、複数のバリディアムチェーンを並行して実行することができます。 +バリディアムチェーンはゼロ知識ロールアップのように有効性証明を使用しますが、メインのレイヤー1イーサリアムチェーン上にデータを保存しません。 そのため、バリディアムチェーンごとに毎秒1万のトランザクションを処理でき、複数のチェーンを並列に実行できます。 -[バリディアム](/developers/docs/scaling/validium/)について詳しく知る。 +[バリディアム](/developers/docs/scaling/validium/)の詳細 -## 様々なスケーリングソリューションが求められる理由とは? {#why-do-we-need-these} +## さまざまなスケーリングソリューションが求められる理由 {#why-do-we-need-these} -- 様々なソリューションは、イーサリアムネットワークにおける各部分の全般的な混雑を緩和できるだけでなく、単一障害点の発生を防ぐために役立ちます。 -- 複数のソリューションは、その全体においてさらに効力を発揮します。 つまり、様々なソリューションが共存し、調和的に機能することで、トランザクションの速度/スループットを今後爆発的に向上させることが可能になります。 -- すべてのソリューションにおいてイーサリアムのコンセンサス・アルゴリズムを直接活用する必要があるわけではなく、様々な代替手段によりその他の方法では得にくいメリットを得ることができます。 +- さまざまなソリューションは、イーサリアムネットワーク全体の混雑を緩和するだけでなく、単一障害点の発生を防ぐためにも役立ちます。 +- 複数のソリューションは、その全体においてさらに効力を発揮します。 つまり、多様なソリューションが共存し、調和的に機能することで、トランザクションの速度やスループットを今後爆発的に向上させることが可能になります。 +- すべてのソリューションにおいてイーサリアムのコンセンサス・アルゴリズムを直接活用する必要があるわけではなく、さまざまな代替手段によりその他の方法では得にくいメリットを得ることができます。 - 特定のスケーリング・ソリューションが[イーサリアムのビジョン](/roadmap/vision/)を完全に満たすことは不可能です。 ## 映像で学びたい場合 {#visual-learner} -_この動画の説明では、「レイヤー 2」という用語をオフチェーンでのスケーリング・ソリューション全般を指すものとして使用していますが、本記事では、「レイヤー 2」につき、レイヤー 1(メインネット)のコンセンサスに依存してセキュリティを保護するオフチェーンソリューションを指す用語としてを用いています。_ +_この動画の説明では、「レイヤー2」という用語をオフチェーンでのスケーリング・ソリューション全般を指すものとして使用していますが、本記事では、、レイヤー1(メインネット)のコンセンサスに依存してセキュリティを保護するオフチェーンソリューションを指す用語として「レイヤー2」を用いています。_ ## 参考文献 {#further-reading} - [ロールアップを重視したイーサリアム・ロードマップ](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.eth.limo/general/2021/01/05/rollup.html) +- [イーサリアムのレイヤー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://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.eth.limo/general/2022/09/17/layer_3.html) +- [有意義なレイヤー3とはどのようなものか?](https://vitalik.ca/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 48f339a5ae8..f56eb9e4d15 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 @@ -4,13 +4,13 @@ description: イーサリアムにおけるスケーリングの問題に対す lang: ja --- -オプティミスティック・ロールアップは、イーサリアム(ベースレイヤー)のスループットを拡張するために設計されたレイヤー 2 (L2) プロトコルです。 トランザクションをオフチェーンで処理することで、イーサリアムメインネットの負荷を軽減するため、処理速度が大幅に改善されます。 オプティミスティック・ロールアップは、[サイドチェーン](/developers/docs/scaling/sidechains/)のような他のスケーリング・ソリューションとは異なり、トランザクションの結果をオンチェーンで公開することによってメインネットからセキュリティを引き出します。プラズマチェーンも、不正証明を使用してイーサリアム上で検証しますが、トランザクションのデータをイーサリアムに保存しない点が異なります。 +オプティミスティック・ロールアップは、イーサリアム(ベースレイヤー)のスループットを拡張するために設計されたレイヤー2 (L2) プロトコルです。 トランザクションをオフチェーンで処理することで、イーサリアムメインネットの負荷を軽減するため、処理速度が大幅に改善されます。 オプティミスティック・ロールアップは、[サイドチェーン](/developers/docs/scaling/sidechains/)のような他のスケーリング・ソリューションとは異なり、トランザクションの結果をオンチェーンで公開することによってメインネットからセキュリティを引き出します。プラズマチェーンも、不正証明を使用してイーサリアム上で検証しますが、トランザクションのデータをイーサリアムに保存しない点が異なります。 -イーサリアムにおける処理は、速度が遅く高価であるという欠点がありますが、オプティミスティック・ロールアップを用いることでスケーラビリティを 10〜100 倍向上させることができます。 さらに、トランザクションを`calldata`としてイーサリアムに書き込むため、ユーザーが負担するガス代を低く抑えることができます。 +イーサリアムにおける処理は、速度が遅く高価であるという欠点がありますが、オプティミスティック・ロールアップを用いることでスケーラビリティを10〜100倍向上させることができます。 さらに、トランザクションを`calldata`としてイーサリアムに書き込むため、ユーザーが負担するガス代を低く抑えることができます。 ## 前提知識 {#prerequisites} -[イーサリアムにおけるスケーリング](/developers/docs/scaling/)と[レイヤー 2](/layer-2/) のページを読み、理解しておくことをおすすめします。 +[イーサリアムにおけるスケーリング](/developers/docs/scaling/)と[レイヤー2](/layer-2/) のページを読み、理解しておくことをおすすめします。 ## オプティミスティック・ロールアップとは何か? {#what-is-an-optimistic-rollup} @@ -32,11 +32,11 @@ lang: ja オプティミスティック・ロールアップのアーキテクチャには、以下の構成要素が含まれています: -**オンチェーンのコントラクト**: オプティミスティック・ロールアップの動作は、イーサリアム上で実行されるスマートコントラクトにより制御されます。 具体的には、ロールアップされたブロックを保存するコントラクト、ロールアップの状態更新を監視するコントラクト、およびユーザーのデポジットを追跡するコントラクトが含まれます。 この意味で、イーサリアムは、オプティミスティック・ロールアップに対するベースレイヤー(つまり、「レイヤー 1」)であると言うことができます。 +**オンチェーンのコントラクト**: オプティミスティック・ロールアップの動作は、イーサリアム上で実行されるスマートコントラクトにより制御されます。 具体的には、ロールアップされたブロックを保存するコントラクト、ロールアップの状態更新を監視するコントラクト、およびユーザーのデポジットを追跡するコントラクトが含まれます。 この意味で、イーサリアムは、オプティミスティック・ロールアップに対するベースレイヤー(つまり、「レイヤー1」)であると言うことができます。 -**オフチェーンの仮想マシン(VM)**:オプティミスティック・ロールアップのプロトコルを管理するコントラクトはイーサリアム上で実行されますが、ロールアップのプロトコルにおける計算の実行と状態の保存は[イーサリアム仮想マシン](/developers/docs/evm/)とは別の仮想マシン上で行われます。 このオフチェーンの VM は、アプリケーションが稼働し、状態変更が実行される場所であるため、オプティミスティック・ロールアップにおける上位レイヤー(つまり、「レイヤー 2」)であると言えます。 +**オフチェーンの仮想マシン(VM)**:オプティミスティック・ロールアップのプロトコルを管理するコントラクトはイーサリアム上で実行されますが、ロールアップのプロトコルにおける計算の実行と状態の保存は[イーサリアム仮想マシン](/developers/docs/evm/)とは別の仮想マシン上で行われます。 このオフチェーンのVMは、アプリケーションが稼働し、状態変更が実行される場所であるため、オプティミスティック・ロールアップにおける上位レイヤー(つまり、「レイヤー2」)であると言えます。 -オプティミスティック・ロールアップは、イーサリアム仮想マシン(EVM)用に開発/コンパイルされたプログラムを実行するように設計されているため、オフチェーンの VM は EVM の設計仕様の多くを踏襲しています。 また、イーサリアムネットワークは、オンチェーンで計算された不正証明を用いて、オフチェーンの VM で計算された状態変更の有効性を強制することができます。 +オプティミスティック・ロールアップは、イーサリアム仮想マシン(EVM)用に開発/コンパイルされたプログラムを実行するように設計されているため、オフチェーンのVMはEVMの設計仕様の多くを踏襲しています。 また、イーサリアムネットワークは、オンチェーンで計算された不正証明を用いて、オフチェーンのVMで計算された状態変更の有効性を強制することができます。 オプティミスティック・ロールアップは、イーサリアムとは別個のプロトコルとして存在するものの、そのセキュリティ属性はイーサリアムに依存しているため、「ハイブリッド型のスケーリング・ソリューション」と呼ばれます。 特に、イーサリアムメインネットは、ロールアップにおけるオフチェーンでの計算の正しさと、この計算に用いられたデータの可用性を保証します。 このため、セキュリティをイーサリアムに依存しない、「純粋な」オフチェーンのスケーリング・プロトコル(例:[サイドチェーン](/developers/docs/scaling/sidechains/))と比較すると、オプティミスティック・ロールアップはよりセキュリティが堅牢であると言えます。 @@ -46,7 +46,7 @@ lang: ja すでに述べたように、オプティミスティック・ロールアップではトランザクションのデータを`calldata`としてイーサリアムに送信します。 ロールアップチェーンは送信されたトランザクションに基づき実行されるため、イーサリアムのベースレイヤーに含まれるコールデータの情報を用いて、どのユーザーでもロールアップのステートを実行し、状態遷移の正しさを検証することができます。 -[データ可用性](/developers/docs/data-availability/)が重要であるのは、状態データにアクセスできない場合、異議申立者はロールアップにおける無効な操作に異議を申し立てる上で必要な不正証明を作成できないためです。 イーサリアムがデータ可用性を保証するため、ロールアップのオペレータによる悪意の行動(例:無効なブロックの送信)が見過ごされる可能性が低くなります。 +[データ可用性](/developers/docs/data-availability/)が重要なのは、状態データにアクセスできないと、ロールアップにおける無効な操作に異議を申し立てる際に、必要な不正証明を作成することができたいからです。 イーサリアムがデータ可用性を保証するため、ロールアップのオペレータによる悪意の行動(例:無効なブロックの送信)が見過ごされる可能性が低くなります。 ### 検閲耐性 {#censorship-resistance} @@ -62,13 +62,13 @@ lang: ja - 各ユーザーは、トランザクションデータを用いて資金の所有権を証明するマークル証明を作成できるため、ロールアップから各自の資産を引き出すことができる。 -- 各ユーザーはさらに、トランザクションをシーケンサーに対してではなく、L1 に送信できる。この場合シーケンサーは、正当なブロックを引き続き作成するために、一定期間内に送信されたトランザクションをブロックに追加する必要がある。 +- 各ユーザーはさらに、トランザクションをシーケンサーに対してではなく、L1に送信できる。この場合シーケンサーは、正当なブロックを引き続き作成するために、一定期間内に送信されたトランザクションをブロックに追加する必要がある。 ### 決済 {#settlement} オプティミスティック・ロールアップにおいてイーサリアムが担うもう一つの役割は、決済レイヤーとしての役割です。 決済レイヤーとは、ブロックチェーンのエコシステム全体の基礎となり、セキュリティを提供すると同時に、他のチェーン(本トピックにおいては、オプティミスティック・ロールアップ)における仲裁が必要な紛争に対して、客観的なファイナリティを提供します。 -イーサリアムメインネットは、オプティミスティック・ロールアップにおいて不正証明を検証し、紛争を解消するハブの役割を担います。 さらに、ロールアップで実行されたトランザクションは、ロールアップのブロックがイーサリアム上で承認された*後*でなければ確定しません。 ロールアップのトランザクションは、イーサリアムのベースレイヤーで確定した後はロールバックできなくなります(チェーンの再編成というまれなケースを除く)。 +イーサリアムメインネットは、オプティミスティック・ロールアップにおいて不正証明を検証し、紛争を解消するハブの役割を担います。 さらに、ロールアップで実行されたトランザクションは、ロールアップのブロックがイーサリアム上で承認された_後_でなければ確定しません。 ロールアップのトランザクションは、イーサリアムのベースレイヤーで確定した後はロールバックできなくなります(チェーンの再編成というまれなケースを除く)。 ## オプティミスティック・ロールアップは、どのように実行されるのか? {#how-optimistic-rollups-work} @@ -80,7 +80,7 @@ lang: ja オプティミスティック・ロールアップチェーン上の他のバリデータは、当該ロールアップの状態に対する各自のコピーを用いて、送信されたトランザクションを実行することが求められます。 バリデータにおける最終的な状態がオペレーターが提案した状態と異なる場合、オペレーターは不正証明の計算を開始することでチャレンジを申し立てることができます。 -一部のオプティミスティック・ロールアップでは、パーミッションレスのバリデーター・システムを採用せず、単独の「シーケンサー」がチェーンを実行する場合もあります。 シーケンサーは、バリデータと同様に、トランザクションを処理し、ロールアップのブロックを作成した上で、ロールアップされたトランザクションを L1 チェーン(イーサリアムメインネット)に送信します。 +一部のオプティミスティック・ロールアップでは、パーミッションレスのバリデーター・システムを採用せず、単独の「シーケンサー」がチェーンを実行する場合もあります。 シーケンサーは、バリデータと同様に、トランザクションを処理し、ロールアップのブロックを作成した上で、ロールアップされたトランザクションをL1チェーン(イーサリアムメインネット)に送信します。 シーケンサーが通常のロールアップオペレーターと異なるのは、トランザクションの順序決定に対する権限がより大きいという点です。 さらに、シーケンサーはロールアップチェーンに対する優先アクセス権を持ち、オンチェーンのコントラクトにトランザクションを送信することができる唯一のエンティティとなります。 シーケンサー以外のノード、あるいは通常のユーザーが送信したトランザクションは、シーケンサーがそれらを新規バッチに追加するまでの間は、別個のインボックス上でキューに置かれた状態になります。 @@ -90,7 +90,7 @@ lang: ja `calldata`は、スマートコントラクトにおける変更不可で非永続的な領域であり、ほぼ[メモリ](/developers/docs/smart-contracts/anatomy/#memory)と同様に動作します。 `calldata`は、ブロックチェーンの[履歴ログ](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs)の一部としてオンチェーンで永続する一方で、イーサリアムの状態の一部としては保存されません。 `calldata`はイーサリアムの状態にまったく干渉しないので、オンチェーンでのデータ保存に伴う費用が安価になります。 -さらに、`calldata`のキーワードは、スマートコントラクトの実行時に Solidity 上の関数に引数を渡す際にも用いられます。 `calldata`は、トランザクションにおいて呼び出された関数を特定し、この関数に対する入力を任意のバイト列として保持します。 +さらに、`calldata`のキーワードは、スマートコントラクトの実行時にSolidity上の関数に引数を渡す際にも用いられます。 `calldata`は、トランザクションにおいて呼び出された関数を特定し、この関数に対する入力を任意のバイト列として保持します。 オプティミスティック・ロールアップにおける`calldata`は、オンチェーンのコントラクトにトランザクションの圧縮データを送信するために使用されます。 ロールアップのオペレーターは、ロールアップのコントラクトに含まれる必須の関数を呼び出し、関数の引数として圧縮データを渡す方法によって新規バッチを追加します。 ロールアップに伴うコストの大部分はオンチェーン上でのデータ保存に伴うものであるため、`calldata`の使用はユーザーの手数料を軽減します。 @@ -102,7 +102,7 @@ lang: ja オペレーターは、バッチ送信時において、新旧両方のステートルートを送信する必要があります。 古い方のステートルートがオンチェーンのコントラクトにおける既存のステートルートと一致する場合、既存のステートルートを破棄し、新しいステートルートで置き換えます。 -ロールアップのオペレーターはさらに、トランザクションバッチ自体のマークルルートに対してもコミットする必要があります。 これにより、どのユーザーも、[マークル証明](/developers/tutorials/merkle-proofs-for-offline-data-integrity/)を提示することで L1 上のバッチに当該トランザクションが追加されていることを証明することができます。 +ロールアップのオペレーターはさらに、トランザクションバッチ自体のマークルルートに対してもコミットする必要があります。 これにより、どのユーザーも、[マークル証明](/developers/tutorials/merkle-proofs-for-offline-data-integrity/)を提示することでL1上のバッチに当該トランザクションが追加されていることを証明することができます。 状態へのコミットメントは、特にステートルートの場合、オプティミスティック・ロールアップにおける状態遷移の正しさを証明するために必要です。 ロールアップのコントラクトは、オペレーターから送信された時点で新規のステートルートを受け入れますが、無効なステートルートを事後に削除し、ロールアップを正しい状態に復元することが可能です。 @@ -112,67 +112,67 @@ lang: ja アサーションに対して異議が申し立てられると、ロールアップ・プロトコルにより不正証明の計算が開始されます。 不正証明はその種類を問わず双方向性のやりとりを要するため、異議を申し立てるにはまず他のユーザーがアサーションを送信していなければなりません。 不正証明における各アプローチの違いは、その計算を行うにあたり何回のやりとりが必要とされるかです。 -1 回のやりとりを要求する証明スキームでは、異議申立の対象であるトランザクションを L1 上で再生し、無効なアサーションを検出します。 ロールアップのプロトコルでは、異議申立の対象であるトランザクションに対する L1(イーサリアムメインネット)上での再実行につき、検証者のコントラクトを用いてエミュレートし、計算されたステートルートによりこの異議申立における勝者を決定します。 異議申立者によるロールアップの正しい状態についての主張が認められた場合、オペレーターに対してはボンドの没収(スラッシング)によるペナルティが科せられます。 +1回のやりとりを要求する証明スキームでは、異議申立の対象であるトランザクションをL1上で再生し、無効なアサーションを検出します。 ロールアップのプロトコルでは、異議申立の対象であるトランザクションに対するL1(イーサリアムメインネット)上での再実行につき、検証者のコントラクトを用いてエミュレートし、計算されたステートルートによりこの異議申立における勝者を決定します。 異議申立者によるロールアップの正しい状態についての主張が認められた場合、オペレーターに対してはボンドの没収(スラッシング)によるペナルティが科せられます。 -ただし、不正検出のために L1 上でトランザクションを再実行するには、個別トランザクションに対する状態コミットメントを公開しなければならないため、ロールアップがオンチェーン上で公開しなければならないデータ量が増加します。 さらに、トランザクションの再実行はかなりのガス代を伴います。 これらの理由により、オプティミスティック・ロールアップでは複数回にわたるやりとりを通じた証明に移行中であり、これにより、無効なロールアップ操作を検出するという同じ目的をより効率的に実現できるようになるでしょう。 +ただし、不正検出のためにL1上でトランザクションを再実行するには、個別トランザクションに対する状態コミットメントを公開しなければならないため、ロールアップがオンチェーン上で公開しなければならないデータ量が増加します。 さらに、トランザクションの再実行はかなりのガス代を伴います。 これらの理由により、オプティミスティック・ロールアップでは複数回にわたるやりとりを通じた証明に移行中であり、これにより、無効なロールアップ操作を検出するという同じ目的をより効率的に実現できるようになるでしょう。 #### 複数回のやりとりによる証明 {#multi-round-interactive-proving} -複数回のやりとりによる証明では、L1 上の検証者コントラクトがアサーター/チャレンジャー間のやりとりのプロトコルを監視し、このコントラクトが最終的に虚偽のユーザーを決定します。 L2 上のノードが特定のアサーションに対してチャレンジを行うと、このアサーションを行ったアサーターは、異議申立のアサーションを二等分しなければなりません。 これにより、二等分されたアサーションは、それぞれがもう一方のアサーションと同数の計算ステップを含むことになります。 +複数回のやりとりによる証明では、L1上の検証者コントラクトがアサーター/チャレンジャー間のやりとりのプロトコルを監視し、このコントラクトが最終的に虚偽のユーザーを決定します。 L2上のノードが特定のアサーションに対してチャレンジを行うと、このアサーションを行ったアサーターは、異議申立のアサーションを二等分しなければなりません。 これにより、二等分されたアサーションは、それぞれがもう一方のアサーションと同数の計算ステップを含むことになります。 -次にチャレンジャーが、どちらのアサーションに異議を申し立てるかを選択します。 この分割プロセス(「二分割プロトコル」と呼ぶ)は、両当事者による紛争の対象が*単独の*実行ステップに対するアサーションになるまで継続されます。 対象が単独の実行ステップになった時点で、L1 上のコントラクトが不正な当事者を発見するための命令(および結果)を判定し、紛争が解決されます。 +次にチャレンジャーが、どちらのアサーションに異議を申し立てるかを選択します。 この分割プロセス(「二分割プロトコル」と呼ぶ)は、両当事者による紛争の対象が_単独の_実行ステップに対するアサーションになるまで継続されます。 対象が単独の実行ステップになった時点で、L1上のコントラクトが不正な当事者を発見するための命令(および結果)を判定し、紛争が解決されます。 -アサーターは、紛争の対象であるシングルステップ計算の正当性を証明するための「ワンステップ証明」を提供しなければなりません。 アサーターがこのワンステップ証明を提供できない場合、あるいは L1 上の検証者により当該証明が無効であると判定された場合、アサーターの申立は棄却されます。 +アサーターは、紛争の対象であるシングルステップ計算の正当性を証明するための「ワンステップ証明」を提供しなければなりません。 アサーターがこのワンステップ証明を提供できない場合、あるいはL1上の検証者により当該証明が無効であると判定された場合、アサーターの申立は棄却されます。 この種類の不正証明に関する注記: -1. 複数回のやりとりによる不正証明は、L1 チェーン上における紛争仲裁の作業量を最小化できるために効率的だと考えられています。 L1 チェーン上では、トランザクション全体を再生する必要はなく、ロールアップ実行における特定のステップのみを再実行すればよいからです。 +1. 複数回のやりとりによる不正証明は、L1チェーン上における紛争仲裁の作業量を最小化できるために効率的だと考えられています。 L1チェーン上では、トランザクション全体を再生する必要はなく、ロールアップ実行における特定のステップのみを再実行すればよいからです。 -2. 二分割プロトコルは、オンチェーンに送信するデータ量を軽減します(トランザクションごとに状態コミットメントを送信する必要がないためです)。 さらに、オプティミスティック・ロールアップのトランザクションは、イーサリアムのガス上限による制限を受けません。 反対にトランザクションを再実行するオプティミスティック・ロールアップの場合は、イーサリアムメインネット上の 1 回のトランザクションで実行をエミュレートできるように、L2 のトランザクションにおいてガス上限がより低く設定されていることを確認する必要があります。 +2. 二分割プロトコルは、オンチェーンに送信するデータ量を軽減します(トランザクションごとに状態コミットメントを送信する必要がないためです)。 さらに、オプティミスティック・ロールアップのトランザクションは、イーサリアムのガス上限による制限を受けません。 反対にトランザクションを再実行するオプティミスティック・ロールアップの場合は、イーサリアムメインネット上の1回のトランザクションで実行をエミュレートできるように、L2のトランザクションにおいてガス上限がより低く設定されていることを確認する必要があります。 -3. 悪意のアサーターが提供したボンドの一部はチャレンジャーに付与され、残りはバーンされます。 残余のボンドをバーンすることで、バリデータ間の共謀を防ぐことができます。2 名のバリデータが共謀して虚偽のチャレンジを開始した場合、彼らがステーキングした資産のうちかなりの部分が没収されるからです。 +3. 悪意のアサーターが提供したボンドの一部はチャレンジャーに付与され、残りはバーンされます。 残余のボンドをバーンすることで、バリデータ間の共謀を防ぐことができます。2名のバリデータが共謀して虚偽のチャレンジを開始した場合、彼らがステーキングした資産のうちかなりの部分が没収されるからです。 4. 複数回のやりとりによる証明では、アサーターとチャレンジャーの両者は指定された期間内にアクションを実行する必要があります。 期限までにアクションを実行しない場合、不履行の当事者の主張が退けられます。 #### オプティミスティック・ロールアップにおいて不正証明が重要である理由 {#fraud-proof-benefits} -不正証明は、オプティミスティック・ロールアップにおいて*トラストレスなファイナリティ*を強化する上で重要です。 トラストレスなファイナリティとは、有効なトランザクションは最終的に承認されるというオプティミスティック・ロールアップの特性を指す概念です。 +不正証明は、オプティミスティック・ロールアップにおいて_トラストレスなファイナリティ_を強化する上で重要です。 トラストレスなファイナリティとは、有効なトランザクションは最終的に承認されるというオプティミスティック・ロールアップの特性を指す概念です。 悪意のノードは、正当なロールアップブロックに対して、虚偽のチャレンジを開始することでその正当性確認を遅延させることができます。 しかし最終的に、不正証明によりロールアップブロックの正当性が証明され、有効化されます。 -この点は同時に、正直なノードが少なくとも*1 つ*存在しなければロールアップチェーンの正当性を保持できないという、オプティミスティック・ロールアップにおけるもう一つのセキュリティ特性に関連しています。 正直なノードは、有効なアサーションを送信するか、無効なアサーションに対して異議申立を行うことで、チェーンを適切に前進させることができます。 いずれの場合でも、正直なノードに対して異議を申し立てる悪意のノードは、不正証明プロセスを通じてステークを失うことになります。 +この点は同時に、正直なノードが少なくとも_1つ_存在しなければロールアップチェーンの正当性を保持できないという、オプティミスティック・ロールアップにおけるもう一つのセキュリティ特性に関連しています。 正直なノードは、有効なアサーションを送信するか、無効なアサーションに対して異議申立を行うことで、チェーンを適切に前進させることができます。 いずれの場合でも、正直なノードに対して異議を申し立てる悪意のノードは、不正証明プロセスを通じてステークを失うことになります。 -### L1 と L2 の相互運用性 {#l1-l2-interoperability} +### L1とL2の相互運用性 {#l1-l2-interoperability} -オプティミスティック・ロールアップは、イーサリアムメインネットとの相互運用性を念頭において開発されており、ユーザーはメッセージや任意のデータを L1/L2 間でやりとりできます。 また、EVM との互換性も提供されるため、既存の[Dapp](/developers/docs/dapps/)をオプティミスティック・ロールアップに移植したり、イーサリアム開発ツールを用いて新規の Dapp を開発することができます。 +オプティミスティック・ロールアップは、イーサリアムメインネットとの相互運用性を念頭において開発されており、ユーザーはメッセージや任意のデータをL1/L2間でやりとりできます。 また、EVMとの互換性も提供されるため、既存の[Dapp](/developers/docs/dapps/)をオプティミスティック・ロールアップに移植したり、イーサリアム開発ツールを用いて新規のDappを開発することができます。 #### 1. 資産の移動 {#asset-movement} ##### ロールアップに参加する -オプティミスティック・ロールアップの利用を開始するには、当該ロールアップの L1 上の[ブリッジ](/developers/docs/bridges/)コントラクトに対して、ETH、ERC-20 トークン、あるいはその他の受け入れ可能な資産を入金します。 このブリッジコントラクトは、当該トランザクションを L2 にリレーし、L2 において同価値の資産をミントした上で、ユーザーがオプティミスティック・ロールアップで指定したアドレスにその資産を送信します。 +オプティミスティック・ロールアップの利用を開始するには、当該ロールアップのL1上の[ブリッジ](/developers/docs/bridges/)コントラクトに対して、ETH、ERC-20トークン、あるいはその他の受け入れ可能な資産を入金します。 このブリッジコントラクトは、当該トランザクションをL2にリレーし、L2において同価値の資産をミントした上で、ユーザーがオプティミスティック・ロールアップで指定したアドレスにその資産を送信します。 -ユーザーが作成したトランザクション(L1 から L2 への入金など)は通常、シーケンサーがロールアップのコントラクトに再提出するまではキュー上で保留されます。 ただし、検閲耐性を維持するために、キュー保留の上限期間を超えて遅延した場合は、トランザクションをオンチェーンのロールアップコントラクトに直接送信することが認められています。 +ユーザーが作成したトランザクション(L1からL2への入金など)は通常、シーケンサーがロールアップのコントラクトに再提出するまではキュー上で保留されます。 ただし、検閲耐性を維持するために、キュー保留の上限期間を超えて遅延した場合は、トランザクションをオンチェーンのロールアップコントラクトに直接送信することが認められています。 -一部のオプティミスティック・ロールアップでは、シーケンサーによるユーザーの検閲を防止するためにより明確なアプローチが採用されています。 このアプローチを採用したロールアップでは、ロールアップチェーン上で処理されたトランザクションに加えて、直前のブロック(例:入金)以降に L1 上のコントラクトに送信されたすべてのトランザクションにより、ブロックが定義されます。 シーケンサーが L1 上のトランザクションを無視する場合、(おそらく)正しくないステートルートを公開することになるため、シーケンサーは、ユーザーが作成したメッセージを L1 に送信した以降にこれを遅延することが不可能になります。 +一部のオプティミスティック・ロールアップでは、シーケンサーによるユーザーの検閲を防止するためにより明確なアプローチが採用されています。 このアプローチを採用したロールアップでは、ロールアップチェーン上で処理されたトランザクションに加えて、直前のブロック(例:入金)以降にL1上のコントラクトに送信されたすべてのトランザクションにより、ブロックが定義されます。 シーケンサーがL1上のトランザクションを無視する場合、(おそらく)正しくないステートルートを公開することになるため、シーケンサーは、ユーザーが作成したメッセージをL1に送信した以降にこれを遅延することが不可能になります。 ##### ロールアップから出金する -不正証明スキームが存在するため、オプティミスティック・ロールアップからイーサリアムに出金するプロセスはより複雑になっています。 L1 にエスクローされた資金を引き出すために L2 から L1 へのトランザクションを開始する場合、ユーザーは約 7 日間のチャレンジ期間が経過するのを待つ必要があります。 それ以外の点では、出金プロセス自体は非常にシンプルです。 +不正証明スキームが存在するため、オプティミスティック・ロールアップからイーサリアムに出金するプロセスはより複雑になっています。 L1にエスクローされた資金を引き出すためにL2からL1へのトランザクションを開始する場合、ユーザーは約7日間のチャレンジ期間が経過するのを待つ必要があります。 それ以外の点では、出金プロセス自体は非常にシンプルです。 -L2 上のロールアップで出金リクエストを開始すると、当該トランザクションが次のバッチに追加され、ロールアップ上のユーザー資産がバーンされます。 このバッチがイーサリアム上で公開されると、ユーザーは、ブロックに出金トランザクションが含まれることを証明するマークル証明を計算できるようになります。 その上で、遅延期間の終了と共に、L1 上でトランザクションが確定し、メインネットに資金を移動させることができます。 +L2上のロールアップで出金リクエストを開始すると、当該トランザクションが次のバッチに追加され、ロールアップ上のユーザー資産がバーンされます。 このバッチがイーサリアム上で公開されると、ユーザーは、ブロックに出金トランザクションが含まれることを証明するマークル証明を計算できるようになります。 その上で、遅延期間の終了と共に、L1上でトランザクションが確定し、メインネットに資金を移動させることができます。 -イーサリアムメインネットへの出金において要求される 1 週間の待機期間を回避するために、オプティミスティック・ロールアップのユーザーは**流動性プロバイダー**(LP)を利用することもできます。 流動性プロバイダーとは、手数料を代価として、保留されている L2 からの出金に対して所有権を引き継ぎ、L1 上でユーザーに資金を提供するサービスです。 +イーサリアムメインネットへの出金において要求される1週間の待機期間を回避するために、オプティミスティック・ロールアップのユーザーは**流動性プロバイダー**(LP)を利用することもできます。 流動性プロバイダーとは、手数料を代価として、保留されているL2からの出金に対して所有権を引き継ぎ、L1上でユーザーに資金を提供するサービスです。 流動性プロバイダーは、自ら当該チェーンを実行してユーザーの出金リクエストの正当性を確認した上で、資金を提供します。 これにより、流動性プロバイダーはこのトランザクションが最終的には承認されるとの保証(つまり、トラストレスなファイナリティ)を得ることができます。 -#### 2. EVM との互換性 {#evm-compatibility} +#### 2. EVMとの互換性 {#evm-compatibility} -デベロッパーにとってのオプティミスティック・ロールアップの優位性は、[イーサリアム仮想マシン(EVM)](/developers/docs/evm/)との互換性、あるいは等価性にあります。 EVM 互換のロールアップは、[イーサリアム・イエローペーパー](https://ethereum.github.io/yellowpaper/paper.pdf)の仕様に準拠しており、バイトコードの水準で EVM をサポートします。 +デベロッパーにとってのオプティミスティック・ロールアップの優位性は、[イーサリアム仮想マシン(EVM)](/developers/docs/evm/)との互換性、あるいは等価性にあります。 EVM互換のロールアップは、[イーサリアム・イエローペーパー](https://ethereum.github.io/yellowpaper/paper.pdf)の仕様に準拠しており、バイトコードの水準でEVMをサポートします。 -オプティミスティック・ロールアップの EVM 互換性は、次のような利点を持ちます: +オプティミスティック・ロールアップのEVM互換性は、次のような利点を持ちます: -i. デベロッパーは、イーサリアム上の既存のスマートコントラクトにつき、コードベースを大幅に修正せずにオプティミスティック・ロールアップのチェーンに移植できます。 これにより、イーサリアムのスマートコントラクトを L2 上でデプロイする時間を節約できます。 +i. デベロッパーは、イーサリアム上の既存のスマートコントラクトにつき、コードベースを大幅に修正せずにオプティミスティック・ロールアップのチェーンに移植できます。 これにより、イーサリアムのスマートコントラクトをL2上でデプロイする時間を節約できます。 ii. オプティミスティック・ロールアップを使用するデベロッパーやプロジェクトチームは、イーサリアムメインネットのインフラを活用できます。 具体的には、プログラム言語、コードライブラリ、テストツール、クライアントソフトウェア、デプロイ用のインフラなどが活用できます。 @@ -180,78 +180,78 @@ ii. オプティミスティック・ロールアップを使用するデベロ #### 3. クロスチェーンにおけるコントラクトの呼び出し {#cross-chain-contract-calls} -ユーザー(外部所有アカウント)が L2 上のコントラクトとやりとりを行うには、ロールアップ上のコントラクトにトランザクションを送信するか、あるいはこの作業をシーケンサーまたはバリデータに委任する必要があります。 オプティミスティック・ロールアップの場合はさらに、L1/L2 間のメッセージのリレーやデータの受け渡しにブリッジコントラクトを使用して、L2 上のコントラクトとのやりとりを行えます。 つまり、イーサリアムメインネット上の L1 コントラクトにおいて、L2 のオプティミスティック・ロールアップ上のコントラクトに含まれる機能を呼び出せるようにプログラムすることが可能です。 +ユーザー(外部所有アカウント)がL2上のコントラクトとやりとりを行うには、ロールアップ上のコントラクトにトランザクションを送信するか、あるいはこの作業をシーケンサーまたはバリデータに委任する必要があります。 オプティミスティック・ロールアップの場合はさらに、L1/L2間のメッセージのリレーやデータの受け渡しにブリッジコントラクトを使用して、L2上のコントラクトとのやりとりを行えます。 つまり、イーサリアムメインネット上のL1コントラクトにおいて、L2のオプティミスティック・ロールアップ上のコントラクトに含まれる機能を呼び出せるようにプログラムすることが可能です。 -このようなクロスチェーンのコントラクトでは、呼び出しが非同期で実行されます。つまり、呼び出しと実行の間に一定の時間が経過します。 この点は、呼び出された時点でただちに実行されるイーサリアム上の 2 つのコントラクト間の呼び出しとは異なります。 +このようなクロスチェーンのコントラクトでは、呼び出しが非同期で実行されます。つまり、呼び出しと実行の間に一定の時間が経過します。 この点は、呼び出された時点でただちに実行されるイーサリアム上の2つのコントラクト間の呼び出しとは異なります。 -クロスチェーンのコントラクト呼び出しの例としては、上述したトークンの入金が挙げられます。 L1 上のコントラクトは、ユーザーのトークンをエスクローすると共に、L2 の対応したコントラクトに対して、ロールアップ上で同額のトークンをミントするように指示するメッセージを送信します。 +クロスチェーンのコントラクト呼び出しの例としては、上述したトークンの入金が挙げられます。 L1上のコントラクトは、ユーザーのトークンをエスクローすると共に、L2の対応したコントラクトに対して、ロールアップ上で同額のトークンをミントするように指示するメッセージを送信します。 -クロスチェーンのメッセージ呼び出しはコントラクトの実行を伴いますが、通常は、計算に伴い発生する[ガス代](/developers/docs/gas/)は送信元が負担する必要があります。 ターゲットのチェーンにおいてトランザクションが失敗するのを防ぐために、ガス代の上限を高く設定することが推奨されます。 この点については、トークンをブリッジングするシナリオを想起すればよいでしょう。トランザクションにおける L1 側の作業(トークンの入金)がうまく行っても、L2 側の作業(新規トークンのミント)がガス代不足により実行されなければ、入金した資産は回収不能になります。 +クロスチェーンのメッセージ呼び出しはコントラクトの実行を伴いますが、通常は、計算に伴い発生する[ガス代](/developers/docs/gas/)は送信元が負担する必要があります。 ターゲットのチェーンにおいてトランザクションが失敗するのを防ぐために、ガス代の上限を高く設定することが推奨されます。 この点については、トークンをブリッジングするシナリオを想起すればよいでしょう。トランザクションにおけるL1側の作業(トークンの入金)がうまく行っても、L2側の作業(新規トークンのミント)がガス代不足により実行されなければ、入金した資産は回収不能になります。 -最後に、複数のコントラクト間における L2 から L1 へのメッセージ呼び出しにおいては、遅延の発生を考慮する必要があります(L1 から L2 への呼び出しは、通常数分後に実行されます)。 オプティミスティック・ロールアップからメインネットに送信されるメッセージは、チャレンジ期間が経過するまで実行できないためです。 +最後に、複数のコントラクト間におけるL2からL1へのメッセージ呼び出しにおいては、遅延の発生を考慮する必要があります(L1からL2への呼び出しは、通常数分後に実行されます)。 オプティミスティック・ロールアップからメインネットに送信されるメッセージは、チャレンジ期間が経過するまで実行できないためです。 ## オプティミスティック・ロールアップにおける手数料の仕組み {#how-do-optimistic-rollup-fees-work} -オプティミスティック・ロールアップでは、トランザクション 1 件ごとのユーザー手数料を表示するために、イーサリアムとほぼ同様のガス料金スキームを採用しています。 オプティミスティック・ロールアップで請求される手数料は、以下の要素により決定されます: +オプティミスティック・ロールアップでは、トランザクション1件ごとのユーザー手数料を表示するために、イーサリアムとほぼ同様のガス料金スキームを採用しています。 オプティミスティック・ロールアップで請求される手数料は、以下の要素により決定されます: -1. **状態の書き込み**: オプティミスティック・ロールアップでは、トランザクションデータおよびブロックヘッダー(直前のブロックにおけるヘッダーハッシュ、ステートルート、およびバッチルート)を、`calldata`としてイーサリアムメインネットに送信します。 イーサリアムにおけるトランザクション 1 件の最低コストは 21,000 ガスです。 オプティミスティック・ロールアップでは、複数のトランザクションを 1 つのブロックにバッチ化することで、L1 にトランザクションを書き込む費用を軽減しています(これにより、21,000 ガスを複数のユーザートランザクションで分割することができます)。 +1. **状態の書き込み**: オプティミスティック・ロールアップでは、トランザクションデータおよびブロックヘッダー(直前のブロックにおけるヘッダーハッシュ、ステートルート、およびバッチルート)を、`calldata`としてイーサリアムメインネットに送信します。 イーサリアムにおけるトランザクション1件の最低コストは21,000ガスです。 オプティミスティック・ロールアップでは、複数のトランザクションを1つのブロックにバッチ化することで、L1にトランザクションを書き込む費用を軽減しています(これにより、21,000ガスを複数のユーザートランザクションで分割することができます)。 -2. **`calldata`**:基本的なトランザクション料金を越える費用については、個別の状態書き込みにおける費用は L1 に送信される`calldata`のサイズで決定されます。 現在、`calldata`の費用は[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)によって管理されています。`calldata`がゼロバイト以上であれば 16 ガス、ゼロバイトの場合は 4 ガスの費用が発生します。 ロールアップ事業者は、ユーザー手数料を軽減するためにトランザクションデータを圧縮し、イーサリアムに送信される`calldata`のバイト数を減らしています。 +2. **`calldata`**:基本的なトランザクション料金を越える費用については、個別の状態書き込みにおける費用はL1に送信される`calldata`のサイズで決定されます。 現在、`calldata`の費用は[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)によって管理されています。`calldata`がゼロバイト以上であれば16ガス、ゼロバイトの場合は4ガスの費用が発生します。 ロールアップ事業者は、ユーザー手数料を軽減するためにトランザクションデータを圧縮し、イーサリアムに送信される`calldata`のバイト数を減らしています。 -3. **L2 オペレーターに対する手数料**: これは、イーサリアムにおけるマイナー手数料と同様に、トランザクション処理において発生する計算コストの代価としてロールアップのノードに支払われる報酬です。 L2 は処理能力が比較的高く、イーサリアムの場合のようにネットワークの混雑によりマイナーが高額な手数料を伴うトランザクションを優先的に処理するという状況が発生していないため、ロールアップのノードが請求するトランザクション手数料は比較的安価になっています。 +3. **L2オペレーターに対する手数料**: イーサリアムにおけるガス代と同様に、トランザクション処理において発生する計算コストの代価としてロールアップのノードに支払われる報酬です。 L2は処理能力が比較的高く、イーサリアムの場合のようにネットワークの混雑によりバリデータが高額な手数料を伴うトランザクションを優先的に処理するという状況が発生していないため、ロールアップのノードが請求するトランザクション手数料は比較的安価になっています。 -オプティミスティック・ロールアップにおいてユーザー手数料を引き下げるために導入されているメカニズムとしては、トランザクションのバッチ処理や、データ公開コストを軽減するための`calldata`の圧縮などがあります。 [L2 手数料トラッカー](https://l2fees.info/)を使えば、イーサリアムベースのオプティミスティック・ロールアップで発生する使用手数料をリアルタイムで確認できます。 +オプティミスティック・ロールアップにおいてユーザー手数料を引き下げるために導入されているメカニズムとしては、トランザクションのバッチ処理や、データ公開コストを軽減するための`calldata`の圧縮などがあります。 [L2手数料トラッカー](https://l2fees.info/)を使えば、イーサリアムベースのオプティミスティック・ロールアップで発生する使用手数料をリアルタイムで確認できます。 ## オプティミスティック・ロールアップは、どのようにイーサリアムのスケーラビリティを向上させるのか? {#scaling-ethereum-with-optimistic-rollups} 上述したように、オプティミスティック・ロールアップでは、圧縮したトランザクションデータをイーサリアムに送信して公開することで、データの可用性を保証します。 オンチェーン上で圧縮データを公開する機能は、オプティミスティック・ロールアップを通じてイーサリアムのスループットを拡大させる上で不可欠なものです。 -メインのイーサリアムチェーンは、各ブロックが保持できるデータ量に制限があり、これはガス単位で表示されます([平均のブロックサイズ](/developers/docs/blocks/#block-size)は 1,500 万ガスです)。 これは、各トランザクションにおいて使用できるガスに上限があることを意味すると同時に、トランザクションデータの圧縮によりブロックごとに処理されるトランザクションの数を増やし、直接的にスケーラビリティを向上させられることを意味します。 +メインのイーサリアムチェーンは、各ブロックが保持できるデータ量に制限があり、これはガス単位で表示されます([平均のブロックサイズ](/developers/docs/blocks/#block-size)は1,500万ガスです)。 これは、各トランザクションにおいて使用できるガスに上限があることを意味すると同時に、トランザクションデータの圧縮によりブロックごとに処理されるトランザクションの数を増やし、直接的にスケーラビリティを向上させられることを意味します。 -オプティミスティック・ロールアップでは、トランザクションデータを圧縮し、TPS レートを向上させる上で、いくつかの手法を用いています。 例えば この[記事](https://vitalik.eth.limo/general/2021/01/05/rollup.html)では、メインネット上の基本的なユーザートランザクション (Ether の送信)で生成されるデータ量と、ロールアップ上で同一のトランザクションが生成するデータ量を比較しています: +オプティミスティック・ロールアップでは、トランザクションデータを圧縮し、TPSレートを向上させる上で、いくつかの手法を用いています。 例えば この[記事](https://vitalik.ca/general/2021/01/05/rollup.html)では、メインネット上の基本的なユーザートランザクション (Etherの送信)で生成されるデータ量と、ロールアップ上で同一のトランザクションが生成するデータ量を比較しています: -| パラメータ | イーサリアム (L1) | ロールアップ (L2) | -| ---------- | ----------------- | ----------------- | -| ノンス | 〜3 | 0 | -| ガス価格 | 〜8 | 0 ~ 0.5 | -| ガス | 3 | 0 ~ 0.5 | -| To | 21 | 4 | -| 値 | 9 | 約 3 | -| 署名 | 〜68(2+33+33) | 〜0.5 | -| From | 0(署名から復元) | 4 | -| **合計** | **約 112 バイト** | **約 12 バイト** | +| パラメータ | イーサリアム (L1) | ロールアップ (L2) | +| ------ | ------------ | ----------- | +| ノンス | 〜3 | 0 | +| ガス価格 | 〜8 | 0~0.5 | +| ガス | 3 | 0~0.5 | +| To | 21 | 4 | +| 値 | 9 | 約3 | +| 署名 | 〜68(2+33+33) | 〜0.5 | +| From | 0(署名から復元) | 4 | +| **合計** | **約112バイト** | **約12バイト** | これらの数値を基にした大まかな計算により、オプティミスティック・ロールアップがどの程度スケーラビリティに貢献するのかを知ることができます: -1. 各ブロックのターゲットサーイズは 1,500 万ガスで、1 バイトのデータ検証には 16 ガスが必要です。 平均ブロックサイズを 16 ガスで割ると (15,000,000/16) 、平均サイズのブロックは**937,500 バイトのデータを保持できる**ことになります。 -2. ロールアップにおける基本的なトランザクションが 12 バイトを使用する場合、イーサリアムの平均的なブロックは**78,125 件のロールアップ・トランザクション**あるいは**39 件のロールアップバッチ**(各バッチが平均 2,000 件のトランザクションを持つ場合)を処理できます。 -3. イーサリアムで 15 秒ごとに新しいブロックが生成されるとすると、ロールアップの処理速度は、**1 秒間に約 5,208 件のトランザクション**に相当します。 これは、イーサリアムにおける 1 つのブロックが保持できる基本的なロールアップのトランザクション数(**78,125**)を平均のブロック時間(**15 秒**)で割ることで算出できます。 +1. 各ブロックのターゲットサーイズは1,500万ガスで、1バイトのデータ検証には16ガスが必要です。 平均ブロックサイズを16ガスで割ると (15,000,000/16) 、平均サイズのブロックは**937,500バイトのデータを保持できる**ことになります。 +2. ロールアップにおける基本的なトランザクションが12バイトを使用する場合、イーサリアムの平均的なブロックは**78,125件のロールアップ・トランザクション**あるいは**39件のロールアップバッチ**(各バッチが平均2,000件のトランザクションを持つ場合)を処理できます。 +3. イーサリアムで15秒ごとに新しいブロックが生成されるとすると、ロールアップの処理速度は、**1秒間に約5,208件のトランザクション**に相当します。 これは、イーサリアムにおける1つのブロックが保持できる基本的なロールアップのトランザクション数(**78,125**)を平均のブロック時間(**15秒**)で割ることで算出できます。 -イーサリアム上のブロック全体がすべてオプティミスティック・ロールアップのトランザクションである可能性はないため、この数値はかなり楽観的な推測です。 しかし、オプティミスティック・ロールアップによってイーサリアムのユーザーどれだけスケーラビリティを獲得できるかについて、おおよその見当をつけることができます(現在の実装では最大 2,000TPS を実現しています)。 +イーサリアム上のブロック全体がすべてオプティミスティック・ロールアップのトランザクションである可能性はないため、この数値はかなり楽観的な推測です。 しかし、オプティミスティック・ロールアップによってイーサリアムのユーザーどれだけスケーラビリティを獲得できるかについて、おおよその見当をつけることができます(現在の実装では最大2,000TPSを実現しています)。 -イーサリアムにおける[データシャーディング](/upgrades/shard-chains/)の導入により、オプティミスティック・ロールアップにおけるスケーラビリティも向上すると期待されます。 ロールアップ上のトランザクションは、ロールアップ以外の他のトランザクションとブロックスペースを共有しなければならないため、メインのイーサリアムチェーンにおけるデータのスループットにより処理能力が制限されます。 シャーディングにより L2 チェーン上でブロックごとにデータを公開できるスペースが増大するため、ロールアップのスループットがさらに向上するでしょう。 +イーサリアムに[データシャーディング](/roadmap/danksharding/)が導入されると、オプティミスティック・ロールアップのスケーラビリティも向上すると期待されています。 ロールアップ上のトランザクションは、ロールアップ以外の他のトランザクションとブロックスペースを共有しなければならないため、メインのイーサリアムチェーンにおけるデータのスループットにより処理能力が制限されます。 ダンクシャーディングでは、高価で永続的な`CALLDATA`の代わりに、安価で非永続的な 「ブロブ」 ストレージを使用して、ブロックごとにデータを公開します。そのために、L2チェーンが利用できるスペースを増やします。 ### オプティミスティック・ロールアップの長所と短所 {#optimistic-rollups-pros-and-cons} -| 長所 | 短所 | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| セキュリティやトラストレス性を犠牲にすることなく、スケーラビリティが大幅に向上する。 | 虚偽の異議申立により、トランザクションに遅延が発生する可能性がある。 | -| トランザクションデータは L1 チェーン上で保存されるため、透明性、セキュリティ、検閲耐性、および分散化が向上する。 | ロールアップにおける中央集権的なオペレーター(シーケンサー)により、トランザクションの順序が影響を受ける可能性がある。 | -| 不正証明により、トラストレスなファイナリティが保証され、少数の正直なユーザーによりチェーンのセキュリティを保護できる。 | 正直なノードが存在しない場合、悪意のオペレーターが無効なブロックや状態コミットメントを送信することで資金を盗み取れる。 | -| 特別なハードウェアを必要とする有効性証明(ゼロ知識ロールアップで用いる)とは異なり、不正証明の計算は L2 上の通常ノードが実行できる。 | 少なくとも 1 つの正直なノードがロールアップのトランザクションを実行し、不正証明を送信して無効な状態遷移に異議を申し立てるというセキュリティモデルに依存している。 | -| トラストレスなライブネスによる利益がある(つまり、どのユーザーでもトランザクションを実行し、アサーションを送信することでチェーンを前に進められる)。 | イーサリアムに資金が出金されるまでに、1 週間のチャレンジ期間が必要になる。 | -| チェーンのセキュリティを強化するために、よく設計された暗号経済的なインセンティブを導入している。 | すべてのトランザクションデータをオンチェーンに送信しなければならないため、費用がかさむ可能性がある。 | -| EVM および Solidity との互換性により、イーサリアムのネイティブスマートコントラクトをロールアップに移植したり、既存ツールを用いて新たな Dapp を構築できる。 | | +| 長所 | 短所 | +| ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| セキュリティやトラストレス性を犠牲にすることなく、スケーラビリティが大幅に向上する。 | 虚偽の異議申立により、トランザクションに遅延が発生する可能性がある。 | +| トランザクションデータはL1チェーン上で保存されるため、透明性、セキュリティ、検閲耐性、および分散化が向上する。 | ロールアップにおける中央集権的なオペレーター(シーケンサー)により、トランザクションの順序が影響を受ける可能性がある。 | +| 不正証明により、トラストレスなファイナリティが保証され、少数の正直なユーザーによりチェーンのセキュリティを保護できる。 | 正直なノードが存在しない場合、悪意のオペレーターが無効なブロックや状態コミットメントを送信することで資金を盗み取れる。 | +| 特別なハードウェアを必要とする有効性証明(ゼロ知識ロールアップで用いる)とは異なり、不正証明の計算はL2上の通常ノードが実行できる。 | 少なくとも1つの正直なノードがロールアップのトランザクションを実行し、不正証明を送信して無効な状態遷移に異議を申し立てるというセキュリティモデルに依存している。 | +| トラストレスなライブネスによる利益がある(つまり、どのユーザーでもトランザクションを実行し、アサーションを送信することでチェーンを前に進められる)。 | イーサリアムに資金が出金されるまでに、1週間のチャレンジ期間が必要になる。 | +| チェーンのセキュリティを強化するために、よく設計された暗号経済的なインセンティブを導入している。 | すべてのトランザクションデータをオンチェーンに送信しなければならないため、費用がかさむ可能性がある。 | +| EVMおよびSolidityとの互換性により、イーサリアムのネイティブスマートコントラクトをロールアップに移植したり、既存ツールを用いて新たなDappを構築できる。 | | ### オプティミスティック・ロールアップに関する説明動画 {#optimistic-video} -映像で学びたい方は、 Finematics によるオプティミスティック・ロールアップの説明をご覧ください: +映像で学びたい方は、 Finematicsによるオプティミスティック・ロールアップの説明をご覧ください: ### オプティミスティック・ロールアップの使用方法 {#use-optimistic-rollups} -Dapp に統合可能な、既存のオプティミスティック・ロールアップの実装が提供されています: +Dappに統合可能な、既存のオプティミスティック・ロールアップの実装が提供されています: @@ -259,7 +259,7 @@ Dapp に統合可能な、既存のオプティミスティック・ロールア - [オプティミスティック・ロールアップの仕組み(完全ガイド)](https://www.alchemy.com/overviews/optimistic-rollups) - [オプティミスティック・ロールアップについて必要なすべての知識](https://research.paradigm.xyz/rollups) -- [Arbitrum の基本ガイド](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) -- [Optimism のロールアップはどのように機能するのか?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) -- [OVM の詳細を学ぶ](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) +- [Arbitrumの基本ガイド](https://newsletter.banklesshq.com/p/the-essential-guide-to-arbitrum) +- [Optimismのロールアップはどのように機能するのか?](https://www.paradigm.xyz/2021/01/how-does-optimisms-rollup-really-work) +- [OVMの詳細を学ぶ](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) - [オプティミスティック仮想マシンとは何か?](https://www.alchemy.com/overviews/optimistic-virtual-machine) 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 8071743b60b..42e0d5e280d 100644 --- a/public/content/translations/ja/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/ja/developers/docs/scaling/plasma/index.md @@ -26,13 +26,13 @@ sidebarDepth: 3 ### オフチェーンでの計算 {#off-chain-computation} -イーサリアムにおける現在の処理速度は、毎秒 15〜20 トランザクションが限界であり、短期的により多くのユーザーに対応するためのスケーラビリティが実現できる見通しは低いと言わざるを得ません。 この問題は主に、イーサリアムの[コンセンサス・メカニズム](/developers/docs/consensus-mechanisms/)では、ブロックチェーンの状態更新が発生するたびに、多くのノードがピアツーピアで検証しなければならないためです。 +イーサリアムにおける現在の処理速度は、毎秒15〜20トランザクションが限界であり、短期的により多くのユーザーに対応するためのスケーラビリティが実現できる見通しは低いと言わざるを得ません。 この問題は主に、イーサリアムの[コンセンサス・メカニズム](/developers/docs/consensus-mechanisms/)では、ブロックチェーンの状態更新が発生するたびに、多くのノードがピアツーピアで検証しなければならないためです。 -イーサリアムのコンセンサス・メカニズムはセキュリティを維持する上で必要ですが、あらゆるユースケースで必須なわけではありません。 例えば、アリスがボブに対して毎日 1 杯のコーヒー代を支払うという取引の場合、二人の間には一定の信頼関係があるため、イーサリアムのネットワーク全体でこれを検証する必要はないでしょう。 +イーサリアムのコンセンサス・メカニズムはセキュリティを維持する上で必要ですが、あらゆるユースケースで必須なわけではありません。 例えば、アリスがボブに対して毎日1杯のコーヒー代を支払うという取引の場合、二人の間には一定の信頼関係があるため、イーサリアムのネットワーク全体でこれを検証する必要はないでしょう。 プラズマでは、イーサリアムメインネットがすべてのトランザクションを検証する必要はないと前提します。 トランザクションをメインネット外で処理することで、ノードはすべてのトランザクションを検証する責任から解放されます。 -プラズマチェーンでは、処理速度とコストを最適化するためにオフチェーンでの計算が必須になります。 例えば、大部分のプラズマチェーンでは、トランザクションの順位付けと実行を管理する役割を、1 名の「オペレーター」に担わせています。 トランザクションを検証する役割を 1 つのエンティティのみに負わせることで、プラズマチェーンは処理時間をメインネットよりも短縮できるのです。 +プラズマチェーンでは、処理速度とコストを最適化するためにオフチェーンでの計算が必須になります。 例えば、大部分のプラズマチェーンでは、トランザクションの順位付けと実行を管理する役割を、1名の「オペレーター」に担わせています。 トランザクションを検証する役割を1つのエンティティのみに負わせることで、プラズマチェーンは処理時間をメインネットよりも短縮できるのです。 ### ステートコミットメント {#state-commitments} @@ -42,7 +42,7 @@ sidebarDepth: 3 マークルルートとは、大容量の情報を圧縮することができる暗号プリミティブです。 マークルルート(この文脈では「ブロックルート」とも呼びます)は、ひとつのブロックに含まれるすべてのトランザクションを表すことができます。 また、マークルルートを用いることで、あるデータセットの小規模な一部分に基づき全体を簡単に検証することができます。 例えばユーザーは、[マークル証明](/developers/tutorials/merkle-proofs-for-offline-data-integrity/#main-content)を生成して、対象のトランザクションが特定のブロックに追加されたことを証明することができます。 -マークルルートは、オフチェーンの状態についての情報をイーサリアムに提供する上で重要な役割を果たします。 マークルルートは、「特定の時点で保存したもの」と考えることができます。オペレーターは、「これがX時点におけるプラズマチェーンの状態であり、これがその証拠であるマークルルートです」とメインネットに伝えるのです。 オペレーターは、マークルルートによってプラズマチェーンの*現在の状態*にコミットすることになるので、これを「状態コミットメント」と呼びます。 +マークルルートは、オフチェーンの状態についての情報をイーサリアムに提供する上で重要な役割を果たします。 マークルルートは、「特定の時点で保存したもの」と考えることができます。オペレーターは、「これがX時点におけるプラズマチェーンの状態であり、これがその証拠であるマークルルートです」とメインネットに伝えるのです。 オペレーターは、マークルルートによってプラズマチェーンの_現在の状態_にコミットすることになるので、これを「状態コミットメント」と呼びます。 ### プラズマチェーンへの参加と退出 {#entries-and-exits} @@ -52,19 +52,19 @@ sidebarDepth: 3 #### プラズマチェーンに参加するには {#entering-the-plasma-chain} -ユーザー(以下では、アリスと呼びます)がプラズマチェーンに参加するには、プラズマコントラクトに ETH あるいはその他の ERC-20 トークンを入金する必要があります。 コントラクトへの入金を監視するプラズマのオペレーターは、アリスが初回に行った入金と同額を作成し、プラズマチェーン上のアリスのアドレスにリリースします。 アリスは、プラズマチェーン(子チェーン)上でこの資金を受け取ったことを確認することが義務付けられており、その上で、他のトランザクションでこの資金を使うことができます。 +ユーザー(以下では、アリスと呼びます)がプラズマチェーンに参加するには、プラズマコントラクトにETHあるいはその他のERC-20トークンを入金する必要があります。 コントラクトへの入金を監視するプラズマのオペレーターは、アリスが初回に行った入金と同額を作成し、プラズマチェーン上のアリスのアドレスにリリースします。 アリスは、プラズマチェーン(子チェーン)上でこの資金を受け取ったことを確認することが義務付けられており、その上で、他のトランザクションでこの資金を使うことができます。 #### プラズマチェーンから退出するには {#exiting-the-plasma-chain} -プラズマチェーンからの退出プロセスは、いくつかの理由により参加時よりも複雑です。 最大の理由は、イーサリアムは当該プラズマチェーンの状態について情報を持つものの、その情報が正しいかどうか検証できないためです。 つまり、悪意のユーザーは、正しくない主張(「私は 1,000 ETH を所有している」)と述べて、この主張を裏付けるために虚偽の証明を提出することで詐欺を働くことができるのです。 +プラズマチェーンからの退出プロセスは、いくつかの理由により参加時よりも複雑です。 最大の理由は、イーサリアムは当該プラズマチェーンの状態について情報を持つものの、その情報が正しいかどうか検証できないためです。 つまり、悪意のユーザーは、正しくない主張(「私は1,000 ETHを所有している」)と述べて、この主張を裏付けるために虚偽の証明を提出することで詐欺を働くことができるのです。 -このような悪意のユーザーによる資金の引き出しを防ぐために、「チャレンジ期間」という仕組みが導入されています。 チャレンジ期間(通常は 1 週間)においては、すべてのユーザーが出金リクエストに対して不正証明を用いて異議を申し立てることができます。 異議申立が認められれば、出金リクエストは却下されます。 +このような悪意のユーザーによる資金の引き出しを防ぐために、「チャレンジ期間」という仕組みが導入されています。 チャレンジ期間(通常は1週間)においては、すべてのユーザーが出金リクエストに対して不正証明を用いて異議を申し立てることができます。 異議申立が認められれば、出金リクエストは却下されます。 しかし通常のケースでは、ユーザーは正直に行動し、自分が所有する資金について正しい主張を行います。 この場合、アリスは、プラズマコントラクトにトランザクションを送信することで、ルートチェーン(イーサリアム)に対する出金リクエストを開始します。 -アリスは同時に、プラズマチェーン上で資金を作成するトランザクションが、特定のブロックに追加されていることを証明するマークル証明を提出しなければなりません。 これは、[未使用トランザクションのアウトプット(UTXO)](https://en.wikipedia.org/wiki/Unspent_transaction_output)モデルを採用した[プラズマ MVP](https://www.learnplasma.org/en/learn/mvp.html)など、プラズマのさまざまな開発サイクルにおいて必要になります。 +アリスは同時に、プラズマチェーン上で資金を作成するトランザクションが、特定のブロックに追加されていることを証明するマークル証明を提出しなければなりません。 これは、[未使用トランザクションのアウトプット(UTXO)](https://en.wikipedia.org/wiki/Unspent_transaction_output)モデルを採用した[プラズマMVP](https://www.learnplasma.org/en/learn/mvp.html)など、プラズマのさまざまな開発サイクルにおいて必要になります。 -[プラズマキャッシュ](https://www.learnplasma.org/en/learn/cash.html)などその他のプラズマでは、UTXO ではなく、[非代替性トークン(NFT)](/developers/docs/standards/tokens/erc-721/)として資金を表示します。 この場合、資金を引き出すには、プラズマチェーン上でトークンを所有していることを証明しなければなりません。 この証明は、当該トークンにおける最新の 2 回のトランザクションを送信し、同時にこれらのトランザクションがブロックに追加されたことを証明するマークル証明を提出することで行います。 +[プラズマキャッシュ](https://www.learnplasma.org/en/learn/cash.html)などその他のプラズマでは、UTXOではなく、[非代替性トークン(NFT)](/developers/docs/standards/tokens/erc-721/)として資金を表示します。 この場合、資金を引き出すには、プラズマチェーン上でトークンを所有していることを証明しなければなりません。 この証明は、当該トークンにおける最新の2回のトランザクションを送信し、同時にこれらのトランザクションがブロックに追加されたことを証明するマークル証明を提出することで行います。 ユーザーはさらに、自らの正直な行動を保証するために、出金リクエストにボンド(担保)を預け入れる必要があります。 異議申立を通じてアリスの出金リクエストが無効であることが証明された場合、アリスのボンドは没収され、その一部は異議申立を行ったユーザーに報酬として提供されます。 @@ -74,9 +74,9 @@ sidebarDepth: 3 あらゆるブロックチェーンと同様に、プラズマチェーンにおいても、参加ユーザーが悪意で行動した場合(資金の二重支出など)にトランザクションのインテグリティを強制するためのメカニズムが必要になります。 これを実現するために、プラズマチェーンでは不正証明を用いて、状態遷移の正しさに関する紛争を仲裁し、悪意の行動を罰しています。 不正証明は、あるプラズマ子チェーンが親チェーンまたはルートチェーンに対して苦情を申し立てるメカニズムとして用いられます。 -不正証明とは、特定の状態遷移が無効であるとの主張を指す用語です。 具体的には、アリスというユーザーが同じ資金を二度使用した場合が該当します。 アリスが、ボブとのトランザクションで彼女の UTXO をすでに使用したにも関わらず、この(すでにボブが所有している)UTXO を、他のトランザクションでも使用しようとするような場合です。 +不正証明とは、特定の状態遷移が無効であるとの主張を指す用語です。 具体的には、アリスというユーザーが同じ資金を二度使用した場合が該当します。 アリスが、ボブとのトランザクションで彼女のUTXOをすでに使用したにも関わらず、この(すでにボブが所有している)UTXOを、他のトランザクションでも使用しようとするような場合です。 -ボブは、アリスによる資金の引き出しを防ぐために、アリスはすでに当該 UTXO を以前のトランザクションで使用済みであることの証拠と、このトランザクションがブロックに追加済みであることを証明するマークル証明を提出することで、不正証明を作成することができます。 プラズマキャッシュでも同様のプロセスが実行され、ボブは、アリスが引き出そうとしているトークンはすでにボブに移転済みであることの証明を提供する必要があります。 +ボブは、アリスによる資金の引き出しを防ぐために、アリスはすでに当該UTXOを以前のトランザクションで使用済みであることの証拠と、このトランザクションがブロックに追加済みであることを証明するマークル証明を提出することで、不正証明を作成することができます。 プラズマキャッシュでも同様のプロセスが実行され、ボブは、アリスが引き出そうとしているトークンはすでにボブに移転済みであることの証明を提供する必要があります。 ボブの異議申立が認められると、アリスの出金リクエストは却下されます。 しかしこのアプローチでは、ボブは常にチェーン上の出金リクエストを監視しなければなりません。 ボブがオフラインであれば、アリスはチャレンジ期間の終了後に悪意の引き出しを実行できてしまうのです。 @@ -96,7 +96,7 @@ sidebarDepth: 3 このようなケースでは、通常の不正証明システムでは対応できません。 オペレーターは、アリスやボブの資金を自らのウォレットに転送する無効のトランザクションを作成した上で、不正証明を作成するのに必要なデータを秘匿することが簡単にできるからです。 これは、オペレーターが他のユーザーやメインネットに対してデータを提供することが義務付けられていないために発生する問題です。 -ですから、最も楽天的な解決策は、当該プラズマチェーンのユーザーを「大量退出」させることでしょう。 大量のユーザーを一挙に退出させることで、悪意のオペレーターにおける資金窃盗の試みを遅延させ、ユーザーに対する一定の保護策を講じることができます。 出金リクエストは、個々の UTXO(またはトークン)が作成された時点に基づいて順番付けられるため、悪意のオペレーターが正直なユーザーのトランザクションを先回りして実行することはできません。 +ですから、最も楽天的な解決策は、当該プラズマチェーンのユーザーを「大量退出」させることでしょう。 大量のユーザーを一挙に退出させることで、悪意のオペレーターにおける資金窃盗の試みを遅延させ、ユーザーに対する一定の保護策を講じることができます。 出金リクエストは、個々のUTXO(またはトークン)が作成された時点に基づいて順番付けられるため、悪意のオペレーターが正直なユーザーのトランザクションを先回りして実行することはできません。 それでもなお、無効な出金処理に伴う混乱に乗じて利益を得ようとする機会主義的なユーザーの発生を防ぐためには、大量退出時における出金リクエストについても検証できる方法が必要になります。 これは、出金を求める各ユーザーに対して、**有効であるチェーンの最後の状態**を送信することを義務付けるというシンプルな方法で解決できます。 @@ -106,17 +106,17 @@ sidebarDepth: 3 ## プラズマチェーンの長所と短所 {#pros-and-cons-of-plasma} -| 長所 | 短所 | -| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 高スループットおよびトランザクションあたりの低コスト。 | 汎用的な計算をサポートしない(スマートコントラクトを実行できない)。 述語論理により、基本的なトークンの転送、スワップ、およびその他数種類のトランザクションタイプのみに対応しています。 | -| 任意のユーザー間の取引に適している(プラズマチェーン上で設定されたユーザーペア間においては、間接費用が発生しない)。 | 資金の安全性を保護するには、ネットワークを定期的に監視する(ライブネス要件)か、この役割を特定のユーザーに委任する必要がある。 | -| メインチェーンとは無関係の具体的なユースケースで活用するために導入できる。 企業を含むあらゆるユーザーが、プラズマ上のスマートコントラクトをカスタマイズすることで、様々な文脈に合わせたスケーラブルなインフラを実現できる。 | データの保存およびリクエストによる提供につき、1 名あるいは複数のオペレーターに依存する。 | -| 計算およびストレージをオフチェーンに移動させることで、イーサリアムメインネットの負荷を軽減する。 | チャレンジ期間が設けられているため、出金プロセスは数日を要する。 この遅延は、代替可能資産であれば流動性プロバイダーが軽減できるが、それに伴って資本コストが発生する。 | -| | 大量のユーザーが一気に退出を求める場合、イーサリアムメインネットの混雑が予想される。 | +| 長所 | 短所 | +| -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| 高スループットおよびトランザクションあたりの低コスト。 | 汎用的な計算をサポートしない(スマートコントラクトを実行できない)。 述語論理により、基本的なトークンの転送、スワップ、およびその他数種類のトランザクションタイプのみに対応しています。 | +| 任意のユーザー間の取引に適している(プラズマチェーン上で設定されたユーザーペア間においては、間接費用が発生しない)。 | 資金の安全性を保護するには、ネットワークを定期的に監視する(ライブネス要件)か、この役割を特定のユーザーに委任する必要がある。 | +| メインチェーンとは無関係の具体的なユースケースで活用するために導入できる。 企業を含むあらゆるユーザーが、プラズマ上のスマートコントラクトをカスタマイズすることで、様々な文脈に合わせたスケーラブルなインフラを実現できる。 | データの保存およびリクエストによる提供につき、1名あるいは複数のオペレーターに依存する。 | +| 計算およびストレージをオフチェーンに移動させることで、イーサリアムメインネットの負荷を軽減する。 | チャレンジ期間が設けられているため、出金プロセスは数日を要する。 この遅延は、代替可能資産であれば流動性プロバイダーが軽減できるが、それに伴って資本コストが発生する。 | +| | 大量のユーザーが一気に退出を求める場合、イーサリアムメインネットの混雑が予想される。 | -## プラズマチェーンとレイヤー 2 のスケーリング・プロトコルとの比較 {#plasma-vs-layer-2} +## プラズマチェーンとレイヤー2のスケーリング・プロトコルとの比較 {#plasma-vs-layer-2} -プラズマは、以前はイーサリアムに対する有益なスケーリング・ソリューションだと考えられていましたが、現在では[レイヤー 2(L2)のスケーリング・プロトコル](/layer-2/)に取って代わられています。 L2 のスケーリング・ソリューションは、プラズマチェーンにおけるいくつかの問題点を解消しています: +プラズマは、以前はイーサリアムに対する有益なスケーリング・ソリューションだと考えられていましたが、現在では[レイヤー2(L2)のスケーリング・プロトコル](/layer-2/)に取って代わられています。 L2のスケーリング・ソリューションは、プラズマチェーンにおけるいくつかの問題点を解消しています: ### 効率性 {#efficiency} @@ -124,9 +124,9 @@ sidebarDepth: 3 ### スマートコントラクトへのサポート {#support-for-smart-contracts} -プラズマのフレームワークにおけるもう一つの問題は、[イーサリアムのスマートコントラクトを実行できない](https://ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598/4)点にありました。 このため、大部分のプラズマの実装は、単純な決済システムや ERC-20 トークンのやりとりを目的とするものでした。 +プラズマのフレームワークにおけるもう一つの問題は、[イーサリアムのスマートコントラクトを実行できない](https://ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598/4)点にありました。 このため、大部分のプラズマの実装は、単純な決済システムやERC-20トークンのやりとりを目的とするものでした。 -一方、オプティミスティック・ロールアップは[イーサリアム仮想マシン](/developers/docs/evm/)との互換性を持ち、イーサリアムネイティブの[スマートコントラクト](/developers/docs/smart-contracts/)を実行できるため、[分散型アプリケーション](/developers/docs/dapps/)のスケーラブルな展開を実現できる有益かつ*セキュア*なソリューションとなっています。 同様に、[EVM のゼロ知識実装(zkEVM)](https://ethresear.ch/t/a-zk-evm-specification/11549)の開発計画も進行中です。ゼロ知識ロールアップが任意のロジックを処理し、スマートコントラクトを実行できるようなります。 +一方、オプティミスティック・ロールアップは[イーサリアム仮想マシン](/developers/docs/evm/)との互換性を持ち、イーサリアムネイティブの[スマートコントラクト](/developers/docs/smart-contracts/)を実行できるため、[分散型アプリケーション](/developers/docs/dapps/)のスケーラブルな展開を実現できる有益かつ_セキュア_なソリューションとなっています。 同様に、[EVMのゼロ知識実装(zkEVM)](https://ethresear.ch/t/a-zk-evm-specification/11549)の開発計画も進行中です。ゼロ知識ロールアップが任意のロジックを処理し、スマートコントラクトを実行できるようなります。 ### データの可用性がない {#data-unavailability} @@ -150,27 +150,26 @@ sidebarDepth: 3 ### シャーディングとの比較 {#plasma-vs-sharding} -プラズマチェーンと[シャードチェーン](/upgrades/sharding/)はいずれも、イーサリアムメインネット上で定期的に暗号学的な証明を公開する点が共通しています。 しかし、そのセキュリティ特性は異なります。 +プラズマチェーンとシャードチェーンは、どちらもイーサリアムメインネット上で定期的に暗号学的な証明を公開しています。 しかし、そのセキュリティ特性は異なります。 シャードチェーンの場合、各データシャードに関する詳細情報を含む「照合ヘッダー」をメインネット上でコミットします。 メインネット上の各ノードは、データシャードの有効性を検証した上で強制するため、無効なシャード遷移を防止でき、悪意の行為からネットワークを保護することができます。 一方プラズマチェーンでは、子チェーンの状態について最小限の情報しかメインネットに提供されない点が異なります。 つまり、メインネットでは子チェーンで実行されたトランザクションを事実上検証できないため、プラズマチェーンの方がセキュリティが低くなります。 -### プラズマを使用する {#use-plasma} +**注**: イーサリアムブロックチェーンのシャーディングは、現在ロードマップに含まれていません。 代わりに、ロールアップと[ダンクシャーディング](/roadmap/danksharding)によるスケーリングが採用されています。 -複数のプロジェクトにおいて、Dapp で活用できるプラズマの実装が提供されています: +### プラズマの使用 {#use-plasma} -- [OMG Network](https://omg.network/) -- [Polygon](https://polygon.technology/) (旧 Matic Network) -- [Gluon](https://gluon.network/) -- [LeapDAO](https://ipfs.leapdao.org/) +複数のプロジェクトにおいて、Dappで活用できるプラズマの実装が提供されています。 + +- [Polygon](https://polygon.technology/)(旧Matic Network) ## 参考文献 {#further-reading} - [プラズマについて学ぶ](https://www.learnplasma.org/en/) - [「共有セキュリティ」の意味と重要性についての簡単な復習](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) -- [サイドチェーン、プラズマ、シャーディングの比較](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://vitalik.ca/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 f251217a98f..db36a52255d 100644 --- a/public/content/translations/ja/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/ja/developers/docs/scaling/sidechains/index.md @@ -5,7 +5,7 @@ lang: ja sidebarDepth: 3 --- -サイドチェーンとは、イーサリアムから独立して実行され、双方向のブリッジによりイーサリアムメインネットに接続されている別個のブロックチェーンです。 サイドチェーンは、メインネットとは異なるブロックのパラメータおよび[コンセンサス・アルゴリズム](/developers/docs/consensus-mechanisms/)を持つことができ、多くの場合トランザクションの効率的な処理のために設計されています。 しかし、イーサリアムのセキュリティ特性を活用できないため、トレードオフが発生します。 [レイヤー 2 のスケーリングソリューション](/layer-2/)とは異なり、サイドチェーンは状態変化やトンラザクションデータをイーサリアムメインネットに送信しません。 +サイドチェーンとは、イーサリアムから独立して実行され、双方向のブリッジによりイーサリアムメインネットに接続されている別個のブロックチェーンです。 サイドチェーンは、メインネットとは異なるブロックのパラメータおよび[コンセンサス・アルゴリズム](/developers/docs/consensus-mechanisms/)を持つことができ、多くの場合トランザクションの効率的な処理のために設計されています。 しかし、イーサリアムのセキュリティ特性を活用できないため、トレードオフが発生します。 [レイヤー2のスケーリングソリューション](/layer-2/)とは異なり、サイドチェーンは状態変化やトンラザクションデータをイーサリアムメインネットに送信しません。 サイドチェーンではさらに、高スループットを実現するために、分散性やセキュリティが低下します([スケーラビリティのトリレンマ](https://vitalik.eth.limo/general/2021/05/23/scaling.html))。 一方イーサリアムは、アップグレードに関する[ビジョン・ステートメント](/roadmap/vision/)で述べられているように、分散性およびセキュリティを犠牲にすることなくスケーリングを実現することを目指しています。 @@ -18,7 +18,7 @@ sidebarDepth: 3 サイドチェーンの独自性(イーサリアムとの相違点)のひとつとしては、採用されているコンセンサス・アルゴリズムが挙げられます。 サイドチェーンでは、コンセンサスをイーサリアムに依存せず、各サイドチェーンのニーズに合わせて別のコンセンサス・プロトコルを選択することができます。 サイドチェーンで用いられているコンセンサス・アルゴリズムの例としては、以下が挙げられます: - [プルーフ・オブ・オーソリティ](https://wikipedia.org/wiki/Proof_of_authority) -- [プルーフ・オブ・ステークの委任](https://en.bitcoinwiki.org/wiki/DPoS) +- [プルーフ・オブ・ステークの委任](https://en.bitcoin.it/wiki/Delegated_proof_of_stake) - [ビザンチン・フォールトトレランス](https://decrypt.co/resources/byzantine-fault-tolerance-what-is-it-explained) サイドチェーンは、イーサリアムと同様に、トランザクションを検証、処理し、ブロックを生成し、ブロックチェーンの状態を保存する検証ノード(バリデータ)を持ちます。 バリデータはさらに、サイドチェーンネットワーク全体におけるコンセンサスを維持し、悪意の攻撃から防御する責任を負います。 @@ -31,13 +31,13 @@ sidebarDepth: 3 ブロックチェーンにおいて、分散性を犠牲にせずにスケーラビリティを実現するには、特殊なハードウェアを持つユーザーに限らず、すべてのユーザーがノードを実行できるように開放されていなければなりません。 これこそ、イーサリアムネットワークにおいて、誰もが[フルノードを実行](/developers/docs/nodes-and-clients/#why-should-i-run-an-ethereum-node)できるように保証する取り組みが続けられている理由です。 -### EVM との互換性 {#evm-compatibility} +### EVMとの互換性 {#evm-compatibility} -一部のサイドチェーンは EVM 互換であるため、[イーサリアム仮想マシン(EVM)](/developers/docs/evm/)向けに開発されたスマートコントラクトを実行することができます。 EVM 互換のサイドチェーンは、[Solidity](/developers/docs/smart-contracts/languages/)やその他の EVM スマートコントラクト言語で書かれたスマートコントラクトをサポートするため、イーサリアムメインネット向けに開発されたスマートコントラクトは EVM 互換のサイドチェーンでも実行することができます。 +一部のサイドチェーンはEVM互換であるため、[イーサリアム仮想マシン(EVM)](/developers/docs/evm/)向けに開発されたスマートコントラクトを実行することができます。 EVM互換のサイドチェーンは、[Solidity](/developers/docs/smart-contracts/languages/)やその他のEVMスマートコントラクト言語で書かれたスマートコントラクトをサポートするため、イーサリアムメインネット向けに開発されたスマートコントラクトはEVM互換のサイドチェーンでも実行することができます。 -つまり、あなたが作成した[Dapp](/developers/docs/dapps/)をサイドチェーンで使用したい場合、あなたの[スマートコントラクト](/developers/docs/smart-contracts/)を当該のサイドチェーンでデプロイするだけでよいです。 サイドチェーンにおける Dapp の外観、感触、および動作はメインネットの場合とまったく同じです。Solidity 上でコントラクトを作成し、サイドチェーンの RPC を介してチェーンとのやりとりを行います。 +つまり、あなたが作成した[Dapp](/developers/docs/dapps/)をサイドチェーンで使用したい場合、あなたの[スマートコントラクト](/developers/docs/smart-contracts/)を当該のサイドチェーンでデプロイするだけでよいです。 サイドチェーンにおけるDappの外観、感触、および動作はメインネットの場合とまったく同じです。Solidity上でコントラクトを作成し、サイドチェーンのRPCを介してチェーンとのやりとりを行います。 -サイドチェーンが EVM 互換であるため、イーサリアムネイティブの Dapp にとっては有益な[スケーリングソリューション](/developers/docs/scaling/)であると言えるでしょう。 Dapp をサイドチェーンでデプロイすることにより、ユーザーは、特にメインネットが混雑している場合に、低いガス代と迅速なトランザクション実行という利点を享受できます。 +サイドチェーンがEVM互換であるため、イーサリアムネイティブのDappにとっては有益な[スケーリングソリューション](/developers/docs/scaling/)であると言えるでしょう。 Dappをサイドチェーンでデプロイすることにより、ユーザーは、特にメインネットが混雑している場合に、低いガス代と迅速なトランザクション実行という利点を享受できます。 ただし、すでに述べた通り、サイドチェーンの使用は大きなトレードオフを伴います。 個別のサイドチェーンはそれ自体でセキュリティ保護の責任を負い、イーサリアムのセキュリティ特性を継承しないためです。 これは、ユーザーに悪影響を及ぼしたり、資金をリスクにさらす悪意の行動を防止できないことを意味します。 @@ -45,20 +45,20 @@ sidebarDepth: 3 独立したブロックチェーンがイーサリアムメインネットのサイドチェーンとなるためには、イーサリアムメインネットとの間の資産の出し入れが容易に実行できる機能が必要です。 このイーサリアムとの相互運用性は、ブロックチェーン・ブリッジにより提供されます。 [ブリッジ](/bridges/)は、イーサリアムメインネット上でデプロイされたスマートコントラクトとサイドチェーンを用いて、メインネットとサイドチェーン間の資金移動を管理します。 -ブリッジはイーサリアムとサイドチェーン間の資金移動を手助けしますが、すでに発行された資産が実際に 2 つのチェーン間を移動する訳ではありません。 むしろ通常は、コインのミントおよびバーンを用いたメカニズムにより、複数のチェーン間で価値を移転します。 詳しくは、[ブリッジの仕組み](/developers/docs/bridges/#how-do-bridges-work)をご覧ください。 +ブリッジはイーサリアムとサイドチェーン間の資金移動を手助けしますが、すでに発行された資産が実際に2つのチェーン間を移動する訳ではありません。 むしろ通常は、コインのミントおよびバーンを用いたメカニズムにより、複数のチェーン間で価値を移転します。 詳しくは、[ブリッジの仕組み](/developers/docs/bridges/#how-do-bridges-work)をご覧ください。 ## サイドチェーンの長所と短所 {#pros-and-cons-of-sidechains} -| 長所 | 短所 | -| -------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -| サイドチェーンの基盤技術は十分に確立されており、広範なリサーチおよび設計上の改善を経ています。 | サイドチェーンでは、スケーラビリティを実現するためのトレードオフとして、分散化およびトラストレス性がある程度犠牲になります。 | -| サイドチェーンは、全般的な計算をサポートし、EVM 互換性を提供します(イーサリアムネイティブの Dapp が実行可能)。 | サイドチェーンでは、別個のコンセンサスメカニズムが用いられるため、イーサリアムによるセキュリティ保証を活用できません。 | +| 長所 | 短所 | +| ------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| サイドチェーンの基盤技術は十分に確立されており、広範なリサーチおよび設計上の改善を経ています。 | サイドチェーンでは、スケーラビリティを実現するためのトレードオフとして、分散化およびトラストレス性がある程度犠牲になります。 | +| サイドチェーンは、全般的な計算をサポートし、EVM互換性を提供します(イーサリアムネイティブのDappが実行可能)。 | サイドチェーンでは、別個のコンセンサスメカニズムが用いられるため、イーサリアムによるセキュリティ保証を活用できません。 | | サイドチェーンは、トランザクションの処理効率を高め、ユーザーのトランザクション手数料を引き下げるために、様々なコンセンサスモデルを採用しています。 | サイドチェーンでは、より高い水準の信頼前提が必要になります(例:サイドチェーンでは、悪意のバリデータが共謀することで不正行為が実行可能です)。 | -| Dapp は、EVM 互換のサイドチェーンを用いて自らのエコシステムを拡張できます。 | | +| Dappは、EVM互換のサイドチェーンを用いて自らのエコシステムを拡張できます。 | | ### サイドチェーンの使用 {#use-sidechains} -複数のプロジェクトにおいて、Dapp と統合できるサイドチェーン実装が提供されています。 +複数のプロジェクトにおいて、Dappと統合できるサイドチェーン実装が提供されています。 - [Polygon PoS](https://polygon.technology/solutions/polygon-pos) - [Skale](https://skale.network/) @@ -68,6 +68,6 @@ sidebarDepth: 3 ## 参考文献 {#further-reading} -- [サイドチェーンを用いてイーサリアムの Dapp におけるスケーラビリティを実現する](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _2018 年 2 月 8 日、ジョルジオス・コンスタントプロス作成。_ +- [サイドチェーンを用いてイーサリアムのDappにおけるスケーラビリティを実現する](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _2018年2月8日、ジョルジオス・コンスタントプロス作成。_ _役に立つコミュニティリソースをご存知の場合は、 ページを編集して追加してください。_ diff --git a/public/content/translations/ja/developers/docs/scaling/state-channels/index.md b/public/content/translations/ja/developers/docs/scaling/state-channels/index.md index 5d78c7165b6..b87b05e52cc 100644 --- a/public/content/translations/ja/developers/docs/scaling/state-channels/index.md +++ b/public/content/translations/ja/developers/docs/scaling/state-channels/index.md @@ -5,17 +5,17 @@ lang: ja sidebarDepth: 3 --- -ステートチャネルは、ユーザーに対して、イーサリアムメインネットとのやりとりを最小限に抑えつつ、トランザクションをオフチェーンで安全に実行できる方法を提供します。 チャネル上のピア(同僚)は、当該チャネルをオープン/クローズするための 2 つのオンチェーンのトランザクションを送信するだけで、任意の数のトランザクションをオフチェーンで実行することができます。 これにより、トランザクションのスループットが大きく改善され、ユーザーの手数料が軽減できます。 +ステートチャネルは、ユーザーに対して、イーサリアムメインネットとのやりとりを最小限に抑えつつ、トランザクションをオフチェーンで安全に実行できる方法を提供します。 チャネル上のピア(同僚)は、当該チャネルをオープン/クローズするための2つのオンチェーンのトランザクションを送信するだけで、任意の数のトランザクションをオフチェーンで実行することができます。 これにより、トランザクションのスループットが大きく改善され、ユーザーの手数料が軽減できます。 ## 前提知識 {#prerequisites} -[イーサリアムスケーリング](/developers/docs/scaling/)と[レイヤー 2](/layer-2/)のページを読んで理解しておくことをお勧めします。 +[イーサリアムスケーリング](/developers/docs/scaling/)と[レイヤー2](/layer-2/)のページを読んで理解しておくことをお勧めします。 ## チャネルとは何か? {#what-are-channels} イーサリアムをはじめとするパブリックブロックチェーンでは、分散型のアーキテクチャによりオンチェーンのトランザクションをすべてのノードが実行しなければならないため、スケーラビリティを実現が大きな課題になります。 各ノードは、一般的なハードウェアを用いて各ブロックに含まれるトランザクションを処理しなければならないため、ネットワークの分散性を維持する上で、トランザクションのスループットには一定の限界が発生します。 ブロックチェーンにおけるチャネルとは、トランザクションの最終的な決済のセキュリティをメインチェーンに依存しつつ、ユーザー同士がオフチェーンでやりとりできるようにすることで、このスループットの問題を解消しようとするアプローチです。 -単純なピアツーピアのプロトコルであるチャネルを利用することで、チャネルに参加する 2 つのノードは、数多くのトランザクションを実行した上で、最終的な結果のみをブロックチェーンに送信するだけでよくなります。 チャネルは、暗号技術を用いることで、メインネットに送信されるサマリーデータがノード間で実行された一連の有効なトランザクションの真の結果であることを証明することができます。 [「マルチシグ」](/developers/docs/smart-contracts/#multisig)のスマートコントラクトは、各トランザクションが適切なノードにより署名されたことを保証します。 +単純なピアツーピアのプロトコルであるチャネルを利用することで、チャネルに参加する2つのノードは、数多くのトランザクションを実行した上で、最終的な結果のみをブロックチェーンに送信するだけでよくなります。 チャネルは、暗号技術を用いることで、メインネットに送信されるサマリーデータがノード間で実行された一連の有効なトランザクションの真の結果であることを証明することができます。 [「マルチシグ」](/developers/docs/smart-contracts/#multisig)のスマートコントラクトは、各トランザクションが適切なノードにより署名されたことを保証します。 チャネルにおける状態変化は参加ノードにより実行、検証されるため、実行レイヤーにおける計算を最低限に抑えることができます。 これにより、イーサリアムの混雑が解消され、ユーザーにとってはトランザクションの処理速度が改善されます。 @@ -23,15 +23,15 @@ sidebarDepth: 3 チャネルを廃止するには、当該チャネルにおける最終的な同意済み状態をオンチェーンに送信します。 これを受けて、マルチシグのスマートコントラクトは、チャネルの最終状態における各ノードの残高に従って、ロックされた資金を分配します。 -ピアツーピアのチャネルは、特に事前に定義された参加者が処理速度の明らかな低下をもたらすことなく高頻度でトランザクションを行いたい場合に有益です。 ブロックチェーンにおけるチャネルは、**ペイメントチャネル**と**ステートチャネル**の 2 種類に大別できます。 +ピアツーピアのチャネルは、特に事前に定義された参加者が処理速度の明らかな低下をもたらすことなく高頻度でトランザクションを行いたい場合に有益です。 ブロックチェーンにおけるチャネルは、**ペイメントチャネル**と**ステートチャネル**の2種類に大別できます。 ## ペイメントチャネル {#payment-channels} -ペイメントチャネルは、2 つのノードが共同で管理する「双方向の台帳」と呼べるでしょう。 この台帳における当初の残高は、チャネル開設時にオンチェーンのコントラクトにおいてロックされた両ユーザーからの入金の合計額になります。 ペイメントチャネルにおける送金は、チャネル開設時と最終的なチャネル廃止時におけるオンチェーンのトランザクションを除き、ブロックチェーン自体を関与させずに瞬時に実行することができます。 +ペイメントチャネルは、2つのノードが共同で管理する「双方向の台帳」と呼べるでしょう。 この台帳における当初の残高は、チャネル開設時にオンチェーンのコントラクトにおいてロックされた両ユーザーからの入金の合計額になります。 ペイメントチャネルにおける送金は、チャネル開設時と最終的なチャネル廃止時におけるオンチェーンのトランザクションを除き、ブロックチェーン自体を関与させずに瞬時に実行することができます。 チャネルの台帳における残高(つまり、ペイメントチャネルの状態)が変更される場合、チャネルに参加する全ユーザーの承認が必要になります。 イーサリアムにおけるトランザクションの場合と同じように、チャネルの更新は、参加ユーザー全員の署名によりファイナライズされたと見なされます。 -ペイメントチャネルは、ユーザーがオンチェーンで実行する単純なやりとり(例:ETH の送金、アトミックスワップ、少額決済など)の費用を軽減するために設計された最初期のスケーリング・ソリューションのひとつです。 チャネルの参加ユーザーは、送金の合計額がデポジットされたトークンの合計を超えない限り、ユーザー間のトランザクションを瞬時に何回でも無料で実行することができます。 +ペイメントチャネルは、ユーザーがオンチェーンで実行する単純なやりとり(例:ETHの送金、アトミックスワップ、少額決済など)の費用を軽減するために設計された最初期のスケーリング・ソリューションのひとつです。 チャネルの参加ユーザーは、送金の合計額がデポジットされたトークンの合計を超えない限り、ユーザー間のトランザクションを瞬時に何回でも無料で実行することができます。 ## ステートチャンネル {#state-channels} @@ -41,7 +41,7 @@ sidebarDepth: 3 一方で、ステートチャネルでは、ユーザーの残高情報を保持するだけでなく、当該コントラクトのストレージの現在状態(つまり、コントラクトに含まれる各変数の値)を追跡することができます。 -これにより、2 人のユーザー間で、スマートコントラクトをオフチェーンで実行することが可能になります。 この場合、スマートコントラクトの初期状態を変更するには、チャネルを開設した両ユーザー(ピア)の承認のみが必要になります。 +これにより、2人のユーザー間で、スマートコントラクトをオフチェーンで実行することが可能になります。 この場合、スマートコントラクトの初期状態を変更するには、チャネルを開設した両ユーザー(ピア)の承認のみが必要になります。 これは、先ほど挙げたスケーラビリティの問題を解消する一方で、セキュリティが低下する可能性をもたらします。 イーサリアムでは、状態遷移の有効性はコンセンサス・プロトコルにより強制されています。 これにより、スマートコントラクトの状態に対して無効な更新を提案したり、スマートコントラクトの実行を改変することは不可能になっているのです。 @@ -65,13 +65,13 @@ sidebarDepth: 3 チャネルの状態が初期化されると、各ピアは、自らが署名したトランザクションを他のピアに送信し、承認を求めることで、やりとりを行います。 参加ユーザーは、このようなトランザクションを通じて、自らが状態更新を開始したり、他のユーザーからの状態更新に署名したりします。 チャネルにおけるトランザクションは、以下の要素で構成されます: -- **ナンス**は、トランザクションのユニーク ID として機能し、リプレイ攻撃を防ぎます。 同時に、状態更新の発生順序を特定します(これは、紛争解決フェーズにおいて重要です)。 +- **ナンス**は、トランザクションのユニークIDとして機能し、リプレイ攻撃を防ぎます。 同時に、状態更新の発生順序を特定します(これは、紛争解決フェーズにおいて重要です)。 - チャネルの古い状態。 - チャネルの新しい状態。 -- 状態遷移をトリガーするトランザクション(例:アリスがボブに 5 ETH を送信するトランザクション)。 +- 状態遷移をトリガーするトランザクション(例:アリスがボブに5 ETHを送信するトランザクション)。 メインネットにおけるユーザー間の通常のやりとりとは異なり、チャネルの状態更新はオンチェーンでブロードキャストされません。これは、オンチェーンの負荷を最小化するというステートチャネルの目的に合致しています。 参加ユーザーが同意する限り、状態更新はイーサリアムのトランザクションと同様のファイナリティを持ちます。 参加者がメインネットのコンセンサスに依存するのは、紛争が発生した場合のみです。 @@ -97,13 +97,13 @@ sidebarDepth: 3 通常、チャネルの参加ユーザーは、事前にチャネルの廃止に同意し、最後の状態遷移に共同署名した上で、スマートコントラクトに送信します。 チャネルの更新がオンチェーン上で承認されると、オフチェーンにおけるスマートコントラクトの実行が終了し、参加ユーザーは各自の資金を持ってチャネルを退出します。 -しかし 1 名の参加ユーザーが、他のユーザーによる承認を待たずに、スマートコントラクトの実行終了とチャネルのファイナライズを要求するリクエストをオンチェーンで送信する可能性もあります。 上述したようなコンセンサスが維持できない状況が発生した場合、各参加ユーザーは、オンチェーンのコントラクトに対し、チャネルを廃止し、資金を分配させるようにトリガーすることができます。 これにより正直な参加ユーザーは、他のユーザーのアクションに関わらず常にデポジットを撤回できるため、**トラストレス性**が確保されます。 +しかし1名の参加ユーザーが、他のユーザーによる承認を待たずに、スマートコントラクトの実行終了とチャネルのファイナライズを要求するリクエストをオンチェーンで送信する可能性もあります。 上述したようなコンセンサスが維持できない状況が発生した場合、各参加ユーザーは、オンチェーンのコントラクトに対し、チャネルを廃止し、資金を分配させるようにトリガーすることができます。 これにより正直な参加ユーザーは、他のユーザーのアクションに関わらず常にデポジットを撤回できるため、**トラストレス性**が確保されます。 チャネルの廃止を実行したいユーザーは、当該アプリケーションの最後の有効な状態更新をオンチェーンのコントラクトに送信する必要があります。 この最後の有効な状態更新が正しければ(つまり、全参加ユーザーの署名を含んでいれば)、資金は各ユーザーに再分配されます。 -ただし、1 名のユーザーによる廃止リクエストに対しては、実行までの保留期間が発生します。 反対に、チャネルの廃止が満場一致で承認されている場合は、オンチェーンにおける廃止トランザクションはただちに実行されます。 +ただし、1名のユーザーによる廃止リクエストに対しては、実行までの保留期間が発生します。 反対に、チャネルの廃止が満場一致で承認されている場合は、オンチェーンにおける廃止トランザクションはただちに実行されます。 -1 名のユーザーによる廃止リクエストについて保留期間が発生するのは、不正行為の可能性を防止するためです。 例えば、1 名の参加ユーザーが、チャネルの古い状態をオンチェーンに送信して、イーサリアム上でチャネルをファイナライズしようとする可能性があります。 +1名のユーザーによる廃止リクエストについて保留期間が発生するのは、不正行為の可能性を防止するためです。 例えば、1名の参加ユーザーが、チャネルの古い状態をオンチェーンに送信して、イーサリアム上でチャネルをファイナライズしようとする可能性があります。 ステートチャネルでは、このようなアクションを防止するために、正直なユーザーが最新の有効状態をオンチェーンに送信することで、無効な状態更新に異議を申し立てることが可能になっています。 ステートチャネルは、より新しい同意済みの状態更新が、より古い状態更新よりも優先されるように設計されています。 @@ -115,7 +115,7 @@ sidebarDepth: 3 ステートチャネルはオフチェーンのプロトコルとして存在しますが、オンチェーンの構成要素、つまりチャネル開設時にイーサリアム上でデプロイされたスマートコントラクトを持ちます。 このコントラクトは、ステートチャネルにデポジットされた資産を管理し、状態更新を検証し、参加ユーザー間の紛争を仲裁する機能を持ちます。 -ステートチャネルは、[レイヤー 2](/layer-2/)のスケーリング・ソリューションとは異なり、メインネットに対してトランザクションデータやステートコミットメントを送信しません。 しかし、[サイドチェーン](/developers/docs/scaling/sidechains/)などと比較するとメインネットとの接続性が高いため、やや安全性が高いと言えます。 +ステートチャネルは、[レイヤー2](/layer-2/)のスケーリング・ソリューションとは異なり、メインネットに対してトランザクションデータやステートコミットメントを送信しません。 しかし、[サイドチェーン](/developers/docs/scaling/sidechains/)などと比較するとメインネットとの接続性が高いため、やや安全性が高いと言えます。 ステートチャネルは、以下の事項につきメインのイーサリアムプロトコルに依存します: @@ -137,11 +137,11 @@ sidebarDepth: 3 ## 仮想ステートチャネル {#virtual-state-channels} -ステートチャネルのネイティブ実装は、オフチェーンでアプリケーションを実行したい 2 名のユーザーが、新規のスマートコントラクトをデプロイすることを想定していました。 しかし、このようなアプローチは実現不可能であるだけでなく、ステートチャネルに求められるコスト効率性も失われます(オンチェーンでのトランザクション費用が大きくかさむため)。 +ステートチャネルのネイティブ実装は、オフチェーンでアプリケーションを実行したい2名のユーザーが、新規のスマートコントラクトをデプロイすることを想定していました。 しかし、このようなアプローチは実現不可能であるだけでなく、ステートチャネルに求められるコスト効率性も失われます(オンチェーンでのトランザクション費用が大きくかさむため)。 この問題点を解消するために、「仮想チャネル」が開発されました。 チャネルを開設/廃止するためにオンチェーンでのトランザクションが必要な通常のチャネルとは異なり、仮想チャネルは、メインチェーンとのやりとりを行うことなく、開設、実行、およびファイナライズが可能です。 このメソッドを用いて、紛争をオフチェーンで解決することすら可能です。 -仮想チャネルのシステムが機能するには、オンチェーンですでに資金が入金されている、いわゆる「台帳チャネル」が存在する必要があります。 これは、既存の台帳チャネルの上に 2 名のユーザー間の仮想チャネルを構築し、台帳チャネルの所有ユーザー(複数可)が仲介者の役割を果たすというモデルです。 +仮想チャネルのシステムが機能するには、オンチェーンですでに資金が入金されている、いわゆる「台帳チャネル」が存在する必要があります。 これは、既存の台帳チャネルの上に2名のユーザー間の仮想チャネルを構築し、台帳チャネルの所有ユーザー(複数可)が仲介者の役割を果たすというモデルです。 各仮想チャネルに参加するユーザーは、当該コントラクトの新規インスタンスを通じてやりとりを行い、台帳チャネルが複数のインスタンスをサポートします。 また、台帳チャネルの状態には複数のコントラクトにおけるストレージ状態が含まれるため、オフチェーンにおいて、複数のユーザーがアプリケーションを並列的に実行することが可能になります。 @@ -149,13 +149,13 @@ sidebarDepth: 3 ### 仮想ペイメントチャネル {#virtual-payment-channels} -仮想ペイメントチャネルは、仮想ステートチャネルと同じ発想に基づいており、同じネットワークに接続された参加ユーザーは、オンチェーンで新たなチャネルを開設する必要なしにメッセージをやりとりすることができます。 仮想ペイメントチャネルでは、送金は 1 名または複数の仲介者を介して実行されるため、意図した受取人のみが資金を受け取ることが保証されます。 +仮想ペイメントチャネルは、仮想ステートチャネルと同じ発想に基づいており、同じネットワークに接続された参加ユーザーは、オンチェーンで新たなチャネルを開設する必要なしにメッセージをやりとりすることができます。 仮想ペイメントチャネルでは、送金は1名または複数の仲介者を介して実行されるため、意図した受取人のみが資金を受け取ることが保証されます。 ## ステートチャネルの応用例 {#applications-of-state-channels} ### 支払い {#payments} -ブロックチェーンにおける初期のチャネルは、メインネットにおいて高額の手数料を発生させることなく、2 名のユーザーがオフチェーンで、迅速かつ安価な送金を行うことができるシンプルなプロトコルでした。 ペイメントチャネルは現在でも、イーサ(ETH)やその他のトークンの交換や預入を行う目的において有益だと言えます。 +ブロックチェーンにおける初期のチャネルは、メインネットにおいて高額の手数料を発生させることなく、2名のユーザーがオフチェーンで、迅速かつ安価な送金を行うことができるシンプルなプロトコルでした。 ペイメントチャネルは現在でも、イーサ(ETH)やその他のトークンの交換や預入を行う目的において有益だと言えます。 チャネルを活用した決済には、以下の利点があります: @@ -167,11 +167,11 @@ sidebarDepth: 3 4. **コスト**: ステートチャネルは特に、特定のユーザー集団が長期的に数多くの状態更新を交換する必要がある場合に有益だと言えます。 発生する唯一のコストは、ステートチャネルのスマートコントラクトの開始/終了に伴う費用のみです。決済コストは、チャネルの最終状態に従って配分されるため、チャネルの開設から廃止に至るまでの各状態変化のコストは最後の状態変化のコストよりも安価になります。 -ステートチャネルは、[ロールアップ](/developers/docs/scaling/#rollups)などのレイヤー 2 ソリューションで実装することで、さらに魅力的な決済手段になる可能性があります。 チャネルは、安価な決済手段を提供するものであるとは言え、開設時におけるメインネットでのオンチェーンコントラクトの設定費用は、特にガス料金が急騰した際には高額になる可能性があります。 イーサリアムベースのロールアップは[安価なトンラザクションフィー](https://l2fees.info/)を提供するため、チャネル参加者はセットアップ手数料を抑えることで全体の間接費用を削減できます。 +ステートチャネルは、[ロールアップ](/developers/docs/scaling/#rollups)などのレイヤー2ソリューションで実装することで、さらに魅力的な決済手段になる可能性があります。 チャネルは、安価な決済手段を提供するものであるとは言え、開設時におけるメインネットでのオンチェーンコントラクトの設定費用は、特にガス料金が急騰した際には高額になる可能性があります。 イーサリアムベースのロールアップは[安価なトンラザクションフィー](https://l2fees.info/)を提供するため、チャネル参加者はセットアップ手数料を抑えることで全体の間接費用を削減できます。 ### マイクロトランザクション {#microtransactions} -マイクロトランザクションとは、企業にとって損失が発生するような微少な価値(例:1 ドル未満)の決済を指します。 これらの事業体は、決済サービスプロバイダーに手数料を支払う必要がありますが、顧客売上の利益率が低すぎる場合には損失が発生する可能性があるためです。 +マイクロトランザクションとは、企業にとって損失が発生するような微少な価値(例:1ドル未満)の決済を指します。 これらの事業体は、決済サービスプロバイダーに手数料を支払う必要がありますが、顧客売上の利益率が低すぎる場合には損失が発生する可能性があるためです。 ペイメントチャネルは、マイクロトランザクションにおける間接費用を縮小することでこの問題を解消します。 例えばインターネットサービスプロバイダー(ISP)であれば、顧客が自社サービスを利用するごとに少額の支払いがストリーミングされるペイメントチャネルを開設することができます。 @@ -183,15 +183,15 @@ sidebarDepth: 3 多くのステートチャネルでは、オンチェーンのコントラクト上でコミットされた資金を管理するのに用意であるため、単純な相互のやりとりを行うアプリケーションのみに使用が限定されています。 また、オフチェーンのアプリケーションにおける状態を一定間隔で更新するユーザーの数が制限されるため、不正直なユーザー行動を罰するのが比較的容易です。 -また、ステートチャネルを用いたアプリケーションの効率性は、その設計により異なります。 例えば、デベロッパーはアプリケーションのチャネルコントラクトをオンチェーンで 1 回デプロイし、利用者がオンチェーンにアクセスすることなくアプリを再利用できるように設計することが可能です。 この場合、アプリケーションの当初のチャネルが台帳チャネルとして複数の仮想チャネルをサポートするので、アプリケーションのスマートコントラクトは、オフチェーン上で新規インスタンスとして実行することができます。 +また、ステートチャネルを用いたアプリケーションの効率性は、その設計により異なります。 例えば、デベロッパーはアプリケーションのチャネルコントラクトをオンチェーンで1回デプロイし、利用者がオンチェーンにアクセスすることなくアプリを再利用できるように設計することが可能です。 この場合、アプリケーションの当初のチャネルが台帳チャネルとして複数の仮想チャネルをサポートするので、アプリケーションのスマートコントラクトは、オフチェーン上で新規インスタンスとして実行することができます。 -ステートチャネルを用いたアプリケーションのユースケースとしては、ゲームの結果に基づいて資金が分配される 2 人対戦型のゲームが想定できるでしょう。 この場合のメリットとしては、各プレイヤーが相手プレイヤーを信頼する必要がなく(トラストレス性)、資金の分配や紛争の解決を管理するのはプレイヤーではなくオンチェーンのコントラクトである(分散性)という点です。 +ステートチャネルを用いたアプリケーションのユースケースとしては、ゲームの結果に基づいて資金が分配される2人対戦型のゲームが想定できるでしょう。 この場合のメリットとしては、各プレイヤーが相手プレイヤーを信頼する必要がなく(トラストレス性)、資金の分配や紛争の解決を管理するのはプレイヤーではなくオンチェーンのコントラクトである(分散性)という点です。 -ステートチャネルを用いたアプリケーションにおけるその他のユースケースとしては、ENS の名前解決サービスや NFT 台帳など、様々な可能性があります。 +ステートチャネルを用いたアプリケーションにおけるその他のユースケースとしては、ENSの名前解決サービスやNFT台帳など、様々な可能性があります。 ### アトミック送金 {#atomic-transfers} -初期のペイメントチャネルでは、2 名のユーザー間の送金のみが可能だったため、用途が限られていました。 しかし、仮想チャネルが導入されたことで、オンチェーン上で新規チャネルを開設せずに、仲介者を通した送金の転送(つまり、複数の P2P チャネルを利用した送金)が可能になりました。 +初期のペイメントチャネルでは、2名のユーザー間の送金のみが可能だったため、用途が限られていました。 しかし、仮想チャネルが導入されたことで、オンチェーン上で新規チャネルを開設せずに、仲介者を通した送金の転送(つまり、複数のP2Pチャネルを利用した送金)が可能になりました。 転送を伴う支払いは一般的に「マルチホップ送金」と呼ばれ、アトミックな性質を持ちます(つまり、トランザクションに含まれるすべての部分が成功しない限り、全体が無効になります)。 アトミック送金では、[ハッシュ化されたタイムロック・コントラクト(HTLCs)](https://en.bitcoin.it/wiki/Hash_Time_Locked_Contracts)を用いて、特定の条件を満たす場合のみ支払いが実行されるため、カウンターパーティリスクが軽減されます。 @@ -217,9 +217,9 @@ sidebarDepth: 3 ブロックチェーンでチャネルを開設するには、チャネルが存在する限り継続的にオンチェーンのスマートコントラクトで資金をロックする必要があります。 これにより、チャネルに参加するユーザーの流動性に関する問題が軽減されますが、メインネットに資金をロックできるユーザー以外はチャネルに参加できなくなります。 -しかし、オフチェーンのサービスプロバイダー(OSP)が提供する台帳チャネルを活用することで、ユーザーの流動性に伴う問題を軽減することが可能です。 台帳チャネルに接続した 2 名のピアが仮想チャネルを構築することで、完全にオフチェーンのチャネルを開設し、いつでもファイナライズすることが可能になります。 +しかし、オフチェーンのサービスプロバイダー(OSP)が提供する台帳チャネルを活用することで、ユーザーの流動性に伴う問題を軽減することが可能です。 台帳チャネルに接続した2名のピアが仮想チャネルを構築することで、完全にオフチェーンのチャネルを開設し、いつでもファイナライズすることが可能になります。 -OSP の側も、複数のピアが参加するチャネルを開設できるため、支払いの転送サービスを提供する上で有益です。 もちろん、このようなサービスを利用するユーザーは OSP に手数料を支払う必要があるため、好ましくないと思うユーザーもいるでしょう。 +OSPの側も、複数のピアが参加するチャネルを開設できるため、支払いの転送サービスを提供する上で有益です。 もちろん、このようなサービスを利用するユーザーはOSPに手数料を支払う必要があるため、好ましくないと思うユーザーもいるでしょう。 ### グリーフィング攻撃 {#griefing-attacks} @@ -237,11 +237,11 @@ OSP の側も、複数のピアが参加するチャネルを開設できるた ステートチャネルの参加ユーザーは状態更新を交互に送信しあうため、「順番ベースのアプリケーション」(例:対戦型のチェスゲーム)に最も適しています。 このアプローチでは、複数の状態更新を同時に実行する必要がないため、オンチェーンのコントラクトにおいて古い状態を送信したユーザーを罰する負担が軽減されます。 ただしこの設計の副作用として、トランザクションが相手方のアクションに依存するため、レイテンシーが増化し、全般的なユーザー体験の質が損なわれる可能性があります。 -一部のステートチャネルでは、当該のオフチェーンの状態につき、2 つの一方向性の状態(「インプレックス」)に分割し、双方における同時の状態更新を可能にする「全二重設計」を採用することで、この問題を解消しています。 このような設計は、オフチェーンのスループットを高め、トランザクションの遅延を軽減します。 +一部のステートチャネルでは、当該のオフチェーンの状態につき、2つの一方向性の状態(「インプレックス」)に分割し、双方における同時の状態更新を可能にする「全二重設計」を採用することで、この問題を解消しています。 このような設計は、オフチェーンのスループットを高め、トランザクションの遅延を軽減します。 ## ステートチャネルを使う {#use-state-channels} -複数のプロジェクトにおいて、Dapp に統合できるステートチャネルの実装が提供されています: +複数のプロジェクトにおいて、Dappに統合できるステートチャネルの実装が提供されています: - [Connext](https://connext.network/) - [Kchannels](https://www.kchannels.io/) @@ -253,8 +253,8 @@ OSP の側も、複数のピアが参加するチャネルを開設できるた **ステートチャンネル** -- [イーサリアムにおけるレイヤー 2 のスケーリング・ソリューションを理解する:ステートチャネル、プラズマ、および Truebit](https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4)_ - 2018 年 2 月 12 日、ジョシュ・スターク作成。_ -- [ステートチャネルの説明](https://www.jeffcoleman.ca/state-channels/)_ - 2015 年 11 月 6 日、ジェフ・コールマン作成。_ +- [イーサリアムにおけるレイヤー2のスケーリング・ソリューションを理解する:ステートチャネル、プラズマ、およびTruebit](https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4)_ - 2018年2月12日、ジョシュ・スターク作成。_ +- [ステートチャネルの説明](https://www.jeffcoleman.ca/state-channels/)_ - 2015年11月6日、ジェフ・コールマン作成。_ - [ステートチャネルの基礎](https://education.district0x.io/general-topics/understanding-ethereum/basics-state-channels/) - _District0x_ - [ブロックチェーンにおけるステートチャネル:現在の状況](https://ieeexplore.ieee.org/document/9627997) diff --git a/public/content/translations/ja/developers/docs/scaling/validium/index.md b/public/content/translations/ja/developers/docs/scaling/validium/index.md index 4f34deb4276..2082a43a18f 100644 --- a/public/content/translations/ja/developers/docs/scaling/validium/index.md +++ b/public/content/translations/ja/developers/docs/scaling/validium/index.md @@ -5,17 +5,17 @@ lang: ja sidebarDepth: 3 --- -バリディアムは、 [ゼロ知識ロールアップ](/developers/docs/scaling/zk-rollups/)のような有効性証明を使用してトランザクションの完全性を強化する[スケーリングソリューション](/developers/docs/scaling/)ですが、トランザクションのデータはイーサリアムメインネットに保存されません。 オフチェーンにおけるデータの可用性が低下するというトレードオフが存在する一方で、スケーラビリティが大幅に向上します(バリディアムでは、[1 秒間に 9,000 件以上のトランザクションが実行可能です](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263))。 +バリディアムは、 [ゼロ知識ロールアップ](/developers/docs/scaling/zk-rollups/)のような有効性証明を使用してトランザクションの完全性を強化する[スケーリングソリューション](/developers/docs/scaling/)ですが、トランザクションのデータはイーサリアムメインネットに保存されません。 オフチェーンにおけるデータの可用性が低下するというトレードオフが存在する一方で、スケーラビリティが大幅に向上します(バリディアムでは、[1秒間に9,000件以上のトランザクションが実行可能です](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263))。 ## 前提知識 {#prerequisites} -[イーサリアムのスケーリング](/developers/docs/scaling/)と[レイヤー 2](/layer-2) のページを読んで理解しておくことをおすすめします。 +[イーサリアムのスケーリング](/developers/docs/scaling/)と[レイヤー2](/layer-2) のページを読んで理解しておくことをおすすめします。 ## バリディアムとは何か? {#what-is-validium} -バリディアムは、オフチェーンにおけるデータの可用性および処理能力を用いてイーサリアムメインネット外でトランザクションを処理することでスループットの向上を目指すスケーリング・ソリューションです。 ゼロ知識ロールアップ(ZK ロールアップ)と同様に、バリディアムでは[ゼロ知識証明](/glossary/#zk-proof)を発行することで、オフチェーンのトランザクションをイーサリアム上で検証します。 これにより無効な状態遷移の発生を防ぐことができるため、バリディアムチェーンのセキュリティが強化されます。 +バリディアムは、オフチェーンにおけるデータの可用性および処理能力を用いてイーサリアムメインネット外でトランザクションを処理することでスループットの向上を目指すスケーリング・ソリューションです。 ゼロ知識ロールアップ(ZKロールアップ)と同様に、バリディアムでは[ゼロ知識証明](/glossary/#zk-proof)を発行することで、オフチェーンのトランザクションをイーサリアム上で検証します。 これにより無効な状態遷移の発生を防ぐことができるため、バリディアムチェーンのセキュリティが強化されます。 -ゼロ知識証明をはじめとする「有効性証明」は、ZK-SNARK(ゼロ知識であり、簡潔かつ非双方向の知識アーギュメント)または ZK-STARK(ゼロ知識であり、スケーラブルかつ透明性が高い知識アーギュメント)のいずれかに分類されます。 詳細については、[ゼロ知識証明](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/)をご覧ください。 +ゼロ知識証明をはじめとする「有効性証明」は、ZK-SNARK(ゼロ知識であり、簡潔かつ非双方向の知識アーギュメント)またはZK-STARK(ゼロ知識であり、スケーラブルかつ透明性が高い知識アーギュメント)のいずれかに分類されます。 詳細については、[ゼロ知識証明](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/)をご覧ください。 バリディアムでは、ユーザーの資金はイーサリアム上のスマートコントラクトで管理されます。 バリディアムは、ゼロ知識ロールアップの場合とよく似たほぼ瞬時の出金が可能です。出金リクエストに対する有効性証明がメインネット上で検証されると、ユーザーは[マークル証明](/developers/tutorials/merkle-proofs-for-offline-data-integrity/)を提供することで資金を引き出せるようになります。 マークル証明は、ユーザーの出金トランザクションが検証済みのトランザクション・バッチに含まれることを確認するもので、オンチェーンのコントラクトが当該の出金を処理することを許可します。 @@ -59,7 +59,7 @@ sidebarDepth: 3 ### 入金と出金 {#deposits-and-withdrawals} -各ユーザーは、オンチェーンのコントラクトに ETH(またはその他の ERC 互換トークン)を預け入れることで、イーサリアムからバリディアムに資金を移動できます。 当該コントラクトが入金イベントをオフチェーンのバリディアムにリレーし、入金額と同じ額がバリディアムチェーン上のユーザーアドレスに追加されます。 オペレーターは同時に、入金トランザクションを新規バッチに追加します。 +各ユーザーは、オンチェーンのコントラクトにETH(またはその他のERC互換トークン)を預け入れることで、イーサリアムからバリディアムに資金を移動できます。 当該コントラクトが入金イベントをオフチェーンのバリディアムにリレーし、入金額と同じ額がバリディアムチェーン上のユーザーアドレスに追加されます。 オペレーターは同時に、入金トランザクションを新規バッチに追加します。 資金をメインネットに戻したい場合は、バリディアム上で出金トランザクションを開始し、オペレーターに送信します。オペレーターは、この出金リクエストに対して検証を行った上で、次のバッチに追加します。 また、バリディアムチェーン上のユーザー資産は、ユーザーがバリディアムチェーンから退出する事前に破壊されます。 当該バッチに関連付けられた有効性証明が確認だれると、ユーザーはメインのコントラクトを呼び出し、初回のデポジットの残余分を引き出すことができます。 @@ -69,7 +69,7 @@ sidebarDepth: 3 オペレーターは、複数のトランザクションからなるバッチを実行した後、それに関連した有効性証明を検証者コントラクトに送信し、メインのコントラクトに新規のステートルートを提案します。 この証明が有効であれば、メインのコントラクトはバリディアムの状態を更新し、当該バッチに含まれるトランザクションの処理を確定します。 -ゼロ知識ロールアップとは異なり、バリディアム上のブロック生成者は、トランザクションを含むバッチのトランザクションデータを公開する必要がありません(ブロックヘッダーのみ公開すればよいです)。 これによりバリディアムは、メインのイーサリアムチェーンに状態データを`calldata`として公開する「ハイブリッド型」のスケーリング・プロトコル(つまり、[レイヤー 2](/layer-2/))ではなく、純粋にオフチェーンのスケーリング・プロトコルであると言えます。 +ゼロ知識ロールアップとは異なり、バリディアム上のブロック生成者は、トランザクションを含むバッチのトランザクションデータを公開する必要がありません(ブロックヘッダーのみ公開すればよいです)。 これによりバリディアムは、メインのイーサリアムチェーンに状態データを`calldata`として公開する「ハイブリッド型」のスケーリング・プロトコル(つまり、[レイヤー2](/layer-2/))ではなく、純粋にオフチェーンのスケーリング・プロトコルであると言えます。 ### データ可用性 {#data-availability} @@ -85,9 +85,9 @@ sidebarDepth: 3 #### データ可用性委員会(DAC) {#data-availability-committee} -一部のバリディアム・ソリューションでは、オフチェーンにおけるデータの可用性を保証するために、状態コピーの保存およびデータ可用性証明の提供を担う信頼されるエンティティの集団を指名します(これらのエンティティを総称して「データ可用性委員会」(DAC)と呼びます)。 DAC は、メンバーであるユーザーの数が限定されるため、導入やメンバー間の連携が容易になります。 +一部のバリディアム・ソリューションでは、オフチェーンにおけるデータの可用性を保証するために、状態コピーの保存およびデータ可用性証明の提供を担う信頼されるエンティティの集団を指名します(これらのエンティティを総称して「データ可用性委員会」(DAC)と呼びます)。 DACは、メンバーであるユーザーの数が限定されるため、導入やメンバー間の連携が容易になります。 -その一方で、通常ユーザーは、データを必要とする際に(例:マークル証明を生成するため)、その可用性について DAC を信頼しなければならなくなります。 また、DAC のメンバーが[悪意のアクターに侵入され](https://notes.ethereum.org/DD7GyItYQ02d0ax_X-UbWg?view)、オフチェーンのデータを秘匿してしまう可能性があります。 +その一方で、通常ユーザーは、データを必要とする際に(例:マークル証明を生成するため)、その可用性についてDACを信頼しなければならなくなります。 また、DACのメンバーが[悪意のアクターに侵入され](https://notes.ethereum.org/DD7GyItYQ02d0ax_X-UbWg?view)、オフチェーンのデータを秘匿してしまう可能性があります。 [バリディアムにおけるデータ可用性委員会の詳細](https://medium.com/starkware/data-availability-e5564c416424)をご覧ください。 @@ -99,66 +99,66 @@ sidebarDepth: 3 [バリディアムにおけるボンド提供型のデータ可用性の詳細](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf)をご覧ください。 -## Volitions とバリディアム {#volitions-and-validium} +## Volitionsとバリディアム {#volitions-and-validium} -バリディアムは様々な利点を提供する一方で、トレードオフ(特に、データの可用性)も存在します。 他の多くのスケーリング・ソリューションと同様に、バリディアムの様々な実装は具体的なユースケースに合わせて開発されており、そのひとつとして Volitions が挙げられます。 +バリディアムは様々な利点を提供する一方で、トレードオフ(特に、データの可用性)も存在します。 他の多くのスケーリング・ソリューションと同様に、バリディアムの様々な実装は具体的なユースケースに合わせて開発されており、そのひとつとしてVolitionsが挙げられます。 -Volitions は、ゼロ知識ロールアップとバリディアムチェーンを組み合わせたサービスであるため、これら 2 つのスケーリング・ソリューションを使い分けることが可能です。 Volitions を使えば、一部のトランザクションについてはバリディアムによるオフチェーンのデータ可用性を活用しつつ、必要に応じてオンデータのデータ可用性(ゼロ知識ロールアップ)も利用できる自由度を確保できるのです。 これにより、ユースケースごとの要請に応じて、どのトレードオフを選択するのかをユーザーが決定できます。 +Volitionsは、ゼロ知識ロールアップとバリディアムチェーンを組み合わせたサービスであるため、これら2つのスケーリング・ソリューションを使い分けることが可能です。 Volitionsを使えば、一部のトランザクションについてはバリディアムによるオフチェーンのデータ可用性を活用しつつ、必要に応じてオンデータのデータ可用性(ゼロ知識ロールアップ)も利用できる自由度を確保できるのです。 これにより、ユースケースごとの要請に応じて、どのトレードオフを選択するのかをユーザーが決定できます。 分散型取引所(DEX)の場合、高価値の取引に対してスケーラブルかつプライベートなインフラを提供するバリディアムが適しているかも知れません。 しかし同時に、より高いセキュリティ保証とトラストレス性を望むユーザーのために、ゼロ知識ロールアップを使用することもできます。 -## バリディアムにおける EVM との互換性 {#validiums-and-evm-compatibility} +## バリディアムにおけるEVMとの互換性 {#validiums-and-evm-compatibility} バリディアムは主に、ゼロ知識ロールアップと同じくトークンのスワップや決済といったシンプルな用途に適しています。 ゼロ知識の証明サーキットで[EVM](/developers/docs/evm/)の命令を証明しようとすると大きな間接費用が発生するため、バリディアムの実装において一般的な計算処理やスマートコントラクトの実行をサポートするのは困難です。 -一部のバリディアムのプロジェクトでは、効率的な証明のために最適化されたカスタムのバイトコードをコンパイルする際に EVM 互換の言語(例:Solidity、Vyper)を用いることで、この問題を回避しようとしています。 このアプローチは、ゼロ知識証明に対応したより新しい VM の場合に重要な EVM オペコードをサポートしていない可能性があるため、デベロッパは最善の利用体験を提供するために高レベル言語で直接コーディングしなければならないという欠点があります。 これにより、デベロッパはまったく新しい開発スタックを用いて Dapp を開発しなければならなくなり、現在のイーサリアム・インフラとの互換性が失われてしまうため、問題がさらに悪化します。 +一部のバリディアムのプロジェクトでは、効率的な証明のために最適化されたカスタムのバイトコードをコンパイルする際にEVM互換の言語(例:Solidity、Vyper)を用いることで、この問題を回避しようとしています。 このアプローチは、ゼロ知識証明に対応したより新しいVMの場合に重要なEVMオペコードをサポートしていない可能性があるため、デベロッパは最善の利用体験を提供するために高レベル言語で直接コーディングしなければならないという欠点があります。 これにより、デベロッパはまったく新しい開発スタックを用いてDappを開発しなければならなくなり、現在のイーサリアム・インフラとの互換性が失われてしまうため、問題がさらに悪化します。 -しかし一部の開発チームでは、既存の EVM オペコードをゼロ知識証明サーキットのために最適化する作業を進めています。 この取り組みを通じて、プログラムの正確な実行を証明する EVM 互換の VM としてのゼロ知識イーサリアム仮想マシン(zkEVM)の開発が期待されています。 ZkEVM が実現した場合、バリディアムチェーンはオフチェーンでスマートコントラクトを実行し、有効性証明を送信することで、オフチェーンにおける計算をイーサリアム上で(再実行せずに)証明することができます。 +しかし一部の開発チームでは、既存のEVMオペコードをゼロ知識証明サーキットのために最適化する作業を進めています。 この取り組みを通じて、プログラムの正確な実行を証明するEVM互換のVMとしてのゼロ知識イーサリアム仮想マシン(zkEVM)の開発が期待されています。 ZkEVMが実現した場合、バリディアムチェーンはオフチェーンでスマートコントラクトを実行し、有効性証明を送信することで、オフチェーンにおける計算をイーサリアム上で(再実行せずに)証明することができます。 -[zkEVM の詳細](https://www.alchemy.com/overviews/zkevm)をご覧ください。 +[zkEVMの詳細](https://www.alchemy.com/overviews/zkevm)をご覧ください。 ## バリディアムは、イーサリアムのスケーラビリティをどのように向上させるのか? {#scaling-ethereum-with-validiums} ### 1. オフチェーンにおけるデータ保存 {#off-chain-data-storage} -オプティミスティック・ロールアップやゼロ知識ロールアップといったレイヤー 2 のスケーリングプロジェクトでは、純粋にオフチェーンのみを活用したスケーリング・プロトコル(例:[プラズマ](/developers/docs/scaling/plasma/))の場合に実現可能な無限のスケーラビリティを犠牲にする代わりに、トランザクションデータの一部を L1 上で公開することでセキュリティを強化しています。 しかし同時に、ロールアップのスケーラビリティに関する特性は、イーサリアムメインネットのデータ帯域により制限されます([データシャーディング](/upgrades/sharding/)では、この理由により、イーサリアムのデータストレージ容量の向上を提案しています)。 +オプティミスティック・ロールアップやゼロ知識ロールアップといったレイヤー2のスケーリングプロジェクトでは、純粋にオフチェーンのみを活用したスケーリング・プロトコル(例:[プラズマ](/developers/docs/scaling/plasma/))の場合に実現可能な無限のスケーラビリティを犠牲にする代わりに、トランザクションデータの一部をL1上で公開することでセキュリティを強化しています。 しかし同時に、ロールアップのスケーラビリティに関する特性は、イーサリアムメインネットのデータ帯域により制限されます([データシャーディング](/roadmap/danksharding/)では、この理由により、イーサリアムのデータストレージ容量の向上を提案しています)。 バリディアムでは、すべてのトランザクションデータをオフチェーンで保存し、状態アップデートをメインのイーサリアムチェーンにリレーする際にのみ状態コミットメント(および有効性証明)を送信することでスケーラビリティを達成しています。 しかしバリディアムは、有効性証明を用いることで、その他の純粋にオフチェーンのスケーリングソリューション(プラズマや[サイドチェーン](/developers/docs/scaling/sidechains/))よりも高いセキュリティ保証を提供しています。 バリディアムでは、イーサリアムがオフチェーンのトランザクションを検証する前に処理しなければならないデータ量が軽減されるため、メインネットのスループットを大きく改善できる設計を実現しています。 ### 2. 再帰的証明 {#recursive-proofs} -再帰的な証明とは、他の証明の有効性を証明する有効性証明です。 このような「証明に対する証明」は、最終的にこれまで作成されたすべての証明を証明できる 1 つの最終証明が作成されるまで、複数の証明を再帰的に集約することで実行されます。 再帰的証明は、1 件の有効性証明で検証できるトランザクションの数を増やすため、ブロックチェーンの処理速度におけるスケーラビリティ向上を実現します。 +再帰的な証明とは、他の証明の有効性を証明する有効性証明です。 このような「証明に対する証明」は、最終的にこれまで作成されたすべての証明を証明できる1つの最終証明が作成されるまで、複数の証明を再帰的に集約することで実行されます。 再帰的証明は、1件の有効性証明で検証できるトランザクションの数を増やすため、ブロックチェーンの処理速度におけるスケーラビリティ向上を実現します。 -通常、バリディアムのオペレーターがイーサリアムに提出する有効性証明は、単一のブロック全体を検証します。 これに対し、再帰的証明では、1 件の再帰的証明を用いてバリディアム上の複数のブロックの有効性を同時に確認することができます。これは、再帰的証明のサーキットにおいては、複数のブロック証明を 1 件の最終証明に再帰的に集約できるためです。 オンチェーンの検証者コントラクトがこの再帰的証明を承認すると、その対象である裏付けのブロックすべてがただちに確定します。 +通常、バリディアムのオペレーターがイーサリアムに提出する有効性証明は、単一のブロック全体を検証します。 これに対し、再帰的証明では、1件の再帰的証明を用いてバリディアム上の複数のブロックの有効性を同時に確認することができます。これは、再帰的証明のサーキットにおいては、複数のブロック証明を1件の最終証明に再帰的に集約できるためです。 オンチェーンの検証者コントラクトがこの再帰的証明を承認すると、その対象である裏付けのブロックすべてがただちに確定します。 ## バリディアムの長所と短所 {#pros-and-cons-of-validium} -| 長所 | 短所 | -| -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 有効性証明により、オフチェーンにおけるトランザクションの完全性が確保でき、オペレーターが無効な状態アップデートをファイナライズできなくなる。 | 有効性証明を生成するには特別なハードウェアが必要なため、分散化が低下するリスクがある。 | -| ユーザーがより効率的に資金を利用できる(イーサリアムへの資金引き出しにおいて、遅延が発生しない)。 | 汎用的な計算/スマートコントラクトに対するサポートが限定的であり、開発には特殊な言語が必要である。 | -| 高価値の取引用に用いられる不正証明ベースのシステムを標的とする一部の経済的攻撃に対する脆弱性がない。 | ゼロ知識証明を生成するには高い処理能力が必要であり、低スループットの用途においてはコスト効率が悪い。 | -| calldata をイーサリアムメインネットに送信しないため、ユーザーのガス代が軽減される。 | ユーザーの主観ではファイナリティを得るまでの時間が長い(ゼロ知識証明を生成するのに 10〜30 分が必要)が、紛争による遅延が生じないため、完全なファイナリティはより迅速に得られる。 | -| トランザクションにおけるプライバシーやスケーラビリティが重視される資金取引やブロックチェーンゲームなど、特定のユースケースに適している。 | 所有権に対するマークル証明を生成するには常にオフチェーンのデータが利用可能でなければならないため、ユーザーの資金引き出しが妨害される可能性がある。 | -| オフチェーンにおけるデータの可用性により、より高いスループットとスケーラビリティが実現できる。 | 純粋に暗号論的なセキュリティメカニズムに依存しているゼロ知識ロールアップとは異なり、信頼性の前提と暗号経済的なインセンティブに依存したセキュリティモデルである。 | +| 長所 | 短所 | +| ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| 有効性証明により、オフチェーンにおけるトランザクションの完全性が確保でき、オペレーターが無効な状態アップデートをファイナライズできなくなる。 | 有効性証明を生成するには特別なハードウェアが必要なため、分散化が低下するリスクがある。 | +| ユーザーがより効率的に資金を利用できる(イーサリアムへの資金引き出しにおいて、遅延が発生しない)。 | 汎用的な計算/スマートコントラクトに対するサポートが限定的であり、開発には特殊な言語が必要である。 | +| 高価値の取引用に用いられる不正証明ベースのシステムを標的とする一部の経済的攻撃に対する脆弱性がない。 | ゼロ知識証明を生成するには高い処理能力が必要であり、低スループットの用途においてはコスト効率が悪い。 | +| calldataをイーサリアムメインネットに送信しないため、ユーザーのガス代が軽減される。 | ユーザーの主観ではファイナリティを得るまでの時間が長い(ゼロ知識証明を生成するのに10〜30分が必要)が、紛争による遅延が生じないため、完全なファイナリティはより迅速に得られる。 | +| トランザクションにおけるプライバシーやスケーラビリティが重視される資金取引やブロックチェーンゲームなど、特定のユースケースに適している。 | 所有権に対するマークル証明を生成するには常にオフチェーンのデータが利用可能でなければならないため、ユーザーの資金引き出しが妨害される可能性がある。 | +| オフチェーンにおけるデータの可用性により、より高いスループットとスケーラビリティが実現できる。 | 純粋に暗号論的なセキュリティメカニズムに依存しているゼロ知識ロールアップとは異なり、信頼性の前提と暗号経済的なインセンティブに依存したセキュリティモデルである。 | -### バリディアム/Volitions の活用 {#use-validium-and-volitions} +### バリディアム/Volitionsの活用 {#use-validium-and-volitions} -複数のプロジェクトにより、Dapp に組み込み可能なバリディアムおよび Volitions の実装が提供されています。 +複数のプロジェクトにより、Dappに組み込み可能なバリディアムおよびVolitionsの実装が提供されています。 -**StarkWare StarkEx** - _StarkEx は、有効性証明ベースのイーサリアムレイヤー 2((L2)の スケーリング・ソリューションです。 ゼロ知識ロールアップあるいはバリディアムのいずれかを用いたデータ可用性モードを選択できます。_ +**StarkWare StarkEx** - _StarkExは、有効性証明ベースのイーサリアムレイヤー2((L2)の スケーリング・ソリューションです。 ゼロ知識ロールアップあるいはバリディアムのいずれかを用いたデータ可用性モードを選択できます。_ - [ドキュメント](https://docs.starkware.co/starkex-v4/starkex-deep-dive/data-availability-modes#validium) - [ウェブサイト](https://starkware.co/starkex/) -**Matter Labs zkPorter**- _zkPorter は、ゼロ知識ロールアップとシャーディングを結合したハイブリッド型のアプローチによりデータ化要請を追跡する、レイヤー 2 のスケーリング・プロトコルです。 任意の数のシャードをサポートしており、シャードごとに異なるデータ可用性ポリシーを定めることができます。_ +**Matter Labs zkPorter**- _zkPorterは、ゼロ知識ロールアップとシャーディングを結合したハイブリッド型のアプローチによりデータ化要請を追跡する、レイヤー2のスケーリング・プロトコルです。 任意の数のシャードをサポートしており、シャードごとに異なるデータ可用性ポリシーを定めることができます。_ - [ドキュメント](https://docs.zksync.io/zkevm/#what-is-zkporter) - [ウェブサイト](https://zksync.io/) ## 参考文献 {#further-reading} -- [バリディアムとレイヤー 2 のツー・バイ・ツー:第 99 号](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) +- [バリディアムとレイヤー2のツー・バイ・ツー:第99号](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) - [ゼロ知識ロールアップとバリディアムの比較](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) -- [Volition および新たなデータ可用性のアプローチ](https://medium.com/starkware/volition-and-the-emerging-data-availability-spectrum-87e8bfa09bb) -- [ロールアップ、バリディアム、そして Volitions:イーサリアムにおける最新のスケーリングソリューションについて知る](https://www.defipulse.com/blog/rollups-validiums-and-volitions-learn-about-the-hottest-ethereum-scaling-solutions) +- [Volitionおよび新たなデータ可用性のアプローチ](https://medium.com/starkware/volition-and-the-emerging-data-availability-spectrum-87e8bfa09bb) +- [ロールアップ、バリディアム、そしてVolitions:イーサリアムにおける最新のスケーリングソリューションについて知る](https://www.defipulse.com/blog/rollups-validiums-and-volitions-learn-about-the-hottest-ethereum-scaling-solutions) 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 7a2f24d257b..ecd73e8f859 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 @@ -4,107 +4,107 @@ description: イーサリアムコミュニティで利用されるスケーリ lang: ja --- -ゼロ知識ロールアップ(ZK ロールアップ)とは、計算および状態保存をオフチェーンで実行することで、イーサリアムメインネットのスループットを向上するための、レイヤー 2 の[スケーリングソリューション](/developers/docs/scaling/)です。 ZK ロールアップは、数千件のトランザクションをバッチ処理した上で、最低限のサマリーデータのみをメインネットに書き込みます。 このサマリーデータには、イーサリアムの状態に対して変更すべき事項の定義と、それらの変更が正しいことを示す暗号学的証明が含まれます。 +ゼロ知識ロールアップ(ZKロールアップ)とは、計算および状態保存をオフチェーンで実行することで、イーサリアムメインネットのスループットを向上するための、レイヤー2の[スケーリングソリューション](/developers/docs/scaling/)です。 ZKロールアップは、数千件のトランザクションをバッチ処理した上で、最低限のサマリーデータのみをメインネットに書き込みます。 このサマリーデータには、イーサリアムの状態に対して変更すべき事項の定義と、それらの変更が正しいことを示す暗号学的証明が含まれます。 ## 前提知識 {#prerequisites} -[イーサリアムのスケーリング](/developers/docs/scaling/)と[レイヤー 2](/layer-2)のページを読んで理解しておくことをお勧めします。 +[イーサリアムのスケーリング](/developers/docs/scaling/)と[レイヤー2](/layer-2)のページを読んで理解しておくことをお勧めします。 ## ゼロ知識ロールアップとは何か? {#what-are-zk-rollups} -**ゼロ知識ロールアップ(ZK ロールアップ)**は、複数のトランザクションをひとつのバッチにまとめて(ロールアップする)、このバッチをオフチェーンで実行します。 計算をオフチェーンで実行することで、ブロックチェーンに書き込む必要があるデータの量を削減することができます。 ZK ロールアップのオペレーターは、個別のトランザクションを送信する代わりに、バッチに含まれるすべてのトランザクションを実行するのに必要な変更のサマリーのみを送信します。 同時に、これらの変更の正しさを証明するために、[有効性証明](/glossary/#validity-proof)を生成します。 この有効性証明は、暗号論的な確実性に基づき、イーサリアムの状態に対する提案された変更が、バッチに含まれるすべてのトランザクションを実行した真の結果であることを証明します。 +**ゼロ知識ロールアップ(ZKロールアップ)**は、複数のトランザクションをひとつのバッチにまとめて(ロールアップする)、このバッチをオフチェーンで実行します。 計算をオフチェーンで実行することで、ブロックチェーンに書き込む必要があるデータの量を削減することができます。 ZKロールアップのオペレーターは、個別のトランザクションを送信する代わりに、バッチに含まれるすべてのトランザクションを実行するのに必要な変更のサマリーのみを送信します。 同時に、これらの変更の正しさを証明するために、[有効性証明](/glossary/#validity-proof)を生成します。 -ZK ロールアップの状態は、イーサリアムネットワーク上でデプロイされたスマートコントラクトにより管理されます。 ZK ロールアップの状態を更新するために、ZK ロールアップのノードは検証のための有効性証明を送信する必要があります。 前述したように、この有効性証明は、ロールアップにより提案された状態の変更が、バッチに含まれるトランザクションを実行した結果と同一であることを暗号論的に保証します。 つまり、ZK ロールアップを用いる場合、[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups/)の場合のようにすべてのトランザクションデータをイーサリアムに書き込む必要はなく、有効性証明を提要するだけでイーサリアム上のトランザクションをファイナライズすることができます。 +ZKロールアップの状態は、イーサリアムネットワーク上でデプロイされたスマートコントラクトにより管理されます。 ZKロールアップの状態を更新するために、ZKロールアップのノードは検証のための有効性証明を送信する必要があります。 前述したように、この有効性証明は、ロールアップにより提案された状態の変更が、バッチに含まれるトランザクションを実行した結果と同一であることを暗号論的に保証します。 つまり、ZKロールアップを用いる場合、[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups/)の場合のようにすべてのトランザクションデータをイーサリアムに書き込む必要はなく、有効性証明を提要するだけでイーサリアム上のトランザクションをファイナライズすることができます。 -ZK ロールアップのコントラクトが有効性証明が正しいことを確認した時点で出金トランザクションが実行されるため、ZK ロールアップからイーサリアムの資金移動において遅延が発生しません。 一方、オプティミスティック・ロールアップからの資金の引き出しの場合、すべてのユーザーが[不正証明](/glossary/#fraud-proof)を用いて出金トランザクションに対してチャレンジできるようにするための遅延期間が必要になります。 +ZKロールアップのコントラクトが有効性証明が正しいことを確認した時点で出金トランザクションが実行されるため、ZKロールアップからイーサリアムの資金移動において遅延が発生しません。 一方、オプティミスティック・ロールアップからの資金の引き出しの場合、すべてのユーザーが[不正証明](/glossary/#fraud-proof)を用いて出金トランザクションに対してチャレンジできるようにするための遅延期間が必要になります。 -ZK ロールアップでは、トランザクションを`calldata`としてイーサリアムに書き込みます。 `calldata` とは、スマートコントラクトの関数を外部から呼び出す際に含まれるデータが格納される場所を指します。 `calldata` に含まれる情報はブロックチェーン上で公開されるため、すべてのユーザーが独自にロールアップの状態を再構築することができます。 ZK ロールアップでは、圧縮技術を用いてトランザクションデータのサイズを縮小します。例えば、アカウントはアドレスではなくインデックスで表されるため、28 バイト分のデータが節約できます。 ロールアップにおいては、オンチェーンへのデータ公開が大きなコストとなるため、データ圧縮はユーザー費用を引き下げる効果を持ちます。 +ZKロールアップでは、トランザクションを`calldata`としてイーサリアムに書き込みます。 `calldata` とは、スマートコントラクトの関数を外部から呼び出す際に含まれるデータが格納される場所を指します。 `calldata` に含まれる情報はブロックチェーン上で公開されるため、すべてのユーザーが独自にロールアップの状態を再構築することができます。 ZKロールアップでは、圧縮技術を用いてトランザクションデータのサイズを縮小します。例えば、アカウントはアドレスではなくインデックスで表されるため、28バイト分のデータが節約できます。 ロールアップにおいては、オンチェーンへのデータ公開が大きなコストとなるため、データ圧縮はユーザー費用を引き下げる効果を持ちます。 -## ZK ロールアップは、イーサリアムとどのようにやりとりするか? {#zk-rollups-and-ethereum} +## ZKロールアップは、イーサリアムとどのようにやりとりするか? {#zk-rollups-and-ethereum} -ZK ロールアップのチェーンは、イーサリアムブロックチェーン上で動作するオフチェーンのプロトコルであり、イーサリアムのオンチェーンのスマートコントラクトにより管理されます。 ZK ロールアップでは、メインネット外でトランザクションを実行しますが、オフチェーンのトランザクションをまとめたバッチをオンチェーンのロールアップコントラクトに定期的に書き込みます。 このトランザクション記録は、イーサリアムブロックチェーンの場合と同様に改変不可であり、ZK ロールアップのチェーンを形成します。 +ZKロールアップのチェーンは、イーサリアムブロックチェーン上で動作するオフチェーンのプロトコルであり、イーサリアムのオンチェーンのスマートコントラクトにより管理されます。 ZKロールアップでは、メインネット外でトランザクションを実行しますが、オフチェーンのトランザクションをまとめたバッチをオンチェーンのロールアップコントラクトに定期的に書き込みます。 このトランザクション記録は、イーサリアムブロックチェーンの場合と同様に改変不可であり、ZKロールアップのチェーンを形成します。 -ZK ロールアップのコアアーキテクチャは、以下のコンポーネントで構成されます: +ZKロールアップのコアアーキテクチャは、以下のコンポーネントで構成されます: -1. **オンチェーンのコントラクト**: 前述した通り、ZK ロールアップのプロトコルはイーサリアム上で実行されるスマートコントラクトにより管理されます。 これには、ロールアップの各ブロックを保存し、入金状態を追跡し、状態更新を監視するメインのコントラクトが含まれます。 オンチェーンにおけるもう一つのコントラクト(検証者コントラクト)は、ブロック生成者が送信したゼロ知識証明を検証します。 つまり、イーサリアムは ZK ロールアップにおけるベースレイヤー(「レイヤー 1」)の役割を果たします。 +1. **オンチェーンのコントラクト**: 前述した通り、ZKロールアップのプロトコルはイーサリアム上で実行されるスマートコントラクトにより管理されます。 これには、ロールアップの各ブロックを保存し、入金状態を追跡し、状態更新を監視するメインのコントラクトが含まれます。 オンチェーンにおけるもう一つのコントラクト(検証者コントラクト)は、ブロック生成者が送信したゼロ知識証明を検証します。 つまり、イーサリアムはZKロールアップにおけるベースレイヤー(「レイヤー1」)の役割を果たします。 -2. **オフチェーンの仮想マシン(VM)**: ZK ロールアップのプロトコルはイーサリアム上に置かれますが、トランザクションの実行および状態保存は、[EVM](/developers/docs/evm/)とは独立した別個の仮想マシン上で行われます。 このオフチェーンの仮想マシンは、ZK ロールアップ上のトランザクションに対する実行環境であり、ZK ロールアップのプロトコルにおける第 2 層(つまり、「レイヤー 2」)の役割を果たします。 イーサリアムメインネット上で検証された有効性証明により、オフチェーンの VM における状態遷移の正しさが保証されます。 +2. **オフチェーンの仮想マシン(VM)**: ZKロールアップのプロトコルはイーサリアム上に置かれますが、トランザクションの実行および状態保存は、[EVM](/developers/docs/evm/)とは独立した別個の仮想マシン上で行われます。 このオフチェーンの仮想マシンは、ZKロールアップ上のトランザクションに対する実行環境であり、ZKロールアップのプロトコルにおける第2層(つまり、「レイヤー2」)の役割を果たします。 イーサリアムメインネット上で検証された有効性証明により、オフチェーンのVMにおける状態遷移の正しさが保証されます。 -ZK ロールアップは、イーサリアムとは別個に実行されるもののセキュリティについてはイーサリアムに依存するオフチェーンのプロトコルであるため、「ハイブリッド型のスケーリング・ソリューション」であると言えます。 具体的には、イーサリアムネットワークが ZK ロールアップにおける状態更新が有効であることを強制し、ロールアップの状態更新の裏付けとなるデータの可用性を保証します。 この結果、ZK ロールアップは、それ自体がセキュリティ特性の維持に責任を負う[サイドチェーン](/developers/docs/scaling/sidechains/)や、[バリディアム](/developers/docs/scaling/validium/)のように、有効性証明によりイーサリアム上でトランザクションを検証する点は共通しているもののトランザクションデータを別の場所に保存する、純粋にオフチェーンのみを活用したスケーリング・ソリューションと比較すると、大幅に安全性が高いと言えます。 +ZKロールアップは、イーサリアムとは別個に実行されるもののセキュリティについてはイーサリアムに依存するオフチェーンのプロトコルであるため、「ハイブリッド型のスケーリング・ソリューション」であると言えます。 具体的には、イーサリアムネットワークがZKロールアップにおける状態更新が有効であることを強制し、ロールアップの状態更新の裏付けとなるデータの可用性を保証します。 この結果、ZKロールアップは、それ自体がセキュリティ特性の維持に責任を負う[サイドチェーン](/developers/docs/scaling/sidechains/)や、[バリディアム](/developers/docs/scaling/validium/)のように、有効性証明によりイーサリアム上でトランザクションを検証する点は共通しているもののトランザクションデータを別の場所に保存する、純粋にオフチェーンのみを活用したスケーリング・ソリューションと比較すると、大幅に安全性が高いと言えます。 -ZK ロールアップでは、以下の事項につきメインのイーサリアムプロトコルに依存します: +ZKロールアップでは、以下の事項につきメインのイーサリアムプロトコルに依存します: ### データ可用性 {#data-availability} -ZK ロールアップでは、オフチェーンで処理されたすべてのトランザクションの状態データをイーサリアムに書き込みます。 個人または企業のユーザーは、このデータを用いてロールアップの状態を再現し、チェーン自体を検証することができます。 イーサリアムでは、ネットワークのすべての参加者に対し、このデータを`calldata`として提供します。 +ZKロールアップでは、オフチェーンで処理されたすべてのトランザクションの状態データをイーサリアムに書き込みます。 個人または企業のユーザーは、このデータを用いてロールアップの状態を再現し、チェーン自体を検証することができます。 イーサリアムでは、ネットワークのすべての参加者に対し、このデータを`calldata`として提供します。 -ZK ロールアップでは、状態遷移の正しさがすでに有効性証明により検証済みであるため、オンチェーンに書き込む必要があるトランザクションデータの量は多くありません。 それにも関わらず、データをオンチェーンで保存するのが重要である理由は、これにより LC チェーンの状態をパーミッションレスかつ独立して検証できるようになるからであり、これにより、トランザクションをバッチ化して送信するすべてのユーザーは、悪意のオペレーターがチェーンを検閲したり、凍結したりするのを防ぐことができます。 +ZKロールアップでは、状態遷移の正しさがすでに有効性証明により検証済みであるため、オンチェーンに書き込む必要があるトランザクションデータの量は多くありません。 それにも関わらず、データをオンチェーンで保存するのが重要である理由は、これによりLCチェーンの状態をパーミッションレスかつ独立して検証できるようになるからであり、これにより、トランザクションをバッチ化して送信するすべてのユーザーは、悪意のオペレーターがチェーンを検閲したり、凍結したりするのを防ぐことができます。 ユーザーは、ロールアップとのやりとりを実行する場合にオンチェーンでなければなりません。 状態データへのアクセス権限を持たないユーザーは、各自のアカウント残高を照会したり、状態情報に依存する取引(例:出金)を開始することができません。 ### トランザクションのファイナリティ {#transaction-finality} -イーサリアムは、ZK ロールアップに対する決済レイヤーの役割を果たします。つまり、L2 上のトランザクションは、L1 のコントラクトが有効性証明を承認してはじめてファイナライズされます。 これにより、すべてのトランザクションがメインネット上の承認を必要とするため、悪意のオペレーターがチェーンを毀損する(例:ロールアップ上の資金を窃盗する)リスクが除去されます。 イーサリアムはさらに、L1 上でファイナライズされた操作は取消不能であることを保証します。 +イーサリアムは、ZKロールアップに対する決済レイヤーの役割を果たします。つまり、L2上のトランザクションは、L1のコントラクトが有効性証明を承認してはじめてファイナライズされます。 これにより、すべてのトランザクションがメインネット上の承認を必要とするため、悪意のオペレーターがチェーンを毀損する(例:ロールアップ上の資金を窃盗する)リスクが除去されます。 イーサリアムはさらに、L1上でファイナライズされた操作は取消不能であることを保証します。 ### 検閲耐性 {#censorship-resistance} -大部分の ZK ロールアップでは、トンラザクションの実行、バッチの生成、および L1 へのブロック送信を「スーパーノード」(オペレーターと呼ぶ)が担います。 このアプローチは、効率性を向上させる一方で、検閲のリスクを高めるものです。ZK ロールアップのオペレーターが悪意を持つ場合、特定のトランザクションをバッチに含めないことで、それらのトランザクションを行いたいユーザーを検閲できるからです。 +大部分のZKロールアップでは、トンラザクションの実行、バッチの生成、およびL1へのブロック送信を「スーパーノード」(オペレーターと呼ぶ)が担います。 このアプローチは、効率性を向上させる一方で、検閲のリスクを高めるものです。ZKロールアップのオペレーターが悪意を持つ場合、特定のトランザクションをバッチに含めないことで、それらのトランザクションを行いたいユーザーを検閲できるからです。 -ZK ロールアップでは、セキュリティ対策として、ユーザーがオペレーターの検閲を受けていると考える場合はロールアップ上のコントラクトを直接メインネットに送信することを許可しています。 これにより、オペレーターの許可なしで、ZK ロールアップからイーサリアムへの出金を強制実行することができます。 +ZKロールアップでは、セキュリティ対策として、ユーザーがオペレーターの検閲を受けていると考える場合はロールアップ上のコントラクトを直接メインネットに送信することを許可しています。 これにより、オペレーターの許可なしで、ZKロールアップからイーサリアムへの出金を強制実行することができます。 -## ZK ロールアップの仕組みとは? {#how-do-zk-rollups-work} +## ZKロールアップの仕組みとは? {#how-do-zk-rollups-work} ### トランザクション {#transactions} -ZK ロールアップのユーザーは、トランザクションに署名した上で、トランザクションの処理および次のバッチへの追加のために L2 オペレーターに送信します。 場合により、このオペレーターは、トランザクションを実行し、バッチ化した上で L1 に送信する中央集権的なエンティティ(シーケンサーと呼ぶ)の場合があります。 このシステムにおけるシーケンサーは、L2 のブロックを生成し、ロールアップのトランザクションを ZK ロールアップのコントラクトに追加できる唯一のエンティティです。 +ZKロールアップのユーザーは、トランザクションに署名した上で、トランザクションの処理および次のバッチへの追加のためにL2オペレーターに送信します。 場合により、このオペレーターは、トランザクションを実行し、バッチ化した上でL1に送信する中央集権的なエンティティ(シーケンサーと呼ぶ)の場合があります。 このシステムにおけるシーケンサーは、L2のブロックを生成し、ロールアップのトランザクションをZKロールアップのコントラクトに追加できる唯一のエンティティです。 -このアプローチを採用しない ZK ロールアップでは、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)による複数のバリデータがオペレーターの役割をローテーションで担います。 オペレーターに立候補するユーザーは、ロールアップのコントラクトに資金を入金し(ステーキング)、このステークの規模に応じて、次のロールアップ・バッチを生成する役割を与えられる可能性が増減します。 悪意の行動を行ったオペレーターのステークは没収されるため、有効なブロックの送信を促すインセンティブとして機能します。 +このアプローチを採用しないZKロールアップでは、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)による複数のバリデータがオペレーターの役割をローテーションで担います。 オペレーターに立候補するユーザーは、ロールアップのコントラクトに資金を入金し(ステーキング)、このステークの規模に応じて、次のロールアップ・バッチを生成する役割を与えられる可能性が増減します。 悪意の行動を行ったオペレーターのステークは没収されるため、有効なブロックの送信を促すインセンティブとして機能します。 -#### ZK ロールアップにおいてトランザクションデータをイーサリアムに書き込む方法 {#how-zk-rollups-publish-transaction-data-on-ethereum} +#### ZKロールアップにおいてトランザクションデータをイーサリアムに書き込む方法 {#how-zk-rollups-publish-transaction-data-on-ethereum} すでに述べた通り、トランザクションデータは`calldata`としてイーサリアムに書き込まれます。 `calldata`とは、スマートコントラクトにおいて関数に引数を渡すためのデータ領域であり、[メモリ](/developers/docs/smart-contracts/anatomy/#memory)と同様に動作します。 `calldata` はイーサリアムの状態として保存されませんが、イーサリアムチェーンの[履歴ログ](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs)としてオンチェーン上で永続します。 `calldata` はイーサリアムの状態を変化させないため、オンチェーン上でのデータ保存が安価に実行できます。 -多くの場合、`calldata`におけるキーワードがトランザクションで呼び出されるスマートコントラクトのメソッドを決定し、当該メソッドへの入力を任意のバイト列として保持します。 ZK ロールアップでは、`calldata`を用いて圧縮されたトランザクションデータをオンチェーンに書き込みます。ロールアップのオペレーターの役割は、ロールアップのコントラクトにおいて要求される関数を呼び出し、関数の引数として圧縮データを渡すことにより新規バッチを追加することだけです。 このため、ロールアップにおける手数料の大半はトランザクションデータのオンチェーンの保存において発生するため、ユーザー手数料が軽減されます。 +多くの場合、`calldata`におけるキーワードがトランザクションで呼び出されるスマートコントラクトのメソッドを決定し、当該メソッドへの入力を任意のバイト列として保持します。 ZKロールアップでは、`calldata`を用いて圧縮されたトランザクションデータをオンチェーンに書き込みます。ロールアップのオペレーターの役割は、ロールアップのコントラクトにおいて要求される関数を呼び出し、関数の引数として圧縮データを渡すことにより新規バッチを追加することだけです。 このため、ロールアップにおける手数料の大半はトランザクションデータのオンチェーンの保存において発生するため、ユーザー手数料が軽減されます。 ### ステートコミットメント {#state-commitments} -L2 のアカウントおよび残高が含まれる ZK ロールアップの状態は、[マークルツリー](/whitepaper/#merkle-trees)として表示されます。 マークルツリーのルート(マークルルート)の暗号ハッシュがオンチェーンのコントラクトに保存されるため、ロールアップのプロトコルにより ZK ロールアップの状態変化を追跡することができます。 +L2のアカウントおよび残高が含まれるZKロールアップの状態は、[マークルツリー](/whitepaper/#merkle-trees)として表示されます。 マークルツリーのルート(マークルルート)の暗号ハッシュがオンチェーンのコントラクトに保存されるため、ロールアップのプロトコルによりZKロールアップの状態変化を追跡することができます。 -ロールアップは、一連の新たなトランザクションを実行することで、新しい状態に遷移します。 この状態遷移を開始したオペレーターは、新しい状態ルートを計算し、オンチェーンのコントラクトに送信しなければなりません。 当該バッチの有効性証明が検証者コントラクトにより承認されると、新たなマークルルートが ZK ロールアップにおける正規の状態ルートになります。 +ロールアップは、一連の新たなトランザクションを実行することで、新しい状態に遷移します。 この状態遷移を開始したオペレーターは、新しい状態ルートを計算し、オンチェーンのコントラクトに送信しなければなりません。 当該バッチの有効性証明が検証者コントラクトにより承認されると、新たなマークルルートがZKロールアップにおける正規の状態ルートになります。 -ZK ロールアップのオペレーターは、状態ルートを計算するだけでなく、バッチに含まれるすべてのトランザクションで構成されるマークルツリーのルートであるバッチルートも作成します。 新規バッチが送信されると、ロールアップのコントラクトがバッチルートを保存するため、ユーザーは当該バッチに特定のトランザクション(例:出金リクエスト)が含まれていたかを証明できます。 この場合ユーザーは、トランザクションの詳細、バッチルート、および追加パスを表示する[マークル証明](/developers/tutorials/merkle-proofs-for-offline-data-integrity/)を提供しなければなりません。 +ZKロールアップのオペレーターは、状態ルートを計算するだけでなく、バッチに含まれるすべてのトランザクションで構成されるマークルツリーのルートであるバッチルートも作成します。 新規バッチが送信されると、ロールアップのコントラクトがバッチルートを保存するため、ユーザーは当該バッチに特定のトランザクション(例:出金リクエスト)が含まれていたかを証明できます。 この場合ユーザーは、トランザクションの詳細、バッチルート、および追加パスを表示する[マークル証明](/developers/tutorials/merkle-proofs-for-offline-data-integrity/)を提供しなければなりません。 ### 有効性証明 {#validity-proofs} -ZK ロールアップのオペレーターが L1 のコントラクトに送信する新しい状態ルートは、ロールアップにおける状態更新の結果です。 例えば、アリスがボブに 10 トークンを送信する場合、オペレーターは単にアリスの残高を 10 減らし、ボブの残高を 10 増やします。 オペレーターはその上で、残高変更後のアカウントデータをハッシュ化し、ロールアップのマークルツリーを再構築した上で、新しいマークルルートをオンチェーンのコントラクトに送信します。 +ZKロールアップのオペレーターがL1のコントラクトに送信する新しい状態ルートは、ロールアップにおける状態更新の結果です。 例えば、アリスがボブに10トークンを送信する場合、オペレーターは単にアリスの残高を10減らし、ボブの残高を10増やします。 オペレーターはその上で、残高変更後のアカウントデータをハッシュ化し、ロールアップのマークルツリーを再構築した上で、新しいマークルルートをオンチェーンのコントラクトに送信します。 -しかし、ロールアップのコントラクトは、オペレーターがこの新しいマークルルートがロールアップの状態に対する正しい更新によって生成されたことを証明するまでは、提案された状態コミットメントを自動的に承認しません。 ZK ロールアップのオペレーターは、バッチ化されたトランザクションの正しさを証明する簡潔な暗号学的コミットメントである有効性証明を生成することで、これを証明します。 +しかし、ロールアップのコントラクトは、オペレーターがこの新しいマークルルートがロールアップの状態に対する正しい更新によって生成されたことを証明するまでは、提案された状態コミットメントを自動的に承認しません。 ZKロールアップのオペレーターは、バッチ化されたトランザクションの正しさを証明する簡潔な暗号学的コミットメントである有効性証明を生成することで、これを証明します。 -有効性証明は、ステートメント自体を示さずにその正しさを証明するものであるため、ゼロ知識証明とも呼ばれます。 ZK ロールアップでは、有効性証明を用いることで、トランザクションをイーサリアム上で再実行することなく、オフチェーンの状態遷移の正しさを確認することができるのです。 この有効性証明には、[ZK-SNARK](https://arxiv.org/abs/2202.06877)(ゼロ知識の簡潔かつ非双方向の知識アーギュメント)または[ZK-STARK](https://eprint.iacr.org/2018/046)(ゼロ知識のスケーラブルかつ透明性を持った知識アーギュメント)の 2 種類があります。 +有効性証明は、ステートメント自体を示さずにその正しさを証明するものであるため、ゼロ知識証明とも呼ばれます。 ZKロールアップでは、有効性証明を用いることで、トランザクションをイーサリアム上で再実行することなく、オフチェーンの状態遷移の正しさを確認することができるのです。 この有効性証明には、[ZK-SNARK](https://arxiv.org/abs/2202.06877)(ゼロ知識の簡潔かつ非双方向の知識アーギュメント)または[ZK-STARK](https://eprint.iacr.org/2018/046)(ゼロ知識のスケーラブルかつ透明性を持った知識アーギュメント)の2種類があります。 -SNARK および STARK のいずれも ZK ロールアップにおけるオフチェーンの計算処理の完全性を証明するのに有益ですが、それぞれが独自の機能を持ちます。 +SNARKおよびSTARKのいずれもZKロールアップにおけるオフチェーンの計算処理の完全性を証明するのに有益ですが、それぞれが独自の機能を持ちます。 **ZK-SNARK** -ZK-SNARK のプロトコルが機能するには、共通参照文字列(CRS)を生成する必要があります。この CRS は、有効性証明を証明、検証するための公開パラメータを提供します。 証明システムのセキュリティは、この CRS の設定に依存しています。つまり、公開パラメータが悪意のアクターに所有された場合、虚偽の有効性証明が生成可能になります。 +ZK-SNARKのプロトコルが機能するには、共通参照文字列(CRS)を生成する必要があります。このCRSは、有効性証明を証明、検証するための公開パラメータを提供します。 証明システムのセキュリティは、このCRSの設定に依存しています。つまり、公開パラメータが悪意のアクターに所有された場合、虚偽の有効性証明が生成可能になります。 -一部の ZK ロールアップでは、ZK-SNARK の証明サーキットに対する公開パラメータの生成を信頼された個人ユーザーが参加する[複数当事者による計算セレモニー(MPC)](https://zkproof.org/2021/06/30/setup-ceremonies/amp/)で実行することで、この問題を解消しようとします。 MPC では、各参加者が CRS を構築する際に一定のランダム性(「毒性廃棄物」と呼ぶ)を提供した上で、そのランダム性をただちに破壊しなければなりません。 +一部のZKロールアップでは、ZK-SNARKの証明サーキットに対する公開パラメータの生成を信頼された個人ユーザーが参加する[複数当事者による計算セレモニー(MPC)](https://zkproof.org/2021/06/30/setup-ceremonies/amp/)で実行することで、この問題を解消しようとします。 MPCでは、各参加者がCRSを構築する際に一定のランダム性(「毒性廃棄物」と呼ぶ)を提供した上で、そのランダム性をただちに破壊しなければなりません。 -このような信頼されたユーザーによる関与は、CRS 設定のセキュリティを高めるためのものです。 参加者のうち少なくとも 1 名が正直にインプットを破壊すれば、ZK-SNARK のシステムにおけるセキュリティが保証できます。 しかしこのアプローチでも、システムのセキュリティ保証を毀損しないためには、「参加者は提供したランダム性を消去するはずだ」という信頼が必要になる点は変わりがありません。 +このような信頼されたユーザーによる関与は、CRS設定のセキュリティを高めるためのものです。 参加者のうち少なくとも1名が正直にインプットを破壊すれば、ZK-SNARKのシステムにおけるセキュリティが保証できます。 しかしこのアプローチでも、システムのセキュリティ保証を毀損しないためには、「参加者は提供したランダム性を消去するはずだ」という信頼が必要になる点は変わりがありません。 -ZK-SNARK は、このような信頼の前提という問題を抱えているものの、証明の規模が小さく、一定時間による検証が可能なために広く用いられています。 ZK ロールアップの運用コストの大部分は L1 における有効性証明の検証において発生するため、L2 では、ZK-SNARK を用いることで、メインネット上で迅速かつ安価に検証可能な有効性証明を生成できるのです。 +ZK-SNARKは、このような信頼の前提という問題を抱えているものの、証明の規模が小さく、一定時間による検証が可能なために広く用いられています。 ZKロールアップの運用コストの大部分はL1における有効性証明の検証において発生するため、L2では、ZK-SNARKを用いることで、メインネット上で迅速かつ安価に検証可能な有効性証明を生成できるのです。 **ZK-STARK** -ZK-STARK は、オフチェーンにおける計算につき、そのインプットを示すことなく正しさを証明できるという点では ZK-SNARK と同じです。 しかし、スケーラビリティおよび透明性において、ZK-STARK は ZK-SNARK よりも優れていると評価されています。 +ZK-STARKは、オフチェーンにおける計算につき、そのインプットを示すことなく正しさを証明できるという点ではZK-SNARKと同じです。 しかし、スケーラビリティおよび透明性において、ZK-STARKはZK-SNARKよりも優れていると評価されています。 -ZK-STARK では、共通参照文字列(CRS)の信頼できる設定を必要としないため、「透明性」を持ちます。 ZK-STARK では、有効性証明の生成および検証につき、CRS の代わりに公開的に検証可能なランダム性を用いてパラメータを設定します。 +ZK-STARKでは、共通参照文字列(CRS)の信頼できる設定を必要としないため、「透明性」を持ちます。 ZK-STARKでは、有効性証明の生成および検証につき、CRSの代わりに公開的に検証可能なランダム性を用いてパラメータを設定します。 -ZK-STARK ではさらに、有効性証明を証明、検証するのに必要な時間が、証明を要する計算処理の複雑さに応じて*ほぼ線形的に*増化するため、ZK-SNARK よりもスケーラビリティが高いと言えます。 つまり ZK-SNARK では、証明を要する計算処理の規模に応じて、証明および検証に必要な時間が*線形的*に変化します。 このため ZK-STARK では、大規模なデータセットの証明、検証を ZK-SNARK よりも短時間で完了できるため、大規模なアプリケーションにとってより有益なのです。 +ZK-STARKではさらに、有効性証明を証明、検証するのに必要な時間が、証明を要する計算処理の複雑さに応じて_ほぼ線形的に_増化するため、ZK-SNARKよりもスケーラビリティが高いと言えます。 つまりZK-SNARKでは、証明を要する計算処理の規模に応じて、証明および検証に必要な時間が_線形的_に変化します。 このためZK-STARKでは、大規模なデータセットの証明、検証をZK-SNARKよりも短時間で完了できるため、大規模なアプリケーションにとってより有益なのです。 -ZK-STARK はさらに量子コンピュータに対してもセキュリティを防御できます。一方、ZK-SNARK で用いられている楕円曲線暗号(ECC)は、量子コンピュータによる攻撃に対して脆弱性を持つという意見が支配的です。 ZK-STARK の欠点としては、生成される有効性証明のサイズが大きくなるため、イーサリアム上での検証コストが高くなります。 +ZK-STARKはさらに量子コンピュータに対してもセキュリティを防御できます。一方、ZK-SNARKで用いられている楕円曲線暗号(ECC)は、量子コンピュータによる攻撃に対して脆弱性を持つという意見が支配的です。 ZK-STARKの欠点としては、生成される有効性証明のサイズが大きくなるため、イーサリアム上での検証コストが高くなります。 -#### ZK ロールアップにおいて、有効性証明はどのように機能するか? {#validity-proofs-in-zk-rollups} +#### ZKロールアップにおいて、有効性証明はどのように機能するか? {#validity-proofs-in-zk-rollups} ##### 有効性証明の生成 @@ -115,32 +115,32 @@ ZK-STARK はさらに量子コンピュータに対してもセキュリティ - トランザクションが正しく、ロールアップにおける送信者の公開鍵と一致すること。 - 送信者のノンスが正しいこと、など。 -ZK ロールアップのノードは、トランザクションが一定数に達すると、これらをバッチ化した上で、証明サーキット向けのインプットをコンパイルして簡潔なゼロ知識証明としてコンパイルします。 このゼロ知識証明には、以下が含まれます: +ZKロールアップのノードは、トランザクションが一定数に達すると、これらをバッチ化した上で、証明サーキット向けのインプットをコンパイルして簡潔なゼロ知識証明としてコンパイルします。 このゼロ知識証明には、以下が含まれます: -- バッチに含まれるすべてのトランザクションで構成されるマークルツリー。 +- A Merkle tree root comprising all the transactions in the batch. - 各トランザクションが当該バッチに含まれることを証明するマークル証明。 - トランザクションにおける送信者/受信者ペアのアカウントが、ロールアップのステートツリーに含まれることを証明するマークル証明。 - 各トランザクションに対する状態更新を適用した後の状態ルートの更新により得られる、プロセスの中間における状態ルートのセット(つまり、送信者アカウントの残高減と受信者アカウントの残高増)。 証明サーキットでは、各トランザクションを「ループ」させ、オペレーターがトランザクションを処理する事前に実行したのと同一のチェックを行うことにより、有効性証明を計算します。 証明サーキットではまず、提供されたマークル証明を用いて、送信者アカウントが既存のステートルートに含まれることを確認します。 次に、送信者の残高をマイナスし、ノンスを増やし、変更後のアカウントデータのハッシュをマークル証明と結合させて、新しいマークルルートを生成します。 -このマークルルートは、送信者の残高およびノンスにおける変更という ZK ロールアップの状態に対する唯一の変更を反映しています。 これが可能なのは、アカウントの存在を証明するためのマークル証明が新しいステートルートを導出するために用いられているためです。 +このマークルルートは、送信者の残高およびノンスにおける変更というZKロールアップの状態に対する唯一の変更を反映しています。 これが可能なのは、アカウントの存在を証明するためのマークル証明が新しいステートルートを導出するために用いられているためです。 証明サーキットは、これと同じプロセスを受信者アカウントに対しても実行します。 つまり、(マークル証明を用いて)プロセス中間のステートルートにおいて受信者アカウントが存在することを確認し、残高を増やした上で、アカウントデータを再度ハッシュ化し、マークル証明と結合することで、新しいステートルートを生成します。 -このプロセスを、各トランザクションに対して繰り返します。それぞれの「ループ」処理では、受信者アカウントの変更により新しいステートルートが生成され、受信者アカウントの変更によりさらに次の新しいステートルートが生成されます。 前述したように、このステートルートに対するそれぞれの更新は、ロールアップのステートツリーにおける 1 回の変化を反映したものです。 +このプロセスを、各トランザクションに対して繰り返します。それぞれの「ループ」処理では、受信者アカウントの変更により新しいステートルートが生成され、受信者アカウントの変更によりさらに次の新しいステートルートが生成されます。 前述したように、このステートルートに対するそれぞれの更新は、ロールアップのステートツリーにおける1回の変化を反映したものです。 -ゼロ知識証明サーキットでは、トランザクションバッチの全体を反復的に処理することで、バッチにおける最後のトランザクションが実行された際の最終的なステートルートに至るまでの状態更新のシーケンスの正しさを検証します。 この計算プロセスで得られた最後のマークルルートが、ZK ロールアップにおける最新の正規ステートルートになります。 +ゼロ知識証明サーキットでは、トランザクションバッチの全体を反復的に処理することで、バッチにおける最後のトランザクションが実行された際の最終的なステートルートに至るまでの状態更新のシーケンスの正しさを検証します。 この計算プロセスで得られた最後のマークルルートが、ZKロールアップにおける最新の正規ステートルートになります。 ##### 有効性証明の検証 -証明サーキットにおいて状態更新の正しさが検証されると、L2 のオペレーターは、計算された有効性証明を L1 上の検証者コントラクトに送信します。 検証者コントラクトの検証サーキットでは、この有効性証明の正しさを検証すると同時に、有効性証明の一部である公開インプットについても確認します。 +証明サーキットにおいて状態更新の正しさが検証されると、L2のオペレーターは、計算された有効性証明をL1上の検証者コントラクトに送信します。 検証者コントラクトの検証サーキットでは、この有効性証明の正しさを検証すると同時に、有効性証明の一部である公開インプットについても確認します。 -- **事前のステートルート**: ZK ロールアップの古い状態(つまり、当該バッチに含まれるトランザクションの実行前)を反映した、L2 チェーンにおいて有効である最後の既知のステートルートです。 +- **事前のステートルート**: ZKロールアップの古い状態(つまり、当該バッチに含まれるトランザクションの実行前)を反映した、L2チェーンにおいて有効である最後の既知のステートルートです。 -- **事後のステートルート**: ZK ロールアップの新しい状態(つまり、当該バッチに含まれるトランザクションの実行後)を反映し、L2 チェーンの最新状態であるルートです。 事後のステートルートは、証明サーキットに状態更新を適用することで得られた最終的なルートです。 +- **事後のステートルート**: ZKロールアップの新しい状態(つまり、当該バッチに含まれるトランザクションの実行後)を反映し、L2チェーンの最新状態であるルートです。 事後のステートルートは、証明サーキットに状態更新を適用することで得られた最終的なルートです。 -- **バッチルート**: 当該バッチのマークルルートであり、バッチに*マークル化*を施し、マークルツリーのルートをハッシュ化することで得られます。 +- **バッチルート**: 当該バッチのマークルルートであり、バッチに_マークル化_を施し、マークルツリーのルートをハッシュ化することで得られます。 - **トランザクションにおけるインプット**: 提出されたバッチにおいて実行されたトランザクションに含まれるデータ。 @@ -148,11 +148,11 @@ ZK ロールアップのノードは、トランザクションが一定数に ### 参加と退出 {#entries-and-exits} -ユーザーが ZK ロールアップに参加するには、L1 チェーン上でデプロイされたロールアップのコントラクトにトークンを入金する必要があります。 ロールアップのコントラクトにトランザクションを送信できるのはオペレーターのみであるため、このトランザクションはキュー上で保留されます。 +ユーザーがZKロールアップに参加するには、L1チェーン上でデプロイされたロールアップのコントラクトにトークンを入金する必要があります。 ロールアップのコントラクトにトランザクションを送信できるのはオペレーターのみであるため、このトランザクションはキュー上で保留されます。 -キューに含まれる保留中の入金件数が一定数に達すると、ZK ロールアップのオペレーターが入金トランザクションをロールアップのコントラクトに送信します。 ユーザーの資金がロールアップに入金された時点で、ユーザーはトランザクションをオペレーターに送信し、処理させることで、取引を開始できます。 ユーザーは、各自のアカウントデータをハッシュ化し、ハッシュをロールアップのコントラクトに送信し、さらに現在のステートルートを検証するためのマークル証明を提供することで、ロールアップにおける自らの残高を確認できます。 +キューに含まれる保留中の入金件数が一定数に達すると、ZKロールアップのオペレーターが入金トランザクションをロールアップのコントラクトに送信します。 ユーザーの資金がロールアップに入金された時点で、ユーザーはトランザクションをオペレーターに送信し、処理させることで、取引を開始できます。 ユーザーは、各自のアカウントデータをハッシュ化し、ハッシュをロールアップのコントラクトに送信し、さらに現在のステートルートを検証するためのマークル証明を提供することで、ロールアップにおける自らの残高を確認できます。 -ZK ロールアップから L1 への出金は、簡単に実行できます。 出金トランザクションでは、まずロールアップ上の各自の資金をバーン用の特定のアカウントに送信します。 オペレーターがこのトランザクションを次のバッチに追加した時点で、ユーザーは出金リクエストをオンチェーンのコントラクトに送信できます。 この出金リストには、以下を含める必要があります: +ZKロールアップからL1への出金は、簡単に実行できます。 出金トランザクションでは、まずロールアップ上の各自の資金をバーン用の特定のアカウントに送信します。 オペレーターがこのトランザクションを次のバッチに追加した時点で、ユーザーは出金リクエストをオンチェーンのコントラクトに送信できます。 この出金リストには、以下を含める必要があります: - ユーザーのバーンアカウントへの送金トランザクションが当該バッチに含まれることを証明するマークル証明。 @@ -160,93 +160,97 @@ ZK ロールアップから L1 への出金は、簡単に実行できます。 - バッチルート。 -- 入金資金を受け取る L1 上のアドレス。 +- 入金資金を受け取るL1上のアドレス。 -ロールアップのコントラクトは、このトランザクションデータをハッシュ化し、バッチルートが存在することを確認した上で、マークル証明を用いてこのトランザクションハッシュがバッチルートに含まれることを確認します。 その上で、コントラクトは出金トランザクションを実行し、ユーザーが選択した L1 上のアドレスに資金を送金します。 +ロールアップのコントラクトは、このトランザクションデータをハッシュ化し、バッチルートが存在することを確認した上で、マークル証明を用いてこのトランザクションハッシュがバッチルートに含まれることを確認します。 その上で、コントラクトは出金トランザクションを実行し、ユーザーが選択したL1上のアドレスに資金を送金します。 -## ZK ロールアップと EVM の互換性 {#zk-rollups-and-evm-compatibility} +## ZKロールアップとEVMの互換性 {#zk-rollups-and-evm-compatibility} -オプティミスティック・ロールアップと異なり、ゼロ知識ロールアップはそれ自体が [イーサリアム仮想マシン (EVM)](/developers/docs/evm/) と互換であるわけではありません。 ゼロ知識の証明サーキットにおいて汎用的な EVM の計算を証明するのは、(上記のトークン転送例のような)単純な計算を証明する場合よりも困難であり、多くのリソースが必要になります。 +オプティミスティック・ロールアップと異なり、ゼロ知識ロールアップはそれ自体が [イーサリアム仮想マシン (EVM)](/developers/docs/evm/) と互換であるわけではありません。 ゼロ知識の証明サーキットにおいて汎用的なEVMの計算を証明するのは、(上記のトークン転送例のような)単純な計算を証明する場合よりも困難であり、多くのリソースが必要になります。 -しかし、 [ゼロ知識技術の進歩](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now) により、EVM の計算にゼロ知識証明を用いるアプローチに対する関心が再び高まっています。 これらの取り組みは、ゼロ知識 EVM(zkEVM)の実装を実現することで、プログラム実行の正しさをより効率的に検証できるようにするものです。 ZkEVM は、証明サーキットにおける証明/検証のために EVM の既存オペコードを再作成するもので、これによりスマートコントラクトの実行が可能になります。 +しかし、 [ゼロ知識技術の進歩](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now) により、EVMの計算にゼロ知識証明を用いるアプローチに対する関心が再び高まっています。 これらの取り組みは、ゼロ知識EVM(zkEVM)の実装を実現することで、プログラム実行の正しさをより効率的に検証できるようにするものです。 ZkEVMは、証明サーキットにおける証明/検証のためにEVMの既存オペコードを再作成するもので、これによりスマートコントラクトの実行が可能になります。 -zkEVM では、EVM と同様に、インプットに対する計算を実行した時点で状態が遷移します。 しかし zkEVM では、プログラム実行の各ステップの正しさを検証するためにゼロ知識証明が生成されるという点が異なります。 有効性証明は、仮想マシンの状態(メモリ、スタック、およびストレージ)に関連した操作ならびに計算自体の正しさを検証することができます(つまり、この操作は適切なオペコードを呼び出し、適切に実行されたかを確認できます)。 +zkEVMでは、EVMと同様に、インプットに対する計算を実行した時点で状態が遷移します。 しかしzkEVMでは、プログラム実行の各ステップの正しさを検証するためにゼロ知識証明が生成されるという点が異なります。 有効性証明は、仮想マシンの状態(メモリ、スタック、およびストレージ)に関連した操作ならびに計算自体の正しさを検証することができます(つまり、この操作は適切なオペコードを呼び出し、適切に実行されたかを確認できます)。 -EVM 互換の ZK ロールアップを活用することで、デベロッパはゼロ知識証明がもたらすスケーラビリティとセキュリティ保証を得ることができます。 さらに重要なのは、イーサリアムネイティブのインフラとの互換性が保証されるために、使い慣れた(すでに実戦で検証済みの)ツールや言語を用いて、ZK フレンドリーな Dapp を構築できるという点です。 +EVM互換のZKロールアップを活用することで、デベロッパはゼロ知識証明がもたらすスケーラビリティとセキュリティ保証を得ることができます。 さらに重要なのは、イーサリアムネイティブのインフラとの互換性が保証されるために、使い慣れた(すでに実戦で検証済みの)ツールや言語を用いて、ZKフレンドリーなDappを構築できるという点です。 -## ZK ロールアップにおける手数料の仕組み {#how-do-zk-rollup-fees-work} +## ZKロールアップにおける手数料の仕組み {#how-do-zk-rollup-fees-work} -ZK ロールアップにおけるトランザクション手数料は、イーサリアムメインネットと同じようにガス料金に応じて変化します。 ただし L2 においては、ガス料金の仕組みが異なっており、以下のコストの影響を受けます: +ZKロールアップにおけるトランザクション手数料は、イーサリアムメインネットと同じようにガス料金に応じて変化します。 ただしL2においては、ガス料金の仕組みが異なっており、以下のコストの影響を受けます: -1. **ステートへの書き込み**: イーサリアムのステートに書き込む(つまり、イーサリアムブロックチェーンにトランザクションを送信する)場合、固定コストが発生します。 ZK ロールアップでは、トランザクションをバッチ化し、固定コストを複数のユーザーに分散させることで、ユーザーあたりのコストを引き下げています。 +1. **ステートへの書き込み**: イーサリアムのステートに書き込む(つまり、イーサリアムブロックチェーンにトランザクションを送信する)場合、固定コストが発生します。 ZKロールアップでは、トランザクションをバッチ化し、固定コストを複数のユーザーに分散させることで、ユーザーあたりのコストを引き下げています。 -2. **データの公開**: ZK ロールアップでは、各トランザクションの状態データを`calldata`としてイーサリアムに送信します。 現在、`calldata`のコストは [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) によって管理されています。 `calldata` の非ゼロバイトに対しては 16 ガス、ゼロバイトに対しては 4 ガスのコストが、それぞれ規定されています。 各トランザクションに対して支払われるコストは、オンチェーンで公開される`calldata`の規模に応じて決定されます。 +2. **データの公開**: ZKロールアップでは、各トランザクションの状態データを`calldata`としてイーサリアムに送信します。 現在、`calldata`のコストは [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) によって管理されています。 `calldata` の非ゼロバイトに対しては16ガス、ゼロバイトに対しては4ガスのコストが、それぞれ規定されています。 各トランザクションに対して支払われるコストは、オンチェーンで公開される`calldata`の規模に応じて決定されます。 -3. **L2 オペレーターに対する手数料**: これは、イーサリアムにおけるマイナー手数料の場合と同様に、トランザクションの処理で発生した計算コストの代価としてロールアップのオペレーターに支払う手数料です。 +3. **L2オペレーターに対する手数料**: これは、イーサリアムにおけるマイナー手数料の場合と同様に、トランザクションの処理で発生した計算コストの代価としてロールアップのオペレーターに支払う手数料です。 -4. **有効性証明の生成と検証**: ZK ロールアップのオペレーターは、多くのリソースを用いてトランザクションバッチに対する有効性証明を生成しなければなりません。 メインネットにおけるゼロ知識証明の検証にもガス代が発生します(最大 50 万ガス)。 +4. **有効性証明の生成と検証**: ZKロールアップのオペレーターは、多くのリソースを用いてトランザクションバッチに対する有効性証明を生成しなければなりません。 メインネットにおけるゼロ知識証明の検証にもガス代が発生します(最大50万ガス)。 -ZK ロールアップでは、トランザクションのバッチ化に加えて、トランザクションデータを圧縮することでユーザー手数料を引き下げています。 イーサリアムの ZK ロールアップにおける利用コストは、[リアルタイムで確認できます](https://l2fees.info/)。 +ZKロールアップでは、トランザクションのバッチ化に加えて、トランザクションデータを圧縮することでユーザー手数料を引き下げています。 イーサリアムのZKロールアップにおける利用コストは、[リアルタイムで確認できます](https://l2fees.info/)。 -## ZK ロールアップは、どのようにイーサリアムのスケーラビリティを向上させるか? {#scaling-ethereum-with-zk-rollups} +## ZKロールアップは、どのようにイーサリアムのスケーラビリティを向上させるか? {#scaling-ethereum-with-zk-rollups} ### トランザクションデータの圧縮 {#transaction-data-compression} -ZK ロールアップでは、オフチェーンでの計算を通じてイーサリアム・ベースレイヤーのスループットを向上させますが、実際にスケーラビリティを向上させるのはトランザクションデータを圧縮することによってです。 イーサリアムの [ブロックサイズ](/developers/docs/blocks/#block-size) は、各ブロックが保持できるデータ量を制限しているため、必然的に各ブロックが処理できるトランザクションの数も制限されます。 ZK ロールアップでは、トランザクション関連データを圧縮することで、各ブロックで処理されるトランザクションの数が大きく増えるのです。 +ZKロールアップでは、オフチェーンでの計算を通じてイーサリアム・ベースレイヤーのスループットを向上させますが、実際にスケーラビリティを向上させるのはトランザクションデータを圧縮することによってです。 イーサリアムの [ブロックサイズ](/developers/docs/blocks/#block-size) は、各ブロックが保持できるデータ量を制限しているため、必然的に各ブロックが処理できるトランザクションの数も制限されます。 ZKロールアップでは、トランザクション関連データを圧縮することで、各ブロックで処理されるトランザクションの数が大きく増えるのです。 -ZK ロールアップでは、各トランザクションを検証するためにすべての関連データを書き込む必要がないため、オプティミスティック・ロールアップよりもデータの圧縮度が高いと言えます。 ロールアップにおけるアカウントおよび残高の最新状態を再構築する上で、必要最小限のデータのみを送信すればよいのです。 +ZKロールアップでは、各トランザクションを検証するためにすべての関連データを書き込む必要がないため、オプティミスティック・ロールアップよりもデータの圧縮度が高いと言えます。 ロールアップにおけるアカウントおよび残高の最新状態を再構築する上で、必要最小限のデータのみを送信すればよいのです。 ### 再帰的プルーフ {#recursive-proofs} -ゼロ知識証明の優位性のひとつとして、他の種類の証明を検証するためにも使用できる点が挙げられます。 例えば、ある ZK-SNARK を用いて他の複数の ZK-SNARK を検証することができます。 このような「プルーフに対するプルーフ」を再帰的プルーフと呼び、ZK ロールアップのスループットを劇的に向上させます。 +ゼロ知識証明の優位性のひとつとして、他の種類の証明を検証するためにも使用できる点が挙げられます。 例えば、あるZK-SNARKを用いて他の複数のZK-SNARKを検証することができます。 このような「プルーフに対するプルーフ」を再帰的プルーフと呼び、ZKロールアップのスループットを劇的に向上させます。 -現在のところ、有効性証明はブロックごとに生成され、検証のために L1 上のコントラクトに送信されています。 しかしこの 1 つのブロックのみを検証する有効性証明のアプローチでは、オペレーターが有効性証明を送信する際に 1 つのブロックしかファイナライズできないため、ZK ロールアップにより達成可能なスループットが制限されてしまいます。 +現在のところ、有効性証明はブロックごとに生成され、検証のためにL1上のコントラクトに送信されています。 しかしこの1つのブロックのみを検証する有効性証明のアプローチでは、オペレーターが有効性証明を送信する際に1つのブロックしかファイナライズできないため、ZKロールアップにより達成可能なスループットが制限されてしまいます。 -一方、再帰的プルーフを用いれば、1 つの有効性証明に基づいて複数のブロックをファイナライズすることが可能になります。 このアプローチでは、証明サーキットにおいて複数のブロックに対する証明が集約され、最終的な証明を作成することができるためです。 L2 のオペレーターがこの再規制プルーフを提出し、コントラクトが承認すれば、関連するすべてのブロックが瞬時にファイナライズされます。 再帰的プルーフを用いることで、イーサリアムにおいて一定間隔でファイナライズできる ZK ロールアップのトランザクション数を増やすことができます。 +一方、再帰的プルーフを用いれば、1つの有効性証明に基づいて複数のブロックをファイナライズすることが可能になります。 このアプローチでは、証明サーキットにおいて複数のブロックに対する証明が集約され、最終的な証明を作成することができるためです。 L2のオペレーターがこの再規制プルーフを提出し、コントラクトが承認すれば、関連するすべてのブロックが瞬時にファイナライズされます。 再帰的プルーフを用いることで、イーサリアムにおいて一定間隔でファイナライズできるZKロールアップのトランザクション数を増やすことができます。 -### ZK ロールアップの長所と短所 {#zk-rollups-pros-and-cons} +### ZKロールアップの長所と短所 {#zk-rollups-pros-and-cons} -| 長所 | 短所 | -| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 有効性証明により、オフチェーンのトランザクションの正しさが保証でき、オペレーターが無効な状態遷移を実行するのを防ぐことができる。 | 有効性証明を計算、検証する際にかなりのコストが発生し、ロールアップにおけるユーザー手数料がかさむ可能性がある。 | -| 有効性証明が L1 上で検証されれば状態更新が承認されるため、トランザクションのファイナリティをより迅速に実現できる。 | ゼロ知識は複雑な関連技術を要するため、EVM 互換の ZK ロールアップ構築は容易ではない。 | -| [オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups/#optimistic-pros-and-cons)とは異なり、インセンティブに基づく正直なアクターに依存するのではなく、トラストレス性を持つ暗号学的なメカニズムを通じてセキュリティを確保できる。 | 有効性証明の生成には特殊なハードウェアを必要とするため、少数のユーザーがチェーンを中央集権的に管理する傾向が強まる可能性がある。 | -| L1 上でオフチェーンの状態を復元するために必要なデータを保存できるため、セキュリティ、検閲耐性、および分散化が保証される。 | 中央集権的なオペレーター(シーケンサー)がトランザクションの実行順位に影響を及ぼしうる。 | -| ユーザーは L2 からの出金を遅延なく行えるため、資本の効率性が高まる。 | 厳格なハードウェア要件によりチェーンを強制的に進められる参加者数が限定されることで、悪意のオペレーターがロールアップの状態を凍結し、ユーザーを検閲するリスクが高まる。 | -| 生存性の前提に依存しないため、ユーザーは資金を保護するためにチェーンを検証する必要がない。 | 一部の証明システム(ZK-SNARK など)は信頼性に基づく設定が必要であるため、不適切な利用により ZK ロールアップのセキュリティモデルが悪用される可能性がある。 | -| 優れたデータ圧縮機能により、イーサリアム上で`calldata`を公開する費用が軽減され、ユーザーのロールアップ手数料を最小限に抑えられる。 | | +| 長所 | 短所 | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------- | +| 有効性証明により、オフチェーンのトランザクションの正しさが保証でき、オペレーターが無効な状態遷移を実行するのを防ぐことができる。 | 有効性証明を計算、検証する際にかなりのコストが発生し、ロールアップにおけるユーザー手数料がかさむ可能性がある。 | +| 有効性証明がL1上で検証されれば状態更新が承認されるため、トランザクションのファイナリティをより迅速に実現できる。 | ゼロ知識は複雑な関連技術を要するため、EVM互換のZKロールアップ構築は容易ではない。 | +| [オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups/#optimistic-pros-and-cons)とは異なり、インセンティブに基づく正直なアクターに依存するのではなく、トラストレス性を持つ暗号学的なメカニズムを通じてセキュリティを確保できる。 | 有効性証明の生成には特殊なハードウェアを必要とするため、少数のユーザーがチェーンを中央集権的に管理する傾向が強まる可能性がある。 | +| L1上でオフチェーンの状態を復元するために必要なデータを保存できるため、セキュリティ、検閲耐性、および分散化が保証される。 | 中央集権的なオペレーター(シーケンサー)がトランザクションの実行順位に影響を及ぼしうる。 | +| ユーザーはL2からの出金を遅延なく行えるため、資本の効率性が高まる。 | 厳格なハードウェア要件によりチェーンを強制的に進められる参加者数が限定されることで、悪意のオペレーターがロールアップの状態を凍結し、ユーザーを検閲するリスクが高まる。 | +| 生存性の前提に依存しないため、ユーザーは資金を保護するためにチェーンを検証する必要がない。 | 一部の証明システム(ZK-SNARKなど)は信頼性に基づく設定が必要であるため、不適切な利用によりZKロールアップのセキュリティモデルが悪用される可能性がある。 | +| 優れたデータ圧縮機能により、イーサリアム上で`calldata`を公開する費用が軽減され、ユーザーのロールアップ手数料を最小限に抑えられる。 | | -### ZK ロールアップに関する動画による説明 {#zk-video} +### ZKロールアップに関する動画による説明 {#zk-video} -Finematics による ZK ロールアップの説明動画をご覧ください: +FinematicsによるZKロールアップの説明動画をご覧ください: ### ゼロ知識ロールアップの活用方法 {#use-zk-rollups} -現在、Dapp に統合可能ないくつかの ZK ロールアップの実装が提供されています: +現在、Dappに統合可能ないくつかのZKロールアップの実装が提供されています: -## zkEVM の開発プロジェクト {#zkevm-projects} +## zkEVMの開発プロジェクト {#zkevm-projects} -現在、zkEVM の開発に取り組んでいるプロジェクトとしては、以下が挙げられます: +現在、zkEVMの開発に取り組んでいるプロジェクトとしては、以下が挙げられます: -- **[ZKSync](https://docs.zksync.io/zkevm/)** - _ZkSync 2.0 は、Matter Labs が独自開発した zkEVM を搭載する EVM 互換の ZK ロールアップです_ +- **[Applied ZKP](https://github.com/privacy-scaling-explorations/zkevm-specs)** - _Applied ZKPは、イーサリアム・ファウンデーションによる資金提供に基づき、EVM互換のZKロールアップならびにイーサリアムブロックに対する有効性証明を生成するメカニズムを開発するプロジェクトです。 -- **[Applied ZKP](https://github.com/privacy-scaling-explorations/zkevm-specs)** - _Applied ZKP は、イーサリアム財団による資金提供に基づき、EVM 互換の ZK ロールアップならびにイーサリアムブロックに対する有効性証明を生成するメカニズムを開発するプロジェクトです。_ +- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** - _イーサリアムメインネット上の分散型ゼロ知識ロールアップであり、ゼロ知識証明による検証が可能なスマートコントラクトなど、イーサリアムのトランザクションを透明性が高い方法で実行するゼロ知識イーサリアム仮想マシン(zkEVM)の開発に取り組んでいます。 -- **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll は、ネイティブの zkEVM を搭載したイーサリアムのレイヤー 2 ソリューションを開発中のテクノロジー企業です。_ +- **[Scroll](https://scroll.io/blog/zkEVM)** - _Scrollは、ネイティブのzkEVMを搭載したイーサリアムのレイヤー2ソリューションを開発中のテクノロジー企業です。_ -- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** - _イーサリアムメインネット上の分散型ゼロ知識ロールアップであり、ゼロ知識証明による検証が可能なスマートコントラクトなど、イーサリアムのトランザクションを透明性が高い方法で実行するゼロ知識イーサリアム仮想マシン(zkEVM)の開発に取り組んでいます。_ +- **[Taiko](https://taiko.xyz)** - _Taikoは、分散型でイーサリアム等価のゼロ知識ロールアップ([タイプ1のゼロ知識イーサリアム仮想マシン](https://vitalik.ca/general/2022/08/04/zkevm.html))_です。 -## ZK ロールアップの参考文献 {#further-reading-on-zk-rollups} +- **[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._ + +## ZKロールアップの参考文献 {#further-reading-on-zk-rollups} - [ゼロ知識ロールアップとは何か?](https://coinmarketcap.com/alexandria/glossary/zero-knowledge-rollups) - [ゼロ知識ロールアップとは?](https://alchemy.com/blog/zero-knowledge-rollups) -- [STARK と SNARK の相違点](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) -- [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.eth.limo/general/2017/02/01/zk_snarks.html) -- [SNARK はどのように実現されているのか?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) +- [STARKとSNARKの相違点](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) +- [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) diff --git a/public/content/translations/ja/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/ja/developers/docs/smart-contracts/anatomy/index.md index 81d4f8fc7fc..7b4baef7332 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/anatomy/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/anatomy/index.md @@ -8,7 +8,7 @@ lang: ja ## 前提知識 {#prerequisites} -最初に、[スマートコントラクト](/developers/docs/smart-contracts/)を必ずお読みください。 このドキュメントは、JavaScript や Python などのプログラミング言語に精通していることを前提としています。 +最初に、[スマートコントラクト](/developers/docs/smart-contracts/)を必ずお読みください。 このドキュメントは、JavaScriptやPythonなどのプログラミング言語に精通していることを前提としています。 ## データ {#data} @@ -33,7 +33,7 @@ storedData: int128 オブジェクト指向言語でのプログラミングの経験がある場合は、ほとんどの型になじみがあるでしょう。 しかし、イーサリアムの開発が初めての場合、`address`は目新しいかもしれません。 -`address`型は、20 バイトまたは 160 ビットに相当するイーサリアムアドレスを保持します。 先頭が 0x の 16 進数を返します。 +`address`型は、20バイトまたは160ビットに相当するイーサリアムアドレスを保持します。 先頭が0xの16進数を返します。 その他の型には次のものがあります。 @@ -44,19 +44,19 @@ storedData: int128 - 動的サイズのバイト配列 - 有理数リテラルと整数リテラル - 文字列リテラル -- 16 進数リテラル +- 16進数リテラル - 列挙型 詳細については、以下のドキュメントをご覧ください。 -- [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) +- [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} コントラクト関数の実行期間にのみ保存される値は、メモリ変数と呼ばれます。 これらはブロックチェーンに永続的に保存されることはないため、低コストで使用できます -EVM がデータ(ストレージ、メモリ、スタック)を格納する方法の詳細については、[Solidity のドキュメント](https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html?highlight=memory#storage-memory-and-the-stack)をご覧ください。 +EVMがデータ(ストレージ、メモリ、スタック)を格納する方法の詳細については、[Solidityのドキュメント](https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html?highlight=memory#storage-memory-and-the-stack)をご覧ください。 ### 環境変数 {#environment-variables} @@ -64,28 +64,28 @@ EVM がデータ(ストレージ、メモリ、スタック)を格納する方 例: -| **プロパティ** | **状態変数** | **説明** | -| ----------------- | ------------ | ------------------------------------ | -| `block.timestamp` | uint256 | 現在のブロックエポックタイムスタンプ | -| `msg.sender` | address | メッセージの送信者(現在の呼び出し) | +| **プロパティ** | **状態変数** | **説明** | +| ----------------- | -------- | ------------------ | +| `block.timestamp` | uint256 | 現在のブロックエポックタイムスタンプ | +| `msg.sender` | address | メッセージの送信者(現在の呼び出し) | ## 関数 {#functions} 簡単に言うと、関数は受信トランザクションに応じて情報を取得したり、情報を設定したりすることができます。 -関数呼び出しには、以下の 2 種類があります。 +関数呼び出しには、以下の2種類があります。 -- `internal` - これらは EVM 呼び出しを作成しません。 - - internal 関数と状態変数は、内部(つまり、現在のコントラクト内またはそれから派生したコントラクト内)からのみアクセスできます。 -- `external` - これらは EVM 呼び出しを作成します。 - - external 関数はコントラクトインターフェイスの一部であり、他のコントラクトから呼び出したり、トランザクションを介して呼び出したりすることができます。 external 関数`f`を内部で呼び出すことはできません(つまり、`f()`は動作しませんが、`this.f()`は動作します)。 +- `internal` - これらはEVM呼び出しを作成しません。 + - internal関数と状態変数は、内部(つまり、現在のコントラクト内またはそれから派生したコントラクト内)からのみアクセスできます。 +- `external` - これらはEVM呼び出しを作成します。 + - external関数はコントラクトインターフェイスの一部であり、他のコントラクトから呼び出したり、トランザクションを介して呼び出したりすることができます。 external関数`f`を内部で呼び出すことはできません(つまり、`f()`は動作しませんが、`this.f()`は動作します)。 `public`または`private`にすることもできます。 - `public`関数は、コントラクト内から内部で呼び出すことも、メッセージを介して外部から呼び出すこともできます。 - `private`関数は、それらが定義されているコントラクトからのみ参照できます。派生したコントラクトからは参照できません。 -関数と状態変数はどちらも public または private にすることができます。 +関数と状態変数はどちらもpublicまたはprivateにすることができます。 コントラクトの状態変数を更新するための関数は次のとおりです。 @@ -100,7 +100,7 @@ function update_name(string value) public { - `public`と宣言されており、誰でもアクセスできます。 - `view`が宣言されていないため、コントラクトの状態を変更できます。 -### View 関数 {#view-functions} +### View関数 {#view-functions} これらの関数によって、コントラクトのデータの状態を変更しないことを指定します。 一般的な例としては、「getter」関数があります。例えば、これを使用してユーザーの残高を受け取ることができます。 @@ -133,7 +133,7 @@ def readName() -> string: ### コンストラクタ関数 {#constructor-functions} -`constructor`関数は、コントラクトが最初にデプロイされたときに 1 回だけ実行されます。 多くのクラスベースのプログラミング言語の`constructor`と同様に、これらの関数はしばしば、指定された値に状態変数を初期化します。 +`constructor`関数は、コントラクトが最初にデプロイされたときに1回だけ実行されます。 多くのクラスベースのプログラミング言語の`constructor`と同様に、これらの関数はしばしば、指定された値に状態変数を初期化します。 ```solidity // Solidity example @@ -165,15 +165,15 @@ def __init__(_beneficiary: address, _bidding_time: uint256): - `address.send()` – Solidity - `send(address)` – Vyper -これらの関数により、コントラクトは他のアカウントに ETH を送信することができます。 +これらの関数により、コントラクトは他のアカウントにETHを送信することができます。 ## 関数を書く {#writing-functions} 関数には以下のものが必要です。 - パラメータ変数と型(パラメータを受け取る場合) -- internal/external の宣言 -- pure/view/payable の宣言 +- internal/externalの宣言 +- pure/view/payableの宣言 - 戻り値の型(値を返す場合) ```solidity @@ -207,7 +207,7 @@ contract ExampleDapp { ## 注釈付きの例 {#annotated-examples} -Solidity で書かれた例を以下に示します。 コードを実行したい場合は、[Remix](http://remix.ethereum.org)で操作できます。 +Solidityで書かれた例を以下に示します。 コードを実行したい場合は、[Remix](http://remix.ethereum.org)で操作できます。 ### Hello World {#hello-world} @@ -641,7 +641,7 @@ contract CryptoPizza is IERC721, ERC165 { ## 参考文献 {#further-reading} -スマートコントラクトの全体的な概要については、Solidity と Vyper のドキュメントをご確認ください。 +スマートコントラクトの全体的な概要については、SolidityとVyperのドキュメントをご確認ください。 - [Solidity](https://solidity.readthedocs.io/) - [Vyper](https://vyper.readthedocs.io/) @@ -655,4 +655,4 @@ contract CryptoPizza is IERC721, ERC165 { - [コントラクトのサイズ制限に対処するためのコントラクトのサイズ縮小](/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/) _- 既存のコントラクトからスマートコントラクトをデプロイし、それを扱う方法_ +- [Solidityを使用した他のコントラクトとの連携](/developers/tutorials/interact-with-other-contracts-from-solidity/) _- 既存のコントラクトからスマートコントラクトをデプロイし、それを扱う方法_ diff --git a/public/content/translations/ja/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/ja/developers/docs/smart-contracts/compiling/index.md index 0d90bad9c78..3e0051bb519 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/compiling/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/compiling/index.md @@ -5,7 +5,7 @@ lang: ja incomplete: true --- -Web アプリとイーサリアム仮想マシン(EVM)が理解できるように、コントラクトをコンパイルする必要があります。 +Webアプリとイーサリアム仮想マシン(EVM)が理解できるように、コントラクトをコンパイルする必要があります。 ## 前提知識 {#prerequisites} @@ -33,15 +33,15 @@ contract Greeter { 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} +## Webアプリ {#web-applications} コンパイラは、アプリケーションがコントラクトを理解し、コントラクトの関数を呼び出すために必要な**アプリケーションバイナリインターフェイス(ABI)**も生成します。 -ABI は、デプロイされたコントラクトとそのスマートコントラクト関数を記述する JSON ファイルです。 これにより、Web2 と Web3 のギャップを埋めることができます。 +ABIは、デプロイされたコントラクトとそのスマートコントラクト関数を記述するJSONファイルです。 これにより、Web2とWeb3のギャップを埋めることができます。 -[JavaScript クライアントライブラリ](/developers/docs/apis/javascript/)は**ABI**を読み取り、Web アプリのインターフェイスでスマートコントラクトを呼び出すことができます。 +[JavaScriptクライアントライブラリ](/developers/docs/apis/javascript/)は**ABI**を読み取り、Webアプリのインターフェイスでスマートコントラクトを呼び出すことができます。 -以下は、ERC-20 トークンコントラクトの ABI です。 ERC-20 はイーサリアムで取引できるトークンです。 +以下は、ERC-20トークンコントラクトのABIです。 ERC-20はイーサリアムで取引できるトークンです。 ```json [ @@ -270,9 +270,9 @@ ABI は、デプロイされたコントラクトとそのスマートコント ## 参考文献 {#further-reading} -- [ABI 仕様](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ +- [ABI仕様](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ ## 関連トピック {#related-topics} -- [JavaScript クライアントライブラリ](/developers/docs/apis/javascript/) +- [JavaScriptクライアントライブラリ](/developers/docs/apis/javascript/) - [イーサリアム仮想マシン(EVM)](/developers/docs/evm/) diff --git a/public/content/translations/ja/developers/docs/smart-contracts/composability/index.md b/public/content/translations/ja/developers/docs/smart-contracts/composability/index.md index a0cd4bd1d2c..16f8782f63f 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/composability/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/composability/index.md @@ -7,7 +7,7 @@ incomplete: true ## 簡単な紹介 {#a-brief-introduction} -スマートコントラクトはイーサリアム上で公開されており、オープン API と考えることができます。 Dapp デベロッパーになるために、独自のスマートコントラクトを書く必要はありません。スマートコントラクトとやり取りする方法を理解するだけで済みます。 例えば、アプリ内のすべてのトークンスワップロジックを処理するために、分散型取引所である[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)のコントラクトをいくつか確認してみてください。 +スマートコントラクトはイーサリアム上で公開されており、オープンAPIと考えることができます。 Dappデベロッパーになるために、独自のスマートコントラクトを書く必要はありません。スマートコントラクトとやり取りする方法を理解するだけで済みます。 例えば、アプリ内のすべてのトークンスワップロジックを処理するために、分散型取引所である[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} @@ -17,9 +17,9 @@ incomplete: true ## 構成可能性の仕組み {#how-does-composability-work} -イーサリアムのスマートコントラクトはパブリック API のようなものなので、誰でもコントラクトとやり取りしたり、それらを Dapp に統合して機能を追加したりすることができます。 スマートコントラクトの構成は一般的に、モジュール性、自律性、発見性の 3 つの原則に基づいています。 +イーサリアムのスマートコントラクトはパブリックAPIのようなものなので、誰でもコントラクトとやり取りしたり、それらをDappに統合して機能を追加したりすることができます。 スマートコントラクトの構成は一般的に、モジュール性、自律性、発見性の3つの原則に基づいています。 -**1. モジュール性**: 個々のコンポーネントが特定のタスクを実行する能力です。 イーサリアムでは、すべてのスマートコントラクトに特定のユースケースがあります(Uniswap の例に見ることができます)。 +**1. モジュール性**: 個々のコンポーネントが特定のタスクを実行する能力です。 イーサリアムでは、すべてのスマートコントラクトに特定のユースケースがあります(Uniswapの例に見ることができます)。 **2. 自律性**: 構成可能なコンポーネントには、独立して動作できることが求められます。 イーサリアムの各スマートコントラクトは自己実行形式であり、システムの他の部分に依存することなく機能することができます。 @@ -31,7 +31,7 @@ incomplete: true 構成可能性は、[Dapp](/dapps/#what-are-dapps)を作成する際にデベロッパーが行うべき作業を減らします。 [Naval Ravikant 氏が言うように、](https://twitter.com/naval/status/1444366754650656770)「オープンソースは、すべての問題を一度だけ解決すればよいということを意味する」ということです。 -一つの問題を解決するスマートコントラクトがある場合、他のデベロッパーはそれを再利用できるため、同じ問題を解決する必要はありません。 このようにして、デベロッパーは既存のソフトウェアライブラリを利用し、更なる機能を追加して新しい Dapp を作成することができます。 +一つの問題を解決するスマートコントラクトがある場合、他のデベロッパーはそれを再利用できるため、同じ問題を解決する必要はありません。 このようにして、デベロッパーは既存のソフトウェアライブラリを利用し、更なる機能を追加して新しいDappを作成することができます。 ### イノベーションの加速 {#greater-innovation} @@ -39,13 +39,13 @@ incomplete: true ### ユーザーエクスペリエンスの向上 {#better-user-experience} -イーサリアムエコシステムのコンポーネント間の相互運用性は、ユーザーエクスペリエンスを向上させます。 アプリケーション間で通信できない分断されたエコシステムよりも、外部のスマートコントラクトを統合している Dapp の方が、ユーザーに高い機能性を提供できます。 +イーサリアムエコシステムのコンポーネント間の相互運用性は、ユーザーエクスペリエンスを向上させます。 アプリケーション間で通信できない分断されたエコシステムよりも、外部のスマートコントラクトを統合しているDappの方が、ユーザーに高い機能性を提供できます。 ここでは、裁定取引の例を使用して、相互運用性のメリットを説明します。 トークンが`取引所A`で`取引所B`よりも高く取引されている場合、この価格差を利用して利益を上げることができます。 ただし、それができるのは、トランザクション(つまり、`取引所B`からトークンを購入し、`取引所A`でそれを売却すること)に資金を提供するだけの十分な資金がある場合に限ります。 -取引を行うのに十分な資金を持っていないシナリオでは、フラッシュローンが理想的かもしれません。 [フラッシュローン](/defi/#flash-loans)は非常に専門的ですが、基本的な考え方は、*一つ*のトランザクション内で(担保なしに)資産を借りて同じだけ返すということです。 +取引を行うのに十分な資金を持っていないシナリオでは、フラッシュローンが理想的かもしれません。 [フラッシュローン](/defi/#flash-loans)は非常に専門的ですが、基本的な考え方は、_一つ_のトランザクション内で(担保なしに)資産を借りて同じだけ返すということです。 当初の例に戻りましょう。制定取引業者は多額のフラッシュローンを利用して`取引所B`からトークンを購入し、それらを`取引所A`に売却し、資金と利息の払い戻しを受け、利益を確保するまでを同一のトランザクションの中で行うことができます。 この複雑なロジックでは、複数のコントラクトへの呼び出しを組み合わせる必要がありますが、スマートコントラクトに相互運用性がない場合は不可能です。 @@ -53,25 +53,25 @@ incomplete: true ### トークンスワップ {#token-swaps} -ETH でトランザクションフィーを支払う必要がある Dapp を作成する場合、トークンスワップロジックを統合することで、ユーザーが他の ERC-20 トークンで支払えるようにすることができます。 このコードは、コントラクトが呼び出された関数を実行する前に、ユーザーのトークンを ETH に自動的に変換します。 +ETHでトランザクションフィーを支払う必要があるDappを作成する場合、トークンスワップロジックを統合することで、ユーザーが他のERC-20トークンで支払えるようにすることができます。 このコードは、コントラクトが呼び出された関数を実行する前に、ユーザーのトークンをETHに自動的に変換します。 ### ガバナンス {#governance} -[DAO](/dao/)向けにカスタマイズしたガバナンスシステムの構築には、コストと時間がかかることがあります。 代わりに、[Aragon Client](https://client.aragon.org/)のようなオープンソースのガバナンスツールキットを使用して、ガバナンスフレームワークをすばやく作成して DAO を立ち上げることができます。 +[DAO](/dao/)向けにカスタマイズしたガバナンスシステムの構築には、コストと時間がかかることがあります。 代わりに、[Aragon Client](https://client.aragon.org/)のようなオープンソースのガバナンスツールキットを使用して、ガバナンスフレームワークをすばやく作成してDAOを立ち上げることができます。 -### ID 管理 {#identity-management} +### ID管理 {#identity-management} カスタム認証システムを構築したり、集中型プロバイダーに依存したりしなくても、ユーザーの認証を管理する分散型アイデンティティ(DID)ツールを統合できます。 例えば、オープンソースツールキットの[SpluceID](https://www.spruceid.com/)などがあります。このツールキットは「イーサリアムでサインイン」機能を提供し、ユーザーはイーサリアムウォレットを使用してアイデンティティを認証できます。 ## 関連トピック {#related-tutorials} - [コントラクトの構成可能性: イーサリアムスマートコントラクト開発のビルディングブロック](https://www.decentlabs.io/blog/contract-composability-the-building-blocks-of-ethereum-smart-contract-development) -- [create-eth-app を使用した Dapp フロントエンドの始動](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _- create-eth-app を使用して、一般的なスマートコントラクトを使用する、すぐに利用可能なアプリを作成する方法の概要_ +- [create-eth-appを使用したDappフロントエンドの始動](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _- create-eth-appを使用して、一般的なスマートコントラクトを使用する、すぐに利用可能なアプリを作成する方法の概要_ ## 参考文献 {#further-reading} _イーサリアムを学ぶために利用したコミュニティリソースはありますか? もしあればページを編集して追加してください!_ - [構成可能性はイノベーションである](https://future.a16z.com/how-composability-unlocks-crypto-and-everything-else/) -- [構成可能性が Web3 にとって重要な理由](https://hackernoon.com/why-composability-matters-for-web3) +- [構成可能性がWeb3にとって重要な理由](https://hackernoon.com/why-composability-matters-for-web3) - [構成可能性とは](https://blog.aragon.org/what-is-composability/#:~:text=Aragon,connect%20to%20every%20other%20piece.) diff --git a/public/content/translations/ja/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/ja/developers/docs/smart-contracts/deploying/index.md index ace295fa059..6d2819f7105 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/deploying/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/deploying/index.md @@ -21,23 +21,21 @@ lang: ja ### 必要なもの {#what-youll-need} - コントラクトのバイトコード - これは[コンパイル](/developers/docs/smart-contracts/compiling/)によって生成されます。 -- ガス用の ETH - 他のトランザクションと同様にガスリミットを設定しますので、コントラクトのデプロイには、単純な ETH の送金よりも多くのガスが必要であることに注意してください。 +- ガス用のETH - 他のトランザクションと同様にガスリミットを設定しますので、コントラクトのデプロイには、単純なETHの送金よりも多くのガスが必要であることに注意してください。 - デプロイメントのためのスクリプトやプラグイン。 -- [イーサリアムノード](/developers/docs/nodes-and-clients/)へのアクセス。これは、自身のノードを実行するか、公開ノードに接続するか、[Infura](https://www.infura.io/)や[Alchemy](https://docs.alchemy.com/)のような[ノードサービス](/developers/docs/nodes-and-clients/nodes-as-a-service/)を使用して API キーを介するかのいずれかの方法で行います。 +- [イーサリアムノード](/developers/docs/nodes-and-clients/)へのアクセス。これは、自身のノードを実行するか、公開ノードに接続するか、[ノードサービス](/developers/docs/nodes-and-clients/nodes-as-a-service/)を使用してAPIキーを介するかのいずれかの方法で行います。 ### スマートコントラクトをデプロイする手順 {#steps-to-deploy} -実際の手順は、どのツールを利用するかによって変わります。 例えば、[コントラクトのデプロイに関する Hardhat のドキュメント](https://hardhat.org/guides/deploying.html)や、[ネットワークとアプリケーションのデプロイに関する Truffle のドキュメント](https://www.trufflesuite.com/docs/truffle/advanced/networks-and-app-deployment)をご確認ください。 これらは、スマートコントラクトをデプロイするための最も一般的なツールです。このデプロイでは、デプロイの手順を進めていくためのスクリプトを作成します。 - -デプロイされると、コントラクトは他の[アカウント](/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). ## 関連ツール {#related-tools} -**Remix - _Remix IDE では、イーサリアムのようなブロックチェーン上のスマートコントラクトの開発、デプロイ、管理を行うことができます。_** +**Remix - _Remix IDEでは、イーサリアムのようなブロックチェーン上のスマートコントラクトの開発、デプロイ、管理を行うことができます。_** - [Remix](https://remix.ethereum.org) -**Tenderly - _スマートコントラクトの開発、テスト、監視、運用のためのデバッグ、オブザーバビリティ、インフラストラクチャ・ビルディング・ブロックを提供する Web3 開発プラットフォーム_** +**Tenderly - _スマートコントラクトの開発、テスト、監視、運用のためのデバッグ、オブザーバビリティ、インフラストラクチャ・ビルディング・ブロックを提供するWeb3開発プラットフォーム_** - [tenderly.co](https://tenderly.co/) - [ドキュメント](https://docs.tenderly.co/) @@ -51,27 +49,26 @@ lang: ja - [GitHub](https://github.com/nomiclabs/hardhat) - [Discord](https://discord.com/invite/TETZs2KK4k) -**Truffle -** **_開発環境、テストフレームワーク、ビルドパイプライン、およびその他のツール。_** +**サードウェブ - _単一のコマンドを使い、任意のコントラクトを任意のEVM互換チェーンに容易にデプロイ_** -- [trufflesuite.com](https://www.trufflesuite.com/) -- [ネットワークとアプリケーションのデプロイに関するドキュメント](https://www.trufflesuite.com/docs/truffle/advanced/networks-and-app-deployment) -- [GitHub](https://github.com/trufflesuite/truffle) +- [ドキュメント](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/) _- 既存のコントラクトからスマートコントラクトをデプロイし、それを扱う方法_ +- [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_ +- [Hardhatを使用したコントラクトのデプロイ](https://hardhat.org/guides/deploying.html) - _Nomic Labs_ -_イーサリアムを学ぶために利用したコミュニティリソースはありますか? もしあればページを編集して追加してください!_ +_役に立ったコミュニティリソースがあれば、 ぜひこのページに追加してください。_ ## 関連トピック {#related-topics} - [開発フレームワーク](/developers/docs/frameworks/) -- [イーサリアムノードの実行](/developers/docs/nodes-and-clients/run-a-node/) +- [イーサリアムノードの運用](/developers/docs/nodes-and-clients/run-a-node/) +- [Nodes-as-a-service(サービスとしてのノード)](/developers/docs/nodes-and-clients/nodes-as-a-service) diff --git a/public/content/translations/ja/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/ja/developers/docs/smart-contracts/formal-verification/index.md index 851b9808cc9..88e894bf98c 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/formal-verification/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/formal-verification/index.md @@ -20,7 +20,7 @@ lang: ja 計算機科学において、 [計算の形式モデル](https://en.wikipedia.org/wiki/Model_of_computation)は計算プロセスを数学的に記述するものです。 プログラムは数学的な関数(方程式)によって抽象化され、関数の入力に対して出力をどう計算するかが形式モデルによって記述されます。 -形式モデルは、プログラムの挙動の分析を評価できる水準での抽象化を可能とします。 形式モデルがあることで*形式仕様*が作成でき、それによって、問題となっているモデルの持つべき望ましいプロパティが記述されます。 +形式モデルは、プログラムの挙動の分析を評価できる水準での抽象化を可能とします。 形式モデルがあることで_形式仕様_が作成でき、それによって、問題となっているモデルの持つべき望ましいプロパティが記述されます。 形式的検証のためのスマートコントラクトのモデル化には、さまざまな技法が用いられます。 たとえば、スマートコントラクトの高水準な挙動を論証するために用いられるモデルがあります。 そのようなモデル化技法では、スマートコントラクトを与えられた入力に基いて計算を実行するブラックボックスとみなします。 @@ -34,7 +34,7 @@ lang: ja 仕様とは、特定のシステムが満たすべき技術的要件のことです。 プログラミングにおいては、仕様はプログラムの実行についてのおおまかな狙い(すなわち、プログラムが何をすべきか)を表します。 -スマートコントラクトの文脈では、形式仕様記述はスマートコントラクトが満たさなければならない要件を形式的に記述したものであり、これを*プロパティ*と呼びます。 プロパティはスマートコントラクトの実行を通しての「不変条件」として記述され、例外なしにあらゆる状況下で真であるべき論理アサーションを表現するものです。 +スマートコントラクトの文脈では、形式仕様記述はスマートコントラクトが満たさなければならない要件を形式的に記述したものであり、これを_プロパティ_と呼びます。 プロパティはスマートコントラクトの実行を通しての「不変条件」として記述され、例外なしにあらゆる状況下で真であるべき論理アサーションを表現するものです。 したがって、形式仕様記述はスマートコントラクトのしかるべき挙動を形式言語で記述したものの集まりである、と考えることができます。 仕様が対象とするのはスマートコントラクトのプロパティで、スマートコントラクトがさまざまな状況下でどのように動作すべきかを表します。 スマートコントラクトがそれらのプロパティ(不変条件) を実行中に破らないことを見極めるのが、 形式的検証の目的です。 @@ -52,11 +52,11 @@ lang: ja その名のとおり、高水準な仕様記述(「モデル指向仕様記述」とも呼ばれます) はプログラムの高水準な挙動を記述するためのものです。 高水準な仕様記述においてスマートコントラクトは[有限状態機械](https://en.wikipedia.org/wiki/Finite-state_machine)(FSM)としてモデル化されます。スマートコントラクトの挙動は処理の実行を伴う状態遷移で表され、モデルの形式的プロパティは時相論理で記述されます。 -[時相論理](https://en.wikipedia.org/wiki/Temporal_logic)は時間という条件の付いた命題(たとえば、「私は*いつも*空腹だ」や「私は*いずれ*空腹になる」)を論証するための規則の集まりです。 形式的検証での時相論理は、状態遷移機械でモデル化されたシステムの正しい挙動に関するアサーションを記述するために使われます。 具体的には、スマートコントラクトがある将来の時点でモデルのどの状態にあるのか、そしてどのように状態間で遷移するのかを時相論理で記述できます。 +[時相論理](https://en.wikipedia.org/wiki/Temporal_logic)は時間という条件の付いた命題(たとえば、「私は_いつも_空腹だ」や「私は_いずれ_空腹になる」)を論証するための規則の集まりです。 形式的検証での時相論理は、状態遷移機械でモデル化されたシステムの正しい挙動に関するアサーションを記述するために使われます。 具体的には、スマートコントラクトがある将来の時点でモデルのどの状態にあるのか、そしてどのように状態間で遷移するのかを時相論理で記述できます。 -高水準な仕様記述は一般に**安全性 (safety)**と**活性 (liveness)**という、スマートコントラクトの時相に関する重要な 2 つのプロパティを捕えることができます。 安全性とはすなわち「何も悪いことが起こらない」ということで、通常は不変条件によって表されます。 安全性は、[デッドロック](https://www.techtarget.com/whatis/definition/deadlock)が起こらないことといった一般的なソフトウェア要件を意味することもあれば、スマートコントラクトのドメイン固有なプロパティ(たとえば関数に対するアクセス制御の不変条件、状態変数の許容値、トークン転送の条件など)を意味することもあります。 +高水準な仕様記述は一般に**安全性 (safety)**と**活性 (liveness)**という、スマートコントラクトの時相に関する重要な2つのプロパティを捕えることができます。 安全性とはすなわち「何も悪いことが起こらない」ということで、通常は不変条件によって表されます。 安全性は、[デッドロック](https://www.techtarget.com/whatis/definition/deadlock)が起こらないことといった一般的なソフトウェア要件を意味することもあれば、スマートコントラクトのドメイン固有なプロパティ(たとえば関数に対するアクセス制御の不変条件、状態変数の許容値、トークン転送の条件など)を意味することもあります。 -例として、*「送金しようとしているトークンの量に対し、送金元の口座残高に不足があってはならない」*という、 ERC-20 トークンのスマートコントラクトで`transfer()`や`transferFrom()`を呼び出す際の安全性の要求仕様を考えます。 この自然言語で書かれたスマートコントラクトの不変条件は数学的な形式仕様記述に翻訳され、その妥当性が厳密に検査されます。 +例として、_「送金しようとしているトークンの量に対し、送金元の口座残高に不足があってはならない」_という、 ERC-20トークンのスマートコントラクトで`transfer()`や`transferFrom()`を呼び出す際の安全性の要求仕様を考えます。 この自然言語で書かれたスマートコントラクトの不変条件は数学的な形式仕様記述に翻訳され、その妥当性が厳密に検査されます。 活性は「何らかの良いことがいずれは起こる」ということを意味し、スマートコントラクトに関しては、するべき処理を滞りなく進められることを示します。 活性の一例として「流動性」が挙げられ、これは、要求に応じてスマートコントラクトが残高を他ユーザーに譲渡できることを意味します。 このプロパティが破られると、[パリティウォレット事件](https://www.cnbc.com/2017/11/08/accidental-bug-may-have-frozen-280-worth-of-ether-on-parity-wallet.html)で起こったように、あるはずの資産が引き出せなくなります。 @@ -64,23 +64,23 @@ lang: ja 高水準な仕様記述では、有限状態モデルから出発してモデルの望ましいプロパティを記述しました。 一方で、低水準な仕様記述(プロパティ指向仕様記述とも呼ばれます)では、プログラム(すなわちスマートコントラクト)を数学的な関数の集まりからなるシステムとしてモデル化し、そのシステムの正しい挙動を記述します。 -簡単に言うと、低水準な仕様記述では*プログラムのトレース* を解析し、それに基づいてスマートコントラクトのプロパティを記述することを目指します。 トレースとは、スマートコントラクトの状態変化を伴った関数の実行シーケンスを指します。したがって、低水準な仕様記述ではスマートコントラクト内部の実行の様子についての要求仕様まで記述できます。 +簡単に言うと、低水準な仕様記述では_プログラムのトレース_ を解析し、それに基づいてスマートコントラクトのプロパティを記述することを目指します。 トレースとは、スマートコントラクトの状態変化を伴った関数の実行シーケンスを指します。したがって、低水準な仕様記述ではスマートコントラクト内部の実行の様子についての要求仕様まで記述できます。 低水準な仕様記述は、ホーア型のプロパティもしくはプログラムの実行フローによって与えられます。 ### ホーア型のプロパティ {#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の状態についての述語です。 -事前条件は関数を正しく実行するために求められる条件を表しています。スマートコントラクトを呼び出す際には、この事前条件が満たされている必要があります。 事後条件は、関数が正しく実行された場合に成立する条件を表しています。関数呼び出しの後はこの事後条件が真となることが期待されます。 ホーア論理の*不変条件*は、関数の実行中は常に維持されます(すなわち、変化しません)。 +事前条件は関数を正しく実行するために求められる条件を表しています。スマートコントラクトを呼び出す際には、この事前条件が満たされている必要があります。 事後条件は、関数が正しく実行された場合に成立する条件を表しています。関数呼び出しの後はこの事後条件が真となることが期待されます。 ホーア論理の_不変条件_は、関数の実行中は常に維持されます(すなわち、変化しません)。 -ホーア型の仕様記述により、*部分正当性*もしくは*完全正当性*が保証されます。 事前条件が関数実行前に真であり、実行が停止した場合には事後条件も真であるとき、スマートコントラクト関数の実装は「部分正当性を満たし」ます。 完全正当性を証明するには、関数の実行前に事前条件が真であること、実行が終了すること、その際に事後条件が真であることの三つが必要です。 +ホーア型の仕様記述により、_部分正当性_もしくは_完全正当性_が保証されます。 事前条件が関数実行前に真であり、実行が停止した場合には事後条件も真であるとき、スマートコントラクト関数の実装は「部分正当性を満たし」ます。 完全正当性を証明するには、関数の実行前に事前条件が真であること、実行が終了すること、その際に事後条件が真であることの三つが必要です。 プログラムによっては実行が終わるのに時間がかかったり、そもそも終わらなかったりするので、完全正当性の証明は困難となります。 とはいえ、イーサリアムのガスメカニズムが無限ループを防ぐので、実行が終了するかどうかは議論の余地はあれども理論上の問題点です(実行は正常に終了するか、'ガス不足'のエラーで打ち切られます)。 ホーア論理で作成されたスマートコントラクトの仕様記述は、スマートコントラクト内部の関数やループを実行するために述べられた事前条件、事後条件、不変条件を含みます。 事前条件が関数への誤った入力を許容する場合もあり、その際は事後条件でそのような誤った入力があった場合の応答(例外を発生させるなど)が記述されます。 このようにして、ホーア型のプロパティによってスマートコントラクト実装の正当性を保証する際に有効となります。 -多くの形式的検証のフレームワークで、関数の意味的正当性を証明するためにホーア型の仕様記述が使われています。 Solidity の`require`と`assert`ステートメントを使えば、スマートコントラクトのコードにホーア型のプロパティを(アサーションとして) 直接書くこともできます。 +多くの形式的検証のフレームワークで、関数の意味的正当性を証明するためにホーア型の仕様記述が使われています。 Solidityの`require`と`assert`ステートメントを使えば、スマートコントラクトのコードにホーア型のプロパティを(アサーションとして) 直接書くこともできます。 `require`ステートメントは事前条件もしくは不変条件を書くのに用いられ、ユーザーから与えられた入力の有効性を確認するのに使われることが多く、その一方で`assert`ステートメントは安全性のために必要な事後条件を書くのに使われます。 たとえば、 関数への適切なアクセス制御(安全性プロパティの一例) は、`require`ステートメントを使用して、該当する関数を呼び出そうとしているアカウントの識別情報を前提条件チェックすることで実現できます。 同様に、`assert`ステートメントで実行後のスマートコントラクトの状態を確認することで、コントラクト内部の状態変数(たとえば、流通しているトークンの総数など)が許容される値であることを示す不変条件を違反しないが保護することがであることを示す不変条件の違反を防ぐことができます。 @@ -92,7 +92,7 @@ lang: ja 主に、トレースレベルの仕様記述は、スマートコントラクトの内部の実行のパターンを論じる際に用いられます。 トレースレベルでの仕様記述を作成することで、スマートコントラクトに許容される実行パス(すなわち、状態遷移)をアサートできます。 シンボリック実行などの手法を用いれば、形式的モデルで定義されていないパスには実行が進まないことを形式的に検証することができます。 -例として、公開されている関数でトレースレベルのプロパティの記述ができる[DAO](/dao/)コントラクトを見てみましょう。 ここでは、DAO コントラクトによってユーザーが以下の操作を実行できることとします。 +例として、公開されている関数でトレースレベルのプロパティの記述ができる[DAO](/dao/)コントラクトを見てみましょう。 ここでは、DAOコントラクトによってユーザーが以下の操作を実行できることとします。 - 入金 @@ -100,7 +100,7 @@ lang: ja - 提案への投票をしなかった者は返金を要求する -トレースレベルのプロパティの例として、 _「資金を入金しないユーザーは、提案に投票できない」_ または *「提案に投票しないユーザーは、いつでも返金を要求できる」*などが考えられます。 どちらのプロパティも望ましい実行シーケンスをアサートします(入金する*前*に投票することはできず、提案に投票した*後*に払い戻しの要求はできません)。 +トレースレベルのプロパティの例として、 _「資金を入金しないユーザーは、提案に投票できない」_ または _「提案に投票しないユーザーは、いつでも返金を要求できる」_などが考えられます。 どちらのプロパティも望ましい実行シーケンスをアサートします(入金する_前_に投票することはできず、提案に投票した_後_に払い戻しの要求はできません)。 ## スマートコントラクトの形式的検証の技法 {#formal-verification-techniques} @@ -110,9 +110,9 @@ lang: ja モデル検査では、システム(すなわち、スマートコントラクト)を抽象的かつ数学的に表すことと、システムが満たすべきプロパティを[命題論理](https://www.baeldung.com/cs/propositional-logic)に根差した論理式で表すことが求められます。 これにより、モデル検査アルゴリズムの目的は、数学的モデルが与えられた論理式を充足することの証明、と単純化されます。 -形式的検証におけるモデル検査は主として、スマートコントラクトの挙動を時間経過を加味して記述する時間的プロパティの評価に用いられます。 そのような、時間が関係するスマートコントラクトのプロパティには、先に説明した*安全性*と*活性*が含まれます。 +形式的検証におけるモデル検査は主として、スマートコントラクトの挙動を時間経過を加味して記述する時間的プロパティの評価に用いられます。 そのような、時間が関係するスマートコントラクトのプロパティには、先に説明した_安全性_と_活性_が含まれます。 -たとえば、アクセス制御(たとえば、 *スマートコントラクトの所有者に限り`selfdestruct`*を呼び出すことができます)に関するセキュリティプロパティが形式論理で記述できます。 その後、モデル検査のアルゴリズムはスマートコントラクトがこの形式的仕様を満たしているかどうかを検証することができます。 +たとえば、アクセス制御(たとえば、 _スマートコントラクトの所有者に限り`selfdestruct`_を呼び出すことができます)に関するセキュリティプロパティが形式論理で記述できます。 その後、モデル検査のアルゴリズムはスマートコントラクトがこの形式的仕様を満たしているかどうかを検証することができます。 モデル検査では、スマートコントラクトのすべての起こりうる状態を正確に描き、そのうちの到達可能な状態を見つけだそうと試みることで、状態空間の探索をします。 しかし、これは無限の状態数につながる可能性があります(「状態爆発問題」として知られています)。そのため、モデル検査器は抽象化技法によってスマートコントラクトの分析を効率化します。 @@ -120,7 +120,7 @@ lang: ja 定理証明は、スマートコントラクトなどのプログラムの正しさを数学的に論証する手法です。 スマートコントラクトのシステムとその仕様記述を数式(論理式)で書き下す必要があります。 -定理証明で目指すのは、それらの数式が論理的に等価であると検証することです。 「論理的な等価性」(「論理的な双含意」とも呼ばれます)は二つのステートメント間の関係の一種で、片方が真の*時かつその時に限り*もう片方も真となることです。 +定理証明で目指すのは、それらの数式が論理的に等価であると検証することです。 「論理的な等価性」(「論理的な双含意」とも呼ばれます)は二つのステートメント間の関係の一種で、片方が真の_時かつその時に限り_もう片方も真となることです。 スマートコントラクトのモデルに関するステートメントとそのプロパティのステートメントとの間に要求された関係性(論理的等価性)は、証明可能なステートメント(定理と呼ばれます)として定式化されます。 形式的な推論システムにより、自動定理証明器は定理の妥当性を検証することができます。 言い換えれば、定理証明器はスマートコントラクトのモデルが仕様記述に正確に適合していることを、疑いの余地のない形で証明することができます。 @@ -130,13 +130,13 @@ lang: ja ### シンボリック実行 {#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`の値を求めるのに、実際にそのような値が見つかる確信のないまま数十(もしくはそれ以上の)テストケースを実行することになります。 -逆に、シンボリック実行のツールは`X > 5 ∧ X < 10`(つまり、`x`は 5 より大きく、かつ、`x`は 10 より小さい)といったシンボリックな値を用いて関数を実行します。 関連するパス述語`x = X > 5 X < 10`は、これを解くために SMT ソルバーに渡されます。 ある値が論理式`x = X > 5 ∧ X < 10`を満たすのであれば、SMT ソルバーはそのような値を計算します。たとえば、`x`の値として`7`を出してくるかもしれません。 +逆に、シンボリック実行のツールは`X > 5 ∧ X < 10`(つまり、`x`は5より大きく、かつ、`x`は10より小さい)といったシンボリックな値を用いて関数を実行します。 関連するパス述語`x = X > 5 X < 10`は、これを解くためにSMTソルバーに渡されます。 ある値が論理式`x = X > 5 ∧ X < 10`を満たすのであれば、SMTソルバーはそのような値を計算します。たとえば、`x`の値として`7`を出してくるかもしれません。 シンボリック実行はプログラムへの入力によって行うもので、到達可能なあらゆる状態を探索するための入力集合は潜在的に無限となるため、これは依然としてテスト技法の一形態です。 ただし、例に示すように、プロパティに反する入力を見付けることについては、シンボリック実行は通常のテスト技法より効果的です。 @@ -170,7 +170,7 @@ function safe_add(uint x, uint y) returns(uint z){ しかし、このアプローチではサンプルに含まれない入力値に関しては正しさを証明することができません。 そのため、スマートコントラクトをテストすることでバグを検出できますが(すなわち、あるコードパスが実行中に望まれる結果を返さないならば)、**バグがないことを疑いの余地のない形で証明することはできません**。 -逆に、形式的検証によって、スマートコントラクトが実行範囲が無限となるような要求を満たすことを、実行すること*なし*に、形式的に証明することができます。 そのためには、スマートコントラクトの正しい挙動の詳細な形式仕様記述を作成し、スマートコントラクトのシステムの形式的(数学的)モデルを開発する必要があります。 そうすれば、形式的な証明手続きによって、スマートコントラクトのモデルとその仕様記述の間に矛盾がないことを確認することができます。 +逆に、形式的検証によって、スマートコントラクトが実行範囲が無限となるような要求を満たすことを、実行すること_なし_に、形式的に証明することができます。 そのためには、スマートコントラクトの正しい挙動の詳細な形式仕様記述を作成し、スマートコントラクトのシステムの形式的(数学的)モデルを開発する必要があります。 そうすれば、形式的な証明手続きによって、スマートコントラクトのモデルとその仕様記述の間に矛盾がないことを確認することができます。 形式的検証により、スマートコントラクトのビジネスロジックが要件を満たしているかどうかを検証するという問題は、証明もしくは反証できる数学的命題となります。 形式的に命題を証明することで、無限にあるテストケースが有限の手順で検証できるようになります。 形式的検証には、スマートコントラクトが仕様記述に対して機能的に正しいこと証明することの、より良い将来性が見込まれます。 @@ -178,11 +178,11 @@ function safe_add(uint x, uint y) returns(uint z){ 検証の対象は、形式的に検証すべきシステムを記述します。 形式的検証は、「組み込みシステム」(大きなシステムの一部を形成する小さく単純なソフトウェア)で最もよく使用されます。 また、少数の規則のみを扱うドメインであれば、ドメイン固有のプロパティを検証するためにツールを変更することも容易であるため、形式的検証が適しています。 -スマートコントラクトは、少なくともある程度は両方の要件を満たしています。 たとえば、イーサリアムのスマートコントラクトはサイズが小さいため、形式的検証が適しています。 同様に、EVM は単純なルールに従っているため、EVM で実行されるプログラムの意味論的なプロパティの仕様記述とその検証も容易になります。 +スマートコントラクトは、少なくともある程度は両方の要件を満たしています。 たとえば、イーサリアムのスマートコントラクトはサイズが小さいため、形式的検証が適しています。 同様に、EVMは単純なルールに従っているため、EVMで実行されるプログラムの意味論的なプロパティの仕様記述とその検証も容易になります。 ### 開発サイクルの短縮 {#faster-development-cycle} -モデル検査やシンボリック実行などの形式的検証の技法は、一般的にスマートコントラクトのコードの定期的な分析よりも効率的です(テストや監査中に実行されます)。 これは、形式的検証ではアサーションをテストするためにシンボリックな値を用いるからで(「ユーザーが _n_ eth 引き出そうとした場合はどうなりますか?」)、 具体的な値を用いる場合(「ユーザーが 5 eth を引き出そうとした場合はどうでしょう?」)とは異なります。 +モデル検査やシンボリック実行などの形式的検証の技法は、一般的にスマートコントラクトのコードの定期的な分析よりも効率的です(テストや監査中に実行されます)。 これは、形式的検証ではアサーションをテストするためにシンボリックな値を用いるからで(「ユーザーが _n_ eth引き出そうとした場合はどうなりますか?」)、 具体的な値を用いる場合(「ユーザーが5 ethを引き出そうとした場合はどうでしょう?」)とは異なります。 シンボリックな入力変数は複数クラスの具体的値をカバーできるため、形式的検証のアプローチでは、より短い時間でより多くのコードカバレッジが期待されます。 形式的検証を効果的に使用することで、開発サイクルを加速させることができます。 @@ -204,7 +204,7 @@ function safe_add(uint x, uint y) returns(uint z){ ### パフォーマンスの問題 {#performance-issues} -形式的検証はパフォーマンス上の問題になります。 例えば、モデル検査とシンボル検査中に発生する状態爆発問題とパス爆発問題により、検証手順に悪影響がありえます。 また、形式的検証ツールは多くの場合に SMT ソルバーやその他の制約ソルバーを内部的に使用しており、多量の計算処理を要します。 +形式的検証はパフォーマンス上の問題になります。 例えば、モデル検査とシンボル検査中に発生する状態爆発問題とパス爆発問題により、検証手順に悪影響がありえます。 また、形式的検証ツールは多くの場合にSMTソルバーやその他の制約ソルバーを内部的に使用しており、多量の計算処理を要します。 プログラムが停止しない可能性([decidability problem](https://en.wikipedia.org/wiki/Decision_problem))もあるため、要求されるプロパティ(論理式として定義される)が満たされるのかどうかも一般には判断できません。 スマートコントラクトのプロパティが正しく記述されていたとしても、証明することが不可能なことがあります。 @@ -212,59 +212,59 @@ function safe_add(uint x, uint y) returns(uint z){ ### 形式的仕様記述のための言語 {#specification-languages} -**Act**: \_\*ストレージの更新、事前条件・事後条件、スマートコントラクトの不変条件を仕様として記述できます。 Act ツールスイートには、Coq、SMT ソルバー、hevm を介してプロパティを証明するための、証明バックエンドが含まれます。\*\* +**Act**: _*ストレージの更新、事前条件・事後条件、スマートコントラクトの不変条件を仕様として記述できます。 Actツールスイートには、Coq、SMTソルバー、hevmを介してプロパティを証明するための、証明バックエンドが含まれます。** - [GitHub](https://github.com/ethereum/act) - [ドキュメント](https://ethereum.github.io/act/) -**Scribble** - \_\*Scribble は、Scribble 仕様言語のコードアノテーションを具体的なアサーションに変換し、仕様記述を検査することができます。\*\* +**Scribble** - _*Scribbleは、Scribble仕様言語のコードアノテーションを具体的なアサーションに変換し、仕様記述を検査することができます。** - [ドキュメント](https://docs.scribble.codes/) -**Dafny** \_\*Dafny はプログラム検証との親和性が高いプログラミング言語で、その高水準なアノテーションを用いることでコードの正しさを論証したり証明したりすることができます。\*\* +**Dafny** _*Dafnyはプログラム検証との親和性が高いプログラミング言語で、その高水準なアノテーションを用いることでコードの正しさを論証したり証明したりすることができます。** - [GitHub](https://github.com/dafny-lang/dafny) ### 正しさを確認するためのプログラム検証器 {#program-verifiers} -**Certora Prover** _Certora Prover は、スマートコントラクトのコードの正しさを検査するための自動形式的検証ツールです。 仕様記述は CVL(Certora Verification Language)で行い、静的解析と制約解析の組み合わせでプロパティ違反を検出します。_ +**Certora Prover** _Certora Proverは、スマートコントラクトのコードの正しさを検査するための自動形式的検証ツールです。 仕様記述はCVL(Certora Verification Language)で行い、静的解析と制約解析の組み合わせでプロパティ違反を検出します。_ - [ウェブサイト](https://www.certora.com/) - [ドキュメント](https://docs.certora.com/en/latest/index.html) -**Solidity SMTChecker** \_\*Solidity SMTChecker は、SMT(Satisfiability Modulo Theories)とホーン節の充足問題に基づく組み込みのモデルチェッカーです。 コンパイル中にスマートコントラクトのソースコードが仕様記述に適合することを確認し、安全性プロパティの違反があるかどうかを静的にチェックします。\*\* +**Solidity SMTChecker** _*Solidity SMTCheckerは、SMT(Satisfiability Modulo Theories)とホーン節の充足問題に基づく組み込みのモデルチェッカーです。 コンパイル中にスマートコントラクトのソースコードが仕様記述に適合することを確認し、安全性プロパティの違反があるかどうかを静的にチェックします。** - [GitHub](https://github.com/ethereum/solidity) -**solc-verify** \_\*solc-verify は Solidity コンパイラの拡張で、アノテーションとモジュラー型のプログラム検証によって自動的に形式的検証を行います。\*\* +**solc-verify** _*solc-verifyはSolidityコンパイラの拡張で、アノテーションとモジュラー型のプログラム検証によって自動的に形式的検証を行います。** - [GitHub](https://github.com/SRI-CSL/solidity) -**KEVM** \_\*KEVM は、K framework で書かれたイーサリアム仮想マシン(EVM)の形式的な意味論です。 KEVM は実行可能であり、到達可能性論理によってある種のプロパティ関連のアサーションの証明に利用できます。\*\* +**KEVM** _*KEVMは、K frameworkで書かれたイーサリアム仮想マシン(EVM)の形式的な意味論です。 KEVMは実行可能であり、到達可能性論理によってある種のプロパティ関連のアサーションの証明に利用できます。** - [GitHub](https://github.com/runtimeverification/evm-semantics) - [ドキュメント](https://jellopaper.org/) ### 定理証明のための論理枠組み {#theorem-provers} -**Isabelle** _証明支援ソフトウェア Isabelle/HOL は、数式を形式言語で表現したり、それらを証明するためのツールで構成されます。 主に数学における証明の形式化とある種の形式的検証に用いられ、コンピュータハードウェアやソフトウェアの正しさの証明やコンピュータ言語やプロトコルの性質の証明などに応用されています。_ +**Isabelle** _証明支援ソフトウェアIsabelle/HOLは、数式を形式言語で表現したり、それらを証明するためのツールで構成されます。 主に数学における証明の形式化とある種の形式的検証に用いられ、コンピュータハードウェアやソフトウェアの正しさの証明やコンピュータ言語やプロトコルの性質の証明などに応用されています。_ - [GitHub](https://github.com/isabelle-prover) - [ドキュメント](https://isabelle.in.tum.de/documentation.html) -**Coq** _Coq は対話型の定理証明器で、機械的に検査されたプログラムの正しさの証明を対話的に作成することができます。_ +**Coq** _Coqは対話型の定理証明器で、機械的に検査されたプログラムの正しさの証明を対話的に作成することができます。_ - [GitHub](https://github.com/coq/coq) - [ドキュメント](https://coq.github.io/doc/v8.13/refman/index.html) ### シンボリック実行に基いてスマートコントラクトが脆弱となるパターンを検出するツール {#symbolic-execution-tools} -**Manticore** \_\*シンボリック実行に基づいた EVM バイトコードの解析ツールです。\*\* +**Manticore** _*シンボリック実行に基づいたEVMバイトコードの解析ツールです。** - [GitHub](https://github.com/trailofbits/manticore) - [ドキュメント](https://github.com/trailofbits/manticore/wiki) -**hevm** \_\*hevm はシンボリック実行のエンジンで、EVM バイトコードの同等性を検査することができます。\*\* +**hevm** _*hevmはシンボリック実行のエンジンで、EVMバイトコードの同等性を検査することができます。** - [GitHub](https://github.com/dapphub/dapptools/tree/master/src/hevm) @@ -278,6 +278,6 @@ function safe_add(uint x, uint y) returns(uint z){ - [スマートコントラクトの形式的検証方法](https://runtimeverification.com/blog/how-formal-verification-of-smart-contracts-works/) - [形式的検証で完璧なスマートコントラクトを実現する方法](https://media.consensys.net/how-formal-verification-can-ensure-flawless-smart-contracts-cbda8ad99bd1) - [イーサリアム・エコシステムにおける形式的検証プロジェクトの概要](https://github.com/leonardoalt/ethereum_formal_verification_overview) -- [イーサリアム 2.0 の入金スマートコントラクトのエンドツーエンドな形式的検証](https://runtimeverification.com/blog/end-to-end-formal-verification-of-ethereum-2-0-deposit-smart-contract/) +- [イーサリアム2.0の入金スマートコントラクトのエンドツーエンドな形式的検証](https://runtimeverification.com/blog/end-to-end-formal-verification-of-ethereum-2-0-deposit-smart-contract/) - [世界一有名なスマートコントラクトの形式的検証](https://www.zellic.io/blog/formal-verification-weth) -- [SMTChecker と形式的検証](https://docs.soliditylang.org/en/v0.8.15/smtchecker.html) +- [SMTCheckerと形式的検証](https://docs.soliditylang.org/en/v0.8.15/smtchecker.html) diff --git a/public/content/translations/ja/developers/docs/smart-contracts/index.md b/public/content/translations/ja/developers/docs/smart-contracts/index.md index cdcbea74aa7..9c557157bef 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/index.md @@ -28,7 +28,7 @@ lang: ja このロジックは自動販売機にプログラムされています。 -自動販売機と同様に、スマートコントラクトにはロジックがプログラムされています。 この自動販売機が Solidity で書かれたスマートコントラクトであればどのように見えるか、簡単な例を挙げてみましょう。 +自動販売機と同様に、スマートコントラクトにはロジックがプログラムされています。 この自動販売機がSolidityで書かれたスマートコントラクトであればどのように見えるか、簡単な例を挙げてみましょう。 ```solidity pragma solidity 0.8.7; @@ -66,7 +66,7 @@ contract VendingMachine { ## パーミッションレス {#permissionless} -誰でもスマートコントラクトを作成してネットワークにデプロイできます。 [スマートコントラクト言語](/developers/docs/smart-contracts/languages/)でのコーディング方法を学び、コントラクトをデプロイするのに十分な ETH を持っていればよいのです。 スマートコントラクトのデプロイは技術的にはトランザクションなので、単純な ETH 送金に[ガス](/developers/docs/gas/)を支払う必要があるのと同じように、ガスを支払う必要があります。 ただし、コントラクトのデプロイにかかるガス代は、はるかに高くなります。 +誰でもスマートコントラクトを作成してネットワークにデプロイできます。 [スマートコントラクト言語](/developers/docs/smart-contracts/languages/)でのコーディング方法を学び、コントラクトをデプロイするのに十分なETHを持っていればよいのです。 スマートコントラクトのデプロイは技術的にはトランザクションなので、単純なETH送金に[ガス](/developers/docs/gas/)を支払う必要があるのと同じように、ガスを支払う必要があります。 ただし、コントラクトのデプロイにかかるガス代は、はるかに高くなります。 イーサリアムには以下のような、スマートコントラクトを作成するためのデベロッパーフレンドリーな言語があります。 @@ -79,21 +79,21 @@ contract VendingMachine { ## コンポーザビリティ {#composability} -スマートコントラクトはイーサリアム上で公開されており、オープン API と考えることができます。 つまり、自分のスマートコントラクトの中で他のスマートコントラクトを呼び出し、自分のスマートコントラクトでできることを大幅に拡張することができるのです。 スマートコントラクトは他のスマートコントラクトをデプロイすることもできます。 +スマートコントラクトはイーサリアム上で公開されており、オープンAPIと考えることができます。 つまり、自分のスマートコントラクトの中で他のスマートコントラクトを呼び出し、自分のスマートコントラクトでできることを大幅に拡張することができるのです。 スマートコントラクトは他のスマートコントラクトをデプロイすることもできます。 [スマートコントラクトのコンポーザビリティ](/developers/docs/smart-contracts/composability/)についてもっと詳しく知る ## 制限事項 {#limitations} -スマートコントラクトだけでは、HTTP リクエストを送信できないため、実際のイベントに関する情報を得ることはできません。 これは仕様です。 外部の情報に頼ると、セキュリティや分散化のために重要なコンセンサスが損なわれる可能性があります。 +スマートコントラクトだけでは、オフチェーンソースからデータを取得できないため、実世界のイベントに関する情報を得ることはできません。 そのため、実世界のイベントに反応することはできません。 これは、スマートコントラクトの仕様です。 外部の情報に頼ると、セキュリティや分散化のために重要なコンセンサスが損なわれる可能性があるためです。 -[オラクル](/developers/docs/oracles/)を使用して、この問題を回避する方法があります。 +しかし、ブロックチェーンアプリケーションにとって、オフチェーンデータが使えることは重要です。 そのためソリューションとして、オフチェーンデータを取り込んでスマートコントラクトで利用できるようにするツールである[オラクル](/developers/docs/oracles/)があります。 -スマートコントラクトのもう一つの制約は、コントラクトの最大サイズです。 スマートコントラクトの最大サイズは 24KB です。それ以上の場合はガス不足になります。 これは、[ダイヤモンドパターン](https://eips.ethereum.org/EIPS/eip-2535)を使用して回避することができます。 +スマートコントラクトのもう一つの制約は、コントラクトの最大サイズです。 スマートコントラクトの最大サイズは24KBです。それ以上の場合はガス不足になります。 これは、[ダイヤモンドパターン](https://eips.ethereum.org/EIPS/eip-2535)を使用して回避することができます。 ## マルチシグコントラクト {#multisig} -マルチシグ(複数署名)コントラクトは、トランザクションを実行するために複数の有効な署名を必要とするスマートコントラクトアカウントです。 これは、相当量のイーサやトークンを保持するコントラクトで単一障害点を回避するのに特に便利です。 マルチシグはまた、コントラクトの実行と鍵の管理の責任を複数の当事者間で分担し、取返しのつかない資金損失につながる秘密鍵の紛失を防ぎます。 これらの理由から、簡単な DAO ガバナンスのためにマルチシグコントラクトを利用することができます。 マルチシグでは実行に、許容可能な M 個の署名の内の N 個の署名(N ≤ M、M > 1)が必要です。 `N = 3, M = 5`と`N = 4, M = 7`が一般的に使用されます。 4/7 マルチシグでは、7 つの有効な署名のうちの 4 つが必要です。 これは、3 つの署名が失われても資金が回収可能であることを意味します。 この場合、コントラクトを実行するためには、鍵の保有者の過半数の同意と署名が必要であることも意味します。 +マルチシグ(複数署名)コントラクトは、トランザクションを実行するために複数の有効な署名を必要とするスマートコントラクトアカウントです。 これは、相当量のイーサやトークンを保持するコントラクトで単一障害点を回避するのに特に便利です。 マルチシグはまた、コントラクトの実行と鍵の管理の責任を複数の当事者間で分担し、取返しのつかない資金損失につながる秘密鍵の紛失を防ぎます。 これらの理由から、簡単なDAOガバナンスのためにマルチシグコントラクトを利用することができます。 マルチシグでは実行に、許容可能なM個の署名の内のN個の署名(N ≤ M、M > 1)が必要です。 `N = 3, M = 5`と`N = 4, M = 7`が一般的に使用されます。 4/7マルチシグでは、7つの有効な署名のうちの4つが必要です。 これは、3つの署名が失われても資金が回収可能であることを意味します。 この場合、コントラクトを実行するためには、鍵の保有者の過半数の同意と署名が必要であることも意味します。 ## スマートコントラクト関連情報 {#smart-contract-resources} @@ -103,13 +103,8 @@ contract VendingMachine { - [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) - [コミュニティフォーラム](https://forum.openzeppelin.com/c/general/16) -**DappSys -** **_スマートコントラクトのための安全でシンプルかつ柔軟なビルディングブロック。_** - -- [Dappsys](https://dappsys.readthedocs.io/) -- [GitHub](https://github.com/dapphub/dappsys) - ## 参考文献 {#further-reading} -- [スマートコントラクト: 弁護士を不要にするブロックチェーンテクノロジー](https://blockgeeks.com/guides/smart-contracts/) _– Blockgeeks_ -- [スマートコントラクト開発のための最善の方法](https://yos.io/2019/11/10/smart-contract-development-best-practices/) _– 2019 年 11 月 10 日 - Yos Riady_ -- [ クリーンコントラクト - スマートコントラクトのパターンと実践に関するガイド](https://www.wslyvh.com/clean-contracts/) _– 2020 年 7 月 30 日 - wslyvh_ +- [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/ja/developers/docs/smart-contracts/languages/index.md b/public/content/translations/ja/developers/docs/smart-contracts/languages/index.md index 729d954c736..912bfd54ff7 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/languages/index.md @@ -4,20 +4,20 @@ description: 2つの主要なスマートコントラクト言語であるSolidi lang: ja --- -イーサリアムの長所は、比較的デベロッパーフレンドリーな言語を使ってスマートコントラクトを記述できることです。 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)を使用している方は、見慣れたような構文を持つ言語を使うことができます。 -最も活発にメンテナンスされている言語は、以下の 2 つです。 +最も活発にメンテナンスされている言語は、以下の2つです。 - Solidity - Vyper -また、経験豊富なデベロッパーであれば、[イーサリアム仮想マシン](/developers/docs/evm/)用の中間言語である Yul や、Yul を拡張した Yul+を使うのもよいでしょう。 +また、経験豊富なデベロッパーであれば、[イーサリアム仮想マシン](/developers/docs/evm/)用の中間言語であるYulや、Yulを拡張したYul+を使うのもよいでしょう。 -開発中の新しい言語に興味があり、テストに協力したいとお考えの場合は、Fe というまだ登場したばかりのスマートコントラクト言語を試してみることができます。 +開発中の新しい言語に興味があり、テストに協力したいとお考えの場合は、Feというまだ登場したばかりのスマートコントラクト言語を試してみることができます。 ## 前提知識 {#prerequisites} -プログラミング言語、特に JavaScript や Python の知識は、スマートコントラクト言語の違いを理解するのに役立ちます。 また、スマートコントラクトをコンセプトとして理解し、言語比較を深く掘り下げることをお勧めします。 [スマートコントラクトの紹介](/developers/docs/smart-contracts/) +プログラミング言語、特にJavaScriptやPythonの知識は、スマートコントラクト言語の違いを理解するのに役立ちます。 また、スマートコントラクトをコンセプトとして理解し、言語比較を深く掘り下げることをお勧めします。 [スマートコントラクトの紹介](/developers/docs/smart-contracts/) ## Solidity {#solidity} @@ -32,12 +32,12 @@ lang: ja ### 参照すべきリンク {#important-links} - [ドキュメント](https://docs.soliditylang.org/en/latest/) -- [Solidity 言語ポータル](https://soliditylang.org/) +- [Solidity言語ポータル](https://soliditylang.org/) - [Solidity by Example](https://docs.soliditylang.org/en/latest/solidity-by-example.html) - [GitHub](https://github.com/ethereum/solidity/) -- [Solidity Matrix チャットルーム](https://matrix.to/#/#ethereum_solidity:gitter.im)にブリッジされた[Solidity Gitter チャットルーム](https://gitter.im/ethereum/solidity) +- [Solidity Matrixチャットルーム](https://matrix.to/#/#ethereum_solidity:gitter.im)にブリッジされた[Solidity Gitterチャットルーム](https://gitter.im/ethereum/solidity/) - [チートシート](https://reference.auditless.com/cheatsheet) -- [Solidity ブログ](https://blog.soliditylang.org/) +- [Solidityブログ](https://blog.soliditylang.org/) - [Solidity Twitter](https://twitter.com/solidity_lang) ### コントラクトのコード例 {#example-contract} @@ -81,25 +81,25 @@ contract Coin { } ``` -この例は、Solidity のコントラクト構文がどのようなものか理解するのに役立つでしょう。 関数と変数のより詳細な説明については、[ドキュメント](https://docs.soliditylang.org/en/latest/contracts.html)を参照してください。 +この例は、Solidityのコントラクト構文がどのようなものか理解するのに役立つでしょう。 関数と変数のより詳細な説明については、[ドキュメント](https://docs.soliditylang.org/en/latest/contracts.html)を参照してください。 ## Vyper {#vyper} -- Python 的なプログラミング言語 +- Python的なプログラミング言語 - 強い型付け - コンパクトでわかりやすいコンパイラコード - 効率的なバイトコード生成 -- コントラクトの安全性を確保し、監査が容易になることを目的として、意図的に Solidity よりも機能を絞っている。 Vyper は以下をサポートしていない - - modifier 修飾子 +- コントラクトの安全性を確保し、監査が容易になることを目的として、意図的にSolidityよりも機能を絞っている。 Vyperは以下をサポートしていない + - modifier修飾子 - 継承 - インラインアセンブリ - 関数のオーバーロード - オペレータのオーバーロード - 再帰呼び出し - 無限ループ - - 2 進固定小数点 + - 2進固定小数点 -詳細については、[Vyper のドキュメント](https://vyper.readthedocs.io/en/latest/index.html)を参照してください。 +詳細については、[Vyperのドキュメント](https://vyper.readthedocs.io/en/latest/index.html)を参照してください。 ### 参照すべきリンク {#important-links-1} @@ -107,14 +107,14 @@ contract Coin { - [Vyper by Example](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) - [More Vyper by Example](https://vyper-by-example.org/) - [GitHub](https://github.com/vyperlang/vyper) -- [Vyper コミュニティの Discord チャット](https://discord.gg/SdvKC79cJk) +- [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) +- [スマートコントラクト開発フレームワークと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} @@ -203,34 +203,34 @@ 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} +## YulとYul+ {#yul} -イーサリアムを使い始めたばかりで、スマートコントラクト言語を使ってコードを書いたことがない場合は、Solidity や Vyper を利用することをお勧めします。 Yul や Yul+を検討するのは、スマートコントラクトのセキュリティの最善の方法や、EVM との連携の具体的な内容に精通してからにしてください。 +イーサリアムを使い始めたばかりで、スマートコントラクト言語を使ってコードを書いたことがない場合は、SolidityやVyperを利用することをお勧めします。 YulやYul+を検討するのは、スマートコントラクトのセキュリティの最善の方法や、EVMとの連携の具体的な内容に精通してからにしてください。 **Yul** - イーサリアムのための中間言語 -- [EVM](/developers/docs/evm)および[Ewasm](https://github.com/ewasm)というイーサリアム向けの WebAssembly をサポートしており、両方のプラットフォームで使用可能な共通部分として設計されている -- EVM と eWASM の両方のプラットフォームに同程度のメリットをもたらす、高度な最適化段階を経る対象となる +- [EVM](/developers/docs/evm)および[Ewasm](https://github.com/ewasm)というイーサリアム向けのWebAssemblyをサポートしており、両方のプラットフォームで使用可能な共通部分として設計されている +- EVMとeWASMの両方のプラットフォームに同程度のメリットをもたらす、高度な最適化段階を経る対象となる **Yul+** -- Yul に高効率な拡張機能を施した低レベル言語 +- Yulに高効率な拡張機能を施した低レベル言語 - コントラクトの[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups/)のために設計された -- Yul に新しい機能を追加した実験的なアップグレード案として捉えることができる +- Yulに新しい機能を追加した実験的なアップグレード案として捉えることができる ### 参照すべきリンク {#important-links-2} -- [Yul のドキュメント](https://docs.soliditylang.org/en/latest/yul.html) +- [Yulのドキュメント](https://docs.soliditylang.org/en/latest/yul.html) - [Yul+のドキュメント](https://github.com/fuellabs/yulp) - [Yul+ Playground](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 に記述されます。 +以下の簡単な例では、べき乗関数を実装しています。 `solc --strict-assembly --bin input.yul`を使用してコンパイルすることができます。 この例は、input.yulに記述されます。 ``` { @@ -251,26 +251,26 @@ 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} - イーサリアム仮想マシン(EVM)向けの静的型付け言語 -- Python と Rust の影響を受けている +- PythonとRustの影響を受けている - イーサリアムのエコシステムに不慣れなデベロッパーでも簡単に学習できる言語であることを目標としている -- Fe の開発は未だ初期段階にあり、2021 年 1 月にアルファ版がリリースされた +- Feの開発は未だ初期段階にあり、2021年1月にアルファ版がリリースされた ### 参照すべきリンク {#important-links-3} - [GitHub](https://github.com/ethereum/fe) -- [Fe に関するアナウンス](https://snakecharmers.ethereum.org/fe-a-new-language-for-the-ethereum-ecosystem/) -- [2021 年の Fe のロードマップ](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) -- [Fe の Discord チャット](https://discord.com/invite/ywpkAXFjZH) +- [Feに関するアナウンス](https://snakecharmers.ethereum.org/fe-a-new-language-for-the-ethereum-ecosystem/) +- [2021年のFeのロードマップ](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) +- [FeのDiscordチャット](https://discord.com/invite/ywpkAXFjZH) - [Twitter](https://twitter.com/official_fe) ### コントラクトのコード例 {#example-contract-3} -Fe で実装されたシンプルなコントラクトのコード例を以下に示します。 +Feで実装されたシンプルなコントラクトのコード例を以下に示します。 ``` type BookMsg = bytes[100] @@ -297,28 +297,28 @@ contract GuestBook: まだどの言語も試していない場合に考慮すべき事項をいくつか紹介します。 -### Solidity の長所 {#solidity-advantages} +### Solidityの長所 {#solidity-advantages} - 初心者向けに、多くのチュートリアルや学習ツールが用意されている。 詳細については、[コーディングで学ぶ](/developers/learning-tools/)セクションを参照 - 優れた開発ツールが利用可能 -- Solidity には大きなデベロッパーコミュニティがあり、質問に対する答えをすぐに見つけることができる +- Solidityには大きなデベロッパーコミュニティがあり、質問に対する答えをすぐに見つけることができる -### Vyper の長所 {#vyper-advatages} +### Vyperの長所 {#vyper-advatages} -- Python デベロッパーが、スマートコントラクトの記述を始めるのに最適な方法である -- Vyper の機能の数は絞られているため、アイデアから素早くプロトタイプを構築可能 -- Vyper は監査が容易で、最大限に人間が読めるようにすることを目指している +- Pythonデベロッパーが、スマートコントラクトの記述を始めるのに最適な方法である +- Vyperの機能の数は絞られているため、アイデアから素早くプロトタイプを構築可能 +- Vyperは監査が容易で、最大限に人間が読めるようにすることを目指している -### Yul と Yul+の長所 {#yul-advantages} +### YulとYul+の長所 {#yul-advantages} - シンプルで機能的な低レベル言語 -- 生の EVM に近づくことができ、コントラクトのガス使用量を最適化するのに役立つ +- 生のEVMに近づくことができ、コントラクトのガス使用量を最適化するのに役立つ ## 言語比較 {#language-comparisons} -コントラクトのライフサイクル、インターフェイス、演算子、データ構造、関数、制御フローなどの基本的な構文の比較については、 [Auditless によるチートシート](https://reference.auditless.com/cheatsheet/)を参照してください。 +コントラクトのライフサイクル、インターフェイス、演算子、データ構造、関数、制御フローなどの基本的な構文の比較については、 [Auditlessによるチートシート](https://reference.auditless.com/cheatsheet/)を参照してください。 ## 参考文献 {#further-reading} -- [OpenZeppelin による Solidity コントラクトライブラリ](https://docs.openzeppelin.com/contracts) +- [OpenZeppelinによるSolidityコントラクトライブラリ](https://docs.openzeppelin.com/contracts) - [Solidity by Example](https://solidity-by-example.org) diff --git a/public/content/translations/ja/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/ja/developers/docs/smart-contracts/libraries/index.md index 0f27ec7541f..f312ae0326c 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/libraries/index.md @@ -12,15 +12,15 @@ lang: ja ## ライブラリの中身 {#whats-in-a-library} -スマートコントラクトライブラリには、通常、2 種類のビルディングブロックがあります。コントラクトに追加できる再利用可能な振る舞いと、さまざまな標準の実装です。 +スマートコントラクトライブラリには、通常、2種類のビルディングブロックがあります。コントラクトに追加できる再利用可能な振る舞いと、さまざまな標準の実装です。 ### 振る舞い {#behaviors} -スマートコントラクトを記述していると、コントラクト内の保護された操作を行うために*管理者*アドレスを割り当てたり、予期せぬ問題が発生した場合に緊急用の*一時停止*ボタンを追加したりと、似たようなパターンを何度も書くことになる可能性があります。 +スマートコントラクトを記述していると、コントラクト内の保護された操作を行うために_管理者_アドレスを割り当てたり、予期せぬ問題が発生した場合に緊急用の_一時停止_ボタンを追加したりと、似たようなパターンを何度も書くことになる可能性があります。 -スマートコントラクトライブラリは通常、Solidity で[ライブラリ](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries)または[継承](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance)を介して、これらの振る舞いを再利用できる実装を提供します。 +スマートコントラクトライブラリは通常、Solidityで[ライブラリ](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries)または[継承](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance)を介して、これらの振る舞いを再利用できる実装を提供します。 -例として、[OpenZeppelin のコントラクトライブラリ](https://github.com/OpenZeppelin/openzeppelin-contracts)の[`Ownable contract`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol)を簡易にしたバージョンを以下に示します。これは、あるアドレスをコントラクトの所有者として指定し、その所有者のみにメソッドへのアクセスを制限する modifier を提供するコードです。 +例として、[OpenZeppelinのコントラクトライブラリ](https://github.com/OpenZeppelin/openzeppelin-contracts)の[`Ownable contract`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol)を簡易にしたバージョンを以下に示します。これは、あるアドレスをコントラクトの所有者として指定し、その所有者のみにメソッドへのアクセスを制限するmodifierを提供するコードです。 ```solidity contract Ownable { @@ -56,13 +56,13 @@ contract MyContract is Ownable { [構成可能性と相互運用性](/developers/docs/smart-contracts/composability/)を促進するために、イーサリアムコミュニティは**ERC**の形式でいくつかの標準を定義しました。 詳細については、 [標準](/developers/docs/standards/)セクションを参照してください。 -ERC をコントラクトの一部として組み込む場合、独自の ERC をロールアウトするよりも、標準の実装を探すことをお勧めします。 最も一般的な 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/)と[OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20)で見つかります。 さらに、ERC によっては ERC 自体の一部として標準実装を提供することもあります。 +ERCをコントラクトの一部として組み込む場合、独自のERCをロールアウトするよりも、標準の実装を探すことをお勧めします。 最も一般的な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/)と[OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20)で見つかります。 さらに、ERCによってはERC自体の一部として標準実装を提供することもあります。 -特筆すべきは、一部の ERC はスタンドアロンではなく、他の ERC に機能を追加するものであるということです。 例えば、 [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) はユーザビリティを向上させるために ERC20 に拡張機能を追加します。 +特筆すべきは、一部のERCはスタンドアロンではなく、他のERCに機能を追加するものであるということです。 例えば、 [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) はユーザビリティを向上させるためにERC20に拡張機能を追加します。 ## ライブラリの追加方法 {#how-to} -プロジェクトにライブラリを含める具体的な手順については、必ずそのライブラリのドキュメントを参照してください。 複数の Solidity コントラクトライブラリは`npm`を使用してパッケージ化されていますので、`npm install`を実行するだけで済みます。 コントラクトを[コンパイル](/developers/docs/smart-contracts/compiling/)するためのほとんどのツールは、`node_modules`でスマートコントラクトライブラリを調べます。そのため、以下のように指定できます。 +プロジェクトにライブラリを含める具体的な手順については、必ずそのライブラリのドキュメントを参照してください。 複数のSolidityコントラクトライブラリは`npm`を使用してパッケージ化されていますので、`npm install`を実行するだけで済みます。 コントラクトを[コンパイル](/developers/docs/smart-contracts/compiling/)するためのほとんどのツールは、`node_modules`でスマートコントラクトライブラリを調べます。そのため、以下のように指定できます。 ```solidity // This will load the @openzeppelin/contracts library from your node_modules @@ -73,7 +73,7 @@ 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} @@ -98,15 +98,20 @@ contract MyNFT is ERC721 { - [ドキュメント](https://dappsys.readthedocs.io/) - [GitHub](https://github.com/dapphub/dappsys) -**HQ20 - \*\***_実世界向けの完全な機能を備えた分散アプリケーションの構築を支援する、コントラクト、ライブラリ、サンプルを含む Solidity プロジェクト。_\*\* +**HQ20 - ****_実世界向けの完全な機能を備えた分散アプリケーションの構築を支援する、コントラクト、ライブラリ、サンプルを含むSolidityプロジェクト。_** - [GitHub](https://github.com/HQ20/contracts) +**サードウェブ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 標準のチュートリアル_ +- [イーサリアムデベロッパーのためのセキュリティに関する考慮事項](/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/ja/developers/docs/smart-contracts/security/index.md b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md index 92e02f7eb45..d63aeb554d2 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/security/index.md @@ -6,9 +6,9 @@ lang: ja スマートコントラクトは、非常に柔軟性が高く、大量の値やデータを制御できる能力があり、ブロックチェーン上のコードに基づきイミュータブルな(不変の)ロジックを実行します。 これにより、トラストレスな分散型アプリケーション(Dapp)による活気に満ちたエコシステムが構築され、レガシーシステムと比べて多くの利点をもたらしています。 しかし、これはスマートコントラクトの脆弱性を悪用して利益を得ようとしている攻撃者に機会を与えてしまうことにもなります。 -イーサリアムのようなパブリックブロックチェーンは、スマートコントラクトのセキュリティ確保の問題をさらに複雑にします。 デプロイされたコントラクトのコードは*通常*、セキュリティ上の欠陥にパッチを当てるために変更することはできません。一方、スマートコントラクトから盗まれた資産は追跡が非常に難しく、その不変性により、大抵回収できません。 +イーサリアムのようなパブリックブロックチェーンは、スマートコントラクトのセキュリティ確保の問題をさらに複雑にします。 デプロイされたコントラクトのコードは_通常_、セキュリティ上の欠陥にパッチを当てるために変更することはできません。一方、スマートコントラクトから盗まれた資産は追跡が非常に難しく、その不変性により、大抵回収できません。 -数値は一様ではありませんが、スマートコントラクトのセキュリティ上の欠陥が原因で盗まれたり失われたりした価値の総額は、10 億ドルを超えると推定されています。 これには、[The DAO ハック](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(現行価格 10 億ドル相当以上の 360 万 ETH の盗難)、[パリティ(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 億ドル以上の ETH を永遠にロック)などの有名な事件も含まれています。 +数値は一様ではありませんが、スマートコントラクトのセキュリティ上の欠陥が原因で盗まれたり失われたりした価値の総額は、10億ドルを超えると推定されています。 これには、[The DAOハック](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(現行価格10億ドル相当以上の360万ETHの盗難)、[パリティ(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億ドル以上のETHを永遠にロック)などの有名な事件も含まれています。 前述の問題は、デベロッパーに安全で堅牢な回復力のあるスマートコントラクトの構築に労力を費やすことを不可欠にしました。 スマートコントラクトのセキュリティは深刻な課題であり、全てのデベロッパーが学ぶべきことです。 このガイドでは、イーサリアムデベロッパーのためのセキュリティの考慮事項について説明します。さらに、スマートコントラクトのセキュリティ向上に役立つリソースもご紹介します。 @@ -20,13 +20,13 @@ lang: ja ### 1. 適切なアクセス制御設計 {#design-proper-access-controls} -スマートコントラクトでは、`public`または`external`が記述されている関数は、どの外部所有アカウント (EOA) もしくはコントラクトアカウントからでも呼び出すことができます。 他のコントラクトが自分のコントラクトとやり取りできるようにするには、関数に public の可視性を指定する必要があります。 一方で`private`と記述されている関数は、外部アカウントで呼び出すことはできず、スマートコントラクト内の関数でしか呼び出すことはできません。 全てのネットワーク参加者にコントラクト関数へのアクセスを許可してしまうと、特に、細心の注意が求められる操作(例: 新しいトークンのミントなど)を誰でも実行できる場合に、さまざまな問題を引き起こす可能性があります。 +スマートコントラクトでは、`public`または`external`が記述されている関数は、どの外部所有アカウント (EOA) もしくはコントラクトアカウントからでも呼び出すことができます。 他のコントラクトが自分のコントラクトとやり取りできるようにするには、関数にpublicの可視性を指定する必要があります。 一方で`private`と記述されている関数は、外部アカウントで呼び出すことはできず、スマートコントラクト内の関数でしか呼び出すことはできません。 全てのネットワーク参加者にコントラクト関数へのアクセスを許可してしまうと、特に、細心の注意が求められる操作(例: 新しいトークンのミントなど)を誰でも実行できる場合に、さまざまな問題を引き起こす可能性があります。 -スマートコントラクト関数の無許可での使用を防ぐために、安全なアクセス制御の実装が必要です。 アクセス制御メカニズムは、スマートコントラクトの特定の関数を、コントラクトを管理する責任を負うアカウントなどの承認されたエンティティだけが使用できるように制限します。 **Ownable パターン**と**ロールベースアクセス制御**は、スマートコントラクトでアクセス制御を実装する際に有用なパターンです +スマートコントラクト関数の無許可での使用を防ぐために、安全なアクセス制御の実装が必要です。 アクセス制御メカニズムは、スマートコントラクトの特定の関数を、コントラクトを管理する責任を負うアカウントなどの承認されたエンティティだけが使用できるように制限します。 **Ownableパターン**と**ロールベースアクセス制御**は、スマートコントラクトでアクセス制御を実装する際に有用なパターンです -#### Ownable パターン {#ownable-pattern} +#### Ownableパターン {#ownable-pattern} -Ownable パターンでは、コントラクト作成プロセスでアドレスがコントラクトの「オーナー(所有者)」として設定されます。 保護される関数には、`OnlyOwner`修飾子が指定されます。これにより、関数を実行する前にコントラクトが呼び出し元のアドレスのアイデンティティを認証するようになります。 保護された関数に対するコントラクトの所有者以外のアドレスからの呼び出しは、常に取り消されます。これにより、不正なアクセスが防止されます。 +Ownableパターンでは、コントラクト作成プロセスでアドレスがコントラクトの「オーナー(所有者)」として設定されます。 保護される関数には、`OnlyOwner`修飾子が指定されます。これにより、関数を実行する前にコントラクトが呼び出し元のアドレスのアイデンティティを認証するようになります。 保護された関数に対するコントラクトの所有者以外のアドレスからの呼び出しは、常に取り消されます。これにより、不正なアクセスが防止されます。 #### ロールベースアクセス制御 {#role-based-access-control} @@ -36,19 +36,19 @@ Ownable パターンでは、コントラクト作成プロセスでアドレス ##### マルチシグウォレットの使用 -安全なアクセス制御を実装するもう一つのアプローチとして、[マルチシグ(複数署名)アカウント](/developers/docs/smart-contracts/#multisig)でコントラクトを管理することもできます。 通常の EOA と異なり、マルチシグアカウントは複数のエンティティに所有されます。また、トランザクションの実行には最低数のアカウントの署名 (例: 5 つのうち 3 つの署名など) が必要です。 +安全なアクセス制御を実装するもう一つのアプローチとして、[マルチシグ(複数署名)アカウント](/developers/docs/smart-contracts/#multisig)でコントラクトを管理することもできます。 通常のEOAと異なり、マルチシグアカウントは複数のエンティティに所有されます。また、トランザクションの実行には最低数のアカウントの署名 (例: 5つのうち3つの署名など) が必要です。 -アクセス制御でマルチシグ (複数署名) を使用すると、追加のセキュリティレイヤーを導入できます。なぜなら、目的のコントラクトを動作させるには複数の当事者からの同意が必要になるためです。 これは Ownable パターンを使う必要がある場合に特に有用です。これにより、攻撃者や不正な内部関係者が、細心の注意が求められるコントラクト関数を悪意のある目的で操作することをより困難にするためです。 +アクセス制御でマルチシグ (複数署名) を使用すると、追加のセキュリティレイヤーを導入できます。なぜなら、目的のコントラクトを動作させるには複数の当事者からの同意が必要になるためです。 これはOwnableパターンを使う必要がある場合に特に有用です。これにより、攻撃者や不正な内部関係者が、細心の注意が求められるコントラクト関数を悪意のある目的で操作することをより困難にするためです。 -### 2. コントラクト操作の保護に require()、assert()、revert() ステートメントを使用 {#use-require-assert-revert} +### 2. コントラクト操作の保護にrequire()、assert()、revert() ステートメントを使用 {#use-require-assert-revert} -前述のように、スマートコントラクトをいったんブロックチェーンにデプロイすると、誰でもその中の public 関数を呼び出すことができます。 外部アカウントがどのようにコントラクトとやり取りするかを事前に知ることはできないため、デプロイする前に、問題のある操作に対して内部的な防御策を講じることが理想的です。 実行する際、特定の要件を満たさない場合は、`require()`、`assert()`、および`revert()`ステートメントを使用して例外をトリガーし、状態変更を元に戻すことにより、スマートコントラクトで正しい動作を強制できます。 +前述のように、スマートコントラクトをいったんブロックチェーンにデプロイすると、誰でもその中のpublic関数を呼び出すことができます。 外部アカウントがどのようにコントラクトとやり取りするかを事前に知ることはできないため、デプロイする前に、問題のある操作に対して内部的な防御策を講じることが理想的です。 実行する際、特定の要件を満たさない場合は、`require()`、`assert()`、および`revert()`ステートメントを使用して例外をトリガーし、状態変更を元に戻すことにより、スマートコントラクトで正しい動作を強制できます。 **`require()`**: `require`は、関数の開始時に定義され、呼び出された関数が実行される前に、事前に定義された条件を確実に満たすようにします。 `require`ステートメントは、ユーザーの入力の検証、状態変数のチェック、または関数を実行する前に呼び出し元のアカウントのアイデンティティを認証するために使用することができます。 **`assert()`**: `assert()`は、内部エラーの検出や、コード内の「不変条件」の違反をチェックするために使用されます。 不変条件とは、コントラクトの状態に関する論理アサーションであり、すべての関数の実行に対して真 (true) となるべきものです。 不変条件の例としては、トークンコントラクトの最大供給量や残高があげられます。 `assert()` を使用することで、コントラクトが脆弱な状態にならないようにします。もしそうなった場合は、状態変数へのすべての変更がロールバックされます。 -**`revert()`**: `revert()` if-else 文の中で使用することができ、必要な条件を満たさない場合に例外を発生させます。 以下のサンプルコントラクトでは、`revert()`によって関数の実行を保護しています。 +**`revert()`**: `revert()` if-else文の中で使用することができ、必要な条件を満たさない場合に例外を発生させます。 以下のサンプルコントラクトでは、`revert()`によって関数の実行を保護しています。 ``` pragma solidity ^0.8.4; @@ -96,7 +96,7 @@ contract VendingMachine { バグ報奨金プログラムを設けることは、外部コードレビューを実施するためのもう一つのアプローチです。 バク報奨金とは、アプリケーション内の脆弱性を発見した個人 (通常はホワイトハットハッカー) に与えられる金銭的な報酬です。 -バグ報奨金プログラムが適切に機能すれば、ハッカーコミュニティのメンバーは重大な欠陥がないかコードを検査することでインセンティブを得ることができます。 実例としては「無限貨幣バグ」があります。これにより、イーサリアム上で動作している[オプティミズム](https://www.optimism.io/)という[レイヤー 2 プロトコル](/layer-2/)で、攻撃者が無限にイーサ (Ether) を発行できてしまうというものでした。 幸運なことに、ホワイトハットハッカーは[その欠陥](https://www.saurik.com/optimism.html)を発見しチームに通知したため、[その過程で多額の報酬を得ました](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/)。 +バグ報奨金プログラムが適切に機能すれば、ハッカーコミュニティのメンバーは重大な欠陥がないかコードを検査することでインセンティブを得ることができます。 実例としては、「無限貨幣バグ」があります。このバグにより、イーサリアム上で動作している[オプティミズム](https://www.optimism.io/)という[レイヤー2プロトコル](/layer-2/)で、攻撃者が無限にイーサ(Ether)を発行できてしまうというものでした。 幸運なことに、ホワイトハットハッカーは[その欠陥](https://www.saurik.com/optimism.html)を発見しチームに通知したため、[その過程で多額の報酬を得ました](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/)。 バグ報奨金プログラムの報酬額を、危機にさらされている資金の額に比例して設定すると、有効な戦略となります。 「[バグ報奨金スケール](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)」と呼ばれるこのアプローチは、脆弱性を悪用するのではなく、責任をもって開示するように、個人に金銭的なインセンティブを与えるものです。 @@ -104,17 +104,17 @@ contract VendingMachine { 監査やバグ報奨金の制度があるからといって、高品質なコードを書くという責任がなくなるわけではありません。 優れたスマートコントラクトセキュリティは、次の適切な設計と開発プロセスに従うことから始まります。 -- Git などのバージョン管理システムにすべてのコードを保存する +- Gitなどのバージョン管理システムにすべてのコードを保存する - すべてのコードの修正はプルリクエストで行う -- プルリクエストでは、少なくとも 1 人の第三者レビュアーを確保する。プロジェクトを 1 人で進めている場合は、他のデベロッパーを見つけて互いのコードをレビューすることを検討する +- プルリクエストでは、少なくとも1人の第三者レビュアーを確保する。プロジェクトを1人で進めている場合は、他のデベロッパーを見つけて互いのコードをレビューすることを検討する - スマートコントラクトのテスト、コンパイル、デプロイに[開発環境](/developers/docs/frameworks/)を使用する -- Mythril や Slither など、基本的なコード解析ツールを使用してコードを実行する。 これは、各プルリクエストがマージされる前に実行し、出力の違いを比較しておくのが理想的である +- MythrilやSlitherなど、基本的なコード解析ツールを使用してコードを実行する。 これは、各プルリクエストがマージされる前に実行し、出力の違いを比較しておくのが理想的である -- コードがエラーなくコンパイルされ、Solidity コンパイラが警告を発していないことを確認する +- コードがエラーなくコンパイルされ、Solidityコンパイラが警告を発していないことを確認する - [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html)を使用してコードを適切に文書化し、コントラクトのアーキテクチャの詳細を理解しやすい言葉で記述する。 これにより、第三者によるコードの監査やレビューが容易になる @@ -126,7 +126,7 @@ contract VendingMachine { イーサリアムスマートコントラクトは、デフォルトではイミュータブル (不変) ですが、アップグレードパターンを用いることで可変性をある程度獲得することが可能です。 コントラクトのアップグレードは、重大な欠陥によって古いコントラクトが使用できなくなり、新しいロジックをデプロイすることが最も現実的な選択肢となる場合に必要になります。 -コントラクトのアップグレードのメカニズムは様々ですが、「プロキシパターン」はスマートコントラクトのアップグレードでより一般的なアプローチの一つです。 プロキシパターンは、アプリケーションを「状態」と「ロジック」の*2 つの*コントラクトに分割します。 最初のコントラクト (「プロキシコントラクト」と呼ばれる) は、状態変数 (例: ユーザーの残高など) を格納します。一方、2 つ目のコントラクトは (「ロジックコントラクト」と呼ばれる) は、コントラクトの関数を実行するためのコードを保持します。 +コントラクトのアップグレードのメカニズムは様々ですが、「プロキシパターン」はスマートコントラクトのアップグレードでより一般的なアプローチの一つです。 プロキシパターンは、アプリケーションを「状態」と「ロジック」の_2つの_コントラクトに分割します。 最初のコントラクト (「プロキシコントラクト」と呼ばれる) は、状態変数 (例: ユーザーの残高など) を格納します。一方、2つ目のコントラクトは (「ロジックコントラクト」と呼ばれる) は、コントラクトの関数を実行するためのコードを保持します。 アカウントは、プロキシコントラクトとやり取りを行います。プロキシコントラクトは、すべての関数の呼び出しを低レベル呼び出しである[`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`に設定する緊急停止関数へのアクセス権を持つエンティティ。 悪意のある行為を防ぐために、この関数への呼び出しを信頼できるアドレス (例: コントラクトの所有者など) に制限できます。 -コントラクトが緊急停止を作動させると、特定の関数は呼び出せなくなります。 これは、グローバル変数を参照する modifier を使って、選択対象の関数をラップすることで実現されます。 下記は、コントラクトへのこのパターンの実装を記述した[例](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol)です。 +コントラクトが緊急停止を作動させると、特定の関数は呼び出せなくなります。 これは、グローバル変数を参照するmodifierを使って、選択対象の関数をラップすることで実現されます。 下記は、コントラクトへのこのパターンの実装を記述した[例](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol)です。 ```solidity // このコードは、専門的な監査を受けておらず、安全性や正確性を約束するものではありません。 自己責任で利用してくだささい。 @@ -212,15 +212,15 @@ contract EmergencyStop { 分散型ガバナンスは、特にデベロッパーとエンドユーザーの利害が一致することもあり、有益なものになり得ます。 それでもなお、スマートコントラクトのガバナンスメカニズムは、誤って実装された場合に新しいリスクをもたらすことがあります。 起こり得るシナリオは、攻撃者が[フラッシュローン](/defi/#flash-loans)を利用して膨大な投票力(保有トークン数で測定)を獲得し、悪意のある提案を押し通すというものです。 -オンチェーンガバナンスに関連する問題を防ぐ方法の一つとして、[タイムロックの使用](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/)が挙げられます。 タイムロックは、特定の時間が経過するまでスマートコントラクトが特定のアクションを実行できないようにするものです。 その他の戦略としては、各トークンがロックされている期間に応じて「投票の重み」を割り当てることや、現在のブロックの代わりに過去の期間 (例: 2 ~ 3 ブロック前) でアドレスの投票力を測定することなどがあります。 どちらの方法も、オンチェーンの投票を思い通りに動かす投票力を短期間で獲得する可能性を減らすことができます。 +オンチェーンガバナンスに関連する問題を防ぐ方法の一つとして、[タイムロックの使用](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/)と[DAO におけるさまざまな投票メカニズム](https://hackernoon.com/governance-is-the-holy-grail-for-daos)をご覧ください。 +詳細は、[安全なガバナンスシステムの設計](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/)と[DAOにおけるさまざまな投票メカニズム](https://hackernoon.com/governance-is-the-holy-grail-for-daos)をご覧ください。 ### 8. コードの複雑さの最小化 {#reduce-code-complexity} -従来のソフトウェアデベロッパーは、ソフトウェア設計に不必要な複雑さを持ち込まないようにするという KISS (Keep It Simple, Stupid) 原則に慣れ親しんでいます。 これは、「複雑なシステムには複雑な障害が発生する」、さらに複雑さによりコストのかかるエラーが発生しやすいという長年の考え方に従ったものです。 +従来のソフトウェアデベロッパーは、ソフトウェア設計に不必要な複雑さを持ち込まないようにするというKISS (Keep It Simple, Stupid) 原則に慣れ親しんでいます。 これは、「複雑なシステムには複雑な障害が発生する」、さらに複雑さによりコストのかかるエラーが発生しやすいという長年の考え方に従ったものです。 -スマートコントラクトが高額の価値を制御する可能性があることを考えると、シンプルさを保ってスマートコントラクトを記述することが特に重要になります。 スマートコントラクトをシンプルに記述するコツは、可能な限り[OpenZeppelin コントラクト](https://docs.openzeppelin.com/contracts/4.x/)のような既存のライブラリを再利用することです。 これらのライブラリは、デベロッパーによって広範な監査とテストが行われているため、新しい機能をゼロから書くことでバグを発生させる可能性を減らすことができます。 +スマートコントラクトが高額の価値を制御する可能性があることを考えると、シンプルさを保ってスマートコントラクトを記述することが特に重要になります。 スマートコントラクトをシンプルに記述するコツは、可能な限り[OpenZeppelinコントラクト](https://docs.openzeppelin.com/contracts/4.x/)のような既存のライブラリを再利用することです。 これらのライブラリは、デベロッパーによって広範な監査とテストが行われているため、新しい機能をゼロから書くことでバグを発生させる可能性を減らすことができます。 別の一般的なアドバイスとしては、小さな関数を記述すること、さらにビジネスロジックを複数のコントラクトに分割してコントラクトをモジュラー型にすることがあります。 よりシンプルなコードを書くことで、スマートコントラクトへの攻撃面を減らすだけでなく、システム全体の正確性を推論しやすくなり、設計エラーの可能性を早期に検出できるようになります。 @@ -228,7 +228,7 @@ contract EmergencyStop { #### 再入可能 (リエントランシー) {#reentrancy} -EVM は同時実行を許可していません。つまり、メッセージ呼び出しに関わる 2 つのコントラクトは同時に実行できません。 外部呼び出しは、呼び出しが戻るまで呼び出し元のコントラクトの実行とメモリを一時停止させます。その時点で外部呼び出しの実行が正常に進みます。 このプロセスは、別のコントラクトへの[制御フロー](https://www.computerhope.com/jargon/c/contflow.htm)の移動として形式的に記述することが可能です。 +EVMは同時実行を許可していません。つまり、メッセージ呼び出しに関わる2つのコントラクトは同時に実行できません。 外部呼び出しは、呼び出しが戻るまで呼び出し元のコントラクトの実行とメモリを一時停止させます。その時点で外部呼び出しの実行が正常に進みます。 このプロセスは、別のコントラクトへの[制御フロー](https://www.computerhope.com/jargon/c/contflow.htm)の移動として形式的に記述することが可能です。 ほとんど場合問題は発生しませんが、信頼できないコントラクトに制御フローを移した場合には、再入可能(リエントランシー)などの問題を引き起こす可能性があります。 元の関数の呼び出しが完了する前に、悪意のあるコントラクトが再び脆弱なコントラクトを呼び出す場合に、再入可能(リエントランシー)攻撃が発生します。 例とともに、このタイプの攻撃を詳しく説明します。 @@ -253,15 +253,15 @@ contract Victim { } ``` -このコントラクトは、ユーザーが以前コントラクトに入金した ETH を引き出せるように、`withdraw()`関数を公開しています。 引き出しを処理する際、コントラクトは次の操作を行います。 +このコントラクトは、ユーザーが以前コントラクトに入金したETHを引き出せるように、`withdraw()`関数を公開しています。 引き出しを処理する際、コントラクトは次の操作を行います。 -1. ユーザーの ETH 残高を確認します。 +1. ユーザーのETH残高を確認します。 2. 呼び出し元のアドレスへ資金を送金します。 -3. 残高を 0 にリセットし、ユーザーからの追加の引き出しを防止します。 +3. 残高を0にリセットし、ユーザーからの追加の引き出しを防止します。 -`Victim`コントラクトの`withdraw()`関数は、「checks-interactions-effects」パターンに従っています。 実行に必要な条件 (つまり、ユーザーの ETH 残高がプラスになっているか) が満たされているかどうかを*確認 (checks) *し、呼び出し元のアドレスに ETH を送金するという*相互作用 (interactions) *を行った後、トランザクションの*結果 (effects) * (つまり、ユーザーの残高を減らす) を適用しているのです。 +`Victim`コントラクトの`withdraw()`関数は、「checks-interactions-effects」パターンに従っています。 実行に必要な条件 (つまり、ユーザーのETH残高がプラスになっているか) が満たされているかどうかを_確認 (checks) _し、呼び出し元のアドレスにETHを送金するという_相互作用 (interactions) _を行った後、トランザクションの_結果 (effects) _ (つまり、ユーザーの残高を減らす) を適用しているのです。 -`withdraw()`が外部所有口座 (EOA) から呼び出された場合、この関数は期待どおりに実行されます。つまり、`msg.sender.call.value()`は呼び出し元に ETH を送金します。 しかし、`msg.sender`が`withdraw()`を呼び出すスマートコントラクトアカウントの場合、`msg.sender.call.value()`を使用して資金を送金すると、そのアドレスに保存されているコードの実行もトリガーすることになります。 +`withdraw()`が外部所有口座 (EOA) から呼び出された場合、この関数は期待どおりに実行されます。つまり、`msg.sender.call.value()`は呼び出し元にETHを送金します。 しかし、`msg.sender`が`withdraw()`を呼び出すスマートコントラクトアカウントの場合、`msg.sender.call.value()`を使用して資金を送金すると、そのアドレスに保存されているコードの実行もトリガーすることになります。 以下がそのコントラクトアドレスにデプロイされているコードだと想像してみてください。 @@ -280,13 +280,13 @@ contract Victim { } ``` -このコントラクトは以下の 3 つのことを行うように設計されています。 +このコントラクトは以下の3つのことを行うように設計されています。 -1. 別のアカウント (攻撃者の EOA の可能性あり) からの入金を受け入れます。 -2. Victim コントラクトへ 1 ETH を入金します。 -3. スマートコントラクトに格納された 1 ETH を引き出します。 +1. 別のアカウント (攻撃者のEOAの可能性あり) からの入金を受け入れます。 +2. Victimコントラクトへ1 ETHを入金します。 +3. スマートコントラクトに格納された1 ETHを引き出します。 -`Attacker`には、入力となる`msg.sender.call.value`からの残りのガスが 4 万以上なら`Victim`内の`withdraw()`を再度呼び出すもう一つの関数があることを除き問題はありません。 これにより、`Attacker`は`Victim`に再入可能になり、最初の`withdraw`の呼び出しが完了する前に、多くの資金を引き出すことができます。 次のようなサイクルになります。 +`Attacker`には、入力となる`msg.sender.call.value`からの残りのガスが4万以上なら`Victim`内の`withdraw()`を再度呼び出すもう一つの関数があることを除き問題はありません。 これにより、`Attacker`は`Victim`に再入可能になり、最初の`withdraw`の呼び出しが完了する前に、多くの資金を引き出すことができます。 次のようなサイクルになります。 ```solidity - 攻撃者のEOAが、1 ETHで「Attacker.beginAttack()」関数を呼び出します。 @@ -301,13 +301,13 @@ contract Victim { - 「Victim」は、最終的に最初のトランザクション(および後続のトランザクション)の結果をステート(状態)に適用するので、「Attacker」の残高は0に設定されます。 ``` -要約すると、関数の実行が完了するまで呼び出し元の残高が 0 にならないため、その後の呼び出しが成功し、呼び出し元が何度も残高を引き出せるようになります。 この種の攻撃は、[2016 年の DAO ハック](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/)で行われたように、スマートコントラクトから資金を流出させるために使用されます。 [再入可能(リエントランシー)エクスプロイトの公開リスト](https://github.com/pcaversaccio/reentrancy-attacks)が示すように、再入可能攻撃は今日でもスマートコントラクトにとって深刻な問題になっています。 +要約すると、関数の実行が完了するまで呼び出し元の残高が0にならないため、その後の呼び出しが成功し、呼び出し元が何度も残高を引き出せるようになります。 この種の攻撃は、[2016年のDAOハック](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/)で行われたように、スマートコントラクトから資金を流出させるために使用されます。 [再入可能(リエントランシー)エクスプロイトの公開リスト](https://github.com/pcaversaccio/reentrancy-attacks)が示すように、再入可能攻撃は今日でもスマートコントラクトにとって深刻な問題になっています。 ##### 再入可能 (リエントランシー) 攻撃を防ぐ方法 -再入可能に対処するアプローチとして、[checks-effects-interactions パターン](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern)に従うことが挙げられます。 このパターンは、次のように関数の実行を順序付けるものです。最初に、実行を進める前に必要な確認を行うコードが来ます。次に、コントラクトの状態を操作するコードが来ます。最後に、他のコントラクトや EOA とやり取りをするコードが来ます。 +再入可能に対処するアプローチとして、[checks-effects-interactionsパターン](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern)に従うことが挙げられます。 このパターンは、次のように関数の実行を順序付けるものです。最初に、実行を進める前に必要な確認を行うコードが来ます。次に、コントラクトの状態を操作するコードが来ます。最後に、他のコントラクトやEOAとやり取りをするコードが来ます。 -checks-effect-interaction パターンは、以下に示している`Victim`コントラクトの改訂版で使用しています。 +checks-effect-interactionパターンは、以下に示している`Victim`コントラクトの改訂版で使用しています。 ```solidity contract NoLongerAVictim { @@ -320,7 +320,7 @@ contract NoLongerAVictim { } ``` -このコントラクトは、ユーザーの残高を*確認 (check)* し、`withdraw()`関数の*結果 (effects) *を (ユーザーの残高を 0 にすることで) 適用し、_相互作用 (interaction) _ (ユーザーのアドレスに ETH を送金) の実行へと進みます。 これにより、外部呼び出しの前に、コントラクトがストレージを確実にアップデートするようになり、最初の攻撃を可能にする再入可能の条件が排除されます。 `Attacker`コントラクトは依然として、`NoLongerAVictim`を再び呼び出すことができますが、`balances[msg.sender]`が 0 にセットされているので、さらなる引き出しをしてもエラーがスローされます。 +このコントラクトは、ユーザーの残高を_確認 (check)_ し、`withdraw()`関数の_結果 (effects) _を (ユーザーの残高を0にすることで) 適用し、_相互作用 (interaction) _ (ユーザーのアドレスにETHを送金) の実行へと進みます。 これにより、外部呼び出しの前に、コントラクトがストレージを確実にアップデートするようになり、最初の攻撃を可能にする再入可能の条件が排除されます。 `Attacker`コントラクトは依然として、`NoLongerAVictim`を再び呼び出すことができますが、`balances[msg.sender]`が0にセットされているので、さらなる引き出しをしてもエラーがスローされます。 もう一つのオプションは、関数の呼び出しが完了するまで、コントラクトの状態の一部をロックする相互排他ロック (一般的に「ミューテックス」と呼ばれる) を使用することです。 これは、ブール型変数を使って実装されます。関数が実行される前に`true`に設定し、呼び出しが完了した後に`false`に戻します。 以下の例で見られるように、元の呼び出しがまだ処理中であっても、ミューテックスを使うことで再帰的な呼び出しから関数を守ることができます。これにより、効果的に再入可能を防ぐことができます。 @@ -351,11 +351,11 @@ contract MutexPattern { } ``` -また、アカウントに資金を送る「プッシュ型決済」システムではなく、ユーザーがスマートコントラクトから資金を引き出す必要がある[「プル型決済」](https://docs.openzeppelin.com/contracts/4.x/api/security#PullPayment)システムを利用することでも防止可能です。 これにより、不明なアドレスで不注意にコードをトリガーする可能性を取り除けます (特定の DoS 攻撃も防げます) 。 +また、アカウントに資金を送る「プッシュ型決済」システムではなく、ユーザーがスマートコントラクトから資金を引き出す必要がある[「プル型決済」](https://docs.openzeppelin.com/contracts/4.x/api/security#PullPayment)システムを利用することでも防止可能です。 これにより、不明なアドレスで不注意にコードをトリガーする可能性を取り除けます (特定のDoS攻撃も防げます) 。 #### 整数のアンダーフローとオーバーフロー {#integer-underflows-and-overflows} -算術演算の結果が許容値の範囲外になると、整数のオーバーフローが発生します。これにより、表現可能な最小値に「ロールオーバー」します。 例えば、`uint8`は、2^8-1=255 までの値だけを格納できます。 `255`を超える値の算術演算の結果はオーバーフローし、`uint`を`0`にリセットします。これは、車のオドメーターが最大走行距離 (999999) に達すると 0 にリセットされるのと同じです。 +算術演算の結果が許容値の範囲外になると、整数のオーバーフローが発生します。これにより、表現可能な最小値に「ロールオーバー」します。 例えば、`uint8`は、2^8-1=255までの値だけを格納できます。 `255`を超える値の算術演算の結果はオーバーフローし、`uint`を`0`にリセットします。これは、車のオドメーターが最大走行距離 (999999) に達すると0にリセットされるのと同じです。 整数のアンダーフローも同様の理由で発生します。それは算術演算の結果が許容値の範囲を下回った場合です。 例えば、`uint8`で`0`をデクリメントしようと試みると、結果は単純に表現可能な最大値 (`255`) にロールオーバーします。 @@ -414,7 +414,7 @@ contract Attack { function attack() public payable { timeLock.deposit{value: msg.value}(); /* - 「t = 現在のロック時間」ならば、xを以下のようにして求める必要があります。 + 「t = 現在のロック時間」ならば、xを以下のようにして求める必要があります。 x + t = 2**256 = 0 so x = -t 2**256 = type(uint).max + 1 @@ -430,25 +430,25 @@ contract Attack { ##### 整数のアンダーフローとオーバーフローを防ぐ方法 -バージョン 0.8.0 以降の Solidity コンパイラは、整数のアンダーフローとオーバーフローを引き起こすコードを拒否します。 しかし、それよりも低いバージョンのコンパイラでコンパイルされたコントラクトでは、算術演算を実行する関数でチェックを行うか、アンダーフローとオーバーフローをチェックするライブラリ (例: [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) を使用する必要があります。 +バージョン0.8.0以降のSolidityコンパイラは、整数のアンダーフローとオーバーフローを引き起こすコードを拒否します。 しかし、それよりも低いバージョンのコンパイラでコンパイルされたコントラクトでは、算術演算を実行する関数でチェックを行うか、アンダーフローとオーバーフローをチェックするライブラリ (例: [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) を使用する必要があります。 -#### オラクル (Oracle) の改ざん {#oracle-manipulation} +#### オラクル(Oracle)の改ざん {#oracle-manipulation} -[オラクル (Oracles) ](/developers/docs/oracles/)は、オフチェーン情報を取得し、スマートコントラクトが使用できるようにオンチェーンに送信します。 オラクルを使用すると、資本市場などのオフチェーンシステムと相互運用するスマートコントラクトを設計して、アプリケーションを大幅に拡張できます。 +[オラクル(Oracles)](/developers/docs/oracles/)は、オフチェーン情報を取得し、スマートコントラクトが使用できるようにオンチェーンに送信します。 オラクルを使用すると、資本市場などのオフチェーンシステムと相互運用するスマートコントラクトを設計して、アプリケーションを大幅に拡張できます。 しかし、オラクルに間違いが含まれており、誤った情報をオンチェーンに送信した場合、スマートコントラクトが誤った入力に基づいて実行され、問題が発生する可能性があります。 これが「オラクルの問題」の根拠であり、ブロックチェーンのオラクルからの情報を確実に正確かつ最新で、タイムリーなものにするということが重要になってきます。 -関連するセキュリティ上の懸念は、分散型取引所(DEX)などのオンチェーンのオラクルを使用して、資産の現在価格を取得することです。 [分散型金融 (DeFi)](/defi/) 業界のレンディング (貸付) プラットフォームは、多くの場合、これを行ってユーザーの担保の価値を判断し、そのユーザーが借りられる金額を決定します。 +関連するセキュリティ上の懸念は、分散型取引所(DEX)などのオンチェーンのオラクルを使用して、資産の現在価格を取得することです。 [分散型金融(DeFi)](/defi/)業界のレンディング(貸付)プラットフォームは、多くの場合、これを行ってユーザーの担保の価値を判断し、そのユーザーが借りられる金額を決定します。 -DEX の価格は正確であることが多く、これは市場の均衡を取り戻す裁定者によるものです。 しかし、特にオンチェーンオラクルが過去の取引パターンに基づいて資産価格を計算する場合 (通常の計算方法) 、改ざんされる可能性があります。 +DEXの価格は正確であることが多く、これは市場の均衡を取り戻す裁定者によるものです。 しかし、特にオンチェーンオラクルが過去の取引パターンに基づいて資産価格を計算する場合(通常の計算方法)、改ざんされる可能性があります。 -例えば、攻撃者は、レンディングコントラクトとやり取りする直前に、フラッシュローンを利用して、資産の現在価格を人為的に吊り上げることができます。 DEX に資産価格を問い合わせると、通常よりも高い価値が返ってくる (攻撃者の大量の「買い注文」が資産の需要を歪めているため) ため、本来よりも多くの借入ができます。 このような「フラッシュローン攻撃」は、DeFi アプリケーション間の価格オラクルへの依存を悪用し、プロトコルに数百万ドルの損失を与えたと言われています。 +例えば、攻撃者は、レンディングコントラクトとやり取りする直前に、フラッシュローンを利用して、資産の現在価格を人為的に吊り上げることができます。 DEXに資産価格を問い合わせると、通常よりも高い価値が返ってくる (攻撃者の大量の「買い注文」が資産の需要を歪めているため) ため、本来よりも多くの借入ができます。 このような「フラッシュローン攻撃」は、DeFiアプリケーション間の価格オラクルへの依存を悪用し、プロトコルに数百万ドルの損失を与えたと言われています。 ##### オラクルの改ざんを防ぐ方法 オラクルの改ざんを回避するための最小要件としては、単一障害点を避けるために複数のソースから情報を照会する分散型オラクルネットワークを使用することです。 ほとんどの場合、分散型オラクルにはオラクルノードに正しい情報を報告するよう促す暗号経済的なインセンティブが組み込まれており、集中型オラクルよりも安全性が高くなっています。 -オンチェーンオラクルに資産価格を照会する場合は、時間加重平均価格(TWAP)メカニズムを実装しているものを使用することを検討してください。 [TWAP オラクル](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles)は、ある資産の価格を 2 つの異なる時点(修正可能)で照会し、得られた平均値に基づいて現在価格を計算します。 長い期間を選択することで、直前に行われた大量の注文が資産価格に影響を与えることができないため、価格の不正操作からプロトコルを保護します。 +オンチェーンオラクルに資産価格を照会する場合は、時間加重平均価格(TWAP)メカニズムを実装しているものを使用することを検討してください。 [TWAPオラクル](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles)は、ある資産の価格を2つの異なる時点(修正可能)で照会し、得られた平均値に基づいて現在価格を計算します。 長い期間を選択することで、直前に行われた大量の注文が資産価格に影響を与えることができないため、価格の不正操作からプロトコルを保護します。 ## デペロッパー向けスマートコントラクト・セキュリティリソース {#smart-contract-security-resources-for-developers} @@ -460,91 +460,93 @@ DEX の価格は正確であることが多く、これは市場の均衡を取 - **[スマートコントラクト監査サービス](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)** - _イーサリアム開発プロジェクト向けのスマートコントラクト監査サービスを提供する企業のリスト。_ -- **[バグ報奨金プラットフォーム](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** - _バグ報奨金の調整と、スマートコントラクトの重大な脆弱性の責任ある開示へ報酬を与えるためのプラットフォーム。_ +- **[バグ報奨金プラットフォーム](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** - _バグ報奨金を調整し、スマートコントラクトの重大な脆弱性を責任を持って開示した人に対して報酬を与えるためのプラットフォーム。_ - **[Fork Checker](https://forkchecker.hashex.org/)** - _フォークされたコントラクトに関する利用可能なすべての情報を確認するための無料のオンラインツール。_ -- **[ABI Encoder](https://abi.hashex.org/)** - _Solidity コントラクトの関数とコンストラクタの引数をエンコードするための無料のオンラインサービス。_ +- **[ABI Encoder](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 リアルタイムアラート](https://tenderly.co/alerting/)** - _スマートコントラクトやウォレットに異常なイベントや予期せぬイベントが発生した場合に、通知をリアルタイムに受けとるためのツール。_ +- **[Tenderlyリアルタイムアラート](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/)** - _イーサリアム上で動作し、トランザクションが発生する前に最低人数(N 人中の M 人)の承認が必要なスマートコントラクトウォレット。_ +- **[Safe](https://safe.global/)** - _イーサリアム上で動作し、トランザクションが発生する前に最低人数(N人中のM人)の承認が必要なスマートコントラクトウォレット。_ -- **[OpenZeppelin コントラクト](https://docs.openzeppelin.com/contracts/4.x/)** - _コントラクトの所有権、アップグレード、アクセス制御、ガバナンス、一時停止機能など、管理機能を実装するためのコントラクトライブラリ。_ +- **[OpenZeppelinコントラクト](https://docs.openzeppelin.com/contracts/4.x/)** - _コントラクトの所有権、アップグレード、アクセス制御、ガバナンス、一時停止機能など、管理機能を実装するためのコントラクトライブラリ。_ ### スマートコントラクト監査サービス {#smart-contract-auditing-services} -- **[ConsenSys Diligence](https://consensys.net/diligence/)** - _ブロックチェーンエコシステム全体のプロジェクトについて、プロトコルがローンチに適した状態にあり、ユーザーを保護するように構築されていることを確認するスマートコントラクト監査サービス_ +- **[ConsenSys Diligence](https://consensys.net/diligence/)** - _ブロックチェーンエコシステム全体のプロジェクトについて、プロトコルがローンチに適した状態にあり、ユーザーを保護するように構築されていることを確認するスマートコントラクト監査サービス。_ - **[CertiK](https://www.certik.com/)** - _スマートコントラクトとブロックチェーンネットワークに最先端の形式検証技術を使用する先駆的なブロックチェーンセキュリティ企業_ -- **[Trail of Bits](https://www.trailofbits.com/)** - _セキュリティ研究と攻撃者のメンタリティを融合させ、リスクの低減とコードの堅牢化を図るサイバーセキュリティ企業_ +- **[Trail of Bits](https://www.trailofbits.com/)** - _セキュリティ研究と攻撃者のメンタリティを融合させ、リスクの低減とコードの堅牢化を図るサイバーセキュリティ企業。_ -- **[PeckShield](https://peckshield.com/)** - _ブロックチェーンエコシステム全体のセキュリティ、プライバシー、ユーザビリティのための製品やサービスを提供するブロックチェーンセキュリティ企業_ +- **[PeckShield](https://peckshield.com/)** - _ブロックチェーンエコシステム全体のセキュリティ、プライバシー、ユーザビリティのための製品やサービスを提供するブロックチェーンセキュリティ企業。_ -- **[QuantStamp](https://quantstamp.com/)** - _セキュリティおよびリスク評価サービスを通じて、ブロックチェーン技術の主流化を促進する監査サービス_ +- **[QuantStamp](https://quantstamp.com/)** - _セキュリティおよびリスク評価サービスを通じて、ブロックチェーン技術の主流化を促進する監査サービス。_ -- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** - _分散型システムのセキュリティ監査を提供するスマートコントラクトセキュリティ企業_ +- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** - _分散型システムのセキュリティ監査を提供するスマートコントラクトセキュリティ企業。_ -- **[Runtime Verification](https://runtimeverification.com/)** - _スマートコントラクトと形式モデルを専門としたセキュリティ企業_ +- **[Runtime Verification](https://runtimeverification.com/)** - _スマートコントラクトと形式モデルを専門としたセキュリティ企業。_ -- **[Hacken](https://hacken.io)** - _ブロックチェーンセキュリティへの 360 度アプローチをもたらすサイバーセキュリティ監査人_ +- **[Hacken](https://hacken.io)** - _ブロックチェーンセキュリティへの360度アプローチをもたらすサイバーセキュリティ監査人。_ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _ Solidity と Cairo の監査サービスにより、イーサリアムと Starknet 全体でスマートコントラクトの整合性とユーザーの安全を確保_ +- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _ SolidityとCairoの監査サービスにより、イーサリアムとStarknet全体でスマートコントラクトの整合性とユーザーの安全を確保。_ -- **[HashEx](https://hashex.org/)** - _HashEx は、ブロックチェーンとスマート コントラクトの監査に焦点を当てており、暗号通貨のセキュリティを確保するためのスマートコントラクト開発、侵入テスト、ブロックチェーンコンサルティングなどのサービスを提供_ +- **[HashEx](https://hashex.org/)** - _HashExは、ブロックチェーンとスマート コントラクトの監査に焦点を当てており、暗号通貨のセキュリティを確保するためのスマートコントラクト開発、侵入テスト、ブロックチェーンコンサルティングなどのサービスを提供_ + +- **[Code4rena](https://code4rena.com/)** - _スマートコントラクトセキュリティの専門家へ脆弱性の発見にインセンティブを与え、web3をより安全にすることを支援する競争的な監査プラットフォーム。_ ### バグ報奨プログラムプラットフォーム {#bug-bounty-platforms} -- **[Immunefi](https://immunefi.com/)** - _スマートコントラクトと DeFi プロジェクトのバグ報奨プログラムのプラットフォーム。セキュリティ研究者がコードをレビューし、脆弱性を開示し、報酬を得て、暗号資産の安全性を強化_ +- **[Immunefi](https://immunefi.com/)** - _スマートコントラクトとDeFiプロジェクトのバグ報奨プログラムのプラットフォーム。セキュリティ研究者がコードをレビューし、脆弱性を開示し、報酬を得て、暗号資産の安全性を強化。_ - **[HackerOne](https://www.hackerone.com/)** - _企業とペネトレーションテスターやサイバーセキュリティ研究者をつなぐ、脆弱性調整とバグ報奨プログラムのプラットフォーム_ -- **[HackenProof](https://hackenproof.com/)** - _ 暗号プロジェクト(DeFi、スマート コントラクト、ウォレット、CEX など)のエキスパートのバグ報奨金プラットフォーム。セキュリティプロフェッショナルはトリアージサービスを提供し、研究者は検証済みの関連バグレポートに対して報酬を獲得_ +- **[HackenProof](https://hackenproof.com/)** - _ 暗号プロジェクト(DeFi、スマート コントラクト、ウォレット、CEXなど)のエキスパートのバグ報奨金プラットフォーム。セキュリティプロフェッショナルはトリアージサービスを提供し、研究者は検証済みの関連バグレポートに対して報酬を獲得。_ ### 既知のスマートコントラクトの脆弱性とエクスプロイトの公開 {#common-smart-contract-vulnerabilities-and-exploits} -- **[ConsenSys: スマートコントラクトの既知の攻撃](https://consensys.github.io/smart-contract-best-practices/attacks/)** - _コントラクトの最も重要な脆弱性を、ほとんどのケースでサンプルコード付きで初心者にもわかりやすく解説_ +- **[ConsenSys: スマートコントラクトの既知の攻撃](https://consensys.github.io/smart-contract-best-practices/attacks/)** - _コントラクトの最も重要な脆弱性を、ほとんどのケースでサンプルコード付きで初心者にもわかりやすく解説。_ -- **[SWC レジストリ](https://swcregistry.io/)** - _イーサリアムスマートコントラクトに該当する共通の脆弱性(CWE)項目の厳選リスト_ +- **[SWCレジストリ](https://swcregistry.io/)** - _イーサリアムスマートコントラクトに該当する共通の脆弱性(CWE)項目の厳選リスト。_ -- **[Rekt](https://rekt.news/)** - _注目の暗号ハッキングやエクスプロイトを、詳細な事後分析レポートとともに定期的に更新して公開_ +- **[Rekt](https://rekt.news/)** - _注目の暗号ハッキングやエクスプロイトを、詳細な事後分析レポートとともに定期的に更新して公開。_ ### スマートコントラクトのセキュリティ学習課題 {#challenges-for-learning-smart-contract-security} -- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - _ブロックチェーンセキュリティの机上演習、課題、[Capture The Flag](https://www.webopedia.com/definitions/ctf-event/amp/)コンペやソリューション記事の厳選リスト_ +- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - _ブロックチェーンセキュリティの机上演習、課題、[Capture The Flag](https://www.webopedia.com/definitions/ctf-event/amp/)コンペやソリューション記事の厳選リスト。_ -- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** - _DeFi スマートコントラクトの攻撃的なセキュリティを学び、バグハンティングやセキュリティ監査のスキルを身につけるための机上演習_ +- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** - _DeFiスマートコントラクトの攻撃的なセキュリティを学び、バグハンティングやセキュリティ監査のスキルを身につけるための机上演習。_ -- **[Ethernaut](https://ethernaut.openzeppelin.com/)** - _各レベルでスマートコントラクトのハッキングが必要な Web3/Solidity ベースの机上演習_ +- **[Ethernaut](https://ethernaut.openzeppelin.com/)** - _各レベルでスマートコントラクトのハッキングが必要なWeb3/Solidityベースの机上演習_ ### スマートコントラクトのセキュリティのベストプラクティス {#smart-contract-security-best-practices} -- **[ConsenSys: イーサリアムスマートコントラクトのセキュリティのベストプラクティス](https://consensys.github.io/smart-contract-best-practices/)** - _イーサリアムスマートコントラクトのセキュリティのガイドラインの包括的リスト_ +- **[ConsenSys: イーサリアムスマートコントラクトのセキュリティのベストプラクティス](https://consensys.github.io/smart-contract-best-practices/)** - _イーサリアムスマートコントラクトのセキュリティのガイドラインの包括的リスト。_ -- **[Nascent: シンプルセキュリティツールキット](https://github.com/nascentxyz/simple-security-toolkit)** - _スマートコントラクト開発のための、セキュリティを重視した実践的なガイドとチェックリスト集_ +- **[Nascent: シンプルセキュリティツールキット](https://github.com/nascentxyz/simple-security-toolkit)** - _スマートコントラクト開発のための、セキュリティを重視した実践的なガイドとチェックリスト集。_ -- **[Solidity パターン](https://fravoll.github.io/solidity-patterns/)** - _スマート コントラクトプログラミング言語「Solidity」の安全なパターンとベストプラクティスの有用情報のまとめ_ +- **[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)** - _デベロッパー、アーキテクト、セキュリティ評価者、ベンダー向けにスマートコントラクトのセキュリティを標準化するために作成された 14 部構成のチェックリスト_ +- **[スマートコントラクトセキュリティ検証スタンダード](https://github.com/securing/SCSVS)** - _デベロッパー、アーキテクト、セキュリティ評価者、ベンダー向けにスマートコントラクトのセキュリティを標準化するために作成された14部構成のチェックリスト。_ ### スマートコントラクトのセキュリティに関するチュートリアル {#tutorials-on-smart-contract-security} - [安全なスマートコントラクトコードの記述方法](/developers/tutorials/secure-development-workflow/) -- [Slither を使用してスマートコントラクトのバグを見つける方法](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) +- [Slitherを使用してスマートコントラクトのバグを見つける方法](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) -- [Manticore を使用してスマートコントラクトのバグを見つける方法](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) +- [Manticoreを使用してスマートコントラクトのバグを見つける方法](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) - [スマートコントラクトのセキュリティガイドライン](/developers/tutorials/smart-contract-security-guidelines/) diff --git a/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md b/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md index 88f43fa6885..8d79007706d 100644 --- a/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/ja/developers/docs/smart-contracts/testing/index.md @@ -1,265 +1,299 @@ --- title: スマートコントラクトのテスト -description: イーサリアムスマートコントラクトをテストするための手法と考慮事項の概要 +description: イーサリアムスマートコントラクトのテスト方法と考察の概要 lang: ja --- -[スマートコントラクト](/developers/docs/smart-contracts/)のテストは、[スマートコントラクトのセキュリティ](/developers/docs/smart-contracts/security/)を向上させる最も重要な対策の 1 つです。 従来のソフトウェアとは異なり、通常、スマートコントラクトは起動後に更新することができないため、イーサリアムネットワークにコントラクトをデプロイする前に厳格なテストを行うことが不可欠です。 +イーサリアムなどのパブリックブロックチェーンは不変で、一度デプロイされたスマートコントラクトのコードを変更するのは困難です。 「バーチャルアップデート」を実行するための[スマートコントラクトアップグレードのパターン](/developers/docs/smart-contracts/upgrading/)が存在するものの、実装は困難で、かつ社会的コンセンサスも必要です。 さらに、アップグレードは、発見された_後に_エラーを修正できるものにすぎません。攻撃者が先に脆弱性を発見した場合、スマートコントラクトは悪用される可能性があります。 -## スマートコントラクトのテストとは {#what-is-smart-contract-testing} - -スマートコントラクトのテストとは、スマートコントラクトの開発サイクルにおいて、そのソースコードの品質を評価するために詳細な分析と評価を行うことを意味します。 スマートコントラクトをテストすることで、バグや脆弱性の特定が容易になり、コストのかかるエクスプロイトにつながるソフトウェアエラーの可能性を低減することができます。 +これらの理由から、メインネットに[デプロイする](/developers/docs/smart-contracts/deploying/)前にスマートコントラクトをテストすることは、 [セキュリティ](/developers/docs/smart-contracts/security/)の最小要件です。 テストでは、さまざまな技術を活用してコードの正確性を評価しますが、必要な機能や目的に合わせて選択しなければなりません。 それでも、さまざまなツールとアプローチを組み合わせたテストスイートを使えば、スマートコントラクトコード深刻度にかかわらず、セキュリティ欠陥を見つけることができます。 -スマートコントラクトのテストには様々な形態があり、それぞれの手法によってメリットがあります。 イーサリアムスマートコントラクトのテスト戦略は、大きく 2 つに分類されます。**自動テスト**と**手動テスト**です。 +## 前提知識 {#prerequisites} -### 自動テスト {#automated-testing} +このページでは、イーサリアムネットワークにデプロイする前に、スマートコントラクトをテストする方法について説明します。 [スマートコントラクト](/developers/docs/smart-contracts/)の知識があることを前提としています。 -自動テストでは、自動化ツールを使って、スマートコントラクトのスクリプトテストを実施します。 この技術は、スマートコントラクトの欠陥を見つけるためにテストを繰り返し実行できる自動化されたソフトウェアに依存しています。 +## スマートコントラクトのテストとは {#what-is-smart-contract-testing} -自動テストは効率的で、使用するリソースも少なく、手動分析よりも高いカバレッジレベルを実現します。 また、自動テストツールにテストデータを設定することで、予測された動作と実際の結果を比較することができます。 +スマートコントラクトのテストとは、スマートコントラクトのコードが意図したとおりに動作することを検証するプロセスです。 テストによって、スマートコントラクトの信頼性、使いやすさ、セキュリティ要件を満たしているかどうかを確認することができます。 -### 手動テスト {#manual-testing} +テストにはさまざまなアプローチがありますが、一般的には、処理することが予想されるデータの小さなサンプルを用いてスマートコントラクトを実行する必要があります。 コントラクトがサンプルデータに対して正しい結果を生成する場合、コントラクトは適切に機能していると判断できます。 テストツールのほとんどは、コントラクトの実行が期待通りであるかどうかを検証するための[テストケース](https://en.m.wikipedia.org/wiki/Test_case)を作成したり実行したりするためのリソースを提供しています。 -手動テストは、人が介在し、テスト手順を手動で実行するものです。 コード監査は、デベロッパーや監査人がコントラクトコードのすべての行に目を通すもので、スマートコントラクトの手動テストの一例です。 +### スマートコントラクトのテストの重要性 {#importance-of-testing-smart-contracts} -スマートコントラクトの手動テストには、かなりのスキルと、時間、費用、労力の投資が必要です。 さらに、手作業によるテストは、時にヒューマンエラーの問題をはらんでいることがあります。 +スマートコントラクトでは、高価値の金融資産を管理することが多いため、小さなプログラミングの間違いが[ユーザーに大損失](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. -さらに、手作業によるテストは、時にヒューマンエラーの問題をはらんでいることがあります。 コード監査は、人間の知能を利用して、自動テストでは検出されない可能性のある契約コードの欠陥を見つけます。 +バグが発見された場合、コントラクトをアップグレードすることは可能ですが、アップグレードは複雑で、誤った処理をすると[エラー](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/)が発生する可能性があります。 また、アップグレードによって、コントラクトの不変性の原則が損なわれ、ユーザーにさらなる信頼が求められることになります。 一方で、統合的なテスト計画を立てることで、スマートコントラクトのセキュリティリスクを軽減し、デプロイ後に複雑なロジックのアップグレードを実行する必要性を減らすことができます。 -スマートコントラクトを手動でテストすることで、コードの外に存在する、しかし影響を及ぼしうる脆弱性を発見することもできます。 例えば、スマートコントラクトの監査では、オフチェーンのコンポーネントとの欠陥のある相互作用に起因する脆弱性を発見することができます。 +## スマートコントラクトのテスト方法 {#methods-for-testing-smart-contracts} -## スマートコントラクトのテストの重要性 {#benefits-of-smart-contract-testing} +Methods for testing Ethereum smart contracts fall under two broad categories: **automated testing** and **manual testing**. 自動テストと手動テストには、それぞれに長所と短所があります。両方を組み合わせることで、コントラクトを解析するための堅牢な計画を立てることができます。 -以下の理由により、スマートコントラクトのテストは重要です。 +### 自動テスト {#automated-testing} -### 1. スマートコントラクトは高価値のアプリケーションである {#smart-contracts-are-high-value-applications} +自動テストでは、スマートコントラクトのコードを実行して、エラーがないか自動的にチェックするツールを使用します。 自動テストの利点は、[スクリプト](https://www.techtarget.com/whatis/definition/script?amp=1)を使用してコントラクトの機能を評価できることです。 スクリプト化されたテストは、人間の介入を最小限に抑え、繰り返し実行するようにスケジュールできるので、手動によるテストよりも効率的です。 -スマートコントラクトは、特に[分散型金融(DeFi)](/defi/)などの業界において価値の高い金融資産や、[非代替性トークン(NFT)](/nft/)などの有価物を扱うことがよくあります。 そのため、スマートコントラクトの些細な脆弱性が、ユーザーにとって回復不能な巨額の損失につながることがしばしばあります。 しかし、包括的なテストにより、スマートコントラクトのコードの誤りを明らかにし、デプロイする前にセキュリティリスクを低減することができます。 +自動テストは、テストが反復的で時間がかかる、手動で実行するのが難しい、人的ミスの影響を受けやすい、重要なコントラクト関数の評価を伴う、などの場合に特に役立ちます。 ただし、自動テストツールには、欠点もあります。例えば、特定のバグを検出できなかったり、多くの[誤検知](https://www.contrastsecurity.com/glossary/false-positive)をしてしまうことがあります。 そのため、スマートコントラクトのテストには、自動テストと手動テストを組み合わせることが望ましいと言えます。 -### 2. スマートコントラクトはイミュータブル(不変)である {#smart-contracts-are-immutable} +### 手動テスト {#manual-testing} -[イーサリアム仮想マシン(EVM)](/developers/docs/evm/)にデプロイされたスマートコントラクトは、デフォルトでイミュータブル(不変)となっています。 従来のデベロッパーは、発売後にソフトウェアのバグを修正することに慣れているかもしれませんが、イーサリアムの開発では、スマートコントラクトがブロックチェーン上で稼働すると、セキュリティ上の欠陥を修正する余地がほとんどなくなります。 +手動テストは、人が直接操作して行うテストです。スマートコントラクトの正確性を解析する際には、テストスイートの各テストケースを順番に実行します。 これは、コントラクト上で複数の個別のテストを同時に実行し、失敗したテストと合格したすべてのテストを表示したレポートを取得できる自動テストとは異なります。 -プロキシパターンなど、スマートコントラクトでアップグレード可能なメカニズムは存在するものの、実装が難しい場合があります。 アップグレードによって不変性が損なわれ、複雑さが生じるだけでなく、しばしば複雑なガバナンスプロセスが要求されます。 +手動テストは、さまざまなテストシナリオを網羅するように作成されたテスト計画書に従って、個人が実行します。 また、手動テストの一環として、複数の個人やグループが一定期間にわたってスマートコントラクトを操作することもあります。 テスターは、コントラクトの実際の動作と期待される動作を比較して、違いがあればバグとしてフラグを立てます。 -ほとんどの場合、アップグレードは最後の手段と考え、必要な場合を除き避けるべきです。 起動前の段階でスマートコントラクトの潜在的な脆弱性や欠陥を検出することで、ロジックのアップグレードの必要性を減らすことができます。 +効果的な手動テストには、スキル、時間、資金、労力などの多くのリソースが必要になります。また、テストの実行中に人的ミスにより、特定のエラーを見逃すことがあります。 しかし、手動テストにもメリットがあります。例えば、人間のテスト担当者(監査人など)は、自動テストツールでは検出が難しいエッジケースを直感的に見つけることができます。 ## スマートコントラクトの自動テスト {#automated-testing-for-smart-contracts} -### 1. 機能テスト {#functional-testing} +### 単体テスト {#unit-testing-for-smart-contracts} -機能テストは、スマートコントラクトの機能を検証し、コード内の各機能が期待通りに動作することを保証するものです。 機能テストでは、スマートコントラクトが特定の条件下でどのように動作すべきかを理解する必要があります。 その後、選択した値で計算を実行し、返された出力と期待される出力を比較することで、各機能をテストすることができます。 +単体テストでは、コントラクトの関数を個別に評価し、各コンポーネントが正しく動作するかを確認します。 優れた単体テストとは、シンプルで短時間で実行でき、テストが失敗した場合に、その原因を明確に示せるものです。 -機能テストには 3 つの手法があります。**単体テスト**、**統合テスト**、**システムテスト**です。 +単体テストは、期待する値が返されるかどうかと、関数の実行後にコントラクトのストレージが適切に更新されるかどうかを確認するのに効果的です。 また、コントラクトのコードベースに変更を加えた後に単体テストを実行し、新しいロジックの追加によってエラーが発生しないことを確認します。 以下は、効果的な単体テストを実行するためのガイドラインです。 -#### 単体テスト +#### スマートコントラクト単体テストのガイドライン {#unit-testing-guidelines} -単体テストは、スマートコントラクトの個々のコンポーネントの正確性をテストするものです。 単体テストはシンプルで、素早く実行でき、テストが失敗した場合に何が悪かったのかを明確にすることができます。 +##### 1. コントラクトのビジネスロジックとワークフローを理解する -スマートコントラクトの開発では、特にコードに新しいロジックを追加する必要がある場合、単体テストは非常に重要です。 各機能の動作を検証し、意図したとおりに実行されることを確認することができます。 +スマートコントラクトが提供する機能を理解し、ユーザーがどのように関数にアクセスして使用しているかを把握しておくと、単体テストを作成しやすくなります。 [ハッピーパステスト](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)の(要約された)例を用いて、このコンセプトを説明します。 -多くの場合、単体テストを実行するには、_アサーション_(スマートコントラクトの要件を指定する単純で非公式なステートメント)の作成が必要になります。 単体テストでは、それぞれのアサーションをテストし、実行時にそれが正しいかどうかを確認することができます。 +``` +constructor( + uint biddingTime, + address payable beneficiaryAddress + ) { + beneficiary = beneficiaryAddress; + auctionEndTime = block.timestamp + biddingTime; + } -コントラクト関連のアサーションの例としては、以下のものがあります。 +function bid() external payable { -I. 「コントラクトを一時停止できるのは管理者のみ」 + if (block.timestamp > auctionEndTime) + revert AuctionAlreadyEnded(); -ii. 「管理者以外は新しいトークンをミントできない」 + if (msg.value <= highestBid) + revert BidNotHighEnough(highestBid); -iii. 「コントラクトはエラーになると元に戻る」 + if (highestBid != 0) { + pendingReturns[highestBidder] += highestBid; + } + highestBidder = msg.sender; + highestBid = msg.value; + emit HighestBidIncreased(msg.sender, msg.value); + } -#### 統合テスト + function withdraw() external returns (bool) { + uint amount = pendingReturns[msg.sender]; + if (amount > 0) { + pendingReturns[msg.sender] = 0; -統合テストは、テスト階層において単体テストより上位に位置します。 統合テストでは、スマートコントラクトの個々のコンポーネントが一緒にテストされます。 + if (!payable(msg.sender).send(amount)) { + pendingReturns[msg.sender] = amount; + return false; + } + } + return true; + } -このアプローチは、コントラクトの異なる構成要素間、または複数のコントラクトにまたがる相互作用に起因するエラーを検出するものです。 複数の機能を持つ複雑なコントラクトや、他のコントラクトとのインターフェイスを持つコントラクトがある場合は、この手法を使用する必要があります。 +function auctionEnd() external { + if (block.timestamp < auctionEndTime) + revert AuctionNotYetEnded(); + if (ended) + revert AuctionEndAlreadyCalled(); -統合テストは、継承や依存性注入などが適切に動作することを確認するのに便利です。 + ended = true; + emit AuctionEnded(highestBidder, highestBid); -#### システムテスト + beneficiary.transfer(highestBid); + } +} +``` -システムテストは、スマートコントラクトの機能テストの最終段階です。 システムテストは、スマートコントラクトを完全に統合された 1 つの製品として評価し、技術要件で指定されたとおりの性能を発揮するかどうかを確認します。 +このオークションコントラクトは、入札期間中に入札を受け付けるシンプルなものです。 `highestBid`が増えた場合は、以前の最高入札者に入札金が支払われます。また、入札期間が終了すると、`beneficiary`はコントラクトを呼び出して入札金を受け取ります。 -この段階は、ユーザーの視点からスマートコントラクトのエンドツーエンドの流れを確認することだと考えることができます。 スマートコントラクトのシステムテストを行うには、[テストネット](/developers/docs/networks/#ethereum-testnets)や[開発用ネットワーク](/developers/docs/development-networks/)などの本番同様の環境上にデプロイすることが良い方法と言えます。 +このようなコントラクトの単体テストでは、コントラクトとやり取りする際にユーザーが呼び出す可能性のあるさまざまな関数をテストします。 例えば、オークションの進行中にユーザーが入札できるか(すなわち、`bid()`の呼び出しが成功する)かどうかを確認する単体テストや、ユーザーが現在の`highestBid`よりも高い入札ができるかどうかを確認する単体テストなどがあります。 -ここでは、エンドユーザーが試験運用を行い、コントラクトのビジネスロジックや全体的な機能に関する問題を報告することができます。 システムテストが重要なのは、コントラクトがメインの EVM 環境にデプロイされると、コードを変更することができないからです。 +コントラクトの操作上のワークフローを理解しておくと、実行内容が要件を満たしているかどうかを確認する単体テストの作成にも役立ちます。 例えば、オークションコントラクトでは、オークションが終了したとき(つまり、`auctionEndTime`が`block.timestamp`よりも小さいとき)は、ユーザーが入札できないようになっています。 この場合、デベロッパーは、オークション終了時(つまり、`auctionEndTime` > `block.timestamp`の場合)に`bid()`関数の呼び出しが成功するか失敗するかをチェックする単体テストを実行するとよいでしょう。 -### 2. 静的/動的解析 {#static-dynamic-analysis} +##### 2. コントラクトの実行に関するすべての前提条件を評価する -スマートコントラクトのセキュリティ品質を評価するための自動テスト手法として、静的解析と動的解析があります。 しかし、どちらの手法も、コントラクトコードの不具合を発見するために、異なるアプローチを採用しています。 +コントラクトの実行に関する前提を文書化し、それらの前提の妥当性を検証する単体テストを作成することが重要です。 アサーションテストを行うことで、予期しない実行を防ぐことができます。また、スマートコントラクトのセキュリティモデルを破る可能性のある操作について検討する際にも役立ちます。 有用な方法としては、「ユーザーにとって満足のいくテスト」を超えて、間違った入力に対して関数が失敗するかどうかをチェックするネガティブテストを作成することです。 -#### 静的解析 +多くの単体テストフレームワークでは、アサーションの作成ができます。アサーションでは、コントラクトで可能・不可能なことを記述する単純なステートメントを作成します。テストを実行すると、それらのアサーションが維持されているかどうかが確認されます。 上記のオークションコントラクトを開発しているデベロッパーは、ネガティブテストを実行する前に、その挙動について次のようなアサーションを作成できます。 -静的解析は、実行前にスマートコントラクトのソースコードまたはバイトコードを調査します。 つまり、実際にプログラムを実行することなく、コントラクトコードをデバッグすることができるのです。 静的解析ツールは、イーサリアムスマートコントラクトに共通する脆弱性を検出し、最善の方法の遵守を支援します。 +- オークションが終了しているか、まだ開始されていない場合、ユーザーは入札することができないこと。 -#### 動的解析 +- 入札額が許容しきい値を下回った場合、オークションコントラクトを取り消す(リバートする)こと。 -動的解析手法では、スマートコントラクトをランタイム環境で実行し、コードの問題点を特定する必要があります。 動的コードアナライザーは、実行中のコントラクトの振る舞いを観察し、特定された脆弱性やプロパティ違反の詳細なレポートを生成します。 +- 落札に失敗したユーザーの資金が確実に戻ること。 -ファジングは、コントラクトをテストするための動的解析手法の一例です。 ファズテストでは、ファザーがスマートコントラクトに不正なデータを与え、その入力に対してコントラクトがどのように応答するかを監視します。 +**注**: 前提をテストする別の方法としては、特に`require`、`assert`、`if…else`ステートメントなど、コントラクト内の[関数修飾子](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers)をトリガーするテストを作成することです。 -ファズテストでは、ファザーがスマートコントラクトに不正なデータを与え、その入力に対してコントラクトがどのように応答するかを監視します。 ユーザーが正しい入力をすることを前提としていますが、必ずしもそうであるとは限らないからです。 +##### 3. コードカバレッジを計測する -スマートコントラクトに誤った入力値を送ると、リソースリークやクラッシュを引き起こしたり、最悪の場合、意図しないコードの実行につながったりするケースがあります。 ファジングキャンペーンでは、このような問題を事前に発見し、脆弱性を排除することが可能です。 +[コードカバレッジ](https://en.m.wikipedia.org/wiki/Code_coverage)は、テストで実行されたコード内の分岐、行、ステートメントの数を追跡する指標です。 テストには、適切なコードカバレッジが必要です。コードカバレッジが不十分だと、「偽陰性」を引き起こす可能性があります。つまり、コントラクトがすべてのテストに合格しても、依然としてコードに脆弱性が存在する可能性が残ってしまいます。 しかし、高いコードカバレッジを記録していれば、スマートコントラクト内のすべてのステートメントや関数が正確であることを十分に検証することができます。 -## スマートコントラクトの手動テスト {#manual-testing-for-smart-contracts} +##### 4. 完成度の高いテストフレームワークを使用する -### 1. コード監査 {#code-audits} +スマートコントラクトの単体テストを実行するツールの品質は、非常に重要です。 理想的なテストフレームワークは、定期的にメンテナンスされ、便利な機能(ログ機能やレポート機能など)を備えているものです。そして、多くのデベロッパーに広く使用され、よく精査されていることも重要です。 -コード監査とは、スマートコントラクトのソースコードを詳細に評価し、起こりうる障害点、セキュリティ上の欠陥、不適切な開発手法を発見することです。 コード監査は自動化することもできますが、ここでは人の手を介したコード解析を指しています。 +Solidityスマートコントラクト用の単体テストフレームワークは、さまざまな言語(主にJavaScript、Python、Rust)で提供されています。 単体テストの実行を始めるには、以下のさまざまなテストフレームワークのガイドを参照してください。 -コード監査では、スマートコントラクトで考えられる攻撃ベクトルをマッピングするために、攻撃者のマインドセットが必要です。 自動監査を行うにしても、ソースコードの一行一行を解析することは、安全なスマートコントラクトを書くための最低条件です。 +- **[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)** +- **[Remixを使った単体テストの実行](https://remix-ide.readthedocs.io/en/latest/unittesting.html#write-tests)** +- **[Apeを使った単体テストの実行](https://docs.apeworx.io/ape/stable/userguides/testing.html)** +- **[Hardhatを使った単体テストの実行](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** -また、スマートコントラクトの安全性をより確実にするために、セキュリティ監査を依頼することも可能です。 監査では、サイバーセキュリティの専門家による広範な解析が行われ、スマートコントラクトの機能を破壊する可能性のある脆弱性やバグを検出することができます。 +### 統合テスト {#integration-testing-for-smart-contracts} -### 2. バグ報奨金 {#bug-bounties} +単体テストでは、コントラクトの関数を個別にデバッグしましたが、統合テストでは、スマートコントラクトのコンポーネント全体を評価します。 統合テストでは、スマートコントラクト間の呼び出しで発生する問題や、同じスマートコントラクト内の異なる関数間のやり取りで発生する問題を検出できます。 例えば、[継承](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance)や依存性注入などの機能が正しく動作するかどうかを確認するのに役立ちます。 -バグ報奨金とは、プログラムのコードに脆弱性やバグを発見し、デベロッパーに報告した個人に与えられる金銭的な報酬のことです。 バグ報奨金は、スマートコントラクトの不具合の発見を他の人に依頼するもので、監査に似ています。 大きな違いは、バグ報奨金プログラムには、デベロッパーコミュニティやハッカーコミュニティからも幅広く参加できるということです。 +統合テストは、コントラクトがモジュラー型アーキテクチャを採用していたり、実行中に他のオンチェーンコントラクトと接続する場合に有用です。 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. -バグ奨励金プログラムには、独自のスキルや経験を持つ幅広い層の倫理的ハッカーや独立したセキュリティ専門家が多く参加します。 これは、限られた専門知識を持つチームに依存するスマートコントラクト監査にはない利点と言えるでしょう。 +フォークされたブロックチェーンは、メインネットと同様の仕組みで動作し、アカウントに状態と残高が関連付けられています。 しかし、サンドボックス化されたローカル開発環境としてのみ機能します。例えば、トランザクションに実際のETHは必要なく、変更しても実際のイーサリアムプロトコルに影響することはありません。 -## テストと形式検証の比較 {#testing-vs-formal-verification} +### プロパティベースのテスト {#property-based-testing-for-smart-contracts} -テストは、あるデータ入力に対してコントラクトが期待通りの結果を返すことを確認するのに役立ちますが、テストで使用されていない入力に対して同じことを決定的に証明することはできません。 スマートコントラクトのテストは「機能的な正しさ」を保証できません。つまり、入力値や条件の*すべての*セットに対してプログラムが要求通りに動作することを示すことはできないのです。 +プロパティベースのテストは、スマートコントラクトが定義されたプロパティを満たしていることを確認するプロセスです。 プロパティは、コントラクトの行動に関する事実をアサーションします。この事実は、さまざまなシナリオにおいて真であることが期待されるものです。スマートコントラクトプロパティの例としては、「コントラクト内の算術演算は、オーバーフローもアンダーフローもしない」などがあります。 -そのため、デベロッパーはスマートコントラクトの正しさを評価するアプローチに**形式検証**を取り入れることが推奨されています。 形式検証では、[形式手法](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/)(ソフトウェアを仕様化し検証するための数学的に厳密な技法)を用います。 +プロパティベースのテストを実行する方法には、**静的分析**と**動的分析**の2つの一般的な手法があります。どちらの手法でも、 プログラムのコード(この場合は、スマートコントラクト)が、事前に定義されたプロパティを満たしていることを検証できます。 プロパティベースのテストツールには、予期されるコントラクトプロパティに対する事前定義されたルールが備えてあり、コードがそれらのルールに違反しているかチェックするものや、スマートコントラクトのカスタムプロパティを作成できるものがあります。 -形式検証は、デベロッパーがスマートコントラクトに関連する仮定を形式的に検証するのに役立つため、スマートコントラクトにとって重要であると考えられています。 これは、スマートコントラクトの特性を記述した形式的な仕様を作成し、スマートコントラクトの形式モデルがその仕様に合致していることを検証することで実現されます。 このアプローチにより、スマートコントラクトはビジネスロジックで定義された機能のみを実行し、それ以外の機能は実行しないという信頼性を高めることができます。 +#### 静的解析 {#static-analysis} -[スマートコントラクトのための形式検証の詳細](/developers/docs/smart-contracts/formal-verification) +静的アナライザーは、スマートコントラクトのソースコードを受け取って解析し、コントラクトがプロパティを満たしているかどうかを判断します。 動的解析とは異なり、静的解析では、コントラクトを実行して正確性の解析を行うことはありません。 静的解析は、スマートコントラクトが実行中にたどる可能性のあるすべてのパスを推論します。つまり、ソースコードの構造を調べて、コントラクトの操作がランタイムで何を意味するかを決定します。 -## テストのためのツールとライブラリ {#testing-tools-and-libraries} +コントラクトで静的解析を実行する一般的な手法として、[リンティング](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/)など、コントラクト実行における低レベル表現の解析が必要です。 -### 単体テストツール {#unit-testing-tools} +静的解析は、安全でない構造の使用や構文エラー、コントラクトコード内のコーディング規約違反などの安全性の問題を検出するには有効です。 しかし、より深い脆弱性の検出が不得意であることが知られており、過剰な誤検出が生じる可能性があります。 + +#### 動的解析 {#dynamic-analysis} + +動的解析では、シンボリックな入力(例: [シンボリック実行](https://en.m.wikipedia.org/wiki/Symbolic_execution))または具体的な入力(例: [ファジング](https://owasp.org/www-community/Fuzzing))をスマートコントラクトの関数に生成して、実行トレースが特定のプロパティに違反していないかどうかを確認します。 この方式によるプロパティベースのテストでは、単体テストとは異なり、複数のシナリオのテストケースをカバーし、プログラムがテストケースを生成します。 -**Solidity-Coverage** - _スマートコントラクトのテストに便利な Solidity のコードカバレッジツールです_。 +[ファジング](https://halborn.com/what-is-fuzz-testing-fuzzing/)は、動的解析手法の例の1つでスマートコントラクトの任意のプロパティを検証します。 ファザー(fuzzer)は、定義されたランダムまたは不正なバリエーションの入力値で、ターゲットコントラクト内の関数を呼び出します。 スマートコントラクトがエラー状態 (例: アサーションが失敗した状態など) になると、問題に対してフラグが立てられ、実行によって脆弱なパスに向かう入力がレポートに作成されます。 -- [GitHub](https://github.com/sc-forks/solidity-coverage) +ファジングは、スマートコントラクトの入力検証メカニズムを評価するのに効果的です。なぜなら、予期しない入力を適切に処理しないと、意図しない動作が発生し、悪影響が生じる可能性があるからです。 この方式によるプロパティベースのテストは、以下のような理由から理想的です。 -**Waffle** - _高度なスマートコントラクトの開発とテストのためのフレームワークです(ethers.js をベースとする)_。 +1. **さまざまなシナリオをカバーするテストケースを書くことは難しい**。 プロパティテストでは、振る舞いとその振る舞いをテストするためのデータ範囲を定義するだけです。プログラムは、定義されたプロパティに基づいてテストケースを自動的に生成します。 -- [ドキュメント](https://ethereum-waffle.readthedocs.io/en/latest/) -- [GitHub](https://github.com/TrueFiEng/Waffle) -- [ウェブサイト](https://getwaffle.io/) +2. **テストスイートがプログラム内のすべての実行パスを十分にカバーしていないことがある。**100%のカバレッジであっても、エッジケースを見逃す可能性があります。 -**Remix Tests** - _Solidity スマートコントラクトをテストするためのツールです。 Remix IDE の「Solidity Unit Testing」プラグインで動作します。このプラグインは、コントラクトのテストケースの作成と実行に使用されます。_ +3. **単体テストでは、コントラクトがサンプルデータに対して正しく実行されることを証明できるが、サンプル外の入力に対して正しく実行されるかどうかは未確認のままである。**プロパティテストでは、ターゲットコントラクトを複数のバリエーションで実行します。 指定された入力値を使用して、アサーションの失敗を引き起こす実行トレースを見つけます。 そのため、プロパティテストでは、広範なクラスの入力データに対してコントラクトが正しく実行されることを、より確実に保証することができます。 -- [ドキュメンテーション](https://remix-ide.readthedocs.io/en/latest/unittesting.html) -- [GitHub](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests) +### スマートコントラクトでプロパティベースのテストを実行する際のガイドライン {#running-property-based-tests} -**OpenZeppelin テストヘルパー -** _イーサリアムスマートコントラクトテストのためのアサーションライブラリです。 コントラクトが期待通りに動作することを確認してください。_ +プロパティベースのテストの実行では通常、プロパティの定義(例: [整数オーバーフロー](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)がないこと)、またはスマートコントラクト検証を行う必要のあるプロパティのコレクションを定義することから始めます。 プロパティテストを作成するときに、プログラムがトランザクションの入力データを生成するために、その値の範囲の定義が必要になることもあります。 -- [GitHub](https://github.com/OpenZeppelin/openzeppelin-test-helpers) -- [ドキュメント](https://docs.openzeppelin.com/test-helpers) +プロパティテストツールは、適切に構成することで、ランダムに生成された入力値を使ってスマートコントラクトの関数を実行することができます。 アサーション違反が発生した場合、評価対象のプロパティに違反する具体的な入力データがレポートに含まれます。 プロパティベースのテストを実行するには、以下のさまざまなツールのガイドを参照してください。 -**Truffle スマートコントラクトテストフレームワーク** - _自動テストフレームワークにより、コントラクトのテストを簡単に行うことができます。_ +- **[Slitherを使ったスマートコントラクト静的解析](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither#slither)** +- **[Brownieを使ったプロパティベースのテスト](https://eth-brownie.readthedocs.io/en/stable/tests-hypothesis-property.html)** +- **[Foundryを使ったコントラクトのファジング](https://book.getfoundry.sh/forge/fuzz-testing)** +- **[Echidnaを使ったコントラクトのファジング](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna#echidna-tutorial)** +- **[Manticoreを使ったスマートコントラクトのシンボリック実行](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore#manticore-tutorial)** +- **[Mythrilを使ったスマートコントラクトのシンボリック実行](https://mythril-classic.readthedocs.io/en/master/tutorial.html)** -- [ドキュメント](https://trufflesuite.com/docs/truffle/testing/testing-your-contracts/) -- [ウェブサイト](https://trufflesuite.com/) +## スマートコントラクトの手動テスト {#manual-testing-for-smart-contracts} + +スマートコントラクトの手動テストは、通常、自動テストを行った後の開発サイクルの後半で行われます。 この手動テストでは、スマートコントラクトを完全に統合された1つの製品として評価し、技術要件で指定されたとおりの性能を発揮するかどうかを確認します。 -**ユニットテストフレームワーク Brownie** - _Brownie は、最小限のコードで小さなテストを作成することができ、大規模なプロジェクトでもうまく拡張できる、機能豊富なテストフレームワークである Pytest を利用しています。_ +### ローカルブロックチェーンでのコントラクトのテスト {#testing-on-local-blockchain} -- [ドキュメント](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html) -- [GitHub](https://github.com/eth-brownie/brownie) +ローカルの開発環境で実行される自動テストは、有用なデバッグ情報を提供しますが、実際の環境でスマートコントラクトがどのように動作するかを確認したい場合もあります。 しかし、実際のイーサリアムチェーンにデプロイするとガス代が発生します。また、スマートコントラクトにバグがある場合、ユーザーが実際にお金を失う可能性があることは言うまでもありません。 -**Foundry Tests** - _Foundry 社は、シンプルな単体テスト、ガス最適化チェック、コントラクトファジングを実行できる、高速で柔軟なイーサリアムテストフレームワークである Forge を提供しています。_ +メインネットでテストする代わりに、ローカルのブロックチェーン([開発ネットワーク](/developers/docs/development-networks/)とも呼ばれます)でコントラクトをテストすることをお勧めします。 ローカルブロックチェーンは、イーサリアムブロックチェーンのコピーで、自分のコンピュータのローカル環境で実行できるものです。これにより、イーサリアムの実行レイヤーの動作をシミュレートすることができます。 そのため、トランザクションをプログラムしてコントラクトとやり取りする際に、多額のコストが発生することはありません。 -- [GitHub](https://github.com/foundry-rs/foundry/tree/master/forge) -- [ドキュメント](https://book.getfoundry.sh/forge/) +ローカルのブロックチェーン上でコントラクトを実行するのは、手動で統合テストを行うのに効果的な方法です。 [スマートコントラクトは、柔軟に構成できるようになっています](/developers/docs/smart-contracts/composability/)。これにより、既存のプロトコルと統合できるようになりましたが、複雑なオンチェーンでの相互作用が正しい結果を生み出すかどうかについては、依然として確認する必要があります。 -**Etheno** - _JSON RPC マルチプレクサ、解析ツールラッパー、テスト統合ツールからなるオールインワンのイーサリアムテストツールです。 Etheno は、大規模なマルチコントラクトプロジェクトにおいて、Manticore や Echidna のような分析ツールを設定する複雑さを解消します。_ +[開発用ネットワークの詳細](/developers/docs/development-networks/) -- [GitHub](https://github.com/crytic/etheno) +### テストネットでのスマートコントラクトのテスト {#testing-contracts-on-testnets} -**Woke development and testing framework** - _Python のテスト・デプロイメントスクリプトで、型ヒント、ファザー、デバッグサポート、コードカバレッジ、クロスチェーンテストを備えています。_ +テストネットワークすなわちテストネットは、イーサリアムメインネットとまったく同じ仕様で動作するネットワークです。ただし、テストネットで使用されるイーサ(ETH)は、現実世界で価値がありません。 コントラクトを[テストネット](/developers/docs/networks/#ethereum-testnets)にデプロイすると、資金を失うリスクはありません。また、Dappのフロントエンドなどを介して、誰でもコントラクトとやり取りできるようになります。 -- [ドキュメント](https://ackeeblockchain.com/woke/docs/latest/testing-framework/overview/) -- [GitHub](https://github.com/Ackee-Blockchain/woke) +この方式の手動テストでは、ユーザーの視点からアプリケーションのエンドツーエンドのフローを評価することができます。 テストネットでは、ベータテスターが試験運用を行い、コントラクトのビジネスロジックや全体的な機能に関する問題を報告することもできます。 -### 静的解析ツール {#static-analysis-tools} +テストネットの方がイーサリアム仮想マシンの動作に近いため、ローカルブロックチェーンでテストした後にテストネットにデプロイすることが理想です。 そのため、多くのイーサリアムを使うプロジェクトでは、テストネットにDappをデプロイし、現実世界の条件下でスマートコントラクトの操作を評価するのが一般的です。 -**Mythril** - _Taint 解析、Concolic 解析、制御フローチェックを用いてコントラクトの脆弱性を検出する EVM バイトコード評価ツールです_。 +[イーサリアムテストネットの詳細](/developers/docs/development-networks/#public-beacon-testchains) -- [GitHub](https://github.com/ConsenSys/mythril-classic) -- [ドキュメント](https://mythril-classic.readthedocs.io/en/master/about.html) +## テストと形式検証の比較 {#testing-vs-formal-verification} -**Slither** - _Python ベースの Solidity 静的解析フレームワークで、脆弱性の発見、コード理解の強化、スマートコントラクトのカスタム解析の記述に使用します。_ +テストは、あるデータの入力に対して、コントラクトが期待通りの結果を返すことを確認するのに役立ちますが、テストで使用されていない入力に対して、同じことを確実に証明できるわけではありません。 したがって、スマートコントラクトのテストでは、「機能的な正しさ」を保証できません。つまり、入力値の_すべての_セットに対して、プログラムが要求通りに動作することを保証することはできません。 -- [GitHub](https://github.com/crytic/slither) +形式検証は、プログラムの形式モデルが形式仕様と一致するかどうかを確認することでソフトウェアの正確さを評価するアプローチです。 プログラムを抽象的かつ数学的に表現したものが形式モデルで、プログラムのプロパティ(つまり、プログラムの実行に関する論理的アサーション)を定義したものが形式仕様です。 -**Rattle** - _デプロイされたスマートコントラクトで動作するように設計された EVM バイトコード静的解析フレームワークです。_ +プロパティは、数学用語で記述されるため、システムの形式(数学)モデルが仕様を満たしていることを、論理的な推論規則を使用して検証することができます。 したがって、形式検証ツールは、システムの正確さを「数学的に証明」できると言われています。 -- [GitHub](https://github.com/crytic/rattle) +テストとは異なり、形式検証は、サンプルデータを使わずにスマートコントラクトが_どのような_実行においても、形式仕様を満たしていること(バグがないこと)を検証できます。 これにより、数十の単体テストの実行時間が短縮され、背後にある脆弱性をより効率的に発見できるようになります。 ただし、形式検証手法では、実装の難易度や有用性が多岐に渡ります。 -### 動的解析ツール {#dynamic-analysis-tools} +[スマートコントラクトの形式検証の詳細](/developers/docs/smart-contracts/formal-verification) -**Echidna** - _プロパティベースのテストによりスマートコントラクトの脆弱性を検出する高速なコントラクトファザーです_。 +## テストと監査およびバグ報奨金の比較 {#testing-vs-audits-bug-bounties} -- [GitHub](https://github.com/crytic/echidna/) +上記のように、厳密なテストをしても、コントラクトにバグがないとは言い切れません。 形式検証によるアプローチは、正確性をより強力に保証できますが、現時点では使用が難しく、かなりのコストがかかります。 -**Harvey** - _スマートコントラクトのコードのプロパティ違反を検出するのに便利な自動ファジングツールです。_ +第三者によるコードレビューを受ければ、コントラクトの脆弱性を発見できる可能性が高くなります。 第三者にコントラクトを分析してもらうには、[スマートコントラクトの監査](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://consensys.net/diligence/fuzzing/) +監査は、スマートコントラクトのセキュリティ上の欠陥や不健全な開発プラクティスを探し出す経験豊かな監査人が行います。 監査では、コードベース全体の手動レビューだけでなく、テストや形式検証も行われるのが一般的です。 -**Manticore** - _EVM バイトコード解析のための動的シンボリック実行フレームワーク。_ +一方で、バグ報奨金プログラムでは通常、スマートコントラクトの脆弱性を発見してデベロッパーへ公開する([ホワイトハットハッカー](https://en.wikipedia.org/wiki/White_hat_(computer_security))と呼ばれる)個人に対して、金銭的な報酬が支払われます。 バグ報奨金は、スマートコントラクトの不具合の発見を他の人に依頼するもので、監査に似ています。 -- [GitHub](https://github.com/trailofbits/manticore) -- [ドキュメント](https://github.com/trailofbits/manticore/wiki) +主な違いとしては、バグ報奨金プログラムは、より広範なデベロッパーやハッカーコミュニティを対象としているため、ユニークなスキルや経験を持つ幅広いクラスの倫理的なハッカーや独立したセキュリティ専門家を引きつけることができます。 これは、限られた専門知識を持つチームに依存するスマートコントラクト監査では得られない利点と言えるでしょう。 -### スマートコントラクト監査サービス {#smart-contract-auditing-services} +## テストツールとライブラリ {#testing-tools-and-libraries} -**ConsenSys Diligence** - _スマートコントラクトの監査サービスによって、ブロックチェーンエコシステム全体のプロジェクトについて、プロトコルが起動に適した状態にあり、ユーザーを保護できるように構築されていることを保証します。_ +### 単体テストツール {#unit-testing-tools} -- [ウェブサイト](https://consensys.net/diligence/) +- **[solidity-coverage](https://github.com/sc-forks/solidity-coverage)** - _Solidityで書かれたスマートコントラクトのコードカバレッジツール_ -**CertiK** - _スマートコントラクトとブロックチェーンネットワークに最先端の形式検証技術を使用する先駆的なブロックチェーンセキュリティ企業です。_ +- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** - _高度なスマートコントラクトの開発とテストのためのフレームワーク(ethers.jsベース)_ -- [ウェブサイト](https://www.certik.com/) +- **[Remixテスト](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** - _Solidityスマートコントラクトのテストツール。 Remix IDEの「Solidity Unit Testing」プラグインで動作します。このプラグインは、コントラクトのテストケースの作成と実行に使用します。_ -**Trail of Bits** - _セキュリティ研究と攻撃者の心理を融合させ、リスクの低減とコードの堅牢化を図るサイバーセキュリティ企業です。_ +- **[OpenZeppelinテストヘルパー](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** - _イーサリアムスマートコントラクトのテストに使用できるアサーションライブラリ。 コントラクトが期待通りに動作していることを確認してください。_ -- [ウェブサイト](https://www.trailofbits.com/) +- **[Brownieユニットテストフレームワーク](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _最小限のコードで小さなテストを作成可能。また、大規模なプロジェクトにも対応するスケーラビリティも持ち合わせており、機能豊富なテストフレームワークであるPytestを利用しています。_ -**PeckShield** - _ブロックチェーンエコシステム全体のセキュリティ、プライバシー、ユーザビリティのための製品やサービスを提供するブロックチェーンセキュリティ企業です。_ +- **[Foundryテスト](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry社は、シンプルな単体テスト、ガス最適化チェック、コントラクトファジングを実行でき、高速で柔軟なイーサリアムテストフレームワークであるForgeを提供しています。_ -- [ウェブサイト](https://peckshield.com/) +- **[Hardhatテスト](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _ethers.js、Mocha、Chaiをベースとしたスマートコントラクトテストにおけるフレームワーク_。 -**QuantStamp** - _セキュリティおよびリスク評価サービスを通じて、ブロックチェーン技術の主流化を促進する監査サービスです_。 +- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** - _イーサリアム仮想マシン用のスマートコントラクトでPythonベースの開発およびテストのためのフレームワーク_。 -- [ウェブサイト](https://quantstamp.com/) +### プロパティベースのテストツール {#property-based-testing-tools} -**OpenZeppelin** - _分散型システムのセキュリティ監査を提供するスマートコントラクトセキュリティ企業です。_ +#### 静的解析ツール {#static-analysis-tools} -- [ウェブサイト](https://www.openzeppelin.com/security-audits) +- **[Slither](https://github.com/crytic/slither)** - _PythonベースのSolidity静的解析フレームワークで、脆弱性の発見、コード理解の強化、スマートコントラクトのカスタム解析の記述で使用_。 -**Nethermind** - _Solidity と Cairo の監査サービスにより、イーサリアムと Starknet 全体でスマートコントラクトの整合性とユーザーの安全が確保されます。_ +- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** - _スマートコントラクトのプログラミング言語であるSolidityのスタイルとセキュリティのベストプラクティスを適用するためのリンター_。 -- [ウェブサイト](https://nethermind.io/smart-contracts-audits) +#### 動的解析ツール {#dynamic-analysis-tools} -### バグ報奨金プラットフォーム {#bug-bounty-platforms} +- **[Echidna](https://github.com/crytic/echidna/)** - _プロパティベースのテストによりスマートコントラクトの脆弱性を検出する高速なコントラクトファザー_。 -**Immunefi** - _スマートコントラクトと DeFi プロジェクトのためのバグ報奨金プラットフォームです。セキュリティ研究者がコードをレビューし、脆弱性を開示し、報酬を得て、暗号をより安全なものにします。_ +- **[Diligence Fuzzing](https://consensys.net/diligence/fuzzing/)** - _スマートコントラクトのコードのプロパティ違反を検出するのに便利な自動ファジングツール_。 -- [ウェブサイト](https://immunefi.com/) +- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** - _EVMバイトコード解析のための動的シンボリック実行フレームワーク_。 -**HackerOne** - _企業とペネトレーションテスターやサイバーセキュリティ研究者をつなぐ、脆弱性調整とバグ報奨金のプラットフォームです。_ +- **[Mythril](https://github.com/ConsenSys/mythril-classic)** - _Taint解析、Concolic解析、制御フローチェックを用いてコントラクトの脆弱性を検出するEVMバイトコード評価ツール_。 -- [ウェブサイト](https://www.hackerone.com/) +- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** - _Scribbleは、仕様記述言語およびランタイム検証ツールでスマートコントラクトのプロパティにアノテーションを付けることができます。これにより、Diligence FuzzingやMythXなどのツールを使用してコントラクトを自動的にテストできます。_ ## 関連チュートリアル {#related-tutorials} -- [安定性と Truffle 連続統合設定](/developers/tutorials/solidity-and-truffle-continuous-integration-setup/) _– Travis または Circle CI の Truffle テストと有益なプラグインのセットアップ方法_ -- [製品テストの概要](/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/) -- [テスト用 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) -- [JavaScript で学ぶブロックチェーン、Solidity、フルスタック Web3 開発(YouTube)](https://www.youtube.com/watch?v=gyMwXuJrbJQ) -- [Solidity、ブロックチェーン、スマートコントラクト講座(YouTube)](https://www.youtube.com/watch?v=M576WGiDBdQ) +- [さまざまな製品テストの概要と比較](/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/) +- [Solidityコントラクトのテスト用モックの作成方法](/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) ## 参考文献 {#further-reading} -- [イーサリアムスマートコントラクトのテストに関する徹底ガイド](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) - _Ben Hauser_ -- [イーサリアムスマートコントラクトのテスト方法](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) - _Alex Roan_ +- [イーサリアムスマートコントラクトのテストに関する詳細ガイド](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) +- [イーサリアムスマートコントラクトのテスト方法](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) +- [デベロッパー向けMolochDAOのユニットテストガイド](https://github.com/MolochVentures/moloch/tree/4e786db8a4aa3158287e0935dcbc7b1e43416e38/test#moloch-testing-guide) +- [ロックスターのようにスマートコントラクトをテストする方法](https://forum.openzeppelin.com/t/test-smart-contracts-like-a-rockstar/1001) diff --git a/public/content/translations/ja/developers/docs/smart-contracts/upgrading/index.md b/public/content/translations/ja/developers/docs/smart-contracts/upgrading/index.md new file mode 100644 index 00000000000..bd2dc588ff2 --- /dev/null +++ b/public/content/translations/ja/developers/docs/smart-contracts/upgrading/index.md @@ -0,0 +1,168 @@ +--- +title: スマートコントラクトのアップグレード +description: イーサリアムスマートコントラクトのアップグレードパターンの概要 +lang: ja +--- + +イーサリアムのスマートコントラクトは、イーサリアム仮想マシン(EVM)で実行される自己実行プログラムです。 これらのプログラムは、不変になるように設計されています。そのため、一度デプロイしたコントラクトのビジネスロジックを後から変更することはできません。 + +この不変性は、トラストレス、分散化、スマートコントラクトのセキュリティを実現するために必要ですが、場合によっては欠点になることもあります。 例えば、このコードの不変性により、デベロッパーは脆弱なコントラクトを修正できないことがあります。 + +しかし、スマートコントラクトの改善に向けた研究が進み、いくつかのアップグレードパターンが開発されました。 これらのアップグレードでは、デベロッパーが別のコントラクトにビジネスロジックを配置することで、スマートコントラクトを(不変性を維持しつつ)アップグレードすることができます。 + +## 前提知識 {#prerequisites} + +[スマートコントラクト](/developers/docs/smart-contracts/)、[スマートコントラクトの構造](/developers/docs/smart-contracts/anatomy/)、 [イーサリアム仮想マシン(EVM)](/developers/docs/evm/)について十分に理解している必要があります。 さらに、このガイドでは、読者がスマートコントラクトのプログラミングを理解していることを前提としています。 + +## スマートコントラクトのアップグレードとは {#what-is-a-smart-contract-upgrade} + +スマートコントラクトをアップグレードするには、コントラクトの状態を維持したまま、スビジネスロジックを変更する必要があります。 特にアップグレード可能性と不変性は、スマートコントラクトのコンテキストでは、必ずしも一致するものではありません。 + +イーサリアムネットワーク上のアドレスにデプロイされたプログラムは、変更できません。 しかし、ユーザーがスマートコントラクトとやり取りする際に、実行されるコードは変更することができます。 + +これについては、次の方法を用いて行います。 + +1. 複数のバージョンのスマートコントラクトを作成し、古いコントラクトから新しいコントラクトのインスタンスに状態(データ)を移行する。 + +2. ビジネスロジックおよび状態を保存するセパレートコントラクトを作成する。 + +3. プロキシパターンを使い、不変のプロキシコントラクトから修正可能なロジックコントラクトへの関数の呼び出しを委任する。 + +4. 特定の関数を実行する柔軟なサテライトコントラクトに依存し、インターフェースで接続する不変のメインコントラクトを作成する。 + +5. ダイヤモンドパターンを使い、プロキシコントラクトからロジックコントラクトへの関数の呼び出しを委任する。 + +### アップグレードメカニズム #1: コントラクトマイグレーション {#contract-migration} + +スマートコントラクトのマイグレーションは、バージョン管理に基づいています。バージョン管理とは、同一のソフトウェアの固有の状態を作成・管理する考え方です。 コントラクトマイグレーションでは、従来のスマートコントラクトを新しいインスタンスにデプロイし、ストレージと残高を新しいコントラクトに転送します。 + +新しくデプロイされたコントラクトのストレージは空です。そのため、旧コントラクトからデータを復元して、新しい実装に書き込むことができます。 その後、旧コントラクトとやり取りしたすべてのコントラクトを、新しいコントラクトのアドレスに更新する必要があります。 + +コントラクトマイグレーションの最終ステップは、新しいコントラクトに切り替えてもらうようユーザーを説得することです。 新しいコントラクトでは、不変性が維持されており、ユーザーの残高とアドレスが引き継がれています。 トークンベースのコントラクトの場合は、旧コントラクトの使用を停止し、新しいコントラクトを使用する旨を取引所に通知する必要もあります。 + +コントラクトマイグレーションは、ユーザーとのやり取りを中断することなく、スマートコントラクトをアップグレードできる、比較的簡単で安全な方法です。 ただし、ユーザーのストレージと残高を新しいコントラクトに手動で移行するのに時間がかかり、高額なガス代が発生する可能性があります。 + +[コントラクトマイグレーションの詳細](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) + +### アップグレードメカニズム #2: データセパレーション {#data-separation} + +スマートコントラクトのアップグレード方法として、ビジネスロジックとデータストレージを別々のコントラクトに分離する方法があります。 この方法では、ユーザーはロジックコントラクトとやり取りし、データはストレージコントラクトに保存されます。 + +ロジックコントラクトは、アプリケーションとやり取りする際に実行されるコードを含んでいます。 また、ロジックコントラクトは、ストレージコントラクトのアドレスを保持しており、データの取得や設定を処理します。 + +一方で、ストレージコントラクトは、ユーザー残高やアドレスなどのスマートコントラクトに関連する状態を保持します。 ストレージコントラクトは、ロジックコントラクトによって管理されます。また、デプロイ時にロジックコントラクトのアドレスが設定されることに注意してください。 これにより、認可されていないコントラクトがストレージコントラクトを呼び出したり、ストレージコントラクトのデータを更新したりすることを防止できます。 + +デフォルトでは、ストレージコントラクトは不変ですが、ロジックコントラクトは新しい実装に置き換えることで、 ストレージと残高をそのままに保ちつつ、EVMで実行されるコードを変更することができます。 + +このアップグレード方法を使用するには、ストレージコントラクト内のロジックコントラクトのアドレスを更新する必要があります。 また、前述した理由により、ストレージコントラクトのアドレスを使用して、新しいロジックコントラクトを構成する必要があります。 + +データセパレーションパターンは、コントラクトマイグレーションと比較して、簡単に実装できます。 ただし、スマートコントラクトを悪意のあるアップグレードから保護するには、複数のコントラクトを管理し、複雑な認可スキームを実装する必要があります。 + +### アップグレードメカニズム #3: プロキシパターン {#proxy-patterns} + +プロキシパターンでも、ビジネスロジックとデータを別々のコントラクトに保持するために、データセパレーションを使います。 しかし、プロキシパターンでは、コードの実行中に、ストレージコントラクト(プロキシと呼ばれる)がロジックコントラクトを呼び出します。 これは、ロジックコントラクトがストレージコントラクトを呼び出すデータセパレーションとは逆の方法です。 + +プロキシパターンでは、以下の処理が行われます。 + +1. ユーザーは、データを格納するプロキシコントラクトとやり取りします。ただし、プロキシコントラクトにはビジネスロジックは含まれていません。 + +2. プロキシコントラクトでは、ロジックコントラクトのアドレスを格納し、`delegatecall`関数を使って、すべての関数の呼び出しを(ビジネスロジックを持つ)ロジックコントラクトに委任します。 + +3. 呼び出しがロジックコントラクトに転送された後、ロジックコントラクトから返されたデータを取得し、ユーザーに戻します。 + +プロキシパターンを使うには、**delegatecall**関数を理解する必要があります。 基本的に、`delegatecall`は、コントラクトが別のコントラクトを呼び出すことができるオペコードですが、実際のコードは呼び出し元のコントラクトのコンテキストで行われます。 プロキシパターンで`delegatecall`を使用すると、プロキシコントラクトがストレージの読み取りと書き込みを行い、まるで内部関数を呼び出しているかのように、ロジックコントラクトのロジックを実行することになります。 + +[Solidityのドキュメント](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#delegatecall-callcode-and-libraries)の引用: + +> **delegatecall**という特別な可変メッセージ呼び出しがあります。**delegatecall**は、ターゲットアドレスのコードが、呼び出し側コントラクトのコンテキスト(例: アドレス)で実行されることを除けば、メッセージ呼び出しと同一です。また、`msg.sender`と`msg.value`の値は変わりません。__これは、コントラクトが実行時に、別のアドレスからコードを動的にロードできることを意味します。 つまり、ストレージ、現在のアドレス、残高は呼び出し元のコントラクトを参照しており、 コードのみが呼び出し先のアドレスから取得されます_。 +> +> プロキシコントラクトには、`fallback`関数が組み込まれているため、ユーザーが関数を呼び出すたびに`delegatecall`をが呼び出されていることがわかります。 Solidityプログラミングでは、コントラクトの関数呼び出しが指定した関数と一致しない場合、[フォールバック関数](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function)が実行されます。 +> +> プロキシパターンを機能させるには、プロキシコントラクトがサポートしていない関数の呼び出しを処理する方法を指定したカスタムフォールバック関数を作成する必要があります。 この場合、プロキシのフォールバック関数は、delegatecallを起動し、ユーザーのリクエストを現在のロジックコントラクト実装に切り替えるようにプログラムされます。 +> +> プロキシコントラクトは、デフォルトでは不変ですが、新しいロジックコントラクトを作成することで、ビジネスロジックを更新することができます。 アップグレードを実行するには、プロキシコントラクトが参照しているロジックコントラクトのアドレスを変更する必要があります。 +> +> プロキシコントラクトが新しいロジックコントラクトを参照するように変更することで、ユーザーがプロキシコントラクトの関数を呼び出すときに実行されるコードを変更することができます。 これにより、ユーザーは新しいコントラクトとやり取りする必要がなくなり、コントラクトのロジックをアップグレードすることができます。 +> +> プロキシパターンは、コントラクトのマイグレーションを容易にすることから、アップグレードで広く普及している方法です。 ただし、プロキシパターンの使用は、より複雑なため、不適切に扱うと[関数セレクタークラッシュ](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357)などの重大な欠陥を引き起こす可能性があります。 +> +> [プロキシパターンの詳細](https://blog.openzeppelin.com/proxy-patterns/) +> +> ### アップグレードメカニズム #4: ストラテジパターン {#strategy-pattern} +> +> このテクニックは、[ストラテジパターン](https://en.wikipedia.org/wiki/Strategy_pattern)に基づいています。ストラテジパターンとは、特定の機能を実装するために、他のプログラムとインターフェースするソフトウェアプログラムを作成するよう奨励するものです。 ストラテジパターンをイーサリアム開発に適用すると、他のコントラクトから関数を呼び出すスマートコントラクトを構築することになります。 +> +> この場合、メインコントラクトはコアとなるビジネスロジックを持ちますが、他のスマートコントラクト(「サテライトコントラクト」) のインターフェースで、特定の機能を実行します。 このメインコントラクトには、各サテライトコントラクトのアドレスが格納されており、サテライトコントラクトの実装を切り替えることができます。 +> +> 新しいサテライトコントラクトを構築して、メインコントラクトにその新しいコントラクトアドレスを設定することで、 スマートコントラクトの_ストラテジ_を変更(つまり、新しいロジックを実装)することができます。 +> +> 先ほどのプロキシパターンと似ていますが、ストラテジパターンでは、ユーザーがやり取りするメインコントラクトがビジネスロジックを持っています。これは、プロキシパターンと異なる点です。 このパターンを使用すると、コアインフラストラクチャに影響を与えることなく、スマートコントラクトに限定的な変更を加えることができます。 +> +> このパターンの欠点は、マイナーアップグレードにしか対応できないことです。 また、メインコントラクトが(ハッキングなどにより)侵害された場合は、このアップグレード方法は使用できません。 +> +> ### アップグレードメカニズム #5: ダイヤモンドパターン {#diamond-pattern} +> +> ダイヤモンドパターンは、プロキシパターンの改良版と言えます。 ダイヤモンドパターンでは、ダイヤモンドプロキシコントラクトが、関数呼び出しを複数のロジックコントラクトに委任できることができます。これは、プロキシパターンではできなかったことです。 +> +> ダイヤモンドパターンのロジックコントラクトを_ファセット_と呼びます。 ダイヤモンドパターンを機能させるには、各ファセットアドレスに[関数セレクタ](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector)をマップするマッピングを、プロキシコントラクト内に作成する必要があります。 +> +> ユーザーが関数を呼び出すと、プロキシコントラクトはマッピングをチェックして、その関数の実行を担当するファセットを見つけます。 次に、(フォールバック関数を使って)`delegatecall`を呼び出します。この呼び出しは、適切なロジックコントラクトにリダイレクトされます。 +> +> このダイヤモンドアップグレードパターンは、従来のプロキシアップグレードパターンに比べて、以下の利点があります。 +> +> 1. コード全体を変更しなくとも、コントラクトの一部をアップグレード可能。 プロキシパターンを使ってアップグレードすると、マイナーアップグレードであっても、新しいロジックコントラクトを最初から作成しなければなりません。 +> +> 2. すべてのスマートコントラクト(プロキシパターンで使用されるロジックコントラクトを含む)には、24KBのサイズ制限がある。この制限は、特に、多くの機能を必要とする複雑なコントラクトで適用されます。 ダイヤモンドパターンを使えば、関数を複数のロジックコントラクトに分割できるため、この問題を簡単に解決できます。 +> +> 3. プロキシパターンは、アクセス制御に対して、一括管理するアプローチを採用。 アップグレード機能にアクセスできるエンティティは、 コントラクト_全体_を変更することができます。 一方、ダイヤモンドパターンを使用することで、モジュールごとにアクセス許可を設定することができます。これにより、エンティティがスマートコントラクト内の特定の機能をアップグレードすることを制限できます。 +> +> [ダイヤモンドパターンの詳細](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w) +> +> ## スマートコントラクトのアップグレードにおけるメリットとデメリット {#pros-and-cons-of-upgrading-smart-contracts} +> +> + +| メリット | デメリット | +| ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| スマートコントラクトのアップグレードにより、デプロイ後に発見された脆弱性を修正しやすくなります。 | スマートコントラクトをアップブレードすると、コードの不変性が失われ、分散化とセキュリティに悪影響を与える可能性があります。 | +| デベロッパーは、ロジックのアップグレードを使い、分散アプリケーションに新しい機能を追加できます。 | ユーザーは、デベロッパーがスマートコントラクトを勝手に変更しないことを信頼しなければなりません。 | +| スマートコントラクトのアップグレードにより、バグを迅速に修正できます。これにより、エンドユーザーの安全性が向上します。 | スマートコントラクトにアップグレード機能をプログラミングすると、より複雑になり、重大な欠陥が発生するリスクが高まります。 | +| コントラクトのアップグレードにより、デベロッパーは、さまざまな機能を試したり、時間とともにDappを改良したりすることができます。 | スマートコントラクトをアップグレードできるため、デベロッパーは、開発段階でデューデリジェンスを行わずに、プロジェクトを早く開始してしまうかもしれません。 | +| | スマートコントラクトがセキュリティが低下したアクセスコントロールや集中化のリスクにさらされることで、悪意のある攻撃者が、認可されていないアップグレードを実行しやすくなる可能性があります。 | + + +## スマートコントラクトのアップグレードにおける考慮事項 {#considerations-for-upgrading-smart-contracts} + +1. 特にプロキシパターン、ストラテジパターン、データセパレーションを使う場合、安全なアクセスコントロール/認可メカニズムを用いて、認可されていないスマートコントラクトへのアップグレードを防止します。 例えば、コントラクトの所有者のみがアップグレード関数を呼び出せるように、アップグレード関数へのアクセスを限定します。 + +2. スマートコントラクトのアップグレードは複雑な作業です。また、脆弱性の侵入を防ぐためには、細心の注意が必要です。 + +3. アップグレードを実行するプロセスを分散化することで、信頼の仮定を軽減します。 可能な戦略としては、[マルチシグウォレットコントラクト](/developers/docs/smart-contracts/#multisig)を用いてアップグレードをコントロールしたり、[DAOメンバー](/dao/)の投票によってアップグレードを承認したりするなどの方法があります。 + +4. コントラクトのアップグレードにコストがかかることに注意します。 例えば、コントラクトのマイグレーション中に、古いコントラクトから新しいコントラクトへ状態(例: ユーザーの残高)をコピーするには、複数のトランザクションが必要になる場合があります。これにより、ガス代が高くなります。 + +5. ユーザーの保護に**タイムロック**の実装を検討します。 タイムロックによって、システムへの変更を強制的に遅延させることができます。 タイムロックとマルチシグによるガバナンスシステムを組み合わせることで、アップグレードをコントロールすることができます。これにより、提案されたアクションが承認に必要なしきい値に達しても、タイムロックで事前に定めた遅延期間が経過するまでは実行されません。 + +タイムロックは、ユーザーが提案された変更(例: ロジックのアップグレードや新しい料金体系など)に同意しない場合、ユーザーに対してシステムから離脱する猶予期間を与える機能です。 タイムロックがないと、ユーザーは、デベロッパーが事前通知なしでスマートコントラクトを勝手に変更しないという信頼に頼らざるを得ません。 タイムロックの欠点としては、脆弱性に対するパッチの適用が遅れる可能性があることです。 + +## リソース {#resources} + +**OpenZeppelinアップグレードプラグイン - _アップグレード可能なスマートコントラクトのデプロイおよび保護するためのツールスイート_** + +- [GitHub](https://github.com/OpenZeppelin/openzeppelin-upgrades) +- [ドキュメント](https://docs.openzeppelin.com/upgrades) + +## チュートリアル {#tutorials} + +- [スマートコントラクトのアップグレード | Patrick CollinsによるYouTubeチュートリアル](https://www.youtube.com/watch?v=bdXJmWajZRY) +- Austin Griffithによる[イーサリアム・スマートコントラクト・マイグレーション・チュートリアル](https://medium.com/coinmonks/ethereum-smart-contract-migration-13f6f12539bd) +- Pranesh A.Sによる[UUPSプロキシパターンを使ったスマートコントラクトのアップグレード](https://blog.logrocket.com/author/praneshas/) +- fangjun.ethによる[Web3チュートリアル: OpenZeppelinを使用したアップグレード可能なスマートコントラクト(プロキシ)の作成](https://dev.to/yakult/tutorial-write-upgradeable-smart-contract-proxy-contract-with-openzeppelin-1916) + +## 参考文献 {#further-reading} + +- [スマートコントラクトの状態のアップグレード](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 +- [ダイヤモンドアップグレードの動作原理](https://dev.to/mudgen/how-diamond-upgrades-work-417j) | Nick Mudge diff --git a/public/content/translations/ja/developers/docs/smart-contracts/verifying/index.md b/public/content/translations/ja/developers/docs/smart-contracts/verifying/index.md new file mode 100644 index 00000000000..752bbd3ae35 --- /dev/null +++ b/public/content/translations/ja/developers/docs/smart-contracts/verifying/index.md @@ -0,0 +1,107 @@ +--- +title: スマートコントラクトの検証 +description: イーサリアムのスマートコントラクトのソースコード検証の概要 +lang: ja +--- + +[スマートコントラクト](/developers/docs/smart-contracts/) は「トラストレス」なものとして設計されています。つまり、ユーザーはスマートコントラクトとやりとりをする前に、第三者(デベロッパーや企業など)を信頼する必要はありません。 トラストレスであることを確保するためには、ユーザーやその他のデベロッパーがスマートコントラクトのソースコードを検証できるようにする必要があります。 ソースコード検証により、ユーザーとデベロッパーは、公開されたコントラクトコードが、イーサリアムブロックチェーン上のコントラクトアドレスで実行されているのと同じコードであることを確認できます。 + +「ソースコード検証」と「[形式的検証](/developers/docs/smart-contracts/formal-verification/)」を区別することは重要です。 以下で詳述するソースコード検証とは、高級言語(Solidityなど)で書かれたスマートコントラクトのソースコードをコンパイルしたものが、コントラクトアドレスで実行されるバイトコードと一致するかどうかを検証する手法ですが、 形式的検証は、スマートコントラクトの正しさ、つまり、スマートコントラクトが意図したとおりに動作することを検証するものです。 コントラクト検証とは、文脈にもよりますが、一般的にはソースコード検証を指します。 + +## ソースコード検証とは {#what-is-source-code-verification} + +スマートコントラクトを[イーサリアム仮想マシン(EVM)](/developers/docs/evm/)にデプロイする前に、デベロッパーはスマートコントラクトのソースコード([Solidity](/developers/docs/smart-contracts/languages/)もしくは他の高級プログラミング言語で書かれた命令)をバイトコードに[コンパイル](/developers/docs/smart-contracts/compiling/)します。 EVMは高級言語による命令を解釈できないため、EVM内でスマートコントラクトのビジネスロジックを実行するには、ソースコードをバイトコード(すなわち低級のマシン命令)にコンパイルする必要があります。 + +ソースコード検証とは、スマートコントラクトの作成時に使用したソースコードと、実行時にコンパイルされたバイトコードを比較して、違いを検出することです。 公表されたスマートコントラクトのコードと、ブロックチェーン上で実行されるコードが異なる可能性があるため、スマートコントラクトの検証は重要な作業となります。 + +スマートコントラクト検証では、マシンコードを読むことなく、スマートコントラクトが書かれた高級言語を通してスマートコントラクトの挙動を調査することができます。 関数、値、そして通常は変数名とコメントは、コンパイルやデプロイを行っても、元のソースコードと同じままです。 そのため、コードの読解がとても簡単になります。 ソース検証は、コードのドキュメンテーションも規定するため、エンドユーザーはスマートコントラクトが何を行うように設計されているのかを理解することができます。 + +### 全検証とは何か {#full-verification} + +ソースコードには、コメントや変数名など、コンパイル後のバイトコードに影響しない部分があります。 そのため、変数名やコメントが異なるソースコードでも、同じスマートコントラクトを検証することができます。 これを悪用して、ソースコードに嘘のコメントや誤解を招く変数名を与えて、元のソースコードとは別のコードでスマートコントラクトを検証することができます。 + +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. 必要な情報は、[Solidityのコントラクトメタデータ](https://docs.soliditylang.org/en/v0.8.15/metadata.html)に含まれており、このファイルのハッシュは、コントラクトのバイトコードに追加されます。 この動作は、[メタデータのプレイグラウンド](https://playground.sourcify.dev)で確認できます。 + +メタデータファイルには、ソースファイルとそのハッシュを含む、スマートコントラクトのコンパイルに関する情報が含まれています。 コンパイル設定やソースファイルの1つが1バイトでも変更されると、メタデータファイルも変更されます。 そのため、バイトコードに付加されるメタデータファイルのハッシュも変更されます。 つまり、スマートコントラクトのバイトコードと付加されたメタデータハッシュが、指定されたソースコードおよびコンパイル設定と一致する場合、このソースコードは元のコンパイルで使われたものと完全に一致しており、1バイト単位で変更されていないことを確認できるのです。 + +メタデータハッシュを活用するこのタイプの検証は、**"[全検証](https://docs.sourcify.dev/docs/full-vs-partial-match/)"**(または「完全検証」)と呼ばれます。 一方、メタデータハッシュが一致しない、または検証で考慮されていない場合は「部分一致」と呼ばれ、現在ではこれがより一般的なスマートコントラクト検証の方法です。 全検証をしない場合は、検証されたソースコードに表れない[悪意のあるコードを挿入](https://samczsun.com/hiding-in-plain-sight/)することが可能です。 しかし、ほとんどのデベロッパーは全検証を知らないうえに、コンパイルのメタデータファイルを保持していないため、現実的には部分検証がスマートコントラクト検証の主流となっています。 + +## ソースコード検証が重要な理由 {#importance-of-source-code-verification} + +### トラストレス性 {#trustlessness} + +トラストレス性は、スマートコントラクトと[分散型アプリケーション(dapps)](/developers/docs/dapps/)の最も重要な前提条件です。 スマートコントラクトは「不変」で、変更することはできません。そのため、スマートコントラクトは、デプロイ時にコードで定義されているビジネスロジックのみを実行します。 つまり、デベロッパーや企業は、イーサリアムにデプロイした後に、スマートコントラクトのコードを改ざんすることはできません。 + +スマートコントラクトがトラストレスとなるためには、そのコードが独立した検証のために公開されている必要があります。 しかし、ブロックチェーン上で公開されているスマートコントラクトのコンパイル済みバイトコードは、デベロッパーやユーザーにとって理解するのが難しい低水準言語で書かれています。 + +スマートコントラクトのソースコードを公開することで、信頼を前提とする必要性が減ります。 But this leads to another problem: it is difficult to verify that the published source code matches the contract bytecode. このシナリオでは、ユーザーは、デベロッパーがスマートコントラクトをブロックチェーンにデプロイする前に、ビジネスロジックが変更されていない(つまり、バイトコードが変更されていない)ことを信頼する必要があります。そのため、トラストレス性の価値が失われます。 + +ソースコード検証ツールは、スマートコントラクトのソースコードファイルとアセンブリコードの一致を保証します。 これにより、トラストレスなエコシステムで、ユーザーはやみくもに第三者を信頼することなく、スマートコントラクトに資金を預ける前にコードを検証することができます。 + +### ユーザーの安全性 {#user-safety} + +スマートコントラクトには、通常、高額のコストがかかります。 そのため、より高いセキュリティが求められ、使用前のスマートコントラクトのロジックの検証が必須となります。 問題は、悪意のある開発者がスマートコントラクトに悪意のあるコードを混ぜて、ユーザーを騙す可能性があることです。 検証を行わないと、悪意のあるスマートコントラクトには、ユーザーの安全性を脅かす問題が潜んだままの状態になります。例えば、[バックドア](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts)や、物議をかもすようなアクセスコントロール機構、悪用されうる脆弱性などです。 + +スマートコントラクトのソースコードファイルを公開すると、監査役など、潜在的な攻撃媒介を評価する者は、スマートコントラクトの評価を容易に行うことができます。 複数の当事者が独自にスマートコントラクトを検証することで、ユーザーはより強力なセキュリティの保証を得ることができます。 + +## イーサリアムのスマートコントラクトコードの検証方法 {#source-code-verification-for-ethereum-smart-contracts} + +[イーサリアムにスマートコントラクトをデプロイする](/developers/docs/smart-contracts/deploying/)には、データペイロード(コンパイル済みバイトコード)を含むトランザクションを、特別なアドレスに送信する必要があります。 データペイロードは、トランザクション内のデータペイロードに付加されるコントラクトインスタンスの[コンストラクタ引数](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor)に加えて、ソースコードをコンパイルすることによって生成されます。 コンパイルは決定論的です。つまり、ソースファイルとコンパイル設定(コンパイラのバージョンや最適化など)が同じであれば、常に同じ結果(スマートコントラクトのバイトコード)を生成します。 + +![スマートコントラクトソースコードの検証を説明する図](./source-code-verification.png) + +スマートコントラクトの検証は、大きく分けて次の手順で行われます。 + +1. ソースファイルとコンパイル設定をコンパイラに入力します。 + +2. コンパイラはスマートコントラクトのバイトコードを出力します。 + +3. 指定されたアドレスでデプロイされたスマートコントラクトのバイトコードを取得します。 + +4. デプロイされたバイトコードを再コンパイルされたバイトコードと比較します。 コードが一致すれば、スマートコントラクトが指定されたソースコードとコンパイル設定に基づいて作成されたことが確認できます。 + +5. さらに、バイトコード末尾のメタデータハッシュが一致すれば、完全一致となります。 + +これは検証の単純化された記述であり、 [イミュータブル変数](https://docs.sourcify.dev/docs/immutables/)を持つ場合など、検証できない例外が多いことに注意してください。 + +## ソースコード検証ツール {#source-code-verification-tools} + +スマートコントラクトを検証する従来のプロセスは複雑になりがちです。 そのため、イーサリアムにデプロイされたスマートコントラクトのソースコードを検証するツールが存在します。 これらのツールは、ソースコード検証の大部分を自動化し、ユーザーに有益となるように検証済みのスマートコントラクトをキュレーションします。 + +### Etherscan {#etherscan} + +主に[イーサリアムのブロックチェーンエクスプローラー](/developers/docs/data-and-analytics/block-explorers/)として知られているEtherscanは、スマートコントラクトのデベロッパーやユーザー向けに、[ソースコード検証サービス](https://etherscan.io/verifyContract)も提供しています。 + +Etherscanを使用すると、元のデータペイロード(ソースコード、ライブラリのアドレス、コンパイラの設定、スマートコントラクトのアドレスなど)から、スマートコントラクトのバイトコードを再コンパイルできます。 再コンパイルされたバイトコードがチェーン上のスマートコントラクトのバイトコード(およびコンストラクタのパラメータ)に結び付くと、 [コントラクトが検証されます](https://info.etherscan.com/types-of-contract-verification/)。 + +検証が完了すると、スマートコントラクトのソースコードは「検証済み」のラベルを受け取り、他の人が監査できるようにEtherscanで公開されます。 また、検証済みソースコードを備えたスマートコントラクトのリポジトリである[検証済みコントラクト](https://etherscan.io/contractsVerified/)のセクションにも追加されます。 + +Etherscanはスマートコントラクトを検証するのに最もよく使用されるツールです。 しかし、Etherscanのコントラクト検証には欠点があります。チェーン上のバイトコードの**メタデータハッシュ**と再コンパイルされたバイトコードを比較することができないため、 部分一致しか得られません。 + +[Etherscanでスマートコントラクトを検証する方法の詳細](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327) + +### Sourcify {#sourcify} + +[Sourcify](https://sourcify.dev/#/verifier)は、オープンソースで分散化された、スマートコントラクトを検証するためのツールです。 ブロックエクスプローラーではなく、 [異なるEVMベースのネットワーク](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)コメントを使い、よりヒューマンフレンドリーにコントラクトとやり取りできるようにすることを目指しています。 + +Etherscanと違って、Sourcifyでは、メタデータハッシュとの完全一致をサポートしています。 検証されたコントラクトは、Sourcifyの[パブリックリポジトリ](https://docs.sourcify.dev/docs/repository/)によりHTTPおよび[IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs)で提供されます。IPFSは、分散化された[コンテンツアドレス付](https://web3.storage/docs/concepts/content-addressing/)ストレージです。 添付されたメタデータハッシュがIPFSハッシュであるため、IPFSを通してコントラクトファイルのメタデータを取り出すことができます。 + +さらに、ソースコードファイルのIPFSハッシュもメタデータ内にあるため、IPFSを通してソースコードファイルを取得することもできます。 APIもしくは[UI](https://sourcify.dev/#/verifier)を通して、またはプラグインを使って、メタデータファイルとソースファイルを提供することでコントラクトを検証できます。 また、Sourcifyのモニタリングツールは、新しいブロックでコントラクトの作成をリッスンし、メタデータとソースファイルがIPFSで公開されている場合にコントラクトを検証しようとします。 + +[Sourcifyのコントラクト検証の詳細](https://blog.soliditylang.org/2020/06/25/sourcify-faq/) + +### Tenderly {#tenderly} + +[Tenderlyプラットフォーム](https://tenderly.co/)は、Web3デベロッパー向けにスマートコントラクトのビルド、テスト、モニタリング、操作を提供します。 Tenderlyでは、オブザーバビリティおよびインフラストラクチャのビルディングブロックを持つデバックツールを組み合わせることで、デベロッパーがスマートコントラクトの開発をより迅速に行えるようサポートします。 Tenderlyの機能を完全に有効にするには、デベロッパーはいくつかの方法で[ソースコード検証を実行](https://docs.tenderly.co/monitoring/contract-verification)する必要があります。 + +コントラクトは、公開または非公開で検証できます。 非公開で検証する場合、スマートコントラクトは、作成者(もしくはプロジェクト内の他のメンバー)のみに公開されます。 公開で検証する場合、Tenderlyプラットフォームを使用するすべての人に公開されます。 + +[ダッシュボード](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-a-smart-contract)、[Tenderly Hardhatプラグイン](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-the-tenderly-hardhat-plugin)、[CLI](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli)を使ってコントラクトを検証することができます。 + +ダッシュボードを通してコントラクトを検証する場合、Solidityコンパイラによって生成されたソースファイルもしくはメタデータファイル、アドレス/ネットワーク、コンパイラー設定をインポートする必要があります。 + +Tenderly Hardhatプラグインを使うと、少ない労力で検証プロセスをより細かく制御できます。また、自動(コードなし)検証と手動(コードベース)検証のいずれかを選択できます。 + +## 参考文献 {#further-reading} + +- [コントラクトソースコードの検証](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/) diff --git a/public/content/translations/ja/developers/docs/standards/index.md b/public/content/translations/ja/developers/docs/standards/index.md index f2e48bfc278..5099a1727fe 100644 --- a/public/content/translations/ja/developers/docs/standards/index.md +++ b/public/content/translations/ja/developers/docs/standards/index.md @@ -7,32 +7,32 @@ incomplete: true ## 開発規格の概要 {#standards-overview} -イーサリアムコミュニティでは、([イーサリアムクライアント](/developers/docs/nodes-and-clients/)やウォレットなどの)各種プロジェクトにおける様々な実装間での相互運用性を維持し、スマートコントラクトや Dapp に対してコンポーザビリティを提供するために、多くの規格を定めています。 +イーサリアムコミュニティでは、([イーサリアムクライアント](/developers/docs/nodes-and-clients/)やウォレットなどの)各種プロジェクトにおける様々な実装間での相互運用性を維持し、スマートコントラクトやDappに対してコンポーザビリティを提供するために、多くの規格を定めています。 これらの規格は通常、[イーサリアム改善提案](/eips/)(EIP)として提出された後、コミュニティにおいて[標準プロセス](https://eips.ethereum.org/EIPS/eip-1)に従って議論されます。 -- [EIP とは何か?](/eips/) -- [EIP リスト](https://eips.ethereum.org/) -- [GitHub の EIP レポジトリ](https://github.com/ethereum/EIPs) -- [EIP ディスカッションボード](https://ethereum-magicians.org/c/eips) +- [EIPとは何か?](/eips/) +- [EIPリスト](https://eips.ethereum.org/) +- [GitHubのEIPレポジトリ](https://github.com/ethereum/EIPs) +- [EIPディスカッションボード](https://ethereum-magicians.org/c/eips) - [イーサリアムにおけるガバナンス入門](/governance/) -- [イーサリアムにおけるガバナンスの概説](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/ethereum-governance/) _2019 年 3 月 31 日、ボリス・マン作成。_ -- [イーサリアムにおけるプロトコル開発のガバナンスならびにネットワークアップグレードの調整](https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) _2020 年 3 月 23 日、ハドソン・ジェイムソン作成。_ -- [イーサリアム・コアデベロッパー・ミーティングの全プレイリスト](https://www.youtube.com/playlist?list=PLaM7G4Llrb7zfMXCZVEXEABT8OSnd4-7w) _(YouTube のプレイリスト)_ +- [イーサリアムにおけるガバナンスの概説](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/ethereum-governance/) _2019年3月31日、ボリス・マン作成。_ +- [イーサリアムにおけるプロトコル開発のガバナンスならびにネットワークアップグレードの調整](https://hudsonjameson.com/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) _2020年3月23日、ハドソン・ジェイムソン作成。_ +- [イーサリアム・コアデベロッパー・ミーティングの全プレイリスト](https://www.youtube.com/playlist?list=PLaM7G4Llrb7zfMXCZVEXEABT8OSnd4-7w) _(YouTubeのプレイリスト)_ ## 標準規格の種類 {#types-of-standards} -EIP は、以下の 3 種類に分類されます: +EIPは、以下の3種類に分類されます: - スタンダードトラック:すべて/大部分のイーサリアム実装に影響を及ぼす変更について記述します。 - [メタトラック](https://eips.ethereum.org/meta):イーサリアムに関するプロセスについて記述するか、プロセスの変更を提案します。 - [情報トラック](https://eips.ethereum.org/informational):イーサリアムの設計に関する問題点について記述するか、イーサリアムコミュニティに対する全般的なガイドラインや情報を提供します。 -標準トラックはさらに、以下の 4 つのカテゴリーに分類されます: +標準トラックはさらに、以下の4つのカテゴリーに分類されます: - [コア](https://eips.ethereum.org/core):コンセンサスフォークを必要とする改善。 -- [ネットワーク](https://eips.ethereum.org/networking):devp2p ならびにライトイーサリアムのサブプロトコルに関する改善や、Whisper および Swarm ネットワークプロトコル仕様に対する改善提案。 -- [インターフェース](https://eips.ethereum.org/interface):クライアント向け API/RPC の仕様/規格の改善と、メソッドの名称やコントラクトの ABI など、一部の言語レベルにおける規格の改善。 +- [ネットワーク](https://eips.ethereum.org/networking):devp2pならびにライトイーサリアムのサブプロトコルに関する改善や、WhisperおよびSwarmネットワークプロトコル仕様に対する改善提案。 +- [インターフェース](https://eips.ethereum.org/interface):クライアント向けAPI/RPCの仕様/規格の改善と、メソッドの名称やコントラクトのABIなど、一部の言語レベルにおける規格の改善。 - [ERC](https://eips.ethereum.org/erc):アプリケーションレベルにおける規格および慣例。 これらの種類やカテゴリーの詳細については、[EIP-1](https://eips.ethereum.org/EIPS/eip-1#eip-types)を参照してください。 @@ -40,14 +40,14 @@ EIP は、以下の 3 種類に分類されます: ### トークン規格 {#token-standards} - [ERC-20](/developers/docs/standards/tokens/erc-20/) - 投票トークン、ステーキングトークン、通貨トークンなど、代替性トークン (FT) のための標準インタフェースです。 - - [ERC-1363](https://eips.ethereum.org/EIPS/eip-1363) - transfer または transferFrom を受信した後の受信者側におけるコードの実行や、承認後における spender コードをサポートする、ERC-20 トークンのトークンインターフェイスを定義します。 -- [ERC-721](/developers/docs/standards/tokens/erc-721/) - アートや楽曲の所有証明などの非代替性トークン (NFT) のための標準インタフェースです。 - - [ERC-2309](https://eips.ethereum.org/EIPS/eip-2309) - ひとつの NFT あるいは連続するトークン識別子を用いた複数の NFT を作成/転送する際に発行される標準イベント。 - - [ERC-4400](https://eips.ethereum.org/EIPS/eip-4400) - EIP-721 コンシューマーロール向けのインターフェース拡張機能。 - - [ERC-4907](https://eips.ethereum.org/EIPS/eip-4907) - ERC-721 トークンに対して、制限付き許可を伴う時間限定ロールを追加します。 -- [ERC-777](/developers/docs/standards/tokens/erc-777/) - **(推奨せず)** ERC-20 を改善したトークン規格です。 + - [ERC-1363](https://eips.ethereum.org/EIPS/eip-1363) - transferまたはtransferFromを受信した後の受信者側におけるコードの実行や、承認後におけるspenderコードをサポートする、ERC-20トークンのトークンインターフェイスを定義します。 +- [ERC-721](/developers/docs/standards/tokens/erc-721/) - アートや楽曲に対する所有証明など、非代替性トークン (NFT) を対象とする標準的なインタフェースです。 + - [ERC-2309](https://eips.ethereum.org/EIPS/eip-2309) - ひとつのNFTあるいは連続するトークン識別子を用いた複数のNFTを作成/転送する際に発行される標準イベント。 + - [ERC-4400](https://eips.ethereum.org/EIPS/eip-4400) - EIP-721コンシューマーロール向けのインターフェース拡張機能。 + - [ERC-4907](https://eips.ethereum.org/EIPS/eip-4907) - ERC-721トークンに対して、制限付き許可を伴う時間限定ロールを追加します。 +- [ERC-777](/developers/docs/standards/tokens/erc-777/) - **(推奨せず)** ERC-20を改善したトークン規格です。 - [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - 代替可能および非代替性の両方のトークンに用いることができるトークン規格です。 -- [ERC-4626](/developers/docs/standards/tokens/erc-4626/) - 利回り保管庫のトークン化規格で、利回り保管庫として技術パラメータの最適化と統一がされています。 +- [ERC-4626](/developers/docs/standards/tokens/erc-4626/) - 利回りボールト(保管庫)における技術的なパラメータを最適化、統一することを目指して設計された、トークン化ボールト用の規格です。 [トークン規格](/developers/docs/standards/tokens/)に関する詳細情報。 diff --git a/public/content/translations/ja/developers/docs/standards/tokens/erc-1155/index.md b/public/content/translations/ja/developers/docs/standards/tokens/erc-1155/index.md index b6da43d90b8..424aec64f44 100644 --- a/public/content/translations/ja/developers/docs/standards/tokens/erc-1155/index.md +++ b/public/content/translations/ja/developers/docs/standards/tokens/erc-1155/index.md @@ -10,26 +10,26 @@ lang: ja **マルチトークン規格とは何か?** -この規格は、代替性か非代替性かを問わず、あらゆる種類のトークンを表現し、管理できるスマートコントラクトのインターフェイスを開発するというシンプルな発想に基づいて策定されたものです。 このため、ERC-1155 規格に基づくトークンは、[ERC-20](/developers/docs/standards/tokens/erc-20/)および[ERC-721](/developers/docs/standards/tokens/erc-721/)トークンと同一の機能を提供し、この両方を同時に提供することすら可能です。 このため、ERC-20 および ERC-721 の両規格における機能や効率性が向上し、明らかな実装エラーを訂正することができます。 +この規格は、代替性か非代替性かを問わず、あらゆる種類のトークンを表現し、管理できるスマートコントラクトのインターフェイスを開発するというシンプルな発想に基づいて策定されたものです。 このため、ERC-1155規格に基づくトークンは、[ERC-20](/developers/docs/standards/tokens/erc-20/)および[ERC-721](/developers/docs/standards/tokens/erc-721/)トークンと同一の機能を提供し、この両方を同時に提供することすら可能です。 このため、ERC-20およびERC-721の両規格における機能や効率性が向上し、明らかな実装エラーを訂正することができます。 -ERC-1155 トークンの詳細な説明については、[EIP-1155](https://eips.ethereum.org/EIPS/eip-1155)を参照してください。 +ERC-1155トークンの詳細な説明については、[EIP-1155](https://eips.ethereum.org/EIPS/eip-1155)を参照してください。 ## 前提知識 {#prerequisites} このページをよく理解するには、まず[トークン規格](/developers/docs/standards/tokens/)、[ERC-20](/developers/docs/standards/tokens/erc-20/)、[ERC-721](/developers/docs/standards/tokens/erc-721/)について理解しておく必要があります。 -## ERC-1155 の機能と特長: {#body} +## ERC-1155の機能と特長: {#body} -- [バッチ転送](#batch-transfers):1 回の呼び出しで複数のアセットを転送します。 -- [バッチ残高](#batch-balance):1 回の呼び出しで、複数の資産の残高を取得します。 -- [バッチ承認](#batch-approval):ひとつのアドレスに対するすべてのトークンを承認します。 -- [フック](#recieve-hook):トークンのフックを受け取ります。 -- [NFT に対応](#nft-support):供給トークンの数が 1 の場合、NFT として扱います。 -- [安全な転送ルール](#safe-transfer-rule):セキュアな転送のためのルールセットです。 +- [バッチ転送](#batch_transfers):1回の呼び出しで複数のアセットを転送します。 +- [バッチ残高](#batch_balance):1回の呼び出しで、複数の資産の残高を取得します。 +- [バッチ承認](#batch_approval):ひとつのアドレスに対するすべてのトークンを承認します。 +- [フック](#recieve_hook):トークンのフックを受け取ります。 +- [NFTに対応](#nft_support):供給トークンの数が1の場合、NFTとして扱います。 +- [安全な転送ルール](#safe_transfer_rule):セキュアな転送のためのルールセットです。 ### バッチ転送 {#batch-transfers} -この規格におけるバッチ転送は、通常の ERC-20 の場合とほぼ同様です。 まず、通常の ERC-20 規格における`transferFrom`関数を確認しておきましょう: +この規格におけるバッチ転送は、通常のERC-20の場合とほぼ同様です。 まず、通常のERC-20規格における`transferFrom`関数を確認しておきましょう: ```solidity // ERC-20 @@ -45,17 +45,17 @@ function safeBatchTransferFrom( ) external; ``` -ERC-1155 における唯一の違いは、値を配列として渡し、さらに ID の配列も渡す点です。 例えば、`ids=[3, 6, 13]`、`values=[100, 200, 5]`と指定した場合、以下のような転送が実行されます。 +ERC-1155における唯一の違いは、値を配列として渡し、さらにIDの配列も渡す点です。 例えば、`ids=[3, 6, 13]`、`values=[100, 200, 5]`と指定した場合、以下のような転送が実行されます。 -1. id3 では、`_from`から`_to`に 100 トークンを転送。 -2. id6 では、`_from`から`_to`に 200 トークンを転送。 -3. id13 では、`_from`から`_to`に i5 トークンを転送。 +1. id3では、`_from`から`_to`に100トークンを転送。 +2. id6では、`_from`から`_to`に200トークンを転送。 +3. id13では、`_from`から`_to`にi5トークンを転送。 -ERC-1155 では、`transfer`は存在せず、`transferFrom`のみ利用できます。 通常の`transfer`のように使用するには、 関数を呼び出すアドレスを from address として設定すればよいです。 +ERC-1155では、`transfer`は存在せず、`transferFrom`のみ利用できます。 通常の`transfer`のように使用するには、 関数を呼び出すアドレスをfrom addressとして設定すればよいです。 ### バッチ残高 {#batch-balance} -同様に、ERC-20 における`balanceOf`の呼び出しも、バッチ処理に対応した機能が追加されています。 確認のために、まず ERC-20 の関数を見ておきましょう: +同様に、ERC-20における`balanceOf`の呼び出しも、バッチ処理に対応した機能が追加されています。 確認のために、まずERC-20の関数を見ておきましょう: ```solidity // ERC-20 @@ -68,7 +68,7 @@ function balanceOfBatch( ) external view returns (uint256[] memory); ``` -残高の呼び出しがよりシンプルになり、1 回の呼び出しで複数の残高を取得できるようになりました。 所有者の配列と、その後にトークン ID の配列を指定すればよいです。 +残高の呼び出しがよりシンプルになり、1回の呼び出しで複数の残高を取得できるようになりました。 所有者の配列と、その後にトークンIDの配列を指定すればよいです。 例えば、`_ids=[3, 6, 13]`と`_owners=[0xbeef..., 0x1337..., 0x111111...]`を与えると、戻り値は次のようになります: @@ -95,9 +95,9 @@ function isApprovedForAll( ) external view returns (bool); ``` -承認プロセスは、ERC-20 とは若干異なります。 特定の金額を承認するのではなく、`setApprovalForAll`の関数を通じて承認/非承認を決定するオペレーターを指定します。 +承認プロセスは、ERC-20とは若干異なります。 特定の金額を承認するのではなく、`setApprovalForAll`の関数を通じて承認/非承認を決定するオペレーターを指定します。 -`isApprovedForAll`の関数を使って、現在の承認状態を読み込むことができます。 推測されたとおり、これは All or Nothing 型の操作です。 承認するトークンの数やトークンの種類を指定することはできません。 +`isApprovedForAll`の関数を使って、現在の承認状態を読み込むことができます。 推測されたとおり、これはAll or Nothing型の操作です。 承認するトークンの数やトークンの種類を指定することはできません。 これは、シンプルさを実現するために敢えて採用された設計です。 ひとつのアドレスに対し、すべて承認することだけが可能です。 @@ -113,17 +113,17 @@ function onERC1155BatchReceived( ) external returns(bytes4); ``` -ERC-1155 は、[EIP-165](https://eips.ethereum.org/EIPS/eip-165)に対応しているため、スマートコントラクトに対する受信フックのみ対応しています。 このフック関数は、合い言葉として事前に定義された bytes4 の値(以下の形式を持つ)を返す必要があります。 +ERC-1155は、[EIP-165](https://eips.ethereum.org/EIPS/eip-165)に対応しているため、スマートコントラクトに対する受信フックのみ対応しています。 このフック関数は、合い言葉として事前に定義されたbytes4の値(以下の形式を持つ)を返す必要があります。 ```solidity bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) ``` -受信側のコントラクトがこの値を返すと、コントラクトがこの転送を受け入れ、ERC-1155 のトークンに対する処理方法を理解していると見なされます。 これにより、コントラクト内部で未処理のトークンが溜まっていくことがなくなります! +受信側のコントラクトがこの値を返すと、コントラクトがこの転送を受け入れ、ERC-1155のトークンに対する処理方法を理解していると見なされます。 これにより、コントラクト内部で未処理のトークンが溜まっていくことがなくなります! -### NFT のサポート {#nft-support} +### NFTのサポート {#nft-support} -供給されるトークンの数が 1 である場合、このトークンは事実上非代替性トークン(NFT)だと言えます。 ERC-721 規格と同じように、メタデータの URL を定義することが可能です。 この URL は、クライアントによる読み取り/変更が可能です。[こちら](https://eips.ethereum.org/EIPS/eip-1155#metadata)をご覧ください。 +供給されるトークンの数が1である場合、このトークンは事実上非代替性トークン(NFT)だと言えます。 ERC-721規格と同じように、メタデータのURLを定義することが可能です。 このURLは、クライアントによる読み取り/変更が可能です。[こちら](https://eips.ethereum.org/EIPS/eip-1155#metadata)をご覧ください。 ### 安全転送ルール {#safe-transfer-rule} @@ -131,7 +131,7 @@ bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],byt 1. 発信者は、`_from`のトークンを支払う行為に対して承認を受けているか、`_from`と同一でなければなりません。 2. 以下に該当する場合、転送の呼び出しは取り消されます: - 1. `_to`のアドレスが 0 である。 + 1. `_to`のアドレスが0である。 2. `_ids`の長さが`_values`の長さと一致しない。 3. `_ids`におけるトークン(複数可)の保有者(複数可)における残高(複数可)のいずれかが、受信者に送信された`_values`における当該の額(複数可)よりも少ない。 4. その他のエラーが発生した。 @@ -141,6 +141,6 @@ _注記_:フックを含むすべてのバッチ関数は、バッチ処理で ## 参考文献 {#further-reading} - [ERC-1155:マルチトークン規格](https://eips.ethereum.org/EIPS/eip-1155) -- [ERC-1155:Openzeppelin のドキュメンテーション](https://docs.openzeppelin.com/contracts/3.x/erc1155) -- [ERC-1155:GitHub リポジトリ](https://github.com/enjin/erc-1155) +- [ERC-1155:Openzeppelinのドキュメンテーション](https://docs.openzeppelin.com/contracts/3.x/erc1155) +- [ERC-1155:Githubリポジトリ](https://github.com/enjin/erc-1155) - [Alchemy NFT API](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) diff --git a/public/content/translations/ja/developers/docs/standards/tokens/erc-20/index.md b/public/content/translations/ja/developers/docs/standards/tokens/erc-20/index.md index fff0108d07a..e1bf5524ac2 100644 --- a/public/content/translations/ja/developers/docs/standards/tokens/erc-20/index.md +++ b/public/content/translations/ja/developers/docs/standards/tokens/erc-20/index.md @@ -15,14 +15,14 @@ lang: ja - 宝くじの券。 - 企業の株式などの金融資産。 - 米ドルをはじめとする法定通貨。 -- 金(ゴールド)1 オンス。 +- 金(ゴールド)1オンス。 - 等々。 -イーサリアムにおいてこれほどの威力を持つ機能に対しては、必然的に堅牢な規格が必要です。 これこそ、ERC-20 規格が果たすべき役割なのです! この規格を用いることで、イーサリアム外の製品やサービスと相互運用できるトークンアプリを構築することが可能になります。 +イーサリアムにおいてこれほどの威力を持つ機能に対しては、必然的に堅牢な規格が必要です。 これこそ、ERC-20規格が果たすべき役割なのです! この規格を用いることで、イーサリアム外の製品やサービスと相互運用できるトークンアプリを構築することが可能になります。 -**ERC-20 とは何か?** +**ERC-20とは何か?** -ERC-20 規格は、代替性トークンを扱うための標準規格です。つまりこの規格では、ひとつのトークンが、その種類および値において他のトークンとまったく同じであるというプロパティを持たせることができます。 例えば、ERC-20 トークンは ETH とまったく同様に動作します。つまり、1 トークンは、現在および将来において常に、他のひとつのトークンと同等になります。 +ERC-20規格は、代替性トークンを扱うための標準規格です。つまりこの規格では、ひとつのトークンが、その種類および値において他のトークンとまったく同じであるというプロパティを持たせることができます。 例えば、ERC-20トークンはETHとまったく同様に動作します。つまり、1トークンは、現在および将来において常に、他のひとつのトークンと同等になります。 ## 前提知識 {#prerequisites} @@ -32,16 +32,16 @@ ERC-20 規格は、代替性トークンを扱うための標準規格です。 ## 規格の概要 {#body} -ERC-20(Ethereum Request for Comments 20)は、スマートコントラクト内にトークン API として実装できるトークン規格として、ファビアン・ヴォゲルステラー氏により 2015 年 11 月に提案されました。 +ERC-20(Ethereum Request for Comments 20)は、スマートコントラクト内にトークンAPIとして実装できるトークン規格として、ファビアン・ヴォゲルステラー氏により2015年11月に提案されました。 -ERC-20 は、以下のような機能を提供します: +ERC-20は、以下のような機能を提供します: - トークンを、ひとつのアカウントから他のアカウントに転送する。 - アカウントにおける現在のトークン残高を取得する。 - ネットワーク上で利用可能なトークンの総供給量を取得する。 - 特定のアカウントにおけるトークンにつき、一定額をサードパーティのアカウントが使用できるか否かを承認する。 -以下のメソッドおよびイベントを実装しているスマートコントラクトは ERC-20 トークンコントラクトと呼ぶことができ、デプロイされると、イーサリアム上で発行されたトークンの状況を追跡する責任を負います。 +以下のメソッドおよびイベントを実装しているスマートコントラクトはERC-20トークンコントラクトと呼ぶことができ、デプロイされると、イーサリアム上で発行されたトークンの状況を追跡する責任を負います。 [EIP-20](https://eips.ethereum.org/EIPS/eip-20)から引用: @@ -59,7 +59,7 @@ function approve(address _spender, uint256 _value) public returns (bool success) function allowance(address _owner, address _spender) public view returns (uint256 remaining) ``` -### イベント {#events} +#### イベント {#events} ```solidity event Transfer(address indexed _from, address indexed _to, uint256 _value) @@ -68,11 +68,11 @@ event Approval(address indexed _owner, address indexed _spender, uint256 _value) ### 実例: {#web3py-example} -イーサリアムの ERC-20 トークンコントラクトのコードを詳しく見ることで、これらの規格がイーサリアムのシンプルさを保証する上でどれだけ重要なのかを理解しておきましょう。 ERC-20 トークンを扱うインターフェイスを開発するには、当該コントラクトのアプリケーション・バイナリー・インターフェイス(ABI)を用いればよいです。 理解しやすいように、以下では簡略化した ABI を用いています。 +イーサリアムのERC-20トークンコントラクトのコードを詳しく見ることで、これらの規格がイーサリアムのシンプルさを保証する上でどれだけ重要なのかを理解しておきましょう。 ERC-20トークンを扱うインターフェイスを開発するには、当該コントラクトのアプリケーション・バイナリー・インターフェイス(ABI)を用いればよいです。 理解しやすいように、以下では簡略化したABIを用いています。 #### Web3.py の実例: {#web3py-example} -まず、 Python のライブラリから[Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation)をインストール済みであることを確認してください: +まず、 Pythonのライブラリから[Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation)をインストール済みであることを確認してください: ``` pip install web3 @@ -143,6 +143,7 @@ print("Addr Balance:", addr_balance) ## 参考文献 {#further-reading} -- [EIP-20:ERC-20 トークン規格](https://eips.ethereum.org/EIPS/eip-20) +- [EIP-20:ERC-20トークン規格](https://eips.ethereum.org/EIPS/eip-20) - [OpenZeppelin - トークン](https://docs.openzeppelin.com/contracts/3.x/tokens#ERC20) -- [OpenZeppelin - ERC-20 の実装](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) +- [OpenZeppelin - ERC-20の実装](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) +- [Alchemy - SolidityにおけるERC20トークンのガイド](https://www.alchemy.com/overviews/erc20-solidity) diff --git a/public/content/translations/ja/developers/docs/standards/tokens/erc-4626/index.md b/public/content/translations/ja/developers/docs/standards/tokens/erc-4626/index.md index d3af1014cc6..159827c6bff 100644 --- a/public/content/translations/ja/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/translations/ja/developers/docs/standards/tokens/erc-4626/index.md @@ -6,21 +6,21 @@ lang: ja ## はじめに {#introduction} -ERC-4626 は、利回りボールトの技術的なパラメータを最適化し、統一するための規格です。 この規格は、ボールトに含まれる単一の ERC-20 トークンをどれだけ所有しているかを示すトークン化利回りボールトを作成するための標準 API を提供します。 ERC-4626 はさらに、ERC-20 に基づくトークン化ボールトのオプション拡張機能として、トークンの預入/引出および残高の読み取りといった基本的な機能を提供します。 +ERC-4626は、利回りボールトの技術的なパラメータを最適化し、統一するための規格です。 この規格は、ボールトに含まれる単一のERC-20トークンをどれだけ所有しているかを示すトークン化利回りボールトを作成するための標準APIを提供します。 ERC-4626はさらに、ERC-20に基づくトークン化ボールトのオプション拡張機能として、トークンの預入/引出および残高の読み取りといった基本的な機能を提供します。 -**利回りボールトにおける ERC-4626 の役割** +**利回りボールトにおけるERC-4626の役割** レンディング市場、アグリゲータ、および内部で利回りが得られるトークンは、ユーザーが様々な戦略を駆使して暗号資産トークンから最適な利回りを獲得する上で有益です。 これらの戦略はそれぞれがわずかな違いを持つため、エラーが発生しやすい場合や開発リソースを浪費してしまう場合があります。 -利回りボールトのデベロッパーは、ERC-4626 を活用することで、より一貫性が高く堅牢な実装パターンを実現できるため、アプリケーションとの統合にかかる作業を軽減し、様々なアプリケーションにおいて利回りを獲得できるようにするための別途の取り組みを削減することができます。 +利回りボールトのデベロッパーは、ERC-4626を活用することで、より一貫性が高く堅牢な実装パターンを実現できるため、アプリケーションとの統合にかかる作業を軽減し、様々なアプリケーションにおいて利回りを獲得できるようにするための別途の取り組みを削減することができます。 -ERC-4626 トークンの詳細については、[EIP-4626](https://eips.ethereum.org/EIPS/eip-4626)をご覧ください。 +ERC-4626トークンの詳細については、[EIP-4626](https://eips.ethereum.org/EIPS/eip-4626)をご覧ください。 ## 前提知識 {#prerequisites} この記事をよく理解するには、まず[トークン規格](/developers/docs/standards/tokens/)および[ERC-20](/developers/docs/standards/tokens/erc-20/)に目を通すことをおすすめします。 -## ERC-4626 の機能と特長: {#body} +## ERC-4626の機能と特長: {#body} ### メソッド {#methods} @@ -62,7 +62,7 @@ function convertToAssets(uint256 shares) public view returns (uint256 assets) function maxDeposit(address receiver) public view returns (uint256) ``` -この関数は、`receiver`が 1 回の[`deposit`](#deposit)呼び出しで入金できる原資産の上限を返します。 +この関数は、`receiver`が1回の[`deposit`](#deposit)呼び出しで入金できる原資産の上限を返します。 #### previewDeposit {#previewdeposit} @@ -110,7 +110,7 @@ function mint(uint256 shares, address receiver) public returns (uint256 assets) function maxWithdraw(address owner) public view returns (uint256) ``` -この関数は、1 回の[`withdraw`](#withdraw)呼び出しにより、`owner`残高から引き出し可能な原資産アセットの上限を返します。 +この関数は、1回の[`withdraw`](#withdraw)呼び出しにより、`owner`残高から引き出し可能な原資産アセットの上限を返します。 #### previewWithdraw {#previewwithdraw} @@ -204,4 +204,4 @@ event Withdraw( ## 参考文献 {#further-reading} - [EIP-4626: トークン化ボールト規格](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626: GitHub リポジトリ](https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol) +- [ERC-4626: GitHubリポジトリ](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) diff --git a/public/content/translations/ja/developers/docs/standards/tokens/erc-721/index.md b/public/content/translations/ja/developers/docs/standards/tokens/erc-721/index.md index b832109820d..6747d2bdcad 100644 --- a/public/content/translations/ja/developers/docs/standards/tokens/erc-721/index.md +++ b/public/content/translations/ja/developers/docs/standards/tokens/erc-721/index.md @@ -8,13 +8,13 @@ lang: ja **非代替性トークン(NFT)とは** -非代替性トークン(NFT)は、固有の方法で、人や物を識別するために使われます。 この種類のトークンは、収集用のアイテム、アクセスキー、宝くじ、コンサートやスポーツ試合におけるシート番号付チケットなどを発行するプラットフォームに最も適しています。 この特殊なタイプのトークンはすばらしい可能性を秘めているため、専用の規格として ERC-721 を策定しました。 +非代替性トークン(NFT)は、固有の方法で、人や物を識別するために使われます。 この種類のトークンは、収集用のアイテム、アクセスキー、宝くじ、コンサートやスポーツ試合におけるシート番号付チケットなどを発行するプラットフォームに最も適しています。 この特殊なタイプのトークンはすばらしい可能性を秘めているため、専用の規格としてERC-721を策定しました。 -**ERC-721 とは何か?** +**ERC-721とは何か?** -ERC-721 は、NFT に対する標準規格です。つまり、この種類のトークンはそれぞれがユニークな存在であり、発行日、希少性、および外見などの点で、同一のスマートコントラクトで発行される他のトークンとは異なる値を持つことができます。 外見が違うとはどういう意味でしょう? +ERC-721は、NFTに対する標準規格です。つまり、この種類のトークンはそれぞれがユニークな存在であり、発行日、希少性、および外見などの点で、同一のスマートコントラクトで発行される他のトークンとは異なる値を持つことができます。 外見が違うとはどういう意味でしょう? -はい! すべての NFT は、`tokenid`と呼ばれる`unit256`変数を持つため、ERC-721 を伴うコントラクトでは、`contract adress, unit 256 tokenid`のペアはグローバルに固有でなければなりません。 その上で、各 Dapp では、`tokenid`の入力から、ゾンビ、武器、スキル、あるいは可愛い子猫といったクールな画像を出力する「コンバーター」を搭載することができます。 +はい! すべてのNFTは、`tokenid`と呼ばれる`unit256`変数を持つため、ERC-721を伴うコントラクトでは、`contract adress, unit 256 tokenid`のペアはグローバルに固有でなければなりません。 その上で、各Dappでは、`tokenid`の入力から、ゾンビ、武器、スキル、あるいは可愛い子猫といったクールな画像を出力する「コンバーター」を搭載することができます。 ## 前提知識 {#prerequisites} @@ -24,11 +24,11 @@ ERC-721 は、NFT に対する標準規格です。つまり、この種類の ## 規格の概要 {#body} -ERC-721(Ethereum Request for Comments 721)は、ウィリアム・エントリケン氏、ディーター・シャーリー氏、ジェイコブ・エバンス氏、ナスタシア・サックス氏により 2018 年 1 月に提案された、スマートコントラクト内で非代替性トークン(NFT)を取り扱うための API を実装するための規格です。 +ERC-721(Ethereum Request for Comments 721)は、ウィリアム・エントリケン氏、ディーター・シャーリー氏、ジェイコブ・エバンス氏、ナスタシア・サックス氏により2018年1月に提案された、スマートコントラクト内で非代替性トークン(NFT)を取り扱うためのAPIを実装するための規格です。 この規格により、複数アカウント間のトークンの転送、アカウントにおける現在のトークン残高の取得、トークン所有者の取得、およびネットワーク上で供給されているトークン総数の取得といった機能が提供されます。 さらに、特定のアカウントが所有するトークン残高のうち、サードパーティのアカウントが転送可能な上限の設定を承認するなど、その他の機能も提供されています。 -以下のメソッドおよびイベントを実装したスマートコントラクトは ERC-721 非代替性トークン(NFT)コントラクトと呼ばれ、デプロイされると、イーサリアム上で作成されたトークンの状況を追跡する機能を提供します。 +以下のメソッドおよびイベントを実装したスマートコントラクトはERC-721非代替性トークン(NFT)コントラクトと呼ばれ、デプロイされると、イーサリアム上で作成されたトークンの状況を追跡する機能を提供します。 [EIP-721](https://eips.ethereum.org/EIPS/eip-721)から引用: @@ -56,11 +56,11 @@ ERC-721(Ethereum Request for Comments 721)は、ウィリアム・エント ### 例 {#web3py-example} -イーサリアムネットワークにおける ERC-721 トークンコントラクトを詳しく検討することで、ネットワークをシンプルにする上でこれらの規格がいかに重要であるかが理解できるでしょう。 ERC-721 トークンを対象とするインターフェイスを開発するには、コントラクトのアブリケーション・バイナリ・インターフェイス(ABI)があれば十分です。 これからつまずかないように簡略化された ABI を使用した例をお見せします。 +イーサリアムネットワークにおけるERC-721トークンコントラクトを詳しく検討することで、ネットワークをシンプルにする上でこれらの規格がいかに重要であるかが理解できるでしょう。 ERC-721トークンを対象とするインターフェイスを開発するには、コントラクトのアブリケーション・バイナリ・インターフェイス(ABI)があれば十分です。 これからつまずかないように簡略化されたABIを使用した例をお見せします。 -#### Web3.py の例 {#web3py-example} +#### Web3.pyの例 {#web3py-example} -最初に、 Python ライブラリの[Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation)がインストールされていることを確認してください: +最初に、 Pythonライブラリの[Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation)がインストールされていることを確認してください: ``` pip install web3 @@ -78,7 +78,7 @@ ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties Sales Auction # This is a simplified Contract Application Binary Interface (ABI) of an ERC-721 NFT Contract. -# これらのメソッドのみ提示します: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() +# It will expose only the methods: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() simplified_abi = [ { 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}], @@ -127,7 +127,7 @@ ck_extra_abi = [ } ] -ck_contract = w3.eth.contract(address=w3.toChecksumAddress(ck_token_addr), abi=simplified_abi+ck_extra_abi) +ck_contract = w3.eth.contract(address=w3.to_checksum_address(ck_token_addr), abi=simplified_abi+ck_extra_abi) name = ck_contract.functions.name().call() symbol = ck_contract.functions.symbol().call() kitties_auctions = ck_contract.functions.balanceOf(acc_address).call() @@ -136,7 +136,7 @@ print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}") pregnant_kitties = ck_contract.functions.pregnantKitties().call() print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}") -# Transfer Event ABIを使用して、転送されたKittiesの情報を取得する。 +# Using the Transfer Event ABI to get info about transferred Kitties. tx_event_abi = { 'anonymous': False, 'inputs': [ @@ -148,28 +148,28 @@ tx_event_abi = { } # We need the event's signature to filter the logs -event_signature = w3.sha3(text="Transfer(address,address,uint256)").hex() +event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex() -logs = w3.eth.getLogs({ - "fromBlock": w3.eth.blockNumber - 120, - "address": w3.toChecksumAddress(ck_token_addr), +logs = w3.eth.get_logs({ + "fromBlock": w3.eth.block_number - 120, + "address": w3.to_checksum_address(ck_token_addr), "topics": [event_signature] }) # Notes: -# - 120 blocks is the max range for CloudFlare Provider +# - Increase the number of blocks up from 120 if no Transfer event is returned. # - If you didn't find any Transfer event you can also try to get a tokenId at: # https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events # Click to expand the event's logs and copy its "tokenId" argument - recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs] -kitty_id = recent_tx[0]['tokenId'] # Paste the "tokenId" here from the link above -is_pregnant = ck_contract.functions.isPregnant(kitty_id).call() -print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}") +if recent_tx: + kitty_id = recent_tx[0]['tokenId'] # Paste the "tokenId" here from the link above + is_pregnant = ck_contract.functions.isPregnant(kitty_id).call() + print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}") ``` -CryptoKitties のコントラクトには、標準的なイベント以外にもいくつか興味深いイベントが含まれています。 +CryptoKittiesのコントラクトには、標準的なイベント以外にもいくつか興味深いイベントが含まれています。 特に、`Pregnant`と `Birth`のイベントについて見てみましょう。 @@ -200,15 +200,15 @@ ck_extra_events_abi = [ # We need the event's signature to filter the logs ck_event_signatures = [ - w3.sha3(text="Pregnant(address,uint256,uint256,uint256)").hex(), - w3.sha3(text="Birth(address,uint256,uint256,uint256,uint256)").hex(), + w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(), + w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(), ] # Here is a Pregnant Event: # - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog -pregnant_logs = w3.eth.getLogs({ - "fromBlock": w3.eth.blockNumber - 120, - "address": w3.toChecksumAddress(ck_token_addr), +pregnant_logs = w3.eth.get_logs({ + "fromBlock": w3.eth.block_number - 120, + "address": w3.to_checksum_address(ck_token_addr), "topics": [ck_event_signatures[0]] }) @@ -216,29 +216,29 @@ recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args" # Here is a Birth Event: # - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a -birth_logs = w3.eth.getLogs({ - "fromBlock": w3.eth.blockNumber - 120, - "address": w3.toChecksumAddress(ck_token_addr), +birth_logs = w3.eth.get_logs({ + "fromBlock": w3.eth.block_number - 120, + "address": w3.to_checksum_address(ck_token_addr), "topics": [ck_event_signatures[1]] }) recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs] ``` -## 人気が高い NFT の実例: {#popular-nfts} +## 人気が高いNFTの実例: {#popular-nfts} -- [イーサスキャン NFT トラッカー](https://etherscan.io/tokens-nft)は、イーサリアムにおける NFT の取引量ランキングです。 +- [イーサスキャンNFTトラッカー](https://etherscan.io/tokens-nft)は、イーサリアムにおけるNFTの取引量ランキングです。 - [クリプトキティーズ](https://www.cryptokitties.co/)は、クリプトキティーと呼ばれる愛らしい生物を育て、収集するゲームです。 - [ソラーレ](https://sorare.com/)は、グローバルなファンタジーフットボールゲームで、限定アイテムの収集、チームの管理、および試合を通じて賞品を獲得できます。 - [ ENS(イーサリアムネームサービス)](https://ens.domains/)は、安全かつ分散型の方法により、ブロックチェーン内外のリソースにシンプルかつ人間が読み取り可能な名称を付与できるサービスです。 -- [POAP](https://poap.xyz)は、イベント参加や特定アクションの実行を行ったユーザーに対し、無料で NFT を提供できます。 POAP は自由に作成し、配布できます。 +- [POAP](https://poap.xyz)は、イベント参加や特定アクションの実行を行ったユーザーに対し、無料でNFTを提供できます。 POAPは自由に作成し、配布できます。 - [アンストッパブル・ドメインズ](https://unstoppabledomains.com/)は、 サンフランシスコに本社を置く企業で、ブロックチェーン上のドメイン作成業務を行っています。 ブロックチェーン上のドメインは、暗号通貨のアドレスを人間が読み取り可能な名称に置き換えるもので、ウェブサイトに検閲耐性を持たせるために使用できます。 -- [ゴッズ・アンチェインド・カード](https://godsunchained.com/)は、イーサリアムブロックチェーン上の TCG で、NFT を使ってゲーム内アセットに真の所有権を提供しています。 -- [ボアード・エイプ・ヨット・クラブ](https://boredapeyachtclub.com)は、10,000 個の固有 NFT のコレクションであると同時にいわゆるレアな美術作品であり、同クラブの会員証であるトークンでもあります。会員は、初回特典に加えて、コミュニティ活動を行うことでより多くの特典を受け取ることができます。 +- [ゴッズ・アンチェインド・カード](https://godsunchained.com/)は、イーサリアムブロックチェーン上のTCGで、NFTを使ってゲーム内アセットに真の所有権を提供しています。 +- [ボアード・エイプ・ヨット・クラブ](https://boredapeyachtclub.com)は、10,000個の固有NFTのコレクションであると同時にいわゆるレアな美術作品であり、同クラブの会員証であるトークンでもあります。会員は、初回特典に加えて、コミュニティ活動を行うことでより多くの特典を受け取ることができます。 ## 参考文献 {#further-reading} - [EIP-721:ERC-721 非代替性トークン(NFT)規格](https://eips.ethereum.org/EIPS/eip-721) -- [OpenZeppelin - ERC-721 のドキュメンテーション](https://docs.openzeppelin.com/contracts/3.x/erc721) -- [OpenZeppelin - ERC-721 の実装](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) -- [Alchemy の NFT API](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) +- [OpenZeppelin - ERC-721のドキュメンテーション](https://docs.openzeppelin.com/contracts/3.x/erc721) +- [OpenZeppelin - ERC-721の実装](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) +- [AlchemyのNFT API](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) diff --git a/public/content/translations/ja/developers/docs/standards/tokens/erc-777/index.md b/public/content/translations/ja/developers/docs/standards/tokens/erc-777/index.md index cc7c39678d6..0a9bcf1217f 100644 --- a/public/content/translations/ja/developers/docs/standards/tokens/erc-777/index.md +++ b/public/content/translations/ja/developers/docs/standards/tokens/erc-777/index.md @@ -6,19 +6,19 @@ lang: ja ## 警告 {#warning} -**ERC-777 は、[さまざまな手法の攻撃を受けやすいため](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2620)、適切な実装が困難です。 このため、[ERC-20](/developers/docs/standards/tokens/erc-20/)を使用することをおすすめします。**本ページは、歴史的なアーカイブとして掲載するものです。 +**ERC-777は、[さまざまな手法の攻撃を受けやすいため](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2620)、適切な実装が困難です。 このため、[ERC-20](/developers/docs/standards/tokens/erc-20/)を使用することをおすすめします。**本ページは、歴史的なアーカイブとして掲載するものです。 ## はじめに {#introduction} -ERC-777 は、既存の[ERC-20](/developers/docs/standards/tokens/erc-20/)規格を改善した代替性トークンの規格です。 +ERC-777は、既存の[ERC-20](/developers/docs/standards/tokens/erc-20/)規格を改善した代替性トークンの規格です。 ## 事前に必要な環境 {#prerequisites} 本ページの内容をよく理解するために、まず[ERC-20](/developers/docs/standards/tokens/erc-20/)に目を通すことをおすすめします。 -## ERC-777 は、ERC-20 に対してどのような改善を提案しているか? {#-erc-777-vs-erc-20} +## ERC-777は、ERC-20に対してどのような改善を提案しているか? {#-erc-777-vs-erc-20} -ERC-777 は、ERC-20 に対して以下の改善を提案します。 +ERC-777は、ERC-20に対して以下の改善を提案します。 ### フック {#hooks} @@ -29,16 +29,16 @@ ERC-777 は、ERC-20 に対して以下の改善を提案します。 #### フックの利点: {#why-are-hooks-great} 1. フックを用いることで、トークンをコントラクトに送信する作業とコントラクトに通知する作業をひとつのトランザクションにまとめることができます。[ERC-20](https://eips.ethereum.org/EIPS/eip-20)の場合、これには二重コール(`approve`/`transferFrom`)が必要になります。 -2. 登録フックを持たないコントラクトは、ERC-777 を利用できません。 受信コントラクトがフックを登録していない場合、送信コントラクトはトランザクションを中止します。 これにより、ERC-777 非互換のスマートコントラクトに対する誤転送を防ぐことができます。 +2. 登録フックを持たないコントラクトは、ERC-777を利用できません。 受信コントラクトがフックを登録していない場合、送信コントラクトはトランザクションを中止します。 これにより、ERC-777非互換のスマートコントラクトに対する誤転送を防ぐことができます。 3. フックは、トランザクションを却下することができます。 ### 通貨の最小単位 {#decimals} -ERC-777 はさらに、ERC-20 における`通貨の最小単位`に関する混乱を解消します。 この混乱を解消することで、デベロッパーの利用体験が向上します。 +ERC-777はさらに、ERC-20における`通貨の最小単位`に関する混乱を解消します。 この混乱を解消することで、デベロッパーの利用体験が向上します。 -### ERC-20 との後方互換性 {#backwards-compatibility-with-erc-20} +### ERC-20との後方互換性 {#backwards-compatibility-with-erc-20} -ERC-777 コントラクトとの間は、ERC-20 コントラクトに対する場合と同様のやりとりが可能です。 +ERC-777コントラクトとの間は、ERC-20コントラクトに対する場合と同様のやりとりが可能です。 ## 参考文献 {#further-reading} diff --git a/public/content/translations/ja/developers/docs/standards/tokens/index.md b/public/content/translations/ja/developers/docs/standards/tokens/index.md index b7ee386d2ed..882225b01a7 100644 --- a/public/content/translations/ja/developers/docs/standards/tokens/index.md +++ b/public/content/translations/ja/developers/docs/standards/tokens/index.md @@ -21,16 +21,18 @@ incomplete: true - [ERC-20](/developers/docs/standards/tokens/erc-20/) - 投票用やステーキング用のトークンあるいは仮想通貨など、代替性を持つ(相互に代替可能な)トークンを対象とする標準的なインターフェイスです。 - [ERC-721](/developers/docs/standards/tokens/erc-721/) - アートや楽曲に対する所有証明など、非代替性トークン (NFT) を対象とする標準的なインタフェースです。 - [ERC-777](/developers/docs/standards/tokens/erc-777/) - 通常のトークンに対して、トランザクションのプライバシー向上のためにミキサーコントラクトあるいは秘密鍵を紛失したユーザーを救済できる緊急復旧などの機能を追加できる規格です。 -- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - より効率的な取引や、トランザクションのバンドル化によるコスト軽減を実現できる規格です。 ユーティリティトークン($BNBや$BAT など)および非代替性トークン(CryptoPunks など)の両方に使用できます。 +- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - より効率的な取引や、トランザクションのバンドル化によるコスト軽減を実現できる規格です。 ユーティリティトークン($BNBや$BATなど)および非代替性トークン(CryptoPunksなど)の両方に使用できます。 - [ERC-4626](/developers/docs/standards/tokens/erc-4626/) - 利回りボールト(保管庫)における技術的なパラメータを最適化、統一することを目指して設計された、トークン化ボールト用の規格です。 +[ERC](https://eips.ethereum.org/erc)提案の全リスト + ## 参考文献 {#further-reading} -_役に立つコミュニティリソースをご存知の場合は、 このページを編集して追加してください。_ +_役に立ったコミュニティリソースがあれば、 ぜひこのページに追加してください。_ ## 関連トピック {#related-tutorials} - [トークンの統合作業に関するチェックリスト](/developers/tutorials/token-integration-checklist/) _– トークンのやりとりを統合する際に検討すべき事項が列挙されています。_ -- [ERC20 トークンを利用するスマートコントラクトを理解する](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _- イーサリアムのテストネットワーク上ではじめてスマートコントラクトをデプロイする初心者向けの入門ガイドです。_ -- [Solidity のスマートコントラクトで ERC20 トークンを転送、承認する方法](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– Solidity 言語を用いてトークンのやりとりを行うスマートコントラクトを使用する方法について説明しています。_ -- [ERC721 マーケットの実装に関するハウツーガイド](/developers/tutorials/how-to-implement-an-erc721-market/) _– 分散型の掲示板でトークン化アイテムを出品する方法について説明しています。_ +- [ERC20トークンを利用するスマートコントラクトを理解する](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _- イーサリアムのテストネットワーク上ではじめてスマートコントラクトをデプロイする初心者向けの入門ガイドです。_ +- [SolidityのスマートコントラクトでERC20トークンを転送、承認する方法](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– Solidity言語を用いてトークンのやりとりを行うスマートコントラクトを使用する方法について説明しています。_ +- [ERC721マーケットの実装に関するハウツーガイド](/developers/tutorials/how-to-implement-an-erc721-market/) _– 分散型の掲示板でトークン化アイテムを出品する方法について説明しています。_ diff --git a/public/content/translations/ja/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/ja/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 2d925b2d5c5..66ad2b2d55f 100644 --- a/public/content/translations/ja/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/ja/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -16,18 +16,18 @@ sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt- ## 前提条件(ソフト) {#soft-prerequisites} -この投稿は、幅広いデベロッパーに参照していただきたいと考えています。 [ Python ツール](/developers/docs/programming-languages/python/)を使用しますが、これらは概念を伝える手段にすぎませんので、Python デベロッパーでなくても問題ありません。 しかし、ここでは皆さんが Python についての知識があることを前提に話を進めますので、すぐにイーサリアムに特化した部分の説明に移ります。 +この投稿は、幅広いデベロッパーに参照していただきたいと考えています。 [ Pythonツール](/developers/docs/programming-languages/python/)を使用しますが、これらは概念を伝える手段にすぎませんので、Pythonデベロッパーでなくても問題ありません。 しかし、ここでは皆さんがPythonについての知識があることを前提に話を進めますので、すぐにイーサリアムに特化した部分の説明に移ります。 前提知識: -- ターミナルを使用できる -- Python で数行のコードを書いたことがある -- Python バージョン 3.6 以降がマシンにインストールされている([仮想環境](https://realpython.com/effective-python-environment/#virtual-environments)の使用を強くお勧めします) -- Python のパッケージインストーラーである`pip`を使用したことがある これらのうちあてはまらないものがある方、あるいはこの記事にあるコードを実行することがない方でも十分に理解できる内容です。 +- ターミナルを操作できる。 +- Pythonで数行のコードを書いたことがある。 +- Pythonバージョン3.6以降がマシンにインストールされている([仮想環境](https://realpython.com/effective-python-environment/#virtual-environments)の使用を強くお勧めします)。 +- Pythonのパッケージインストーラーである`pip`を使用したことがある。 これらのうちあてはまらないものがある方、あるいはこの記事にあるコードを実行することがない方でも十分に理解できる内容です。 ## ブロックチェーンについて {#blockchains-briefly} -イーサリアムを説明する方法はたくさんありますが、その中心となるのはブロックチェーンです。 ブロックチェーンは一連のブロックで構成されています。まずはその説明から始めましょう。 簡単に言うと、イーサリアムブロックチェーンの各ブロックは、数値などのメタデータとトランザクションのリストにすぎません。 JSON 形式では、次のようになります。 +イーサリアムを説明する方法はたくさんありますが、その中心となるのはブロックチェーンです。 ブロックチェーンは一連のブロックで構成されています。まずはその説明から始めましょう。 簡単に言うと、イーサリアムブロックチェーンの各ブロックは、数値などのメタデータとトランザクションのリストにすぎません。 JSON形式では、次のようになります。 ```json { @@ -41,7 +41,7 @@ sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt- 各[ブロック](/developers/docs/blocks/)は、その前のブロックを参照します。`parentHash`は、単に前のブロックのハッシュ値です。 -注: イーサリアムはハッシュ関数を定期的に使用して、固定サイズの値(ハッシュ)を生成します。 イーサリアムではハッシュ値が重要な役割を果たしますが、今のところは固有のIDと考えておくとよいでしょう。 + ![ブロックチェーンと各ブロック内のデータを表す図](./blockchain-diagram.png) @@ -53,19 +53,19 @@ _ブロックチェーンは基本的にはリンクリストであり、各ブ ## 新しいパラダイム {#a-new-paradigm} -この新しい分散型技術スタックは、新しいデベロッパーツールを生み出しました。 このようなツールは多くのプログラミング言語に存在しますが、今回は Python を例にとって説明します。 繰り返しになりますが、Python 以外の言語をご使用の場合でも、内容を理解するのはそれほど難しいことではありません。 +この新しい分散型技術スタックは、新しいデベロッパーツールを生み出しました。 このようなツールは多くのプログラミング言語に存在しますが、今回はPythonを例にとって説明します。 繰り返しになりますが、Python以外の言語をご使用の場合でも、内容を理解するのはそれほど難しいことではありません。 -イーサリアムと対話する必要がある Python デベロッパーは、[Web3.py](https://web3py.readthedocs.io/)にアクセスしてください。 Web3.py は、イーサリアムノードへの接続と、そのノードとのデータの送受信を簡単に行えるようにするライブラリです。 +イーサリアムと対話する必要があるPythonデベロッパーは、[Web3.py](https://web3py.readthedocs.io/)にアクセスしてください。 Web3.pyは、イーサリアムノードへの接続と、そのノードとのデータの送受信を簡単に行えるようにするライブラリです。 -注: 「イーサリアムノード」と「イーサリアムクライアント」は同じ意味で使用されます。 どちらもイーサリアムネットワークの参加者が実行するソフトウェアを指します。 このソフトウェアは、ブロックデータの読み取り、新しいブロックがチェーンに追加されたときの更新データの受信、新しいトランザクションのブロードキャストなどを行います。 技術的には、クライアントはソフトウェアを意味し、ノードはソフトウェアを実行しているコンピュータを意味します。 + -[イーサリアムクライアント](/developers/docs/nodes-and-clients/) は、[プロセス間通信(IPC)](https://wikipedia.org/wiki/Inter-process_communication)、HTTP、または WebSocket で接続するように設定できるため、Web3.py でも同じ設定にする必要があります。 Web3.py は、これらの接続オプションを**プロバイダー**として参照します。 Web3.py インスタンスをノードに接続するために、3 つのプロバイダーのいずれかを選択する必要があります。 +[イーサリアムクライアント](/developers/docs/nodes-and-clients/) は、[プロセス間通信(IPC)](https://wikipedia.org/wiki/Inter-process_communication)、HTTP、またはWebSocketで接続するように設定できるため、Web3.pyでも同じ設定にする必要があります。 Web3.pyは、これらの接続オプションを**プロバイダー**として参照します。 Web3.pyインスタンスをノードに接続するために、3つのプロバイダーのいずれかを選択する必要があります。 ![Web3.pyがIPCを使用してアプリケーションをイーサリアムノードに接続する方法を表す図](./web3py-and-nodes.png) -_同じプロトコル(この図ではプロセス間通信(IPC))を介して通信するようにイーサリアムノードと Web3.py を設定します。_ +_同じプロトコル(この図ではプロセス間通信(IPC))を介して通信するようにイーサリアムノードとWeb3.pyを設定します。_ -Web3.py が正しく設定できたら、ブロックチェーンとの対話を開始できます。 参考までに、Web3.py の使用例をいくつか示します。 +Web3.pyが正しく設定できたら、ブロックチェーンとの対話を開始できます。 参考までに、Web3.pyの使用例をいくつか示します。 ```python # read block data: @@ -77,118 +77,120 @@ w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...}) ## インストール {#installation} -このチュートリアルでは、Python インタプリタ内で作業します。 ディレクトリ、ファイル、クラス、関数は作成しません。 +このチュートリアルでは、Pythonインタプリタ内で作業します。 ディレクトリ、ファイル、クラス、関数は作成しません。 -注: 以下の例では、「$」で始まるコマンドはターミナルで実行することを意味しています。 (「$」を入力しないでください。「$」は単に行の始まりを意味します。) + -まず、使いやすい環境となるように[IPython](https://ipython.org/)をインストールしてください。 IPython には、数ある機能の中でも特に便利なタブ補完機能があり、Web3.py での補完の候補を簡単に確認できます。 +まず、使いやすい環境となるように[IPython](https://ipython.org/)をインストールしてください。 IPythonには、数ある機能の中でも特に便利なタブ補完機能があり、Web3.pyでの補完の候補を簡単に確認できます。 ```bash -$ pip install ipython +pip install ipython ``` -Web3.py は`web3`という名前で公開されています。 次のようにしてインストールします。 +Web3.pyは`web3`という名前で公開されています。 次のようにしてインストールします。 ```bash -$ pip install web3 +pip install web3 ``` -あと 1 つ操作が必要です。後でブロックチェーンのシミュレーションを行いますが、それにはさらに数個の依存関係が必要となります。 それらは以下のコマンドでインストールできます。 +あと1つ操作が必要です。後でブロックチェーンのシミュレーションを行いますが、それにはさらに数個の依存関係が必要となります。 それらは以下のコマンドでインストールできます。 ```bash -$ pip install 'web3[tester]' +pip install 'web3[tester]' ``` これで準備完了です。 +注: `web3[tester]`パッケージは、Python 3.10.xxまで対応しています。 + ## サンドボックスの起動 {#spin-up-a-sandbox} -ターミナルで`ipython`を実行し、新しい Python 環境を開きます。 これは、`python`を実行することに相当しますが、より多くの機能を使用できます。 +ターミナルで`ipython`を実行し、新しいPython環境を開きます。 これは、`python`を実行するのと同じですが、より多くの機能を使用できます。 ```bash -$ ipython +ipython ``` -実行している Python と IPython のバージョンに関する情報が出力され、次のような入力待ちの状態になります。 +実行しているPythonとIPythonのバージョンに関する情報が出力され、次のような入力待ちの状態になります。 ```python In [1]: ``` -これは対話型の Python シェルであり、 実質的には、さまざまなものを実行できるサンドボックスです。 ここまで完了したら、いよいよ Web3.py をインポートします。 +これは対話型のPythonシェルであり、 実質的には、さまざまなものを実行できるサンドボックスです。 ここまで完了したら、いよいよWeb3.pyをインポートします。 ```python In [1]: from web3 import Web3 ``` -## Web3 モジュールの紹介 {#introducing-the-web3-module} +## Web3モジュールの紹介 {#introducing-the-web3-module} -[Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api)モジュールはイーサリアムへの入り口であるだけでなく、便利な関数も提供しています。 いくつか見ていきましょう。 +[Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api)モジュールは、イーサリアムへの入り口であるだけでなく、便利な関数も提供しています。 その一部をご紹介します。 -イーサリアムのアプリケーションでは、通常、通貨の単位を変換する必要があります。 Web3 のモジュールには、この変換のためだけの[fromWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.fromWei)や[toWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toWei)のようなヘルパーメソッドがあります。 +イーサリアムのアプリケーションでは、通常、通貨の単位を変換する必要があります。 Web3のモジュールには、この変換のためだけの[fromWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei)や[toWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei)のようなヘルパーメソッドがあります。 - + -好きな数字で wei と ETH(ether)を変換してみてください。 なお、ETH と wei の間には、[さまざまな単位の名称があります](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations)。 その中でよく使われているのは **gwei**です。これは基本的に手数料を意味します。 +好きな数字でweiとETH(ether)を変換してみてください。 なお、ETHとweiの間には、[さまざまな単位の名称があります](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations)。 その中でよく使われているのは、**gwei**です。これは基本的に手数料を意味します。 ```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') ``` -Web3 モジュールのその他のユーティリティメソッドとしては、データ形式のコンバータ(例: [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)) 、アドレスヘルパー(例: [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)) 、ハッシュ関数(例: [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak))が挙げられます。 これらについては、この連載の後半で取り上げます。 利用可能なすべてのメソッドとプロパティを表示するには、`Web3.`と入力し、 ピリオドの後でタブキーを 2 回押して IPython の自動補完機能を利用してください。 +Web3モジュールのその他のユーティリティメソッドとしては、データ形式のコンバータ(例: [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)) 、アドレスヘルパー(例: [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)) 、ハッシュ関数(例: [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak))が挙げられます。 これらについては、この連載の後半で取り上げます。 利用可能なすべてのメソッドとプロパティを表示するには、`Web3`と入力して、 ピリオドの後にタブキーを2回押してください。これにより、IPythonの自動補完機能が起動します。 ## チェーンとの通信 {#talk-to-the-chain} -便利な手法も素晴らしいですが、ブロックチェーンの話に移りましょう。 次のステップでは、Web3.py がイーサリアムノードと通信するように設定します。 ここでは、IPC、HTTP、または WebSocket プロバイダーを使用することができます。 +便利な手法も素晴らしいですが、ブロックチェーンの話に移りましょう。 次のステップでは、Web3.pyがイーサリアムノードと通信できるように設定します。 ここでは、IPC、HTTP、またはWebSocketプロバイダーを使用することができます。 -HTTP プロバイダーを使用した場合の完全なワークフローの例としては、次のようなものがあります(ここでは、この手順は実行しません)。 +HTTPプロバイダーを使用した場合の完全なワークフローの例としては、次のようなものがあります(ここでは、この手順は実行しません)。 - イーサリアムノード([Geth](https://geth.ethereum.org/)など)をダウンロードします。 -- 1 つのターミナルで Geth を起動し、ネットワークの同期を待ちます。 デフォルトの HTTP ポートは`8545`ですが、設定可能です。 -- 次のように`localhost:8545`で、Web3.py を使用して HTTP 経由でノードに接続します。 `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` +- 1つのターミナルでGethを起動し、ネットワークの同期を待ちます。 デフォルトのHTTPポートは`8545`ですが、設定可能です。 +- 次のように`localhost:8545`で、Web3.pyを使用してHTTP経由でノードに接続します。 `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` - `w3`インスタンスを使用してノードと対話します。 -これは「実際に行われている」方法ですが、同期プロセスには時間がかかるため、開発環境のみが必要な場合は不要です。 Web3.py は、開発環境のみが必要なデベロッパー向けに第 4 のプロバイダーとして**EthereumTesterProvider**を提供しています。 このテストプロバイダーは、制約の少ない権限が適用され、偽の通貨でさまざまなことを試せるようになっている、シミュレートされたイーサリアムノードにつながります。 +これは「実際に行われている」方法ですが、同期プロセスに時間がかかるため、開発環境でのみ使用する場合は不要です。 Web3.pyは、開発環境でのみ使用するデベロッパー向けに、第4のプロバイダーとして**EthereumTesterProvider**を提供しています。 このテストプロバイダーは、制約の少ない権限が適用された、偽の通貨でさまざまなことを試せるようになっている、シミュレートされたイーサリアムノードにつながります。 ![シミュレートされたイーサリアムノードにWeb3.pyアプリケーションをつなげるEthereumTesterProviderを表す図](./ethereumtesterprovider.png) -_EthereumTesterProvider はシミュレートされたノードに接続します。これは、簡単な開発環境で使用する場合に便利です。_ +_EthereumTesterProviderはシミュレートされたノードに接続します。これは、簡単な開発環境で使用する場合に便利です。_ -このシミュレートされたノードは[eth-tester](https://github.com/ethereum/eth-tester)と呼ばれ、前述の`pip install web3[tester]`コマンドでインストールされています。 以下のコマンドで、テストプロバイダーを使用するよう Web3.py を簡単に設定できます。 +このシミュレートされたノードは[eth-tester](https://github.com/ethereum/eth-tester)と呼ばれ、前述の`pip install web3[tester]`コマンドでインストールされています。 以下のコマンドで、テストプロバイダーを使用するようWeb3.pyを簡単に設定できます。 ```python In [4]: w3 = Web3(Web3.EthereumTesterProvider()) ``` -これで「チェーンサーフィン」をする準備ができました! そのような呼び方をする人はいないと思いますが、 そう呼ぶことにしました。 さあ、クイックツアーを始めましょう。 +これで「チェーンサーフィン」をする準備ができました。 そのような呼び方をする人はいないと思いますが、 そう呼ぶことにしました。 さあ、クイックツアーを始めましょう。 ## クイックツアー {#the-quick-tour} 最初に、正常に接続できているかサニティチェックをします。 ```python -In [5]: w3.isConnected() +In [5]: w3.is_connected() Out[5]: True ``` -テスタープロバイダーを使用しているため、これはあまり有用なテストではありませんが、失敗した場合は、`w3`変数をインスタンス化するときに間違った入力をした可能性があります。 内側の括弧、つまり`Web3.EthereumTesterProvider()`が含まれていることを再確認してください。 +テスタープロバイダーを使用しているため、このテストはあまり有用ではありません。失敗した場合は、`w3`変数をインスタンス化するときに入力ミスをした可能性があります。 内側の括弧、つまり`Web3.EthereumTesterProvider()`が含まれていることを再確認してください。 ## ツアー #1: [アカウント](/developers/docs/accounts/) {#tour-stop-1-accounts} -テスタープロバイダーでは便宜上、複数のアカウントが作成されており、テスト用の ETH が入金されています。 +テスタープロバイダーでは便宜上、複数のアカウントが作成されており、テスト用のETHが入金されています。 まず、これらのアカウントの一覧を表示しましょう。 @@ -199,23 +201,23 @@ Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...] ``` -このコマンドを実行すると、`0x`で始まる 10 個の文字列のリストが表示されます。 それぞれが**パブリックアドレス**であり、これらはある意味、当座預金の口座番号のようなものです。 あなた宛てに ETH を送金する人に、これらのアドレスを教えることになります。 +このコマンドを実行すると、`0x`で始まる10個の文字列のリストが表示されます。 それぞれが**パブリックアドレス**であり、これらはある意味、当座預金の口座番号のようなものです。 あなた宛てにETHを送金する人に、これらのアドレスを教えることになります。 -前述のとおり、テスタープロバイダーでは、これらの各アカウントにテスト用の ETH があらかじめ入金されています。 では、最初のアカウントにいくらあるかを調べてみましょう。 +前述のとおり、テスタープロバイダーでは、これらの各アカウントにテスト用のETHがあらかじめ入金されています。 では、最初のアカウントの残高を確認しましょう。 ```python In [7]: w3.eth.get_balance(w3.eth.accounts[0]) Out[7]: 1000000000000000000000000 ``` -なんとたくさんの 0 でしょうか! 満面の笑みで偽の銀行に駆け込む前に、前述した通貨の単位の説明を思い出してください。 ETH の値は、最小単位である wei で表されます。 ETH(ether)に変換すると次のようになります。 +この0の数を見てください! 満面の笑みで偽の銀行に駆け込む前に、前述した通貨の単位の説明を思い出してください。 ETHの値は、最小単位であるweiで表されます。 ETH(ether)に変換すると次のようになります。 ```python -In [8]: w3.fromWei(1000000000000000000000000, 'ether') +In [8]: w3.from_wei(1000000000000000000000000, 'ether') Out[8]: Decimal('1000000') ``` -テスト用とはいえ 100 万 ETH です。依然として素晴らしい額です。 +テスト用とはいえ、100万ETHは依然としてすごい額です。 ## ツアー #2: ブロックデータ {#tour-stop-2-block-data} @@ -234,19 +236,19 @@ Out[9]: AttributeDict({ ブロックに関する多くの情報が返されますが、いくつか注意すべき点があります。 -- テスタープロバイダーを設定した時期がいつであっても、ブロック番号はゼロになります。 実際のイーサリアムネットワーク(新しいブロックが 12 秒ごとに追加される)とは異なり、このシミュレーションは、作業を行うまで待機します。 +- テスタープロバイダーを設定した時期がいつであっても、ブロック番号はゼロになります。 実際のイーサリアムネットワーク(新しいブロックが12秒ごとに追加される)とは異なり、このシミュレーションは、作業を行うまで待機します。 - まだ何も作業を行っていないため、同じ理由で、`transactions`は空のリストになります。 最初のブロックは**空のブロック**であり、チェーンを開始するためだけに使用されています。 - `parentHash`は、単なる一連の空バイトである点に注意してください。 これは、**始まりのブロック**とも呼ばれる、チェーンの最初のブロックであることを意味します。 ## ツアー #3: [トランザクション](/developers/docs/transactions/) {#tour-stop-3-transactions} -保留中のトランザクションが存在するまで、ゼロのブロックで止まっているので、トランザクションを作成してみましょう。 あるアカウントから別のアカウントに、テスト用の ETH(ether)を少し送金します。 +保留中のトランザクションが存在するまで、ゼロのブロックで止まっているので、トランザクションを作成してみましょう。 あるアカウントから別のアカウントに、テスト用のETH(ether)を少し送金します。 ```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 }) ``` @@ -272,9 +274,9 @@ Out[11]: AttributeDict({ }) ``` -`from`、`to`、`value`の各フィールドは、`send_transaction`呼び出し時の入力と一致しなければなりません。 このトランザクションが、ブロック番号 1 の最初のトランザクション(`'transactionIndex': 0`)として含まれていることを確認できることも心強い点です。 +`from`、`to`、`value`の各フィールドは、`send_transaction`呼び出し時の入力と一致しなければなりません。 このトランザクションが、ブロック番号1の最初のトランザクション(`'transactionIndex': 0`)として含まれていることを確認できることも心強い点です。 -さらに、関係する 2 つのアカウントの残高を確認することで、このトランザクションが成功していることを簡単に検証できます。 1 つ目のアカウントから 2 つ目のアカウントへ、3 ETH が移動しているはずです。 +さらに、関係する2つのアカウントの残高を確認することで、このトランザクションが成功していることを簡単に検証できます。 1つ目のアカウントから2つ目のアカウントへ、3 ETHが移動しているはずです。 ```python In [12]: w3.eth.get_balance(w3.eth.accounts[0]) @@ -284,12 +286,12 @@ In [13]: w3.eth.get_balance(w3.eth.accounts[1]) Out[13]: 1000003000000000000000000 ``` -2 つ目のアカウントの残高は正しいようですね! 残高が 1,000,000 ETH から 1,000,003 ETH になっています。 しかし、1 つ目のアカウントはどうなったのでしょうか? 3 ETH より少し多く減っているようです。 残念ながら、人生にはタダというものはなく、イーサリアムのパブリックネットワークを利用するには、そのサポート役であるピアに対価を支払う必要があります。 トランザクションを送信したアカウントから、少額のトランザクションフィーが差し引かれました。このフィーは、消費されたガスの量(ETH 送金では 21000 単位のガス)にベースフィーを掛けたものです。ベースフィーは、ネットワークのアクティビティに加えて、ブロック内にトランザクションを含めるバリデータに送信されるチップによって異なります。 +2つ目のアカウントの残高は、 1,000,000 ETHから1,000,003 ETHに増えているので、正しいようです。 1つ目のアカウントはどうなったのでしょうか? 3 ETHより少し多い金額が失われたようです。 残念ながら、人生にはタダというものはなく、イーサリアムのパブリックネットワークを利用するには、そのサポート役であるピアに対価を支払う必要があります。 トランザクションを送信したアカウントから、少額のトランザクションフィーが差し引かれました。このフィーは、消費されたガスの量(ETH送金では21000単位のガス)にベースフィーを掛けたものです。ベースフィーは、ネットワークのアクティビティに加えて、ブロック内にトランザクションを含めるバリデータに送信されるチップによって異なります。 [ガスの詳細](/developers/docs/gas/#post-london) -注: パブリックネットワークにおいてトランザクションフィーは、ネットワークの需要やどれだけ迅速にトランザクションを処理する必要があるのかによって変動します。 フィー(手数料)の計算方法の内訳に興味がある場合は、ブロックに含まれるトランザクションの仕組みに関する以前の投稿をご覧ください。 + ## ちょっと一息 {#and-breathe} -しばらく続けたので、ここで一息つきたいところです。 イーサリアムの世界はまだまだ続き、この連載の第 2 回へと探索は続きます。 今後のコンセプト: 実際のノードへの接続、スマートコントラクト、トークン。 質問はありますか? 教えてください! 皆様からのご意見は、今後の活動に反映させていきます。 [Twitter](https://twitter.com/wolovim)でリクエストを受け付けています。 +しばらく続けたので、ここで一息つきたいところです。 イーサリアムの世界はまだまだ広く、この連載の第2回ではさらに深く掘り下げていきます。 今後のコンセプトは、実際のノードへの接続、スマートコントラクト、トークンです。 何かご質問があれば、 ぜひお聞かせください。 皆様からのご意見は、今後の活動に反映させていきます。 [Twitter](https://twitter.com/wolovim)でリクエストを受け付けています。 diff --git a/public/content/translations/ja/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md b/public/content/translations/ja/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md index 7460be086cf..a9a4a97b6fb 100644 --- a/public/content/translations/ja/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md +++ b/public/content/translations/ja/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md @@ -16,25 +16,25 @@ sourceUrl: https://soliditydeveloper.com/max-contract-size ## 制限がある理由 {#why-is-there-a-limit} -[2016 年 11 月 22 日](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/)、Spurious Dragon のハードフォークで[EIP-170](https://eips.ethereum.org/EIPS/eip-170)が導入され、24.576 KB のスマートコントラクトのサイズ制限が追加されました。 Solidity デベロッパーにとって、これはコントラクトに機能をどんどん追加していくうちに、ある時点でサイズ制限に達し、デプロイした際に以下のエラーが表示されてしまうということを意味します。 +[2016年11月22日](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/)、Spurious Dragonのハードフォークで[EIP-170](https://eips.ethereum.org/EIPS/eip-170)が導入され、24.576 KBのスマートコントラクトのサイズ制限が追加されました。 Solidityデベロッパーにとって、これはコントラクトに機能をどんどん追加していくうちに、ある時点でサイズ制限に達し、デプロイした際に以下のエラーが表示されてしまうということを意味します。 `Warning: Contract code size exceeds 24576 bytes ( Spurious Dragonで追加された制限). This contract may not be deployable on Mainnet. オプティマイザを有効にすることを検討してください (効率的に実行されます!)、文字列の取り消しをオフにするか、ライブラリを使用します。` -この制限は、サービス拒否(DOS)攻撃を防ぐために導入されました。 コントラクトの呼び出しは、ガスの観点では比較的安価です。 しかし、イーサリアムノードのコントラクト呼び出しの影響は、(ディスクからのコードの読み込み、コードの前処理、マークルプルーフへのデータの追加の対象となる)呼び出されたコントラクトコードのサイズによっては、過度に増加することになります。 攻撃者がリソースをほとんど必要とせずに、他のノードでの大量の処理を生じさせるそうした状況では、DOS 攻撃を受ける可能性が常に存在します。 +この制限は、サービス拒否(DOS)攻撃を防ぐために導入されました。 コントラクトの呼び出しは、ガスの観点では比較的安価です。 しかし、イーサリアムノードのコントラクト呼び出しの影響は、(ディスクからのコードの読み込み、コードの前処理、マークルプルーフへのデータの追加の対象となる)呼び出されたコントラクトコードのサイズによっては、過度に増加することになります。 攻撃者がリソースをほとんど必要とせずに、他のノードでの大量の処理を生じさせるそうした状況では、DOS攻撃を受ける可能性が常に存在します。 -コントラクトコードの固有のサイズ制限が、ブロックのガスリミットとなるため、本来これは問題ではありませんでした。 コントラクトは、コントラクトのバイトコードをすべて含むトランザクション内でデプロイされる必要があることは言うまでもありません。 ブロックに 1 つのトランザクションのみを含めると、そのガスのすべてを使うことができますが、無限ではありません。 [ロンドンアップグレード](/history/#london)以降、ブロックのガスリミットは、ネットワークの需要に応じて 15M ~ 30M 間で変えられるようになりました。 +コントラクトコードの固有のサイズ制限が、ブロックのガスリミットとなるため、本来これは問題ではありませんでした。 コントラクトは、コントラクトのバイトコードをすべて含むトランザクション内でデプロイされる必要があることは言うまでもありません。 ブロックに1つのトランザクションのみを含めると、そのガスのすべてを使うことができますが、無限ではありません。 [ロンドンアップグレード](/history/#london)以降、ブロックのガスリミットは、ネットワークの需要に応じて15M~30M間で変えられるようになりました。 ## サイズ制限への対処 {#taking-on-the-fight} -残念ながら、コントラクトのバイトコードサイズを取得する簡単な方法はありません。 Truffle をご使用の場合は、サイズの取得に役立つ[truffle-contract-size](https://github.com/IoBuilders/truffle-contract-size)プラグインという素晴らしいツールがあります。 +残念ながら、コントラクトのバイトコードサイズを取得する簡単な方法はありません。 Truffleをご使用の場合は、サイズの取得に役立つ[truffle-contract-size](https://github.com/IoBuilders/truffle-contract-size)プラグインという素晴らしいツールがあります。 1. `npm install truffle-contract-size` -2. *truffle-config.js*にプラグインを追加します。`plugins: ["truffle-contract-size"]` +2. _truffle-config.js_にプラグインを追加します。`plugins: ["truffle-contract-size"]` 3. `truffle run contract-size`を実行します。 これにより、変更内容がコントラクトの合計サイズにどのような影響を与えているかを把握することができます。 -次に、いくつかの方法を、効果が大きいものから順に見ていきます。 減量の観点から考えてみましょう。 目標体重(この場合は 24 KB)を達成するための最良の戦略は、まず効果が大きい方法に集中して取り組むことです。 ほとんどの場合、食生活を改善するだけで解決しますが、もう少し何かが必要な場合もあります。 その場合は、運動(中程度の効果)やサプリメント(小さな効果)を加えるとよいでしょう。 +次に、いくつかの方法を、効果が大きいものから順に見ていきます。 減量の観点から考えてみましょう。 目標体重(この場合は24 KB)を達成するための最良の戦略は、まず効果が大きい方法に集中して取り組むことです。 ほとんどの場合、食生活を改善するだけで解決しますが、もう少し何かが必要な場合もあります。 その場合は、運動(中程度の効果)やサプリメント(小さな効果)を加えるとよいでしょう。 ## サイズ削減効果: 大 {#big-impact} @@ -48,7 +48,7 @@ sourceUrl: https://soliditydeveloper.com/max-contract-size ### ライブラリ {#libraries} -機能コードをストレージから移動させる簡単な方法としては、[ライブラリ](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries)の使用が挙げられます。 コンパイル中に直接[コントラクトに追加](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking)されるので、ライブラリ関数を internal で宣言しないでください。 しかし、public 関数を使用する場合、それらは実際には別のライブラリコントラクトに含まれることになります。 ライブラリをより便利に利用するには、[using for](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for)の使用を検討してください。 +機能コードをストレージから移動させる簡単な方法としては、[ライブラリ](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries)の使用が挙げられます。 コンパイル中に直接[コントラクトに追加](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking)されるので、ライブラリ関数をinternalで宣言しないでください。 しかし、public関数を使用する場合、それらは実際には別のライブラリコントラクトに含まれることになります。 ライブラリをより便利に利用するには、[using for](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for)の使用を検討してください。 ### プロキシ {#proxies} @@ -60,8 +60,8 @@ sourceUrl: https://soliditydeveloper.com/max-contract-size これは当然実行すべきことです。 関数はコントラクトサイズをかなり増大させます。 -- **external**: 利便性の理由から、多くの view 関数が頻繁に追加されます。 サイズ制限に達するまでは、追加してもかまいません。 その後で、絶対に必要なもの以外のすべての関数を削除することを真剣に検討します。 -- **internal**: internal 関数や private 関数を削除し、関数が一度だけ呼び出される場合に限り、コードを単にインライン化することもできます。 +- **external**: 利便性の理由から、多くのview関数が頻繁に追加されます。 サイズ制限に達するまでは、追加してもかまいません。 その後で、絶対に必要なもの以外のすべての関数を削除することを真剣に検討します。 +- **internal**: internal関数やprivate関数を削除し、関数が一度だけ呼び出される場合に限り、コードを単にインライン化することもできます。 ### 変数の追加を回避 {#avoid-additional-variables} @@ -95,9 +95,21 @@ require(msg.sender == owner, "Only the owner of this contract can call this func require(msg.sender == owner, "OW1"); ``` +### エラーメッセージのかわりにカスタムエラーを使用 + +[Solidity 0.8.4](https://blog.soliditylang.org/2021/04/21/custom-errors/)で、カスタムエラーが導入されました。 カスタムエラーは、コントラクトのサイズを削減するのに効果的な方法です。なぜなら、(関数と同様に)セレクターとしてABIエンコードされるためです。 + +```solidity +error Unauthorized(); + +if (msg.sender != owner) { + revert Unauthorized(); +} +``` + ### オプティマイザでの低い実行値を検討 {#consider-a-low-run-value-in-the-optimizer} -オプティマイザの設定も変更できます。 デフォルト値の 200 は、関数が 200 回呼び出される場合と同様にバイトコードの最適化を試みることを意味します。 これを 1 に変更すると、通常、各関数を 1 回だけ実行する場合のように最適化するようオプティマイザに指示することになります。 1 回だけの実行向けに最適化された関数は、それ自体のデプロイのために最適化されているということを意味します。 **1 に設定すると関数の実行にかかる[ガス代](/developers/docs/gas/)が高くなる**ことに注意してください。そのため、適していない場合があります。 +オプティマイザの設定も変更できます。 デフォルト値の200は、関数が200回呼び出される場合と同様にバイトコードを最適化しようとしていることを意味します。 これを1に変更すると、通常、各関数を1回だけ実行するケースに最適化するよう、オプティマイザに指示します。 1回だけ実行するように最適化された関数とは、その関数自体のデプロイのために最適化されていることを意味します。 ただし、**1に設定すると関数の実行にかかる[ガス代](/developers/docs/gas/)が高くなる**ことに注意してください。 ## サイズ削減効果: 小 {#small-impact} @@ -132,9 +144,9 @@ function _get(address addr1, address addr2) private view returns(address,address - 外部からのみ呼び出される関数や変数ですか? その場合は、`public`ではなく`external`として宣言します。 - コントラクト内からのみ呼び出される関数または変数ですか? その場合は、`public`ではなく`private`あるいは`internal`として宣言します。 -### modifier の削除 {#remove-modifiers} +### modifierの削除 {#remove-modifiers} -過剰に使用された場合、modifier 修飾子はコントラクトのサイズに大きな影響を与える可能性があります。 それらを削除して代わりに関数を使用することを検討してください。 +modifier修飾子を過剰に使用すると、コントラクトのサイズに大きな影響を与える可能性があります。 そのため、modifierの代わりに関数を使用することを検討してください。 ```solidity modifier checkStuff() {} @@ -148,4 +160,4 @@ function checkStuff() private {} function doSomething() { checkStuff(); } ``` -これらのヒントは、コントラクトのサイズを大幅に削減するのに役立ちます。 繰り返しになりますが、最大の効果を得るためには、可能な限りコントラクトを分割することが重要です。 +これらのヒントを実践することで、コントラクトのサイズを大幅に削減することができます。 繰り返しになりますが、最大の効果を得るためには、可能な限りコントラクトを分割することが重要です。 diff --git a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md index a455a5528c8..f9e9836d280 100644 --- a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md @@ -13,21 +13,29 @@ lang: ja published: 2021-03-31 --- -このチュートリアルは、ブロックチェーンの開発が初めてで、どこから始めたらよいのか分からない場合や、 スマートコントラクトをデプロイしてやり取りする方法を理解したいだけの場合に、最適なガイドとなります。 このチュートリアルでは、仮想ウォレット([MetaMask](https://metamask.io/))、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org/)、[Alchemy](https://alchemyapi.io/eth)を使用して、Goerli テストネットワーク上で簡単なスマートコントラクトを作成してデプロイする方法を順を追って説明します(現時点でしっかりと理解できていなくても、心配はご無用です。後ほど説明します)。 +このチュートリアルは、ブロックチェーンの開発が初めてで、どこから始めたらよいのか分からない場合や、 スマートコントラクトをデプロイしてやり取りする方法を理解したいだけの場合に、最適なガイドとなります。 このチュートリアルでは、仮想ウォレット([MetaMask](https://metamask.io/))、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org/)、[Alchemy](https://alchemyapi.io/eth)を使用して、Goerliテストネットワーク上で簡単なスマートコントラクトを作成してデプロイする方法を順を追って説明します(現時点でしっかりと理解できていなくても、心配はご無用です。後ほど説明します)。 -このチュートリアルの[パート 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract)では、ここでデプロイしたスマートコントラクトとやり取りする方法について説明します。[パート 3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan)では、そのスマートコントラクトを Etherscan で公開する方法について説明します。 +> **警告** +> +> 🚧 非推奨の通知 +> +> このガイドでは、Goerliテストネットワークをスマートコントラクトの作成とデプロイに使用しています。 ただし、イーサリアム・ファウンデーションにより、[Goerliが間もなく廃止予定](https://www.alchemy.com/blog/goerli-faucet-deprecation)であることが発表されました。 +> +> このチュートリアルでは、[Sepolia](https://www.alchemy.com/overviews/sepolia-testnet)および[Sepoliaフォーセット](https://sepoliafaucet.com/)の利用を推奨します。 + +このチュートリアルの[パート2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract)では、ここでデプロイしたスマートコントラクトとやり取りする方法について説明します。[パート3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan)では、そのスマートコントラクトをEtherscanで公開する方法について説明します。 質問がある場合は、いつでも[Alchemy Discord](https://discord.gg/gWuC7zB)でお問い合わせください。 -## ステップ 1: イーサリアムネットワークに接続する {#step-1} +## ステップ1: イーサリアムネットワークに接続する {#step-1} -イーサリアムチェーンにリクエストを行う方法はたくさんあります。 簡略化のため、ここでは Alchemy の無料アカウントを使用します。これは独自のノードを実行することなく、イーサリアムチェーンとの通信を可能にするブロックチェーンのデベロッパープラットフォームと API です。 このプラットフォームには、スマートコントラクトのデプロイメントにおいて内部で何が起こっているのかを把握するためにこのチュートリアルで利用する、監視と分析のためのデベロッパーツールも備わっています。 Alchemy のアカウントをお持ちでない場合は、[こちら](https://dashboard.alchemyapi.io/signup)から無料で登録できます。 +イーサリアムチェーンにリクエストを行う方法はたくさんあります。 簡略化のため、ここではAlchemyの無料アカウントを使用します。これは独自のノードを実行することなく、イーサリアムチェーンとの通信を可能にするブロックチェーンのデベロッパープラットフォームとAPIです。 このプラットフォームには、スマートコントラクトのデプロイメントにおいて内部で何が起こっているのかを把握するためにこのチュートリアルで利用する、監視と分析のためのデベロッパーツールも備わっています。 Alchemyのアカウントをお持ちでない場合は、[こちら](https://dashboard.alchemyapi.io/signup)から無料で登録できます。 -## ステップ 2: アプリ(および API キー)を作成する {#step-2} +## ステップ2: アプリ(およびAPI キー)を作成する {#step-2} -Alchemy のアカウントを作成すると、アプリを作成することで API キーを生成できるようになります。 これにより、Goerli テストネットワークへのリクエストが可能になります。 テストネットに詳しくない場合は、[こちらのページ](/developers/docs/networks/)をご覧ください。 +Alchemyのアカウントを作成すると、アプリを作成することでAPIキーを生成できるようになります。 これにより、Goerliテストネットワークへのリクエストが可能になります。 テストネットに詳しくない場合は、[こちらのページ](/developers/docs/networks/)をご覧ください。 -1. ナビゲーションバーの「Apps」にマウスを合わせて、「Create App」をクリックし、Alchemy ダッシュボードの「Create App」ページに移動してください。 +1. ナビゲーションバーの「Apps」にマウスを合わせて、「Create App」をクリックし、Alchemyダッシュボードの「Create App」ページに移動してください。 ![Hello WorldのCreate App](./hello-world-create-app.png) @@ -37,31 +45,31 @@ Alchemy のアカウントを作成すると、アプリを作成することで 3. 「Create app」をクリックして完了です。 アプリが下の表に表示されます。 -## ステップ 3: イーサリアムアカウント(アドレス)を作成する {#step-3} +## ステップ3: イーサリアムアカウント(アドレス)を作成する {#step-3} -トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットである Metamask を使用します。 [トランザクション](/developers/docs/transactions/)の詳細。 +トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 [トランザクション](/developers/docs/transactions/)の詳細。 -Metamask のアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Goerli Test Network」に切り替えてください。 +Metamaskのアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Goerli Test Network」に切り替えてください。 ![MetaMask Ropstenの例](./metamask-ropsten-example.png) -## ステップ 4: フォーセットからイーサ(ETH)を追加する {#step-4} +## ステップ4: フォーセットからイーサ(ETH)を追加する {#step-4} -テストネットワークにスマートコントラクトをデプロイするには、偽の ETH が必要になります。 ETH を取得するには、[Goerli フォーセット](https://goerlifaucet.com/)にアクセスし、Alchemy アカウントでログインしてウォレットアドレスを入力し、「Send Me ETH」をクリックしてください。 ネットワークトラフィックのために偽の ETH を受け取るのに時間がかかる場合があります。 (この記事の執筆時点では、30 分ほどかかりました。) MetaMask アカウントに ETH が表示されるはずです! +テストネットワークにスマートコントラクトをデプロイするには、偽のETHが必要になります。 ETHを取得するには、[Goerliフォーセット](https://goerlifaucet.com/)にアクセスし、Alchemyアカウントでログインしてウォレットアドレスを入力し、「Send Me ETH」をクリックしてください。 ネットワークトラフィックのために偽のETHを受け取るのに時間がかかる場合があります。 (この記事の執筆時点では、30分ほどかかりました。) MetaMaskアカウントにETHが表示されるはずです! -## ステップ 5: 残高を確認する {#step-5} +## ステップ5: 残高を確認する {#step-5} -残高を再確認するために、[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)を[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)を使用してリクエストしてみましょう。 このリクエストをすると、ウォレット内の ETH の額が返されます。 MetaMask アカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。 +残高を再確認するために、[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)を[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)を使用してリクエストしてみましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 MetaMaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。 ```json { "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } ``` -> **注:** この結果の単位は、ETH ではなく wei です。 wei は ETH の最小単位として使われています。 wei から ETH へ変換すると、1 eth = 1018 wei になります。 つまり、0x2B5E3AF16B1880000 を 10 進数に変換すると、5\*10¹⁸ となり、5 ETH に相当します。 -> +> **注:** この結果の単位は、ETHではなくweiです。 weiはETHの最小単位として使われています。 weiからETHへ変換すると、1 eth = 1018 weiになります。 つまり、0x2B5E3AF16B1880000を10進数に変換すると、5\*10¹⁸となり、5 ETHに相当します。 +> > ご安心ください。 偽のお金はすべてそこにあります。 -## ステップ 6: プロジェクトを初期化する {#step-6} +## ステップ6: プロジェクトを初期化する {#step-6} まず、プロジェクトのフォルダを作成する必要があります。 コマンドラインに移動し、次のように入力します。 @@ -70,7 +78,7 @@ mkdir hello-world cd hello-world ``` -プロジェクトフォルダ内に入ったら、`npm init`を使用してプロジェクトを初期化します。 まだ npm がインストールされていない場合は、[こちらの手順](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm)に従ってください(Node.js も必要となりますので、こちらもダウンロードしてください。) +プロジェクトフォルダ内に入ったら、`npm init`を使用してプロジェクトを初期化します。 まだnpmがインストールされていない場合は、[こちらの手順](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm)に従ってください(Node.jsも必要となりますので、こちらもダウンロードしてください。) ``` npm init @@ -103,11 +111,11 @@ About to write to /Users/.../.../.../hello-world/package.json: } ``` -package.json を承認すれば完了です。 +package.jsonを承認すれば完了です。 -## ステップ 7: [Hardhat](https://hardhat.org/getting-started/#overview)をダウンロードする {#step-7} +## ステップ7: [Hardhat](https://hardhat.org/getting-started/#overview)をダウンロードする {#step-7} -Hardhat は、イーサリアムのソフトウェアをコンパイル、デプロイ、テスト、デバッグするための開発環境です。 デベロッパーがライブチェーンにデプロイする前に、スマートコントラクトや分散型アプリケーション(Dapp)をローカルに構築する際に役立ちます。 +Hardhatは、イーサリアムのソフトウェアをコンパイル、デプロイ、テスト、デバッグするための開発環境です。 デベロッパーがライブチェーンにデプロイする前に、スマートコントラクトや分散型アプリケーション(Dapp)をローカルに構築する際に役立ちます。 先ほど作成した`hello-world`プロジェクト内で、以下を実行します。 @@ -117,7 +125,7 @@ npm install --save-dev hardhat [インストール手順](https://hardhat.org/getting-started/#overview)の詳細については、こちらのページをご覧ください。 -## ステップ 8: Hardhat プロジェクトを作成する {#step-8} +## ステップ8: Hardhatプロジェクトを作成する {#step-8} プロジェクトフォルダ内で以下を実行します。 @@ -145,28 +153,28 @@ Create a sample project Quit ``` -`hardhat.config.js`ファイルが生成されます。このファイルでプロジェクトのすべての設定を行います(ステップ 13 で行います)。 +`hardhat.config.js`ファイルが生成されます。このファイルでプロジェクトのすべての設定を行います(ステップ13で行います)。 -## ステップ 9: プロジェクトフォルダを追加する {#step-9} +## ステップ9: プロジェクトフォルダを追加する {#step-9} -プロジェクトを整理するために、2 つの新しいフォルダを作成します。 コマンドラインでプロジェクトのルートディレクトリに移動し、次のように入力します。 +プロジェクトを整理するために、2つの新しいフォルダを作成します。 コマンドラインでプロジェクトのルートディレクトリに移動し、次のように入力します。 ``` mkdir contracts mkdir scripts ``` -- `contracts/`は、Hello World スマートコントラクトのコードファイルを格納する場所です。 +- `contracts/`は、Hello Worldスマートコントラクトのコードファイルを格納する場所です。 - `scripts/`は、コントラクトをデプロイして対話するスクリプトを保持する場所です。 -## ステップ 10: コントラクトを作成する {#step-10} +## ステップ10: コントラクトを作成する {#step-10} -一体いつになったらコードを書くのだろうと疑問をお持ちではないでしょうか 。 このステップ 10 でコードを書いていきましょう。 +一体いつになったらコードを書くのだろうと疑問をお持ちではないでしょうか 。 このステップ10でコードを書いていきましょう。 -お気に入りのエディタで hello-world プロジェクトを開きます(通常は[VScode](https://code.visualstudio.com/)を使用しています)。 スマートコントラクトは、Solidity と呼ばれる言語で記述されています。HelloWorld.sol スマートコントラクトの作成にこの言語を使用します。 +お気に入りのエディタでhello-worldプロジェクトを開きます(通常は[VScode](https://code.visualstudio.com/)を使用しています)。 スマートコントラクトは、Solidityと呼ばれる言語で記述されています。HelloWorld.solスマートコントラクトの作成にこの言語を使用します。 -1. 「contracts」フォルダに移動し、HelloWorld.sol という名前の新規ファイルを作成します。 -2. 以下は、このチュートリアルで使用するイーサリアム・ファウンデーションの Hello World スマートコントラクトのサンプルです。 以下の内容をコピーして、HelloWorld.sol ファイルに貼り付けます。コメントを読んで、このコントラクトが何を行うのかを理解してください。 +1. 「contracts」フォルダに移動し、HelloWorld.solという名前の新規ファイルを作成します。 +2. 以下は、このチュートリアルで使用するイーサリアム・ファウンデーションのHello Worldスマートコントラクトのサンプルです。 以下の内容をコピーして、HelloWorld.solファイルに貼り付けます。コメントを読んで、このコントラクトが何を行うのかを理解してください。 ```solidity // Specifies the version of Solidity, using semantic versioning. @@ -198,28 +206,28 @@ contract HelloWorld { これは、作成時にメッセージを保存し、`update`関数を呼び出すことで更新できる非常にシンプルなスマートコントラクトです。 -## ステップ 11: MetaMask と Alchemy をプロジェクトに接続する {#step-11} +## ステップ11: MetaMaskとAlchemyをプロジェクトに接続する {#step-11} -ここまでで、MetaMask ウォレットと Alchemy アカウントを作成し、スマートコントラクトも作成しました。次はこの 3 つを接続しましょう。 +ここまでで、MetaMaskウォレットとAlchemyアカウントを作成し、スマートコントラクトも作成しました。次はこの3つを接続しましょう。 -仮想ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使用した署名が必要です。 この権限をプログラムに提供するため、秘密鍵(および Alchemy API キー)を環境ファイルに安全に保存できます。 +仮想ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使用した署名が必要です。 この権限をプログラムに提供するため、秘密鍵(およびAlchemy APIキー)を環境ファイルに安全に保存できます。 -> トランザクションの送信の詳細については、web3 を使用したトランザクションの送信についての[こちらのチュートリアル](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)をご覧ください。 +> トランザクションの送信の詳細については、web3を使用したトランザクションの送信に関する[こちらのチュートリアル](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)をご覧ください。 -まず、プロジェクトディレクトリに dotenv パッケージをインストールします。 +まず、プロジェクトディレクトリにdotenvパッケージをインストールします。 ``` npm install dotenv --save ``` -次に、 `.env`ファイルをプロジェクトのルートディレクトリに作成し、そのファイルに Metamask の秘密鍵と HTTP Alchemy API の URL を追加します。 +次に、 `.env`ファイルをプロジェクトのルートディレクトリに作成し、そのファイルにMetamaskの秘密鍵とHTTP Alchemy APIのURLを追加します。 - 秘密鍵をエクスポートするには、[こちらの手順](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key)に従ってください。 -- HTTP Alchemy API の URL を取得するには、以下を参照してください。 +- HTTP Alchemy APIのURLを取得するには、以下を参照してください。 ![Alchemy APIキーの取得](./get-alchemy-api-key.gif) -Alchemy API の URL をコピーします。 +Alchemy APIのURLをコピーします。 `.env`ファイルは次のようになります。 @@ -228,17 +236,17 @@ API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" PRIVATE_KEY = "your-metamask-private-key" ``` -これらの変数を実際にコードに接続するために、ステップ 13 でこれらの変数を`hardhat.config.js`ファイル内で参照します。 +これらの変数を実際にコードに接続するために、ステップ13でこれらの変数を`hardhat.config.js`ファイル内で参照します。 - + .envファイルをコミットしないでください! .envファイルを誰かと共有したり公開したりしないようにしてください。秘密が漏洩する可能性があります。 バージョン管理ツールを使用している場合は、.envgitignoreファイルに追加します。 -## ステップ 12: Ethers.js をインストールする {#step-12-install-ethersjs} +## ステップ12: Ethers.jsをインストールする {#step-12-install-ethersjs} -Ethers.js は、よりユーザーフレンドリーなメソッドで[標準の JSON-RPC メソッド](/developers/docs/apis/json-rpc/)をラップすることにより、イーサリアムとの対話やリクエストを簡単にするライブラリです。 +Ethers.jsは、よりユーザーフレンドリーなメソッドで[標準のJSON-RPCメソッド](/developers/docs/apis/json-rpc/)をラップすることにより、イーサリアムとの対話やリクエストを簡単にするライブラリです。 -Hardhat は、追加のツールと拡張機能のための[プラグイン](https://hardhat.org/plugins/)の統合を非常に簡単にしてくれます。 コントラクトのデプロイメントに[Ethers プラグイン](https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html)を利用します([Ethers.js](https://github.com/ethers-io/ethers.js/)には、複数の非常にクリーンなコントラクトのデプロイメント方法があります)。 +Hardhatは、追加のツールと拡張機能のための[プラグイン](https://hardhat.org/plugins/)の統合を非常に簡単にしてくれます。 コントラクトのデプロイメントに[Ethersプラグイン](https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html)を利用します([Ethers.js](https://github.com/ethers-io/ethers.js/)には、複数の非常にクリーンなコントラクトのデプロイメント方法があります)。 プロジェクトのホームディレクトリで以下を実行します。 @@ -246,9 +254,9 @@ Hardhat は、追加のツールと拡張機能のための[プラグイン](htt npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0" ``` -次のステップの`hardhat.config.js`でも Ethers(.js)が必要になります。 +次のステップの`hardhat.config.js`でもEthers(.js)が必要になります。 -## ステップ 13: hardhat.config.js を更新する {#step-13-update-hardhatconfigjs} +## ステップ13: hardhat.config.jsを更新する {#step-13-update-hardhatconfigjs} ここまでで、いくつかの依存関係とプラグインを追加しました。次に、`hardhat.config.js`を更新して、プロジェクトがそれらすべてについて認識できるようにする必要があります。 @@ -276,9 +284,9 @@ module.exports = { } ``` -## ステップ 14: コントラクトをコンパイルする {#step-14-compile-our-contracts} +## ステップ14: コントラクトをコンパイルする {#step-14-compile-our-contracts} -ここまででしっかりと動作していることを確認するため、コントラクトをコンパイルしてみましょう。 `compile`タスクは、組み込みの Hardhat タスクの 1 つです。 +ここまででしっかりと動作していることを確認するため、コントラクトをコンパイルしてみましょう。 `compile`タスクは、組み込みのHardhatタスクの1つです。 コマンドラインで以下を実行します。 @@ -288,7 +296,7 @@ npx hardhat compile `SPDX license identifier not provided in source file`という警告が表示される場合がありますが、心配する必要はありません。警告が表示されないのがベストですが、 表示された場合は、いつでも[Alchemy discord](https://discord.gg/u72VCg3)でメッセージを送信できます。 -## ステップ 15: デプロイスクリプトを書く {#step-15-write-our-deploy-scripts} +## ステップ15: デプロイスクリプトを書く {#step-15-write-our-deploy-scripts} コントラクトの作成と設定ファイルの作成が完了したら、いよいよコントラクトのデプロイのためのスクリプトを作成します。 @@ -310,13 +318,13 @@ main() }); ``` -Hardhat がコードの各行で行っている驚くべき内容については、Hardhat の[コントラクトチュートリアル](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)で説明されています。以下では、その説明を採用しています。 +Hardhatがコードの各行で行っている驚くべき内容については、Hardhatの[コントラクトチュートリアル](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)で説明されています。以下では、その説明を採用しています。 ``` const HelloWorld = await ethers.getContractFactory("HelloWorld"); ``` -ethers.js の`ContractFactory`は新しいスマートコントラクトをデプロイするための抽象化であり、ここでの`HelloWorld`は hello world コントラクトのインスタンスのためのファクトリです。 `hardhat-ethers`プラグインを使用する場合、`ContractFactory`および`Contract`インスタンスはデフォルトで最初の署名者に接続されます。 +ethers.jsの`ContractFactory`は新しいスマートコントラクトをデプロイするための抽象化であり、ここでの`HelloWorld`はhello worldコントラクトのインスタンスのためのファクトリです。 `hardhat-ethers`プラグインを使用する場合、`ContractFactory`および`Contract`インスタンスはデフォルトで最初の署名者に接続されます。 ``` const hello_world = await HelloWorld.deploy(); @@ -324,7 +332,7 @@ const hello_world = await HelloWorld.deploy(); `ContractFactory`で`deploy()`を呼び出すとデプロイメントが開始され、`Contract`に解決すべき`Promise`が返されます。 これは、スマートコントラクトの各関数に対するメソッドを持つオブジェクトです。 -## ステップ 16: コントラクトをデプロイする {#step-16-deploy-our-contract} +## ステップ16: コントラクトをデプロイする {#step-16-deploy-our-contract} ようやく、スマートコントラクトをデプロイする準備が整いました。 コマンドラインに移動し、以下を実行します。 @@ -342,16 +350,16 @@ Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 ![EtherscanのContract](./etherscan-contract.png) -`From`アドレスは MetaMask アカウントアドレスと一致する必要があります。To アドレスには「Contract Creation」と表示されますが、トランザクションをクリックすると、`To`フィールドにコントラクトアドレスが表示されます。 +`From`アドレスはMetaMaskアカウントアドレスと一致する必要があります。Toアドレスには「Contract Creation」と表示されますが、トランザクションをクリックすると、`To`フィールドにコントラクトアドレスが表示されます。 ![EtherscanのTransaction](./etherscan-transaction.png) おめでとうございます! イーサリアムチェーンにスマートコントラクトをデプロイできました 🎉 -内部で何が起こっているのかを理解するために、[Alchemy ダッシュボード](https://dashboard.alchemyapi.io/explorer)の Explorer タブに移動してみましょう。 Alchemy のアプリが複数ある場合は、必ずアプリでフィルタリングし、「Hello World」を選択してください。 ![Hello WorldのExplorer](./hello-world-explorer.png) +内部で何が起こっているのかを理解するために、[Alchemyダッシュボード](https://dashboard.alchemyapi.io/explorer)のExplorerタブに移動してみましょう。 Alchemyのアプリが複数ある場合は、必ずアプリでフィルタリングし、「Hello World」を選択してください。 ![Hello WorldのExplorer](./hello-world-explorer.png) -ここでは、`.deploy()`関数を呼び出した際に、Hardhat/Ethers が内部で行った JSON-RPC の呼び出しを見ることができます。 ここで呼び出している 2 つの重要な JSON-RPC は、実際に Goerli チェーン上でコントラクトを書き込むリクエストの[`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction)と、(トランザクションの際の典型的なパターンである)ハッシュを与えられているトランザクションに関する情報を読み取るリクエストの[`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash)です。 トランザクションの送信の詳細については、こちらのチュートリアルの[Web3 を使用したトランザクションの送信](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)をご覧ください。 +ここでは、`.deploy()`関数を呼び出した際に、Hardhat/Ethersが内部で行ったJSON-RPCの呼び出しを見ることができます。 ここで呼び出している2つの重要なJSON-RPCは、実際にGoerliチェーン上でコントラクトを書き込むリクエストの[`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction)と、(トランザクションの際の典型的なパターンである)ハッシュを与えられているトランザクションに関する情報を読み取るリクエストの[`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash)です。 トランザクションの送信の詳細については、こちらのチュートリアルの[Web3を使用したトランザクションの送信](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)をご覧ください。 -こちらのチュートリアルのパート 1 は以上となります。パート 2 では初期メッセージの更新による[スマートコントラクトとの実際のやり取り](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#part-2-interact-with-your-smart-contract)を、パート 3 では[Etherscan へのスマートコントラクトの公開](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#optional-part-3-publish-your-smart-contract-to-etherscan)を行い、やり取りする方法を学びます。 +こちらのチュートリアルのパート1は以上となります。パート2では初期メッセージの更新による[スマートコントラクトとの実際のやり取り](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#part-2-interact-with-your-smart-contract)を、パート3では[Etherscanへのスマートコントラクトの公開](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#optional-part-3-publish-your-smart-contract-to-etherscan)を行い、やり取りする方法を学びます。 -**Alchemy の詳細については、 [ウェブサイト](https://alchemyapi.io/eth)をご覧ください。 アップデートを見逃したくない場合は、 [こちら](https://www.alchemyapi.io/newsletter)でニュースレターを購読してください。 [Twitter](https://twitter.com/alchemyplatform)もあわせてフォローし、[Discord](https://discord.com/invite/u72VCg3)**にもご参加ください。 +**Alchemyの詳細については、 [ウェブサイト](https://alchemyapi.io/eth)をご覧ください。 アップデートを見逃したくない場合は、 [こちら](https://www.alchemyapi.io/newsletter)でニュースレターを購読してください。 [Twitter](https://twitter.com/alchemyplatform)もあわせてフォローし、[Discord](https://discord.com/invite/u72VCg3)**にもご参加ください。 diff --git a/public/content/translations/ja/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/ja/developers/tutorials/interact-with-other-contracts-from-solidity/index.md index 737324bd123..de8baa117fa 100644 --- a/public/content/translations/ja/developers/tutorials/interact-with-other-contracts-from-solidity/index.md +++ b/public/content/translations/ja/developers/tutorials/interact-with-other-contracts-from-solidity/index.md @@ -16,7 +16,7 @@ sourceUrl: https://ethereumdev.io/interact-with-other-contracts-from-solidity/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -これまでのチュートリアルでは、[最初のスマートコントラクトをデプロイする方法](/developers/tutorials/deploying-your-first-smart-contract/)と、[修飾子によるアクセス制御](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/)や[Solidity でのエラー処理](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/)といったいくつかの機能を追加する方法について学びました。 このチュートリアルでは、既存のコントラクトからスマートコントラクトをデプロイし、それを活用する方法について説明します。 +これまでのチュートリアルでは、[最初のスマートコントラクトをデプロイする方法](/developers/tutorials/deploying-your-first-smart-contract/)と、[修飾子によるアクセス制御](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/)や[Solidityでのエラー処理](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/)といったいくつかの機能を追加する方法について学びました。 このチュートリアルでは、既存のコントラクトからスマートコントラクトをデプロイし、それを活用する方法について説明します。 ここでは、`CounterFactory`という名前のファクトリーを作成することで、誰でも自分の`Counter`スマートコントラクトを所有できるようにするコントラクトを作成します。 初めに、これが`Counter`スマートコントラクトの初期コードです。 @@ -56,7 +56,7 @@ contract Counter { } ``` -ファクトリーのアドレスとコントラクト所有者のアドレスを追跡するために、コントラクトコードを少し変更していることに注意してください。 他のコントラクトからコントラクトコードを呼び出した場合、msg.sender はコントラクトファクトリーのアドレスを参照します。 コントラクトを使用して他のコントラクトとやり取りすることはよくあることなので、これは**理解しておくべき非常に重要なポイント**です。 したがって、複雑なケースでは誰が送信者なのかに注意を払う必要があります。 +ファクトリーのアドレスとコントラクト所有者のアドレスを追跡するために、コントラクトコードを少し変更していることに注意してください。 他のコントラクトからコントラクトコードを呼び出した場合、msg.senderはコントラクトファクトリーのアドレスを参照します。 コントラクトを使用して他のコントラクトとやり取りすることはよくあることなので、これは**理解しておくべき非常に重要なポイント**です。 したがって、複雑なケースでは誰が送信者なのかに注意を払う必要があります。 このために、`onlyFactory`という修飾子も追加しました。この修飾子は、元の呼び出し元をパラメータとして渡すファクトリーのみが、状態変更関数を呼び出せるようにします。 @@ -66,7 +66,7 @@ contract Counter { mapping(address => Counter) _counters; ``` -イーサリアムでは、マッピングは JavaScript のオブジェクトに相当します。これは、型 A のキーを型 B の値にマッピングできます。ここでは、所有者のアドレスをそのカウンターのインスタンスにマッピングしています。 +イーサリアムでは、マッピングはJavaScriptのオブジェクトに相当します。これは、型Aのキーを型Bの値にマッピングできます。ここでは、所有者のアドレスをそのカウンターのインスタンスにマッピングしています。 ユーザーのために新しいカウンターをインスタンス化する場合は、次のようになります。 @@ -77,7 +77,7 @@ mapping(address => Counter) _counters; } ``` -まず、そのユーザーがすでにカウンターを所有しているかどうかを確認します。 もしカウンターを所有していなければ(カウンターの数が 0 ならば)、そのアドレスを`Counter`コンストラクタに渡して新しいカウンターをインスタンス化し、新しく作成したインスタンスをマッピングに割り当てます。 +まず、そのユーザーがすでにカウンターを所有しているかどうかを確認します。 もしカウンターを所有していなければ(カウンターの数が0ならば)、そのアドレスを`Counter`コンストラクタに渡して新しいカウンターをインスタンス化し、新しく作成したインスタンスをマッピングに割り当てます。 特定のカウンターの数を取得する場合は、次のようになります。 @@ -92,7 +92,7 @@ function getMyCount() public view returns (uint256) { } ``` -最初の関数は、指定されたアドレスに Counter コントラクトが存在するかどうかをチェックし、存在する場合にインスタンスから`getCount`メソッドを呼び出します。 2 番目の関数`getMyCount`は、msg.sender を直接`getCount`関数に渡す短い関数です。 +最初の関数は、指定されたアドレスにCounterコントラクトが存在するかどうかをチェックし、存在する場合にインスタンスから`getCount`メソッドを呼び出します。 2番目の関数`getMyCount`は、msg.senderを直接`getCount`関数に渡す短い関数です。 `increment`関数もかなり類似していますが、`Counter`コントラクトに元のトランザクション送信者を渡します。 @@ -103,9 +103,9 @@ function increment() public { } ``` -この関数を何度も呼び出すと、カウンターがオーバーフローする可能性がありますので注意してください。 オーバーフローが発生しないように、できる限り[SafeMath ライブラリ](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/)を使用してください。 +この関数を何度も呼び出すと、カウンターがオーバーフローする可能性がありますので注意してください。 オーバーフローが発生しないように、できる限り[SafeMathライブラリ](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/)を使用してください。 -このコントラクトをデプロイするためには、`CounterFactory`と`Counter`の両方のコードが必要です。 例えば Remix でデプロイする場合、CounterFactory を選択する必要があります。 +このコントラクトをデプロイするためには、`CounterFactory`と`Counter`の両方のコードが必要です。 例えばRemixでデプロイする場合、CounterFactoryを選択する必要があります。 これが完成したコードです。 @@ -170,8 +170,8 @@ contract CounterFactory { } ``` -コンパイル後、Remix のデプロイセクションで、デプロイするファクトリーを選択します。 +コンパイル後、Remixのデプロイセクションで、デプロイするファクトリーを選択します。 ![Remixにデプロイするファクトリーの選択](./counterfactory-deploy.png) -コントラクトファクトリーを使うと、値の変化を確認できます。 もし、別のアドレスからスマートコントラクトを呼び出したい場合は、Remix のアカウントの選択で別のアドレスに変更する必要があります。 +コントラクトファクトリーを使うと、値の変化を確認できます。 もし、別のアドレスからスマートコントラクトを呼び出したい場合は、Remixのアカウントの選択で別のアドレスに変更する必要があります。 diff --git a/public/content/translations/ja/developers/tutorials/nft-minter/index.md b/public/content/translations/ja/developers/tutorials/nft-minter/index.md index 704e20b0dcb..7ae743e9bb1 100644 --- a/public/content/translations/ja/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/ja/developers/tutorials/nft-minter/index.md @@ -14,62 +14,62 @@ lang: ja published: 2021-10-06 --- -Web2 のバックグラウンドを持つデベロッパーの最大の課題の 1 つは、スマートコントラクトをフロントエンドのプロジェクトに接続し、やり取りを行う方法を理解することです。 +Web2のバックグラウンドを持つデベロッパーの最大の課題の1つは、スマートコントラクトをフロントエンドのプロジェクトに接続し、やり取りを行う方法を理解することです。 -ここでは、デジタル資産へのリンク、タイトル、説明を入力できるシンプルな UI を備えた非代替性トークン(NFT)ミンターを構築することで、次の方法を学びます。 +ここでは、デジタル資産へのリンク、タイトル、説明を入力できるシンプルなUIを備えた非代替性トークン(NFT)ミンターを構築することで、次の方法を学びます。 -- フロントエンドのプロジェクト経由で MetaMask に接続する +- フロントエンドのプロジェクト経由でMetaMaskに接続する - フロントエンドからスマートコントラクトメソッドを呼び出す -- MetaMask を使用してトランザクションに署名する +- MetaMaskを使用してトランザクションに署名する -このチュートリアルでは、[React](https://reactjs.org/)をフロントエンドフレームワークとして使用します。 このチュートリアルは Web3 開発に焦点を当てているので、React の基礎についての説明に多くの時間を費やせません。 代わりに、プロジェクトの機能性を高めることに注力します。 +このチュートリアルでは、[React](https://reactjs.org/)をフロントエンドフレームワークとして使用します。 このチュートリアルはWeb3開発に焦点を当てているので、Reactの基礎についての説明に多くの時間を費やせません。 代わりに、プロジェクトの機能性を高めることに注力します。 -前提条件として、React に関する初級レベルの知識を有している必要があります。つまり、コンポーネント、プロパティ(props)、useState および useEffect、基本関数の呼び出しなどの仕組みを理解している必要があります。 これらの中に初めて耳にする用語がある場合は、[React の入門チュートリアル](https://reactjs.org/tutorial/tutorial.html)をご覧ください。 より視覚的な学習を好む方には、Net Ninja による素晴らしい[フルモダン React チュートリアル](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d)のビデオシリーズをお勧めします。 +前提条件として、Reactに関する初級レベルの知識を有している必要があります。つまり、コンポーネント、プロパティ(props)、useStateおよびuseEffect、基本関数の呼び出しなどの仕組みを理解している必要があります。 これらの中に初めて耳にする用語がある場合は、[Reactの入門チュートリアル](https://reactjs.org/tutorial/tutorial.html)をご覧ください。 より視覚的な学習を好む方には、Net Ninjaによる素晴らしい[フルモダンReactチュートリアル](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d)のビデオシリーズをお勧めします。 -まだ Alchemy アカウントをお持ちでない場合、このチュートリアルを完了したり、ブロックチェーンで何かを構築したりするために必ず必要になりますので、 [こちらから](https://alchemy.com/)無料アカウントに登録してください。 +まだAlchemyアカウントをお持ちでない場合、このチュートリアルを完了したり、ブロックチェーンで何かを構築したりするために必ず必要になりますので、 [こちらから](https://alchemy.com/)無料アカウントに登録してください。 それでは、さっそく始めましょう! ## 非代替性トークン(NFT)作成入門 {#making-nfts-101} -コードを見始める前に、非代替性トークン(NFT)作成の仕組みを理解することが重要です。 それには、次の 2 つのステップがあります。 +コードを見始める前に、非代替性トークン(NFT)作成の仕組みを理解することが重要です。 それには、次の2つのステップがあります。 ### イーサリアムブロックチェーン上で非代替性トークン(NFT)スマートコントラクトを公開 {#publish-nft} -ERC-1155 と ERC-721 の 2 つのスマートコントラクト規格の最大の違いは、ERC-1155 はマルチトークン規格でありバッチ機能を備えているのに対し、ERC-721 はシングルトークン規格であり一度に 1 つのトークンの送信しかサポートしていないことです。 +ERC-1155とERC-721の2つのスマートコントラクト規格の最大の違いは、ERC-1155はマルチトークン規格でありバッチ機能を備えているのに対し、ERC-721はシングルトークン規格であり一度に1つのトークンの送信しかサポートしていないことです。 ### ミント関数の呼び出し {#minting-function} -通常、このミント関数は、パラメータとして 2 つの変数を渡す必要があります。1 つ目は、新しくミントされた非代替性トークン(NFT)を受け取るアドレスを指定する`recipient`です。2 つ目は、非代替性トークン(NFT)のメタデータを記述する JSON ドキュメントに解決される文字列である非代替性トークン(NFT)の`tokenURI`です。 +通常、このミント関数は、パラメータとして2つの変数を渡す必要があります。1つ目は、新しくミントされた非代替性トークン(NFT)を受け取るアドレスを指定する`recipient`です。2つ目は、非代替性トークン(NFT)のメタデータを記述するJSONドキュメントに解決される文字列である非代替性トークン(NFT)の`tokenURI`です。 -非代替性トークン(NFT)のメタデータは、非代替性トークン(NFT)に名前、説明、画像(または別のデジタル資産)、その他の属性などのプロパティを持たせ、非代替性トークン(NFT)を利用できるようにします。 非代替性トークン(NFT)のメタデータが含まれている[tokenURI の例](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2)をご覧ください。 +非代替性トークン(NFT)のメタデータは、非代替性トークン(NFT)に名前、説明、画像(または別のデジタル資産)、その他の属性などのプロパティを持たせ、非代替性トークン(NFT)を利用できるようにします。 非代替性トークン(NFT)のメタデータが含まれている[tokenURIの例](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2)をご覧ください。 -このチュートリアルでは、React UI を使用して既存の非代替性トークン(NFT)のスマートコントラクトのミント関数を呼び出すパート 2(後半)の方に焦点を当てています。 +このチュートリアルでは、React UIを使用して既存の非代替性トークン(NFT)のスマートコントラクトのミント関数を呼び出すパート2(後半)の方に焦点を当てています。 -このチュートリアルで呼び出す ERC-721 非代替性トークン(NFT)スマートコントラクトへのリンクは、[こちら](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE)です。 この作成方法について知りたい場合は、[非代替性トークン(NFT)の作り方](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft)という別のチュートリアルを確認することを強くお勧めします。 +このチュートリアルで呼び出すERC-721非代替性トークン(NFT)スマートコントラクトへのリンクは、[こちら](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE)です。 この作成方法について知りたい場合は、[非代替性トークン(NFT)の作り方](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft)という別のチュートリアルを確認することを強くお勧めします。 非代替性トークン(NFT)作成の仕組みを理解したところで、スターターファイルをクローンしましょう。 ## スターターファイルのクローン {#clone-the-starter-files} -最初に、[非代替性トークン(NFT)ミンターチュートリアル(nft-minter-tutorial)の GitHub リポジトリ](https://github.com/alchemyplatform/nft-minter-tutorial)にアクセスし、このプロジェクトのスターターファイルを取得します。 リポジトリをローカル環境にクローンします。 +最初に、[非代替性トークン(NFT)ミンターチュートリアル(nft-minter-tutorial)のGitHubリポジトリ](https://github.com/alchemyplatform/nft-minter-tutorial)にアクセスし、このプロジェクトのスターターファイルを取得します。 リポジトリをローカル環境にクローンします。 -クローンされた`nft-minter-tutorial`リポジトリを開くと、`minter-starter-files`と`nft-minter`という 2 つのフォルダが含まれています。 +クローンされた`nft-minter-tutorial`リポジトリを開くと、`minter-starter-files`と`nft-minter`という2つのフォルダが含まれています。 -- `minter-starter-files`には、このプロジェクトのスターターファイル(基本的には React UI)が含まれています。 このチュートリアルでは、イーサリアムウォレットと非代替性トークン(NFT)スマートコントラクトに接続することで、この UI を利用できるようにする方法を学ぶ際に、**こちらのディレクトリで作業します**。 -- `nft-minter`には、完成したチュートリアル全体が含まれており、**困ったときに\*\***リファレンス\*\*として利用できます。 +- `minter-starter-files`には、このプロジェクトのスターターファイル(基本的にはReact UI)が含まれています。 このチュートリアルでは、イーサリアムウォレットと非代替性トークン(NFT)スマートコントラクトに接続することで、このUIを利用できるようにする方法を学ぶ際に、**こちらのディレクトリで作業します**。 +- `nft-minter`には、完成したチュートリアル全体が含まれており、**困ったときに****リファレンス**として利用できます。 次に、コードエディタで`minter-starter-files`のコピーを開き、`src`フォルダに移動します。 -これから作成するすべてのコードは、`src`フォルダに保存されます。 後ほど`Minter.js`コンポーネントを編集し、追加の javascript ファイルを書くことで、このプロジェクトに Web3 機能を追加します。 +これから作成するすべてのコードは、`src`フォルダに保存されます。 後ほど`Minter.js`コンポーネントを編集し、追加のjavascriptファイルを書くことで、このプロジェクトにWeb3機能を追加します。 -## ステップ 2: スターターファイルの確認 {#step-2-check-out-our-starter-files} +## ステップ2: スターターファイルの確認 {#step-2-check-out-our-starter-files} コーディングを始める前に、スターターファイルで既に提供されるものを確認することが重要です。 -### React プロジェクトの実行 {#get-your-react-project-running} +### Reactプロジェクトの実行 {#get-your-react-project-running} -まずは、ブラウザで React プロジェクトを実行しましょう。 React の素晴らしいところは、一度ブラウザでプロジェクトを実行すると、保存した変更がブラウザでも同時に更新されることです。 +まずは、ブラウザでReactプロジェクトを実行しましょう。 Reactの素晴らしいところは、一度ブラウザでプロジェクトを実行すると、保存した変更がブラウザでも同時に更新されることです。 プロジェクトを実行するには、次のようにターミナルで`minter-starter-files`フォルダのルートディレクトリに移動し、`npm install`を実行してプロジェクトの依存関係をインストールします。 @@ -84,15 +84,15 @@ npm install npm start ``` -これにより、ブラウザで http://localhost:3000/が開き、プロジェクトのフロントエンドが表示されます。 フロントエンドは 3 つのフィールドで構成されており、それぞれ、非代替性トークン(NFT)資産へのリンク、非代替性トークン(NFT)の名前、非代替性トークン(NFT)の説明を入力する場所になっています。 +これにより、ブラウザでhttp://localhost:3000/が開き、プロジェクトのフロントエンドが表示されます。 フロントエンドは3つのフィールドで構成されており、それぞれ、非代替性トークン(NFT)資産へのリンク、非代替性トークン(NFT)の名前、非代替性トークン(NFT)の説明を入力する場所になっています。 「Connect Wallet」や「Mint NFT」ボタンをクリックしても、動作しません。これらの機能は、これからプログラムする必要があります。 :\) -### Minter.js コンポーネント {#minter-js} +### Minter.jsコンポーネント {#minter-js} **注:** `minter-starter-files`フォルダにいることを確認してください。`nft-minter`フォルダではないことを確認します。 -エディタの`src`フォルダに戻り、`Minter.js`ファイルを開きましょう。 このファイルには、これから作業を進めていく主要な React コンポーネントが含まれています。すべての内容を理解することが非常に重要です。 +エディタの`src`フォルダに戻り、`Minter.js`ファイルを開きましょう。 このファイルには、これから作業を進めていく主要なReactコンポーネントが含まれています。すべての内容を理解することが非常に重要です。 このファイルの上部には、特定のイベントの後に更新される状態変数(State Variable)があります。 @@ -105,17 +105,17 @@ const [description, setDescription] = useState("") const [url, setURL] = useState("") ``` -React の状態変数や状態フック(State Hook)を聞いたことがない場合は、 [こちらの](https://reactjs.org/docs/hooks-state.html)ドキュメントをご覧ください。 +Reactの状態変数や状態フック(State Hook)を聞いたことがない場合は、 [こちらの](https://reactjs.org/docs/hooks-state.html)ドキュメントをご覧ください。 それぞれの変数は以下を示します。 - `walletAddress` - ユーザーのウォレットアドレスを格納する文字列 -- `status` - UI の下部に表示するメッセージを含む文字列 +- `status` - UIの下部に表示するメッセージを含む文字列 - `name` - 非代替性トークン(NFT)の名前を格納する文字列 - `description` - 非代替性トークン(NFT)の説明を格納する文字列 - `url` - 非代替性トークン(NFT)のデジタル資産へのリンクを含んだ文字列 -状態変数(State Variable)の後に、`useEffect`、`connectWalletPressed`、`onMintPressed`という 3 つの未実装の関数があります。 これらの関数は、すべて`async`になっています。これは、それぞれの関数で非同期 API 呼び出しを行うためです。 それぞれの関数の名前は、その機能を示しています。 +状態変数(State Variable)の後に、`useEffect`、`connectWalletPressed`、`onMintPressed`という3つの未実装の関数があります。 これらの関数は、すべて`async`になっています。これは、それぞれの関数で非同期API呼び出しを行うためです。 それぞれの関数の名前は、その機能を示しています。 ```javascript useEffect(async () => { @@ -131,13 +131,13 @@ const onMintPressed = async () => { } ``` -- [`useEffect`](https://reactjs.org/docs/hooks-effect.html) - コンポーネントがレンダリングされた後に呼び出される React フックです。 空の配列`[]`の prop が渡される(3 行目を参照)ため、コンポーネントの*最初*のレンダリングでのみ呼び出されます。 ここでは、ウォレットリスナーと別のウォレット関数を呼び出し、ウォレットが接続されているかどうかに応じた UI の更新をします。 -- `connectWalletPressed` - この関数は、ユーザーの MataMask ウォレットを分散型アプリケーション(Dapp)に接続するために呼び出されます。 +- [`useEffect`](https://reactjs.org/docs/hooks-effect.html) - コンポーネントがレンダリングされた後に呼び出されるReactフックです。 空の配列`[]`のpropが渡される(3行目を参照)ため、コンポーネントの_最初_のレンダリングでのみ呼び出されます。 ここでは、ウォレットリスナーと別のウォレット関数を呼び出し、ウォレットが接続されているかどうかに応じたUIの更新をします。 +- `connectWalletPressed` - この関数は、ユーザーのMataMaskウォレットを分散型アプリケーション(Dapp)に接続するために呼び出されます。 - `onMintPressed` - この関数は、ユーザーの非代替性トークン(NFT)をミントするために呼び出されます。 -このファイルの終盤には、コンポーネントの UI があります。 このコードを注意深く読んでいくと、状態変数の`url`、`name`、`description`に対応するテキストフィールドの入力が変更された場合、これらの変数を更新していることが分かります。 +このファイルの終盤には、コンポーネントのUIがあります。 このコードを注意深く読んでいくと、状態変数の`url`、`name`、`description`に対応するテキストフィールドの入力が変更された場合、これらの変数を更新していることが分かります。 -さらに、`walletButton`または`mintButton`という ID を持つボタンがクリックされると、それぞれ`connectWalletPressed`または`onMintPressed`が呼び出されることも分かります。 +さらに、`walletButton`または`mintButton`というIDを持つボタンがクリックされると、それぞれ`connectWalletPressed`または`onMintPressed`が呼び出されることも分かります。 ```javascript //the UI of our component @@ -189,43 +189,43 @@ return ( 最後に、このミンター(Minter)コンポーネントがどこに加えられるかについて説明します。 -他のすべてのコンポーネントのコンテナとして機能する、React のメインコンポーネントである`App.js`ファイルを表示すると、ミンター(Minter)コンポーネントが 7 行目に挿入されていることが分かります。 +他のすべてのコンポーネントのコンテナとして機能する、Reactのメインコンポーネントである`App.js`ファイルを表示すると、ミンター(Minter)コンポーネントが7行目に挿入されていることが分かります。 **このチュートリアルでは、`Minter.js`ファイルの編集と、`src`フォルダへのファイルの追加のみを行います。** これから取り組む内容を理解したところで、イーサリアムウォレットを設定しましょう。 -## イーサリアムウォレットの設定{#set-up-your-ethereum-wallet} +## イーサリアムウォレットの設定 {#set-up-your-ethereum-wallet} ユーザーがスマートコントラクトとやり取りできるようにするには、自分のイーサリアムウォレットを分散型アプリケーション(Dapp)に接続する必要があります。 -### MetaMask をダウンロード {#download-metamask} +### MetaMaskをダウンロード {#download-metamask} -このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットである Metamask を使用します。 イーサリアムのトランザクションの仕組みの詳細については、[こちらのページ](/developers/docs/transactions/)をご覧ください。 +このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 イーサリアムのトランザクションの仕組みの詳細については、[こちらのページ](/developers/docs/transactions/)をご覧ください。 -Metamask のアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は、(実際に支払いが発生しないように)右上の「Ropsten Test Network」に切り替えてください。 +Metamaskのアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は、(実際に支払いが発生しないように)右上の「Ropsten Test Network」に切り替えてください。 ### フォーセットからイーサ(ETH)を追加 {#add-ether-from-faucet} -非代替性トークン(NFT)をミントする(または、イーサリアムのブロックチェーンのトランザクションに署名する)には、偽の ETH が必要です。 ETH を取得するには、[Ropsten フォーセット](https://faucet.ropsten.be/)にアクセスして、Ropsten アカウントアドレスを入力し、「Send Ropsten ETH」をクリックします。 Metamask アカウントに ETH が表示されるはずです。 +非代替性トークン(NFT)をミントする(または、イーサリアムのブロックチェーンのトランザクションに署名する)には、偽のETHが必要です。 ETHを取得するには、[Ropstenフォーセット](https://faucet.ropsten.be/)にアクセスして、Ropstenアカウントアドレスを入力し、「Send Ropsten ETH」をクリックします。 MetamaskアカウントにETHが表示されるはずです。 ### 残高の確認 {#check-your-balance} -残高を再確認するために、[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)を使用して[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)をリクエストしてみましょう。 このリクエストをすると、ウォレット内の ETH の額が返されます。 MetaMask アカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。 +残高を再確認するために、[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)を使用して[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)をリクエストしてみましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 MetaMaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。 ```text {"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} ``` -**注:** この結果の単位は、ETH ではなく wei です。 wei は ETH の最小単位として使われています。 wei から ETH へ変換すると、1 eth = 10¹⁸ wei になります。 つまり、0xde0b6b3a7640000 を 10 進数に変換すると、1\*10¹⁸ となり、1 ETH に相当します。 +**注:** この結果の単位は、ETHではなくweiです。 weiはETHの最小単位として使われています。 weiからETHへ変換すると、1 eth = 10¹⁸ weiになります。 つまり、0xde0b6b3a7640000を10進数に変換すると、1\*10¹⁸となり、1 ETHに相当します。 ふう! これで、偽のお金を手に入れました。 -## MetaMask を UI に接続 {#connect-metamask-to-your-UI} +## MetaMaskをUIに接続 {#connect-metamask-to-your-UI} -MetaMask ウォレットが設定されたので、分散型アプリケーション(Dapp)を接続しましょう。 +MetaMaskウォレットが設定されたので、分散型アプリケーション(Dapp)を接続しましょう。 -[モデルビューコントローラ(MVC)](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)パラダイムを実践したいので、別のファイルを作成し、分散型アプリケーション(Dapp)のロジック、データ、ルールを管理する関数を含めます。次に、それらの関数をフロントエンド(Minter.js コンポーネント)に渡します。 +[モデルビューコントローラ(MVC)](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)パラダイムを実践したいので、別のファイルを作成し、分散型アプリケーション(Dapp)のロジック、データ、ルールを管理する関数を含めます。次に、それらの関数をフロントエンド(Minter.jsコンポーネント)に渡します。 ### `connectWallet`関数 {#connect-wallet-function} @@ -276,24 +276,24 @@ export const connectWallet = async () => { まず、ブラウザで`window.ethereum`が有効になっているかどうかを関数がチェックしています。 -`window.ethereum`は、MetaMask および他のウォレットプロバイダーによって挿入されるグローバル API であり、ウェブサイトがユーザーのイーサリアムアカウントを要求できるようにするものです。 承認されると、ユーザーが接続しているブロックチェーンからデータを読み取ったり、メッセージやトランザクションへの署名をユーザーに提案したりできるようになります。 詳細については、[MetaMask のドキュメント](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents)を参照してください。 +`window.ethereum`は、MetaMaskおよび他のウォレットプロバイダーによって挿入されるグローバルAPIであり、ウェブサイトがユーザーのイーサリアムアカウントを要求できるようにするものです。 承認されると、ユーザーが接続しているブロックチェーンからデータを読み取ったり、メッセージやトランザクションへの署名をユーザーに提案したりできるようになります。 詳細については、[MetaMaskのドキュメント](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents)を参照してください。 -`window.ethereum`が*存在しない*場合は、MeTaMask がインストールされていないことを意味します。 その結果、空の文字列に設定された、返される`address`と、ユーザーが MetaMask をインストールする必要があることを伝える`status`JSX オブジェクトが入った JSON オブジェクトが返されます。 +`window.ethereum`が_存在しない_場合は、MeTaMaskがインストールされていないことを意味します。 その結果、空の文字列に設定された、返される`address`と、ユーザーがMetaMaskをインストールする必要があることを伝える`status`JSXオブジェクトが入ったJSONオブジェクトが返されます。 -**これから記述するほとんどの関数は、状態変数(State Variable)と UI の更新に使用できる JSON オブジェクトを返します。** +**これから記述するほとんどの関数は、状態変数(State Variable)とUIの更新に使用できるJSONオブジェクトを返します。** -`window.ethereum`が*存在*する場合、興味深いことが起こります。 +`window.ethereum`が_存在_する場合、興味深いことが起こります。 -try/catch ループを使用して、`[window.ethereum.request({ method: "eth_requestAccounts" });](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts)`を呼び出すことで、MetaMask への接続を試みます。 この関数を呼び出すと、ブラウザで MetaMask が開き、ユーザーはウォレットを分散型アプリケーション(Dapp)に接続するように求められます。 +try/catchループを使用して、`[window.ethereum.request({ method: "eth_requestAccounts" });](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts)`を呼び出すことで、MetaMaskへの接続を試みます。 この関数を呼び出すと、ブラウザでMetaMaskが開き、ユーザーはウォレットを分散型アプリケーション(Dapp)に接続するように求められます。 -- ユーザーが接続を選んだ場合、`method: "eth_requestAccounts"`は、分散型アプリケーション(Dapp)に接続されているすべてのユーザーのアカウントアドレスを含む配列を返します。 `connectWallet`関数は、配列内の*最初の*`address`と\(9 行目参照\)、ユーザーにスマートコントラクトにメッセージを書き込むように促す`status`メッセージが入った JSON オブジェクトを返します。 -- ユーザーが接続を拒否した場合、JSON オブジェクトには、返される`address`に入る空の文字列と、ユーザーが接続を拒否したことを示す`status`メッセージが入ることになります。 +- ユーザーが接続を選んだ場合、`method: "eth_requestAccounts"`は、分散型アプリケーション(Dapp)に接続されているすべてのユーザーのアカウントアドレスを含む配列を返します。 `connectWallet`関数は、配列内の_最初の_`address`と\(9 行目参照\)、ユーザーにスマートコントラクトにメッセージを書き込むように促す`status`メッセージが入ったJSONオブジェクトを返します。 +- ユーザーが接続を拒否した場合、JSONオブジェクトには、返される`address`に入る空の文字列と、ユーザーが接続を拒否したことを示す`status`メッセージが入ることになります。 -### Minter.js UI コンポーネントに connectWallet 関数を追加 {#add-connect-wallet} +### Minter.js UIコンポーネントにconnectWallet関数を追加 {#add-connect-wallet} `connectWallet`関数を記述したので、 `Minter.js`コンポーネントに接続しましょう。 -まず、`Minter.js`ファイルの上部に`import { connectWallet } from "./utils/interact.js";`を追加して、`Minter.js`ファイルに関数をインポートする必要があります。 `Minter.js`の最初の 11 行は、次のようになります。 +まず、`Minter.js`ファイルの上部に`import { connectWallet } from "./utils/interact.js";`を追加して、`Minter.js`ファイルに関数をインポートする必要があります。 `Minter.js`の最初の11行は、次のようになります。 ```javascript import { useEffect, useState } from "react"; @@ -321,21 +321,21 @@ const connectWalletPressed = async () => { `interact.js`ファイルによって、機能の大部分が`Minter.js`コンポーネントからどのように抽象化されているかに注目してください。 これは、モデルビューコントローラ(M-V-C)パラダイムに準拠しているためです。 -`connectWalletPressed`では、単にインポートされた`connectWallet`関数の await 呼び出しを行っています。さらに、そのレスポンスを使用し、`status`と`walletAddress`変数を状態フックを介して更新しています。 +`connectWalletPressed`では、単にインポートされた`connectWallet`関数のawait呼び出しを行っています。さらに、そのレスポンスを使用し、`status`と`walletAddress`変数を状態フックを介して更新しています。 -それでは、 `Minter.js`と `interact.js`の両方のファイルを保存して、これまでの UI をテストしてみましょう。 +それでは、 `Minter.js`と `interact.js`の両方のファイルを保存して、これまでのUIをテストしてみましょう。 -localhost:3000 でブラウザを開き、ページ右上にある「Connect Wallet」ボタンを押します。 +localhost:3000でブラウザを開き、ページ右上にある「Connect Wallet」ボタンを押します。 -MetaMask がインストールされている場合は、ウォレットを分散型アプリケーション(Dapp)に接続するように求められます。 接続リクエストを承認します。 +MetaMaskがインストールされている場合は、ウォレットを分散型アプリケーション(Dapp)に接続するように求められます。 接続リクエストを承認します。 ウォレットボタンに、接続した自分のアドレスが表示されているはずです。 -次に、ページを更新してみてください。変ですね。 ウォレットボタンによって、すでに接続しているにもかかわらず MetaMask に接続するよう求められます。 +次に、ページを更新してみてください。変ですね。 ウォレットボタンによって、すでに接続しているにもかかわらずMetaMaskに接続するよう求められます。 -でも心配しないでください。 `getCurrentWalletConnected`という関数を実装することで、簡単にこれを修正できます。この関数は、アドレスが分散型アプリケーション(Dapp)にすでに接続されているかどうかを確認し、それに応じて UI を更新します。 +でも心配しないでください。 `getCurrentWalletConnected`という関数を実装することで、簡単にこれを修正できます。この関数は、アドレスが分散型アプリケーション(Dapp)にすでに接続されているかどうかを確認し、それに応じてUIを更新します。 -### getCurrentWalletConnected 関数 {#get-current-wallet} +### getCurrentWalletConnected関数 {#get-current-wallet} `interact.js`ファイルに、以下の`getCurrentWalletConnected`関数を追加します。 @@ -382,9 +382,9 @@ export const getCurrentWalletConnected = async () => { } ``` -このコードは、*非常に*前述の`connectWallet`関数に似ています。 +このコードは、_非常に_前述の`connectWallet`関数に似ています。 -主な違いとしては、ユーザーがウォレットに接続するために MetaMask を開く`eth_requestAccounts`メソッドを呼び出す代わりに、 ここでは`eth_accounts`メソッドを呼び出しています。これは、現在、分散型アプリケーション(Dapp)に接続されている MetaMask のアドレスを含む配列を単に返すだけです。 +主な違いとしては、ユーザーがウォレットに接続するためにMetaMaskを開く`eth_requestAccounts`メソッドを呼び出す代わりに、 ここでは`eth_accounts`メソッドを呼び出しています。これは、現在、分散型アプリケーション(Dapp)に接続されているMetaMaskのアドレスを含む配列を単に返すだけです。 この関数を動作させるため、`Minter.js`コンポーネントの`useEffect`関数で呼び出しましょう。 @@ -412,9 +412,9 @@ useEffect(async () => { このコードを追加したら、ブラウザウィンドウを更新してみてください。 リフレッシュ後も、ボタンには接続されていることが示されており、接続されたウォレットのアドレスのプレビューが表示されているはずです。 -### addWalletListener の実装 {#implement-add-wallet-listener} +### addWalletListenerの実装 {#implement-add-wallet-listener} -分散型アプリケーション(Dapp)ウォレットの設定の最終ステップは、ウォレットリスナーを実装することです。これにより、ユーザーが接続を切断したり、アカウントを切り替えたりした場合など、ウォレットの状態が変更されたときに UI が更新されます。 +分散型アプリケーション(Dapp)ウォレットの設定の最終ステップは、ウォレットリスナーを実装することです。これにより、ユーザーが接続を切断したり、アカウントを切り替えたりした場合など、ウォレットの状態が変更されたときにUIが更新されます。 `Minter.js`ファイルで、次のような`addWalletListener`関数を追加してください。 @@ -445,9 +445,9 @@ function addWalletListener() { ここで何が起きているか、簡単に見ていきましょう。 -- まず、ブラウザで`window.ethereum`が有効になっているか\(すなわち MetaMask がインストールされているか\)を関数がチェックしています。 - - 有効になっていない場合、ユーザーに MetaMask のインストールを求める JSX 文字列を`status`状態変数に設定します。 - - 有効になっている場合、MetaMask ウォレットの状態変更をリッスンしている 3 行目の`window.ethereum.on("accountsChanged")`リスナーを設定します。この状態変更には、ユーザーが追加のアカウントを分散型アプリケーション(Dapp)に接続した場合、アカウントを切り替えた場合、アカウントを切断した場合が含まれます。 少なくとも 1 つのアカウントが接続されていれば、`accounts`配列の最初のアカウントがリスナーから返されたときに、`walletAddress`状態変数が更新されます。 それ以外の場合は、`walletAddress`に空の文字列が設定されます。 +- まず、ブラウザで`window.ethereum`が有効になっているか\(すなわち MetaMaskがインストールされているか\)を関数がチェックしています。 + - 有効になっていない場合、ユーザーにMetaMaskのインストールを求めるJSX文字列を`status`状態変数に設定します。 + - 有効になっている場合、MetaMaskウォレットの状態変更をリッスンしている3行目の`window.ethereum.on("accountsChanged")`リスナーを設定します。この状態変更には、ユーザーが追加のアカウントを分散型アプリケーション(Dapp)に接続した場合、アカウントを切り替えた場合、アカウントを切断した場合が含まれます。 少なくとも1つのアカウントが接続されていれば、`accounts`配列の最初のアカウントがリスナーから返されたときに、`walletAddress`状態変数が更新されます。 それ以外の場合は、`walletAddress`に空の文字列が設定されます。 最後に、`useEffect`関数で次のように呼び出す必要があります。 @@ -467,31 +467,31 @@ useEffect(async () => { このチュートリアルの最初の方で説明した非代替性トークン(NFT)のメタデータを思い出してください。非代替性トークン(NFT)メタデータは、非代替性トークン(NFT)にデジタル資産、名前、説明、その他の属性などのプロパティーを持たせ、非代替性トークン(NFT)を利用できるようにします。 -JSON オブジェクトとしてメタデータを設定し、保存する必要があります。これで、スマートコントラクトの`mintNFT`関数呼び出すときに`tokenURI`パラメータとして渡すことができます。 +JSONオブジェクトとしてメタデータを設定し、保存する必要があります。これで、スマートコントラクトの`mintNFT`関数呼び出すときに`tokenURI`パラメータとして渡すことができます。 -「Link to Asset」、「Name」、「Description」フィールドのテキストは、非代替性トークン(NFT)のメタデータで別々のプロパティになります。 メタデータを JSON オブジェクトとしてフォーマットしますが、この JSON オブジェクトの格納には、以下のような複数のオプションがあります。 +「Link to Asset」、「Name」、「Description」フィールドのテキストは、非代替性トークン(NFT)のメタデータで別々のプロパティになります。 メタデータをJSONオブジェクトとしてフォーマットしますが、このJSONオブジェクトの格納には、以下のような複数のオプションがあります。 - イーサリアムブロックチェーンに格納することができますが、これは非常に高価です。 -- AWS や Firebase などの中央集権型サーバーに保存できます。 しかし、これは分散化の信念に反するものです。 +- AWSやFirebaseなどの中央集権型サーバーに保存できます。 しかし、これは分散化の信念に反するものです。 - 惑星間ファイルシステム(IPFS)という、分散型ファイルシステムでデータを保存、共有するための、分散型プロトコルおよびピアツーピア・ネットワークを使用できます。 このプロトコルは、分散化されており無料のため、最良のオプションです。 -惑星間ファイルシステム(IPFS)にメタデータを保存するには、[Pinata](https://pinata.cloud/)という便利な惑星間ファイルシステム(IPFS) API とツールキットを使用します。 次のステップでは、この方法を具体的に説明します。 +惑星間ファイルシステム(IPFS)にメタデータを保存するには、[Pinata](https://pinata.cloud/)という便利な惑星間ファイルシステム(IPFS) APIとツールキットを使用します。 次のステップでは、この方法を具体的に説明します。 -## メタデータを惑星間ファイルシステム(IPFS)にピン留めする Pintata の使用 {#use-pinata-to-pin-your-metadata-to-IPFS} +## Pinataを使用してメタデータをIPFSに固定化 {#use-pinata-to-pin-your-metadata-to-IPFS} [Pinata](https://pinata.cloud/)アカウントをお持ちでない場合は、[こちら](https://pinata.cloud/signup)から無料のアカウントにサインアップし、メールアドレスとアカウントの認証手順を完了してください。 -### Pinata API キーの作成 {#create-pinata-api-key} +### Pinata APIキーの作成 {#create-pinata-api-key} -[https://pinata.cloud/keys](https://pinata.cloud/keys)ページに移動して、上部にある「New Key」ボタンを選択し、Admin ウィジェットを有効(Enabled)に設定してからキーに名前を付けます。 +[https://pinata.cloud/keys](https://pinata.cloud/keys)ページに移動して、上部にある「New Key」ボタンを選択し、Adminウィジェットを有効(Enabled)に設定してからキーに名前を付けます。 -API 情報を含むポップアップが表示されます。 この情報は、必ず安全な場所に保存してください。 +API情報を含むポップアップが表示されます。 この情報は、必ず安全な場所に保存してください。 キーの設定が完了したので、プロジェクトに追加して使用できるようにしましょう。 -### .env ファイルの作成 {#create-a-env} +### .envファイルの作成 {#create-a-env} -環境ファイルに Pinata キーとシークレットを安全に保存できます。 [dotenv パッケージ](https://www.npmjs.com/package/dotenv)をプロジェクトディレクトリにインストールしましょう。 +環境ファイルにPinataキーとシークレットを安全に保存できます。 [dotenvパッケージ](https://www.npmjs.com/package/dotenv)をプロジェクトディレクトリにインストールしましょう。 ターミナルで\(ローカルホストを実行しているタブとは別の\)新しいタブを開き、`minter-starter-files`フォルダにいることを確認してください。次に、ターミナルで以下のコマンドを実行します。 @@ -507,20 +507,20 @@ vim.env vim\(テキストエディタ\)で `.env`ファイルが開きます。 保存するには、キーボードで「esc」+「:」+「q」をこの順序で押します。 -次に、VSCode で`.env`ファイルに移動し、次のようにして Pinata API キーと API シークレットを追加します。 +次に、VSCodeで`.env`ファイルに移動し、次のようにしてPinata APIキーとAPIシークレットを追加します。 ```text REACT_APP_PINATA_KEY = REACT_APP_PINATA_SECRET = ``` -ファイルを保存します。これで、JSON メタデータを惑星間ファイルシステム(IPFS)にアップロードする関数を書き始める準備が整いました。 +ファイルを保存します。これで、JSONメタデータを惑星間ファイルシステム(IPFS)にアップロードする関数を書き始める準備が整いました。 -### pinJSONToIPFS の実装 {#pin-json-to-ipfs} +### pinJSONToIPFSの実装 {#pin-json-to-ipfs} -幸いにも Pinata では、[惑星間ファイルシステム(IPFS)への JSON データのアップロードに特化した API](https://pinata.cloud/documentation#PinJSONToIPFS)と、少しの変更を加えるだけで使用できる axios のサンプルを備えた便利な JavaScript を使用できます。 +幸いにもPinataでは、[惑星間ファイルシステム(IPFS)へのJSONデータのアップロードに特化したAPI](https://pinata.cloud/documentation#PinJSONToIPFS)と、少しの変更を加えるだけで使用できるaxiosのサンプルを備えた便利なJavaScriptを使用できます。 -`utils`フォルダーに`pinata.js`という別のファイルを作成し、.env ファイルから Pinata のシークレットとキーをインポートしましょう。 +`utils`フォルダーに`pinata.js`という別のファイルを作成し、.envファイルからPinataのシークレットとキーをインポートしましょう。 ```javascript require("dotenv").config() @@ -566,14 +566,14 @@ export const pinJSONToIPFS = async (JSONBody) => { では、このコードは何をしているのでしょうか? -最初に、ブラウザと node.js のための Promise ベースの HTTP クライアントである[axios](https://www.npmjs.com/package/axios)をインポートしています。axios は、Pinata へのリクエストで使用します。 +最初に、ブラウザとnode.jsのためのPromiseベースのHTTPクライアントである[axios](https://www.npmjs.com/package/axios)をインポートしています。axiosは、Pinataへのリクエストで使用します。 -その下に、`pinJSONToIPFS`非同期関数があります。この関数は、`pinJSONToIPFS` API への POST リクエストを行うために、`JSONBody`を入力として取り、Pinata の API キーとシークレットをヘッダーに入れます。 +その下に、`pinJSONToIPFS`非同期関数があります。この関数は、`pinJSONToIPFS` APIへのPOSTリクエストを行うために、`JSONBody`を入力として取り、PinataのAPIキーとシークレットをヘッダーに入れます。 -- POST リクエストが成功した場合、この関数は、true に設定された`success`ブール値と、メタデータがピン留めされた`pinataUrl`が入った JSON オブジェクトを返します。 ここで返された`pinataUrl`は、スマートコントラクトの mint 関数の`tokenURI`の入力として使用されます。 -- POST リクエストが失敗した場合、この関数は、false に設定された`success`ブール値と、エラーを伝える`message`文字列が入った JSON オブジェクトを返します。 +- POSTリクエストが成功した場合、この関数は、trueに設定された`success`ブール値と、メタデータがピン留めされた`pinataUrl`が入ったJSONオブジェクトを返します。 ここで返された`pinataUrl`は、スマートコントラクトのmint関数の`tokenURI`の入力として使用されます。 +- POSTリクエストが失敗した場合、この関数は、falseに設定された`success`ブール値と、エラーを伝える`message`文字列が入ったJSONオブジェクトを返します。 -`connectWallet`関数の戻り値の型と同様に、JSON オブジェクトが返されるので、そのパラメータを状態変数と UI の更新に使用できます。 +`connectWallet`関数の戻り値の型と同様に、JSONオブジェクトが返されるので、そのパラメータを状態変数とUIの更新に使用できます。 ## スマートコントラクトのロード {#load-your-smart-contract} @@ -585,23 +585,23 @@ export const pinJSONToIPFS = async (JSONBody) => { ファイルを詳しく調べてみると、`src`ディレクトリに`contract-abi.json`ファイルがあることが分かります。 アプリケーションバイナリインターフェース(ABI)は、コントラクトが呼び出す関数を指定し、関数が確実に意図しているフォーマットでデータを返すようにするために必要です。 -さらに、イーサリアムブロックチェーンに接続してスマートコントラクトをロードするための、Alchemy API キーと Alchemy Web3 API も必要になります。 +さらに、イーサリアムブロックチェーンに接続してスマートコントラクトをロードするための、Alchemy APIキーとAlchemy Web3 APIも必要になります。 -### Alchemy API キーの作成 {#create-alchemy-api} +### Alchemy APIキーの作成 {#create-alchemy-api} -Alchemy のアカウントをお持ちでない場合は、[こちら](https://alchemy.com/?a=eth-org-nft-minter)から無料で登録できます。 +Alchemyのアカウントをお持ちでない場合は、[こちら](https://alchemy.com/?a=eth-org-nft-minter)から無料で登録できます。 -Alchemy のアカウントを作成した後、アプリを作成することで API キーを生成することができます。 これにより、Ropsten テストネットワークへのリクエストが可能になります。 +Alchemyのアカウントを作成した後、アプリを作成することでAPIキーを生成することができます。 これにより、Ropstenテストネットワークへのリクエストが可能になります。 -ナビゲーションバーの「Apps」にマウスを合わせて、「Create App」をクリックし、Alchemy ダッシュボードの「Create App」ページに移動してください。 +ナビゲーションバーの「Apps」にマウスを合わせて、「Create App」をクリックし、Alchemyダッシュボードの「Create App」ページに移動してください。 アプリに名前を付け(私たちは「My First NFT!」にしました)、簡単な説明を記述し、環境に「Staging」を選択(アプリのブックキーピングに使用)し、ネットワークに「Ropsten」を選択します。 「Create app」をクリックします。 アプリが下の表に表示されます。 -HTTP Alchemy API URL を作成したので、クリップボードにコピーします。 +HTTP Alchemy API URLを作成したので、クリップボードにコピーします。 -それを`.env`ファイルに追加してみましょう。 これで.env ファイル全体は、次のようになります。 +それを`.env`ファイルに追加してみましょう。 これで.envファイル全体は、次のようになります。 ```text REACT_APP_PINATA_KEY = @@ -609,9 +609,9 @@ REACT_APP_PINATA_SECRET = REACT_APP_ALCHEMY_KEY = https://eth-ropsten.alchemyapi.io/v2/ ``` -コントラクトアプリケーションバイナリインターフェース(ABI)と Alchemy API キーが用意できたので、[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)を使用してスマートコントラクトをロードする準備ができました。 +コントラクトアプリケーションバイナリインターフェース(ABI)とAlchemy APIキーが用意できたので、[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)を使用してスマートコントラクトをロードする準備ができました。 -### Alchemy Web3 エンドポイントとコントラクトの設定 {#setup-alchemy-endpoint} +### Alchemy Web3エンドポイントとコントラクトの設定 {#setup-alchemy-endpoint} まず、[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)がインストールされていない場合は、ターミナルで次のようにホームディレクトリである`nft-minter-tutorial`に移動してインストールする必要があります。 @@ -620,7 +620,7 @@ cd .. npm install @alch/alchemy-web3 ``` -次に、`interact.js`ファイルに戻りましょう。 .env ファイルから Alchemy キーがインポートされ、Alchemy Web3 エンドポイントが設定されるように、ファイルの上部に次のコードを追加します。 +次に、`interact.js`ファイルに戻りましょう。 .envファイルからAlchemyキーがインポートされ、Alchemy Web3エンドポイントが設定されるように、ファイルの上部に次のコードを追加します。 ```javascript require("dotenv").config() @@ -629,7 +629,7 @@ const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(alchemyKey) ``` -[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)は、[Web3.js](https://docs.web3js.org/)のラッパーであり、強化された API メソッドや重要なメリットを提供し、Web3 デベロッパーの負担を軽減します。 最小限の設定で使えるように設計されているので、アプリですぐに使用可能です。 +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)は、[Web3.js](https://docs.web3js.org/)のラッパーであり、強化されたAPIメソッドや重要なメリットを提供し、Web3デベロッパーの負担を軽減します。 最小限の設定で使えるように設計されているので、アプリですぐに使用可能です。 次に、コントラクトアプリケーションバイナリインターフェース(ABI)とコントラクトアドレスをファイルに追加しましょう。 @@ -643,15 +643,15 @@ const contractABI = require("../contract-abi.json") const contractAddress = "0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE" ``` -これで両方を追加できたので、mint 関数のコーディングを始める準備ができました。 +これで両方を追加できたので、mint関数のコーディングを始める準備ができました。 -## mintNFT 関数の実装 {#implement-the-mintnft-function} +## mintNFT関数の実装 {#implement-the-mintnft-function} `interact.js`ファイル内に、`mintNFT`関数を定義しましょう。この関数は、名前が示すとおりに非代替性トークン(NFT)をミントします。 -多数の非同期呼び出しを\(メタデータを IPFS にピン留めするために Pinata に対して、スマートコントラクトをロードするために Alchemy Web3 に対して、トランザクションに署名するために MetaMask に対して\)行うため、この関数もまた非同期になります。 +多数の非同期呼び出しを\(メタデータをIPFSにピン留めするためにPinataに対して、スマートコントラクトをロードするためにAlchemy Web3に対して、トランザクションに署名するためにMetaMaskに対して\)行うため、この関数もまた非同期になります。 -この関数への 3 つの入力は、デジタル資産の`url`、`name`、`description`になります。 `connectWallet`関数の下に、次の関数シグネチャを追加してください。 +この関数への3つの入力は、デジタル資産の`url`、`name`、`description`になります。 `connectWallet`関数の下に、次の関数シグネチャを追加してください。 ```javascript export const mintNFT = async (url, name, description) => {} @@ -673,11 +673,11 @@ export const mintNFT = async (url, name, description) => { } ``` -基本的に、入力パラメーターのいずれかが空の文字列である場合、false に設定された`success`ブール値と、UI のすべてのフィールドに入力する必要があることを伝える`status`文字列が入った JSON オブジェクトを返します。 +基本的に、入力パラメーターのいずれかが空の文字列である場合、falseに設定された`success`ブール値と、UIのすべてのフィールドに入力する必要があることを伝える`status`文字列が入ったJSONオブジェクトを返します。 -### IPFS にメタデータをアップロード {#upload-metadata-to-ipfs} +### IPFSにメタデータをアップロード {#upload-metadata-to-ipfs} -メタデータが適切にフォーマットされていることを確認したら、次のステップは、それを JSON オブジェクトにラップし、作成した`pinJSONToIPFS`を介して惑星間ファイルシステム(IPFS)にアップロードすることです。 +メタデータが適切にフォーマットされていることを確認したら、次のステップは、それをJSONオブジェクトにラップし、作成した`pinJSONToIPFS`を介して惑星間ファイルシステム(IPFS)にアップロードすることです。 そのためにはまず、`pinJSONToIPFS`関数を`interact.js`ファイルにインポートする必要があります。 `interact.js`の最上部に、次の行を追加してください。 @@ -685,9 +685,9 @@ export const mintNFT = async (url, name, description) => { import { pinJSONToIPFS } from "./pinata.js" ``` -`pinJSONToIPFS`が、JSON 本体を取ることを思い出してください。 そのため、呼び出す前に`url`、`name`、`description`パラメータを JSON オブジェクトにフォーマットする必要があります。 +`pinJSONToIPFS`が、JSON本体を取ることを思い出してください。 そのため、呼び出す前に`url`、`name`、`description`パラメータをJSONオブジェクトにフォーマットする必要があります。 -次のようにコードを更新して、`metadata`という JSON オブジェクトを作成し、この`metadata`パラメータを使用して`pinJSONToIPFS`を呼び出します。 +次のようにコードを更新して、`metadata`というJSONオブジェクトを作成し、この`metadata`パラメータを使用して`pinJSONToIPFS`を呼び出します。 ```javascript export const mintNFT = async (url, name, description) => { @@ -719,9 +719,9 @@ export const mintNFT = async (url, name, description) => { `pinJSONToIPFS(metadata)`の呼び出しのレスポンスを、`pinataResponse`オブジェクトに格納していることに注目してください。 次に、このオブジェクトにエラーがないか解析します。 -エラーがある場合、false に設定された`success`ブール値と、呼び出しが失敗したことを伝える`status`文字列が入った JSON オブジェクトを返します。 それ以外の場合は、`pinataURL`を`pinataResponse`から抽出し、それを`tokenURI`変数として格納します。 +エラーがある場合、falseに設定された`success`ブール値と、呼び出しが失敗したことを伝える`status`文字列が入ったJSONオブジェクトを返します。 それ以外の場合は、`pinataURL`を`pinataResponse`から抽出し、それを`tokenURI`変数として格納します。 -では、ファイルの先頭で初期化した Alchemy Web3 API を使用して、スマートコントラクトをロードしてみましょう。 `mintNFT`関数の下部に次のコードの行を追加して、`window.contract`グローバル変数にコントラクトを設定します。 +では、ファイルの先頭で初期化したAlchemy Web3 APIを使用して、スマートコントラクトをロードしてみましょう。 `mintNFT`関数の下部に次のコードの行を追加して、`window.contract`グローバル変数にコントラクトを設定します。 ```javascript window.contract = await new web3.eth.Contract(contractABI, contractAddress) @@ -763,11 +763,11 @@ try { - まず、トランザクションパラメータを設定します。 - `to`に受取人のアドレス\(スマートコントラクト\)を設定します 。 - - `from`にトランザクションの署名者\(MetaMask に接続されているユーザーのアドレス: `window.ethereum.selectedAddress`\)を指定します。 + - `from`にトランザクションの署名者\(MetaMaskに接続されているユーザーのアドレス: `window.ethereum.selectedAddress`\)を指定します。 - `data`には、スマートコントラクトの`mintNFT`メソッド呼び出しが含まれ、`tokenURI`とユーザーのウォレットのアドレス`window.ethereum.selectedAddress`を入力として受け取ります。 -- 次に、`window.ethereum.request`を await で呼び出して、MetaMask にトランザクションの署名を依頼します。 このリクエストで、eth メソッド\(eth_sendTransaction\)を指定し、`transactionParameters`を渡していることに注目してください。 この時点で、ブラウザで MetaMask が開かれ、ユーザーにトランザクションの署名または拒否を求めます。 - - トランザクションが成功した場合、この関数は、true に設定された`success`ブール値と、Etherscan でトランザクションについての詳細を確認するようユーザーに求める`status`文字列が入った JSON オブジェクトを返します。 - - トランザクションが失敗した場合、この関数は、false に設定された`success`ブール値と、エラーメッセージを伝える`status`文字列が入った JSON オブジェクトを返します。 +- 次に、`window.ethereum.request`をawaitで呼び出して、MetaMaskにトランザクションの署名を依頼します。 このリクエストで、ethメソッド\(eth_sendTransaction\)を指定し、`transactionParameters`を渡していることに注目してください。 この時点で、ブラウザでMetaMaskが開かれ、ユーザーにトランザクションの署名または拒否を求めます。 + - トランザクションが成功した場合、この関数は、trueに設定された`success`ブール値と、Etherscanでトランザクションについての詳細を確認するようユーザーに求める`status`文字列が入ったJSONオブジェクトを返します。 + - トランザクションが失敗した場合、この関数は、falseに設定された`success`ブール値と、エラーメッセージを伝える`status`文字列が入ったJSONオブジェクトを返します。 `mintNFT`関数全体は、次のようになります。 @@ -832,7 +832,7 @@ export const mintNFT = async (url, name, description) => { 巨大な関数でしたね! あとは、`mintNFT`関数を`Minter.js`コンポーネントに接続するだけです。 -## mintNFT を Minter.js フロントエンドに接続 {#connect-our-frontend} +## mintNFTをMinter.jsフロントエンドに接続 {#connect-our-frontend} `Minter.js`ファイルを開いて、上部の`import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";`の行を次のように更新してください。 @@ -844,7 +844,7 @@ import { } from "./utils/interact.js" ``` -最後に、次のように`onMintPressed`関数を実装し、インポートした`mintNFT`関数を await で呼び出します。さらに、`status`状態変数を更新し、トランザクションが成功したか失敗したかを反映させるようにします。 +最後に、次のように`onMintPressed`関数を実装し、インポートした`mintNFT`関数をawaitで呼び出します。さらに、`status`状態変数を更新し、トランザクションが成功したか失敗したかを反映させるようにします。 ```javascript const onMintPressed = async () => { @@ -855,7 +855,7 @@ const onMintPressed = async () => { ## 稼働中のウェブサイトに非代替性トークン(NFT)をデプロイ {#deploy-your-NFT} -プロジェクトを稼働させてユーザーが使える準備ができましたでしょうか? 稼働しているウェブサイトへ Minter をデプロイする[チュートリアル](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online)をご覧ください。 +プロジェクトを稼働させてユーザーが使える準備ができましたでしょうか? 稼働しているウェブサイトへMinterをデプロイする[チュートリアル](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online)をご覧ください。 次は最後のステップです。 @@ -865,9 +865,9 @@ const onMintPressed = async () => { 要約すると、非代替性トークン(NFT)ミンターを構築することで次の方法を学ぶことが出来ました。 -- フロントエンドのプロジェクト経由で MetaMask へアクセス +- フロントエンドのプロジェクト経由でMetaMaskへアクセス - フロントエンドからスマートコントラクトメソッドの呼び出し -- MetaMask を使ったトランザクションの署名 +- MetaMaskを使ったトランザクションの署名 ウォレットに分散型アプリケーション(Dapp)を介してミントされた非代替性トークン(NFT)を表示する方法については、[ウォレットに非代替性トークン(NFT)を表示する方法](https://docs.alchemyapi.io/alchemy/tutorials/how-to-write-and-deploy-a-nft-smart-contract/how-to-view-your-nft-in-your-wallet)という簡単なチュートリアルをご覧ください。 diff --git a/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md index 92ccdf1d41f..3ea4449370e 100644 --- a/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md @@ -12,7 +12,7 @@ published: 2021-12-30 ## はじめに {#introduction} -*ブロックチェーン上に秘密はありません。*ブロックチェーン上で起こる全てのことは、一貫性があり、検証可能で、公開されています。 理想的には、[コントラクトは Etherscan で公開され、検証されたソースコードであるべきです](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code)。 しかし、[必ずしもそうとは限りません](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code)。 この記事では、ソースコード([`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f))を見ることなくコントラクトをリバースエンジニアリングする方法を学びます。 +_ブロックチェーン上に秘密はありません。_ブロックチェーン上で起こる全てのことは、一貫性があり、検証可能で、公開されています。 理想的には、[コントラクトはEtherscanで公開され、検証されたソースコードであるべきです](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code)。 しかし、[必ずしもそうとは限りません](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code)。 この記事では、ソースコード([`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f))を見ることなくコントラクトをリバースエンジニアリングする方法を学びます。 リバースコンパイラを使用しても、必ず[利用可能な結果](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f)が生成されるわけではありません。 この記事では、手動でリバースエンジニアリングを実行し、[オペコード](https://github.com/wolflo/evm-opcodes)からコントラクトを理解する方法を学びます。また、デコンパイラによる結果を理解する方法も学びます。 @@ -20,137 +20,137 @@ published: 2021-12-30 ## 実行可能コードの準備 {#prepare-the-executable-code} -Etherscan にアクセスするとコントラクトのオペコードを入手できます。「**Contract**」タブをクリックし、次に「**Switch to Opcodes View**」をクリックしてください。 これで一行ずつオペコートが表示されます。 +Etherscanにアクセスするとコントラクトのオペコードを入手できます。「**Contract**」タブをクリックし、次に「**Switch to Opcodes View**」をクリックしてください。 これで一行ずつオペコートが表示されます。 ![Etherscanでのオペコードの表示](opcode-view.png) -ジャンプ (JUMP) を理解するには、コード内のオペコードの場所を理解する必要があります。 そのための 1 つの方法は、Google スプレッドシートを開き、オペコードを C 列に貼り付けることです。[既に準備されているこのスプレッドシートをコピーすれば、次のステップをスキップできます](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing)。 +ジャンプ (JUMP) を理解するには、コード内のオペコードの場所を理解する必要があります。 そのための1つの方法は、Googleスプレッドシートを開き、オペコードをC列に貼り付けることです。[既に準備されているこのスプレッドシートをコピーすれば、次のステップをスキップできます](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing)。 -次のステップは、正しいコードの位置を取得することです。これで、ジャンプを理解できるようになります。 オペコードのサイズを B 列に、場所(16 進数)を A 列に配置します。`B1`セルに以下の関数を入力し、それを B 列の残りの部分にコードの最終行までコピーアンドペーストします。 これを行った後、B 列を非表示にできます。 +次のステップは、正しいコードの位置を取得することです。これで、ジャンプを理解できるようになります。 オペコードのサイズをB列に、場所(16進数)をA列に配置します。`B1`セルに以下の関数を入力し、それをB列の残りの部分にコードの最終行までコピーアンドペーストします。 これを行った後、B列を非表示にできます。 ``` =1+IF(REGEXMATCH(C1,"PUSH"),REGEXEXTRACT(C1,"PUSH(\d+)"),0) ``` -この関数は、まず 1 バイトをオペコード自体に追加し、次に`PUSH`を探します。 PUSH は特殊なオペコードであり、プッシュされる値用に追加のバイトを保持する必要があります。 オペコードが`PUSH`の場合、バイト数を抽出して加算します。 +この関数は、まず1バイトをオペコード自体に追加し、次に`PUSH`を探します。 PUSHは特殊なオペコードであり、プッシュされる値用に追加のバイトを保持する必要があります。 オペコードが`PUSH`の場合、バイト数を抽出して加算します。 -`A1`に最初のオフセットである 0 を配置します。 次に`A2`に下記の関数を配置し、A 列の残りの部分にコピーアンドペーストします。 +`A1`に最初のオフセットである0を配置します。 次に`A2`に下記の関数を配置し、A列の残りの部分にコピーアンドペーストします。 ``` =dec2hex(hex2dec(A1)+B1) ``` -ジャンプ(`JUMP`と`JUMPI`)の前にプッシュされる値は 16 進数で渡されるため、この関数で 16 進数の値を得る必要があります。 +ジャンプ(`JUMP`と`JUMPI`)の前にプッシュされる値は16進数で渡されるため、この関数で16進数の値を得る必要があります。 ## エントリーポイント(0x00) {#the-entry-point-0x00} コントラクトは、必ず最初のバイトから実行されます。 以下は、コードの冒頭部分です。 -| オフセット | オペコード | スタック(オペコードの後) | -| ---------: | ------------ | ------------------------ | -| 0 | PUSH1 0x80 | 0x80 | -| 2 | PUSH1 0x40 | 0x40, 0x80 | -| 4 | MSTORE | なし | -| 5 | PUSH1 0x04 | 0x04 | -| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | -| 8 | LT | CALLDATASIZE<4 | -| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE<4 | -| C | JUMPI | なし | +| オフセット | オペコード | スタック(オペコードの後) | +| -----:| ------------ | ------------------- | +| 0 | PUSH1 0x80 | 0x80 | +| 2 | PUSH1 0x40 | 0x40, 0x80 | +| 4 | MSTORE | なし | +| 5 | PUSH1 0x04 | 0x04 | +| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | +| 8 | LT | CALLDATASIZE<4 | +| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE<4 | +| C | JUMPI | なし | -このコードは、次の 2 つのことをしています。 +このコードは、次の2つのことをしています。 -1. メモリロケーションの 0x40~0x5F へ、32 バイト値として 0x80 を書き込みます(0x5F に 0x80 が格納され、0x40 ~ 0x5E はすべてゼロになります)。 -2. コールデータサイズ(CALLDATASIZE)を読み取ります。 通常、イーサリアムコントラクトのコールデータは、[アプリケーションバイナリインターフェース(ABI)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html)に従います。アプリケーションバイナリインターフェース(ABI)では、最低でも 4 バイトが関数セレクタに必要です。 コールデータのサイズが 4 未満の場合、0x5E へジャンプします。 +1. メモリロケーションの0x40~0x5Fへ、32バイト値として0x80を書き込みます(0x5Fに0x80が格納され、0x40~0x5Eはすべてゼロになります)。 +2. コールデータサイズ(CALLDATASIZE)を読み取ります。 通常、イーサリアムコントラクトのコールデータは、[アプリケーションバイナリインターフェース(ABI)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html)に従います。アプリケーションバイナリインターフェース(ABI)では、最低でも4バイトが関数セレクタに必要です。 コールデータのサイズが4未満の場合、0x5Eへジャンプします。 ![この部分のフローチャート](flowchart-entry.png) -### 0x5E のハンドラ(非アプリケーションバイナリインターフェース(ABI)コールデータの処理) {#the-handler-at-0x5e-for-non-abi-call-data} +### 0x5Eのハンドラ(非アプリケーションバイナリインターフェース(ABI)コールデータの処理) {#the-handler-at-0x5e-for-non-abi-call-data} -| オフセット | オペコード | -| ---------: | ------------ | -| 5E | JUMPDEST | -| 5F | CALLDATASIZE | -| 60 | PUSH2 0x007c | -| 63 | JUMPI | +| オフセット | オペコード | +| -----:| ------------ | +| 5E | JUMPDEST | +| 5F | CALLDATASIZE | +| 60 | PUSH2 0x007c | +| 63 | JUMPI | -このスニペットは、`JUMPDEST`で始まります。 イーサリアム仮想マシン(EVM)プログラムは、`JUMPDEST`ではないオペコードにジャンプした場合に例外を投げます。 次に、CALLDATASIZE を確認し、それが「true」の場合(ゼロではない場合)、0x7C にジャンプします。 これについては後述します。 +このスニペットは、`JUMPDEST`で始まります。 イーサリアム仮想マシン(EVM)プログラムは、`JUMPDEST`ではないオペコードにジャンプした場合に例外を投げます。 次に、CALLDATASIZEを確認し、それが「true」の場合(ゼロではない場合)、0x7Cにジャンプします。 これについては後述します。 -| オフセット | オペコード | スタック(オペコードの後) | -| ---------: | ---------- | ---------------------------------------------------------------------------------------------- | -| 64 | CALLVALUE | [Wei](/glossary/#wei)が呼び出しによって提供されます。 Solidity で`msg.value`が呼び出されます。 | -| 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 | +| オフセット | オペコード | スタック(オペコードの後) | +| -----:| ---------- | --------------------------------------------------------------------- | +| 64 | CALLVALUE | 呼び出しによって[Wei](/glossary/#wei)が提供されます。 Solidityでは、`msg.value`が呼び出されます。 | +| 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 | -コールデータがない場合、Storage[6]の値を読み取ります。 この Storage[6] の値はまだわかりませんが、コールデータなしで受信したコントラクトのトランザクションを探すことはできます。 コールデータなしで(つまりメソッドなしで)ETH を送金するだけのトランザクションの場合、Etherscan に`Transfer`メソッドがあります。 実際、[コントラクトが受信した最初のトランザクション](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7)は、送金(transfer)です。 +コールデータがない場合、Storage[6]の値を読み取ります。 このStorage[6] の値はまだわかりませんが、コールデータなしで受信したコントラクトのトランザクションを探すことはできます。 コールデータなしで(つまりメソッドなしで)ETHを送金するだけのトランザクションの場合、Etherscanに`Transfer`メソッドがあります。 実際、[コントラクトが受信した最初のトランザクション](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7)は、送金(transfer)です。 -このトランザクションを調べるには、「**Click to show more**」をクリックします。コールデータ(Input Data と表示される)が実際に空(`0x`)であることが分かります。 また、値が 1.559ETH であることに留意してください。これに関しては、後述します。 +このトランザクションを調べるには、「**Click to show more**」をクリックします。コールデータ(Input Dataと表示される)が実際に空(`0x`)であることが分かります。 また、値が1.559ETHであることに留意してください。これに関しては、後述します。 ![コールデータが空](calldata-empty.png) -次に「**State**」タブをクリックし、リバースエンジニアリングしているコントラクト(0x2510...)を展開します。 トランザクション中に `Storage[6]` が変更されたことが分かります。「Hex」から「**Number**」に変更すると、次のコントラクトの値に応じて wei に変換された値、1,559,000,000,000,000,000 になります(分かりやすくするためにコンマを追加しています) 。 +次に「**State**」タブをクリックし、リバースエンジニアリングしているコントラクト(0x2510...)を展開します。 トランザクション中に `Storage[6]` が変更されたことが分かります。「Hex」から「**Number**」に変更すると、次のコントラクトの値に応じてweiに変換された値、1,559,000,000,000,000,000になります(分かりやすくするためにコンマを追加しています) 。 ![Storage[6]の変化](storage6.png) -[同時期の他の`Transfer`トランザクション](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange)によって引き起こされた状態変更を確認すると、`Storage[6]`がしばらくの間、コントラクトの値を追跡していたことが分かります。 これを今から`Value*`と呼びます。 アスタリスク (`*`) は、この変数が何をするかまだ*分からない*ことを思い起こさせます。しかし、コントラクトの値を追跡するだけのものではありません。`ADDRESS BALANCE`を使用してアカウント残高を取得できる場合には、非常に高価なストレージを使う必要がないからです。 最初のオペコードは、コントラクト自体のアドレスをプッシュ(PUSH)します。 2 番目のオペコードは、スタックの上部にあるアドレスを読み込み、そのアドレスの残高で置き換えます。 +[同時期の他の`Transfer`トランザクション](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange)によって引き起こされた状態変更を確認すると、`Storage[6]`がしばらくの間、コントラクトの値を追跡していたことが分かります。 これを今から`Value*`と呼びます。 アスタリスク (`*`) は、この変数が何をするかまだ_分からない_ことを思い起こさせます。しかし、コントラクトの値を追跡するだけのものではありません。`ADDRESS BALANCE`を使用してアカウント残高を取得できる場合には、非常に高価なストレージを使う必要がないからです。 最初のオペコードは、コントラクト自体のアドレスをプッシュ(PUSH)します。 2番目のオペコードは、スタックの上部にあるアドレスを読み込み、そのアドレスの残高で置き換えます。 -| オフセット | オペコード | スタック | -| ---------: | ------------ | ------------------------------------------- | -| 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 | | +| オフセット | オペコード | スタック | +| -----:| ------------ | --------------------------------------------- | +| 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 | | ジャンプ先(JUMPDEST)でも、このコードのトレースを続けます。 -| オフセット | オペコード | スタック | -| ---------: | ---------- | ----------------------------------------------------------- | -| 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 | +| オフセット | オペコード | スタック | +| -----:| ---------- | ------------------------------------------------------------- | +| 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 | -`NOT`は、ビットごとの NOT であるため、コール値内の全てのビット値を反転します。 +`NOT`は、ビットごとのNOTであるため、コール値内の全てのビット値を反転します。 -| オフセット | オペコード | スタック | -| ---------: | ------------ | --------------------------------------------------------------------------- | -| 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 | | +| オフセット | オペコード | スタック | +| -----:| ------------ | ------------------------------------------------------------------------------- | +| 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 | | -`Value*`の値が、2^256-CALLVALUE-1 以下の場合にジャンプ(JUMP)します。 これは、オーバーフローを防ぐためのロジックに見えます。 実際に、オフセット 0X01DE でいくつかの無意味な操作(例: 削除される寸前にメモリへの書き込み)をした後、オーバーフローが検出されると、標準の動作としてコントラクトが元に戻されます。 +`Value*`の値が、2^256-CALLVALUE-1以下の場合にジャンプ(JUMP)します。 これは、オーバーフローを防ぐためのロジックに見えます。 実際に、オフセット0X01DEでいくつかの無意味な操作(例: 削除される寸前にメモリへの書き込み)をした後、オーバーフローが検出されると、標準の動作としてコントラクトが元に戻されます。 -このようなオーバーフローが発生する可能性は、非常に低いことに留意してください。これは、コール値に`Value*`を加えたものが、2^256 wei(約 10^59 ETH)と同等になる必要があるためです。 [ETH の総供給量は、この記事の執筆時点で 2 億未満です](https://etherscan.io/stat/supply)。 +このようなオーバーフローが発生する可能性は、非常に低いことに留意してください。これは、コール値に`Value*`を加えたものが、2^256 wei(約10^59 ETH)と同等になる必要があるためです。 [ETHの総供給量は、この記事の執筆時点で2億未満です](https://etherscan.io/stat/supply)。 -| オフセット | オペコード | スタック | -| ---------: | ---------- | ----------------------------------------- | -| 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 | | +| オフセット | オペコード | スタック | +| -----:| -------- | ------------------------------------------- | +| 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 | | -ここに到達した場合、`Value* + CALLVALUE`を取得して、オフセット 0x75 へジャンプします。 +ここに到達した場合、`Value* + CALLVALUE`を取得して、オフセット0x75へジャンプします。 -| オフセット | オペコード | スタック | -| ---------: | ---------- | ------------------------------- | -| 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 | +| オフセット | オペコード | スタック | +| -----:| -------- | --------------------------------- | +| 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 | ここに到達した場合(コールデータが空である必要があります)、`Value*`にコール値を加えます。 これは、`Transfer`トランザクションが行うことと一致しています。 | オフセット | オペコード | -| ---------: | ---------- | -| 79 | POP | -| 7A | POP | -| 7B | STOP | +| -----:| ----- | +| 79 | POP | +| 7A | POP | +| 7B | STOP | 最後に、スタックをクリアし(任意)、トランザクションが正常に終了したことを通知します。 @@ -158,393 +158,393 @@ Etherscan にアクセスするとコントラクトのオペコードを入手 ![エントリポイントフローチャート](flowchart-entry.png) -## 0x7C のハンドラ {#the-handler-at-0x7c} +## 0x7Cのハンドラ {#the-handler-at-0x7c} 意図的にこのハンドラが何をするか見出しに入れませんでした。 特定のコントラクトの動作を教えるのではなく、どのようにコントラクトをリバースエンジニアリングするかを学ぶのがポイントだからです。 同じ方法で、コードを追って何をするか学ぶことができます。 ここへ到達するのは、次のような場合です。 -- (オフセット 0x63 から)1 バイト、2 バイトまたは 3 バイトのコールデータががある場合 -- (オフセット 0x42 と 0x5D から)メソッドのシグネチャが不明な場合 +- (オフセット0x63から)1バイト、2バイトまたは3バイトのコールデータががある場合 +- (オフセット0x42と0x5Dから)メソッドのシグネチャが不明な場合 -| オフセット | オペコード | スタック | -| ---------: | ------------ | -------------------- | -| 7C | JUMPDEST | | -| 7D | PUSH1 0x00 | 0x00 | -| 7F | PUSH2 0x009d | 0x9D 0x00 | -| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 | -| 84 | SLOAD | Storage[3] 0x9D 0x00 | +| オフセット | オペコード | スタック | +| -----:| ------------ | -------------------- | +| 7C | JUMPDEST | | +| 7D | PUSH1 0x00 | 0x00 | +| 7F | PUSH2 0x009d | 0x9D 0x00 | +| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 | +| 84 | SLOAD | Storage[3] 0x9D 0x00 | これは別のストレージセルです。このセルはどのトランザクションにも見つからなかったので、これが何を意味しているのか理解するのは困難です。 しかし、以下のコードがこれを明確にします。 -| オフセット | オペコード | スタック | -| ---------: | ------------------------------------------------- | ------------------------------- | -| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Storage[3] 0x9D 0x00 | -| 9A | AND | Storage[3]-as-address 0x9D 0x00 | +| オフセット | オペコード | スタック | +| -----:| ------------------------------------------------- | ------------------------------- | +| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Storage[3] 0x9D 0x00 | +| 9A | AND | Storage[3]-as-address 0x9D 0x00 | -これらのオペコードは、Storage[3]から読み取った値を 160 ビットに切り捨てています。これは、イーサリアムアドレスの長さです。 +これらのオペコードは、Storage[3]から読み取った値を160ビットに切り捨てています。これは、イーサリアムアドレスの長さです。 -| オフセット | オペコード | スタック | -| ---------: | ---------- | ------------------------------- | -| 9B | SWAP1 | 0x9D Storage[3]-as-address 0x00 | -| 9C | JUMP | Storage[3]-as-address 0x00 | +| オフセット | オペコード | スタック | +| -----:| ----- | ------------------------------- | +| 9B | SWAP1 | 0x9D Storage[3]-as-address 0x00 | +| 9C | JUMP | Storage[3]-as-address 0x00 | 次のオペコードに進むため、このジャンプ(JUMP)は不要です。 このコードは、ガス効率が良くありません。 -| オフセット | オペコード | スタック | -| ---------: | ---------- | ------------------------------- | -| 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 | - -コードの最初で、Mem[0x40]を 0x80 に設定しました。 その後の 0x40 を確かめると変更していないことが分かります。つまり、これは 0x80 であると推測できます。 - -| オフセット | オペコード | スタック | -| ---------: | ------------ | ------------------------------------------------- | -| 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 | - -0x80 から始まるすべてのコールデータ(CALLDATA)をメモリにコピーします。 - -| オフセット | オペコード | スタック | -| ---------: | ------------- | -------------------------------------------------------------------------------- | -| 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 | | +| オフセット | オペコード | スタック | +| -----:| ---------- | ------------------------------- | +| 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 | + +コードの最初で、Mem[0x40]を0x80に設定しました。 その後の0x40を確かめると変更していないことが分かります。つまり、これは0x80であると推測できます。 + +| オフセット | オペコード | スタック | +| -----:| ------------ | ------------------------------------------------- | +| 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 | + +0x80から始まるすべてのコールデータ(CALLDATA)をメモリにコピーします。 + +| オフセット | オペコード | スタック | +| -----:| ------------- | -------------------------------------------------------------------------------- | +| 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 | | これで、かなり明確になりました。 このコントラクトは、[プロキシ](https://blog.openzeppelin.com/proxy-patterns/)として機能しており、Storage[3] 内のアドレスを呼び出して、実際の作業をしています。 `DELEGATE_CALL`は、別のコントラクトを呼び出しますが、同じストレージ内に留まります。 つまり、委任されたコントラクト(現在のコントラクトがこのコントラクトのプロキシとなります)が、同じストレージスペースにアクセスします。 コール(呼び出し)のパラメータは次の通りです。 - _ガス_: 残りのガス - _呼び出されたアドレス_: Storage[3]-as-address -- _コールデータ_: 元のコールデータを配置する、0x80 から始まる CALLDATASIZE バイト +- _コールデータ_: 元のコールデータを配置する、0x80から始まるCALLDATASIZEバイト - _リターンデータ_: なし(0x00 - 0x00)。リターンデータは他の方法で取得(以下を参照) -| オフセット | オペコード | スタック | -| ---------: | -------------- | --------------------------------------------------------------------------------------------- | -| 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 | +| オフセット | オペコード | スタック | +| -----:| -------------- | --------------------------------------------------------------------------------------------- | +| 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 | -ここでは、すべてのリターンデータを 0x80 から始まるメモリバッファにコピーします。 +ここでは、すべてのリターンデータを0x80から始まるメモリバッファにコピーします。 -| オフセット | オペコード | スタック | -| ---------: | ------------ | ---------------------------------------------------------------------------------------------------------------------------- | -| 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 | | +| オフセット | オペコード | スタック | +| -----:| ------------ | ---------------------------------------------------------------------------------------------------------------------------- | +| 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 | | -リターンデータをバッファ(0x80 ~ 0x80+RETURNDATASIZE)にコピーする呼び出しの後、その呼び出しが成功した場合は、そのバッファを正確に返します(`RETURN`します)。 +リターンデータをバッファ(0x80~0x80+RETURNDATASIZE)にコピーする呼び出しの後、その呼び出しが成功した場合は、そのバッファを正確に返します(`RETURN`します)。 -### DELEGATECALL の失敗 {#delegatecall-failed} +### DELEGATECALLの失敗 {#delegatecall-failed} -0xC0 に到達した場合は、現在のコントラクトが呼び出したコントラクトが、元に戻された(REVERT された)ことを意味します。 現在のコントラクトはこのコントラクトの単なるプロキシであるため、現在のコントラクトも同じデータを返して、元に戻す(REVERT する)必要があります。 +0xC0に到達した場合は、現在のコントラクトが呼び出したコントラクトが、元に戻された(REVERTされた)ことを意味します。 現在のコントラクトはこのコントラクトの単なるプロキシであるため、現在のコントラクトも同じデータを返して、元に戻す(REVERTする)必要があります。 -| オフセット | オペコード | スタック | -| ---------: | ---------- | ------------------------------------------------------------------------------------------------------------------- | -| 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 | | +| オフセット | オペコード | スタック | +| -----:| -------- | ------------------------------------------------------------------------------------------------------------------- | +| 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 | | -そのため、前に`RETURN`で使用した同じバッファ(0x80 ~ 0x80+RETURNDATASIZE)を元に戻します(`REVERT`します)。 +そのため、前に`RETURN`で使用した同じバッファ(0x80~0x80+RETURNDATASIZE)を元に戻します(`REVERT`します)。 ![プロキシするための呼び出しのフローチャート](flowchart-proxy.png) ## アプリケーションバイナリインターフェース(ABI)呼び出し {#abi-calls} -コールデータのサイズが 4 バイト以上である場合、有効なアプリケーションバイナリインターフェース(ABI)呼び出しである可能性があります。 +コールデータのサイズが4バイト以上である場合、有効なアプリケーションバイナリインターフェース(ABI)呼び出しである可能性があります。 -| オフセット | オペコード | スタック | -| ---------: | ------------ | ------------------------------------------------- | -| 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))) | +| オフセット | オペコード | スタック | +| -----:| ------------ | ------------------------------------------------- | +| 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 では、`1C`が未知のオペコードとなっていますが、これは[Etherscan でこの機能が作成された後に追加された](https://eips.ethereum.org/EIPS/eip-145)ため、まだ反映がされていないのが理由です。 [最新のオペコードテーブル](https://github.com/wolflo/evm-opcodes)では、これが右シフトであることが示されています +Etherscanでは、`1C`が未知のオペコードとなっていますが、これは[Etherscanでこの機能が作成された後に追加された](https://eips.ethereum.org/EIPS/eip-145)ため、まだ反映がされていないのが理由です。 An [up to date opcode table](https://github.com/wolflo/evm-opcodes) shows us that this is shift right -| オフセット | オペコード | スタック | -| ---------: | ---------------- | -------------------------------------------------------------------------------------------------------- | -| 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))) | +| オフセット | オペコード | スタック | +| -----:| ---------------- | -------------------------------------------------------------------------------------------------------- | +| 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))) | -このようにメソッドシグネチャのマッチングテストを 2 つに分割することで、平均的にテストの半分を節約できます。 その直後のコードと 0x43 のコードは、コールデータの最初の 32 ビットの複製(`DUP1`)、プッシュ(`PUSH4 (((method signature>`)、`EQ`を実行し等式を判定、メソッドシグネチャがマッチした場合は`JUMPI`、という同じパターンをたどります。 以下に、メソッドシグネチャ、そのアドレス、既知の場合は[対応するメソッド定義](https://www.4byte.directory/)を示します。 +このようにメソッドシグネチャのマッチングテストを2つに分割することで、平均的にテストの半分を節約できます。 その直後のコードと0x43のコードは、コールデータの最初の32ビットの複製(`DUP1`)、プッシュ(`PUSH4 (((method signature>`)、`EQ`を実行し等式を判定、メソッドシグネチャがマッチした場合は`JUMPI`、という同じパターンをたどります。 以下に、メソッドシグネチャ、そのアドレス、既知の場合は[対応するメソッド定義](https://www.4byte.directory/)を示します。 -| メソッド | メソッドシグネチャ | ジャンプ先のオフセット | -| -------------------------------------------------------------------------------------- | ------------------ | ---------------------- | -| [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 | +| メソッド | メソッドシグネチャ | ジャンプ先のオフセット | +| -------------------------------------------------------------------------------------- | ---------- | ----------- | +| [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 | -一致するものが見つからない場合、そのコードは、現在のコントラクトがプロキシとなっているコントラクトに一致するものがあることを期待して、[0x7C のプロキシハンドラ](#the-handler-at-0x7c)へジャンプします。 +一致するものが見つからない場合、そのコードは、現在のコントラクトがプロキシとなっているコントラクトに一致するものがあることを期待して、[0x7Cのプロキシハンドラ](#the-handler-at-0x7c)へジャンプします。 ![アプリケーションバイナリインターフェース(ABI)呼び出しのフローチャート](flowchart-abi.png) ## splitter() {#splitter} -| オフセット | オペコード | スタック | -| ---------: | ------------ | ----------------------------- | -| 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 | | - -この関数が最初に行うことは、呼び出しが ETH を送金していないことを確認することです。 この関数は、[`payable`](https://solidity-by-example.org/payable/)ではありません。 誰かが ETH を送金してきた場合は、何かの間違いです。ETH を戻せなくなる前に元に戻す(`REVERT`する)必要があります。 - -| オフセット | オペコード | スタック | -| ---------: | ------------------------------------------------- | --------------------------------------------------------------------------- | -| 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 | - -0x80 にはプロキシアドレスが含まれるようになりました。 - -| オフセット | オペコード | スタック | -| ---------: | ------------ | --------- | -| 131 | PUSH1 0x20 | 0x20 0x80 | -| 133 | ADD | 0xA0 | -| 134 | PUSH2 0x00e4 | 0xE4 0xA0 | -| 137 | JUMP | 0xA0 | - -### E4 のコード {#the-e4-code} - -これらの行を見るのは初めてですが、他のメソッドと共有されています(以下を参照)。 スタック X の値を呼び出します。`splitter()`で、この X の値が 0xA0 であることを覚えておいてください。 - -| オフセット | オペコード | スタック | -| ---------: | ---------- | ----------- | -| 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 | | - -したがって、このコードは、スタック(X)内のメモリのポインターを受け取ります。これにより、コントラクトが 0x80 ~ X までのバッファを返します(`RETURN`します)。 - -`splitter()`の場合、これは現在のコントラクトがプロキシとなっているアドレスを返します。 `RETURN`は、0x80 ~ 0x9F のバッファを返します。これは、このデータを書き込んだ場所です(上記のオフセット 0x130)。 +| オフセット | オペコード | スタック | +| -----:| ------------ | ----------------------------- | +| 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 | | + +この関数が最初に行うことは、呼び出しがETHを送金していないことを確認することです。 この関数は、[`payable`](https://solidity-by-example.org/payable/)ではありません。 誰かがETHを送金してきた場合は、何かの間違いです。ETHを戻せなくなる前に元に戻す(`REVERT`する)必要があります。 + +| オフセット | オペコード | スタック | +| -----:| ------------------------------------------------- | --------------------------------------------------------------------------- | +| 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 | + +0x80にはプロキシアドレスが含まれるようになりました。 + +| オフセット | オペコード | スタック | +| -----:| ------------ | --------- | +| 131 | PUSH1 0x20 | 0x20 0x80 | +| 133 | ADD | 0xA0 | +| 134 | PUSH2 0x00e4 | 0xE4 0xA0 | +| 137 | JUMP | 0xA0 | + +### E4のコード {#the-e4-code} + +これらの行を見るのは初めてですが、他のメソッドと共有されています(以下を参照)。 スタックXの値を呼び出します。`splitter()`で、このXの値が0xA0であることを覚えておいてください。 + +| オフセット | オペコード | スタック | +| -----:| ---------- | ----------- | +| 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 | | + +したがって、このコードは、スタック(X)内のメモリのポインターを受け取ります。これにより、コントラクトが0x80~Xまでのバッファを返します(`RETURN`します)。 + +`splitter()`の場合、これは現在のコントラクトがプロキシとなっているアドレスを返します。 `RETURN`は、0x80~0x9Fのバッファを返します。これは、このデータを書き込んだ場所です(上記のオフセット0x130)。 ## currentWindow() {#currentwindow} -オフセット 0x158 ~ 0x163 のコードは、`splitter()`の 0x103 ~ 0x10E で見たものと(`JUMPI`の宛先以外は)同一であるため、`currentWindow()`も同様に`payable`ではないことが分かります。 +オフセット0x158~0x163のコードは、`splitter()`の0x103~0x10Eで見たものと(`JUMPI`の宛先以外は)同一であるため、`currentWindow()`も同様に`payable`ではないことが分かります。 -| オフセット | オペコード | スタック | -| ---------: | ------------ | -------------------- | -| 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 | +| オフセット | オペコード | スタック | +| -----:| ------------ | -------------------- | +| 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 | -### DA のコード {#the-da-code} +### DAのコード {#the-da-code} -このコードもまた他のメソッドと共有されます。 スタック Y の値を呼び出します。`currentWindow()`で、この Y の値が Storage[1]であることを覚えておいてください。 +このコードもまた他のメソッドと共有されます。 スタックYの値を呼び出します。`currentWindow()`で、このYの値がStorage[1]であることを覚えておいてください。 -| オフセット | オペコード | スタック | -| ---------: | ---------- | ---------------- | -| 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 | +| オフセット | オペコード | スタック | +| -----:| ---------- | ---------------- | +| 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 | -0x80 ~ 0x9F に Y を書き込みます。 +0x80~0x9FにYを書き込みます。 -| オフセット | オペコード | スタック | -| ---------: | ---------- | -------------- | -| E1 | PUSH1 0x20 | 0x20 0x80 0xDA | -| E3 | ADD | 0xA0 0xDA | +| オフセット | オペコード | スタック | +| -----:| ---------- | -------------- | +| E1 | PUSH1 0x20 | 0x20 0x80 0xDA | +| E3 | ADD | 0xA0 0xDA | -残りはすでに、[上記](#the-e4-code)で説明されています。 0xDA にジャンプして、スタックの先頭(Y)を 0x80 ~ 0x9F に書き込み、その値を返します。 `currentWindow()`の場合、Storage[1]を返します。 +残りはすでに、[上記](#the-e4-code)で説明されています。 0xDAにジャンプして、スタックの先頭(Y)を0x80~0x9Fに書き込み、その値を返します。 `currentWindow()`の場合、Storage[1]を返します。 ## merkleRoot() {#merkleroot} -オフセット 0xED ~ 0xF8 のコードは、`splitter()`の 0x103 ~ 0x10E で見たものと(`JUMPI`の宛先以外は)同一であるため、`merkleRoot()`も同様に`payable`ではないことが分かります。 +オフセット0xED~0xF8のコードは、`splitter()`の0x103~0x10Eで見たものと(`JUMPI`の宛先以外は)同一であるため、`merkleRoot()`も同様に`payable`ではないことが分かります。 -| オフセット | オペコード | スタック | -| ---------: | ------------ | -------------------- | -| 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 | +| オフセット | オペコード | スタック | +| -----:| ------------ | -------------------- | +| 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 | ジャンプ(JUMP)の後に何が起こるかは、[すでに分かっています](#the-da-code)。 つまり、`merkleRoot()`は、Storage[0]を返します。 ## 0x81e580d3 {#0x81e580d3} -オフセット 0x138 ~ 0x143 のコードは、`splitter()`の 0x103 ~ 0x10E で見たものと(`JUMPI`の宛先以外は)同一であるため、この関数も同様に`payable`ではないことが分かりります。 - -| オフセット | オペコード | スタック | -| ---------: | ------------ | ------------------------------------------------------------ | -| 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 | - -この関数は、コールデータに少なくとも 32 バイト(1 ワード)を必要とするようです。 - -| オフセット | オペコード | スタック | -| ---------: | ---------- | -------------------------------------------- | -| 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 19F | REVERT | | +オフセット0x138~0x143のコードは、`splitter()`の0x103~0x10Eで見たものと(`JUMPI`の宛先以外は)同一であるため、この関数も同様に`payable`ではないことが分かりります。 + +| オフセット | オペコード | スタック | +| -----:| ------------ | ------------------------------------------------------------ | +| 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 | + +この関数は、コールデータに少なくとも32バイト(1ワード)を必要とするようです。 + +| オフセット | オペコード | スタック | +| -----:| ------ | -------------------------------------------- | +| 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19F | REVERT | | コールデータを取得しなかった場合、トランザクションはリターンデータなしで元に戻されます。 -この関数が、必要なコールデータを*取得した*場合、何が起こるか見ていきましょう。 - -| オフセット | オペコード | スタック | -| ---------: | ------------ | ---------------------------------------- | -| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA | -| 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA | - -`calldataload(4)`は、メソッドシグネチャの*後にある*コールデータの最初のワードです。 - -| オフセット | オペコード | スタック | -| ---------: | ------------ | ---------------------------------------------------------------------------- | -| 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))`、もう一つが`isClaimed()`であり、エアドロップコントラクトのように見えます。 ここからは、オペコードごとに調べる代わりに、[デコンパイラ](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761)を使用します。デコンパイラは、このコントラクトの 3 つの関数について利用可能な結果を生成します。 他の関数のリバースエンジニアリングは、読者の演習として残しておきます。 +残りのメソッドの1つが`claim()`、もう一つが`isClaimed()`であり、エアドロップコントラクトのように見えます。 ここからは、オペコードごとに調べる代わりに、[デコンパイラ](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761)を使用します。デコンパイラは、このコントラクトの3つの関数について利用可能な結果を生成します。 他の関数のリバースエンジニアリングは、読者の演習として残しておきます。 ### scaleAmountByPercentage {#scaleamountbypercentage} @@ -592,7 +592,7 @@ def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable: return (_param1 * _param2 / 100 * 10^6) ``` -最初の`require`では、コールデータ内に 2 つのパラメータにとって十分なサイズ、つまり関数シグネチャの 4 バイトに加え少なくとも 64 バイトあるかどうかをテストしています。 そうでない場合、問題があるのは明らかです。 +最初の`require`では、コールデータ内に2つのパラメータにとって十分なサイズ、つまり関数シグネチャの4バイトに加え少なくとも64バイトあるかどうかをテストしています。 そうでない場合、問題があるのは明らかです。 `if`文は、`_param1`がゼロでないこと、さらに`_param1 * _param2`が負でないことを確認していると思われます。 これは、オーバー(アンダー)フローを防止している可能性があります。 @@ -611,7 +611,7 @@ def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _pa revert with 0, 'cannot claim for a future window' ``` -ここでは、重要事項が 2 つあります。 +ここでは、重要事項が2つあります。 - `_param2`は、`uint256`として宣言されているが、実際にはアドレスである - `_param1`は、請求対象のウィンドウであり、`currentWindow`であるか、前のウィンドウである必要がある @@ -650,7 +650,7 @@ def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _pa gas 30000 wei ``` -これは、コントラクトが自身の ETH を別のアドレス(コントラクトまたは外部所有アカウント)に送金する方法です。 送金する金額の値で呼び出します。 これは ETH のエアドロップであると思われます。 +これは、コントラクトが自身のETHを別のアドレス(コントラクトまたは外部所有アカウント)に送金する方法です。 送金する金額の値で呼び出します。 これはETHのエアドロップであると思われます。 ```python if not return_data.size: @@ -660,22 +660,22 @@ def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _pa value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei ``` -下の 2 行は、Storage[2] も呼び出すコントラクトであることを示しています。 [コンストラクタのトランザクションを見ると](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange)、このコントラクトは[0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2)であり、[ソースコードが Etherscan にアップロードされている](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code)ラップドイーサ(WETH)コントラクトであることが分かります。 +下の2行は、Storage[2] も呼び出すコントラクトであることを示しています。 [コンストラクタのトランザクションを見ると](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange)、このコントラクトは[0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2)であり、[ソースコードがEtherscanにアップロードされている](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code)ラップドイーサ(WETH)コントラクトであることが分かります。 -このコントラクトは、`_param2`に ETH を送金しようとしていると思われます。 送金できれば問題ありません。 送金できない場合は、[ラップドイーサ(WETH)](https://weth.io/)を送金しようとします。 `_param2`が外部所有アカウント(EOA)である場合、必ず ETH を受け取ることができますが、コントラクトは ETH の受け取りを拒否することができます。 しかし、ラップドイーサ(WETH)は ERC-20 であるため、コントラクトは受け取りを拒否できません。 +このコントラクトは、`_param2`にETHを送金しようとしていると思われます。 送金できれば問題ありません。 送金できない場合は、[ラップドイーサ(WETH)](https://weth.io/)を送金しようとします。 `_param2`が外部所有アカウント(EOA)である場合、必ずETHを受け取ることができますが、コントラクトはETHの受け取りを拒否することができます。 しかし、ラップドイーサ(WETH)はERC-20であるため、コントラクトは受け取りを拒否できません。 ```python ... log 0xdbd5389f: addr(_param2), unknown81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success) ``` -関数の最後に、ログエントリが生成されていることがわかります。 [生成されたログエントリを確認し](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events)、`0xdbd5...`で始まるトピックでフィルタリングします。 [そのようなエントリを生成したトランザクションの 1 つをクリックすると](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274)、実際に請求のように見えることがわかります。アカウントは、リバースエンジニアリングしているコントラクトにメッセージを送信し、代わりに ETH を取得しています。 +関数の最後に、ログエントリが生成されていることがわかります。 [生成されたログエントリを確認し](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events)、`0xdbd5...`で始まるトピックでフィルタリングします。 [そのようなエントリを生成したトランザクションの1つをクリックすると](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274)、実際に請求のように見えることがわかります。アカウントは、リバースエンジニアリングしているコントラクトにメッセージを送信し、代わりにETHを取得しています。 ![請求トランザクション](claim-tx.png) ### 1e7df9d3 {#1e7df9d3} -この関数は、上記の[`claim`](#claim)と非常に似ています。 この関数はマークルプルーフも同様に確認し、ETH を最初に送金しようと試み、同じタイプのログエントリを生成します。 +この関数は、上記の[`claim`](#claim)と非常に似ています。 この関数はマークルプルーフも同様に確認し、ETHを最初に送金しようと試み、同じタイプのログエントリを生成します。 ```python def unknown1e7df9d3(uint256 _param1, uint256 _param2, array _param3) payable: diff --git a/public/content/translations/ja/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/ja/developers/tutorials/run-node-raspberry-pi/index.md index bb2d6d722a6..d892d0f9b91 100644 --- a/public/content/translations/ja/developers/tutorials/run-node-raspberry-pi/index.md +++ b/public/content/translations/ja/developers/tutorials/run-node-raspberry-pi/index.md @@ -14,34 +14,34 @@ source: Ethereum on ARM sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/ --- -**Ethereum on Arm は、Raspberry Pi をイーサリアムノードにするカスタム Linux イメージです。** +**Ethereum on Armは、Raspberry PiをイーサリアムノードにするカスタムLinuxイメージです。** -Ethereum on Arm を使用して Raspberry Pi をイーサリアムノードにする場合、次のハードウェアが推奨されます。 +Ethereum on Armを使用してRaspberry Piをイーサリアムノードにする場合、次のハードウェアが推奨されます。 -- Raspberry 4 (モデル B 8 GB)、Odroid M1 または Rock 5B (8 GB / 16 GB RAM)ボード -- マイクロ SD カード(最小構成: 16 GB、クラス 10) -- 2 TB SSD 最小 USB 3.0 ディスクまたは USB-SATA ケース付き SSD +- Raspberry 4 (モデル B 8 GB)、Odroid M1またはRock 5B (8 GB / 16 GB RAM)ボード +- マイクロSDカード(最小構成: 16 GB、クラス10) +- 2 TB SSD最小USB 3.0ディスクまたはUSB-SATAケース付きSSD - 電源 - イーサネットケーブル - ポートフォワーディング機能(詳細はクライアントを参照してください) - ヒートシンクとファンが付属しているケース -- USB キーボード、モニター、HDMI ケーブル(マイクロ HDMI) (オプション) +- USBキーボード、モニター、HDMIケーブル(マイクロHDMI) (オプション) -## Ethereum on Arm を実行する理由 {#why-run-ethereum-on-arm} +## Ethereum on Armを実行する理由 {#why-run-ethereum-on-arm} -ARM ボードは価格が非常に手頃で、柔軟性の高い、小型のコンピュータです。 このボードは、イーサリアムノードを実行するのに適しています。手ごろな価格で、ノードだけにリソースを使うように設定が可能であり、効率的で電力消費量が少なく、物理的にも小さいので家に置いても邪魔にならないからです。 また、ノードを立ち上げるのも簡単です。Raspberry Pi のマイクロ SD カードは、ビルド済みイメージを簡単に書き込めるので、ソフトウェアのダウンロードやビルドが不要です。 +ARMボードは価格が非常に手頃で、柔軟性の高い、小型のコンピュータです。 このボードは、イーサリアムノードを実行するのに適しています。手ごろな価格で、ノードだけにリソースを使うように設定が可能であり、効率的で電力消費量が少なく、物理的にも小さいので家に置いても邪魔にならないからです。 また、ノードを立ち上げるのも簡単です。Raspberry PiのマイクロSDカードは、ビルド済みイメージを簡単に書き込めるので、ソフトウェアのダウンロードやビルドが不要です。 ## 動作方法 {#how-does-it-work} -ビルド済みイメージを Raspberry Pi のメモリーカードに書き込みます。 このイメージには、イーサリアムノードを実行するために必要なすべてが含まれています。 この書き込まれたカードがあれば、ユーザーは Raspberry Pi の電源を入れるだけで済みます。 ノードを実行するのに必要なすべてのプロセスは自動で開始します。 メモリーカードに Linux ベースのオペレーティングシステム(OS)が含まれており、その上でシステムレベルのプロセスが自動的に実行され、ARM ボードがイーサリアムノードになります。 +ビルド済みイメージをRaspberry Piのメモリーカードに書き込みます。 このイメージには、イーサリアムノードを実行するために必要なすべてが含まれています。 この書き込まれたカードがあれば、ユーザーはRaspberry Piの電源を入れるだけで済みます。 ノードを実行するのに必要なすべてのプロセスは自動で開始します。 メモリーカードにLinuxベースのオペレーティングシステム(OS)が含まれており、その上でシステムレベルのプロセスが自動的に実行され、ARMボードがイーサリアムノードになります。 -イーサリアムは、Raspberry Pi の Linux OS としてよく知られている「Raspbian」では実行できません。Raspbian は、依然として 32 ビットのアーキテクチャを使用しており、これによるメモリの問題が発生します。さらに、コンセンサスクライアントは、32 ビットバイナリをサポートしていません。 これを克服するために、Ethereum on Arm チームは、「Armbian」と呼ばれるネイティブの 64 ビット OS に移行しました。 +イーサリアムは、Raspberry PiのLinux OSとしてよく知られている「Raspbian」では実行できません。Raspbianは、依然として32ビットのアーキテクチャを使用しており、これによるメモリの問題が発生します。さらに、コンセンサスクライアントは、32ビットバイナリをサポートしていません。 これを克服するために、Ethereum on Armチームは、「Armbian」と呼ばれるネイティブの64ビットOSに移行しました。 -**このイメージは、必要なステップのすべてを行います**。環境のセットアップ、SSD ディスクのフォーマット、イーサリアムソフトウェアのインストールと実行だけでなくブロックチェーンの同期も開始します。 +**このイメージは、必要なステップのすべてを行います**。環境のセットアップ、SSDディスクのフォーマット、イーサリアムソフトウェアのインストールと実行だけでなくブロックチェーンの同期も開始します。 ## 実行クライアントとコンセンサスクライアントに関する注意事項 {#note-on-execution-and-consensus-clients} -Ethereum on Arm のイメージには、ビルド済みの実行クライアントとコンセンサスクライアントがサービスとして組み込まれています。 イーサリアムノードでは、両方のクライアントが同期されて実行される必要があります。 ここでユーザーがすべきことは、イメージをダウンロードして書き込んだ後、サービスを開始するだけです。 イメージには、次の実行クライアントが入っています。 +Ethereum on Armのイメージには、ビルド済みの実行クライアントとコンセンサスクライアントがサービスとして組み込まれています。 イーサリアムノードでは、両方のクライアントが同期されて実行される必要があります。 ここでユーザーがすべきことは、イメージをダウンロードして書き込んだ後、サービスを開始するだけです。 イメージには、次の実行クライアントが入っています。 - Geth - Nethermind @@ -54,13 +54,13 @@ Ethereum on Arm のイメージには、ビルド済みの実行クライアン - プリズム - テク -使いたい実行クライアントとコンセンサスクライアントを各 1 つずつ選びます。すべての実行クライアントは、すべてのコンセンサスクライアントと連携可能です。 クライアントを選択しなかった場合、デフォルトで Geth とライトハウスになります。ボードに電源を入れると、これらのクライアントが自動的に実行されます。 Geth がピアを見つけて接続できるように、ルーターで 30303 ポートを開く必要があります。 +使いたい実行クライアントとコンセンサスクライアントを各1つずつ選びます。すべての実行クライアントは、すべてのコンセンサスクライアントと連携可能です。 クライアントを選択しなかった場合、デフォルトでGethとライトハウスになります。ボードに電源を入れると、これらのクライアントが自動的に実行されます。 Gethがピアを見つけて接続できるように、ルーターで30303ポートを開く必要があります。 ## イメージのダウンロード {#downloading-the-image} -Raspberry Pi 4 のイーサリアムイメージは、「プラグ・アンド・プレイ」イメージです。実行クライアントとコンセンサスクライアントのインストールとセットアップが自動的に行われ、それらが互いに通信し、イーサリアムネットワークに接続するように設定されます。 ユーザーがすべきことは、単純なコマンドを使用してプロセスを開始するだけです。 +Raspberry Pi 4のイーサリアムイメージは、「プラグ・アンド・プレイ」イメージです。実行クライアントとコンセンサスクライアントのインストールとセットアップが自動的に行われ、それらが互いに通信し、イーサリアムネットワークに接続するように設定されます。 ユーザーがすべきことは、単純なコマンドを使用してプロセスを開始するだけです。 -[Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1)から Raspberry Pi イメージをダウンロードし、次のように SHA256 ハッシュを確認してください。 +[Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1)からRaspberry Piイメージをダウンロードし、次のようにSHA256ハッシュを確認してください。 ```sh # ダウンロードしたイメージがあるディレクトリで以下を実行します。 @@ -69,11 +69,11 @@ shasum -a 256 ethonarm_22.04.00.img.zip fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f ``` -Rock 5B と Odroid M1 ボードのイメージは、Ethereum-on-Arm の[ダウンロードページ](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/quick-guide/download-and-install.html)から入手可能です。 +Rock 5BとOdroid M1ボードのイメージは、Ethereum-on-Armの[ダウンロードページ](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/quick-guide/download-and-install.html)から入手可能です。 -## マイクロ SD への書き込み {#flashing-the-microsd} +## マイクロSDへの書き込み {#flashing-the-microsd} -Raspberry Pi で使用するマイクロ SD カードは、まずデスクトップパソコンかノートパソコンに挿入して書き込む必要があります。 以下のターミナルコマンドで、ダウンロードしたイメージを SD カードに書き込みます。 +Raspberry Piで使用するマイクロSDカードは、まずデスクトップパソコンかノートパソコンに挿入して書き込む必要があります。 以下のターミナルコマンドで、ダウンロードしたイメージをSDカードに書き込みます。 ```shell # マイクロSDカード名の確認 @@ -82,34 +82,34 @@ sudo fdisk -l >> sdxxx ``` -SD カード名を正しく取得することは、非常に重要です。次に使うコマンドに`dd`があり、これはイメージを書き込む前にカードの内容を完全に削除するからです。 zip イメージがあるディレクトリに移動して続行します。 +SDカード名を正しく取得することは、非常に重要です。次に使うコマンドに`dd`があり、これはイメージを書き込む前にカードの内容を完全に削除するからです。 zipイメージがあるディレクトリに移動して続行します。 ```shell -# zip展開とイメージの書き込み +# unzip and flash image unzip ethonarm_22.04.00.img.zip -sudo dd bs=1M if=ethonarm_kiln_22.04.00.img of=/dev/mmcblk0 conv=fdatasync status=progress +sudo dd bs=1M if=ethonarm_22.04.00.img of=/dev/ conv=fdatasync status=progress ``` -これでカードに書きこまれたので、Raspberry Pi に挿入できます。 +これでカードに書きこまれたので、Raspberry Piに挿入できます。 ## ノードの開始 {#start-the-node} -SD カードを挿入した Raspberry Pi に、SSD とイーサネットケーブルを接続し、電源を入れてください。 OS が起動し、クライアントソフトウェアのインストールやビルドなど、Raspberry Pi をイーサリアムノードにする事前設定処理が自動的に開始します。 この処理には 10 ~ 15 分を要します。 +SDカードを挿入したRaspberry Piに、SSDとイーサネットケーブルを接続し、電源を入れてください。 OSが起動し、クライアントソフトウェアのインストールやビルドなど、Raspberry Piをイーサリアムノードにする事前設定処理が自動的に開始します。 この処理には10~15分を要します。 -自動インストールおよび設定が完了したら、モニターとキーボードがボードに接続されているならば直接ターミナルを使うか、SSH 接続でデバイスへログインしてください。 `ethereum`アカウントを使用してログインします。このアカウントは、ノードの開始に必要なパーミッションを持っています。 +自動インストールおよび設定が完了したら、モニターとキーボードがボードに接続されているならば直接ターミナルを使うか、SSH接続でデバイスへログインしてください。 `ethereum`アカウントを使用してログインします。このアカウントは、ノードの開始に必要なパーミッションを持っています。 ```shell User: ethereum Password: ethereum ``` -デフォルトの実行クライアントである Geth が自動的に開始します。 次のターミナルコマンドを使用してログをチェックすることで、開始を確認できます。 +デフォルトの実行クライアントであるGethが自動的に開始します。 次のターミナルコマンドを使用してログをチェックすることで、開始を確認できます。 ```sh sudo journalctl -u geth -f ``` -コンセンサスクライアントは、明示的に開始する必要があります。 開始するには、まずルーターの 9000 ポートを開き、ライトハウスがピアを見つけて接続できるようにします。 次にライトハウスサービスを有効にして開始します。 +コンセンサスクライアントは、明示的に開始する必要があります。 開始するには、まずルーターの9000ポートを開き、ライトハウスがピアを見つけて接続できるようにします。 次にライトハウスサービスを有効にして開始します。 ```sh sudo systemctl enable lighthouse-beacon @@ -124,15 +124,15 @@ sudo journalctl -u lighthouse-beacon チェックポイント同期を使用するため、コンセンサスクライアントは数分で同期されることに注意してください。 実行クライアントは、同期により時間がかかります。数時間かかる場合もあります。さらに、コンセンサスクライアントの同期が完了するまで、同期を開始しません(これは、実行クライアントが、同期されたコンセンサスクライアントが提供する同期先のターゲットを必要とするためです)。 -Geth とライトハウスのサービスが開始し同期されると、Raspberry Pi がイーサリアムノードになります。 イーサリアムネットワークとのやり取りを行うには、8545 ポートで Geth クライアントに接続し、Geth の Javascript コンソールを使うことが最も一般的な方法です。 また、Curl などのリクエストツールを使用して、JSON オブジェクトとしてフォーマットされたコマンドを送信することもできます。 詳細は、[Geth のドキュメント](https://geth.ethereum.org/)をご覧ください。 +Gethとライトハウスのサービスが開始し同期されると、Raspberry Piがイーサリアムノードになります。 イーサリアムネットワークとのやり取りを行うには、8545ポートでGethクライアントに接続し、GethのJavascriptコンソールを使うことが最も一般的な方法です。 また、Curlなどのリクエストツールを使用して、JSONオブジェクトとしてフォーマットされたコマンドを送信することもできます。 詳細は、[Gethのドキュメント](https://geth.ethereum.org/)をご覧ください。 -Geth は、ブラウザで表示できる Grafana ダッシュボードに、メトリクスをレポートするように事前設定されています。 この機能を使用してノードの健全性を監視したい上級ユーザーは、`ipaddress:3000`にアクセスして`user: admin`と`passwd: ethereum`を入力してください。 +Gethは、ブラウザで表示できるGrafanaダッシュボードに、メトリクスをレポートするように事前設定されています。 この機能を使用してノードの健全性を監視したい上級ユーザーは、`ipaddress:3000`にアクセスして`user: admin`と`passwd: ethereum`を入力してください。 ## バリデータ {#validators} -バリデータは、コンセンサスクライアントにオプションで追加することもできます。 バリデータソフトウェアを使用すると、ノードが積極的にコンセンサスに参加し、暗号経済のセキュリティをネットワークに提供できるようになります。 この作業の報酬として ETH を受け取れます。 バリデータを実行するには、まず 32 ETH を持っている必要があり、これをデポジットコントラクトに預け入れる必要があります。 **長期的なコミットメントとなるため、この ETH はまだ引き出すことはできません。** 預け入れは、[ランチパッド](https://launchpad.ethereum.org/)のステップバイステップガイドに従って行うことができます。 この作業は、デスクトップパソコンまたはノートパソコンで行いますが、キーは生成しないでください。キーは Raspberry Pi で直接生成します。 +バリデータは、コンセンサスクライアントにオプションで追加することもできます。 バリデータソフトウェアを使用すると、ノードが積極的にコンセンサスに参加し、暗号経済のセキュリティをネットワークに提供できるようになります。 この作業の報酬としてETHを受け取れます。 バリデータを実行するには、まず32 ETHを持っている必要があり、これをデポジットコントラクトに預け入れる必要があります。 **長期的なコミットメントとなるため、このETHはまだ引き出すことはできません。** 預け入れは、[ランチパッド](https://launchpad.ethereum.org/)のステップバイステップガイドに従って行うことができます。 この作業は、デスクトップパソコンまたはノートパソコンで行いますが、キーは生成しないでください。キーはRaspberry Piで直接生成します。 -Raspberry Pi のターミナルを開き、以下のコマンドを実行して、デポジットキーを生成してください。 +Raspberry Piのターミナルを開き、以下のコマンドを実行して、デポジットキーを生成してください。 ``` sudo apt-get update @@ -140,11 +140,11 @@ sudo apt-get install staking-deposit-cli cd && deposit new-mnemonic --num_validators 1 ``` -ニーモニックフレーズを安全に保管してください。 上記コマンドで、ノードのキーストアに 2 つのファイルが生成されました。これらは、バリデータキーとデポジットデータファイルです。 デポジットデータは、ランチパッドにアップロードする必要があるため、Raspberry Pi からデスクトップパソコンまたはノートパソコンにコピーする必要があります。 これは、ssh 接続や他のコピー/ペーストの手法を用いて行えます。 +ニーモニックフレーズを安全に保管してください。 上記コマンドで、ノードのキーストアに2つのファイルが生成されました。これらは、バリデータキーとデポジットデータファイルです。 デポジットデータは、ランチパッドにアップロードする必要があるため、Raspberry Piからデスクトップパソコンまたはノートパソコンにコピーする必要があります。 これは、ssh接続や他のコピー/ペーストの手法を用いて行えます。 ランチパッドを実行しているコンピューターでデポジットデータファイルが利用可能になったら、これをランチパッド画面の「`+`」にドラッグ・アンド・ドロップすることができます。 画面の指示に従って、デポジットコントラクトにトランザクションを送信してください。 -Raspberry Pi に戻ると、バリデータが開始可能になります。 これには、バリデータキーのインポート、報酬を受け取るためのアドレスの設定、事前設定されたバリデータプロセスの開始が必要になります。 以下は、ライトハウス向けの例です。その他のコンセンサス クライアント向けの手順については、[Ethereum on Arm のドキュメント](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/)を参照してください。 +Raspberry Piに戻ると、バリデータが開始可能になります。 これには、バリデータキーのインポート、報酬を受け取るためのアドレスの設定、事前設定されたバリデータプロセスの開始が必要になります。 以下は、ライトハウス向けの例です。その他のコンセンサス クライアント向けの手順については、[Ethereum on Armのドキュメント](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/)を参照してください。 ```shell # バリデータキーのインポート @@ -157,15 +157,15 @@ sudo sed -i 's/' /etc/ethereum/lighthouse-validator.conf sudo systemctl start lighthouse-validator ``` -おめでとうございます。これでフルイーサリアムノードとバリデータが、Raspberry Pi で実行されました。 +おめでとうございます。これでフルイーサリアムノードとバリデータが、Raspberry Piで実行されました。 ## 詳細情報 {#more-details} -このページでは、Raspberry Pi を使用して Geth およびライトハウスのノードとバリデータを設定する方法の概要について説明しました。 さらに詳細な手順は、[Ethereum on Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html)のウェブサイトでご覧いただけます。 +このページでは、Raspberry Piを使用してGethおよびライトハウスのノードとバリデータを設定する方法の概要について説明しました。 さらに詳細な手順は、[Ethereum on Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html)のウェブサイトでご覧いただけます。 ## フィードバックご協力のお願い {#feedback-appreciated} -Raspberry Pi は多くのユーザーが利用しており、イーサリアムネットワークの健全性に非常に良い影響を与えてきました。 このチュートリアルを深く掘り下げていき、テストネットで実行してみてください。また、Ethereum on Arm の GitHub ページの確認、フィードバックの提供、問題提起、プルリクエストの作成による、テクノロジーの進歩とドキュメント化推進へのご協力をお願いします。 +Raspberry Piは多くのユーザーが利用しており、イーサリアムネットワークの健全性に非常に良い影響を与えてきました。 このチュートリアルを深く掘り下げていき、テストネットで実行してみてください。また、Ethereum on ArmのGitHubページの確認、フィードバックの提供、問題提起、プルリクエストの作成による、テクノロジーの進歩とドキュメント化推進へのご協力をお願いします。 ## 参考文献 {#references} diff --git a/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index ef4a3ea6511..7aace3323b9 100644 --- a/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/ja/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -16,9 +16,9 @@ source: soliditydeveloper.com sourceUrl: https://soliditydeveloper.com/thegraph --- -今回は、The Graph について詳しく見ていきます。The Grash は昨年、分散型アプリケーション(Dapp)を開発するために欠かせない標準スタックの一部となりました。 まずは、従来のやり方から見ていきましょう。 +今回は、The Graphについて詳しく見ていきます。The Grashは昨年、分散型アプリケーション(Dapp)を開発するために欠かせない標準スタックの一部となりました。 まずは、従来のやり方から見ていきましょう。 -## The Graph を使わない例 {#without-the-graph} +## The Graphを使わない例 {#without-the-graph} それでは、説明のために簡単な例から始めます。 私たちは皆、ゲームが好きなので、ユーザーが賭けをする次の簡単なゲームを考えてみましょう。 @@ -52,7 +52,7 @@ contract Game { 2. `totalGamesPlayerLost`の取得 3. `BetPlaced`イベントのサブスクライブ -右に示したように[Web3 イベント](https://docs.web3js.org/api/web3/class/Contract#events)をリッスンできますが、多くのケースを処理する必要があります。 +右に示したように[Web3イベント](https://docs.web3js.org/api/web3/class/Contract#events)をリッスンできますが、多くのケースを処理する必要があります。 ```solidity GameContract.events.BetPlaced({ @@ -83,29 +83,29 @@ GameContract.events.BetPlaced({ では、より良い解決策を見ていきましょう。 -## GraphQL の紹介 {#let-me-introduce-to-you-graphql} +## GraphQLの紹介 {#let-me-introduce-to-you-graphql} -最初に GraphQL について説明します。GraphQL は、もともとフェイスブック社によって設計され、実装されました。 従来の Rest API モデルについては、ご存知かもしれません。 では、今度は次のように必要なデータを正確に取得できるクエリを作成できると想像してみてください。 +最初にGraphQLについて説明します。GraphQLは、もともとフェイスブック社によって設計され、実装されました。 従来のRest APIモデルについては、ご存知かもしれません。 では、今度は次のように必要なデータを正確に取得できるクエリを作成できると想像してみてください。 ![GraphQL APIとREST APIの比較](./graphql.jpg) -2 つの画像は、GraphQL の本質をほぼ捉えています。 右のクエリーでは、必要なデータを正確に定義できるので、1 回のリクエストで必要なものだけを取得できます。 GraphQL サーバーは必要とされるすべてのデータの取得を処理できるので、フロントエンドのコンシューマ側にとっては極めて使いやすいツールとなっています。 ご興味があれば、サーバーが具体的にどのようにクエリを処理するかについて[わかりやすい説明](https://www.apollographql.com/blog/graphql-explained-5844742f195e/)をご覧ください。 +2つの画像は、GraphQLの本質をほぼ捉えています。 右のクエリーでは、必要なデータを正確に定義できるので、1回のリクエストで必要なものだけを取得できます。 GraphQLサーバーは必要とされるすべてのデータの取得を処理できるので、フロントエンドのコンシューマ側にとっては極めて使いやすいツールとなっています。 ご興味があれば、サーバーが具体的にどのようにクエリを処理するかについて[わかりやすい説明](https://www.apollographql.com/blog/graphql-explained-5844742f195e/)をご覧ください。 -この知識をもとに、ブロックチェーン空間と The Graph の世界に入って行きましょう。 +この知識をもとに、ブロックチェーン空間とThe Graphの世界に入って行きましょう。 -## The Graph とは {#what-is-the-graph} +## The Graphとは {#what-is-the-graph} -ブロックチェーンは、分散型データベースですが、通常のデータベースとは対照的に、データベースに対するクエリ言語がありません。 データを取得することにおいては、苦痛を伴うか不可能かのどちらかです。 The Graph は、ブロックチェーンデータのインデックス作成とクエリを行うための分散型プロトコルです。 ご想像の通り The Graph は、GraphQL をクエリ言語として使用しています。 +ブロックチェーンは、分散型データベースですが、通常のデータベースとは対照的に、データベースに対するクエリ言語がありません。 データを取得することにおいては、苦痛を伴うか不可能かのどちらかです。 The Graphは、ブロックチェーンデータのインデックス作成とクエリを行うための分散型プロトコルです。 ご想像の通りThe Graphは、GraphQLをクエリ言語として使用しています。 ![The Graph](./thegraph.png) -何かを理解するには例を見るのが最善なので、先ほどの GameContract で The Graph を使ってみましょう。 +何かを理解するには例を見るのが最善なので、先ほどのGameContractでThe Graphを使ってみましょう。 ## サブグラフの作成方法 {#how-to-create-a-subgraph} -サブグラフは、データにインデックスを作成する方法を定義するものです。 定義には、次の 3 つのコンポーネントが必要です。 +サブグラフは、データにインデックスを作成する方法を定義するものです。 定義には、次の3つのコンポーネントが必要です。 1. マニフェスト(`subgraph.yaml`) 2. スキーマ(`schema.graphql`) @@ -120,11 +120,11 @@ GameContract.events.BetPlaced({ - 関数呼び出しやブロックなど、その他に何をリッスンするか - 呼び出されるマッピング関数 (後述の`mapping.ts`を参照) -マニフェストには複数のコントラクトとハンドラを定義できます。 典型的な設定では、Truffle または Hardhat プロジェクト内にサブグラフフォルダと独自のリポジトリがあります。 それにより、簡単にアプリケーションバイナリインターフェース(ABI)を参照することができます。 +マニフェストには複数のコントラクトとハンドラを定義できます。 典型的な設定では、TruffleまたはHardhatプロジェクト内にサブグラフフォルダと独自のリポジトリがあります。 それにより、簡単にアプリケーションバイナリインターフェース(ABI)を参照することができます。 -便利さの観点から、Mustache のようなテンプレートツールを使用することもできます。 `subgraph.template.yaml`を作成し、最新のデプロイメントに基づいたアドレスを挿入します。 より高度な設定例については、[Aave サブグラフリポジトリ](https://github.com/aave/aave-protocol/tree/master/thegraph)の例をご覧ください。 +便利さの観点から、Mustacheのようなテンプレートツールを使用することもできます。 `subgraph.template.yaml`を作成し、最新のデプロイメントに基づいたアドレスを挿入します。 より高度な設定例については、[Aaveサブグラフリポジトリ](https://github.com/aave/aave-protocol/tree/master/thegraph)の例をご覧ください。 -完全なドキュメントは、こちらをご覧ください。https://thegraph.com/docs/define-a-subgraph#the-subgraph-manifest +ドキュメント全文については、[こちら](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest)をご覧ください。 ```yaml specVersion: 0.0.1 @@ -157,17 +157,17 @@ dataSources: ### スキーマ(`schema.graphql`) {#schema} -スキーマは、GraphQL のデータ定義です。 必要なエンティティとタイプを定義することができます。 The Graph でサポートされているタイプは、次のとおりです。 +スキーマは、GraphQLのデータ定義です。 必要なエンティティとタイプを定義することができます。 The Graphでサポートされているタイプは、次のとおりです。 - バイト型 -- ID 型 +- ID型 - 文字列型 - ブール型 - 整数型 -- BigInt 型 -- BigDecimal 型 +- BigInt型 +- BigDecimal型 -リレーションシップを定義するために、エンティティをタイプとして使用することもできます。 この例では、プレイヤーと賭け(Bet)で 1 対多のリレーションシップを定義します。 「!」 は、空の値を取れないこと意味します。 完全なドキュメントは、こちらをご覧ください。https://thegraph.com/docs/define-a-subgraph#the-graphql-schema +リレーションシップを定義するために、エンティティをタイプとして使用することもできます。 この例では、プレイヤーと賭け(Bet)で1対多のリレーションシップを定義します。 「!」 は、空の値を取れないこと意味します。 完全なドキュメントは、[こちら](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest)をご覧ください。 ```graphql type Bet @entity { @@ -188,15 +188,15 @@ type Player @entity { ### マッピング(`mapping.ts`) {#mapping} -The Graph のマッピングファイルは、受信したイベントをエンティティに変換する関数を定義します。 Typescript のサブセットである AssemblyScript で書きます。 これは、より効率化され、よりポータブル化されたマッピングの実行を実現するため、WebAssembly(WASM)にコンパイルされます。 +The Graphのマッピングファイルは、受信したイベントをエンティティに変換する関数を定義します。 TypescriptのサブセットであるAssemblyScriptで書きます。 これは、より効率化され、よりポータブル化されたマッピングの実行を実現するため、WebAssembly(WASM)にコンパイルされます。 -各関数を`subgraph.yaml`ファイルに定義する必要があります。この例では、`handleNewBet`の一つだけが必要です。 まず、id として送信者アドレスから Player エンティティを読み込もうとします。 存在しない場合は、新しいエンティティを作成して開始値を入れます。 +各関数を`subgraph.yaml`ファイルに定義する必要があります。この例では、`handleNewBet`の一つだけが必要です。 まず、idとして送信者アドレスからPlayerエンティティを読み込もうとします。 存在しない場合は、新しいエンティティを作成して開始値を入れます。 -次に、Bet エンティティを作成します。 id は、`event.transaction.hash.toHex() + "-" + event.logIndex.toString()`になり、常に一意の値になります。 誰かがスマートコントラクトを介して 1 つのトランザクションで placeBet 関数を複数回呼び出す可能性があるため、ハッシュのみの使用では十分ではありません。 +次に、Betエンティティを作成します。 idは、`event.transaction.hash.toHex() + "-" + event.logIndex.toString()`になり、常に一意の値になります。 誰かがスマートコントラクトを介して1つのトランザクションでplaceBet関数を複数回呼び出す可能性があるため、ハッシュのみの使用では十分ではありません。 -最後に、すべてのデータで Player エンティティを更新します。 配列を直接プッシュすることはできませんが、ここに示すように更新する必要があります。 bet を参照するために id を使用します。 エンティティを保存するには、`.save()`が最後に必要です。 +最後に、すべてのデータでPlayerエンティティを更新します。 配列を直接プッシュすることはできませんが、ここに示すように更新する必要があります。 betを参照するためにidを使用します。 エンティティを保存するには、`.save()`が最後に必要です。 -完全なドキュメントは、こちらをご覧ください。https://thegraph.com/docs/define-a-subgraph#writing-mappings マッピングファイルにログの出力を追加できます。詳細は[こちら](https://thegraph.com/docs/assemblyscript-api#api-reference)をご覧ください。 +ドキュメント全文については、こちらをご覧ください。https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings マッピングファイルにログの出力を追加できます。詳細は[こちら](https://thegraph.com/docs/assemblyscript-api#api-reference)をご覧ください。 ```typescript import { Bet, Player } from "../generated/schema" @@ -240,7 +240,7 @@ export function handleNewBet(event: PlacedBet): void { ## フロントエンドでの使用 {#using-it-in-the-frontend} -Apollo Boost などを使うと、The Graph を React(または Apollo-Vue)の分散型アプリケーション(Dapp)に簡単に統合できます。 特に React フックと Apollo を使用する場合は、コンポーネントに単一の GraphQL クエリを記述するのと同じくらいデータの取得が簡単です。 典型的な設定は次のようになります。 +Apollo Boostなどを使うと、The GraphをReact(またはApollo-Vue)の分散型アプリケーション(Dapp)に簡単に統合できます。 特にReactフックとApolloを使用する場合は、コンポーネントに単一のGraphQLクエリを記述するのと同じくらいデータの取得が簡単です。 典型的な設定は次のようになります。 ```javascript // See all subgraphs: https://thegraph.com/explorer/ @@ -262,7 +262,7 @@ ReactDOM.render( - 現在のユーザーの敗北数 - 過去の賭けのタイムスタンプのリスト -GraphQL サーバーへの単一リクエストですべて取得できます。 +GraphQLサーバーへの単一リクエストですべて取得できます。 ```javascript const myGraphQlQuery = gql` @@ -287,30 +287,27 @@ React.useEffect(() => { ![マジック](./magic.jpg) -しかし、最後のパズルの 1 つが欠けています。それがサーバーについてです。 自分のノードでサーバーを実行することも、ホストサービスを使用することもできます。 +しかし、最後のパズルの1つが欠けています。それがサーバーについてです。 自分のノードでサーバーを実行することも、ホストサービスを使用することもできます。 -## The Graph サーバー {#the-graph-server} +## The Graphサーバー {#the-graph-server} ### Graph エクスプローラー: ホストサービス {#graph-explorer-the-hosted-service} -最も簡単な方法は、ホストサービスを利用することです。 [こちらの手順](https://thegraph.com/docs/deploy-a-subgraph)に従ってサブグラフをデプロイします。 エクスプローラー(https://thegraph.com/explorer/)では、さまざまなプロジェクト向けに既存のサブグラフを探せます。 +最も簡単な方法は、ホストサービスを利用することです。 [こちらの手順](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/)に従ってサブグラフをデプロイしてください。 [エクスプローラー](https://thegraph.com/explorer/)では、さまざまなプロジェクト向けに既存のサブグラフを探すことができます。 ![The Graphエクスプローラー](./thegraph-explorer.png) ### 自分のノードで実行 {#running-your-own-node} -もう一つの方法として、次のように自分のノードで実行することもできます。 https://github.com/graphprotocol/graph-node#quick-start これにより、ホストサービスでサポートされていないネットワークで使用することができます。 現在サポートされいるネットワークは、Mainnet、Kovan、Rinkeby、Ropsten、Goerli、PoA-Core、xDAI、Sokol です。 +自分のノードでも実行できます。 実行方法については、[こちら](https://github.com/graphprotocol/graph-node#quick-start)のドキュメントをご覧ください。 これにより、ホストサービスでサポートされていないネットワークでも使用できます。 現在サポートしているネットワークについては、[こちら](https://thegraph.com/docs/en/developing/supported-networks/)をご覧ください。 ## 非中央集権型の未来 {#the-decentralized-future} -GraphQL は、新しく受信するイベントのストリームもサポートしています。 The Graph では、完全にはサポートされていませんが、近々リリースされる予定です。 +GraphQLは、新しく受信するイベントのストリームもサポートしています。 これらの機能は、現在オープンベータ版の[Substreams](https://thegraph.com/docs/en/substreams/)を通して、グラフ上でサポートされています。 -このサービスに欠けている側面の一つは、分散化です。 The Graph は、最終的に完全に分散化されたプロトコルになる予定です。 この計画を詳細に説明する次の 2 つの素晴らしい記事をご覧ください。 +[2021](https://thegraph.com/blog/mainnet-migration/)年に、The Graphは分散型インデックスネットワークへの移行を開始しました。 分散型インデックスネットワークのアーキテクチャの詳細については、[こちら](https://thegraph.com/docs/en/network/explorer/)をご覧ください。 -- https://thegraph.com/blog/the-graph-network-in-depth-part-1 -- https://thegraph.com/blog/the-graph-network-in-depth-part-2 - -次の 2 つの重要な点があります。 +次の2つの重要な点があります。 1. ユーザーは、クエリのインデックス作成者に料金を支払う。 2. インデックス作成者は、グラフトークン(GRT)をステーキングする。 diff --git a/public/content/translations/ja/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md b/public/content/translations/ja/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md index 25fab467a5f..4cdf617692d 100644 --- a/public/content/translations/ja/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md +++ b/public/content/translations/ja/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md @@ -15,16 +15,16 @@ sourceUrl: https://ethereumdev.io/transfers-and-approval-or-erc20-tokens-from-a- address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -前回のチュートリアルでは、イーサリアムブロックチェーン上の[Solidity で描かれた ERC-20 トークンの構造](/developers/tutorials/understand-the-erc-20-token-smart-contract/)について学びました。 この記事では、Solidity 言語で書かれたトークンとやり取りするためのスマートコントラクトの使い方について説明します。 +前回のチュートリアルでは、イーサリアムブロックチェーン上の[Solidityで描かれたERC-20トークンの構造](/developers/tutorials/understand-the-erc-20-token-smart-contract/)について学びました。 この記事では、Solidity言語で書かれたトークンとやり取りするためのスマートコントラクトの使い方について説明します。 -このスマートコントラクトのために、私たちは新しくデプロイされた[ERC-20 トークン](/developers/docs/standards/tokens/erc-20/)でイーサリアムを取引できる、ダミーの分散型取引所を実際に作成します。 +このスマートコントラクトのために、新しくデプロイされた[ERC-20トークン](/developers/docs/standards/tokens/erc-20/)でイーサを取引できる、ダミーの分散型取引所を実際に作成します。 このチュートリアルでは、前のチュートリアルで書いたコードをベースとして使います。 この分散型取引所(DEX)では、コントラクトのインスタンスをコンストラクタでインスタンス化し、以下の操作を実行します。 - トークンをイーサ(ETH)に交換 - イーサ(ETH)をトークンに交換 -次のシンプルな ERC20 コードベースを追加することで、分散型取引所コードを開始します。 +次のシンプルなERC20コードベースを追加することで、分散型取引所コードを開始します。 ```solidity pragma solidity ^0.8.0; @@ -104,7 +104,7 @@ contract ERC20Basic is IERC20 { ``` -次の新しい分散型取引所(DEX)スマートコントラクトは 、ERC-20 をデプロイし、供給されたすべてを取得します。 +次の新しい分散型取引所(DEX)スマートコントラクトは 、ERC-20をデプロイし、供給されたすべてを取得します。 ```solidity contract DEX { @@ -129,18 +129,18 @@ contract DEX { } ``` -これで分散型取引所(DEX)ができました。また、すべてのトークンリザーブが利用可能になりました。 コントラクトには、次の 2 つの関数があります。 +これで分散型取引所(DEX)ができました。また、すべてのトークンリザーブが利用可能になりました。 コントラクトには、次の2つの関数があります。 - `buy`: ユーザーはイーサ(ETH)を送ってトークンに交換できます - `sell`: ユーザーはトークンを送信してイーサ(ETH)を取り戻すことができます -## buy 関数 {#the-buy-function} +## buy関数 {#the-buy-function} -buy 関数をコーディングしてみましょう。 まず、メッセージに含まれるイーサ(ETH)の量を確認し、コントラクトが十分なトークンを所有していることと、そのメッセージにいくつかのイーサ(ETH)が含まれていることを検証する必要があります。 コントラクトが十分なトークンを所有している場合、ユーザーにその分のトークンを送信し、 `Bought` イベントを発行します。 +buy関数をコーディングしてみましょう。 まず、メッセージに含まれるイーサ(ETH)の量を確認し、コントラクトが十分なトークンを所有していることと、そのメッセージにいくつかのイーサ(ETH)が含まれていることを検証する必要があります。 コントラクトが十分なトークンを所有している場合、ユーザーにその分のトークンを送信し、 `Bought` イベントを発行します。 -require 関数の呼び出しがエラーだった場合に、送信されたイーサ(ETH)は直接元に戻され、ユーザーに返されることに注意してください。 +require関数の呼び出しがエラーだった場合に、送信されたイーサ(ETH)は直接元に戻され、ユーザーに返されることに注意してください。 -ここではシンプルに、1 トークンと 1Wei を交換します。 +ここではシンプルに、1トークンと1Weiを交換します。 ```solidity function buy() payable public { @@ -153,13 +153,13 @@ function buy() payable public { } ``` -購入が成功した場合、トランザクションには`Transfer`と`Bought`の 2 つのイベントが表示されます。 +購入が成功した場合、トランザクションには`Transfer`と`Bought`の2つのイベントが表示されます。 ![トランザクション内の2つのイベント: TransferとBought](./transfer-and-bought-events.png) -## sell 関数 {#the-sell-function} +## sell関数 {#the-sell-function} -売却を行う関数は事前に approve 関数を呼び出し、ユーザーがその金額を承認することを要求します。 転送を承認するには、分散型取引所(DEX)によってインスタンス化された ERC20Basic トークンがユーザーによって呼び出される必要があります。 これは、まず分散型取引所(DEX)コントラクトの`token()`関数を呼び出し、分散型取引所(DEX)が`token`という ERC20Basic コントラクトをデプロイしたアドレスを取得することで実現できます。 次に、セッション内にそのコントラクトのインスタンスを作成し、その`approve`関数を呼び出します。 次に、分散型取引所(DEX)の`sell`関数を呼び出すことで、トークンをイーサ(ETH)に交換できます。 例えば、インタラクティブ・ブラウニー(interactive brownie)セッションでは、次のようになります。 +売却を行う関数は事前にapprove関数を呼び出し、ユーザーがその金額を承認することを要求します。 転送を承認するには、分散型取引所(DEX)によってインスタンス化されたERC20Basicトークンがユーザーによって呼び出される必要があります。 これは、まず分散型取引所(DEX)コントラクトの`token()`関数を呼び出し、分散型取引所(DEX)が`token`というERC20Basicコントラクトをデプロイしたアドレスを取得することで実現できます。 次に、セッション内にそのコントラクトのインスタンスを作成し、その`approve`関数を呼び出します。 次に、分散型取引所(DEX)の`sell`関数を呼び出すことで、トークンをイーサ(ETH)に交換できます。 例えば、インタラクティブ・ブラウニー(interactive brownie)セッションでは、次のようになります。 ```python #### Python in interactive brownie console... @@ -183,7 +183,7 @@ token.approve(dex.address, 3e18, {'from':account2}) ``` -その後、sell 関数が呼び出されたときに、呼び出し元のアドレスからコントラクトアドレスへの転送が成功したかどうかを確認し、その後イーサ(ETH)を呼び出し元のアドレスに送信します。 +その後、sell関数が呼び出されたときに、呼び出し元のアドレスからコントラクトアドレスへの転送が成功したかどうかを確認し、その後イーサ(ETH)を呼び出し元のアドレスに送信します。 ```solidity function sell(uint256 amount) public { @@ -196,15 +196,15 @@ function sell(uint256 amount) public { } ``` -すべてがうまくいけば、トランザクションに 2 つのイベント(`Transfer` と `Sold`)が表示され、トークンの残高とイーサリアムの残高が更新されるはずです。 +すべてがうまくいけば、トランザクションに2つのイベント(`Transfer` と `Sold`)が表示され、トークンの残高とイーサの残高が更新されるはずです。 ![トランザクション内の2つのイベント: TransferとSold](./transfer-and-sold-events.png) -このチュートリアルでは、残高と ERC-20 トークンの割当量を確認する方法と、インターフェースを使用して ERC20 スマートコントラクトの`Transfer`と`TransferFrom`を呼び出す方法について説明しました。 +このチュートリアルでは、残高とERC-20トークンの割当量を確認する方法と、インターフェースを使用してERC20スマートコントラクトの`Transfer`と`TransferFrom`を呼び出す方法について説明しました。 -一度トランザクションが作成されると、コントラクト用に作成されている[待機してトランザクションについての詳細を取得する](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/)ための JavaScript チュートリアルや、アプリケーションバイナリインターフェース(ABI)があれば、[トークン転送や他のイベントによって発行されるイベントをデコードするチュートリアル](https://ethereumdev.io/how-to-decode-event-logs-in-javascript-using-abi-decoder/)を参照することで情報を取得できます。 +一度トランザクションが作成されると、コントラクト用に作成されている[待機してトランザクションについての詳細を取得する](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/)ためのJavaScriptチュートリアルや、アプリケーションバイナリインターフェース(ABI)があれば、[トークン転送や他のイベントによって発行されるイベントをデコードするチュートリアル](https://ethereumdev.io/how-to-decode-event-logs-in-javascript-using-abi-decoder/)を参照することで情報を取得できます。 チュートリアルの完全なコードは、次のようになります。 diff --git a/public/content/translations/ja/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/ja/developers/tutorials/uniswap-v2-annotated-code/index.md index 2f2786c88b6..dcbdbd18468 100644 --- a/public/content/translations/ja/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/ja/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -744,7 +744,7 @@ contract UniswapV2Factory is IUniswapV2Factory { (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); ``` -新しい取引所のアドレスを決定的にできるよう、事前にオフチェーンで計算できるようになっており (これは[レイヤー 2 トランザクション](/developers/docs/layer-2-scaling/)で役立ちます) 、 そうするためには、受け取った順序に関わらずトークンアドレスの順序に一貫性を持たせる必要があります。並べ替えているのは、こうした理由からです。 +新しい取引所のアドレスを決定的にできるよう、事前にオフチェーンで計算できるようになっており (これは[レイヤー 2 トランザクション](/developers/docs/scaling/)で役立ちます) 、 そうするためには、受け取った順序に関わらずトークンアドレスの順序に一貫性を持たせる必要があります。並べ替えているのは、こうした理由からです。 ```solidity require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); 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/ja/developers/tutorials/yellow-paper-evm/index.md b/public/content/translations/ja/developers/tutorials/yellow-paper-evm/index.md new file mode 100644 index 00000000000..f4a03f03ae3 --- /dev/null +++ b/public/content/translations/ja/developers/tutorials/yellow-paper-evm/index.md @@ -0,0 +1,264 @@ +--- +title: イエローペーパーにおけるEVM仕様の理解 +description: イーサリアムの正式な仕様であるイエローペーパーでのイーサリアム仮想マシン(EVM)についての説明を理解する。 +author: "qbzzt" +tags: + - "イーサリアム仮想マシン(EVM)" +skill: intermediate +lang: ja +published: 2022-05-15 +--- + +[イエローペーパー](https://ethereum.github.io/yellowpaper/paper.pdf)は、イーサリアムの正式な仕様です。 [EIPプロセス](/eips/)によって修正される場合を除き、すべての動作方式が正確に記されています。 数学の論文形式で書かれており、プログラマーには馴染みのない専門用語が含まれています。 この論文を通して、論文の読み方を学び、他の関連する数学論文も読めるようにしましょう。 + +## 解説するイエローペーパーについて {#which-yellow-paper} + +イーサリアムに関する他のものと同じように、イエローペーパーも時間の経過とともに進化しています。 特定のバージョンを参照できるように、[執筆時のバージョン](yellow-paper-berlin.pdf)をアップロードしています。 このドキュメントで使用するセクション番号、ページ番号、数式番号は、そのバージョンを参照しています。 ドキュメントを読む際は、アップロードされたイエローペーパーを別のウィンドウで開いておくと便利です。 + +### EVMを解説する理由 {#why-the-evm} + +イーサリアムの開発が始まったときに書かれたオリジナルのイエローペーパーでは、 コンセンサスメカニズムのベースとなったオリジナルのプルーフ・オブ・ワークについて記述されていました。 しかし、イーサリアムでは、2022年9月にプルーフ・オブ・ワークを止め、プルーフ・オブ・ステークをベースとしたコンセンサスを使い始めました。 このチュートリアルでは、イエローペーパーにおけるイーサリアム仮想マシンの定義部について解説します。 プルーフ・オブ・ステークへの移行後も、EVMは変更されていないことが解説する理由です。ただし、DIFFICULTY オペコードの戻り値は変更されています。 + +## 9 実行モデル {#9-execution-model} + +このセクション(p. 12-14)には、EVMの定義のほとんどが記述されています。 + +_システム状態_とは、システムを実行するため必要なすべての情報を指します。 典型的なコンピュータでは、これはメモリやレジスタの内容などです。 + +[チューリングマシン](https://en.wikipedia.org/wiki/Turing_machine)は、計算モデルです。 チューリングマシンは、コンピュータを本質的に単純化したもので、通常のコンピュータと同じ計算を実行する能力があることが証明されています。つまり、コンピュータが計算できるものはすべてチューリングマシンでも計算でき、またその逆も同様です。 このモデルは、さまざまな定理で何が計算可能で何が計算不可能であるかを証明するのに役立ちます。 + +[チューリング完全](https://en.wikipedia.org/wiki/Turing_completeness)とは、チューリングマシンと同じ計算を実行できるコンピュータのことを指します。 チューリングマシンは無限ループができますが、EVMではガスがなくなると無限ループができません。そのため、EVMは準チューリング完全であるといわれています。 + +## 9.1 基本事項 {#91-basics} + +このセクションでは、EVMの基本事項と、EVMと他の計算モデルとの比較について説明しています。 + +[スタックマシン](https://en.wikipedia.org/wiki/Stack_machine)は、中間データをレジスタではなく[**スタック**](https://en.wikipedia.org/wiki/Stack_(abstract_data_type))に格納するコンピュータです。 これは、仮想マシンで好まれるアーキテクチャです。なぜなら、実装が簡単で、バグやセキュリティの脆弱性が発生する可能性を大幅に低くできるためです。 スタック内のメモリは、256ビットのワードに分割されます。 256ビットが選ばれた理由としては、Kecck-256ハッシュや楕円曲線計算など、イーサリアムの中核となる暗号操作に都合が良いためです。 スタックの最大サイズは、1024バイトです。 オペコード実行時、通常、スタックからパラメータを取得します。 `POP`(スタックの先頭のアイテムの削除)、`DUP_N`(スタックのN番目のアイテムの複製)など、スタック内の要素を再構成するための専用オペコードがあります。 + +EVMには、 実行中にデータを保存するために使用される**メモリ**と呼ばれる揮発性スペースもあります。 このメモリは、32バイトのワードで構成されます。 すべてのメモリのロケーションは、ゼロで初期化されます。 次の[Yul](https://docs.soliditylang.org/en/latest/yul.html)コードを実行してメモリにワードを追加すると、32バイトのメモリのワード内にある空スペースがパディングによってゼロで埋められます。つまり、ロケーション0~29、0x60~30、0xA7~31にゼロが含まれる1つのワードが作成されます。 + +```yul +mstore(0, 0x60A7) +``` + +EVMは、メモリとやり取りをする3つのオペコードを提供しています。そのうちの1つが`mstore`で、ワードをメモリにロードします。 他の2つは、1バイトをメモリにロードする`mstore8`、ワードをメモリからスタックに移動する`mload`です。 + +EVMには、システム状態の一部として保持される独自の不揮発性**ストレージ**モデルもあります。このメモリは、(ワードアドレス可能なスタック内のバイト配列とは違い)ワードの配列で構成されます。 このストレージは、コントラクトが永続データを保存する場所です。コントラクトは、自分のストレージとしかやり取りできません。 ストレージは、キーと値のマッピングで構成されます。 + +イエローペーパーのこのセクションでは言及されていませんが、メモリに4番目のタイプがあることを知っておくといいでしょう。 **Calldata**は、トランザクションの`data`パラメータで渡された値を保存するために使用される、バイトアドレス可能な読み取り専用のメモリです。 EVMには、`calldata`を管理する専用のオペコードがあります。 `calldatasize`は、そのデータのサイズを返します。 `calldataload`は、そのデータをスタックにロードします。 `calldatacopy`は、そのデータをメモリにコピーします。 + +標準の[フォンノイマン型アーキテクチャ](https://en.wikipedia.org/wiki/Von_Neumann_architecture)では、コードとデータが同じメモリに保存されます。 しかし、EVMでは、セキュリティ上の理由からこの標準に準拠していません。なぜなら、揮発性メモリを共有すると、プログラムのコードが変更される可能性があるからです。 そのため、コードはストレージに保存されます。 + +コードがメモリから実行されるのは、次の2つのケースだけです。 + +- コントラクトが他のコントラクトを作成する場合([`CREATE`](https://www.evm.codes/#f0) または[`CREATE2`](https://www.evm.codes/#f5)を使用)、コントラクトにあるコンストラクタのコードはメモリから取得されます。 +- _あらゆる_コントラクトの作成において、コンストラクタのコードが実行され、メモリから実際のコントラクトのコードが返されます。 + +例外実行とは、現在のコントラクトの実行を停止させる例外を意味します。 + +## 9.2 フィーの概要 {#92-fees-overview} + +このセクションでは、ガス代の計算方法について説明しています。 次の3つのコストがあります。 + +### オペコードコスト {#opcode-cost} + +特定のオペコードで発生する固有のコストです。 この値を取得するには、付録H(ページ28)の式(327)の下部でオペコードのコストグループを見つけます。そして、式(324)でコストグループを見つけます。 ここには、コスト関数があります。ほとんどのケースにおいて、付録G(ページ27)のパラメータを使用します。 + +例えば、オペコード[`CALLDATACOPY`](https://www.evm.codes/#37)は、_Wcopy_グループのメンバーです。 このグループにおけるオペコードのコストは、_Gverylow+Gcopy×⌈μs[2]÷32⌉_となります。 付録Gを見ると、両方の定数が3であることがわかり、この式は、_3+3×⌈μs[2]÷32⌉_です。 + +また、_⌈μs[2]÷32⌉_という式を解読する必要があります。 一番外側の部分の _⌈ \ ⌉_は、天井関数です。この関数に値を指定すると、その値以上の最小の整数を返します。 例えば、_⌈2.5⌉ = ⌈3⌉ = 3_となります。 この式の内側部分は、_μs[2]÷32_です。 ページ3のセクション3(慣習)を参照してください。_μ_は、マシンの状態を表します。 マシンの状態は、ページ13のセクション9.4.1で定義されています。 そのセクションによると、マシンの状態パラメータの1つは、スタックの_s_になります。 したがって、_μs[2]_ は、スタックの2番目のロケーションにあるということです。 こちらの[オペコード](https://www.evm.codes/#37)では、スタック内のロケーション#2に、データのサイズ(バイト単位)が格納されています。 グループWの他のオペコードcopyである[`CODECOPY`](https://www.evm.codes/#39)と[`RETURNDATACOPY`](https://www.evm.codes/#3e)も、同じロケーションにデータのサイズを格納しています。 したがって、_⌈μs[2]÷32⌉_ は、コピーされるデータを保存するために必要になる32バイトのワード数です。 以上から、[`CALLDATACOPY`](https://www.evm.codes/#37)に固有のコストは、3ガスにコピーされるデータのワードごとに3ガスを加えたものになります。 + +### 実行コスト {#running-cost} + +呼び出すコードの実行コスト。 + +- [`CREATE`](https://www.evm.codes/#f0)および[`CREATE2`](https://www.evm.codes/#f5)の場合は、新しいコントラクトのコンストラクタ +- [`CALL`](https://www.evm.codes/#f1)、[`CALLCODE`](https://www.evm.codes/#f2)、[`STATICCALL`](https://www.evm.codes/#fa)、[`DELEGATECALL`](https://www.evm.codes/#f4)の場合は、呼び出すコントラクト + +### メモリーコストの拡張 {#expanding-memory-cost} + +(必要な場合の)メモリ拡張におけるコストについて。 + +この値は、式324で_Cmemi')-Cmemi)_として記述されています。 セクション9.4.1をもう一度見てみましょう。_μi_は、メモリ内のワード数であることがわかります。 そのため_μi_は、オペコードの前のメモリ内のワード数となります。また、_μi '_は、オペコード後のメモリ内のワード数を表します。 + +関数_Cmem_は、式326で次のように定義されます。_Cmem (a) = Gmemory × a + ⌊a2 ÷ 512⌋_ _⌊x⌋_は、床関数を表します。これは値を指定すると、その値以下の最大の整数を返す関数です。 例えば、 _⌊2.5⌋ = ⌊2⌋ = 2_となります。 _a < √512_のときは、 _a2 < 512_となり、この床関数の結果はゼロとなります。 そのため、最初の22ワード(704 バイト)については、必要なメモリワード数に応じてコストが線形的に増加します。 そのワード数を超えると、_⌊a2 ÷ 512⌋_が正になります。 必要なメモリが大きい場合、ガスコストがメモリ量の2乗に比例します。 + +これらの要素は、_固有_のガス代にのみ影響を与えることに**注意してください**。フィーマーケットやバリデータへのチップは、エンドユーザーが支払う必要がある金額を決定する要素であり、この式には含まれていません。この式は、EVMで特定の操作を実行するための直接コストのみを表しています。 + +[ガスについての詳細](/developers/docs/gas/) + +## 9.3 実行環境 {#93-execution-env} + +実行環境は、_I_で表します。これは、ブロックチェーンの状態やEVMの以外の情報を含みます。 + +| パラメータ | データにアクセスするためのオペコード | データにアクセスするためのSolidityのコード | +| --------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------ | +| _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)など | `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_ | ブロックヘッダーフィールド、[`NUMBER`](https://www.evm.codes/#43)や[`DIFFICULTY`](https://www.evm.codes/#44)など | `block.number`, `block.difficulty`など | +| _Ie_ | コントラクト間のコールのコールスタックの深さ(コントラクトの作成を含む) | | +| _Iw_ | EVMの状態の変更を許可されているか、もしくは静的に実行されているか | | + +セクション9の続きを理解するには、次にある他のパラメータのいくつかを理解する必要があります。 + +| パラメータ | 定義されているセクション | 説明 | +| ----- | ------------- | ------------------------------------------------------------------------------------------------ | +| _σ_ | 2(2ページ目, 数式1) | ブロックチェーンの状態 | +| _g_ | 9.3(13ページ目) | ガスの残量 | +| _A_ | 6.1(8ページ目) | 発生したサブ状態(トランザクション終了時にスケジュールされた変更) | +| _o_ | 9.3(13ページ目) | 出力 - 内部トランザクションの場合に返される結果(あるコントラクトが別のコントラクトを呼び出すとき)およびビュー関数の呼び出し(情報を求めるだけなので、トランザクションを待つ必要がない場合) | + +## 9.4 実行の概要 {#94-execution-overview} + +それでは準備が整ったので、ようやくEVMがどのように機能するかについての説明を開始します。 + +式137~142は、EVMを実行するための次の初期条件を示しています。 + +| Symbol | 初期値 | 説明 | +| ---------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| _μg_ | _g_ | ガスの残量 | +| _μpc_ | _0_ | プログラムカウンタ、実行する次の命令が格納されたアドレス | +| _μm_ | _(0, 0, ...)_ | メモリ、ゼロで初期化 | +| _μi_ | _0_ | 使用される最上位のメモリ位置 | +| _μs_ | _()_ | スタック、初期値は空 | +| _μo_ | _∅_ | 戻りデータ([`RETURN`](https://www.evm.codes/#f3)または[`REVERT`](https://www.evm.codes/#fd))もしくは戻りデータ無し([`STOP`](https://www.evm.codes/#00)または[`SELFDESTRUCT`](https://www.evm.codes/#ff))で止めない限り、戻りデータは空の出力 | + +式143では、実行中の各時点で4つ状態が発生する可能性があること、そしてそれらをどのように処理するかを示しています。 + +1. `Z(σ,μ,A,I)` Zは関数を表しており、操作によって無効な状態遷移が発生するかどうかをテストします([例外による停止](#942-Exceptional-halting)を参照)。 Trueと評価された場合、変更が行われていないため、新しい状態は古い状態と同じです (ガスがバーンされることは除く) 。 +2. 実行されているオペコードが[`REVERT`](https://www.evm.codes/#fd)の場合は、ガスが失われ、新しい状態と古い状態は同一になります。 +3. 一連の演算が終了すると、[`RETURN`](https://www.evm.codes/#f3)で示されるように、状態は新しい状態に更新されます。 +4. 終了条件1~3のいずれでもない場合は、実行を続けます。 + +## 9.4.1 マシンの状態 {#941-machine-state} + +このセクションでは、マシンの状態について詳しく説明します。 ここでは、_w_が現在のオペコードであることを規定しています。 _μpc_がコードの長さを示す_||Ib|| 未満の場合_、そのバイト(_Ibpc]_)は、オペコードです。 それ以外の場合、オペコードは[`STOP`](https://www.evm.codes/#00)と定義されています。 + +[スタックマシン](https://en.wikipedia.org/wiki/Stack_machine)であるため、ポップアウトされたアイテムの数(_δ_)と各オペコードによってプッシュインされたアイテムの数(_α_)を追跡する必要があります。 + +## 9.4.2 例外による停止 {#942-exceptional-halt} + +このセクションでは、異常終了がいつ発生するかを規定する_Z_関数を定義しています。 これは [Boolean](https://en.wikipedia.org/wiki/Boolean_data_type)関数であり、[論理和では_∨_](https://en.wikipedia.org/wiki/Logical_disjunction)を使用します。また、[論理積では_∧_](https://en.wikipedia.org/wiki/Logical_conjunction)を使用します。 + +次のいずれかの条件が真になる場合、例外による停止をします。 + +- **_μg < C(σ,μ,A,I)_** セクション9.2に書かれているように、_C_はガスのコストを規定する関数です。 次のオペコードを実施するのに十分なガスが残っていない場合の条件です。 + +- **_δw=∅_** オペコードに対してポップされるアイテムの数が未定義の場合、オペコード自体も未定義となります。 + +- **_|| μs || < δw_** スタックのアンダーフロー。現在のオペコードに対してスタック内に十分なアイテムがありません。 + +- **_w = JUMP ∧ μs[0]∉D(Ib)_** オペコードが[`JUMP`](https://www.evm.codes/#56)で、またアドレスが[`JUMPDEST`](https://www.evm.codes/#5b)でない場合です。 ジャンプは、ジャンプ先が[`JUMPDEST`](https://www.evm.codes/#5b)のとき_のみ_有効です。 + +- **_w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib)_** オペコードが [`JUMPI`](https://www.evm.codes/#57)であり、条件が真(ゼロ以外)であるため、ジャンプが発生しますが、[`JUMPDEST`](https://www.evm.codes/#5b)がアドレスではありません。 ジャンプは、ジャンプ先が[`JUMPDEST`](https://www.evm.codes/#5b)のとき_のみ_有効です。 + +- **_w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo ||_** オペコードは、[`RETURNDATACOPY`](https://www.evm.codes/#3e)です。 このオペコードでは、スタックの要素_μs[1]_は、戻り値データのバッファ内からの読み取り位置です。そしてスタックの要素 _μs[2]_はデータの長さです。 この条件は、戻りデータのバッファの末尾を超えて読み取ろうとしたときに発生します。 コールデータやコード自体には類似した条件がないことに注意してください。 これらのバッファの末尾を超えて読み取ろうとすると、ゼロが返されるだけです。 + +- **_|| μs || - δw + αw > 1024_** + + スタックオーバーフロー オペコードの実行で1024を超えるアイテムのスタックが生成された場合は、中断されます。 + +- **_¬Iw ∧ W(w,μ)_** 静的に実行しようとしていますか? ([¬は否定を表します](https://en.wikipedia.org/wiki/Negation) 。また、ブロックチェーンの状態を変更できる場合_Iw_が真になります) そのような場合、状態の変更操作を試行しようとしてもできません。 + + 関数_W(w,μ)_は、この後に式150にて定義されています。 次の条件が真の場合、_W(w,μ)_が真になります。 + + - **_w ∈ {CREATE, CREATE2, SSTORE, SELFDESTRUCT}_** これらのオペコードは、新しいコントラクトの作成、値の保存、現在のコントラクトの破棄によって状態を変更します。 + + - **_LOG0≤w ∧ w≤LOG4_** 静的に呼び出した場合、ログエントリは出力されません。 [`LOG0` (A0)](https://www.evm.codes/#a0)から[`LOG4` (A4)](https://www.evm.codes/#a4)の間における範囲内に全てのログオペコードがあります。 ログオペコードの後にある数字は、ログエントリに含まれるトピックの数を規定しています。 + - **_w=CALL ∧ μs[2]≠0_** 静的な場合、他のコントラクトは呼び出せますが、ETHの送金はできません。 + +- **_w = SSTORE ∧ μg ≤ Gcallstipend_** Gcallstipend(付録Gで2300で定義)以上のガスがなければ、[`SSTORE`](https://www.evm.codes/#55)を実行することはできません。 + +## 9.4.3 ジャンプ先の有効性 {#943-jump-dest-valid} + +ここでは、[`JUMPDEST`](https://www.evm.codes/#5b)オペコードについて形式的に定義します。 バイト値0x5Bを単純に見つけることはできません。なぜなら、バイト値0x5Bは、PUSH内にある可能性があるためです(つまり、オペコードではなくデータ)。 + +式(153)では、関数_N(i,w)_を定義します。 最初のパラメータ _i_ は、オペコードのロケーションです。 2番目のパラメータ_w_は、そのオペコードです。 _w∈[PUSH1, PUSH32]_の場合、オペコードがPUSHであることを意味します(角括弧は端点を含む範囲を定義しています)。 この場合では、次のオペコードが_i+2+(w−PUSH1)_になります。 [`PUSH1`](https://www.evm.codes/#60)では、2バイト(PUSH自体と1バイトの値)進む必要があります。[`PUSH2`](https://www.evm.codes/#61)では、2バイトの値であるため、3バイト進める必要があります。 他のすべてのEVMオペコードの長さは1バイトであるため、その他のすべてのケースにおいては_N(i,w)=i+1_となります。 + +この関数は、式(152)で_DJ(c,i)_と定義され、コード_c_内のすべての有効なジャンプ先の[集合](https://en.wikipedia.org/wiki/Set_(mathematics))で、オペコードのロケーション_i_から始まります。 この関数は、再帰的に定義されています。 _i≥||c||_では、コードが終了していることを意味します。 そのため、これ以上のジャンプ先は存在しないので、空集合を返すだけです。 + +それ以外の場合は、次のオペコードに移動し、そこから始まる集合を取得することで、コードの残りの部分を調べます。 現在のオペコードが_c[i]_であるため、次のオペコードのロケーションは、_N(i,c[i])_になります。 したがって、_DJ(c,N(i,c[i]))_は、次のオペコードから始まる有効なジャンプ先の集合です。 現在のオペコードが`JUMPDEST`でなければ、その集合を返すだけです。 `JUMPDEST`であれば、結果の集合にそれを含めて返します。 + +## 9.4.4 通常停止 {#944-normal-halt} + +停止関数である_H_は、3つの型の値を返すことができます。 + +- 停止オペコードでない場合は、空のセットである_∅_を返します。 慣例により、この値はブール型の偽(false)として解釈されます。 +- 出力を生成しない停止オペコードの場合、([`STOP`](https://www.evm.codes/#00)または[`SELFDESTRUCT`](https://www.evm.codes/#ff))、サイズがゼロバイトのシーケンスを戻り値として返します。 これは空のセットとは、大きく異なることに注意してください。 この値は、EVMが実際に停止し、読み取る戻りデータがないことを意味します。 +- 出力を生成する停止オペコードがある場合([`RETURN`](https://www.evm.codes/#f3)または [`REVERT`](https://www.evm.codes/#fd))、そのオペコードで指定されたバイトのシーケンスを返します。 このシーケンスはメモリから取り出され、スタックの先頭の値(_μs[0]_)が最初のバイトであり、その後の値(_μs[1]_)は長さです。 + +## H.2 命令セット {#h2-instruction-set} + +EVMに関する最後のサブセクション9.5に進む前に、命令自体について考察してみましょう。 付録H.2で定義されており、ページ29から開始しています。 特定のオペコードでは、規定されていないものはすべて同じままであることが求められます。 変化する変数は、\'と規定されています。 + +例として、[`ADD`](https://www.evm.codes/#01)オペコードを見ていきます。 + +| 値 | Mnemonic | δ | α | 説明 | +| ----:| -------- | - | - | --------------------------------------------------------- | +| 0x01 | ADD | 2 | 1 | 加算演算 | +| | | | | _μ′s[0] ≡ μs[0] + μs[1]_ | + +_δ_は、スタックからポップする値の個数です。 この場合は、先頭にある2つの値を加算するので、2になります。 + +_α_は、プッシュバックする値の個数です。 この場合は、合計で1になります。 + +なぜなら、新しいスタックの先頭(_μ′s[0]_)は、古いスタックの先頭(_μs[0]_)とその次の古い値(_μs[1]_)の合計となるためです。 + +この記事では、すべてのオペコードを網羅するのではなく、新規性のあるオペコードのみを説明します。 + +| 値 | Mnemonic | δ | α | 説明 | +| ----:| --------- | - | - | ---------------------------------------------------------------------------------------------------------- | +| 0x20 | KECCAK256 | 2 | 1 | Keccak-256ハッシュの計算 | +| | | | | _μ′s[0] ≡ KEC(μms[0] . 。 。 (μs[0] + μs[1] − 1)])_ | +| | | | | _μ′i ≡ M(μis[0],μs[1])_ | + +これはメモリにアクセスする最初のオペコードです(この場合は、読み取り専用)。 ただし、現在のメモリの制限を超えて拡張される可能性があるため、_μi_を更新する必要があります。ページ29の式328に定義されている_M_関数を使ってこの更新を行っています。 + +| 値 | Mnemonic | δ | α | 説明 | +| ----:| -------- | - | - | ---------------- | +| 0x31 | BALANCE | 1 | 1 | 指定されたアカウントの残高を取得 | +| | | | | ... | + +残高を知る必要のあるアドレスは、_μs[0] mod 2160_ です。 スタックの最上位がアドレスなのは、アドレスは160ビットしかないためです。値を[modulo](https://en.wikipedia.org/wiki/Modulo_operation) 2160で計算します。 + +_σ[μs[0] mod 2160] ≠ ∅_の場合、このアドレスに関する情報が存在します。 その場合、_σ[μs[0] mod 2160]b_は、そのアドレスの残高です。 _σ[μs[0] mod 2160] = ∅_ の場合、このアドレスは初期化されておらず、残高はゼロです。 アカウント情報フィールドのリストは、4ページ目のセクション4.1に記載されています。 + +2つ目の数式、_A'a ≡ Aa ∪ {μs[0] mod 2160}_は、ウォームストレージ(最近アクセスされ、キャッシュされる可能性が高いストレージ)とコールドストレージ(アクセスされておらず、取得コストが高く低速な可能性が高いストレージ)とのアクセスのコストの差に関連しています。 _Aa_は、トランザクションによって以前アクセスされたアドレスのリストです。このリストは、8ページ目のセクション6.1に定義されているように、アクセスするコストが安くなっています。 この件についての詳細は、[EIP-2929](https://eips.ethereum.org/EIPS/eip-2929)をご覧ください。 + +| 値 | Mnemonic | δ | α | 説明 | +| ----:| -------- | -- | -- | --------------------------------------- | +| 0x8F | DUP16 | 16 | 17 | 16番目のスタックアイテムを複製 | +| | | | | _μ′s[0] ≡ μs[15]_ | + +スタックアイテムを使用するには、ポップする必要があることに注意してください。つまり、そのアイテム上にあるすべてのスタックアイテムもポップする必要があります。 [`DUP`](https://www.evm.codes/#8f)および[`SWAP`](https://www.evm.codes/#9f)の場合は、最大で16個の値をポップして、その後にプッシュしなければならなりません。 + +## 9.5 実行サイクル {#95-exec-cycle} + +すべてのパーツが揃ったので、ようやくEVMの実行サイクルがどのように文書化されているのかを理解できます。 + +数式(155)は、次の状態を示しています。 + +- _σ_(グローバルブロックチェーンの状態) +- _μ_(EVMの状態) +- _A_(サブ状態、トランザクション終了時に発生する変更) +- _I_(実行環境) + +新たな状態は、_(σ', μ', A', I')_となります。 + +数式(156)~(158)は、スタックとオペコード(_μs_)によるスタックの変化を定義しています。 数式(159)は、ガスの変化(_μg_)です。 数式(160)は、プログラムカウンタ(_μpc_)の変化です。 最後に、数式(161)~(164)は、オペコードによって明示的に変更されない限り、他のパラメータが同じままであることを明記しています。 + +以上より、EVMが完全に定義されました。 + +## まとめ {#conclusion} + +数学的表記法は正確であるため、イエローペーパーでは、イーサリアムのあらゆる詳細が記述されています。 ただし、次のような欠点があります。 + +- 人間のみが理解できるため、[コンプライアンステスト](https://github.com/ethereum/tests)は、手作業によって記述する必要があります。 +- プログラマーはコンピュータのコードは理解できますが、 数学的な表記法については、理解できない人もいます。 + +このような理由から、新たな[コンセンサスレイヤーの仕様](https://github.com/ethereum/consensus-specs/blob/dev/tests/core/pyspec/README.md)は、 Pythonで記述されています。 [こちらに](https://ethereum.github.io/execution-specs)Pythonで書かれた実行レイヤーの仕様がありますが、完全ではありません。 イエローペーパー全体がPythonもしくは同様の言語に翻訳されるまで、イエローペーパーは使われ続けます。そのため、イエローペーパーを読めるようにしておくと便利です。 diff --git a/public/content/translations/ja/eips/index.md b/public/content/translations/ja/eips/index.md index 3c45b49f031..cc02dcc1b14 100644 --- a/public/content/translations/ja/eips/index.md +++ b/public/content/translations/ja/eips/index.md @@ -6,27 +6,27 @@ lang: ja # イーサリアム改善提案(EIP)入門 {#introduction-to-ethereum-improvement-proposals} -## EIP とは {#what-are-eips} +## EIPとは {#what-are-eips} -[イーサリアム改善提案(EIP)](https://eips.ethereum.org/)は、イーサリアムの新しい機能やプロセスに関する提案を規定する標準規格です。 EIP には、技術仕様の変更案が含まれており、コミュニティの 「信頼できる情報源」として機能します。 イーサリアムのネットワークアップグレードとアプリケーションの標準規格は、EIP プロセスでの議論を通じて開発されます。 +[イーサリアム改善提案(EIP)](https://eips.ethereum.org/)は、イーサリアムの新しい機能やプロセスに関する提案を規定する標準規格です。 EIPには、技術仕様の変更案が含まれており、コミュニティの 「信頼できる情報源」として機能します。 イーサリアムのネットワークアップグレードとアプリケーションの標準規格は、EIPプロセスでの議論を通じて開発されます。 -イーサリアムコミュニティ内の誰でも EIP を作成することができます。 EIP を書くためのガイドラインは [EIP-1](https://eips.ethereum.org/EIPS/eip-1)に記載されています。 EIP には、主に簡潔な技術仕様と提案の背景を提出する必要があります。 EIP の作成者は、コミュニティ内でコンセンサスを得て、提案に対する別の意見を文書化します。 適格な EIP を提出する上での技術的な障壁が高いため、これまでは通常アプリケーションまたはプロトコルのデベロッパーが EIP を提案しています。 +イーサリアムコミュニティ内の誰でもEIPを作成することができます。 EIPを書くためのガイドラインは [EIP-1](https://eips.ethereum.org/EIPS/eip-1)に記載されています。 EIPには、主に簡潔な技術仕様と提案の背景を提出する必要があります。 EIPの作成者は、コミュニティ内でコンセンサスを得て、提案に対する別の意見を文書化します。 適格なEIPを提出する上での技術的な障壁が高いため、これまでは通常アプリケーションまたはプロトコルのデベロッパーがEIPを提案しています。 -## EIP の重要性 {#why-do-eips-matter} +## EIPの重要性 {#why-do-eips-matter} -EIP は、イーサリアムで変更がどのように行われ、文書化されるかにおいて、中心的な役割を果たします。 EIP は変更を提案・議論し、採用する方法です。 [EIP には複数の種類](https://eips.ethereum.org/EIPS/eip-1#eip-types)があります。[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)のようにコンセンサスに影響を与えてネットワークのアップグレードを要求する下位レベルのプロトコル変更を目的としたコア EIP、 [EIP-20](https://eips.ethereum.org/EIPS/eip-20)や[EIP-721](https://eips.ethereum.org/EIPS/eip-721)などのアプリケーション標準を目的とした ERC などがあります。 +EIPは、イーサリアムで変更がどのように行われ、文書化されるかにおいて、中心的な役割を果たします。 EIPは変更を提案・議論し、採用する方法です。 [EIPには複数の種類](https://eips.ethereum.org/EIPS/eip-1#eip-types)があります。[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)のようにコンセンサスに影響を与えてネットワークのアップグレードを要求する下位レベルのプロトコル変更を目的としたコアEIP、 [EIP-20](https://eips.ethereum.org/EIPS/eip-20)や[EIP-721](https://eips.ethereum.org/EIPS/eip-721)などのアプリケーション標準を目的としたERCなどがあります。 -すべてのネットワークアップグレードは、複数の EIP で構成され、これらはネットワーク上の各[イーサリアムクライアント](/learn/#clients-and-nodes)に実装される必要があります。 これは、イーサリアムメインネット上の他のクライアントとコンセンサス状態を維持するには、クライアントデベロッパーは必ず必要な EIP をすべて実装しなければならないということを意味します。 +すべてのネットワークアップグレードは、複数のEIPで構成され、これらはネットワーク上の各[イーサリアムクライアント](/learn/#clients-and-nodes)に実装される必要があります。 これは、イーサリアムメインネット上の他のクライアントとコンセンサス状態を維持するには、クライアントデベロッパーは必ず必要なEIPをすべて実装しなければならないということを意味します。 -変更の技術仕様の提供に加えて、EIP ではイーサリアムでガバナンスが行われます。誰でも自由に提案でき、コミュニティの様々な利害関係者が議論し、提案を標準規格として採用するべきか、ネットワークアップグレードに含めるべきかを判断します。 コア以外の EIP はすべてのアプリケーションで導入される必要はない一方で(例えば EIP-20 を実装していない代替トークンを作成可能など)、コア EIP は広く導入されなければならず(同一ネットワークを構成するには、全ノードをアップグレードする必要があるため) 、コア EIP は非コア EIP よりもコミュニティでの広範なコンセンサスを必要とします。 +変更の技術仕様の提供に加えて、EIPではイーサリアムでガバナンスが行われます。誰でも自由に提案でき、コミュニティの様々な利害関係者が議論し、提案を標準規格として採用するべきか、ネットワークアップグレードに含めるべきかを判断します。 コア以外のEIPはすべてのアプリケーションで導入される必要はない一方で(例えばEIP-20を実装していない代替トークンを作成可能など)、コアEIPは広く導入されなければならず(同一ネットワークを構成するには、全ノードをアップグレードする必要があるため) 、コアEIPは非コアEIPよりもコミュニティでの広範なコンセンサスを必要とします。 -## EIP の歴史 {#history-of-eips} +## EIPの歴史 {#history-of-eips} -[イーサリアム改善提案改善提案(EIP) Github リポジトリ](https://github.com/ethereum/EIPs)は 2015 年 10 月に作成されました。 EIP プロセスは、[Bitcoin 改善提案(BIP)](https://github.com/bitcoin/bips)に基づいており、この BIP 自体[Python 改善提案 (PEP)](https://www.python.org/dev/peps/)に準じています。 +[イーサリアム改善提案改善提案(EIP) Githubリポジトリ](https://github.com/ethereum/EIPs)は2015年10月に作成されました。 EIPプロセスは、[Bitcoin改善提案(BIP)](https://github.com/bitcoin/bips)に基づいており、このBIP自体[Python改善提案 (PEP)](https://www.python.org/dev/peps/)に準じています。 -EIP 編集者は、技術的な健全性、フォーマットの問題、正しいスペル、文法、およびコードスタイルについての EIP のレビューを担当します。 Martin Becze、Vitalik Buterin、Gavin Wood など数名が、2015 年から 2016 年まで初代の EIP 編集者でした。 +EIP編集者は、技術的な健全性、フォーマットの問題、正しいスペル、文法、およびコードスタイルについてのEIPのレビューを担当します。 Martin Becze、Vitalik Buterin、Gavin Woodなど数名が、2015年から2016年まで初代のEIP編集者でした。 -現在の EIP 編集者は次のとおりです +現在のEIP編集者は次のとおりです - Alex Beregszaszi (@axic) - Gavin John (@Pandapip1) @@ -34,7 +34,7 @@ EIP 編集者は、技術的な健全性、フォーマットの問題、正し - Matt Garnett (@lightclient) - Sam Wilson (@SamWilsn) -EIP 名誉編集者は次のとおりです +EIP名誉編集者は次のとおりです - Casey Detrio (@cdetrio) - Hudson Jameson (@Souptacular) @@ -44,23 +44,23 @@ EIP 名誉編集者は次のとおりです - Nick Savers (@nicksavers) - Vitalik Buterin (@vbuterin) -EIP 編集者になりたい方は、[EIP-5069](https://eips.ethereum.org/EIPS/eip-5069)をご確認ください。 +EIP編集者になりたい方は、[EIP-5069](https://eips.ethereum.org/EIPS/eip-5069)をご確認ください。 -EIP 編集者は、提案が EIP になる準備ができているかを決定し、EIP 作成者が提案を進めるのを支援します。 [イーサリアムキャットハーダーズ(Ethereum Cat Herders)](https://www.ethereumcatherders.com/)は、EIP 編集者とコミュニティ間のミーティング開催をサポートします([EIPIP](https://github.com/ethereum-cat-herders/EIPIP)を参照)。 +EIP編集者は、提案がEIPになる準備ができているかを決定し、EIP作成者が提案を進めるのを支援します。 [イーサリアムキャットハーダーズ(Ethereum Cat Herders)](https://www.ethereumcatherders.com/)は、EIP編集者とコミュニティ間のミーティング開催をサポートします([EIPIP](https://github.com/ethereum-cat-herders/EIPIP)を参照)。 図表を含む完全な標準化プロセスは、[EIP-1](https://eips.ethereum.org/EIPS/eip-1)に記載されています。 ## 詳細 {#learn-more} -EIP の詳細についてご興味がある場合は、 [EIP ウェブサイト](https://eips.ethereum.org/)や[EIP-1](https://eips.ethereum.org/EIPS/eip-1)をご覧ください。 下記は役立つ情報のリンクです。 +EIPの詳細についてご興味がある場合は、 [EIPウェブサイト](https://eips.ethereum.org/)や[EIP-1](https://eips.ethereum.org/EIPS/eip-1)をご覧ください。 下記は役立つ情報のリンクです。 -- [全 EIP リスト](https://eips.ethereum.org/all) -- [全 EIP タイプの説明](https://eips.ethereum.org/EIPS/eip-1#eip-types) -- [全 EIP ステータスの説明](https://eips.ethereum.org/EIPS/eip-1#eip-process) +- [全EIPリスト](https://eips.ethereum.org/all) +- [全EIPタイプの説明](https://eips.ethereum.org/EIPS/eip-1#eip-types) +- [全EIPステータスの説明](https://eips.ethereum.org/EIPS/eip-1#eip-process) -## EIP への参加 {#participate} +## EIPへの参加 {#participate} -誰でも EIP を作成できます。 提案を提出する前に、EIP のプロセスと書き方を概説した[EIP-1](https://eips.ethereum.org/EIPS/eip-1)をお読みください。また、草案を提出する前に、まずコミュニティと議論する場所である[イーサリアム・マジシャンズ](https://ethereum-magicians.org/) でフィードバックを募ってください。 +誰でもEIPを作成できます。 提案を提出する前に、EIPのプロセスと書き方を概説した[EIP-1](https://eips.ethereum.org/EIPS/eip-1)をお読みください。また、草案を提出する前に、まずコミュニティと議論する場所である[イーサリアム・マジシャンズ](https://ethereum-magicians.org/) でフィードバックを募ってください。 ## 参考文献 {#references} diff --git a/public/content/translations/ja/history/index.md b/public/content/translations/ja/history/index.md index abf091416c4..8257538909c 100644 --- a/public/content/translations/ja/history/index.md +++ b/public/content/translations/ja/history/index.md @@ -13,7 +13,7 @@ sidebarDepth: 1 フォークとは、ネットワークに必要となる大規模な技術アップグレードや変更のことで、通常は[イーサリアム改善提案 (EIPs)](/eips/)に基づいて、プロトコルの「規約」を変更するものです。 -従来の中央集権型のソフトウェアにおいてアップグレードが必要になった場合、企業はエンドユーザのために新バージョンを公開します。 中央集権型の所有権がないブロックチェーンでは、仕組みが異なります。 [イーサリアムクライアント](/developers/docs/nodes-and-clients/)が新しいフォークルールを実装するには、ソフトウェアのアップデートが必要となります。 さらに、ブロック作成者(プルーフ・オブ・ワークの世界ではマイナー、プルーフ・オブ・ステークの世界ではバリデータ)とノードは、ブロックを作成し、新しいルールに照らし合わせて検証しなければなりません。 [合意メカニズムの詳細](/developers/docs/consenus-mechanisms/) +従来の中央集権型のソフトウェアにおいてアップグレードが必要になった場合、企業はエンドユーザのために新バージョンを公開します。 中央集権型の所有権がないブロックチェーンでは、仕組みが異なります。 [イーサリアムクライアント](/developers/docs/nodes-and-clients/)が新しいフォークルールを実装するには、ソフトウェアのアップデートが必要となります。 さらに、ブロック作成者(プルーフ・オブ・ワークの世界ではマイナー、プルーフ・オブ・ステークの世界ではバリデータ)とノードは、ブロックを作成し、新しいルールに照らし合わせて検証しなければなりません。 [合意メカニズムの詳細](/developers/docs/consensus-mechanisms/) これらのルール変更により、ネットワークに一時的な分断が生じる可能性があります。 新規ブロックは、新しいルールもしくは古いルールに基づいて生成できます。 フォークは事前に合意されることが一般的で、クライアントが一斉に変更を採用し、アップグレードされたフォークがメインチェーンとなります。 しかし、まれにフォークをめぐる意見の相違により、ネットワークが永久に分断してしまうことがあります。最も有名な例は、[DAO フォーク](#dao-fork)によるイーサリアムクラシックの誕生です。
    diff --git a/public/content/translations/ja/roadmap/account-abstraction/index.md b/public/content/translations/ja/roadmap/account-abstraction/index.md index eb2fb8d7d30..d472a9a81e9 100644 --- a/public/content/translations/ja/roadmap/account-abstraction/index.md +++ b/public/content/translations/ja/roadmap/account-abstraction/index.md @@ -10,9 +10,9 @@ summaryPoints: # アカウント抽象化 {#account-abstraction} -ユーザーは、**[外部所有アカウント(EOA)](/glossary/#eoa)**を使用してイーサリアムとやりとりします。 EOA は、トランザクションを開始したり、スマートコントラクトを実行したりするための唯一の方法です。 ユーザーとイーサリアムのやり取りは、EOA により制限されています。 例えば、EOA では、トランザクションのバッチ処理が困難になり、ユーザーはガス代を支払うための ETH 残高を常に保持する必要があります。 +ユーザーは、**[外部所有アカウント(EOA)](/glossary/#eoa)**を使用してイーサリアムとやりとりします。 EOAは、トランザクションを開始したり、スマートコントラクトを実行したりするための唯一の方法です。 ユーザーとイーサリアムのやり取りは、EOAにより制限されています。 例えば、EOAでは、トランザクションのバッチ処理が困難になり、ユーザーはガス代を支払うためのETH残高を常に保持する必要があります。 -アカウント抽象化は、ユーザーがアカウントに対してセキュリティを強化したり、ユーザーエクスペリエンスを柔軟にプログラムできるようにすることで、これらの問題を解決する方法です。 [EOA をアップグレード](https://eips.ethereum.org/EIPS/eip-3074)してスマートコントラクトから制御できるようにするか、[スマートコントラクトをアップグレード](https://eips.ethereum.org/EIPS/eip-2938)してトランザクションを開始できるようにすることで実現します。 上記のオプションのいずれにおいても、イーサリアムプロトコルを変更する必要があります。 さらに、既存のプロトコルと並行して実行する[第二の独立したトランザクションシステム](https://eips.ethereum.org/EIPS/eip-4337)追加する方法もあります。 どの方法であっても、結果としてスマートコントラクトウォレットを介してイーサリアムにアクセスします。これは、既存のプロトコルの一部を利用しても、アドオンのトランザクションネットワークを介しても、ネイティブにサポートされます。 +アカウント抽象化は、ユーザーがアカウントに対してセキュリティを強化したり、ユーザーエクスペリエンスを柔軟にプログラムできるようにすることで、これらの問題を解決する方法です。 [EOAをアップグレード](https://eips.ethereum.org/EIPS/eip-3074)してスマートコントラクトから制御できるようにするか、[スマートコントラクトをアップグレード](https://eips.ethereum.org/EIPS/eip-2938)してトランザクションを開始できるようにすることで実現します。 上記のオプションのいずれにおいても、イーサリアムプロトコルを変更する必要があります。 さらに、既存のプロトコルと並行して実行する[第二の独立したトランザクションシステム](https://eips.ethereum.org/EIPS/eip-4337)追加する方法もあります。 どの方法であっても、結果としてスマートコントラクトウォレットを介してイーサリアムにアクセスします。これは、既存のプロトコルの一部を利用しても、アドオンのトランザクションネットワークを介しても、ネイティブにサポートされます。 スマートコントラクトウォレットは、ユーザーにさまざまな利点をもたらします。 @@ -21,22 +21,22 @@ summaryPoints: - 信頼しているデバイスや個人間でアカウントのセキュリティを共有できる - 他のアカウントのガスを支払う、または他のアカウントに自分のガス代を支払ってもらうことができる - トランザクションをまとめて処理できる (例: 一括でスワップを承認して実行する) -- dApp とウォレットのデベロッパーがユーザーエクスペリエンスでイノベーションを起こす機会が増える +- dAppとウォレットのデベロッパーがユーザーエクスペリエンスでイノベーションを起こす機会が増える -現在、外部所有アカウント ([EOA](/glossary/#eoa)) のみがトランザクションを開始できるため、これらの利点はネイティブにサポートされていません。 EOA は、シンプルに公開鍵と秘密鍵のペアで構成されており、 仕組みは以下のとおりです。 +現在、外部所有アカウント ([EOA](/glossary/#eoa)) のみがトランザクションを開始できるため、これらの利点はネイティブにサポートされていません。 EOAは、シンプルに公開鍵と秘密鍵のペアで構成されており、 仕組みは以下のとおりです。 -- 秘密鍵を持っていれば、イーサリアム仮想マシン(EVM)のルールの範囲内で*何でも*できます。 -- 秘密鍵を持っていなければ、*何も*できません。 +- 秘密鍵を持っていれば、イーサリアム仮想マシン(EVM)のルールの範囲内で_何でも_できます。 +- 秘密鍵を持っていなければ、_何も_できません。 鍵を紛失すると、復元できません。また、鍵が盗まれると、アカウント内のすべての資金に即座にアクセスされてしまいます。 -スマートコントラクトウォレットは、これらの問題の解決策ですが、実装するロジックはイーサリアムで処理する前に一連の EOA トランザクションに変換する必要があるため、現在ではプログラムすることが難しくなっています。 アカウント抽象化により、スマートコントラクト自体がトランザクションを開始できるようになり、ユーザーが実装したいロジックをスマートコントラクトウォレット自体にコード化し、イーサリアム上で実行できるようになります。 +スマートコントラクトウォレットは、これらの問題の解決策ですが、実装するロジックはイーサリアムで処理する前に一連のEOAトランザクションに変換する必要があるため、現在ではプログラムすることが難しくなっています。 アカウント抽象化により、スマートコントラクト自体がトランザクションを開始できるようになり、ユーザーが実装したいロジックをスマートコントラクトウォレット自体にコード化し、イーサリアム上で実行できるようになります。 最終的に、アカウント抽象化によってスマートコントラクトウォレットのサポートが向上するため、構築が簡素化し、安全に使用できるようになり、 イーサリアムの基盤となる技術を知らずとも、イーサリアムのすべてのメリットを享受できるようになります。 ## シードフレーズを超えて {#beyond-seed-phrases} -現在のアカウントは、シードフレーズから計算された秘密鍵を使用して保護されています。 シードフレーズにアクセスできる人は、アカウントを保護する秘密鍵を簡単に発見し、保護されているすべての資産にアクセスできます。 秘密鍵とシードフレーズを紛失してしまうと、復元することはできず、ウォレットが管理する資産は永久に凍結されます。 シードフレーズの保護は、熟練ユーザーであっても簡単ではありません。また、ユーザーが詐欺に遭う最も一般的な手法の 1 つとしてシードフレーズフィッシングがあります。 +現在のアカウントは、シードフレーズから計算された秘密鍵を使用して保護されています。 シードフレーズにアクセスできる人は、アカウントを保護する秘密鍵を簡単に発見し、保護されているすべての資産にアクセスできます。 秘密鍵とシードフレーズを紛失してしまうと、復元することはできず、ウォレットが管理する資産は永久に凍結されます。 シードフレーズの保護は、熟練ユーザーであっても簡単ではありません。また、ユーザーが詐欺に遭う最も一般的な手法の1つとしてシードフレーズフィッシングがあります。 アカウント抽象化では、スマートコントラクトを使用して資産を保持し、トランザクションを承認することで、この問題を解決します。 これらのスマートコントラクトにカスタムロジックを施すことができ、可能な限り安全に、そしてユーザーごとにカスタマイズすることができます。 最終的には、アカウントへのアクセスを制御するために秘密鍵を使用しますが、より簡単で安全に秘密鍵を管理するための安全策が施してあります。 @@ -44,23 +44,23 @@ summaryPoints: ### スマートコントラクトウォレットに組み込めるセキュリティロジックの例: -- **マルチシグ認証**: 複数の信頼できるユーザーまたはデバイス間で認証資格情報を共有できます。 これにより、事前設定された金額を超えるトランザクションには、信頼できる当事者の特定の割合 (例: 5 人中の 3 人) からの承認が必要となるようにコントラクトを設定できます。 例えば、高額のトランザクションでは、モバイルデバイスとハードウェアウォレットの両方からの承認、または信頼できる家族に配布されたアカウントからの署名を必須にすることができます。 +- **マルチシグ認証**: 複数の信頼できるユーザーまたはデバイス間で認証資格情報を共有できます。 これにより、事前設定された金額を超えるトランザクションには、信頼できる当事者の特定の割合 (例: 5人中の3人) からの承認が必要となるようにコントラクトを設定できます。 例えば、高額のトランザクションでは、モバイルデバイスとハードウェアウォレットの両方からの承認、または信頼できる家族に配布されたアカウントからの署名を必須にすることができます。 - **アカウントの凍結**: デバイスが紛失したり侵害された場合、認証された別のデバイスからアカウントをロックすることができ、ユーザーの資産を保護します。 - **アカウントの復元**: デバイスを紛失したり、パスワードを忘れたりすることがあります。 現在の仕組みでは、あなたの資産が永久に凍結される可能性があります。 そこで、スマートコントラクトウォレットを使用することで、新しいデバイスを承認してアクセスをリセットできる事前承認済みアカウントを設定します。 -- **トランザクションリミットの設定**: 1 日、1 週間、1 か月などの期間でアカウントから転送できる金額の 1 日当たりのしきい値を指定できます。 つまり、攻撃者がアカウントにアクセスできたとしても、一度にすべての金額を流出させることはできなくなり、攻撃者からのアクセスを凍結してリセットすることができます。 -- **ホワイトリストの作成**: 安全であるとわかっている特定のアドレスへのトランザクションのみを許可します。 つまり、秘密鍵が*盗まれたとしても*、攻撃者はホワイトリストに登録されていない宛先アカウントに資金を送金することはできません。 これらのホワイトリストを変更するには複数の署名が必要になるため、攻撃者は、あなたの複数のバックアップキーにアクセスできない限り、リストに自分のアドレスを追加できません。 +- **トランザクションリミットの設定**: 1日、1週間、1か月などの期間でアカウントから転送できる金額の1日当たりのしきい値を指定できます。 つまり、攻撃者がアカウントにアクセスできたとしても、一度にすべての金額を流出させることはできなくなり、攻撃者からのアクセスを凍結してリセットすることができます。 +- **ホワイトリストの作成**: 安全であるとわかっている特定のアドレスへのトランザクションのみを許可します。 つまり、秘密鍵が_盗まれたとしても_、攻撃者はホワイトリストに登録されていない宛先アカウントに資金を送金することはできません。 これらのホワイトリストを変更するには複数の署名が必要になるため、攻撃者は、あなたの複数のバックアップキーにアクセスできない限り、リストに自分のアドレスを追加できません。 ## ユーザーエクスペリエンスの向上 {#better-user-experience} アカウント抽象化によって、スマートコントラクトウォレットがプロトコルレベルでサポートされるようになります。これにより、**ユーザーエクスペリエンスが全体的に改善**され、**セキュリティも向上**します。 アカウント抽象化を行う最も重要な理由は、スマートコントラクト、ウォレット、アプリケーションのデベロッパーが、これまでにない方法でユーザーエクスペリエンスをより自由に革新できるようになるからです。 アカウント抽象化によって明らかに改善する点として、トランザクションのバンドル化による速度と効率の向上が挙げられます 例えば、シンプルなスワップは、ワンクリックで完了できるはずです。しかし、現在は、スワップを実行する前に、個々のトークンの支出を承認するために、複数のトランザクションに署名する必要があります。 アカウント抽象化は、トランザクションをバンドル化することで、こうした摩擦を取り除きます。 さらに、バンドル化されたトランザクションは、各トランザクションに必要なトークンの正確な値を承認し、トランザクションが完了した後に承認を取り消すことができます。そのため、より安全性が高まります。 -ガス代の管理もアカウント抽象化によって大幅に改善されます。 アプリケーションは、ユーザーのガス代を支払うことができるだけでなく、ガス代を ETH 以外のトークンで支払うこともできます。このため、ユーザーは資金のトランザクションで ETH 残高を維持する必要がなくなります。 その仕組みを説明すると、コントラクト内でユーザーのトークンを ETH に交換し、その ETH をガス代の支払いに使用しています。 +ガス代の管理もアカウント抽象化によって大幅に改善されます。 アプリケーションは、ユーザーのガス代を支払うことができるだけでなく、ガス代をETH以外のトークンで支払うこともできます。このため、ユーザーは資金のトランザクションでETH残高を維持する必要がなくなります。 その仕組みを説明すると、コントラクト内でユーザーのトークンをETHに交換し、そのETHをガス代の支払いに使用しています。 -イーサリアムユーザーにとって、ガス代の管理は最も不便な点の 1 つです。イーサリアムでは、トランザクションの支払いに ETH しか使用できないためです。 例えば、ウォレットに USDC 残高はあるものの、ETH がないとします。 ガス代を払うことができないため、残高の USDC トークンを移動、交換することもできず、 その結果、USDC を ETH に交換することもできません。それ自体にガス代がかかるからです。 問題を解決するには、取引所または別のアドレスからアカウントに ETH を送信する必要があります。 しかし、スマートコントラクトウォレットがあれば、ガス料金を USDC で簡単に支払うことができ、アカウントが解放されます。 これにより、すべてのアカウントで ETH 残高を維持する必要がなくなります。 +イーサリアムユーザーにとって、ガス代の管理は最も不便な点の1つです。イーサリアムでは、トランザクションの支払いにETHしか使用できないためです。 例えば、ウォレットにUSDC残高はあるものの、ETHがないとします。 ガス代を払うことができないため、残高のUSDCトークンを移動、交換することもできず、 その結果、USDCをETHに交換することもできません。それ自体にガス代がかかるからです。 問題を解決するには、取引所または別のアドレスからアカウントにETHを送信する必要があります。 しかし、スマートコントラクトウォレットがあれば、ガス料金をUSDCで簡単に支払うことができ、アカウントが解放されます。 これにより、すべてのアカウントでETH残高を維持する必要がなくなります。 -また、アカウント抽象化により、dApp デベロッパーはガス代を自由に管理することができます。 例えば、お気に入りの DEX に対して、毎月固定の料金を支払うことで無制限のトランザクションができるかもしれません。 dApps は、プラットフォームの使用に対する報酬として、またはオンボーディングオファーとして、利用者に代わってすべてのガス代の払ってくれるかもしれません。 スマートコントラクトウォレットがプロトコルレベルでサポートされると、デベロッパーはガス代の改革をより簡単に行うことができます +また、アカウント抽象化により、dAppデベロッパーはガス代を自由に管理することができます。 例えば、お気に入りのDEXに対して、毎月固定の料金を支払うことで無制限のトランザクションができるかもしれません。 dAppsは、プラットフォームの使用に対する報酬として、またはオンボーディングオファーとして、利用者に代わってすべてのガス代の払ってくれるかもしれません。 スマートコントラクトウォレットがプロトコルレベルでサポートされると、デベロッパーはガス代の改革をより簡単に行うことができます @@ -68,59 +68,59 @@ summaryPoints: アカウント抽象化によって、購買がどのように変化するのか考えてみるのも面白いでしょう。 現在、各トランザクションは、正確かつ十分な量のトークンを事前に資金提供されたウォレットから承認、実行される必要があります。 アカウント抽象化では、オンライン ショッピングに近いエクスペリエンスが得られます。例えば、ユーザーは「バスケット」にアイテムを追加し、一度クリックするだけですべてを一括購入でき、必要なロジックはすべて、ユーザーではなくコントラクトで処理できます。 -アカウント抽象化は、ユーザーエクスペリエンスを向上させるための強力なツールです。これらの例は、その可能性のほんの一端に過ぎませんが、まだまだ想像もできないようなことを実現できるはずです。 アカウント抽象化によって、デベロッパーは現在の EOA の制約に縛られることなく、Web2 の優れた側面を Web3 に取り入れることで、セルフカストディを維持しながら、創造的に新しいユーザーエクスペリエンスをハックできるようになります。 +アカウント抽象化は、ユーザーエクスペリエンスを向上させるための強力なツールです。これらの例は、その可能性のほんの一端に過ぎませんが、まだまだ想像もできないようなことを実現できるはずです。 アカウント抽象化によって、デベロッパーは現在のEOAの制約に縛られることなく、Web2の優れた側面をWeb3に取り入れることで、セルフカストディを維持しながら、創造的に新しいユーザーエクスペリエンスをハックできるようになります。 ## アカウント抽象化の実装方法 {#how-will-aa-be-implemented} -スマートコントラクトウォレットはすでに存在していますが、EVM 自体がサポートしていないため、実装が難しい状況です。 代わりに、標準的なイーサリアムトランザクション周りを比較的複雑なコードでラップすることに依存しています。 イーサリアムでは、スマートコントラクトがトランザクションを開始できるようにし、オフチェーンではなくイーサリアムスマートコントラクトで必要なロジックを処理することで、スマートコントラクトウォレットに変えることができます。 スマートコントラクトにロジックを組み込むことで、ユーザーが署名したメッセージを通常のイーサリアムトランザクションに変換するためにウォレットデベロッパーが実行する「リレイヤー」が不要となるため、イーサリアムの分散化を高めることができます。 +スマートコントラクトウォレットはすでに存在していますが、EVM自体がサポートしていないため、実装が難しい状況です。 代わりに、標準的なイーサリアムトランザクション周りを比較的複雑なコードでラップすることに依存しています。 イーサリアムでは、スマートコントラクトがトランザクションを開始できるようにし、オフチェーンではなくイーサリアムスマートコントラクトで必要なロジックを処理することで、スマートコントラクトウォレットに変えることができます。 スマートコントラクトにロジックを組み込むことで、ユーザーが署名したメッセージを通常のイーサリアムトランザクションに変換するためにウォレットデベロッパーが実行する「リレイヤー」が不要となるため、イーサリアムの分散化を高めることができます。 -EIP-2771 では、イーサリアムのプロトコルに変更を加えることなく、第三者がユーザーの代わりにガス代を支払うことができるメタトランザクションの概念が導入されました このアイデアは、ユーザーが署名したトランザクションが「Forwarder」コントラクトに送信されるというものです。 Forwarder は、トランザクションをガスリレーに送信する前に、トランザクションが有効であることを検証する信頼できるエンティティです。 これはオフチェーンで行われ、ガス代を支払う必要はありません。 ガスリレーは、トランザクションを「Recipient」コントラクトに渡し、イーサリアムでトランザクションを実行できるようにするために必要なガスを支払います。 トランザクションは、「Forwarder」が「Recipient」によって認識、信頼されている場合に実行されます。 このモデルにより、デベロッパーはユーザー向けのガスレストランザクションを簡単に実装できます。 +EIP-2771では、イーサリアムのプロトコルに変更を加えることなく、第三者がユーザーの代わりにガス代を支払うことができるメタトランザクションの概念が導入されました このアイデアは、ユーザーが署名したトランザクションが「Forwarder」コントラクトに送信されるというものです。 Forwarderは、トランザクションをガスリレーに送信する前に、トランザクションが有効であることを検証する信頼できるエンティティです。 これはオフチェーンで行われ、ガス代を支払う必要はありません。 ガスリレーは、トランザクションを「Recipient」コントラクトに渡し、イーサリアムでトランザクションを実行できるようにするために必要なガスを支払います。 トランザクションは、「Forwarder」が「Recipient」によって認識、信頼されている場合に実行されます。 このモデルにより、デベロッパーはユーザー向けのガスレストランザクションを簡単に実装できます。 -EIP-4337 は、イーサリアムのプロトコルを変更せずに、分散型による方法でネイティブのスマートコントラクトウォレットをサポートする最初のステップです。 スマートコントラクトウォレットをサポートするコンセンサスレイヤーを変更する代わりに、通常のトランザクションのゴシッププロトコルに新しいシステムが個別に追加されます。 この上位レベルのシステムは、 UserOperationと呼ばれる新しいオブジェクトを中心に構築されており、ユーザーからのアクションと関連する署名をパッケージ化します。 これらのUserOperationオブジェクトは、専用のメンプールにブロードキャストされます。メンプールでは、バリデータがオブジェクトを収集して「バンドルトランザクション」にまとめます。 バンドルトランザクションは、複数のUserOperationsのシーケンスを表し、通常のトランザクションと同じようにイーサリアムブロックに含めることができます。バンドルトランザクションは、バリデータによって、通常のトランザクションと同じように、手数料最大化選択モデルを使用して選択されます。 +EIP-4337は、イーサリアムのプロトコルを変更せずに、分散型による方法でネイティブのスマートコントラクトウォレットをサポートする最初のステップです。 スマートコントラクトウォレットをサポートするコンセンサスレイヤーを変更する代わりに、通常のトランザクションのゴシッププロトコルに新しいシステムが個別に追加されます。 この上位レベルのシステムは、 UserOperationと呼ばれる新しいオブジェクトを中心に構築されており、ユーザーからのアクションと関連する署名をパッケージ化します。 これらのUserOperationオブジェクトは、専用のメンプールにブロードキャストされます。メンプールでは、バリデータがオブジェクトを収集して「バンドルトランザクション」にまとめます。 バンドルトランザクションは、複数のUserOperationsのシーケンスを表し、通常のトランザクションと同じようにイーサリアムブロックに含めることができます。バンドルトランザクションは、バリデータによって、通常のトランザクションと同じように、手数料最大化選択モデルを使用して選択されます。 -EIP-4337 では、ウォレットの動作方法も変わります。 各ウォレットで共通の複雑な安全ロジックを、ウォレットごとに再実装するのではなく、グローバルウォレットコントラクトと呼ばれる"エントリポイント"にアウトソースします。 これにより、フィーの支払いや EVM コードの実行などの操作が処理されるため、ウォレットデベロッパーは、優れたユーザーエクスペリエンスを提供することに集中できます。 +EIP-4337では、ウォレットの動作方法も変わります。 各ウォレットで共通の複雑な安全ロジックを、ウォレットごとに再実装するのではなく、グローバルウォレットコントラクトと呼ばれる"エントリポイント"にアウトソースします。 これにより、フィーの支払いやEVMコードの実行などの操作が処理されるため、ウォレットデベロッパーは、優れたユーザーエクスペリエンスを提供することに集中できます。 -注記: EIP4337 エントリポイントコントラクトは、2023 年 3 月 1 日にイーサリアムのメインネットにデプロイされました。 Etherscanでコントラクトを確認できます。 +注記: EIP4337エントリポイントコントラクトは、2023年3月1日にイーサリアムのメインネットにデプロイされました。 Etherscanでコントラクトを確認できます。 -EIP-2938は、新しいトランザクションタイプAA_TX_TYPEを導入することで、イーサリアムプロトコルを更新することを目的としています。AA_TX_TYPEには、noncetargetdataの 3 つのフィールドがあり、nonceはトランザクションカウンタ、targetはエントリポイントのコントラクトアドレス、dataは EVM バイトコードです。 これらのトランザクションを実行するには、NONCEPAYGASという 2 つの新しい命令(オペコード)を EVM に追加する必要があります。 このNONCEオペコードは、トランザクションのシーケンスを追跡します。一方PAYGASは、トランザクションの実行に必要なガスを計算してコントラクトの残高から引き出します。 これらの新機能により、イーサリアムに必要なインフラストラクチャがイーサリアムのプロトコルに組み込まれるため、スマートコントラクトウォレットをネイティブにサポートできます。 +EIP-2938は、新しいトランザクションタイプAA_TX_TYPEを導入することで、イーサリアムプロトコルを更新することを目的としています。AA_TX_TYPEには、noncetargetdataの3つのフィールドがあり、nonceはトランザクションカウンタ、targetはエントリポイントのコントラクトアドレス、dataはEVMバイトコードです。 これらのトランザクションを実行するには、NONCEPAYGASという2つの新しい命令(オペコード)をEVMに追加する必要があります。 このNONCEオペコードは、トランザクションのシーケンスを追跡します。一方PAYGASは、トランザクションの実行に必要なガスを計算してコントラクトの残高から引き出します。 これらの新機能により、イーサリアムに必要なインフラストラクチャがイーサリアムのプロトコルに組み込まれるため、スマートコントラクトウォレットをネイティブにサポートできます。 -現在、EIP-2938 はアクティブではありません。 プロトコルの変更が必要ない EIP-4337 が、コミュニティの支持を得ています。 +現在、EIP-2938はアクティブではありません。 プロトコルの変更が必要ないEIP-4337が、コミュニティの支持を得ています。 -EIP-3074では、イーサリアムの外部所有アカウントを更新し、スマートコントラクトにコントロールを委任できるようにすることを目的としています。 つまり、スマートコントラクトのロジックが EOA から発生するトランザクションを承認できるということです。 また、ガススポンサーやバッチトランザクションなどの機能が使えるようになります。 この機能を使用するには、AUTHAUTHCALLという新しい 2 つのオペコードを追加する必要があります。 EIP-3074 では、スマートコントラクトウォレットの利点を、コントラクトなしでも利用できるようになります。代わりに、「インボーカー」と呼ばれるアップグレード不可能、ステートレス、トラストレスである特定のタイプのコントラクトがトランザクションを処理します。 +EIP-3074では、イーサリアムの外部所有アカウントを更新し、スマートコントラクトにコントロールを委任できるようにすることを目的としています。 つまり、スマートコントラクトのロジックがEOAから発生するトランザクションを承認できるということです。 また、ガススポンサーやバッチトランザクションなどの機能が使えるようになります。 この機能を使用するには、AUTHAUTHCALLという新しい2つのオペコードを追加する必要があります。 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「アカウント抽象化が dApp のゲームチェンジャーになる理由」](https://www.youtube.com/watch?v=OwppworJGzs) -- [Devcon Bogota「アカウント抽象化 ELI5」](https://www.youtube.com/watch?v=QuYZWJj65AY) +- [Devcon Bogotaでのアカウント抽象化のパネルディスカッション](https://www.youtube.com/watch?app=desktop&v=WsZBymiyT-8) +- [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.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) -- [EIP-4337 のドキュメント](https://eips.ethereum.org/EIPS/eip-4337) -- [EIP-2771 のドキュメント](https://eips.ethereum.org/EIPS/eip-2771) -- [「アカウント抽象化の基礎」 -- アカウント抽象化とは パート 1](https://www.alchemy.com/blog/account-abstraction) +- [ヴィタリックのソーシャルリカバリウォレットに関するブログ投稿](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) +- [「アカウント抽象化の基礎」 -- アカウント抽象化とは パート1](https://www.alchemy.com/blog/account-abstraction) diff --git a/public/content/translations/ja/roadmap/beacon-chain/index.md b/public/content/translations/ja/roadmap/beacon-chain/index.md index 8bb8abd5e29..6689d9afa70 100644 --- a/public/content/translations/ja/roadmap/beacon-chain/index.md +++ b/public/content/translations/ja/roadmap/beacon-chain/index.md @@ -4,31 +4,30 @@ description: ビーコンチェーン - プルーフ・オブ・ステークの lang: ja template: upgrade image: /upgrades/core.png -alt: summaryPoint1: イーサリアムエコシステムにプルーフ・オブ・ステークの導入を可能にしたのが、ビーコンチェーンです。 summaryPoint2: 2022年9月にプルーフ・オブ・ワーク・チェーンのイーサリアムとマージ(統合)されました。 summaryPoint3: ビーコンチェーンは、コンセンサスロジックとブロックゴシッププロトコルを導入し、現在はイーサリアムの安全性を保護しています。 --- - + ビーコンチェーンは、2020年12月にリリースされ、2022年9月15日のマージアップグレードでイーサリアムの合意メカニズムに、プルーフ・オブ・ステークとして正式に導入されました。 ## ビーコンチェーンとは {#what-is-the-beacon-chain} -ビーコンチェーンは、2020 年に開始されたオリジナルのプルーフ・オブ・ステーク型ブロックチェーンの名称です。 当初は、イーサリアムメインネットに適用する前に、プルーフ・オブ・ステークのコンセンサスロジックが健全で持続可能であることを確認するために作成されました。 そのため、元来のプルーフ・オブ・ワークのイーサリアムと並行して稼働していました。 ビーコンチェーンは「空の」ブロックのチェーンだったので、イーサリアムでプルーフ・オブ・ワークを停止し、プルーフ・オブ・ステークへと切り替えるには、ビーコンチェーンで実行クライアントのトランザクションデータを受け入れ、ブロックにバンドルし、プルーフ・オブ・ステークに基づく合意メカニズムを使ってブロックチェーンに構成する必要がありました。 同時に、オリジナルのイーサリアムのクライアントは、マイニング、ブロック伝播、コンセンサスロジックを停止し、ビーコンチェーンへと継承させました。 これが[マージ](/roadmap/merge/)として知られるイベントです。 マージによって、2 つのブロックチェーンは プルーフ・オブ・ステークに統合され、現在は、ノードごとに 2 つの異なるクライアントが必要になりました。 ビーコンチェーンは現在、コンセンサスレイヤーであり、ブロックのゴシップとコンセンサスロジックを処理するコンセンサスクライアントのピアツーピアネットワークです。一方、元々のクライアントは実行レイヤーを形成し、トランザクションのゴシップと実行、そしてイーサリアムの状態を管理しています。 2 つのレイヤーは、エンジン API を使ってお互いに通信することができます。 +ビーコンチェーンは、2020年に開始されたオリジナルのプルーフ・オブ・ステーク型ブロックチェーンの名称です。 当初は、イーサリアムメインネットに適用する前に、プルーフ・オブ・ステークのコンセンサスロジックが健全で持続可能であることを確認するために作成されました。 そのため、元来のプルーフ・オブ・ワークのイーサリアムと並行して稼働していました。 ビーコンチェーンは「空の」ブロックのチェーンだったので、イーサリアムでプルーフ・オブ・ワークを停止し、プルーフ・オブ・ステークへと切り替えるには、ビーコンチェーンで実行クライアントのトランザクションデータを受け入れ、ブロックにバンドルし、プルーフ・オブ・ステークに基づく合意メカニズムを使ってブロックチェーンに構成する必要がありました。 同時に、オリジナルのイーサリアムのクライアントは、マイニング、ブロック伝播、コンセンサスロジックを停止し、ビーコンチェーンへと継承させました。 これが[マージ](/roadmap/merge/)として知られるイベントです。 マージによって、2つのブロックチェーンは プルーフ・オブ・ステークに統合され、現在は、ノードごとに2つの異なるクライアントが必要になりました。 ビーコンチェーンは現在、コンセンサスレイヤーであり、ブロックのゴシップとコンセンサスロジックを処理するコンセンサスクライアントのピアツーピアネットワークです。一方、元々のクライアントは実行レイヤーを形成し、トランザクションのゴシップと実行、そしてイーサリアムの状態を管理しています。 2つのレイヤーは、エンジンAPIを使ってお互いに通信することができます。 ## ビーコンチェーンとは {#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} ### ステーキングの紹介 {#introducing-staking} -ビーコンチェーンの稼働の伴い、 [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)がイーサリアムに導入されました。 イーサリアムの安全性が保たれ、バリデータはより多くの ETH を獲得することができるようになりました。 実際にバリデータソフトウェアを起動するには、ETH をステーキングすることになります。 ステーカーは、チェーンに新しいブロックを作成し、検証するバリデータソフトウェアを実行します。 +ビーコンチェーンの稼働の伴い、 [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)がイーサリアムに導入されました。 イーサリアムの安全性が保たれ、バリデータはより多くのETHを獲得することができるようになりました。 実際にバリデータソフトウェアを起動するには、ETHをステーキングすることになります。 ステーカーは、チェーンに新しいブロックを作成し、検証するバリデータソフトウェアを実行します。 -ステーキングは、かつての[マイニング](/developers/docs/mining/)と同じ目的を果たしますが、その手法は多くの点で異なります。 マイニングには、強力なハードウェアや大量のエネルギーが必要であり、そのため、多額の先行投資が必要になります。その結果、規模の経済が生まれ、集中化が進みました マイニングにおいても、資産を担保としてロックする必要がなかったため、攻撃後に悪意のある行為者を罰するプロトコルの能力にも限界がありました。 +ステーキングは、かつての[マイニング](/developers/docs/consensus-mechanisms/pow/mining/)と同じ目的を果たしますが、その手法は多くの点で異なります。 マイニングには、強力なハードウェアや大量のエネルギーが必要であり、そのため、多額の先行投資が必要になります。その結果、規模の経済が生まれ、集中化が進みました マイニングにおいても、資産を担保としてロックする必要がなかったため、攻撃後に悪意のある行為者を罰するプロトコルの能力にも限界がありました。 プルーフ・オブ・ステークへの移行により、イーサリアムは従来のプルーフ・オブ・ワークに比べて、格段にセキュリティと分散性が向上しました。 ネットワークに参加する人が多いほど、より分散化され、攻撃の危険性が減少します。 @@ -42,7 +41,7 @@ summaryPoint3: ビーコンチェーンは、コンセンサスロジックと ビーコンチェーンが元来のイーサリアムメインネットに統合されてから、イーサリアムコミュニティはネットワークのスケーリングを模索し始めました。 -プルーフ・オブ・ステークには、承認されたすべてのブロック作成者のレジストリを常に登録し、ETH をステーキングしているという利点があります。 このレジストリにより、特定のネットワークの責任を信頼おける方法で分割や制御することができます。 +プルーフ・オブ・ステークには、承認されたすべてのブロック作成者のレジストリを常に登録し、ETHをステーキングしているという利点があります。 このレジストリにより、特定のネットワークの責任を信頼おける方法で分割や制御することができます。 この責任において、プルーフ・オブ・ワークとは対照的です。プルーフ・オブ・ワークでは、マイナーはネットワークに対する義務を負わないため、ペナルティは一切なく、瞬時にマイニングを停止し、ノードソフトウエアを終了することができます。 ブロック提案者のレジストリもなく、ネットワークに関する責任を安全に分担する信頼できる方法もありません。 @@ -54,7 +53,7 @@ summaryPoint3: ビーコンチェーンは、コンセンサスロジックと ### ビーコンチェーンとマージ {#merge-and-beacon-chain} -当初、ビーコンチェーンはイーサリアムメインネットと別々に存在していましたが 2022 年に統合されました。 +当初、ビーコンチェーンはイーサリアムメインネットと別々に存在していましたが2022年に統合されました。 マージ diff --git a/public/content/translations/ja/roadmap/danksharding/index.md b/public/content/translations/ja/roadmap/danksharding/index.md index 998d693bf9d..f73842ad0fa 100644 --- a/public/content/translations/ja/roadmap/danksharding/index.md +++ b/public/content/translations/ja/roadmap/danksharding/index.md @@ -11,21 +11,21 @@ summaryPoints: # ダークシャーディング {#danksharding} -**ダンクシャーディング**は、イーサリアムが真にスケーラブルなブロックチェーンになるうえで重要な役割を果たしています。しかし、そこに到達するには、複数のプロトコルをアップグレードする必要があります。 **プロトダンクシャーディング**は、ダンクシャーディングへの中間ステップです。 どちらもユーザーにとってレイヤー 2 でのトランザクションを可能な限り安価にすることを目的としています。また、イーサリアムを 1 秒間のトランザクション件数を 10 万件以上に拡大することを目指しています。 +**ダンクシャーディング**は、イーサリアムが真にスケーラブルなブロックチェーンになるうえで重要な役割を果たしています。しかし、そこに到達するには、複数のプロトコルをアップグレードする必要があります。 **プロトダンクシャーディング**は、ダンクシャーディングへの中間ステップです。 どちらもユーザーにとってレイヤー2でのトランザクションを可能な限り安価にすることを目的としています。また、イーサリアムを1秒間のトランザクション件数を10万件以上に拡大することを目指しています。 ## プロトダンクシャーディングとは {#what-is-protodanksharding} -[EIP-4844](https://eips.ethereum.org/EIPS/eip-4844)として知られるプロトダンクシャーディングは、[ロールアップ](/layer2/#rollups)がより安価なデータをブロックに追加する方法です。 この名称は、アイデアを提案した 2 名の研究者 (プロトラムダ氏とダンクラッド・フィースト氏)に由来しています。 現在のシステムでは、ロールアップは`CALLDATA`にトランザクションを投稿するため、ユーザートランザクションのコストを安くするには限界があります。 たとえロールアップがデータを必要とするのが短期間であっても、すべてのイーサリアムノードによって処理され、チェーン上にデータが永久に存在するため高価になってしまいます。 プロトダンクシャーディングでは、ブロックに送信、添付できるデータブロブを導入します。 これらのブロブ内のデータは、EVM にアクセスできず、一定期間 (1 ~ 3 か月) が経過すると自動的に削除されます。 データブロブにより、ロールアップはデータをより安価に送信できるため、節約した費用をトランザクションのコストとして削減することができます。これにより、エンドユーザーはより安価にトランザクションを行うことができます。 +[EIP-4844](https://eips.ethereum.org/EIPS/eip-4844)として知られるプロトダンクシャーディングは、[ロールアップ](/layer2/#rollups)がより安価なデータをブロックに追加する方法です。 この名称は、アイデアを提案した2名の研究者 (プロトラムダ氏とダンクラッド・フィースト氏)に由来しています。 現在のシステムでは、ロールアップは`CALLDATA`にトランザクションを投稿するため、ユーザートランザクションのコストを安くするには限界があります。 たとえロールアップがデータを必要とするのが短期間であっても、すべてのイーサリアムノードによって処理され、チェーン上にデータが永久に存在するため高価になってしまいます。 プロトダンクシャーディングでは、ブロックに送信、添付できるデータブロブを導入します。 これらのブロブ内のデータは、EVMにアクセスできず、一定期間 (1~3か月) が経過すると自動的に削除されます。 データブロブにより、ロールアップはデータをより安価に送信できるため、節約した費用をトランザクションのコストとして削減することができます。これにより、エンドユーザーはより安価にトランザクションを行うことができます。 -ロールアップは、トランザクションをオフチェーンでバッチ処理し、その結果をイーサリアムに投稿することで、イーサリアムをスケーラビリティを改善する方法です。 ロールアップは、基本的にデータと実行確認の 2 つの要素で構成されています。 データは、イーサリアムに投稿される状態変更を生成するためにロールアップによって処理されている、トランザクションの完全なシーケンスです。 実行確認では、正直なアクターである証明者が、提案された状態変更が正しいことを確認するために、トランザクションを再度実行します。 実行確認を行うには、誰でもダウンロードして確認できるように、トランザクションデータの公開期間を十分に設けておく必要があります。 実行確認により、証明者は、ロールアップシーケンサーが行った不正行為を特定でき、異議申立をすることができます。 ただし、このトランザクションデータを永久的に保存する必要はありません。 +ロールアップは、トランザクションをオフチェーンでバッチ処理し、その結果をイーサリアムに投稿することで、イーサリアムをスケーラビリティを改善する方法です。 ロールアップは、基本的にデータと実行確認の2つの要素で構成されています。 データは、イーサリアムに投稿される状態変更を生成するためにロールアップによって処理されている、トランザクションの完全なシーケンスです。 実行確認では、正直なアクターである証明者が、提案された状態変更が正しいことを確認するために、トランザクションを再度実行します。 実行確認を行うには、誰でもダウンロードして確認できるように、トランザクションデータの公開期間を十分に設けておく必要があります。 実行確認により、証明者は、ロールアップシーケンサーが行った不正行為を特定でき、異議申立をすることができます。 ただし、このトランザクションデータを永久的に保存する必要はありません。 -ロールアップは、トランザクションデータへのコミットメントをオンチェーンに投稿し、実際のデータをデータブロブで入手できるようにするため、 証明者はコミットメントが有効であることを確認したり、間違っていると思われるデータに異議を唱えることができます。 ノードレベルでは、データブロブはコンセンサスクライアントに保持されます。 コンセンサスクライアントは、データを確認し、それがネットワーク全体に伝播したことを証明します。 データが永久的に保持される場合、これらのクライアントの容量が大きくなり、ノードの実行に大量のハードウェアが必要になる可能性があります そのため、データは 1 ~ 3 か月ごとにノードから自動的に削除されます。 コンセンサスクライアントのアテステーションは、証明者がデータを十分に検証する機会があったことを示しています。 実際のデータは、ロールアップオペレータやユーザーなどがオフチェーンに保存できます。 +ロールアップは、トランザクションデータへのコミットメントをオンチェーンに投稿し、実際のデータをデータブロブで入手できるようにするため、 証明者はコミットメントが有効であることを確認したり、間違っていると思われるデータに異議を唱えることができます。 ノードレベルでは、データブロブはコンセンサスクライアントに保持されます。 コンセンサスクライアントは、データを確認し、それがネットワーク全体に伝播したことを証明します。 データが永久的に保持される場合、これらのクライアントの容量が大きくなり、ノードの実行に大量のハードウェアが必要になる可能性があります そのため、データは1~3か月ごとにノードから自動的に削除されます。 コンセンサスクライアントのアテステーションは、証明者がデータを十分に検証する機会があったことを示しています。 実際のデータは、ロールアップオペレータやユーザーなどがオフチェーンに保存できます。 @@ -33,17 +33,17 @@ summaryPoints: ロールアップは、データブロブ内で実行されるトランザクションと、 データを示す「コミットメント」をイーサリアムに投稿します。 これは、多項式関数をデータに当てはめることによって行われます。 この関数は様々な点で値を求めることができます。 例えば、非常に単純な関数`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 の頭文字で、これは 3 人の[原作者](https://link.springer.com/chapter/10.1007/978-3-642-17373-8_11)の名前を表しています。 データのブロブを小さな[暗号「コミットメント」](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) まで縮小するスキームのことです。 ロールアップによって送信されたデータブロブは、ロールアップが不正な動作を行っていないか確認するために検証する必要があります。 そのためには、証明者がブロブ内のトランザクションを再実行して、コミットメントが正しいことを確認します。 これは、実行クライアントがマークルプルーフを使用してレイヤー 1 上のイーサリアムトランザクションの正当性をチェックする方法と、概念的には同じです。 KZG は、多項式をデータに当てはめる代替証明です。 コミットメントは、秘密になっている複数のデータ点で多項式を評価します。 証明者は、データに対して同じ多項式と同じ値で評価し、結果が同じであることを確認します。 これは、ゼロ知識技術と互換性のあるデータ検証方式であり、一部のロールアップやイーサリアムプロトコルの他の箇所で使用されています。 +KZGは、Kate-Zaverucha-Goldbergの頭文字で、これは3人の[原作者](https://link.springer.com/chapter/10.1007/978-3-642-17373-8_11)の名前を表しています。 データのブロブを小さな[暗号「コミットメント」](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) まで縮小するスキームのことです。 ロールアップによって送信されたデータブロブは、ロールアップが不正な動作を行っていないか確認するために検証する必要があります。 そのためには、証明者がブロブ内のトランザクションを再実行して、コミットメントが正しいことを確認します。 これは、実行クライアントがマークルプルーフを使用してレイヤー1上のイーサリアムトランザクションの正当性をチェックする方法と、概念的には同じです。 KZGは、多項式をデータに当てはめる代替証明です。 コミットメントは、秘密になっている複数のデータ点で多項式を評価します。 証明者は、データに対して同じ多項式と同じ値で評価し、結果が同じであることを確認します。 これは、ゼロ知識技術と互換性のあるデータ検証方式であり、一部のロールアップやイーサリアムプロトコルの他の箇所で使用されています。 -### KZG セレモニーとは {#what-is-a-kzg-ceremony} +### KZGセレモニーとは {#what-is-a-kzg-ceremony} -KZG セレモニーは、イーサリアムコミュニティ全体から多くの人々が協力して生成する、データの検証に使用できる秘密のランダムな数字列を生成する方法です。 この数字列は、誰にも知られず、誰にも再現できないことが、非常に重要であり、 そのために、セレモニーに参加する各人は、前の参加者から文字列を受け取ります。 次に、ブラウザにマウスの動きを測定させるなどして、いくつかの新しいランダム値を作成します。それを以前の値と混ぜて、 次の参加者に送信し、送信後にローカルマシンからその値を破棄します。 セレモニーに参加する 1 人がこれを正直に行う限り、最終的な値が攻撃者に判明することはありません。 EIP-4844 の KZG セレモニーは一般公開され、何万人もの人々がエントロピーを追加するために参加しました。 セレモニーを妨害するためには、参加者の 100%が積極的に不正行為を行わなければなりません。 参加者の観点では、自分自身が正直であるとわかっていれば、その人自身がセレモニーの安全を確保したことがわかるので、他の人を信頼する必要はありません(参加者が個々に、N 人中 1 人の正直な参加者の要件を満たしています) 。 +KZGセレモニーは、イーサリアムコミュニティ全体から多くの人々が協力して生成する、データの検証に使用できる秘密のランダムな数字列を生成する方法です。 この数字列は、誰にも知られず、誰にも再現できないことが、非常に重要であり、 そのために、セレモニーに参加する各人は、前の参加者から文字列を受け取ります。 次に、ブラウザにマウスの動きを測定させるなどして、いくつかの新しいランダム値を作成します。それを以前の値と混ぜて、 次の参加者に送信し、送信後にローカルマシンからその値を破棄します。 セレモニーに参加する1人がこれを正直に行う限り、最終的な値が攻撃者に判明することはありません。 EIP-4844のKZGセレモニーは一般公開され、何万人もの人々がエントロピーを追加するために参加しました。 セレモニーを妨害するためには、参加者の100%が積極的に不正行為を行わなければなりません。 参加者の観点では、自分自身が正直であるとわかっていれば、その人自身がセレモニーの安全を確保したことがわかるので、他の人を信頼する必要はありません(参加者が個々に、N人中1人の正直な参加者の要件を満たしています) 。 -ロールアップがデータをブロブに投稿すると、チェーン上に投稿するという「コミットメント」を提供します。 このコミットメントは、特定の点でデータに適合する多項式を評価した結果です。 この点は、KZG セレモニーで生成された乱数によって定義され、 証明者はデータを検証するために同じ点で多項式を評価できます。同じ値になった場合、データは正しいということになります。 +ロールアップがデータをブロブに投稿すると、チェーン上に投稿するという「コミットメント」を提供します。 このコミットメントは、特定の点でデータに適合する多項式を評価した結果です。 この点は、KZGセレモニーで生成された乱数によって定義され、 証明者はデータを検証するために同じ点で多項式を評価できます。同じ値になった場合、データは正しいということになります。 @@ -61,11 +61,11 @@ KZG セレモニーは、イーサリアムコミュニティ全体から多く ダンクシャーディングは、プロトダンクシャーディングで始まったロールアップスケーリングの完成版です。 ダンクシャーディングは、イーサリアムに大容量のスペースをもたらし、ロールアップのトランザクションデータを圧縮して保存できるようにします。 これにより、イーサリアムは数百ものロールアップを簡単にサポートでき、毎秒数百万のトランザクションを処理できるようになります。 -この仕組みを説明すると、ブロックに添付されるブロブをプロトダンクシャーディングの 1 個から完全なダンクシャーディングである 64 個まで拡張する方法を導入することで機能します。 必要な残りの変更は、新しい大きなブロブを処理できるようにするためにコンセンサスクライアントの動作方法をすべて更新することです。 これらの変更の中には、ダンクシャーディングとは関係なく、別の目的のためにすでに計画されているものもあります。 例えば、ダンクシャーディングでは、提案者と作成者の分離が実装されている必要があります。 これは、さまざまなバリデータ間でブロックの作成とブロックの提案のタスクを分離するアップグレードです。 同様に、ダンクシャーディングにはデータ可用性のサンプリングが必要ですが、多くの履歴データを保存しない超軽量クライアント「ステートレスクライアント」の開発にも必要です。 +この仕組みを説明すると、ブロックに添付されるブロブをプロトダンクシャーディングの1個から完全なダンクシャーディングである64個まで拡張する方法を導入することで機能します。 必要な残りの変更は、新しい大きなブロブを処理できるようにするためにコンセンサスクライアントの動作方法をすべて更新することです。 これらの変更の中には、ダンクシャーディングとは関係なく、別の目的のためにすでに計画されているものもあります。 例えば、ダンクシャーディングでは、提案者と作成者の分離が実装されている必要があります。 これは、さまざまなバリデータ間でブロックの作成とブロックの提案のタスクを分離するアップグレードです。 同様に、ダンクシャーディングにはデータ可用性のサンプリングが必要ですが、多くの履歴データを保存しない超軽量クライアント「ステートレスクライアント」の開発にも必要です。 -提案者と作成者を分離することで、個々の検証者が 32MB のブロブデータに対して、コストのかかるコミットメントや証明を生成するのを防ぐことができます。 提案者と作成者の分離をしないと、自宅でステーキングをしている端末に過度の負担がかかり、より強力なハードウェアへの投資が必要となります。その結果、分散化に悪影響を及ぼします。 代わりに、専門のブロック作成者が、このコストのかかる計算作業を担当します。 そして、ブロック作成者は、ブロック提案者にブロックを提供してブロードキャストします。 ブロック提案者は、最も収益性の高いブロックを選択するだけです。 誰でも、安価かつ迅速にブロブを検証できます。つまり、通常のバリデータであれば、ブロック作成者が誠実な行動をしているかどうかをチェックできます。 この仕組みにより、分散化を犠牲にすることなく、大きなブロブを処理することができます。 不正なブロック作成者を簡単にネットワークから排除してスラッシュすることができます。ブロック作成自体が収益性の高い活動であるため、不正なブロック作成者の代わりに、他の候補者が参加することになります。 +提案者と作成者を分離することで、個々の検証者が32MBのブロブデータに対して、コストのかかるコミットメントや証明を生成するのを防ぐことができます。 提案者と作成者の分離をしないと、自宅でステーキングをしている端末に過度の負担がかかり、より強力なハードウェアへの投資が必要となります。その結果、分散化に悪影響を及ぼします。 代わりに、専門のブロック作成者が、このコストのかかる計算作業を担当します。 そして、ブロック作成者は、ブロック提案者にブロックを提供してブロードキャストします。 ブロック提案者は、最も収益性の高いブロックを選択するだけです。 誰でも、安価かつ迅速にブロブを検証できます。つまり、通常のバリデータであれば、ブロック作成者が誠実な行動をしているかどうかをチェックできます。 この仕組みにより、分散化を犠牲にすることなく、大きなブロブを処理することができます。 不正なブロック作成者を簡単にネットワークから排除してスラッシュすることができます。ブロック作成自体が収益性の高い活動であるため、不正なブロック作成者の代わりに、他の候補者が参加することになります。 @@ -77,15 +77,15 @@ KZG セレモニーは、イーサリアムコミュニティ全体から多く ### 現在の進行状況 {#current-progress} -完全なダンクシャーディングは、数年先を予定していますが、 プロトダンクシャーディングは、近日にリリースされます。 この記事の執筆時点(2023 年 2 月)において、KZG セレモニーはまだ開催中であり、これまでに 5 万人以上の参加者を集めています。 プロトダンクシャーディングの[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)を参照しながら準備しましょう。 +完全なダンクシャーディングは、数年先を予定していますが、 プロトダンクシャーディングは、近日にリリースされます。 この記事の執筆時点(2023年2月)において、KZGセレモニーはまだ開催中であり、これまでに5万人以上の参加者を集めています。 プロトダンクシャーディングの[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} - [プロトダンクシャーディングのメモ](https://notes.ethereum.org/@vbuterin/proto_danksharding_faq) - _ヴィタリック・ブテリン_ - [ダンクシャーディングに関するダンクラッドのメモ](https://notes.ethereum.org/@dankrad/new_sharding) - [ダンクラッド、プロト、ヴィタリックによるダンクシャーディングの議論](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) +- [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) - [ブロブ向けのデータ可用性サンプリングの詳細](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) -- [ダンクラッド・フィーストによる KZG コミットメントと証明](https://youtu.be/8L2C6RDMV9Q) -- [KZG 多項式コミットメント](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) +- [ダンクラッド・フィーストによるKZGコミットメントと証明](https://youtu.be/8L2C6RDMV9Q) +- [KZG多項式コミットメント](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) diff --git a/public/content/translations/ja/roadmap/future-proofing/index.md b/public/content/translations/ja/roadmap/future-proofing/index.md index bb2a3795ac0..f3111b899b0 100644 --- a/public/content/translations/ja/roadmap/future-proofing/index.md +++ b/public/content/translations/ja/roadmap/future-proofing/index.md @@ -13,23 +13,23 @@ template: roadmap 現在のイーサリアムを保護するの一部の暗号技術は、量子コンピューティングが実現した際に脆弱性が露呈する可能性があります。 量子コンピューターが現代の暗号技術にとって脅威となるには数十年かかると言われていますが、イーサリアムは今後何世紀にもわたって安全に運用することを目標にしています。 そのため、[イーサリアムの量子耐性](https://consensys.net/blog/developers/how-will-quantum-supremacy-affect-blockchain/)をできるだけ早く実現する必要があります。 -イーサリアムのデベロッパーが直面している課題として、現在のプルーフ・オブ・ステークのプロトコルが、有効なブロックの投票を集約するために、非常に効率的な署名スキームである BLS に依存していることです。 この署名スキームは、量子コンピューターによって破られてしまう可能性があります。一方、量子耐性のある代替手段は、計算効率がそれほど良くありません。 +イーサリアムのデベロッパーが直面している課題として、現在のプルーフ・オブ・ステークのプロトコルが、有効なブロックの投票を集約するために、非常に効率的な署名スキームであるBLSに依存していることです。 この署名スキームは、量子コンピューターによって破られてしまう可能性があります。一方、量子耐性のある代替手段は、計算効率がそれほど良くありません。 -イーサリアムでは、暗号秘密を生成するために[「KZG」コミットメントスキーム](/roadmap/danksharding/#what-is-kzg)が広く使われています。しかし、このスキームは量子コンピュータによって破られる可能性があります。 現在は、多くのユーザーが生成したランダム性を使用して「信頼できるセットアップ」として回避されており、量子コンピューターによるリバースエンジニアリングができないようになっています。 しかし、理想的には、量子安全暗号を組み込むことで、脆弱性を根本的に解決することが望まれます。 BLS スキームの効率的な代替となる可能性のある 2 つの主要なアプローチとして、[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スキームの効率的な代替となる可能性のある2つの主要なアプローチとして、[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)されます。このコマンドはめったに使用されなくなりましたが、状況によっては使用すると危険を伴う場合があります。例えば、特にイーサリアムのストレージモデルに対する将来のアップグレードと組み合わせた場合です。 イーサリアムクライアントは、現在でも完全に削除可能な古いトランザクションタイプをサポートしています。 また、ガスの計算方法も改善される予定です。暗号操作を支える算術演算に対して、より効率的な方法が導入されます。 +[イーサリアム仮想マシン(EVM)](/developers/docs/evm)をよりシンプルで効率的なものにするアップデートが予定されています。 その一環として、[SELFDESTRUCTオペコードが削除](https://hackmd.io/@vbuterin/selfdestruct)されます。このコマンドはめったに使用されなくなりましたが、状況によっては使用すると危険を伴う場合があります。例えば、特にイーサリアムのストレージモデルに対する将来のアップグレードと組み合わせた場合です。 イーサリアムクライアントは、現在でも完全に削除可能な古いトランザクションタイプをサポートしています。 また、ガスの計算方法も改善される予定です。暗号操作を支える算術演算に対して、より効率的な方法が導入されます。 同様に、現在のイーサリアムクライアントの他の部分もアップデートされる可能性があります。 一例として現在は、実行クライアントとコンセンサスクライアントが異なるデータ圧縮方式を使用しています。 この圧縮方式をネットワーク全体で統一すれば、クライアント間でのデータ共有がより簡単で直感的になります。 ## 現在の進行状況 {#current-progress} -イーサリアムの将来的な安全性を確保するために必要なアップグレードの多くは、まだ研究段階です。実装には数年かかると考えられており、 SELF-DESTRUCT の削除や、実行クライアントとコンセンサスクライアントで使用される圧縮方式の統一などのアップグレードは、量子耐性のある暗号よりも早く実現される可能性があります。 +イーサリアムの将来的な安全性を確保するために必要なアップグレードの多くは、まだ研究段階です。実装には数年かかると考えられており、 SELF-DESTRUCTの削除や、実行クライアントとコンセンサスクライアントで使用される圧縮方式の統一などのアップグレードは、量子耐性のある暗号よりも早く実現される可能性があります。 **参考文献** diff --git a/public/content/translations/ja/roadmap/index.md b/public/content/translations/ja/roadmap/index.md index 739ec407d13..7e4e43fc6a1 100644 --- a/public/content/translations/ja/roadmap/index.md +++ b/public/content/translations/ja/roadmap/index.md @@ -3,7 +3,7 @@ title: イーサリアムロードマップ description: イーサリアムのスケーラビリティ、セキュリティ、サステナビリティを改善する工程 lang: ja template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "イーサリアムロードマップ" summaryPoints: buttons: @@ -55,11 +55,11 @@ buttons: ## イーサリアムにロードマップが必要な理由は何ですか? {#why-does-ethereum-need-a-roadmap} -イーサリアムは定期的にアップグレードされており、その結果、スケーラビリティ、セキュリティ、サステナビリティが向上しています。 イーサリアムの中核的な強みの 1 つとして、研究開発から生まれた新しいアイデアに適応できることです。 この適応性によって、イーサリアムは新たな課題に取り組んでおり、最先端の技術的ブレークスルーにも対応できる柔軟性を備えています。 +イーサリアムは定期的にアップグレードされており、その結果、スケーラビリティ、セキュリティ、サステナビリティが向上しています。 イーサリアムの中核的な強みの1つとして、研究開発から生まれた新しいアイデアに適応できることです。 この適応性によって、イーサリアムは新たな課題に取り組んでおり、最先端の技術的ブレークスルーにも対応できる柔軟性を備えています。 -イーサリアムのロードマップは、研究者と開発者たちが長年かけて築き上げてきたものです。このプロトコルは非常に技術的な内容ではあるものの、やる気があれば誰でも参加することができます。 新しいアイデアは、通常、[ethresear.ch](https://ethresear.ch/)、[イーサリアム・マジシャンズ](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) 、イーサリアム研究開発の Discord サーバーなどのフォーラムで議論されます。 議論の内容は、新たに見つかった脆弱性への対応、アプリケーションレイヤーで活動する組織(dApp や取引所など)からの提案、エンドユーザーにとっての既知の摩擦(コストやトランザクション速度など)への対応だったりします。 新しいアイデアが成熟すると、[イーサリアム改善提案](https://eips.ethereum.org/)として提案できます。 このアイデアの創出は、誰でも参加できるオープンなプロセスです。コミュニティのメンバーであれば、いつでも議論に参加できます。 +イーサリアムのロードマップは、研究者と開発者たちが長年かけて築き上げてきたものです。このプロトコルは非常に技術的な内容ではあるものの、やる気があれば誰でも参加することができます。 新しいアイデアは、通常、[ethresear.ch](https://ethresear.ch/)、[イーサリアム・マジシャンズ](https://ethereum-magicians.org) 、イーサリアム研究開発のDiscordサーバーなどのフォーラムで議論されます。 議論の内容は、新たに見つかった脆弱性への対応、アプリケーションレイヤーで活動する組織(dAppや取引所など)からの提案、エンドユーザーにとっての既知の摩擦(コストやトランザクション速度など)への対応だったりします。 新しいアイデアが成熟すると、[イーサリアム改善提案](https://eips.ethereum.org/)として提案できます。 このアイデアの創出は、誰でも参加できるオープンなプロセスです。コミュニティのメンバーであれば、いつでも議論に参加できます。 [イーサリアムにおけるガバナンスの詳細](/governance/) @@ -80,9 +80,9 @@ buttons: ## ロードマップに終わりはありますか? {#when-will-the-roadmap-be-finished} -イーサリアムでは、今後 6 か月の間に、ステーキングの引き出しなどのアップグレードを実装します 。一方、耐量子暗号などのアップグレードは優先度が低く、今後 5〜10 年間は実装されないかもしれません。 イーサリアムは、多数のロードマップアイテムを同時に進めており、それぞれ異なる速度で開発されています。そのため、各アップグレードの正確なタイミングを予測するのは難しくなっています。 アップグレードの緊急性は、時間の経過とともに外部要因によって変化する可能性があります。例えば、量子コンピューターの性能と普及が急速に進むにつれて、耐量子暗号の緊急性がますます高まっていくかもしれません。 +イーサリアムでは、今後6か月の間に、ステーキングの引き出しなどのアップグレードを実装します 。一方、耐量子暗号などのアップグレードは優先度が低く、今後5〜10年間は実装されないかもしれません。 イーサリアムは、多数のロードマップアイテムを同時に進めており、それぞれ異なる速度で開発されています。そのため、各アップグレードの正確なタイミングを予測するのは難しくなっています。 アップグレードの緊急性は、時間の経過とともに外部要因によって変化する可能性があります。例えば、量子コンピューターの性能と普及が急速に進むにつれて、耐量子暗号の緊急性がますます高まっていくかもしれません。 -イーサリアムの発展を考えるには、生物学的進化を参考にするのも 1 つの方法です。 新しい課題に適応し、適応度を維持できるネットワークは、より成功する可能性が高くなります。そのため、ネットワークのパフォーマンスが上がるにつれて、スケーラブルで安全なプロトコルが必要になります。またプロトコルの変更を最小限に抑え、変化に対して耐性を持つことも重要です。 +イーサリアムの発展を考えるには、生物学的進化を参考にするのも1つの方法です。 新しい課題に適応し、適応度を維持できるネットワークは、より成功する可能性が高くなります。そのため、ネットワークのパフォーマンスが上がるにつれて、スケーラブルで安全なプロトコルが必要になります。またプロトコルの変更を最小限に抑え、変化に対して耐性を持つことも重要です。 ## アップグレードをするには、何が必要ですか? {#do-i-have-to-do-anything-when-there-is-an-upgrade} @@ -94,7 +94,7 @@ buttons: - マージ: プルーフ・オブ・ワークからプルーフ・オブ・ステークへの移行に関連するアップグレード - サージ: ロールアップとデータシャーディングによるスケーラビリティ向上に関連するアップグレード -- スカージ: MEV からの検閲耐性、分散化、プロトコルのリスクに関連するアップグレード +- スカージ: MEVからの検閲耐性、分散化、プロトコルのリスクに関連するアップグレード - バージ: ブロックの検証をより簡単にするアップグレード - パージ: ノード実行における計算コストの削減とプロトコルの簡素化に関連するアップグレード - スプラージ: これまでのカテゴリに分類できないその他のアップグレード @@ -103,13 +103,13 @@ buttons: ## シャーディングとは何ですか? {#what-about-sharding} -シャーディングでは、イーサリアムのブロックチェーンを分割する技術です。バリデータのサブセットは、それぞれのチェーンでデータを検証する役割を担います。 これは、もともとイーサリアムをスケーリングする方法として開発されました。 しかし、レイヤー 2 ロールアップの開発が予想以上に進み、すでにさまざまなスケーリング機能を提供できるようになりました。また、プロトダンクシャーディングの実装後には、さらに多くの機能を提供する予定となっているため、 「シャードチェーン」は不要になり、ロードマップから削除されました。 +シャーディングでは、イーサリアムのブロックチェーンを分割する技術です。バリデータのサブセットは、それぞれのチェーンでデータを検証する役割を担います。 これは、もともとイーサリアムをスケーリングする方法として開発されました。 しかし、レイヤー2ロールアップの開発が予想以上に進み、すでにさまざまなスケーリング機能を提供できるようになりました。また、プロトダンクシャーディングの実装後には、さらに多くの機能を提供する予定となっているため、 「シャードチェーン」は不要になり、ロードマップから削除されました。 ## 特定の技術アップグレードについての情報 {#looking-for-specific-technical-upgrades} -- [ダンクシャーディング](/roadmap/danksharding) - ダンクシャーディングは、イーサリアムのブロックに「ブロブ」と呼ばれるデータを追加することで、ユーザーのレイヤー 2 ロールアップ使用料を大幅に削減します。 -- [ステーキングの引き出し](/saking/withdrawals) - 上海/カペラのアップグレードにより、イーサリアム上のステーキングした ETH を引き出せるようになりました。また、ステーキングした ETH のロックを解除できるようになりました。 -- [シングルスロット・ファイナリティ](/roadmap/single-slot-finality) - 15 分待たずに、同一のスロット内でブロックが提案され、ファイナライズが可能になります。 これにより、アプリにとっては利便性が向上し、攻撃がはるかに困難になります。 +- [ダンクシャーディング](/roadmap/danksharding) - ダンクシャーディングは、イーサリアムのブロックに「ブロブ」と呼ばれるデータを追加することで、ユーザーのレイヤー2ロールアップ使用料を大幅に削減します。 +- [ステーキングの引き出し](/staking/withdrawals) - 上海/カペラのアップグレードにより、イーサリアム上のステーキングしたETHを引き出せるようになりました。また、ステーキングしたETHのロックを解除できるようになりました。 +- [シングルスロット・ファイナリティ](/roadmap/single-slot-finality) - 15分待たずに、同一のスロット内でブロックが提案され、ファイナライズが可能になります。 これにより、アプリにとっては利便性が向上し、攻撃がはるかに困難になります。 - [プロポーザー/ビルダーセパレーション](/roadmap/pbs) - ブロックを構築するタスクとブロックを提案するタスクを別々のバリデータに分割することで、イーサリアムにおけるコンセンサス合意プロセスを、より効率的で公平にし、検閲耐性のあるものにします。 - [シークレットリーダー選出](/roadmap/secret-leader-election) - 高度な暗号化を使い、現在のブロック提案者のアイデンティティが公開されないようにします。これにより、特定の攻撃タイプから保護できます。 - [アカウント抽象化](/roadmap/account-abstraction) - アカウント抽象化はイーサリアムのアップグレードの一種です。複雑なミドルウェアを使用することなく、イーサリアム上でスマートコントラクトウォレットをネイティブにサポートします。 diff --git a/public/content/translations/ja/roadmap/merge/index.md b/public/content/translations/ja/roadmap/merge/index.md index 5cc17b30956..a8f5212ff28 100644 --- a/public/content/translations/ja/roadmap/merge/index.md +++ b/public/content/translations/ja/roadmap/merge/index.md @@ -4,32 +4,31 @@ description: マージについて - イーサリアムメインネットへの lang: ja template: upgrade image: /upgrades/merge.png -alt: summaryPoint1: イーサリアムメインネットは現在プルーフ・オブ・ステークを使用していますが、これまではそうではありませんでした。 summaryPoint2: 旧プルーフ・オブ・ワークのメカニズムからプルーフ・オブ・ステークへのアップグレードはマージと呼ばれます。 summaryPoint3: マージとは、元のイーサリアムメインネットが、ビーコンチェーンとよばれる別のプルーフ・オブ・ステークのブロックチェーンと統合(マージ)し、1つのチェーンになったことを意味します。 summaryPoint4: マージによりイーサリアムのエネルギー消費が最大99.95%削減されました。 --- - + マージは、2022年9月15日に行われました。 これにより、イーサリアムはプルーフ・オブ・ステーク・コンセンサスへの移行を完了し、公式にプルーフ・オブ・ワークは廃止されました。この移行により、エネルギー消費量が最大99.95%削減されました。 ## マージとは {#what-is-the-merge} -マージとは、イーサリアムの元の実行レイヤー ([誕生](/history/#frontier)から存在するメインネット) と、新規のプルーフ・オブ・ステークのコンセンサスレイヤーであるビーコンチェーンをマージ(統合)することでした。 これにより、エネルギー集約的なマイニングが不要になり、代わりにステーキングされた ETH を利用して、ネットワークのセキュリティが確保されるようになりました。 イーサリアムのビジョンである、より高性能なスケーラビリティ、より安心なセキュリティ、より高いレベルの持続可能性を実現するための、本当にエキサイティングなステップとなりました。 +マージとは、イーサリアムの元の実行レイヤー ([誕生](/history/#frontier)から存在するメインネット) と、新規のプルーフ・オブ・ステークのコンセンサスレイヤーであるビーコンチェーンをマージ(統合)することでした。 これにより、エネルギー集約的なマイニングが不要になり、代わりにステーキングされたETHを利用して、ネットワークのセキュリティが確保されるようになりました。 イーサリアムのビジョンである、より高性能なスケーラビリティ、より安心なセキュリティ、より高いレベルの持続可能性を実現するための、本当にエキサイティングなステップとなりました。 -当初、[メインネット](/glossary/#mainnet)とは別に[ビーコンチェーン](/roadmap/beacon-chain/)がリリースされました。 メインネットでは[プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow/)によりすべてのアカウント、残高、スマートコントラクトおよびブロックチェーンの状態の安全性が保たれ、それと同時に[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)を活用したビーコンチェーンが並行して稼働していました。 マージでは、これらの 2 つのシステムが最終的に統合され、プルーフ・オブ・ワークが永久にプルーフ・オブ・ステークに置き換わりました。 +当初、[メインネット](/glossary/#mainnet)とは別に[ビーコンチェーン](/roadmap/beacon-chain/)がリリースされました。 メインネットでは[プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow/)によりすべてのアカウント、残高、スマートコントラクトおよびブロックチェーンの状態の安全性が保たれ、それと同時に[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)を活用したビーコンチェーンが並行して稼働していました。 マージでは、これらの2つのシステムが最終的に統合され、プルーフ・オブ・ワークが永久にプルーフ・オブ・ステークに置き換わりました。 イーサリアムが、恒星間航行への準備が不十分で打ち上げられた宇宙船だと想像してみてください。 ビーコンチェーンによって、新型のエンジンと強化された船体が構築されました。 大規模なテストが行われた後、旧式のエンジンと新型のエンジンを飛行中に入れ替える時期となりました。 より効率的な新型のエンジンを既存の宇宙船にマージしたことにより、何光年もの長い宇宙への旅ができるようになったのです。 ## メインネットとのマージ {#merging-with-mainnet} -イーサリアムメインネットは、その誕生からマージまで、プルーフ・オブ・ワークにより保護されてきました。 プルーフ・オブ・ワークのもと、トランザクション、スマートコントラクト、アカウントなど、馴染みのあるすべての機能を備えた、イーサリアムのブロックチェーンが 2015 年 7 月に実現しました。 +イーサリアムメインネットは、その誕生からマージまで、プルーフ・オブ・ワークにより保護されてきました。 プルーフ・オブ・ワークのもと、トランザクション、スマートコントラクト、アカウントなど、馴染みのあるすべての機能を備えた、イーサリアムのブロックチェーンが2015年7月に実現しました。 -イーサリアムの歴史を通して、デベロッパーはプルーフ・オブ・ワークからプルーフ・オブ・ステークへの最終的な移行の準備を行ってきました。 2020 年 12 月 1 日、メインネットとは別のブロックチェーンとして、ビーコンチェーンが誕生し、メインネットと並行して稼働しました。 +イーサリアムの歴史を通して、デベロッパーはプルーフ・オブ・ワークからプルーフ・オブ・ステークへの最終的な移行の準備を行ってきました。 2020年12月1日、メインネットとは別のブロックチェーンとして、ビーコンチェーンが誕生し、メインネットと並行して稼働しました。 ビーコンチェーンは、もともとはメインネットのトランザクションの処理はせず、 代わりに、アクティブなバリデータとそのアカウント残高に合意することで、独自の状態でコンセンサスに達していました。 膨大なテストを経て、ビーコンチェーンは実世界のデータでのコンセンサスに用いる時が来ました。 マージ後は、ビーコンチェーンが実行レイヤーのトランザクションやアカウント残高を含む全てのネットワークデータのコンセンサスエンジンになりまりました。 @@ -45,7 +44,7 @@ summaryPoint4: マージによりイーサリアムのエネルギー消費が **保有者やユーザーにとっては、マージにより何かが変わったということはありません。** -_繰り返しになりますが_、ETH やイーサリアム上の他のデジタル資産のユーザーや保有者、またノードを運用していないステイカーは、 **マージに伴い、資金やウォレットに何かをする必要はありません**。ETH は ETH のままです。 マージ後も、「古い ETH」/「新しい ETH」や「ETH1」/「ETH2」のようなものはなく、ウォレットは以前とまったく同じように動作します。そうでないと言う人は詐欺師の可能性があります。 +_繰り返しになりますが_、ETHやイーサリアム上の他のデジタル資産のユーザーや保有者、またノードを運用していないステイカーは、 **マージに伴い、資金やウォレットに何かをする必要はありません**。ETHはETHのままです。 マージ後も、「古いETH」/「新しいETH」や「ETH1」/「ETH2」のようなものはなく、ウォレットは以前とまったく同じように動作します。そうでないと言う人は詐欺師の可能性があります。 プルーフ・オブ・ワークを停止し、プルーフ・オブ・ステークに移行した後も、イーサリアムの誕生以降の全トランザクション履歴はそのままで、変更されていません。 マージ以前にウォレットに保有されていた資金は、マージ後も引き続きご利用いただけます。 **ユーザーや保有者は、何かをアップグレードする必要はありません。** @@ -61,12 +60,12 @@ id="staking-node-operators"> 主なアクション項目は次のとおりです。 1. コンセンサスクライアントと実行クライアントの両方を実行します。実行データを取得するためのサードパーティーエンドポイントは、マージ以降は利用できなくなっています。 -2. 実行クライアントとコンセンサスクライアントが安全に通信できるように、共有の JWT シークレットで認証します。 -3. 獲得したトランザクションフィーのチップまたは MEV を受け取るための「フィーの受取人」のアドレスを設定します。 +2. 実行クライアントとコンセンサスクライアントが安全に通信できるように、共有のJWTシークレットで認証します。 +3. 獲得したトランザクションフィーのチップまたはMEVを受け取るための「フィーの受取人」のアドレスを設定します。 -上記の最初の 2 つの項目が完了していないと、両方のレイヤーが同期および認証されるまで、ノードが「オフライン」として表示されてしまいます。 +上記の最初の2つの項目が完了していないと、両方のレイヤーが同期および認証されるまで、ノードが「オフライン」として表示されてしまいます。 -「フィーの受取人」を設定しなくても、バリデータは通常どおり動作しますが、バリデータが提案したブロックの未焼却のフィーのチップや獲得できたはずの MEV を逃すことになります。 +「フィーの受取人」を設定しなくても、バリデータは通常どおり動作しますが、バリデータが提案したブロックの未焼却のフィーのチップや獲得できたはずのMEVを逃すことになります。
    -マージまでは、ネットワークから送信されるブロックを受信し、適切に検証し、伝搬するには、実行クライアント(Geth、Erigon、Besu、Nethermind など)だけで十分でした。 マージ後は、実行ペイロードに含まれるトランザクションの有効性は、それ自体の「コンセンサスブロック」の有効性にも依存します。 +マージまでは、ネットワークから送信されるブロックを受信し、適切に検証し、伝搬するには、実行クライアント(Geth、Erigon、Besu、Nethermindなど)だけで十分でした。 マージ後は、実行ペイロードに含まれるトランザクションの有効性は、それ自体の「コンセンサスブロック」の有効性にも依存します。 -そのため、マージ後のイーサリアム・フルノードでは、今は実行レイヤクライアントとコンセンサスレイヤクライアントの両方が必要になります。 これらの 2 つのクライアントは、新しいエンジン API を使用して連携します。 エンジン API では、JWT シークレットを使用した認証が必要で、JWT シークレットは両方のクライアントに提供され、安全な通信が行われます。 +そのため、マージ後のイーサリアム・フルノードでは、今は実行レイヤクライアントとコンセンサスレイヤクライアントの両方が必要になります。 これらの2つのクライアントは、新しいエンジンAPIを使用して連携します。 エンジンAPIでは、JWTシークレットを使用した認証が必要で、JWTシークレットは両方のクライアントに提供され、安全な通信が行われます。 主なアクションアイテムは以下の通りです。 - 実行クライアントに加え、コンセンサスクライアントをインストールする -- 実行クライアントとコンセンサスクライアントが安全に通信できるように、共有 JWT シークレットで認証する +- 実行クライアントとコンセンサスクライアントが安全に通信できるように、共有JWTシークレットで認証する 上記の項目が完了していないと、両方のレイヤーの同期と認証が完了するまで、ノードが「オフライン」のように表示されます。 @@ -102,13 +101,13 @@ id="developers">
  • セーフヘッド確定したブロックのコンセプト
  • -詳細については、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..789329f292f 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 906ba2033af..997a7471f16 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.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) +- [バークルツリーの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 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/ko/dao/index.md b/public/content/translations/ko/dao/index.md index 069fe8f2b5b..d7fb0380ed2 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} 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/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/) 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/nl/roadmap/merge/index.md b/public/content/translations/nl/roadmap/merge/index.md index 5ee3d97ff71..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-mechanismen/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-mechanismen/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-mechanismen/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/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/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/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..6fb5e38d8db 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 +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 67909b2f103..c05488d3534 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 (eter) 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..0ba37c42e93 100644 --- a/public/content/translations/pl/community/support/index.md +++ b/public/content/translations/pl/community/support/index.md @@ -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. diff --git a/public/content/translations/pl/decentralized-identity/index.md b/public/content/translations/pl/decentralized-identity/index.md index ed2e85ad6a4..3cb7ce04529 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..b1fe04fde62 100644 --- a/public/content/translations/pl/defi/index.md +++ b/public/content/translations/pl/defi/index.md @@ -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 59439376328..d6aac3be9fa 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/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/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/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/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/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/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/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..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/testing-smart-contract-with-waffle/) +- [Testowanie inteligentnych kontraktów z Waffle](/developers/tutorials/waffle-test-simple-smart-contract/) 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/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..39856041f20 100644 --- a/public/content/translations/pl/refi/index.md +++ b/public/content/translations/pl/refi/index.md @@ -18,7 +18,7 @@ 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) 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/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/) -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..9ebd84679ee 100644 --- a/public/content/translations/pl/staking/saas/index.md +++ b/public/content/translations/pl/staking/saas/index.md @@ -47,7 +47,7 @@ Poniżej znajduje się paru dostępnych dostawców SaaS. Skorzystaj z powyższyc -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 @@ -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..e05f7e76dc2 100644 --- a/public/content/translations/pl/staking/solo/index.md +++ b/public/content/translations/pl/staking/solo/index.md @@ -109,7 +109,7 @@ Dostępnych jest wiele opcji ułatwiających konfigurację. Skorzystaj z powyżs -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 @@ -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/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/about/index.md b/public/content/translations/pt-br/about/index.md index 7b62188d139..bd53d2f5084 100644 --- a/public/content/translations/pt-br/about/index.md +++ b/public/content/translations/pt-br/about/index.md @@ -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} 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..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. @@ -52,7 +54,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/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/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..f033df02b2d 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 +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 88436fb1277..04a436a8941 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..2e94d7c8c43 100644 --- a/public/content/translations/pt-br/community/support/index.md +++ b/public/content/translations/pt-br/community/support/index.md @@ -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. 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/adding-design-resources/index.md b/public/content/translations/pt-br/contributing/design/adding-design-resources/index.md new file mode 100644 index 00000000000..95aa42d318c --- /dev/null +++ b/public/content/translations/pt-br/contributing/design/adding-design-resources/index.md @@ -0,0 +1,69 @@ +--- +title: Adicionando recursos de design +description: Diretrizes e requisitos para garantir a qualidade dos materiais de design no ethereum.org +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. + +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..3ba5470fd51 --- /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..46cb5a86a9c 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,6 +30,8 @@ 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) @@ -49,6 +51,7 @@ 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} @@ -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..f7eed7123ba 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/) @@ -73,11 +73,11 @@ Se você está contribuindo para o Programa de Tradução ou pensando em se envo - [Guia do editor online do Crowdin](https://support.crowdin.com/online-editor/) _ — um guia detalhado sobre como usar o editor online do Crowdin e algumas funcionalidades avançadas do Crowdin_ - [Pacotes de conteúdo](/contributing/translation-program/content-buckets/) _ — quais páginas estão incluídas em cada pacote de conteúdo do ethereum.org_ -Para outras ferramentas úteis de tradução, comunidades de tradutores e postagens no blog do Programa de Tradução, visite a [Página de recursos](/contribuindo/tradução-programa/recursos/). +Para outras ferramentas úteis de tradução, comunidades de tradutores e postagens no blog do Programa de Tradução, visite a [Página de recursos](/contributing/translation-program/resources/). ## 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..05ee871ab02 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 @@ -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. 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/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 876cfe76f66..aa164b42c6c 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-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/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..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} @@ -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..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. @@ -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/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 09d985465fe..94a02175359 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/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/pt-br/developers/docs/scaling/index.md b/public/content/translations/pt-br/developers/docs/scaling/index.md index 81d495a35cb..74bad9eac6e 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.eth.limo/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 e1762f53c3a..55b7c4b901a 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 c706aaff4a3..4c6ae6a3d7e 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 d1a7e0a8235..bc0367f8c04 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 37733d00f40..d3346d0214c 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/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..caf3accc009 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..0a1a5d2f798 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 @@ -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)._ @@ -504,6 +504,8 @@ Se você planeja consultar um oráculo on-chain para preços de ativos, consider - **[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._ 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/standards/tokens/erc-4626/index.md b/public/content/translations/pt-br/developers/docs/standards/tokens/erc-4626/index.md index 7f027def39e..371ffca8180 100644 --- a/public/content/translations/pt-br/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/translations/pt-br/developers/docs/standards/tokens/erc-4626/index.md @@ -204,4 +204,4 @@ Em que `sender` é o usuário que acionou a retirada e trocou `shares`, de propr ## Leitura adicional {#further-reading} - [EIP-4626: Padrão do cofre tokenizado](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626: GitHub Repo](https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol) +- [ERC-4626: GitHub Repo](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) 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 0ffd5869b72..3b347370158 100644 Binary files a/public/content/translations/pt-br/developers/docs/transactions/gas-tx.png and b/public/content/translations/pt-br/developers/docs/transactions/gas-tx.png differ 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..c7750f6ae7d 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": [...] } @@ -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. +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, transmitir novas transações e mais. Tecnicamente, o cliente é o software, o nódulo é o computador que executa o software. [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._ @@ -86,29 +84,31 @@ Neste guia, vamos trabalhar apenas com um interpretador de Python. Não criaremo 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,7 +127,7 @@ 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). Observação: os computadores são notoriamente pouco eficazes para lidar com números decimais. Para contornar isso, os desenvolvedores costumam armazenar valores em dólares em centavos. Por exemplo, um item com preço de $5,99 pode ser armazenado no banco de dados como 599. @@ -143,10 +143,10 @@ Um padrão similar é usado ao lidar com transações em ether. No entant 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,19 +274,21 @@ 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. 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..fbc70bd02c3 --- /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/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. + +## 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..a1180674191 --- /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](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html)). 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..793a44bb683 --- /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/5.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..8d7bc371bd1 --- /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](https://www.youtube.com/watch?v=cOBab8IJMYI). + +## 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/it/developers/tutorials/sending-tokens-using-ethersjs/index.md b/public/content/translations/pt-br/developers/tutorials/send-token-ethersjs/index.md similarity index 59% rename from public/content/translations/it/developers/tutorials/sending-tokens-using-ethersjs/index.md rename to public/content/translations/pt-br/developers/tutorials/send-token-ethersjs/index.md index 0f9979626fc..f57529f2ef8 100644 --- a/public/content/translations/it/developers/tutorials/sending-tokens-using-ethersjs/index.md +++ b/public/content/translations/pt-br/developers/tutorials/send-token-ethersjs/index.md @@ -1,35 +1,35 @@ --- -title: Invio di token utilizzando ethers.js -description: Guida per principianti per l'invio di token utilizzando ethers.js. +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" - - "TOKEN" + - "TOKENS" skill: beginner -lang: it +lang: pt-br published: 2021-04-06 --- -## Invio di token utilizzando ethers.js(5.0) {#send-token} +## Enviar Token usando ethers.js(5.0) {#send-token} -### In questo tutorial imparerai come {#you-learn-about} +### Neste tutorial, você aprenderá {#you-learn-about} -- Importare ethers.js -- Trasferire token -- Impostare il prezzo del gas in base alla situazione del traffico di rete +- 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 -### Per iniziare {#to-get-started} +### Iniciado {#to-get-started} -Per iniziare, dobbiamo prima importare la libreria di ethers.js nel nostro javascript. `Include ethers.js(5.0)` +Para começar, primeiro devemos importar a biblioteca ethers.js para nossa javascript Incluir ethers.js(5.0) -### Installazione {#install-ethersjs} +### Instalando {#install-ethersjs} ```shell /home/ricmoo> npm install --save ethers ``` -ES6 nel browser +ES6 no Navegador ```html ``` -ES3(UMD) nel browser +ES3(UMD) no Navegador ```html ``` -### Parametri {#param} +### Parâmetros {#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 +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 -## Avviso {#notice} +## Nota {#notice} -`signTransaction(tx)` è rimossa perché `sendTransaction()` lo fa internamente. +`signTransaction(tx)` foi removido porque `sendTransaction()` fez isso internamente. -## Invio delle procedure {#procedure} +## Enviando Procedimentos {#procedure} -### 1. Connettiti alla rete (rete di prova) {#connect-to-network} +### 1. Conectar à rede (testnet) {#connect-to-network} -#### Imposta il provider (Infura) {#set-provider} +#### Definir Provedor (Infura) {#set-provider} -Connettiti alla rete di prova di Ropsten +Conecte-se à rede de teste Ropsten ```javascript -window.provider = new InfuraProvider("ropsten") +window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") ``` -### 2. Crea il portafoglio {#create-wallet} +### 2. Criar Carteira {#create-wallet} ```javascript let wallet = new ethers.Wallet(private_key) ``` -### 3. Connetti il portafoglio alla rete {#connect-wallet-to-net} +### 3. Conectar carteira à rede {#connect-wallet-to-net} ```javascript let walletSigner = wallet.connect(window.ethersProvider) ``` -### 4. Ottieni il prezzo corrente del gas {#get-gas} +### 4. Obter o atual preço do gás {#get-gas} ```javascript window.ethersProvider.getGasPrice() // gasPrice ``` -### 5. Definisci la transazione {#define-transaction} +### 5. Definir a Transação {#define-transaction} -Queste variabili definite di seguito dipendono da `send_token()` +Essas variáveis definidas abaixo dependem de `send_token()` -### Parametri della transazione {#transaction-params} +### Parâmetros de transação {#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 +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 -[Vedi sotto come usarli](#how-to-use) +[Veja abaixo como usar](#how-to-use) ```javascript const tx = { @@ -114,7 +114,7 @@ const tx = { } ``` -### 6. Trasferimento {#transfer} +### 6. Transferir {#transfer} ```javascript walletSigner.sendTransaction(tx).then((transaction) => { @@ -123,7 +123,7 @@ walletSigner.sendTransaction(tx).then((transaction) => { }) ``` -## Come usarlo {#how-to-use} +## Como usar {#how-to-use} ```javascript let private_key = @@ -146,9 +146,9 @@ send_token( ) ``` -### Fatto! {#success} +### Sucesso! {#success} -![immagine della transazione eseguita correttamente](./successful-transaction.png) +![imagem da transação realizada com sucesso](./successful-transaction.png) ## send_token() {#send-token-method} 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..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 @@ -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 } @@ -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'); @@ -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..651f49afe6a --- /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/waffle-test-simple-smart-contract/) 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..fbd8ef0174c --- /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-say-hello-world-with-hardhat-and-ethers//) 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..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://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/events/) 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/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/pt-br/roadmap/account-abstraction/index.md b/public/content/translations/pt-br/roadmap/account-abstraction/index.md index 88cdc8a6cca..b8d4f7fcfef 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/beacon-chain/index.md b/public/content/translations/pt-br/roadmap/beacon-chain/index.md index 1b334ff6b1e..281cee99397 100644 --- a/public/content/translations/pt-br/roadmap/beacon-chain/index.md +++ b/public/content/translations/pt-br/roadmap/beacon-chain/index.md @@ -20,7 +20,7 @@ Beacon Chain é o nome do blockchain de prova de participação original que foi ## O que a Beacon Chain faz? {#what-does-the-beacon-chain-do} -Beacon Chain é o nome dado a um registro de contas que orientava e coordenava a rede de [stakers](/participantes/) do Ethereum antes que começassem a validar blocos reais do Ethereum. Entretanto, não processa transações nem interações de contratos inteligentes, pois isso é feito na camada de execução. A Beacon Chain é responsável por atividades como processamento de blocos e atestações, executação do algoritmo de escolha de bifurcação e gerenciamento de recompensas e penalidades. Leia mais em nossa [página de arquitetura de nós](/developers/docs/nodes-and-clients/node-architecture/#node-comparison). +Beacon Chain é o nome dado a um registro de contas que orientava e coordenava a rede de [stakers](/staking/) do Ethereum antes que começassem a validar blocos reais do Ethereum. Entretanto, não processa transações nem interações de contratos inteligentes, pois isso é feito na camada de execução. A Beacon Chain é responsável por atividades como processamento de blocos e atestações, executação do algoritmo de escolha de bifurcação e gerenciamento de recompensas e penalidades. Leia mais em nossa [página de arquitetura de nós](/developers/docs/nodes-and-clients/node-architecture/#node-comparison). ## O impacto da Beacon Chain {#beacon-chain-features} @@ -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/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..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 @@ -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_. @@ -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/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/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/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/ro/developers/docs/apis/backend/index.md b/public/content/translations/ro/developers/docs/apis/backend/index.md index 693bccf354a..83c038457cd 100644 --- a/public/content/translations/ro/developers/docs/apis/backend/index.md +++ b/public/content/translations/ro/developers/docs/apis/backend/index.md @@ -12,7 +12,7 @@ Dacă vreţi să utilizaţi un anumit limbaj de programare pentru a vă conecta ## Condiții prealabile {#prerequisites} -Ar putea fi util să înțelegeți [Stiva Ethereum](/developers/docs/ethereum-stack/) și [ Clienții Ethereum](/developers/docs/nodes-and-clients/). +Ar putea fi util să înțelegeți [Stiva Ethereum](/developers/docs/ethereum-stack/) și [Clienții Ethereum](/developers/docs/nodes-and-clients/). ## De ce să folosiţi o bibliotecă? {#why-use-a-library} 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..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/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/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/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/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. 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) 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..58fbf432d8c 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} @@ -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._ 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/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/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/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/ro/history/index.md b/public/content/translations/ro/history/index.md index ccdd92cc304..bd6425c180b 100644 --- a/public/content/translations/ro/history/index.md +++ b/public/content/translations/ro/history/index.md @@ -13,7 +13,7 @@ O cronologie a tuturor reperelor majore, a fork-urilor și actualizărilor block Fork-urile apar atunci când trebuie făcute actualizări tehnice sau modificări majore în rețea – acestea provin de obicei din [Propunerile de îmbunătățire pentru Ethereum (EIP)](/eips/) și modifică „regulile” protocolului. -Atunci când sunt necesare actualizări în software-ul tradițional, controlat central, compania doar va publica o nouă versiune pentru utilizatorul final. Blockchain-ul funcționează diferit, deoarece nu există proprietate centrală. [Clienții Ethereum](/developer/docs/nodes-and-clients/) trebuie să își actualizeze software-ul pentru a implementa noile reguli de fork-uri. În plus, creatorii de blocuri (miner-ii într-o lume a dovezii-muncii, validatorii într-o lume a dovezii-mizei) și nodurile trebuie să creeze blocuri și să valideze conform noilor reguli. [Mai multe despre mecanismele de consesn]/(developers/docs/consensus-mechanisms/) +Atunci când sunt necesare actualizări în software-ul tradițional, controlat central, compania doar va publica o nouă versiune pentru utilizatorul final. Blockchain-ul funcționează diferit, deoarece nu există proprietate centrală. [Clienții Ethereum](/developers/docs/nodes-and-clients/) trebuie să își actualizeze software-ul pentru a implementa noile reguli de fork-uri. În plus, creatorii de blocuri (miner-ii într-o lume a dovezii-muncii, validatorii într-o lume a dovezii-mizei) și nodurile trebuie să creeze blocuri și să valideze conform noilor reguli. [Mai multe despre mecanismele de consesn]/(developers/docs/consensus-mechanisms/) Aceste schimbări de reguli pot crea o separare temporară în rețea. Pot fi produse blocuri noi conform regulilor noi sau celor vechi. Se convine în avans asupra creării fork-urilor, astfel încât clienții să adopte schimbările la unison și fork-ul cu actualizările să devină lanțul principal. Cu toate acestea, în cazuri rare, dezacordurile asupra fork-urilor pot determina divizarea permanentă a rețelei – cea mai cunoscută fiind crearea lui Ethereum Classic cu [fork-ul DAO](#dao-fork). 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/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/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/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..5fb05c7d98f 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 — сообщество для образования, наставничества, поддержки и предоставления ресурсов для существующих и потенциальных стейкеров +Сообщество 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 aa6914a9cbb..5fb2fab1cea 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..5e0de3f54bd 100644 --- a/public/content/translations/ru/community/support/index.md +++ b/public/content/translations/ru/community/support/index.md @@ -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, также есть специальные открытые площадки, где вы можете получить поддержку и задать вопросы. 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/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/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/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/ru/roadmap/index.md b/public/content/translations/ru/roadmap/index.md index 9229e8bf9db..f15e7d887f5 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: @@ -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/) 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/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/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/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/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/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/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/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. diff --git a/public/content/translations/tr/contributing/design/index.md b/public/content/translations/tr/contributing/design/index.md index f80228b0939..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. diff --git a/public/content/translations/tr/deprecated-software/index.md b/public/content/translations/tr/deprecated-software/index.md deleted file mode 100644 index c86fc8ca212..00000000000 --- a/public/content/translations/tr/deprecated-software/index.md +++ /dev/null @@ -1,428 +0,0 @@ ---- -title: Kullanımdan kaldırılmış yazılım -description: Geliştiricileri tarafından kullanımdan kaldırılmış yazılım -lang: tr -sidebarDepth: 2 ---- - -# Kullanımdan kaldırılmış yazılım {#summary-deprecated-software} - -Bu, Ethereum ile ilgili kullanımdan kaldırılmış veya artık desteklenmeyen önemli proje ve kaynakların bir listesidir. Kullanımdan kaldırılmış çalışmaları vurgulamak, kullanıcıların işlevsel alternatifleri bulmalarını sağlamak ve kötü amaçlı sürümlerin dağıtılmasını önlemek açısından önemlidir. - -Bu liste topluluğumuz tarafından hazırlanmıştır. Eksik veya yanlış bir şey varsa, lütfen bu sayfayı düzenleyin! - -## İş ispatı {#pow} - -[İş ispatı](/developers/docs/consensus-mechanisms/pow), Ethereum'da Eylül 2022'ye kadar kullanılan bir mutabakat motorudur. Ethereum, [hisse ispatı](/developers/docs/consensus-mechanisms/pos) tabanlı bir mutabakat mekanizmasına geçiş yaptığında kullanımı sona ermiştir. Bu, istemci yazılımının [Ethhash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethhash) (madencilik algoritması) ve başlangıçta yürütüm istemcilerinde tümleşik olarak sunulan mutabakat mantığı ve blok yayılım işlevselliğininin tümü dahil olmak üzere iş ispatı madenciliği ile ilgili kısımlarının kullanımdan kaldırılmasıyla gerçekleştirildi. İstemcilerin kendileri değil, bazı temel bileşenleri kullanımdan kaldırılmıştır. İş ispatı kavramı, istemci yazılımının ilgili bileşenlerinin kaldırılmasının yarattığı genel etki sonucunda kullanımdan kaldırılmıştır. - -## Yazılım {#software} - -Bu bölüm, kullanımdan kaldırılmış masaüstü, komut satırı veya sunucu yazılımlarını içerir. Başlıca türleri arasında cüzdanlar, entegre geliştirme ortamları, diller ve Ethereum istemcileri yer alır. Kullanımdan kaldırılmış yazılımı, https://github.com/ethereum adresi altında barındırılan bir depo gibi orijinal kaynaktan geldiğinden emin olmadan yüklememeye dikkat edin. - -### OpenEthereum {#open-ethereum} - -Temmuz 2021'de kullanımdan kaldırılmıştır - -**Özet** - -OpenEthereum, düğüm sayısı bakımından ikinci en büyük Ethereum uygulamasıydı. OpenEthereum, Etherscan ve Gnosis Safe gibi Ethereum'un en büyük kullanıcılarından bazıları için anahtar altyapı parçası olması yönüyle önemli bir rol oynamıştır. İzleme yetenekleri, veri sağlayıcılar için güvenilir ve hızlı senkronizasyon sağlayarak onu diğer istemcilerden öne çıkarmıştır. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/openethereum/openethereum) - -**Tarihçe** - -OpenEthereum, madenciler, hizmet sağlayıcılar ve hızlı senkronizasyon ile maksimum çalışma süresine ihtiyaç duyan borsalar için tasarlanmıştır. OpenEthereum, hızlı ve güvenilir hizmetler için gereken temel altyapıyı sağlamıştır. - -**Alternatifler** - -[Tüm Ethereum yürütüm istemcisi seçeneklerini karşılaştırın](/developers/docs/nodes-and-clients/#execution-clients). - -### Grid {#grid} - -10 Ocak 2020'de kullanımdan kaldırılmıştır - -**Özet** - -Grid; Ethereum, IPFS ve merkeziyetsiz diğer ağlara güvenli bir şekilde erişmenizi sağlayan JavaScript tabanlı bir masaüstü uygulamasıydı. Grid, daha az teknik bilgiye sahip kullanıcıların merkeziyetsiz uygulamalarla güvenli bir şekilde etkileşime girmelerine yardımcı olmak için kullanıcı dostu bir arayüz sunuyordu ve bu da herkes için erişilebilirliği artırıyordu. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/ethereum/grid) - -**Tarihçe** - -Grid, aynı zamanda Mist'in varisi olarak görülebilir. Mist de bağımsız bir JavaScript tabanlı masaüstü uygulamasıydı ve bir Geth düğümü içeriyordu. Grid, cüzdan işlevini kaldırdı ve farklı türde düğümleri çalıştırmaya yönelik eklenti tarzında bir yaklaşım getirdi. - -**Alternatifler** - -[DAppNode](https://dappnode.io/), merkeziyetsiz uygulamaları, P2P istemcilerini ve blokzincir düğümlerini dağıtmaya ve barındırmaya yarayan bir platformdur. - -### Ethereum Studio {#ethereum-studio} - -7 Aralık 2020'de kullanımdan kaldırılmıştır - -**Özet** - -Ethereum Studio, kullanıcıların akıllı sözleşmeler oluşturmasına, test etmesine ve bunlar için ön yüzler geliştirmesine olanak tanıyan web tabanlı bir IDE idi. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/SuperblocksHQ/ethereum-studio) - -**Tarihçe** - -Ethereum Studio, kullanıcılara tümleşik bir Ethereum blokzinciri ve Solidity derleyicisine sahip bir IDE sunmak amacıyla geliştirilmiştir. Bunun yanı sıra, canlı kod düzenlemesi yapma ve bir terminal ihtiyacı olmadan tam merkeziyetsiz uygulamalar çıkarabilme olanağı da sağlamıştır. - -**Alternatifler** - -[Remix](https://remix.ethereum.org/), Solidity geliştirmeleri için alternatif bir web IDE'sidir. Ayrıca [Geliştirici Portalı](/developers/), web ve yerel geliştirme, belgeleme ve daha fazlası için araçlar sunmaktadır. - -### Meteor Dapp Wallet {#meteor-dapp-wallet} - -27 Mart 2019'da kullanımdan kaldırılmıştır - -**Özet** - -Meteor Dapp Wallet, Ethereum hesaplarını yönetmeye ve akıllı sözleşmelerle etkileşime girmeye yarayan bir Ethereum cüzdanı olan Mist'in bir bileşeniydi. Meteor Dapp Wallet web kullanıcı arayüzü, uzun yıllar boyunca "wallet.ethereum.org" alt alan adı olarak barındırılmıştır. - -Ayrıca, Mist Çok İmzalı Sözleşmesi (solidity kodu) de dahil edilmiş ve Meteor Dapp Wallet, bu sözleşmeyi yapılandırmaya ve dağıtmaya yönelik bir kullanıcı arayüzü de sunmuştur. - -**Kullanımdan kaldırılmamıştır: dağıtılmış Mist Çoklu İmzaları** - -Binlerce kullanıcı tarafından Ethereum Ana Ağı'na bayt kodu olarak dağıtılmış olan Mist Çoklu İmzası, olaysız biçimde değerleri depolamak ve yönetmek amacıyla kullanılmaya devam etmektedir. [Bir Mist Çok İmzalı Sözleşmesiyle Etkileşim Kurma](https://support.mycrypto.com/how-to/sending/how-to-interact-with-a-multisig-contract), bu akıllı sözleşmelerin nasıl kullanılacağıyla ilgili iyi bir genel görünüm sunar. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/ethereum/meteor-dapp-wallet) - -**Tarihçe** - -Aşağıda Mist'e göz atın. - -**Alternatifler** - -Ethereum.org'da [Ethereum Cüzdanları](/wallets/) sayfasına göz atın. - -### Mist {#mist} - -27 Mart 2019'da kullanımdan kaldırılmıştır - -**Özet** - -Mist, Electron ile geliştirilmiş ve kullanıcıların Ethereum hesaplarını yönetmesini ve geleneksel internette barındırılan merkeziyetsiz uygulamalarla etkileşime geçmesini sağlayan özelleştirilmiş bir tarayıcıydı. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/ethereum/mist) - -**Tarihçe** - -Mist, Ethereum anahtarlarının nasıl yönetileceğini keşfettiği, kullanıcılara çoklu imzalar gibi finansal araçları tanıttığı ve Web3'ün nasıl çalışacağını gösterdiği için önemli bir erken deneme olmuştur. Ayrıca kullanıcılara, Ethereum anahtarlarını temsil eden şirin ve akılda kalıcı 8 bit stili grafikler olan blokçukları da tanıtmıştır. - -**Alternatifler** - -[MetaMask](https://metamask.io/), Ethereum anahtarlarını yönetmenizi ve merkeziyetsiz uygulamalarla etkileşime geçmenizi sağlayan bir tarayıcı içi cüzdandır. Google Chrome ve Firefox'ta uzantı olarak mevcuttur ve [Brave Tarayıcı](https://brave.com/)'da da bulunur. - -### Mix {#mix} - -11 Ağustos 2016'da kullanımdan kaldırılmıştır - -**Özet** - -Mix, geliştiricilerin Ethereum'da akıllı sözleşme oluşturmasını ve dağıtmasını sağlayan, C++'da yazılmış bir IDE idi. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/ethereum/mix) - -**Tarihçe** - -Mix, Ethereum'la ilgili en eski uygulamalardan biridir. [Devcon0'da Gavin Wood tarafından yapılan bu sunuma](https://www.youtube.com/watch?v=hcP_z_wBlaM) göz atın. - -**Alternatifler** - -[Remix](https://remix.ethereum.org/), Solidity/akıllı sözleşme geliştiriciliği, testleri ve dağıtılması için tarayıcıda barındırılan bir IDE'dir. Bir masaüstü seçeneği de vardır. - -### Minimal {#minimal} - -2020'de kullanımdan kaldırılmıştır. - -**Özet** - -Minimal, Ethereum blokzincirinin Go'da yazılmış modüler bir uygulamasıydı. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/umbracle/minimal) - -**Tarihçe** - -Minimal'in yerini [polgon-sdk](https://github.com/0xPolygon/polygon-edge) almıştır - -### Hyperledger Burrow {#hyperledger-burrow} - -2022'de kullanımdan kaldırılmıştır. - -**Özet** - -Hyperledger Burrow, izin verilmiş bir Ethereum akıllı sözleşme blokzincir düğümüydü. Ethereum EVM'yi ve WASM akıllı sözleşme kodunu, izin verilen sanal makinelerde çalıştırmıştır. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/hyperledger/burrow) - -### Mana-Ethereum {#mana-ethereum} - -**Özet** - -Mana-Ethereum, Elixir kullanılarak geliştirilmiş bir Ethereum istemcisiydi. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/mana-ethereum/mana) - -**Tarihçe** - -Mana-Ethereum'un Github deposu, henüz açık bir şekilde arşivlenmemiştir ancak son giriş 2019'da yapılmıştır. - -### Aleth (cpp-ethereum) {#aleth} - -6 Ekim 2021'de kullanımdan kaldırılmıştır - -**Özet** - -Aleth (önceden cpp-ethereum olarak bilinirdi) C++'da yazılmış bir Ethereum istemcisiydi. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/ethereum/aleth) - -**Tarihçe** - -Aleth, 6 Ekim 2021'de kullanımdan kaldırılmadan önce Ethereum'un en popüler üçüncü istemcisiydi. - -**Alternatifler** - -[Geth](https://geth.ethereum.org/), iyi bilinen alternatif bir Ethereum istemcisidir. - -### Ethereum-H {#ethereum-h} - -**Arşivler** - -Ethereum-H arşivleri GitHub'dan kaldırılmıştır. - -**Tarihçe** - -Ethereum-H, Haskell'de yazılmış bir Ethereum istemcisiydi. 2015 civarında kullanımdan kaldırılmıştır. - -**Alternatifler** - -[Geth](https://geth.ethereum.org/), [Nethermind](http://nethermind.io/), [Besu](https://besu.hyperledger.org/en/stable/) ve [Erigon](https://github.com/ledgerwatch/erigon) uygulanabilir alternatif Ethereum istemcileridir - güncel bir Haskell istemcisi yoktur. - -### ruby-ethereum {#ruby-ethereum} - -**Arşivler** - -[ruby-ethereum GitHub deposu](https://github.com/cryptape/ruby-ethereum) - -**Tarihçe** - -ruby-ethereum, Ruby'de yazılmış bir Ethereum istemcisiydi. 2018 civarında kullanımdan kaldırılmıştır. - -**Alternatifler** - -[Geth](https://geth.ethereum.org/), [Nethermind](http://nethermind.io/), [Besu](https://besu.hyperledger.org/en/stable/) and [Erigon](https://github.com/ledgerwatch/erigon) uygulanabilir alternatif Ethereum istemcileridir. Güncel bir Ruby istemcisi yoktur. - -### Parity {#parity} - -2 Haziran 2020'de kullanımdan kaldırılmıştır - -**Özet** - -Parity, Rust'ta yazılmış bir Ethereum istemcisiydi. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/openethereum/parity-ethereum) - -**Tarihçe** - -Ethereum'un ilk yıllarındaki iki önde gelen uygulanabilir istemciden biri olan (diğeri Geth) Parity, ekosistemin çok önemli bir parçasıydı. 2016'daki Şanghay Saldırıları sırasında Parity, Geth gibi istemciler saldırı tarafından durdurulduğunda Ethereum Ağı'nın çalışmaya devam etmesini sağlamıştır, bu da istemci çeşitliliğinin önemini kanıtlar. - -**Alternatifler** - -[Erigon](https://github.com/ledgerwatch/erigon) (önceden Turbo-Geth diye adlandırılıyordu), Go'da yazılmış, verimlilik cephesindeki yeni nesil bir Ethereum istemcisidir. - -**Not:** _Parity Ethereum istemcisinin yerine geçtiği proje olan [OpenEthereum](https://github.com/openethereum/openethereum)**, o tarihten beri kullanımdan kalkmış durumdadır.**_ - -Ethereum.org'daki ["Kendi Ethereum düğümünüzü programlayın"](/developers/docs/nodes-and-clients/run-a-node/#getting-the-client) kaynağı, bir Ethereum istemcisini indirme, kurma ve çalıştırma bölümlerini kapsar. - -### Trinity {#trinity} - -1 Temmuz 2021'de kullanımdan kaldırılmıştır - -**Özet** - -Trinity, topluluk için bir araştırma ve eğitim aracı olarak hizmet eden python tabanlı bir Ethereum istemcisiydi. Trinity ile ilgisi olan çok sayıda python tabanlı modül, hala aynı takım tarafından yönetilmektedir; bunlara, [Py-EVM](https://github.com/ethereum/py-evm) de dahildir. - -**Arşivler** - -[Arşivlenmiş GitHub deposu](https://github.com/ethereum/trinity) - -**Tarihçe** - -Trinity, python tabanlı ilk Ethereum istemcilerinden biri olan [pyethereum](https://github.com/ethereum/pyethereum/tree/b704a5c6577863edc539a1ec3d2620a443b950fb)'un yerine almıştır. - -**Alternatifler** - -Ethereum.org'daki ["Kendi Ethereum düğümünüzü programlayın"](/developers/docs/nodes-and-clients/run-a-node/#getting-the-client) kaynağı, bir Ethereum istemcisini indirme, kurma ve çalıştırma bölümlerini kapsar. - -[EthereumJS](https://github.com/ethereumjs) projesi de Trinity ile benzer bir araştırma ve eğitim amaçlı kullanım senaryosuna sahiptir. - -## Merkeziyetsiz Uygulamalar ve Hizmetler {#dapps-and-services} - -Bu bölüm, Ethereum Ana Ağı'na ve EVM tabanlı diğer ağlara dağıtılmış olan hizmetlere yöneliktir. Buradaki merkeziyetsiz uygulama ve hizmetlerin bakımsızlık, protokol değişiklikleri, vs. gibi sebeplerden hack'lenmiş ya da güvenlik açıklarına sahip olan DeFi uygulamalarını kapsayabileceğini göz önünde bulundurun. - -### Cover Protokolü {#cover-protocol} - -2021 sonbaharında kapatılmıştır - -**Özet** - -Cover, Ethereum ve diğer EVM tabanlı ağlarda çalışan bir DeFi sigorta protokolüydü. - -**Arşivler** - -[Web sitesi](https://wayback.archive-it.org/17679/20211004074635/https://www.coverprotocol.com/) - -[Medium makaleleri](https://wayback.archive-it.org/17679/20211004074633/https://coverprotocol.medium.com/) - -[Github depoları](https://github.com/CoverProtocol/cover-core-v1) - -[Dokümanlar](https://wayback.archive-it.org/17679/20211004074634/https://docs.coverprotocol.com/) - -### DAO {#the-dao} - -2016 yazında hack'lenmiş ve kapatılmıştır - -**Özet** - -DAO, projelerin fonlanmasını organize etmeye yönelik bir akıllı sözleşme, merkeziyetsiz uygulama ve forumdu. Bir güvenlik açığından faydalanarak ETH'nin çoğu boşaltıldı, bu da DAO'ya yatırmış olanların ETH'lerini geri vermek için topluluk tarafından organize edilen bir sert çatallanmayı beraberinde getirdi. UX ön yüzü ve forum kapatıldı. - -**Arşivler** - -[14 Mayıs 2016 tarihli "daohub.org" İnternet Arşivi](https://web.archive.org/web/20160514105232/https://daohub.org/) - -**Tarihçe** - -DAO başarısız olmasına rağmen, konsept devam ettirildi. DAO için geliştirilmiş temel teknik, sosyal ve yönetişim özellikli model, DeFi, NFT ve proje fonlama topluluklarında yaygın biçimde kullanılmaktadır. - -[ethereum.org'daki "DAO Çatallanması"](/history/#dao-fork) - -["DAO" için Wikipedia girdisi]() - -**Alternatifler** - -[ethereum.org'daki "DAO'lar"](/dao/) - -[MolochDAO](https://www.molochdao.com/) - -[Gitcoin Hibeleri](https://gitcoin.co/grants/) - -### SparkPool {#sparkpool} - -2021 sonbaharında kapatılmıştır - -**Özet** - -Merkezi Hangzhou'da bulunan Sparkpool hizmeti ve topluluğu, dünyanın Ethereum merkezli madencilik havuzlarının en büyüklerinden biriydi. - -**Arşivler** - -**Tarihçe** - -EthFans topluluğu ile ilişkili olan hizmet, 2015'te başlatıldı. Spankpool, yasal düzenlemelerin daha katı hale gelmesinin sonucu olarak 2021 sonbaharında dağıldı. - -**Alternatifler** - -[Ethermine](https://ethermine.org/) - -## Dokümantasyon ve Bilgi Kaynakları {#documentation-and-information-sources} - -Şu anda kaldırılmış ya da mevcut olmasına rağmen sürdürülmeyen sayısız dokümantasyon, makale, öğretici ve forum kaynağı vardır. Önemli olan ya da güncel durumu kullanımdan kaldırılmış olmasına rağmen kafa karışıklığına ya da dolandırıcılık girişimlerine sebep olabilecek birkaç taneyi seçtik. - -### Legacy Wiki ve eth.wiki {#eth-wiki} - -**Özet** - -Legacy Wiki ve eth.wiki, topluluğun geneli için Ethereum Foundation tarafından yönetilen wiki'lerdi. Bunlar, daha çok Ethereum platformunun temel yönleri hakkında detaylı açıklamaları ve teknik yol haritalarının özetlerini barındırmaya yöneliklerdi. - -**Arşivler** - -[eth.wiki için arşivlenmiş GitHub deposu](https://github.com/ethereum/eth-wiki) - -[Legacy Wiki için arşivlenmiş bir GitHub deposu](https://github.com/ethereum/wiki/wiki) - -**Tarihçe** - -Legacy Wiki, bir GitHub wiki'siydi ve teknik içeriklerden (orijinal Ethereum Tanıtım Belgesi de dahil) oluşan erken bir alandı. Ethereum geliştiricileri, zaman içinde kendi dokümantasyonlarını, spesifikasyonlarını ve teknik açıklama çalışmalarını [Dokümanları Okuyun](https://readthedocs.org/) gibi diğer platformlara ve GitHub'da barındırılan içeriklere taşıdılar. - -2019 ve 2020'de eth.wiki, Legacy Wiki'nin yerini aldı ancak katkıda bulunan katılımcılardan oluşan sağlam bir topluluk oluşmadı. - -**Alternatifler** - -Topluluk tarafından yönetilen içerik: [Ethereum.org Web Sitesi](/) - -Ethereum yazılım projeleri, genelde dokümantasyonlarını [Dokümanları Okuyun](https://readthedocs.org/) içinde barındırır - -Github'da barındırılan teknik spesifikasyonlar: [EIP'ler](https://github.com/ethereum/EIPs), [Yürütüm Spesifikasyonları](https://github.com/ethereum/execution-specs), [Mutabakat Spesifikasyonları](https://github.com/ethereum/consensus-specs) - -### forum.ethereum.org {#forum-ethereum-org} - -**Özet** - -Ethereum Topluluk Forumu, Ethereum Foundation tarafından yönetilen ve Vanilla Forums üzerinde barındırılan bir tartışma panosuydu. Bu pano, "forum.ethereum.org" alt etki alanını kullanıyordu. - -**Arşivler** - -Arşiv URL'si: [https://wayback.archive-it.org/16516/20210618210825/https://forum.ethereum.org/](https://wayback.archive-it.org/16516/20210618210825/https://forum.ethereum.org/) - -**Tarihçe** - -Bu Forum, erken dönemlerde Ethereum topluluğunun "resmi" tartışma panosuydu. Forum, [/r/ethereum](https://reddit.com/r/ethereum) ve birkaç Skype kanalı ile birlikte geliştiriciler, tasarımcılar ve idareciler için önemli bir koordinasyon noktasıydı. Yıllar geçtikçe Forumun katılımcıları başka yerlere geçti ve burası daha çok bir madencilik topluluğuna dönüştü. - -**Alternatifler** - -[/r/ethereum](https://reddit.com/r/ethereum) ve çok sayıda DAO Forum ile Discord sunucusu. - -## Gitter Kanalları {#gitter-channels} - -### AllCoreDevs {#allcorewdevs-gitter} - -**Özet** - -AllCoreDevs Gitter, [Ethereum istemcisinin temel geliştiricileri](https://github.com/ethereum/pm/) için herkese açık ana koordinasyon iletişim kanalıydı. - -**Arşivler** - -[ethereum/AllCoreDevs Gitter Kanalı](https://gitter.im/ethereum/AllCoreDevs) - -**Alternatifler** - -Lütfen [EthR&D Discord Sunucusu](https://discord.gg/qHv7AjTDuK)'ndaki "allcoredevs" kanalını kullanın - -### EthereumJS {#ethereumjs-gitter} - -**Özet** - -EthereumJS Gitter, [EthereumJS projesinin](https://ethereumjs.github.io/) herkese açık ana koordinasyon iletişim kanalıydı. - -**Arşivler** - -[ethereum/EthereumJS Gitter Kanalı](https://gitter.im/ethereum/ethereumjs) - -**Alternatifler** - -Lütfen [EthereumJS Discord Sunucusu](https://discord.gg/TNwARpR)'nu kullanın 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/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/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/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} diff --git a/public/content/translations/tr/developers/docs/standards/tokens/erc-4626/index.md b/public/content/translations/tr/developers/docs/standards/tokens/erc-4626/index.md index b250f310747..5818153d8f3 100644 --- a/public/content/translations/tr/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/translations/tr/developers/docs/standards/tokens/erc-4626/index.md @@ -204,4 +204,4 @@ event Withdraw( ## Daha fazla okuma {#further-reading} - [EIP-4626: Tokenize edilmiş kasa Standartı](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626: GitHub Deposu](https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol) +- [ERC-4626: GitHub Deposu](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) diff --git a/public/content/translations/tr/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/tr/developers/tutorials/erc20-with-safety-rails/index.md index e96ef9f01cd..0a1dc2d5b96 100644 --- a/public/content/translations/tr/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/tr/developers/tutorials/erc20-with-safety-rails/index.md @@ -24,7 +24,7 @@ Bütün kaynak kodunu görmek isterseniz: ## ERC-20 sözleşmesi oluşturma {#creating-an-erc-20-contract} -Güvenlik önlemi işlevini eklemeden önce bize bir ERC-20 sözleşmesi lazım. Bu makalede [OpenZeppelin'in Sözleşme Sihirbazı'nı](https://docs.openzeppelin.com/contracts/4.x/wizard) kullanacağız. Başka bir sekmede açın ve şu yönergeleri izleyin: +Güvenlik önlemi işlevini eklemeden önce bize bir ERC-20 sözleşmesi lazım. Bu makalede [OpenZeppelin'in Sözleşme Sihirbazı'nı](https://docs.openzeppelin.com/contracts/5.x/wizard) kullanacağız. Başka bir sekmede açın ve şu yönergeleri izleyin: 1. **ERC20**'yi seçin. 2. Bu ayarları girin: 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/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/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..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/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/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..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-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/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/tr/roadmap/index.md b/public/content/translations/tr/roadmap/index.md index 0783b9e5311..cce125f28fb 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: @@ -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/) 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/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/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/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/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/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/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-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-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..6d21cc63613 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/consensus-mechanisms/pow/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..02fff06f373 100644 --- a/public/content/translations/zh-tw/roadmap/index.md +++ b/public/content/translations/zh-tw/roadmap/index.md @@ -3,11 +3,11 @@ title: 以太坊開發藍圖 description: 以太坊實現更高可擴容性、安全性和永續性的路徑。 lang: zh-tw template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg 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..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 @@ -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..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} 零知識證明能證明某陳述有效、卻又無需揭示陳述本身。 「證明者」是試圖證明主張的一方,「驗證者」則負責驗證該主張。 @@ -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/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} 开发和维护最全面、触手可及的以太坊知识中心。 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} **每个月,世界各地都会举办大型以太坊活动。**你可以考虑参加附近的一个活动,认识更多的社区成员,了解就业机会,并培养新的技能。 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 3bb3491e867..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 { @@ -578,7 +623,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ 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/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} - -_还有哪些社区资源对您有所帮助? 请编辑本页面并添加!_ 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} 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”哈希值。 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/standards/tokens/erc-4626/index.md b/public/content/translations/zh/developers/docs/standards/tokens/erc-4626/index.md index aa62acf992e..767caf4b09e 100644 --- a/public/content/translations/zh/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/translations/zh/developers/docs/standards/tokens/erc-4626/index.md @@ -204,4 +204,4 @@ event Withdraw( ## 延伸阅读 {#further-reading} - [EIP-4626:代币化资金库标准](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626: GitHub Repo](https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol) +- [ERC-4626: GitHub Repo](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) 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/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/) 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/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..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/testing-smart-contract-with-waffle/) +- [使用 Waffle 测试智能合约](/developers/tutorials/waffle-test-simple-smart-contract/) 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..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-hello-world-with-buidler-tutorial/) +- [Waffle 使用 hardhat 和 ethers 设置 hello world 的教程](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/) 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/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/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/)类似,但有许多不同之处。 挖矿的前期支出庞大,需要投入强大的硬件和消耗大量能源,从而产生规模经济并促进集中化。 挖矿也没有提出任何将资产锁定作为抵押品的要求,这限制了被攻击后协议惩罚不良行为者的能力。 和工作量证明相比,过渡到权益证明让以太坊的安全性与去中心化得到显著提升。 参与该网络的人越多,网络去中心化程度越高,面临攻击时也越安全。 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} 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/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 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. diff --git a/public/dapps/skiff.png b/public/dapps/skiff.png deleted file mode 100644 index 0adada597f7..00000000000 Binary files a/public/dapps/skiff.png and /dev/null differ diff --git a/public/deprecated-software/parity-logo-5chdn.svg b/public/deprecated-software/parity-logo-5chdn.svg deleted file mode 100644 index 03d1903324c..00000000000 --- a/public/deprecated-software/parity-logo-5chdn.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 37 \ No newline at end of file diff --git a/public/deprecated-software/sparkpool-logo-05f46574eac2ad_876.png b/public/deprecated-software/sparkpool-logo-05f46574eac2ad_876.png deleted file mode 100644 index 01d8d96f342..00000000000 Binary files a/public/deprecated-software/sparkpool-logo-05f46574eac2ad_876.png and /dev/null differ diff --git a/public/layer-2/base.png b/public/layer-2/base.png new file mode 100644 index 00000000000..8293da7a78f Binary files /dev/null and b/public/layer-2/base.png differ diff --git a/public/layer-2/growthepie.png b/public/layer-2/growthepie.png new file mode 100644 index 00000000000..39f5291602e Binary files /dev/null and b/public/layer-2/growthepie.png differ 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 diff --git a/public/upgrades/upgrade_doge.png b/public/upgrades/upgrade_doge.png deleted file mode 100644 index 7a488669ed9..00000000000 Binary files a/public/upgrades/upgrade_doge.png and /dev/null differ diff --git a/public/wallets/aktionariat.png b/public/wallets/aktionariat.png deleted file mode 100644 index 6b8ab9a6179..00000000000 Binary files a/public/wallets/aktionariat.png and /dev/null differ diff --git a/public/wallets/aurox.png b/public/wallets/aurox.png new file mode 100644 index 00000000000..4caeaadc529 Binary files /dev/null and b/public/wallets/aurox.png differ diff --git a/public/wallets/brave.png b/public/wallets/brave.png deleted file mode 100644 index 772c0f22e2c..00000000000 Binary files a/public/wallets/brave.png and /dev/null differ diff --git a/public/wallets/mycrypto.png b/public/wallets/mycrypto.png deleted file mode 100644 index 2358abc7a44..00000000000 Binary files a/public/wallets/mycrypto.png and /dev/null differ diff --git a/public/wallets/numio.png b/public/wallets/numio.png deleted file mode 100644 index 42423f48060..00000000000 Binary files a/public/wallets/numio.png and /dev/null differ diff --git a/public/wallets/opera.png b/public/wallets/opera.png deleted file mode 100644 index 3fe453e467e..00000000000 Binary files a/public/wallets/opera.png and /dev/null differ diff --git a/public/wallets/portis.png b/public/wallets/portis.png deleted file mode 100644 index 562cbd229e9..00000000000 Binary files a/public/wallets/portis.png and /dev/null differ diff --git a/public/wallets/sequence.png b/public/wallets/sequence.png deleted file mode 100644 index 00268aef5ca..00000000000 Binary files a/public/wallets/sequence.png and /dev/null differ diff --git a/public/wallets/shapeshift.png b/public/wallets/shapeshift.png deleted file mode 100644 index 679b1a29cda..00000000000 Binary files a/public/wallets/shapeshift.png and /dev/null differ diff --git a/public/wallets/status.png b/public/wallets/status.png deleted file mode 100644 index 1c65198a221..00000000000 Binary files a/public/wallets/status.png and /dev/null differ diff --git a/public/wallets/web3auth.png b/public/wallets/web3auth.png deleted file mode 100644 index 40bf9713101..00000000000 Binary files a/public/wallets/web3auth.png and /dev/null differ diff --git a/src/@chakra-ui/foundations/spacing.ts b/src/@chakra-ui/foundations/spacing.ts index b1c918a4759..6f5271b1c7a 100644 --- a/src/@chakra-ui/foundations/spacing.ts +++ b/src/@chakra-ui/foundations/spacing.ts @@ -1,6 +1,7 @@ const spacing = { 7.5: "1.875rem", 10.5: "2.625rem", + 19: "4.75rem", // Nav height } export default spacing diff --git a/src/@chakra-ui/semanticTokens.ts b/src/@chakra-ui/semanticTokens.ts index 9e20353d72b..9b81ae3c21a 100644 --- a/src/@chakra-ui/semanticTokens.ts +++ b/src/@chakra-ui/semanticTokens.ts @@ -105,6 +105,12 @@ 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/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) - )} + )} */} ) diff --git a/src/components/Breadcrumbs/index.tsx b/src/components/Breadcrumbs/index.tsx index 4a3aa0c1231..9c9fafb3a7c 100644 --- a/src/components/Breadcrumbs/index.tsx +++ b/src/components/Breadcrumbs/index.tsx @@ -36,17 +36,12 @@ type Crumb = { // { fullPath: "/en/eth2/", text: "ETH2" }, // { fullPath: "/en/eth2/proof-of-stake/", text: "PROOF OF STAKE" }, // ] -const Breadcrumbs = ({ - slug: originalSlug, - startDepth = 0, - ...props -}: BreadcrumbsProps) => { +const Breadcrumbs = ({ slug, startDepth = 0, ...props }: BreadcrumbsProps) => { const { t } = useTranslation("common") const { locale, asPath } = useRouter() const dir = isLangRightToLeft(locale! as Lang) ? "rtl" : "ltr" const hasHome = asPath !== "/" - const slug = originalSlug.replace(`/${locale}/`, "/") const slugChunk = slug.split("/") const sliced = slugChunk.filter((item) => !!item) diff --git a/src/components/DevconGrantsBanner.tsx b/src/components/DevconGrantsBanner.tsx new file mode 100644 index 00000000000..8548eb55a87 --- /dev/null +++ b/src/components/DevconGrantsBanner.tsx @@ -0,0 +1,30 @@ +import { Text } from "@chakra-ui/react" + +import DismissableBanner from "@/components/Banners/DismissableBanner" +import Emoji from "@/components/Emoji" +import Link from "@/components/Link" + +type DevconGrantsBannerProps = { + pathname: string +} + +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. + + + + ) + } + + return null +} + +export default DevconGrantsBanner diff --git a/src/components/FeedbackWidget.tsx b/src/components/FeedbackWidget.tsx index acd03a04bf9..0e13b47fb4f 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 ( - ) : ( + {/* Body: */} + {feedbackSubmitted && ( <> - - + {t("feedback-widget-thank-you-timing")} + )} - + + + {feedbackSubmitted ? ( + + ) : ( + <> + + + + )} + + 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} diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 0dd81c711dd..d1590c8bbd6 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -311,6 +311,7 @@ const Footer = ({ lastDeployDate }: FooterProps) => { hideArrow color="secondary" aria-label={link.ariaLabel} + ms={4} > { "color 0.2s ease-in-out, transform 0.2s ease-in-out", }} fontSize="4xl" - ms={4} /> ) diff --git a/src/components/Hero/HubHero/index.tsx b/src/components/Hero/HubHero/index.tsx index 968940a3662..05770a716e5 100644 --- a/src/components/Hero/HubHero/index.tsx +++ b/src/components/Hero/HubHero/index.tsx @@ -13,7 +13,7 @@ const HubHero = ({ buttons, }: CommonHeroProps) => { if (buttons && buttons.length > 2) { - throw Error( + throw new Error( "Can not 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} diff --git a/src/components/History/NetworkUpgradeSummary.tsx b/src/components/History/NetworkUpgradeSummary.tsx index 6e69957897d..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)} ) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx new file mode 100644 index 00000000000..e1ec58213e3 --- /dev/null +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -0,0 +1,133 @@ +import { useRouter } from "next/router" +import { useTranslation } from "next-i18next" +import { BsCheck } from "react-icons/bs" +import { + Badge, + Box, + Flex, + forwardRef, + Icon, + MenuItem as ChakraMenuItem, + type MenuItemProps as ChakraMenuItemProps, + Text, +} from "@chakra-ui/react" + +import type { LocaleDisplayInfo } from "@/lib/types" + +import { BaseLink } from "@/components/Link" + +import ProgressBar from "./ProgressBar" + +type ItemProps = ChakraMenuItemProps & { + displayInfo: LocaleDisplayInfo +} + +const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { + const { + localeOption, + sourceName, + targetName, + approvalProgress, + wordsApproved, + 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 { progress, words } = getProgressInfo(approvalProgress, wordsApproved) + + return ( + { + e.target.scrollIntoView({ block: "nearest" }) + }} + scrollMarginY="8" + _hover={{ + bg: "primary.lowContrast", + textDecoration: "none", + "p.language-name": { color: "primary.base" }, + }} + _focus={{ bg: "primary.lowContrast" }} + sx={{ + p: { + textDecoration: "none", + overflow: "hidden", + textOverflow: "ellipsis", + whiteSpace: "nowrap", + }, + }} + href={asPath} + locale={localeOption} + {...props} + > + + + + + {targetName} + + {isBrowserDefault && ( + + {t("page-languages-browser-default")} + + )} + + + {sourceName} + + + {isCurrent && ( + + )} + + + {progress} {t("page-languages-translated")} • {words}{" "} + {t("page-languages-words")} + + + + ) +}) + +export default MenuItem diff --git a/src/components/LanguagePicker/NoResultsCallout.tsx b/src/components/LanguagePicker/NoResultsCallout.tsx new file mode 100644 index 00000000000..e45916839de --- /dev/null +++ b/src/components/LanguagePicker/NoResultsCallout.tsx @@ -0,0 +1,33 @@ +import { useTranslation } from "next-i18next" +import { FormHelperText, forwardRef, Text } from "@chakra-ui/react" + +import { BaseLink } from "@/components/Link" + +import MenuItem from "./MenuItem" + +type NoResultsCalloutProps = { onClose: () => void } + +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/ProgressBar.tsx b/src/components/LanguagePicker/ProgressBar.tsx new file mode 100644 index 00000000000..06bb008923f --- /dev/null +++ b/src/components/LanguagePicker/ProgressBar.tsx @@ -0,0 +1,19 @@ +import { Progress, ProgressProps } from "@chakra-ui/react" + +type ProgressBarProps = Pick + +const ProgressBar = ({ value }: ProgressBarProps) => ( + +) + +export default ProgressBar diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx new file mode 100644 index 00000000000..8c345b3f4cd --- /dev/null +++ b/src/components/LanguagePicker/index.tsx @@ -0,0 +1,234 @@ +import { + Box, + Flex, + FormControl, + FormLabel, + Input, + InputGroup, + InputRightElement, + Kbd, + Menu, + MenuList, + type MenuListProps, + type MenuProps, + Text, + type UseDisclosureReturn, + useEventListener, +} from "@chakra-ui/react" + +import { Button } from "@/components/Buttons" +import { BaseLink } from "@/components/Link" + +import MenuItem from "./MenuItem" +import NoResultsCallout from "./NoResultsCallout" +import { useLanguagePicker } from "./useLanguagePicker" + +type LanguagePickerProps = Omit & { + children: React.ReactNode + placement?: MenuProps["placement"] + handleClose?: () => void + menuState?: UseDisclosureReturn +} + +const LanguagePicker = ({ + children, + placement, + handleClose, + menuState, + ...props +}: LanguagePickerProps) => { + const { + t, + refs, + disclosure, + filterValue, + setFilterValue, + filteredNames, + handleInputFocus, + } = 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 */} + + + + + {/* Main Language selection menu */} + + + + {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() + } + }} + onFocus={handleInputFocus} + /> + + + \ + + + + + {filteredNames.map((displayInfo, index) => ( + { + if (e.key !== "\\") return + e.preventDefault() + inputRef.current?.focus() + }} + onClick={() => + onClose({ + eventAction: "Locale chosen", + eventName: displayInfo.localeOption, + }) + } + /> + ))} + + {filteredNames.length === 0 && ( + + onClose({ + eventAction: "Translation program link (no results)", + eventName: "/contributing/translation-program", + }) + } + /> + )} + + + + {/* Footer callout */} + + + {t("page-languages-recruit-community")}{" "} + + onClose({ + eventAction: "Translation program link (menu footer)", + eventName: "/contributing/translation-program", + }) + } + > + {t("common:learn-more")} + + + + + + ) +} + +export default LanguagePicker diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx new file mode 100644 index 00000000000..1063ca0b15f --- /dev/null +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -0,0 +1,223 @@ +import { useEffect, useRef, useState } from "react" +import { useRouter } from "next/router" +import { useTranslation } from "next-i18next" +import { useDisclosure, type UseDisclosureReturn } from "@chakra-ui/react" + +import type { + I18nLocale, + Lang, + LocaleDisplayInfo, + ProjectProgressData, +} from "@/lib/types" + +import { MatomoEventOptions, trackCustomEvent } from "@/lib/utils/matomo" +import { filterRealLocales, languages } from "@/lib/utils/translations" + +import progressDataJson from "@/data/translationProgress.json" + +import { DEFAULT_LOCALE } from "@/lib/constants" + +const progressData = progressDataJson satisfies ProjectProgressData[] + +export const useLanguagePicker = ( + handleClose?: () => void, + menuState?: UseDisclosureReturn +) => { + const { t } = useTranslation("page-languages") + const { locale, locales: rawLocales } = useRouter() + const refs = { + inputRef: useRef(null), + firstItemRef: useRef(null), + noResultsRef: useRef(null), + footerRef: useRef(null), + } + const [filterValue, setFilterValue] = useState("") + + const [filteredNames, setFilteredNames] = useState([]) + + // 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) + + // 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 + + // 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) // Falls back to English namespace if not found + + // If i18nSource (fetched from `language-{locale}` in current namespace) + // is not translated (output === englishName), or not available + // (output === i18nKey), use the Intl.DisplayNames result as fallback + const sourceName = [i18nKey, englishName].includes(i18nSource) + ? 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 + : Math.floor( + (dataItem!.words.approved / dataItem!.words.total) * 100 + ) || 0 + + if (progressData.length === 0) + throw new Error( + "Missing translation progress data; check GitHub action" + ) + + const totalWords = progressData[0].words.total + + const wordsApproved = + localeOption === DEFAULT_LOCALE + ? totalWords || 0 + : dataItem?.words.approved || 0 + + const isBrowserDefault = browserLocales.includes(localeOption) + + return { + localeOption, + approvalProgress, + sourceName, + targetName, + englishName, + wordsApproved, + isBrowserDefault, + } + } + + const displayNames: LocaleDisplayInfo[] = + (locales as Lang[])?.map(localeToDisplayInfo).sort((a, b) => { + 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 + }) || [] + + setFilteredNames( + displayNames.filter( + ({ localeOption, sourceName, targetName, englishName }) => + (localeOption + sourceName + targetName + englishName) + .toLowerCase() + .includes(filterValue.toLowerCase()) + ) + ) + }, [filterValue, locale, rawLocales, t]) + + const { isOpen, ...menu } = useDisclosure() + + const eventBase: Pick = { + eventCategory: `Language picker`, + eventAction: "Open or close language picker", + } + + const onOpen = () => { + menu.onOpen() + menuState?.onOpen() + 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?: Required> & + Partial + ): void => { + setFilterValue("") + handleClose && handleClose() + menu.onClose() + menuState?.onClose() + trackCustomEvent( + (customMatomoEvent + ? { ...eventBase, ...customMatomoEvent } + : { ...eventBase, eventName: "Closed" }) satisfies MatomoEventOptions + ) + } + + /** + * 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, + disclosure: { isOpen, onOpen, onClose }, + filterValue, + setFilterValue, + filteredNames, + handleInputFocus, + } +} diff --git a/src/components/Nav/Dropdown.tsx b/src/components/Nav/Dropdown.tsx index d83dd814847..1108cf0cc8f 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 type NavDropdownProps = { children?: React.ReactNode - section: ISection + section: NavSectionDetail } const NavDropdown = ({ children, section }: NavDropdownProps) => { @@ -72,7 +72,7 @@ const NavDropdown = ({ children, section }: NavDropdownProps) => { } } - const ariaLabel = section.ariaLabel || section.text + const ariaLabel = section.ariaLabel || section.label return ( { }, }} > - {section.text} + {section.label} { - // const { locale } = useRouter() - const direction = "ltr" - // const direction = getDirection(language as Lang) - const shouldShowSubNav = path.includes("/developers/") - - const { useEthereum, learn, ...restSections } = sections - - const [start, basics, protocol] = learn.items - - return ( - - - {useEthereum.items.map((item, index) => ( - - - {item.text} - - - ))} - - - - - - {[start, basics].map((section, index) => ( - - {section.text} - {(section.items || []).map((item, index) => ( - - - {item.text} - - - ))} - - ))} - -
      - - {protocol.text} - {(protocol.items || []).map((item, index) => ( - - - {item.text} - - - ))} - -
      -
      -
      - - {Object.keys(restSections).map((sectionKey) => { - const section = restSections[sectionKey] - - return ( - - {section.items.map((item, index) => ( - - - {item.text} - - - ))} - - ) - })} -
      - ) -} - -export default Menu diff --git a/src/components/Nav/Menu/ItemContent.tsx b/src/components/Nav/Menu/ItemContent.tsx new file mode 100644 index 00000000000..b665dbb47b5 --- /dev/null +++ b/src/components/Nav/Menu/ItemContent.tsx @@ -0,0 +1,38 @@ +import { useRouter } from "next/router" +import { Box, Text } from "@chakra-ui/react" + +import { cleanPath } from "@/lib/utils/url" + +import type { Level, NavItem } from "../types" + +import { useNavMenuColors } from "@/hooks/useNavMenuColors" + +type ItemProps = { + item: NavItem + lvl: Level +} + +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 + + return ( + + + {label} + + + {description} + + + ) +} + +export default ItemContent diff --git a/src/components/Nav/Menu/NextChevron.tsx b/src/components/Nav/Menu/NextChevron.tsx new file mode 100644 index 00000000000..c79cea234b5 --- /dev/null +++ b/src/components/Nav/Menu/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/Menu/SubMenu.tsx b/src/components/Nav/Menu/SubMenu.tsx new file mode 100644 index 00000000000..1d1ed7b1375 --- /dev/null +++ b/src/components/Nav/Menu/SubMenu.tsx @@ -0,0 +1,162 @@ +import { AnimatePresence, motion } from "framer-motion" +import NextLink from "next/link" +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" +import Link from "@/components/Link" + +import { trackCustomEvent } from "@/lib/utils/matomo" +import { cleanPath } from "@/lib/utils/url" + +import type { Level, NavItem, NavSectionKey } from "../types" + +import ItemContent from "./ItemContent" +import NextChevron from "./NextChevron" +import { useSubMenu } from "./useSubMenu" + +type LvlContentProps = { + lvl: Level + items: NavItem[] + activeSection: NavSectionKey | null + onClose: () => void +} + +/** + * Content for each sub-menu below top-level navigation + * Content renders inside sibling Viewport + * @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 SubMenu = ({ lvl, items, activeSection, onClose }: LvlContentProps) => { + const { asPath, locale, menuColors, menuVariants, PADDING } = useSubMenu() + + if (lvl > 3) return null + + const templateColumns = `repeat(${4 - lvl}, 1fr)` + + 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: -PADDING, + sx: { + "span:first-of-type": { m: 0, me: 4 }, // Spacing for icon + }, + py: PADDING, + bg: isActivePage + ? menuColors.lvl[lvl].activeBackground + : "none", + _hover: activeStyles, + _focus: activeStyles, + variant: "ghost", + } + return ( + + + {isLink ? ( + + + + + + ) : ( + <> + + + + + + + + + + )} + + + ) + })} + + + + + + + ) +} + +export default SubMenu diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx new file mode 100644 index 00000000000..9523bae94ec --- /dev/null +++ b/src/components/Nav/Menu/index.tsx @@ -0,0 +1,106 @@ +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" + +import { SECTION_LABELS } from "@/lib/constants" + +import type { NavSections } from "../types" + +import SubMenu from "./SubMenu" +import { useNavMenu } from "./useNavMenu" + +type NavMenuProps = BoxProps & { + sections: NavSections +} + +const Menu = ({ sections, ...props }: NavMenuProps) => { + const { + activeSection, + containerVariants, + direction, + handleSectionChange, + isOpen, + menuColors, + onClose, + } = useNavMenu(sections) + + return ( + + + + + {SECTION_LABELS.map((sectionKey) => { + const { label, items } = sections[sectionKey] + const isActive = activeSection === sectionKey + return ( + + + + + + {/** + * This is the CONTAINER for all three menu levels + * This renders inside the NavigationMenu.Viewport component + */} + + + + + + ) + })} + + + + + + + ) +} + +export default Menu diff --git a/src/components/Nav/Menu/useNavMenu.ts b/src/components/Nav/Menu/useNavMenu.ts new file mode 100644 index 00000000000..cfe78516222 --- /dev/null +++ b/src/components/Nav/Menu/useNavMenu.ts @@ -0,0 +1,54 @@ +import { useState } from "react" +import type { MotionProps } from "framer-motion" + +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)) + } + + const isOpen = activeSection !== null + + const onClose = () => { + setActiveSection(null) + } + + const containerVariants: MotionProps["variants"] = { + open: { + opacity: 1, + maxHeight: "100vh", + transition: { duration: 0.2 }, + }, + closed: { + opacity: 0, + }, + } + + return { + activeSection, + containerVariants, + direction, + handleSectionChange, + isOpen, + menuColors, + onClose, + } +} diff --git a/src/components/Nav/Menu/useSubMenu.ts b/src/components/Nav/Menu/useSubMenu.ts new file mode 100644 index 00000000000..7d99f4ae67e --- /dev/null +++ b/src/components/Nav/Menu/useSubMenu.ts @@ -0,0 +1,26 @@ +import type { MotionProps } from "framer-motion" +import { useRouter } from "next/router" + +import { useNavMenuColors } from "@/hooks/useNavMenuColors" +import { useRtlFlip } from "@/hooks/useRtlFlip" + +const PADDING = 4 // Chakra-UI space token + +export const useSubMenu = () => { + const { asPath, locale } = useRouter() + const menuColors = useNavMenuColors() + const { isRtl } = useRtlFlip() + + const menuVariants: MotionProps["variants"] = { + closed: { opacity: 0, scaleX: 0.9, originX: isRtl ? 1 : 0 }, + open: { opacity: 1, scaleX: 1, originX: isRtl ? 1 : 0 }, + } + + return { + asPath, + locale, + menuColors, + menuVariants, + PADDING, + } +} diff --git a/src/components/Nav/Mobile.tsx b/src/components/Nav/Mobile.tsx deleted file mode 100644 index 1f01091d0f8..00000000000 --- a/src/components/Nav/Mobile.tsx +++ /dev/null @@ -1,293 +0,0 @@ -import React, { Fragment, ReactNode, RefObject } from "react" -import { motion } from "framer-motion" -import { useTranslation } from "next-i18next" -import { MdBrightness2, MdLanguage, MdSearch, MdWbSunny } from "react-icons/md" -import { - Box, - ButtonProps, - Drawer, - DrawerBody, - DrawerContent, - DrawerFooter, - DrawerOverlay, - Flex, - forwardRef, - Icon, - List, - ListItem, -} from "@chakra-ui/react" - -import type { ChildOnlyProp } from "../../lib/types" -import { Button } from "../Buttons" -import { BaseLink } from "../Link" - -import { ISections } from "./types" - -const NavListItem = forwardRef<{ "aria-label"?: string }, typeof List>( - (props, ref) => -) - -const SectionItem = forwardRef((props, ref) => ( - -)) - -const StyledNavLink = (props: { - to: string - isPartiallyActive: boolean - children: ReactNode -}) => ( - -) - -const FooterItem = forwardRef((props, ref) => ( - -)) - -const FooterItemText = (props: ChildOnlyProp) => ( - -) - -const hamburgerSvg = - "M 2 13 l 10 0 l 0 0 l 10 0 M 4 19 l 8 0 M 12 19 l 8 0 M 2 25 l 10 0 l 0 0 l 10 0" -const glyphSvg = - "M 2 19 l 10 -14 l 0 0 l 10 14 M 2 19 l 10 7 M 12 26 l 10 -7 M 2 22 l 10 15 l 0 0 l 10 -15" -const closeSvg = - "M 2 13 l 0 -3 l 20 0 l 0 3 M 7 14 l 10 10 M 7 24 l 10 -10 M 2 25 l 0 3 l 20 0 l 0 -3" - -const glyphPathVariants = { - closed: { - d: hamburgerSvg, - transition: { duration: 0.4 }, - }, - open: { - d: [hamburgerSvg, glyphSvg, glyphSvg, glyphSvg, closeSvg], - transition: { duration: 1.2 }, - }, -} - -export type MobileNavMenuProps = ButtonProps & { - isMenuOpen: boolean - isDarkTheme: boolean - toggleMenu: () => void - toggleTheme: () => void - toggleSearch: () => void - linkSections: ISections - fromPageParameter: string - drawerContainerRef: RefObject -} - -const MobileNavMenu = ({ - isMenuOpen, - isDarkTheme, - toggleMenu, - toggleTheme, - toggleSearch, - linkSections, - fromPageParameter, - drawerContainerRef, - ...props -}: MobileNavMenuProps) => { - const { t } = useTranslation("common") - - const handleClick = (): void => { - toggleMenu() - } - - return ( - <> - - - - - - - {Object.keys(linkSections).map((sectionKey, idx) => { - const section = linkSections[sectionKey] - - return section.items ? ( - - - {section.text} - - - {section.items.map((item, idx) => - item.items ? ( - - - {item.text} - - {item.items.map((item, idx) => ( - - - {item.text} - - - ))} - - ) : ( - - - {item.text} - - - ) - )} - - - ) : ( - - - {section.text} - - - ) - })} - - - - { - // Workaround to ensure the input for the search modal can have focus - toggleMenu() - toggleSearch() - }} - > - - {t("search")} - - - - - {t(isDarkTheme ? "light-mode" : "dark-mode")} - - - - - - {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 }) => ( + <> + { + trackCustomEvent({ + eventCategory: "Mobile navigation menu", + eventAction: `Level ${lvl - 1} section changed`, + eventName: `${ + isExpanded ? "Close" : "Open" + } section: ${label} - ${description.slice(0, 16)}...`, + }) + }} + > + + + + + {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..a53b4c525be --- /dev/null +++ b/src/components/Nav/Mobile/MenuBody.tsx @@ -0,0 +1,99 @@ +import { useRouter } from "next/router" +import { + Accordion, + AccordionButton, + AccordionItem, + AccordionPanel, + Box, + DrawerBody, + Heading, +} from "@chakra-ui/react" + +import { trackCustomEvent } from "@/lib/utils/matomo" + +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 { locale } = useRouter() + const menuColors = useNavMenuColors() + + return ( + + + {SECTION_LABELS.map((key) => { + const { label, items } = linkSections[key] + return ( + + {({ isExpanded }) => ( + <> + { + trackCustomEvent({ + eventCategory: "Mobile navigation menu", + eventAction: "Section changed", + eventName: `${ + isExpanded ? "Close" : "Open" + } section: ${locale} - ${key}`, + }) + }} + > + + + + {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 diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx index 5374671b252..5f98ec4ef21 100644 --- a/src/components/Nav/index.tsx +++ b/src/components/Nav/index.tsx @@ -1,40 +1,65 @@ -import React, { FC, useRef } from "react" +import { 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 { BsTranslate } from "react-icons/bs" +import { MdBrightness2, MdWbSunny } from "react-icons/md" +import { + Box, + Button, + Flex, + HStack, + Icon, + MenuButton, + Text, + useColorModeValue, + useDisclosure, + useEventListener, +} from "@chakra-ui/react" -import { ButtonLink, IconButton } from "../Buttons" -import { EthHomeIcon } from "../icons" -import { BaseLink } from "../Link" -import Search from "../Search" +import { IconButton } from "@/components/Buttons" +import { EthHomeIcon } from "@/components/icons" +import LanguagePicker from "@/components/LanguagePicker" +import { BaseLink } from "@/components/Link" +import Search from "@/components/Search" import Menu from "./Menu" import MobileNavMenu from "./Mobile" import { useNav } from "./useNav" -export interface IProps { - path: string -} - // TODO display page title on mobile -const Nav: FC = ({ path }) => { - const { - ednLinks, - fromPageParameter, - isDarkTheme, - shouldShowSubNav, - toggleColorMode, - linkSections, - mobileNavProps, - } = useNav({ path }) +const Nav = () => { + const { toggleColorMode, linkSections, mobileNavProps } = useNav() const { locale } = useRouter() 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 + \) + * or open the language picker (\). + * @param {string} event - The keydown event. + */ + useEventListener("keydown", (e) => { + if (e.key !== "\\") return + e.preventDefault() + if (e.metaKey || e.ctrlKey) { + toggleColorMode() + } else { + if (languagePickerState.isOpen) return + languagePickerRef.current?.click() + } + }) + + const ThemeIcon = useColorModeValue(, ) + const themeIconAriaLabel = useColorModeValue( + "Switch to Dark Theme", + "Switch to Light Theme" + ) return ( - + = ({ path }) => { px={{ base: 4, xl: 8 }} > = ({ path }) => { {/* Desktop */} - - + + - {/* Mobile */} - - + {/* Desktop */} + : } - aria-label={ - isDarkTheme - ? "Switch to Light Theme" - : "Switch to Dark Theme" - } + icon={ThemeIcon} + aria-label={themeIconAriaLabel} variant="ghost" isSecondary - px={1.5} + px={{ base: "2", xl: "3" }} _hover={{ transform: "rotate(10deg)", color: "primary.hover", }} onClick={toggleColorMode} - > - } - variant="ghost" - isSecondary - px={1.5} - _hover={{ - color: "primary.hover", - "& svg": { - transform: "rotate(10deg)", - transition: "transform 0.5s", - }, - }} + /> + + {/* Locale-picker menu */} + - {t("languages")} {locale!.toUpperCase()} - + + + + {t("common:languages")}  + + {locale!.toUpperCase()} + + + {/* Mobile */} + - {shouldShowSubNav && ( - - {ednLinks.map((link, idx) => ( - - {link.text} - - ))} - - )} ) } diff --git a/src/components/Nav/types.ts b/src/components/Nav/types.ts index bac78bda1aa..fb78ad871b9 100644 --- a/src/components/Nav/types.ts +++ b/src/components/Nav/types.ts @@ -1,23 +1,35 @@ -export type SectionKey = - | "useEthereum" - | "learn" - | "developers" - | "enterprise" - | "community" +import type { RefObject } from "react" +import type { IconType } from "react-icons" +import type { IconProps } from "@chakra-ui/react" -export interface IItem { - text: string - to?: string - items?: Array - isPartiallyActive?: boolean -} +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 | ((props: IconProps) => JSX.Element) +} & LinkXorItems + +export type NavSectionKey = + | "learn" + | "use" + | "build" + | "participate" + | "research" -export interface ISection { - text: string +export type NavSectionDetail = { + label: string ariaLabel: string - items: Array + items: NavItem[] } -export type ISections = { - [key in SectionKey]: ISection -} +export type NavSections = Record + +export type Level = 1 | 2 | 3 | 4 + +export type LvlRefs = Record< + "lvl1" | "lvl2" | "lvl3", + RefObject +> diff --git a/src/components/Nav/useNav.ts b/src/components/Nav/useNav.ts index 02f9bdbecaa..9ec78160e9e 100644 --- a/src/components/Nav/useNav.ts +++ b/src/components/Nav/useNav.ts @@ -1,323 +1,501 @@ -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 { + BsBook, + BsBuildings, + BsCodeSquare, + BsCompass, + BsFlag, + BsJournalCode, + BsLayers, + BsLightbulb, + BsMegaphone, + BsMortarboard, + BsPinAngle, + BsSafe, + BsSignpost, + BsSliders, + BsUiChecksGrid, +} from "react-icons/bs" +import { PiFlask, PiUsersFourLight } from "react-icons/pi" +import { + useColorMode, + useColorModeValue, + useDisclosure, +} from "@chakra-ui/react" + +import { EthereumIcon } from "@/components/icons/EthereumIcon" import { trackCustomEvent } from "@/lib/utils/matomo" import { FROM_QUERY } from "@/lib/constants" -import { IItem, ISections } from "./types" +import type { 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: t("nav-overview-label"), + description: t("nav-overview-description"), + icon: BsCompass, + href: "/learn/", + }, + { + label: t("nav-basics-label"), + description: t("nav-basics-description"), + icon: BsUiChecksGrid, items: [ { - text: t("learn-hub"), - to: "/learn/", + label: t("what-is-ethereum"), + description: t("nav-what-is-ethereum-description"), + href: "/what-is-ethereum/", + }, + { + label: t("what-is-ether"), + description: t("nav-what-is-ether-description"), + href: "/eth/", }, { - text: t("guides-hub"), - to: "/guides/", + label: t("ethereum-wallets"), + description: t("nav-ethereum-wallets-description"), + href: "/wallets/", + }, + { + label: t("nav-what-is-web3-label"), + description: t("nav-what-is-web3-description"), + href: "/web3/", + }, + { + label: t("smart-contracts"), + description: t("nav-smart-contracts-description"), + href: "/smart-contracts/", }, ], }, { - text: t("ethereum-basics"), + label: t("nav-advanced-label"), + description: t("nav-advanced-description"), + icon: BsSliders, items: [ { - text: t("what-is-ethereum"), - to: "/what-is-ethereum/", + label: t("nav-gas-fees-label"), + description: t("nav-gas-fees-description"), + href: "/gas/", }, { - text: t("what-is-ether"), - to: "/eth/", + label: t("bridges"), + description: t("nav-bridges-description"), + href: "/bridges/", }, { - text: t("ethereum-wallets"), - to: "/wallets/", + label: t("zero-knowledge-proofs"), + description: t("nav-zkp-description"), + href: "/zero-knowledge-proofs/", }, { - text: "Gas fees", - to: "/gas/", + label: t("run-a-node"), + description: t("nav-run-a-node-description"), + href: "/run-a-node/", }, { - text: t("ethereum-security"), - to: "/security/", + label: t("ethereum-security"), + description: t("nav-security-description"), + href: "/security/", + }, + ], + }, + { + label: t("nav-quizzes-label"), + description: t("nav-quizzes-description"), + icon: BsMortarboard, + href: "/quizzes/", + }, + ], + }, + use: { + label: t("use"), + ariaLabel: t("use-menu"), + items: [ + { + label: t("get-started"), + description: t("nav-get-started-description"), + icon: BsPinAngle, + items: [ + { + label: t("nav-find-wallet-label"), + description: t("nav-find-wallet-description"), + href: "/wallets/find-wallet/", }, { - text: t("web3"), - to: "/web3/", + label: t("get-eth"), + description: t("nav-get-eth-description"), + href: "/get-eth/", }, { - text: t("smart-contracts"), - to: "/smart-contracts/", + label: t("decentralized-applications-dapps"), + description: t("nav-dapps-description"), + href: "/dapps/", }, - { - text: t("quizzes-title"), - to: "/quizzes/", + label: t("nav-guides-label"), + description: t("nav-guides-description"), + items: [ + { + 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"), + href: "/guides/how-to-create-an-ethereum-account/", + }, + { + label: t("nav-guide-use-wallet-label"), + description: t("nav-guide-use-wallet-description"), + href: "/guides/how-to-use-a-wallet/", + }, + { + label: t("nav-guide-revoke-access-label"), + description: t("nav-guide-revoke-access-description"), + href: "/guides/how-to-revoke-token-access/", + }, + ], }, ], }, { - text: t("ethereum-protocol"), + label: t("nav-use-cases-label"), + description: t("nav-use-cases-description"), + icon: BsLightbulb, items: [ { - text: t("energy-consumption"), - to: "/energy-consumption/", + label: t("stablecoins"), + description: t("nav-stablecoins-description"), + href: "/stablecoins/", }, { - text: t("ethereum-roadmap"), - to: "/roadmap/", + label: t("nft-page"), + description: t("nav-nft-description"), + href: "/nft/", }, { - text: t("eips"), - to: "/eips/", + label: t("defi-page"), + description: t("nav-defi-description"), + href: "/defi/", }, { - text: t("history-of-ethereum"), - to: "/history/", + label: t("dao-page"), + description: t("nav-dao-description"), + href: "/dao/", }, { - text: t("ethereum-whitepaper"), - to: "/whitepaper/", + label: t("nav-emerging-label"), + description: t("nav-emerging-description"), + items: [ + { + label: t("decentralized-identity"), + description: t("nav-did-description"), + href: "/decentralized-identity/", + }, + { + label: t("decentralized-social-networks"), + description: t("nav-desoc-description"), + href: "/social-networks/", + }, + { + label: t("decentralized-science"), + description: t("nav-desci-description"), + href: "/desci/", + }, + { + label: t("regenerative-finance"), + description: t("nav-refi-description"), + href: "/refi/", + }, + ], }, + ], + }, + { + label: t("nav-stake-label"), + description: t("nav-stake-description"), + icon: BsSafe, + items: [ { - text: t("ethereum-glossary"), - to: "/glossary/", + label: t("nav-staking-home-label"), + description: t("nav-staking-home-description"), + href: "/staking/", }, { - text: t("ethereum-governance"), - to: "/governance/", + label: t("nav-staking-solo-label"), + description: t("nav-staking-solo-description"), + href: "/staking/solo/", }, { - text: t("bridges"), - to: "/bridges/", + label: t("nav-staking-saas-label"), + description: t("nav-staking-saas-description"), + href: "/staking/saas/", }, { - text: t("zero-knowledge-proofs"), - to: "/zero-knowledge-proofs/", + label: t("nav-staking-pool-label"), + description: t("nav-staking-pool-description"), + href: "/staking/pools/", }, ], }, + { + label: t("layer-2"), + description: t("nav-layer-2-description"), + icon: BsLayers, + 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/", + label: t("nav-builders-home-label"), + description: t("nav-builders-home-description"), + icon: BsCodeSquare, + href: "/developers/", }, { - text: t("documentation"), - to: "/developers/docs/", - }, - { - text: t("tutorials"), - to: "/developers/tutorials/", + label: t("get-started"), + description: t("nav-start-building-description"), + icon: BsFlag, + items: [ + { + label: t("tutorials"), + description: t("nav-tutorials-description"), + href: "/developers/tutorials/", + }, + { + label: t("learn-by-coding"), + description: t("nav-learn-by-coding-description"), + href: "/developers/learning-tools/", + }, + { + label: t("set-up-local-env"), + description: t("nav-local-env-description"), + href: "/developers/local-environment/", + }, + { + label: t("grants"), + description: t("nav-grants-description"), + href: "/community/grants/", + }, + ], }, { - text: t("learn-by-coding"), - to: "/developers/learning-tools/", + label: t("documentation"), + description: t("nav-docs-description"), + icon: BsJournalCode, + items: [ + { + label: t("nav-overview-label"), + description: t("nav-docs-overview-description"), + href: "/developers/docs/", + }, + { + label: t("nav-docs-foundation-label"), + description: t("nav-docs-foundation-description"), + href: "/developers/docs/intro-to-ethereum/", + }, + { + label: t("nav-docs-stack-label"), + description: t("nav-docs-stack-description"), + href: "/developers/docs/ethereum-stack/", + }, + { + label: t("nav-docs-design-label"), + description: t("nav-docs-design-description"), + href: "/developers/docs/design-and-ux/", + }, + ], }, { - text: t("set-up-local-env"), - to: "/developers/local-environment/", + label: t("enterprise"), + description: t("nav-enterprise-description"), + icon: BsBuildings, + items: [ + { + label: t("mainnet-ethereum"), + description: t("nav-mainnet-description"), + href: "/enterprise/", + }, + { + label: t("private-ethereum"), + description: t("nav-private-description"), + 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: t("nav-participate-overview-description"), + icon: PiUsersFourLight, + href: "/community/", + }, + { + label: t("nav-events-label"), + description: t("nav-events-description"), + icon: BsMegaphone, + items: [ + { + label: t("ethereum-online"), + description: t("nav-events-online-description"), + href: "/community/online/", + }, + { + label: t("ethereum-events"), + description: t("nav-events-irl-description"), + href: "/community/events/", + }, + ], }, { - text: t("private-ethereum"), - to: "/enterprise/private-ethereum/", + label: t("site-title"), + description: t("nav-ethereum-org-description"), + icon: EthereumIcon, + items: [ + { + label: t("nav-contribute-label"), + description: t("nav-contribute-description"), + href: "/contributing/", + }, + { + label: t("translation-program"), + description: t("nav-translation-program-description"), + href: "/contributing/translation-program/", + }, + { + label: t("about-ethereum-org"), + description: t("nav-about-description"), + 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/", + label: t("ethereum-whitepaper"), + description: t("nav-whitepaper-description"), + icon: BsBook, + href: "/whitepaper/", }, { - text: t("open-research"), - to: "/community/research/", - }, - { - text: t("grants"), - to: "/community/grants/", - }, - { - text: t("ethereum-support"), - to: "/community/support/", + label: t("nav-roadmap-label"), + description: t("nav-roadmap-description"), + icon: BsSignpost, + items: [ + { + label: t("nav-overview-label"), + description: t("nav-roadmap-overview-description"), + href: "/roadmap/", + }, + { + label: t("nav-roadmap-security-label"), + description: t("nav-roadmap-security-description"), + href: "/roadmap/security/", + }, + { + label: t("nav-roadmap-scaling-label"), + description: t("nav-roadmap-scaling-description"), + href: "/roadmap/scaling/", + }, + { + label: t("nav-roadmap-ux-label"), + description: t("nav-roadmap-ux-description"), + href: "/roadmap/user-experience/", + }, + { + label: t("nav-roadmap-future-label"), + description: t("nav-roadmap-future-description"), + href: "/roadmap/future-proofing/", + }, + ], }, { - text: t("language-resources"), - to: "/community/language-resources/", + label: t("nav-research-label"), + description: t("nav-research-description"), + icon: PiFlask, + items: [ + { + label: t("nav-history-label"), + description: t("nav-history-description"), + href: "/history/", + }, + { + label: t("nav-open-research-label"), + description: t("nav-open-research-description"), + href: "/community/research/", + }, + { + label: t("nav-eip-label"), + description: t("nav-eip-description"), + href: "/eips/", + }, + { + label: t("nav-governance-label"), + description: t("nav-governance-description"), + 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/components/PageHero.tsx b/src/components/PageHero.tsx index 4b18394e7d4..e11f9fe2a29 100644 --- a/src/components/PageHero.tsx +++ b/src/components/PageHero.tsx @@ -99,6 +99,7 @@ const PageHero = ({ {buttons && ( {buttons.map((button, idx) => { + const isSecondary = idx !== 0 if (isButtonLink(button)) { return ( @@ -112,6 +113,7 @@ const PageHero = ({ eventName: button.matomo.eventName, }) } + isSecondary={isSecondary} > {button.content} @@ -132,6 +134,7 @@ const PageHero = ({ eventName: button.matomo.eventName, }) } + isSecondary={isSecondary} > {button.content} diff --git a/src/components/PageMetadata.tsx b/src/components/PageMetadata.tsx index 56ecb903c5c..0012059c0c5 100644 --- a/src/components/PageMetadata.tsx +++ b/src/components/PageMetadata.tsx @@ -1,10 +1,12 @@ -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 { getOgImage } from "@/lib/utils/metadata" +import { filterRealLocales } from "@/lib/utils/translations" +import { getFullUrl } from "@/lib/utils/url" + +import { SITE_URL } from "@/lib/constants" type NameMeta = { name: string @@ -33,9 +35,11 @@ const PageMetadata = ({ canonicalUrl, author, }: PageMetadataProps) => { - const { locale, asPath } = useRouter() + const { locale, locales: rawLocales, asPath } = useRouter() const { t } = useTranslation() + const locales = filterRealLocales(rawLocales) + const desc = description || t("site-description") const siteTitle = t("site-title") const fullTitle = `${title} | ${siteTitle}` @@ -44,55 +48,31 @@ const PageMetadata = ({ const path = asPath.replace(/[\?\#].*/, "") const slug = path.split("/") - /** - * Set canonical URL w/ language path to avoid duplicate content - * If English, remove language path - * Remove trailing slash - * @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(/\/$/, "") + // Set canonical URL w/ language path to avoid duplicate content + const url = getFullUrl(locale, path) 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 ( @@ -105,6 +85,14 @@ const PageMetadata = ({ /> ))} + {locales.map((loc) => ( + + ))} ) } 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/index.tsx b/src/components/Search/index.tsx index 5d74cae881f..297281cf28d 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -31,7 +31,7 @@ export const SearchIconButton = forwardRef( ref={ref} variant="ghost" isSecondary - px={1.5} + px={2} _hover={{ color: "primary.base", transform: "rotate(5deg)", diff --git a/src/components/Search/utils.ts b/src/components/Search/utils.ts index e883735df91..70cd1c19a99 100644 --- a/src/components/Search/utils.ts +++ b/src/components/Search/utils.ts @@ -17,7 +17,8 @@ export const getSearchButtonStyles = (): ButtonProps => ({ bg: "none", gap: 4, m: 0, - ps: 3, + me: 3, + px: 3, _hover: { ...commonBtnStateStyles, ".DocSearch-Button-Keys kbd": { @@ -74,6 +75,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,6 +109,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", @@ -187,7 +197,7 @@ export const getSearchModalStyles = (): SystemStyleObject => ({ placeItems: "center", borderRadius: "base", mr: "unset", - me: 1.5 + me: 1.5, }, ".DocSearch-Logo": { diff --git a/src/components/SideNav.tsx b/src/components/SideNav.tsx index d9103d3651b..b8da9f69d11 100644 --- a/src/components/SideNav.tsx +++ b/src/components/SideNav.tsx @@ -152,7 +152,7 @@ const SideNav = ({ path }: SideNavProps) => { { const Table = (props: TableProps) => { const { variant, ...rest } = props return ( - + ) diff --git a/src/components/TableOfContents/index.tsx b/src/components/TableOfContents/index.tsx index b19c43cbed7..93ef59abda3 100644 --- a/src/components/TableOfContents/index.tsx +++ b/src/components/TableOfContents/index.tsx @@ -71,7 +71,7 @@ const TableOfContents = ({ hideBelow={lgBp} as="aside" position="sticky" - top="7.25rem" // Account for navbar + top="19" // Account for navbar p={4} pe={0} maxW="25%" 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 && ( - )} + )} */} ( + + + +) diff --git a/src/data/community-events.ts b/src/data/community-events.ts index a40158dac91..62443075058 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 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", startDate: "2024-09-18", diff --git a/src/data/community-meetups.json b/src/data/community-meetups.json index 89ad32bd63f..fff5cc0f18d 100644 --- a/src/data/community-meetups.json +++ b/src/data/community-meetups.json @@ -1,4 +1,10 @@ [ + { + "title": "Web3 Family", + "emoji": ":es:", + "location": "Barcelona", + "link": "https://www.meetup.com/web3family/" + }, { "title": "CryptoCanal", "emoji": ":nl:", @@ -436,5 +442,11 @@ "emoji": ":belgium:", "location": "Brussels", "link": "https://dao.brussels/" + }, + { + "title": "Ethereum Edmonton Meetup", + "emoji": ":canada:", + "location": "Edmonton", + "link": "https://www.meetup.com/ethereum-edmonton-meetup/" } ] diff --git a/src/data/crowdin/combined-translators.json b/src/data/crowdin/combined-translators.json index 2d03bd03160..d706d8d9c3f 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" } ] @@ -5395,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" + } + ] } ] }, @@ -5441,7 +5464,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 +5544,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 +5555,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 +5622,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 +5655,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 +5716,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 +5727,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 +5766,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 597.92, + "totalCosts": 575.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -5784,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" }, { @@ -5799,18 +5822,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 +6297,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 +6332,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 +6344,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 +6391,7 @@ { "id": 15421106, "username": "rogerdaltry193", - "totalCosts": 860.52, + "totalCosts": 845.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15421106/medium/42065b2af539333bb83278e6ef5e2f29.png" }, { @@ -6401,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", @@ -6510,7 +6539,7 @@ { "id": 15155844, "username": "CryptoSpace", - "totalCosts": 227.25, + "totalCosts": 198.97, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" }, { @@ -6561,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", @@ -6833,18 +6868,18 @@ "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", "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 +6892,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 +7417,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" }, { @@ -7598,6 +7639,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 +7659,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 1791.74, + "totalCosts": 1790.73, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -7683,7 +7730,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 +7961,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", @@ -8267,7 +8308,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 +8501,7 @@ { "id": 14564238, "username": "FreddyAndresParra", - "totalCosts": 135.34, + "totalCosts": 130.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564238/medium/e6feebc5a27754079a07907fffac8389.jpg" }, { @@ -8681,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", @@ -8766,13 +8813,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 +8829,28 @@ "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": 15448050, + "username": "santi-gnzlz", + "totalCosts": 91.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15448050/medium/b795cd3e997f1157bb866ef1a077fef2.png" + }, + { + "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 +8858,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 +9657,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 +9672,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", @@ -9630,6 +9689,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" } ] }, @@ -9907,21 +9978,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 +10232,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 +10291,7 @@ { "id": 15789613, "username": "djvictorvargas1988", - "totalCosts": 46.46, + "totalCosts": 43.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15789613/medium/f5d59ce9fa974c34fed81ee4bcfe45de.jpeg" }, { @@ -10267,13 +10338,13 @@ { "id": 15968127, "username": "gonzagramaglia", - "totalCosts": 1297.85, + "totalCosts": 1278.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15968127/medium/0c91665492f81a2479639eba5271d7bc.png" }, { "id": 15194310, "username": "MGETH", - "totalCosts": 803.96, + "totalCosts": 823.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -10480,7 +10551,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 +10571,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 +10925,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,19 +11010,19 @@ { "id": 15730101, "username": "anaphant", - "totalCosts": 479.75, + "totalCosts": 464.6, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15730101/medium/54df140ba50202fe839069eb63683d45.png" }, { "id": 15194310, "username": "MGETH", - "totalCosts": 198.97, + "totalCosts": 214.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { "id": 15946267, "username": "socopower", - "totalCosts": 117.16, + "totalCosts": 102.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15946267/medium/094f1891b25266289c4aa5df7b08cfb7.jpg" }, { @@ -11024,18 +11089,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 +11141,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 +11148,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 +11159,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 +11257,7 @@ { "id": 15287132, "username": "0xAntonio", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15287132/medium/67c5a079a19f5b0cd46f8d628cff446d.png" }, { @@ -11204,7 +11269,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 +11284,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 +11304,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 +11316,7 @@ { "id": 15431356, "username": "davinci061299", - "totalCosts": 101, + "totalCosts": 98.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15431356/medium/528b0f234df1b6a36aacfe2c4abde9b6.png" }, { @@ -11357,7 +11416,7 @@ { "id": 15770841, "username": "Angelito_18", - "totalCosts": 2798.71, + "totalCosts": 2774.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15770841/medium/f82644a45b17eed3facb1815dcc83d13.jpeg" }, { @@ -11378,6 +11437,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", @@ -11409,7 +11474,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 +11508,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 802.95, + "totalCosts": 869.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" } ] @@ -11465,7 +11530,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 +11863,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 +11872,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 +11923,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 +12278,7 @@ { "id": 15502508, "username": "fgavadeveloper", - "totalCosts": 804.97, + "totalCosts": 795.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15502508/medium/d6b18a64d4fbae95044bf5883443b797.png" }, { @@ -12263,6 +12328,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 +12401,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 261.59, + "totalCosts": 273.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" } ] @@ -12341,7 +12412,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 +12572,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 +12595,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 +12615,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 +12691,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 +12759,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 +12793,15 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 1633.17, + "totalCosts": 1784.67, "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 +12827,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 +12945,7 @@ { "id": 15770841, "username": "Angelito_18", - "totalCosts": 320.17, + "totalCosts": 307.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15770841/medium/f82644a45b17eed3facb1815dcc83d13.jpeg" }, { @@ -12940,722 +13017,2247 @@ "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": 40.4, - "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": 474.7, - "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": 121.2, - "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": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 113.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 209.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 108.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "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", + "id": 14834276, + "username": "ElTitoDG", + "totalCosts": 43.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14834276/medium/403ec82c5eab442ae648bc5290a0e6b9.png" + }, + { + "id": 14778992, + "username": "IsmaelRC", "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14778992/medium/646865835d4b959bf3bfca67b66ef04f.png" + }, + { + "id": 13510211, + "username": "MirageIonova", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13510211/medium/f447099407b409a18ab34d7829683e43.png" + }, + { + "id": 14755966, + "username": "RealGoye", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14755966/medium/f5becfea2dd543f57f356dfb3e42487d_default.png" } ] }, { - "fileId": "2716", + "fileId": "3160", "contributors": [ { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 739.32, - "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": 447.43, - "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": 88.88, - "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": 15967119, - "username": "timtey", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 49.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.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": "2908", + "fileId": "7999", "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": 15194310, + "username": "MGETH", + "totalCosts": 3253.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { - "id": 15967115, - "username": "itsdeeters", - "totalCosts": 29.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" + "id": 15058949, + "username": "gracieluu_ar", + "totalCosts": 2218.97, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15058949/medium/c8bf678ba85795ea778fbc67e30f0733.jpeg" }, { - "id": 14665754, - "username": "R3z4_Pr0gramm3r", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" } ] }, { - "fileId": "2860", + "fileId": "3074", "contributors": [ { - "id": 15967125, - "username": "erfanej", - "totalCosts": 921.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 14834276, + "username": "ElTitoDG", + "totalCosts": 388.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14834276/medium/403ec82c5eab442ae648bc5290a0e6b9.png" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 155.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 14911627, + "username": "marcoporracin", + "totalCosts": 168.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14911627/medium/29719c7ebb665982afa5447e382aeb13.jpeg" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 90.9, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 14665754, - "username": "R3z4_Pr0gramm3r", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.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": "2786", + "fileId": "3120", "contributors": [ { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "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": "5533", + "fileId": "3164", "contributors": [ { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 432.28, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 15084601, + "username": "metanube", + "totalCosts": 1558.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084601/medium/7e8ee6ec15e9d0be68e2c6ff9a0b34c8_default.png" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 280.78, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 106.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 253.51, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 15082987, + "username": "Grampus", + "totalCosts": 45.45, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082987/medium/3745aa71b5e8897fcee2ab6c9e9a26fe.jpeg" }, { - "id": 15967115, - "username": "itsdeeters", - "totalCosts": 52.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" + "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": "2914", + "fileId": "2994", "contributors": [ { - "id": 15967125, - "username": "erfanej", - "totalCosts": 353.5, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 14886730, + "username": "charlyzona", + "totalCosts": 2024.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14886730/medium/5f19a49b0b330b8b575eee9a41d7faac.jpeg" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 166.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 14791370, + "username": "williamx", + "totalCosts": 122.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14791370/medium/59d86e6d660482edfdda6487b7fc1205_default.png" }, { - "id": 14966159, - "username": "bafrani", - "totalCosts": 151.5, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14966159/medium/c51fc2b1e6cf7ef020396751ad9b854b.png" + "id": 14885094, + "username": "FrancoElicabe", + "totalCosts": 31.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14885094/medium/ff9074ceb417d440b86adcd9172cc6e6_default.png" }, { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 24.24, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 14631802, + "username": "edgargrau", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 9.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 14665754, - "username": "R3z4_Pr0gramm3r", + "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/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + "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": "2898", + "fileId": "2986", "contributors": [ { - "id": 15967115, - "username": "itsdeeters", - "totalCosts": 309.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" + "id": 15085311, + "username": "bunturx", + "totalCosts": 569.64, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" }, { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 145.44, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 15966349, + "username": "chiogonzalezt", + "totalCosts": 534.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966349/medium/1d277519e5b8ccdfc1de7b60ec89e1b0.jpeg" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 128.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 14865328, + "username": "Lostday", + "totalCosts": 239.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14865328/medium/16e7617eadda7d8511b4bcc3c6e5ae57_default.png" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 68.68, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 15061725, + "username": "octaaaa", + "totalCosts": 221.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15061725/medium/4bf352fdf48fcda0d615d83b89ae4263.png" }, { - "id": 15967125, - "username": "erfanej", - "totalCosts": 56.56, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 14791370, + "username": "williamx", + "totalCosts": 125.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14791370/medium/59d86e6d660482edfdda6487b7fc1205_default.png" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 24.24, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15058949, + "username": "gracieluu_ar", + "totalCosts": 47.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15058949/medium/c8bf678ba85795ea778fbc67e30f0733.jpeg" }, { - "id": 15967893, - "username": "apacala", - "totalCosts": 13.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967893/medium/6f427c7b8d63cf93f27c4df77f07a2b5_default.png" + "id": 13510211, + "username": "MirageIonova", + "totalCosts": 37.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13510211/medium/f447099407b409a18ab34d7829683e43.png" }, { - "id": 14665754, - "username": "R3z4_Pr0gramm3r", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.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": "2778", + "fileId": "6259", "contributors": [ { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 87.87, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15154968, + "username": "Secvndvs", + "totalCosts": 170.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15154968/medium/63bd618dfc395cc82c1ba5119280c40c_default.png" }, { - "id": 15967125, - "username": "erfanej", - "totalCosts": 30.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 160.59, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 19.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 15998451, + "username": "gato1904", + "totalCosts": 52.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15998451/medium/b48c75b54930b781a82c9146d5ba2daf.png" }, { - "id": 14665754, - "username": "R3z4_Pr0gramm3r", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + "id": 15674887, + "username": "Charlyboy", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15674887/medium/adf7358a1af66b39938e57334b2ce312.jpg" } ] }, { - "fileId": "2776", + "fileId": "3088", "contributors": [ { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 144.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 14687676, + "username": "joseachemazzei", + "totalCosts": 342.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687676/medium/dc4cef6c7ba35e45690a3cbfb2db7009.jpg" }, { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 88.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 212.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 15967125, - "username": "erfanej", - "totalCosts": 52.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 14776878, + "username": "JoshNX", + "totalCosts": 141.4, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14776878/medium/21ac9de5adfcb01ba92df55ea1428126_default.png" }, { - "id": 14665754, - "username": "R3z4_Pr0gramm3r", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + "id": 14631802, + "username": "edgargrau", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 14964031, + "username": "Charlongolo", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14964031/medium/1fcad8b23307ba5ad33dac76e91ee6a3.png" } ] }, { - "fileId": "6173", + "fileId": "3116", "contributors": [ { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 104.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15191278, + "username": "julioenrique19", + "totalCosts": 827.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15191278/medium/93a3b7e041a6ed6bb7f72586f223ebd8.png" }, { - "id": 15967125, - "username": "erfanej", - "totalCosts": 41.41, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.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": "2792", + "fileId": "6261", "contributors": [ { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 286.84, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 805.98, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 197.96, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 15294248, + "username": "kempo17", + "totalCosts": 157.56, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15294248/medium/5b2b23f53504fd6a13a351ee58209ec7_default.png" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 177.76, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 148.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" }, { - "id": 15967115, - "username": "itsdeeters", - "totalCosts": 173.72, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" + "id": 15161680, + "username": "agustinasegat", + "totalCosts": 104.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15161680/medium/62b2a3ce8e4003b84a0fceb6be409bba.jpeg" }, { - "id": 15967125, - "username": "erfanej", + "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, + "username": "timtey", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + }, + { + "id": 14665754, + "username": "R3z4_Pr0gramm3r", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + } + ] + }, + { + "fileId": "2786", + "contributors": [ + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + } + ] + }, + { + "fileId": "5533", + "contributors": [ + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 432.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 280.78, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 253.51, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15967115, + "username": "itsdeeters", + "totalCosts": 52.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" + } + ] + }, + { + "fileId": "2914", + "contributors": [ + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 353.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 166.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 14966159, + "username": "bafrani", + "totalCosts": 151.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14966159/medium/c51fc2b1e6cf7ef020396751ad9b854b.png" + }, + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 14665754, + "username": "R3z4_Pr0gramm3r", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + } + ] + }, + { + "fileId": "2898", + "contributors": [ + { + "id": 15967115, + "username": "itsdeeters", + "totalCosts": 309.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" + }, + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 145.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 128.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + }, + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 56.56, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15967893, + "username": "apacala", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967893/medium/6f427c7b8d63cf93f27c4df77f07a2b5_default.png" + }, + { + "id": 14665754, + "username": "R3z4_Pr0gramm3r", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + } + ] + }, + { + "fileId": "2778", + "contributors": [ + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 87.87, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 14665754, + "username": "R3z4_Pr0gramm3r", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + } + ] + }, + { + "fileId": "2776", + "contributors": [ + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 144.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 88.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 52.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 14665754, + "username": "R3z4_Pr0gramm3r", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + } + ] + }, + { + "fileId": "6173", + "contributors": [ + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 104.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 41.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + } + ] + }, + { + "fileId": "2792", + "contributors": [ + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 286.84, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 197.96, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 177.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + }, + { + "id": 15967115, + "username": "itsdeeters", + "totalCosts": 173.72, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" + }, + { + "id": 15967125, + "username": "erfanej", "totalCosts": 36.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" }, @@ -13761,7 +15363,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 +15439,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 +15492,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 +15568,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 +15586,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 +15644,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 +15667,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 +15788,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 +15936,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 +16107,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 +16125,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 +16159,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 +16266,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 +16329,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 +16340,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 +16362,7 @@ { "id": 15185884, "username": "carmen1912", - "totalCosts": 505, + "totalCosts": 447.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15185884/medium/0d349af8ba0364fdd96b55b46c40590c.jpg" }, { @@ -14775,6 +16377,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", @@ -14854,7 +16462,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 +16591,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 +16836,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 +16927,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 +16957,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 +17027,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 +17045,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 +17485,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", @@ -15898,7 +17506,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 32.32, + "totalCosts": 46.46, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" } ] @@ -16206,7 +17814,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" }, { @@ -16215,12 +17823,24 @@ "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", - "totalCosts": 140.39, + "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", @@ -16232,12 +17852,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" } ] }, @@ -16708,19 +18322,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 +18358,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 +18399,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 +18468,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 +18501,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 +18545,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 +18604,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 +18651,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 1056.46, + "totalCosts": 1046.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, { @@ -17052,6 +18660,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", @@ -17281,7 +18895,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 +19012,7 @@ { "id": 15624473, "username": "CaverneCrypto", - "totalCosts": 3076.46, + "totalCosts": 3049.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15624473/medium/7790c08f2ef4a5ba028091b6393900be_default.png" }, { @@ -17413,6 +19027,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", @@ -17474,13 +19094,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" }, { @@ -17489,6 +19109,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 +19225,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" } ] }, @@ -17608,7 +19240,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 +19258,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 +19439,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 311.08, + "totalCosts": 303, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -17822,6 +19454,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", @@ -18023,7 +19661,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 +19691,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 +19702,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 +19714,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 +19830,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 +19936,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": 283.81, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -18319,12 +19957,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 +19969,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 +20786,7 @@ { "id": 14750044, "username": "eloise.emery", - "totalCosts": 961.52, + "totalCosts": 926.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14750044/medium/9e793da12e9905e4598d0e0a2e191289.jpeg" }, { @@ -19163,6 +20795,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", @@ -19375,13 +21013,13 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 332.29, + "totalCosts": 345.42, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { "id": 13249257, "username": "SuperDelphi", - "totalCosts": 319.16, + "totalCosts": 301.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13249257/medium/f566e07e86e26f5911df1ddf5fae796d.png" }, { @@ -19428,7 +21066,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 125.24, + "totalCosts": 134.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -19451,13 +21089,13 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 104.03, + "totalCosts": 111.1, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { "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 +21429,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 +21450,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 +21600,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 +21665,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 +21825,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 +21978,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 +22019,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 +22178,7 @@ { "id": 14075861, "username": "Kler", - "totalCosts": 12842.15, + "totalCosts": 12822.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14075861/medium/a3cf69cc209acc2c520607aab4d1c615.jpeg" }, { @@ -20570,7 +22202,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 99.99, + "totalCosts": 119.18, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, { @@ -20629,7 +22261,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 +22309,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 8.08, + "totalCosts": 32.32, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -20878,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" } ] }, @@ -20957,7 +22589,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 +23175,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 +23183,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,8 +23215,14 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 681.75, + "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" } ] }, @@ -21639,13 +23283,13 @@ { "id": 14823260, "username": "omahs", - "totalCosts": 223.21, + "totalCosts": 209.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg" }, { "id": 12844463, "username": "MATsxm", - "totalCosts": 71.71, + "totalCosts": 85.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" } ] @@ -21741,7 +23385,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" }, { @@ -21759,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" } ] }, @@ -21781,7 +23431,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 2135.14, + "totalCosts": 2115.95, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, { @@ -21789,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" } ] }, @@ -22246,7 +23902,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 +23910,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 +23927,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 +23945,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 +24077,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 +24242,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 +24297,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 +24340,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 +24420,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 +24567,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 +24590,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 +24653,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 +24758,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 928.19, + "totalCosts": 876.68, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23125,7 +24775,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 +24789,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 +24815,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 134.33, + "totalCosts": 165.64, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -23210,7 +24860,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1303.91, + "totalCosts": 1318.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23324,7 +24974,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 +25019,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 +25042,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 +25070,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 +25087,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 666.6, + "totalCosts": 684.78, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23477,7 +25127,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 +25144,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 3362.29, + "totalCosts": 4213.72, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23517,7 +25167,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 +25269,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 +25286,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 238.36, + "totalCosts": 227.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -23738,7 +25388,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 +25427,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 +25456,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 +25507,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 809.01, + "totalCosts": 827.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23880,7 +25530,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 +25701,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 488.84, + "totalCosts": 507.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -24103,7 +25753,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 +25765,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 +25804,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 905.97, + "totalCosts": 906.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24198,7 +25848,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 606, + "totalCosts": 575.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24364,7 +26014,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 +26064,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 +26075,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 2059.39, + "totalCosts": 2057.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24524,7 +26174,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 802.95, + "totalCosts": 869.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24712,7 +26362,7 @@ { "id": 14357794, "username": "robertdosa", - "totalCosts": 1365.52, + "totalCosts": 1334.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14357794/medium/a28b741096516a710523b87d9ee07223.png" }, { @@ -24779,7 +26429,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 +26528,95 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1286.74, + "totalCosts": 1294.82, + "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" } ] @@ -24900,7 +26638,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 +26696,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 +26753,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 +26804,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 +26955,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 +27072,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 +27423,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 +27481,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 +27504,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 +27602,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 +27625,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 516.11, + "totalCosts": 505, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -25910,7 +27648,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 +27688,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 202, + "totalCosts": 190.89, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -25996,7 +27734,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 +27763,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 +27838,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 +27937,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 +28034,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 +28178,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 +28195,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 +28333,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 +28914,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 +29062,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 +29090,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 +29145,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 +29257,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 1598.83, + "totalCosts": 1592.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -27601,9 +29339,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", @@ -27624,7 +29368,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 +29415,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 +29497,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 +29556,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 +29602,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 +29724,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 +29747,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 +29917,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 +30092,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 +30103,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 +30161,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 +30213,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 +30242,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 +30259,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 +30300,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 +30323,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 +30352,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 +30370,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 +30404,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 +30427,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 +30450,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 +30467,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 +30478,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 +30495,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 +30518,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 +30535,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 +30558,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 +30587,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 +30610,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 +30639,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 +30686,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 +30721,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 +30738,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 +30773,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 +30796,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 +30849,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 +30872,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 +30901,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 +30924,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 +30983,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 +31006,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 +31017,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 +31040,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 +31057,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 +31086,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 +31097,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 +31126,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 +31137,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 +31172,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 +31189,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 +31218,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 +31241,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 +31264,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 +31281,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 +31298,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 +31333,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 +31386,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 +31421,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 +31432,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 +31449,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 +31460,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 +31471,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 +31494,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 +31517,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 +31534,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 +31587,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 +31610,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 +31639,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 +31686,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 +31697,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 +31720,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 +31749,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 +31772,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 +31789,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 +31800,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 +31835,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 +31852,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 +31875,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 +31893,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 +31939,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 +31950,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 +31961,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 +31996,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 +32019,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 +32042,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 +32052,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 +32076,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 +32093,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 +32110,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 +32127,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 +32144,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 +32185,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 +32208,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 +32219,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 +32242,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 +32289,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 +32312,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 +32329,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 +32346,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 +32363,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 +32386,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 +32404,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 +32432,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 +32443,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 +32460,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 +32483,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 +32500,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 +32535,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 +32552,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 +32587,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 +32598,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 +32621,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 +32639,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 +32655,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 +32673,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 +32695,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 +32706,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 +32729,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 +32764,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 +32811,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 +32834,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 +32869,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 +32886,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 +32909,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 +32920,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 +32931,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 +32954,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 +32983,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 +33006,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 +33023,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 +33064,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 +33075,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 +33104,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 +33151,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 +33168,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 +33179,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 +33190,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 +33201,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 +33218,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 +33241,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 +33269,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 +33280,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 +33291,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 +33302,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 +33313,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 +33330,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 +33341,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 +33358,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 +33375,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 +33403,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 +33414,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 +33431,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 +33442,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 +33453,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 +33470,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 +33481,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 +33498,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 +33509,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 +33532,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 +33555,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 +33584,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 +33607,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 +33618,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 +33635,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 +33658,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 +33687,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 +33734,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 +33775,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 +33804,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 +33821,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 +33862,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 +33878,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 +33909,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 +33944,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 +33961,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 +33972,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 +33983,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 +34006,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 +34035,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 +34088,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 +34129,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 +34140,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 +34205,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 +34228,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 +34245,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 +34256,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 +34291,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 +34302,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 +34313,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 +34324,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 +34335,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 +34346,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 +34357,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 +34368,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 +34379,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 +34396,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 +34420,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 +34442,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 +34453,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 +34506,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 +34523,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 +34540,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 +34563,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 +34575,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 +34633,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 +34697,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 +34720,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 +34731,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 +34754,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 +34765,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 +34805,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 +34833,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 +34844,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 +34855,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 +34866,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 +34888,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 +34905,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 +34916,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 +34938,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 +34972,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 +35006,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 +35029,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 +35058,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 +35084,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 +35126,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 +35237,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 +35323,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 +35587,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 +35605,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 +35616,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 +35676,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 +35691,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 +35703,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 +35885,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 +36054,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 +36090,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 +36323,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 +36351,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 1651.35, + "totalCosts": 1835.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -34996,13 +36746,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 +36764,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 +36781,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 +36920,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 +36937,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 +36954,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 +36988,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 +37221,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 +37452,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 +37638,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 +37794,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 +37840,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 +37962,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 +38068,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 +38766,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 +38949,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 +38966,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 +39003,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 +39199,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 +39251,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 +39292,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 +39327,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 +39373,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 +39443,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 +39484,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 +39513,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 +39553,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 +39666,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 +39700,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 +39829,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 +39840,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 +39873,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 +39895,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 +39917,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 +39928,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 1286.74, + "totalCosts": 1294.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -38232,6 +39988,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" + } + ] } ] }, @@ -38273,7 +40134,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 +40163,7 @@ { "id": 15430302, "username": "kwangtaekim", - "totalCosts": 1934.15, + "totalCosts": 1919, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15430302/medium/705b3a29a93430236982b318c9131fcf.png" }, { @@ -38325,9 +40186,15 @@ }, { "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": 13903009, + "username": "igntsh", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13903009/medium/04ae0d1fd930da54d2c40b2d5e37e31c.jpg" }, { "id": 14362948, @@ -38360,9 +40227,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, @@ -38378,7 +40245,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" }, { @@ -38389,9 +40256,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" } ] }, @@ -38459,7 +40326,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,11 +40346,17 @@ { "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", + "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, @@ -38539,14 +40412,14 @@ "contributors": [ { "id": 13471138, - "username": "KyungwonPark", - "totalCosts": 303, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "username": "linguist_won", + "totalCosts": 298.96, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" }, { "id": 13997401, "username": "Windfactory", - "totalCosts": 92.92, + "totalCosts": 78.78, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13997401/medium/2ab4ff5d8770f710be0d12e4ec9f2123.png" } ] @@ -38579,9 +40452,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, @@ -38632,9 +40505,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, @@ -38662,7 +40535,7 @@ { "id": 15430302, "username": "kwangtaekim", - "totalCosts": 1234.22, + "totalCosts": 1232.2, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15430302/medium/705b3a29a93430236982b318c9131fcf.png" }, { @@ -38673,9 +40546,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, @@ -38732,7 +40605,7 @@ { "id": 15430302, "username": "kwangtaekim", - "totalCosts": 13633.99, + "totalCosts": 13614.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15430302/medium/705b3a29a93430236982b318c9131fcf.png" }, { @@ -38784,9 +40657,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" } ] } @@ -38831,7 +40710,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 +40739,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 +40781,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 +40831,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 +40853,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 +40897,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 +40937,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 +41000,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 +41033,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 +41044,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 1818, + "totalCosts": 1813.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" } ] @@ -39182,7 +41061,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 +41100,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 +41129,7 @@ { "id": 15771025, "username": "Andrzej1072", - "totalCosts": 631.25, + "totalCosts": 617.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" }, { @@ -39285,13 +41164,13 @@ { "id": 15771025, "username": "Andrzej1072", - "totalCosts": 2079.59, + "totalCosts": 2064.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" }, { "id": 15894449, "username": "wosek_", - "totalCosts": 159.58, + "totalCosts": 174.73, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { @@ -39343,13 +41222,13 @@ { "id": 15771025, "username": "Andrzej1072", - "totalCosts": 1635.19, + "totalCosts": 1606.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" }, { "id": 15894449, "username": "wosek_", - "totalCosts": 34.34, + "totalCosts": 62.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] @@ -39865,7 +41744,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 +41761,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 +41790,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 +41836,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 +41882,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 +41899,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 +41949,7 @@ { "id": 14775946, "username": "Beas", - "totalCosts": 1365.52, + "totalCosts": 1334.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" } ] @@ -40093,316 +41972,856 @@ ] }, { - "fileId": "2814", + "fileId": "2814", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 90.9, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + } + ] + }, + { + "fileId": "2822", + "contributors": [ + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 207.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 14775946, + "username": "Beas", + "totalCosts": 153.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 150.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + } + ] + }, + { + "fileId": "2810", + "contributors": [ + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 460.56, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + }, + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 411.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 14775946, + "username": "Beas", + "totalCosts": 135.34, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + } + ] + }, + { + "fileId": "2808", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 664.58, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 255.53, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 203.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + } + ] + }, + { + "fileId": "2826", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 992.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + } + ] + }, + { + "fileId": "2804", + "contributors": [ + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + }, + { + "id": 14775946, + "username": "Beas", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + } + ] + }, + { + "fileId": "2848", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 46.46, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + } + ] + }, + { + "fileId": "2840", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 391.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 82.82, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + }, + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 76.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + } + ] + }, + { + "fileId": "2846", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 622.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 152.51, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 15381630, + "username": "p_gwizdak", + "totalCosts": 118.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15381630/medium/419ca8faf5b651c0ab7f7123a3a4fd95.jpeg" + }, + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 47.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + } + ] + }, + { + "fileId": "2842", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 130.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + } + ] + }, + { + "fileId": "2798", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + } + ] + }, + { + "fileId": "2792", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 67.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + } + ] + }, + { + "fileId": "2762", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 516.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 154.53, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 98.98, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + } + ] + }, + { + "fileId": "3002", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 290.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14759220, + "username": "arturlesniewski", + "totalCosts": 288.86, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14759220/medium/ce0dfc426c882d10a157bb152afe3a16.png" + }, + { + "id": 14113969, + "username": "mbiesiad", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + }, + { + "id": 14607372, + "username": "anastazja.k1", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14607372/medium/6cd353ca427fa175908898882a3aaea1_default.png" + } + ] + }, + { + "fileId": "3056", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 599.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 140.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + } + ] + }, + { + "fileId": "3100", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 510.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + } + ] + }, + { + "fileId": "3074", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 1222.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + } + ] + }, + { + "fileId": "2994", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 2122.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 55.55, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + } + ] + }, + { + "fileId": "2986", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 1596.81, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + } + ] + }, + { + "fileId": "3088", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 836.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + } + ] + }, + { + "fileId": "2980", + "contributors": [ + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 258.56, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 14775946, + "username": "Beas", + "totalCosts": 251.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 165.64, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + } + ] + }, + { + "fileId": "3082", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + } + ] + }, + { + "fileId": "2998", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 975.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + }, + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + } + ] + }, + { + "fileId": "3036", + "contributors": [ + { + "id": 14775946, + "username": "Beas", + "totalCosts": 556.51, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 228.26, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + } + ] + }, + { + "fileId": "3010", "contributors": [ { "id": 14775946, "username": "Beas", - "totalCosts": 90.9, + "totalCosts": 1008.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" } ] }, { - "fileId": "2822", + "fileId": "3018", "contributors": [ - { - "id": 15894449, - "username": "wosek_", - "totalCosts": 207.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - }, { "id": 14775946, "username": "Beas", - "totalCosts": 153.52, + "totalCosts": 367.64, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 150.49, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" } ] }, { - "fileId": "2810", + "fileId": "3006", "contributors": [ - { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 460.56, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" - }, - { - "id": 15894449, - "username": "wosek_", - "totalCosts": 411.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - }, { "id": 14775946, "username": "Beas", - "totalCosts": 135.34, + "totalCosts": 710.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" } ] }, { - "fileId": "2808", + "fileId": "3092", "contributors": [ + { + "id": 14759220, + "username": "arturlesniewski", + "totalCosts": 649.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14759220/medium/ce0dfc426c882d10a157bb152afe3a16.png" + }, { "id": 14775946, "username": "Beas", - "totalCosts": 664.58, + "totalCosts": 366.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { "id": 15894449, "username": "wosek_", - "totalCosts": 263.61, + "totalCosts": 45.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - }, - { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 211.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" } ] }, { - "fileId": "2826", + "fileId": "3024", "contributors": [ { "id": 14775946, "username": "Beas", - "totalCosts": 992.83, + "totalCosts": 2.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - } - ] - }, - { - "fileId": "2804", - "contributors": [ + }, { "id": 14802836, "username": "Ryeore", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" - }, - { - "id": 14775946, - "username": "Beas", "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" } ] }, { - "fileId": "2848", + "fileId": "2950", "contributors": [ { "id": 14775946, "username": "Beas", - "totalCosts": 46.46, + "totalCosts": 241.39, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" } ] }, { - "fileId": "2840", + "fileId": "2680", "contributors": [ { "id": 14775946, "username": "Beas", - "totalCosts": 396.93, + "totalCosts": 839.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 82.82, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + "id": 15071649, + "username": "budomcity", + "totalCosts": 91.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15071649/medium/0ae631185ea5bf1ae0215a74903d1c8d.png" + }, + { + "id": 15809583, + "username": "mn895532", + "totalCosts": 61.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15809583/medium/e63f59ae9d5cb8307bd4d5f5d23be4a4.jpeg" }, { "id": 15894449, "username": "wosek_", - "totalCosts": 76.76, + "totalCosts": 25.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 15483158, + "username": "Buki92", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15483158/medium/47aea7d184be65fcf5ab1d5f8749ca4e_default.png" } ] }, { - "fileId": "2846", + "fileId": "2684", "contributors": [ { "id": 14775946, "username": "Beas", - "totalCosts": 627.21, + "totalCosts": 284.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { "id": 15894449, "username": "wosek_", - "totalCosts": 152.51, + "totalCosts": 17.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - }, - { - "id": 15381630, - "username": "p_gwizdak", - "totalCosts": 118.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15381630/medium/419ca8faf5b651c0ab7f7123a3a4fd95.jpeg" - }, - { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 47.47, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" } ] }, { - "fileId": "2842", + "fileId": "2962", "contributors": [ { "id": 14775946, "username": "Beas", - "totalCosts": 130.29, + "totalCosts": 180.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 14802836, + "username": "Ryeore", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" } ] }, { - "fileId": "2798", + "fileId": "2954", "contributors": [ { "id": 14775946, "username": "Beas", - "totalCosts": 17.17, + "totalCosts": 35.35, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" } ] }, { - "fileId": "2792", + "fileId": "2672", "contributors": [ + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 1293.81, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 384.81, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + }, { "id": 14775946, "username": "Beas", - "totalCosts": 67.67, + "totalCosts": 127.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + }, + { + "id": 15994051, + "username": "csgo7777gg", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15994051/medium/5ffbfdb7c384b441588b3f63ed171d90.png" } ] }, { - "fileId": "2762", + "fileId": "5565", "contributors": [ - { - "id": 14775946, - "username": "Beas", - "totalCosts": 516.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, { "id": 15894449, "username": "wosek_", - "totalCosts": 154.53, + "totalCosts": 787.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 98.98, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + "id": 15054269, + "username": "karolproksa", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15054269/medium/c3c3359c1de314d91ff42a2957c78168_default.png" + }, + { + "id": 15514622, + "username": "sebastianpaluch", + "totalCosts": 10.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15514622/medium/038694fd3070ed326b089e13cb7750a3.jpeg" + }, + { + "id": 15381630, + "username": "p_gwizdak", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15381630/medium/419ca8faf5b651c0ab7f7123a3a4fd95.jpeg" + }, + { + "id": 15567317, + "username": "Aarona", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15567317/medium/4d6c3c25d6fff43f7e795643d2e0e632.jpg" } ] }, { - "fileId": "3002", + "fileId": "2946", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 290.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 371.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14759220, - "username": "arturlesniewski", - "totalCosts": 288.86, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14759220/medium/ce0dfc426c882d10a157bb152afe3a16.png" + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 246.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" }, { - "id": 14113969, - "username": "mbiesiad", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" + "id": 14610346, + "username": "Ziomal", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14610346/medium/1ff5715fb5662e73f24d7960f83e0479_default.png" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15891369, + "username": "kacperm", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15891369/medium/8ab205674e1044c3621ab01c2d938cc2_default.png" }, { - "id": 14607372, - "username": "anastazja.k1", + "id": 14604868, + "username": "ctx2012", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14604868/medium/c6b287b0f1d173faedce0806420fc57b.jpeg" + }, + { + "id": 14610974, + "username": "siefca", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14610974/medium/194bb472f4f7da37c64b787db637ec50_default.png" + }, + { + "id": 14607686, + "username": "bubabu123", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14607686/medium/666d22e806ac35803cd52f1c45e93ac2_default.png" + }, + { + "id": 14816306, + "username": "Coppka", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14816306/medium/e6b16332c695ea9e29db0e5aa83b9331.png" + }, + { + "id": 14775946, + "username": "Beas", "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14607372/medium/6cd353ca427fa175908898882a3aaea1_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" } ] }, { - "fileId": "3056", + "fileId": "2926", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 599.94, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 464.6, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" }, { "id": 15894449, "username": "wosek_", - "totalCosts": 140.39, + "totalCosts": 68.68, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 14610346, + "username": "Ziomal", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14610346/medium/1ff5715fb5662e73f24d7960f83e0479_default.png" } ] }, { - "fileId": "3100", + "fileId": "6440", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 510.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 406.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15771025, + "username": "Andrzej1072", + "totalCosts": 62.62, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" } ] }, { - "fileId": "3074", + "fileId": "7314", + "contributors": [ + { + "id": 15381630, + "username": "p_gwizdak", + "totalCosts": 1026.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15381630/medium/419ca8faf5b651c0ab7f7123a3a4fd95.jpeg" + }, + { + "id": 15771025, + "username": "Andrzej1072", + "totalCosts": 200.99, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" + } + ] + }, + { + "fileId": "2958", "contributors": [ + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 3421.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, { "id": 14775946, "username": "Beas", - "totalCosts": 1222.1, + "totalCosts": 2648.22, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 1335.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + }, { "id": 14802836, "username": "Ryeore", @@ -40412,5630 +42831,6087 @@ ] }, { - "fileId": "2994", + "fileId": "7320", "contributors": [ - { - "id": 14775946, - "username": "Beas", - "totalCosts": 2122.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, { "id": 15894449, "username": "wosek_", - "totalCosts": 55.55, + "totalCosts": 1239.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15364756, + "username": "bellasob", + "totalCosts": 284.82, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15364756/medium/7fcfefb61008e61669ea2fde377683cb_default.png" + }, + { + "id": 14674204, + "username": "m.nowaczyk1", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14674204/medium/2cfe1887baf97ff9a143025679bed40e.JPG" } ] }, { - "fileId": "2986", + "fileId": "8019", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 1596.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 545.4, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] }, { - "fileId": "3088", + "fileId": "6161", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 836.28, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 14933675, + "username": "JuliannaMlynarska", + "totalCosts": 158.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14933675/medium/0a154caf851ba66ad323ab1b30379663.jpg" + } + ] + }, + { + "fileId": "6163", + "contributors": [ + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 722.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 14933675, + "username": "JuliannaMlynarska", + "totalCosts": 143.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14933675/medium/0a154caf851ba66ad323ab1b30379663.jpg" + }, + { + "id": 15264742, + "username": "jaszczomb", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15264742/medium/864cdac6f83f6d96f5a231668ed65849.png" + }, + { + "id": 14113969, + "username": "mbiesiad", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" } ] }, { - "fileId": "2980", + "fileId": "5557", "contributors": [ { "id": 15894449, "username": "wosek_", - "totalCosts": 258.56, + "totalCosts": 303, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14775946, - "username": "Beas", - "totalCosts": 251.49, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15003781, + "username": "krysia0196", + "totalCosts": 221.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15003781/medium/5a35c3e1503904e970787a6c1b14b084_default.png" + } + ] + }, + { + "fileId": "6185", + "contributors": [ + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 734.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, + { + "id": 14113969, + "username": "mbiesiad", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" + } + ] + }, + { + "fileId": "6165", + "contributors": [ { "id": 15284800, "username": "msliwinski123", - "totalCosts": 165.64, + "totalCosts": 259.57, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15894449, + "username": "wosek_", + "totalCosts": 241.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] }, { - "fileId": "3082", + "fileId": "8023", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 21.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 1986.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + } + ] + }, + { + "fileId": "6167", + "contributors": [ + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 564.59, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15894449, + "username": "wosek_", + "totalCosts": 217.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 14113969, + "username": "mbiesiad", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" + } + ] + }, + { + "fileId": "6183", + "contributors": [ + { + "id": 15894449, + "username": "wosek_", + "totalCosts": 772.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 15224914, + "username": "legendarek", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15224914/medium/f834d6656654aa33f1b17f0b273e2ddc.jpeg" } ] }, { - "fileId": "2998", + "fileId": "5563", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 1011.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 1718.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 20.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15966401, + "username": "daniel.zarzecki047", + "totalCosts": 370.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966401/medium/fa1d0a5129bf7a77c98232488dfc9d98.png" }, { - "id": 15894449, - "username": "wosek_", - "totalCosts": 20.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15654629, + "username": "Arek14482307", + "totalCosts": 284.82, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15654629/medium/c970a4e9c8e664fff4f5d188168d1eb3.jpg" } ] }, { - "fileId": "3036", + "fileId": "7525", "contributors": [ - { - "id": 14775946, - "username": "Beas", - "totalCosts": 556.51, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, { "id": 15894449, "username": "wosek_", - "totalCosts": 228.26, + "totalCosts": 907.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15891369, + "username": "kacperm", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15891369/medium/8ab205674e1044c3621ab01c2d938cc2_default.png" } ] }, { - "fileId": "3010", + "fileId": "8027", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 1008.99, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 1058.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15966401, + "username": "daniel.zarzecki047", + "totalCosts": 26.26, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966401/medium/fa1d0a5129bf7a77c98232488dfc9d98.png" } ] }, { - "fileId": "3018", + "fileId": "7529", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 367.64, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, - { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15894449, + "username": "wosek_", + "totalCosts": 671.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] }, { - "fileId": "3006", + "fileId": "7537", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 710.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, - { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15894449, + "username": "wosek_", + "totalCosts": 371.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] }, { - "fileId": "3092", + "fileId": "7541", "contributors": [ { - "id": 14759220, - "username": "arturlesniewski", - "totalCosts": 649.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14759220/medium/ce0dfc426c882d10a157bb152afe3a16.png" - }, - { - "id": 14775946, - "username": "Beas", - "totalCosts": 383.8, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15891369, + "username": "kacperm", + "totalCosts": 679.73, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15891369/medium/8ab205674e1044c3621ab01c2d938cc2_default.png" }, { "id": 15894449, "username": "wosek_", - "totalCosts": 45.45, + "totalCosts": 226.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + }, + { + "id": 15284800, + "username": "msliwinski123", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" } ] }, { - "fileId": "3024", + "fileId": "7521", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, - { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15894449, + "username": "wosek_", + "totalCosts": 186.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] }, { - "fileId": "2950", + "fileId": "8035", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 241.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, - { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15894449, + "username": "wosek_", + "totalCosts": 1194.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] }, { - "fileId": "2680", + "fileId": "6187", "contributors": [ - { - "id": 14775946, - "username": "Beas", - "totalCosts": 839.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, - { - "id": 15071649, - "username": "budomcity", - "totalCosts": 91.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15071649/medium/0ae631185ea5bf1ae0215a74903d1c8d.png" - }, - { - "id": 15809583, - "username": "mn895532", - "totalCosts": 61.61, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15809583/medium/e63f59ae9d5cb8307bd4d5f5d23be4a4.jpeg" - }, { "id": 15894449, "username": "wosek_", - "totalCosts": 25.25, + "totalCosts": 2348.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 15483158, - "username": "Buki92", + "id": 15891369, + "username": "kacperm", + "totalCosts": 239.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15891369/medium/8ab205674e1044c3621ab01c2d938cc2_default.png" + }, + { + "id": 14113969, + "username": "mbiesiad", "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15483158/medium/47aea7d184be65fcf5ab1d5f8749ca4e_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" } ] }, { - "fileId": "2684", + "fileId": "6518", "contributors": [ - { - "id": 14775946, - "username": "Beas", - "totalCosts": 284.82, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, { "id": 15894449, "username": "wosek_", - "totalCosts": 17.17, + "totalCosts": 851.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] }, { - "fileId": "2962", + "fileId": "6524", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 180.79, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 885.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15921847, + "username": "adrian-pusty", + "totalCosts": 208.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15921847/medium/5ab50081cb5e98a40782221efcda3a42.jpeg" } ] }, { - "fileId": "2954", + "fileId": "6526", "contributors": [ { - "id": 14775946, - "username": "Beas", - "totalCosts": 35.35, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 2057.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] }, { - "fileId": "2672", + "fileId": "7591", "contributors": [ { "id": 15894449, "username": "wosek_", - "totalCosts": 1293.81, + "totalCosts": 2013.94, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - }, - { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 384.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" - }, - { - "id": 14775946, - "username": "Beas", - "totalCosts": 127.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" - }, - { - "id": 15994051, - "username": "csgo7777gg", - "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15994051/medium/5ffbfdb7c384b441588b3f63ed171d90.png" } ] }, { - "fileId": "5565", + "fileId": "6428", "contributors": [ { "id": 15894449, "username": "wosek_", - "totalCosts": 787.8, + "totalCosts": 1631.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 15054269, - "username": "karolproksa", - "totalCosts": 22.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15054269/medium/c3c3359c1de314d91ff42a2957c78168_default.png" - }, + "id": 15821191, + "username": "jkmharambe", + "totalCosts": 106.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15821191/medium/98569265061586f339bdfcbfcaba42fd_default.png" + } + ] + }, + { + "fileId": "7465", + "contributors": [ { - "id": 15514622, - "username": "sebastianpaluch", - "totalCosts": 10.1, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15514622/medium/038694fd3070ed326b089e13cb7750a3.jpeg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 3210.79, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { - "id": 15381630, - "username": "p_gwizdak", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15381630/medium/419ca8faf5b651c0ab7f7123a3a4fd95.jpeg" - }, + "id": 15966401, + "username": "daniel.zarzecki047", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966401/medium/fa1d0a5129bf7a77c98232488dfc9d98.png" + } + ] + }, + { + "fileId": "7533", + "contributors": [ { - "id": 15567317, - "username": "Aarona", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15567317/medium/4d6c3c25d6fff43f7e795643d2e0e632.jpg" + "id": 15894449, + "username": "wosek_", + "totalCosts": 306.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] }, { - "fileId": "2946", + "fileId": "7919", "contributors": [ { "id": 15894449, "username": "wosek_", - "totalCosts": 371.68, + "totalCosts": 1321.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + } + ] + } + ] + }, + { + "lang": "pt-br", + "data": [ + { + "fileId": "2966", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 477.73, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 246.44, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + "id": 14636118, + "username": "frontedu", + "totalCosts": 71.71, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14636118/medium/d3d3ec3fab34702c4b19674b06e1ddff.png" }, { - "id": 14610346, - "username": "Ziomal", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14610346/medium/1ff5715fb5662e73f24d7960f83e0479_default.png" + "id": 14677262, + "username": "paulagoes", + "totalCosts": 69.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14677262/medium/abca98edc7fcbc7867e6aa1e9d6bddfb.jpeg" }, { - "id": 15891369, - "username": "kacperm", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15891369/medium/8ab205674e1044c3621ab01c2d938cc2_default.png" + "id": 14787358, + "username": "leideribeiro9150", + "totalCosts": 69.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787358/medium/23937ae5016b2a370875018580c2905b.jpeg" }, { - "id": 14604868, - "username": "ctx2012", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14604868/medium/c6b287b0f1d173faedce0806420fc57b.jpeg" + "id": 14922369, + "username": "halley.oliveira", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14922369/medium/c91c158a8482cfbea025748acc623b80_default.png" }, { - "id": 14610974, - "username": "siefca", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14610974/medium/194bb472f4f7da37c64b787db637ec50_default.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 14607686, - "username": "bubabu123", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14607686/medium/666d22e806ac35803cd52f1c45e93ac2_default.png" + "id": 14733356, + "username": "isadorasst", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733356/medium/1c669e45c53fc5c3653082d0d04727ad_default.png" }, { - "id": 14816306, - "username": "Coppka", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14816306/medium/e6b16332c695ea9e29db0e5aa83b9331.png" + "id": 15240392, + "username": "kaioPoentes", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15240392/medium/bb269e410561d6b5854bcd5a0a61b358.jpeg" }, { - "id": 14775946, - "username": "Beas", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15405030, + "username": "Yoann3", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15405030/medium/2e9f0dada88ba25d3880c78b8a32ba14_default.png" } ] }, { - "fileId": "2926", + "fileId": "7320", "contributors": [ { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 464.6, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + "id": 15363256, + "username": "keyla88", + "totalCosts": 860.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15363256/medium/ec0ae3c1332b4c006ba843c9969716f5.png" }, { - "id": 15894449, - "username": "wosek_", - "totalCosts": 68.68, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15226778, + "username": "paulogio", + "totalCosts": 415.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" }, { - "id": 14610346, - "username": "Ziomal", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14610346/medium/1ff5715fb5662e73f24d7960f83e0479_default.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 49.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "6440", + "fileId": "6161", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 410.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 14702518, + "username": "Byrde", + "totalCosts": 158.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14702518/medium/cc9b682031319fe073d73822ee71f11a_default.png" }, { - "id": 15771025, - "username": "Andrzej1072", - "totalCosts": 72.72, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "7314", + "fileId": "6163", "contributors": [ { - "id": 15381630, - "username": "p_gwizdak", - "totalCosts": 1026.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15381630/medium/419ca8faf5b651c0ab7f7123a3a4fd95.jpeg" + "id": 14702518, + "username": "Byrde", + "totalCosts": 346.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14702518/medium/cc9b682031319fe073d73822ee71f11a_default.png" }, { - "id": 15771025, - "username": "Andrzej1072", - "totalCosts": 200.99, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 138.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 33.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "2958", + "fileId": "5557", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 3421.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 14957477, + "username": "asdcBRA", + "totalCosts": 221.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" }, { - "id": 14775946, - "username": "Beas", - "totalCosts": 2648.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" + "id": 15082587, + "username": "PLimabrz", + "totalCosts": 199.98, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082587/medium/ed074e71e299c475727935bfe53359aa_default.png" }, { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 1335.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" + "id": 15072851, + "username": "digocherri", + "totalCosts": 126.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15072851/medium/a35aa7f19e9250a5e916b2092556235e.png" }, { - "id": 14802836, - "username": "Ryeore", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" + "id": 15088607, + "username": "Fred.rodovalho", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15088607/medium/60387eb11f8184d82ef350969d7006f4_default.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15240392, + "username": "kaioPoentes", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15240392/medium/bb269e410561d6b5854bcd5a0a61b358.jpeg" } ] }, { - "fileId": "7320", + "fileId": "6185", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 1239.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 237.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 80.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + }, + { + "id": 14790884, + "username": "rubemarjr18", + "totalCosts": 72.72, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14790884/medium/1cec4afc62c4a1a483abe29e485d48e2.jpg" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 69.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15364756, - "username": "bellasob", - "totalCosts": 284.82, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15364756/medium/7fcfefb61008e61669ea2fde377683cb_default.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" }, { - "id": 14674204, - "username": "m.nowaczyk1", + "id": 15317682, + "username": "junowoz", "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14674204/medium/2cfe1887baf97ff9a143025679bed40e.JPG" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "8019", + "fileId": "6165", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 545.4, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - } - ] - }, - { - "fileId": "6161", - "contributors": [ + "id": 15214190, + "username": "felipecardosoruff", + "totalCosts": 76.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15214190/medium/05a412a9e565b4b662dce5d9f39dfaa8.jpeg" + }, { - "id": 14933675, - "username": "JuliannaMlynarska", - "totalCosts": 158.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14933675/medium/0a154caf851ba66ad323ab1b30379663.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 64.64, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "6163", + "fileId": "6167", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 728.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15116197, + "username": "marciob", + "totalCosts": 410.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15116197/medium/defe31fc631358c105140f44b22e84f7.png" }, { - "id": 14933675, - "username": "JuliannaMlynarska", - "totalCosts": 143.42, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14933675/medium/0a154caf851ba66ad323ab1b30379663.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 117.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15264742, - "username": "jaszczomb", - "totalCosts": 12.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15264742/medium/864cdac6f83f6d96f5a231668ed65849.png" + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 35.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" }, { - "id": 14113969, - "username": "mbiesiad", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "5557", + "fileId": "7569", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 303, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - }, - { - "id": 15003781, - "username": "krysia0196", - "totalCosts": 221.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15003781/medium/5a35c3e1503904e970787a6c1b14b084_default.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 375.72, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "6185", + "fileId": "6398", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 734.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15188518, + "username": "Matheus_Ferreira", + "totalCosts": 260.58, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15188518/medium/6390516aed2ed06ec760ae6ed81d3e09.png" }, { - "id": 14113969, - "username": "mbiesiad", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "6165", + "fileId": "6400", "contributors": [ { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 259.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" - }, - { - "id": 15894449, - "username": "wosek_", - "totalCosts": 241.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15210560, + "username": "Vitor_Pinheiro", + "totalCosts": 181.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15210560/medium/ff8ea1936b838affc178037b3d436634.jpg" } ] }, { - "fileId": "8023", + "fileId": "6404", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 1991.72, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15226778, + "username": "paulogio", + "totalCosts": 150.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" } ] }, { - "fileId": "6167", + "fileId": "6446", "contributors": [ { - "id": 15284800, - "username": "msliwinski123", - "totalCosts": 594.89, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" - }, - { - "id": 15894449, - "username": "wosek_", - "totalCosts": 217.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - }, - { - "id": 14113969, - "username": "mbiesiad", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 268.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "6183", + "fileId": "6408", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 266.64, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15226778, + "username": "paulogio", + "totalCosts": 202, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" }, { - "id": 15224914, - "username": "legendarek", - "totalCosts": 13.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15224914/medium/f834d6656654aa33f1b17f0b273e2ddc.jpeg" + "id": 15376854, + "username": "RenanDeveloper", + "totalCosts": 112.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "5563", + "fileId": "6448", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 1740.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 316.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15966401, - "username": "daniel.zarzecki047", - "totalCosts": 392.89, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966401/medium/fa1d0a5129bf7a77c98232488dfc9d98.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 119.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15654629, - "username": "Arek14482307", - "totalCosts": 284.82, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15654629/medium/c970a4e9c8e664fff4f5d188168d1eb3.jpg" + "id": 15260596, + "username": "Zepphire", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15260596/medium/cb3b9f65b0b6d8338eb83bd78128df3b.jpeg" } ] }, { - "fileId": "7525", + "fileId": "7565", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 907.99, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - }, - { - "id": 15891369, - "username": "kacperm", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15891369/medium/8ab205674e1044c3621ab01c2d938cc2_default.png" + "id": 14845960, + "username": "matusame", + "totalCosts": 661.55, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14845960/medium/2b9e2f8505875b313fc59f15bb51edab.jpg" } ] }, { - "fileId": "8027", + "fileId": "6416", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 1058.48, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - }, - { - "id": 15966401, - "username": "daniel.zarzecki047", - "totalCosts": 26.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966401/medium/fa1d0a5129bf7a77c98232488dfc9d98.png" + "id": 15210560, + "username": "Vitor_Pinheiro", + "totalCosts": 163.62, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15210560/medium/ff8ea1936b838affc178037b3d436634.jpg" } ] }, { - "fileId": "7529", + "fileId": "6392", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 671.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - } - ] - }, - { - "fileId": "7537", - "contributors": [ + "id": 15797935, + "username": "florita", + "totalCosts": 494.9, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15797935/medium/d50b4242e896ee8d17a6a7547f77f598_default.png" + }, { - "id": 15894449, - "username": "wosek_", - "totalCosts": 371.68, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15245258, + "username": "pedroxbm", + "totalCosts": 473.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15245258/medium/561e3ccf7fbe927b61111e79f7ffdd9a_default.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 431.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15241638, + "username": "Panegali", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" } ] }, { - "fileId": "7541", + "fileId": "6388", "contributors": [ { - "id": 15891369, - "username": "kacperm", - "totalCosts": 679.73, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15891369/medium/8ab205674e1044c3621ab01c2d938cc2_default.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 318.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15894449, - "username": "wosek_", - "totalCosts": 226.24, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15165600, + "username": "Horberlan", + "totalCosts": 71.71, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" }, { - "id": 15284800, - "username": "msliwinski123", + "id": 15431346, + "username": "BenedettiLucca", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15431346/medium/d5bf45d5fbceebd23be3d23b2f8c8a1a_default.png" + }, + { + "id": 15121067, + "username": "DiegoCabral", "totalCosts": 30.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" - } - ] - }, - { - "fileId": "7521", - "contributors": [ + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + }, { - "id": 15894449, - "username": "wosek_", - "totalCosts": 186.85, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "8035", + "fileId": "5553", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 1194.83, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" - } - ] - }, - { - "fileId": "6187", - "contributors": [ + "id": 14957477, + "username": "asdcBRA", + "totalCosts": 506.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + }, { - "id": 15894449, - "username": "wosek_", - "totalCosts": 2348.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15082587, + "username": "PLimabrz", + "totalCosts": 268.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082587/medium/ed074e71e299c475727935bfe53359aa_default.png" }, { - "id": 15891369, - "username": "kacperm", - "totalCosts": 239.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15891369/medium/8ab205674e1044c3621ab01c2d938cc2_default.png" + "id": 15165600, + "username": "Horberlan", + "totalCosts": 245.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" }, { - "id": 14113969, - "username": "mbiesiad", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14113969/medium/71ce960729f39fa1a2a0f23b48b8d8fe.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 26.26, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15088607, + "username": "Fred.rodovalho", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15088607/medium/60387eb11f8184d82ef350969d7006f4_default.png" + }, + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + }, + { + "id": 14633592, + "username": "Jhosephecacau", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.png" + }, + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" } ] }, { - "fileId": "6518", + "fileId": "7585", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 851.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 206.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "6524", + "fileId": "5555", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 889.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 232.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15921847, - "username": "adrian-pusty", - "totalCosts": 208.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15921847/medium/5ab50081cb5e98a40782221efcda3a42.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 66.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 14957477, + "username": "asdcBRA", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" } ] }, { - "fileId": "6526", + "fileId": "7581", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 2059.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "7591", + "fileId": "7589", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 2013.94, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 77.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "6428", + "fileId": "6412", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 1631.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1059.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15821191, - "username": "jkmharambe", - "totalCosts": 106.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15821191/medium/98569265061586f339bdfcbfcaba42fd_default.png" - } - ] - }, - { - "fileId": "7465", - "contributors": [ + "id": 13986387, + "username": "rafarocha", + "totalCosts": 602.97, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, { - "id": 15894449, - "username": "wosek_", - "totalCosts": 3235.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15728117, + "username": "alnrsnd", + "totalCosts": 461.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15728117/medium/7631d966177edc87bcb5a0cbd146ca21_default.png" }, { - "id": 15966401, - "username": "daniel.zarzecki047", - "totalCosts": 29.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966401/medium/fa1d0a5129bf7a77c98232488dfc9d98.png" - } - ] - }, - { - "fileId": "7533", - "contributors": [ + "id": 15269576, + "username": "camolina", + "totalCosts": 437.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15269576/medium/1a3566292dbbb3d62c42cba932c6509c_default.png" + }, + { + "id": 15657153, + "username": "leomarar", + "totalCosts": 119.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657153/medium/83f088e12e6711ed615f8dd77c3f2be7_default.png" + }, { - "id": 15894449, - "username": "wosek_", - "totalCosts": 306.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 15417044, + "username": "venus_alva", + "totalCosts": 80.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15417044/medium/dcb0e341b1708f9b01351dcf1703d406.jpeg" } ] }, { - "fileId": "7919", + "fileId": "5559", "contributors": [ { - "id": 15894449, - "username": "wosek_", - "totalCosts": 1321.08, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 488.84, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14957477, + "username": "asdcBRA", + "totalCosts": 348.45, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + }, + { + "id": 15373000, + "username": "Fradique", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15373000/medium/c69edcb05bc9178ba24cd99f3373ea9b.JPG" } ] - } - ] - }, - { - "lang": "pt-br", - "data": [ + }, { - "fileId": "2966", + "fileId": "7316", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 535.3, + "totalCosts": 2107.87, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14636118, - "username": "frontedu", - "totalCosts": 71.71, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14636118/medium/d3d3ec3fab34702c4b19674b06e1ddff.png" - }, - { - "id": 14677262, - "username": "paulagoes", - "totalCosts": 69.69, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14677262/medium/abca98edc7fcbc7867e6aa1e9d6bddfb.jpeg" + "id": 15454064, + "username": "thormiranda", + "totalCosts": 520.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15454064/medium/9a469555fbc3d3c781b12b438d7f0211_default.png" }, { - "id": 14787358, - "username": "leideribeiro9150", - "totalCosts": 69.69, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787358/medium/23937ae5016b2a370875018580c2905b.jpeg" - }, + "id": 15317682, + "username": "junowoz", + "totalCosts": 63.63, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + } + ] + }, + { + "fileId": "5561", + "contributors": [ { - "id": 14922369, - "username": "halley.oliveira", - "totalCosts": 15.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14922369/medium/c91c158a8482cfbea025748acc623b80_default.png" + "id": 14957477, + "username": "asdcBRA", + "totalCosts": 1105.95, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 15.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 15082587, + "username": "PLimabrz", + "totalCosts": 474.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082587/medium/ed074e71e299c475727935bfe53359aa_default.png" }, { - "id": 14733356, - "username": "isadorasst", - "totalCosts": 15.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733356/medium/1c669e45c53fc5c3653082d0d04727ad_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 151.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15240392, - "username": "kaioPoentes", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15240392/medium/bb269e410561d6b5854bcd5a0a61b358.jpeg" + "id": 15025129, + "username": "willianpaixao", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15025129/medium/ef1be11b8020b45c11dbd5a0bbea1aac_default.png" }, { - "id": 15405030, - "username": "Yoann3", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15405030/medium/2e9f0dada88ba25d3880c78b8a32ba14_default.png" + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" } ] }, { - "fileId": "7320", + "fileId": "7461", "contributors": [ - { - "id": 15363256, - "username": "keyla88", - "totalCosts": 860.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15363256/medium/ec0ae3c1332b4c006ba843c9969716f5.png" - }, - { - "id": 15226778, - "username": "paulogio", - "totalCosts": 415.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 49.49, + "totalCosts": 1076.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 609.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "6161", + "fileId": "2766", "contributors": [ { - "id": 14702518, - "username": "Byrde", - "totalCosts": 158.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14702518/medium/cc9b682031319fe073d73822ee71f11a_default.png" + "id": 14712840, + "username": "FelipeMaitan", + "totalCosts": 229.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14712840/medium/cfd99eb4dba39d60d3f78be48724cebe.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 1.01, + "totalCosts": 228.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - } - ] - }, - { - "fileId": "6163", - "contributors": [ + }, { - "id": 14702518, - "username": "Byrde", - "totalCosts": 346.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14702518/medium/cc9b682031319fe073d73822ee71f11a_default.png" + "id": 15160588, + "username": "R_Dark", + "totalCosts": 202, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15160588/medium/3903ef1af6faeec9604b6db70b5e6233_default.png" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 144.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14956337, + "username": "lidianycs", + "totalCosts": 189.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14956337/medium/918c6540264cbd711a5a6616ebb2c3ee.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 33.33, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 14659020, + "username": "DanielTaqueto", + "totalCosts": 115.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14659020/medium/56f5cb0b5617518f3cd660cb1834c9d7_default.png" + }, + { + "id": 14687376, + "username": "KlmnZ", + "totalCosts": 90.9, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 89.89, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" } ] }, { - "fileId": "5557", + "fileId": "2868", "contributors": [ { - "id": 14957477, - "username": "asdcBRA", - "totalCosts": 221.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + "id": 14725224, + "username": "julioabrahao", + "totalCosts": 104.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14725224/medium/71c544a5f76fec25c5a1f156b4e74474.jpeg" }, { - "id": 15082587, - "username": "PLimabrz", - "totalCosts": 199.98, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082587/medium/ed074e71e299c475727935bfe53359aa_default.png" + "id": 14713748, + "username": "flyng12", + "totalCosts": 88.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14713748/medium/c9ee0ecb2c8ecdb140bc6fdf8e7002b4.jpg" }, { - "id": 15072851, - "username": "digocherri", - "totalCosts": 126.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15072851/medium/a35aa7f19e9250a5e916b2092556235e.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 85.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" }, { - "id": 15088607, - "username": "Fred.rodovalho", - "totalCosts": 19.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15088607/medium/60387eb11f8184d82ef350969d7006f4_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 54.54, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 37.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 15435992, + "username": "italosantana", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 7.07, + "totalCosts": 5.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15240392, - "username": "kaioPoentes", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15240392/medium/bb269e410561d6b5854bcd5a0a61b358.jpeg" + "id": 14712840, + "username": "FelipeMaitan", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14712840/medium/cfd99eb4dba39d60d3f78be48724cebe.png" } ] }, { - "fileId": "6185", + "fileId": "2872", "contributors": [ { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 237.35, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 14733026, + "username": "iborba", + "totalCosts": 375.72, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733026/medium/ffb6aa67fea863e4898aa8a6e5c69e87.jpeg" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 80.8, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 116.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 14790884, - "username": "rubemarjr18", - "totalCosts": 72.72, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14790884/medium/1cec4afc62c4a1a483abe29e485d48e2.jpg" + "id": 14687376, + "username": "KlmnZ", + "totalCosts": 110.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" + }, + { + "id": 14727924, + "username": "YuriNascimento", + "totalCosts": 92.92, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14727924/medium/64551c4f06627c3dc665d55f0c240b6f.jpeg" + }, + { + "id": 15446690, + "username": "danielevilela", + "totalCosts": 48.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15446690/medium/27e62df7f8d8d68479bced43d27bd11c.jpeg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 69.69, + "totalCosts": 41.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, - { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" - }, { "id": 15317682, "username": "junowoz", - "totalCosts": 7.07, + "totalCosts": 23.23, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "6165", + "fileId": "5529", "contributors": [ - { - "id": 15214190, - "username": "felipecardosoruff", - "totalCosts": 76.76, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15214190/medium/05a412a9e565b4b662dce5d9f39dfaa8.jpeg" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 64.64, + "totalCosts": 745.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, + { + "id": 15469896, + "username": "matheussalcedoruiz", + "totalCosts": 160.59, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15469896/medium/ce6eed4a36d8d7724e2d1537a41f7337.jpeg" + }, { "id": 15317682, "username": "junowoz", - "totalCosts": 16.16, + "totalCosts": 60.6, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" - } - ] - }, - { - "fileId": "6167", - "contributors": [ + }, { - "id": 15116197, - "username": "marciob", - "totalCosts": 422.18, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15116197/medium/defe31fc631358c105140f44b22e84f7.png" + "id": 15435992, + "username": "italosantana", + "totalCosts": 49.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 124.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14861994, + "username": "DougPimentel", + "totalCosts": 34.34, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861994/medium/6be234f83f98e8db755074900cf25b3d_default.png" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 46.46, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 15830251, + "username": "paodequeijocompingado", + "totalCosts": 31.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15830251/medium/df305c6124650d8f50add955b4770062_default.png" + }, + { + "id": 15849127, + "username": "IagoEmanuel15", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" + }, + { + "id": 15646745, + "username": "Mateusduartelima", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15646745/medium/cc73bc2eeaa1181c059fedc12a42dca5_default.png" }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 1.01, + "totalCosts": 9.09, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "7569", + "fileId": "2894", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 375.72, + "totalCosts": 820.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14607364, + "username": "Guzzt", + "totalCosts": 177.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14607364/medium/36f0bb0ce943d4d6b9b4de36a71d160a_default.png" + }, + { + "id": 14837106, + "username": "rofis", + "totalCosts": 46.46, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837106/medium/e87698d84d41483de2a57483ff5d9455.jpeg" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 14956337, + "username": "lidianycs", + "totalCosts": 36.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14956337/medium/918c6540264cbd711a5a6616ebb2c3ee.jpg" + }, + { + "id": 15080541, + "username": "Don_Martinez", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" } ] }, { - "fileId": "6398", + "fileId": "7453", "contributors": [ - { - "id": 15188518, - "username": "Matheus_Ferreira", - "totalCosts": 260.58, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15188518/medium/6390516aed2ed06ec760ae6ed81d3e09.png" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 22.22, + "totalCosts": 1856.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 15376854, + "username": "RenanDeveloper", + "totalCosts": 153.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" } ] }, { - "fileId": "6400", + "fileId": "2704", "contributors": [ { - "id": 15210560, - "username": "Vitor_Pinheiro", - "totalCosts": 181.8, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15210560/medium/ff8ea1936b838affc178037b3d436634.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 608.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14711642, + "username": "kenowlee", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14711642/medium/cc1ab7ad933f06b0fc99de7457c6b3c9.jpeg" + }, + { + "id": 14749926, + "username": "gabekings", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14749926/medium/85cf883e521a00c66e9d0aed65b93778_default.png" } ] }, { - "fileId": "6404", + "fileId": "7503", "contributors": [ { - "id": 15226778, - "username": "paulogio", - "totalCosts": 150.49, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 5180.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "6446", + "fileId": "7495", "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 745.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 268.66, + "totalCosts": 56.56, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "6408", + "fileId": "7605", "contributors": [ { - "id": 15226778, - "username": "paulogio", - "totalCosts": 202, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" - }, - { - "id": 15376854, - "username": "RenanDeveloper", - "totalCosts": 112.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" + "id": 15790247, + "username": "Callzonie", + "totalCosts": 1042.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15790247/medium/bff2a46c8f3d2ee8027ca05362da9757_default.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 19.19, + "totalCosts": 33.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "6448", + "fileId": "7601", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 316.13, + "totalCosts": 2021.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 119.18, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15724803, + "username": "Izabel_chaves", + "totalCosts": 588.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15724803/medium/7f2b4419d308a52a62f3b8f9ca9b4adf.jpg" }, { - "id": 15260596, - "username": "Zepphire", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15260596/medium/cb3b9f65b0b6d8338eb83bd78128df3b.jpeg" - } - ] - }, - { - "fileId": "7565", - "contributors": [ - { - "id": 14845960, - "username": "matusame", - "totalCosts": 661.55, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14845960/medium/2b9e2f8505875b313fc59f15bb51edab.jpg" - } - ] - }, - { - "fileId": "6416", - "contributors": [ - { - "id": 15210560, - "username": "Vitor_Pinheiro", - "totalCosts": 163.62, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15210560/medium/ff8ea1936b838affc178037b3d436634.jpg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 34.34, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "6392", + "fileId": "6564", "contributors": [ { - "id": 15797935, - "username": "florita", - "totalCosts": 494.9, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15797935/medium/d50b4242e896ee8d17a6a7547f77f598_default.png" - }, - { - "id": 15245258, - "username": "pedroxbm", - "totalCosts": 473.69, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15245258/medium/561e3ccf7fbe927b61111e79f7ffdd9a_default.png" + "id": 15226778, + "username": "paulogio", + "totalCosts": 979.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 431.27, + "totalCosts": 126.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15241638, - "username": "Panegali", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" } ] }, { - "fileId": "6388", + "fileId": "2702", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 318.15, + "totalCosts": 578.73, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, - { - "id": 15165600, - "username": "Horberlan", - "totalCosts": 71.71, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" - }, - { - "id": 15431346, - "username": "BenedettiLucca", - "totalCosts": 38.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15431346/medium/d5bf45d5fbceebd23be3d23b2f8c8a1a_default.png" - }, - { - "id": 15121067, - "username": "DiegoCabral", - "totalCosts": 30.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 4.04, + "totalCosts": 292.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - } - ] - }, - { - "fileId": "5553", - "contributors": [ + }, { - "id": 14957477, - "username": "asdcBRA", - "totalCosts": 506.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 67.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" }, { - "id": 15082587, - "username": "PLimabrz", - "totalCosts": 268.66, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082587/medium/ed074e71e299c475727935bfe53359aa_default.png" + "id": 15646745, + "username": "Mateusduartelima", + "totalCosts": 61.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15646745/medium/cc73bc2eeaa1181c059fedc12a42dca5_default.png" }, { - "id": 15165600, - "username": "Horberlan", - "totalCosts": 245.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" + "id": 14733026, + "username": "iborba", + "totalCosts": 32.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733026/medium/ffb6aa67fea863e4898aa8a6e5c69e87.jpeg" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 26.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 15661337, + "username": "dariovlopes", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15661337/medium/7bdad35b42bb2e81620660e6456a90f9.jpeg" }, { - "id": 15088607, - "username": "Fred.rodovalho", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15088607/medium/60387eb11f8184d82ef350969d7006f4_default.png" + "id": 14631192, + "username": "rafael.yanase", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631192/medium/543e6b0627ae51d46ab52d78181f46be.jpeg" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 22.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 14950197, + "username": "SlashHash", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14950197/medium/20d99cde077abaee189a2dc7908d26f2.png" }, { - "id": 14633592, - "username": "Jhosephecacau", - "totalCosts": 22.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.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", - "totalCosts": 14.14, + "totalCosts": 2.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 15080541, + "username": "Don_Martinez", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" } ] }, { - "fileId": "7585", + "fileId": "7507", "contributors": [ - { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 206.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 4.04, + "totalCosts": 773.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 194.93, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "5555", + "fileId": "7499", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 232.3, + "totalCosts": 940.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 66.66, + "totalCosts": 513.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 14957477, - "username": "asdcBRA", - "totalCosts": 29.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + "id": 15830291, + "username": "juanlozano01534", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15830291/medium/2163d30ac425b25292277c1e7b77f930.png" } ] }, { - "fileId": "7581", + "fileId": "6562", "contributors": [ { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 833.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "7589", + "fileId": "2712", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 77.77, + "totalCosts": 685.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - } - ] - }, - { - "fileId": "6412", - "contributors": [ + }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 1067.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 14978447, + "username": "DanDaro", + "totalCosts": 118.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14978447/medium/6c0a867cdc72f871a6dd35862afa1562.jpg" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 615.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14751422, + "username": "Alexusz", + "totalCosts": 116.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14751422/medium/1b45356738263d0753c5d9f87eacce86.jpg" }, { - "id": 15728117, - "username": "alnrsnd", - "totalCosts": 482.78, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15728117/medium/7631d966177edc87bcb5a0cbd146ca21_default.png" + "id": 14814106, + "username": "agatavital13", + "totalCosts": 73.73, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" }, { - "id": 15269576, - "username": "camolina", - "totalCosts": 459.55, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15269576/medium/1a3566292dbbb3d62c42cba932c6509c_default.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 18.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 15657153, - "username": "leomarar", - "totalCosts": 119.18, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657153/medium/83f088e12e6711ed615f8dd77c3f2be7_default.png" + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" }, { - "id": 15417044, - "username": "venus_alva", - "totalCosts": 80.8, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15417044/medium/dcb0e341b1708f9b01351dcf1703d406.jpeg" + "id": 14788998, + "username": "ccosds", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14788998/medium/c017c1ad3be88d19989d9a4619c3a4a4_default.png" } ] }, { - "fileId": "5559", + "fileId": "2710", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 488.84, + "totalCosts": 410.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14957477, - "username": "asdcBRA", - "totalCosts": 348.45, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + "id": 14738174, + "username": "viniciusfortuna", + "totalCosts": 199.98, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14738174/medium/a23ee260095a908ffd92c2aa8dd6d7e6.jpeg" }, { - "id": 15373000, - "username": "Fradique", - "totalCosts": 13.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15373000/medium/c69edcb05bc9178ba24cd99f3373ea9b.JPG" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 149.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 13193338, + "username": "brunoviniciusrp", + "totalCosts": 145.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13193338/medium/9f0dcf40dbd88d79fb56251f14440d90.jpg" + }, + { + "id": 14776668, + "username": "ana.rodrigues", + "totalCosts": 130.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14776668/medium/33b69f1a9782852b41fd3fc57c204d12_default.png" } ] }, { - "fileId": "7316", + "fileId": "6550", "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1646.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 2123.02, + "totalCosts": 22.22, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15454064, - "username": "thormiranda", - "totalCosts": 520.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15454064/medium/9a469555fbc3d3c781b12b438d7f0211_default.png" - }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 63.63, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "5561", + "fileId": "6546", "contributors": [ - { - "id": 14957477, - "username": "asdcBRA", - "totalCosts": 1105.95, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" - }, - { - "id": 15082587, - "username": "PLimabrz", - "totalCosts": 474.7, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082587/medium/ed074e71e299c475727935bfe53359aa_default.png" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 151.5, + "totalCosts": 892.84, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15025129, - "username": "willianpaixao", - "totalCosts": 22.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15025129/medium/ef1be11b8020b45c11dbd5a0bbea1aac_default.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 97.97, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 21.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 15374622, + "username": "ronyszu", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15374622/medium/9fb47af6577de3e35fe691bb1dd02370.jpeg" } ] }, { - "fileId": "7461", + "fileId": "6540", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 1106.96, + "totalCosts": 539.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 609.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "2766", + "fileId": "2716", "contributors": [ { - "id": 14712840, - "username": "FelipeMaitan", - "totalCosts": 229.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14712840/medium/cfd99eb4dba39d60d3f78be48724cebe.png" + "id": 14787358, + "username": "leideribeiro9150", + "totalCosts": 366.63, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787358/medium/23937ae5016b2a370875018580c2905b.jpeg" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 228.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 94.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 15160588, - "username": "R_Dark", - "totalCosts": 202, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15160588/medium/3903ef1af6faeec9604b6db70b5e6233_default.png" + "id": 14788680, + "username": "lucasmelo.dev", + "totalCosts": 92.92, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14788680/medium/21e30608f219ad1c980e7b7a5eabbf5b_default.png" }, { - "id": 14956337, - "username": "lidianycs", - "totalCosts": 189.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14956337/medium/918c6540264cbd711a5a6616ebb2c3ee.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 87.87, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14659020, - "username": "DanielTaqueto", - "totalCosts": 115.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14659020/medium/56f5cb0b5617518f3cd660cb1834c9d7_default.png" + "id": 15532281, + "username": "betonogueira", + "totalCosts": 76.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15532281/medium/7c1f4bf3375c193933afb4f969bd27e9_default.png" }, { "id": 14687376, "username": "KlmnZ", - "totalCosts": 90.9, + "totalCosts": 28.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 89.89, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 14785220, + "username": "rokinot", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14785220/medium/4a6f6852105b606735b08d45c74b0fd7.png" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 14768694, + "username": "ricardo85x", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14768694/medium/e63f9b8d3d789dc08be178d569abef0d.jpeg" } ] }, { - "fileId": "2868", + "fileId": "2884", "contributors": [ { - "id": 14725224, - "username": "julioabrahao", - "totalCosts": 104.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14725224/medium/71c544a5f76fec25c5a1f156b4e74474.jpeg" + "id": 15435992, + "username": "italosantana", + "totalCosts": 1054.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" }, { - "id": 14713748, - "username": "flyng12", - "totalCosts": 88.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14713748/medium/c9ee0ecb2c8ecdb140bc6fdf8e7002b4.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 265.63, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 85.85, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 14787358, + "username": "leideribeiro9150", + "totalCosts": 146.45, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787358/medium/23937ae5016b2a370875018580c2905b.jpeg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 54.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15317682, + "username": "junowoz", + "totalCosts": 40.4, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 37.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 14896188, + "username": "Megalo-don", + "totalCosts": 26.26, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14896188/medium/f5f379d22d24f76f3a69d28b32c68e08.png" }, { - "id": 15435992, - "username": "italosantana", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" + "id": 15158848, + "username": "massardo", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15158848/medium/e71dc81c159e8a7f2393636435ad6e09.jpeg" }, + { + "id": 14837284, + "username": "PaN-0-1", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837284/medium/7f1ad04832bb028fe66564804f5326ee.png" + } + ] + }, + { + "fileId": "2880", + "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 5.05, + "totalCosts": 188.87, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14712840, - "username": "FelipeMaitan", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14712840/medium/cfd99eb4dba39d60d3f78be48724cebe.png" + "id": 14687376, + "username": "KlmnZ", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" } ] }, { - "fileId": "2872", + "fileId": "7479", "contributors": [ { - "id": 14733026, - "username": "iborba", - "totalCosts": 375.72, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733026/medium/ffb6aa67fea863e4898aa8a6e5c69e87.jpeg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 1856.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 116.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" - }, + "id": 15515516, + "username": "MCreimer", + "totalCosts": 105.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "7328", + "contributors": [ { - "id": 14687376, - "username": "KlmnZ", - "totalCosts": 110.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" - }, + "id": 15515516, + "username": "MCreimer", + "totalCosts": 151.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "7340", + "contributors": [ { - "id": 14727924, - "username": "YuriNascimento", - "totalCosts": 92.92, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14727924/medium/64551c4f06627c3dc665d55f0c240b6f.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1489.75, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15446690, - "username": "danielevilela", - "totalCosts": 48.48, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15446690/medium/27e62df7f8d8d68479bced43d27bd11c.jpeg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 75.75, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7334", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 947.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, + { + "id": 15522236, + "username": "ferchahud", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522236/medium/d62cad2430fd3f86c7866e71e786133c_default.png" + } + ] + }, + { + "fileId": "7336", + "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 41.41, + "totalCosts": 965.56, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "5529", + "fileId": "7483", "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 490.86, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 754.47, + "totalCosts": 357.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, + } + ] + }, + { + "fileId": "2888", + "contributors": [ { - "id": 15469896, - "username": "matheussalcedoruiz", - "totalCosts": 160.59, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15469896/medium/ce6eed4a36d8d7724e2d1537a41f7337.jpeg" + "id": 14801934, + "username": "allanalves", + "totalCosts": 280.78, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14801934/medium/71d98e9687c56244dd24046eb47d56fe_default.png" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 60.6, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 127.26, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { "id": 15435992, "username": "italosantana", - "totalCosts": 49.49, + "totalCosts": 62.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" }, { - "id": 14861994, - "username": "DougPimentel", - "totalCosts": 34.34, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861994/medium/6be234f83f98e8db755074900cf25b3d_default.png" + "id": 15317682, + "username": "junowoz", + "totalCosts": 57.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + } + ] + }, + { + "fileId": "2852", + "contributors": [ + { + "id": 14382632, + "username": "gabe_san_", + "totalCosts": 188.87, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" }, { - "id": 15830251, - "username": "paodequeijocompingado", - "totalCosts": 31.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15830251/medium/df305c6124650d8f50add955b4770062_default.png" + "id": 14824370, + "username": "wholopes", + "totalCosts": 174.73, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14824370/medium/824bf476fdbf27598a1617f08815c2da_default.png" }, { - "id": 15849127, - "username": "IagoEmanuel15", - "totalCosts": 20.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15646745, - "username": "Mateusduartelima", - "totalCosts": 11.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15646745/medium/cc73bc2eeaa1181c059fedc12a42dca5_default.png" + "id": 15742705, + "username": "franciscosanchezzavala7", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15742705/medium/30cabea660ed3468b1d8fd9e701b0328.jpeg" }, { - "id": 15515516, - "username": "MCreimer", + "id": 15114963, + "username": "tiagoyonamine.eth", "totalCosts": 9.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" } ] }, { - "fileId": "2894", + "fileId": "2908", "contributors": [ + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 206.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, + { + "id": 14858450, + "username": "marcio.vallep", + "totalCosts": 132.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14858450/medium/78a1cc0054358247a009cd3993270109.jpeg" + }, + { + "id": 14382632, + "username": "gabe_san_", + "totalCosts": 114.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 820.12, + "totalCosts": 94.94, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14607364, - "username": "Guzzt", - "totalCosts": 177.76, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14607364/medium/36f0bb0ce943d4d6b9b4de36a71d160a_default.png" - }, - { - "id": 14837106, - "username": "rofis", + "id": 14789894, + "username": "Cruca", "totalCosts": 46.46, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837106/medium/e87698d84d41483de2a57483ff5d9455.jpeg" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14789894/medium/7f33e6af512c3e8b86b684aa8f93ba8f_default.png" }, { "id": 14875990, "username": "guilhermevendramini", - "totalCosts": 38.38, + "totalCosts": 34.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 14956337, - "username": "lidianycs", - "totalCosts": 36.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14956337/medium/918c6540264cbd711a5a6616ebb2c3ee.jpg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 15080541, "username": "Don_Martinez", - "totalCosts": 2.02, + "totalCosts": 16.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" } ] }, { - "fileId": "7453", + "fileId": "7597", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 1856.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, - { - "id": 15376854, - "username": "RenanDeveloper", - "totalCosts": 153.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" + "id": 15422032, + "username": "Fritzhoy", + "totalCosts": 116.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15422032/medium/a2df65c9d9309dec39402a0175f3a57f.png" } ] }, { - "fileId": "2704", + "fileId": "2856", "contributors": [ { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 608.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 15317682, + "username": "junowoz", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 14711642, - "username": "kenowlee", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14711642/medium/cc1ab7ad933f06b0fc99de7457c6b3c9.jpeg" + "id": 15849127, + "username": "IagoEmanuel15", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" }, { - "id": 14749926, - "username": "gabekings", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14749926/medium/85cf883e521a00c66e9d0aed65b93778_default.png" + "id": 14789894, + "username": "Cruca", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14789894/medium/7f33e6af512c3e8b86b684aa8f93ba8f_default.png" + }, + { + "id": 14837284, + "username": "PaN-0-1", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837284/medium/7f1ad04832bb028fe66564804f5326ee.png" } ] }, { - "fileId": "7503", + "fileId": "2860", "contributors": [ - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 5180.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 17.17, + "totalCosts": 671.65, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - } - ] - }, - { - "fileId": "7495", - "contributors": [ + }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 784.77, + "totalCosts": 135.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 56.56, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14787358, + "username": "leideribeiro9150", + "totalCosts": 55.55, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787358/medium/23937ae5016b2a370875018580c2905b.jpeg" + }, + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 52.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + }, + { + "id": 15080541, + "username": "Don_Martinez", + "totalCosts": 48.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" + }, + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" } ] }, { - "fileId": "7605", + "fileId": "2752", "contributors": [ { - "id": 15790247, - "username": "Callzonie", - "totalCosts": 1042.32, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15790247/medium/bff2a46c8f3d2ee8027ca05362da9757_default.png" + "id": 14702518, + "username": "Byrde", + "totalCosts": 105.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14702518/medium/cc9b682031319fe073d73822ee71f11a_default.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 33.33, + "totalCosts": 93.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15376854, + "username": "RenanDeveloper", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" } ] }, { - "fileId": "7601", + "fileId": "2786", + "contributors": [] + }, + { + "fileId": "5533", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 2040.2, + "totalCosts": 253.51, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15724803, - "username": "Izabel_chaves", - "totalCosts": 588.83, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15724803/medium/7f2b4419d308a52a62f3b8f9ca9b4adf.jpg" + "id": 14967689, + "username": "leonardoluan2018", + "totalCosts": 126.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14967689/medium/e9e918da4dba2bd0a481b1cb2e1473c3.png" }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 34.34, + "totalCosts": 52.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "6564", + "fileId": "2914", "contributors": [ - { - "id": 15226778, - "username": "paulogio", - "totalCosts": 979.7, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 126.25, + "totalCosts": 366.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - } - ] - }, - { - "fileId": "2702", - "contributors": [ + }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 578.73, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14648500, + "username": "eduardogomes", + "totalCosts": 74.74, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14648500/medium/5a5e8744d81337987ba555be0e3dfdf2_default.png" + }, + { + "id": 14837284, + "username": "PaN-0-1", + "totalCosts": 37.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837284/medium/7f1ad04832bb028fe66564804f5326ee.png" }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 292.9, + "totalCosts": 36.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15350616, - "username": "Carlos_Silva", - "totalCosts": 67.67, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" - }, - { - "id": 15646745, - "username": "Mateusduartelima", - "totalCosts": 61.61, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15646745/medium/cc73bc2eeaa1181c059fedc12a42dca5_default.png" + "id": 15171274, + "username": "matheuspoleza", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15171274/medium/116eb81288db5943f5421648cd28c040.png" }, { - "id": 14733026, - "username": "iborba", - "totalCosts": 32.32, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733026/medium/ffb6aa67fea863e4898aa8a6e5c69e87.jpeg" - }, + "id": 15468184, + "username": "0x7Ot", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15468184/medium/b625726e5392ff762e38fc10a38155c1.png" + } + ] + }, + { + "fileId": "5525", + "contributors": [ { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1764.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15661337, - "username": "dariovlopes", - "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15661337/medium/7bdad35b42bb2e81620660e6456a90f9.jpeg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 540.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14631192, - "username": "rafael.yanase", - "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631192/medium/543e6b0627ae51d46ab52d78181f46be.jpeg" + "id": 15221742, + "username": "Marlonfernandes7", + "totalCosts": 102.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15221742/medium/54e5adfe14e974d37dd5fb25bde84a77.png" }, { - "id": 14950197, - "username": "SlashHash", - "totalCosts": 12.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14950197/medium/20d99cde077abaee189a2dc7908d26f2.png" + "id": 15036833, + "username": "Cubano.brito", + "totalCosts": 75.75, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15036833/medium/4988573ecbd20a37fe3504a4fd98b573_default.png" }, { "id": 14247352, "username": "borja_reverter", - "totalCosts": 2.02, + "totalCosts": 45.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" - }, - { - "id": 15080541, - "username": "Don_Martinez", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" } ] }, { - "fileId": "7507", + "fileId": "6568", "contributors": [ - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 773.66, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 194.93, + "totalCosts": 2318.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "7499", + "fileId": "6572", "contributors": [ - { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 940.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 513.08, + "totalCosts": 357.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15830291, - "username": "juanlozano01534", - "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15830291/medium/2163d30ac425b25292277c1e7b77f930.png" - } - ] - }, - { - "fileId": "6562", - "contributors": [ - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 833.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15317682, + "username": "junowoz", + "totalCosts": 28.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "2712", + "fileId": "2898", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 685.79, + "totalCosts": 250.48, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14978447, - "username": "DanDaro", - "totalCosts": 118.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14978447/medium/6c0a867cdc72f871a6dd35862afa1562.jpg" - }, - { - "id": 14751422, - "username": "Alexusz", - "totalCosts": 116.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14751422/medium/1b45356738263d0753c5d9f87eacce86.jpg" - }, - { - "id": 14814106, - "username": "agatavital13", - "totalCosts": 73.73, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 239.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 18.18, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 14713664, + "username": "joaopaulomoraes", + "totalCosts": 150.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14713664/medium/2e6434d8e55ed74b8e43e168348d6ca0_default.png" }, { "id": 14247352, "username": "borja_reverter", - "totalCosts": 2.02, + "totalCosts": 16.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" }, { - "id": 14788998, - "username": "ccosds", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14788998/medium/c017c1ad3be88d19989d9a4619c3a4a4_default.png" + "id": 16099664, + "username": "yanvictorsn", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" } ] }, { - "fileId": "2710", + "fileId": "7609", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 410.06, + "totalCosts": 1067.57, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 14738174, - "username": "viniciusfortuna", - "totalCosts": 199.98, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14738174/medium/a23ee260095a908ffd92c2aa8dd6d7e6.jpeg" - }, - { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 149.48, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" - }, + } + ] + }, + { + "fileId": "7617", + "contributors": [ { - "id": 13193338, - "username": "brunoviniciusrp", - "totalCosts": 145.44, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13193338/medium/9f0dcf40dbd88d79fb56251f14440d90.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 343.4, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14776668, - "username": "ana.rodrigues", - "totalCosts": 130.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14776668/medium/33b69f1a9782852b41fd3fc57c204d12_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "6550", + "fileId": "7324", "contributors": [ - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 1646.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 22.22, + "totalCosts": 1145.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "6546", + "fileId": "2778", "contributors": [ { "id": 15515516, "username": "MCreimer", - "totalCosts": 892.84, + "totalCosts": 512.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 97.97, + "totalCosts": 431.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15374622, - "username": "ronyszu", - "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15374622/medium/9fb47af6577de3e35fe691bb1dd02370.jpeg" + "id": 15435992, + "username": "italosantana", + "totalCosts": 66.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 51.51, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + }, + { + "id": 14821880, + "username": "jonathanandrade10", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14821880/medium/59c6c840e75ec03af8b88b5005744137.jpeg" + }, + { + "id": 14891780, + "username": "GabrielaAndere", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14891780/medium/27acbd59c98271b2bbb592ad38bc5f87.jpg" } ] }, { - "fileId": "6540", + "fileId": "7619", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 539.34, + "totalCosts": 1490.76, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "2716", + "fileId": "7621", "contributors": [ { - "id": 14787358, - "username": "leideribeiro9150", - "totalCosts": 366.63, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787358/medium/23937ae5016b2a370875018580c2905b.jpeg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 725.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "2776", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 115.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 94.94, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 14725224, + "username": "julioabrahao", + "totalCosts": 93.93, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14725224/medium/71c544a5f76fec25c5a1f156b4e74474.jpeg" }, { - "id": 14788680, - "username": "lucasmelo.dev", - "totalCosts": 92.92, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14788680/medium/21e30608f219ad1c980e7b7a5eabbf5b_default.png" + "id": 15376854, + "username": "RenanDeveloper", + "totalCosts": 78.78, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 87.87, + "totalCosts": 44.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15532281, - "username": "betonogueira", - "totalCosts": 76.76, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15532281/medium/7c1f4bf3375c193933afb4f969bd27e9_default.png" - }, - { - "id": 14687376, - "username": "KlmnZ", - "totalCosts": 28.28, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" - }, - { - "id": 14785220, - "username": "rokinot", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14785220/medium/4a6f6852105b606735b08d45c74b0fd7.png" + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" }, { - "id": 14768694, - "username": "ricardo85x", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14768694/medium/e63f9b8d3d789dc08be178d569abef0d.jpeg" + "id": 15317682, + "username": "junowoz", + "totalCosts": 36.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "2884", + "fileId": "6173", "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 325.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, { "id": 15435992, "username": "italosantana", - "totalCosts": 1054.44, + "totalCosts": 148.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" }, + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 87.87, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, + { + "id": 14788998, + "username": "ccosds", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14788998/medium/c017c1ad3be88d19989d9a4619c3a4a4_default.png" + }, + { + "id": 15131067, + "username": "zazirskas", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15131067/medium/fc246a5fdbf0502a4a21ca7740bc19c8.jpeg" + }, + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + } + ] + }, + { + "fileId": "2876", + "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 265.63, + "totalCosts": 1371.58, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, - { - "id": 14787358, - "username": "leideribeiro9150", - "totalCosts": 146.45, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787358/medium/23937ae5016b2a370875018580c2905b.jpeg" - }, { "id": 15317682, "username": "junowoz", - "totalCosts": 40.4, + "totalCosts": 521.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 14896188, - "username": "Megalo-don", - "totalCosts": 26.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14896188/medium/f5f379d22d24f76f3a69d28b32c68e08.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 496.92, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15158848, - "username": "massardo", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15158848/medium/e71dc81c159e8a7f2393636435ad6e09.jpeg" + "id": 15584703, + "username": "fcarva", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15584703/medium/fb380bf7a259c295e182898d9c5e5d34.png" }, { - "id": 14837284, - "username": "PaN-0-1", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837284/medium/7f1ad04832bb028fe66564804f5326ee.png" + "id": 14844258, + "username": "lincoln019", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14844258/medium/134fdb9bbfb5aaf221eee2470f148e58_default.png" + }, + { + "id": 14633592, + "username": "Jhosephecacau", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.png" } ] }, { - "fileId": "2880", + "fileId": "6169", "contributors": [ + { + "id": 15158848, + "username": "massardo", + "totalCosts": 126.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15158848/medium/e71dc81c159e8a7f2393636435ad6e09.jpeg" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 188.87, + "totalCosts": 20.2, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14687376, - "username": "KlmnZ", - "totalCosts": 12.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" } ] }, { - "fileId": "7479", + "fileId": "2736", "contributors": [ { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 1856.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14814106, + "username": "agatavital13", + "totalCosts": 88.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 105.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" } ] }, { - "fileId": "7328", + "fileId": "2740", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 151.5, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15317682, + "username": "junowoz", + "totalCosts": 74.74, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "7340", + "fileId": "2748", "contributors": [ - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 1573.58, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 75.75, + "totalCosts": 68.68, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "7334", + "fileId": "2732", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 947.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 14814106, + "username": "agatavital13", + "totalCosts": 57.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" }, { - "id": 15522236, - "username": "ferchahud", - "totalCosts": 22.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522236/medium/d62cad2430fd3f86c7866e71e786133c_default.png" + "id": 15241638, + "username": "Panegali", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "7336", + "fileId": "2722", "contributors": [ { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 965.56, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 15038969, + "username": "lalemcar260", + "totalCosts": 242.4, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15038969/medium/ba1eb8218fc49239854c28720092989e.png" + }, + { + "id": 14814106, + "username": "agatavital13", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" } ] }, { - "fileId": "7483", + "fileId": "2744", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 490.86, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 14778302, + "username": "TheBrazilianDude", + "totalCosts": 63.63, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14778302/medium/37d2cd78d18169087cd02610e823c074_default.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 357.54, + "totalCosts": 57.57, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + }, + { + "id": 15241638, + "username": "Panegali", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" } ] }, { - "fileId": "2888", + "fileId": "2730", "contributors": [ { - "id": 14801934, - "username": "allanalves", - "totalCosts": 280.78, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14801934/medium/71d98e9687c56244dd24046eb47d56fe_default.png" + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + }, + { + "id": 15887043, + "username": "vivianebuge", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15887043/medium/c0732f0c01e671b0863789e7427b6a98_default.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 127.26, + "totalCosts": 8.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15435992, - "username": "italosantana", - "totalCosts": 62.62, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" - }, + "id": 14814106, + "username": "agatavital13", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" + } + ] + }, + { + "fileId": "6424", + "contributors": [ { - "id": 15317682, - "username": "junowoz", - "totalCosts": 57.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 295.93, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "2852", + "fileId": "2726", "contributors": [ { - "id": 14382632, - "username": "gabe_san_", - "totalCosts": 188.87, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" + "id": 15080541, + "username": "Don_Martinez", + "totalCosts": 27.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" }, { - "id": 14824370, - "username": "wholopes", - "totalCosts": 174.73, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14824370/medium/824bf476fdbf27598a1617f08815c2da_default.png" + "id": 15027079, + "username": "wmduuh", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15027079/medium/827d9b374220d233a59c4a1f2ffb1452.jpg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 38.38, + "totalCosts": 6.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15742705, - "username": "franciscosanchezzavala7", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15742705/medium/30cabea660ed3468b1d8fd9e701b0328.jpeg" - }, - { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 9.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 15621485, + "username": "behzin", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15621485/medium/77e5257f434dea7677892a0d4a3f712f_default.png" } ] }, { - "fileId": "2908", + "fileId": "2756", "contributors": [ { "id": 14247352, "username": "borja_reverter", - "totalCosts": 206.04, + "totalCosts": 378.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" }, { - "id": 14858450, - "username": "marcio.vallep", - "totalCosts": 132.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14858450/medium/78a1cc0054358247a009cd3993270109.jpeg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 183.82, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14382632, - "username": "gabe_san_", - "totalCosts": 114.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 121.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "6384", + "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 94.94, + "totalCosts": 3359.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14789894, - "username": "Cruca", + "id": 15431346, + "username": "BenedettiLucca", + "totalCosts": 739.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15431346/medium/d5bf45d5fbceebd23be3d23b2f8c8a1a_default.png" + }, + { + "id": 15430526, + "username": "arthuralfenascosta", "totalCosts": 46.46, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14789894/medium/7f33e6af512c3e8b86b684aa8f93ba8f_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15430526/medium/c8a8d1b819742228ea538934cb5cac49.png" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 34.34, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 43.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + } + ] + }, + { + "fileId": "5489", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 1755.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 23.23, + "totalCosts": 574.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15080541, - "username": "Don_Martinez", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 307.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 80.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "7597", + "fileId": "5487", "contributors": [ { - "id": 15422032, - "username": "Fritzhoy", - "totalCosts": 116.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15422032/medium/a2df65c9d9309dec39402a0175f3a57f.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 697.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 53.53, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + } + ] + }, + { + "fileId": "5485", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 2638.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 880.72, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15214190, + "username": "felipecardosoruff", + "totalCosts": 53.53, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15214190/medium/05a412a9e565b4b662dce5d9f39dfaa8.jpeg" } ] }, { - "fileId": "2856", + "fileId": "5483", "contributors": [ { - "id": 15317682, - "username": "junowoz", - "totalCosts": 19.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" - }, - { - "id": 15849127, - "username": "IagoEmanuel15", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" - }, - { - "id": 14789894, - "username": "Cruca", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14789894/medium/7f33e6af512c3e8b86b684aa8f93ba8f_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 2223.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 14837284, - "username": "PaN-0-1", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837284/medium/7f1ad04832bb028fe66564804f5326ee.png" + "id": 15522236, + "username": "ferchahud", + "totalCosts": 25.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522236/medium/d62cad2430fd3f86c7866e71e786133c_default.png" } ] }, { - "fileId": "2860", + "fileId": "6382", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 671.65, + "totalCosts": 3314.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 135.34, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, - { - "id": 14787358, - "username": "leideribeiro9150", - "totalCosts": 55.55, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787358/medium/23937ae5016b2a370875018580c2905b.jpeg" + "id": 15657153, + "username": "leomarar", + "totalCosts": 362.59, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657153/medium/83f088e12e6711ed615f8dd77c3f2be7_default.png" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 52.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" - }, + "id": 15435992, + "username": "italosantana", + "totalCosts": 254.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" + } + ] + }, + { + "fileId": "2830", + "contributors": [ { - "id": 15080541, - "username": "Don_Martinez", - "totalCosts": 48.48, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" + "id": 14667626, + "username": "matheusrrugolo", + "totalCosts": 451.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14667626/medium/8f3c59f10649fb1abbd53bee5614aa2b.jpeg" }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 14837106, + "username": "rofis", + "totalCosts": 66.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837106/medium/e87698d84d41483de2a57483ff5d9455.jpeg" } ] }, { - "fileId": "2752", + "fileId": "2818", "contributors": [ { - "id": 14702518, - "username": "Byrde", - "totalCosts": 105.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14702518/medium/cc9b682031319fe073d73822ee71f11a_default.png" + "id": 14845960, + "username": "matusame", + "totalCosts": 687.81, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14845960/medium/2b9e2f8505875b313fc59f15bb51edab.jpg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 93.93, + "totalCosts": 26.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15376854, - "username": "RenanDeveloper", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" } ] }, { - "fileId": "2786", - "contributors": [] - }, - { - "fileId": "5533", + "fileId": "2814", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 253.51, + "totalCosts": 516.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14967689, - "username": "leonardoluan2018", - "totalCosts": 126.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14967689/medium/e9e918da4dba2bd0a481b1cb2e1473c3.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 175.74, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 52.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 14544944, + "username": "emersonlaurentino", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14544944/medium/307497c490b2c0b11fd011f5f1938cf8.jpeg" } ] }, { - "fileId": "2914", + "fileId": "2822", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 366.63, + "totalCosts": 49.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, - { - "id": 14648500, - "username": "eduardogomes", - "totalCosts": 74.74, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14648500/medium/5a5e8744d81337987ba555be0e3dfdf2_default.png" - }, - { - "id": 14837284, - "username": "PaN-0-1", - "totalCosts": 37.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837284/medium/7f1ad04832bb028fe66564804f5326ee.png" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 36.36, + "totalCosts": 34.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, - { - "id": 15171274, - "username": "matheuspoleza", - "totalCosts": 8.08, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15171274/medium/116eb81288db5943f5421648cd28c040.png" - }, - { - "id": 15468184, - "username": "0x7Ot", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15468184/medium/b625726e5392ff762e38fc10a38155c1.png" } ] }, { - "fileId": "5525", + "fileId": "7473", "contributors": [ { "id": 15515516, "username": "MCreimer", - "totalCosts": 1777.6, + "totalCosts": 3303.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 540.35, + "totalCosts": 874.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15221742, - "username": "Marlonfernandes7", - "totalCosts": 102.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15221742/medium/54e5adfe14e974d37dd5fb25bde84a77.png" - }, - { - "id": 15036833, - "username": "Cubano.brito", - "totalCosts": 77.77, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15036833/medium/4988573ecbd20a37fe3504a4fd98b573_default.png" - }, - { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 47.47, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" - }, - { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 38.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" } ] }, { - "fileId": "6568", + "fileId": "2810", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 2332.09, + "totalCosts": 208.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 137.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" } ] }, { - "fileId": "6572", + "fileId": "2808", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 357.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 520.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 28.28, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" - } - ] - }, - { - "fileId": "2898", - "contributors": [ + "id": 14837106, + "username": "rofis", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837106/medium/e87698d84d41483de2a57483ff5d9455.jpeg" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 250.48, + "totalCosts": 46.46, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 239.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, - { - "id": 14713664, - "username": "joaopaulomoraes", - "totalCosts": 150.49, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14713664/medium/2e6434d8e55ed74b8e43e168348d6ca0_default.png" + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 15027079, + "username": "wmduuh", + "totalCosts": 10.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15027079/medium/827d9b374220d233a59c4a1f2ffb1452.jpg" }, { - "id": 16099664, - "username": "yanvictorsn", - "totalCosts": 13.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" + "id": 14837284, + "username": "PaN-0-1", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837284/medium/7f1ad04832bb028fe66564804f5326ee.png" } ] }, { - "fileId": "7609", + "fileId": "2826", "contributors": [ + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 48.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 1067.57, + "totalCosts": 13.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "7617", + "fileId": "2902", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 343.4, + "totalCosts": 3989.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 408.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + }, + { + "id": 15435992, + "username": "italosantana", + "totalCosts": 394.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" + }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 12.12, + "totalCosts": 99.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - } - ] - }, - { - "fileId": "7324", - "contributors": [ + }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 1145.34, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14815414, + "username": "KoelhoSec", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14815414/medium/cc746b15dd6d2fa3bc01369caaef44ed.png" } ] }, { - "fileId": "2778", + "fileId": "2804", "contributors": [ { "id": 15515516, "username": "MCreimer", - "totalCosts": 526.21, + "totalCosts": 2083.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, + { + "id": 14573604, + "username": "bceschini", + "totalCosts": 759.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14573604/medium/e07f0a64aea775f906b999491ca671d9.jpeg" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 431.27, + "totalCosts": 264.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15435992, - "username": "italosantana", - "totalCosts": 66.66, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" + "id": 15957415, + "username": "viniblack", + "totalCosts": 62.62, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15957415/medium/4a20bc04c8d7834f8f7b7e76ad4c7f97.jpeg" }, + { + "id": 12557683, + "username": "lucasrl", + "totalCosts": 44.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12557683/medium/5c01a0fc29af9e0b22d8d00c40fd8d61.jpg" + } + ] + }, + { + "fileId": "2848", + "contributors": [ { "id": 15317682, "username": "junowoz", - "totalCosts": 51.51, + "totalCosts": 106.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 14821880, - "username": "jonathanandrade10", - "totalCosts": 30.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14821880/medium/59c6c840e75ec03af8b88b5005744137.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 14891780, - "username": "GabrielaAndere", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14891780/medium/27acbd59c98271b2bbb592ad38bc5f87.jpg" + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, + { + "id": 14956337, + "username": "lidianycs", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14956337/medium/918c6540264cbd711a5a6616ebb2c3ee.jpg" } ] }, { - "fileId": "7619", + "fileId": "6171", "contributors": [ + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 647.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 1490.76, + "totalCosts": 58.58, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "7621", + "fileId": "2840", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 725.18, + "totalCosts": 148.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 46.46, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "2776", + "fileId": "6532", "contributors": [ { "id": 15515516, "username": "MCreimer", - "totalCosts": 115.14, + "totalCosts": 491.87, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "2846", + "contributors": [ + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 51.51, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 14725224, - "username": "julioabrahao", - "totalCosts": 93.93, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14725224/medium/71c544a5f76fec25c5a1f156b4e74474.jpeg" + "id": 14956337, + "username": "lidianycs", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14956337/medium/918c6540264cbd711a5a6616ebb2c3ee.jpg" + } + ] + }, + { + "fileId": "5521", + "contributors": [ + { + "id": 15000979, + "username": "mauri.lustosa", + "totalCosts": 74.74, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15000979/medium/d3463e880ee39ff00ec110108c7c1711.png" }, { - "id": 15376854, - "username": "RenanDeveloper", - "totalCosts": 78.78, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 65.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 44.44, + "totalCosts": 29.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15121067, - "username": "DiegoCabral", - "totalCosts": 39.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" - }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 36.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "6173", + "fileId": "2842", "contributors": [ - { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 325.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15435992, - "username": "italosantana", - "totalCosts": 148.47, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" - }, { "id": 14247352, "username": "borja_reverter", - "totalCosts": 87.87, + "totalCosts": 33.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" }, { - "id": 14788998, - "username": "ccosds", - "totalCosts": 38.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14788998/medium/c017c1ad3be88d19989d9a4619c3a4a4_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15131067, - "username": "zazirskas", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15131067/medium/fc246a5fdbf0502a4a21ca7740bc19c8.jpeg" + "id": 15317682, + "username": "junowoz", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "2876", + "fileId": "2798", "contributors": [ + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 186.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 1371.58, + "totalCosts": 72.72, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 521.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 496.92, + "totalCosts": 65.65, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15584703, - "username": "fcarva", + "id": 15317682, + "username": "junowoz", "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15584703/medium/fb380bf7a259c295e182898d9c5e5d34.png" - }, - { - "id": 14844258, - "username": "lincoln019", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14844258/medium/134fdb9bbfb5aaf221eee2470f148e58_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 14633592, - "username": "Jhosephecacau", + "id": 14382632, + "username": "gabe_san_", "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" } ] }, { - "fileId": "6169", + "fileId": "2792", "contributors": [ - { - "id": 15158848, - "username": "massardo", - "totalCosts": 126.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15158848/medium/e71dc81c159e8a7f2393636435ad6e09.jpeg" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 20.2, + "totalCosts": 500.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 13.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" - } - ] - }, - { - "fileId": "2736", - "contributors": [ + "id": 15515516, + "username": "MCreimer", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, { - "id": 14814106, - "username": "agatavital13", - "totalCosts": 99.99, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" + "id": 15241638, + "username": "Panegali", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 15080541, + "username": "Don_Martinez", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" } ] }, { - "fileId": "2740", + "fileId": "2762", "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, { "id": 15317682, "username": "junowoz", - "totalCosts": 74.74, + "totalCosts": 11.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + }, + { + "id": 15241638, + "username": "Panegali", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" } ] }, { - "fileId": "2748", + "fileId": "3128", "contributors": [ + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 407.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 68.68, + "totalCosts": 60.6, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "2732", + "fileId": "3002", "contributors": [ { - "id": 14814106, - "username": "agatavital13", - "totalCosts": 57.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 520.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 15241638, - "username": "Panegali", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" + "id": 19793, + "username": "cadu", + "totalCosts": 95.95, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/19793/medium/e2b4385d621e616e71301f11eaae32c5_default.png" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 14888266, + "username": "sandrogomes101", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14888266/medium/ec3720087a2af8b90ac90119f026a2f8.png" } ] }, { - "fileId": "2722", + "fileId": "6227", "contributors": [ { - "id": 15038969, - "username": "lalemcar260", + "id": 15158848, + "username": "massardo", + "totalCosts": 992.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15158848/medium/e71dc81c159e8a7f2393636435ad6e09.jpeg" + }, + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 465.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, + { + "id": 13986387, + "username": "rafarocha", "totalCosts": 253.51, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15038969/medium/ba1eb8218fc49239854c28720092989e.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14814106, - "username": "agatavital13", - "totalCosts": 20.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" + "id": 14790884, + "username": "rubemarjr18", + "totalCosts": 52.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14790884/medium/1cec4afc62c4a1a483abe29e485d48e2.jpg" + }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 50.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" } ] }, { - "fileId": "2744", + "fileId": "6223", "contributors": [ { - "id": 14778302, - "username": "TheBrazilianDude", - "totalCosts": 63.63, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14778302/medium/37d2cd78d18169087cd02610e823c074_default.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 368.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 57.57, + "totalCosts": 364.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 21.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" - }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 21.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 237.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" }, { - "id": 15241638, - "username": "Panegali", - "totalCosts": 9.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" + "id": 15584703, + "username": "fcarva", + "totalCosts": 102.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15584703/medium/fb380bf7a259c295e182898d9c5e5d34.png" } ] }, { - "fileId": "2730", + "fileId": "6225", "contributors": [ { "id": 15114963, "username": "tiagoyonamine.eth", - "totalCosts": 24.24, + "totalCosts": 256.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" }, - { - "id": 15887043, - "username": "vivianebuge", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15887043/medium/c0732f0c01e671b0863789e7427b6a98_default.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 8.08, + "totalCosts": 89.89, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14814106, - "username": "agatavital13", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 53.53, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" } ] }, { - "fileId": "6424", + "fileId": "6221", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 307.04, + "totalCosts": 294.92, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 135.34, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + }, + { + "id": 15376854, + "username": "RenanDeveloper", + "totalCosts": 36.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" + }, + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" } ] }, { - "fileId": "2726", + "fileId": "3082", "contributors": [ { - "id": 15080541, - "username": "Don_Martinez", - "totalCosts": 27.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" + "id": 13719925, + "username": "alexpaganmin", + "totalCosts": 707, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13719925/medium/d065a18c910db1080c95637ecc28d6da.jpg" }, { - "id": 15027079, - "username": "wmduuh", - "totalCosts": 21.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15027079/medium/827d9b374220d233a59c4a1f2ffb1452.jpg" + "id": 15317682, + "username": "junowoz", + "totalCosts": 301.99, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 6.06, + "totalCosts": 234.32, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15621485, - "username": "behzin", + "id": 15526425, + "username": "xReDzin", + "totalCosts": 47.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15526425/medium/69278630b1c357a38d62e3e762fcf45b.gif" + }, + { + "id": 15121067, + "username": "DiegoCabral", "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15621485/medium/77e5257f434dea7677892a0d4a3f712f_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" } ] }, { - "fileId": "2756", + "fileId": "3018", "contributors": [ { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 378.75, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 14981089, + "username": "daniloraisi", + "totalCosts": 132.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14981089/medium/37d319f7ff289b5141aea317cb808deb.jpeg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 183.82, + "totalCosts": 47.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 121.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 15912891, + "username": "Cristianoluizz", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15258752, + "username": "joserrbv", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15258752/medium/ec21ac21287dcdbd73ab57b6fb0dc50e_default.png" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" } ] }, { - "fileId": "6384", + "fileId": "3006", "contributors": [ { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 3386.53, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15431346, - "username": "BenedettiLucca", - "totalCosts": 739.32, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15431346/medium/d5bf45d5fbceebd23be3d23b2f8c8a1a_default.png" - }, - { - "id": 15430526, - "username": "arthuralfenascosta", - "totalCosts": 46.46, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15430526/medium/c8a8d1b819742228ea538934cb5cac49.png" + "id": 14382632, + "username": "gabe_san_", + "totalCosts": 108.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 43.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15317682, + "username": "junowoz", + "totalCosts": 27.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" } ] }, { - "fileId": "5489", + "fileId": "6239", "contributors": [ { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 1755.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 15422032, + "username": "Fritzhoy", + "totalCosts": 6739.73, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15422032/medium/a2df65c9d9309dec39402a0175f3a57f.png" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 574.69, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15165600, + "username": "Horberlan", + "totalCosts": 2645.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 307.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 15124669, + "username": "iankressin", + "totalCosts": 173.72, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15124669/medium/6fa8b8d345657331557c5c67de45680c.jpeg" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 80.8, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 52.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + }, + { + "id": 15446690, + "username": "danielevilela", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15446690/medium/27e62df7f8d8d68479bced43d27bd11c.jpeg" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 10.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "5487", + "fileId": "2950", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 713.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 273.71, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15454064, + "username": "thormiranda", + "totalCosts": 142.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15454064/medium/9a469555fbc3d3c781b12b438d7f0211_default.png" }, { "id": 15317682, "username": "junowoz", - "totalCosts": 53.53, + "totalCosts": 52.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "5485", + "fileId": "6183", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 2638.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15849127, + "username": "IagoEmanuel15", + "totalCosts": 92.92, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 880.72, + "totalCosts": 78.78, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15214190, - "username": "felipecardosoruff", - "totalCosts": 53.53, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15214190/medium/05a412a9e565b4b662dce5d9f39dfaa8.jpeg" - } - ] - }, - { - "fileId": "5483", - "contributors": [ + "id": 15623763, + "username": "luanitaa", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15623763/medium/09023a39325813d6499aa3ddf184f212_default.png" + }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 2223.01, + "totalCosts": 14.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15522236, - "username": "ferchahud", - "totalCosts": 25.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522236/medium/d62cad2430fd3f86c7866e71e786133c_default.png" + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, + { + "id": 14957477, + "username": "asdcBRA", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" } ] }, { - "fileId": "6382", + "fileId": "2680", "contributors": [ + { + "id": 13893213, + "username": "RelliuG", + "totalCosts": 314.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13893213/medium/88d6b8bda7b6073efd27b5a1799694cc.jpeg" + }, + { + "id": 14711810, + "username": "malzebu", + "totalCosts": 169.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14711810/medium/cd03191615e232f82ead1a505c725868.jpeg" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 3325.93, + "totalCosts": 44.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15657153, - "username": "leomarar", - "totalCosts": 362.59, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657153/medium/83f088e12e6711ed615f8dd77c3f2be7_default.png" + "id": 15575979, + "username": "MarianeNavarro", + "totalCosts": 43.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15575979/medium/06bee989c7903c83e2ebe29f4cb44d17.jpeg" }, { - "id": 15435992, - "username": "italosantana", - "totalCosts": 254.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "2830", + "fileId": "2684", "contributors": [ { - "id": 14667626, - "username": "matheusrrugolo", - "totalCosts": 457.53, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14667626/medium/8f3c59f10649fb1abbd53bee5614aa2b.jpeg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14837106, - "username": "rofis", - "totalCosts": 66.66, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837106/medium/e87698d84d41483de2a57483ff5d9455.jpeg" + "id": 15317682, + "username": "junowoz", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "2818", + "fileId": "2962", "contributors": [ { - "id": 14845960, - "username": "matusame", - "totalCosts": 687.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14845960/medium/2b9e2f8505875b313fc59f15bb51edab.jpg" + "id": 14636118, + "username": "frontedu", + "totalCosts": 158.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14636118/medium/d3d3ec3fab34702c4b19674b06e1ddff.png" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 26.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 65.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 14687376, + "username": "KlmnZ", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" } ] }, { - "fileId": "2814", + "fileId": "2954", "contributors": [ { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 516.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 175.74, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 14382632, + "username": "gabe_san_", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" }, { - "id": 14544944, - "username": "emersonlaurentino", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14544944/medium/307497c490b2c0b11fd011f5f1938cf8.jpeg" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" } ] }, { - "fileId": "2822", + "fileId": "5563", "contributors": [ + { + "id": 14957477, + "username": "asdcBRA", + "totalCosts": 1588.73, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 49.49, + "totalCosts": 178.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 34.34, + "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" } ] }, { - "fileId": "7473", + "fileId": "7529", "contributors": [ { "id": 15515516, "username": "MCreimer", - "totalCosts": 3303.71, + "totalCosts": 483.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 874.66, + "totalCosts": 48.48, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "2810", + "fileId": "7533", "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 230.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 208.06, + "totalCosts": 38.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 137.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" } ] }, { - "fileId": "2808", + "fileId": "7537", "contributors": [ { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 520.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" - }, - { - "id": 14837106, - "username": "rofis", - "totalCosts": 68.68, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837106/medium/e87698d84d41483de2a57483ff5d9455.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 251.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 46.46, + "totalCosts": 95.95, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7541", + "contributors": [ + { + "id": 15728117, + "username": "alnrsnd", + "totalCosts": 338.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15728117/medium/7631d966177edc87bcb5a0cbd146ca21_default.png" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 241.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15027079, - "username": "wmduuh", - "totalCosts": 10.1, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15027079/medium/827d9b374220d233a59c4a1f2ffb1452.jpg" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 231.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14837284, - "username": "PaN-0-1", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14837284/medium/7f1ad04832bb028fe66564804f5326ee.png" + "id": 16099664, + "username": "yanvictorsn", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" } ] }, { - "fileId": "2826", + "fileId": "7521", "contributors": [ { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 48.48, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 91.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 13.13, + "totalCosts": 31.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15887043, + "username": "vivianebuge", + "totalCosts": 28.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15887043/medium/c0732f0c01e671b0863789e7427b6a98_default.png" } ] }, { - "fileId": "2902", + "fileId": "2672", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 3989.5, + "totalCosts": 339.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 408.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 15652697, + "username": "ThewsyRum", + "totalCosts": 227.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15652697/medium/416cd66d87d185091af51f9aecb60262.jpeg" }, { - "id": 15435992, - "username": "italosantana", - "totalCosts": 394.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15435992/medium/61afc2a3a2417f17a118fea970030cbf.jpeg" + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 63.63, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 99.99, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 14687376, + "username": "KlmnZ", + "totalCosts": 58.58, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" }, { - "id": 14815414, - "username": "KoelhoSec", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14815414/medium/cc746b15dd6d2fa3bc01369caaef44ed.png" - } - ] - }, - { - "fileId": "2804", - "contributors": [ - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 2083.63, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" }, { - "id": 14573604, - "username": "bceschini", - "totalCosts": 759.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14573604/medium/e07f0a64aea775f906b999491ca671d9.jpeg" + "id": 15932353, + "username": "nickksoares", + "totalCosts": 25.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932353/medium/a722341af1e695a8a496f57be3f72a32.png" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 264.62, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 15575979, + "username": "MarianeNavarro", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15575979/medium/06bee989c7903c83e2ebe29f4cb44d17.jpeg" }, { - "id": 15957415, - "username": "viniblack", - "totalCosts": 62.62, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15957415/medium/4a20bc04c8d7834f8f7b7e76ad4c7f97.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 12557683, - "username": "lucasrl", - "totalCosts": 44.44, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12557683/medium/5c01a0fc29af9e0b22d8d00c40fd8d61.jpg" + "id": 15025129, + "username": "willianpaixao", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15025129/medium/ef1be11b8020b45c11dbd5a0bbea1aac_default.png" } ] }, { - "fileId": "2848", + "fileId": "5565", "contributors": [ { - "id": 15317682, - "username": "junowoz", - "totalCosts": 106.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 16099664, + "username": "yanvictorsn", + "totalCosts": 245.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 21.21, + "totalCosts": 207.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 14957477, + "username": "asdcBRA", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" }, { - "id": 14956337, - "username": "lidianycs", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14956337/medium/918c6540264cbd711a5a6616ebb2c3ee.jpg" - } - ] - }, - { - "fileId": "6171", - "contributors": [ + "id": 15912891, + "username": "Cristianoluizz", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" + }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 647.41, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 15646745, + "username": "Mateusduartelima", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15646745/medium/cc73bc2eeaa1181c059fedc12a42dca5_default.png" + }, + { + "id": 15756451, + "username": "Renatoossuna", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15756451/medium/5110e7d1d4cd5bd96c8ba7e33dbd3fa5_default.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 58.58, + "totalCosts": 3.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" - }, - { - "id": 15515516, - "username": "MCreimer", + "id": 15207648, + "username": "bettercallvictor.eth", "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15207648/medium/1e33933ce378946f204d7c76d7c246e5_default.png" } ] }, { - "fileId": "2840", + "fileId": "2946", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 148.47, + "totalCosts": 279.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 46.46, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 15431346, + "username": "BenedettiLucca", + "totalCosts": 80.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15431346/medium/d5bf45d5fbceebd23be3d23b2f8c8a1a_default.png" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 30.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" - } - ] - }, - { - "fileId": "6532", - "contributors": [ + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 491.87, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - } - ] - }, - { - "fileId": "2846", - "contributors": [ + "id": 14546464, + "username": "LucyCroft", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14546464/medium/23420a0e95c1f9a0fd75df5dba6ad564_default.png" + }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 51.51, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 14676296, + "username": "RenataBrito", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14676296/medium/55c59b8d0a0a3366ed1c96d361c661a6_default.png" }, { - "id": 14956337, - "username": "lidianycs", - "totalCosts": 24.24, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14956337/medium/918c6540264cbd711a5a6616ebb2c3ee.jpg" - } - ] - }, - { - "fileId": "5521", - "contributors": [ + "id": 14957477, + "username": "asdcBRA", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + }, { - "id": 15000979, - "username": "mauri.lustosa", - "totalCosts": 74.74, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15000979/medium/d3463e880ee39ff00ec110108c7c1711.png" + "id": 14564426, + "username": "bschorchit", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564426/medium/85aa92771b96f81e3a10f1580a58e799.jpeg" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 65.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 14554170, + "username": "eriknoronha", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14554170/medium/b6bf26ec67d0187f0829c5a6256d68b2.jpeg" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 29.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" } ] }, { - "fileId": "2842", + "fileId": "2926", "contributors": [ { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 33.33, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 1553.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 14845960, + "username": "matusame", + "totalCosts": 249.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14845960/medium/2b9e2f8505875b313fc59f15bb51edab.jpg" + }, + { + "id": 14573604, + "username": "bceschini", + "totalCosts": 190.89, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14573604/medium/e07f0a64aea775f906b999491ca671d9.jpeg" }, { "id": 15317682, "username": "junowoz", - "totalCosts": 8.08, + "totalCosts": 71.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - } - ] - }, - { - "fileId": "2798", - "contributors": [ + "id": 15407760, + "username": "copolicarpo", + "totalCosts": 56.56, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15407760/medium/0bb4e29f63caab6a171545e2b9f816c0.jpeg" + }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 186.85, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 15451376, + "username": "ingrid.gomes", + "totalCosts": 41.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15451376/medium/d3c5b2232f1bd59cd3d64e0c7acb6a29_default.png" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 72.72, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14564426, + "username": "bschorchit", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564426/medium/85aa92771b96f81e3a10f1580a58e799.jpeg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 65.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15403124, + "username": "thipatriota", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15403124/medium/644dd7d6fdb31184faa67b00f7914d5b.jpg" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 15171456, + "username": "batatinhachipis", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15171456/medium/74e0a699c86e8002bdf83efee754d5c5_default.png" }, { - "id": 14382632, - "username": "gabe_san_", + "id": 14571740, + "username": "DeFalT_910", "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14571740/medium/b9399646973ad106a1c00dfbc772b708.jpg" } ] }, { - "fileId": "2792", + "fileId": "7515", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 500.96, + "totalCosts": 1372.59, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 11.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, - { - "id": 15241638, - "username": "Panegali", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" - }, - { - "id": 15080541, - "username": "Don_Martinez", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" + "id": 15323182, + "username": "cerberushades", + "totalCosts": 139.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15323182/medium/e643040993dd40ba24bb0a13b41a322b.jpeg" } ] }, { - "fileId": "2762", + "fileId": "6187", "contributors": [ + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 603.98, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + }, + { + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 223.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + }, + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 222.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + }, + { + "id": 15119565, + "username": "leandroauzier", + "totalCosts": 184.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15119565/medium/72e054dacc99c0b30a5fe95c85676915_default.png" + }, + { + "id": 15114593, + "username": "RiquinPassaRodo", + "totalCosts": 111.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114593/medium/45a10f0be483ccb1556ea7f51d741677.jpeg" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 38.38, + "totalCosts": 44.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 15171456, + "username": "batatinhachipis", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15171456/medium/74e0a699c86e8002bdf83efee754d5c5_default.png" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 11.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 13475374, + "username": "mayumiadati", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13475374/medium/864bb3fcfb0c72599d60763779987c84_default.png" }, { - "id": 15241638, - "username": "Panegali", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "3128", + "fileId": "6440", "contributors": [ { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 452.48, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 298.96, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 60.6, + "totalCosts": 69.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15221742, + "username": "Marlonfernandes7", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15221742/medium/54e5adfe14e974d37dd5fb25bde84a77.png" } ] }, { - "fileId": "3002", + "fileId": "7314", "contributors": [ { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 520.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 15226778, + "username": "paulogio", + "totalCosts": 1086.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" }, { - "id": 19793, - "username": "cadu", - "totalCosts": 95.95, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/19793/medium/e2b4385d621e616e71301f11eaae32c5_default.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 136.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 13.13, + "totalCosts": 70.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 14888266, - "username": "sandrogomes101", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14888266/medium/ec3720087a2af8b90ac90119f026a2f8.png" + "id": 14668114, + "username": "ttinho", + "totalCosts": 42.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14668114/medium/abb6c5088e9fedee0db9d42e5079b776.jpeg" + }, + { + "id": 15370734, + "username": "Vinegario", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15370734/medium/a535a547d7a22cf7a467645270f464fb.png" } ] }, { - "fileId": "6227", + "fileId": "6518", "contributors": [ { - "id": 15158848, - "username": "massardo", - "totalCosts": 992.83, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15158848/medium/e71dc81c159e8a7f2393636435ad6e09.jpeg" + "id": 15226778, + "username": "paulogio", + "totalCosts": 382.79, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 465.61, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 181.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 253.51, + "totalCosts": 134.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14790884, - "username": "rubemarjr18", - "totalCosts": 52.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14790884/medium/1cec4afc62c4a1a483abe29e485d48e2.jpg" + "id": 15207648, + "username": "bettercallvictor.eth", + "totalCosts": 37.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15207648/medium/1e33933ce378946f204d7c76d7c246e5_default.png" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 50.5, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15036833, + "username": "Cubano.brito", + "totalCosts": 36.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15036833/medium/4988573ecbd20a37fe3504a4fd98b573_default.png" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 16183768, + "username": "zxya", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16183768/medium/9d897b4b01fb6b6399e896256b998abf.png" + }, + { + "id": 15965949, + "username": "Lazaro0809", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965949/medium/9020c1f4fa4c1fa572cb78f2ee3a3257_default.png" + }, + { + "id": 15912891, + "username": "Cristianoluizz", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" } ] }, { - "fileId": "6223", + "fileId": "6524", "contributors": [ { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 368.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 15226778, + "username": "paulogio", + "totalCosts": 509.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 364.61, + "totalCosts": 269.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15121067, - "username": "DiegoCabral", - "totalCosts": 237.35, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" - }, - { - "id": 15584703, - "username": "fcarva", - "totalCosts": 102.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15584703/medium/fb380bf7a259c295e182898d9c5e5d34.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 187.86, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "6225", + "fileId": "6526", "contributors": [ { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 256.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 15226778, + "username": "paulogio", + "totalCosts": 1691.75, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" + }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 143.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 89.89, + "totalCosts": 122.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 53.53, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 15317682, + "username": "junowoz", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + }, + { + "id": 15849127, + "username": "IagoEmanuel15", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" + }, + { + "id": 15912891, + "username": "Cristianoluizz", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" } ] }, { - "fileId": "6221", + "fileId": "7591", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 294.92, + "totalCosts": 1706.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 135.34, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 15813703, + "username": "Brian1997", + "totalCosts": 399.96, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15813703/medium/4fbeb047eb6a975b8edfd526c0c05bee_default.png" }, { - "id": 15376854, - "username": "RenanDeveloper", - "totalCosts": 36.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" + "id": 15912891, + "username": "Cristianoluizz", + "totalCosts": 170.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" }, { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 24.24, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 15932353, + "username": "nickksoares", + "totalCosts": 134.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932353/medium/a722341af1e695a8a496f57be3f72a32.png" + }, + { + "id": 15849127, + "username": "IagoEmanuel15", + "totalCosts": 65.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" + }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 42.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "3082", + "fileId": "6428", "contributors": [ { - "id": 13719925, - "username": "alexpaganmin", - "totalCosts": 707, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13719925/medium/d065a18c910db1080c95637ecc28d6da.jpg" - }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 301.99, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 15245586, + "username": "s3ttings", + "totalCosts": 444.4, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15245586/medium/255e604fc64ada6f55a802ea9de2204a_default.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 234.32, + "totalCosts": 405.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15526425, - "username": "xReDzin", - "totalCosts": 47.47, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15526425/medium/69278630b1c357a38d62e3e762fcf45b.gif" + "id": 15241638, + "username": "Panegali", + "totalCosts": 247.45, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" }, { - "id": 15121067, - "username": "DiegoCabral", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + "id": 14788762, + "username": "cafeweb", + "totalCosts": 51.51, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14788762/medium/1ec3f24a57a4081619b7bb8014a245bb.png" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "3018", + "fileId": "2958", "contributors": [ - { - "id": 14981089, - "username": "daniloraisi", - "totalCosts": 132.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14981089/medium/37d319f7ff289b5141aea317cb808deb.jpeg" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 47.47, + "totalCosts": 9191, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15912891, - "username": "Cristianoluizz", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 1433.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" }, { "id": 15258752, "username": "joserrbv", - "totalCosts": 12.12, + "totalCosts": 833.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15258752/medium/ec21ac21287dcdbd73ab57b6fb0dc50e_default.png" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 11.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" - } - ] - }, - { - "fileId": "3006", - "contributors": [ + "id": 14978447, + "username": "DanDaro", + "totalCosts": 445.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14978447/medium/6c0a867cdc72f871a6dd35862afa1562.jpg" + }, { - "id": 14382632, - "username": "gabe_san_", - "totalCosts": 108.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" + "id": 15027079, + "username": "wmduuh", + "totalCosts": 422.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15027079/medium/827d9b374220d233a59c4a1f2ffb1452.jpg" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 27.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 15221742, + "username": "Marlonfernandes7", + "totalCosts": 43.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15221742/medium/54e5adfe14e974d37dd5fb25bde84a77.png" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 9.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" - } - ] - }, - { - "fileId": "6239", - "contributors": [ + "id": 15038625, + "username": "maelsonfide", + "totalCosts": 33.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15038625/medium/8d1ebb7c168fd35417c24d77dfb8f135.jpeg" + }, { - "id": 15422032, - "username": "Fritzhoy", - "totalCosts": 6739.73, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15422032/medium/a2df65c9d9309dec39402a0175f3a57f.png" + "id": 14668742, + "username": "lmichelin", + "totalCosts": 28.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14668742/medium/4795bc8addc58e5321b69990d43cf3b4_default.png" }, { - "id": 15165600, - "username": "Horberlan", - "totalCosts": 2645.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" + "id": 15080541, + "username": "Don_Martinez", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" }, { - "id": 15124669, - "username": "iankressin", - "totalCosts": 173.72, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15124669/medium/6fa8b8d345657331557c5c67de45680c.jpeg" + "id": 15050333, + "username": "rafacris10", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15050333/medium/e6ffe2282c3dbc63a3c3f69a65a9244f.jpeg" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 52.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 15212290, + "username": "danicuki", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15212290/medium/2fe9878b523e9a9baf3a9bd997ba84fb.jpeg" }, { - "id": 15446690, - "username": "danielevilela", - "totalCosts": 24.24, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15446690/medium/27e62df7f8d8d68479bced43d27bd11c.jpeg" + "id": 15646745, + "username": "Mateusduartelima", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15646745/medium/cc73bc2eeaa1181c059fedc12a42dca5_default.png" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 10.1, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 13893213, + "username": "RelliuG", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13893213/medium/88d6b8bda7b6073efd27b5a1799694cc.jpeg" } ] }, { - "fileId": "2950", + "fileId": "7465", "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 2257.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 273.71, + "totalCosts": 966.57, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15454064, - "username": "thormiranda", - "totalCosts": 142.41, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15454064/medium/9a469555fbc3d3c781b12b438d7f0211_default.png" - }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 52.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "6183", + "fileId": "8019", "contributors": [ { - "id": 15849127, - "username": "IagoEmanuel15", - "totalCosts": 92.92, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" - }, + "id": 15515516, + "username": "MCreimer", + "totalCosts": 532.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "8023", + "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 78.78, + "totalCosts": 1100.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, - { - "id": 15623763, - "username": "luanitaa", - "totalCosts": 15.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15623763/medium/09023a39325813d6499aa3ddf184f212_default.png" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 14.14, + "totalCosts": 884.76, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, - { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 13.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" - }, - { - "id": 14957477, - "username": "asdcBRA", - "totalCosts": 13.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" } ] }, { - "fileId": "2680", + "fileId": "7927", "contributors": [ - { - "id": 13893213, - "username": "RelliuG", - "totalCosts": 314.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13893213/medium/88d6b8bda7b6073efd27b5a1799694cc.jpeg" - }, - { - "id": 14711810, - "username": "malzebu", - "totalCosts": 169.68, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14711810/medium/cd03191615e232f82ead1a505c725868.jpeg" - }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 68.68, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 44.44, + "totalCosts": 1505.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, - { - "id": 15575979, - "username": "MarianeNavarro", - "totalCosts": 43.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15575979/medium/06bee989c7903c83e2ebe29f4cb44d17.jpeg" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 13.13, + "totalCosts": 24.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "2684", + "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": 20.2, + "totalCosts": 78.78, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 15740363, + "username": "Claudiojmoreira", + "totalCosts": 36.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15740363/medium/b998f6d1784d3b5ec2cd69dac9ca5e8c.jpeg" } ] }, { - "fileId": "2962", + "fileId": "8027", "contributors": [ { - "id": 14636118, - "username": "frontedu", - "totalCosts": 158.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14636118/medium/d3d3ec3fab34702c4b19674b06e1ddff.png" - }, + "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": 65.65, + "totalCosts": 1165.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 14687376, - "username": "KlmnZ", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" + "id": 16099664, + "username": "yanvictorsn", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" } ] }, { - "fileId": "2954", + "fileId": "7713", "contributors": [ { - "id": 15121067, - "username": "DiegoCabral", - "totalCosts": 13.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 2207.86, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14382632, - "username": "gabe_san_", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" + "id": 15836847, + "username": "k77", + "totalCosts": 208.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15836847/medium/a83e58c4be6c8ef96bda97967d4703cd.png" }, { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 15830251, + "username": "paodequeijocompingado", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15830251/medium/df305c6124650d8f50add955b4770062_default.png" } ] }, { - "fileId": "5563", + "fileId": "7717", "contributors": [ { - "id": 14957477, - "username": "asdcBRA", - "totalCosts": 1588.73, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + "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": 178.77, + "totalCosts": 501.97, "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": 15849127, + "username": "IagoEmanuel15", + "totalCosts": 61.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" + } + ] + }, + { + "fileId": "7721", + "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 30.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 493.89, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" } ] }, { - "fileId": "7529", + "fileId": "7803", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 483.79, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "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": 48.48, + "totalCosts": 15.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "7533", + "fileId": "7725", "contributors": [ - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 230.28, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 38.38, + "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": "7537", + "fileId": "7729", "contributors": [ - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 251.49, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 95.95, + "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": "7541", + "fileId": "7733", "contributors": [ - { - "id": 15728117, - "username": "alnrsnd", - "totalCosts": 338.35, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15728117/medium/7631d966177edc87bcb5a0cbd146ca21_default.png" - }, - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 241.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 231.29, + "totalCosts": 560.55, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 16099664, - "username": "yanvictorsn", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" + "id": 15902117, + "username": "cassio.gusson", + "totalCosts": 221.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15902117/medium/07ad2db947468fb4ed35ed2b9e51f8d2.png" } ] }, { - "fileId": "7521", + "fileId": "7737", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 91.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, + "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": 31.31, + "totalCosts": 1289.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15887043, - "username": "vivianebuge", - "totalCosts": 28.28, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15887043/medium/c0732f0c01e671b0863789e7427b6a98_default.png" + "id": 15422032, + "username": "Fritzhoy", + "totalCosts": 508.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15422032/medium/a2df65c9d9309dec39402a0175f3a57f.png" } ] }, { - "fileId": "2672", + "fileId": "7745", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 339.36, + "totalCosts": 1883.65, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15652697, - "username": "ThewsyRum", - "totalCosts": 227.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15652697/medium/416cd66d87d185091af51f9aecb60262.jpeg" - }, - { - "id": 15121067, - "username": "DiegoCabral", - "totalCosts": 63.63, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" - }, - { - "id": 14687376, - "username": "KlmnZ", - "totalCosts": 58.58, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687376/medium/d2bdfed3972ab3df1ac68ab0ad851dab_default.png" - }, + "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": 30.3, + "totalCosts": 517.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" }, { - "id": 15932353, - "username": "nickksoares", - "totalCosts": 25.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932353/medium/a722341af1e695a8a496f57be3f72a32.png" - }, - { - "id": 15575979, - "username": "MarianeNavarro", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15575979/medium/06bee989c7903c83e2ebe29f4cb44d17.jpeg" + "id": 15837087, + "username": "gabekoin", + "totalCosts": 52.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837087/medium/198e2d3ce88fd597d2f6a39fcc40964a.png" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 9.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, + "id": 13986387, + "username": "rafarocha", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7753", + "contributors": [ { - "id": 15025129, - "username": "willianpaixao", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15025129/medium/ef1be11b8020b45c11dbd5a0bbea1aac_default.png" + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 1256.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" } ] }, { - "fileId": "5565", + "fileId": "7919", "contributors": [ { - "id": 16099664, - "username": "yanvictorsn", - "totalCosts": 245.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" + "id": 15932353, + "username": "nickksoares", + "totalCosts": 749.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932353/medium/a722341af1e695a8a496f57be3f72a32.png" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 207.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 511.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14957477, - "username": "asdcBRA", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" + "id": 15376854, + "username": "RenanDeveloper", + "totalCosts": 107.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" }, { - "id": 15912891, - "username": "Cristianoluizz", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" + "id": 15929325, + "username": "jsantann", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15929325/medium/dfe876696a9c986f4bc248f2aab9c5ed_default.png" }, { - "id": 15646745, - "username": "Mateusduartelima", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15646745/medium/cc73bc2eeaa1181c059fedc12a42dca5_default.png" + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" }, { - "id": 15756451, - "username": "Renatoossuna", + "id": 15912891, + "username": "Cristianoluizz", "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15756451/medium/5110e7d1d4cd5bd96c8ba7e33dbd3fa5_default.png" - }, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" + } + ] + }, + { + "fileId": "7939", + "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 3.03, + "totalCosts": 389.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15207648, - "username": "bettercallvictor.eth", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15207648/medium/1e33933ce378946f204d7c76d7c246e5_default.png" } ] }, { - "fileId": "2946", + "fileId": "7935", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 316.13, + "totalCosts": 668.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15431346, - "username": "BenedettiLucca", - "totalCosts": 80.8, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15431346/medium/d5bf45d5fbceebd23be3d23b2f8c8a1a_default.png" - }, - { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 11.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" - }, - { - "id": 14546464, - "username": "LucyCroft", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14546464/medium/23420a0e95c1f9a0fd75df5dba6ad564_default.png" - }, - { - "id": 14676296, - "username": "RenataBrito", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14676296/medium/55c59b8d0a0a3366ed1c96d361c661a6_default.png" - }, - { - "id": 14957477, - "username": "asdcBRA", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957477/medium/4731034c4ad881ab8ce76389b7952162.jpeg" - }, - { - "id": 14564426, - "username": "bschorchit", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564426/medium/85aa92771b96f81e3a10f1580a58e799.jpeg" - }, + } + ] + }, + { + "fileId": "8007", + "contributors": [ { - "id": 14554170, - "username": "eriknoronha", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14554170/medium/b6bf26ec67d0187f0829c5a6256d68b2.jpeg" - }, + "id": 15515516, + "username": "MCreimer", + "totalCosts": 349.46, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "8011", + "contributors": [ { - "id": 14875990, - "username": "guilhermevendramini", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1101.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "2926", + "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": 1589.74, + "totalCosts": 493.89, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 14845960, - "username": "matusame", - "totalCosts": 249.47, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14845960/medium/2b9e2f8505875b313fc59f15bb51edab.jpg" - }, - { - "id": 14573604, - "username": "bceschini", - "totalCosts": 190.89, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14573604/medium/e07f0a64aea775f906b999491ca671d9.jpeg" - }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 71.71, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" - }, - { - "id": 15407760, - "username": "copolicarpo", - "totalCosts": 56.56, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15407760/medium/0bb4e29f63caab6a171545e2b9f816c0.jpeg" - }, - { - "id": 15451376, - "username": "ingrid.gomes", - "totalCosts": 41.41, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15451376/medium/d3c5b2232f1bd59cd3d64e0c7acb6a29_default.png" - }, - { - "id": 14564426, - "username": "bschorchit", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564426/medium/85aa92771b96f81e3a10f1580a58e799.jpeg" - }, - { - "id": 15403124, - "username": "thipatriota", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15403124/medium/644dd7d6fdb31184faa67b00f7914d5b.jpg" - }, - { - "id": 15171456, - "username": "batatinhachipis", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15171456/medium/74e0a699c86e8002bdf83efee754d5c5_default.png" - }, - { - "id": 14571740, - "username": "DeFalT_910", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14571740/medium/b9399646973ad106a1c00dfbc772b708.jpg" } ] }, { - "fileId": "7515", + "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": 1372.59, + "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": 15323182, - "username": "cerberushades", - "totalCosts": 139.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15323182/medium/e643040993dd40ba24bb0a13b41a322b.jpeg" + "id": 15960287, + "username": "fabiannycnd", + "totalCosts": 66.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" } ] }, { - "fileId": "6187", + "fileId": "6241", "contributors": [ { - "id": 13855929, - "username": "gabriel.silva", - "totalCosts": 603.98, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + "id": 15123265, + "username": "teachertialorena", + "totalCosts": 522.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123265/medium/322692ee8934a652c6dbae39a499eb0f.png" }, { - "id": 15121067, - "username": "DiegoCabral", - "totalCosts": 223.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + "id": 15165600, + "username": "Horberlan", + "totalCosts": 487.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" }, { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 222.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + "id": 14946409, + "username": "giu.roperto", + "totalCosts": 254.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14946409/medium/56d3187cc785e71756040654b7eeabb4.png" }, { - "id": 15119565, - "username": "leandroauzier", - "totalCosts": 184.83, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15119565/medium/72e054dacc99c0b30a5fe95c85676915_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 72.72, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 15114593, - "username": "RiquinPassaRodo", - "totalCosts": 111.1, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114593/medium/45a10f0be483ccb1556ea7f51d741677.jpeg" + "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": 13986387, - "username": "rafarocha", - "totalCosts": 44.44, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 181.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 15171456, - "username": "batatinhachipis", - "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15171456/medium/74e0a699c86e8002bdf83efee754d5c5_default.png" + "id": 15317682, + "username": "junowoz", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { - "id": 13475374, - "username": "mayumiadati", - "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13475374/medium/864bb3fcfb0c72599d60763779987c84_default.png" + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15526425, + "username": "xReDzin", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15526425/medium/69278630b1c357a38d62e3e762fcf45b.gif" } ] }, { - "fileId": "6440", + "fileId": "3124", "contributors": [ { "id": 15515516, "username": "MCreimer", - "totalCosts": 303, + "totalCosts": 77.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 79.79, + "totalCosts": 43.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15221742, - "username": "Marlonfernandes7", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15221742/medium/54e5adfe14e974d37dd5fb25bde84a77.png" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" } ] }, { - "fileId": "7314", + "fileId": "7995", "contributors": [ { - "id": 15226778, - "username": "paulogio", - "totalCosts": 1086.76, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" - }, + "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": 136.35, + "totalCosts": 990.81, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 70.7, + "totalCosts": 599.94, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 14668114, - "username": "ttinho", - "totalCosts": 42.42, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14668114/medium/abb6c5088e9fedee0db9d42e5079b776.jpeg" + "id": 15160588, + "username": "R_Dark", + "totalCosts": 578.73, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15160588/medium/3903ef1af6faeec9604b6db70b5e6233_default.png" }, { - "id": 15370734, - "username": "Vinegario", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15370734/medium/a535a547d7a22cf7a467645270f464fb.png" + "id": 15960287, + "username": "fabiannycnd", + "totalCosts": 43.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" } ] }, { - "fileId": "6518", + "fileId": "6243", "contributors": [ { - "id": 15226778, - "username": "paulogio", - "totalCosts": 382.79, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" - }, + "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": 181.8, + "totalCosts": 1077.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 134.33, + "totalCosts": 386.83, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15207648, - "username": "bettercallvictor.eth", - "totalCosts": 37.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15207648/medium/1e33933ce378946f204d7c76d7c246e5_default.png" - }, + } + ] + }, + { + "fileId": "3100", + "contributors": [ { - "id": 15036833, - "username": "Cubano.brito", - "totalCosts": 36.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15036833/medium/4988573ecbd20a37fe3504a4fd98b573_default.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 326.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 16183768, - "username": "zxya", - "totalCosts": 20.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16183768/medium/9d897b4b01fb6b6399e896256b998abf.png" + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 48.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" }, { - "id": 15965949, - "username": "Lazaro0809", - "totalCosts": 11.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965949/medium/9020c1f4fa4c1fa572cb78f2ee3a3257_default.png" + "id": 13986387, + "username": "rafarocha", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15912891, - "username": "Cristianoluizz", - "totalCosts": 11.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" + "id": 14746732, + "username": "asdealmeida1", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14746732/medium/41ad9e6c8c212d49a5e493167a43de8e.jpeg" } ] }, { - "fileId": "6524", + "fileId": "3160", "contributors": [ - { - "id": 15226778, - "username": "paulogio", - "totalCosts": 513.08, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 269.67, + "totalCosts": 37.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 187.86, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] }, { - "fileId": "6526", + "fileId": "7999", "contributors": [ - { - "id": 15226778, - "username": "paulogio", - "totalCosts": 1693.77, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" - }, { "id": 15515516, "username": "MCreimer", - "totalCosts": 143.42, + "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": 122.21, + "totalCosts": 1.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15317682, - "username": "junowoz", - "totalCosts": 24.24, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" - }, - { - "id": 15849127, - "username": "IagoEmanuel15", - "totalCosts": 19.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" - }, - { - "id": 15912891, - "username": "Cristianoluizz", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" } ] }, { - "fileId": "7591", + "fileId": "3074", "contributors": [ { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 1706.9, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" - }, - { - "id": 15813703, - "username": "Brian1997", - "totalCosts": 399.96, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15813703/medium/4fbeb047eb6a975b8edfd526c0c05bee_default.png" - }, - { - "id": 15912891, - "username": "Cristianoluizz", - "totalCosts": 170.69, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" - }, - { - "id": 15932353, - "username": "nickksoares", - "totalCosts": 134.33, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932353/medium/a722341af1e695a8a496f57be3f72a32.png" - }, - { - "id": 15849127, - "username": "IagoEmanuel15", - "totalCosts": 65.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" + "id": 14896196, + "username": "leoclark", + "totalCosts": 70.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14896196/medium/495d3305573cff327e6707a437689055_default.png" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 42.42, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15376854, + "username": "RenanDeveloper", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" } ] }, { - "fileId": "6428", + "fileId": "3120", "contributors": [ - { - "id": 15245586, - "username": "s3ttings", - "totalCosts": 444.4, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15245586/medium/255e604fc64ada6f55a802ea9de2204a_default.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 405.01, + "totalCosts": 536.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15241638, - "username": "Panegali", - "totalCosts": 247.45, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15241638/medium/02280520175445e6c7614a4236546b8f.jpg" - }, - { - "id": 14788762, - "username": "cafeweb", - "totalCosts": 51.51, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14788762/medium/1ec3f24a57a4081619b7bb8014a245bb.png" + "id": 15502802, + "username": "soo659215", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15502802/medium/46ff8617d7a0337d86eb94536f7b090d.png" }, { - "id": 15317682, - "username": "junowoz", - "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + "id": 14633592, + "username": "Jhosephecacau", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.png" } ] }, { - "fileId": "2958", + "fileId": "3164", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 9210.19, + "totalCosts": 65.65, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { "id": 13855929, "username": "gabriel.silva", - "totalCosts": 1433.19, + "totalCosts": 5.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" - }, - { - "id": 15258752, - "username": "joserrbv", - "totalCosts": 833.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15258752/medium/ec21ac21287dcdbd73ab57b6fb0dc50e_default.png" - }, + } + ] + }, + { + "fileId": "2994", + "contributors": [ { - "id": 14978447, - "username": "DanDaro", - "totalCosts": 445.41, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14978447/medium/6c0a867cdc72f871a6dd35862afa1562.jpg" + "id": 14815414, + "username": "KoelhoSec", + "totalCosts": 290.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14815414/medium/cc746b15dd6d2fa3bc01369caaef44ed.png" }, { - "id": 15027079, - "username": "wmduuh", - "totalCosts": 422.18, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15027079/medium/827d9b374220d233a59c4a1f2ffb1452.jpg" + "id": 14382632, + "username": "gabe_san_", + "totalCosts": 85.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" }, { - "id": 15221742, - "username": "Marlonfernandes7", - "totalCosts": 43.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15221742/medium/54e5adfe14e974d37dd5fb25bde84a77.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 77.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 15038625, - "username": "maelsonfide", - "totalCosts": 33.33, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15038625/medium/8d1ebb7c168fd35417c24d77dfb8f135.jpeg" + "id": 14820852, + "username": "btclient", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14820852/medium/6d3e4e81b1dd0aa840959da8c8bcf63f.jpg" }, { - "id": 14668742, - "username": "lmichelin", - "totalCosts": 28.28, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14668742/medium/4795bc8addc58e5321b69990d43cf3b4_default.png" - }, + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + } + ] + }, + { + "fileId": "2986", + "contributors": [ { - "id": 15080541, - "username": "Don_Martinez", - "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080541/medium/95c7708608034869cdc2388d2027b2b5.jpg" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 49.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 15050333, - "username": "rafacris10", - "totalCosts": 8.08, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15050333/medium/e6ffe2282c3dbc63a3c3f69a65a9244f.jpeg" + "id": 14815414, + "username": "KoelhoSec", + "totalCosts": 33.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14815414/medium/cc746b15dd6d2fa3bc01369caaef44ed.png" }, { - "id": 15212290, - "username": "danicuki", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15212290/medium/2fe9878b523e9a9baf3a9bd997ba84fb.jpeg" + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" }, { - "id": 15646745, - "username": "Mateusduartelima", + "id": 14633592, + "username": "Jhosephecacau", "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15646745/medium/cc73bc2eeaa1181c059fedc12a42dca5_default.png" - }, - { - "id": 13893213, - "username": "RelliuG", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13893213/medium/88d6b8bda7b6073efd27b5a1799694cc.jpeg" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.png" } ] }, { - "fileId": "7465", + "fileId": "6259", "contributors": [ - { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 2257.35, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 990.81, + "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": "8019", + "fileId": "3088", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 532.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "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": "8023", + "fileId": "3116", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 1100.9, + "totalCosts": 145.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 889.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" } ] }, { - "fileId": "7927", + "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": 1505.91, + "totalCosts": 439.35, "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": 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": "7525", + "fileId": "2980", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 590.85, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15258752, + "username": "joserrbv", + "totalCosts": 149.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15258752/medium/ec21ac21287dcdbd73ab57b6fb0dc50e_default.png" }, { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 153.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 14382632, + "username": "gabe_san_", + "totalCosts": 25.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 78.78, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" }, { - "id": 15740363, - "username": "Claudiojmoreira", - "totalCosts": 36.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15740363/medium/b998f6d1784d3b5ec2cd69dac9ca5e8c.jpeg" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" } ] }, { - "fileId": "8027", + "fileId": "6245", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 1070.6, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "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": "8035", + "fileId": "6263", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 1165.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15171274, + "username": "matheuspoleza", + "totalCosts": 738.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15171274/medium/116eb81288db5943f5421648cd28c040.png" }, { - "id": 16099664, - "username": "yanvictorsn", - "totalCosts": 29.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 34.34, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" } ] }, { - "fileId": "7713", + "fileId": "6432", "contributors": [ + { + "id": 15422032, + "username": "Fritzhoy", + "totalCosts": 4072.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15422032/medium/a2df65c9d9309dec39402a0175f3a57f.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 2207.86, + "totalCosts": 231.29, "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": 15711897, + "username": "deymison", + "totalCosts": 99.99, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15711897/medium/1ef720cca42e3af55c16939ac1143b9c_default.png" }, { - "id": 15830251, - "username": "paodequeijocompingado", - "totalCosts": 12.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15830251/medium/df305c6124650d8f50add955b4770062_default.png" + "id": 15724803, + "username": "Izabel_chaves", + "totalCosts": 32.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15724803/medium/7f2b4419d308a52a62f3b8f9ca9b4adf.jpg" } ] }, { - "fileId": "7717", + "fileId": "6436", "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 2934.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 15960287, + "username": "fabiannycnd", + "totalCosts": 364.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" + }, + { + "id": 15165600, + "username": "Horberlan", + "totalCosts": 167.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" + }, + { + "id": 15703467, + "username": "rsrosabio", + "totalCosts": 166.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15703467/medium/d318a4131cc261c314fbda858991c360_default.png" + }, { "id": 15350616, "username": "Carlos_Silva", - "totalCosts": 1256.44, + "totalCosts": 2.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" - }, + } + ] + }, + { + "fileId": "7308", + "contributors": [ { "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": 496.92, - "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": 1286.74, - "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" } ] } @@ -46111,7 +48987,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 +49128,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 +49347,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 +49424,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 +49627,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 +49712,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 +49784,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 +49795,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 +49867,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 +50224,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 +50312,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 +50334,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 +50411,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 +50534,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 +50674,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 +50986,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 +51404,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 +51430,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 +51463,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 +51694,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 +51726,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 +51788,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 +51871,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 +51917,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 +51987,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 +52046,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 +52381,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 +52458,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 +52498,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 +52532,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 +52584,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 +52687,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 +52795,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 +52920,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 +53027,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 +53038,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 +53082,7 @@ { "id": 14977831, "username": "PeterKecman", - "totalCosts": 1622.06, + "totalCosts": 1616, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14977831/medium/e1e3f150ce524a6cb88fccb8b4f52422.png" } ] @@ -50247,7 +53141,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 +53184,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 +53268,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 +53334,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 +53436,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 +53754,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 +53774,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 +53827,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 +53886,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 +54041,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 +54176,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 +54676,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 +54688,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 +54782,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 +54823,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 +54864,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 +54975,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 +55178,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 +55259,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 +55347,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 +55422,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 +55463,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 +55590,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 +55770,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 +55805,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 +56009,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 +56027,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 +56045,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 +56842,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 +56995,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 +57078,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 +57148,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 +57259,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 +57294,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 +57358,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 +57517,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 +57555,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 +57943,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 +58142,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 +58242,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 +58259,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 +58345,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 +58511,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 +58545,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 +58726,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 +58857,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 +58880,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 +59653,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 +59780,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 +59809,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 +59932,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 +60021,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 +60050,7 @@ { "id": 15551683, "username": "sashathefck", - "totalCosts": 473.69, + "totalCosts": 471.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15551683/medium/89389ac4c9211911a107017bd6784870.jpeg" }, { @@ -57203,13 +60079,13 @@ { "id": 15473664, "username": "hotr1pak", - "totalCosts": 1449.35, + "totalCosts": 1521.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" }, { "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,9 +60137,15 @@ { "id": 15804803, "username": "sun_dariia", - "totalCosts": 1635.19, + "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", @@ -57292,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", @@ -57404,17 +60292,23 @@ "totalCosts": 177.76, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14951861/medium/d5a9304f836af504ad35d48759c700ed.jpeg" }, + { + "id": 15300418, + "username": "globart", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15300418/medium/28c0af8820123db5d3a0cbf7bc72e713.jpeg" + }, { "id": 15143910, "username": "vkulpinova6", - "totalCosts": 31.31, + "totalCosts": 25.25, "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": 15473664, + "username": "hotr1pak", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" }, { "id": 14686790, @@ -57427,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", @@ -57451,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", @@ -57591,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" } ] }, @@ -57600,13 +60500,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" } ] @@ -57672,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", @@ -57768,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" } ] }, @@ -57796,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" } ] }, @@ -57831,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", @@ -57845,7 +60769,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 +60798,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" }, { @@ -57936,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", @@ -57988,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" } ] }, @@ -58021,7 +60957,7 @@ { "id": 15300418, "username": "globart", - "totalCosts": 93.93, + "totalCosts": 69.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15300418/medium/28c0af8820123db5d3a0cbf7bc72e713.jpeg" }, { @@ -58029,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" } ] } @@ -58063,6 +61005,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", @@ -58131,7 +61079,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 +61113,7 @@ { "id": 15729281, "username": "Junel", - "totalCosts": 560.55, + "totalCosts": 502.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15729281/medium/0be4e0167eb236dea935c2ecf60ab99e_default.png" }, { @@ -58180,6 +61128,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", @@ -58328,10 +61282,10 @@ "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" + "id": 15073799, + "username": "GoForceX", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -58464,13 +61418,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 +61433,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 +61655,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 +61706,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 +61766,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 +61848,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 +61874,7 @@ { "id": 15193608, "username": "yuping", - "totalCosts": 838.3, + "totalCosts": 808, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" }, { @@ -58937,7 +61921,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 +61965,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 +61980,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 +62012,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 +62059,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 +62074,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 +62092,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 +62119,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 +62382,7 @@ { "id": 15314206, "username": "cuijia", - "totalCosts": 463.59, + "totalCosts": 454.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" }, { @@ -59413,6 +62421,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", @@ -59657,9 +62671,15 @@ { "id": 15657887, "username": "DreamInMorning", - "totalCosts": 784.77, + "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", @@ -59754,24 +62774,30 @@ "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", "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", "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 +63067,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", @@ -60251,6 +63283,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" } ] }, @@ -60283,7 +63321,7 @@ { "id": 15657887, "username": "DreamInMorning", - "totalCosts": 733.26, + "totalCosts": 673.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657887/medium/9212535a0a5fb7ec22a9f8a8329dac3b.jpg" }, { @@ -60298,6 +63336,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", @@ -60307,21 +63351,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 +63617,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" } ] }, @@ -60632,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", @@ -60644,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", @@ -60875,19 +63925,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 +63955,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 +63979,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 +64008,7 @@ { "id": 15314206, "username": "cuijia", - "totalCosts": 862.54, + "totalCosts": 849.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" }, { @@ -61186,10 +64236,16 @@ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15357618/medium/12f023106f6a24e98bfc6553c07a46f4.jpg" }, { - "id": 15848653, - "username": "QueenNot", + "id": 15073799, + "username": "GoForceX", "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15848653/medium/9506bee8d4f41073b7c7fb3523239878_default.png" + "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, @@ -61202,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" } ] }, @@ -61241,7 +64291,7 @@ { "id": 15657887, "username": "DreamInMorning", - "totalCosts": 84.84, + "totalCosts": 83.83, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657887/medium/9212535a0a5fb7ec22a9f8a8329dac3b.jpg" }, { @@ -61381,6 +64431,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", @@ -61407,7 +64463,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" }, { @@ -61434,6 +64490,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", @@ -61489,7 +64551,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 +64754,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 +64788,7 @@ { "id": 15314206, "username": "cuijia", - "totalCosts": 4060.2, + "totalCosts": 4032.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" }, { @@ -61735,6 +64797,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", @@ -61808,7 +64876,7 @@ { "id": 14829178, "username": "EffectChen", - "totalCosts": 726.19, + "totalCosts": 711.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, { @@ -61817,6 +64885,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", @@ -61946,6 +65020,12 @@ "totalCosts": 90.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15381970/medium/b43b331e365346453668db293656f269.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 40.4, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15531743, "username": "Meriky", @@ -61966,7 +65046,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 +65250,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 +65268,7 @@ { "id": 14792498, "username": "tyevlag", - "totalCosts": 128.27, + "totalCosts": 120.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14792498/medium/3d13e013f50df91c50a9d67e9034daf8.png" }, { @@ -62220,6 +65300,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" } ] }, @@ -62482,7 +65568,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 +65626,7 @@ { "id": 14771456, "username": "marcusma", - "totalCosts": 499.95, + "totalCosts": 494.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14771456/medium/bc3f51e759b958dabc1b61845df639e4_default.png" }, { @@ -62767,6 +65853,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", @@ -62858,25 +65950,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" }, { @@ -62885,6 +65977,12 @@ "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", @@ -63408,6 +66506,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 +67016,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 +67066,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 +67302,7 @@ { "id": 14792498, "username": "tyevlag", - "totalCosts": 245.43, + "totalCosts": 210.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14792498/medium/3d13e013f50df91c50a9d67e9034daf8.png" }, { @@ -64201,6 +67311,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", @@ -64312,6 +67428,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 +67594,7 @@ { "id": 14792498, "username": "tyevlag", - "totalCosts": 1033.23, + "totalCosts": 1016.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14792498/medium/3d13e013f50df91c50a9d67e9034daf8.png" }, { @@ -64498,12 +67620,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", @@ -64530,13 +67664,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" }, { @@ -64544,6 +67678,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" } ] }, @@ -64774,6 +67914,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 +67961,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 +68022,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 +68043,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 +68277,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 +68401,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 +68419,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 +68503,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 +68565,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 +68610,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 +68730,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" }, { @@ -65657,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", @@ -65680,6 +68862,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 +68877,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 +68927,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 +68948,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 +68978,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 +68986,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 +69001,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 +69051,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 +69143,7 @@ { "id": 15193608, "username": "yuping", - "totalCosts": 5838.81, + "totalCosts": 5819.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" }, { @@ -66066,6 +69272,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", @@ -66098,13 +69310,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 +69331,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 +69368,7 @@ { "id": 14829178, "username": "EffectChen", - "totalCosts": 2009.9, + "totalCosts": 1990.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, { @@ -66159,6 +69377,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", @@ -66423,7 +69647,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 +69659,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" }, { @@ -66480,6 +69704,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", @@ -66508,12 +69738,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 +69851,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 +69991,7 @@ { "id": 15918181, "username": "QuinnHou", - "totalCosts": 795.88, + "totalCosts": 765.58, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15918181/medium/17e80957f6d7eef4f215c6cc41951dae_default.png" }, { @@ -66794,6 +70018,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", @@ -67047,7 +70277,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" }, { @@ -67080,6 +70310,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", @@ -67087,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" + } + ] } ] }, @@ -67140,7 +70387,7 @@ { "id": 15201846, "username": "boyinlee", - "totalCosts": 2151.3, + "totalCosts": 2136.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15201846/medium/3d9d29022427094faeb700ddbd5c078a.jpeg" }, { @@ -67152,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" } ] @@ -67303,13 +70550,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 +70661,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 +70696,7 @@ { "id": 15201846, "username": "boyinlee", - "totalCosts": 1728.11, + "totalCosts": 1724.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15201846/medium/3d9d29022427094faeb700ddbd5c078a.jpeg" }, { @@ -67714,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" }, { @@ -67916,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" }, { @@ -67925,18 +71172,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", @@ -68049,13 +71296,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" } ] @@ -68184,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" }, { @@ -68202,7 +71449,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 +71638,7 @@ { "id": 14449556, "username": "LuckyPigeon", - "totalCosts": 86.86, + "totalCosts": 50.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14449556/medium/2a538164f71dc2cdbec9b9279eed934e.png" }, { @@ -68484,7 +71731,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 +71748,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 +71925,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 694.88, + "totalCosts": 702.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -68771,7 +72018,7 @@ { "id": 15957819, "username": "ming30650", - "totalCosts": 664.58, + "totalCosts": 640.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15957819/medium/2baae61ca579f0a04efd89cd210f2c6a_default.png" }, { @@ -68785,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" } ] }, @@ -68794,7 +72047,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 +72115,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 +72230,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 +72288,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 +72322,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 +72344,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 +72388,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 +72399,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 +72443,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 +72548,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 +72591,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 +72717,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 +72745,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 +72762,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 +72773,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 +72807,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 +72846,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 +72857,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 +72868,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 +72879,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 +72912,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 +72962,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 +73045,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 +73078,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 +73123,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 +73163,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 +73209,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 +73237,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 +73270,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 +73298,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 +73320,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 +73342,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/file-ids.json b/src/data/crowdin/file-ids.json index 4888d3fef95..3c8203a253f 100644 --- a/src/data/crowdin/file-ids.json +++ b/src/data/crowdin/file-ids.json @@ -1103,10 +1103,6 @@ "id": 2966, "path": "/about/index.md" }, - { - "id": 8031, - "path": "/deprecated-software/index.md" - }, { "id": 8037, "path": "/page-bug-bounty.json" 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 diff --git a/src/data/developer-docs-links.yaml b/src/data/developer-docs-links.yaml index 3005d2b0030..5a6070ad1c3 100644 --- a/src/data/developer-docs-links.yaml +++ b/src/data/developer-docs-links.yaml @@ -4,253 +4,253 @@ # To display item as a collapsible directory vs. a link # use the `path` property (of the directory) vs. the `to` property - id: docs-nav-readme - to: /developers/docs + to: /developers/docs/ - id: docs-nav-foundational-topics path: /developers/docs/ items: - id: docs-nav-intro-to-ethereum - to: /developers/docs/intro-to-ethereum + to: /developers/docs/intro-to-ethereum/ description: docs-nav-intro-to-ethereum-description - id: docs-nav-intro-to-ether - to: /developers/docs/intro-to-ether + to: /developers/docs/intro-to-ether/ description: docs-nav-intro-to-ether-description - id: docs-nav-intro-to-dapps - to: /developers/docs/dapps + to: /developers/docs/dapps/ description: docs-nav-intro-to-dapps-description - id: docs-nav-web2-vs-web3 - to: /developers/docs/web2-vs-web3 + to: /developers/docs/web2-vs-web3/ description: docs-nav-web2-vs-web3-description - id: docs-nav-accounts - to: /developers/docs/accounts + to: /developers/docs/accounts/ description: docs-nav-accounts-description - id: docs-nav-transactions - to: /developers/docs/transactions + to: /developers/docs/transactions/ description: docs-nav-transactions-description - id: docs-nav-blocks - to: /developers/docs/blocks + to: /developers/docs/blocks/ description: docs-nav-blocks-description - id: docs-nav-evm - to: /developers/docs/evm + to: /developers/docs/evm/ description: docs-nav-evm-description items: - id: docs-nav-opcodes - to: /developers/docs/evm/opcodes + to: /developers/docs/evm/opcodes/ - id: docs-nav-gas - to: /developers/docs/gas + to: /developers/docs/gas/ description: docs-nav-gas-description - id: docs-nav-nodes-and-clients - to: /developers/docs/nodes-and-clients + to: /developers/docs/nodes-and-clients/ description: docs-nav-nodes-and-clients-description items: - id: docs-nav-run-a-node - to: /developers/docs/nodes-and-clients/run-a-node + to: /developers/docs/nodes-and-clients/run-a-node/ - id: docs-nav-client-diversity - to: /developers/docs/nodes-and-clients/client-diversity + to: /developers/docs/nodes-and-clients/client-diversity/ - id: docs-nav-nodes-as-a-service - to: /developers/docs/nodes-and-clients/nodes-as-a-service + to: /developers/docs/nodes-and-clients/nodes-as-a-service/ - id: docs-nav-node-architecture - to: /developers/docs/nodes-and-clients/node-architecture + to: /developers/docs/nodes-and-clients/node-architecture/ - id: docs-nav-light-clients - to: /developers/docs/nodes-and-clients/light-clients + to: /developers/docs/nodes-and-clients/light-clients/ - id: docs-nav-archive-nodes - to: /developers/docs/nodes-and-clients/archive-nodes + to: /developers/docs/nodes-and-clients/archive-nodes/ - id: docs-nav-bootnodes - to: /developers/docs/nodes-and-clients/bootnodes + to: /developers/docs/nodes-and-clients/bootnodes/ - id: docs-nav-networks - to: /developers/docs/networks + to: /developers/docs/networks/ description: docs-nav-networks-description - id: docs-nav-consensus-mechanisms - to: /developers/docs/consensus-mechanisms + to: /developers/docs/consensus-mechanisms/ description: docs-nav-consensus-mechanisms-description items: - id: docs-nav-proof-of-work - to: /developers/docs/consensus-mechanisms/pow + to: /developers/docs/consensus-mechanisms/pow/ items: - id: docs-nav-mining - to: /developers/docs/consensus-mechanisms/pow/mining + to: /developers/docs/consensus-mechanisms/pow/mining/ items: - id: docs-nav-mining-algorithms - to: /developers/docs/consensus-mechanisms/pow/mining-algorithms + to: /developers/docs/consensus-mechanisms/pow/mining-algorithms/ items: - id: docs-nav-dagger-hashimoto - to: /developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto + to: /developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto/ - id: docs-nav-ethash - to: /developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash + to: /developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/ - id: docs-nav-proof-of-stake - to: /developers/docs/consensus-mechanisms/pos + to: /developers/docs/consensus-mechanisms/pos/ items: - id: docs-nav-gasper - to: /developers/docs/consensus-mechanisms/pos/gasper + to: /developers/docs/consensus-mechanisms/pos/gasper/ - id: docs-nav-weak-subjectivity - to: /developers/docs/consensus-mechanisms/pos/weak-subjectivity + to: /developers/docs/consensus-mechanisms/pos/weak-subjectivity/ - id: docs-nav-attestations - to: /developers/docs/consensus-mechanisms/pos/attestations + to: /developers/docs/consensus-mechanisms/pos/attestations/ - id: docs-nav-rewards-and-penalties - to: /developers/docs/consensus-mechanisms/pos/rewards-and-penalties + to: /developers/docs/consensus-mechanisms/pos/rewards-and-penalties/ - id: docs-nav-attack-and-defense - to: /developers/docs/consensus-mechanisms/pos/attack-and-defense + to: /developers/docs/consensus-mechanisms/pos/attack-and-defense/ - id: docs-nav-keys - to: /developers/docs/consensus-mechanisms/pos/keys + to: /developers/docs/consensus-mechanisms/pos/keys/ - id: docs-nav-pos-vs-pow - to: /developers/docs/consensus-mechanisms/pos/pos-vs-pow + to: /developers/docs/consensus-mechanisms/pos/pos-vs-pow/ - id: docs-nav-block-proposal - to: /developers/docs/consensus-mechanisms/pos/block-proposal + to: /developers/docs/consensus-mechanisms/pos/block-proposal/ - id: docs-nav-pos-faqs - to: /developers/docs/consensus-mechanisms/pos/faqs + to: /developers/docs/consensus-mechanisms/pos/faqs/ - id: docs-nav-ethereum-stack path: /developers/docs/ items: - id: docs-nav-intro-to-the-stack - to: /developers/docs/ethereum-stack + to: /developers/docs/ethereum-stack/ description: docs-nav-intro-to-the-stack-description - id: docs-nav-smart-contracts - to: /developers/docs/smart-contracts + to: /developers/docs/smart-contracts/ description: docs-nav-smart-contracts-description items: - id: docs-nav-smart-contract-languages - to: /developers/docs/smart-contracts/languages + to: /developers/docs/smart-contracts/languages/ - id: docs-nav-smart-contract-anatomy - to: /developers/docs/smart-contracts/anatomy + to: /developers/docs/smart-contracts/anatomy/ - id: docs-nav-smart-contracts-libraries - to: /developers/docs/smart-contracts/libraries + to: /developers/docs/smart-contracts/libraries/ - id: docs-nav-testing-smart-contracts - to: /developers/docs/smart-contracts/testing + to: /developers/docs/smart-contracts/testing/ - id: docs-nav-compiling-smart-contracts - to: /developers/docs/smart-contracts/compiling + to: /developers/docs/smart-contracts/compiling/ - id: docs-nav-deploying-smart-contracts - to: /developers/docs/smart-contracts/deploying + to: /developers/docs/smart-contracts/deploying/ - id: docs-nav-verifying-smart-contracts - to: /developers/docs/smart-contracts/verifying + to: /developers/docs/smart-contracts/verifying/ - id: docs-nav-upgrading-smart-contracts - to: /developers/docs/smart-contracts/upgrading + to: /developers/docs/smart-contracts/upgrading/ - id: docs-nav-smart-contract-security - to: /developers/docs/smart-contracts/security + to: /developers/docs/smart-contracts/security/ description: docs-nav-smart-contract-security-description - id: docs-nav-smart-contract-formal-verification - to: /developers/docs/smart-contracts/formal-verification + to: /developers/docs/smart-contracts/formal-verification/ description: docs-nav-smart-contract-formal-verification-description - id: docs-nav-composability - to: /developers/docs/smart-contracts/composability + to: /developers/docs/smart-contracts/composability/ - id: docs-nav-development-networks - to: /developers/docs/development-networks + to: /developers/docs/development-networks/ description: docs-nav-development-networks-description - id: docs-nav-development-frameworks - to: /developers/docs/frameworks + to: /developers/docs/frameworks/ description: docs-nav-development-frameworks-description - id: docs-nav-ethereum-client-apis description: docs-nav-ethereum-client-apis-description items: - id: docs-nav-java-script-apis - to: /developers/docs/apis/javascript + to: /developers/docs/apis/javascript/ - id: docs-nav-backend-apis - to: /developers/docs/apis/backend + to: /developers/docs/apis/backend/ - id: docs-nav-json-rpc - to: /developers/docs/apis/json-rpc + to: /developers/docs/apis/json-rpc/ - id: docs-nav-data-and-analytics - to: /developers/docs/data-and-analytics + to: /developers/docs/data-and-analytics/ description: docs-nav-data-and-analytics-description items: - id: docs-nav-block-explorers - to: /developers/docs/data-and-analytics/block-explorers + to: /developers/docs/data-and-analytics/block-explorers/ - id: docs-nav-storage - to: /developers/docs/storage + to: /developers/docs/storage/ description: docs-nav-storage-description - id: docs-nav-integrated-development-environments-ides - to: /developers/docs/ides + to: /developers/docs/ides/ description: docs-nav-integrated-development-environments-ides-description - id: docs-nav-programming-languages - to: /developers/docs/programming-languages + to: /developers/docs/programming-languages/ description: docs-nav-programming-languages-description items: - id: docs-nav-dart - to: /developers/docs/programming-languages/dart + to: /developers/docs/programming-languages/dart/ - id: docs-nav-delphi - to: /developers/docs/programming-languages/delphi + to: /developers/docs/programming-languages/delphi/ - id: docs-nav-dot-net - to: /developers/docs/programming-languages/dot-net + to: /developers/docs/programming-languages/dot-net/ - id: docs-nav-golang - to: /developers/docs/programming-languages/golang + to: /developers/docs/programming-languages/golang/ - id: docs-nav-java - to: /developers/docs/programming-languages/java + to: /developers/docs/programming-languages/java/ - id: docs-nav-javascript - to: /developers/docs/programming-languages/javascript + to: /developers/docs/programming-languages/javascript/ - id: docs-nav-python - to: /developers/docs/programming-languages/python + to: /developers/docs/programming-languages/python/ - id: docs-nav-ruby - to: /developers/docs/programming-languages/ruby + to: /developers/docs/programming-languages/ruby/ - id: docs-nav-rust - to: /developers/docs/programming-languages/rust + to: /developers/docs/programming-languages/rust/ - id: docs-nav-advanced path: /developers/docs/ items: - id: docs-nav-bridges - to: /developers/docs/bridges + to: /developers/docs/bridges/ description: docs-nav-bridges-description - id: docs-nav-standards - to: /developers/docs/standards + to: /developers/docs/standards/ description: docs-nav-standards-description items: - id: docs-nav-token-standards - to: /developers/docs/standards/tokens + to: /developers/docs/standards/tokens/ items: - id: docs-nav-erc-20 - to: /developers/docs/standards/tokens/erc-20 + to: /developers/docs/standards/tokens/erc-20/ - id: docs-nav-erc-721 - to: /developers/docs/standards/tokens/erc-721 + to: /developers/docs/standards/tokens/erc-721/ - id: docs-nav-erc-777 - to: /developers/docs/standards/tokens/erc-777 + to: /developers/docs/standards/tokens/erc-777/ - id: docs-nav-erc-1155 - to: /developers/docs/standards/tokens/erc-1155 + to: /developers/docs/standards/tokens/erc-1155/ - id: docs-nav-erc-4626 - to: /developers/docs/standards/tokens/erc-4626 + to: /developers/docs/standards/tokens/erc-4626/ - id: docs-nav-mev - to: /developers/docs/mev + to: /developers/docs/mev/ description: docs-nav-mev-description - id: docs-nav-oracles - to: /developers/docs/oracles + to: /developers/docs/oracles/ description: docs-nav-oracles-description - id: docs-nav-scaling - to: /developers/docs/scaling + to: /developers/docs/scaling/ description: docs-nav-scaling-description items: - id: docs-nav-scaling-optimistic-rollups - to: /developers/docs/scaling/optimistic-rollups + to: /developers/docs/scaling/optimistic-rollups/ - id: docs-nav-scaling-zk-rollups - to: /developers/docs/scaling/zk-rollups + to: /developers/docs/scaling/zk-rollups/ - id: docs-nav-scaling-channels - to: /developers/docs/scaling/state-channels + to: /developers/docs/scaling/state-channels/ - id: docs-nav-scaling-sidechains - to: /developers/docs/scaling/sidechains + to: /developers/docs/scaling/sidechains/ - id: docs-nav-scaling-plasma - to: /developers/docs/scaling/plasma + to: /developers/docs/scaling/plasma/ - id: docs-nav-scaling-validium - to: /developers/docs/scaling/validium + to: /developers/docs/scaling/validium/ - id: docs-nav-data-availability - to: /developers/docs/data-availability + to: /developers/docs/data-availability/ description: docs-nav-data-availability-description - id: docs-nav-networking-layer - to: /developers/docs/networking-layer + to: /developers/docs/networking-layer/ description: docs-nav-networking-layer-description items: - id: docs-nav-networking-layer-network-addresses - to: /developers/docs/networking-layer/network-addresses + to: /developers/docs/networking-layer/network-addresses/ - id: docs-nav-networking-layer-portal-network - to: /developers/docs/networking-layer/portal-network + to: /developers/docs/networking-layer/portal-network/ - id: docs-nav-data-structures-and-encoding - to: /developers/docs/data-structures-and-encoding + to: /developers/docs/data-structures-and-encoding/ description: docs-nav-data-structures-and-encoding-description items: - id: docs-nav-data-structures-and-encoding-patricia-merkle-trie - to: /developers/docs/data-structures-and-encoding/patricia-merkle-trie + to: /developers/docs/data-structures-and-encoding/patricia-merkle-trie/ - id: docs-nav-data-structures-and-encoding-rlp - to: /developers/docs/data-structures-and-encoding/rlp + to: /developers/docs/data-structures-and-encoding/rlp/ - id: docs-nav-data-structures-and-encoding-ssz - to: /developers/docs/data-structures-and-encoding/ssz + to: /developers/docs/data-structures-and-encoding/ssz/ - id: docs-nav-data-structures-and-encoding-web3-secret-storage - to: /developers/docs/data-structures-and-encoding/web3-secret-storage + to: /developers/docs/data-structures-and-encoding/web3-secret-storage/ - id: docs-nav-design-fundamentals path: /developers/docs/ items: - id: docs-nav-design-and-ux - to: /developers/docs/design-and-ux + to: /developers/docs/design-and-ux/ description: docs-nav-design-and-ux-description diff --git a/src/data/execution-bounty-hunters.json b/src/data/execution-bounty-hunters.json index f1282594b14..5a95dc3d751 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 (@nervoir)", + "score": 31000 + }, { "username": "johnyangk", "name": "John Youngseok Yang (Software Platform Lab)", diff --git a/src/data/layer-2/layer-2.ts b/src/data/layer-2/layer-2.ts index 5034de20394..47e6a62d2ae 100644 --- a/src/data/layer-2/layer-2.ts +++ b/src/data/layer-2/layer-2.ts @@ -4,6 +4,7 @@ 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" @@ -83,6 +84,22 @@ export const layer2Data: Rollups = { image: BobaImage, background: "black", }, + { + name: "Base", + website: "https://base.org/", + developerDocs: "https://docs.base.org/", + l2beat: "https://l2beat.com/scaling/projects/base", + bridge: "https://bridge.base.org/deposit", + bridgeWallets: ["MetaMask", "WalletConnect", "Coinbase Wallet"], + blockExplorer: "https://basescan.org/", + ecosystemPortal: "https://www.base.org/ecosystem", + tokenLists: "", + noteKey: "layer-2-base-note", + purpose: ["universal"], + descriptionKey: "base-description", + image: BaseImage, + background: "white", + }, ], zk: [ { diff --git a/src/data/translationProgress.json b/src/data/translationProgress.json new file mode 100644 index 00000000000..aca3891e1f5 --- /dev/null +++ b/src/data/translationProgress.json @@ -0,0 +1,639 @@ +[ + { + "languageId": "af", + "words": { + "approved": 0, + "total": 339941 + } + }, + { + "languageId": "am", + "words": { + "approved": 10516, + "total": 339941 + } + }, + { + "languageId": "ar", + "words": { + "approved": 40902, + "total": 339941 + } + }, + { + "languageId": "az", + "words": { + "approved": 29436, + "total": 339941 + } + }, + { + "languageId": "be", + "words": { + "approved": 6760, + "total": 339941 + } + }, + { + "languageId": "bg", + "words": { + "approved": 15409, + "total": 339941 + } + }, + { + "languageId": "bi", + "words": { + "approved": 0, + "total": 339941 + } + }, + { + "languageId": "bn", + "words": { + "approved": 36780, + "total": 339941 + } + }, + { + "languageId": "br-FR", + "words": { + "approved": 82, + "total": 339941 + } + }, + { + "languageId": "bs", + "words": { + "approved": 6760, + "total": 339941 + } + }, + { + "languageId": "ca", + "words": { + "approved": 20404, + "total": 339941 + } + }, + { + "languageId": "cs", + "words": { + "approved": 41514, + "total": 339941 + } + }, + { + "languageId": "da", + "words": { + "approved": 2335, + "total": 339941 + } + }, + { + "languageId": "de", + "words": { + "approved": 166447, + "total": 339941 + } + }, + { + "languageId": "el", + "words": { + "approved": 104465, + "total": 339941 + } + }, + { + "languageId": "eo", + "words": { + "approved": 169, + "total": 339941 + } + }, + { + "languageId": "es-EM", + "words": { + "approved": 329876, + "total": 339941 + } + }, + { + "languageId": "et", + "words": { + "approved": 75, + "total": 339941 + } + }, + { + "languageId": "eu", + "words": { + "approved": 36, + "total": 339941 + } + }, + { + "languageId": "fa", + "words": { + "approved": 99242, + "total": 339941 + } + }, + { + "languageId": "fa-AF", + "words": { + "approved": 186, + "total": 339941 + } + }, + { + "languageId": "fi", + "words": { + "approved": 23380, + "total": 339941 + } + }, + { + "languageId": "fil", + "words": { + "approved": 55187, + "total": 339941 + } + }, + { + "languageId": "fr", + "words": { + "approved": 336161, + "total": 339941 + } + }, + { + "languageId": "gi", + "words": { + "approved": 0, + "total": 339941 + } + }, + { + "languageId": "gl", + "words": { + "approved": 2199, + "total": 339941 + } + }, + { + "languageId": "gu-IN", + "words": { + "approved": 2431, + "total": 339941 + } + }, + { + "languageId": "ha", + "words": { + "approved": 4, + "total": 339941 + } + }, + { + "languageId": "he", + "words": { + "approved": 2223, + "total": 339941 + } + }, + { + "languageId": "hi", + "words": { + "approved": 58108, + "total": 339941 + } + }, + { + "languageId": "hr", + "words": { + "approved": 14180, + "total": 339941 + } + }, + { + "languageId": "hu", + "words": { + "approved": 201829, + "total": 339941 + } + }, + { + "languageId": "hy-AM", + "words": { + "approved": 10512, + "total": 339941 + } + }, + { + "languageId": "id", + "words": { + "approved": 159765, + "total": 339941 + } + }, + { + "languageId": "ig", + "words": { + "approved": 24352, + "total": 339941 + } + }, + { + "languageId": "it", + "words": { + "approved": 335275, + "total": 339941 + } + }, + { + "languageId": "ja", + "words": { + "approved": 287545, + "total": 339941 + } + }, + { + "languageId": "ka", + "words": { + "approved": 2315, + "total": 339941 + } + }, + { + "languageId": "kk", + "words": { + "approved": 2366, + "total": 339941 + } + }, + { + "languageId": "km", + "words": { + "approved": 16315, + "total": 339941 + } + }, + { + "languageId": "kn", + "words": { + "approved": 27759, + "total": 339941 + } + }, + { + "languageId": "ko", + "words": { + "approved": 53303, + "total": 339941 + } + }, + { + "languageId": "ku", + "words": { + "approved": 0, + "total": 339941 + } + }, + { + "languageId": "ky", + "words": { + "approved": 12, + "total": 339941 + } + }, + { + "languageId": "lb", + "words": { + "approved": 0, + "total": 339941 + } + }, + { + "languageId": "lt", + "words": { + "approved": 2714, + "total": 339941 + } + }, + { + "languageId": "mai", + "words": { + "approved": 0, + "total": 339941 + } + }, + { + "languageId": "mk", + "words": { + "approved": 88, + "total": 339941 + } + }, + { + "languageId": "ml-IN", + "words": { + "approved": 12307, + "total": 339941 + } + }, + { + "languageId": "mn", + "words": { + "approved": 64, + "total": 339941 + } + }, + { + "languageId": "mr", + "words": { + "approved": 26603, + "total": 339941 + } + }, + { + "languageId": "ms", + "words": { + "approved": 37835, + "total": 339941 + } + }, + { + "languageId": "my", + "words": { + "approved": 706, + "total": 339941 + } + }, + { + "languageId": "ne-NP", + "words": { + "approved": 2315, + "total": 339941 + } + }, + { + "languageId": "nl", + "words": { + "approved": 38061, + "total": 339941 + } + }, + { + "languageId": "no", + "words": { + "approved": 2711, + "total": 339941 + } + }, + { + "languageId": "or", + "words": { + "approved": 0, + "total": 339941 + } + }, + { + "languageId": "pa-IN", + "words": { + "approved": 6, + "total": 339941 + } + }, + { + "languageId": "pcm", + "words": { + "approved": 17866, + "total": 339941 + } + }, + { + "languageId": "pl", + "words": { + "approved": 95709, + "total": 339941 + } + }, + { + "languageId": "pt-BR", + "words": { + "approved": 318622, + "total": 339941 + } + }, + { + "languageId": "pt-PT", + "words": { + "approved": 26713, + "total": 339941 + } + }, + { + "languageId": "ro", + "words": { + "approved": 78570, + "total": 339941 + } + }, + { + "languageId": "ru", + "words": { + "approved": 96995, + "total": 339941 + } + }, + { + "languageId": "sat", + "words": { + "approved": 57, + "total": 339941 + } + }, + { + "languageId": "si-LK", + "words": { + "approved": 706, + "total": 339941 + } + }, + { + "languageId": "sk", + "words": { + "approved": 7243, + "total": 339941 + } + }, + { + "languageId": "sl", + "words": { + "approved": 27166, + "total": 339941 + } + }, + { + "languageId": "sn", + "words": { + "approved": 465, + "total": 339941 + } + }, + { + "languageId": "so", + "words": { + "approved": 493, + "total": 339941 + } + }, + { + "languageId": "sq", + "words": { + "approved": 693, + "total": 339941 + } + }, + { + "languageId": "sr-CS", + "words": { + "approved": 26854, + "total": 339941 + } + }, + { + "languageId": "sv-SE", + "words": { + "approved": 10874, + "total": 339941 + } + }, + { + "languageId": "sw", + "words": { + "approved": 17237, + "total": 339941 + } + }, + { + "languageId": "ta", + "words": { + "approved": 2319, + "total": 339941 + } + }, + { + "languageId": "te", + "words": { + "approved": 694, + "total": 339941 + } + }, + { + "languageId": "tg", + "words": { + "approved": 0, + "total": 339941 + } + }, + { + "languageId": "th", + "words": { + "approved": 6817, + "total": 339941 + } + }, + { + "languageId": "ti", + "words": { + "approved": 0, + "total": 339941 + } + }, + { + "languageId": "tk", + "words": { + "approved": 6762, + "total": 339941 + } + }, + { + "languageId": "tl", + "words": { + "approved": 86, + "total": 339941 + } + }, + { + "languageId": "tr", + "words": { + "approved": 320901, + "total": 339941 + } + }, + { + "languageId": "uk", + "words": { + "approved": 65054, + "total": 339941 + } + }, + { + "languageId": "ur-IN", + "words": { + "approved": 2315, + "total": 339941 + } + }, + { + "languageId": "ur-PK", + "words": { + "approved": 725, + "total": 339941 + } + }, + { + "languageId": "uz", + "words": { + "approved": 2907, + "total": 339941 + } + }, + { + "languageId": "vi", + "words": { + "approved": 19284, + "total": 339941 + } + }, + { + "languageId": "yo", + "words": { + "approved": 687, + "total": 339941 + } + }, + { + "languageId": "zh-CN", + "words": { + "approved": 311060, + "total": 339941 + } + }, + { + "languageId": "zh-TW", + "words": { + "approved": 125769, + "total": 339941 + } + }, + { + "languageId": "zu", + "words": { + "approved": 109, + "total": 339941 + } + } +] \ No newline at end of file diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index bbd3b9401af..bd24885092e 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -2,15 +2,14 @@ import { StaticImageData } from "next/image" import OneInchWalletImage from "@/public/wallets/1inch.png" import AirgapImage from "@/public/wallets/airgap.png" -import AktionariatImage from "@/public/wallets/aktionariat.png" import AlphaWalletImage from "@/public/wallets/alpha.png" import AmbireImage from "@/public/wallets/ambire.png" import ApexImage from "@/public/wallets/apex.png" import ArgentImage from "@/public/wallets/argent.png" +import AuroxImage from "@/public/wallets/aurox.png" import BitcoindotcomImage from "@/public/wallets/bitcoindotcom.png" import BitkeepImage from "@/public/wallets/bitkeep.png" import BlockWalletImage from "@/public/wallets/blockwallet.png" -import BraveImage from "@/public/wallets/brave.png" import BridgeWalletImage from "@/public/wallets/bridge.png" import Coin98Image from "@/public/wallets/coin98.png" import CoinbaseImage from "@/public/wallets/coinbase.png" @@ -28,27 +27,19 @@ import LedgerImage from "@/public/wallets/ledger.png" import LoopringImage from "@/public/wallets/loopring.png" import MetaMaskImage from "@/public/wallets/metamask.png" import MewImage from "@/public/wallets/mew.png" -import MyCryptoImage from "@/public/wallets/mycrypto.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" 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" -import SequenceImage from "@/public/wallets/sequence.png" -import ShapeShiftImage from "@/public/wallets/shapeshift.png" -import StatusImage from "@/public/wallets/status.png" import TahoImage from "@/public/wallets/taho.png" import TokenPocketImage from "@/public/wallets/tokenpocket.png" import TorusImage from "@/public/wallets/torus.png" import TrezorImage from "@/public/wallets/trezor.png" import UnstoppableWalletImage from "@/public/wallets/unstoppable.png" -import Web3AuthImage from "@/public/wallets/web3auth.png" import XDEFIImage from "@/public/wallets/xdefi.png" import ZengoImage from "@/public/wallets/zengo.png" import ZerionImage from "@/public/wallets/zerion.png" @@ -150,51 +141,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", @@ -397,51 +343,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", @@ -534,53 +435,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", @@ -993,72 +847,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", @@ -1291,52 +1079,6 @@ const walletData: WalletData[] = [ onboard_documentation: "https://alphawallet.zendesk.com/hc/en-us", documentation: "", }, - { - last_updated: "June 24, 2022", - name: "Opera wallet", - image: OperaImage, - brand_color: "#ffffff", - url: "https://crypto.opera.com/", - wallet_live_date: "January 19 2022", - active_development_team: true, - languages_supported: ["en"], - twitter: "https://twitter.com/Opera_Crypto", - discord: "https://discord.gg/operacrypto", - reddit: "", - telegram: "", - ios: true, - android: true, - linux: true, - windows: true, - macOS: true, - firefox: false, - chromium: false, - hardware: false, - open_source: false, - repo_url: "", - non_custodial: true, - security_audit: [""], - scam_protection: true, - hardware_support: false, - walletconnect: false, - rpc_importing: false, - nft_support: true, - connect_to_dapps: true, - staking: false, - swaps: true, - multichain: true, - layer_2: false, - gas_fee_customization: false, - ens_support: true, - erc_20_support: true, - eip_1559_support: false, - buy_crypto: true, - withdraw_crypto: true, - multisig: false, - social_recovery: false, - onboard_documentation: "", - documentation: "", - }, { last_updated: "June 24, 2022", name: "Guarda", @@ -1383,53 +1125,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", @@ -1626,171 +1321,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", - image: AktionariatImage, - brand_color: "#ffffff", - url: "https://www.aktionariat.com/", - wallet_live_date: "28.01.2021", - active_development_team: true, - languages_supported: ["en"], - twitter: "https://twitter.com/aktionariat", - discord: "", - reddit: "", - telegram: "https://t.me/Aktionariat", - 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: false, - connect_to_dapps: true, - staking: false, - swaps: false, - multichain: false, - layer_2: true, - gas_fee_customization: true, - ens_support: false, - erc_20_support: false, - eip_1559_support: true, - buy_crypto: true, - withdraw_crypto: false, - multisig: false, - social_recovery: false, - onboard_documentation: "", - documentation: "https://www.aktionariat.com/faq/en#wallet", - }, - { - last_updated: "2022-08-21", - name: "Sequence", - image: SequenceImage, - brand_color: "#000000", - url: "https://www.sequence.xyz", - wallet_live_date: "2021-11-04", - active_development_team: true, - languages_supported: ["en"], - twitter: "https://twitter.com/0xsequence", - discord: "https://discord.gg/sequence", - reddit: "https://www.reddit.com/r/0xSequence/", - telegram: "", - ios: false, - android: false, - linux: false, - windows: false, - macOS: false, - firefox: true, - chromium: true, - hardware: false, - open_source: true, - repo_url: "https://github.com/0xsequence/wallet-contracts", - non_custodial: true, - security_audit: [ - "https://docs.sequence.build/wallet-contracts/contract-audits", - ], - scam_protection: true, - hardware_support: false, - walletconnect: true, - rpc_importing: false, - nft_support: true, - connect_to_dapps: true, - staking: false, - swaps: true, - multichain: true, - layer_2: false, - gas_fee_customization: false, - ens_support: true, - erc_20_support: true, - eip_1559_support: true, - buy_crypto: false, - withdraw_crypto: false, - multisig: true, - social_recovery: false, - onboard_documentation: "https://support.sequence.xyz/", - documentation: "https://docs.sequence.xyz/", - }, { last_updated: "2022-08-21", name: "Trezor", @@ -2538,52 +2068,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", @@ -2712,6 +2196,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: AuroxImage, + 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/hooks/useNavMenuColors.ts b/src/hooks/useNavMenuColors.ts new file mode 100644 index 00000000000..5fa622dc496 --- /dev/null +++ b/src/hooks/useNavMenuColors.ts @@ -0,0 +1,46 @@ +import { useColorModeValue } from "@chakra-ui/react" + +import { Level } from "@/components/Nav/types" + +type LevelColors = { + subtext: string + background: string + activeBackground: string +} + +type NavMenuColors = { + body: string + stroke: string + highlight: string + active: string + lvl: Record +} + +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"), + }, + }, +}) diff --git a/src/hooks/useSurvey.ts b/src/hooks/useSurvey.ts index 86e5105bfae..950c7dfe1fa 100644 --- a/src/hooks/useSurvey.ts +++ b/src/hooks/useSurvey.ts @@ -5,7 +5,7 @@ import { SITE_URL } from "@/lib/constants" export const useSurvey = (feedbackSubmitted: boolean) => { const { asPath } = useRouter() - const url = SITE_URL + asPath + const { href: url } = new URL(asPath, SITE_URL) return useMemo((): string | null => { if (!feedbackSubmitted) return null return `https://iwokuhuz.paperform.co//?url=${url}` diff --git a/src/intl/am/common.json b/src/intl/am/common.json index 20178488c16..3e188d51ed4 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": "አስተዋጽኦ ያደረጉ ሰዎች", @@ -20,14 +32,17 @@ "copied": "ተገልብጧል", "copy": "መገልበጥ", "danksharding": "ዳንክሻርዲንግ", - "dao-page": "ያልተማከሉ ራስ ገዝ ድርጅቶች (DAOs)", + "dao-page": "DAOs - ያልተማከሉ ራስ ገዝ ድርጅቶች", "dark-mode": "ጨለማ", "data-provided-by": "የዳታ ምንጭ:", - "decentralized-applications-dapps": "ያልተማከሉ መተግበሪያዎች (dapps)", + "decentralized-applications-dapps": "Dapps - ያልተማከሉ መተግበሪያዎች", "decentralized-identity": "ያልተማከለ ማንነት", "decentralized-social-networks": "ያልተማከሉ ማህበራዊ አውታረ-መረቦች፡፡", - "decentralized-science": "ያልተማከለ ሳይንስ (DeSci)", - "defi-page": "ያልተማከለ ፋይናንስ (DeFi)", + "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,11 +143,108 @@ "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": "EIPዎች - የEthereum ማሻሻያ ፕሮፖዛል", + "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": "ዋነኛ", - "nft-page": "የማይተኩ ቶከኖች (NFTs)", + "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": "አይደለም", "on-this-page": "በዚህ ገፅ ላይ", @@ -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)", + "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/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/am/page-languages.json b/src/intl/am/page-languages.json new file mode 100644 index 00000000000..8beba82967c --- /dev/null +++ b/src/intl/am/page-languages.json @@ -0,0 +1,82 @@ +{ + "page-languages-h1": "የቋንቋ ድጋፍ", + "page-languages-interested": "አስተዋጽዖ ለማድረግ ይፈልጋሉ?", + "page-languages-learn-more": "ስለ ትርጉም ፕሮግራማችን የበለጠ ይወቁ", + "page-languages-meta-desc": "በethereum.org ስለሚደገፉ ቋንቋዎች መረጃዎች እና እንደ ተርጓሚ መሳተፍ የሚችሉባቸው መንገዶች።", + "page-languages-meta-title": "ethereum.org የቋንቋ ትርጉሞች", + "page-languages-p1": "ኢተርየም ዓለም አቀፍ ፕሮጀክት ነው እና ethereum.org ዜግነታቸው ወይም ቋንቋቸው ምንም ይሁን ምን ለሁሉም ሰው ተደራሽ መሆኑ በጣም አስፈላጊ ነው። ይህንን ራዕይ እውን ለማድረግ ማህበረሰባችን በትኩረት ሲሰራ ቆይቷል።", + "page-languages-translations-available": "ethereum.org በሚከተሉት ቋንቋዎች ይገኛል።", + "page-languages-resources-paragraph": "የ ethereum.org ይዘትን ከመተርጎም በተጨማሪ የምንደግፋቸው", + "page-languages-resources-link": "በብዙ ቋንቋዎች ተመርጠው የተሰበሰቡ የኢተርየም መረጃዎች ዝርዝር", + "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 እንድንተረጉም ይርዱን።", + "langauge-am": "Amharic", + "language-ar": "አረብኛ", + "language-az": "አዘርባጃንኛ", + "langauge-be": "Belarusian", + "language-bg": "ቡልጋርያኛ", + "language-bn": "ቤንጋሊኛ", + "language-bs": "Bosnian", + "language-ca": "ካታላንኛ", + "language-cs": "Czech", + "language-da": "ዳኒሸኛ", + "language-de": "German", + "language-el": "ግሪክኛ", + "language-en": "እንግሊዝኛ", + "language-es": "Spanish", + "language-fa": "ፋርስኛ", + "language-fi": "ፊኒሽኛ", + "language-fr": "French", + "language-gl": "ጋሊሺያኛ", + "language-gu": "ጉጅራቲኛ", + "language-he": "እብራይስጥ", + "language-hi": "ህንደኛ", + "language-hr": "ክሮሺያኛ", + "language-hu": "ሃጋሪኛ", + "language-hy-am": "Armenian", + "language-id": "ኢንዶኔዢያኛ", + "language-ig": "የኢግቦ ቋንቋ", + "language-it": "Italian", + "language-ja": "Japanese", + "language-ka": "ጆርጂያኛ", + "language-kk": "ካዛክኛ", + "language-km": "ክመርኛ", + "language-kn": "Kannada", + "language-ko": "ኮርያኛ", + "language-lt": "ሉቲኒያኛ", + "language-ml": "የማላያላም ቋንቋ", + "language-mr": "የማራቲ ቋንቋ", + "language-ms": "ማላይኛ", + "language-nb": "ኖርዌጂያኛ", + "language-ne-np": "Nepali", + "language-nl": "ደች", + "language-pcm": "የናይጀሪያ ፒድጊን", + "language-fil": "ፊልፒንኛ", + "language-pl": "ፖሊሽኛ", + "language-pt": "ፖርቹጋልኛ", + "language-pt-br": "ፖርቹጋልኛ(የብራዚል)", + "language-ro": "ሮማንያንኛ", + "language-ru": "Russian", + "language-se": "ስዊድንኛ", + "language-sk": "ስሎቫክኛ", + "language-sl": "ስሎቬንያኛ", + "language-sr": "ሰርቢያኛ", + "language-sw": "የስዋሂሊ ቋንቋ", + "language-ta": "ታሚልኛ", + "language-th": "የታይ ቋንቋ", + "language-tk": "Turkmen", + "language-tr": "Turkish", + "language-uk": "ዩክሬንኛ", + "language-ur": "ኡድሩኛ", + "language-uz": "ኡዝቤክኛ", + "language-vi": "Vietnamese", + "language-zh": "ቻይንኛ (ቀላሉ)", + "language-zh-tw": "ቻይንኛ (ባህላዊ)" +} diff --git a/src/intl/am/page-stablecoins.json b/src/intl/am/page-stablecoins.json index cb1c3939a70..4ed2e33a40b 100644 --- a/src/intl/am/page-stablecoins.json +++ b/src/intl/am/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/ar/common.json index 1e0aea21d31..f5a4c6f0cc0 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": "المساهمون", @@ -20,14 +33,17 @@ "copied": "تم النسخ", "copy": "نسخ", "danksharding": "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)", - "defi-page": "التمويل اللامركزي (DeFi)", + "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,122 @@ "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": "رئيسي", - "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": "تتولى جهة خارجية مختصة بتشغيل العقد عمليات تشغيل عميلك المدقق", + "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": "الرموز المميزة غير القابلة للاستبدال", "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 +270,11 @@ "refresh": "يُرجى تحديث الصفحة.", "return-home": "العودة إلى الرئيسية", "roadmap": "خارطة طريق إثيريوم", + "research": "البحوث", + "research-menu": "قائمة البحوث", "resources": "مصادر الترجمة", - "regenerative-finance": "التمويل المتجدد (ري فاي)", - "run-a-node": "تشغيل عقدة", + "regenerative-finance": "ري فاي - التمويل المتجدد", + "run-a-node": "إضافة عقدة", "rollup-component-website": "الموقع الإلكتروني", "rollup-component-developer-docs": "وثائق المبرمج", "rollup-component-technology-and-risk-summary": "ملخص التكنولوجيا والخطر", @@ -164,10 +286,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 +298,12 @@ "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 +314,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/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/ar/page-languages.json b/src/intl/ar/page-languages.json index 2481df2d3a3..9a46aea4e51 100644 --- a/src/intl/ar/page-languages.json +++ b/src/intl/ar/page-languages.json @@ -11,9 +11,16 @@ "page-languages-want-more-header": "هل ترغب في الاطلاع على ethereum.org بلغة مختلفة؟", "page-languages-want-more-link": "برنامج الترجمة", "page-languages-want-more-paragraph": "مترجمو ethereum.org دائمًا يترجمون الصفحات بأكبر عدد ممكن من اللغات. للاطلاع على ما يعملون عليه الآن أو للتسجيل للانضمام إليهم، اقرأ عن", - "page-languages-filter-placeholder": "فلتر", + "page-languages-filter-label": "قائمة عوامل التصفية", + "page-languages-filter-placeholder": "اكتب للتصفية", + "page-languages-browser-default": "الإعدادات الافتراضية للمتصفح", + "page-languages-translated": "تمت الترجَمة", + "page-languages-words": "من الكلمات", + "page-languages-recruit-community": "ساعدنا على ترجَمة ethereum.org.", + "langauge-am": "Amharic", "language-ar": "العربية", "language-az": "الأذربيجانية", + "langauge-be": "البيلاروسية", "language-bg": "البلغارية", "language-bn": "البنغالية", "language-ca": "الكتالونية", @@ -32,6 +39,7 @@ "language-hi": "الهندية", "language-hr": "الكرواتية", "language-hu": "الهنغارية", + "language-hy-am": "Armenian", "language-id": "الإندونيسية", "language-ig": "الإيجبو", "language-it": "الإيطالية", @@ -39,12 +47,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 +68,9 @@ "language-sl": "السلوفينية", "language-sr": "الصربية", "language-sw": "السواحيلية", - "language-th": "التايلاندية", "language-ta": "التاميلية", + "language-th": "التايلاندية", + "language-tk": "Turkmen", "language-tr": "التركية", "language-uk": "الأوكرانية", "language-ur": "الأوردية", 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": "السيادة", diff --git a/src/intl/ar/page-stablecoins.json b/src/intl/ar/page-stablecoins.json index 029d335311e..95d8a81897a 100644 --- a/src/intl/ar/page-stablecoins.json +++ b/src/intl/ar/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/az/common.json index 7902cf319e3..6c053c6a171 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,14 +32,15 @@ "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ş yerli 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-applications-dapps": "Dapps - Mərkəzləşdirilməmiş tətbiqlər", + "decentralized-identity": "Mərkəzləşdirilməmiş eynilik", "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", + "description": "Naviqasiya elementi üçün təsvir", + "defi-page": "DeFi - Mərkəzləşdirilməmiş maliyyə", "design": "Dizayn", "design-principles": "Dizayn Prinsipləri", "devcon": "İllik konfrans (Devcon)", @@ -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": "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", + "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": "Bir-birini əvəz edə bilməyən nişanlar (NFTs)", + "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": "Regenerativ maliyyə (ReFi)", + "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/az/page-dapps.json b/src/intl/az/page-dapps.json index 6fdaf96bcec..65d8f99eb9a 100644 --- a/src/intl/az/page-dapps.json +++ b/src/intl/az/page-dapps.json @@ -115,14 +115,12 @@ "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-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.", @@ -248,7 +246,6 @@ "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", @@ -260,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/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-languages.json b/src/intl/az/page-languages.json index e18c5c3dc9d..719812bd66d 100644 --- a/src/intl/az/page-languages.json +++ b/src/intl/az/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "ethereum.org-u başqa dildə görmək istəyirsiniz?", "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", + "page-languages-filter-label": "Filtr siyahısı", + "page-languages-filter-placeholder": "Filtrləmək üçün daxil et", + "page-languages-browser-default": "Standart brauzer", + "page-languages-translated": "tərcümə edilmiş", + "page-languages-words": "sözlər", + "page-languages-recruit-community": "ethereum.org saytının tərcümə edilməsində bizə kömək edin.", "langauge-am": "Amhar dili", "language-ar": "Ərəb dili", "language-az": "Azərbaycan dili", diff --git a/src/intl/az/page-stablecoins.json b/src/intl/az/page-stablecoins.json index e991aa20e29..f6ec953de50 100644 --- a/src/intl/az/page-stablecoins.json +++ b/src/intl/az/page-stablecoins.json @@ -63,6 +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-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/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", diff --git a/src/intl/be/common.json b/src/intl/be/common.json index b14782dd9ce..3b83299e9df 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": "Саўдзельнікі", @@ -20,14 +32,17 @@ "copied": "Скапіявана", "copy": "Капіраваць", "danksharding": "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)", - "defi-page": "Дэцэнтралізаваныя фінансы (DeFi)", + "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,11 +138,102 @@ "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": "EIP - Прапановы па паляпшэнні Ethereum", + "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": "Головна", - "nft-page": "Неўзаемназаменныя токены (NFT)", + "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": "На гэтай старонцы", @@ -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": "Regenerative finance (ReFi)", - "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/be/page-languages.json b/src/intl/be/page-languages.json new file mode 100644 index 00000000000..f2df7c7900d --- /dev/null +++ b/src/intl/be/page-languages.json @@ -0,0 +1,82 @@ +{ + "page-languages-h1": "Моўная падтрымка", + "page-languages-interested": "Зацікаўлены ва ўкладзе?", + "page-languages-learn-more": "Даведайцеся больш пра нашу праграму перакладу", + "page-languages-meta-desc": "Рэсурсы да ўсіх падтрымліваемых моў ethereum.org і спосабы ўдзелу ў якасці перакладчыка.", + "page-languages-meta-title": "ethereum.org Моўныя пераклады", + "page-languages-p1": "Ethereum - гэта глабальны праект, і вельмі важна, каб ethereum.org быў даступны кожнаму, незалежна ад яго нацыянальнасці і мовы. Наша супольнасць прыкладае ўсе намаганні, каб зрабіць гэта бачанне рэальнасцю.", + "page-languages-translations-available": "ethereum.org даступны на наступных мовах", + "page-languages-resources-paragraph": "У дадатак да перакладу кантэнту ethereum.org, мы таксама падтрымліваем", + "page-languages-resources-link": "куратарскі спіс рэсурсаў Ethereum на многіх мовах", + "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.", + "langauge-am": "Амхарская", + "language-ar": "Арабская", + "language-az": "Азербайджанская", + "langauge-be": "Беларуская", + "language-bg": "Балгарская", + "language-bn": "Бенгальская", + "language-bs": "Баснійская", + "language-ca": "Каталонская", + "language-cs": "Czech", + "language-da": "Дацкая", + "language-de": "German", + "language-el": "Грэчаская", + "language-en": "Англійская", + "language-es": "Spanish", + "language-fa": "Фарсі", + "language-fi": "Фінская", + "language-fr": "French", + "language-gl": "Галісійская", + "language-gu": "Гуджараці", + "language-he": "Іўрыт", + "language-hi": "Хіндзі", + "language-hr": "Харвацкая", + "language-hu": "Венгерская", + "language-hy-am": "Армянская", + "language-id": "Інданезійская", + "language-ig": "Ігба", + "language-it": "Italian", + "language-ja": "Japanese", + "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": "Філіпінская", + "language-pl": "Польская", + "language-pt": "Партугальская", + "language-pt-br": "Партугальская (Бразілія)", + "language-ro": "Румынская", + "language-ru": "Russian", + "language-se": "Шведская", + "language-sk": "Славацкая", + "language-sl": "Славенская", + "language-sr": "Сербская", + "language-sw": "Суахілі", + "language-ta": "Тамільская", + "language-th": "Тайская", + "language-tk": "Туркменская", + "language-tr": "Turkish", + "language-uk": "Украінская", + "language-ur": "Урду", + "language-uz": "Узбекская", + "language-vi": "Vietnamese", + "language-zh": "Кітайская спрошчаная", + "language-zh-tw": "Кітайская традыцыйная" +} diff --git a/src/intl/bg/common.json b/src/intl/bg/common.json index ffdea3aa7e7..e6dbd6b48cf 100644 --- a/src/intl/bg/common.json +++ b/src/intl/bg/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": "Бутон за търсене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": "Сътрудници", @@ -20,14 +32,17 @@ "copied": "Копирано", "copy": "Копиране", "danksharding": "Danksharding", - "dao-page": "Децентрализирани автономни организации (DAOs)", + "dao-page": "DAOs - Децентрализирани автономни организации", "dark-mode": "Тъмно", "data-provided-by": "Източник на данни:", - "decentralized-applications-dapps": "Децентрализирани приложения (dapps)", + "decentralized-applications-dapps": "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 +66,7 @@ "documentation": "Документация", "down": "Надолу", "ecosystem": "Екосистема", - "edit-page": "Редактиране на страницата", + "edit-page": "Редактирай страницата", "ef-blog": "Блог на фондация Етереум", "eips": "Предложения за подобрения в Етереум", "energy-consumption": "Потребление на електричество от Етериум", @@ -59,11 +74,10 @@ "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", "ethereum-online": "Общности в мрежата", "ethereum-events": "Събития на Етериум", "ethereum-foundation": "Фондация Етереум", @@ -83,22 +97,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 +129,7 @@ "last-edit": "Последна редакция", "layer-2": "Слой 2", "learn": "Научете", - "learn-by-coding": "Научете, като кодирате", + "learn-by-coding": "Учете се, като кодирате", "learn-hub": "Обучителен център", "learn-menu": "Как да научиш", "learn-more": "Научи повече", @@ -128,11 +142,108 @@ "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": "EIP - Предложения за подобряване на Eтереум", + "nav-emerging-description": "Запознайте се с други, по-нови случаи на използване за Eтереум", + "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-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-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": "Основен", - "nft-page": "Незаменяеми токени (NFTs)", + "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-security-description": "Гарантиране, че Eтереум ще остане устойчива на всякакви атаки в бъдеще", + "nav-roadmap-security-label": "Повишена сигурност", + "nav-roadmap-ux-description": "Употребата на Eтереум трябва да е лесна", + "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-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": "Открийте различни идеи за използване на Eтереум", + "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": "Не", "on-this-page": "На тази страница", @@ -140,6 +251,8 @@ "page-developers-aria-label": "Меню за разработчици", "page-index-meta-title": "Начална страница", "page-last-updated": "Последна актуализация на страницата", + "participate": "Участвайте", + "participate-menu": "Меню за участие", "pbs": "Разделяне на предлагащ и строител", "pools": "Групово залагане", "privacy-policy": "Политика за поверителност", @@ -150,13 +263,14 @@ "refresh": "Моля, обновете страницата.", "return-home": "към началната страница", "roadmap": "Пътна карта на Етереум", + "research": "Проучване", + "research-menu": "Меню за проучване", "resources": "Източници за превод", - "regenerative-finance": "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 +278,7 @@ "search-box-blank-state-text": "Търсете по-нататък!", "search-eth-address": "Това прилича на адреса на Етереум. Ние не предлагаме данни, които са специфични за даден адрес. Опитайте да го намерите в block explorer като", "search-no-results": "Няма резултати от търсенето ви", + "security": "Сигурност", "single-slot-finality": "Финализиране в рамките на един слот", "statelessness": "Без състояние", "see-contributors": "Вижте сътрудниците", @@ -172,15 +287,14 @@ "show-all": "Покажи всички", "show-less": "Покажи по-малко", "site-description": "Етереум е глобална, децентрализирана платформа за пари и нови видове приложения. В Етереум можете да създавате код, който контролира пари, и да правите приложения, достъпни по целия свят.", - "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,20 +305,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": "Използвайте менюто на Етереум", - "user-experience": "User experience", + "use-menu": "Меню за използване", "verkle-trees": "Дърво на Verkle", "wallets": "Портфейли", "we-couldnt-find-that-page": "Не можахме да намерим тази страница", "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/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/bg/page-languages.json b/src/intl/bg/page-languages.json index 649bf00500a..73337563552 100644 --- a/src/intl/bg/page-languages.json +++ b/src/intl/bg/page-languages.json @@ -1,21 +1,32 @@ { "page-languages-h1": "Езикова поддръжка", - "page-languages-interested": "Искате ли да имате принос?", + "page-languages-interested": "Желаете да допринесете?", "page-languages-learn-more": "Научете повече за нашата Програма за преводи", "page-languages-meta-desc": "Източници за всички поддържани езици в ethereum.org и начини да се включите като преводач.", "page-languages-meta-title": "езикови преводи на ethereum.org", "page-languages-p1": "Етереум е глобален проект и достъпът на всички в ethereum.org е от изключително значение, независимо каква е тяхната националност или език. Нашата общност работи усилено да превърне тази визия в реалност.", "page-languages-translations-available": "ethereum.org е наличен на следните езици", + "page-languages-resources-paragraph": "Освен че превеждаме съдържанието на ethereum.org, също така поддържаме и", + "page-languages-resources-link": "списък с подбрани ресурси на Етереум на много различни езици", "page-languages-want-more-header": "Желаете ли да видите ethereum.org на друг език?", "page-languages-want-more-link": "Програма за преводи", "page-languages-want-more-paragraph": "преводачите на ethereum.org през цялото време превеждат страниците на възможно най-много езици. За да видите върху какво работят сега или да се запишете при тях, прочетете за нашата", - "page-languages-filter-placeholder": "Филтър", + "page-languages-filter-label": "Списък с филтри", + "page-languages-filter-placeholder": "Въведете текст за филтриране", + "page-languages-browser-default": "Браузър по подразбиране", + "page-languages-translated": "преведено", + "page-languages-words": "думи", + "page-languages-recruit-community": "Помогнете ни да преведем ethereum.org.", + "langauge-am": "Amharic", "language-ar": "Арабски", "language-az": "Азербайджански", + "langauge-be": "Belarusian", "language-bg": "Български", "language-bn": "Бенгалски", + "language-bs": "Bosnian", "language-ca": "Каталунски", "language-cs": "Чешки", + "language-da": "Датски", "language-de": "Немски", "language-el": "Гръцки", "language-en": "Английски", @@ -24,21 +35,30 @@ "language-fi": "Финландски", "language-fr": "Френски", "language-gl": "Галисийски", + "language-gu": "Gujarati", + "language-he": "Иврит", "language-hi": "Хинди", "language-hr": "Хърватски", "language-hu": "Унгарски", + "language-hy-am": "Armenian", "language-id": "Индонезийски", "language-ig": "Игбо", "language-it": "Италиански", "language-ja": "Японски", "language-ka": "Грузински", + "language-kk": "Казахски", + "language-km": "Кхмерски", + "language-kn": "Kannada", "language-ko": "Корейски", "language-lt": "Литовски", "language-ml": "Малайски", "language-mr": "Маратхи", "language-ms": "Малайски", "language-nb": "Норвежки", + "language-ne-np": "Nepali", "language-nl": "Нидерландски", + "language-pcm": "Nigerian Pidgin", + "language-fil": "Филипински", "language-pl": "Полски", "language-pt": "Португалски", "language-pt-br": "Португалски (бразилски)", @@ -49,9 +69,13 @@ "language-sl": "Словенски", "language-sr": "Сръбски", "language-sw": "Суахили", + "language-ta": "Тамилски", "language-th": "Тайландски", + "language-tk": "Turkmen", "language-tr": "Турски", "language-uk": "Украински", + "language-ur": "Urdu", + "language-uz": "Узбекски", "language-vi": "Виетнамски", "language-zh": "Опростен китайски", "language-zh-tw": "Традиционен китайски" diff --git a/src/intl/bg/page-stablecoins.json b/src/intl/bg/page-stablecoins.json index 2f5037e11d2..afcf5f9031c 100644 --- a/src/intl/bg/page-stablecoins.json +++ b/src/intl/bg/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/bn/common.json index 48e34144da8..738641a6dc6 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": "অবদানকারী", @@ -20,14 +32,17 @@ "copied": "কপি করা হয়েছে", "copy": "কপি করুন", "danksharding": "ড্যাঙ্কশার্ডিং", - "dao-page": "বিকেন্দ্রীভূত স্বায়ত্তশাসিত সংস্থা (DAOs)", + "dao-page": "DAOs - বিকেন্দ্রীভূত স্বায়ত্তশাসিত সংস্থা", "dark-mode": "ডার্ক", "data-provided-by": "ডেটার উৎস:", - "decentralized-applications-dapps": "বিকেন্দ্রীভূত অ্যাপ্লিকেশন (dapps)", + "decentralized-applications-dapps": "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": "ডেভেলপার-এর হোম পেজ", @@ -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,11 +142,109 @@ "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": "প্রাইমারি", - "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": "থার্ড-পার্টি নোড অপারেটররা আপনার ভ্যালিডেটর ক্লায়েন্টের অপারেশন পরিচালনা করে", + "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 +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", + "regenerative-finance": "ReFi - রিজেনারেটিভ ফাইনান্স", "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,24 @@ "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/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/bn/page-languages.json b/src/intl/bn/page-languages.json index ae8695ffed4..661bf3e5457 100644 --- a/src/intl/bn/page-languages.json +++ b/src/intl/bn/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "একটি ভিন্ন ভাষায় ethereum.org দেখতে চান?", "page-languages-want-more-link": "অনুবাদ কর্মসূচি", "page-languages-want-more-paragraph": "ethereum.org অনুবাদকরা সবসময় যতটা সম্ভব অনেক ভাষায় পৃষ্ঠাগুলি অনুবাদ করে। তারা এখন কি কাজ করছে তা দেখতে বা তাদের সাথে যোগ দিতে সাইন আপ করতে, আমাদের সম্পর্কে পড়ুন", - "page-languages-filter-placeholder": "ফিল্টার", + "page-languages-filter-label": "তালিকা ফিল্টার করুন", + "page-languages-filter-placeholder": "ফিল্টার করতে লিখুন", + "page-languages-browser-default": "ব্রাউজারের ডিফল্ট", + "page-languages-translated": "অনুবাদ করা হয়েছে", + "page-languages-words": "শব্দ", + "page-languages-recruit-community": "আমাদের ethereum.org অনুবাদ করতে সাহায্য করুন।", + "langauge-am": "Amharic", "language-ar": "আরবি", "language-az": "আজারবাইজানীয়", + "langauge-be": "Belarusian", "language-bg": "বুলগেরীয়", "language-bn": "বাংলা", + "language-bs": "Bosnian", "language-ca": "ক্যাটালান", "language-cs": "চেক", "language-da": "ড্যানিশ", @@ -32,6 +40,7 @@ "language-hi": "হিন্দি", "language-hr": "ক্রোয়েশিয়ান", "language-hu": "হাঙ্গেরিয়ান", + "language-hy-am": "Armenian", "language-id": "ইন্দোনেশিয়ান", "language-ig": "ইগবো", "language-it": "ইতালিয়ান", @@ -39,12 +48,14 @@ "language-ka": "জর্জিয়ান", "language-kk": "কাজাখ", "language-km": "খেমের", + "language-kn": "Kannada", "language-ko": "কোরিয়ান", "language-lt": "লিথুয়ানিয়ান", "language-ml": "মালয়ালম", "language-mr": "মারাঠী", "language-ms": "মালায়া", "language-nb": "নরওয়েজীয়", + "language-ne-np": "Nepali", "language-nl": "ডাচ", "language-pcm": "নাইজেরিয়ান পিজিন", "language-fil": "ফিলিপিনো", @@ -58,8 +69,9 @@ "language-sl": "স্লোভেনিয়ান", "language-sr": "সার্বিয়ান", "language-sw": "সোয়াহিলি", - "language-th": "থাই", "language-ta": "তামিল", + "language-th": "থাই", + "language-tk": "Turkmen", "language-tr": "তুর্কি", "language-uk": "ইউক্রেনিয়ান", "language-ur": "উর্দু", diff --git a/src/intl/bn/page-stablecoins.json b/src/intl/bn/page-stablecoins.json index e8ca59e78e0..d9f79463877 100644 --- a/src/intl/bn/page-stablecoins.json +++ b/src/intl/bn/page-stablecoins.json @@ -63,6 +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-dashboard-and-education": "ড্যাশবোর্ড এবং শিক্ষা", "page-stablecoins-coin-price-change": "কয়েনের মূল্য পরিবর্তন (গত 30 দিন)", "page-stablecoins-crypto-backed": "ক্রিপ্টো ব্যাকড", "page-stablecoins-crypto-backed-con-1": "ফিয়াট-ব্যাকড স্টেবলকয়েনের চেয়ে কম স্থিতিশীল।", diff --git a/src/intl/bs/common.json b/src/intl/bs/common.json index a787d68d0d8..49355ad2f9e 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", @@ -20,14 +30,17 @@ "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-applications-dapps": "Dapps - Decentralizovane aplikacije", "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", + "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,11 +135,103 @@ "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": "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", + "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", - "nft-page": "Nezamenljivi tokeni (NFT)", + "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", "on-this-page": "Na ovoj stranici", @@ -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": "Regenerative finance (ReFi)", - "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/bs/page-languages.json b/src/intl/bs/page-languages.json new file mode 100644 index 00000000000..cc36a54c600 --- /dev/null +++ b/src/intl/bs/page-languages.json @@ -0,0 +1,8 @@ +{ + "page-languages-filter-label": "Lista filtera", + "page-languages-filter-placeholder": "Upisati u filter", + "page-languages-browser-default": "Zadani preglednik", + "page-languages-translated": "prevedeno", + "page-languages-words": "riječi", + "page-languages-recruit-community": "Pomozite nam da prevedemo ethereum.org." +} diff --git a/src/intl/ca/common.json b/src/intl/ca/common.json index 75496a9eeb8..80b095fd654 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", @@ -20,14 +33,17 @@ "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-applications-dapps": "Dapps - Aplicacions descentralitzades", "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", + "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": "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é", + "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", - "nft-page": "Tokens no fungibles (NFT)", + "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": "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", "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/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/ca/page-languages.json b/src/intl/ca/page-languages.json index f93bfeb32d3..6d5db98b421 100644 --- a/src/intl/ca/page-languages.json +++ b/src/intl/ca/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Voleu veure ethereum.org en un idioma diferent?", "page-languages-want-more-link": "Programa de traducció", "page-languages-want-more-paragraph": "Els traductors d'ethereum.org sempre tradueixen pàgines a tants idiomes com sigui possible. Per veure en què treballen ara mateix o per registrar-vos i unir-vos a ells, llegiu sobre el nostre", - "page-languages-filter-placeholder": "Filtre", + "page-languages-filter-label": "Filtrar llista", + "page-languages-filter-placeholder": "Escriviu per a filtrar", + "page-languages-browser-default": "Navegador per defecte", + "page-languages-translated": "traduït", + "page-languages-words": "paraules", + "page-languages-recruit-community": "Ajudeu-nos a traduir ethereum.org.", + "langauge-am": "Amharic", "language-ar": "Àrab", "language-az": "Àzeri", + "langauge-be": "Bielorús", "language-bg": "Búlgar", "language-bn": "Bengalí", + "language-bs": "Bosnià", "language-ca": "Català", "language-cs": "Txec", "language-da": "Danès", @@ -27,9 +35,12 @@ "language-fi": "Finlandès", "language-fr": "Francès", "language-gl": "Gallec", + "language-gu": "Gujarati", + "language-he": "Hebreu", "language-hi": "Hindi", "language-hr": "Croata", "language-hu": "Hongarès", + "language-hy-am": "Armeni", "language-id": "Indonesi", "language-ig": "Igbo", "language-it": "Italià", @@ -37,13 +48,16 @@ "language-ka": "Georgià", "language-kk": "Kazakh", "language-km": "Khmer", + "language-kn": "Kanarès", "language-ko": "Coreà", "language-lt": "Lituà", "language-ml": "Malaiàlam", "language-mr": "Maratí", "language-ms": "Malai", "language-nb": "Noruec", + "language-ne-np": "Nepalès", "language-nl": "Holandès", + "language-pcm": "Pidgin nigerià", "language-fil": "Filipí", "language-pl": "Polonès", "language-pt": "Portuguès", @@ -55,9 +69,12 @@ "language-sl": "Eslovè", "language-sr": "Serbi", "language-sw": "Suahili", + "language-ta": "Tàmil", "language-th": "Tailandès", + "language-tk": "Turcmeni", "language-tr": "Turc", "language-uk": "Ucrainès", + "language-ur": "Urdú", "language-uz": "Uzbek", "language-vi": "Vietnamita", "language-zh": "Xinès simplificat", diff --git a/src/intl/ca/page-stablecoins.json b/src/intl/ca/page-stablecoins.json index c1f78282c1d..10f7fbe0488 100644 --- a/src/intl/ca/page-stablecoins.json +++ b/src/intl/ca/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/cs/common.json index 05c7449a8d0..7f1b875b9d4 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", @@ -15,6 +13,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", @@ -31,14 +32,15 @@ "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-applications-dapps": "Dapps - Decentralizované aplikace", "decentralized-identity": "Decentralizovaná identita", "decentralized-social-networks": "Decentralizované sociální sítě", "decentralized-science": "„Decentralizovaná věda“", - "defi-page": "Decentralizované finance (DeFi)", + "description": "Popis položky navigace", + "defi-page": "DeFi - Decentralizované finance", "design": "Design", "design-principles": "Principy designu", "devcon": "Devcon", @@ -96,14 +98,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 +145,120 @@ "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": "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", + "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í", - "nft-page": "Nezaměnitelné tokeny (NFT)", + "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-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,8 +269,10 @@ "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": "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", @@ -187,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": "Stablecoins", + "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í", @@ -211,11 +316,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/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/cs/page-languages.json b/src/intl/cs/page-languages.json index 9773f6caeb4..009f68a35e8 100644 --- a/src/intl/cs/page-languages.json +++ b/src/intl/cs/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Chcete prohlížet ethereum.org v jiném jazyce?", "page-languages-want-more-link": "Překladatelský program", "page-languages-want-more-paragraph": "Překladatelé ethereum.org vždy překládají stránky do co největšího počtu jazyků. Chcete-li zjistit, na čem právě pracují, nebo se přihlásit, abyste se k nim připojili, přečtěte si o našem", - "page-languages-filter-placeholder": "Filtrovat", + "page-languages-filter-label": "Filtrovat seznam", + "page-languages-filter-placeholder": "Zadejte text k filtrování", + "page-languages-browser-default": "Výchozí nastavení prohlížeče", + "page-languages-translated": "přeloženo", + "page-languages-words": "slova", + "page-languages-recruit-community": "Pomozte nám překládat ethereum.org.", + "langauge-am": "Amharština", "language-ar": "Arabština", "language-az": "Ázerbájdžánština", + "langauge-be": "Běloruština", "language-bg": "Bulharština", "language-bn": "Bengálština", + "language-bs": "Bosenština", "language-ca": "Katalánština", "language-cs": "Čeština", "language-da": "Dánština", @@ -32,6 +40,7 @@ "language-hi": "Hindština", "language-hr": "Chorvatština", "language-hu": "Maďarština", + "language-hy-am": "Arménština", "language-id": "Indonéština", "language-ig": "Igboština", "language-it": "Italština", @@ -39,12 +48,14 @@ "language-ka": "Gruzínština", "language-kk": "Kazaština", "language-km": "Khmérština", + "language-kn": "Kannadština", "language-ko": "Korejština", "language-lt": "Litevština", "language-ml": "Malajálamština", "language-mr": "Maráthština", "language-ms": "Malajština", "language-nb": "Norština", + "language-ne-np": "Nepálština", "language-nl": "Holandština", "language-pcm": "Nigerijský Pidžin", "language-fil": "Filipínština", @@ -58,8 +69,9 @@ "language-sl": "Slovinština", "language-sr": "Srbština", "language-sw": "Svahilština", - "language-th": "Thajština", "language-ta": "Tamilština", + "language-th": "Thajština", + "language-tk": "Turkmenština", "language-tr": "Turečtina", "language-uk": "Ukrajinština", "language-ur": "Urdština", diff --git a/src/intl/cs/page-stablecoins.json b/src/intl/cs/page-stablecoins.json index ac43cfc82fe..22956f72619 100644 --- a/src/intl/cs/page-stablecoins.json +++ b/src/intl/cs/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/da/common.json index 0c571dbde49..f416ffa7fde 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", @@ -20,14 +32,17 @@ "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-applications-dapps": "Dapps - Decentraliserede applikationer", "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", + "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,11 +141,106 @@ "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": "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", + "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", - "nft-page": "Ikke-ombyttelige tokens (NFT'er)", + "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", "on-this-page": "På denne side", @@ -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": "Regenerativ finansiering (ReFi)", - "run-a-node": "Kør en node", + "regenerative-finance": "ReFi - Regenerativ finansiering", + "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/da/page-languages.json b/src/intl/da/page-languages.json index 154d014566a..5a047ba5c32 100644 --- a/src/intl/da/page-languages.json +++ b/src/intl/da/page-languages.json @@ -1,8 +1,29 @@ { + "page-languages-h1": "Sprog Understøttelse", + "page-languages-interested": "Er du interesseret i at bidrage?", + "page-languages-learn-more": "Lær mere om vores Oversættelse Program", + "page-languages-meta-desc": "Ressourcer til alle understøttede sprog på ethereum.org og måder at blive involveret som oversætter.", + "page-languages-meta-title": "ethereum.org Sprog Oversættelser", + "page-languages-p1": "Ethereum er et globalt projekt, og det er afgørende, at ethereum.org er tilgængeligt for alle, uanset deres nationalitet eller sprog. Vores fællesskab har arbejdet hårdt på at gøre dette syn til virkelighed.", + "page-languages-translations-available": "ethereum.org er tilgængelig på de følgende sprog", + "page-languages-resources-paragraph": "Ud over at oversætte ethereum.org indhold, vedligeholder vi også en", + "page-languages-resources-link": "kurateret liste over Ethereum ressourcer på mange sprog", + "page-languages-want-more-header": "Vil du se ethereum.org på et andet sprog?", + "page-languages-want-more-link": "Oversættelsesprogram", + "page-languages-want-more-paragraph": "ethereum.org oversættere oversætter altid sider på så mange sprog som muligt. For at se, hvad de arbejder på lige nu, eller for at tilmelde sig for at deltage dem, læs om vores", + "page-languages-filter-label": "Filtrér liste", + "page-languages-filter-placeholder": "Skriv for at filtrere", + "page-languages-browser-default": "Browser-standard", + "page-languages-translated": "oversat", + "page-languages-words": "ord", + "page-languages-recruit-community": "Hjælp os med at oversætte ethereum.org.", + "langauge-am": "Amharic", "language-ar": "Arabisk", "language-az": "Aserbajdsjansk", + "langauge-be": "Belarusian", "language-bg": "Bulgarsk", "language-bn": "Bengalsk", + "language-bs": "Bosnian", "language-ca": "Catalansk", "language-cs": "Tjekkisk", "language-da": "Dansk", @@ -14,21 +35,30 @@ "language-fi": "Finsk", "language-fr": "Fransk", "language-gl": "Galicisk", + "language-gu": "Gujarati", + "language-he": "Hebrew", "language-hi": "Hindi", "language-hr": "Kroatisk", "language-hu": "Ungarsk", + "language-hy-am": "Armenian", "language-id": "Indonesisk", "language-ig": "Igbo", "language-it": "Italiensk", "language-ja": "Japansk", "language-ka": "Georgisk", + "language-kk": "Kazakh", + "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Koreansk", "language-lt": "Litauisk", "language-ml": "Malayalam", "language-mr": "Marathi", "language-ms": "Malaysisk", "language-nb": "Norsk", + "language-ne-np": "Nepali", "language-nl": "Hollandsk", + "language-pcm": "Nigeriansk Pidgin", + "language-fil": "Filipino", "language-pl": "Polsk", "language-pt": "Portugisisk", "language-pt-br": "Portugisisk (Brasilien)", @@ -39,9 +69,13 @@ "language-sl": "Slovenensk", "language-sr": "Serbisk", "language-sw": "Swahili", + "language-ta": "Tamil", "language-th": "Thailandsk", + "language-tk": "Turkmen", "language-tr": "Tyrkisk", "language-uk": "Ukrainsk", + "language-ur": "Urdu", + "language-uz": "Usbekisk", "language-vi": "Vietnamesisk", "language-zh": "Kinesisk, forenklet", "language-zh-tw": "Kinesisk, traditionelt" diff --git a/src/intl/da/page-stablecoins.json b/src/intl/da/page-stablecoins.json index 4b91f1e23d4..62408dfb92d 100644 --- a/src/intl/da/page-stablecoins.json +++ b/src/intl/da/page-stablecoins.json @@ -15,5 +15,5 @@ "makerdao-logo": "MakerDao-logo", "matcha-logo": "Matcha-logo", "oasis-logo": "Oasis-logo", - "uniswap-logo": "Uniswap logo" -} + "uniswap-logo": "Uniswap logo", + "page-stablecoins-category-dashboard-and-education": "Dashboard & Uddannelse"} diff --git a/src/intl/de/common.json b/src/intl/de/common.json index 6ae90fe50a2..fabfacf8351 100644 --- a/src/intl/de/common.json +++ b/src/intl/de/common.json @@ -1,17 +1,31 @@ { - "account-abstraction": "Kontoabstraktion", "about-ethereum-org": "Über ethereum.org", "about-us": "Über uns", + "adding-desci-projects": "Desci-Projekte hinzufügen", + "adding-developer-tools": "Entwicklertools werden hinzugefügt", + "adding-exchanges": "Börsen werden hinzugefügt", + "adding-glossary-terms": "Glossarbegriffe werden hinzugefügt", + "adding-layer-2s": "Layer 2s hinzufügen", + "adding-products": "Produkte hinzufügen", + "adding-staking-products": "Staking-Produkte werden hinzugefügt", + "adding-wallets": "Wallets werden hinzugefügt", + "account-abstraction": "Kontoabstraktion", + "acknowledgements": "Danksagungen", "aria-toggle-search-button": "Suchbutton umschalten", "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", "community-hub": "Community-Hub", "community-menu": "Community-Menü", "contact": "Kontakt", + "content-buckets": "Inhaltsbehälter", + "content-resources": "Inhaltsressourcen", "content-standardization": "Standardisierung der Inhalte", "contributing": "Mitwirken", "contributors": "Mitwirkende", @@ -20,14 +34,17 @@ "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-applications-dapps": "DApps - Dezentralisierte Anwendungen", "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", + "description": "Beschreibung für das Navigationselement", + "defi-page": "DeFi - Dezentrales Finanzwesen", + "design": "Design", + "design-principles": "Designprinzipien", "devcon": "Devcon", "developers": "Entwickler", "developers-home": "Entwicklerbasis", @@ -63,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", @@ -71,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?", @@ -83,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", @@ -94,11 +111,11 @@ "grants": "Zuschüsse", "grant-programs": "Ökosystem-Förderprogramme", "guides": "Leitfäden", - "guides-hub": "Leitfäden-Sammlung", + "guides-hub": "Anleitungen", "history-of-ethereum": "Die Geschichte von Ethereum", "home": "Startseite", "how-ethereum-works": "Wie Ethereum funktioniert", - "how-to-register-an-ethereum-account": "So \"registrieren\" Sie ein Ethereum-Konto", + "how-to-create-an-ethereum-account": "Wie man ein Ethereum-Konto „anlegt\"", "how-to-revoke-token-access": "So widerrufen Sie den Smart-Contract-Zugriff auf Ihre Krypto-Gelder", "how-to-swap-tokens": "So tauschen Sie Token", "how-to-use-a-bridge": "So übertragen Sie Token mit der Layer 2", @@ -128,11 +145,117 @@ "loading-error-try-again-later": "Laden von Daten nicht möglich. Bitte versuchen Sie es später erneut.", "logo": "Logo", "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": "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", + "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", - "nft-page": "Non-Fungible Token (NFTs)", + "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", "on-this-page": "Auf dieser Seite", @@ -140,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", @@ -150,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": "Regenerative Finanzen (ReFi)", - "run-a-node": "Einen Knoten betreiben", + "regenerative-finance": "ReFi - Regenerative Finanzen", + "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", @@ -164,6 +291,7 @@ "search-box-blank-state-text": "Suche!", "search-eth-address": "Sieht aus wie eine Ethereum-Adresse. Wir liefern keine Daten zu Adressen. Versuchen Sie es auf einem Block-Explorer wie", "search-no-results": "Keine Ergebnisse zu Ihrer Suche", + "security": "Sicherheit", "single-slot-finality": "Einzelplatzfinalität", "statelessness": "Zustandslosigkeit", "see-contributors": "Siehe Mitwirkende", @@ -181,6 +309,7 @@ "start-here": "Hier starten", "style-guide": "Styleguide", "solo": "Solo-Staking", + "support": "Support", "terms-of-use": "Nutzungsbedingungen", "translation-banner-body-new": "Sie sehen diese Seite auf Englisch, weil wir sie noch nicht übersetzt haben. Helfen Sie mit, die Inhalte zu übersetzen.", "translation-banner-body-update": "Es gibt eine neue Version dieser Seite, aber im Moment ist sie nur auf Englisch verfügbar. Helfen Sie mit, die neueste Version zu übersetzen.", @@ -191,11 +320,14 @@ "translation-banner-no-bugs-title": "Hier sind keine Fehler!", "translation-banner-no-bugs-content": "Diese Seite wird nicht übersetzt. Wir haben diese Seite bewusst vorerst auf Englisch belassen.", "translation-banner-no-bugs-dont-show-again": "Nicht erneut anzeigen", + "translation-program": "Übersetzungsprogramm", "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/de/learn-quizzes.json b/src/intl/de/learn-quizzes.json index d664712ff2d..46d7324fb5a 100644 --- a/src/intl/de/learn-quizzes.json +++ b/src/intl/de/learn-quizzes.json @@ -1,14 +1,33 @@ { + "add-quiz": "Frage/Quiz hinzufügen", + "average-score": "Durchschnittliche Punktzahl:", + "basics": "Ethereum-Grundlagen", + "basics-description": "In diesem Abschnitt werden die grundlegenden Konzepte von Ethereum behandelt. So können Sie sich ein solides Basiswissen aneignen.", + "completed": "Abgeschlossen:", + "community-stats": "Community-Statistiken", + "contribute": "Tragen Sie zu unserer Bibliothek bei.", "correct": "Richtig", "explanation": "Erläuterung", "next-question": "Nächste Frage", + "next-quiz": "Nächstes Quiz", + "page-assets-merge": "Die Zusammenführung", + "passed": "Sie haben das Quiz bestanden.", + "questions": "Fragen", + "questions-answered": "Beantwortete Fragen:", + "quizzes-subtitle": "Finden Sie heraus, wie gut Ihr Wissen über Ethereum und Kryptowährungen ist. Sind Sie bereit, ein Experte zu werden?", + "retry": "Wiederholte Versuche:", "score": "Punktzahl", "see-results": "Ergebnisse anzeigen", "share-results": "Ergebnisse teilen", - "submit-answer": "Antwort senden", - "test-your-knowledge": "Teste dein Wissen", - "total": "Total", + "start": "Start", + "submit-answer": "Antwort überprüfen", + "test-your-knowledge": "Testen Sie Ihr Ethereum-Wissen", "try-again": "Versuche es erneut", + "using-ethereum": "Ethereum verwenden", + "using-ethereum-description": "Tauchen Sie ein in die realen Anwendungen von Ethereum und entdecken Sie, wie diese revolutionäre Blockchain-Plattform Branchen umgestaltet. Das ist eine gute Möglichkeit, um sicherzustellen, dass Sie die Thematik gut genug verstehen, bevor Sie anfangen, Kryptowährungen aktiv zu nutzen.", + "want-more-quizzes": "Möchten Sie hier mehr Quiz sehen?", + "your-results": "Ihre Ergebnisse", + "your-total": "Ihre Gesamtpunktzahl", "a001-prompt": "Der größte Unterschied zwischen Ethereum und Bitcoin ist:", "a001-a-label": "Auf Ethereum kannst du keine Zahlungen an andere Personen schicken", "a001-a-explanation": "Sowohl mit Bitcoin als auch mit Ethereum kannst du Zahlungen an andere Personen schicken.", @@ -36,21 +55,21 @@ "a003-c-explanation": "Die Ethereum-Stiftung hat keine nennenswerte Rolle im Betrieb der Ethereum-Nodes.", "a003-d-label": "Jeder, der eine Node betreibt", "a003-d-explanation": "Wer eine Node betreibt, ist ein entscheidender Teil von Ethereums Infrastruktur. Überlege dir den Betrieb einer Ethereum-Node, wenn du hier noch nicht aktiv bist.", - "a004-prompt": "Wie oft ist das Netzwerk seit dem Start von Ethereum offline gegangen?", + "a004-prompt": "Wie oft war das Netzwerk seit dem Start von Ethereum offline?", "a004-a-label": "Nie", "a004-b-label": "Einmal", "a004-c-label": "Vier Mal", "a004-d-label": "Mehr als zehn Mal", - "a004-explanation": "Ethereum ist seit dem Start noch nie ganz offline gegangen.", + "a004-explanation": "Ethereum ist seit seiner Einführung noch nie vollständig offline gegangen (hat also nie aufgehört, Blöcke zu produzieren).", "a005-prompt": "Ethereum verbraucht mehr Strom als:", - "a005-a-label": "YouTube", - "a005-a-explanation": "YouTube verbraucht ca. 244 Terawatt pro Jahr. Ethereum verbraucht 0,01 Terawatt pro Jahr.", + "a005-a-label": "Goldabbau", + "a005-a-explanation": "Der Goldbergbau verbraucht ca. 131 Terawatt pro Jahr. Ethereum verbraucht etwa 0,0026 Terawattt pro Jahr.", "a005-b-label": "Netflix", - "a005-b-explanation": "Netflix verbraucht ca. 94 Terawatt pro Jahr. Ethereum verbraucht 0,01 Terawatt pro Jahr.", + "a005-b-explanation": "Netflix verbraucht ca. 0,451 Terawatt pro Jahr. Ethereum verbraucht 0,0026 Terawatt pro Jahr.", "a005-c-label": "PayPal", - "a005-c-explanation": "PayPal verbraucht ca. 0.26 Terawatt pro Jahr. Ethereum verbraucht 0,01 Terawatt pro Jahr.", + "a005-c-explanation": "PayPal verbraucht ca. 0,26 Terawatt pro Jahr. Ethereum verbraucht 0,0026 Terawatt pro Jahr.", "a005-d-label": "Keines der genannten", - "a005-d-explanation": "Ethereum verwendet 0,01 Terawatt pro Jahr. Weniger als YouTube (~244 TW), Netflix (~94 TW) und Paypal (~0,26 TW).", + "a005-d-explanation": "Ethereum verbraucht etwa 0,0026 Terawatt pro Jahr. Das ist weniger als Goldbergbau (~131 TWh/Jahr), Netflix (~0,451 TWh/Jahr) und Paypal (~0,26 TWh/Jahr).", "b001-prompt": "Ether ist auch bekannt als:", "b001-a-label": "ETC", "b001-a-explanation": "ETC ist das Kürzel für Ethereum Classic.", @@ -305,8 +324,5 @@ "h005-c-label": "Eth1", "h005-c-explanation": "Eth1 war der ursprüngliche Name für die Ausführungsebene, nicht die Konsensschicht.", "h005-d-label": "Staking", - "h005-d-explanation": "Staking bedeutet, dass ETH in einen intelligenten Vertrag eingezahlt wird, um die Sicherheit der Chain zu unterstützen.", - "page-assets-merge": "Die Zusammenführung", - "security": "Sicherheit", - "page-what-is-ethereum-what-is-ether": "Was ist Ether?" + "h005-d-explanation": "Staking bedeutet, dass ETH in einen intelligenten Vertrag eingezahlt wird, um die Sicherheit der Chain zu unterstützen." } 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/de/page-get-eth.json b/src/intl/de/page-get-eth.json index 864c18b4714..38923b2c954 100644 --- a/src/intl/de/page-get-eth.json +++ b/src/intl/de/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "Börsen sind Unternehmen, mit denen Sie Krypto mit traditionellen Währungen kaufen können. Sie verwahren das ETH, das Sie kaufen, bis Sie es zu einer Wallet senden, die Sie verwalten.", "page-get-eth-checkout-dapps-btn": "Schauen Sie sich dApps an", "page-get-eth-community-safety": "Community-Beiträge zur Sicherheit", - "page-get-eth-description": "Ethereum und ETH werden nicht von einer Regierung oder einem Unternehmen kontrolliert – sie sind dezentralisiert. Das heißt, dass ETH für jeden frei zugänglich ist.", + "page-get-eth-description": "Ethereum wird nicht von einer einzelnen Organisation kontrolliert – es ist dezentralisiert.", "page-get-eth-dex": "Dezentralisierte Börsen (DEX)", - "page-get-eth-dex-desc": "Wenn Sie mehr Kontrolle haben möchten, dann kaufen Sie ETH peer-to-peer. Mit einem DEX können Sie handeln, ohne die Kontrolle über Ihre Gelder an ein zentralisiertes Unternehmen abzugeben.", + "page-get-eth-dex-desc": "Für mehr Kontrolle können Sie ETH mithilfe von Smart Contracts erwerben. Auf einer dezentralisierten Börse (DEX) können Sie digitale Assets handeln, ohne jemals die Kontrolle über Ihre Mittel an ein zentralisiertes Unternehmen abzutreten.", + "page-get-eth-peers": "Erhalten Sie ETH von Ihrem Bekanntenkreis (Peer-to-peer)", + "page-get-eth-peers-desc": "Sobald Sie ein Ethereum-Konto haben, müssen Sie lediglich Ihre Adresse teilen, um das Senden und Empfangen von ETH (und anderen Tokens) mittels Peer-to-Peer-Transfer zu starten.", + "page-get-eth-staking": "Staking-Belohnungen", + "page-get-eth-staking-desc": "Wenn Sie bereits einige ETH besitzen, können Sie mehr verdienen, indem Sie einen Validator-Node betreiben. Für diese Verifizierungsarbeit werden Sie in ETH entlohnt.", + "page-get-eth-earn": "ETH verdienen", + "page-get-eth-earn-desc": "Sie können ETH verdienen, indem Sie für DAOs (Dezentralisierte Autonome Organisationen) oder Unternehmen arbeiten, die in Krypto bezahlen, Bountys gewinnen, Softwarefehler finden und mehr.", + "page-get-eth-daos-link-desc": "Mehr über DAOs", + "page-get-eth-cex-link-desc": "Hier eine Liste von Börsen", + "page-get-eth-staking-link-desc": "Mehr über Staking erfahren", "page-get-eth-dexs": "Dezentralisierte Börsen (DEX)", "page-get-eth-dexs-desc": "Dezentralisierte Börsen sind offene Marktplätze für ETH und andere Token. Sie verbinden Käufer und Verkäufer direkt.", "page-get-eth-dexs-desc-2": "Anstatt einen vertrauenswürdigen Dritten zu verwenden, um Geld bei der Transaktion zu schützen, verwenden sie Code. Das ETH des Verkäufers wird erst überwiesen, wenn die Zahlung garantiert ist. Diese Art von Code wird als Smart Contract bezeichnet.", - "page-get-eth-dexs-desc-3": "Das bedeutet, dass es weniger geografische Beschränkungen gibt als bei zentralisierten Alternativen. Wenn jemand verkauft, was Sie wollen, und eine Zahlungsmethode akzeptiert, die Sie liefern können, sind Sie startklar. DEXs ermöglichen es Ihnen, ETH mit anderen Token, PayPal oder sogar persönlichen Geldlieferungen zu kaufen.", + "page-get-eth-dexs-desc-3": "Das heißt, es gibt weniger geographische Einschränkungen als bei zentralisierten Alternativen. Wenn jemand das anbietet, was Sie suchen, und eine Zahlungsmethode akzeptiert, die Sie nutzen können, steht Ihrem Kauf nichts im Wege.", "page-get-eth-do-not-copy": "Beispiel: Nicht kopieren", "page-get-eth-exchanges-disclaimer": "Wir haben diese Informationen manuell zusammengestellt. Wenn Ihnen Fehler auffallen, teilen Sie es uns über folgende E-Mail-Adresse mit: ", - "page-get-eth-exchanges-empty-state-text": "Geben Sie Ihr Wohnsitzland an, um eine Liste von Wallets und Börsen zu sehen, die Sie zum Kauf von ETH benutzen können", + "page-get-eth-exchanges-empty-state-text": "Geben Sie Ihr Wohnland ein, um eine Liste von Börsen zu sehen, die Sie möglicherweise nutzen können", "page-get-eth-exchanges-except": "Außer", "page-get-eth-exchanges-header": "In welchem Land leben Sie?", "page-get-eth-exchanges-header-exchanges": "Börsen", "page-get-eth-exchanges-header-wallets": "Wallets", - "page-get-eth-exchanges-intro": "Börsen und Wallets haben Beschränkungen dafür, wo sie Krypto verkaufen können.", + "page-get-eth-exchanges-intro": "Börsen unterliegen Einschränkungen, wo sie Krypto verkaufen können. Dies ist eine indikative Liste von Diensten, von denen angenommen wird, dass sie in jedem Land tätig sind. Die Aufnahme hier stellt keine Empfehlung dar – Sie sollten Ihre eigenen Recherchen durchführen!", "page-get-eth-exchanges-no-exchanges": "Leider kennen wir keine Börsen, bei denen Sie ETH in diesem Land kaufen können. Wenn Sie eine kennen, schreiben Sie uns eine E-Mail an ", - "page-get-eth-exchanges-no-exchanges-or-wallets": "Leider kennen wir keine Börsen oder Wallets, bei denen Sie ETH in diesem Land kaufen können. Wenn Sie eine kennen, schreiben Sie uns eine E-Mail an ", + "page-get-eth-exchanges-no-exchanges-or-wallets": "Leider kennen wir keine Börsen, bei denen Sie ETH in diesem Land kaufen können. Wenn Sie eine kennen, schreiben Sie uns eine E-Mail an ", "page-get-eth-exchanges-no-wallets": "Leider kennen wir keine Wallets, mit denen Sie ETH in diesem Land kaufen können. Wenn Sie eine kennen, schreiben Sie uns eine E-Mail an ", "page-get-eth-exchanges-search": "Schreiben Sie, wo Sie leben...", "page-get-eth-exchanges-success-exchange": "Aufgrund ihrer rechtlichen Kontrollen kann es einige Tage dauern, um sich bei einer Börse zu registrieren.", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "Erhalten Sie ETH Hero Image", "page-get-eth-keep-it-safe": "Schützen Sie Ihr ETH", "page-get-eth-meta-description": "Wie Sie ETH basierend auf Ihrem Wohnort kaufen können und Empfehlungen, wie Sie sich darum kümmern.", - "page-get-eth-meta-title": "So kauft man ETH", + "page-get-eth-meta-title": "Wie Sie ETH bekommen", "page-get-eth-need-wallet": "Sie brauchen eine Wallet, um eine DEX verwenden zu können.", "page-get-eth-new-to-eth": "Neu bei ETH? Hier ist eine Übersicht, um loszulegen.", "page-get-eth-other-cryptos": "Kaufen Sie mit anderen Kryptowährungen", - "page-get-eth-protect-eth-desc": "Wenn Sie sehr viel ETH kaufen wollen, möchten Sie sie vielleicht in einer Wallet, die Sie kontrollieren, aufbewahren, nicht an einer Börse. Das liegt daran, dass Börsen ein wahrscheinliches Ziel für Hacker sind. Wenn ein Hacker Zugang erhält, könnten Sie Ihr Guthaben verlieren. Alternativ haben nur Sie die Kontrolle über Ihre Wallet.", - "page-get-eth-protect-eth-in-wallet": "Schützen Sie Ihr ETH in einer Wallet", + "page-get-eth-protect-eth-desc": "Eine der Hauptfunktionen von Ethereum ist, dass Sie durch die Verwaltung Ihres eigenen Kontos die Kontrolle über Ihre eigenen Vermögenswerte behalten. Das bedeutet, dass Sie keiner Drittpartei vertrauen müssen, und Sie sind geschützt vor einem Verwahrer, der unehrlich handelt, Insolvenz anmeldet oder gehackt wird. Allerdings bedeutet das auch, dass Sie die Verantwortung für Ihre eigene Sicherheit übernehmen.", + "page-get-eth-protect-eth-in-wallet": "Bewahren Sie Ihre ETH in Ihrer eigenen Wallet auf", "page-get-eth-search-by-country": "Nach Land suchen", - "page-get-eth-security": "Aber das bedeutet auch, dass Sie die Sicherheit Ihres Guthabens ernst nehmen müssen. Mit ETH vertrauen Sie nicht einer Bank, dass sie auf Ihr Geld aufpasst, sondern Sie vertrauen sich selbst.", + "page-get-eth-security": "Das bedeutet, dass Sie die Sicherheit Ihrer Geldmittel ernst nehmen müssen. Bei ETH verlassen Sie sich nicht auf eine Bank oder ein Unternehmen zur Aufbewahrung Ihrer Vermögenswerte, sondern übernehmen diese Verantwortung selbst.", "page-get-eth-smart-contract-link": "Mehr zu Smart Contracts", "page-get-eth-swapping": "Tauschen Sie Ihre Token gegen ETH anderer Leute und umgekehrt.", "page-get-eth-try-dex": "Testen Sie eine DEX", "page-get-eth-use-your-eth": "Nutzen Sie Ihr ETH", "page-get-eth-use-your-eth-dapps": "Jetzt, da Sie eine Wallet haben, schauen Sie sich doch ein paar Ethereum-Anwendungen (dApps) an. Es gibt dApps für Finanzen, soziale Medien, Gaming und viele andere Kategorien.", "page-get-eth-wallet-instructions": "Folgen Sie der Wallet-Anleitung", - "page-get-eth-wallet-instructions-lost": "Wenn Sie den Zugriff auf Ihre Wallet verlieren, verlieren Sie den Zugriff zu Ihrem Guthaben. Ihre Wallet sollte Ihnen Anweisungen geben, wie Sie sich davor schützen können. Beachten Sie diese sorgfältig – in den meisten Fällen kann Ihnen niemand helfen, wenn Sie den Zugriff zu Ihrer Wallet verlieren.", + "page-get-eth-wallet-instructions-lost": "Wenn Sie den Zugang zu Ihrem Konto verlieren, verlieren Sie auch den Zugang zu Ihren Geldmitteln. Ihre Wallet sollte Ihnen Anweisungen zum Schutz vor einem solchen Fall geben. Befolgen Sie diese sorgfältig – in den meisten Fällen kann Ihnen niemand helfen, wenn Sie den Zugang zu Ihrem Konto verlieren.", "page-get-eth-wallets": "Wallets", "page-get-eth-wallets-link": "Mehr zu Wallets", "page-get-eth-wallets-purchasing": "Einige Wallets ermöglichen Ihnen den Kauf von Krypto mit einer Debit-/Kreditkarte, Banküberweisung oder sogar Apple Pay. Es gelten geografische Einschränkungen.", - "page-get-eth-warning": "Diese DEXs sind nicht für Anfänger gedacht, da Sie etwas ETH benötigen, um sie zu nutzen.", + "page-get-eth-warning": "Diese DEXs sind nichts für Anfänger, da Sie einige ETH benötigen, um sie zu nutzen. Dies sind nur Beispiele, keine empfohlenen Produkte. Führen Sie Ihre eigenen Recherchen durch!", "page-get-eth-what-are-DEX's": "Was sind DEX?", "page-get-eth-whats-eth-link": "Was ist ETH?", - "page-get-eth-where-to-buy-desc": "Sie können ETH von Börsen oder Wallets direkt kaufen.", + "page-get-eth-where-to-buy-desc": "Sie können ETH entweder durch Arbeit verdienen, von Freunden erhalten oder auf Börsen und in Apps kaufen.", "page-get-eth-where-to-buy-desc-2": "Überprüfen Sie, welche Dienste Sie nutzen können, je nachdem, wo Sie wohnen.", - "page-get-eth-where-to-buy-title": "Wo man ETH kaufen kann", + "page-get-eth-where-to-buy-title": "Wo man ETH bekommt", "page-get-eth-your-address": "Ihre ETH-Adresse", "page-get-eth-your-address-desc": "Wenn Sie eine Wallet herunterladen, wird sie eine öffentliche ETH-Adresse für Sie erstellen. So sieht sie aus:", "page-get-eth-your-address-desc-3": "Stellen Sie es sich wie Ihre E-Mail-Adresse vor, aber anstatt E-Mails kann man ETH empfangen. Wenn Sie ETH von einer Börse zu Ihrer Wallet überweisen wollen, benutzen Sie Ihre Adresse als Ziel. Überprüfen Sie Ihre Angaben vor dem Abschicken immer zweimal!", diff --git a/src/intl/de/page-languages.json b/src/intl/de/page-languages.json index c9d016f1444..0e187b33a45 100644 --- a/src/intl/de/page-languages.json +++ b/src/intl/de/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Sie möchten ethereum.org in einer anderen Sprache sehen?", "page-languages-want-more-link": "Übersetzungsprogramm", "page-languages-want-more-paragraph": "Übersetzer von ethereum.org sind immer dabei, Seiten in so viele Sprachen wie möglich zu übersetzen. Um zu sehen, woran sie gerade arbeiten oder um Sie anzumelden, um mitzumachen, informieren Sie sich über unser", - "page-languages-filter-placeholder": "Filter", + "page-languages-filter-label": "Filterliste", + "page-languages-filter-placeholder": "Schreiben, um zu filtern", + "page-languages-browser-default": "Browserstandard", + "page-languages-translated": "übersetzt", + "page-languages-words": "Wörter", + "page-languages-recruit-community": "Hilf uns bei der Übersetzung von ethereum.org.", + "langauge-am": "Amharisch", "language-ar": "Arabisch", "language-az": "Aserbaidschanisch", + "langauge-be": "Belarussisch", "language-bg": "Bulgarisch", "language-bn": "Bengalisch", + "language-bs": "Bosnisch", "language-ca": "Katalanisch", "language-cs": "Tschechisch", "language-da": "Dänisch", @@ -32,6 +40,7 @@ "language-hi": "Hindi", "language-hr": "Kroatisch", "language-hu": "Ungarisch", + "language-hy-am": "Armenisch", "language-id": "Indonesisch", "language-ig": "Igbo", "language-it": "Italienisch", @@ -39,12 +48,14 @@ "language-ka": "Georgisch", "language-kk": "Kasachisch", "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Koreanisch", "language-lt": "Litauisch", "language-ml": "Malayalam", "language-mr": "Marathi", "language-ms": "Malaiisch", "language-nb": "Norwegisch", + "language-ne-np": "Nepalesisch", "language-nl": "Niederländisch", "language-pcm": "Nigerianisches Pidgin", "language-fil": "Filipino", @@ -58,8 +69,9 @@ "language-sl": "Slowenisch", "language-sr": "Serbisch", "language-sw": "Suaheli", - "language-th": "Thai", "language-ta": "Tamil", + "language-th": "Thai", + "language-tk": "Turkmenisch", "language-tr": "Türkisch", "language-uk": "Ukrainisch", "language-ur": "Urdu", diff --git a/src/intl/de/page-layer-2.json b/src/intl/de/page-layer-2.json index d7b5fc3b8de..7f607733604 100644 --- a/src/intl/de/page-layer-2.json +++ b/src/intl/de/page-layer-2.json @@ -123,6 +123,7 @@ "zksync-description": "zkSync ist eine nutzerzentrierte ZK-Rollup-Plattform von Matter Labs. Diese Skalierungslösung für Ethereum ist im Mainnet von Ethereum bereits freigeschaltet. Sie unterstützt Zahlungen, den Tausch von Token und das Prägen von NFTs.", "zkspace-description": "Die ZKSpace Plattform besteht aus drei Hauptkomponenten: einem Ebene 2 AMM DEX mit ZK-Rollup-Technologie namens ZKSwap, einem Zahlungsservice namens ZKSquare und einem NFT-Marktplatz namens ZKSea.", "aztec-description": "Das Aztec-Netzwerk ist das erste private ZK-Rollup auf Ethereum, das dezentralen Anwendungen Zugang zur Privatsphäre und Skalierung ermöglicht.", + "starknet-description": "Starknet ist ein Validity Rollup Layer 2. Es bietet eine hohe Durchsatzrate, niedrige Gasgebühren und behält das Sicherheitsniveau von Ethereum Layer 1 bei.", "layer-2-note": "Hinweis:", "layer-2-ecosystem-portal": "Portal für das Ökosystem", "layer-2-token-lists": "Token-Listen", diff --git a/src/intl/de/page-learn.json b/src/intl/de/page-learn.json index aad46654187..b6bca459b9b 100644 --- a/src/intl/de/page-learn.json +++ b/src/intl/de/page-learn.json @@ -1,37 +1,37 @@ { "toc-learn-hub": "Lernhub", - "toc-what-is-crypto-ethereum": "Was ist Krypto und Ethereum?", - "toc-how-do-i-use-ethereum": "Wie verwende ich Ethereum?", + "toc-what-is-crypto-ethereum": "Was ist Ethereum?", + "toc-how-do-i-use-ethereum": "Wie nutze ich Ethereum?", "toc-what-is-ethereum-used-for": "Wofür wird Ethereum verwendet?", "toc-strengthen-the-ethereum-network": "Stärkung des Ethereum-Netzwerks", - "toc-learn-about-the-ethereum-protocol": "Erfahren Sie mehr über das Ethereum-Protokoll", - "toc-learn-about-the-ethereum-community": "Erfahren Sie mehr über die Ethereum-Community", + "toc-learn-about-the-ethereum-protocol": "Mehr über das Ethereum-Protokoll erfahren", + "toc-learn-about-the-ethereum-community": "Mehr über die Ethereum-Community erfahren", "toc-books-and-podcasts": "Bücher und Podcasts", - "hero-header": "Lerne mehr über Ethereum", + "hero-header": "Mehr über Ethereum erfahren", "hero-subtitle": "Ihr Bildungshandbuch zur Welt von Ethereum. Hier können Sie erfahren, wie Ethereum funktioniert und wie Sie eine Verbindung dazu herstellen. Auf dieser Seite finden Sie sowohl technische als auch nicht-technische Artikel, Anleitungen und Ressourcen.", "hero-button-lets-get-started": "Los geht's", - "what-is-crypto-1": "Sie haben vielleicht bereits von Kryptowährungen, Bitcoin und Blockchain gehört. Diese Seite wird Ihnen helfen zu verstehen, um was es sich dabei handelt und wie Ethereum damit zusammenhängt.", - "what-is-crypto-link-1": "Und was ist Ethereum überhaupt?", - "what-is-crypto-2": "Bitcoin ermöglicht jedem Geld weltweit zu überweisen. Ethereum ermöglicht und ebenfalls jedem, jede vorstellbare Art von Vertrag zu erstellen und zu vereinbaren. Es ist widerstandsfähig und flexibel: Jedes Computerprogramm kann auf Ethereum laufen.", + "what-is-crypto-1": "Sie haben vielleicht bereits von Kryptowährungen, Bitcoin und Blockchain gehört. Über die Links unten gelangen Sie zu Informationen, um mehr darüber zu erfahren, worum es sich konkret handelt und wie Ethereum damit zusammenhängt.", + "what-is-crypto-2": "Kryptowährungen wie Bitcoin ermöglichen es jeder Person, weltweit Geld zu überweisen. Ethereum kann das auch, aber es kann auch einen Code ausführen, mithilfe dessen sich Apps und Organisationen kreieren lassen. Es ist sowohl widerstandsfähig als auch flexibel: Jedes Computerprogramm kann auf Ethereum laufen. Erfahren Sie mehr und finden Sie heraus, wie Sie anfangen können:", "what-is-ethereum-card-title": "Was ist Ethereum?", "what-is-ethereum-card-description": "Wenn Sie neu sind, starten Sie hier um zu lernen, weshalb Ethereum eine wichtige Rolle spielt.", "what-is-ethereum-card-image-alt": "Abbildung einer Person, die in einen Basar hineinblickt, der Ethereum repräsentiert.", "what-is-eth-card-title": "Was ist ETH?", "what-is-eth-description": "Ether (ETH) ist die Währung, die das Netzwerk und die Apps von Ethereum antreibt.", - "where-can-i-get-eth-card-title": "Wo bekomme ich ETH?", - "where-can-i-get-eth-card-description": "Je nach Standort gibt es viele Möglichkeiten, ETH zu bekommen.", + "what-is-web3-card-title": "Was ist Web3?", + "what-is-web3-card-description": "Web3 ist ein Modell für das Internet, das das Eigentum an Ihrem Vermögen und Ihrer Identität sicherstellt.", "additional-reading-more-on-ethereum-basics": "Mehr zu den Grundlagen von Ethereum", + "guides-hub-desc": "Leitfäden: Schritt-für-Schritt-Anleitungen zur Nutzung von Ethereum", + "quiz-hub-desc": "Quiz-Hub: Testen Sie Ihr Wissen", "additional-reading-what-are-smart-contracts": "Was sind Smart Contracts?", - "additional-reading-a-developers-intro": "Eine Einführung in Ethereum für Entwickler", "additional-reading-what-is-web3": "Was ist web3?", - "additional-reading-value": "Was ist Wert?", - "additional-reading-decentralize-everything": "Alles dezentralisieren", - "how-do-i-use-ethereum-1": "Die Nutzung von Ethereum ist wie ein Umzug an einen neuen Ort. Anfangs wird alles ungewohnt erscheinen, und jeder zieht aus seinen eigenen Gründen um. Trotzdem benötigen Sie zuerst neue Schlüssel. Die Software, die die Schlüssel für Ihr neues Zuhause erstellt und verwahrt, wird „Wallet\" genannt.", + "additional-reading-ethereum-in-thirty-minutes": "Ethereum in 30 Minuten von Vitalik Buterin", + "additional-reading-get-eth": "Erfahren Sie, wie Sie ETH bekommen können", + "how-do-i-use-ethereum-1": "Ethereum kann ganz nach den eigenen Zielen und Vorstellungen für vieles genutzt werden. Vielleicht möchten Sie sich bei einer App anmelden, Ihre Online-Identität nachweisen oder etwas ETH überweisen. Als Erstes benötigen Sie ein Konto. Der einfachste Weg, ein Konto zu erstellen und darauf zuzugreifen, geht über eine Software, die Wallet genannt wird.", "what-is-a-wallet-card-title": "Was ist eine Wallet?", - "what-is-a-wallet-card-description": "Wallets sind wie Schlüsselbunde: Sie speichern, was Sie benötigen, um Zugang zu den Orten zu erhalten, die Sie schätzen.", + "what-is-a-wallet-card-description": "Digitale Geldbörsen sind wie echte Geldbörsen: Sie speichern, was Sie brauchen, um Ihre Identität nachzuweisen und Zugang zu den Orten zu erhalten, die Ihnen wichting sind.", "what-is-a-wallet-card-alt": "Illustration eines Roboters.", "find-a-wallet-card-title": "Finden Sie eine Wallet", - "find-a-wallet-card-description": "Wir werden Ihnen helfen, die beste Wallet basierend auf den Funktionen zu finden, die für Sie wichtig sind.", + "find-a-wallet-card-description": "Durchsuchen Sie die Geldbörsen nach den für Sie wichtigen Funktionen.", "find-a-wallet-button": "Liste der Wallets", "crypto-security-basics-card-title": "Grundlagen zur Sicherheit", "crypto-security-basics-card-description": "Lernen Sie, wie Sie Betrugsversuche erkennen und die häufigsten Tricks vermeiden können.", @@ -41,9 +41,8 @@ "things-to-consider-banner-2": "Gebühren können hoch sein, abhängig von der Anzahl der Personen, die Ethereum nutzen möchten, daher empfehlen wir die Verwendung von", "things-to-consider-banner-layer-2": "Layer 2", "additional-reading-more-on-using-ethereum": "Mehr zur Verwendung von Ethereum", - "additional-reading-how-to-create-an-ethereum-account": "So \"registrieren\" Sie ein Ethereum-Konto", + "additional-reading-how-to-create-an-ethereum-account": "So erstellen Sie ein Ethereum-Konto", "additional-reading-how-to-use-a-wallet": "So verwenden Sie eine Wallet", - "additional-reading-support-for-ethereum-and-wallets": "Unterstützung für Ethereum und Wallets", "additional-reading-layer-2": "Layer 2: Senkung der Transaktionsgebühren", "what-is-ethereum-used-for-1": "Durch Ethereum wurden neue Produkte und Dienstleistungen geschaffen, die verschiedene Bereiche unseres Lebens verbessern können. Wir befinden uns noch in den frühen Phasen, aber es gibt viele spannende Entwicklungen, auf die man sich freuen kann.", "defi-card-title": "Dezentrale Finanzen (DeFi)", @@ -86,13 +85,10 @@ "ethereum-whitepaper-card-button": "Lesen Sie das Whitepaper", "more-on-ethereum-protocol-title": "Mehr zum Ethereum-Protokoll", "more-on-ethereum-protocol-ethereum-for-developers": "Ethereum für Entwickler", - "more-on-ethereum-protocol-eips": "Ethereum Verbesserungsvorschläge (EIP)", - "more-on-ethereum-protocol-history": "Geschichte von Ethereum", - "more-on-ethereum-protocol-governance": "Steuerung", - "more-on-ethereum-protocol-bridges": "Brücken", - "more-on-ethereum-protocol-kernel": "Kernel", - "more-on-ethereum-protocol-week-in-ethereum": "Wöchentliche News-Protokolle in Ethereum ", - "ethereum-community-description": "Der Erfolg von Ethereum ist auf seine unglaublich engagierte Gemeinschaft zurückzuführen. Tausende inspirierende und zielstrebige Menschen helfen dabei, die Vision von Ethereum voranzutreiben. Kommen Sie und schließen Sie sich uns an!", + "more-on-ethereum-protocol-consensus": "Ethereums Proof-of-Stake-basierter Konsensmechanismus.", + "more-on-ethereum-protocol-evm": "Ethereums integrierter Computer (Die EVM)", + "more-on-ethereum-protocol-nodes-and-clients": "Ethereums Knoten und Clients", + "ethereum-community-description": "Der Erfolg von Ethereum ist der unglaublich engagierten Community zu verdanken. Tausende von inspirierenden und engagierten Menschen tragen dazu bei, die Vision von Ethereum voranzutreiben, und sorgen gleichzeitig für die Sicherheit des Netzwerks durch Staking und Governance. Schließen Sie sich uns an und seien Sie dabei.", "community-hub-card-title": "Community Hub", "community-hub-card-description": "Unsere Gemeinschaft umfasst Menschen mit unterschiedlichem Hintergrund.", "community-hub-card-alt": "Illustration einer Gruppe zusammenarbeitender Konstrukteure.", @@ -102,7 +98,7 @@ "online-communities-card-title": "Online-Gemeinschaften", "online-communities-card-description": "Online-Gemeinschaften bieten eine großartige Gelegenheit, um spezifische Fragen zu stellen oder sich zu beteiligen.", "online-communities-card-button": "Erkunden Sie die Gemeinschaften", - "books-about-ethereum": "Bücher über Ethereum und Kryptowährungen", + "books-about-ethereum": "Bücher über Ethereum", "proof-of-stake-title": "Proof of Stake", "proof-of-stake-description": "13. September 2022 - Vitalik Buterin, Nathan Schneider", "cryptopians-title": "Die Kryptopianer", @@ -111,29 +107,17 @@ "out-of-the-ether-description": "29. September 2020 - Matthew Leising", "the-infinite-machine-title": "Die unendliche Maschine", "the-infinite-machine-description": "14. Juli 2020 - Camila Russo", - "the-age-of-cryptocurrency-title": "Das Zeitalter der Kryptowährung", - "the-age-of-cryptocurrency-description": "12. Januar 2016 - Paul Vigna, Michael J. Casey", - "the-truth-machine-title": "Die Wahrheitsmaschine", - "the-truth-machine-description": "27. Februar 2018 - Paul Vigna, Michael J. Casey", - "digital-gold-title": "Digitales Gold", - "digital-gold-description": "24. Mai 2021 - Nathaniel Popper", - "kings-of-crypto-title": "Könige von Krypto", - "kings-of-crypto-description": "15. Dezember 2020 - Jeff John Roberts", "mastering-ethereum-title": "Ethereum meistern", "mastering-ethereum-description": "23. Dezember 2018 – Andreas M. Antonopoulos, Gavin Wood Ph.D.", - "podcasts-about-ethereum": "Podcasts über Ethereum und Kryptowährungen", + "podcasts-about-ethereum": "Podcasts über Ethereum", "bankless-title": "Banklos", "bankless-description": "Ein Leitfaden für Krypto-Finanzen", - "uncommon-core-title": "Ungewöhnlicher Kern", - "uncommon-core-description": "Dieser Inhalt erkundet die transformative Natur von vertrauensminimierten Währungen und Finanzdienstleistungen", "zeroknowledge-title": "Keinerlei Einsicht", "zeroknowledge-description": "Taucht tief ein in die Technologie, die das entstehende dezentrale Web antreiben wird, und die Gemeinschaft, die daran arbeitet", - "epicenter-title": "Epizentrum", - "epicenter-description": "Dieses Thema erforscht die technischen, wirtschaftlichen und sozialen Auswirkungen der Kryptowährungsbranche", + "green-pill-title": "Green Pill", + "green-pill-description": "Erläutert die kryptoökonomischen Systeme, die positive externe Effekte für die Welt schaffen", "unchained-title": "Entkoppelt", "unchained-description": "Taucht tief ein in die Menschen, die das dezentralisierte Internet aufbauen, die Details dieser Technologie, die unsere Zukunft unterstützen könnte, und einige der kniffligsten Themen in der Kryptowelt wie Regulierung, Sicherheit und Privatsphäre", - "into-the-bytecode-title": "Im Bytecode", - "into-the-bytecode-description": "Ein Podcast über die Ideen, die Krypto prägen", "the-daily-gwei-title": "Der tägliche Gwei", "the-daily-gwei-description": "Zusammenfassungen, Updates und Analysen zu Ethereum-Nachrichten" } diff --git a/src/intl/de/page-stablecoins.json b/src/intl/de/page-stablecoins.json index f70eee88d8d..da74f5156d2 100644 --- a/src/intl/de/page-stablecoins.json +++ b/src/intl/de/page-stablecoins.json @@ -63,6 +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-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/de/page-upgrades-index.json b/src/intl/de/page-upgrades-index.json index f50da0de1ca..46a2eb897f9 100644 --- a/src/intl/de/page-upgrades-index.json +++ b/src/intl/de/page-upgrades-index.json @@ -8,9 +8,9 @@ "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": "Die Beacon Chain wurde als Werkzeug bei der Zusammenführung des Ethereum Hauptnetzes verwendet.", - "page-upgrades-answer-2": "Mit der Zusammenführung hatte Ethereum sein umfangreichstes Upgrade, das je den Proof-of-Work-Prozess gegen eine neue Proof-of-Stake basierte Konsensschicht austauschte.", - "page-upgrades-answer-4": "Die Beacon Chain wurde verwendet, um den auf dem Spiel beruhenden Konsens zu entwickeln, den Ethereum heute verwendet. Es wurde separat an Ethereum Mainnet ausgeführt, so dass Entwickler den Konsensmechanismus isoliert beobachten konnten, bevor sie es zur Koordinierung realer Aktivitäten verwenden.", + "page-upgrades-answer-1": "Die Beacon Chain wurde als Werkzeug für das Ethereum Mainnet-Upgrade bei der Zusammenführung verwendet.", + "page-upgrades-answer-2": "Durch die Zusammenführung hat Ethereum sein bisher umfangreichstes Upgrade erhalten – dabei wurde die Proof-of-Work-basierte Konsensebene gegen eine neue Proof-of-Stake-basierte Ebene ausgetauscht.", + "page-upgrades-answer-4": "Die Beacon Chain wurde verwendet, um den Proof-of-Stake-Konsens zu entwickeln, den Ethereum heute nutzt. Die Ausführung durchlief separat das Ethereum Mainnet, so dass Entwickler den Konsensmechanismus isoliert beobachten konnten, bevor er zur Koordinierung realer Aktivitäten verwendet wurde.", "page-upgrade-article-author-status": "Status", "page-upgrade-article-author-ethmerge": "Ethmerge", "page-upgrade-article-author-alchemy": "Alchemy", @@ -21,83 +21,83 @@ "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: Die Beacon Chain", - "page-upgrade-article-title-beacon-chain-explainer": "Die Beacon Chain – Ethereum 2.0-Erklärung, die Sie zu Beginn lesen sollten", + "page-upgrade-article-title-beacon-chain-explainer": "Die Erläuterung zu Beacon Chain Ethereum 2.0, die Sie zu Beginn lesen sollten", "page-upgrade-article-title-sharding-consensus": "Sharding-Konsens", "page-upgrade-article-title-sharding-is-great": "Warum Sharding großartig ist: Entmystifizierung der technischen Eigenschaften", "page-upgrade-article-title-rollup-roadmap": "Eine Rollup-zentrierte Roadmap", "page-upgrade-article-title-hitchhikers-guide-to-ethereum": "The Hitchhikers Guide To Ethereum", "page-upgrade-article-title-eip-4844": "EIP-4844: Shard Blob-Transaktionen (Proto-Danksharding)", - "page-upgrade-article-title-proto-danksharding-faq": "Proto-Danksharding FAQ", - "page-upgrade-article-title-sharding-das": "Eine Erklärung zur Freigabe und Datenverfügbarkeitsprobenahme (DAS)", + "page-upgrade-article-title-proto-danksharding-faq": "Häufige Fragen zu Proto-Danksharding", + "page-upgrade-article-title-sharding-das": "Eine Erläuterung zu Sharding und Datenverfügbarkeitsprobenahmen (DAS)", "page-upgrade-article-title-ethmerge": "Ethmerge", - "page-upgrade-article-title-merge-is-coming": "Die Zusammenführung kommt", - "page-upgrade-article-title-state-of-the-merge": "Zustand der Zusammenführung: Ein Update über Ethereums Zusammenführung zum Proof-of-Stake 2022", + "page-upgrade-article-title-merge-is-coming": "Die Zusammenführung steht bevor", + "page-upgrade-article-title-state-of-the-merge": "Status der Zusammenführung: Ein Update zu Ethereums Zusammenführung zum Proof-of-Stake 2022", "page-upgrade-article-title-ropsten-merge-testnet": "Ankündigung des Ropsten Merge-Testnetzes", "page-upgrade-article-title-execution-layer-specs": "Spezifikationen der Ausführungsebene", - "page-upgrade-article-title-consensus-layer-specs": "Daten aus der Konsensebene", - "page-upgrade-article-title-engine-api-specs": "Engine API Spezifikationen", - "page-upgrades-beacon-chain-date": "Die Beacon Chain wurde am 1. Dezember 2020 in Betrieb genommen", - "page-upgrades-beacon-chain-desc": "Die Beacon Chain brachte die grundlegende Idee zu Ethereum und legte den Grundstein für zukünftige Neuerungen. Es wird zudem das neue Proof-of-Stake Ethereum-System koordinieren.", + "page-upgrade-article-title-consensus-layer-specs": "Spezifikationen der Konsensebene", + "page-upgrade-article-title-engine-api-specs": "Spezifikationen der Engine API", + "page-upgrades-beacon-chain-date": "Die Beacon Chain ging am 1. Dezember 2020 live", + "page-upgrades-beacon-chain-desc": "Durch die Beacon Chain wurde Staking bei Ethereum eingeführt und der Grundstein für zukünftige Upgrades gelegt. Dadurch wird das neue Proof-of-Stake-Ethereum koordiniert.", "page-upgrades-beacon-chain-estimate": "Die Beacon Chain ist live", "page-upgrades-beacon-chain-title": "Die Beacon Chain", "page-upgrades-bug-bounty": "Bug-Bounty-Programm anzeigen", - "page-upgrades-clients": "Mehr erfahren über die Konsens-Clients (früher bekannt als „Eth2“-Clients)", + "page-upgrades-clients": "Erfahren Sie mehr über die Konsens-Clients (früher bekannt als „Eth2“-Clients)", "page-staking-deposit-contract-title": "Mehr erfahren über die Adresse des Einzahlungsvertrags", - "page-upgrades-dive": "Mehr erfahren über die Vision", - "page-upgrades-dive-desc": "Wie werden wir Ethereum skalierbarer, sicherer und nachhaltiger machen? Und das alles unter Beibehaltung des wesentlichen Merkmals Ethereums: Die Dezentralisierung.", + "page-upgrades-dive": "Lernen Sie die Vision kennen", + "page-upgrades-dive-desc": "Wie gestalten wir Ethereum skalierbarer, sicherer und nachhaltiger? Unter Beibehaltung der Kernphilosophie von Ethereum: der Dezentralisierung.", "page-upgrades-docking": "Die Zusammenführung", - "page-upgrades-merge-answer-1": "Die Fusion fand statt, als Ethereum am 15. September 2022 zu Proof-of-Stake überging. Die Beacon Chain fusionierte mit Mainnet, was den Proof-of-Work-Ansatz offiziell ablöste und den Energieverbrauch von Ethereum um ca. 99,95 % gesenkt hat.", - "page-upgrades-merge-btn": "Mehr zur Zusammenführung", - "page-upgrades-merge-desc": "Mainnet Ethereum wird bald mit der Proof-of-Stake Beacon Chain „verschmelzen“ und damit das Ende des energieintensiven Mining markieren.", - "page-upgrades-merge-estimate": "Die Zusammenführung kommt", + "page-upgrades-merge-answer-1": "Die Zusammenführung fand statt, als Ethereum am 15. September 2022 zum Proof-of-Stake-Konsens überging. Die Beacon Chain wurde mit dem Mainnet zusammengeführt, was den Proof-of-Work-Ansatz offiziell ablöste und den Energieverbrauch von Ethereum um ca. 99,95 % senkte.", + "page-upgrades-merge-btn": "Mehr zum Zusammenschluss", + "page-upgrades-merge-desc": "Mainnet-Ethereum wurde mit der Proof-of-Stake-Beacon Chain zusammengeführt, wodurch dem energieintensiven Mining ein Ende bereitet wurde.", + "page-upgrades-merge-estimate": "Die Zusammenführung ist live", "page-upgrades-merge-mainnet": "Was ist das Mainnet?", "page-upgrades-eth-blog": "ethereum.org-Blog", - "page-upgrades-explore-btn": "Mehr erfahren über die Upgrades", + "page-upgrades-explore-btn": "Upgrades erkunden", "page-upgrades-get-involved": "Werden Sie Teil des Ethereum-Upgrades", "page-upgrades-get-involved-2": "Mitmachen", - "page-upgrades-head-to-ethresearch": "Gehen Sie zu ethresear.ch", - "page-upgrades-help": "Möchten Sie sich an den Ethereum-Upgrades beteiligen?", - "page-upgrades-help-desc": "Es gibt viele Möglichkeiten, an den Ethereum-Upgrades mitzuwirken und beim Testen zu helfen und sogar Prämien zu verdienen.", - "page-upgrades-index-staking": "Staking ist hier", - "page-upgrades-index-staking-desc": "Der Schlüssel zu den Ethereum-Upgrades ist die Einführung von Staking. Wenn Sie Ihre ETH nutzen möchten, um dabei zu unterstützen, das Ethereum-Netzwerk zu sichern, dann befolgen Sie die aufgeführten Schritte.", - "page-upgrades-index-staking-learn": "Mehr erfahren über Staking", - "page-upgrades-index-staking-learn-desc": "Mit der Beacon Chain kommt das Staking auf Ethereum. Das bedeutet, wenn Sie ETH haben, können Sie etwas Gutes tun, indem Sie das Netzwerk sichern und dabei ETH verdienen.", - "page-upgrades-index-staking-step-1": "1. Einrichten mit dem Launchpad", + "page-upgrades-head-to-ethresearch": "Wechseln Sie zu ethresear.ch", + "page-upgrades-help": "Möchten Sie bei den Ethereum-Upgrades behilflich sein?", + "page-upgrades-help-desc": "Es gibt viele Möglichkeiten, an den Ethereum-Upgrades mitzuwirken, beim Testen zu helfen und sogar Belohnungen zu erhalten.", + "page-upgrades-index-staking": "Staking ist da", + "page-upgrades-index-staking-desc": "Der Schlüssel zu den Ethereum-Upgrades ist die Einführung von Staking. Wenn Sie Ihre ETH nutzen möchten, um an der Sicherung des Ethereum-Netzwerks beteiligt zu sein, befolgen Sie die aufgeführten Schritte.", + "page-upgrades-index-staking-learn": "Mehr über Staking erfahren", + "page-upgrades-index-staking-learn-desc": "Die Beacon Chain brachte das Staking zu Ethereum. Mit ETH können Sie etwas Gutes für die Allgemeinheit tun, indem Sie das Netzwerk sichern, und dabei mehr ETH verdienen.", + "page-upgrades-index-staking-step-1": "1. Einrichtung mit dem Launchpad", "page-upgrades-index-staking-step-1-btn": "Staking-Launchpad ansehen", - "page-upgrades-index-staking-step-1-desc": "Für das Staken auf Ethereum ist das Launchpad erforderlich – es führt Sie durch den Prozess.", + "page-upgrades-index-staking-step-1-desc": "Für das Staking bei Ethereum ist das Launchpad erforderlich – es führt Sie durch den Prozess.", "page-upgrades-index-staking-step-2": "2. Staking-Adresse bestätigen", "page-upgrades-index-staking-step-2-btn": "Adresse des Einzahlungsvertrags bestätigen", - "page-upgrades-index-staking-step-2-desc": "Bevor Sie Ihre ETH staken, sollten Sie sichergehen, dass Sie die richtige Adresse und das Launchpad durchlaufen haben.", + "page-upgrades-index-staking-step-2-desc": "Bevor Sie Ihre ETH staken, sollten Sie die Richtigkeit der Adresse sicherstellen und das Launchpad durchlaufen haben.", "page-upgrades-index-staking-sustainability": "Nachhaltiger", "page-upgrades-meta-desc": "Eine Übersicht über die die Ethereum-Upgrades und die Vision, die damit realisiert werden soll.", "page-upgrades-meta-title": "Ethereum-Upgrades (ehemals „Eth2“)", - "page-upgrades-proof-stake-link": "Mehr zum Proof-of-Stake", + "page-upgrades-proof-stake-link": "Mehr zu Proof-of-Stake", "page-upgrades-question-1-title": "Wann werden die Upgrades veröffentlicht?", - "page-upgrades-question-1-desc": "Die Upgrades für Ethereum erfolgen fortlaufend, sie unterscheiden sich durch ihre Veröffentlichungsdaten.", + "page-upgrades-question-1-desc": "Die Upgrades für Ethereum erfolgen fortlaufend. Sie haben jeweils eigene Veröffentlichungsdaten.", "page-upgrades-question-2-title": "Ist die Beacon Chain eine separate Blockchain?", - "page-upgrades-question-2-desc": "Ja. Die Beacon Chain ist der Name einer parallelen Proof-of-Stake-Blockchain zur Aktualisierung von Ethereums Mainnet. Es gibt jetzt nur noch eine Blockchain, die durch die Zusammenführung der ursprünglichen Ethereum-Blockchain und der Beacon Chain gebildet wird.", - "page-upgrades-question-3-answer-2a": "Die Zusammenführung hatte minimale Auswirkungen auf dApp-Entwickler – sie interagieren weiterhin mit Ethereum auf die gleiche Weise.", + "page-upgrades-question-2-desc": "Ja. Beacon Chain wurde als Bezeichnung einer parallelen Proof-of-Stake-Blockchain für das Upgrade des Ethereum-Mainnets vergeben. Es gibt jetzt nur noch eine Blockchain, die durch die Zusammenführung der ursprünglichen Ethereum-Blockchain und der Beacon Chain gebildet wurde.", + "page-upgrades-question-3-answer-2a": "Die Zusammenführung hatte minimale Auswirkungen auf dApp-Entwickler – sie interagieren mit Ethereum weiterhin auf die gleiche Weise.", "page-upgrades-question-3-answer-2a-link": "Die Zusammenführung und dApp-Entwickler", - "page-upgrades-question-3-answer-2b": "Sharding-Pläne werden noch entwickelt, jedoch mit dem Ziel von Layer-2-Rollups.", + "page-upgrades-question-3-answer-2b": "Sharding-Pläne werden noch entwickelt, Layer-2-Rollups sollen dabei jedoch berücksichtigt werden.", "page-upgrades-layer-2-rollups": "Mehr über Layer-2-Rollups", "page-upgrades-question-3-answer-3-link": "ehtresear.ch besuchen", "page-upgrades-question-3-desc": "Im Augenblick müssen Sie nichts tun, um sich auf die Upgrades vorzubereiten.", "page-upgrades-question-3-title": "Wie bereite ich mich auf die Upgrades vor?", - "page-upgrades-question-4-answer-1": "Wenn Sie heute eine Transaktion durchführen oder eine dApp benutzen, verwenden Sie die Ausführungsebene bekannt als Mainnet.", - "page-upgrades-question-4-answer-3": "Nach der Zusammenführung werden Validatoren das gesamte Netzwerk mittels Proof-of-Stake sichern.", - "page-upgrades-question-4-answer-6": "Jeder kann ein Validator werden, indem er sein ETH staket.", + "page-upgrades-question-4-answer-1": "Wenn Sie heute eine Transaktion durchführen oder eine dApp benutzen, verwenden Sie die Ausführungsebene – auch bekannt als Mainnet.", + "page-upgrades-question-4-answer-3": "Seit der Zusammenführung sichern Validatoren das gesamte Netzwerk mittels Proof-of-Stake.", + "page-upgrades-question-4-answer-6": "Jeder kann ein Validator werden, indem er sein ETH stakt.", "page-upgrades-question-4-answer-7": "Mehr zum Staking", "page-upgrades-question-4-title": "Was ist die Ausführungsebene?", - "page-upgrades-question-4-desc": "Vor der Zusammenführung wurde die Ethereum-Blockchain manchmal als „Eth1.“ bezeichnet. Dieser Begriff wurde zugunsten der „Ausführungsebene“ abgeschafft.", - "page-upgrades-question-5-answer-1": "Um ein Validator im Netzwerk zu werden, müssen Sie 32 ETH staken. Wenn Sie nicht so viel haben oder nicht so viel einsetzen möchten, können Sie sich an Staking-Pools beteiligen. Mit diesen Pools können Sie weniger einsetzen und Bruchteile der Gesamtprämien sammeln.", + "page-upgrades-question-4-desc": "Vor der Zusammenführung wurde die Ethereum-Blockchain manchmal als „Eth1“ bezeichnet. Dieser Begriff wurde von „Ausführungsebene“ abgelöst.", + "page-upgrades-question-5-answer-1": "Um ein Validator im Netzwerk zu werden, müssen Sie 32 ETH staken. Wenn Sie nicht so viel haben oder nicht so viel einsetzen möchten, können Sie Staking-Pools beitreten. Mit diesen Pools können Sie weniger einsetzen und Aneile der Gesamtbelohnungen sammeln.", "page-upgrades-question-5-desc": "Sie müssen das Staking-Launchpad nutzen oder einem Staking-Pool beitreten.", "page-upgrades-question-5-title": "Wie stake ich?", "page-upgrades-question-6-answer-3": "Danny Ryan von der Ethereum Foundation bringt die Community regelmäßig auf den neusten Stand:", "page-upgrades-question-6-answer-4": "Ben Edgington von ConsenSys bietet einen wöchentlichen Newsletter über die Ethereum-Upgrades:", - "page-upgrades-question-6-answer-5": "Sie können sich auch der Diskussion über die Forschung und Entwicklung von Ethereum auf ethresear.ch anschließen.", + "page-upgrades-question-6-answer-5": "Sie können sich auch der Diskussion über die Ethereum-Forschung und -Entwicklung auf ethresear.ch anschließen.", "page-upgrades-question-6-title": "Was muss ich mit meiner dApp tun?", - "page-upgrades-question-6-desc": "Die Zusammenführung wurde so konzipiert, dass sie nur minimale Auswirkungen auf die Entwickler hat, obwohl es ein paar kleine Änderungen gab, die man beachten sollte.", - "page-upgrades-question-6-answer-1": "Dapp-Entwickler, die mit Ethereum vor und nach der Zusammenführung vertraut waren, sollten einige Änderungen kennen. Diese Änderungen umfassen Blockstruktur und Timing, einige Opcode-Änderungen, Quellen von On-Chain-Zufälligkeit und das Konzept der Epochenfinalisierung.", + "page-upgrades-question-6-desc": "Die Zusammenführung wurde so konzipiert, dass sie nur minimale Auswirkungen auf die Entwickler hat – wobei es einige kleine Änderungen gab, die beachtet werden sollten.", + "page-upgrades-question-6-answer-1": "dApp-Entwickler, die mit Ethereum vor der Zusammenführung vertraut waren, sollten einige Änderungen kennen. Diese Änderungen umfassen Blockstruktur und Timing, einige Opcode-Änderungen, Quellen von On-Chain-Zufälligkeit und das Konzept der Epochenfinalisierung.", "page-upgrades-question-6-answer-1-link": "Wie die Zusammenführung die Anwendungsebene von Ethereum beeinflusste", "page-upgrades-question-6-answer-2": "Anwendungen waren nahezu nicht betroffen.", "page-upgrades-question-7-desc": "Viele verschiedene Teams aus der ganzen Community arbeiten an den verschiedenen Ethereum-Upgrades.", @@ -109,61 +109,61 @@ "page-upgrades-question-7-nimbus-lang": "(Nim-Implementierung)", "page-upgrades-question-7-prysm": "Prysm", "page-upgrades-question-7-prysm-lang": "(Go-Implementierung)", - "page-upgrades-question-7-teams": "Die Konsens-Client-Teams:", + "page-upgrades-question-7-teams": "Die Ethereum-Konsens-Client-Teams:", "page-upgrades-question-7-teku": "Teku", "page-upgrades-question-7-teku-lang": "(Java-Implementierung)", "page-upgrades-question-7-title": "Wer erstellt die Ethereum-Upgrades?", - "page-upgrades-question-7-clients": "Mehr erfahren über die Ethereum-Clients", + "page-upgrades-question-7-clients": "Mehr über Ethereum-Clients erfahren", "page-upgrades-question-8-answer-1": "Mit den Ethereum-Upgrades wird es möglich, Ethereum dezentral zu skalieren und gleichzeitig die Sicherheit zu erhalten und die Nachhaltigkeit zu steigern.", - "page-upgrades-question-8-answer-2": "Das wesentlichste Problem ist, dass Ethereum in der Lage sein muss, mehr als 15-45 Transaktionen pro Sekunde verarbeiten zu können. Doch die Upgrades zielen auf weitere Probleme ab, die mit Ethereum heute bestehen.", - "page-upgrades-question-8-answer-3": "Das Netzwerk erfährt eine so hohe Nachfrage, dass die Nutzung von Ethereum teuer ist. Knoten im Netzwerk haben mit der Größe von Ethereum und der Datenmenge, die ihre Computer verarbeiten müssen, stark zu kämpfen. Zudem ist der zugrunde liegende Algorithmus, der Ethereum sicher und dezentral hält, energieintensiv und muss umweltfreundlicher werden.", - "page-upgrades-question-8-answer-4": "Vieles von dem, was sich ändert, steht schon seit 2015 auf der Roadmap von Ethereum. Aber die gegenwärtigen Bedingungen machen die Notwendigkeit der Upgrades noch größer.", - "page-upgrades-question-8-answer-6": "Mehr zur Vision von Ethereum", - "page-upgrades-question-8-desc": "Das Ethereum, das wir heute verwenden, muss Endnutzern und Netzwerkteilnehmern eine bessere Erfahrung bieten.", - "page-upgrades-question-8-title": "Warum sind die Upgrades erforderlich?", - "page-upgrades-question-9-answer-1": "Die aktivste Rolle, die Sie spielen können, ist, Ihre ETH einzusetzen.", - "page-upgrades-question-9-answer-2": "Vielleicht möchten Sie auch einen zweiten Client verwenden, um die Client-Diversität zu verbessern.", + "page-upgrades-question-8-answer-2": "Die wohl offensichtlichste Hürde ist, dass Ethereum in der Lage sein muss, mehr als 15–45 Transaktionen pro Sekunde verarbeiten zu können. Die Upgrades zielen jedoch auch auf weitere Probleme ab, die es heute bei Ethereum zu bewältigen gilt.", + "page-upgrades-question-8-answer-3": "Die Nutzung von Enthereum ist in Zeiten hoher Nachfrage im Netzwerk teuer. Nodes im Netzwerk haben mit der Größe von Ethereum und der Datenmenge, die die Computer verarbeiten müssen, stark zu kämpfen. Zudem war der ursprüngliche Algorithmus für Ethereums Sicherheit und Dezentralisierung energieintensiv und musste umweltfreundlicher werden.", + "page-upgrades-question-8-answer-4": "Vieles von dem, was sich ändert, steht schon seit 2015 im Ethereum-Fahrplan. Die gegenwärtigen Bedingungen machen die Notwendigkeit der Upgrades jedoch noch größer.", + "page-upgrades-question-8-answer-6": "Ethereums Vision erkunden", + "page-upgrades-question-8-desc": "Das Ethereum von heute muss Endnutzern und Teilnehmern im Netzwerk eine bessere Erfahrung bieten.", + "page-upgrades-question-8-title": "Warum sind Upgrades erforderlich?", + "page-upgrades-question-9-answer-1": "Die aktivste Rolle, die Sie spielen können, besteht darin, Ihre ETH zu staken.", + "page-upgrades-question-9-answer-2": "Vielleicht möchten Sie auch einen zweiten Client ausführen, um die Client-Diversität zu verbessern.", "page-upgrades-question-9-answer-3": "Wenn Sie technisch versiert sind, können Sie dabei helfen, Fehler in den neuen Clients zu finden.", - "page-upgrades-question-9-answer-4": "Sie können auch bei den technischen Diskussionen mit Ethereum-Forschern mitreden, und zwar auf ethresear.ch.", - "page-upgrades-question-9-desc": "Sie müssen kein Techniker sein, um etwas beizutragen. Die Community sucht nach Beteiligungen aus allen möglichen Bereichen.", - "page-upgrades-question-9-stake-eth": "ETH staken", + "page-upgrades-question-9-answer-4": "Ebenso können Sie sich auf ethresear.ch an technischen Diskussionen mit Ethereum-Forschern beteiligen.", + "page-upgrades-question-9-desc": "Sie müssen kein Techniker sein, um etwas beizutragen. Die Community sucht nach Beiträgen aus allen möglichen Bereichen.", + "page-upgrades-question-9-stake-eth": "Stake ETH", "page-upgrades-question-9-title": "Wie kann ich zu den Ethereum-Upgrades beitragen?", "page-upgrades-question-9-more": "Allgemeinere Möglichkeiten finden, um sich an Ethereum zu beteiligen", - "page-upgrades-question-10-title": "Was sind die „Eth2“-Phasen?", - "page-upgrades-question-10-desc": "Manche Dinge haben sich hier geändert.", - "page-upgrades-question-10-answer-0": "Der Begriff „Eth2“ selbst wird nicht mehr verwendet, da es sich nicht um ein einzelnes Upgrade oder ein neues Netzwerk handelt. Es handelt sich vielmehr um eine Reihe von Upgrades, die alle dazu beitragen, Ethereum skalierbarer, sicherer und nachhaltiger zu machen. Das Netzwerk, das Sie kennen und lieben, wird einfach als Ethereum bezeichnet.", - "page-upgrades-question-10-answer-1": "Wir halten uns zurück mit dem, was wir über eine technische Roadmap sagen, denn das ist Software: Die Dinge können sich ändern. Wir denken, es ist einfacher zu verstehen, was passiert, wenn man über die Resultate liest.", + "page-upgrades-question-10-title": "Was sind die „Eth2-Phasen“?", + "page-upgrades-question-10-desc": "Manches hier hat sich verändert.", + "page-upgrades-question-10-answer-0": "Der Begriff „Eth2“ selbst wird künftig nicht mehr verwendet, da es sich nicht um ein einzelnes Upgrade oder ein neues Netzwerk handelt. Es handelt sich vielmehr um eine Reihe von Upgrades, die alle dazu beitragen, Ethereum skalierbarer, sicherer und nachhaltiger zu machen. Das Netzwerk, das Sie kennen und lieben, wird einfach als Ethereum bezeichnet.", + "page-upgrades-question-10-answer-1": "Wir halten uns mit Aussagen über einen technischen Fahrplan zurück, denn es geht um Software: Sie kann sich ändern. Wir denken, es ist einfacher, zu verstehen, was passiert, wenn man sich über die Ergebnisse informiert.", "page-upgrades-question-10-answer-1-link": "Upgrades ansehen", - "page-upgrades-question-10-answer-2": "Doch wenn Sie die Diskussion verfolgt haben, erfahren Sie hier, wie die Upgrades in die technischen Roadmaps passen und ein wenig darüber, wie sie sich ändern.", - "page-upgrades-question-10-answer-3": "Phase 0 beschreibt die Arbeit rund um die Einführung der Beacon Chain.", - "page-upgrades-question-10-answer-5": "Ursprünglich konzentrierte sich Phase 1 auf die Implementierung der Shard Chains, aber die Priorisierung hat sich auf die Zusammenführung verlagert, die am 15. September 2022 ausgeliefert wurde.", - "page-upgrades-question-10-answer-6": "La phase 1.5 était initialement prévue pour suivre les implémentations des chaînes de fragments au moment où le réseau principal aurait été ajouté en tant que dernier fragment à la chaîne phare. Cependant, à mesure que la technologie de rollup progressait, la communauté Ethereum a accéléré la transition en s'écartant plutôt de la preuve de travail.", - "page-upgrades-question-10-answer-7": "Die Pläne rund um Phase 2 waren ein Punkt intensiver Forschung und Diskussion. Mit dem Abschluss der Zusammenführung und dem Fortschritt bei Layer-2-Lösungen haben sich die Ziele zu einer eher vereinfachten Form des Daten-Shardings zugunsten der Maximierung der Rollup-Effizienz verlagert. Aktuelle Layer-2-Projekte erlauben die Skalierung der Transaktionsausführung, und Sharding wird die Speicherung von Beweisen für diese Daten auf Layer 1 auf eine günstige und skalierbare Weise ermöglichen.", - "page-upgrades-question-10-answer-8": "Mehr zur Rollup-zentrierten Roadmap", + "page-upgrades-question-10-answer-2": "Wenn Sie die Diskussionen jedoch verfolgt haben, erfahren Sie hier, wie die Upgrades in die technischen Fahrpläne passen, und ein wenig darüber, wie sie sich ändern.", + "page-upgrades-question-10-answer-3": "Phase 0 beschrieb die Arbeit rund um die Einführung der Beacon Chain.", + "page-upgrades-question-10-answer-5": "Ursprünglich konzentrierte sich Phase 1 auf die Implementierung der Fragmentierungen, aber die Priorisierung hat sich auf die Zusammenführung verlagert, die am 15. September 2022 eingeführt wurde.", + "page-upgrades-question-10-answer-6": "Phase 1.5 wurde ursprünglich so konzipiert, dass es Shard-Implementierungen folgte, wenn das Mainnet als letzter Shard zur Beacon Chain hinzugefügt wurde. Mit Fortschritten in der Rollup-Technologie beschleunigte die Ethereum-Community jedoch stattdessen die Abkehr vom Proof-of-Work-Ansatz.", + "page-upgrades-question-10-answer-7": "Die Pläne rund um Phase 2 waren der Mittelpunkt intensiver Forschung und Diskussion. Mit dem Abschluss der Zusammenführung und dem Fortschritt bei Layer-2-Lösungen haben sich die Ziele zu einer eher vereinfachten Form des Daten-Shardings zugunsten der Maximierung der Rollup-Effizienz verlagert. Aktuelle Layer-2-Lösungen erlauben die Skalierung der Transaktionsausführung, und Sharding wird die Speicherung von Beweisen für diese Daten auf Layer 1 auf eine günstige und skalierbare Weise ermöglichen.", + "page-upgrades-question-10-answer-8": "Mehr zum Rollup-zentrierten Fahrplan", "page-upgrades-question-11-title": "Kann ich Eth2 kaufen?", - "page-upgrades-question-11-desc": "Nein. Es gibt kein Eth2-Token und Ihre ETH werden sich nach der Zusammenführung nicht ändern.", - "page-upgrades-question-11-answer-1": "Eine der treibenden Kräfte hinter dem Rebranding von Eth2 war der weit verbreitete Irrglaube, dass ETH-Inhaber ihre ETH nach „Ethereum 2.0“ migrieren müssten. Dies war aber nie der Fall.", + "page-upgrades-question-11-desc": "Nein. Ein Eth2-Token existiert nicht und Ihre ETH haben sich durch die Zusammenführung nicht geändert.", + "page-upgrades-question-11-answer-1": "Eine der treibenden Kräfte hinter dem Rebranding von Eth2 war der weit verbreitete Irrglaube, dass ETH-Inhaber nach der Zusammenführung oder einem anderen Upgrade ihre ETH zu „ETH 2.0“ migrieren müssten. Das ist nicht wahr und war nie der Fall.", "page-upgrades-question-11-answer-2": " Diese Verwirrung wird häufig von Betrügern ausgenutzt.", "page-upgrades-question-title": "Häufig gestellte Fragen", - "page-upgrades-question3-answer-1": "ETH-Besitzer müssen gar nichts tun. Ihre ETH müssen weder geändert werden, noch muss ein Upgrade durchgeführt werden. Sicherlich wird es Betrüger geben, die Sie vom Gegenteil überzeugen möchten. Seien Sie also vorsichtig.", + "page-upgrades-question3-answer-1": "ETH-Inhaber müssen nichts tun. Ihre ETH müssen weder geändert werden, noch muss ein Upgrade durchgeführt werden. Mit ziemlicher Sicherheit wird es Betrüger geben, die Sie vom Gegenteil überzeugen möchten – seien Sie also vorsichtig.", "page-upgrades-scalable": "Skalierbarer", "page-upgrades-scalable-desc": "Ethereum muss tausende Transaktionen pro Sekunde unterstützen, um Anwendungen schneller und günstiger nutzen zu können.", "page-upgrades-secure": "Sicherer", - "page-upgrades-secure-desc": "Ethereum muss sicherer werden. Mit zunehmender Nutzung von Ethereum muss das Protokoll besser gegen alle Formen des Angriffs geschützt werden.", - "page-upgrades-shard-date": "Sharding wird der Zusammenführung in mehreren Phasen folgen, irgendwann im Zeitraum 2023-2024.", - "page-upgrades-shard-desc": "Danksharing erweitert die Speicherkapazität von Ethereum und arbeitet harmonisch mit L2s zusammen, um den Durchsatz zu skalieren und die Netzwerkgebühren zu senken. Danksharing wird in mehreren Phasen ausgerollt, beginnend mit ProtoDanksharding.", - "page-upgrades-shard-estimate": "Geschätzt: 2023-2024", + "page-upgrades-secure-desc": "Ethereum muss sicherer werden. Mit zunehmender Nutzung von Ethereum muss das Protokoll besser gegen alle Arten von Angriffen geschützt werden.", + "page-upgrades-shard-date": "Sharding wird der Zusammenführung in mehreren Phasen folgen, im Zeitraum 2023–2024.", + "page-upgrades-shard-desc": "Danksharing erweitert die Datenspeicherkapazität von Ethereum und arbeitet harmonisch mit L2s zusammen, um den Durchsatz zu skalieren und Netzwerkgebühren zu senken. Danksharing wird in mehreren Phasen eingeführt, beginnend mit ProtoDanksharding.", + "page-upgrades-shard-estimate": "Geschätzt: 2023–2024", "page-upgrades-shard-lower": "Mehr zu Sharding", "page-upgrades-shard-title": "Sharding", "page-upgrades-stay-up-to-date": "Auf dem Laufenden bleiben", - "page-upgrades-stay-up-to-date-desc": "Erfahren Sie von Forschern und Entwicklern, die an den Ethereum-Upgrades arbeiten, was es Neues gibt.", - "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-stay-up-to-date-desc": "Erfahren Sie Neuigkeiten von Forschern und Entwicklern, die an den Ethereum-Upgrades arbeiten.", + "page-upgrades-sustainable-desc": "Ethereum war noch bis vor Kurzem energieintensiv. Der Übergang zu Proof-of-Stake führte zu einer Energieersparnis im Netzwerk von über 99,9 %.", "page-upgrades-take-part": "An der Forschung teilnehmen", - "page-upgrades-take-part-desc": "Ethereum-Forscher und -Enthusiasten treffen sich hier, um über die Forschungsbemühungen zu diskutieren, einschließlich allen Aspekten, die mit den Ethereum-Upgrades zu tun haben.", + "page-upgrades-take-part-desc": "Ethereum-Forscher und -Enthusiasten kommen hier zusammen, um über die Forschungsbemühungen zu diskutieren – auch über alles rund um die Ethereum-Upgrades.", "page-upgrades-the-upgrades": "Die Ethereum-Upgrades", - "page-upgrades-the-upgrades-desc": "Modernizările Ethereum au ca scop îmbunătățirea scalabilității, securității și durabilității rețelei. Ethereum a trecut recent prin modernizări majore de securitate și durabilitate și urmează și altele în viitor, în special legate de scalabilitate.", - "page-upgrades-unofficial-roadmap": "Das ist nicht der offizielle Fahrplan. Das ist unsere Sicht der Dinge, basierend auf den Informationen, die es gibt. Doch da wir über Technologie sprechen, können sich Pläne im Handumdrehen ändern. Verstehen Sie die Aussagen also bitte nicht als Verpflichtung.", - "page-upgrades-upgrade-desc": "Das Ethereum, das wir kennen und lieben, nur skalierbarer, sicherer und nachhaltiger...", + "page-upgrades-the-upgrades-desc": "Ethereum-Upgrades zielen darauf ab, die Skalierbarkeit, Sicherheit und Nachhaltigkeit des Netzwerks zu verbessern. Ethereum hat kürzlich einige umfassende Upgrades in Bezug auf Sicherheit und Nachhaltigkeit durchlaufen – und in Zukunft stehen weitere Upgrades an, insbesondere bei der Skalierbarkeit.", + "page-upgrades-unofficial-roadmap": "Das ist nicht der offizielle Fahrplan. Das ist unsere Sicht der Dinge, basierend auf den verfügbaren Informationen. Wir sprechen jedoch über Technologie, und diese kann sich im Handumdrehen ändern. Betrachten Sie das also bitte nicht als Verpflichtung.", + "page-upgrades-upgrade-desc": "Das Ethereum, das wir kennen und lieben – nur skalierbarer, sicherer und nachhaltiger ...", "page-upgrades-upgrades": "Die Ethereum-Upgrades", "page-upgrades-upgrades-aria-label": "Das Ethereum-Upgrades-Menü", "page-upgrades-upgrades-beacon-chain": "Die Beacon Chain", @@ -173,32 +173,32 @@ "page-upgrades-upgrading": "Komplett neue Möglichkeiten für Ethereum schaffen", "page-roadmap-vision": "Die Vision", "page-roadmap-vision-btn": "Mehr zur Vision von Ethereum", - "page-roadmap-vision-desc": "Um eine großflächige Akzeptanz von Ethereum und Vorteile für alle Menschen weltweit zu erreichen, muss Ethereum skalierbarer, sicherer und nachhaltiger werden.", + "page-roadmap-vision-desc": "Um Ethereum der breiten Masse näherzubringen und allen Menschen einen Mehrwert zu bieten, muss Ethereum skalierbarer, sicherer und nachhaltiger werden.", "page-upgrades-what-happened-to-eth2-title": "Was ist mit „Eth2“ passiert?", - "page-upgrades-what-happened-to-eth2-1": "Der Begriff „Eth2“ wurde häufig verwendet, um die Zukunft von Ethereum vor der Umstellung zu beschreiben, er wird jedoch derzeit zu Gunsten einer präziseren Terminologie abgeschafft.", + "page-upgrades-what-happened-to-eth2-1": "Der Begriff „Eth2“ wurde vor der Zusammenführung häufig verwendet, er wird jedoch von präziserer Terminologie abgelöst.", "page-upgrades-what-happened-to-eth2-1-more": "Mehr über die Zusammenführung.", "page-upgrades-what-happened-to-eth2-2": "Seit der Zusammenführung von „Eth1“ und „Eth2“ gibt es nicht mehr zwei verschiedene Ethereum-Blockchains, sondern nur noch Ethereum.", "page-upgrades-what-happened-to-eth2-3": "Um Unklarheiten zu minimieren, hat die Community diese Begriffe aktualisiert:", - "page-upgrades-what-happened-to-eth2-3-1": "„Eth1“ ist nun der „Ausführungslayer“, der Transaktionen verarbeitet und ausführt.", - "page-upgrades-what-happened-to-eth2-3-2": "„Eth2“ ist nun der „Konsenslayer“, der den Proof-of-Stake-Konsens regelt.", - "page-upgrades-what-happened-to-eth2-4": "Diese aktualisierte Terminologie ändert lediglich die Benennungskonventionen. Die Ziele von Ethereum oder die Roadmap ändern sich dadurch nicht.", - "page-upgrades-what-happened-to-eth2-5": "Mehr erfahren über die „Eth2“-Umbenennung", + "page-upgrades-what-happened-to-eth2-3-1": "„Eth1“ ist nun die „Ausführungsebene“, die Transaktionen und Ausführungen verarbeitet.", + "page-upgrades-what-happened-to-eth2-3-2": "„Eth2“ ist nun die „Konsensebene“, die den Proof-of-Stake-Konsens regelt.", + "page-upgrades-what-happened-to-eth2-4": "Diese aktualisierte Terminologie ändert lediglich die Benennungskonventionen. Die Ziele und der Fahrplan von Ethereum ändern sich dadurch nicht.", + "page-upgrades-what-happened-to-eth2-5": "Mehr über die „Eth2“-Umbenennung erfahren", "page-upgrades-why-cant-we-just-use-eth2-title": "Warum können wir nicht einfach Eth2 verwenden?", "page-upgrades-why-cant-we-just-use-eth2-mental-models-title": "Gedankliche Modelle", - "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "Ein großes Problem mit der Eth2-Benennung besteht darin, dass neue Benutzer von Ethereum sich ein falsches Bild machen. Sie denken intuitiv, dass Eth1 vor Eth2 kommt. Oder dass Eth1 von Eth2 abgelöst wird. Weder das eine noch das andere ist wahr. Wenn wir den Begriff Eth2 nicht mehr verwenden, machen sich die zukünftigen Benutzer kein falsches Bild von dem Modell.", + "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "Ein großes Problem mit der Eth2-Benennung besteht darin, dass neue Benutzer von Ethereum sich ein falsches Bild machen. Sie denken intuitiv, dass Eth1 vor Eth2 kommt oder dass Eth1 von Eth2 abgelöst wird. Weder das eine noch das andere ist wahr. Wenn wir den Begriff Eth2 nicht mehr verwenden, wecken wir in zukünftigen Benutzern keine falschen Vorstellungen.", "page-upgrades-why-cant-we-just-use-eth2-inclusivity-title": "Inklusivität", - "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "Im Zuge der Weiterentwicklung der Ethereum-Roadmap ist Ethereum 2.0 nicht mehr wirklich geeignet, um die Roadmap von Ethereum darzustellen. Durch sorgfältige und genaue Wortwahl können Inhalte auf Ethereum von einem möglichst breiten Publikum verstanden werden.", + "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "Im Zuge der Weiterentwicklung des Ethereum-Fahrplans hat sich Ethereum 2.0 als nicht mehr geeignet erwiesen, Ethereums Fahrplan zu repräsentieren. Durch eine sorgfältige und genaue Wortwahl können wir Ethereum-Inhalte einem möglichst breiten Publikum verständlich machen.", "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-title": "Betrugsprävention", - "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "Leider haben böswillige Akteure versucht, die ungenaue Bezeichnung Eth2 zu nutzen, um Benutzer zu betrügen. Sie haben sie aufgefordert, ihre ETH gegen „ETH2“-Token zu tauschen, oder behauptet, dass sie ihre ETH vor dem Eth2-Upgrade irgendwie migrieren müssen. Wir hoffen, dass diese aktualisierte Terminologie Klarheit bringt, um diese Nische für Betrug zu schließen und dazu beizutragen, das Ökosystem sicherer zu machen.", + "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "Leider haben böswillige Akteure versucht, die ungenaue Bezeichnung Eth2 zu nutzen, um Benutzer zu betrügen. Sie forderten sie dabei auf, ihre ETH gegen „ETH2“-Token zu tauschen, oder behaupteten, dass sie ihre ETH vor dem Eth2-Upgrade irgendwie migrieren müssten. Wir hoffen, dass diese aktualisierte Terminologie Klarheit schafft, um diese Nische für Betrug zu schließen, und dazu beiträgt, das Ökosystem sicherer zu machen.", "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-title": "Klares Staking", - "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "Manche Staking-Betreiber haben auch die auf der Beacon Chain gestaketen ETH mit dem Ticker „ETH2“ vorgestellt. Das führte zu Verwirrung, da die Benutzer dieser Dienste nicht wirklich einen „ETH2“-Token erhalten. Es existiert kein „ETH2“-Token, vielmehr bezeichnet der Begriff einfach den Anteil am Stake dieses bestimmten Anbieters.", + "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "Manche Staking-Betreiber haben auch die auf der Beacon Chain gestakten ETH mit dem Ticker „ETH2“ vorgestellt. Das führt möglicherweise zu Verwirrung, da die Benutzer dieser Dienste nicht wirklich einen „ETH2“-Token erhalten. Es existiert kein „ETH2“-Token – vielmehr bezeichnet der Begriff einfach den Anteil am Stake dieses bestimmten Anbieters.", "page-upgrades-what-to-do": "Was müssen Sie tun?", - "page-upgrades-what-to-do-desc": "Wenn Sie ein dApp-Nutzer oder ETH-Inhaber sind, müssen Sie gar nichts tun. Sind Sie Entwickler oder möchten damit anfangen, ETH einzusetzen, dann gibt es Möglichkeiten, wie Sie sich heute einbringen können.", + "page-upgrades-what-to-do-desc": "Wenn Sie ein dApp-Benutzer oder ETH-Inhaber sind, müssen Sie gar nichts tun. Sind Sie Entwickler oder möchten Sie mit dem Staking anfangen, dann gibt es Möglichkeiten, wie Sie sich heute einbringen können.", "page-upgrades-whats-next": "Was sind Ethereum-Upgrades?", - "page-upgrades-whats-next-desc": "Die Ethereum-Roadmap umfasst zusammenhängende Protokoll-Upgrades, die das Netzwerk skalierbarer, sicherer und nachhaltiger machen. Diese Upgrades werden von mehreren Teams aus dem gesamten Ethereum-Ökosystem entwickelt.", - "page-upgrades-whats-next-history": "Mehr erfahren über vorherige Ethereum-Upgrades", - "page-upgrades-whats-ethereum": "Moment, was ist Ethereum?", - "page-upgrades-whats-new": "Was kommt als Nächstes für Ethereum?", + "page-upgrades-whats-next-desc": "Der Ethereum-Fahrplan umfasst zusammenhängende Protokoll-Upgrades, die das Netzwerk skalierbarer, sicherer und nachhaltiger machen. Diese Upgrades werden von mehreren Teams aus dem gesamten Ethereum-Ökosystem entwickelt.", + "page-upgrades-whats-next-history": "Mehr über vorherige Ethereum-Upgrades erfahren", + "page-upgrades-whats-ethereum": "Moment – was ist Ethereum?", + "page-upgrades-whats-new": "Was steht als Nächstes bei Ethereum an?", "page-upgrades-security-link": "Mehr zu Sicherheit und Betrugsprävention", "page-staking-deposit-contract-staking-more-link": "Mehr zum Staking", "docs-nav-proof-of-stake": "Proof-of-Stake", diff --git a/src/intl/de/page-wallets-find-wallet.json b/src/intl/de/page-wallets-find-wallet.json index 0bf8f3a3838..fabd715cfe2 100644 --- a/src/intl/de/page-wallets-find-wallet.json +++ b/src/intl/de/page-wallets-find-wallet.json @@ -81,7 +81,7 @@ "page-find-wallet-feature-filters": "Funktionsfilter", "page-find-wallet-footnote-1": "Die auf dieser Seite aufgeführten Wallets sind keine offiziellen Empfehlungen und dienen ausschließlich zu Informationszwecken.", "page-find-wallet-footnote-2": "Die Beschreibungen wurden von den Wallet-Projekten selbst bereitgestellt.", - "page-find-wallet-footnote-3": "Wir fügen dieser Seite Produkte basierend auf den Kriterien unserer Auflistungsrichtlinie hinzu. Wenn Sie möchten, dass wir eine Wallet hinzufügen, melden Sie ein Problem in GitHub.", + "page-find-wallet-footnote-3": "Wir fügen dieser Seite Produkte basierend auf den Kriterien unserer Auflistungsrichtlinie hinzu. Wenn Sie möchten, dass wir eine Wallet hinzufügen, erstellen Sie ein Ticket auf GitHub.", "page-find-wallet-mobile": "Mobil", "page-find-wallet-mobile-desc": "Wallets mit mobilen Apps", "page-find-wallet-desktop": "Desktop", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Wallets mit Browser-Erweiterungen", "page-find-wallet-device": "Gerät", "page-find-choose-to-compare": "Zum Vergleich auswählen", - "page-find-wallet-choose-features": "Funktionen auswählen" + "page-find-wallet-choose-features": "Funktionen auswählen", + "page-find-wallet-reset-filters": "Filter zurücksetzen" } diff --git a/src/intl/el/common.json b/src/intl/el/common.json index a4dbd5a9583..6db31724217 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": "Συνεισφέροντες", @@ -20,14 +34,17 @@ "copied": "Αντιγράφηκε", "copy": "Αντιγραφή", "danksharding": "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)", - "defi-page": "Αποκεντρωμένη τραπεζική (DeFi)", + "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,11 +145,114 @@ "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": "EIP - Προτάσεις βελτίωσης Ethereum", + "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": "Κύριο", - "nft-page": "Μη Εναλλάξιμα Κρυπτοπαραστατικά (NFT)", + "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": "Όχι", "on-this-page": "Σε αυτήν τη σελίδα", @@ -140,6 +260,8 @@ "page-developers-aria-label": "Μενού προγραμματιστών", "page-index-meta-title": "Αρχική", "page-last-updated": "Τελευταία ενημέρωση της σελίδας", + "participate": "Συμμετοχή", + "participate-menu": "Μενού συμμετοχής", "pbs": "Διαχωρισμός προτείνοντος - κατασκευαστή", "pools": "Αποθήκευση κεφαλαίου σε δεξαμενή", "privacy-policy": "Πολιτική απορρήτου", @@ -149,9 +271,11 @@ "quizzes": "Διαγωνισμοί γνώσεων", "refresh": "Παρακαλούμε ανανεώστε τη σελίδα.", "return-home": "επιστροφή στην αρχική", - "roadmap": "Οδικός χάρτης Ethereum", + "roadmap": "Οδικός χάρτης", + "research": "Έρευνα", + "research-menu": "Μενού έρευνας", "resources": "Πηγές μετάφρασης", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Εκτελέστε ένα κόμβο", "rollup-component-website": "Ιστότοπος", "rollup-component-developer-docs": "Τεκμηρίωση προγραμματιστή", @@ -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/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/el/page-languages.json b/src/intl/el/page-languages.json index 60db98df4a1..5d7a1104faa 100644 --- a/src/intl/el/page-languages.json +++ b/src/intl/el/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Θέλετε να δείτε το ethereum.org σε μια διαφορετική γλώσσα;", "page-languages-want-more-link": "Πρόγραμμα μετάφρασης", "page-languages-want-more-paragraph": "Οι μεταφραστές του ethereum.org μεταφράζουν πάντα σελίδες σε όσο το δυνατόν περισσότερες γλώσσες. Για να δείτε την τρέχουσα κατάσταση ή να εγγραφείτε για να συμμετάσχετε, διαβάστε", - "page-languages-filter-placeholder": "Φίλτρο", + "page-languages-filter-label": "Φιλτράρισμα λίστας", + "page-languages-filter-placeholder": "Πληκτρολογήστε για φιλτράρισμα", + "page-languages-browser-default": "Προεπιλογή περιηγητή", + "page-languages-translated": "μεταφράστηκαν", + "page-languages-words": "λέξεις", + "page-languages-recruit-community": "Βοηθήστε μας να μεταφράσουμε το ethereum.org.", + "langauge-am": "Αμχαρικά", "language-ar": "Αραβικά", "language-az": "Αζερικά", + "langauge-be": "Λευκορωσικά", "language-bg": "Βουλγαρικά", "language-bn": "Μπενγκάλι", + "language-bs": "Βοσνιακά", "language-ca": "Καταλανικά", "language-cs": "Τσεχικά", "language-da": "Δανικά", @@ -32,6 +40,7 @@ "language-hi": "Χίντι", "language-hr": "Κροατικά", "language-hu": "Ουγγρικά", + "language-hy-am": "Αρμενικά", "language-id": "Ινδονησιακά", "language-ig": "Ίγκμπο", "language-it": "Ιταλικά", @@ -39,12 +48,14 @@ "language-ka": "Γεωργιανά", "language-kk": "Καζακικά", "language-km": "Χμερ", + "language-kn": "Κανάντα", "language-ko": "Κορεάτικα", "language-lt": "Λιθουανικά", "language-ml": "Μαλαγιαλαμικά", "language-mr": "Μαράτι", "language-ms": "Μαλαϊκά", "language-nb": "Νορβηγικά", + "language-ne-np": "Νεπαλικά", "language-nl": "Ολλανδικά", "language-pcm": "Νιγηριανά Πίντγκιν", "language-fil": "Φιλιππινεζικά", @@ -58,8 +69,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/el/page-stablecoins.json b/src/intl/el/page-stablecoins.json index 5abb71e6e7c..8b4dbf080a7 100644 --- a/src/intl/el/page-stablecoins.json +++ b/src/intl/el/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/en/common.json index 2776770d91c..a1669ab757e 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -16,12 +16,14 @@ "beacon-chain": "Beacon Chain", "bridges": "Blockchain bridges", "bug-bounty": "Bug bounty", + "build": "Build", + "build-menu": "Build menu", "clear": "Clear", "close": "Close", "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", @@ -32,14 +34,15 @@ "copied": "Copied", "copy": "Copy", "danksharding": "Danksharding", - "dao-page": "Decentralized autonomous organisations (DAOs)", + "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": "Decentralized science (DeSci)", - "defi-page": "Decentralized finance (DeFi)", + "decentralized-science": "DeSci - Decentralized science", + "description": "Description for nav item", + "defi-page": "DeFi - Decentralized finance", "design": "Design", "design-principles": "Design Principles", "devcon": "Devcon", @@ -91,6 +94,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?", @@ -144,10 +148,117 @@ "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 the 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": "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", + "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 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", + "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-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", + "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-research-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", - "nft-page": "Non-fungible tokens (NFTs)", + "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 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", + "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": "NFTs - Non-fungible tokens", "nfts": "NFTs", "no": "No", "on-this-page": "On this page", @@ -155,6 +266,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,8 +278,10 @@ "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)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Run a node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Developer docs", @@ -212,8 +327,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", diff --git a/src/intl/en/glossary.json b/src/intl/en/glossary.json index 5e2d2a9a58f..e49b4164e79 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", @@ -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": "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", diff --git a/src/intl/en/page-dapps.json b/src/intl/en/page-dapps.json index 3c2d8356592..33124ce32ed 100644 --- a/src/intl/en/page-dapps.json +++ b/src/intl/en/page-dapps.json @@ -115,14 +115,12 @@ "page-dapps-dapp-description-rarible": "Create, sell and buy tokenised collectibles.", "page-dapps-dapp-description-rubic": "Cross-Chain tech aggregator for users and dApps.", "page-dapps-dapp-description-sablier": "Stream money in real-time.", - "page-dapps-dapp-description-skiff": "End-to-end encrypted email, calendar, documents, and files that give you the power to communicate freely.", "page-dapps-dapp-description-spatial": "Create your own custom avatar and 3D worlds", "page-dapps-dapp-description-spruce": "Open-source stack to leave control of identity and data where it should be: with users.", "page-dapps-dapp-description-status": "Designed to enable the free flow of information, protect the right to private, secure conversations, and promote the sovereignty of individuals.", "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.", @@ -249,7 +247,6 @@ "page-dapps-set-up-a-wallet-button": "Find wallet", "page-dapps-set-up-a-wallet-description": "A wallet is your “login” for a dapp", "page-dapps-set-up-a-wallet-title": "Set up a wallet", - "page-dapps-skiff-logo-alt": "Skiff logo", "page-dapps-social-button": "Social", "page-dapps-social-description": "These are applications that focus on creating decentralized social networks utilizing decentralized identity technologies where digital identities and social graphs are owned by the users.", "page-dapps-social-title": "Social", @@ -262,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/en/page-languages.json b/src/intl/en/page-languages.json index 53d97878c77..9fd6feea227 100644 --- a/src/intl/en/page-languages.json +++ b/src/intl/en/page-languages.json @@ -11,7 +11,12 @@ "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-default": "Browser default", + "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", diff --git a/src/intl/en/page-layer-2.json b/src/intl/en/page-layer-2.json index d9380cd2c04..1bc7b299858 100644 --- a/src/intl/en/page-layer-2.json +++ b/src/intl/en/page-layer-2.json @@ -2,6 +2,7 @@ "layer-2-arbitrum-note": "Fraud proofs only for whitelisted users, whitelist not open yet", "layer-2-boba-note": "State validation in development", "layer-2-optimism-note": "Fault proofs in development", + "layer-2-base-note": "Fraud proof system is currently under development", "layer-2-metadata-description": "Introduction page to layer 2", "layer-2-hero-title": "Layer 2", "layer-2-hero-header": "Ethereum for everyone", @@ -88,6 +89,7 @@ "layer-2-go-to": "Go to", "layer-2-tools-title": "Tools to be effective on layer 2", "layer-2-tools-l2beat-description": "L2BEAT is a great resource for looking at technical risk assessments of layer 2 projects. We recommend checking out their resources when researching specific layer 2 projects.", + "layer-2-tools-growthepie-description": "Curated analytics about Ethereun layer 2s", "layer-2-tools-l2fees-description": "L2 Fees lets you see the current cost (denominated in USD) for doing transactions on different layer 2s.", "layer-2-tools-chainlist-description": "Chainlist is a great resource for importing network RPC's into supporting wallets. You will find RPC's for layer 2 projects here to help get you connected.", "layer-2-tools-zapper-description": "Manage your entire web3 portfolio from DeFi to NFTs and whatever comes next. Invest in the latest opportunities from one convenient place.", @@ -120,6 +122,7 @@ "arbitrum-description": "Arbitrum One is an Optimistic Rollup that aims to feel exactly like interacting with Ethereum, but with transactions costing a fraction of what they do on L1.", "optimism-description": "Optimism is a fast, simple, and secure EVM-equivalent optimistic rollup. It scales Ethereum's tech while also scaling its values through retroactive public goods funding.", "boba-description": "Boba is an Optimistic Rollup originally forked from Optimism which is a scaling solution that aims to reduce gas fees, improve transaction throughput, and extend the capabilities of smart contracts.", + "base-description": "Base is a secure, low-cost, developer-friendly Ethereum L2 built to bring the next billion users to web3. It is an Ethereum L2, incubated by Coinbase and built on the open-source OP Stack.", "loopring-description": "Loopring's zkRollup L2 solution aims to offer the same security guarantees as Ethereum mainnet, with a big scalability boost: throughput increased by 1000x, and cost reduced to just 0.1% of L1.", "zksync-description": "zkSync is a user-centric zk rollup platform from Matter Labs. It is a scaling solution for Ethereum, already live on Ethereum mainnet. It supports payments, token swaps and NFT minting.", "zkspace-description": "The ZKSpace platform consists of three main parts: a layer 2 AMM DEX utilizing ZK-Rollups technology called ZKSwap, a payment service called ZKSquare, and an NFT marketplace called ZKSea.", diff --git a/src/intl/en/page-stablecoins.json b/src/intl/en/page-stablecoins.json index 9287933aaeb..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%", @@ -63,6 +64,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-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/en/page-staking.json b/src/intl/en/page-staking.json index 950e31d96bd..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", diff --git a/src/intl/es/common.json b/src/intl/es/common.json index acc9b6c07bf..8a889d2b7d5 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", @@ -31,14 +34,15 @@ "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-applications-dapps": "DApps - Aplicaciones descentralizadas", "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", + "description": "Descripción de un elemento de navegación", + "defi-page": "DeFi - Finanzas descentralizadas", "design": "Diseño", "design-principles": "Principios de diseño", "devcon": "Devcon", @@ -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,10 +147,115 @@ "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": "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", + "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", - "nft-page": "Tókenes no fungibles (NFT)", + "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", "on-this-page": "En esta página", @@ -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,8 +275,10 @@ "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": "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", @@ -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/es/page-dapps.json b/src/intl/es/page-dapps.json index 05da20aaa59..731d920b46f 100644 --- a/src/intl/es/page-dapps.json +++ b/src/intl/es/page-dapps.json @@ -115,14 +115,12 @@ "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-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.", @@ -248,7 +246,6 @@ "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-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", @@ -260,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/es/page-languages.json b/src/intl/es/page-languages.json index 766f0a7d674..953fa7a037b 100644 --- a/src/intl/es/page-languages.json +++ b/src/intl/es/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "¿Quiere ver ethereum.org en otro idioma?", "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", + "page-languages-filter-label": "Lista de filtros", + "page-languages-filter-placeholder": "Escriba el filtro", + "page-languages-browser-default": "Navegador por defecto", + "page-languages-translated": "traducido(s)", + "page-languages-words": "palabras", + "page-languages-recruit-community": "Ayúdenos a traducir ethereum.org.", "langauge-am": "Amárico", "language-ar": "Árabe", "language-az": "Azerbaiyano", diff --git a/src/intl/es/page-stablecoins.json b/src/intl/es/page-stablecoins.json index 5fdcb3f220d..3a58ae6ef51 100644 --- a/src/intl/es/page-stablecoins.json +++ b/src/intl/es/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/fa/common.json index b6a1f944d1f..cda3cd041cc 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-science": "دانش نامتمرکز (دیسای)", - "defi-page": "امور مالی غیر متمرکز (DeFi)", + "decentralized-applications-dapps": "Dapps - برنامه‌های کاربردی غیر متمرکز", + "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,11 +143,115 @@ "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": "اولیه", - "nft-page": "توکن‌های معاوضه‌ناپذیر (NFT)", + "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": "خیر", "on-this-page": "در این صفحه", @@ -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)", + "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/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/fa/page-languages.json b/src/intl/fa/page-languages.json index d4b9ea65d54..e4190ba0c04 100644 --- a/src/intl/fa/page-languages.json +++ b/src/intl/fa/page-languages.json @@ -11,11 +11,18 @@ "page-languages-want-more-header": "آیا می‌‌‌خواهید ethereum.org را به زبان دیگری ببینید؟", "page-languages-want-more-link": "برنامه ترجمه", "page-languages-want-more-paragraph": "مترجمان ethereum.org همیشه در حال ترجمه صفحات به بیش‌ترین زبان ممکن هستند. برای اینکه ببینید در حال حاضر درحال انجام چه‌کاری هستند در مورد ما بخوانید", - "page-languages-filter-placeholder": "فیلتر", + "page-languages-filter-label": "فیلتر کردن لیست", + "page-languages-filter-placeholder": "برای فیلتر کردن، تایپ کنید", + "page-languages-browser-default": "پیش‌فرض مرورگر", + "page-languages-translated": "ترجمه‌شده", + "page-languages-words": "کلمات", + "page-languages-recruit-community": "به ما در ترجمه ethereum.org کمک کنید.", "language-ar": "عربی", "language-az": "آذربایجانی", + "langauge-be": "بلاروسی", "language-bg": "بلغارستانی", "language-bn": "بنگالی", + "language-bs": "بوسنی", "language-ca": "كاتالانی", "language-cs": "چک", "language-da": "دانمارکی", @@ -32,6 +39,7 @@ "language-hi": "هندی", "language-hr": "کرواتی", "language-hu": "مجارستانی", + "language-hy-am": "امریکایی", "language-id": "اندونزیایی", "language-ig": "ایگبو", "language-it": "ایتالیایی", @@ -39,12 +47,14 @@ "language-ka": "گرجستانی", "language-kk": "قزاق", "language-km": "خمری", + "language-kn": "کانادا", "language-ko": "کره‌ای", "language-lt": "لیتوانیایی", "language-ml": "مالايالام‌", "language-mr": "مراتی", "language-ms": "مالزیایی", "language-nb": "نروژی", + "language-ne-np": "اسپانیایی پاناما", "language-nl": "هلندی", "language-pcm": "پیجین نیجریه", "language-fil": "فیلیپینی", @@ -58,8 +68,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/fa/page-stablecoins.json b/src/intl/fa/page-stablecoins.json index 4a2efbe42da..eb9471a72ec 100644 --- a/src/intl/fa/page-stablecoins.json +++ b/src/intl/fa/page-stablecoins.json @@ -63,6 +63,7 @@ "page-stablecoins-bank-apy-source-link": "منبع", "page-stablecoins-bitcoin-pizza": "پیتزای بدنام بیت‌کوینی", "page-stablecoins-bitcoin-pizza-body": "در سال 2010، یک نفر 2 پیتزا را به ارزش 10 هزار بیت کوین خریداری کرد. در آن زمان، ارزش آنها 41 دلار امریکا بود. در بازار امروز، ارزش آنها میلیون‌ها دلار است. تراکنش‌های بسیار زیاد مشابه و پشیمان‌کننده‌ای در تاریخچه اتریوم وجود دارد. پایدارزها این مشکل را حل کرده‌اند، بنابراین شما می‌توانید از پیتزای خود لذت ببرید و اتریوم خود را نگه دارید.", + "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/common.json b/src/intl/fi/common.json index 1541f45340a..ce4e25c185d 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": "Hajautetut sovellukset (dapps)", + "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": "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", + "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": "Hajautettu rahoitus (DeFi)", - "dao-page": "Hajautetut autonomiset organisaatiot (DAO:t)", - "nft-page": "Ei-vaihdettavat poletit (NFT:t)", + "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/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/fi/page-languages.json b/src/intl/fi/page-languages.json index 57836e04e6e..da24b7cef69 100644 --- a/src/intl/fi/page-languages.json +++ b/src/intl/fi/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Haluatko nähdä ethereum.org kieliversioita?", "page-languages-want-more-link": "Käännösohjelma", "page-languages-want-more-paragraph": "Ethereum.orgin kääntäjät työskentelevät kaiken aikaa käännösohjelman parissa eri kielillä. Klikkaa linkkiä, jos haluat nähdä tilannekatsauksen, liittyä käännöstiimiin tai lukea lisää", - "page-languages-filter-placeholder": "Suodatin", + "page-languages-filter-label": "Suodatinlista", + "page-languages-filter-placeholder": "Suodata kirjoittamalla", + "page-languages-browser-default": "Selaimen oletus", + "page-languages-translated": "käännetyt", + "page-languages-words": "sanat", + "page-languages-recruit-community": "Auta meitä kääntämään ethereum.org-sivusto.", + "langauge-am": "Amharic", "language-ar": "arabia", "language-az": "azeri", + "langauge-be": "Belarusian", "language-bg": "bulgaria", "language-bn": "bengali", + "language-bs": "Bosnian", "language-ca": "katalaani", "language-cs": "Tšekki", "language-da": "tanska", @@ -32,6 +40,7 @@ "language-hi": "hindi", "language-hr": "kroatia", "language-hu": "unkari", + "language-hy-am": "Armenian", "language-id": "indonesia", "language-ig": "igbo", "language-it": "Italia", @@ -39,12 +48,14 @@ "language-ka": "georgia", "language-kk": "kazakki", "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "korea", "language-lt": "liettua", "language-ml": "malajalam", "language-mr": "marathi", "language-ms": "malaiji", "language-nb": "norja", + "language-ne-np": "Nepali", "language-nl": "hollanti", "language-pcm": "Nigerian pidgin", "language-fil": "filipino", @@ -58,8 +69,9 @@ "language-sl": "sloveeni", "language-sr": "serbia", "language-sw": "swahili", - "language-th": "thai", "language-ta": "Tamili", + "language-th": "thai", + "language-tk": "Turkmen", "language-tr": "turkki", "language-uk": "ukraina", "language-ur": "urdu", diff --git a/src/intl/fi/page-stablecoins.json b/src/intl/fi/page-stablecoins.json index 288a0dfd1ab..ca0c2f55737 100644 --- a/src/intl/fi/page-stablecoins.json +++ b/src/intl/fi/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/fil/common.json index 10cde6fdca8..86600debbdc 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", @@ -20,14 +29,17 @@ "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-applications-dapps": "Dapps - Mga decentralized application", "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", + "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,11 +140,109 @@ "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": "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", + "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", - "nft-page": "Mga non-fungible token (NFT)", + "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", "on-this-page": "Sa page na ito", @@ -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": "Regenerative finance (ReFi)", - "run-a-node": "Mag-run ng node", + "regenerative-finance": "ReFi - Regenerative finance", + "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/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/fil/page-languages.json b/src/intl/fil/page-languages.json index 369b00839f9..9f05aef7cfc 100644 --- a/src/intl/fil/page-languages.json +++ b/src/intl/fil/page-languages.json @@ -11,11 +11,18 @@ "page-languages-want-more-header": "Gustong makita ang ethereum.org sa ibang wika?", "page-languages-want-more-link": "Translation Program", "page-languages-want-more-paragraph": "Ang mga translator ng ethereum.org ay palaging nagsasalin ng mga page sa lahat ng wikang makakaya. Para makita kung ano ang ginagawa nila ngayon o para mag-sign up para sumali sa kanila, magbasa tungkol sa aming", - "page-languages-filter-placeholder": "Filter", + "page-languages-filter-label": "Listahan ng filter", + "page-languages-filter-placeholder": "Mag-type para i-filter", + "page-languages-browser-default": "Default na browser", + "page-languages-translated": "naisalin", + "page-languages-words": "mga salita", + "page-languages-recruit-community": "Tulungan kaming isalin ang ethereum.org.", "language-ar": "Arabic", "language-az": "Azerbaijani", + "langauge-be": "Belarusian", "language-bg": "Bulgarian", "language-bn": "Bengali", + "language-bs": "Bosnian", "language-ca": "Catalan", "language-cs": "Czech", "language-da": "Danish", @@ -32,6 +39,7 @@ "language-hi": "Hindi", "language-hr": "Croatian", "language-hu": "Hungarian", + "language-hy-am": "Armenian", "language-id": "Indonesian", "language-ig": "Igbo", "language-it": "Italian", @@ -39,12 +47,14 @@ "language-ka": "Georgian", "language-kk": "Kazakh", "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Korean", "language-lt": "Lithuanian", "language-ml": "Malayalam", "language-mr": "Marathi", "language-ms": "Malay", "language-nb": "Norwegian", + "language-ne-np": "Nepali", "language-nl": "Dutch", "language-pcm": "Nigerian Pidgin", "language-fil": "Filipino", @@ -58,8 +68,9 @@ "language-sl": "Slovenian", "language-sr": "Serbian", "language-sw": "Swahili", - "language-th": "Thai", "language-ta": "Tamil", + "language-th": "Thai", + "language-tk": "Turkmen", "language-tr": "Turkish", "language-uk": "Ukrainian", "language-ur": "Urdu", diff --git a/src/intl/fil/page-stablecoins.json b/src/intl/fil/page-stablecoins.json index 2c38ae954a5..7874ec739ab 100644 --- a/src/intl/fil/page-stablecoins.json +++ b/src/intl/fil/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/fr/common.json index 2c50d192156..5cc7cec9341 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é", @@ -31,14 +34,15 @@ "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-applications-dapps": "DApps - Applications décentralisées", "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", + "description": "Description de l'élément de navigation", + "defi-page": "DeFi - Finance décentralisée", "design": "Conception", "design-principles": "Principes de conception", "devcon": "Devcon", @@ -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,10 +147,115 @@ "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": "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", + "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", - "nft-page": "Jetons non fongibles (NFTs)", + "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", "on-this-page": "Sur cette page", @@ -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": "Finance régénérative (ReFi)", - "run-a-node": "Exécuter un nœud", + "regenerative-finance": "ReFi - Finance régénérative", + "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/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-languages.json b/src/intl/fr/page-languages.json index 2165d978b97..56ce62f3a5b 100644 --- a/src/intl/fr/page-languages.json +++ b/src/intl/fr/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "Voulez-vous voir ethereum.org dans une autre langue ?", "page-languages-want-more-link": "Programme de traduction", "page-languages-want-more-paragraph": "Les traducteurs d’ethereum.org traduisent constamment les pages dans le plus de langues possible. Pour voir ce sur quoi ils sont en train de travailler actuellement ou pour les rejoindre, lisez notre", - "page-languages-filter-placeholder": "Filtre", + "page-languages-filter-label": "Liste des filtres", + "page-languages-filter-placeholder": "Écrivez pour filtrer", + "page-languages-browser-default": "Navigateur par défaut", + "page-languages-translated": "traduit", + "page-languages-words": "mots", + "page-languages-recruit-community": "Aidez-nous à traduire ethereum.org.", "langauge-am": "Amharique", "language-ar": "Arabe", "language-az": "Azéri", @@ -50,6 +55,7 @@ "language-mr": "Marathi", "language-ms": "Malais", "language-nb": "Norvégien", + "language-ne-np": "Népalais", "language-nl": "Néerlandais", "language-pcm": "Pidgin Nigérian", "language-fil": "Philippin", diff --git a/src/intl/gl/common.json b/src/intl/gl/common.json index c9db4d8edfb..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": "Aplicacións descentralizadas (dapps)", + "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": "Finanzas descentralizadas (DeFi)", - "dao-page": "Organizacións Autónomas Descentralizadas (DAO en inglés)", - "nft-page": "Tokens non funxibles (NFTs)", + "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/gl/page-languages.json b/src/intl/gl/page-languages.json index 5277d5ee219..1146b6c3a99 100644 --- a/src/intl/gl/page-languages.json +++ b/src/intl/gl/page-languages.json @@ -1,9 +1,32 @@ { + "page-languages-h1": "Soporte de idiomas", + "page-languages-interested": "Interesado en contribuír?", + "page-languages-learn-more": "Saiba máis sobre noso Programa de tradución", + "page-languages-meta-desc": "Recursos para todos os idiomas aceptados en ethereum.org e maneiras de participar como tradutor.", + "page-languages-meta-title": "Traducións de idiomas de ethereum.org", + "page-languages-p1": "Ethereum é un proxecto global e é fundamental que o sitio ethereum.org sexa accesible para todos, independentemente da nacionalidade ou do idioma. A nosa comunidade está a traballar moito para facer isto realidade.", + "page-languages-translations-available": "ethereum.org está dispoñible nos seguintes idiomas", + "page-languages-resources-paragraph": "Ademais de traducir contido de ethereum.org, tamén mantemos unha", + "page-languages-resources-link": "lista coidadosamente elaborada de recursos de Ethereum en diversos idiomas", + "page-languages-want-more-header": "Quere ver ethereum.org noutro idioma?", + "page-languages-want-more-link": "Programa de tradución", + "page-languages-want-more-paragraph": "Os tradutores do ethereum.org están sempre traducindo as páxinas para a maior cantidade de idiomas posibles. Para ver en que están a traballar agora ou inscribise para participar, lea sobre o noso", + "page-languages-filter-label": "Listaxe de filtrado", + "page-languages-filter-placeholder": "Escriba para filtrar", + "page-languages-browser-default": "Opcións predeterminadas do navegador", + "page-languages-translated": "traducido", + "page-languages-words": "palabras", + "page-languages-recruit-community": "Axúdenos a traducir ethereum.org.", + "langauge-am": "Amharic", "language-ar": "Árabe", + "language-az": "Acerbaixano", + "langauge-be": "Belarusian", "language-bg": "Búlgaro", "language-bn": "Bengalí", + "language-bs": "Bosnian", "language-ca": "Catalán", "language-cs": "Checo", + "language-da": "Danés", "language-de": "Alemán", "language-el": "Grego", "language-en": "Inglés", @@ -11,21 +34,31 @@ "language-fa": "Farsi", "language-fi": "Finlandés", "language-fr": "Francés", + "language-gl": "Galego", + "language-gu": "Gujarati", + "language-he": "Hebrew", "language-hi": "Hindi", "language-hr": "Croata", "language-hu": "Húngaro", + "language-hy-am": "Armenian", "language-id": "Indonesio", "language-ig": "Igbo", "language-it": "Italiano", "language-ja": "Xaponés", "language-ka": "Xeorxiano", + "language-kk": "Casaco", + "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Coreano", "language-lt": "Lituano", "language-ml": "Malayalam", "language-mr": "Marathi", "language-ms": "Malaio", "language-nb": "Noruegués", + "language-ne-np": "Nepali", "language-nl": "Neerlandés", + "language-pcm": "Nigerian Pidgin", + "language-fil": "Filipino", "language-pl": "Polaco", "language-pt": "Portugués", "language-pt-br": "Portugués (Brasil)", @@ -36,9 +69,13 @@ "language-sl": "Esloveno", "language-sr": "Serbio", "language-sw": "Suahili", + "language-ta": "Tamil", "language-th": "Tailandés", + "language-tk": "Turkmen", "language-tr": "Turco", "language-uk": "Ucraíno", + "language-ur": "Urdu", + "language-uz": "Uzbek", "language-vi": "Vietnamita", "language-zh": "Chinés simplificado", "language-zh-tw": "Chinés tradicional" diff --git a/src/intl/gl/page-stablecoins.json b/src/intl/gl/page-stablecoins.json index 1f8b7b4982a..4dc7bdb4ef2 100644 --- a/src/intl/gl/page-stablecoins.json +++ b/src/intl/gl/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "Logotipo de MakerDao", "matcha-logo": "Logotipo de Matcha", "oasis-logo": "Logotipo de Oasis", - "uniswap-logo": "Logotipo de Uniswap" + "uniswap-logo": "Logotipo de Uniswap", + "page-stablecoins-category-dashboard-and-education": "Panel de control & Educación" } diff --git a/src/intl/gu/common.json b/src/intl/gu/common.json index 0d62461499d..f36e83f4519 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-science": "વિકેન્દ્રિત વિજ્ઞાન (DeSci)", + "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/gu/page-languages.json b/src/intl/gu/page-languages.json index 57507c5f268..d9ea63528ca 100644 --- a/src/intl/gu/page-languages.json +++ b/src/intl/gu/page-languages.json @@ -1,4 +1,12 @@ { + "page-languages-h1": "ભાષા સમર્થન", + "page-languages-want-more-link": "અનુવાદ કાર્યક્રમ", + "page-languages-filter-label": "ફિલ્ટર યાદી", + "page-languages-filter-placeholder": "ફિલ્ટર કરવા માટે ટાઈપ કરો", + "page-languages-browser-default": "બ્રાઉઝર ડિફૉલ્ટ", + "page-languages-translated": "અનુવાદિત", + "page-languages-words": "શબ્દો", + "page-languages-recruit-community": "ethereum.org નો અનુવાદ કરવામાં અમારી મદદ કરો.", "language-ar": "અરબી", "language-az": "અઝરબૈજાની", "language-bg": "બલ્ગેરિયન", @@ -14,6 +22,8 @@ "language-fi": "ફિનિશ", "language-fr": "ફ્રેન્ચ", "language-gl": "ગેલિશિયન", + "language-gu": "ગુજરાતી", + "language-he": "હીબ્રુ", "language-hi": "હિન્દી", "language-hr": "ક્રોએશિયન", "language-hu": "હંગેરિયન", diff --git a/src/intl/gu/page-stablecoins.json b/src/intl/gu/page-stablecoins.json index ef477457f96..c474682a6ca 100644 --- a/src/intl/gu/page-stablecoins.json +++ b/src/intl/gu/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "MakerDao લોગો", "matcha-logo": "મેચ લોગો", "oasis-logo": "ઓએસિસ લોગો", - "uniswap-logo": "યુનિસ્વેપ લોગો" + "uniswap-logo": "યુનિસ્વેપ લોગો", + "page-stablecoins-category-dashboard-and-education": "ડેશબોર્ડ અને શિક્ષણ" } diff --git a/src/intl/he/common.json b/src/intl/he/common.json index 14fd7ef65cf..6db1b768429 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-science": "מדע מבוזר (DeSci)", + "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/he/page-languages.json b/src/intl/he/page-languages.json index 3030b24e37d..eaceba5be92 100644 --- a/src/intl/he/page-languages.json +++ b/src/intl/he/page-languages.json @@ -1,4 +1,22 @@ { + "page-languages-h1": "תמיכת שפה", + "page-languages-interested": "Interested in contributing?", + "page-languages-learn-more": "Learn more about our Translation Program", + "page-languages-meta-desc": "Resources to all supported languages of ethereum.org and ways to get involved as a translator.", + "page-languages-meta-title": "ethereum.org Language Translations", + "page-languages-p1": "Ethereum is a global project, and it is critical that ethereum.org is accessible to everyone, regardless of their nationality or language. Our community has been working hard to make this vision a reality.", + "page-languages-translations-available": "ethereum.org is available in the following languages", + "page-languages-resources-paragraph": "In addition to translating ethereum.org content, we also maintain a", + "page-languages-resources-link": "curated list of Ethereum resources in many languages", + "page-languages-want-more-header": "Want to see ethereum.org in a different language?", + "page-languages-want-more-link": "קבוצת תירגום", + "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": "רשימת סינון", + "page-languages-filter-placeholder": "הקלד כדי לסנן", + "page-languages-browser-default": "דפדפן ברירת מחדל", + "page-languages-translated": "תורגם", + "page-languages-words": "מילים", + "page-languages-recruit-community": "עזור לנו לתרגם ethereum.org.", "language-ar": "ערבית", "language-az": "אזרביג'אנית", "language-bg": "בולגרית", @@ -43,8 +61,8 @@ "language-sl": "סלובנית", "language-sr": "סרבית", "language-sw": "סווהילי", - "language-th": "תאית", "language-ta": "טמילית", + "language-th": "תאית", "language-tr": "טורקית", "language-uk": "אוקראינית", "language-uz": "אוזבקית", diff --git a/src/intl/he/page-stablecoins.json b/src/intl/he/page-stablecoins.json index 22effe1d946..a08c916c7ac 100644 --- a/src/intl/he/page-stablecoins.json +++ b/src/intl/he/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "לוגו של MakerDao", "matcha-logo": "לוגו של מאתצא", "oasis-logo": "לוגו של אואסיס", - "uniswap-logo": "לוגו של אוניס'אפ" + "uniswap-logo": "לוגו של אוניס'אפ", + "page-stablecoins-category-dashboard-and-education": "לוח מחוונים וחינוך" } diff --git a/src/intl/hi/common.json b/src/intl/hi/common.json index 380a1a58ae8..5c55c097c0c 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": "योगदानकर्ता", @@ -20,14 +32,17 @@ "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)", - "defi-page": "विकेन्द्रीकृत वित्त (DeFi)", + "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,11 +143,113 @@ "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": "प्राथमिक", - "nft-page": "नॉन-फंजिबल टोकन (NFT)", + "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": "नहीं", "on-this-page": "इस पेज पर", @@ -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": "नोड चलाएँ", + "regenerative-finance": "ReFi - रीजेनेरेटिव फाइनेंस", + "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/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/hi/page-languages.json b/src/intl/hi/page-languages.json index a9bb93f9269..bfda746884b 100644 --- a/src/intl/hi/page-languages.json +++ b/src/intl/hi/page-languages.json @@ -11,7 +11,13 @@ "page-languages-want-more-header": "किसी और भाषा में ethereum.org देखना चाहते हैं?", "page-languages-want-more-link": "अनुवाद कार्यक्रम", "page-languages-want-more-paragraph": "ethereum.org अनुवादक हमेशा यथासंभव अधिक भाषाओं में पृष्ठों का अनुवाद कर रहे हैं। यह देखने के लिए कि वे अभी क्या काम कर रहे हैं या उनसे जुड़ने के लिए साइन अप करें, हमारे इसके बारे में पढ़ें", - "page-languages-filter-placeholder": "फ़िल्टर", + "page-languages-filter-label": "फ़िल्टर लिस्ट", + "page-languages-filter-placeholder": "फ़िल्टर करने के लिए टाइप करें", + "page-languages-browser-default": "ब्राउज़र डिफॉल्ट", + "page-languages-translated": "अनुवाद किया गया", + "page-languages-words": "शब्द", + "page-languages-recruit-community": "Ethereum.org का अनुवाद करने में हमारी मदद करें.", + "langauge-am": "Amharic", "language-ar": "अरबी", "language-az": "अज़रबैजानी", "language-bg": "बुल्गेरियाई", @@ -58,8 +64,8 @@ "language-sl": "स्लोवेनियाई", "language-sr": "सर्बियन", "language-sw": "स्वाहिली", - "language-th": "थाई", "language-ta": "तमिल", + "language-th": "थाई", "language-tr": "तुर्की", "language-uk": "यूक्रेनियाई", "language-ur": "उर्दू", diff --git a/src/intl/hi/page-stablecoins.json b/src/intl/hi/page-stablecoins.json index 94034bdfc00..d1be261df25 100644 --- a/src/intl/hi/page-stablecoins.json +++ b/src/intl/hi/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/hr/common.json index 4a6efc85178..f25c8c5119c 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", @@ -31,14 +32,15 @@ "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-applications-dapps": "Dapp-ovi - Decentralizirane aplikacije", "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", + "description": "Opis navigacijske stavke", + "defi-page": "DeFi - Decentralizirane financije", "design": "Dizajn", "design-principles": "Principi dizajna", "devcon": "Devcon", @@ -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,10 +143,105 @@ "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": "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", + "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", - "nft-page": "Nezamjenjivi tokeni (NFT-ovi)", + "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", "on-this-page": "Na ovoj stranici", @@ -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,8 +261,10 @@ "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": "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", @@ -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/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/hr/page-languages.json b/src/intl/hr/page-languages.json index 4aedc61a77d..1553b89cec2 100644 --- a/src/intl/hr/page-languages.json +++ b/src/intl/hr/page-languages.json @@ -6,13 +6,24 @@ "page-languages-meta-title": "ethereum.org prijevodi", "page-languages-p1": "Ethereum je globalni projekt i presudno je da ethereum.org bude dostupan svima, bez obzira na nacionalnost ili jezik. Naša zajednica naporno radi na tome da ova vizija postane stvarnost.", "page-languages-translations-available": "ethereum.org dostupan je na sljedećim jezicima", + "page-languages-resources-paragraph": "Osim prevođenja sadržaja na ethereum.org, također održavamo i", + "page-languages-resources-link": "popis odabranih materijala o Ethereumu na brojnim jezicima", "page-languages-want-more-header": "Želite li vidjeti ethereum.org na drugom jeziku?", "page-languages-want-more-link": "Prevoditeljski program", "page-languages-want-more-paragraph": "prevoditelji ethereum.org-a uvijek prevode stranice na što više jezika. Da biste vidjeli na čemu trenutno rade ili da biste se prijavili da im se pridružite, pročitajte o našoj", + "page-languages-filter-label": "Filtriraj popis", + "page-languages-filter-placeholder": "Počnite pisati da biste filtrirali", + "page-languages-browser-default": "Zadano preglednikom", + "page-languages-translated": "prevedeno", + "page-languages-words": "riječi", + "page-languages-recruit-community": "Pomozite nam prevesti web-mjesto ethereum.org.", + "langauge-am": "Ahmarski", "language-ar": "arapski", "language-az": "Azerbajdžanski", + "langauge-be": "Bjeloruski", "language-bg": "Bugarski", "language-bn": "bengalski", + "language-bs": "Bosanski", "language-ca": "Katalonski", "language-cs": "češki", "language-da": "Danski", @@ -24,21 +35,30 @@ "language-fi": "Finski", "language-fr": "Francuski", "language-gl": "Galicijski", + "language-gu": "Gudžaratski", + "language-he": "Hebrejski", "language-hi": "Hindski", "language-hr": "Hrvatski", "language-hu": "Mađarski", + "language-hy-am": "Armenski", "language-id": "Indonezijski", "language-ig": "Igbo", "language-it": "Talijanski", "language-ja": "Japanski", "language-ka": "Gruzijski", + "language-kk": "Kazaški", + "language-km": "Khmerski", + "language-kn": "Kannada", "language-ko": "Korejski", "language-lt": "Litavski", "language-ml": "Malajalamski", "language-mr": "Marati", "language-ms": "Malajski", "language-nb": "Norveški", + "language-ne-np": "Nepali", "language-nl": "Nizozemski", + "language-pcm": "Nigerijski pidžin", + "language-fil": "Filipinski", "language-pl": "Poljski", "language-pt": "Portugalski", "language-pt-br": "Portugalski (Brazil)", @@ -49,9 +69,13 @@ "language-sl": "Slovenski", "language-sr": "Srpski", "language-sw": "Svahili", + "language-ta": "Tamilski", "language-th": "Tajlandski", + "language-tk": "Turkmenski", "language-tr": "Turski", "language-uk": "Ukrajinski", + "language-ur": "Urdu", + "language-uz": "Uzbečki", "language-vi": "Vijetnamski", "language-zh": "Kineski (pojednostavljen)", "language-zh-tw": "Kineski (tradicionalni)" diff --git a/src/intl/hr/page-stablecoins.json b/src/intl/hr/page-stablecoins.json index 18aae6e6213..5d7613bb0e7 100644 --- a/src/intl/hr/page-stablecoins.json +++ b/src/intl/hr/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/hu/common.json index c7470004b58..0a72019d6bd 100644 --- a/src/intl/hu/common.json +++ b/src/intl/hu/common.json @@ -5,16 +5,18 @@ "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-layer-2s": "2. réteg hozzáadása", "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", @@ -31,14 +33,15 @@ "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-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": "Nem központosított kutatás (DeSci)", - "defi-page": "Decentralizált pénzügy (DeFi)", + "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", "devcon": "Devcon", @@ -76,7 +79,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 +99,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,19 +137,123 @@ "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": "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", + "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", - "nft-page": "Nem felcserélhető tokenek (NFT-k)", + "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", "on-this-page": "Ezen az oldalon", @@ -154,6 +261,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 +273,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": "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", "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 +322,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/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..1a93297472c 100644 --- a/src/intl/hu/page-about.json +++ b/src/intl/hu/page-about.json @@ -22,5 +22,15 @@ "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-dapps.json b/src/intl/hu/page-dapps.json index cd08bb7311c..4badb5cb861 100644 --- a/src/intl/hu/page-dapps.json +++ b/src/intl/hu/page-dapps.json @@ -115,14 +115,12 @@ "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-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.", @@ -248,7 +246,6 @@ "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", @@ -260,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/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", diff --git a/src/intl/hu/page-languages.json b/src/intl/hu/page-languages.json index 88baeb222d1..359ffb33584 100644 --- a/src/intl/hu/page-languages.json +++ b/src/intl/hu/page-languages.json @@ -1,17 +1,22 @@ { "page-languages-h1": "Nyelvi támogatás", - "page-languages-interested": "Szeretnél közreműködni?", - "page-languages-learn-more": "Tudj meg többet a Fordítási Programunkról", - "page-languages-meta-desc": "Források az ethereum.org összes támogatott nyelvéről és a fordítóként való bekapcsolódásról.", + "page-languages-interested": "Szeretne közreműködni?", + "page-languages-learn-more": "Tudjon meg többet a fordítási programunkról", + "page-languages-meta-desc": "Információk az ethereum.org támogatott nyelveiről és a fordítóként való bekapcsolódásról.", "page-languages-meta-title": "ethereum.org Nyelvi Fordítások", "page-languages-p1": "Az Ethereum egy globális projekt, kritikus fontosságú, hogy az ethereum.org mindenki számára elérhető legyen, nemzetiségétől és nyelvtől függetlenül. Közösségünk keményen dolgozott az elképzelés megvalósításán.", - "page-languages-translations-available": "az ethereum.org a következő nyelveken érhető el", + "page-languages-translations-available": "Az ethereum.org a következő nyelveken érhető el", "page-languages-resources-paragraph": "Az ethereum.org tartalmának fordítása mellett", - "page-languages-resources-link": "egy több nyelven is elérhető válogatott listát készítettünk a válogatott Ethereum-anyagokból", - "page-languages-want-more-header": "Szeretnéd az ethereum.org oldalt egy másik nyelven olvasni?", + "page-languages-resources-link": "egy több nyelven is elérhető válogatott listát készítettünk az Ethereum-anyagokból", + "page-languages-want-more-header": "Szeretné az ethereum.org oldalt egy másik nyelven olvasni?", "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ő", + "page-languages-want-more-paragraph": "Az ethereum.org fordítók mindig a lehető legtöbb nyelvre igyekeznek lefordítani az oldalakat. Nézze meg mivel foglalkoznak jelenleg, vagy csatlakozzon munkájukhoz:", + "page-languages-filter-label": "Szűrőlista", + "page-languages-filter-placeholder": "Szűrendő típus", + "page-languages-browser-default": "Böngésző alapértelmezett beállítása", + "page-languages-translated": "lefordítva", + "page-languages-words": "szó", + "page-languages-recruit-community": "Segítsen lefordítani az ethereum.org webhelyet.", "langauge-am": "Amhara", "language-ar": "Arab", "language-az": "Azerbajdzsáni", diff --git a/src/intl/hu/page-stablecoins.json b/src/intl/hu/page-stablecoins.json index 184548303f9..e4bc450e6aa 100644 --- a/src/intl/hu/page-stablecoins.json +++ b/src/intl/hu/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/hy-am/common.json index da82564ef3b..1636546e29b 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": "Աջակցողներ", @@ -20,14 +31,17 @@ "copied": "Պատճենվել է", "copy": "Պատճենել", "danksharding": "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)", - "defi-page": "Ապակենտրոնացված ֆինանսներ (DeFi)", + "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,11 +137,103 @@ "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": "EIPs - Ethereum-ի բարելավման առաջարկներ", + "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": "Առաջնային", - "nft-page": "Չփոխարինելի նշաններ (NFT)", + "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": "Ոչ", "on-this-page": "Այս էջում", @@ -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", + "regenerative-finance": "ՌեՖի - Ռեգեներատիվ ֆինանսներ", "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/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/hy-am/page-languages.json b/src/intl/hy-am/page-languages.json new file mode 100644 index 00000000000..8bbe075c318 --- /dev/null +++ b/src/intl/hy-am/page-languages.json @@ -0,0 +1,8 @@ +{ + "page-languages-filter-label": "Զտիչների ցուցակ", + "page-languages-filter-placeholder": "Մուտքագրեք՝ զտման համար", + "page-languages-browser-default": "Հիմնական զննարկիչ", + "page-languages-translated": "թարգմանված", + "page-languages-words": "բառեր", + "page-languages-recruit-community": "Օգնեք մեզ թարգմանել ethereum.org-ը:" +} diff --git a/src/intl/hy-am/page-stablecoins.json b/src/intl/hy-am/page-stablecoins.json index 28f04ab5754..f942f68d548 100644 --- a/src/intl/hy-am/page-stablecoins.json +++ b/src/intl/hy-am/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/id/common.json index 44654ca12da..45af554f267 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", @@ -20,14 +33,17 @@ "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-applications-dapps": "Dapp - Decentralized applications", "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", + "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,11 +144,117 @@ "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": "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", + "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", - "nft-page": "Token yang tidak dapat dipertukarkan (NFT)", + "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", "on-this-page": "Pada halaman ini", @@ -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,8 +274,10 @@ "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": "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", @@ -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/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/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 5cb812e7932..677324df678 100644 --- a/src/intl/id/page-languages.json +++ b/src/intl/id/page-languages.json @@ -12,10 +12,13 @@ "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-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", @@ -32,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", @@ -39,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", @@ -58,8 +64,9 @@ "language-sl": "Bahasa Slovenia", "language-sr": "Bahasa Serbia", "language-sw": "Bahasa Swahili", - "language-th": "Bahasa Thailand", "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-stablecoins.json b/src/intl/id/page-stablecoins.json index 762e00e1461..6f87068d9a2 100644 --- a/src/intl/id/page-stablecoins.json +++ b/src/intl/id/page-stablecoins.json @@ -63,6 +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-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/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" } diff --git a/src/intl/ig/common.json b/src/intl/ig/common.json index c19527c0a13..6035c22eeb4 100644 --- a/src/intl/ig/common.json +++ b/src/intl/ig/common.json @@ -1,33 +1,48 @@ { - "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", - "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-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": "Sayensị ọtụtụ ndị na achị (DeSci)", - "defi-page": "Ego n'enweghi nchikwa (DeFi)", + "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,12 +141,107 @@ "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": "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", + "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", - "nft-page": "Non-fungible tokin (NFTs)", + "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", "on-this-page": "Na peeji a", @@ -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": "Ego n'enweghi nchikwa (ReFi)", - "run-a-node": "Run a node", - "rollup-component-website": "Website", + "regenerative-finance": "ReFi - Ego n'enweghi nchikwa", "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/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/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", diff --git a/src/intl/ig/page-languages.json b/src/intl/ig/page-languages.json index b7213226ea9..d7d3cae614b 100644 --- a/src/intl/ig/page-languages.json +++ b/src/intl/ig/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Chọrọ ịhụ ethereum.org n'asụsụ dị iche iche?", "page-languages-want-more-link": "Mmemme Ntụgharị Asụsụ", "page-languages-want-more-paragraph": "ndị ntụgharị ethereum.org na-asụgharị ibe mgbe niile n'asụsụ dị ka o kwere mee. Iji hụ ihe ha na-arụ ugbu a ma ọ bụ debanye aha iji sonyere ha, gụọ gbasara anyị", - "page-languages-filter-placeholder": "Yọchaa", + "page-languages-filter-label": "Nzacha ndepụta", + "page-languages-filter-placeholder": "Pịnye iji zachaa", + "page-languages-browser-default": "Ka ihe nchọgharị kwesiri idi", + "page-languages-translated": "sụgharịrị", + "page-languages-words": "okwu", + "page-languages-recruit-community": "Nyere anyị aka ịsụgharị ethereum.org.", + "langauge-am": "Amharic", "language-ar": "Arabic", "language-az": "Azerbaijani", + "langauge-be": "Belarusian", "language-bg": "Bulgarian", "language-bn": "Bengali", + "language-bs": "Bosnian", "language-ca": "Catalan", "language-cs": "Czech", "language-da": "Asụsụ Danish", @@ -32,6 +40,7 @@ "language-hi": "Hindi", "language-hr": "Croatian", "language-hu": "Hungarian", + "language-hy-am": "Armenian", "language-id": "Indonesian", "language-ig": "Igbo", "language-it": "Italian", @@ -39,12 +48,14 @@ "language-ka": "Georgian", "language-kk": "Kazakh", "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Korean", "language-lt": "Lithuanian", "language-ml": "Malayalam", "language-mr": "Asụsụ Marathi", "language-ms": "Malay", "language-nb": "Norwegian", + "language-ne-np": "Nepali", "language-nl": "Dutch", "language-pcm": "Pidgin Naijiria", "language-fil": "Filipino", @@ -58,8 +69,9 @@ "language-sl": "Slovenian", "language-sr": "Serbian", "language-sw": "Asụsụ Swahili", - "language-th": "Asụsụ Thai", "language-ta": "Asụsụ Tamil", + "language-th": "Asụsụ Thai", + "language-tk": "Turkmen", "language-tr": "Turkish", "language-uk": "Ukrainian", "language-ur": "Asụsụ Urdu", diff --git a/src/intl/ig/page-stablecoins.json b/src/intl/ig/page-stablecoins.json index ec34bf7d392..95e3c5803f0 100644 --- a/src/intl/ig/page-stablecoins.json +++ b/src/intl/ig/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/it/common.json index 75d193fe02a..8248fde5c45 100644 --- a/src/intl/it/common.json +++ b/src/intl/it/common.json @@ -1,17 +1,31 @@ { - "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", "bridges": "Ponti della blockchain", + "bug-bounty": "Bug bounty", + "build": "Build", + "build-menu": "Menu build", "clear": "Cancella", "close": "Chiudi", "community": "Community", "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", @@ -20,14 +34,17 @@ "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-applications-dapps": "Dapps - Applicazioni decentralizzate", "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", + "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 +68,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 +103,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 +111,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,11 +145,117 @@ "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": "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", + "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", - "nft-page": "Token non fungibili (NFT)", + "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", "on-this-page": "Su questa pagina", @@ -140,6 +263,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 +275,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": "Finanza Rigenerativa (ReFi)", - "run-a-node": "Esegui un nodo", + "regenerative-finance": "ReFi - Finanza Rigenerativa", + "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 +291,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 +309,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 +320,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 +335,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/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/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-languages.json b/src/intl/it/page-languages.json index 81c2c3ed1cf..0b72b87afba 100644 --- a/src/intl/it/page-languages.json +++ b/src/intl/it/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Vuoi vedere ethereum.org in un'altra lingua?", "page-languages-want-more-link": "Programma di Traduzione", "page-languages-want-more-paragraph": "I traduttori di ethereum.org traducono continuamente le pagine in quante più lingue possibile. Per vedere a cosa stanno lavorando al momento o per iscriversi per unirsi a loro, leggi del nostro", - "page-languages-filter-placeholder": "Filtro", + "page-languages-filter-label": "Elenco dei filtri", + "page-languages-filter-placeholder": "Digita per filtrare", + "page-languages-browser-default": "Impostazione predefinita Browser", + "page-languages-translated": "parole", + "page-languages-words": "tradotte", + "page-languages-recruit-community": "Aiutaci a tradurre ethereum.org.", + "langauge-am": "Amarico", "language-ar": "Arabo", "language-az": "Azero", + "langauge-be": "Bielorusso", "language-bg": "Bulgaro", "language-bn": "Bengali", + "language-bs": "Bosniaco", "language-ca": "Catalano", "language-cs": "Ceco", "language-da": "Danese", @@ -32,6 +40,7 @@ "language-hi": "Hindi", "language-hr": "Croato", "language-hu": "Ungherese", + "language-hy-am": "Armeno", "language-id": "Indonesiano", "language-ig": "Igbo", "language-it": "Italiano", @@ -39,12 +48,14 @@ "language-ka": "Georgiano", "language-kk": "Kazako", "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Coreano", "language-lt": "Lituano", "language-ml": "Malayalam", "language-mr": "Marathi", "language-ms": "Malese", "language-nb": "Norvegese", + "language-ne-np": "Nepalese", "language-nl": "Olandese", "language-pcm": "Pidgin nigeriano", "language-fil": "Filippino", @@ -58,8 +69,9 @@ "language-sl": "Sloveno", "language-sr": "Serbo", "language-sw": "Swahili", - "language-th": "Thailandese", "language-ta": "Tamil", + "language-th": "Thailandese", + "language-tk": "Turkmeno", "language-tr": "Turco", "language-uk": "Ucraino", "language-ur": "Urdu", diff --git a/src/intl/it/page-stablecoins.json b/src/intl/it/page-stablecoins.json index f3ec5e69734..aae500f8acf 100644 --- a/src/intl/it/page-stablecoins.json +++ b/src/intl/it/page-stablecoins.json @@ -63,6 +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-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/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/ja/common.json b/src/intl/ja/common.json index 3028892cb6d..e0e478f950c 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": "貢献者", @@ -20,17 +34,20 @@ "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)", - "defi-page": "分散型金融(DeFi)", + "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,11 +145,117 @@ "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": "プライマリ", - "nft-page": "非代替性トークン(NFT)", + "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": "いいえ", "on-this-page": "このページ", @@ -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,8 +275,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 +291,7 @@ "search-box-blank-state-text": "検索!", "search-eth-address": "これはイーサリアムのアドレスのようですが、アドレスに固有のデータは提供していません。etherscanのようなブロックエクスプローラーで検索してみてください。", "search-no-results": "検索結果はありません。", + "security": "セキュリティ", "single-slot-finality": "シングルスロット・ファイナリティ", "statelessness": "ステートレス", "see-contributors": "貢献者を表示", @@ -172,7 +300,6 @@ "show-all": "すべて表示", "show-less": "少なく表示", "site-description": "イーサリアムは、お金と新しい種類のアプリケーションのためのグローバルな分散型プラットフォームです。 イーサリアムでは、お金を制御するコードを書くことができ、世界中のどこにいてもアクセス可能なアプリケーションを構築できます。", - "site-title": "ethereum.org", "skip-to-main-content": "メインコンテンツへスキップ", "smart-contracts": "スマートコントラクト", "stablecoins": "ステーブルコイン", @@ -181,6 +308,7 @@ "start-here": "ここからスタート", "style-guide": "スタイルガイド", "solo": "ソロステーキング", + "support": "サポート", "terms-of-use": "利用規約", "translation-banner-body-new": "このページはまだ翻訳されていないため、英語で表示されています。このコンテンツの翻訳にご協力ください。", "translation-banner-body-update": "このページの新しいバージョンがありますが、現在は英語のみです。最新バージョンの翻訳にご協力ください。", @@ -191,11 +319,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/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/ja/page-languages.json b/src/intl/ja/page-languages.json index c2b3b685eb7..8819f7244d4 100644 --- a/src/intl/ja/page-languages.json +++ b/src/intl/ja/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "ethereum.orgを他の言語で表示したいですか?", "page-languages-want-more-link": "翻訳プログラム", "page-languages-want-more-paragraph": "ethereum.orgの翻訳者は、常に可能なかぎり多くの言語の翻訳版を作成しています。翻訳作業の現在の進行状況や確認したい場合や、翻訳プロジェクトにサインアップしたい場合は、ethereum.orgの〜をお読みください", - "page-languages-filter-placeholder": "フィルター", + "page-languages-filter-label": "フィルターリスト", + "page-languages-filter-placeholder": "フィルタータイプ", + "page-languages-browser-default": "ブラウザのデフォルト", + "page-languages-translated": "翻訳済", + "page-languages-words": "単語", + "page-languages-recruit-community": "ethereum.orgの翻訳にご協力ください。", + "langauge-am": "アムハラ語", "language-ar": "アラビア語", "language-az": "アゼルバイジャン語", + "langauge-be": "ベラルーシ語", "language-bg": "ブルガリア語", "language-bn": "ベンガル語", + "language-bs": "ボスニア語", "language-ca": "カタロニア語", "language-cs": "チェコ語", "language-da": "デンマーク語", @@ -32,6 +40,7 @@ "language-hi": "ヒンディー語", "language-hr": "クロアチア語", "language-hu": "ハンガリー語", + "language-hy-am": "アルメニア語", "language-id": "インドネシア語", "language-ig": "イボ語", "language-it": "イタリア語", @@ -39,12 +48,14 @@ "language-ka": "グルジア語", "language-kk": "カザフ語", "language-km": "クメール語", + "language-kn": "カンナダ語", "language-ko": "韓国語", "language-lt": "リトアニア語", "language-ml": "マラヤーラム語", "language-mr": "マラーティー語", "language-ms": "マレー語", "language-nb": "ノルウェー語", + "language-ne-np": "ネパール語", "language-nl": "オランダ語", "language-pcm": "ピジン語(ナイジェリア)", "language-fil": "フィリピン語", @@ -58,8 +69,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/ja/page-stablecoins.json b/src/intl/ja/page-stablecoins.json index dab0107e5b3..62c0d27f2f8 100644 --- a/src/intl/ja/page-stablecoins.json +++ b/src/intl/ja/page-stablecoins.json @@ -63,6 +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-dashboard-and-education": "ダッシュボード&教育", "page-stablecoins-coin-price-change": "コインの価格変更(直近30日間)", "page-stablecoins-crypto-backed": "暗号資産の裏付け", "page-stablecoins-crypto-backed-con-1": "不換紙幣担保型のステーブルコインよりも低い安定性。", 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": "アップグレードによる対応の必要性", diff --git a/src/intl/ka/common.json b/src/intl/ka/common.json index 93100bf62e3..4c17c15679e 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-applications-dapps": "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": "დეველოპერების მთავარი", @@ -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": "კვანძის გაშვება", + "regenerative-finance": "ReFi - Რეგენერატიული ფინანსები", + "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/ka/page-languages.json b/src/intl/ka/page-languages.json index 83d6babd844..aa667bad0bb 100644 --- a/src/intl/ka/page-languages.json +++ b/src/intl/ka/page-languages.json @@ -1,4 +1,17 @@ { + "page-languages-h1": "ენის მხარდაჭერა", + "page-languages-interested": "დაინტერესებული ხართ წვლილის შეტანით?", + "page-languages-learn-more": "მეტი შეიტყვეთ ჩვენი თარგმანის პროგრამის შესახებ", + "page-languages-meta-desc": "Resources to all supported languages of ethereum.org and ways to get involved as a translator.", + "page-languages-meta-title": "ethereum.org ენათა თარგმანები", + "page-languages-want-more-header": "გსურთ ნახოთ ethereum.org სხვადასხვა ენაზე?", + "page-languages-want-more-link": "თარგმანის პროგრამა", + "page-languages-filter-label": "ფილტრების სია", + "page-languages-filter-placeholder": "აკრიბეთ დასაფილტრად", + "page-languages-browser-default": "ბრაუზერის ნაგულისხმები", + "page-languages-translated": "გადათარგმნილი", + "page-languages-words": "სიტყვები", + "page-languages-recruit-community": "დაგვეხმარეთ ethereum.org-ის გადათარგმნაში.", "language-ar": "არაბული", "language-az": "აზერბაიჯანული", "language-bg": "ბულგარული", @@ -14,6 +27,7 @@ "language-fi": "ფინური", "language-fr": "ფრანგული", "language-gl": "გალიციური", + "language-he": "Ებრაული", "language-hi": "ინდური", "language-hr": "ხორვატული", "language-hu": "უნგრული", @@ -30,6 +44,7 @@ "language-ms": "მალაიური", "language-nb": "ნორვეგიული", "language-nl": "ჰოლანდიური", + "language-pcm": "ნიგერიული პიჯინი", "language-fil": "ფილიპინური", "language-pl": "პოლონური", "language-pt": "პორტუგალიური", @@ -44,6 +59,7 @@ "language-th": "ტაილანდური", "language-tr": "თურქული", "language-uk": "უკრაინული", + "language-ur": "ურდუ", "language-vi": "ვიეტნამური", "language-zh": "ჩინური გამარტივებული", "language-zh-tw": "ჩინური ტრადიციული" diff --git a/src/intl/ka/page-stablecoins.json b/src/intl/ka/page-stablecoins.json index 37aa081de28..2b058114cd3 100644 --- a/src/intl/ka/page-stablecoins.json +++ b/src/intl/ka/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "MakerDao-ს ლოგო", "matcha-logo": "Matcha-ს ლოგო", "oasis-logo": "Oasis -ის ლოგო", - "uniswap-logo": "Uniswap-ის ლოგო" + "uniswap-logo": "Uniswap-ის ლოგო", + "page-stablecoins-category-dashboard-and-education": "პანელი & განათლება" } diff --git a/src/intl/kk/common.json b/src/intl/kk/common.json index 820eaef73b3..372ed9d0e09 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-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": "EIP - Ethereum жетілдіру ұсыныстары", + "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/kk/page-languages.json b/src/intl/kk/page-languages.json index ade331af029..d7b234ba390 100644 --- a/src/intl/kk/page-languages.json +++ b/src/intl/kk/page-languages.json @@ -1,4 +1,14 @@ { + "page-languages-h1": "Тіл қолдау", + "page-languages-interested": "Үлес қосқыңыз келе ме?", + "page-languages-learn-more": "Аударма бағдарламасы туралы көбірек біліңіз", + "page-languages-meta-desc": "ethereum.org қолдайтын барлық тіл ресурсы және аудармашы ретінде үлес қосу жолдары.", + "page-languages-meta-title": "ethereum.org тіл аудармалары", + "page-languages-p1": "Ethereum — бұл жаһандық жоба, және ethereum.org сайтының ұлт немесе тілге қарамастан, бәріне қолжетімді болғандығы өте маңызды. Қауымдастығымыз бұл пікірді жүзеге асыру үшін бар ыждаһатын салады.", + "page-languages-translations-available": "ethereum.org келесі тілдерде қолжетімді", + "page-languages-want-more-header": "ethereum.org-ті басқа тілде көргіңіз келе ме?", + "page-languages-want-more-link": "Аударма бағдарламасы", + "page-languages-want-more-paragraph": "ethereum.org аудармашылары беттерді әрқашан мүмкін болғанша көп тілге аударады. Олар қазіргі кезде немен жұмыс істеп жүргенін көргіңіз келсе, немесе оларға қосылу үшін тіркелгіңіз келсе, мұны оқыңыз:", "language-ar": "Араб", "language-az": "Әзірбайжан", "language-bg": "Болгар", diff --git a/src/intl/kk/page-stablecoins.json b/src/intl/kk/page-stablecoins.json index 1b369566086..bcea87baaff 100644 --- a/src/intl/kk/page-stablecoins.json +++ b/src/intl/kk/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "MakerDao логотипі", "matcha-logo": "Matcha логотипі", "oasis-logo": "Oasis логотипі", - "uniswap-logo": "Uniswap логотипі" + "uniswap-logo": "Uniswap логотипі", + "page-stablecoins-category-dashboard-and-education": "Қасымдық тақтасы және оқу" } diff --git a/src/intl/km/common.json b/src/intl/km/common.json index 2154e3d01a6..bf7597404f5 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": "អ្នករួមចំណែក", @@ -20,14 +30,17 @@ "copied": "បានចម្លង", "copy": "ចម្លង", "danksharding": "Danksharding", - "dao-page": "អង្គការស្វយ័តវិមជ្ឈការ (DAOs)", + "dao-page": "DAOs - អង្គការស្វយ័តវិមជ្ឈការ", "dark-mode": "ងងឹត", "data-provided-by": "ប្រភពទិន្នន័យ៖", - "decentralized-applications-dapps": "កម្មវិធីវិមជ្ឈការ (dapps)", + "decentralized-applications-dapps": "Dapps - កម្មវិធីវិមជ្ឈការ", "decentralized-identity": "អត្តសញ្ញាណវិមជ្ឈការ", "decentralized-social-networks": "បណ្តាញសង្គមវិមជ្ឈការ", - "decentralized-science": "វិទ្យាសាស្ត្រវិមជ្ឈការ (DeSci)", - "defi-page": "ហិរញ្ញវត្ថុវិមជ្ឈការ (DeFi)", + "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,11 +139,104 @@ "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": "EIP - សំណើកែលម្អ Ethereum", + "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": "បឋម", - "nft-page": "ថូខិនដែលមិនអាចផ្លាស់ប្តូរបាន (NFTs)", + "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": "ទេ", "on-this-page": "នៅលើទំព័រនេះ", @@ -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", + "regenerative-finance": "ReFi - ហិរញ្ញវត្ថុបង្កើតឡើងវិញ", + "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/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/km/page-languages.json b/src/intl/km/page-languages.json index fa592058ec4..7387e58d46e 100644 --- a/src/intl/km/page-languages.json +++ b/src/intl/km/page-languages.json @@ -1,19 +1,39 @@ { - "language-ar": "ភាសាអារ៉ាប់", - "language-az": "ភាសាអាហ្សាបាចានី", + "page-languages-h1": "គាំទ្រភាសា", + "page-languages-interested": "ចាប់អារម្មណ៍ក្នុងការចូលរួមចំណែកមែនទេ?", + "page-languages-learn-more": "ស្វែងយល់បន្ថែមអំពីកម្មវិធីបកប្រែរបស់យើង", + "page-languages-meta-desc": "ធនធានសម្រាប់ភាសាដែលបានគាំទ្រទាំងអស់នៃ ethereum.org និងវិធីដើម្បីចូលរួមធ្វើជាអ្នកបកប្រែ។", + "page-languages-meta-title": "ការបកប្រែភាសារបស់ ethereum.org", + "page-languages-p1": "Ethereum គឺជាគម្រោងសកល ហើយវាជារឿងសំខាន់ដែល ethereum.org គឺអាចចូលប្រើបានសម្រាប់មនុស្សគ្រប់គ្នា ដោយមិនគិតពីសញ្ជាតិ ឬភាសារបស់ពួកគេ។ សហគមន៍របស់យើងបាននិងកំពុងខិតខំប្រឹងប្រែង ដើម្បីធ្វើឱ្យចក្ខុវិស័យនេះក្លាយជាការពិត។", + "page-languages-translations-available": "ethereum.org គឺអាចប្រើប្រាស់បានក្នុងភាសាដូចខាងក្រោម", + "page-languages-resources-paragraph": "បន្ថែមពីលើការបកប្រែមាតិកា ethereum.org យើងក៏រក្សាផងដែរនូវ", + "page-languages-resources-link": "បញ្ជីត្រៀមទុកនៃធនធាន Ethereum ក្នុងភាសាជាច្រើនទៀត", + "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។", + "language-ar": "អារ៉ាប់", + "language-az": "អាស៊ែបៃហ្សង់", "language-bg": "ប៊ុលហ្គារី", "language-bn": "បង់ក្លាដែស", "language-ca": "កាតាឡាន", "language-cs": "ឆេកូ", "language-da": "ដាណឺម៉ាក", "language-de": "អាល្លឺម៉ង់", - "language-el": "ក្រិច", + "language-el": "ក្រិក", "language-en": "អង់គ្លេស", "language-es": "អេស្ប៉ាញ", "language-fa": "ហ្វាស៊ី", "language-fi": "ហ្វាំងឡង់", "language-fr": "បារាំង", "language-gl": "កាលីកហ្សង់", + "language-gu": "ហ្គូចារ៉ា", + "language-he": "ជ្វីហ្វ", "language-hi": "ហិណ្ឌូ", "language-hr": "ក្រូអាត", "language-hu": "ហុងគ្រី", @@ -29,9 +49,10 @@ "language-ml": "ម៉ាឡាយ៉ាឡាម", "language-mr": "​​ម៉ារ៉ាធី", "language-ms": "ម៉ាឡេ", - "language-nb": "ន័រវេ", - "language-nl": "ដាត់ច៍ (ណេឌឺឡែន)", - "language-fil": "ភាសាហ្វីលីពីន", + "language-nb": "ន័រវែស", + "language-nl": "ហូឡង់", + "language-pcm": "នីហ្សេរីយ៉ា", + "language-fil": "ហ្វីលីពីន", "language-pl": "ប៉ូឡូញ", "language-pt": "ព័រទុយហ្គាល់", "language-pt-br": "ព័រទុយហ្គាល់ (ប្រស៊ីល)", @@ -42,11 +63,13 @@ "language-sl": "ស្លូវេនៀ", "language-sr": "ស៊ែប៊ី", "language-sw": "ស្វាហ៊ីលី", + "language-ta": "តាមីល", "language-th": "ថៃ", "language-tr": "ទួរគី", "language-uk": "អ៊ុយក្រែន", - "language-uz": "អ៊ូបែក", + "language-ur": "អ៊ូឌូ", + "language-uz": "អ៊ូសបេគ", "language-vi": "វៀតណាម", - "language-zh": "ភាសាចិនសាមញ្ញ", + "language-zh": "ចិនសាមញ្ញ", "language-zh-tw": "ចិន (បុរាណ)" } diff --git a/src/intl/km/page-stablecoins.json b/src/intl/km/page-stablecoins.json index ce3adf26207..d9f74b3e3df 100644 --- a/src/intl/km/page-stablecoins.json +++ b/src/intl/km/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/kn/common.json index a0c30074f6e..195667f9ae3 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": "ಕೊಡುಗೆದಾರರು", @@ -20,14 +32,17 @@ "copied": "ನಕಲು ಮಾಡಲಾಗಿದೆ", "copy": "ನಕಲು", "danksharding": "ಡ್ಯಾಂಕ್‌ಶಾರ್ಡಿಂಗ್", - "dao-page": "ವಿಕೇಂದ್ರೀಕರಿತ ಸ್ವಯಂಚಾಲಿತ ಸಂಸ್ಥೆಗಳು (ಡಿಎಒಗಳು)", - "dark-mode": "ಕತ್ತಲು / ಅಂಧಕಾರದ", + "dao-page": "ಡಿಎಒಗಳು - ವಿಕೇಂದ್ರೀಕರಿತ ಸ್ವಯಂಚಾಲಿತ ಸಂಸ್ಥೆಗಳು", + "dark-mode": "ಗಾಢ", "data-provided-by": "ಡೇಟಾ ಮೂಲ:", - "decentralized-applications-dapps": "ವಿಕೇಂದ್ರೀಕೃತ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು (dapps)", + "decentralized-applications-dapps": "Dapps - ವಿಕೇಂದ್ರೀಕೃತ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು", "decentralized-identity": "ವಿಕೇಂದ್ರೀಕರಿತ ಗುರುತು", "decentralized-social-networks": "ವಿಕೇಂದ್ರೀಕರಿತ ಸಾಮಾಜಿಕ ಜಾಲಗಳು", - "decentralized-science": "ವಿಕೇಂದ್ರೀಕರಿತ ವಿಜ್ಞಾನ (ಡಿಸೈ)", - "defi-page": "ವಿಕೇಂದ್ರೀಕರಿತ ಹಣಕಾಸು (ಡಿಫೈ)", + "decentralized-science": "ಡಿಸೈ - ವಿಕೇಂದ್ರೀಕರಿತ ವಿಜ್ಞಾನ", + "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,11 +140,106 @@ "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": "ಪ್ರಾಥಮಿಕ", - "nft-page": "ಶಿಲೀಂಧ್ರವಲ್ಲದ ಟೋಕನ್ ಗಳು (NFTs)", + "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": "ಇಲ್ಲ", "on-this-page": "ಈ ಪುಟದಲ್ಲಿ", @@ -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", + "regenerative-finance": "ReFi - ಪುನರುತ್ಪಾದಕ ಹಣಕಾಸು", "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/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/kn/page-languages.json b/src/intl/kn/page-languages.json index 77a6556c921..c7a23c95481 100644 --- a/src/intl/kn/page-languages.json +++ b/src/intl/kn/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "Ethereum.org ಬೇರೆ ಭಾಷೆಯಲ್ಲಿ ನೋಡಲು ಬಯಸುವಿರಾ?", "page-languages-want-more-link": "ಅನುವಾದ ಪ್ರೋಗ್ರಾಂ", "page-languages-want-more-paragraph": "ethereum.org ಅನುವಾದಕರು ಯಾವಾಗಲೂ ಸಾಧ್ಯವಾದಷ್ಟು ಭಾಷೆಗಳಲ್ಲಿ ಪುಟಗಳನ್ನು ಅನುವಾದಿಸುತ್ತಿದ್ದಾರೆ. ಅವರು ಈಗ ಏನು ಕೆಲಸ ಮಾಡುತ್ತಿದ್ದಾರೆಂದು ನೋಡಲು ಅಥವಾ ಅವರೊಂದಿಗೆ ಸೇರಲು ಸೈನ್ ಅಪ್ ಮಾಡಲು, ನಮ್ಮ ಬಗ್ಗೆ ಓದಿ", - "page-languages-filter-placeholder": "ಫಿಲ್ಟರ್‌", + "page-languages-filter-label": "ಫಿಲ್ಟರ್ ಪಟ್ಟಿ", + "page-languages-filter-placeholder": "ಫಿಲ್ಟರ್ ಮಾಡಲು ಟೈಪ್ ಮಾಡಿ", + "page-languages-browser-default": "ಬ್ರೌಸರ್ ಡೀಫಾಲ್ಟ್", + "page-languages-translated": "ಅನುವಾದಿಸಲಾಗಿದೆ", + "page-languages-words": "ಪದಗಳು", + "page-languages-recruit-community": "Ethereum.org ಅನ್ನು ಭಾಷಾಂತರಿಸಲು ನಮಗೆ ಸಹಾಯ ಮಾಡಿ.", "language-ar": "ಅರೇಬಿಕ್", "language-az": "ಅಜರ್ಬೈಜಾನಿ", "language-bg": "ಬಲ್ಗೇರಿಯನ್", @@ -58,8 +63,8 @@ "language-sl": "ಸ್ಲೋವೇನಿಯನ್", "language-sr": "ಸರ್ಬಿಯನ್", "language-sw": "ಸ್ವಾಹಿಲಿ", - "language-th": "ಥಾಯ್", "language-ta": "ತಮಿಳು", + "language-th": "ಥಾಯ್", "language-tr": "Turkish", "language-uk": "ಉಕ್ರೇನಿಯನ್", "language-ur": "ುರ್ದು", diff --git a/src/intl/kn/page-stablecoins.json b/src/intl/kn/page-stablecoins.json index 60218cb0ec2..4cf9c8f8206 100644 --- a/src/intl/kn/page-stablecoins.json +++ b/src/intl/kn/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/ko/common.json index 0fa72c87cc7..6d30712cee8 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/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/ko/page-gas.json b/src/intl/ko/page-gas.json new file mode 100644 index 00000000000..f8b3dba2626 --- /dev/null +++ b/src/intl/ko/page-gas.json @@ -0,0 +1,8 @@ +{ + "page-gas-hero-button-1-content": "가스란 무엇인가요?", + "page-gas-summary-title": "요약", + "page-gas-how-do-i-pay-less-gas-card-3-title": "레이어 2 사용", + "page-gas-advanced": "고급", + "page-gas-faq-question-2-a-2": "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..d77b6080687 100644 --- a/src/intl/ko/page-languages.json +++ b/src/intl/ko/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "ethereum.org를 다른 언어로 확인해 보시겠습니까?", "page-languages-want-more-link": "번역 프로그램", "page-languages-want-more-paragraph": "ethereum.org 번역가는 항상 가능한 많은 언어로 페이지를 번역하고 있습니다. 현재 작업하고 있는 내용을 확인하거나, 참여하기 위해서는 다음 자료를 참조하세요.", - "page-languages-filter-placeholder": "필터", + "page-languages-filter-label": "필터 목록", + "page-languages-filter-placeholder": "필터링할 내용 입력", + "page-languages-browser-default": "기본 브라우저", + "page-languages-translated": "번역됨", + "page-languages-words": "단어", + "page-languages-recruit-community": "ethereum.org를 번역하는 데 도움을 주세요.", + "langauge-am": "암하라어", "language-ar": "아랍어", "language-az": "아제르바이잔어", + "langauge-be": "벨라루스어", "language-bg": "불가리아어", "language-bn": "벵골어", + "language-bs": "보스니아어", "language-ca": "카탈루냐어", "language-cs": "체코어", "language-da": "덴마크어", @@ -32,6 +40,7 @@ "language-hi": "힌디어", "language-hr": "크로아티아어", "language-hu": "헝가리어", + "language-hy-am": "아르메니아어", "language-id": "인도네시아어", "language-ig": "이그보어", "language-it": "이탈리아어", @@ -39,12 +48,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 +69,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-stablecoins.json b/src/intl/ko/page-stablecoins.json index cc665bb68ad..71ffcdf2010 100644 --- a/src/intl/ko/page-stablecoins.json +++ b/src/intl/ko/page-stablecoins.json @@ -63,6 +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-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-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": "필터 초기화" } diff --git a/src/intl/lt/common.json b/src/intl/lt/common.json index 1acb09d4eb8..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": "Decentralizuotos programėlės (dapps'ai)", + "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": "Decentralizuoti finansai (DeFi)", - "dao-page": "Decentralizuotos autonominės organizacijos (DAO)", - "nft-page": "Nekeičiamieji žetonai (NFT)", + "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/lt/page-languages.json b/src/intl/lt/page-languages.json index 6b4b21f7608..72c247c692f 100644 --- a/src/intl/lt/page-languages.json +++ b/src/intl/lt/page-languages.json @@ -1,4 +1,12 @@ { + "page-languages-h1": "Kalbos palaikymas", + "page-languages-want-more-link": "Vertimo programa", + "page-languages-filter-label": "Filtrų sąrašas", + "page-languages-filter-placeholder": "Filtro tipas", + "page-languages-browser-default": "Numatytoji naršyklė", + "page-languages-translated": "išversta", + "page-languages-words": "žodžiai", + "page-languages-recruit-community": "Padėkite mums išversti puslapį ethereum.org.", "language-ar": "Arabų", "language-bg": "Bulgarų", "language-bn": "Bengalų", diff --git a/src/intl/lt/page-stablecoins.json b/src/intl/lt/page-stablecoins.json index 2189e8ee837..78c8a20770b 100644 --- a/src/intl/lt/page-stablecoins.json +++ b/src/intl/lt/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "„MakerDao“ logotipas", "matcha-logo": "„Matcha“ logotipas", "oasis-logo": "„Oasis“ logotipas", - "uniswap-logo": "„Uniswap“ logotipas" + "uniswap-logo": "„Uniswap“ logotipas", + "page-stablecoins-category-dashboard-and-education": "Valdymo skydelis ir švietimas" } diff --git a/src/intl/ml/common.json b/src/intl/ml/common.json index a3362555781..f8d5a84958c 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-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": "EIP-കൾ - Ethereum ഇംപ്രൂവ്മെന്‍റ് പ്രൊപ്പോസലുകള്‍", + "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/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/ml/page-languages.json b/src/intl/ml/page-languages.json index 898956cde1b..41af9e0e1cf 100644 --- a/src/intl/ml/page-languages.json +++ b/src/intl/ml/page-languages.json @@ -6,15 +6,24 @@ "page-languages-meta-title": "ethereum.org ഭാഷാ വിവർത്തനങ്ങൾ", "page-languages-p1": "Ethereum ഒരു ആഗോള പ്രോജക്റ്റാണ്, കൂടാതെ ദേശീയതയോ ഭാഷയോ പരിഗണിക്കാതെ എല്ലാവർക്കും ethereum.org ആക്‌സസ് ചെയ്യാനാകുന്നത് നിർണായകമാണ്. ഈ ദർശനം യാഥാർത്ഥ്യമാക്കാൻ ഞങ്ങളുടെ കമ്മ്യൂണിറ്റി കഠിനമായി പരിശ്രമിക്കുന്നു.", "page-languages-translations-available": "ethereum.org ഇനിപ്പറയുന്ന ഭാഷകളിൽ ലഭ്യമാണ്", + "page-languages-resources-paragraph": "Ethereum.org ഉള്ളടക്കം വിവർത്തനം ചെയ്യുന്നതിനു പുറമേ, ഞങ്ങൾ", + "page-languages-resources-link": "പല ഭാഷകളിലുമുള്ള Ethereum ഉറവിടങ്ങളുടെ ഒരു ക്യൂറേറ്റഡ് ലിസ്റ്റും പരിപാലിക്കുന്നു", "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 വിവർത്തനം ചെയ്യാൻ ഞങ്ങളെ സഹായിക്കുക.", "language-ar": "അറബിക്", "language-az": "അസർബൈജാനി", "language-bg": "ബൾഗേറിയൻ", "language-bn": "ബംഗാളി", "language-ca": "ക്യാറ്റലന്‍", "language-cs": "ചെക്ക്‌", + "language-da": "ഡാനിഷ്", "language-de": "ജര്‍മ്മന്‍", "language-el": "ഗ്രീക്ക്", "language-en": "ഇംഗ്ലീഷ്", @@ -38,6 +47,7 @@ "language-ms": "മലായ്", "language-nb": "നോര്‍വീജിയന്‍", "language-nl": "ഡച്ച്‌", + "language-fil": "ഫിലിപ്പിനോ", "language-pl": "പോളിഷ്", "language-pt": "പോർച്ചുഗീസ്", "language-pt-br": "പോർച്ചുഗീസ് (ബ്രസീലിയൻ)", diff --git a/src/intl/ml/page-stablecoins.json b/src/intl/ml/page-stablecoins.json index 9c0a50ff97f..922f65e317a 100644 --- a/src/intl/ml/page-stablecoins.json +++ b/src/intl/ml/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/mr/common.json index c63f55112a2..9944d5a62bb 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": "योगदानकर्ते", @@ -20,15 +32,18 @@ "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)", - "defi-page": "विकेंद्रीत अर्थव्यवस्था (DeFi)", - "devcon": "डेव्हकॉन", + "decentralized-science": "DeSci - विकेंद्रित विज्ञान", + "description": "एनएव्ही आयटमचे वर्णन", + "defi-page": "DeFi - विकेंद्रीत अर्थव्यवस्था", + "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,11 +140,106 @@ "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": "प्राथमिक", - "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": "इतरांसह सामील होऊन 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": "नाही", "on-this-page": "या पृष्ठावर", @@ -140,6 +247,7 @@ "page-developers-aria-label": "विकसक मेनू", "page-index-meta-title": "मुख्यपृष्ठ", "page-last-updated": "पृष्ठ अखेरचे अद्यतनित", + "participate-menu": "सहभागी मेनू", "pbs": "प्रस्तावक-बिल्डर वेगळे करणे", "pools": "पूल केलेले स्टॅकिंग", "privacy-policy": "गुप्तता धोरण", @@ -150,8 +258,10 @@ "refresh": "कृपया पृष्ठ रीफ्रेश करा.", "return-home": "मुख्यपृष्ठावर परत या", "roadmap": "Ethereum नकाशा", + "research": "संशोधन", + "research-menu": "संशोधन मेनू", "resources": "भाषांतर संसाधने", - "regenerative-finance": "रीजनरेटिव्ह फायनान्स (ReFi)", + "regenerative-finance": "ReFi - रीजनरेटिव्ह फायनान्स", "run-a-node": "एक नोड चालवा", "rollup-component-website": "वेबसाईट", "rollup-component-developer-docs": "विकसक डॉक्स", @@ -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/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/mr/page-languages.json b/src/intl/mr/page-languages.json index ee74a96e0ce..94de22f0b60 100644 --- a/src/intl/mr/page-languages.json +++ b/src/intl/mr/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "ethereum.org वेगळ्या भाषेत पाहू इच्छिता?", "page-languages-want-more-link": "भाषांतर कार्यक्रम", "page-languages-want-more-paragraph": "ethereum.org अनुवादक नेहमी शक्य तितक्या भाषांमध्ये पृष्ठांचे भाषांतर करत असतात. ते सध्या कशावर काम करत आहेत हे पाहण्यासाठी किंवा त्यांच्यात सामील होण्यासाठी साइन अप करण्यासाठी, आमच्याबद्दल वाचा", - "page-languages-filter-placeholder": "फिल्टर करा", + "page-languages-filter-label": "फिल्टर यादी", + "page-languages-filter-placeholder": "फिल्टर करण्यासाठी टाइप करा", + "page-languages-browser-default": "ब्राऊझर डिफॉल्ट", + "page-languages-translated": "भाषांतरित", + "page-languages-words": "शब्द", + "page-languages-recruit-community": "ethereum.org चे भाषांतर करण्यात आम्हाला मदत करा.", "language-ar": "अरेबिक", "language-az": "अझरबैजानी", "language-bg": "बल्गेरियन", @@ -58,8 +63,8 @@ "language-sl": "स्लोवेनियन", "language-sr": "सर्बियन", "language-sw": "स्वाहिली", - "language-th": "थाई", "language-ta": "तमिळ", + "language-th": "थाई", "language-tr": "तुर्किश", "language-uk": "युक्रेनियन", "language-ur": "उर्दू", diff --git a/src/intl/mr/page-stablecoins.json b/src/intl/mr/page-stablecoins.json index b0f7977ea92..7cf97c5d771 100644 --- a/src/intl/mr/page-stablecoins.json +++ b/src/intl/mr/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/ms/common.json index f977fcf3736..e2a0133865f 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", @@ -20,14 +32,17 @@ "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-applications-dapps": "Dapp - Aplikasi tidak berpusat", "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", + "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,11 +143,110 @@ "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": "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", + "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", - "nft-page": "Token yang tidak dapat dipertukarkan (NFT)", + "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", "on-this-page": "Pada halaman ini", @@ -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": "Regenerative finance (ReFi)", - "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/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/ms/page-languages.json b/src/intl/ms/page-languages.json index e9ffffd050f..14d6f85fc0f 100644 --- a/src/intl/ms/page-languages.json +++ b/src/intl/ms/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "Ingin melihat ethereum.org dalam bahasa lain?", "page-languages-want-more-link": "Program Penterjemahan", "page-languages-want-more-paragraph": "Para penterjemah ethereum.org sentiasa menterjemah laman dalam seberapa banyak bahasa yang mungkin. Untuk melihat apa yang mereka usahakan sekarang atau mendaftar untuk menurut serta, sila baca mengenai", - "page-languages-filter-placeholder": "Tapis", + "page-languages-filter-label": "Senarai tapisan", + "page-languages-filter-placeholder": "Taip untuk menapis", + "page-languages-browser-default": "Lalai pelayar", + "page-languages-translated": "diterjemah", + "page-languages-words": "perkataan", + "page-languages-recruit-community": "Bantu kami menterjemah ethereum.org.", "language-ar": "Bahasa Arab", "language-az": "Bahasa Azerbaijan", "language-bg": "Bahasa Bulgaria", @@ -58,8 +63,8 @@ "language-sl": "Bahasa Slovenia", "language-sr": "Bahasa Serbia", "language-sw": "Bahasa Swahili", - "language-th": "Bahasa Thai", "language-ta": "Bahasa Tamil", + "language-th": "Bahasa Thai", "language-tr": "Bahasa Turki", "language-uk": "Bahasa Ukraine", "language-ur": "Bahasa Urdu", diff --git a/src/intl/ms/page-stablecoins.json b/src/intl/ms/page-stablecoins.json index 1874d0cc4a4..1efa60083f1 100644 --- a/src/intl/ms/page-stablecoins.json +++ b/src/intl/ms/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/nb/common.json index ef4c9dacf0a..8c969545fc4 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": "Desentraliserte applikasjoner (dapper)", - "decentralized-science": "Desentralisert vitenskap (DeSci)", + "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": "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å", + "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": "Desentralisert finans (DeFi)", - "dao-page": "Desentraliserte egenstyrte organisasjoner (DAO)", - "nft-page": "Ikke-ombyttelige tokener (NFT)", - "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/nb/page-languages.json b/src/intl/nb/page-languages.json index ac07806a609..f2bbead3fe8 100644 --- a/src/intl/nb/page-languages.json +++ b/src/intl/nb/page-languages.json @@ -1,8 +1,26 @@ { + "page-languages-h1": "Støtte for språk", + "page-languages-interested": "Er du interessert i å bidra?", + "page-languages-learn-more": "Les mer om vårt oversettelsesprogram", + "page-languages-meta-title": "ethereum.org språkoversettelser", + "page-languages-translations-available": "ethereum.org er tilgjengelig på følgende språk", + "page-languages-resources-paragraph": "I tillegg til å oversette ethereum.org innhold, vedlikeholder vi også en", + "page-languages-want-more-header": "Ønsker du å se ethereum.org på et annet språk?", + "page-languages-want-more-link": "Oversettelseprogram", + "page-languages-want-more-paragraph": "ethereum.org-oversettere oversetter alltid sider på så mange språk som mulig. For å se hva de jobber med akkurat nå eller for å registrere deg for å bli med dem, les om vår", + "page-languages-filter-label": "Filtrer liste", + "page-languages-filter-placeholder": "Skriv for å filtrere", + "page-languages-browser-default": "Standard nettleser", + "page-languages-translated": "oversatt", + "page-languages-words": "ord", + "page-languages-recruit-community": "Hjelp oss med å oversette ethereum.org.", + "langauge-am": "Amharisk", "language-ar": "Arabisk", "language-az": "Aserbajdsjansk", + "langauge-be": "Hviterussisk", "language-bg": "Bulgarsk", "language-bn": "Bengalsk", + "language-bs": "Bosnisk", "language-ca": "Katalansk", "language-cs": "Tjekkisk", "language-da": "Dansk", @@ -15,9 +33,11 @@ "language-fr": "Fransk", "language-gl": "Galisisk", "language-gu": "Gujarati", + "language-he": "Hebraisk", "language-hi": "Hindi", "language-hr": "Kroatisk", "language-hu": "Ungarsk", + "language-hy-am": "Armensk", "language-id": "Indonesisk", "language-ig": "Igbo", "language-it": "Italiensk", @@ -25,13 +45,16 @@ "language-ka": "Georgisk", "language-kk": "Kasakhisk", "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Koreansk", "language-lt": "Litauisk", "language-ml": "Malayalam", "language-mr": "Maratii", "language-ms": "Malaysisk", "language-nb": "Norsk", + "language-ne-np": "Nepali", "language-nl": "Nederlandsk", + "language-pcm": "Nigerianske Pidgin", "language-fil": "Filippinsk", "language-pl": "Polsk", "language-pt": "Portugisisk", @@ -43,9 +66,13 @@ "language-sl": "Slovensk", "language-sr": "Serbisk", "language-sw": "Swahili", + "language-ta": "Tamil", "language-th": "Thai", + "language-tk": "Turkmensk", "language-tr": "Tyrkisk", "language-uk": "Ukrainsk", + "language-ur": "Urdu", + "language-uz": "Usbekisk", "language-vi": "Vietnamesisk", "language-zh": "Kinesisk (forenklet)", "language-zh-tw": "Kinesisk (tradisjonell)" diff --git a/src/intl/nb/page-stablecoins.json b/src/intl/nb/page-stablecoins.json index 04e32e9a706..908c99b6037 100644 --- a/src/intl/nb/page-stablecoins.json +++ b/src/intl/nb/page-stablecoins.json @@ -10,5 +10,6 @@ "makerdao-logo": "MakerDao-logo", "matcha-logo": "Matcha-logo", "oasis-logo": "Oasis-logo", - "uniswap-logo": "Uniswap-logo" + "uniswap-logo": "Uniswap-logo", + "page-stablecoins-category-dashboard-and-education": "Dashbord og utdanning" } diff --git a/src/intl/ne-np/common.json b/src/intl/ne-np/common.json index 6e38c282f7b..46d2fe308d3 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": "योगदानकर्ताहरू", @@ -20,14 +30,17 @@ "copied": "प्रतिलिपि गरिएको", "copy": "प्रतिलिपि बनाउनुहोस्", "danksharding": "डैंकसार्डिङ", - "dao-page": "विकेन्द्रीकृत स्वायत्त संस्थाहरू (DAOs)", + "dao-page": "DAOs - विकेन्द्रीकृत स्वायत्त संस्थाहरू", "dark-mode": "अँध्यारो", "data-provided-by": "डाटाको स्रोत:", - "decentralized-applications-dapps": "विकेन्द्रीकृत एप्पहरू (dapps)", + "decentralized-applications-dapps": "Dapps - विकेन्द्रीकृत एप्पहरू", "decentralized-identity": "विकेन्द्रीकृत पहिचान", "decentralized-social-networks": "विकेन्द्रीकृत सामाजिक सञ्जाल", - "decentralized-science": "विकेन्द्रीकृत विज्ञान (DeSci)", - "defi-page": "विकेन्द्रीकृत वित्त (DeFi)", + "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,11 +133,101 @@ "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": "प्राथमिक", - "nft-page": "नन-फन्जिबल टोकन (NFTs)", + "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": "होइन", "on-this-page": "यस पृष्ठमा", @@ -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": "Regenerative finance (ReFi)", - "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/ne-np/page-languages.json b/src/intl/ne-np/page-languages.json new file mode 100644 index 00000000000..1e3c6d7daae --- /dev/null +++ b/src/intl/ne-np/page-languages.json @@ -0,0 +1,8 @@ +{ + "page-languages-filter-label": "फिल्टर सूची", + "page-languages-filter-placeholder": "फिल्टर गर्न टाइप गर्नुहोस्", + "page-languages-browser-default": "ब्राउजर डिफल्ट", + "page-languages-translated": "अनुवाद गरिएको", + "page-languages-words": "शब्दहरू", + "page-languages-recruit-community": "हामीलाई ethereum.org अनुवाद गर्न मद्दत गर्नुहोस्।" +} diff --git a/src/intl/nl/common.json b/src/intl/nl/common.json index 338be03ed4d..2642fb818e6 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", @@ -20,14 +31,17 @@ "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-applications-dapps": "Dapps - Gedecentraliseerde toepassingen", "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", + "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": "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", + "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", - "nft-page": "Niet-vervangbare tokens (NFT's)", + "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,8 +267,10 @@ "refresh": "Ververs de pagina.", "return-home": "terug naar startpagina", "roadmap": "Ethereum-roadmap", + "research": "Onderzoek", + "research-menu": "Onderzoeksmenu", "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", @@ -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/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/nl/page-languages.json b/src/intl/nl/page-languages.json index 151b71673f3..0d1026c769d 100644 --- a/src/intl/nl/page-languages.json +++ b/src/intl/nl/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Wilt u ethereum.org weergeven in een andere taal?", "page-languages-want-more-link": "Vertalingsprogramma", "page-languages-want-more-paragraph": "Vertalers van ethereum.org vertalen altijd pagina's in zoveel mogelijk talen als mogelijk. Om te zien waar ze nu aan werken of om ze te helpen, lees meer over onze", - "page-languages-filter-placeholder": "Filter", + "page-languages-filter-label": "Lijst filteren", + "page-languages-filter-placeholder": "Type om te filteren", + "page-languages-browser-default": "Browserstandaard", + "page-languages-translated": "vertaald", + "page-languages-words": "woorden", + "page-languages-recruit-community": "Help ons ethereum.org te vertalen.", + "langauge-am": "Amhaars", "language-ar": "Arabisch", "language-az": "Azerbaidzjaans", + "langauge-be": "Belarussisch", "language-bg": "Bulgaars", "language-bn": "Bengaals", + "language-bs": "Bosnisch", "language-ca": "Catalaans", "language-cs": "Tsjechisch", "language-da": "Deens", @@ -32,6 +40,7 @@ "language-hi": "Hindi", "language-hr": "Kroatisch", "language-hu": "Hongaars", + "language-hy-am": "Armeens", "language-id": "Indonesisch", "language-ig": "Igbo", "language-it": "Italiaans", @@ -39,12 +48,14 @@ "language-ka": "Georgisch", "language-kk": "Kazachs", "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Koreaans", "language-lt": "Litouws", "language-ml": "Malayalam", "language-mr": "Marathi", "language-ms": "Maleis", "language-nb": "Noors", + "language-ne-np": "Nepali", "language-nl": "Nederlands", "language-pcm": "Nigeriaans Pidgin", "language-fil": "Filipijns", @@ -58,8 +69,9 @@ "language-sl": "Sloveens", "language-sr": "Servisch", "language-sw": "Swahili", - "language-th": "Thais", "language-ta": "Tamil", + "language-th": "Thais", + "language-tk": "Turkmeens", "language-tr": "Turks", "language-uk": "Oekraïens", "language-ur": "Urdu", diff --git a/src/intl/nl/page-stablecoins.json b/src/intl/nl/page-stablecoins.json index 96a8ed8b769..aa4af78e749 100644 --- a/src/intl/nl/page-stablecoins.json +++ b/src/intl/nl/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/pcm/common.json index edf1faa5c6e..8cf9840adb6 100644 --- a/src/intl/pcm/common.json +++ b/src/intl/pcm/common.json @@ -1,17 +1,29 @@ { - "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", "bridges": "Blokchain bridges", + "bug-bounty": "Bug bounty", + "build": "Build", + "build-menu": "Build menu", "clear": "Klear", "close": "Klose", "community": "Komunity", "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", @@ -20,14 +32,17 @@ "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-applications-dapps": "Dapps - Disentralized aplikashons", "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", + "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 +74,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 +97,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 +108,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 +128,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,11 +141,105 @@ "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": "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", + "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", - "nft-page": "Non-fungibol tokens (NFTs)", + "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", "on-this-page": "On dis page", @@ -140,6 +247,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,8 +258,10 @@ "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": "Regenerative finans (ReFi)", + "regenerative-finance": "ReFi - Regenerative finans", "run-a-node": "Run node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Divelopa docs", @@ -164,23 +274,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 +301,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 +316,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/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/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-languages.json b/src/intl/pcm/page-languages.json index 8984b7559bc..fb51e1e3783 100644 --- a/src/intl/pcm/page-languages.json +++ b/src/intl/pcm/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Yu wan si ethereum.org for difren language?", "page-languages-want-more-link": "Translashon program", "page-languages-want-more-paragraph": "ethereum.org transalators dey always dey trasnlate different oages for different languages. to see wetin dem dey work on right now or to join them make you read about our", - "page-languages-filter-placeholder": "Filter", + "page-languages-filter-label": "Mak yu filter di list", + "page-languages-filter-placeholder": "Mak yu type to filter", + "page-languages-browser-default": "Di Browsa default", + "page-languages-translated": "translated", + "page-languages-words": "wods", + "page-languages-recruit-community": "Helep us translat ethereum.org.", + "langauge-am": "Amharic", "language-ar": "Arabic", "language-az": "Azerbaijani", + "langauge-be": "Belarusian", "language-bg": "Bulgarian", "language-bn": "Bengali", + "language-bs": "Bosnian", "language-ca": "Catalan", "language-cs": "Czech", "language-da": "Danish", @@ -32,6 +40,7 @@ "language-hi": "Hindi", "language-hr": "Croatian", "language-hu": "Hungarian", + "language-hy-am": "Armenian", "language-id": "Indonesian", "language-ig": "Igbo", "language-it": "Italian", @@ -39,12 +48,14 @@ "language-ka": "Georgian", "language-kk": "Kazakh", "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Korean", "language-lt": "Lithuanian", "language-ml": "Malayalam", "language-mr": "Marathi", "language-ms": "Malay", "language-nb": "Norwegian", + "language-ne-np": "Nepali", "language-nl": "Dutch", "language-pcm": "Nigerian pidgin", "language-fil": "Filipino", @@ -58,8 +69,9 @@ "language-sl": "Slovenian", "language-sr": "Serbian", "language-sw": "Swahili", - "language-th": "Thai", "language-ta": "Tamil", + "language-th": "Thai", + "language-tk": "Turkmen", "language-tr": "Turkish", "language-uk": "Ukranian", "language-ur": "Urdu", diff --git a/src/intl/pcm/page-stablecoins.json b/src/intl/pcm/page-stablecoins.json index 694632493fe..7fcf16aa21b 100644 --- a/src/intl/pcm/page-stablecoins.json +++ b/src/intl/pcm/page-stablecoins.json @@ -63,6 +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-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/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-what-is-ethereum.json b/src/intl/pcm/page-what-is-ethereum.json index db9b5287c5e..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 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 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?", diff --git a/src/intl/pl/common.json b/src/intl/pl/common.json index 790e36f3b1c..99864fc4670 100644 --- a/src/intl/pl/common.json +++ b/src/intl/pl/common.json @@ -1,33 +1,48 @@ { - "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-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", "bridges": "Mosty blockchain", + "bug-bounty": "Nagrody za błędy", + "build": "Wybuduj", + "build-menu": "Menu budowania", "clear": "Wyczyść", "close": "Zamknij", "community": "Społeczność", "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", "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-applications-dapps": "Dapps - Aplikacje zdecentralizowane", "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", + "description": "Opis elementu nawigacyjnego", + "defi-page": "DeFi - Zdecentralizowane finanse", + "design": "Projekt", + "design-principles": "Zasady projektowania", "devcon": "Devcon", "developers": "Deweloperzy", "developers-home": "Strona główna dla deweloperów", @@ -63,7 +78,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", @@ -83,7 +98,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", @@ -94,11 +109,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,11 +143,115 @@ "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-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": "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", + "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", - "nft-page": "Tokeny niewymienialne (NFT)", + "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-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-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", "on-this-page": "Na tej stronie", @@ -140,6 +259,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", @@ -150,9 +271,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": "Finanse regeneracyjne (ReFi)", - "run-a-node": "Dodaj węzeł", + "regenerative-finance": "ReFi - Finanse regeneracyjne", + "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", @@ -164,7 +287,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 +305,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,20 +316,23 @@ "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ę", + "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/pl/learn-quizzes.json b/src/intl/pl/learn-quizzes.json index 2f4c247b3ef..5a8530cfed6 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 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", @@ -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..f2ca1805fd7 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,18 @@ "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 +140,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 +190,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 +201,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 +218,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,16 +242,23 @@ "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.", "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ą.", @@ -214,11 +272,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..47e6ce3a664 --- /dev/null +++ b/src/intl/pl/page-gas.json @@ -0,0 +1,64 @@ +{ + "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?", + "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ł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, 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 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 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 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 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. 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. 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: 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ż 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", + "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..7ab7d1e4f7b 100644 --- a/src/intl/pl/page-languages.json +++ b/src/intl/pl/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Chcesz zobaczyć ethereum.org w innym języku?", "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", + "page-languages-filter-label": "Lista filtrów", + "page-languages-filter-placeholder": "Wpisz, aby filtrować", + "page-languages-browser-default": "Ustawienie domyślne przeglądarki", + "page-languages-translated": "przetłumaczono", + "page-languages-words": "słowa", + "page-languages-recruit-community": "Pomóż nam tłumaczyć ethereum.org.", + "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 +40,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 +48,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 +69,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..91b5b37faf9 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,42 @@ "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-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.", "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 +83,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 +94,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 +103,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 +129,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", diff --git a/src/intl/pt-br/common.json b/src/intl/pt-br/common.json index 521721f4b67..ac5e901a555 100644 --- a/src/intl/pt-br/common.json +++ b/src/intl/pt-br/common.json @@ -1,17 +1,31 @@ { + "about-ethereum-org": "Sobre o 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", "bridges": "Pontes de “Blockchains”", + "bug-bounty": "Recompensa por bugs", + "build": "Criar", + "build-menu": "Menu Criar", "clear": "Limpar", "close": "Fechar", "community": "Comunidade", "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", @@ -20,14 +34,17 @@ "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-applications-dapps": "Dapps - Aplicativos descentralizados", "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", + "description": "Descrição do item de navegação", + "defi-page": "DeFi - Finanças descentralizadas", + "design": "Visual", + "design-principles": "Princípios do design", "devcon": "Devcon", "developers": "Desenvolvedores", "developers-home": "Página inicial dos desenvolvedores", @@ -51,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", @@ -59,11 +76,11 @@ "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", - "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", @@ -71,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", @@ -83,22 +100,22 @@ "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": "Central de guias", + "guides-hub": "Guias práticos", "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,11 +145,117 @@ "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-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": "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", + "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", - "nft-page": "Tokens não fungíveis (NFTs)", + "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", "on-this-page": "Nesta página", @@ -140,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", @@ -150,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": "Finanças regenerativas (ReFi)", + "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", @@ -164,6 +291,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 +309,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,12 +320,15 @@ "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", + "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", @@ -204,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-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-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-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-languages.json b/src/intl/pt-br/page-languages.json index e0e80ec99a8..e36288f3a11 100644 --- a/src/intl/pt-br/page-languages.json +++ b/src/intl/pt-br/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Quer ver o ethereum.org em um idioma diferente?", "page-languages-want-more-link": "Programa de tradução", "page-languages-want-more-paragraph": "Os tradutores do ethereum.org estão sempre traduzindo as páginas para a maior quantidade de idiomas possíveis. Para ver em que eles estão trabalhando agora ou inscrever-se para participar com eles, leia sobre nosso", - "page-languages-filter-placeholder": "Filtro", + "page-languages-filter-label": "Lista de filtros", + "page-languages-filter-placeholder": "Digite para filtrar", + "page-languages-browser-default": "Navegador padrão", + "page-languages-translated": "traduzido", + "page-languages-words": "palavras", + "page-languages-recruit-community": "Ajude-nos a traduzir ethereum.org.", + "langauge-am": "Amárico", "language-ar": "Árabe", "language-az": "Azerbaidjano", + "langauge-be": "Bielorrusso", "language-bg": "Búlgaro", "language-bn": "Bengalês", + "language-bs": "Bósnio", "language-ca": "Catalão", "language-cs": "Tcheco", "language-da": "Danês", @@ -32,6 +40,7 @@ "language-hi": "Hindi", "language-hr": "Croata", "language-hu": "Húngaro", + "language-hy-am": "Armênio", "language-id": "Indonésio", "language-ig": "Igbo", "language-it": "Italiano", @@ -39,12 +48,14 @@ "language-ka": "Georgiano", "language-kk": "Cazaquistanês", "language-km": "Quemer (khmer)", + "language-kn": "Canarês", "language-ko": "Coreano", "language-lt": "Lituano", "language-ml": "Malaiala", "language-mr": "Marata", "language-ms": "Malaio", "language-nb": "Norueguês", + "language-ne-np": "Nepalês", "language-nl": "Neerlandês", "language-pcm": "Pidgin nigeriano", "language-fil": "Filipino", @@ -58,8 +69,9 @@ "language-sl": "Esloveno", "language-sr": "Sérvio", "language-sw": "Suaíli", - "language-th": "Tailandês", "language-ta": "Tâmil", + "language-th": "Tailandês", + "language-tk": "Turcomeno", "language-tr": "Turco", "language-uk": "Ucraniano", "language-ur": "Urdu", diff --git a/src/intl/pt-br/page-stablecoins.json b/src/intl/pt-br/page-stablecoins.json index 01ebae92a2c..bd5b4bcb156 100644 --- a/src/intl/pt-br/page-stablecoins.json +++ b/src/intl/pt-br/page-stablecoins.json @@ -63,6 +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-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-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/intl/pt/common.json b/src/intl/pt/common.json index d31426c166c..57b6bcb6e36 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", @@ -20,14 +32,16 @@ "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-applications-dapps": "Dapps - Aplicações descentralizadas", "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", + "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,11 +142,109 @@ "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": "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", + "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", - "nft-page": "Tokens não fungíveis (NFTs)", + "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", "on-this-page": "Nesta página", @@ -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": "Finanças regenerativas (ReFi)", + "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/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/pt/page-languages.json b/src/intl/pt/page-languages.json index f258a793dfb..cdf796d7fcc 100644 --- a/src/intl/pt/page-languages.json +++ b/src/intl/pt/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "Quer ver o site ethereum.org numa língua diferente?", "page-languages-want-more-link": "Programa de tradução", "page-languages-want-more-paragraph": "Os tradutores da ethereum.org estão sempre a traduzir páginas em tantas línguas quanto possível. Para ver no que estão a trabalhar agora ou para se inscrever para se juntar a eles, leia sobre os nossos", - "page-languages-filter-placeholder": "Filtrar", + "page-languages-filter-label": "Lista de filtros", + "page-languages-filter-placeholder": "Escreva para filtrar", + "page-languages-browser-default": "Navegador padrão", + "page-languages-translated": "traduzido", + "page-languages-words": "palavras", + "page-languages-recruit-community": "Ajude-nos a traduzir o ethereum.org.", "language-ar": "Árabe", "language-az": "Azerbaijanês", "language-bg": "Búlgaro", @@ -58,8 +63,8 @@ "language-sl": "Esloveno", "language-sr": "Sérvio", "language-sw": "Suaíli", - "language-th": "Tailandês", "language-ta": "Tamil", + "language-th": "Tailandês", "language-tr": "Turco", "language-uk": "Ucraniano", "language-ur": "Urdu", diff --git a/src/intl/pt/page-stablecoins.json b/src/intl/pt/page-stablecoins.json index ed3626b159e..662668d0724 100644 --- a/src/intl/pt/page-stablecoins.json +++ b/src/intl/pt/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/ro/common.json index 47bf5795da8..b8fe5a14951 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", @@ -20,14 +32,17 @@ "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-applications-dapps": "Dapp - Aplicații descentralizate", "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ă", + "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": "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", + "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", - "nft-page": "Tokenuri nefungibile (NFT)", + "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": "Regenerative finance (ReFi)", - "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/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/ro/page-languages.json b/src/intl/ro/page-languages.json index a3758ece518..3052e91e74f 100644 --- a/src/intl/ro/page-languages.json +++ b/src/intl/ro/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "Doriți să afișați ethereum.org într-o altă limbă?", "page-languages-want-more-link": "Programul de traducere", "page-languages-want-more-paragraph": "Traducătorii ethereum.org traduc întotdeauna paginile în cât mai multe limbi posibil. Pentru a vedea la ce lucrează acum sau pentru a vă înscrie în echipa acestora, citiți despre", - "page-languages-filter-placeholder": "Filtrați", + "page-languages-filter-label": "Listă de filtre", + "page-languages-filter-placeholder": "Scrie pentru a filtra", + "page-languages-browser-default": "Browser implicit", + "page-languages-translated": "tradus", + "page-languages-words": "cuvinte", + "page-languages-recruit-community": "Ajută-ne să traducem ethereum.org.", "language-ar": "Arabă", "language-az": "Azeră", "language-bg": "Bulgară", diff --git a/src/intl/ro/page-stablecoins.json b/src/intl/ro/page-stablecoins.json index 001f6b6f12b..cfda8d7dca2 100644 --- a/src/intl/ro/page-stablecoins.json +++ b/src/intl/ro/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/ru/common.json index 9939d346540..a2a008c7543 100644 --- a/src/intl/ru/common.json +++ b/src/intl/ru/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-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": "Соавторы", @@ -20,14 +33,17 @@ "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)", - "defi-page": "Децентрализованные финансы (DeFi)", + "decentralized-science": "DeSci - Децентрализованная наука", + "description": "Описание элемента навигации", + "defi-page": "DeFi - Децентрализованные финансы", + "design": "Дизайн", + "design-principles": "Принципы дизайна", "devcon": "Девкон", "developers": "Разработчикам", "developers-home": "Домашняя страница для разработчиков", @@ -63,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", @@ -94,11 +110,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", @@ -115,7 +131,7 @@ "last-edit": "Последнее редактирование", "layer-2": "Слой 2", "learn": "Обучение", - "learn-by-coding": "Обучение на программировании", + "learn-by-coding": "Учитесь на программировании", "learn-hub": "Учебный центр", "learn-menu": "Меню обучения", "learn-more": "Узнать больше", @@ -128,11 +144,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": "EIP - Предложения по улучшению Ethereum", + "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": "Основной", - "nft-page": "Невзаимозаменяемые токены (NFT)", + "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": "Нет", "on-this-page": "На этой странице", @@ -140,7 +261,9 @@ "page-developers-aria-label": "Меню разработчиков", "page-index-meta-title": "Главная", "page-last-updated": "Последнее обновление страницы", - "pbs": "Разделение автора предложения и разработчика", + "participate": "Участвуйте", + "participate-menu": "Меню участия", + "pbs": "Разделение предлагающих и строителей", "pools": "Объединенный стейкинг", "privacy-policy": "Политика о конфиденциальности", "private-ethereum": "Частный Ethereum", @@ -150,10 +273,12 @@ "refresh": "Обновите страницу.", "return-home": "Вернуться на главную", "roadmap": "Дорожная карта Ethereum", + "research": "Исследования", + "research-menu": "Меню исследований", "resources": "Ресурсы для перевода", - "regenerative-finance": "Регенеративные финансы (ReFi)", + "regenerative-finance": "ReFi - Регенеративные финансы", "run-a-node": "Запуск узла", - "rollup-component-website": "Сайт", + "rollup-component-website": "Вебсайт", "rollup-component-developer-docs": "Документация для разработчиков", "rollup-component-technology-and-risk-summary": "Обзор рисков и технологий", "scaling": "Масштабирование", @@ -164,6 +289,7 @@ "search-box-blank-state-text": "Искать здесь!", "search-eth-address": "Похоже на адрес Ethereum. Мы не предоставляем особые данные для адресов. Попробуйте поискать их в обозревателе блоков, как", "search-no-results": "Поиск не дал результатов", + "security": "Безопасность", "single-slot-finality": "Завершение в одном слоте", "statelessness": "Клиенты, не использующие состояние", "see-contributors": "Посмотреть участников", @@ -175,13 +301,14 @@ "site-title": "ethereum.org", "skip-to-main-content": "Перейти к основному содержанию", "smart-contracts": "Умные контракты", - "stablecoins": "Stablecoins", + "stablecoins": "Стабильные монеты", "stake-eth": "Вложить ETH", "staking": "Ставки", "start-here": "Начните здесь", "style-guide": "Руководство по стилю", "solo": "Одиночный стейкинг", - "terms-of-use": "Условия пользования", + "support": "Поддержка", + "terms-of-use": "Условия использования", "translation-banner-body-new": "Вы просматриваете эту страницу на английском языке, потому что мы еще не перевели ее. Помогите нам перевести эти материалы.", "translation-banner-body-update": "Есть новая версия этой страницы, но пока только на английском языке. Помогите нам перевести последнюю версию.", "translation-banner-button-see-english": "См. английский", @@ -191,11 +318,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": "Кошельки", @@ -203,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/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/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-languages.json b/src/intl/ru/page-languages.json index dd70519a200..74994f59447 100644 --- a/src/intl/ru/page-languages.json +++ b/src/intl/ru/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Хотите просматривать ethereum.org на другом языке?", "page-languages-want-more-link": "Программа перевода", "page-languages-want-more-paragraph": "Переводчики ethereum.org всегда переводят страницы на как можно большее количество языков. Чтобы посмотреть, над чем они сейчас работают, или зарегистрироваться, чтобы присоединиться к ним, прочитайте о нашем", - "page-languages-filter-placeholder": "Фильтр", + "page-languages-filter-label": "Фильтр по списку", + "page-languages-filter-placeholder": "Введите текст для фильтрации", + "page-languages-browser-default": "Браузер по умолчанию", + "page-languages-translated": "переведено", + "page-languages-words": "слова", + "page-languages-recruit-community": "Помогите нам с переводом ethereum.org.", + "langauge-am": "Амхарский", "language-ar": "Арабский", "language-az": "Азербайджанский", + "langauge-be": "Белорусский", "language-bg": "Болгарский", "language-bn": "Бенгальский", + "language-bs": "Боснийский", "language-ca": "Каталанский", "language-cs": "Чешский", "language-da": "Датский", @@ -32,6 +40,7 @@ "language-hi": "Хинди", "language-hr": "Хорватский", "language-hu": "Венгерский", + "language-hy-am": "Армянский", "language-id": "Индонезийский", "language-ig": "Игбо", "language-it": "Итальянский", @@ -39,13 +48,15 @@ "language-ka": "Грузинский", "language-kk": "Казахский", "language-km": "Кхмерский", + "language-kn": "Каннада", "language-ko": "Корейский", "language-lt": "Литовский", "language-ml": "Малаялам", "language-mr": "Маратхи", "language-ms": "Малайский", "language-nb": "Норвежский", - "language-nl": "Нидерландский", + "language-ne-np": "Непальский", + "language-nl": "Голландский", "language-pcm": "Нигерийский пиджин", "language-fil": "Филиппинский", "language-pl": "Польский", @@ -58,8 +69,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/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-stablecoins.json b/src/intl/ru/page-stablecoins.json index 9c70f6b63cf..db08b137618 100644 --- a/src/intl/ru/page-stablecoins.json +++ b/src/intl/ru/page-stablecoins.json @@ -63,6 +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-dashboard-and-education": "Панель инструментов и образование", "page-stablecoins-coin-price-change": "Изменение цены монет (за последние 30 дней)", "page-stablecoins-crypto-backed": "Обеспечено криптовалютой", "page-stablecoins-crypto-backed-con-1": "Менее стабильные, чем фиатные стабильные монеты.", 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": "Сбросить фильтры" } diff --git a/src/intl/se/common.json b/src/intl/se/common.json index 64c07275cc7..346fac1ab7f 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", @@ -20,14 +32,17 @@ "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-applications-dapps": "Dapps - Decentraliserade program", "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", + "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,13 +139,112 @@ "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": "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", + "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", - "nft-page": "Icke-fungibla polletter (NFT)", + "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", "on-this-page": "På denna sida", @@ -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/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/se/page-languages.json b/src/intl/se/page-languages.json index d3e5ff49e3d..a2667712bbd 100644 --- a/src/intl/se/page-languages.json +++ b/src/intl/se/page-languages.json @@ -1,4 +1,22 @@ { + "page-languages-h1": "Språksupport", + "page-languages-interested": "Intresserad av att bidra?", + "page-languages-learn-more": "Lär dig mer om vårt översättningsprogram", + "page-languages-meta-desc": "Resurser till alla språk som stöds av ethereum.org och sätt att engagera sig som översättare.", + "page-languages-meta-title": "ethereum.org översättningar", + "page-languages-p1": "Ethereum är ett globalt projekt, och det är avgörande att ethereum.org är tillgängligt för alla, oavsett nationalitet eller språk. Vårt samhälle har arbetat hårt för göra denna vision till verklighet.", + "page-languages-translations-available": "ethereum.org är tillgänglig på följande språk", + "page-languages-resources-paragraph": "Förutom att översätta ethereum.org-innehåll underhåller vi också en", + "page-languages-resources-link": "kurerad lista över Ethereum-resurser på flera språk", + "page-languages-want-more-header": "Vill du se ethereum.org på ett annat språk?", + "page-languages-want-more-link": "Översättningsprogram", + "page-languages-want-more-paragraph": "ethereum.org-översättare översätter alltid sidor på så många språk som möjligt. För att se vad de jobbar med just nu eller för att registrera dig för att gå med dem, läs om vår", + "page-languages-filter-label": "Filterlista", + "page-languages-filter-placeholder": "Skriv för att filtrera", + "page-languages-browser-default": "Standardwebbläsare", + "page-languages-translated": "översatt", + "page-languages-words": "ord", + "page-languages-recruit-community": "Hjälp oss att översätta ethereum.org.", "language-ar": "Arabiska", "language-az": "Azerbajdzjanska", "language-bg": "Bulgariska", diff --git a/src/intl/se/page-stablecoins.json b/src/intl/se/page-stablecoins.json index da1d5be3aec..f7e3e468c66 100644 --- a/src/intl/se/page-stablecoins.json +++ b/src/intl/se/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/sk/common.json index 7d7e602c70e..fdf669ccb48 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", @@ -20,14 +32,17 @@ "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-applications-dapps": "Dapp - Decentralizované aplikácie", "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", + "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,11 +142,104 @@ "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": "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", + "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", - "nft-page": "Non-fungible tokeny (NFT)", + "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", "on-this-page": "Na tejto stránke", @@ -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": "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", "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/sk/page-languages.json b/src/intl/sk/page-languages.json index 563ec150dae..09a9ff766d0 100644 --- a/src/intl/sk/page-languages.json +++ b/src/intl/sk/page-languages.json @@ -1,4 +1,22 @@ { + "page-languages-h1": "Podpora jazykov", + "page-languages-interested": "Zaujímate sa o možnosť prispieť?", + "page-languages-learn-more": "Dozvedieť sa viac o našom programe prekladania", + "page-languages-meta-desc": "Zdroje k všetkým podporovaným jazykom ethereum.org a možnostiach podieľať sa na prekladoch.", + "page-languages-meta-title": "jazykové preklady ethereum.org", + "page-languages-p1": "Ethereum je globálny projekt a je dôležité, že ethereum.ogr je prístupný komukoľvek, bez ohľadu na národnosť alebo jazyk. Naša komunita dbá na pretavenie tejto vízie do reality.", + "page-languages-translations-available": "ethereum.org je dostupné v nasledujúcich jazykoch", + "page-languages-resources-paragraph": "Navyše na preklad obsahu ethereum.org tiež spravujeme", + "page-languages-resources-link": "zoznam zdrojov Ethereum v mnohých jazykoch", + "page-languages-want-more-header": "Chcete vidieť ethereum.org v inom jazyku?", + "page-languages-want-more-link": "Programe prekladania", + "page-languages-want-more-paragraph": "ethereum.org prekladatelia vždy prekladajú stránky do čo najviac jazykov ako je to možné. Ak chcete vedieť na čom pracujú práve teraz alebo na pripojenie sa k nim, čítajte o našom", + "page-languages-filter-label": "Zoznam filtrov", + "page-languages-filter-placeholder": "Písaním zadajte filter", + "page-languages-browser-default": "Predvolené nastavenie prehliadača", + "page-languages-translated": "preložené", + "page-languages-words": "slová", + "page-languages-recruit-community": "Pomôžte nám preložiť webovú lokalitu ethereum.org.", "language-ar": "Arabčina", "language-bg": "Bulharčina", "language-bn": "Bengálčina", diff --git a/src/intl/sk/page-stablecoins.json b/src/intl/sk/page-stablecoins.json index 09831862478..219ad20b547 100644 --- a/src/intl/sk/page-stablecoins.json +++ b/src/intl/sk/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "Logo MakerDao", "matcha-logo": "Logo Matcha", "oasis-logo": "Logo Oasis", - "uniswap-logo": "Logo Uniswap" + "uniswap-logo": "Logo Uniswap", + "page-stablecoins-category-dashboard-and-education": "Ovládací panel a vzdelávanie" } diff --git a/src/intl/sl/common.json b/src/intl/sl/common.json index 50bdf8c8c13..5baad9fc2a8 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", @@ -20,14 +32,17 @@ "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-applications-dapps": "Dapps - Decentralizirane aplikacije", "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", + "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,11 +143,109 @@ "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": "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", + "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", - "nft-page": "Nezamenljivi žetoni (NFT-ji)", + "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", "on-this-page": "Na tej strani", @@ -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,8 +265,10 @@ "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": "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", @@ -164,6 +281,7 @@ "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", @@ -172,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", @@ -181,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.", @@ -191,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/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/sl/page-languages.json b/src/intl/sl/page-languages.json index 983c9523425..d257c5ba85d 100644 --- a/src/intl/sl/page-languages.json +++ b/src/intl/sl/page-languages.json @@ -6,10 +6,17 @@ "page-languages-meta-title": "Jezikovni prevodi ethereum.org", "page-languages-p1": "Ethereum je globalen projekt in ključno je, da je ethereum.org na voljo vsem ne glede na njihovo narodnost ali jezik. Naša skupnost si močno prizadeva uresničiti to vizijo.", "page-languages-translations-available": "ethereum.org je na voljo v naslednjih jezikih", + "page-languages-resources-paragraph": "Poleg tega, da prevajamo vsebino ethereum.org, prav tako vzdržujemo", + "page-languages-resources-link": "upravljan seznam Ethereum virov v številnih jezikih", "page-languages-want-more-header": "Ali želite ethereum.org v drugem jeziku?", "page-languages-want-more-link": "Program prevajanja", "page-languages-want-more-paragraph": "Prevajalci ethereum.org vedno prevajajo strani v čim več jezikov. Če si želite ogledati, na čem trenutno delajo, ali se želite prijaviti in se jim pridružiti, preberite več o našem", - "page-languages-filter-placeholder": "Filter", + "page-languages-filter-label": "Filtriraj seznam", + "page-languages-filter-placeholder": "Vrsta za filtriranje", + "page-languages-browser-default": "Privzeto v brskalniku", + "page-languages-translated": "prevedeno", + "page-languages-words": "besede", + "page-languages-recruit-community": "Pomagajte nam prevesti ethereum.org.", "language-ar": "Arabščina", "language-az": "Azerbajdžanščina", "language-bg": "Bulgraščina", diff --git a/src/intl/sl/page-stablecoins.json b/src/intl/sl/page-stablecoins.json index 97f037f1ee6..d0f3a480f70 100644 --- a/src/intl/sl/page-stablecoins.json +++ b/src/intl/sl/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/sr/common.json index ad80401aa17..13b4a5d6661 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", @@ -20,14 +32,17 @@ "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-applications-dapps": "Dapps - Decentralizovane aplikacije", "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", + "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": "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", + "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": "Nezamenljivi (NFT) 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,8 +266,10 @@ "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": "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", @@ -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/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/sr/page-languages.json b/src/intl/sr/page-languages.json index 815c2786804..cb7f5a3cca3 100644 --- a/src/intl/sr/page-languages.json +++ b/src/intl/sr/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "Želite da vidite ethereum.org na drugom jeziku?", "page-languages-want-more-link": "Program Prevođenja", "page-languages-want-more-paragraph": "ethereum.org prevodioci uvek prevode stranice na što više jezika moguće. Da biste videli na čemu oni upravo rade ili da bi ste se prijavili da im se pridružite, pročitajte o našem", - "page-languages-filter-placeholder": "Filter", + "page-languages-filter-label": "Lista za filtriranje", + "page-languages-filter-placeholder": "Kucajte da biste filtrirali", + "page-languages-browser-default": "Podrazumevani pregledač", + "page-languages-translated": "prevedeno", + "page-languages-words": "reči", + "page-languages-recruit-community": "Pomozite nam da prevedemo ethereum.org.", "language-ar": "Arapski", "language-az": "Azerbejdžanski", "language-bg": "Bugarski", @@ -58,8 +63,8 @@ "language-sl": "Slovenački", "language-sr": "Srpski", "language-sw": "Svahili", - "language-th": "Tajlandski", "language-ta": "tamilski", + "language-th": "Tajlandski", "language-tr": "Turski", "language-uk": "Ukrajinski", "language-ur": "urdu", diff --git a/src/intl/sr/page-stablecoins.json b/src/intl/sr/page-stablecoins.json index 02b7683819f..aff0efd1c90 100644 --- a/src/intl/sr/page-stablecoins.json +++ b/src/intl/sr/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/sw/common.json index b1f3f07fec7..187a13206b2 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", @@ -20,14 +32,17 @@ "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-applications-dapps": "Dapps - Programu zisizoendeshwa na benki kuu wala serikali", "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", + "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,18 +134,112 @@ "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": "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", + "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", - "nft-page": "Ishara zisizoambukiza (NFTs)", + "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", "on-this-page": "Juu ya ukurasa huu", @@ -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,8 +259,10 @@ "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": "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", @@ -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/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/sw/page-languages.json b/src/intl/sw/page-languages.json index 649ab7ef242..da18abbfd0f 100644 --- a/src/intl/sw/page-languages.json +++ b/src/intl/sw/page-languages.json @@ -11,21 +11,29 @@ "page-languages-want-more-header": "Unataka kuona ethereum.org katika lugha tofauti?", "page-languages-want-more-link": "Programu ya Kutafsiri", "page-languages-want-more-paragraph": "watafsiri wa ethereum.org daima wanatafsiri kurasa katika lugha nyingi iwezekanavyo. Ili kuona kile wanachofanyia kazi hivi sasa au kujiandikisha ili ujiunge nao, soma kuhusu yetu", - "page-languages-filter-placeholder": "Chujio", + "page-languages-filter-label": "Orodha ya vichujio", + "page-languages-filter-placeholder": "Andika kwenye kichujio", + "page-languages-browser-default": "Chaguomsingi la kivinjari", + "page-languages-translated": "imetafsiriwa", + "page-languages-words": "maneno", + "page-languages-recruit-community": "Tusaidie kutafsiri ethereum.org.", "language-ar": "Kiarabu", "language-az": "Kiazerbaijani", "language-bg": "Kibulgaria", "language-bn": "Kibengali", "language-ca": "Kikatalani", "language-cs": "Kicheki", + "language-da": "Kidenishi", "language-de": "Kijerumani", "language-el": "Kigiriki", "language-en": "Kiingereza", - "language-es": "Kiispaniola", + "language-es": "Kihispania", "language-fa": "Kifarsi", "language-fi": "Kifini", "language-fr": "Kifaransa", "language-gl": "Kigalisia", + "language-gu": "Kigujarati", + "language-he": "Kiyahudi", "language-hi": "Kihindi", "language-hr": "Kikroeshia", "language-hu": "Kihungaria", @@ -34,6 +42,8 @@ "language-it": "Kiitaliano", "language-ja": "Kijapani", "language-ka": "Kijojia", + "language-kk": "Kikazakhi", + "language-km": "Kikhmeri", "language-ko": "Kikorea", "language-lt": "Kiluthuania", "language-ml": "Kimalayalam", @@ -41,6 +51,8 @@ "language-ms": "Kimalai", "language-nb": "Kinorwei", "language-nl": "Kiholanzi", + "language-pcm": "Kinigeria pidgin", + "language-fil": "Kifilipino", "language-pl": "Kipoland", "language-pt": "Kireno", "language-pt-br": "Kireno(Cha Kibrazili)", @@ -51,9 +63,12 @@ "language-sl": "Kislovenia", "language-sr": "Kiserbia", "language-sw": "Swahili", + "language-ta": "Kitamili", "language-th": "Kithai", "language-tr": "Kituruki", "language-uk": "Kiyukrenia", + "language-ur": "Kiurdu", + "language-uz": "Kiuzbeki", "language-vi": "Kivietinamu", "language-zh": "Kichina Kilichorahisishwa", "language-zh-tw": "Kichina cha jadi" diff --git a/src/intl/sw/page-stablecoins.json b/src/intl/sw/page-stablecoins.json index b2ffcee7d56..550d9350553 100644 --- a/src/intl/sw/page-stablecoins.json +++ b/src/intl/sw/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/ta/common.json index 86dc3caeac4..67a3482b6c9 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": "பங்களிப்பாளர்கள்", @@ -20,14 +32,17 @@ "copied": "நகலெடுக்கப்பட்டது", "copy": "நகலெடு", "danksharding": "டான்க்ஷார்டிங்", - "dao-page": "பன்முனைப்படுத்தப்பட்ட தன்னாட்சி அமைப்புகள் (DAOs)", + "dao-page": "DAOs - பன்முனைப்படுத்தப்பட்ட தன்னாட்சி அமைப்புகள்", "dark-mode": "அடர்நிறம்", "data-provided-by": "தரவு மூலம்:", - "decentralized-applications-dapps": "பன்முனைச் செயலிகள் (dapps)", + "decentralized-applications-dapps": "Dapps - பன்முனைச் செயலிகள்", "decentralized-identity": "பன்முனைப்படுத்தப்பட்ட அடையாளம்", "decentralized-social-networks": "பன்முனைப்படுத்தப்பட்ட சமூக வலைப்பின்னல்கள்", - "decentralized-science": "பன்முனை அறிவியல் (DeSci)", - "defi-page": "பன்முனைப்படுத்தப்பட்ட நிதி (DeFi)", + "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,11 +141,104 @@ "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": "முதன்மை", - "nft-page": "மாற்ற முடியாத டோக்கன்கள் (NFTs)", + "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": "இல்லை", "on-this-page": "இந்தப் பக்கத்தில்", @@ -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": "Regenerative finance (ReFi)", - "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/ta/page-languages.json b/src/intl/ta/page-languages.json index 527715c614c..50f24fb4783 100644 --- a/src/intl/ta/page-languages.json +++ b/src/intl/ta/page-languages.json @@ -1,4 +1,22 @@ { + "page-languages-h1": "ஆதரிக்கப்பட்ட மொழி", + "page-languages-interested": "பங்களிக்க ஆர்வமா?", + "page-languages-learn-more": "எங்கள் மொழிபெயர்ப்புத் திட்டத்தைப் பற்றி மேலும் அறிக", + "page-languages-meta-desc": "எத்தீரியம்.ஓஆர்ஜி இன் அனைத்து ஆதரிக்கப்படும் மொழிகளுக்கான ஆதாரங்கள் மற்றும் மொழிபெயர்ப்பாளராக ஈடுபடுவதற்கான வழிகள்.", + "page-languages-meta-title": "எத்தீரியம்.ஓஆர்ஜி மொழி மொழிபெயர்ப்புகள்", + "page-languages-p1": "எத்தீரியம் என்பது உலகளாவிய திட்டமாகும், மேலும் எத்தீரியம்.ஓஆர்ஜி என்பது அவர்களின் தேசியம் அல்லது மொழியைப் பொருட்படுத்தாமல் அனைவருக்கும் அணுகக்கூடியது. இந்த பார்வையை நனவாக்க எங்கள் சமூகம் கடுமையாக உழைத்து வருகிறது.", + "page-languages-translations-available": "எத்தீரியம்.ஓஆர்ஜி பின்வரும் மொழிகளில் கிடைக்கிறது", + "page-languages-resources-paragraph": "எத்தீரியம்.ஓஆர்ஜி உள்ளடக்கத்தை மொழிபெயர்ப்பதுடன், நாங்கள் பராமரிக்கிறோம் a", + "page-languages-resources-link": "பல மொழிகளில் எத்தீரியம் வளங்களின் தொகுக்கப்பட்ட பட்டியல்", + "page-languages-want-more-header": "எத்தீரியம்.ஓஆர்ஜி ஐ வேறு மொழியில் பார்க்க வேண்டுமா?", + "page-languages-want-more-link": "மொழிபெயர்ப்புத் திட்டம்", + "page-languages-want-more-paragraph": "எத்தீரியம்.ஓஆர்ஜி மொழிபெயர்ப்பாளர்கள் எப்போதும் முடிந்தவரை பல மொழிகளில் பக்கங்களை மொழிபெயர்த்து வருகின்றனர். அவர்கள் இப்போது என்ன வேலை செய்கிறார்கள் என்பதைப் பார்க்க அல்லது அவர்களுடன் சேர பதிவுபெற, எங்களைப் பற்றி படிக்கவும்", + "page-languages-filter-label": "வடிகட்டிப் பட்டியல்", + "page-languages-filter-placeholder": "வடிகட்டத் தட்டச்சு செய்க", + "page-languages-browser-default": "இயல்புநிலை உலாவி", + "page-languages-translated": "மொழிபெயர்க்கப்பட்டது", + "page-languages-words": "சொற்கள்", + "page-languages-recruit-community": "Ethereum.org-ஐ மொழிபெயர்க்க எங்களுக்கு உதவிடுங்கள்.", "language-ar": "அரபு", "language-az": "அஜர்பைஜானி", "language-bg": "பல்கேரியன்", @@ -14,6 +32,8 @@ "language-fi": "ஃபின்னிஷ்", "language-fr": "ஃபிரெஞ்சு", "language-gl": "கலீசியன்", + "language-gu": "குஜராத்தி", + "language-he": "ஹீப்ரு", "language-hi": "இந்தி", "language-hr": "க்ரொயேஷியன்", "language-hu": "ஹங்கேரியன்", @@ -23,6 +43,7 @@ "language-ja": "ஜப்பனீஸ்", "language-ka": "ஜார்ஜியன்", "language-kk": "கசாக்", + "language-km": "கெமெர்", "language-ko": "கொரியன்", "language-lt": "லிதுவேனியன்", "language-ml": "மலையாளம்", @@ -30,6 +51,7 @@ "language-ms": "மலாய்", "language-nb": "நார்வீஜியன்", "language-nl": "டச்சு", + "language-pcm": "நைஜீரிய பிட்ஜின்", "language-fil": "ஃபிலிப்பினோ", "language-pl": "போலிஷ்", "language-pt": "போர்ச்சுகீஸ்", @@ -41,9 +63,12 @@ "language-sl": "ஸ்லோவீனியன்", "language-sr": "செர்பியன்", "language-sw": "ஸ்வாஹிலி", + "language-ta": "தமிழ்", "language-th": "தாய்", "language-tr": "துருக்கி", "language-uk": "உக்ரேனியன்", + "language-ur": "உருது", + "language-uz": "உஸ்பெக்", "language-vi": "வியட்னாமீஸ்", "language-zh": "எளிமையாக்கப்பட்ட சைனீஸ்", "language-zh-tw": "பாரம்பரிய சைனீஸ்" diff --git a/src/intl/ta/page-stablecoins.json b/src/intl/ta/page-stablecoins.json index a5e0bd06146..987849b0044 100644 --- a/src/intl/ta/page-stablecoins.json +++ b/src/intl/ta/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "MakerDao லோகோ", "matcha-logo": "Matcha லோகோ", "oasis-logo": "Oasis லோகோ", - "uniswap-logo": "Uniswap லோகோ" + "uniswap-logo": "Uniswap லோகோ", + "page-stablecoins-category-dashboard-and-education": "டாஷ்போர்டு & கல்வி" } diff --git a/src/intl/th/common.json b/src/intl/th/common.json index 65ea4470ce0..02921370935 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": "ผู้มีส่วนร่วม", @@ -20,14 +32,17 @@ "copied": "คัดลอกแล้ว", "copy": "คัดลอก", "danksharding": "Danksharding", - "dao-page": "การบริหารองค์กรอัตโนมัติด้วยระบบ Decentralized (DAOs)", + "dao-page": "DAOs - การบริหารองค์กรอัตโนมัติด้วยระบบ Decentralized", "dark-mode": "โหมดมืด", "data-provided-by": "แหล่งข้อมูล:", - "decentralized-applications-dapps": "แอปพลิเคชันไร้ศูนย์กลาง (dApp)", + "decentralized-applications-dapps": "DApp - แอปพลิเคชันไร้ศูนย์กลาง", "decentralized-identity": "ตัวตนแบบกระจายศูนย์", "decentralized-social-networks": "เครือข่ายสังคมแบบกระจายศูนย์", - "decentralized-science": "วิทยาศาสตร์แบบ Decentralized (DeSci)", - "defi-page": "ระบบการเงินแบบ Decentralized (DeFi)", + "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,11 +142,107 @@ "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": "หลัก", - "nft-page": "Non-fungible tokens (NFTs)", + "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": "ไม่", "on-this-page": "ในหน้านี้", @@ -140,6 +250,7 @@ "page-developers-aria-label": "เมนูสำหรับผู้พัฒนา", "page-index-meta-title": "หน้าหลัก", "page-last-updated": "หน้าปรับปรุงล่าสุด", + "participate-menu": "เมนูการมีส่วนร่วม", "pbs": "การแยกผู้เสนอและผู้พัฒนา", "pools": "การ Stake แบบกองรวม", "privacy-policy": "นโยบายความเป็นส่วนตัว", @@ -150,8 +261,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 +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/th/page-languages.json b/src/intl/th/page-languages.json index e5c66cfa710..d5cb3ca3ccb 100644 --- a/src/intl/th/page-languages.json +++ b/src/intl/th/page-languages.json @@ -1,4 +1,22 @@ { + "page-languages-h1": "การสนับสนุนด้านภาษา", + "page-languages-interested": "สนใจร่วมสนับสนุน?", + "page-languages-learn-more": "ศึกษาเพิ่มเติมเกี่ยวกับโปรแกรมแปลภาษาของเรา", + "page-languages-meta-desc": "แหล่งข้อมูลสำหรับภาษาทั้งหมดที่รองรับ ethereum.org และวิธีการเข้าร่วมเป็นนักแปล", + "page-languages-meta-title": "แปลภาษา ethereum.org", + "page-languages-p1": "Ethereum ถือเป็นโปรเจคระดับโลก และ ethereum.org จำเป็นที่จะต้องเข้าถึงได้สำหรับทุกคน ไม่ว่าพวกเขาจะมาจากที่ไหนหรือพูดภาษาใด ชุมชนของเราได้พยายามอย่างเต็มที่เพื่อจะทำให้สิ่งนี้เป็นจริง", + "page-languages-translations-available": "ขณะนี้ ethereum.org รองรับภาษาดังต่อไปนี้", + "page-languages-resources-paragraph": "นอกเหนือจากการแปลเนื้อหาบน ethereum.org เรายังมี", + "page-languages-resources-link": "แหล่งรวมรายละเอียดของอีเธอเรียมในภาษาอื่นๆด้วย", + "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", "language-ar": "อาหรับ", "language-az": "อาเซอร์ไบจาน", "language-bg": "บัลแกเรีย", @@ -14,6 +32,8 @@ "language-fi": "ฟินแลนด์", "language-fr": "ฝรั่งเศส", "language-gl": "กาลิเชียน", + "language-gu": "ภาษาคุชราต", + "language-he": "ฮีบรู", "language-hi": "ฮินดี", "language-hr": "โครเอเชีย", "language-hu": "ฮังการี", @@ -31,6 +51,7 @@ "language-ms": "มลายู", "language-nb": "นอร์เวย์", "language-nl": "ดัตช์", + "language-pcm": "พิดจินไนจีเรีย", "language-fil": "ฟิลิปปินส์", "language-pl": "โปแลนด์", "language-pt": "โปรตุเกส", @@ -42,9 +63,11 @@ "language-sl": "สโลวีเนีย", "language-sr": "เซอร์เบีย", "language-sw": "สวาฮีลี", + "language-ta": "ภาษาทมิฬ", "language-th": "ไทย", "language-tr": "ตุรกี", "language-uk": "ยูเครน", + "language-ur": "อูรดู", "language-uz": "อุซเบก", "language-vi": "เวียดนาม", "language-zh": "จีนตัวย่อ", diff --git a/src/intl/th/page-stablecoins.json b/src/intl/th/page-stablecoins.json index 6c5656ea100..3f099ab2fcf 100644 --- a/src/intl/th/page-stablecoins.json +++ b/src/intl/th/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "โลโก้ MakerDao", "matcha-logo": "โลโก้ Matcha", "oasis-logo": "โลโก้ Oasis", - "uniswap-logo": "โลโก้ Uniswap" + "uniswap-logo": "โลโก้ Uniswap", + "page-stablecoins-category-dashboard-and-education": "แผงควบคุมและการศึกษา" } diff --git a/src/intl/tk/common.json b/src/intl/tk/common.json index d960e8b8e00..7c1a7bd5c9c 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", @@ -20,14 +31,17 @@ "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-applications-dapps": "Dapps - Merkezleşdirilmedik programmalar", "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", + "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,11 +136,102 @@ "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": "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ň", + "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", - "nft-page": "Özara çalşylmaýan tokenler (NFT-lar)", + "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", "on-this-page": "Bu sahypada", @@ -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": "Regenerative finance (ReFi)", "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/tk/page-languages.json b/src/intl/tk/page-languages.json new file mode 100644 index 00000000000..45638394a43 --- /dev/null +++ b/src/intl/tk/page-languages.json @@ -0,0 +1,8 @@ +{ + "page-languages-filter-label": "Süzgüç sanawy", + "page-languages-filter-placeholder": "Süzgüçden geçirmek üçin ýazyň", + "page-languages-browser-default": "Brauzer deslapdan sazlanan", + "page-languages-translated": "terjime edilen", + "page-languages-words": "sözler", + "page-languages-recruit-community": "Ethereum.org websaýtyny terjime etmäge kömek ediň." +} diff --git a/src/intl/tr/common.json b/src/intl/tr/common.json index aac93513867..2f16785dc51 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", @@ -31,14 +34,15 @@ "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-applications-dapps": "Dapps - Merkezi olmayan uygulamalar", "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", + "description": "Gezinme öğesi açıklaması", + "defi-page": "DeFi - Merkezi Olmayan Finans", "design": "Tasarım", "design-principles": "Tasarım İlkeleri", "devcon": "Devcon", @@ -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,11 +146,116 @@ "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": "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ı", + "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", - "nft-page": "Değiştirilemeyen tokenler (NFT'ler)", + "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", "on-this-page": "Bu sayfada", @@ -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,8 +275,10 @@ "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ü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ı", @@ -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/tr/page-dapps.json b/src/intl/tr/page-dapps.json index ff2ed11d378..37194276259 100644 --- a/src/intl/tr/page-dapps.json +++ b/src/intl/tr/page-dapps.json @@ -115,14 +115,12 @@ "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-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.", @@ -248,7 +246,6 @@ "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", @@ -260,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/tr/page-languages.json b/src/intl/tr/page-languages.json index 235f795c731..07c9e1e8dcb 100644 --- a/src/intl/tr/page-languages.json +++ b/src/intl/tr/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Ethereum.org'u farklı bir dilde görmek ister misiniz?", "page-languages-want-more-link": "Çeviri Programı", "page-languages-want-more-paragraph": "ethereum.org çevirmenleri sayfaları her zaman mümkün olduğu kadar çok dilde çevirir. Şu anda ne üzerinde çalıştıklarını görmek veya onlara katılmak üzere kaydolmak için ve hakkımızda okumak için", - "page-languages-filter-placeholder": "Filtrele", + "page-languages-filter-label": "Filtre listesi", + "page-languages-filter-placeholder": "Filtre tipi", + "page-languages-browser-default": "Tarayıcı varsayılanı", + "page-languages-translated": "çevrildi", + "page-languages-words": "kelimeler", + "page-languages-recruit-community": "ethereum.org'u çevirmemize yardımcı olun.", + "langauge-am": "Amharca", "language-ar": "Arapça", "language-az": "Azerice", + "langauge-be": "Belarusça", "language-bg": "Bulgarca", "language-bn": "Bengalce", + "language-bs": "Boşnakça", "language-ca": "Katalanca", "language-cs": "Çekçe", "language-da": "Danca", @@ -32,6 +40,7 @@ "language-hi": "Hintçe", "language-hr": "Hırvatça", "language-hu": "Macarca", + "language-hy-am": "Ermenice", "language-id": "Endonezyaca", "language-ig": "İgbo Dili", "language-it": "İtalyanca", @@ -39,12 +48,14 @@ "language-ka": "Gürcüce", "language-kk": "Kazakça", "language-km": "Kmerce", + "language-kn": "Kannada Dili", "language-ko": "Korece", "language-lt": "Litvanca", "language-ml": "Malayalam Dili", "language-mr": "Marathi Dili", "language-ms": "Malayca", "language-nb": "Norveççe", + "language-ne-np": "Nepal Dili", "language-nl": "Felemenkçe", "language-pcm": "Nigerian Pidgin", "language-fil": "Filipince", @@ -58,8 +69,9 @@ "language-sl": "Slovakça", "language-sr": "Sırpça", "language-sw": "Svahili Dili", - "language-th": "Tai Dili", "language-ta": "Tamilce", + "language-th": "Tai Dili", + "language-tk": "Türkmence", "language-tr": "Türkçe", "language-uk": "Ukraynaca", "language-ur": "Urduca", 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/common.json b/src/intl/uk/common.json index 438ea551078..d1436e5d865 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": "Учасники проекту", @@ -20,14 +34,17 @@ "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)", - "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": "Блог 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,11 +145,117 @@ "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": "EIP - Пропозиції покращення Ethereum", + "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": "Головна", - "nft-page": "Невзаємозамінні токени (NFT)", + "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": "Ні", "on-this-page": "На цій сторінці", @@ -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": "Сайт", + "regenerative-finance": "ReFi - Регенеративні фінанси", + "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/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/uk/page-languages.json b/src/intl/uk/page-languages.json index 37747cfb9d6..4c9a50228ea 100644 --- a/src/intl/uk/page-languages.json +++ b/src/intl/uk/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Хочете перекласти сайт ethereum.org іншою мовою?", "page-languages-want-more-link": "програму перекладів", "page-languages-want-more-paragraph": "Перекладачі прагнуть перекласти сайт ethereum.org на максимально можливу кількість мов. Щоб побачити, над чим вони зараз працюють, або приєднатися до команди, дізнайтеся більше про нашу", - "page-languages-filter-placeholder": "Фільтр", + "page-languages-filter-label": "Список фільтрів", + "page-languages-filter-placeholder": "Введіть, щоб фільтрувати", + "page-languages-browser-default": "Налаштування браузера за замовчуванням", + "page-languages-translated": "перекладено", + "page-languages-words": "слова", + "page-languages-recruit-community": "Допоможіть нам перекласти сайт ethereum.org.", + "langauge-am": "Амхарська", "language-ar": "Арабська", "language-az": "Азербайджанська", + "langauge-be": "Білоруська", "language-bg": "Болгарська", "language-bn": "Бенгальська", + "language-bs": "Боснійська", "language-ca": "Каталонська", "language-cs": "Чеська", "language-da": "Данська", @@ -32,6 +40,7 @@ "language-hi": "Хінді", "language-hr": "Хорватська", "language-hu": "Угорська", + "language-hy-am": "Вірменська", "language-id": "Індонезійська", "language-ig": "Ігбо", "language-it": "Італійська", @@ -39,11 +48,12 @@ "language-ka": "Грузинська", "language-kk": "Казахська", "language-km": "Кхмерська", + "language-kn": "Каннада", "language-ko": "Корейська", "language-lt": "Литовська", - "language-ml": "Малаялам", + "language-ml": "Малайялам", "language-mr": "Маратхі", - "language-ms": "Малайська", + "language-ms": "Малайзійська", "language-nb": "Норвезька", "language-nl": "Нідерландська", "language-pcm": "Нігерійський піджин", @@ -58,8 +68,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/uk/page-stablecoins.json b/src/intl/uk/page-stablecoins.json index 3909f888b8b..f1308a39652 100644 --- a/src/intl/uk/page-stablecoins.json +++ b/src/intl/uk/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/ur/common.json index fcf72b63e7d..9a333c3dfe9 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-science": "غیر مرکزی سائنس (DeSci)", + "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/ur/page-languages.json b/src/intl/ur/page-languages.json index e4f014e1328..2c9ae70869f 100644 --- a/src/intl/ur/page-languages.json +++ b/src/intl/ur/page-languages.json @@ -1,4 +1,11 @@ { + "page-languages-want-more-link": "ترجمہ پروگرام", + "page-languages-filter-label": "فہرست کو فلٹر کریں", + "page-languages-filter-placeholder": "فلٹر کرنے کے لیے ٹائپ کریں", + "page-languages-browser-default": "براؤزر کا ڈیفالٹ", + "page-languages-translated": "ترجمہ شدہ", + "page-languages-words": "الفاظ", + "page-languages-recruit-community": "ethereum.org کا ترجمہ کرنے میں ہماری مدد کریں۔", "language-ar": "عربی", "language-az": "آذربائیجانی", "language-bg": "بلغاریائی", diff --git a/src/intl/ur/page-stablecoins.json b/src/intl/ur/page-stablecoins.json index 467e401f027..60d8664495a 100644 --- a/src/intl/ur/page-stablecoins.json +++ b/src/intl/ur/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "MakerDao لوگو", "matcha-logo": "Matcha لوگو", "oasis-logo": "Oasis لوگو", - "uniswap-logo": "Uniswap لوگو" + "uniswap-logo": "Uniswap لوگو", + "page-stablecoins-category-dashboard-and-education": "Панель управління та освіта" } diff --git a/src/intl/uz/common.json b/src/intl/uz/common.json index 070b7be26b2..5744bf2d01b 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": "Markazlashtirilmagan ilovalar (dapps)", - "decentralized-science": "Decentralized science (DeSci)", + "decentralized-applications-dapps": "Dapps - Markazlashtirilmagan ilovalar", + "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": "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", + "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": "Markazlashmagan moliya (DeFi)", - "dao-page": "Markazlashmagan avtonom tashkilotlar (DAO)", - "nft-page": "Unikal tokenlar (NFT)", - "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" } diff --git a/src/intl/uz/page-languages.json b/src/intl/uz/page-languages.json index e5add898008..c357125373a 100644 --- a/src/intl/uz/page-languages.json +++ b/src/intl/uz/page-languages.json @@ -1,4 +1,12 @@ { + "page-languages-h1": "Til Yordami", + "page-languages-want-more-link": "Tarjima dasturi", + "page-languages-filter-label": "Filtr roʻyxati", + "page-languages-filter-placeholder": "Filtrlash uchun yozing", + "page-languages-browser-default": "Brauzer standarti", + "page-languages-translated": "tarjima qilingan", + "page-languages-words": "soʻzlar", + "page-languages-recruit-community": "Bizga ethereum.org tarjimasiga yordam bering.", "language-ar": "Arab", "language-az": "Ozarbayjon", "language-bg": "Bolgar", diff --git a/src/intl/uz/page-stablecoins.json b/src/intl/uz/page-stablecoins.json index 0ccbb55e11e..d93a2eed41b 100644 --- a/src/intl/uz/page-stablecoins.json +++ b/src/intl/uz/page-stablecoins.json @@ -15,5 +15,6 @@ "makerdao-logo": "MakerDao logotipi", "matcha-logo": "Matcha logotipi", "oasis-logo": "Oasis logotipi", - "uniswap-logo": "Uniswap logotipi" + "uniswap-logo": "Uniswap logotipi", + "page-stablecoins-category-dashboard-and-education": "Boshqarish paneli va ta'lim" } diff --git a/src/intl/vi/common.json b/src/intl/vi/common.json index 6aedca8c844..17f50efa5e3 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", @@ -20,14 +32,17 @@ "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-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": "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", + "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,11 +142,113 @@ "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": "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", + "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", - "nft-page": "Non-Fungible Token (NFT)", + "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", "on-this-page": "Trên trang này", @@ -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,8 +268,10 @@ "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": "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", @@ -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ó", 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/vi/page-languages.json b/src/intl/vi/page-languages.json index 8414494e7bb..afd896b1683 100644 --- a/src/intl/vi/page-languages.json +++ b/src/intl/vi/page-languages.json @@ -11,11 +11,19 @@ "page-languages-want-more-header": "Bạn muốn tìm hiểu về ethereum.org bằng một ngôn ngữ khác?", "page-languages-want-more-link": "Chương trình dịch thuật", "page-languages-want-more-paragraph": "Dịch giả của ethereum.org luôn dịch các trang sang nhiều ngôn ngữ nhất có thể. Để tìm hiểu về những gì họ đang làm ngay bây giờ hoặc đăng ký để tham gia, hãy đọc", - "page-languages-filter-placeholder": "Lọc", + "page-languages-filter-label": "Danh sách bộ lọc", + "page-languages-filter-placeholder": "Nhập để lọc", + "page-languages-browser-default": "Trình duyệt mặc định", + "page-languages-translated": "đã dịch", + "page-languages-words": "từ", + "page-languages-recruit-community": "Giúp chúng tôi dịch trang ethereum.org.", + "langauge-am": "Tiếng Amhara", "language-ar": "Tiếng Ả Rập", "language-az": "Tiếng Azerbaijani", + "langauge-be": "Tiếng Belarus", "language-bg": "Tiếng Bulgary", "language-bn": "Tiếng Bengal", + "language-bs": "Tiếng Nam Tư", "language-ca": "Tiếng Catalan", "language-cs": "Tiếng Séc", "language-da": "Tiếng Đan Mạch", @@ -32,6 +40,7 @@ "language-hi": "Tiếng Hindi", "language-hr": "Tiếng Croatia", "language-hu": "Tiếng Hungary", + "language-hy-am": "Tiếng Armenia", "language-id": "Tiếng Indonesia", "language-ig": "Tiếng Igbo", "language-it": "Tiếng Ý", @@ -58,8 +67,9 @@ "language-sl": "Tiếng Slovenia", "language-sr": "Tiếng Serbia", "language-sw": "Tiếng Swahili", - "language-th": "Tiếng Thái", "language-ta": "Tiếng Tamil", + "language-th": "Tiếng Thái", + "language-tk": "Tiếng Tuôc-men", "language-tr": "Tiếng Thổ Nhĩ Kỳ", "language-uk": "Tiếng Ukraina", "language-ur": "Tiếng Urdu", diff --git a/src/intl/vi/page-stablecoins.json b/src/intl/vi/page-stablecoins.json index 0002ea09cf1..62625d029f4 100644 --- a/src/intl/vi/page-stablecoins.json +++ b/src/intl/vi/page-stablecoins.json @@ -63,6 +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-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/common.json b/src/intl/zh-tw/common.json index 74adfb3fba1..9a675fbb6eb 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": "社群", @@ -31,14 +34,15 @@ "copied": "已複製", "copy": "複製", "danksharding": "Danksharding", - "dao-page": "去中心化自治組織 (DAO)", + "dao-page": "DAO - 去中心化自治組織", "dark-mode": "深色模式", "data-provided-by": "資料來源:", - "decentralized-applications-dapps": "去中心化應用程式 (dapp)", + "decentralized-applications-dapps": "Dapp - 去中心化應用程式", "decentralized-identity": "去中心化身分", "decentralized-social-networks": "去中心化社群網路", - "decentralized-science": "去中心化科研 (DeSci)", - "defi-page": "去中心化金融 (DeFi)", + "decentralized-science": "DeSci - 去中心化科研", + "description": "導覽項目說明", + "defi-page": "DeFi - 去中心化金融", "design": "設計", "design-principles": "設計理念", "devcon": "Devcon", @@ -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,10 +147,115 @@ "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": "主要導覽", - "nft-page": "非同質化代幣 (NFT)", + "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": "否", "on-this-page": "在本頁面", @@ -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": "網站", + "regenerative-finance": "ReFi - 再生金融", + "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", @@ -187,7 +300,6 @@ "show-all": "顯示全部", "show-less": "收起", "site-description": "以太坊是一個全球化、去中心化平台,提供營利商機和新型應用程式。你可以在以太坊撰寫程式碼控制資金,並建立可從全球各地存取的應用程式。", - "site-title": "ethereum.org", "skip-to-main-content": "跳至主要内容", "smart-contracts": "智慧型合約", "stablecoins": "穩定幣", @@ -211,9 +323,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-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 770b79c61f4..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,13 +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 標誌", @@ -104,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": "以太坊名稱服務標誌", @@ -156,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": "去中心化應用程式是蓬勃發展的應用程式,使用以太坊打破商業模型,或打造新的模型。", @@ -165,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": "是什麼讓以太坊如此偉大?", @@ -179,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 標誌", @@ -191,10 +243,18 @@ "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": "這些應用程式著重於去中心化開發者工具,融入加密貨幣系統與現有科技,及打造開源開發市場。", @@ -214,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 6400fde3365..d0f9cc61808 100644 --- a/src/intl/zh-tw/page-languages.json +++ b/src/intl/zh-tw/page-languages.json @@ -12,39 +12,45 @@ "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": "丹麥文", - "language-de": "德文", + "language-de": "德語", "language-el": "希臘文", "language-en": "英文", "language-es": "西班牙語", "language-fa": "波斯文", "language-fi": "芬蘭文", - "language-fr": "法文", + "language-fr": "法語", "language-gl": "加里斯亞文", "language-gu": "古吉拉特文", "language-he": "希伯來文", "language-hi": "印度文", "language-hr": "克羅埃西亞文", "language-hu": "匈牙利文", + "language-hy-am": "亞美尼亞文", "language-id": "印尼文", "language-ig": "伊布文", - "language-it": "義大利文", - "language-ja": "日文", + "language-it": "義大利語", + "language-ja": "日語", "language-ka": "喬治亞文", "language-kk": "哈薩克文", "language-km": "高棉文", + "language-kn": "卡納達文", "language-ko": "韓文", "language-lt": "立陶宛文", "language-ml": "馬來亞拉姆文", "language-mr": "馬拉提文", "language-ms": "馬來文", "language-nb": "挪威文", + "language-ne-np": "尼泊爾文", "language-nl": "荷蘭文", "language-pcm": "奈及利亞皮欽文", "language-fil": "菲律賓文", @@ -52,19 +58,20 @@ "language-pt": "葡萄牙文", "language-pt-br": "葡萄牙文(巴西)", "language-ro": "羅馬尼亞文", - "language-ru": "俄文", + "language-ru": "俄語", "language-se": "瑞典文", "language-sk": "斯洛伐克文", "language-sl": "斯洛維尼亞文", "language-sr": "塞爾維亞文", "language-sw": "史瓦西里文", - "language-th": "泰文", "language-ta": "坦米爾文", - "language-tr": "土耳其文", + "language-th": "泰文", + "language-tk": "土庫曼文", + "language-tr": "土耳其語", "language-uk": "烏克蘭文", "language-ur": "烏都文", "language-uz": "烏茲別克文", - "language-vi": "越南文", + "language-vi": "越南語", "language-zh": "簡體中文", "language-zh-tw": "繁體中文" } 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 ef7abd62c16..01a8b17d725 100644 --- a/src/intl/zh-tw/page-stablecoins.json +++ b/src/intl/zh-tw/page-stablecoins.json @@ -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": "市值為", 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": "以太幣工作量證明", diff --git a/src/intl/zh/common.json b/src/intl/zh/common.json index 995b26658b2..589a6f67750 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)", + "dao-page": "DAO - 去中心化自治组织", "dark-mode": "深色模式", "data-provided-by": "数据来源:", - "decentralized-applications-dapps": "去中心化应用程序 (dapps)", + "decentralized-applications-dapps": "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": "开发者主页", - "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,10 +147,115 @@ "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": "主导航", - "nft-page": "非同质化代币 (NFT)", + "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": "否", "on-this-page": "在本页面", @@ -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": "钱包", diff --git a/src/intl/zh/page-dapps.json b/src/intl/zh/page-dapps.json index cc261ae2428..fe473485db3 100644 --- a/src/intl/zh/page-dapps.json +++ b/src/intl/zh/page-dapps.json @@ -115,14 +115,12 @@ "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-xmtp": "在区块链帐户之间发送消息,包括私信、警报、公告等。", "page-dapps-dapp-description-yearn": "Yearn Finance 是一个收益聚合器。它为个人、DAO 和其他协议提供了一种存入数字资产并获得收益的方式。", @@ -248,7 +246,6 @@ "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": "社交", @@ -260,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": "钱包同样也是去中心化应用程序,根据功能最适合你的原则选择一个钱包。", 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-languages.json b/src/intl/zh/page-languages.json index 969a861c5c4..053354765d9 100644 --- a/src/intl/zh/page-languages.json +++ b/src/intl/zh/page-languages.json @@ -11,7 +11,12 @@ "page-languages-want-more-header": "想用不同的语言查看ethereum.org吗?", "page-languages-want-more-link": "翻译计划", "page-languages-want-more-paragraph": "ethereum.org的翻译者总是以尽可能多的语言进行翻译。 要看看他们正在做什么或注册加入他们,请阅读我们的", - "page-languages-filter-placeholder": "筛选", + "page-languages-filter-label": "筛选列表", + "page-languages-filter-placeholder": "输入筛选条件", + "page-languages-browser-default": "浏览器默认设置", + "page-languages-translated": "已翻译", + "page-languages-words": "字数", + "page-languages-recruit-community": "帮助我们翻译 ethereum.org。", "langauge-am": "阿姆哈拉语", "language-ar": "阿拉伯语", "language-az": "阿塞拜疆语", @@ -50,6 +55,7 @@ "language-mr": "马拉地语", "language-ms": "马来语", "language-nb": "挪威语", + "language-ne-np": "尼泊尔语", "language-nl": "荷兰语", "language-pcm": "尼日利亚皮钦语", "language-fil": "菲律宾语", diff --git a/src/intl/zh/page-stablecoins.json b/src/intl/zh/page-stablecoins.json index 8742bd0e3f8..a2a4bdeeab0 100644 --- a/src/intl/zh/page-stablecoins.json +++ b/src/intl/zh/page-stablecoins.json @@ -63,6 +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-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-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": "以太坊工作量证明", diff --git a/src/layouts/RootLayout.tsx b/src/layouts/RootLayout.tsx index 00c6ec18dec..7dd5d89d3ff 100644 --- a/src/layouts/RootLayout.tsx +++ b/src/layouts/RootLayout.tsx @@ -26,10 +26,10 @@ export const RootLayout = ({ }: Root) => { const { locale, asPath } = useRouter() - const CONTRIBUTING = "/contributing" + const CONTRIBUTING = "/contributing/" const isUntranslatedContributingPage = asPath.includes(CONTRIBUTING) && - !(asPath.endsWith(CONTRIBUTING) || asPath.includes("/translation-program")) + !(asPath.endsWith(CONTRIBUTING) || asPath.includes("/translation-program/")) const isLegal = isUntranslatedContributingPage || @@ -50,7 +50,7 @@ export const RootLayout = ({ -