From b7de8b533679abc4c02241d76900a8ab27906133 Mon Sep 17 00:00:00 2001
From: wackerow <54227730+wackerow@users.noreply.github.com>
Date: Tue, 27 Jan 2026 10:14:36 -0500
Subject: [PATCH 01/31] i18n(vi): Crowdin translations
---
public/content/translations/vi/about/index.md | 134 ++
.../translations/vi/ai-agents/index.md | 143 ++
.../content/translations/vi/bridges/index.md | 145 ++
.../vi/community/code-of-conduct/index.md | 77 +
.../vi/community/events/organizing/index.md | 221 ++
.../vi/community/get-involved/index.md | 132 ++
.../translations/vi/community/grants/index.md | 68 +
.../vi/community/language-resources/index.md | 153 ++
.../translations/vi/community/online/index.md | 55 +
.../vi/community/research/index.md | 399 ++++
.../vi/community/support/index.md | 104 +
.../adding-desci-projects/index.md | 44 +
.../adding-developer-tools/index.md | 61 +
.../vi/contributing/adding-exchanges/index.md | 38 +
.../adding-glossary-terms/index.md | 26 +
.../vi/contributing/adding-layer-2s/index.md | 95 +
.../vi/contributing/adding-products/index.md | 100 +
.../vi/contributing/adding-resources/index.md | 51 +
.../adding-staking-products/index.md | 174 ++
.../vi/contributing/adding-wallets/index.md | 78 +
.../contributing/content-resources/index.md | 30 +
.../contributing/design-principles/index.md | 93 +
.../design/adding-design-resources/index.md | 69 +
.../vi/contributing/design/index.md | 77 +
.../translations/vi/contributing/index.md | 120 +
.../vi/contributing/quizzes/index.md | 62 +
.../translation-program/faq/index.md | 119 +
.../how-to-translate/index.md | 92 +
.../contributing/translation-program/index.md | 91 +
.../mission-and-vision/index.md | 25 +
.../translation-program/playbook/index.md | 317 +++
.../translation-program/resources/index.md | 49 +
.../translatathon/details/index.md | 90 +
.../translatathon/index.md | 100 +
.../translators-guide/index.md | 299 +++
public/content/translations/vi/dao/index.md | 142 +-
.../vi/decentralized-identity/index.md | 218 ++
public/content/translations/vi/defi/index.md | 164 +-
public/content/translations/vi/desci/index.md | 139 ++
.../vi/developers/docs/accounts/index.md | 137 ++
.../vi/developers/docs/apis/backend/index.md | 211 ++
.../developers/docs/apis/javascript/index.md | 289 +++
.../vi/developers/docs/apis/json-rpc/index.md | 1898 ++++++++++++++++
.../vi/developers/docs/blocks/index.md | 153 ++
.../vi/developers/docs/bridges/index.md | 138 ++
.../docs/consensus-mechanisms/index.md | 92 +
.../docs/consensus-mechanisms/poa/index.md | 80 +
.../pos/attack-and-defense/index.md | 167 ++
.../pos/attestations/index.md | 92 +
.../pos/block-proposal/index.md | 69 +
.../consensus-mechanisms/pos/faqs/index.md | 172 ++
.../consensus-mechanisms/pos/gasper/index.md | 52 +
.../docs/consensus-mechanisms/pos/index.md | 99 +
.../consensus-mechanisms/pos/keys/index.md | 102 +
.../pos/pos-vs-pow/index.md | 69 +
.../pos/rewards-and-penalties/index.md | 91 +
.../pos/weak-subjectivity/index.md | 39 +
.../pos/withdrawal-credentials/index.md | 64 +
.../docs/consensus-mechanisms/pow/index.md | 114 +
.../consensus-mechanisms/pow/mining/index.md | 86 +
.../dagger-hashimoto/index.md | 330 +++
.../mining/mining-algorithms/ethash/index.md | 1022 +++++++++
.../pow/mining/mining-algorithms/index.md | 42 +
.../vi/developers/docs/dapps/index.md | 96 +
.../block-explorers/index.md | 254 +++
.../docs/data-and-analytics/index.md | 72 +
.../index.md | 118 +
.../docs/data-availability/index.md | 84 +
.../data-structures-and-encoding/index.md | 32 +
.../patricia-merkle-trie/index.md | 266 +++
.../data-structures-and-encoding/rlp/index.md | 163 ++
.../data-structures-and-encoding/ssz/index.md | 150 ++
.../web3-secret-storage/index.md | 195 ++
.../dex-design-best-practice/index.md | 220 ++
.../heuristics-for-web3/index.md | 138 ++
.../vi/developers/docs/design-and-ux/index.md | 86 +
.../docs/development-networks/index.md | 71 +
.../developers/docs/ethereum-stack/index.md | 61 +
.../vi/developers/docs/evm/index.md | 88 +
.../vi/developers/docs/evm/opcodes/index.md | 177 ++
.../vi/developers/docs/frameworks/index.md | 154 ++
.../vi/developers/docs/gas/index.md | 151 ++
.../vi/developers/docs/ides/index.md | 64 +
.../translations/vi/developers/docs/index.md | 25 +
.../developers/docs/intro-to-ether/index.md | 78 +
.../docs/intro-to-ethereum/index.md | 124 ++
.../vi/developers/docs/mev/index.md | 221 ++
.../developers/docs/networking-layer/index.md | 163 ++
.../network-addresses/index.md | 39 +
.../networking-layer/portal-network/index.md | 89 +
.../vi/developers/docs/networks/index.md | 216 ++
.../nodes-and-clients/archive-nodes/index.md | 81 +
.../docs/nodes-and-clients/bootnodes/index.md | 31 +
.../client-diversity/index.md | 132 ++
.../docs/nodes-and-clients/index.md | 319 +++
.../nodes-and-clients/light-clients/index.md | 61 +
.../node-architecture/index.md | 59 +
.../nodes-as-a-service/index.md | 418 ++++
.../nodes-and-clients/run-a-node/index.md | 482 ++++
.../vi/developers/docs/oracles/index.md | 433 ++++
.../docs/programming-languages/dart/index.md | 30 +
.../programming-languages/delphi/index.md | 56 +
.../programming-languages/dot-net/index.md | 86 +
.../programming-languages/elixir/index.md | 55 +
.../programming-languages/golang/index.md | 84 +
.../docs/programming-languages/index.md | 32 +
.../docs/programming-languages/java/index.md | 64 +
.../programming-languages/javascript/index.md | 72 +
.../programming-languages/python/index.md | 99 +
.../docs/programming-languages/ruby/index.md | 60 +
.../docs/programming-languages/rust/index.md | 65 +
.../vi/developers/docs/scaling/index.md | 113 +
.../docs/scaling/optimistic-rollups/index.md | 265 +++
.../developers/docs/scaling/plasma/index.md | 176 ++
.../docs/scaling/sidechains/index.md | 73 +
.../docs/scaling/state-channels/index.md | 261 +++
.../developers/docs/scaling/validium/index.md | 166 ++
.../docs/scaling/zk-rollups/index.md | 257 +++
.../docs/smart-contracts/anatomy/index.md | 658 ++++++
.../docs/smart-contracts/compiling/index.md | 282 +++
.../smart-contracts/composability/index.md | 76 +
.../docs/smart-contracts/deploying/index.md | 81 +
.../formal-verification/index.md | 284 +++
.../developers/docs/smart-contracts/index.md | 112 +
.../docs/smart-contracts/languages/index.md | 324 +++
.../docs/smart-contracts/libraries/index.md | 117 +
.../docs/smart-contracts/naming/index.md | 101 +
.../docs/smart-contracts/security/index.md | 576 +++++
.../docs/smart-contracts/testing/index.md | 310 +++
.../docs/smart-contracts/upgrading/index.md | 165 ++
.../docs/smart-contracts/verifying/index.md | 113 +
.../vi/developers/docs/standards/index.md | 59 +
.../docs/standards/tokens/erc-1155/index.md | 146 ++
.../docs/standards/tokens/erc-1363/index.md | 213 ++
.../docs/standards/tokens/erc-20/index.md | 187 ++
.../docs/standards/tokens/erc-223/index.md | 198 ++
.../docs/standards/tokens/erc-4626/index.md | 227 ++
.../docs/standards/tokens/erc-721/index.md | 254 +++
.../docs/standards/tokens/erc-777/index.md | 45 +
.../developers/docs/standards/tokens/index.md | 41 +
.../vi/developers/docs/storage/index.md | 216 ++
.../vi/developers/docs/transactions/index.md | 233 ++
.../vi/developers/docs/web2-vs-web3/index.md | 62 +
.../index.md | 300 +++
.../tutorials/all-you-can-cache/index.md | 867 ++++++++
.../developers/tutorials/app-plasma/index.md | 1261 +++++++++++
.../index.md | 131 ++
.../index.md | 585 +++++
.../index.md | 101 +
.../index.md | 372 ++++
.../index.md | 144 ++
.../index.md | 123 +
.../erc-721-vyper-annotated-code/index.md | 715 ++++++
.../tutorials/erc20-annotated-code/index.md | 932 ++++++++
.../erc20-with-safety-rails/index.md | 217 ++
.../tutorials/ethereum-for-web2-auth/index.md | 886 ++++++++
.../index.md | 156 ++
.../index.md | 102 +
.../index.md | 1541 +++++++++++++
.../hello-world-smart-contract/index.md | 367 +++
.../index.md | 151 ++
.../tutorials/how-to-mint-an-nft/index.md | 335 +++
.../index.md | 108 +
.../index.md | 710 ++++++
.../index.md | 522 +++++
.../index.md | 239 ++
.../how-to-use-tellor-as-your-oracle/index.md | 81 +
.../how-to-view-nft-in-metamask/index.md | 33 +
.../how-to-write-and-deploy-an-nft/index.md | 386 ++++
.../index.md | 179 ++
.../tutorials/ipfs-decentralized-ui/index.md | 73 +
.../index.md | 111 +
.../index.md | 269 +++
.../logging-events-smart-contracts/index.md | 62 +
.../index.md | 251 +++
.../index.md | 151 ++
.../developers/tutorials/nft-minter/index.md | 876 ++++++++
.../index.md | 1357 ++++++++++++
.../reverse-engineering-a-contract/index.md | 744 +++++++
.../tutorials/run-node-raspberry-pi/index.md | 184 ++
.../tutorials/scam-token-tricks/index.md | 470 ++++
.../tutorials/secret-state/index.md | 741 +++++++
.../secure-development-workflow/index.md | 52 +
.../tutorials/send-token-ethersjs/index.md | 210 ++
.../index.md | 208 ++
.../tutorials/server-components/index.md | 295 +++
.../index.md | 92 +
.../developers/tutorials/short-abi/index.md | 585 +++++
.../index.md | 91 +
.../tutorials/stealth-addr/index.md | 443 ++++
.../index.md | 314 +++
.../token-integration-checklist/index.md | 86 +
.../index.md | 314 +++
.../index.md | 177 ++
.../uniswap-v2-annotated-code/index.md | 1969 +++++++++++++++++
.../tutorials/using-websockets/index.md | 245 ++
.../index.md | 300 +++
.../index.md | 204 ++
.../index.md | 205 ++
.../tutorials/yellow-paper-evm/index.md | 278 +++
public/content/translations/vi/eips/index.md | 78 +
.../vi/energy-consumption/index.md | 86 +
.../translations/vi/eth/supply/index.md | 80 +
.../translations/vi/ethereum-forks/index.md | 681 ++++++
.../translations/vi/foundation/index.md | 33 +
.../content/translations/vi/gaming/index.md | 70 +
.../content/translations/vi/glossary/index.md | 505 +++++
.../translations/vi/governance/index.md | 184 ++
.../index.md | 75 +
.../vi/guides/how-to-id-scam-tokens/index.md | 97 +
.../how-to-revoke-token-access/index.md | 75 +
.../vi/guides/how-to-swap-tokens/index.md | 70 +
.../vi/guides/how-to-use-a-bridge/index.md | 72 +
.../vi/guides/how-to-use-a-wallet/index.md | 91 +
.../content/translations/vi/guides/index.md | 27 +
public/content/translations/vi/nft/index.md | 56 +-
.../content/translations/vi/payments/index.md | 207 ++
.../vi/prediction-markets/index.md | 84 +
.../content/translations/vi/privacy/index.md | 97 +
.../vi/real-world-assets/index.md | 93 +
public/content/translations/vi/refi/index.md | 81 +
.../translations/vi/restaking/index.md | 188 ++
.../vi/roadmap/account-abstraction/index.md | 71 +
.../vi/roadmap/beacon-chain/index.md | 79 +
.../vi/roadmap/danksharding/index.md | 95 +
.../translations/vi/roadmap/dencun/index.md | 120 +
.../translations/vi/roadmap/fusaka/index.md | 300 +++
.../vi/roadmap/fusaka/peerdas/index.md | 88 +
.../vi/roadmap/future-proofing/index.md | 53 +
.../translations/vi/roadmap/merge/index.md | 231 ++
.../vi/roadmap/merge/issuance/index.md | 141 ++
.../translations/vi/roadmap/pbs/index.md | 50 +
.../vi/roadmap/pectra/7702/index.md | 148 ++
.../translations/vi/roadmap/pectra/index.md | 127 ++
.../vi/roadmap/pectra/maxeb/index.md | 204 ++
.../translations/vi/roadmap/scaling/index.md | 58 +
.../roadmap/secret-leader-election/index.md | 44 +
.../translations/vi/roadmap/security/index.md | 48 +
.../vi/roadmap/single-slot-finality/index.md | 65 +
.../vi/roadmap/statelessness/index.md | 104 +
.../vi/roadmap/user-experience/index.md | 36 +
.../vi/roadmap/verkle-trees/index.md | 66 +
.../content/translations/vi/security/index.md | 305 +++
.../translations/vi/smart-contracts/index.md | 42 +-
.../translations/vi/social-networks/index.md | 140 ++
.../translations/vi/staking/dvt/index.md | 52 +-
.../translations/vi/staking/pools/index.md | 42 +-
.../translations/vi/staking/saas/index.md | 37 +-
.../translations/vi/staking/solo/index.md | 168 +-
.../vi/staking/withdrawals/index.md | 110 +-
public/content/translations/vi/web3/index.md | 74 +-
.../translations/vi/what-are-apps/index.md | 81 +
.../translations/vi/whitepaper/index.md | 524 +++++
.../translations/vi/wrapped-eth/index.md | 70 +
.../vi/zero-knowledge-proofs/index.md | 234 ++
src/intl/vi/common.json | 4 +-
src/intl/vi/glossary-tooltip.json | 164 ++
src/intl/vi/glossary.json | 408 ++++
src/intl/vi/learn-quizzes.json | 698 ++++++
src/intl/vi/page-10-year-anniversary.json | 131 ++
src/intl/vi/page-about.json | 28 +-
src/intl/vi/page-apps.json | 347 +--
src/intl/vi/page-assets.json | 61 +
src/intl/vi/page-bug-bounty.json | 169 ++
src/intl/vi/page-collectibles.json | 67 +
src/intl/vi/page-community-events.json | 1 -
src/intl/vi/page-community.json | 64 +
...-translation-program-acknowledgements.json | 42 +
...ting-translation-program-contributors.json | 10 +
src/intl/vi/page-developers-docs.json | 150 ++
src/intl/vi/page-developers-index.json | 99 +-
.../vi/page-developers-learning-tools.json | 22 +-
.../vi/page-developers-local-environment.json | 6 +-
src/intl/vi/page-developers-tutorials.json | 20 +-
src/intl/vi/page-energy-consumption.json | 21 +
...thereum-history-founder-and-ownership.json | 65 +
src/intl/vi/page-ethereum-vs-bitcoin.json | 101 +
src/intl/vi/page-founders.json | 65 +
src/intl/vi/page-gas.json | 2 +-
src/intl/vi/page-history.json | 7 +
src/intl/vi/page-index.json | 2 +-
src/intl/vi/page-layer-2-learn.json | 55 +
src/intl/vi/page-layer-2-networks.json | 85 +
src/intl/vi/page-layer-2.json | 61 +
src/intl/vi/page-learn.json | 37 +-
src/intl/vi/page-resources.json | 97 +
src/intl/vi/page-roadmap-vision.json | 66 +-
src/intl/vi/page-roadmap.json | 102 +
src/intl/vi/page-run-a-node.json | 10 +-
src/intl/vi/page-stablecoins.json | 72 +-
.../vi/page-staking-deposit-contract.json | 4 +-
src/intl/vi/page-staking.json | 59 +-
src/intl/vi/page-start.json | 38 +
.../vi/page-trillion-dollar-security.json | 196 ++
src/intl/vi/page-upgrades-get-involved.json | 47 +
src/intl/vi/page-upgrades-index.json | 208 ++
src/intl/vi/page-upgrades.json | 21 +-
src/intl/vi/page-wallets-find-wallet.json | 9 +-
src/intl/vi/page-wallets.json | 4 +-
src/intl/vi/page-what-is-ether.json | 100 +
src/intl/vi/page-what-is-ethereum.json | 12 +-
.../vi/page-what-is-the-ethereum-network.json | 89 +
src/intl/vi/table.json | 2 +-
src/intl/vi/template-usecase.json | 11 +-
304 files changed, 56126 insertions(+), 858 deletions(-)
create mode 100644 public/content/translations/vi/about/index.md
create mode 100644 public/content/translations/vi/ai-agents/index.md
create mode 100644 public/content/translations/vi/bridges/index.md
create mode 100644 public/content/translations/vi/community/code-of-conduct/index.md
create mode 100644 public/content/translations/vi/community/events/organizing/index.md
create mode 100644 public/content/translations/vi/community/get-involved/index.md
create mode 100644 public/content/translations/vi/community/grants/index.md
create mode 100644 public/content/translations/vi/community/language-resources/index.md
create mode 100644 public/content/translations/vi/community/online/index.md
create mode 100644 public/content/translations/vi/community/research/index.md
create mode 100644 public/content/translations/vi/community/support/index.md
create mode 100644 public/content/translations/vi/contributing/adding-desci-projects/index.md
create mode 100644 public/content/translations/vi/contributing/adding-developer-tools/index.md
create mode 100644 public/content/translations/vi/contributing/adding-exchanges/index.md
create mode 100644 public/content/translations/vi/contributing/adding-glossary-terms/index.md
create mode 100644 public/content/translations/vi/contributing/adding-layer-2s/index.md
create mode 100644 public/content/translations/vi/contributing/adding-products/index.md
create mode 100644 public/content/translations/vi/contributing/adding-resources/index.md
create mode 100644 public/content/translations/vi/contributing/adding-staking-products/index.md
create mode 100644 public/content/translations/vi/contributing/adding-wallets/index.md
create mode 100644 public/content/translations/vi/contributing/content-resources/index.md
create mode 100644 public/content/translations/vi/contributing/design-principles/index.md
create mode 100644 public/content/translations/vi/contributing/design/adding-design-resources/index.md
create mode 100644 public/content/translations/vi/contributing/design/index.md
create mode 100644 public/content/translations/vi/contributing/index.md
create mode 100644 public/content/translations/vi/contributing/quizzes/index.md
create mode 100644 public/content/translations/vi/contributing/translation-program/faq/index.md
create mode 100644 public/content/translations/vi/contributing/translation-program/how-to-translate/index.md
create mode 100644 public/content/translations/vi/contributing/translation-program/index.md
create mode 100644 public/content/translations/vi/contributing/translation-program/mission-and-vision/index.md
create mode 100644 public/content/translations/vi/contributing/translation-program/playbook/index.md
create mode 100644 public/content/translations/vi/contributing/translation-program/resources/index.md
create mode 100644 public/content/translations/vi/contributing/translation-program/translatathon/details/index.md
create mode 100644 public/content/translations/vi/contributing/translation-program/translatathon/index.md
create mode 100644 public/content/translations/vi/contributing/translation-program/translators-guide/index.md
create mode 100644 public/content/translations/vi/decentralized-identity/index.md
create mode 100644 public/content/translations/vi/desci/index.md
create mode 100644 public/content/translations/vi/developers/docs/accounts/index.md
create mode 100644 public/content/translations/vi/developers/docs/apis/backend/index.md
create mode 100644 public/content/translations/vi/developers/docs/apis/javascript/index.md
create mode 100644 public/content/translations/vi/developers/docs/apis/json-rpc/index.md
create mode 100644 public/content/translations/vi/developers/docs/blocks/index.md
create mode 100644 public/content/translations/vi/developers/docs/bridges/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/poa/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attestations/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/block-proposal/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/faqs/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/gasper/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/keys/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pow/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md
create mode 100644 public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md
create mode 100644 public/content/translations/vi/developers/docs/dapps/index.md
create mode 100644 public/content/translations/vi/developers/docs/data-and-analytics/block-explorers/index.md
create mode 100644 public/content/translations/vi/developers/docs/data-and-analytics/index.md
create mode 100644 public/content/translations/vi/developers/docs/data-availability/blockchain-data-storage-strategies/index.md
create mode 100644 public/content/translations/vi/developers/docs/data-availability/index.md
create mode 100644 public/content/translations/vi/developers/docs/data-structures-and-encoding/index.md
create mode 100644 public/content/translations/vi/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md
create mode 100644 public/content/translations/vi/developers/docs/data-structures-and-encoding/rlp/index.md
create mode 100644 public/content/translations/vi/developers/docs/data-structures-and-encoding/ssz/index.md
create mode 100644 public/content/translations/vi/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md
create mode 100644 public/content/translations/vi/developers/docs/design-and-ux/dex-design-best-practice/index.md
create mode 100644 public/content/translations/vi/developers/docs/design-and-ux/heuristics-for-web3/index.md
create mode 100644 public/content/translations/vi/developers/docs/design-and-ux/index.md
create mode 100644 public/content/translations/vi/developers/docs/development-networks/index.md
create mode 100644 public/content/translations/vi/developers/docs/ethereum-stack/index.md
create mode 100644 public/content/translations/vi/developers/docs/evm/index.md
create mode 100644 public/content/translations/vi/developers/docs/evm/opcodes/index.md
create mode 100644 public/content/translations/vi/developers/docs/frameworks/index.md
create mode 100644 public/content/translations/vi/developers/docs/gas/index.md
create mode 100644 public/content/translations/vi/developers/docs/ides/index.md
create mode 100644 public/content/translations/vi/developers/docs/index.md
create mode 100644 public/content/translations/vi/developers/docs/intro-to-ether/index.md
create mode 100644 public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
create mode 100644 public/content/translations/vi/developers/docs/mev/index.md
create mode 100644 public/content/translations/vi/developers/docs/networking-layer/index.md
create mode 100644 public/content/translations/vi/developers/docs/networking-layer/network-addresses/index.md
create mode 100644 public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
create mode 100644 public/content/translations/vi/developers/docs/networks/index.md
create mode 100644 public/content/translations/vi/developers/docs/nodes-and-clients/archive-nodes/index.md
create mode 100644 public/content/translations/vi/developers/docs/nodes-and-clients/bootnodes/index.md
create mode 100644 public/content/translations/vi/developers/docs/nodes-and-clients/client-diversity/index.md
create mode 100644 public/content/translations/vi/developers/docs/nodes-and-clients/index.md
create mode 100644 public/content/translations/vi/developers/docs/nodes-and-clients/light-clients/index.md
create mode 100644 public/content/translations/vi/developers/docs/nodes-and-clients/node-architecture/index.md
create mode 100644 public/content/translations/vi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md
create mode 100644 public/content/translations/vi/developers/docs/nodes-and-clients/run-a-node/index.md
create mode 100644 public/content/translations/vi/developers/docs/oracles/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/dart/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/delphi/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/dot-net/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/elixir/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/golang/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/java/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/javascript/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/python/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/ruby/index.md
create mode 100644 public/content/translations/vi/developers/docs/programming-languages/rust/index.md
create mode 100644 public/content/translations/vi/developers/docs/scaling/index.md
create mode 100644 public/content/translations/vi/developers/docs/scaling/optimistic-rollups/index.md
create mode 100644 public/content/translations/vi/developers/docs/scaling/plasma/index.md
create mode 100644 public/content/translations/vi/developers/docs/scaling/sidechains/index.md
create mode 100644 public/content/translations/vi/developers/docs/scaling/state-channels/index.md
create mode 100644 public/content/translations/vi/developers/docs/scaling/validium/index.md
create mode 100644 public/content/translations/vi/developers/docs/scaling/zk-rollups/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/anatomy/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/compiling/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/composability/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/deploying/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/formal-verification/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/languages/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/libraries/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/naming/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/security/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/testing/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/upgrading/index.md
create mode 100644 public/content/translations/vi/developers/docs/smart-contracts/verifying/index.md
create mode 100644 public/content/translations/vi/developers/docs/standards/index.md
create mode 100644 public/content/translations/vi/developers/docs/standards/tokens/erc-1155/index.md
create mode 100644 public/content/translations/vi/developers/docs/standards/tokens/erc-1363/index.md
create mode 100644 public/content/translations/vi/developers/docs/standards/tokens/erc-20/index.md
create mode 100644 public/content/translations/vi/developers/docs/standards/tokens/erc-223/index.md
create mode 100644 public/content/translations/vi/developers/docs/standards/tokens/erc-4626/index.md
create mode 100644 public/content/translations/vi/developers/docs/standards/tokens/erc-721/index.md
create mode 100644 public/content/translations/vi/developers/docs/standards/tokens/erc-777/index.md
create mode 100644 public/content/translations/vi/developers/docs/standards/tokens/index.md
create mode 100644 public/content/translations/vi/developers/docs/storage/index.md
create mode 100644 public/content/translations/vi/developers/docs/transactions/index.md
create mode 100644 public/content/translations/vi/developers/docs/web2-vs-web3/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/all-you-can-cache/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/app-plasma/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/calling-a-smart-contract-from-javascript/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/deploying-your-first-smart-contract/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/eip-1271-smart-contract-signatures/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/erc20-with-safety-rails/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/ethereum-for-web2-auth/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/hello-world-smart-contract-fullstack/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/hello-world-smart-contract/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/how-to-implement-an-erc721-market/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/how-to-view-nft-in-metamask/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/how-to-write-and-deploy-an-nft/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/interact-with-other-contracts-from-solidity/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/ipfs-decentralized-ui/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/logging-events-smart-contracts/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/nft-minter/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/secret-state/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/send-token-ethersjs/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/server-components/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/short-abi/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/stealth-addr/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/uniswap-v2-annotated-code/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/using-websockets/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/waffle-test-simple-smart-contract/index.md
create mode 100644 public/content/translations/vi/developers/tutorials/yellow-paper-evm/index.md
create mode 100644 public/content/translations/vi/eips/index.md
create mode 100644 public/content/translations/vi/energy-consumption/index.md
create mode 100644 public/content/translations/vi/eth/supply/index.md
create mode 100644 public/content/translations/vi/ethereum-forks/index.md
create mode 100644 public/content/translations/vi/foundation/index.md
create mode 100644 public/content/translations/vi/gaming/index.md
create mode 100644 public/content/translations/vi/glossary/index.md
create mode 100644 public/content/translations/vi/governance/index.md
create mode 100644 public/content/translations/vi/guides/how-to-create-an-ethereum-account/index.md
create mode 100644 public/content/translations/vi/guides/how-to-id-scam-tokens/index.md
create mode 100644 public/content/translations/vi/guides/how-to-revoke-token-access/index.md
create mode 100644 public/content/translations/vi/guides/how-to-swap-tokens/index.md
create mode 100644 public/content/translations/vi/guides/how-to-use-a-bridge/index.md
create mode 100644 public/content/translations/vi/guides/how-to-use-a-wallet/index.md
create mode 100644 public/content/translations/vi/guides/index.md
create mode 100644 public/content/translations/vi/payments/index.md
create mode 100644 public/content/translations/vi/prediction-markets/index.md
create mode 100644 public/content/translations/vi/privacy/index.md
create mode 100644 public/content/translations/vi/real-world-assets/index.md
create mode 100644 public/content/translations/vi/refi/index.md
create mode 100644 public/content/translations/vi/restaking/index.md
create mode 100644 public/content/translations/vi/roadmap/account-abstraction/index.md
create mode 100644 public/content/translations/vi/roadmap/beacon-chain/index.md
create mode 100644 public/content/translations/vi/roadmap/danksharding/index.md
create mode 100644 public/content/translations/vi/roadmap/dencun/index.md
create mode 100644 public/content/translations/vi/roadmap/fusaka/index.md
create mode 100644 public/content/translations/vi/roadmap/fusaka/peerdas/index.md
create mode 100644 public/content/translations/vi/roadmap/future-proofing/index.md
create mode 100644 public/content/translations/vi/roadmap/merge/index.md
create mode 100644 public/content/translations/vi/roadmap/merge/issuance/index.md
create mode 100644 public/content/translations/vi/roadmap/pbs/index.md
create mode 100644 public/content/translations/vi/roadmap/pectra/7702/index.md
create mode 100644 public/content/translations/vi/roadmap/pectra/index.md
create mode 100644 public/content/translations/vi/roadmap/pectra/maxeb/index.md
create mode 100644 public/content/translations/vi/roadmap/scaling/index.md
create mode 100644 public/content/translations/vi/roadmap/secret-leader-election/index.md
create mode 100644 public/content/translations/vi/roadmap/security/index.md
create mode 100644 public/content/translations/vi/roadmap/single-slot-finality/index.md
create mode 100644 public/content/translations/vi/roadmap/statelessness/index.md
create mode 100644 public/content/translations/vi/roadmap/user-experience/index.md
create mode 100644 public/content/translations/vi/roadmap/verkle-trees/index.md
create mode 100644 public/content/translations/vi/security/index.md
create mode 100644 public/content/translations/vi/social-networks/index.md
create mode 100644 public/content/translations/vi/what-are-apps/index.md
create mode 100644 public/content/translations/vi/whitepaper/index.md
create mode 100644 public/content/translations/vi/wrapped-eth/index.md
create mode 100644 public/content/translations/vi/zero-knowledge-proofs/index.md
create mode 100644 src/intl/vi/glossary-tooltip.json
create mode 100644 src/intl/vi/glossary.json
create mode 100644 src/intl/vi/learn-quizzes.json
create mode 100644 src/intl/vi/page-10-year-anniversary.json
create mode 100644 src/intl/vi/page-assets.json
create mode 100644 src/intl/vi/page-bug-bounty.json
create mode 100644 src/intl/vi/page-collectibles.json
create mode 100644 src/intl/vi/page-community.json
create mode 100644 src/intl/vi/page-contributing-translation-program-acknowledgements.json
create mode 100644 src/intl/vi/page-contributing-translation-program-contributors.json
create mode 100644 src/intl/vi/page-energy-consumption.json
create mode 100644 src/intl/vi/page-ethereum-history-founder-and-ownership.json
create mode 100644 src/intl/vi/page-ethereum-vs-bitcoin.json
create mode 100644 src/intl/vi/page-founders.json
create mode 100644 src/intl/vi/page-history.json
create mode 100644 src/intl/vi/page-layer-2-learn.json
create mode 100644 src/intl/vi/page-layer-2-networks.json
create mode 100644 src/intl/vi/page-layer-2.json
create mode 100644 src/intl/vi/page-resources.json
create mode 100644 src/intl/vi/page-roadmap.json
create mode 100644 src/intl/vi/page-start.json
create mode 100644 src/intl/vi/page-trillion-dollar-security.json
create mode 100644 src/intl/vi/page-upgrades-get-involved.json
create mode 100644 src/intl/vi/page-upgrades-index.json
create mode 100644 src/intl/vi/page-what-is-ether.json
create mode 100644 src/intl/vi/page-what-is-the-ethereum-network.json
diff --git a/public/content/translations/vi/about/index.md b/public/content/translations/vi/about/index.md
new file mode 100644
index 00000000000..c1bdefa7961
--- /dev/null
+++ b/public/content/translations/vi/about/index.md
@@ -0,0 +1,134 @@
+---
+title: Về chúng tôi
+description: Về đội ngũ, cộng đồng và nhiệm vụ của Ethereum
+lang: vi
+---
+
+# Giới thiệu về ethereum.org {#about-ethereumorg}
+
+Trang web ethereum.org công khai và minh bạch thông tin, sử dụng mã nguồn mở và cho phép mọi người trong cộng đồng Ethereum đều có thể đóng góp. Chúng tôi gồm có một đội ngũ nhỏ chủ chốt phụ trách duy trì và phát triển trang web cùng cộng đồng với hàng nghìn thành viên chung tay góp sức.
+
+**Đội ngũ ethereum.org sẽ không bao giờ chủ động liên hệ bạn. Nếu có, xin đừng phản hồi.**
+
+## Lưu ý về các tên gọi {#a-note-on-names}
+
+Việc mọi người nhầm lẫn thuật ngữ trong hệ sinh thái Ethereum là điều thường thấy, có thể dẫn đến tư duy sai lệch về cách Ethereum vận hành. Sau đây là phần giải thích ngắn gọn làm rõ:
+
+### Ethereum {#ethereum}
+
+Ethereum là một hệ thống mạng, là nền tảng blockchain, và là giao thức mã nguồn mở - được vận hành, quản trị, và sở hữu bởi cộng đồng toàn cầu với hàng chục nghìn lập trình viên, chuyên gia vận hành node, người sở hữu đồng ETH và người dùng.
+
+[Thông tin thêm về Ethereum](/what-is-ethereum/)
+
+[Thông tin thêm về quản trị của Ethereum](/governance/)
+
+### Ether (ETH) {#ether-or-eth}
+
+Đồng Ether (cũng được biết tới với ký hiệu, ETH) là đồng tiền gốc được giao dịch trên mạng lưới Ethereum. Đồng ETH được dùng để thanh toán chi phí sử dụng mạng lưới Ethereum (dưới dạng phí giao dịch). Đồng ETH cũng được sử dụng để bảo mật mạng lưới thông qua cơ chế staking. Khi mọi người nói đến giá Ethereum, người ta đang nói về giá trị tài sản của đồng ETH.
+
+[Thông tin thêm về ETH](/what-is-ether/)
+
+[Thông tin thêm về staking ETH](/staking/)
+
+### Ethereum Foundation {#ethereum-foundation}
+
+Một tổ chức phi lợi nhuận, đã gây quỹ ban đầu thông qua phát hành và bán ETH ra công chúng, với sứ mệnh hỗ trợ mạng lưới và hệ sinh thái Ethereum.
+
+[Thông tin thêm về Ethereum Foundation](/foundation/)
+
+### ethereum.org {#ethereum-org}
+
+Một trang web công khai, có mã nguồn mở và là nguồn tài liệu giáo dục dành cho cộng đồng Ethereum. Trang web ethereum.org được dẫn dắt bởi một đội ngũ nhỏ chủ chốt, được tài trợ bởi Tổ chức Ethereum Foundation, cùng với sự đóng góp từ cộng đồng có hàng nghìn thành viên khắp thế giới.
+
+Xem thêm thông tin về ethereum.org.
+
+## Sứ mệnh của chúng tôi {#our-mission}
+
+**Sứ mệnh của ethereum.org là trở thành nơi truyền tải thông tin tốt nhất cho cộng đồng đang phát triển của Ethereum**
+
+Chúng tôi nỗ lực xây dựng một kho tài liệu giáo dục về tất cả các chủ đề liên quan tới Ethereum thật dễ hiểu, được thiết kế để giúp người dùng mới làm quen với Ethereum và các khái niệm cốt lõi. Chúng tôi mong muốn:
+
+- Giải thích về Ethereum đến những người mới tiếp cận công nghệ
+- Giúp đỡ người dùng mới bắt đầu với ETH và Ethereum
+- Hỗ trợ những lập trình viên bắt đầu lập trình
+- Phổ biến những bản cập nhật trong môi trường Ethereum
+- Giới thiệu những tài nguyên do cộng đồng tạo ra
+- Phổ biến Ethereum bằng nhiều ngôn ngữ nhất có thể
+
+Để hoàn thành được sứ mệnh này, đội ngũ chúng tôi phát triển ethereum.org tập trung vào hai mục tiêu chính:
+
+### 1. Cải thiện trải nghiệm người dùng cho khách truy cập ethereum.org {#visitors}
+
+- Mở rộng, cải thiện và luôn cập nhật nội dung kịp thời
+- Cải thiện khả năng sử dụng và tiếp cận thông qua bản địa hoá và áp dụng các tiêu chuẩn phát triển trang web tốt nhất
+- Tăng mức độ gắn kết người dùng thông qua các tính năng như khảo sát, trò chơi hỏi đáp, và tích hợp web3
+- Duy trì trang web gọn nhẹ và vận hành web một cách hiệu quả
+
+### 2. Phát triển, củng cố và trao quyền cho cộng đồng cộng tác viên của chúng tôi {#community}
+
+- Tăng tổng số cộng tác viên tham gia trang web
+- Nâng cao tỷ lệ quay lại của cộng tác viên thông qua các hoạt động gắn kết, ghi nhận và trao thưởng
+- Trao quyền cho các thành viên trong cộng đồng để họ phát huy đóng góp những vai trò quan trọng hơn
+- Thức đẩy sự đa dạng trong đóng góp: viết code, làm nội dung, thiết kế, dịch thuật, điều phối
+- Duy trì cơ sở mã nguồn hiện đại, sạch rõ và được ghi chép đầy đủ
+
+## Các nguyên tắc cốt lõi {#core-principles}
+
+Chúng tôi có một số nguyên tắc cốt lõi là kim chỉ nam giúp chúng tôi hoàn thành sứ mệnh.
+
+### 1. ethereum.org là một cổng thông tin đến Ethereum 🌏 {#core-principles-1}
+
+Chúng tôi muốn thu hút sự quan tâm của người dùng và giải đáp những vướng mắt của họ. Vì vậy, cổng thông tin của chúng tôi cần kết hợp và phổ biến thông tin, nhu cầu, liên kết với các tài nguyên cộng đồng có sẵn. Mục đích chính của những nội dung này là giúp những người mới tiếp xúc, làm quen và nắm rõ thông tin mạng lưới. Chúng tôi mong muốn hỗ trợ và làm việc tích hợp với các tài nguyên do cộng đồng xây dựng, giúp họ hiểu biết hơn và dễ khám phá hơn.
+[Cộng đồng của Ethereum](/community/) là trọng tâm của việc này: chúng tôi không chỉ cần phục vụ cộng đồng, mà còn cần làm việc với họ và ghi nhận phản hồi của họ. Trang web không chỉ đơn thuần dành cho cộng đồng mà nó còn là niềm hi vọng của chúng tôi đối với sự phát triển lớn mạnh. Chúng ta phải nhớ rằng cộng đồng này được phổ biến toàn cầu, bao gồm những con người không cùng ngôn ngữ, khu vực và văn hóa.
+
+### 2. ethereum.org luôn luôn phát triển 🛠 {#core-principles-2}
+
+Ethereum và cộng đồng sẽ luôn luôn không ngừng phát triển, ethereum.org cũng thế. Đó là lý do tại sao trang web có một hệ thống thiết kế đơn giản và cấu trúc mô-đun. Chúng tôi sẽ luôn thay đổi khi chúng tôi hiểu được cách mà mọi người sử dụng trang web và cộng đồng muốn gì từ những trang web đó.
+Chúng tôi là chiếc mã nguồn mở, với một cộng đồng xây dựng bởi những người đóng góp, vì vậy sẽ không tránh khỏi những sai sót có thể xảy ra. Chúng tôi rất mong bạn có thể đề xuất các thay đổi hoặc trợ giúp chúng tôi.
+[Tìm hiểu về việc đóng góp](/contributing/)
+
+### 3. ethereum.org không phải là một trang web sản phẩm thông thường 🦄 {#core-principles-3}
+
+Ethereum là một thứ gì đó rất trừu tượng: Nó bao gồm một cộng đồng, một công nghệ, một tập hợp các ý tưởng và hệ tư tưởng, v.v.
+Nó cũng đồng nghĩa với việc trang web cần phải tiếp cận và đồng hành với nhiều trải nghiệm khác nhau của người dùng, điển hình có thể là một "nhà lập trình viên chuyên nghiệp" hay một "người mới tìm hiểu dự tính mua ETH nhưng không biết ví điện tử là gì".
+"Trang web có nền tảng blockchain là gì?" vẫn là một câu hỏi hơi rộng - Chúng tôi là những người tiên phong. Đương nhiên trước khi làm chúng tôi phải thử nghiệm mọi thứ trước.
+
+## Lộ trình sản phẩm {#roadmap}
+
+Để giúp công việc của chúng tôi dễ tiếp cận hơn và để thúc đẩy sự hợp tác cộng đồng nhiều hơn, đội ngũ cốt lõi của ethereum.org công bố một cái nhìn tổng quan về các mục tiêu lộ trình [chu kỳ định hình](https://www.productplan.com/glossary/shape-up-method/) của chúng tôi.
+
+[Xem lộ trình sản phẩm Chu kỳ 1 năm 2025 của chúng tôi](https://github.com/ethereum/ethereum-org-website/issues/14726)
+
+**Bạn thấy sao?** Chúng tôi luôn đánh giá cao phản hồi về lộ trình của mình - nếu có điều gì bạn nghĩ chúng tôi nên làm, vui lòng cho chúng tôi biết! Chúng tôi chào đón mọi ý tưởng và đề xuất về tính năng sản phẩm từ bất kỳ ai trong cộng đồng.
+
+**Bạn muốn tham gia?** [Tìm hiểu thêm về việc đóng góp](/contributing/), [liên hệ với chúng tôi trên Twitter](https://x.com/ethdotorg), hoặc tham gia các cuộc thảo luận cộng đồng trong [máy chủ Discord của chúng tôi](https://discord.gg/ethereum-org).
+
+## Các nguyên tắc thiết kế {#design-principles}
+
+Chúng tôi sử dụng một bộ [nguyên tắc thiết kế](/contributing/design-principles/) để định hướng các quyết định về nội dung và thiết kế của chúng tôi trên trang web.
+
+## Hệ thống thiết kế {#design-system}
+
+Chúng tôi đã xây dựng và phát hành một [hệ thống thiết kế](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System?node-id=0%3A1&t=QBt9RkhpPqzE3Aa6-1) để cung cấp các tính năng nhanh hơn và cho phép các thành viên cộng đồng tham gia vào thiết kế mở của ethereum.org.
+
+Bạn muốn tham gia?[Theo dõi trên Figma](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System), [vấn đề trên GitHub](https://github.com/ethereum/ethereum-org-website/issues/6284) và tham gia cuộc trò chuyện trong [kênh Discord #design](https://discord.gg/ethereum-org) của chúng tôi.
+
+## Hướng dẫn văn phong {#style-guide}
+
+Chúng tôi có một [hướng dẫn văn phong](/contributing/style-guide/) để chuẩn hóa các khía cạnh nhất định của việc viết nội dung để làm cho quá trình đóng góp trở nên suôn sẻ hơn.
+
+Hãy chắc chắn rằng bạn đã đọc [các nguyên tắc của chúng tôi](/contributing/design-principles/) và [hướng dẫn văn phong của chúng tôi](/contributing/style-guide/) nếu bạn muốn [đóng góp cho trang web](/contributing/).
+
+Chúng tôi sẵn sàng tiếp nhận các phản hồi về các nguyên tắc thiết kế, hệ thống thiết kế và hướng dẫn phong cách thiết kế. Nên nhớ rằng, ethereum.org là cho cộng đồng và vì cộng đồng.
+
+## Giấy phép {#license}
+
+Trang web ethereum.org là mã nguồn mở và được xây dựng theo [Giấy phép MIT](https://github.com/ethereum/ethereum-org-website/blob/dev/LICENSE) trừ khi có quy định khác. Thông tin thêm về [điều khoản sử dụng](/terms-of-use/) của ethereum.org.
+
+## Việc làm đang tuyển {#open-jobs}
+
+Mặc dù trang web này là mã nguồn mở và bất kỳ ai cũng có thể làm việc trên nó, nhưng chúng tôi có một nhóm dành riêng cho ethereum.org và các dự án web của Ethereum Foundation khác nữa.
+
+Chúng tôi sẽ gửi chiêu mộ ở đây. Nếu bạn không thấy vai trò phù hợp cho mình ở đây, hãy truy cập [máy chủ Discord của chúng tôi](https://discord.gg/ethereum-org) và cho chúng tôi biết bạn muốn làm việc với chúng tôi như thế nào!
+
+Bạn muốn cùng tiến xa hơn với đội ngũ Ethereum? [Xem các công việc khác liên quan đến Ethereum](/community/get-involved/#ethereum-jobs/)
diff --git a/public/content/translations/vi/ai-agents/index.md b/public/content/translations/vi/ai-agents/index.md
new file mode 100644
index 00000000000..be571eaf34d
--- /dev/null
+++ b/public/content/translations/vi/ai-agents/index.md
@@ -0,0 +1,143 @@
+---
+title: AI agent
+metaTitle: Tác nhân AI | Các tác nhân AI trên Ethereum
+description: Tổng quan các tác nhân AI trên Ethereum
+lang: vi
+template: use-cases
+emoji: ":robot:"
+sidebarDepth: 2
+image: /images/ai-agents/hero-image.png
+alt: Mọi người đang họp ở bàn đầu cuối
+summaryPoint1: AI tương tác với chuỗi khối và giao dịch độc lập
+summaryPoint2: Kiểm soát vốn và ví trên chuỗi
+summaryPoint3: Tuyển dụng nhân sự hoặc những công cụ khác cho công việc
+buttons:
+ - content: Tác nhân AI là gì?
+ toId: ai-agents-on-ethereum
+ - content: Khám phá tác nhân Ai
+ toId: tác nhân ai trên ethereum
+ isSecondary: false
+---
+
+Hãy tưởng tượng việc điều hướng Ethereum với một trợ lý AI nghiên cứu xu hướng thị trường trên chuỗi 24/7, trả lời các câu hỏi và thậm chí thực hiện giao dịch thay cho bạn. Chào mừng đến thế giới của Trí tuệ nhân tạo - hệ thống thông minh được thiết kế đơn giản hóa cho cuộc sống số.
+
+Trên Ethereum, chúng ta đang chứng kiến những đổi mới của các tác nhân AI, từ những người ảnh hưởng ảo và các nhà sáng tạo nội dung tự động đến các nền tảng phân tích thị trường theo thời gian thực, trao quyền cho người dùng bằng cách cung cấp thông tin chi tiết, giải trí và hiệu quả vận hành.
+
+## Tác nhân AI là gì? {#what-are-ai-agents}
+
+Tác nhân AI là những chương trình phần mềm dùng trí thông minh nhân tạo để thực hiện nhiệm vụ và đưa ra quyết định. Chúng học từ dữ liệu, thích ứng với những thay đổi và xử lý các nhiệm vụ phức tạp. Chúng hoạt động không ngừng nghỉ và có thể phát hiện ra cơ hội ngay lập tức.
+
+### Cách tác nhân AI hoạt động với chuỗi khối {#how-ai-agents-work-with-blockchains}
+
+Trong tài chính truyền thống, tác nhân AI thường hoạt động trong môi trường tập trung với lượng dữ liệu đầu vào hạn chế. Điều này cản trở khả năng học hỏi hoặc quản lý tài sản một cách tự chủ của họ.
+
+Ngược lại, hệ sinh thái phi tập trung của Ethereum mang lại một số lợi thế quan trọng:
+
+- Dữ liệu minh bạch:Truy cập thông tin chuỗi khối theo thời gian thực.
+- Quyền sở hữu tài sản thực:Tài sản số được toàn quyền sở hữu bởi tác nhân AI.
+- Chức năng mạnh mẽ trên chuỗi: Cho phép các tác nhân AI thực hiện giao dịch, tương tác với hợp đồng thông minh, cung cấp thanh khoản và cộng tác trên nhiều giao thức.
+
+Các yếu tố này chuyển đổi các tác nhân AI từ con bot đơn giản thành các hệ thống năng động, tự cải thiện, mang lại giá trị đáng kể trên nhiều lĩnh vực:
+
+ Tốt để biết Tác nhân AI và các công cụ liên quan vẫn đang trong giai đoạn phát triển ban đầu và còn đang trong giai đoạn thử nghiệm—hãy thận trọng khi sử dụng.
`nonce``
+
+`` - _Thẻ mở, chứa một đoạn mã_
+
+nonce - _Văn bản không thể dịch_
+
+`` - _Thẻ đóng_
+
+
+
+Văn bản gốc cũng chứa các thẻ rút gọn, chỉ bao gồm số, khiến chức năng của chúng không dễ nhận ra ngay. Bạn có thể di chuột qua các thẻ này để xem chính xác chức năng mà chúng đảm nhận.
+
+Trong ví dụ bên dưới, bạn có thể thấy rằng việc di chuột qua thẻ `<0>` cho thấy nó đại diện cho thẻ `` và chứa một đoạn mã, do đó nội dung bên trong các thẻ này không nên được dịch.
+
+
+
+## Dạng ngắn và dạng đầy đủ/từ viết tắt {#short-vs-full-forms}
+
+Có rất nhiều chữ viết tắt được sử dụng trên trang web, ví dụ: dapps, NFT, DAO, DeFi, v.v. Các chữ viết tắt này thường được sử dụng trong tiếng Anh và hầu hết khách truy cập trang web đều quen thuộc với chúng.
+
+Vì chúng thường không có bản dịch chuẩn trong các ngôn ngữ khác, cách tốt nhất để xử lý những thuật ngữ này là cung cấp bản dịch mô tả đầy đủ, và thêm chữ viết tắt tiếng Anh trong ngoặc đơn.
+
+Không dịch các chữ viết tắt này, vì hầu hết mọi người sẽ không quen thuộc với chúng, và các phiên bản dịch địa phương sẽ không mang nhiều ý nghĩa đối với phần lớn khách truy cập.
+
+Ví dụ về cách dịch dapps:
+
+- Ứng dụng phi tập trung (dapps) → _Dạng đầy đủ đã dịch (viết tắt tiếng Anh trong ngoặc)_
+
+## Các thuật ngữ chưa có bản dịch chính thức {#terms-without-established-translations}
+
+Một số thuật ngữ có thể chưa có bản dịch chuẩn trong các ngôn ngữ khác và thường được biết đến rộng rãi bằng thuật ngữ gốc tiếng Anh. Các thuật ngữ này thường liên quan đến các khái niệm mới, như proof-of-work, proof-of-stake, Beacon Chain, staking, v.v.
+
+Khi dịch những thuật ngữ này có thể nghe không tự nhiên, vì phiên bản tiếng Anh cũng được sử dụng phổ biến trong nhiều ngôn ngữ khác, do đó rất khuyến khích nên dịch.
+
+Khi dịch, bạn có thể thoải mái sáng tạo, dùng cách dịch mô tả, hoặc chỉ dịch sát nghĩa.
+
+**Lý do hầu hết các thuật ngữ nên được dịch, thay vì để nguyên tiếng Anh, là vì những thuật ngữ mới này sẽ ngày càng phổ biến trong tương lai, khi nhiều người bắt đầu sử dụng Ethereum và các công nghệ liên quan. Nếu chúng ta muốn nhiều người từ khắp nơi trên thế giới tham gia vào lĩnh vực này, chúng ta cần cung cấp thuật ngữ dễ hiểu bằng nhiều ngôn ngữ nhất có thể, ngay cả khi phải tự tạo ra cách dịch.**
+
+## Nút & Lời kêu gọi hành động (CTA) {#buttons-and-ctas}
+
+Trang web có nhiều nút, và chúng cần được dịch khác so với nội dung khác.
+
+Văn bản trong nút có thể được xác định bằng cách xem ảnh chụp màn hình ngữ cảnh, đi kèm với hầu hết chuỗi, hoặc kiểm tra trong trình soạn thảo, nơi có chứa cụm từ “nút”.
+
+Bản dịch cho nút cần ngắn gọn nhất có thể để tránh lỗi định dạng. Ngoài ra, các bản dịch của nút phải ở dạng mệnh lệnh, tức là trình bày một lệnh hoặc yêu cầu.
+
+
+
+## Dịch thuật có tính bao hàm {#translating-for-inclusivity}
+
+Người dùng truy cập Ethereum.org đến từ khắp nơi trên thế giới và có nhiều bối cảnh khác nhau. Vì vậy, ngôn ngữ trên trang web cần mang tính trung lập, chào đón tất cả mọi người và không mang tính loại trừ.
+
+Một khía cạnh quan trọng của điều này là tính trung lập về giới. Điều này có thể được thực hiện dễ dàng bằng cách dùng cách xưng hô trang trọng và tránh các từ ngữ mang giới tính trong bản dịch.
+
+Một cách khác để thể hiện tính bao hàm là dịch theo hướng phù hợp với khán giả toàn cầu, không giới hạn ở bất kỳ quốc gia, chủng tộc hay khu vực nào.
+
+Cuối cùng, ngôn ngữ cần phù hợp cho mọi nhóm người dùng và mọi lứa tuổi.
+
+## Bản dịch theo ngôn ngữ cụ thể {#language-specific-translations}
+
+Khi dịch, điều quan trọng là tuân theo các quy tắc ngữ pháp, quy ước và định dạng của tiếng Việt, thay vì sao chép nguyên văn từ bản gốc. Văn bản gốc tuân theo quy tắc ngữ pháp và quy ước của tiếng Anh, điều này không nhất thiết áp dụng cho nhiều ngôn ngữ khác.
+
+Bạn cần nắm rõ các quy tắc của tiếng Việt và dịch cho phù hợp. Nếu cần hỗ trợ, hãy liên hệ với chúng tôi; chúng tôi sẽ giúp bạn tìm tài liệu tham khảo về cách áp dụng các yếu tố này trong tiếng Việt.
+
+Một số điểm cần đặc biệt lưu ý bao gồm:
+
+### Dấu câu, định dạng {#punctuation-and-formatting}
+
+**Viết hoa**
+
+- Quy tắc viết hoa có sự khác biệt rất lớn giữa các ngôn ngữ.
+- Trong tiếng Anh, thông thường sẽ viết hoa tất cả các từ trong tiêu đề và tên riêng, các tháng, ngày, tên ngôn ngữ, ngày lễ, v.v. Trong nhiều ngôn ngữ khác, điều này là sai ngữ pháp vì họ có những quy tắc viết hoa khác.
+- Một số ngôn ngữ cũng có quy tắc viết hoa đại từ nhân xưng, danh từ và một số tính từ, trong khi tiếng Anh thì không.
+
+**Khoảng cách**
+
+- Các quy tắc chính tả xác định cách sử dụng khoảng trắng cho từng ngôn ngữ. Vì khoảng trắng được sử dụng ở khắp mọi nơi, nên các quy tắc này là một trong những điểm khác biệt rõ ràng nhất, đồng thời cũng là yếu tố thường bị dịch sai nhiều nhất.
+- Một số khác biệt phổ biến về cách sử dụng khoảng trắng giữa tiếng Anh và các ngôn ngữ khác:
+ - Khoảng trắng trước các đơn vị đo lường và tiền tệ (ví dụ: USD, EUR, kB, MB)
+ - Khoảng trắng trước các ký hiệu độ (ví dụ: °C, ℉)
+ - Khoảng trắng trước một số dấu câu, đặc biệt là dấu chấm lửng (…)
+ - Khoảng trắng trước và sau dấu gạch chéo (/)
+
+**Danh sách**
+
+- Mỗi ngôn ngữ đều có một tập hợp quy tắc đa dạng và phức tạp để viết danh sách. Những quy tắc này có thể khác đáng kể so với tiếng Anh.
+- Trong một số ngôn ngữ, từ đầu tiên của mỗi dòng mới cần được viết hoa, trong khi ở các ngôn ngữ khác, dòng mới nên bắt đầu bằng chữ thường. Nhiều ngôn ngữ cũng có các quy tắc khác nhau về việc viết hoa trong danh sách, tùy thuộc vào độ dài của từng dòng.
+- Điều này cũng áp dụng cho dấu câu của từng mục trong danh sách. Dấu câu kết thúc trong danh sách có thể là dấu chấm (.), dấu phẩy (,) hoặc dấu chấm phẩy (;), tùy thuộc vào ngôn ngữ.
+
+**Dấu ngoặc kép**
+
+- Các ngôn ngữ sử dụng nhiều loại dấu ngoặc kép khác nhau. Chỉ đơn giản sao chép dấu ngoặc kép tiếng Anh từ nguồn thường là không chính xác.
+- Một số loại dấu ngoặc kép phổ biến nhất bao gồm:
+ - „văn bản ví dụ“
+ - ‚văn bản ví dụ‘
+ - »văn bản ví dụ«
+ - “văn bản ví dụ”
+ - ‘văn bản ví dụ’
+ - «văn bản ví dụ»
+
+**Dấu nối và dấu gạch ngang**
+
+- Trong tiếng Anh, dấu nối (-) được dùng để nối các từ hoặc các phần khác nhau của một từ, trong khi dấu gạch ngang (–) được dùng để chỉ một khoảng hoặc một chỗ ngắt.
+- Nhiều ngôn ngữ có các quy tắc khác nhau về việc sử dụng dấu nối và dấu gạch ngang mà cần được tuân thủ.
+
+### Định dạng {#formats}
+
+**Số**
+
+- Điểm khác biệt chính trong cách viết số ở các ngôn ngữ khác nhau là ký hiệu phân tách được dùng cho số thập phân và số hàng nghìn. Đối với hàng nghìn, ký hiệu phân tách có thể là dấu chấm, dấu phẩy hoặc khoảng trắng. Tương tự, một số ngôn ngữ dùng dấu chấm thập phân, trong khi các ngôn ngữ khác dùng dấu phẩy thập phân.
+ - Một số ví dụ về các số lớn:
+ - Tiếng Anh – **1,000.50**
+ - Tiếng Tây Ban Nha – **1.000,50**
+ - Tiếng Pháp – **1 000,50**
+- Một yếu tố quan trọng khác khi dịch số là dấu phần trăm. Nó có thể được viết theo nhiều cách khác nhau: **100%**, **100 %** hoặc **%100**.
+- Cuối cùng, số âm có thể được hiển thị theo nhiều cách khác nhau, tùy thuộc vào ngôn ngữ: -100, 100-, (100) hoặc [100].
+
+**Ngày tháng**
+
+- Khi dịch ngày tháng, có nhiều điểm cần lưu ý và khác biệt tùy theo ngôn ngữ. Những yếu tố này bao gồm định dạng ngày, ký hiệu phân tách, chữ hoa và số 0 đứng đầu. Ngoài ra còn có sự khác biệt giữa cách viết ngày đầy đủ và cách viết ngày bằng số.
+ - Một số ví dụ về định dạng ngày khác nhau:
+ - Tiếng Anh – Vương quốc Anh (dd/mm/yyyy) – 1 tháng 1, 2022
+ - Tiếng Anh – Mỹ (mm/dd/yyyy) – ngày 1 tháng 1, 2022
+ - Tiếng Trung (yyyy-mm-dd) – 2022 年 1 月 1 日
+ - Tiếng Pháp (dd/mm/yyyy) – 1er janvier 2022
+ - Tiếng Ý (dd/mm/yyyy) – 1º gennaio 2022
+ - Tiếng Đức (dd/mm/yyyy) – 1. Januar 2022 Januar 2022
+
+**Tiền tệ**
+
+- Việc dịch các đơn vị tiền tệ có thể phức tạp do sự khác biệt về định dạng, quy ước và cách chuyển đổi. Theo nguyên tắc chung, hãy giữ nguyên đơn vị tiền tệ giống như trong nguồn. Bạn có thể thêm đơn vị tiền tệ địa phương và giá trị quy đổi trong ngoặc để người đọc dễ hiểu hơn.
+- Sự khác biệt chính trong cách viết đơn vị tiền tệ ở các ngôn ngữ khác nhau bao gồm vị trí ký hiệu, dấu phẩy thập phân so với dấu chấm thập phân, khoảng cách và viết tắt so với ký hiệu.
+ - Vị trí ký hiệu: $100 hoặc 100$
+ - Dấu phẩy thập phân so với dấu chấm thập phân: 100,50$ hoặc 100.50$
+ - Khoảng cách: 100$ hoặc 100 $
+ - Viết tắt so với ký hiệu: 100 $ hoặc 100 USD
+
+**Đơn vị đo lường**
+
+- Theo nguyên tắc chung, hãy giữ nguyên đơn vị đo lường giống như trong nguồn. Nếu quốc gia của bạn sử dụng hệ thống khác, bạn có thể thêm phần quy đổi trong ngoặc.
+- Ngoài việc bản địa hóa đơn vị đo lường, cũng cần lưu ý đến sự khác biệt trong cách các ngôn ngữ sử dụng các đơn vị này. Điểm khác biệt chính là khoảng cách giữa số và đơn vị, có thể khác nhau tùy theo ngôn ngữ. Ví dụ về điều này bao gồm 100kB so với 100 kB hoặc 50ºF so với 50 ºF.
+
+## Kết luận {#conclusion}
+
+Dịch ethereum.org là một cơ hội tuyệt vời để tìm hiểu về các khía cạnh khác nhau của Ethereum.
+
+Khi dịch, hãy cố gắng đừng vội vàng. Hãy thoải mái và tận hưởng niềm vui!
+
+Cảm ơn bạn đã tham gia Chương trình Dịch thuật và giúp chúng tôi mang trang web đến với nhiều người hơn. Cộng đồng Ethereum là toàn cầu, và chúng tôi rất vui vì bạn là một phần của cộng đồng này!
diff --git a/public/content/translations/vi/dao/index.md b/public/content/translations/vi/dao/index.md
index 14f90daea66..768a8b9cd7a 100644
--- a/public/content/translations/vi/dao/index.md
+++ b/public/content/translations/vi/dao/index.md
@@ -1,5 +1,6 @@
---
-title: Các tổ chức tự trị phi tập trung (DAO)
+title: DAO là gì?
+metaTitle: DAO là gì? | Tổ chức ẩn danh phi tập trung
description: Tổng quan về DAO trên Ethereum
lang: vi
template: use-cases
@@ -14,11 +15,11 @@ summaryPoint3: Một nơi an toàn để cam kết tài trợ cho một quỹ c
## Các tổ chức tự trị phi tập trung (DAO) là gì? {#what-are-daos}
-Tổ chức tự trị phi tập trung (DAO) là một tổ chức thuộc quyền sở hữu tập thể, hoạt động dựa trên công nghệ chuỗi khối (blockchain) hướng đến một sứ mệnh chung.
+Tổ chức tự trị phi tập trung (DAO) là một tổ chức thuộc quyền sở hữu tập thể, hoạt động dựa hướng đến một sứ mệnh chung.
Các DAO này cho phép chúng ta làm việc cùng những người đồng chí hướng mà không cần đến một cá nhân lãnh đạo đủ tin cậy để quản lý ngân sách và vận hành của tổ chức. Trong tổ chức không có một CEO nhất định có khả năng tiêu tiền bừa bãi, hay một CFO có quyền hành sửa đổi ngân sách. Các quy tắc dựa trên công nghệ chuỗi khối (blockchain) được viết trong các đoạn mã nguồn sẽ quyết định cách hoạt động của tổ chức, và cách ngân khố được sử dụng.
-Chúng có những ngân khố riêng mà không ai có thẩm quyền tiếp cận mà không có sự chấp thuận của nhóm. Các quyết định được quản lý bằng các đề xuất và bầu cử, để đảm bảo tất cả thành viên trong tổ chức đều có tiếng nói, và đảm bảo mọi việc đều diễn ra trong minh bạch trên chuỗi (on-chain).
+Chúng có những ngân khố riêng mà không ai có thẩm quyền tiếp cận mà không có sự chấp thuận của nhóm. Các quyết định được quản lý bằng các đề xuất và bỏ phiếu để đảm bảo mọi người trong tổ chức đều có tiếng nói và mọi thứ diễn ra một cách minh bạch [trên chuỗi](/glossary/#onchain).
## Tại sao chúng ta lại cần đến các tổ chức tự trị phi tập trung (DAO)? {#why-dao}
@@ -26,140 +27,143 @@ Chúng có những ngân khố riêng mà không ai có thẩm quyền tiếp c
Điều này mở ra vô vàn cơ hội mới cho những sự hợp tác và điều phối toàn cầu.
-### Một so sánh {#dao-comparison}
+### So sánh {#dao-comparison}
-| Tổ chức tự trị phi tập trung (DAO) | Một tổ chức truyền thống |
-| --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
-| Thường có cấu trúc rõ ràng và dân chủ toàn diện. | Thường có cấu trúc phân tầng. |
-| Đòi hỏi các thành viên phải bỏ phiếu cho bất kì một thay đổi nào. | Tùy vào cấu trúc, thay đổi có thể đến từ một đảng phái duy nhất, hoặc việc bỏ phiếu có thể được phe cầm quyền đề nghị. |
-| Lá phiếu được đếm và kết quả bỏ phiếu được thi hành một cách tự động mà không cần đến một bên trung gian. | Nếu việc bỏ phiếu được cho phép, lá phiếu được đếm trong nội bộ tổ chức và kết quả của cuộc bỏ phiếu được thi hành một cách thủ công. |
+| DAO | Một tổ chức truyền thống |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Thường có cấu trúc rõ ràng và dân chủ toàn diện. | Thường có cấu trúc phân tầng. |
+| Đòi hỏi các thành viên phải bỏ phiếu cho bất kì một thay đổi nào. | Tùy vào cấu trúc, thay đổi có thể đến từ một đảng phái duy nhất, hoặc việc bỏ phiếu có thể được phe cầm quyền đề nghị. |
+| Lá phiếu được đếm và kết quả bỏ phiếu được thi hành một cách tự động mà không cần đến một bên trung gian. | Nếu việc bỏ phiếu được cho phép, lá phiếu được đếm trong nội bộ tổ chức và kết quả của cuộc bỏ phiếu được thi hành một cách thủ công. |
| Những dịch vụ được cung cấp bởi tổ chức được thực hiện một cách tự động theo một phương thức phi tập trung (ví dụ: việc phân bổ của những khoản tiền từ thiện). | Đòi hỏi phải có sự tham gia của con người hoặc sự tự động hóa được điều khiển bởi một quyền lực trung ương, dễ bị thao túng. |
-| Mọi hoạt động đều minh bạch và công khai. | Hoạt động thường mang tính riêng tư và không có sự tham gia của cộng đồng. |
+| Mọi hoạt động đều minh bạch và công khai. | Hoạt động thường mang tính riêng tư và không có sự tham gia của cộng đồng. |
-### Những ví dụ về tổ chức tự trị phi tập trung (DAO) {#dao-examples}
+### Ví dụ về DAO {#dao-examples}
Để giúp làm rõ hơn khái niệm này, sau đây là một số ví dụ về các tổ chức tự trị phi tập trung (DAO):
-- Tổ chức từ thiện - Bạn có thể nhận quyên góp từ bất kỳ ai trên thế giới, và bầu chọn nên hỗ trợ quyên góp cho tổ chức, lý tưởng nào.
-- Quyền sở hữu tập thể - Bạn có thể mua tài sản số hoặc vật chất và các thành viên trong tổ chức có thể bầu chọn cách sử dụng các tài sản này.
-- Các khoản đầu tư và tài trợ - bạn có thể tạo ra một quỹ đầu tư từ vốn góp chung và bỏ phiếu cho những dự án mà quỹ muốn rót vốn. Tiền lời sau đó có thể được tái phân bổ cho những thành viên của tổ chức (DAO).
+- **Một tổ chức từ thiện** – bạn có thể nhận quyên góp từ bất kỳ ai trên thế giới và bỏ phiếu về việc gây quỹ cho mục đích nào.
+- **Sở hữu tập thể** – bạn có thể mua tài sản vật chất hoặc kỹ thuật số và các thành viên có thể bỏ phiếu về cách sử dụng chúng.
+- **Các liên doanh và tài trợ** – bạn có thể tạo một quỹ đầu tư mạo hiểm gộp chung vốn đầu tư và bỏ phiếu cho các liên doanh để hỗ trợ. Tiền lời sau đó có thể được tái phân bổ cho những thành viên của tổ chức (DAO).
+
+
## Những tổ chức tự trị phi tập trung (DAO) hoạt động như thế nào? {#how-daos-work}
-Phần cốt lõi của một tổ chức tự trị phi tập trung (DAO) là các Hợp đồng thông minh, là thứ sẽ đặt ra các quy tắc trong tổ chức và nắm giữ ngân khố cả nhóm. Một khi hợp đồng đã được kích hoạt trên Ethereum, không ai có thể thay đổi luật chơi ngoại trừ bằng một cuộc bỏ phiếu. Nếu bất kì ai cố gắng làm một điều gì đó nằm ngoài phạm vi của luật chơi và logic trong đoạn mã đã được lập trình, hành động đó sẽ thất bại. Và bởi vì ngân khố cũng được định nghĩa bởi hợp đồng thông minh nên không ai có thể dùng tiền mà không có sự chấp thuận của nhóm. Điều này đồng nghĩa với việc những tổ chức tự trị phi tập trung (DAO) không cần một thẩm quyền trung ương. Thay vào đó, tổ chức sẽ đưa ra quyết định tập thể và các khoản chi được thông qua một cách tự động khi đã đủ số phiếu.
+Xương sống của một DAO là [hợp đồng thông minh](/glossary/#smart-contract) của nó, hợp đồng này xác định các quy tắc của tổ chức và nắm giữ ngân quỹ của nhóm. Một khi hợp đồng đã được kích hoạt trên Ethereum, không ai có thể thay đổi luật chơi ngoại trừ bằng một cuộc bỏ phiếu. Nếu bất kì ai cố gắng làm một điều gì đó nằm ngoài phạm vi của luật chơi và logic trong đoạn mã đã được lập trình, hành động đó sẽ thất bại. Và bởi vì ngân khố cũng được định nghĩa bởi hợp đồng thông minh nên không ai có thể dùng tiền mà không có sự chấp thuận của nhóm. Điều này đồng nghĩa với việc những tổ chức tự trị phi tập trung (DAO) không cần một thẩm quyền trung ương. Thay vào đó, tổ chức sẽ đưa ra quyết định tập thể và các khoản chi được thông qua một cách tự động khi đã đủ số phiếu.
Cách tổ chức này là có thể vì những hợp đồng thông minh trở nên không thể bị thay đổi một khi chúng đã được kích hoạt trên Ethereum. Bạn không thể chỉnh sửa những đoạn mã trong hợp đồng (những điều luật của DAO) mà không bị người khác phát hiện vì tất cả đều được công khai.
-
- Hiểu thêm về những hợp đồng thông minh
-
-
-## Ethereum và những tổ chức tự trị phi tập trung (DAO) {#ethereum-and-daos}
+## Ethereum và các DAO {#ethereum-and-daos}
Ethereum là nền tảng hoàn hảo cho những tổ chức tự trị phi tập trung (DAO) bởi một số lý do sau:
-- Cơ chế đồng thuận của Ethereum có sự phân tán đủ rộng và bảng dày thành tích đủ lớn để cho các tổ chức có thể tin tưởng vào mạng lưới.
+- Cơ chế đồng thuận của Ethereum có sự phân tán đủ rộng và đủ uy tín để các tổ chức có thể tin tưởng vào mạng lưới.
- Mã của hợp đồng thông minh không thể chỉnh sửa được một khi được kích hoạt, kể cả bởi những người chủ sở hữu của nó. Điều này cho phép tổ chức tự trị phi tập trung (DAO) vận hành bởi những luật chơi đã được lập trình từ ban đầu.
- Các hợp đồng thông minh có thể gửi/nhận tiền. Không có chúng, bạn sẽ cần một bên trung gian đủ tin cậy để quản lý ngân khố của nhóm.
- Cộng đồng của Ethereum mang tính tương hỗ nhiều hơn là cạnh tranh. Điều này cho phép các phương pháp hay nhất và những hệ thống bổ trợ được ra đời một cách nhanh chóng.
-## Các pháp chế của DAO {#dao-governance}
+## Quản trị DAO {#dao-governance}
Có rất nhiều yếu tố cần xem xét khi điều hành một DAO, chẳng hạn như cách thức bỏ phiếu và đề xuất hoạt động.
-### Sự uỷ quyền {#governance-delegation}
+### Ủy quyền {#governance-delegation}
-Sự uy quyền giống như phiên bản DAO của đại diện nền dân chủ. Các chủ sở hữu Token ủy quyền phiếu bầu cho những người dùng tự đề cử và cam kết đảm bảo quản trị giao thức và luôn cập nhật thông tin.
+Sự ủy quyền giống như phiên bản DAO của nền dân chủ đại diện. Các chủ sở hữu Token ủy quyền phiếu bầu cho những người dùng tự đề cử và cam kết đảm bảo quản trị giao thức và luôn cập nhật thông tin.
-#### Một ví dụ phổ biến {#governance-example}
+#### Một ví dụ nổi tiếng {#governance-example}
-[ENS](https://claim.ens.domains/delegate-ranking)– Chủ sở hữu ENS có thể uỷ quyền phiếu bầu cho các thành viên trong cộng đồng để đại diện cho họ.
+[ENS](https://claim.ens.domains/delegate-ranking) – những người nắm giữ ENS có thể ủy quyền phiếu bầu của họ cho các thành viên cộng đồng tích cực để đại diện cho họ.
-### Quản lý giao dịch tự động {#governance-example}
+### Quản trị giao dịch tự động {#governance-example}
Ở nhiều DAO, các giao dịch sẽ được thực hiện tự động nếu một số thành viên bỏ phiếu đồng ý.
#### Một ví dụ nổi tiếng {#governance-example}
-[Nouns](https://nouns.wtf) – Trong Nouns DAO, một giao dịch sẽ tự động được thực hiện nếu đáp ứng đủ số phiếu bầu và đa số phiếu ủng hộ, miễn là nó không bị những người sáng lập phủ quyết.
+[Nouns](https://nouns.wtf) – Trong Nouns DAO, một giao dịch sẽ được thực thi tự động nếu đạt được số đại biểu và đa số phiếu tán thành, miễn là nó không bị những người sáng lập phủ quyết.
### Quản trị đa chữ ký {#governance-example}
-Trong khi DAO có thể có hàng ngàn thành viên bỏ phiếu, tài khoản tiền có thể được lưu trữ trong một ví được chia sẻ bởi 5-20 thành viên cộng đồng hoạt động tích cực, được tin tưởng và thường công khai danh tính (được cộng đồng biết đến danh tính). Sau khi một cuộc bỏ phiếu được tiến hành, những người ký đa chữ ký sẽ thực hiện quyết định của cộng đồng.
+Mặc dù các DAO có thể có hàng nghìn thành viên bỏ phiếu, nhưng các quỹ có thể nằm trong một [ví](/glossary/#wallet) được chia sẻ bởi 5-20 thành viên cộng đồng tích cực, những người đáng tin cậy và thường được doxxed (danh tính công khai được cộng đồng biết đến). Sau một cuộc bỏ phiếu, những người ký [đa chữ ký](/glossary/#multisig) sẽ thực hiện ý muốn của cộng đồng.
-## Các luật của DAO {#dao-laws}
+## Luật DAO {#dao-laws}
Vào năm 1977, Wyoming đã phát minh ra LLC để bảo vệ các doanh nhân và giới hạn quyền của họ. Gần đây nhất, họ đã đi tiên phong trong luật DAO thiết lập tư cách pháp lý cho DAO. Hiện tại Wyoming, Vermont và quần đảo Virgin đã có đạo luật DAO dưới một số hình thức.
-### Một ví dụ phổ biến {#law-example}
+### Một ví dụ nổi tiếng {#law-example}
-[CityDAO](https://citizen.citydao.io/) – CityDAO đã sử dụng luật DAO của Wyoming để mua 40 mẫu đất gần Công viên Quốc gia Yellowstone.
+[CityDAO](https://citizen.citydao.io/) – CityDAO đã sử dụng luật DAO của Wyoming để mua 40 mẫu Anh đất gần Công viên Quốc gia Yellowstone.
-## Hội viên của tổ chức tự trị phi tập trung (DAO membership) {#dao-membership}
+## Tư cách thành viên DAO {#dao-membership}
Có những mô hình khác nhau cho hội viên của một tổ chức tự trị phi tập trung (DAO). Hội viên có thể quyết định việc bỏ phiếu vận hành như thế nào cũng như phần cốt lõi khác của DAO.
-### Hội viên dựa trên token {#token-based-membership}
+### Tư cách thành viên dựa trên token {#token-based-membership}
-Thường hoàn toàn không cần sự cho phép, tùy thược vào loại token được sử dụng. Hầu hết các token quản trị này có thể được trao đổi tự do trên các sàn giao dịch phi tập trung. Một số khác có thể kiếm được thông qua cung cấp thanh khoản hoặc một vài cơ chế 'proof of work' khác. Dù bằng cách nào thì việc nắm giữ token giúp người sở hữu có quyền bỏ phiếu.
+Thường hoàn toàn [không cần cấp phép](/glossary/#permissionless), tùy thuộc vào token được sử dụng. Hầu hết các token quản trị này có thể được giao dịch một cách không cần cấp phép trên một [sàn giao dịch phi tập trung](/glossary/#dex). Một số khác có thể kiếm được thông qua cung cấp thanh khoản hoặc một vài cơ chế 'bằng chứng công việc' khác. Dù bằng cách nào thì việc nắm giữ token giúp người sở hữu có quyền bỏ phiếu.
_Token thường được dùng để quản trị những giao thức phi tập trung lớn hoặc/và chính những token đó._
-#### Một ví dụ phổ biến {#token-example}
+#### Một ví dụ nổi tiếng {#token-example}
-[MakerDAO](https://makerdao.com) – Token của MakerDAO là MKR có sẵn trên các sàn giao dịch phi tập trung và bất kỳ ai cũng có thể mua để có quyền biểu quyết đối với tương lai của giao thức Maker.
+[MakerDAO](https://makerdao.com) – Token MKR của MakerDAO có sẵn rộng rãi trên các sàn giao dịch phi tập trung và bất kỳ ai cũng có thể mua để có quyền biểu quyết đối với tương lai của giao thức Maker.
-### Hội viên dựa trên cổ phần {#share-based-membership}
+### Tư cách thành viên dựa trên cổ phần {#share-based-membership}
Những tổ chức tự trị phi tập trung (DAO) dựa trên cổ phần cần đến sự cho phép nhiều hơn nhưng vẫn rất cởi mở. Bất kỳ ai cũng có thể đề xuất gia nhập DAO, bằng cách đóng góp cho tổ chức giá trị nào đó, thường dưới dạng token hoặc lao động. Cổ phần đại diện cho quyền bổ phiếu và quyền sở hữu trực tiếp. Hội viên có thể rời bỏ bất cứ lúc nào và được giữ toàn bộ ngân khố tương đương tỉ lệ hội viên đó nắm giữ.
_Hình thức này thường được dùng cho những tổ chức có sự gắn kết cao và xoay quanh con người như những quỹ từ thiện, công đoàn và câu lạc bộ đầu tư. Nó cũng có thể quản trị những giao thức và token._
-#### Một ví dụ phổ biến {#share-example}
+#### Một ví dụ nổi tiếng {#share-example}
-[MolochDAO](http://molochdao.com/) - Tổ chức tự trị phi tập trung Moloch chuyên về đầu tư cho các dự án liên quan đến Ethereum. Moloch yêu cầu hội viên tiềm năng nộp một đề xuất tham gia. Dự trên đề xuất đó, Moloch có thể đánh giá liệu bạn có kĩ năng chuyên môn và tài chính cần thiết để đưa ra những phán quyết sáng suốt về những ứng viên tương lai hay không. Bạn không thể mua quyền truy cập DAO trên một sàn dịch mở.
+[MolochDAO](http://molochdao.com/) – MolochDAO tập trung vào việc tài trợ cho các dự án Ethereum. Moloch yêu cầu hội viên tiềm năng nộp một đề xuất tham gia. Dựa trên đề xuất đó, Moloch có thể đánh giá liệu bạn có kĩ năng chuyên môn và tài chính cần thiết để đưa ra những phán quyết sáng suốt về những ứng viên tương lai hay không. Bạn không thể mua quyền truy cập DAO trên một sàn giao dịch mở.
-### Tư cách hội viên dựa trên uy tín {#reputation-based-membership}
+### Tư cách thành viên dựa trên danh tiếng {#reputation-based-membership}
-Độ uy tín đại diện cho bằng chứng về sự tham gia và trao quyền biểu quyết trong DAO. Không giống như token hoặc tư cách hội viên dựa trên cổ phần, các DAO dựa trên uy tín không thể chuyển quyền sở hữu cho những người đóng góp. Độ uy tín không thể mua, chuyển nhượng hoặc ủy quyền; hội viên DAO phải xây dựng uy tín qua sự đóng góp. Bỏ phiếu trên chuỗi không yêu cầu sự cho phép và các hội viên tiềm năng có thể tự do gửi đề xuất tham gia DAO và yêu cầu độ uy tín và token như một phần thưởng để đổi lấy những đóng góp của họ.
+Độ uy tín đại diện cho bằng chứng về sự tham gia và trao quyền biểu quyết trong DAO. Không giống như token hoặc tư cách hội viên dựa trên cổ phần, các DAO dựa trên uy tín không thể chuyển quyền sở hữu cho những người đóng góp. Độ uy tín không thể mua, chuyển nhượng hoặc ủy quyền; hội viên DAO phải xây dựng uy tín qua sự đóng góp. Không ai bị giới hạn bỏ phiếu trên chuỗi và các thành viên muốn giai nhập có thể tự do gửi đề xuất để tham gia DAO và yêu cầu được nhận danh tiếng hay Token như một phần thưởng cho đóng góp của họ.
-_Thường được sử dụng để phát triển và quản lí phi tập trung các giao thức và ứng dụng phi tập trung, nhưng cũng rất phù hợp với một loạt các tổ chức như tổ chức từ thiện, tập thể công nhân, câu lạc bộ đầu tư, v.v._
+_Thường được sử dụng để phát triển và quản trị phi tập trung các giao thức và [ứng dụng phi tập trung](/glossary/#dapp), nhưng cũng rất phù hợp với một loạt các tổ chức đa dạng như tổ chức từ thiện, tập thể người lao động, câu lạc bộ đầu tư, v.v._
-#### Một ví dụ phổ biến {#reputation-example}
+#### Một ví dụ nổi tiếng {#reputation-example}
-[DXdao](https://DXdao.eth.link) - DXdao là một tổ chức có quyền xây dựng và quản lý toàn cầu các giao thức và ứng dụng phi tập trung kể từ năm 2019. Nó thúc đẩy quản trị dựa trên quyền lực và sự đồng thuận đa chiều để điều phối và quản lý các quỹ, có nghĩa là không ai có thể dùng tiền để ảnh hưởng đến nó sau này.
+[DXdao](https://DXdao.eth.limo) – DXdao là một tập thể có chủ quyền toàn cầu xây dựng và quản trị các giao thức và ứng dụng phi tập trung từ năm 2019. Nó đã tận dụng cơ chế quản trị dựa trên danh tiếng và [sự đồng thuận đa chiều](/glossary/#holographic-consensus) để điều phối và quản lý các quỹ, có nghĩa là không ai có thể dùng tiền để tác động đến tương lai hoặc cơ chế quản trị của nó.
-## Gia nhập / khởi phát một tổ chức tự trị phi tập trung (DAO) {#join-start-a-dao}
+## Tham gia / bắt đầu một DAO {#join-start-a-dao}
-### Gia nhập một tổ chức tự trị phi tập trung (DAO) {#join-a-dao}
+### Tham gia một DAO {#join-a-dao}
-- [Những DAO trên Ethereum](/community/get-involved/#decentralized-autonomous-organizations-daos)
+- [Các DAO cộng đồng Ethereum](/community/get-involved/#decentralized-autonomous-organizations-daos)
- [Danh sách các DAO của DAOHaus](https://app.daohaus.club/explore)
-- [Danh sách các DAO của Tally.xyz](https://www.tally.xyz)
+- [Danh sách các DAO của Tally.xyz](https://www.tally.xyz/explore)
+- [Danh sách các DAO của DeGov.AI](https://apps.degov.ai/)
-### Khởi tạo một DAO {#start-a-dao}
+### Bắt đầu một DAO {#start-a-dao}
-- [Kêu gọi một DAO với DAOHaus](https://app.daohaus.club/summon)
-- [Bắt đầu một Governor DAO với Tally](https://www.tally.xyz/add-a-dao)
-- [Tạo ra một DAO được hỗ trợ bởi Aragon](https://aragon.org/product)
-- [Khởi phát một thuộc địa](https://colony.io/)
-- [Tạo một DAO với sự đồng thuận đa chiều DAOstack](https://alchemy.daostack.io/daos/create)
+- [Triệu tập một DAO với DAOHaus](https://app.daohaus.club/summon)
+- [Bắt đầu một Governor DAO với Tally](https://www.tally.xyz/get-started)
+- [Tạo một DAO được hỗ trợ bởi Aragon](https://aragon.org/product)
+- [Bắt đầu một colony](https://colony.io/)
+- [Tạo một DAO với sự đồng thuận đa chiều của DAOstack](https://alchemy.daostack.io/daos/create)
+- [Khởi chạy một DAO với DeGov Launcher](https://docs.degov.ai/integration/deploy)
## Đọc thêm {#further-reading}
-### Những bài viết về DAO {#dao-articles}
+### Các bài viết về DAO {#dao-articles}
- [DAO là gì?](https://aragon.org/dao) – [Aragon](https://aragon.org/)
-- [Sổ tay DAO](https://daohandbook.xyz)
-- [Ngôi nhà của các DAO](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) - [Metagame](https://wiki.metagame.wtf/)
-- [Một DAO là gì và để làm gì?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) - [DAOhaus](https://daohaus.club/)
-- [Làm thế nào để khởi phát một cộng đồng số hoạt động dựa trên DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) - [DAOhaus](https://daohaus.club/)
-- [DAO là gì?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) - [Coinmarketcap](https://coinmarketcap.com)
-- [Đồng thuận đa chiều là gì?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/)
-- [DAO không phải là công ty: Khi sự phân quyền trong tổ chức tự trị có vai trò quan trọng, theo Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html)
-- [DAO, DAC, DA và Nhiều Hơn Nữa: Hướng Dẫn Thuật Ngữ Không Hoàn Chỉnh](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blog](https://blog.ethereum.org)
-
-### Các đoạn video {#videos}
-
-- [DAO đóng vai trò gì trong tiền mã hóa?](https://youtu.be/KHm0uUPqmVE)
-- [Một DAO có thể tạo nên một thành phố được không?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) - [TED](https://www.ted.com/)
+- [House of DAOs](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/)
+- [DAO là gì và dùng để làm gì?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) – [DAOhaus](https://daohaus.club/)
+- [Làm thế nào để bắt đầu một cộng đồng kỹ thuật số được hỗ trợ bởi DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/)
+- [DAO là gì?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com)
+- [Sự đồng thuận đa chiều là gì?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/)
+- [Các DAO không phải là tập đoàn: nơi sự phi tập trung trong các tổ chức tự trị có vai trò quan trọng của Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html)
+- [DAO, DAC, DA và hơn thế nữa: Hướng dẫn thuật ngữ chưa đầy đủ](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Blog của Ethereum](https://blog.ethereum.org)
+
+### Video {#videos}
+
+- [DAO trong crypto là gì?](https://youtu.be/KHm0uUPqmVE)
+- [Một DAO có thể xây dựng một thành phố không?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) – [TED](https://www.ted.com/)
+
+
+
+
diff --git a/public/content/translations/vi/decentralized-identity/index.md b/public/content/translations/vi/decentralized-identity/index.md
new file mode 100644
index 00000000000..f2f93e8c674
--- /dev/null
+++ b/public/content/translations/vi/decentralized-identity/index.md
@@ -0,0 +1,218 @@
+---
+title: Định danh phi tập trung
+description: Định danh phi tập trung là gì, và tại sao nó cần thiết?
+lang: vi
+template: use-cases
+emoji: ":id:"
+sidebarDepth: 2
+image: /images/eth-gif-cat.png
+summaryPoint1: Các hệ thống định danh truyền thống tập trung vào việc cấp, duy trì và kiểm soát các định danh của bạn.
+summaryPoint2: Danh tính phi tập trung loại bỏ sự phụ thuộc vào các bên tập trung thứ ba.
+summaryPoint3: Nhờ vào tiền mã hóa, người dùng giờ đây có các công cụ để phát hành, lưu giữ và kiểm soát các số định danh và chứng từ của riêng họ một lần nữa.
+---
+
+Danh tính làm nền tảng cho hầu như mọi phương diện trong cuộc sống của bạn ngày nay. Sử dụng các dịch vụ trực tuyến, mở tài khoản ngân hàng, bỏ phiếu trong cuộc bầu cử, mua tài sản, đảm bảo việc làm — tất cả những việc này đều yêu cầu chứng minh danh tính của bạn.
+
+Tuy nhiên, các hệ thống quản lý danh tính truyền thống từ lâu đã dựa vào các bên trung gian tập trung để phát hành, nắm giữ và kiểm soát số nhận dạng cũng như [chứng thực](/glossary/#attestation) của bạn. Điều này có nghĩa là bạn không thể kiểm soát thông tin liên quan đến danh tính của mình hoặc quyết định ai có quyền truy cập vào thông tin nhận dạng cá nhân (CCCD/CMND) và mức độ mà các bên này được phép truy cập.
+
+Để giải quyết những vấn đề này, chúng tôi có các hệ thống định danh phi tập trung được xây dựng trên chuỗi khối công khai như Ethereum. Danh tính phi tập trung cho phép các cá nhân quản lý thông tin liên quan đến danh tính của họ. Với các giải pháp danh tính phi tập trung, _bạn_ có thể tạo số nhận dạng, đồng thời yêu cầu và nắm giữ các chứng thực của mình mà không cần dựa vào các cơ quan trung ương, như nhà cung cấp dịch vụ hoặc chính phủ.
+
+## Danh tính là gì? {#what-is-identity}
+
+Danh tính nghĩa là những thông tin được dùng để gán riêng cho một đối tượng nhất định. Danh tính chỉ việc là một _cá nhân_, tức là một thực thể con người riêng biệt. Danh tính cũng có thể đại diện cho các thực thể không phải con người, chẳng hạn như một tổ chức hoặc cơ quan có thẩm quyền.
+
+
+
+## Sổ định danh là gì? {#what-are-identifiers}
+
+Sổ định danh là một phần thông tin hoạt động như một thiết bị truy xuất danh tính cụ thể. Sổ định danh thường bao gồm:
+
+- Họ tên
+- Số an sinh xã hội/mã số thuế
+- Số điện thoại
+- Ngày tháng năm và nơi sinh
+- Danh tính kỹ thuật số, vd., địa chỉ email, usernames, avatars
+
+Các ví dụ về sổ định danh này được cấp, nắm giữ và kiểm soát bởi các cơ quan quản lý trung ương. Bạn cần phải xin quyền từ chính phủ để được đổi tên hoặc từ một nền tảng truyền thông xã hội để thay đổi danh tính của bạn.
+
+## Lợi ích của danh tính phi tập trung {#benefits-of-decentralized-identity}
+
+1. Danh tính phi tập trung gia tăng quyền kiểm soát của cá nhân đối với thông tin danh tính. Định danh phi tập trung và chứng thực có thể được xác minh mà không phụ thuộc vào bên thẩm quyền tập trung hoặc dịch vụ bên thứ ba.
+
+2. Các giải pháp danh tính phi tập trung tạo điều kiện cho một phương pháp không cần tin cậy, liền mạch và bảo vệ quyền riêng tư để xác minh và quản lý danh tính người dùng.
+
+3. Danh tính phi tập trung khai thác công nghệ blockchain, giúp tạo niềm tin giữa các bên và cung cấp bảo đảm mật mã học để xác minh tính hợp lệ của chứng thực.
+
+4. Danh tính phi tập trung làm dữ liệu danh tính di động. Người dùng trữ chứng thực và định danh trong ví điện thoại và có thể chia sẻ với bất kỳ bên nào mà họ chọn. Định danh phi tập trung và chứng thực không bị khóa trong cơ sở dữ liệu của bên phát hành.
+
+5. Danh tính phi tập trung nên hoạt động tốt với các công nghệ [không kiến thức](/glossary/#zk-proof) mới nổi, cho phép các cá nhân chứng minh rằng họ sở hữu hoặc đã làm điều gì đó mà không cần tiết lộ đó là gì. Đây cũng có thể trở thành một hướng đi mạnh để kết hợp niềm tin và sự riêng tư cho các ứng dụng như bầu cử.
+
+6. Danh tính phi tập trung cho phép các cơ chế [chống Sybil](/glossary/#anti-sybil) xác định khi một cá nhân đang giả làm nhiều người để lợi dụng hoặc spam một hệ thống nào đó.
+
+## Các trường hợp sử dụng danh tính phi tập trung {#decentralized-identity-use-cases}
+
+Danh tính phi tập trung có nhiều trường hợp sử dụng tiềm năng:
+
+### 1. Đăng nhập chung {#universal-dapp-logins}
+
+Danh tính phi tập trung có thể giúp thay thế việc đăng nhập bằng mật khẩu với phương pháp xác thực phi tập trung. Các bên cung cấp dịch vụ có thể phát hành chứng thực cho người dùng, thứ mà có thể được lữu trữ trong ví Ethereum. Một ví dụ về chứng thực sẽ là một [NFT](/glossary/#nft) cấp cho người nắm giữ quyền truy cập vào một cộng đồng trực tuyến.
+
+Chức năng [Đăng nhập bằng Ethereum](https://siwe.xyz/) sau đó sẽ cho phép máy chủ xác nhận tài khoản Ethereum của người dùng và lấy chứng thực được yêu cầu từ địa chỉ tài khoản của họ. Điều này có nghĩa rằng người dùng có thể truy cập vào các nền tảng và trang web, mà không cần phải ghi nhớ những đoạn mật khẩu dài dòng, và cải thiện trải nghiệm người dùng.
+
+### 2. Xác thực KYC {#kyc-authentication}
+
+Dùng nhiều dịch vụ trên mạng yêu cầu các cá nhân phải cung cấp nhiều chứng thực và chứng minh, ví dụ như bằng lái xe hoặc hộ chiếu quốc gia. Nhưng hướng giải quyết này còn rắc rối vì thông tin người dùng cá nhân có thể bị chiếm đoạt và các bên cung cấp dịch vụ không thể xác minh được tính trung thực của chứng thực đó.
+
+Danh tính phi tập trung cho phép các công ty bỏ qua các quy trình [Biết khách hàng của bạn (KYC)](https://en.wikipedia.org/wiki/Know_your_customer) thông thường và xác thực danh tính người dùng thông qua Thông tin xác thực có thể xác minh. Điều này giảm thiểu chi phí quản lý danh tính và ngăn chặn sự lạm dụng giấy giờ giả.
+
+### 3. Bỏ phiếu và cộng đồng trực tuyến {#voting-and-online-communities}
+
+Bầu cử trên mạng và mạng xã hội là hai ứng dụng độc đáo cho danh tính phi tập trung. Hệ thống bầu cử trên mạng thường dễ bị thao túng, nhất là khi các thành phần xấu tạo ra nhiều danh tính giả để bầu cử. Việc yêu cầu các cá nhân trình bày chứng thực trên chuỗi có thể cải thiện tính toàn vẹn của các quy trình bỏ phiếu trực tuyến.
+
+Danh tính phi tập trung có thể giúp tạo ra các cộng đồng trực tuyến mà không bị tràn lan các tài khoản giả. Ví dụ: mỗi người dùng có thể phải xác thực danh tính của mình bằng hệ thống danh tính trên chuỗi, như Dịch vụ Định danh Ethereum, để giảm khả năng có bot.
+
+### 4. Bảo vệ chống tấn công Sybil {#sybil-protection}
+
+Các ứng dụng cấp tài trợ sử dụng [bỏ phiếu bậc hai](/glossary/#quadratic-voting) dễ bị [tấn công Sybil](/glossary/#sybil-attack) vì giá trị của một khoản tài trợ sẽ tăng lên khi có nhiều cá nhân bỏ phiếu cho nó, điều này khuyến khích người dùng chia nhỏ các khoản đóng góp của họ qua nhiều danh tính. Danh tính phi tập trung giúp ngăn chặn điều này bằng cách gia tăng gánh nặng mà mỗi người tham gia phải chứng minh họ là người thật, dù thường là không phải tiết lộ thông tin cá nhân.
+
+### 5. ID Quốc gia và Chính phủ {#national-and-government-id}
+
+Các chính phủ có thể sử dụng các nguyên tắc của danh tính phi tập trung để phát hành các tài liệu nhận dạng nền tảng—chẳng hạn như ID quốc gia, hộ chiếu hoặc giấy phép lái xe—dưới dạng thông tin xác thực có thể xác minh trên Ethereum, cung cấp sự đảm bảo mạnh mẽ về tính xác thực bằng mật mã để giảm gian lận và giả mạo trong xác minh danh tính trực tuyến. Công dân có thể lưu trữ những chứng thực này trong [ví](/wallets/) cá nhân của họ và sử dụng chúng để chứng minh danh tính, tuổi tác hoặc quyền bỏ phiếu của mình.
+
+Mô hình này cho phép tiết lộ có chọn lọc, đặc biệt khi kết hợp với công nghệ quyền riêng tư [bằng chứng không kiến thức (ZKP)](/zero-knowledge-proofs/). Ví dụ: một công dân có thể chứng minh bằng mật mã rằng họ trên 18 tuổi để truy cập một dịch vụ bị giới hạn độ tuổi mà không tiết lộ ngày sinh chính xác của họ, mang lại sự riêng tư cao hơn so với ID truyền thống.
+
+#### 💡Nghiên cứu điển hình: ID kỹ thuật số quốc gia (NDI) của Bhutan trên Ethereum {#case-study-bhutan-ndi}
+
+- Cung cấp quyền truy cập vào thông tin xác thực danh tính có thể xác minh cho gần 800.000 công dân của Bhutan
+- Đã di chuyển từ mạng Polygon [sang mạng chính Ethereum](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) vào tháng 10 năm 2025
+- Hơn [234.000 ID kỹ thuật số](https://www.blockchain-council.org/blockchain/bhutan-uses-blockchain-in-digital-id-project/) đã được cấp tính đến tháng 3 năm 2025
+
+Vương quốc Bhutan đã [di chuyển hệ thống ID kỹ thuật số quốc gia (NDI)](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) sang Ethereum vào tháng 10 năm 2025. Được xây dựng trên các nguyên tắc về danh tính phi tập trung và danh tính tự chủ, hệ thống NDI của Bhutan sử dụng các số nhận dạng phi tập trung và thông tin xác thực có thể xác minh để cấp thông tin xác thực được ký kỹ thuật số trực tiếp vào ví cá nhân của công dân. Bằng cách neo các bằng chứng mật mã của những thông tin xác thực này trên Ethereum, hệ thống đảm bảo chúng là xác thực, chống giả mạo và có thể được xác minh bởi bất kỳ bên nào mà không cần truy vấn một cơ quan trung ương.
+
+Kiến trúc của hệ thống nhấn mạnh quyền riêng tư thông qua việc sử dụng công nghệ [bằng chứng không kiến thức (ZKP)](/zero-knowledge-proofs/). Việc triển khai "tiết lộ có chọn lọc" này cho phép công dân chứng minh các sự thật cụ thể (ví dụ: "Tôi trên 18 tuổi" hoặc "Tôi là công dân") để truy cập các dịch vụ mà không tiết lộ dữ liệu cá nhân cơ bản, chẳng hạn như số ID đầy đủ hoặc ngày sinh chính xác của họ. Điều này cho thấy một trường hợp sử dụng mạnh mẽ, trong thế giới thực của Ethereum cho một hệ thống ID quốc gia bảo mật, lấy người dùng làm trung tâm và bảo vệ quyền riêng tư.
+
+#### 💡Nghiên cứu điển hình: QuarkID của thành phố Buenos Aires trên Ethereum [Lớp 2](/layer-2/) ZKSync Era {#case-study-buenos-aires-quarkid}
+
+- Đã cấp thông tin xác thực danh tính phi tập trung cho hơn [3,6 triệu người dùng](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo) khi ra mắt
+- QuarkID là một giao thức mã nguồn mở được công nhận là [Tài sản công kỹ thuật số](https://www.digitalpublicgoods.net/r/quarkid) theo Các mục tiêu phát triển bền vững của Liên Hợp Quốc
+- Nhấn mạnh mô hình "[chính phủ với tư cách là người dùng](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo)", trong đó thành phố không sở hữu giao thức, mang lại cho công dân toàn quyền sở hữu dữ liệu và quyền riêng tư
+
+Vào năm 2024, Chính quyền Thành phố Buenos Aires (GCBA) đã tích hợp QuarkID, “khuôn khổ tin cậy kỹ thuật số” mã nguồn mở được xây dựng bởi Ban Thư ký Đổi mới và Chuyển đổi Kỹ thuật số của GCBA, vào miBA, ứng dụng chính thức của thành phố để người dân truy cập các dịch vụ của chính phủ và các tài liệu chính thức. Khi ra mắt, tất cả hơn 3,6 triệu người dùng miBA đã được cấp danh tính kỹ thuật số phi tập trung cho phép họ quản lý và chia sẻ các tài liệu và chứng chỉ kỹ thuật số có thể xác minh trên chuỗi, bao gồm thông tin xác thực quyền công dân, giấy khai sinh, giấy đăng ký kết hôn và giấy chứng tử, hồ sơ thuế, hồ sơ tiêm chủng, v.v.
+
+Được xây dựng trên mạng [Lớp 2](/layer-2/) của Ethereum là ZKSync Era, hệ thống QuarkID sử dụng công nghệ ZKP để cho phép công dân xác minh thông tin xác thực cá nhân ngang hàng thông qua thiết bị di động của họ—mà không để lộ dữ liệu cá nhân không cần thiết. Chương trình nêu bật mô hình “chính phủ với tư cách người dùng”, trong đó GCBA đóng vai trò là một người dùng của giao thức QuarkID mã nguồn mở, có khả năng tương tác, thay vì đóng vai trò là chủ sở hữu tập trung. Kiến trúc hỗ trợ ZKP này cung cấp một tính năng riêng tư quan trọng: không bên thứ ba nào, ngay cả GCBA, có thể theo dõi cách thức, thời điểm hoặc lý do một công dân sử dụng thông tin xác thực của họ. Chương trình thành công này cung cấp cho công dân danh tính tự chủ hoàn toàn và quyền kiểm soát dữ liệu nhạy cảm của họ, tất cả đều được bảo mật bởi mạng lưới phân tán toàn cầu của Ethereum.
+
+## Chứng thực là gì? {#what-are-attestations}
+
+Chứng thực là một tuyên bố của một thực thể về một thực thể khác. Nếu bạn sống ở Hoa Kỳ, giấy phép lái xe do Nha lộ vận (một tổ chức) cấp cho bạn chứng nhận rằng bạn (một tổ chức khác) được phép lái xe ô tô một cách hợp pháp.
+
+Chứng thực thì sẽ khác biệt so với sổ định danh. Một chứng thực _chứa_ các số nhận dạng để tham chiếu một danh tính cụ thể và đưa ra một tuyên bố về một thuộc tính liên quan đến danh tính này. Vậy, bằng lái xe của bạn có nhiều định danh (tên, ngày sinh, địa chỉ) nhưng cũng là thứ chứng thực quyền pháp lý của bạn để lái xe.
+
+### Định danh phi tập trung là gì? {#what-are-decentralized-identifiers}
+
+Định danh truyền thống như tên pháp lý hoặc địa chỉ email dựa vào các bên thứ ba - chính quyền và các bên cung cấp email. Định danh phi tập trung (DIDs) thì khác - Chúng không được phát hành, quản lý, hoặc kiểm soát bởi bất kỳ thực thể tập trung nào.
+
+Định danh phi tập trung được phát hành, giữ, và kiểm soát bởi cá nhân. Một [tài khoản Ethereum](/glossary/#account) là một ví dụ về số nhận dạng phi tập trung. Bạn có thể tạo ra bao nhiêu tài khoản bạn muốn mà không cần sự cho phép của bất kỳ ai và không cần trữ chúng trong một trung tâm đăng ký.
+
+Số nhận dạng phi tập trung được lưu trữ trên các sổ cái phân tán ([chuỗi khối](/glossary/#blockchain)) hoặc [mạng ngang hàng](/glossary/#peer-to-peer-network). Điều này làm cho các DID [trở nên duy nhất trên toàn cầu, có thể phân giải với tính sẵn sàng cao và có thể xác minh bằng mật mã](https://w3c-ccg.github.io/did-primer/). Một định danh phi tập trung có thể liên quan đến nhiều thực thể khác nhau, bao gồm con người, tổ chức cá nhân, hoặc chính quyền.
+
+## Điều gì làm cho định danh phi tập trung khả thi? Điều gì làm cho số nhận dạng phi tập trung trở nên khả thi? {#what-makes-decentralized-identifiers-possible}
+
+### 1. Mật mã học khóa công khai {#public-key-cryptography}
+
+Mật mã học khóa công khai là một biện pháp bảo mật thông tin, tạo ra một [khóa công khai](/glossary/#public-key) và [khóa riêng tư](/glossary/#private-key) cho một thực thể. [Mật mã học](/glossary/#cryptography) khóa công khai được sử dụng trong các mạng chuỗi khối để xác thực danh tính người dùng và chứng minh quyền sở hữu tài sản kỹ thuật số.
+
+Một số định danh phi tập trung, như tài khoản Ethereum, có khóa công khai và riêng tư. Khóa công khai xác định người kiểm soát tài khoản, trong khi khóa riêng tư có thể ký và mở khóa tin nhắn cho tài khoản đó. Mật mã học khóa công khai cung cấp các bằng chứng cần thiết để xác thực các thực thể và ngăn chặn việc mạo danh và sử dụng danh tính giả, sử dụng [chữ ký mật mã](https://andersbrownworth.com/blockchain/public-private-keys/) để xác minh tất cả các tuyên bố.
+
+### 2. Kho dữ liệu phi tập trung {#decentralized-datastores}
+
+Một blockchain hoạt động như là một trung tâm xác minh dữ liệu đăng ký: một kho lưu trữ thông tin mở, không cần đặt niềm tin vào ai, và phi tập trung. Sự tồn tại của blockchain công cộng loại bỏ nhu cầu lưu trữ định danh trong các trung tâm đăng ký tập trung.
+
+Nếu ai đó cần xác minh tính hợp lệ của một định danh phi tập trung, họ có thể tìm khóa công khai liên quan trên blockchain. Điều này khác biệt với các định danh truyền thống mà cần các bên thứ ba xác minh.
+
+## Bằng cách nào mà định danh phi tập trung và chứng thực hiện thực hóa danh tính phi tập trung? Số nhận dạng phi tập trung và chứng thực cho phép danh tính phi tập trung hoạt động như thế nào? {#how-decentralized-identifiers-and-attestations-enable-decentralized-identity}
+
+Danh tính phi tập trung là một lý tưởng mà những thông tin liên quan đến danh tính nên được tự kiểm soát, riêng tư, và mang theo được, với các định danh phi tập trung và chứng thực là những viên gạch đầu tiên.
+
+Trong bối cảnh danh tính phi tập trung, chứng thực (còn được gọi là [Thông tin xác thực có thể xác minh](https://www.w3.org/TR/vc-data-model/)) là các tuyên bố chống giả mạo, có thể xác minh bằng mật mã do bên phát hành đưa ra. Mọi chứng thực hoặc chứng minh xác thực mà một thực thể (ví dụ như một tổ chức) phát hành ra đều liên kết với DID của họ.
+
+Bởi vì DID được lưu trữ trên blockchain, ai cũng có thể xác minh tính hợp lệ của một chứng thực bằng cách kiểm tra chéo DID của người phát hành trên Ethereum. Về căn bản, blockchain Ethereum hoạt động như một sổ danh bạ toàn cầu mà giúp xác minh các DID liên quan đến các thực tế nhất định.
+
+Định danh phi tập trung là lí do mà chứng thực được tự kiểm soát và xác minh được. Cho dù người phát hành không tồn tại nữa, người nắm giữ luôn có chứng cứ về nguồn gốc và tính hợp lệ của chứng thực đó.
+
+Định danh phi tập trung cũng rất thiết yếu với sự riêng tư của thông tin cá nhân thông qua danh tính phi tập trung. Ví dụ như, nếu một cá nhân nộp bằng chứng của một chứng thực (một giấy phép lái xe), thì bên xác minh không cần phải kiểm tra tính hợp lệ của thông tin trong bằng chứng đó. Tuy nhiên, người xác minh chỉ cần xem các bảo đảm mật mã về tính xác thực của chứng thực đó và danh tính của bên đang phát hành để xác định xem chứng cứ có hợp lệ không.
+
+## Các loại chứng thực trong danh tính phi tập trung {#types-of-attestations-in-decentralized-identity}
+
+Cách thông tin chứng thực được lưu trữ và tìm lấy trong hệ sinh thái danh tính Ethereum khác với cách quản lý danh tính truyền thống. Đây là khái quát về nhiều phương pháp phát hành, lưu trữ, và xác minh chứng thực trong hệ thống danh tính phi tập trung:
+
+### Chứng thực ngoài chuỗi {#offchain-attestations}
+
+Một mối lo ngại khi lưu trữ chứng thực trên chuỗi là chúng có thể chứa thông tin mà các cá nhân muốn giữ riêng tư. Bản tính công khai của blockchain Ethereum làm cho việc lưu trữ chứng thực không hay lắm.
+
+Giải pháp là phát hành chứng thực, được người dùng giữ ngoài chuỗi trong ví kỹ thuật số, nhưng được ký bằng DID của bên phát hành được lưu trữ trên chuỗi. Các chứng thực này được mã hóa dưới dạng [JSON Web Tokens](https://en.wikipedia.org/wiki/JSON_Web_Token) và chứa chữ ký số của bên phát hành—điều này cho phép dễ dàng xác minh các tuyên bố ngoài chuỗi.
+
+Đây là một kịch bản giả định để giải thích về chứng thực ngoài chuỗi:
+
+1. Một trường đại học (bên phát hành) tạo ra một chứng thực (một chứng nhận học thuật số), ký với khóa của họ, và phân phối nó cho Bob (chủ sở hữu danh tính).
+
+2. Bob nộp đơn cho 1 vị trí công việc và muốn đưa chứng chỉ học thuật của anh ấy tới nhà tuyển dụng, nên anh ấy chia sẻ chứng thực từ ví di động của mình. Công ty đó (bên xác nhận) sau đó có thể xác nhận tính hợp lệ của chứng thực đó bằng việc kiểm tra DID của bên phát hành (khóa công khai của nó trên Ethereum).
+
+### Chứng thực ngoài chuỗi với quyền truy cập liên tục {#offchain-attestations-with-persistent-access}
+
+Theo cơ chế này, các chứng thực được chuyển đổi thành các tệp JSON và được lưu trữ ngoài chuỗi (lý tưởng nhất là trên một nền tảng [lưu trữ đám mây phi tập trung](/developers/docs/storage/), chẳng hạn như IPFS hoặc Swarm). Tuy nhiên, một [hàm băm](/glossary/#hash) của tệp JSON được lưu trữ trên chuỗi và được liên kết với một DID thông qua một sổ đăng ký trên chuỗi. DID liên quan có thể một là thuộc quyền sở hữu của bên phát hành chứng thực hoặc là của bên nhận.
+
+Phương thức này cho phép chứng thực hưởng tính bền vững blockchain, trong khi giữ thông tin về các yêu cầu mã hóa và xác minh được. Nó cũng cho phép công khai chọn lọc vì chủ sở hữu của khóa tư có thể giải mã thông tin đó.
+
+### Chứng thực trên chuỗi {#onchain-attestations}
+
+Chứng thực trên chuỗi được giữ trong [hợp đồng thông minh](/glossary/#smart-contract) trên chuỗi khối Ethereum. Hợp đồng thông minh (đóng vai trò là một sổ đăng ký) sẽ ánh xạ một chứng thực tới một số nhận dạng phi tập trung trên chuỗi tương ứng (một khóa công khai).
+
+Đây là một ví dụ để cho thấy cách chứng thực trên chuỗi có thể hoạt động trong thực tế:
+
+1. Một công ty (XYZ Corp) lên kế hoạch bán cổ phần sở hữu dùng một hợp đồng thông minh nhưng chỉ muốn người mua mà đã hoàn thành một bài kiểm tra lý lịch.
+
+2. XYZ Corp có thể yêu cầu công ty thực hiện kiểm tra lý lịch để phát hành chứng thực trên chuỗi trên Ethereum. Chứng thực này xác nhận rằng một cá nhân đã vượt qua bài kiểm tra lý lịch mà không để lộ thông tin cá nhân nào.
+
+3. Hợp đồng thông minh bán cổ phần có thể kiểm tra hợp đồng đăng ký các danh tính của người mua được duyệt, cho phép hợp đồng thông minh xác định ai có quyền mua có quyền mua cổ phần.
+
+### Token soulbound và danh tính {#soulbound}
+
+[Token soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ([NFT không thể chuyển nhượng](/glossary/#nft)) có thể được sử dụng để thu thập thông tin dành riêng cho một ví cụ thể. Điều này tạo ra một danh tính trên chuỗi duy nhất được ràng buộc với một địa chỉ Ethereum cụ thể, có thể bao gồm các token đại diện cho thành tích (ví dụ: hoàn thành một khóa học trực tuyến cụ thể hoặc vượt qua một ngưỡng điểm trong trò chơi) hoặc sự tham gia cộng đồng.
+
+## Sử dụng danh tính phi tập trung {#use-decentralized-identity}
+
+Có nhiều dự án đầy hoài bão đang sử dụng Ethereum làm nền tảng cho giải pháp danh tính phi tập trung:
+
+- **[Dịch vụ Định danh Ethereum (ENS)](https://ens.domains/)** - _Một hệ thống đặt tên phi tập trung cho các số nhận dạng trên chuỗi, máy có thể đọc được, chẳng hạn như địa chỉ ví Ethereum, hàm băm nội dung và siêu dữ liệu._
+- **[Đăng nhập bằng Ethereum (SIWE)](https://siwe.xyz/)** - _Tiêu chuẩn mở để xác thực bằng tài khoản Ethereum._
+- **[SpruceID](https://www.spruceid.com/)** - _Một dự án danh tính phi tập trung cho phép người dùng kiểm soát danh tính kỹ thuật số bằng tài khoản Ethereum và hồ sơ ENS thay vì dựa vào các dịch vụ của bên thứ ba._
+- **[Dịch vụ chứng thực Ethereum (EAS)](https://attest.org/)** - _Một sổ cái/giao thức phi tập trung để tạo các chứng thực trên chuỗi hoặc ngoài chuỗi về bất cứ điều gì._
+- **[Proof of Humanity](https://www.proofofhumanity.id)** - _Proof of Humanity (hay PoH) là một hệ thống xác minh danh tính xã hội được xây dựng trên Ethereum._
+- **[BrightID](https://www.brightid.org/)** - _Một mạng lưới danh tính xã hội phi tập trung, mã nguồn mở tìm cách cải cách việc xác minh danh tính thông qua việc tạo và phân tích một biểu đồ xã hội._
+- **[walt.id](https://walt.id)** — _Hạ tầng ví và danh tính phi tập trung mã nguồn mở cho phép các nhà phát triển và tổ chức tận dụng danh tính tự chủ và NFT/SBT._
+- **[Veramo](https://veramo.io/)** - _Một framework JavaScript giúp mọi người dễ dàng sử dụng dữ liệu có thể xác minh bằng mật mã trong các ứng dụng của họ._
+
+## Đọc thêm {#further-reading}
+
+### Bài viết {#articles}
+
+- [Các trường hợp sử dụng Blockchain: Blockchain trong nhận dạng kỹ thuật số](https://consensys.net/blockchain-use-cases/digital-identity/) — _ConsenSys_
+- [Ethereum ERC725 là gì? Quản lý danh tính tự chủ trên Blockchain](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_
+- [Cách Blockchain có thể giải quyết vấn đề nhận dạng kỹ thuật số](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_
+- [Danh tính phi tập trung là gì và tại sao bạn nên quan tâm?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_
+- [Giới thiệu về danh tính phi tập trung](https://walt.id/white-paper/digital-identity) — _Dominik Beron_
+
+### Video {#videos}
+
+- [Danh tính phi tập trung (Phiên phát trực tiếp thưởng)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _Một video giải thích tuyệt vời về danh tính phi tập trung của Andreas Antonopolous_
+- [Đăng nhập bằng Ethereum và danh tính phi tập trung với Ceramic, IDX, React và 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _Hướng dẫn trên YouTube về cách xây dựng hệ thống quản lý danh tính để tạo, đọc và cập nhật hồ sơ người dùng bằng ví Ethereum của họ của Nader Dabit_
+- [BrightID - Danh tính phi tập trung trên Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Tập podcast của Bankless thảo luận về BrightID, một giải pháp danh tính phi tập trung cho Ethereum_
+- [Internet ngoài chuỗi: Danh tính phi tập trung & Thông tin xác thực có thể xác minh](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — Bài thuyết trình tại EthDenver 2022 của Evin McMullen
+- [Giải thích về thông tin xác thực có thể xác minh](https://www.youtube.com/watch?v=ce1IdSr-Kig) - Video giải thích trên YouTube có bản demo của Tamino Baumann
+
+### Cộng đồng {#communities}
+
+- [Liên minh ERC-725 trên GitHub](https://github.com/erc725alliance) — _Những người ủng hộ tiêu chuẩn ERC725 để quản lý danh tính trên chuỗi khối Ethereum_
+- [Máy chủ Discord của EthID](https://discord.com/invite/ZUyG3mSXFD) — _Cộng đồng dành cho những người đam mê và nhà phát triển làm việc với Đăng nhập bằng Ethereum và Giao thức theo dõi Ethereum_
+- [Veramo Labs](https://discord.gg/sYBUXpACh4) — _Một cộng đồng các nhà phát triển đóng góp xây dựng một khuôn khổ cho dữ liệu có thể xác minh cho các ứng dụng_
+- [walt.id](https://discord.com/invite/AW8AgqJthZ) — _Một cộng đồng các nhà phát triển và nhà xây dựng làm việc về các trường hợp sử dụng danh tính phi tập trung trong các ngành khác nhau_
diff --git a/public/content/translations/vi/defi/index.md b/public/content/translations/vi/defi/index.md
index aebbbbd3039..2b8728ab39a 100644
--- a/public/content/translations/vi/defi/index.md
+++ b/public/content/translations/vi/defi/index.md
@@ -1,5 +1,6 @@
---
title: Tài chính phi tập trung (DeFi)
+metaTitle: DeFi là gì? | Sử dụng Tài chính Phi tập trung và lợi ích
description: EthereumTổng quan về tài chính phi tập trung trên Ethereum
lang: vi
template: use-cases
@@ -12,7 +13,7 @@ summaryPoint2: Những sản phẩm cho phép bạn mượn, tiết kiệm, đ
summaryPoint3: Dựa trên công nghệ mã nguồn mở mà bất kỳ ai cũng có thể lập trình.
---
-Tài chính phi tập trung (DeFi) là một hệ thống tài chính mở mang tính toàn cầu được xây dựng cho thời đại của Internet - lựa chọn thay thế cho một hệ thống mờ mịt, được kiểm soát chặt chẽ, và trói buộc lại với nhau bởi những quy trình và cơ sở hạ tầng với tuổi đời đến hàng thập kỉ. Nó cho bạn quyền kiểm soát và sự rành mạch trên tiền bạc của mình. Nó cho bạn khả năng tiếp cận đến những thị trường toàn cầu và cho bạn những lựa chọn thay thế cho đồng nội tệ hay ngân hàng địa phương. Những sản phẩm của tài chính phi tập trung mở ra các dịch vụ tài chính cho bất cứ ai với đường truyền Internet. Những sản phẩm này phần lớn được sở hữu và duy trì bởi chính những người dùng chúng. Đến nay, hàng chục tỷ đô la tiền mã hóa đã chảy qua các ứng dụng tài chính phi tập trung và con số này tiếp tục tăng lên mỗi ngày.
+Tài chính phi tập trung (DeFi) là một hệ thống tài chính mở mang tính toàn cầu được xây dựng cho thời đại của Internet - lựa chọn thay thế cho một hệ thống mờ mịt, được kiểm soát chặt chẽ, và trói buộc lại với nhau bởi những quy trình và cơ sở hạ tầng với tuổi đời đến hàng thập kỉ. Nó cho bạn quyền kiểm soát và sự rành mạch trên tiền bạc của mình. Nó cho bạn khả năng tiếp cận đến những thị trường toàn cầu và cho bạn những lựa chọn thay thế cho đồng nội tệ hay ngân hàng địa phương. Những sản phẩm của tài chính phi tập trung mở ra các dịch vụ tài chính cho bất cứ ai với đường truyền Internet. Những sản phẩm này phần lớn được sở hữu và duy trì bởi chính những người dùng chúng. Cho đến nay, hàng chục tỷ đô la giá trị tiền mã hóa đã chảy qua các ứng dụng DeFi và con số này đang tăng lên mỗi ngày.
## Tài chính phi tập trung (DeFi) là gì? {#what-is-defi}
@@ -22,7 +23,7 @@ Có một nền kinh tế đang bùng nổ dựa trên tiền mã hóa, nơi mà
-## Tài chính phi tập trung và tài chính truyền thống {#defi-vs-tradfi}
+## DeFi và tài chính truyền thống {#defi-vs-tradfi}
Một trong những cách hay nhất để nhìn nhận tiềm năng của tài chính phi tập trung là tìm hiểu những vấn đề đang tồn tại ngày nay.
@@ -31,44 +32,44 @@ Một trong những cách hay nhất để nhìn nhận tiềm năng của tài
- Những dịch vụ tài chính có thể ngăn chặn bạn nhận thanh toán.
- Một khoản chi phí ngầm của các dịch vụ tài chính là dữ liệu cá nhân của bạn.
- Các chính phủ và tổ chức trung ương có thể đóng cửa thị trường một cách tùy ý.
-- Thời gian giao dịch thường bị giới hạn bởi khung giờ hành chính của từng múi giờ và từng vùng.
+- Giờ giao dịch thường chỉ giới hạn trong giờ hành chính của một múi giờ cụ thể.
- Những giao dịch chuyển khoản có thể mất nhiều ngày do những quy trình nội bộ mang tính thủ công.
- Những dịch vụ tài chính truyền thống sẽ tốn thêm một phần chi phí cho các đơn vị trung gian.
-### Một sự so sánh {#defi-comparison}
+### So sánh {#defi-comparison}
-| Tài chính phi tập trung | Tài chính truyền thống |
-| ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Bạn giữ tiền của mình. | Tiền của bạn được giữ tại các tổ chức khác. |
-| Bạn kiểm soát việc tiền của bạn đi đâu và chúng được dùng như thế nào. | Bạn phải tin tưởng rằng các tổ chức kia sẽ không quản lý tiền của bạn một cách yếu kém, ví dụ như cho những người vay đầy rủi ro vay tiền. |
-| Các giao dịch chuyển khoản diễn ra trong thời gian tính bằng phút. | Giao dịch có thể mất vài ngày do các quy trình thủ công. |
-| Hoạt động giao dịch được mã hóa. | Hoạt động giao dịch gắn liền với danh tính của bạn. |
-| Tài chính phi tập trung được mở ra cho bất cứ ai. | Bạn phải nộp đơn đăng kí để được sử dụng các dịch vụ tài chính. |
-| Các thị trường luôn luôn mở cửa. | Các thị trường có thể đóng cửa vì nhân viên cần thời gian nghỉ ngơi. |
+| Tài chính phi tập trung | Tài chính truyền thống |
+| --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Bạn giữ tiền của mình. | Tiền của bạn được giữ tại các tổ chức khác. |
+| Bạn kiểm soát việc tiền của bạn đi đâu và chúng được dùng như thế nào. | Bạn phải tin tưởng rằng các tổ chức kia sẽ không quản lý tiền của bạn một cách yếu kém, ví dụ như cho những người vay đầy rủi ro vay tiền. |
+| Các giao dịch chuyển khoản diễn ra trong thời gian tính bằng phút. | Giao dịch có thể mất vài ngày do các quy trình thủ công. |
+| Hoạt động giao dịch được mã hóa. | Hoạt động giao dịch gắn liền với danh tính của bạn. |
+| Tài chính phi tập trung được mở ra cho bất cứ ai. | Bạn phải nộp đơn đăng kí để được sử dụng các dịch vụ tài chính. |
+| Các thị trường luôn luôn mở cửa. | Các thị trường có thể đóng cửa vì nhân viên cần thời gian nghỉ ngơi. |
| Được xây dựng trên sự minh bạch – bất kì ai cũng có thể nhìn vào dữ liệu sản phẩm và tìm hiểu xem hệ thống hoạt động thế nào. | Các định chế tài chính là những cuốn sách đóng kín: bạn không thể yêu cầu xem lịch sử cho vay của họ hay sổ sách liệt kê những tài sản họ quản lý v.v. và v.v. |
- Khám phá các ứng dụng tài chính phi tập trung
+ Khám phá các ứng dụng DeFi
## Câu chuyện bắt đầu từ Bitcoin... {#bitcoin}
Bitcoin, trên nhiều phương diện, chính là ứng dụng DeFi đầu tiên. Bitcoin cho phép bạn thực sự sở hữu và kiểm soát giá trị tài chính và gửi chúng đi bất cứ đâu trên thế giới. Nó làm được điều này bằng cách cung cấp cho một số lượng lớn những cá nhân không quen biết hay tin cậy lẫn nhau một cơ chế đồng thuận dựa trên sổ cái của các tài khoản mà không cần đến một bên trung gian tin cậy. Bitcoin được mở ra cho tất cả mọi người và không một ai có thẩm quyền thay đổi những luật lệ của nó. Những tính chất của Bitcoin, ví dụ như sự khan hiếm và tính cởi mở, được lập trình vào trong công nghệ của nó. Nó không giống hệ thống tài chính truyền thống trong đó các chính phủ có thể in tiền và làm mất giá các khoản tiết kiệm của bạn hay các công ty có thể làm đóng cửa thị trường.
-Ethereum kế thừa và tiếp tục phát triển từ triết lý của Bitcoin. Giống như Bitcoin, các quy luật không thể bị thay đổi và mọi người đều có quyền tiếp cận. Hơn thế nữa, đồng tiền số này có thể lập trình được thông qua [những hợp đồng thông minh](/glossary/#smart-contract), cho phép bạn đi xa hơn việc lưu trữ và gửi tiền.
+Ethereum kế thừa và tiếp tục phát triển từ triết lý của Bitcoin. Giống như Bitcoin, các quy luật không thể bị thay đổi và mọi người đều có quyền tiếp cận. Nhưng nó cũng làm cho loại tiền kỹ thuật số này có thể lập trình được, bằng cách sử dụng [hợp đồng thông minh](/glossary/#smart-contract), vì vậy bạn có thể vượt ra ngoài việc lưu trữ và gửi giá trị.
-## Tiền có thể lập trình được {#programmable-money}
+## Tiền có thể lập trình {#programmable-money}
-Khái niệm này nghe khá kì lạ... "tại sao mà tôi lại muốn lập trình tiền của mình cơ chứ?" Tuy nhiên, điều này có ý nghĩa hơn chỉ đơn thuần là một tính năng mặc định của tokens trên Ethereum. Bất cứ ai cũng có thể lập trình logic vào trong các khoản thanh toán. Nhờ đó, bạn có thể có được khả năng kiểm soát và sự an toàn của Bitcoin cộng với những dịch vụ được cung cấp bởi các định chế tài chính. Điều này cho phép bạn làm những điều với các đồng tiền mã hóa mà bạn không thể làm với Bitcoin như là cho vay và mượn, lên lịch thanh toán, đầu tư vào các quỹ phái sinh và hơn thế nữa.
+Điều này nghe có vẻ kỳ lạ... "tại sao tôi lại muốn lập trình tiền của mình"? Tuy nhiên, đây không chỉ là một tính năng mặc định của các token trên Ethereum. Bất cứ ai cũng có thể lập trình logic vào trong các khoản thanh toán. Nhờ đó, bạn có thể có được khả năng kiểm soát và sự an toàn của Bitcoin cộng với những dịch vụ được cung cấp bởi các định chế tài chính. Điều này cho phép bạn làm những điều với các đồng tiền mã hóa mà bạn không thể làm với Bitcoin như là cho vay và mượn, lên lịch thanh toán, đầu tư vào các quỹ phái sinh và hơn thế nữa.
-
+
Khám phá những ứng dụng tài chính phi tập trung mà chúng tôi gợi ý nếu bạn là một người dùng mới của Ethereum.
- Khám phá các ứng dụng tài chính phi tập trung
+ Khám phá các ứng dụng DeFi
@@ -77,44 +78,44 @@ Khái niệm này nghe khá kì lạ... "tại sao mà tôi lại muốn lập t
Có một lựa chọn thay thế mang tính phi tập trung cho hầu hết các dịch vụ tài chính. Ngoài ra, Ethereum cũng tạo cơ hội cho việc xây dựng những sản phẩm tài chính hoàn toàn mới. Dưới đây là một danh sách không ngừng phát triển.
-- [Gửi tiền khắp địa cầu](#send-money)
-- [Phát trực tuyến (stream) tiền khắp địa cầu](#stream-money)
-- [Tiếp cận các loại tiền tệ ổn định](#stablecoins)
-- [Vay vốn thế chấp](#lending)
-- [Vay không cần thế chấp](#flash-loans)
-- [Khởi tạo các khoản tiết kiệm bằng tiền mã hóa](#saving)
-- [Buôn bán token](#swaps)
-- [Làm sinh sôi danh mục đầu tư của bạn](#investing)
-- [Đầu tư cho những ý tưởng của bạn](#crowdfunding)
+- [Gửi tiền đi khắp thế giới](#send-money)
+- [Truyền tiền đi khắp thế giới](#stream-money)
+- [Tiếp cận các đồng tiền ổn định](#stablecoins)
+- [Vay vốn có tài sản thế chấp](#lending)
+- [Vay không cần tài sản thế chấp](#flash-loans)
+- [Bắt đầu tiết kiệm bằng tiền mã hóa](#saving)
+- [Giao dịch token](#swaps)
+- [Phát triển danh mục đầu tư của bạn](#investing)
+- [Gây quỹ cho ý tưởng của bạn](#crowdfunding)
- [Mua bảo hiểm](#insurance)
-- [Quản lý các danh mục đầu tư của bạn](#aggregators)
+- [Quản lý danh mục đầu tư của bạn](#aggregators)
-### Gửi tiền đi khắp địa cầu một cách nhanh chóng {#send-money}
+### Gửi tiền nhanh chóng đi khắp thế giới {#send-money}
-Là một chuỗi khối, Ethereum được thiết kế để gửi đi các giao dịch một cách an toàn và mang tính toàn cầu. Giống như Bitcoin, Ethereum biến việc việc gửi tiền trên khắp thế giới trở nên dễ dàng như gửi một cái email. Chỉ cần nhập vào [địa chỉ ENS](/glossary/#ens) của người nhận (ví dụ: bob.eth) hoặc địa chỉ tài khoản của họ trong ví của bạn và khoản thanh toán mà bạn gửi sẽ đi thẳng đến người nhận, thông thường chỉ mất vài phút. Để gửi hoặc nhận tiền, bạn sẽ cần một [ví điện tử](/wallets/).
+Là một chuỗi khối, Ethereum được thiết kế để gửi đi các giao dịch một cách an toàn và mang tính toàn cầu. Giống như Bitcoin, Ethereum biến việc việc gửi tiền trên khắp thế giới trở nên dễ dàng như gửi một cái email. Chỉ cần nhập [tên ENS](/glossary/#ens) của người nhận (như bob.eth) hoặc địa chỉ tài khoản của họ từ ví của bạn và khoản thanh toán của bạn sẽ được gửi thẳng đến họ trong vài phút (thông thường). Để gửi hoặc nhận thanh toán, bạn sẽ cần một [ví](/wallets/).
- Xem các ứng dụng thanh toán
+ Xem các ứng dụng phi tập trung thanh toán
#### Phát trực tuyến (stream) tiền đi khắp địa cầu... {#stream-money}
Bạn cũng có thể phát trực tuyến tiền trên Ethereum. Điều này cho phép bạn trả lương cho một ai đó trên từng giây thay vì trên từng tháng, giúp họ tiếp cận với tiền của minh bất cứ khi nào họ cần. Hoặc thuê một thứ gì đó, ví dụ như một nhà kho hay một chiếc scooter bằng điện, theo giây thay vì theo giờ hay tháng.
-Và nếu bạn không muốn gửi hoặc phát trực tuyến [ETH](/glossary/#ether)do biến động giá của nó, thì bạn có thể sử dụng những loại tiền tệ khác để thay thế ETH trên Ethereum: đó chính là các [các đồng tiền ổn định](/glossary/#stablecoin) (stablecoin).
+Và nếu bạn không muốn gửi hoặc truyền [ETH](/glossary/#ether) vì giá trị của nó có thể thay đổi nhiều, thì có các loại tiền tệ thay thế trên Ethereum: [stablecoin](/glossary/#stablecoin).
-### Tiếp cận những loại tiền tệ ổn định {#stablecoins}
+### Tiếp cận các đồng tiền ổn định {#stablecoins}
Sự biến động của tiền mã hóa là một vấn đề đối với các sản phẩm tài chính và việc tiêu dùng nói chung. Cộng đồng tài chính phi tập trung đã giải quyết vấn đề này bằng những đồng tiền ổn định (stablecoins). Giá trị của chúng được neo vào một tài sản khác, thường là một loại tiền tệ phổ biến như đồng đô la Mỹ.
Các đồng tiền như Dai hay USDC có giá trị chênh lệch chỉ vài cents so với một đô la. Điều này khiến cho chúng trở nên hoàn hảo cho thu nhập hay hoạt động bán lẻ. Nhiều người ở châu Mỹ La-tinh dùng các đồng tiền ổn định như là một cách để bảo vệ những khoản tiết kiệm của họ trong một giai đoạn bầy bất trắc với những đồng tiền do chính phủ của họ phát hành.
- Đọc thêm về các stablecoin
+Thêm về Stablecoins
@@ -127,28 +128,28 @@ Bạn có thể vay tiền từ những nhà cung cấp phi tập trung dưới
- Theo quỹ (pool-based), trong đó những người cho vay sẽ đưa tiền vào một quỹ chung rồi từ đó người đi vay có thể nhận tiền.
- Xem các dapp cho vay
+ Xem các ứng dụng phi tập trung cho vay
Có nhiều lợi thế từ việc dùng một bên cho vay phi tập trung...
-#### Vay một cách riêng tư {#borrowing-privacy}
+#### Vay mượn riêng tư {#borrowing-privacy}
Ngày nay, cả việc cho vay và đi vay đều xoay quanh những cá nhân tham gia. Các ngân hàng cần biết liệu bạn có khả năng trả nợ trước khi cho bạn vay.
-Nền tảng cho vay phi tập trung hoạt động mà không cần hai bên phải xác minh danh tính. Thay vào đó, người đi vay phải bỏ ra khoản thế chấp mà người cho vay sẽ tự động nhận được nếu khoản vay không được hoàn trả. Một số người cho vay còn chấp nhận [NFT](/glossary/#nft) như là tài sản thế chấp. Các token không phân tách (NFTs) là chứng từ đại diện cho một tài sản duy nhất, ví dụ như một bức tranh. [Đọc thêm về NFTs](/nft/)
+Nền tảng cho vay phi tập trung hoạt động mà không cần hai bên phải xác minh danh tính. Thay vào đó, người đi vay phải bỏ ra khoản thế chấp mà người cho vay sẽ tự động nhận được nếu khoản vay không được hoàn trả. Một số người cho vay thậm chí chấp nhận [NFT](/glossary/#nft) làm tài sản thế chấp. Các token không phân tách (NFTs) là chứng từ đại diện cho một tài sản duy nhất, ví dụ như một bức tranh. [Tìm hiểu thêm về NFT](/nft/)
Điều này cho phép bạn vay tiền mà không cần đến các kiểm tra tín chỉ cá nhân hay đòi bạn phải giao nộp các thông tin riêng tư khác.
-#### Tiếp cận những nguồn vốn trên khắp địa cầu {#access-global-funds}
+#### Tiếp cận các quỹ toàn cầu {#access-global-funds}
-Khi bạn sử dụng một bên cho vay phi tập trung, bạn có thể tiếp cận các nguồn tiền được kí gửi từ khắp nơi trên thế giới chứ không chỉ những nguồn tiền do ngân hàng hay tổ chức bạn lựa chọn nắm giữ. Điều này khiến cho các khoản vay trở nên dễ tiếp cận hơn và cải thiện lãi suất vay vốn.
+Khi bạn sử dụng một bên cho vay phi tập trung, bạn có thể tiếp cận các nguồn tiền được kí gửi từ khắp nơi trên thế giới chứ không chỉ những nguồn tiền do ngân hàng hay tổ chức bạn lựa chọn nắm giữ. Điều này làm cho việc vay vốn trở nên dễ dàng hơn và cải thiện lãi suất.
-#### Những hiệu quả về mặt thuế {#tax-efficiencies}
+#### Hiệu quả về thuế {#tax-efficiencies}
-Việc đi vay có thể giúp bạn tiếp cận các khoản vốn bạn cần mà không cần phải bán đi số ETH của bạn (một giao dịch có thể bị đánh thuế). Thay vào đó, bạn có thể dùng ETH như tài sản thế chấp cho một khoản vay bằng stablecoin. Điều này cho bạn dòng tiền mà bạn cần và cho phép bạn giữ số ETH của mình. Các đồng tiền ổn định là các tokens phù hơp hơn khi bạn cần tiền mặt vì chúng không biến động giá như ETH. [Đọc thêm về các stablecoin](#stablecoins)
+Việc đi vay có thể giúp bạn tiếp cận các khoản vốn bạn cần mà không cần phải bán đi số ETH của bạn (một giao dịch có thể bị đánh thuế). Thay vào đó, bạn có thể dùng ETH như tài sản thế chấp cho một khoản vay bằng stablecoin. Điều này cho bạn dòng tiền mà bạn cần và cho phép bạn giữ số ETH của mình. Các đồng tiền ổn định là các tokens phù hơp hơn khi bạn cần tiền mặt vì chúng không biến động giá như ETH. [Tìm hiểu thêm về stablecoin](#stablecoins)
-#### Các khoản vay nóng {#flash-loans}
+#### Vay chớp nhoáng (Flash loans) {#flash-loans}
Các khoản vay nóng là một dạng cho vay phi tập trung mang tính thử nghiệm cho phép bạn vay mà không cần thế chấp hay cung cấp bất cứ thông tin cá nhân nào.
@@ -172,27 +173,27 @@ Nếu nguồn cung của sàn giao dịch B sụt giảm bất ngờ và ngườ
Để có thể thực hiện ví dụ trên trong thế giới tài chính truyền thống, bạn sẽ cần một lượng tiền khổng lồ. Những chiến lược kiếm tiền kiểu này chỉ những người sở hữu sẵn tài sản mới có thể tiếp cận được. Các khoản vay nóng là ví dụ về một tương lai nơi mà việc có tiền không nhất thiết phải là một điều kiện tiên quyết cho việc kiếm tiền.
- Đọc thêm về các khoản vay nóng
+ Tìm hiểu thêm về Vay chớp nhoáng (Flash loans)
-### Bắt đầu tiết kiệm với tiền mã hóa {#saving}
+### Bắt đầu tiết kiệm bằng tiền mã hóa {#saving}
#### Cho vay {#lending}
-Bạn có thể thu lãi suất trên tiền mã hóa của mình bằng cách cho vay và nhìn thấy số tiền của mình sinh lời trực tiếp. Hiện tại, lãi suất gửi tiền mã hóa cao hơn nhiều so với lãi suất bạn có thể kiếm được từ ngân hàng địa phương (đó là nếu bạn đủ may mắn để có thể tiếp cận một ngân hàng nơi bạn ở). Đây là một ví dụ:
+Bạn có thể thu lãi suất trên tiền mã hóa của mình bằng cách cho vay và nhìn thấy số tiền của mình sinh lời trực tiếp. Hiện tại, lãi suất gửi tiền mã hóa cao hơn nhiều so với lãi suất bạn có thể kiếm được từ ngân hàng địa phương (đó là nếu bạn đủ may mắn để có thể tiếp cận một ngân hàng nơi bạn ở). Dưới đây là ví dụ:
- Bạn cho vay 100 Dai của mình, một [stablecoin](/stablecoins/), cho một sản phẩm như Aave.
- Bạn nhận 100 Aave Dai (aDai), một token đại diện cho số Dai mà bạn đã cho vay.
-- Số aDai của bạn sẽ tăng theo lãi suất và bạn có thế thấy số dư của mình tăng lên trong ví. Tùy vào [APR](/glossary/#apr), tại thời điểm cho vay, số dư trong ví của bạn có thể lên tới 100.1234 ETH chỉ sau vài ngày hay thậm chí là vài giờ cho vay!
+- Số aDai của bạn sẽ tăng theo lãi suất và bạn có thế thấy số dư của mình tăng lên trong ví. Tùy thuộc vào [APR](/glossary/#apr), số dư ví của bạn sẽ hiển thị khoảng 100,1234 sau vài ngày hoặc thậm chí vài giờ!
- Bạn có thể rút ra một khoản Dai bằng với số dư aDai của bạn ở bất kì thời điểm nào.
- Xem các ứng dụng phi tập trung về cho vay
+ Xem các ứng dụng phi tập trung cho vay
-#### Xổ số không mất tiền {#no-loss-lotteries}
+#### Xổ số không mất vốn {#no-loss-lotteries}
Các loại xổ số không mất tiền như là PoolTogether là một hình thức tiết kiệm tiền vui và đầy tính đổi mới.
@@ -205,12 +206,12 @@ Các loại xổ số không mất tiền như là PoolTogether là một hình
Bể tiền thưởng được tạo ra từ tất cả lãi suất được sản sinh từ việc cho vay tiền bán vé giống như ví dụ cho vay đã đề cập ở trên.
- Trải nghiệm PoolTogether
+ Thử PoolTogether
-### Mua bán tokens {#swaps}
+### Trao đổi token {#swaps}
Có hàng ngàn loại tokens trên Ethereum. Các sàn giao dịch phi tập trung (DEXs) cho phép bạn mua bán những loại tokens khác nhau bất cứ khi nào bạn muốn. Bạn không bao giờ phải từ bỏ quyền kiểm soát tài sản của mình. Nó giống như việc sử dụng một điểm thu đổi ngoại tệ khi bạn đang thăm một quốc gia khác. Nhưng phiên bản tài chính phi tập trung thì không bao giờ đóng cửa. Các thị trường này mở 24/7, 365 ngày một năm và công nghệ của chúng bảo đảm rằng sẽ luôn luôn có một ai đó để chấp nhận một giao dịch.
@@ -222,31 +223,31 @@ Ví dụ, nếu bạn muốn tham gia vào xổ số không mất PoolTogether (
-### Mua bán nâng cao {#trading}
+### Giao dịch nâng cao {#trading}
Có những lựa chọn nâng cao cho các tay buôn (traders) thích có sự kiểm soát lớn hơn. Giới hạn lệnh mua, perpetuals, margin trading và hơn thế nữa đều là có thể. Với mua bán phi tập trung, bạn có thể tiếp cận với nguồn thanh khoản toàn cầu, thị trường không bao giờ đóng cửa và bạn thì luôn kiểm soát những tài sản của mình.
Khi bạn dùng một sàn giao dịch tập trung, bạn phải kí gửi tài sản của mình trước khi giao dịch và tin tưởng rằng họ sẽ chăm sóc nó. Trong khi tài sản của bạn đang được kí gửi, chúng phải đối diện với nhiều rủi ro mất mát vì các sàn giao dịch tập trung là mục tiêu hấp dẫn đối với các hacker.
- Xem các dapp mua bán
+ Xem các ứng dụng phi tập trung giao dịch
-### Tăng trưởng các khoản đầu tư của bạn {#investing}
+### Phát triển danh mục đầu tư của bạn {#investing}
Có những sản phẩm quản lý quỹ tài sản trên Ethereum cố gắng làm tăng trưởng các khoản đầu tư của bạn dựa trên một chiến lược do bạn lựa chọn. Những giải pháp này là tự động, dành cho bất kì ai và không cần một nhà quản lý để lấy đi một phần lợi nhuận của bạn.
-Một ví dụ hay là [Quỹ đầu tư chỉ số DeFi Pulse (DPI)](https://defipulse.com/blog/defi-pulse-index/). Đây là một quỹ đầu tư tự động tái cân bằng để đảm bảo rằng danh mục đầu tư của bạn luôn bao gồm những token tài chính DeFi có vốn hóa thị trường lớn nhất. Bạn không bao giờ phải quản lý bất cứ chi tiết nào liên quan đến danh mục đầu tư của bạn và bạn có thể rút vốn bất cứ khi nào bạn thích.
+Một ví dụ điển hình là quỹ [Chỉ số DeFi Pulse (DPI)](https://defipulse.com/blog/defi-pulse-index/). Đây là một quỹ đầu tư tự động tái cân bằng để đảm bảo rằng danh mục đầu tư của bạn luôn bao gồm những token tài chính DeFi có vốn hóa thị trường lớn nhất. Bạn không bao giờ phải quản lý bất cứ chi tiết nào liên quan đến danh mục đầu tư của bạn và bạn có thể rút vốn bất cứ khi nào bạn thích.
- Xem các ứng dụng phi tập trung về đầu tư
+ Xem các ứng dụng phi tập trung đầu tư
-### Kêu gọi đầu tư cho những ý tưởng của bạn {#crowdfunding}
+### Gây quỹ cho ý tưởng của bạn {#crowdfunding}
Ethereum là một nền tảng lý tưởng cho việc gọi vốn từ cộng đồng:
@@ -255,10 +256,10 @@ Ethereum là một nền tảng lý tưởng cho việc gọi vốn từ cộng
- Những người kêu gọi vốn có thể thiết lập những khoản bồi hoàn tự động nếu, lấy ví dụ như, một hạn mốc thời gian bị vượt quá hay một số tiền quyên góp tối thiểu không đạt được.
- Xem các dapp gọi vốn cộng đồng
+ Xem các ứng dụng phi tập trung gây quỹ cộng đồng
-#### Đầu tư tương hỗ {#quadratic-funding}
+#### Quadratic funding {#quadratic-funding}
Ethereum là một mã nguồn mở và có nhiều việc đã được cộng đồng tự bỏ vốn ra thực hiện đến thời điểm này. Điều này đã dẫn đến sự phát triển của một mô hình kêu gọi vốn mới đầy thú vị: quadratic funding. Mô hình này có tiềm năng cải thiện cách mà chúng đầu tư cho mọi loại tiện ích công cộng trong tương lai.
@@ -272,7 +273,7 @@ Quadratic funding đảm bảo rằng những dự án nhận được nhiều v
Điều này có nghĩa rằng Dự án A với 100 khoản đóng góp x 1 đô la sẽ nhận được nhiều tiền vốn từ bể vốn tương hỗ hơn Dự án B với một khoản đóng góp duy nhất là 10,000 đô la.
- Đọc thêm về quadratic funding
+ Tìm hiểu thêm về quadratic funding
@@ -281,27 +282,27 @@ Quadratic funding đảm bảo rằng những dự án nhận được nhiều v
Bảo hiểm phi tập trung nhắm đến mục tiêu làm cho bảo hiểm trở nên rẻ hơn, chi trả nhanh hơn và minh bạch hơn. Với sự tự động hóa cao hơn, chi phí bảo hiểm trở nên phải chăng hơn và việc bồi hoàn từ bảo hiểm diễn ra nhanh chóng hơn nhiều. Dữ liệu dùng để đưa ra quyết định cho yêu cầu bảo hiểm của bạn hoàn toàn minh bạch.
-Những sản phẩm trên Ethereum, giống như bất kì một phần mềm nào, có thể chịu thiệt hại do những lỗ hổng và bị lợi dụng. Vì vậy, ở thời điểm hiện tại, rất nhiều sản phẩm bảo hiểm trên nền tảng tập trung vào việc bảo vệ người dùng của chúng khỏi bị mất tiền. Tuy nhiên, có những dự án đang bắt đầu xây dựng các gói bảo hiểm cho mọi thứ mà cuộc sống có thể giáng lên đầu chúng ta. Một ví dụ hay về những nỗ lực này là sản phẩm bảo hiểm nông sản của Etherisc với mục tiêu [bảo vệ những nông dân nhỏ lẻ ở Kenya khỏi hạn hán và lũ lụt](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc). Bảo hiểm phi tập trung có thể cung cấp những gói bảo hiểm rẻ hơn cho những người nông dân thường không có khả năng chi trả cho bảo hiểm truyền thống.
+Những sản phẩm trên Ethereum, giống như bất kì một phần mềm nào, có thể chịu thiệt hại do những lỗ hổng và bị lợi dụng. Vì vậy, ở thời điểm hiện tại, rất nhiều sản phẩm bảo hiểm trên nền tảng tập trung vào việc bảo vệ người dùng của chúng khỏi bị mất tiền. Tuy nhiên, có những dự án đang bắt đầu xây dựng các gói bảo hiểm cho mọi thứ mà cuộc sống có thể giáng lên đầu chúng ta. Một ví dụ điển hình về điều này là bảo hiểm Cây trồng của Etherisc nhằm mục đích [bảo vệ các nông hộ nhỏ ở Kenya trước hạn hán và lũ lụt](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc). Bảo hiểm phi tập trung có thể cung cấp những gói bảo hiểm rẻ hơn cho những người nông dân thường không có khả năng chi trả cho bảo hiểm truyền thống.
- Xem các dapp bảo hiểm
+ Xem các ứng dụng phi tập trung bảo hiểm
-### Những nhà tổng hợp thông tin và quản lý danh mục đầu tư {#aggregators}
+### Các công cụ tổng hợp và quản lý danh mục đầu tư {#aggregators}
Với quá nhiều thứ đang diễn ra, bạn sẽ cần có một cách để theo dõi tất cả các khoản đầu tư, cho vay và mua bán của mình. Có một loạt các sản phẩm cho phép bạn điều phối tất cả các hoạt động tài chính phi tập trung của mình từ một nơi duy nhất. Đây là lợi thế của cấu trúc mở của tài chính phi tập trung. Các nhóm có thể xây dựng những giao diện mà bạn không chỉ có thể thấy số dư của mình trên khắp các sản phẩm mà còn có thể sử dụng tính năng của chúng. Bạn có thể sẽ thấy điều này là hữu ích sau khi bạn khám phá thêm về DeFi.
- Xem các ứng dụng quản lý danh mục đầu tư
+ Xem các ứng dụng phi tập trung về danh mục đầu tư
## Tài chính phi tập trung hoạt động như thế nào? {#how-defi-works}
-Tài chính phi tập trung sử dụng tiền mã hóa và những hợp đồng thông minh để cung cấp dịch vụ mà không cần đến các bên trung gian. Trong thế giới tài chính ngày nay, các định chế tài chính đóng vai trò người đảm bảo cho giao dịch. Điều này trao cho họ quyền lực khổng lồ vì tiền của bạn được lưu chuyển thông qua họ. Thêm vào đó, hàng tỷ người trên thế giới thậm chí còn không thể mở một tài khoản ngân hàng.
+Tài chính phi tập trung sử dụng tiền mã hóa và những hợp đồng thông minh để cung cấp dịch vụ mà không cần đến các bên trung gian. Trong thế giới tài chính ngày nay, các định chế tài chính đóng vai trò người đảm bảo cho giao dịch. Điều này trao cho họ quyền lực khổng lồ vì tiền của bạn được lưu chuyển thông qua họ. Ngoài ra, hàng tỷ người trên thế giới thậm chí không thể truy cập vào tài khoản ngân hàng.
Trong tài chính phi tập trung, một hợp đồng thông minh thay thế cho định chế tài chính trong giao dịch. Một hợp đồng thông minh là một loại tài khoản trên Ethereum có thể giữ những khoản tiền và có thể gửi hoặc hoàn trả chúng dựa trên những điều kiện cụ thể. Không một ai có thể thay đổi hợp đồng thông minh một khi nó đã được kích hoạt – nó sẽ luôn luôn vận hành như đã được lập trình.
@@ -311,7 +312,7 @@ Các hợp đồng này cũng được công khai cho bất cứ ai muốn thẩ
Điều này cũng đồng nghĩa với việc rằng hiện tại chúng ta đang phải tin tưởng những thành viên có chuyên môn kĩ thuật trên cộng đồng Ethereum, những người có thể đọc và hiểu mã lập trình. Cộng đồng nguồn mở giúp giám sát những lập trình viên, nhưng nhu cầu này sẽ giảm đi theo thời gian khi mà các hợp đồng thông minh trở nên dễ đọc hơn và những phương thức khác nhằm cải thiện độ tin cậy của các đoạn mã được phát triển.
-## Ethereum và tài chính phi tập trung {#ethereum-and-defi}
+## Ethereum và DeFi {#ethereum-and-defi}
Ethereum là nền tảng hoàn hảo cho tài chính phi tập trung vì một số lý do sau:
@@ -323,38 +324,43 @@ Ethereum là nền tảng hoàn hảo cho tài chính phi tập trung vì một
Bạn có thể nghĩ về DeFi theo từng lớp:
1. Chuỗi khốiChuỗi khối – Ethereum chứa đựng lịch sử giao dịch và tình trạng hiện thời của các tài khoản.
-2. Các tài sản - [ETH](/what-is-ether/) và những loại tokens (tiền tệ) khác.
-3. Các giao thức – [hợp đồng thông minh](/glossary/#smart-contract) nhằm cung cấp tính năng, ví dụ như một dịch vụ cho phép việc cho vay tài sản một cách phi tập trung.
-4. [Các ứng dụng](/apps/) – những sản phẩm chúng ta dùng để quản lý và tiếp cận các giao thức.
+2. Các tài sản – [ETH](/what-is-ether/) và các token (tiền tệ) khác.
+3. Các giao thức – [hợp đồng thông minh](/glossary/#smart-contract) cung cấp chức năng, ví dụ, một dịch vụ cho phép cho vay tài sản phi tập trung.
+4. [Các ứng dụng](/apps/) – các sản phẩm chúng tôi sử dụng để quản lý và truy cập các giao thức.
-Ghi chú: đa số các DeFi sử dụng [tiêu chuẩn ERC-20](/glossary/#erc-20). Các ứng dụng DeFi sử dụng 1 phương thức bọc để tạo ra token được gắn với Ether ETH được gọi là Wrapped Ether (WETH). [Hãy tìm hiểu thêm về Eth bọc](/wrapped-eth).
+Lưu ý: phần lớn DeFi sử dụng [tiêu chuẩn ERC-20](/glossary/#erc-20). Các ứng dụng trong DeFi sử dụng một lớp bọc cho ETH gọi là Wrapped ether (WETH). [Tìm hiểu thêm về wrapped ether](/wrapped-eth).
-## Xây dựng tài chính phi tập trung {#build-defi}
+## Xây dựng DeFi {#build-defi}
Tài chính phi tập trung là một phong trào nguồn mở. Các giao thức và ứng dụng tài chính phi tập trung đều minh bạch để bạn có thể thẩm tra, phân nhánh và đổi mới. Nhờ vào cấu trúc xếp chồng lớp (layered stack) này (chúng đều chia sẻ cùng một chuỗi khối và những tài sản nền móng), các giao thức có thể được trộn lẫn và kết nối để mở ra những sự kết hợp mới đầy đặc trưng.
- Đọc thêm về việc xây dựng các dapp
+ Tìm hiểu thêm về việc xây dựng các ứng dụng phi tập trung
## Đọc thêm {#further-reading}
-### Dữ liệu tài chính phi tập trung {#defi-data}
+### Dữ liệu DeFi {#defi-data}
- [DeFi Prime](https://defiprime.com/)
- [DeFi Llama](https://defillama.com/)
-### Các bài báo về DeFi {#defi-articles}
+### Các bài viết về DeFi {#defi-articles}
-- [Một hướng dẫn về tài chính phi tập trung cho người mới bắt đầu](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) - _Sid Coelho-Prabhu, ngày 6 tháng 1, 2020_
+- [Hướng dẫn về DeFi cho người mới bắt đầu](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu, ngày 6 tháng 1 năm 2020_
+- [Nguyên tắc Đánh giá Rủi ro DeFi của EEA](https://entethalliance.org/specs/defi-risks/) – Bản tổng quan được ngành công nghiệp hỗ trợ về cách xác định và đánh giá các rủi ro chính trong giao thức DeFi.
-### Các video {#videos}
+### Video {#videos}
-- [Finematics - giáo dục về tài chính phi tập trung](https://finematics.com/) - _Các video về tài chính phi tập trung_
-- [Kẻ Thách Thức](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _Căn bản về tài chính phi tập trung: Mọi điều bạn cần biết để bắt đầu trong thế giới đôi lúc ẩn chứa đầy sửng sốt này._
-- [Bảng trắng tiền mã hóa](https://youtu.be/17QRFlml4pA) _Tài chính phi tập trung là gì?_
+- [Finematics - giáo dục về tài chính phi tập trung](https://finematics.com/) – _Các video về DeFi_
+- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _Những kiến thức cơ bản về DeFi: Mọi thứ bạn cần biết để bắt đầu trong không gian đôi khi khó hiểu này._
+- [Whiteboard Crypto](https://youtu.be/17QRFlml4pA) _DeFi là gì?_
-### Các cộng đồng {#communities}
+### Cộng đồng {#communities}
- [Máy chủ Discord của DeFi Llama](https://discord.defillama.com/)
- [Máy chủ Discord của DeFi Pulse](https://discord.gg/Gx4TCTk)
+
+
+
+
diff --git a/public/content/translations/vi/desci/index.md b/public/content/translations/vi/desci/index.md
new file mode 100644
index 00000000000..cc693db84b3
--- /dev/null
+++ b/public/content/translations/vi/desci/index.md
@@ -0,0 +1,139 @@
+---
+title: Khoa học không có chiều hướng tập trung (DeSci)
+description: "Một cái nhìn tổng quan của khoa học phi tập trung trên Ethereum "
+lang: vi
+template: use-cases
+emoji: ":microscope:"
+sidebarDepth: 2
+image: /images/future_transparent.png
+alt: ""
+summaryPoint1: Một giải pháp thay thế toàn cầu, rộng mở cho hệ thống khoa học hiện tại.
+summaryPoint2: Công nghệ cho phép các nhà khoa học gọi vốn, chạy thử nghiệm, chia sẻ dữ liệu, sự hiểu biết, và nhiều thứ hơn.
+summaryPoint3: Được xây dựng dựa trên các bước tiến của khoa học mở.
+---
+
+## Khoa học phi tập trung (DeSci) là những gì? {#what-is-desci}
+
+Khoa học phi tập trung (DeSci) là một phong trào nhằm mục đích xây dựng cơ sở hạ tầng công cộng để tài trợ, tạo, đánh giá, ghi công, lưu trữ và phổ biến kiến thức khoa học một cách công bằng và bình đẳng bằng cách sử dụng ngăn xếp [Web3](/glossary/#web3).
+
+Ngành khoa học phi tập trung DeSci tập trung vào việc tạo một hệ sinh thái nơi mà các nhà khoa học được khuyến khích để chia sẻ công khai các nghiên cứu của họ và nhận được sự công nhận cho sự đóng góp đó trong khi vẫn cho phép mọi người truy cập và đóng góp vào nghiên cứu của họ một cách dễ dàng. DeSci làm việc dựa trên ý tưởng rằng các kiến thức khoa học dễ dàng cho mọi người tiếp cận và quá trình nghiên cứu khoa học nên được minh bạch. DeSci đang tạo ra một mô hình nghiên cứu khoa học phi tập trung và phân tán hơn, có nhiều sức chịu đựng dưới sự kiểm duyệt và sự quản lý của các cơ quan trung ương. DeSci khuyến khích để tạo ra một môi trường nơi những ý tưởng mới và độc đáo có thể phát triển nhờ vào việc truy cập phân quyền vào các quỹ, các công cụ khoa học và phương tiện liên lạc.
+
+Khoa học phi tập trung cho phép có nhiều nguồn tài trợ đa dạng hơn (từ [DAO](/glossary/#dao), [quyên góp bậc hai](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) đến huy động vốn từ cộng đồng và hơn thế nữa), dữ liệu và phương pháp dễ tiếp cận hơn, và bằng cách cung cấp các biện pháp khuyến khích cho khả năng tái tạo.
+
+### Juan Benet - DeSci vận động
+
+
+
+## DeSci cải thiện khoa học như thế nào {#desci-improves-science}
+
+Một danh sách chưa đầy đủ của các vấn đề cốt lõi trong khoa học và cách khoa học phi tập trung có thể giúp giải quyết những vấn đề này
+
+| **Khoa học phi tập trung** | **Khoa học truyền thống** |
+| -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| Việc phân phối quỹ được **công chúng quyết định** bằng cách sử dụng các cơ chế như quyên góp bậc hai hoặc DAO. | Các **nhóm tập trung**, nhỏ, khép kín kiểm soát việc phân phối quỹ. |
+| Bạn cộng tác với các đồng nghiệp từ **khắp nơi trên thế giới** trong các nhóm năng động. | Các tổ chức tài trợ và cơ quan chủ quản **giới hạn** sự hợp tác của bạn. |
+| Các quyết định tài trợ được đưa ra trực tuyến và **minh bạch**. Các cơ chế góp vốn mới đang được khám phá. | Các quyết định tài trợ được đưa ra với thời gian quay vòng dài và **tính minh bạch hạn chế**. Một vài chuỗi tài trợ tồn tại. |
+| Việc chia sẻ các dịch vụ phòng thí nghiệm trở nên dễ dàng và minh bạch hơn bằng cách sử dụng công nghệ [Web3](/glossary/#web3). | Việc chia sẻ tài nguyên phòng thí nghiệm thường **chậm và không rõ ràng**. |
+| **Các mô hình xuất bản mới** có thể được phát triển sử dụng các nguyên hàm Web3 để tạo sự tin cậy, minh bạch và truy cập toàn cầu. | Bạn xuất bản thông qua các con đường đã được thiết lập thường được công nhận là **không hiệu quả, thiên vị và mang tính bóc lột**. |
+| Bạn có thể **kiếm token và danh tiếng cho công việc bình duyệt**. | **Công việc bình duyệt của bạn không được trả công**, mang lại lợi ích cho các nhà xuất bản vì lợi nhuận. |
+| **Bạn sở hữu tài sản trí tuệ (IP)** mà bạn tạo ra và phân phối nó theo các điều khoản minh bạch. | **Cơ quan chủ quản của bạn sở hữu IP** mà bạn tạo ra. Khả năng truy cập vào IP không minh bạch. |
+| **Chia sẻ tất cả các nghiên cứu**, bao gồm cả dữ liệu từ các nỗ lực không thành công, bằng cách đưa tất cả các bước lên chuỗi. | **Sự thiên vị trong xuất bản** có nghĩa là các nhà nghiên cứu có nhiều khả năng chia sẻ các thí nghiệm có kết quả thành công hơn. |
+
+## Ethereum và DeSci {#ethereum-and-desci}
+
+Một hệ thống khoa học phi tập trung sẽ yêu cầu bảo mật mạnh mẽ, chi phí giao dịch và tiền tệ tối thiểu cũng như một hệ sinh thái phong phú để phát triển ứng dụng. Ethereum cung cấp mọi thứ cần thiết để xây dựng công nghệ khoa học phi tập trung.
+
+## Các trường hợp sử dụng DeSci {#use-cases}
+
+DeSci đang xây dựng bộ công cụ khoa học để đưa giới học thuật truyền thống vào thế giới kỹ thuật số. Dưới đây là mẫu các trường hợp sử dụng mà Web3 có thể cung cấp cho cộng đồng khoa học.
+
+### Xuất bản {#publishing}
+
+Việc xuất bản khoa học nổi tiếng có nhiều vấn đề vì nó được quản lý bởi các nhà xuất bản dựa vào công sức lao động tự do từ các nhà khoa học, nhà phê bình và biên tập viên để tạo ra các bài nghiên cứu, nhưng sau đó tính phí xuất bản cắt cổ. Công chúng - thường gián tiếp trả tiền cho công trình và chi phí xuất bản thông qua thuế - thường không thể tiếp cận công trình đó nếu không trả lại tiền cho nhà xuất bản. Tổng phí để xuất bản các bài báo khoa học riêng lẻ thường lên tới năm con số (USD), làm suy yếu toàn bộ khái niệm kiến thức khoa học là một [hàng hóa công](/glossary/#public-goods) trong khi tạo ra lợi nhuận khổng lồ cho một nhóm nhỏ các nhà xuất bản.
+
+Các nền tảng miễn phí và truy cập mở tồn tại dưới dạng máy chủ tiền xuất bản, [chẳng hạn như ArXiv](https://arxiv.org/). Tuy nhiên, các nền tảng này thiếu kiểm soát chất lượng, [cơ chế chống tấn công sybil](/glossary/#anti-sybil), và thường không theo dõi các chỉ số cấp bài viết, có nghĩa là chúng thường chỉ được sử dụng để công bố công trình trước khi gửi cho một nhà xuất bản truyền thống. SciHub cũng cho phép truy cập miễn phí các bài báo đã xuất bản, nhưng không hợp pháp và chỉ sau khi các nhà xuất bản đã nhận thanh toán và nhúng tác phẩm vào vô số những luật bản quyền nghiêm ngặt. Điều này để lại một khoảng trống quan trọng cho các tài liệu và dữ liệu khoa học có thể truy cập được có cơ chế hợp pháp và mô hình khuyến khích nằm sẵn trong đó. Các công cụ để xây dựng một hệ thống như vậy tồn tại trong Web3.
+
+### Khả năng tái tạo và khả năng nhân rộng {#reproducibility-and-replicability}
+
+Khả năng tái dựng và nhân rộng là nền tảng xây dựng nên việc khám phá khoa học có chất lượng.
+
+- Các kết quả tái dựng được có thể được cùng một nhóm đạt lại liên tiếp khi sử dụng cùng một phương pháp.
+- Các kết quả nhân rộng được có thể được một nhóm khác đạt được khi sử dụng cùng một thiết lập thử nghiệm.
+
+Các công cụ gốc Web3 mới có thể đảm bảo rằng khả năng tái dựng và nhân rộng là cơ sở của việc khám phá. Chúng ta có thể đan xen khoa học chất lượng vào cơ cấu công nghệ của hệ thống học viện. Web3 mang đến khả năng tạo [chứng thực](/glossary/#attestation) cho từng thành phần phân tích: dữ liệu thô, công cụ tính toán và kết quả ứng dụng. Cái hay của hệ thống đồng thuận là khi một mạng tín nhiệm được tạo ra để duy trì các thành phần này, mỗi người tham gia mạng có thể chịu trách nhiệm tái dựng phép tính và xác thực từng kết quả.
+
+### Tài trợ {#funding}
+
+Mô hình tiêu chuẩn hiện nay để tài trợ cho khoa học là các cá nhân hoặc nhóm các nhà khoa học nộp đơn đăng ký bằng văn bản cho cơ quan tài trợ. Một hội đồng nhỏ gồm những cá nhân uy tín sẽ chấm điểm các đơn đăng ký và sau đó phỏng vấn các ứng viên trước khi cấp vốn cho một phần nhỏ người nộp đơn. Ngoài việc tạo ra các điểm nghẽn đôi khi dẫn đến thời gian **chờ đợi hàng năm trời** giữa việc nộp đơn và nhận tài trợ, mô hình này được biết là rất **dễ bị ảnh hưởng bởi sự thiên vị, lợi ích cá nhân và chính trị** của hội đồng xét duyệt.
+
+Các nghiên cứu đã chỉ ra rằng các hội đồng đánh giá tài trợ thực hiện công việc kém trong việc lựa chọn các đề xuất chất lượng cao vì các đề xuất giống nhau được đưa ra cho các hội đồng khác nhau lại có kết quả cực kỳ khác nhau. Khi nguồn tài trợ trở nên khan hiếm hơn, nó đã tập trung vào một nhóm nhỏ hơn gồm các nhà nghiên cứu cấp cao hơn với các dự án bảo thủ hơn về mặt trí tuệ. Hiệu ứng này đã tạo ra một bối cảnh tài trợ siêu cạnh tranh, khuyến khích tính cố hữu và cản trở sự đổi mới.
+
+Web3 có khả năng phá vỡ mô hình tài trợ nhiều lỗ hổng này bằng cách thử nghiệm các mô hình khuyến khích khác nhau, được phát triển rộng rãi bởi DAO và Web3. [Tài trợ hàng hóa công hồi tố](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), [tài trợ bậc hai](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), [quản trị DAO](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) và [cấu trúc khuyến khích được token hóa](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) là một số công cụ Web3 có thể cách mạng hóa việc tài trợ cho khoa học.
+
+### Quyền sở hữu và phát triển IP {#ip-ownership}
+
+Sở hữu trí tuệ (IP) là một vấn đề lớn trong khoa học truyền thống: từ việc bị mắc kẹt trong các trường đại học hoặc không được sử dụng trong công nghệ sinh học, cho đến việc khó định giá. Tuy nhiên, quyền sở hữu tài sản kỹ thuật số (chẳng hạn như dữ liệu hoặc bài báo khoa học) là điều mà Web3 thực hiện đặc biệt tốt bằng cách sử dụng [token không thể thay thế (NFT)](/glossary/#nft).
+
+Tương tự như cách NFT có thể chuyển doanh thu cho các giao dịch trong tương lai trở lại người tạo ban đầu, bạn có thể thiết lập chuỗi phân bổ giá trị minh bạch để thưởng cho các nhà nghiên cứu, cơ quan quản lý (như DAO) hoặc thậm chí các đối tượng có dữ liệu được thu thập.
+
+[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) cũng có thể hoạt động như một chìa khóa cho kho dữ liệu phi tập trung của các thí nghiệm nghiên cứu đang được thực hiện và kết nối với việc tài chính hóa NFT và [DeFi](/glossary/#defi) (từ phân mảnh đến các bể cho vay và thẩm định giá trị). Nó cũng cho phép các thực thể gốc trên chuỗi như các DAO như [VitaDAO](https://www.vitadao.com/) tiến hành nghiên cứu trực tiếp trên chuỗi.
+Sự ra đời của các [token \"ràng buộc linh hồn\"](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) không thể chuyển nhượng cũng có thể đóng một vai trò quan trọng trong DeSci bằng cách cho phép các cá nhân chứng minh kinh nghiệm và thông tin xác thực của họ được liên kết với địa chỉ Ethereum của họ.
+
+### Lưu trữ, truy cập và kiến trúc dữ liệu {#data-storage}
+
+Dữ liệu khoa học có thể được truy cập dễ dàng hơn nhiều bằng cách sử dụng các mẫu Web3 và lưu trữ phân tán, cho phép giữ lại được nghiên cứu trong trường hợp có sự kiện thảm họa xảy ra.
+
+Điểm bắt đầu phải là một hệ thống có thể truy cập được bởi mọi định danh phi tập trung có thông tin xác thực phù hợp. Điều này cho phép dữ liệu nhạy cảm được tái dựng một cách an toàn bởi các bên tín nhiệm, cho phép giảm dư thừa và chống kiểm duyệt, giúp tái dựng kết quả và thậm chí cả khả năng cho phép nhiều bên cộng tác và thêm dữ liệu mới vào tập dữ liệu. Các phương pháp tính toán bí mật như [compute-to-data](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol) cung cấp các cơ chế truy cập thay thế cho việc sao chép dữ liệu thô, tạo ra Môi trường Nghiên cứu Đáng tin cậy cho dữ liệu nhạy cảm nhất. Môi trường Nghiên cứu Đáng tin cậy đã được [NHS trích dẫn](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb) là một giải pháp hướng tới tương lai cho quyền riêng tư và cộng tác dữ liệu bằng cách tạo ra một hệ sinh thái nơi các nhà nghiên cứu có thể làm việc an toàn với dữ liệu tại chỗ bằng cách sử dụng các môi trường được tiêu chuẩn hóa để chia sẻ mã và các phương pháp thực hành.
+
+Các giải pháp dữ liệu Web3 linh hoạt hỗ trợ các kịch bản trên và cung cấp nền tảng cho Khoa học Mở thực sự, tại đó các nhà nghiên cứu có thể tạo ra hàng hóa công mà không cần giấy phép hoặc phí truy cập. Các giải pháp dữ liệu công khai Web3 như IPFS, Arweave và Filecoin được tối ưu hóa cho quá trình phân cấp. Ví dụ, dClimate cung cấp quyền cho tất cả mọi người truy cập vào dữ liệu về khí hậu và thời tiết, bao gồm dữ liệu từ các trạm thời tiết và các mô hình dự báo khí hậu.
+
+## Tham gia {#get-involved}
+
+Khám phá các dự án và tham gia cộng đồng DeSci.
+
+- [DeSci.Global: lịch sự kiện và gặp gỡ toàn cầu](https://desci.global)
+- [Telegram Blockchain for Science](https://t.me/BlockchainForScience)
+- [Molecule: Tài trợ và nhận tài trợ cho các dự án nghiên cứu của bạn](https://www.molecule.xyz/)
+- [VitaDAO: nhận tài trợ thông qua các thỏa thuận nghiên cứu được tài trợ cho nghiên cứu về tuổi thọ](https://www.vitadao.com/)
+- [ResearchHub: đăng một kết quả khoa học và tham gia vào một cuộc trò chuyện với các đồng nghiệp](https://www.researchhub.com/)
+- [API dClimate: truy vấn dữ liệu khí hậu được thu thập bởi một cộng đồng phi tập trung](https://www.dclimate.net/)
+- [Quỹ DeSci: nhà xây dựng công cụ xuất bản DeSci](https://descifoundation.org/)
+- [DeSci.World: một điểm dừng duy nhất để người dùng xem, tham gia với khoa học phi tập trung](https://desci.world)
+- [OceanDAO: tài trợ do DAO quản trị cho khoa học liên quan đến dữ liệu](https://oceanprotocol.com/)
+- [Opscientia: quy trình làm việc khoa học phi tập trung mở](https://opsci.io/research/)
+- [Bio.xyz: nhận tài trợ cho dự án DAO công nghệ sinh học hoặc dự án desci của bạn](https://www.bio.xyz/)
+- [Giao thức Fleming: nền kinh tế dữ liệu nguồn mở thúc đẩy khám phá y sinh hợp tác](http://flemingprotocol.io/)
+- [Viện Suy luận Chủ động](https://www.activeinference.org/)
+- [IdeaMarkets: cho phép sự tín nhiệm khoa học phi tập trung](https://ideamarket.io/)
+- [DeSci Labs](https://www.desci.com/)
+- [ValleyDAO: một cộng đồng mở, toàn cầu cung cấp tài trợ và hỗ trợ chuyển giao cho nghiên cứu sinh học tổng hợp](https://www.valleydao.bio)
+- [Cerebrum DAO: tìm nguồn và nuôi dưỡng các giải pháp để nâng cao sức khỏe não bộ và ngăn ngừa thoái hóa thần kinh](https://www.cerebrumdao.com/)
+- [CryoDAO: tài trợ cho nghiên cứu đột phá trong lĩnh vực bảo quản lạnh](https://www.cryodao.org)
+- [Elata: Có tiếng nói trong tương lai của y học tâm thần](https://www.elata.bio/)
+
+Chúng tôi hoan nghênh các đề xuất cho các dự án mới để niêm yết - vui lòng xem [chính sách niêm yết](/contributing/adding-desci-projects/) của chúng tôi để bắt đầu!
+
+## Đọc thêm {#further-reading}
+
+- [DeSci Wiki của Jocelynn Pearl và Ultrarare](https://docs.google.com/document/d/1aQC6zn-eXflSmpts0XGE7CawbUEHwnL6o-OFXO52PTc/edit#)
+- [Hướng dẫn về công nghệ sinh học phi tập trung của Jocelynn Pearl cho a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/)
+- [Lý do cho DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/)
+- [Hướng dẫn về DeSci](https://future.com/what-is-decentralized-science-aka-desci/)
+- [Tài nguyên khoa học phi tập trung](https://www.vincentweisser.com/desci)
+- [IP-NFT Dược phẩm sinh học của Molecule - Mô tả kỹ thuật](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description)
+- [Xây dựng các hệ thống khoa học phi tín nhiệm của Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673)
+- [Paul Kohlhaas - DeSci: Tương lai của Khoa học Phi tập trung (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a)
+- [Một Bản thể luận Suy luận Tích cực cho Khoa học Phi tập trung: từ Tạo ý nghĩa theo Tình huống đến Chung về Tri thức luận](https://zenodo.org/record/6320575)
+- [DeSci: Tương lai của Nghiên cứu của Samuel Akinosho](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec)
+- [Tài trợ Khoa học (Phần kết: DeSci và các nguyên hàm crypto mới) của Nadia](https://nadia.xyz/science-funding)
+- [Phi tập trung hóa đang phá vỡ sự phát triển thuốc](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f)
+- [DeSci là gì – Khoa học phi tập trung?](https://usadailytimes.com/2022/09/12/what-is-desci-decentralized-science/)
+
+### Video {#videos}
+
+- [Khoa học phi tập trung là gì?](https://www.youtube.com/watch?v=-DeMklVWNdA)
+- [Cuộc trò chuyện giữa Vitalik Buterin và nhà khoa học Aubrey de Grey về giao điểm của nghiên cứu tuổi thọ và crypto](https://www.youtube.com/watch?v=x9TSJK1widA)
+- [Xuất bản Khoa học Đang quá Lỗi. Web3 có thể khắc phục được không?](https://www.youtube.com/watch?v=WkvzYgCvWj8)
+- [Juan Benet - DeSci, Phòng thí nghiệm độc lập, & Khoa học dữ liệu quy mô lớn](https://www.youtube.com/watch?v=zkXM9H90g_E)
+- [Sebastian Brunemeier - DeSci có thể biến đổi Nghiên cứu Y sinh & Vốn Mạo hiểm như thế nào](https://www.youtube.com/watch?v=qB4Tc3FcVbM)
+- [Paige Donner - Công cụ hóa Khoa học Mở với Web3 & Chuỗi khối](https://www.youtube.com/watch?v=nC-2QWQ-lgw&t=17s)
diff --git a/public/content/translations/vi/developers/docs/accounts/index.md b/public/content/translations/vi/developers/docs/accounts/index.md
new file mode 100644
index 00000000000..605661c0b94
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/accounts/index.md
@@ -0,0 +1,137 @@
+---
+title: Các loại tài khoản Ethereum
+description: Giải thích về các loại tài khoản Ethereum - các cấu trúc dữ liệu và mối quan hệ của chúng với cặp khóa mật mã.
+lang: vi
+---
+
+Một tài khoản Ethereum là một thực thể có số dư ether (ETH) có khả năng gửi tin nhắn trên mạng Ethereum. Các tài khoản có thể được người dùng kiểm soát hoặc triển khai dưới dạng các hợp đồng thông minh.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để giúp bạn hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc qua [phần giới thiệu về Ethereum](/developers/docs/intro-to-ethereum/) của chúng tôi.
+
+## Các loại tài khoản {#types-of-account}
+
+Ethereum có 2 loại tài khoản:
+
+- Tài khoản thuộc sở hữu bên ngoài (EOA) – được kiểm soát bởi bất kỳ ai có khóa riêng
+- Tài khoản hợp đồng – một hợp đồng thông minh được triển khai lên mạng, được điều khiển bởi mã. Tìm hiểu về [hợp đồng thông minh](/developers/docs/smart-contracts/)
+
+Cả hai loại tài khoản đều có khả năng:
+
+- Nhận, giữ và gửi ETH và các token
+- Tương tác với các hợp đồng thông minh đã được triển khai
+
+### Các điểm khác biệt chính {#key-differences}
+
+**sở hữu ngoại biên**
+
+- Việc tạo tài khoản là miễn phí
+- Có thể khởi tạo các giao dịch
+- Các giao dịch giữa các tài khoản sở hữu bên ngoài chỉ có thể là chuyển khoản ETH/token
+- Được cấu thành từ một cặp khóa mã hóa: khóa công khai và khóa riêng tư điều khiển hoạt động của tài khoản
+
+**Hợp đồng**
+
+- Việc tạo hợp đồng có chi phí vì bạn đang lưu trữ trên mạng
+- Chỉ có thể gửi tin nhắn để phản hồi việc nhận giao dịch
+- Các giao dịch từ một tài khoản bên ngoài đến một tài khoản hợp đồng có thể kích hoạt mã có thể thực hiện nhiều hành động khác nhau, chẳng hạn như chuyển token hoặc thậm chí tạo ra một hợp đồng mới
+- Tài khoản hợp đồng không có khóa riêng. Thay vào đó, chúng được kiểm soát bởi logic của mã hợp đồng thông minh
+
+## Xem xét một tài khoản {#an-account-examined}
+
+Tài khoản Ethereum có bốn trường:
+
+- `nonce` – Một bộ đếm cho biết số lượng giao dịch được gửi từ một tài khoản do bên ngoài sở hữu hoặc số lượng hợp đồng được tạo bởi một tài khoản hợp đồng. Chỉ một giao dịch với một nonce nhất định có thể được thực hiện cho mỗi tài khoản, bảo vệ chống lại các cuộc tấn công phát lại, trong đó các giao dịch đã ký được phát sóng và thực hiện lại nhiều lần.
+- `balance` – Số lượng wei mà địa chỉ này sở hữu. Wei là một đơn vị của ETH và có 1e+18 wei cho mỗi ETH.
+- `codeHash` – Hàm băm này đề cập đến _mã_ của một tài khoản trên máy ảo Ethereum (EVM). Tài khoản hợp đồng có các mã code được lập trình sẵn có thể thực hiện các thao tác khác nhau. Mã EVM này sẽ được thực thi nếu tài khoản nhận một cuộc gọi tin nhắn. Nó không thể thay đổi, khác với các trường tài khoản khác. Tất cả các đoạn mã như vậy được lưu trữ trong cơ sở dữ liệu trạng thái dưới các hash tương ứng của chúng để có thể truy xuất sau này. Giá trị hash được hiểu là một codeHash. Đối với các tài khoản sở hữu bên ngoài, trường codeHash là hash của một chuỗi rỗng.
+- `storageRoot` – Đôi khi được gọi là hàm băm lưu trữ. Một hàm băm 256-bit của nút gốc của một [Merkle Patricia Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/) mã hóa nội dung lưu trữ của tài khoản (một ánh xạ giữa các giá trị số nguyên 256-bit), được mã hóa vào trie dưới dạng một ánh xạ từ hàm băm Keccak 256-bit của các khóa số nguyên 256-bit sang các giá trị số nguyên 256-bit được mã hóa bằng RLP. Cây trie này mã hóa giá trị hash của nội dung lưu trữ của tài khoản này và theo mặc định thì nó rỗng.
+
+
+_Sơ đồ được phỏng theo [minh họa về EVM của Ethereum](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_
+
+## Các tài khoản thuộc sở hữu bên ngoài và các cặp khóa {#externally-owned-accounts-and-key-pairs}
+
+Một tài khoản được tạo thành từ một cặp chìa khóa mã hóa: chìa khóa công khai và chìa khóa riêng. Chúng giúp chứng minh rằng một giao dịch thực sự đã được ký bởi người gửi và ngăn chặn việc giả mạo. Khóa riêng của bạn là thứ bạn sử dụng để ký các giao dịch, vì vậy nó cấp cho bạn quyền sở hữu đối với các quỹ liên kết với tài khoản của bạn. Bạn không thực sự sở hữu tiền mã hóa, bạn sở hữu các khóa riêng – các quỹ luôn nằm trên sổ cái của Ethereum.
+
+Điều này ngăn chặn các tác nhân độc hại phát tán giao dịch giả mạo vì bạn luôn có thể xác minh người gửi của một giao dịch.
+
+Nếu Alice muốn gửi ether từ tài khoản của mình sang tài khoản của Bob, Alice cần tạo một yêu cầu giao dịch và gửi nó đến mạng để xác minh. Việc Ethereum sử dụng mật mã khóa công khai đảm bảo rằng Alice có thể chứng minh rằng cô ấy đã khởi xướng yêu cầu giao dịch ban đầu. Nếu không có cơ chế mã hóa, một đối thủ ác ý như Eve có thể đơn giản phát đi một yêu cầu công khai trông giống như "gửi 5 ETH từ tài khoản của Alice tới tài khoản của Eve," và không ai có thể xác minh rằng yêu cầu này không đến từ Alice.
+
+## Tạo tài khoản {#account-creation}
+
+Khi bạn muốn tạo một tài khoản, hầu hết các thư viện sẽ tạo cho bạn một khóa bí mật ngẫu nhiên.
+
+Một khóa riêng được tạo thành từ 64 ký tự hex và có thể được mã hóa bằng một mật khẩu.
+
+Ví dụ:
+
+`fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f`
+
+Khóa công khai được tạo từ khóa riêng tư bằng [Thuật toán chữ ký số đường cong elip](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm). Bạn có được địa chỉ công khai cho tài khoản của mình bằng cách lấy 20 byte cuối của hàm băm Keccak-256 của khóa công khai và thêm `0x` vào đầu.
+
+Điều này có nghĩa là một tài khoản được sở hữu bên ngoài (EOA) có một địa chỉ 42 ký tự (đoạn 20 byte bao gồm 40 ký tự thập lục phân cộng với tiền tố `0x`).
+
+Ví dụ:
+
+`0x5e97870f263700f46aa00d967821199b9bc5a120`
+
+Ví dụ sau đây cho thấy cách sử dụng một công cụ ký tên là [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) để tạo một tài khoản mới. Clef là một công cụ quản lý tài khoản và ký đi kèm với trình khách Ethereum, [Geth](https://geth.ethereum.org). Lệnh `clef newaccount` tạo một cặp khóa mới và lưu chúng trong một kho khóa đã mã hóa.
+
+```
+> clef newaccount --keystore <đường_dẫn>
+
+Vui lòng nhập mật khẩu cho tài khoản mới sẽ được tạo:
+>
+
+------------
+INFO [10-28|16:19:09.156] Khóa mới của bạn đã được tạo address=0x5e97870f263700f46aa00d967821199b9bc5a120
+WARN [10-28|16:19:09.306] Vui lòng sao lưu tệp khóa của bạn path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120
+WARN [10-28|16:19:09.306] Vui lòng ghi nhớ mật khẩu của bạn!
+Tài khoản đã tạo 0x5e97870f263700f46aa00d967821199b9bc5a120
+```
+
+[Tài liệu về Geth](https://geth.ethereum.org/docs)
+
+Có thể tạo ra các khóa công khai mới từ khóa cá nhân của bạn, nhưng bạn không thể tạo ra khóa cá nhân từ các khóa công khai. Điều quan trọng là phải giữ an toàn các khóa riêng tư của bạn và, như tên gọi của nó, hãy giữ chúng **RIÊNG TƯ**.
+
+Bạn cần một khóa riêng để ký các tin nhắn và giao dịch có đầu ra là một chữ ký. Người khác có thể sử dụng chữ ký để suy ra khóa công khai của bạn, từ đó chứng minh tác giả của tin nhắn. Trong ứng dụng của bạn, bạn có thể sử dụng một thư viện JavaScript để gửi giao dịch đến mạng.
+
+## Các tài khoản hợp đồng {#contract-accounts}
+
+Tài khoản hợp đồng cũng có một địa chỉ hexadecimal dài 42 ký tự:
+
+Ví dụ:
+
+`0x06012c8cf97bead5deae237070f9587f8e7a266d`
+
+Địa chỉ hợp đồng thường được cung cấp khi một hợp đồng được triển khai trên Blockchain Ethereum. Địa chỉ xuất phát từ địa chỉ của người tạo ra và số lượng giao dịch được gửi từ địa chỉ đó (gọi là “nonce”).
+
+## Các khóa của trình xác thực {#validators-keys}
+
+Cũng có một loại chìa khóa khác trong Ethereum, được giới thiệu khi Ethereum chuyển từ cơ chế đồng thuận bằng chứng công việc sang cơ chế đồng thuận bằng chứng cổ phần. Đây là các khóa 'BLS' và chúng được sử dụng để xác định các trình xác thực. Những khóa này có thể được tổng hợp một cách hiệu quả để giảm băng thông cần thiết cho mạng đạt được sự đồng thuận. Nếu không có sự tổng hợp này, mức cược tối thiểu cho một validator sẽ cao hơn nhiều.
+
+[Thêm về các khóa của trình xác thực](/developers/docs/consensus-mechanisms/pos/keys/).
+
+## Lưu ý về các ví {#a-note-on-wallets}
+
+Một tài khoản không phải là một ví. Ví là một giao diện hoặc ứng dụng cho phép bạn tương tác với tài khoản Ethereum của mình, có thể là tài khoản do cá nhân sở hữu hoặc tài khoản hợp đồng.
+
+## Bản demo trực quan {#a-visual-demo}
+
+Xem Austin hướng dẫn bạn về hàm băm và cặp khóa.
+
+
+
+
+
+## Đọc thêm {#further-reading}
+
+- [Tìm hiểu về Tài khoản Ethereum](https://info.etherscan.com/understanding-ethereum-accounts/) - etherscan
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Hợp đồng thông minh](/developers/docs/smart-contracts/)
+- [Giao dịch](/developers/docs/transactions/)
diff --git a/public/content/translations/vi/developers/docs/apis/backend/index.md b/public/content/translations/vi/developers/docs/apis/backend/index.md
new file mode 100644
index 00000000000..b293fce3bab
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/apis/backend/index.md
@@ -0,0 +1,211 @@
+---
+title: Thư viên Backend API
+description: Một giới thiệu về các API của client Ethereum cho phép bạn tương tác với blockchain từ ứng dụng của mình.
+lang: vi
+---
+
+Để một ứng dụng phần mềm có thể tương tác với chuỗi khối Ethereum (tức là đọc dữ liệu chuỗi khối và/hoặc gửi giao dịch đến mạng), nó phải kết nối với một nút Ethereum.
+
+Vì mục đích này, mọi client Ethereum đều triển khai đặc tả [JSON-RPC](/developers/docs/apis/json-rpc/), do đó có một bộ [phương thức](/developers/docs/apis/json-rpc/#json-rpc-methods) thống nhất mà các ứng dụng có thể tin cậy.
+
+Nếu bạn muốn sử dụng một ngôn ngữ lập trình cụ thể để kết nối với nút Ethereum, có rất nhiều thư viện tiện lợi trong hệ sinh thái giúp việc này trở nên dễ dàng hơn rất nhiều. Với các thư viện này, các nhà phát triển có thể viết các phương thức trực quan, chỉ với một dòng mã để khởi tạo các yêu cầu JSON-RPC (dưới lớp ngoài) tương tác với Ethereum.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Sẽ rất hữu ích nếu bạn tìm hiểu về [Ethereum stack](/developers/docs/ethereum-stack/) và [các client Ethereum](/developers/docs/nodes-and-clients/).
+
+## Tại sao lại sử dụng thư viện {#why-use-a-library}
+
+Những thư viện này giúp đơn giản hóa nhiều phần phức tạp khi bạn tương tác trực tiếp với một nút Ethereum. Chúng cũng cung cấp các hàm tiện ích (ví dụ: chuyển đổi ETH sang Gwei) để với tư cách là nhà phát triển, bạn có thể tốn ít thời gian hơn để xử lý những phức tạp của các client Ethereum và tập trung nhiều thời gian hơn vào chức năng độc đáo của ứng dụng.
+
+## Các thư viện hiện có {#available-libraries}
+
+### Dịch vụ cơ sở hạ tầng và nút {#infrastructure-and-node-services}
+
+**Alchemy -** **_Nền tảng phát triển Ethereum._**
+
+- [alchemy.com](https://www.alchemy.com/)
+- [Tài liệu](https://www.alchemy.com/docs/)
+- [GitHub](https://github.com/alchemyplatform)
+- [Discord](https://discord.com/invite/alchemyplatform)
+
+**All That Node -** **_Nút dưới dạng Dịch vụ._**
+
+- [All That Node.com](https://www.allthatnode.com/)
+- [Tài liệu](https://docs.allthatnode.com)
+- [Discord](https://discord.gg/GmcdVEUbJM)
+
+**Blast by Bware Labs -** **_Các API phi tập trung cho Mạng chính Ethereum và các Mạng thử nghiệm._**
+
+- [blastapi.io](https://blastapi.io/)
+- [Tài liệu](https://docs.blastapi.io)
+- [Discord](https://discord.gg/SaRqmRUjjQ)
+
+**BlockPi -** **_Cung cấp các dịch vụ RPC hiệu quả và nhanh hơn_**
+
+- [blockpi.io](https://blockpi.io/)
+- [Tài liệu](https://docs.blockpi.io/)
+- [GitHub](https://github.com/BlockPILabs)
+- [Discord](https://discord.com/invite/xTvGVrGVZv)
+
+**Cổng kết nối Ethereum Cloudflare.**
+
+- [cloudflare-eth.com](https://www.cloudflare.com/application-services/products/web3/)
+
+**Etherscan - Block Explorer và Giao dịch API**
+
+- [Tài liệu](https://docs.etherscan.io/)
+
+**Blockscout - Trình phá khối mã nguồn mở**
+
+- [Tài liệu](https://docs.blockscout.com/)
+
+**GetBlock -** **_Chuỗi khối dưới dạng dịch vụ để phát triển Web3_**
+
+- [GetBlock.io](https://getblock.io/)
+- [Tài liệu](https://docs.getblock.io/)
+
+**Infura -** **_API Ethereum dưới dạng một dịch vụ._**
+
+- [infura.io](https://infura.io)
+- [Tài liệu](https://docs.infura.io/api)
+- [GitHub](https://github.com/INFURA)
+
+**Node RPC -** **_Nhà cung cấp JSON-RPC EVM hiệu quả về chi phí_**
+
+- [noderpc.xyz](https://www.noderpc.xyz/)
+- [Tài liệu](https://docs.noderpc.xyz/node-rpc)
+
+**NOWNodes -** **_Các nút đầy đủ và Trình khám phá khối._**
+
+- [NOWNodes.io](https://nownodes.io/)
+- [Tài liệu](https://nownodes.gitbook.io/documentation)
+
+**QuickNode -** **_Cơ sở hạ tầng Chuỗi khối dưới dạng Dịch vụ._**
+
+- [quicknode.com](https://quicknode.com)
+- [Tài liệu](https://www.quicknode.com/docs/welcome)
+- [Discord](https://discord.gg/quicknode)
+
+**Rivet -** **_Các API Ethereum và Ethereum Classic dưới dạng dịch vụ được cung cấp bởi phần mềm mã nguồn mở._**
+
+- [rivet.cloud](https://rivet.cloud)
+- [Tài liệu](https://rivet.cloud/docs/)
+- [GitHub](https://github.com/openrelayxyz/ethercattle-deployment)
+
+**Zmok -** **_Các nút Ethereum tập trung vào tốc độ qua API JSON-RPC/WebSockets._**
+
+- [zmok.io](https://zmok.io/)
+- [GitHub](https://github.com/zmok-io)
+- [Tài liệu](https://docs.zmok.io/)
+- [Discord](https://discord.gg/fAHeh3ka6s)
+
+### Công cụ phát triển {#development-tools}
+
+**ethers-kt -** **_Thư viện Kotlin/Java/Android không đồng bộ, hiệu suất cao cho các chuỗi khối dựa trên EVM._**
+
+- [GitHub](https://github.com/Kr1ptal/ethers-kt)
+- [Các ví dụ](https://github.com/Kr1ptal/ethers-kt/tree/master/examples)
+- [Discord](https://discord.gg/rx35NzQGSb)
+
+**Nethereum -** **_Một thư viện tích hợp .NET mã nguồn mở cho chuỗi khối._**
+
+- [GitHub](https://github.com/Nethereum/Nethereum)
+- [Tài liệu](http://docs.nethereum.com/en/latest/)
+- [Discord](https://discord.com/invite/jQPrR58FxX)
+
+**Bộ công cụ Python -** **_Nhiều thư viện để tương tác với Ethereum qua Python._**
+
+- [py.ethereum.org](https://snakecharmers.ethereum.org/)
+- [web3.py GitHub](https://github.com/ethereum/web3.py)
+- [web3.py Chat](https://gitter.im/ethereum/web3.py)
+
+**Tatum -** **_Nền tảng phát triển chuỗi khối tối ưu._**
+
+- [Tatum](https://tatum.io/)
+- [GitHub](https://github.com/tatumio/)
+- [Tài liệu](https://docs.tatum.io/)
+- [Discord](https://discord.gg/EDmW3kjTC9)
+
+**web3j -** **_Thư viện tích hợp Java/Android/Kotlin/Scala cho Ethereum._**
+
+- [GitHub](https://github.com/web3j/web3j)
+- [Tài liệu](https://docs.web3j.io/)
+- [Gitter](https://gitter.im/web3j/web3j)
+
+### Các dịch vụ chuỗi khối {#blockchain-services}
+
+**BlockCypher -** **_Các API Web của Ethereum._**
+
+- [blockcypher.com](https://www.blockcypher.com/)
+- [Tài liệu](https://www.blockcypher.com/dev/ethereum/)
+
+**Chainbase -** **_Cơ sở hạ tầng dữ liệu web3 toàn diện cho Ethereum._**
+
+- [chainbase.com](https://chainbase.com/)
+- [Tài liệu](https://docs.chainbase.com/)
+- [Discord](https://discord.gg/Wx6qpqz4AF)
+
+**Chainstack -** **_Các nút Ethereum linh hoạt và chuyên dụng dưới dạng dịch vụ._**
+
+- [chainstack.com](https://chainstack.com)
+- [Tài liệu](https://docs.chainstack.com/)
+- [Tài liệu tham khảo API Ethereum](https://docs.chainstack.com/reference/ethereum-getting-started)
+
+**Coinbase Cloud Node -** **_API Cơ sở hạ tầng Chuỗi khối._**
+
+- [Coinbase Cloud Node](https://www.coinbase.com/developer-platform)
+- [Tài liệu](https://docs.cdp.coinbase.com/)
+
+**DataHub by Figment -** **_Các dịch vụ API Web3 với Mạng chính Ethereum và các mạng thử nghiệm._**
+
+- [DataHub](https://www.figment.io/)
+- [Tài liệu](https://docs.figment.io/)
+
+**Moralis -** **_Nhà cung cấp API EVM cấp doanh nghiệp._**
+
+- [moralis.io](https://moralis.io)
+- [Tài liệu](https://docs.moralis.io/)
+- [GitHub](https://github.com/MoralisWeb3)
+- [Discord](https://moralis.io/joindiscord/)
+- [Diễn đàn](https://forum.moralis.io/)
+
+**NFTPort -** **_Các API Dữ liệu và Đúc của Ethereum._**
+
+- [nftport.xyz](https://www.nftport.xyz/)
+- [Tài liệu](https://docs.nftport.xyz/)
+- [GitHub](https://github.com/nftport/)
+- [Discord](https://discord.com/invite/K8nNrEgqhE)
+
+**Tokenview -** **_Nền tảng API chuỗi khối đa tiền mã hóa chung._**
+
+- [services.tokenview.io](https://services.tokenview.io/)
+- [Tài liệu](https://services.tokenview.io/docs?type=api)
+- [GitHub](https://github.com/Tokenview)
+
+**Watchdata -** **_Cung cấp quyền truy cập API đơn giản và đáng tin cậy vào chuỗi khối Ethereum._**
+
+- [Watchdata](https://watchdata.io/)
+- [Tài liệu](https://docs.watchdata.io/)
+- [Discord](https://discord.com/invite/TZRJbZ6bdn)
+
+**Covalent -** **_Các API chuỗi khối nâng cao cho hơn 200 chuỗi._**
+
+- [covalenthq.com](https://www.covalenthq.com/)
+- [Tài liệu](https://www.covalenthq.com/docs/api/)
+- [GitHub](https://github.com/covalenthq)
+- [Discord](https://www.covalenthq.com/discord/)
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các nút và client](/developers/docs/nodes-and-clients/)
+- [Các khung phát triển](/developers/docs/frameworks/)
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Thiết lập Web3js để sử dụng chuỗi khối Ethereum trong JavaScript](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Hướng dẫn thiết lập web3.js trong dự án của bạn._
+- [Gọi một hợp đồng thông minh từ JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Sử dụng token DAI, hãy xem cách gọi hàm hợp đồng bằng JavaScript._
diff --git a/public/content/translations/vi/developers/docs/apis/javascript/index.md b/public/content/translations/vi/developers/docs/apis/javascript/index.md
new file mode 100644
index 00000000000..bd1ebd4acb1
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/apis/javascript/index.md
@@ -0,0 +1,289 @@
+---
+title: Thư viện API Javascript
+description: Một giới thiệu về các thư viện client JavaScript cho phép bạn tương tác với blockchain từ ứng dụng của bạn.
+lang: vi
+---
+
+Để một ứng dụng web có thể tương tác với chuỗi khối Ethereum (tức là đọc dữ liệu chuỗi khối và/hoặc gửi giao dịch đến mạng), nó phải kết nối với một nút Ethereum.
+
+Vì mục đích này, mọi máy khách Ethereum đều triển khai đặc tả [JSON-RPC](/developers/docs/apis/json-rpc/), vì vậy có một bộ [phương thức](/developers/docs/apis/json-rpc/#json-rpc-methods) thống nhất mà các ứng dụng có thể dựa vào.
+
+Nếu bạn muốn sử dụng JavaScript để kết nối với một nút Ethereum, bạn có thể dùng JavaScript thuần, nhưng có nhiều thư viện tiện lợi trong hệ sinh thái giúp việc này dễ dàng hơn nhiều. Với các thư viện này, các nhà phát triển có thể viết các phương thức trực quan, chỉ với một dòng mã để khởi tạo các yêu cầu JSON-RPC (dưới lớp ngoài) tương tác với Ethereum.
+
+Xin lưu ý rằng kể từ [The Merge](/roadmap/merge/), cần có hai phần mềm Ethereum được kết nối - một máy khách thực thi và một máy khách đồng thuận - để chạy một nút. Hãy chắc chắn rằng nút của bạn có cả client thực thi và client đồng thuận. Nếu nút của bạn không có trên máy cục bộ (ví dụ: nút của bạn đang chạy trên một phiên bản AWS), hãy cập nhật các địa chỉ IP trong hướng dẫn cho phù hợp. Để biết thêm thông tin, vui lòng xem trang của chúng tôi về [chạy một nút](/developers/docs/nodes-and-clients/run-a-node/).
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Cũng như việc hiểu về JavaScript, sẽ rất hữu ích nếu bạn hiểu về [ngăn xếp Ethereum](/developers/docs/ethereum-stack/) và [các máy khách Ethereum](/developers/docs/nodes-and-clients/).
+
+## Tại sao lại sử dụng thư viện {#why-use-a-library}
+
+Những thư viện này giúp đơn giản hóa nhiều phần phức tạp khi bạn tương tác trực tiếp với một nút Ethereum. Chúng cũng cung cấp các hàm tiện ích (ví dụ: chuyển đổi ETH sang Gwei) để với tư cách là nhà phát triển, bạn có thể tốn ít thời gian hơn để xử lý những phức tạp của các client Ethereum và tập trung nhiều thời gian hơn vào chức năng độc đáo của ứng dụng.
+
+## Các tính năng của thư viện {#library-features}
+
+### Kết nối với các nút Ethereum {#connect-to-ethereum-nodes}
+
+Với việc sử dụng chúng, những thư viện này cho phép bạn kết nối với Ethereum và đọc dữ liệu của nó, bất kể đó là qua JSON-RPC, INFURA, Etherscan, Alchemy hay MetaMask.
+
+> **Cảnh báo:** Web3.js đã được lưu trữ vào ngày 4 tháng 3 năm 2025. [Đọc thông báo](https://blog.chainsafe.io/web3-js-sunset/). Hãy cân nhắc sử dụng các thư viện thay thế như [ethers.js](https://ethers.org) hoặc [viem](https://viem.sh) cho các dự án mới.
+
+**Ví dụ về Ethers**
+
+```js
+// BrowserProvider bao bọc một nhà cung cấp Web3 tiêu chuẩn, đó là
+// những gì MetaMask đưa vào dưới dạng window.ethereum trong mỗi trang
+const provider = new ethers.BrowserProvider(window.ethereum)
+
+// Plugin MetaMask cũng cho phép ký các giao dịch để
+// gửi ether và thanh toán để thay đổi trạng thái trong blockchain.
+// Đối với việc này, chúng ta cần người ký tài khoản...
+const signer = provider.getSigner()
+```
+
+**Ví dụ về Web3js**
+
+```js
+var web3 = new Web3("http://localhost:8545")
+// hoặc
+var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))
+
+// thay đổi nhà cung cấp
+web3.setProvider("ws://localhost:8546")
+// hoặc
+web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546"))
+
+// Sử dụng nhà cung cấp IPC trong node.js
+var net = require("net")
+var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // đường dẫn mac os
+// hoặc
+var web3 = new Web3(
+ new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net)
+) // đường dẫn mac os
+// trên windows, đường dẫn là: "\\\\.\\pipe\\geth.ipc"
+// trên linux, đường dẫn là: "/users/myuser/.ethereum/geth.ipc"
+```
+
+Khi đã thiết lập xong, bạn sẽ có thể truy vấn blockchain cho:
+
+- Số khối
+- Ước lượng phí gas
+- Sự kiện hợp đồng thông minh
+- ID mạng lưới
+- và nhiều thứ khác
+
+### Chức năng của ví {#wallet-functionality}
+
+Những thư viện này giúp bạn tạo ví, quản lý khóa và ký giao dịch.
+
+Dưới đây là một vài ví dụ về Ethers
+
+```js
+// Tạo một thực thể ví từ một chuỗi gợi nhớ...
+mnemonic =
+ "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol"
+walletMnemonic = Wallet.fromPhrase(mnemonic)
+
+// ...hoặc từ một khóa riêng tư
+walletPrivateKey = new Wallet(walletMnemonic.privateKey)
+
+walletMnemonic.address === walletPrivateKey.address
+// đúng
+
+// Địa chỉ dưới dạng một Promise theo API Signer
+walletMnemonic.getAddress()
+// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }
+
+// Địa chỉ Ví cũng có sẵn một cách đồng bộ
+walletMnemonic.address
+// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'
+
+// Các thành phần mật mã nội bộ
+walletMnemonic.privateKey
+// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'
+walletMnemonic.publicKey
+// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'
+
+// Chuỗi gợi nhớ của ví
+walletMnemonic.mnemonic
+// {
+// locale: 'en',
+// path: 'm/44\'/60\'/0\'/0/0',
+// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol'
+// }
+
+// Lưu ý: Một ví được tạo bằng khóa riêng tư sẽ không
+// có chuỗi gợi nhớ (việc dẫn xuất đã ngăn chặn điều đó)
+walletPrivateKey.mnemonic
+// rỗng
+
+// Ký một tin nhắn
+walletMnemonic.signMessage("Hello World")
+// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }
+
+tx = {
+ to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
+ value: utils.parseEther("1.0"),
+}
+
+// Ký một giao dịch
+walletMnemonic.signTransaction(tx)
+// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }
+
+// Phương thức kết nối trả về một thực thể mới của
+// Ví được kết nối với một nhà cung cấp
+wallet = walletMnemonic.connect(provider)
+
+// Truy vấn mạng
+wallet.getBalance()
+// { Promise: { BigNumber: "42" } }
+wallet.getTransactionCount()
+// { Promise: 0 }
+
+// Gửi ether
+wallet.sendTransaction(tx)
+```
+
+[Đọc tài liệu đầy đủ](https://docs.ethers.io/v5/api/signer/#Wallet)
+
+Khi đã thiết lập xong, bạn sẽ có thể:
+
+- Tạo tài khoản
+- Gửi đi các giao dịch
+- Ký các giao dịch
+- và nhiều thứ khác
+
+### Tương tác với các hàm của hợp đồng thông minh {#interact-with-smart-contract-functions}
+
+Thư viện client JavaScript cho phép ứng dụng của bạn gọi các hàm hợp đồng thông minh bằng cách đọc Ứng dụng Giao diện Nhị phân (ABI) từ một hợp đồng đã được biên dịch.
+
+Về cơ bản ABI giải thích các chức năng của hợp đồng trong định dạng JSON và cho phép bạn sử dụng nó như một đối tượng JavaScript bình thường.
+
+Vì vậy, hợp đồng Solidity dưới đây:
+
+```solidity
+contract Test {
+ uint a;
+ address d = 0x12345678901234567890123456789012;
+
+ constructor(uint testInt) { a = testInt;}
+
+ event Event(uint indexed b, bytes32 c);
+
+ event Event2(uint indexed b, bytes32 c);
+
+ function foo(uint b, bytes32 c) returns(address) {
+ Event(b, c);
+ return d;
+ }
+}
+```
+
+JSON được viết ra như sau:
+
+```json
+[{
+ "type":"constructor",
+ "payable":false,
+ "stateMutability":"nonpayable"
+ "inputs":[{"name":"testInt","type":"uint256"}],
+ },{
+ "type":"function",
+ "name":"foo",
+ "constant":false,
+ "payable":false,
+ "stateMutability":"nonpayable",
+ "inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}],
+ "outputs":[{"name":"","type":"address"}]
+ },{
+ "type":"event",
+ "name":"Event",
+ "inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}],
+ "anonymous":false
+ },{
+ "type":"event",
+ "name":"Event2",
+ "inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}],
+ "anonymous":false
+}]
+```
+
+Có nghĩa là bạn có thể:
+
+- Gửi một giao dịch đến hợp đồng thông minh và thực thi phương thức của nó
+- Lệnh gọi để ước lượng lượng gas mà một phương thức sẽ tiêu tốn khi được thực thi trong EVM
+- Triển khai một hợp đồng
+- Thêm nữa...
+
+### Các hàm tiện ích {#utility-functions}
+
+Các hàm hữu dụng cung cấp cho bạn các phím tắt hữu ích giúp việc xây dựng với Ethereum trở nên dễ dàng hơn một chút.
+
+Giá trị ETH mặc định được biểu diễn bằng đơn vị Wei. 1 ETH = 1.000.000.000.000.000.000 WEI – điều này có nghĩa là bạn đang làm việc với rất nhiều con số! `web3.utils.toWei` chuyển đổi ether sang Wei cho bạn.
+
+Và trong ethers, nó trông như thế này:
+
+```js
+// Lấy số dư của một tài khoản (bằng địa chỉ hoặc tên ENS)
+balance = await provider.getBalance("ethers.eth")
+// { BigNumber: "2337132817842795605" }
+
+// Thông thường bạn sẽ cần định dạng đầu ra cho người dùng
+// những người thích xem các giá trị bằng ether (thay vì wei)
+ethers.utils.formatEther(balance)
+// '2.337132817842795605'
+```
+
+- [Các hàm tiện ích của Web3js](https://docs.web3js.org/api/web3-utils)
+- [Các hàm tiện ích của Ethers](https://docs.ethers.org/v6/api/utils/)
+
+## Các thư viện hiện có {#available-libraries}
+
+**Web3.js -** **_API JavaScript của Ethereum._**
+
+- [Tài liệu tham khảo](https://docs.web3js.org)
+- [GitHub](https://github.com/ethereum/web3.js)
+
+**Ethers.js -** **_Triển khai ví Ethereum hoàn chỉnh và các tiện ích bằng JavaScript và TypeScript._**
+
+- [Trang chủ Ethers.js](https://ethers.org/)
+- [Tài liệu tham khảo](https://docs.ethers.io)
+- [GitHub](https://github.com/ethers-io/ethers.js)
+
+**The Graph -** **_Một giao thức để lập chỉ mục dữ liệu Ethereum và IPFS và truy vấn dữ liệu đó bằng GraphQL._**
+
+- [The Graph](https://thegraph.com)
+- [Graph Explorer](https://thegraph.com/explorer)
+- [Tài liệu tham khảo](https://thegraph.com/docs)
+- [GitHub](https://github.com/graphprotocol)
+- [Discord](https://thegraph.com/discord)
+
+**Alchemy SDK -** **_Trình bao bọc Ethers.js với các API nâng cao._**
+
+- [Tài liệu tham khảo](https://www.alchemy.com/docs)
+- [GitHub](https://github.com/alchemyplatform/alchemy-sdk-js)
+
+**viem -** **_Giao diện TypeScript cho Ethereum._**
+
+- [Tài liệu tham khảo](https://viem.sh)
+- [GitHub](https://github.com/wagmi-dev/viem)
+
+**Drift -** **_Siêu thư viện TypeScript với bộ nhớ đệm, hook và các mock thử nghiệm tích hợp sẵn._**
+
+- [Tài liệu tham khảo](https://ryangoree.github.io/drift/)
+- [GitHub](https://github.com/ryangoree/drift/)
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các nút và client](/developers/docs/nodes-and-clients/)
+- [Các khung phát triển](/developers/docs/frameworks/)
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Thiết lập Web3js để sử dụng chuỗi khối Ethereum trong JavaScript](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Hướng dẫn thiết lập web3.js trong dự án của bạn._
+- [Gọi một hợp đồng thông minh từ JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Sử dụng token DAI, hãy xem cách gọi hàm hợp đồng bằng JavaScript._
+- [Gửi giao dịch bằng web3 và Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– Hướng dẫn từng bước để gửi giao dịch từ backend._
diff --git a/public/content/translations/vi/developers/docs/apis/json-rpc/index.md b/public/content/translations/vi/developers/docs/apis/json-rpc/index.md
new file mode 100644
index 00000000000..0eb321ee940
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/apis/json-rpc/index.md
@@ -0,0 +1,1898 @@
+---
+title: API JSON-RPC
+description: Một giao thức gọi thủ tục từ xa (RPC) không trạng thái, nhẹ dành cho các máy khách Ethereum.
+lang: vi
+---
+
+Để một ứng dụng phần mềm có thể tương tác với chuỗi khối Ethereum - bằng cách đọc dữ liệu chuỗi khối hoặc gửi giao dịch tới mạng - nó phải kết nối với một nút Ethereum.
+
+Vì mục đích này, mọi [máy khách Ethereum](/developers/docs/nodes-and-clients/#execution-clients) đều triển khai một [đặc tả JSON-RPC](https://github.com/ethereum/execution-apis), do đó có một bộ phương thức thống nhất mà các ứng dụng có thể dựa vào bất kể việc triển khai nút hoặc máy khách cụ thể nào.
+
+[JSON-RPC](https://www.jsonrpc.org/specification) là một giao thức gọi thủ tục từ xa (RPC) không trạng thái, nhẹ. Nó xác định một số cấu trúc dữ liệu và các quy tắc xung quanh việc xử lý chúng. Nó không phụ thuộc vào phương tiện truyền tải ở chỗ các khái niệm có thể được sử dụng trong cùng một quy trình, qua các ổ cắm, qua HTTP, hoặc trong nhiều môi trường truyền thông điệp khác nhau. Nó sử dụng JSON (RFC 4627) làm định dạng dữ liệu.
+
+## Triển khai máy khách {#client-implementations}
+
+Mỗi máy khách Ethereum có thể sử dụng các ngôn ngữ lập trình khác nhau khi triển khai đặc tả JSON-RPC. Xem [tài liệu tham khảo của từng máy khách](/developers/docs/nodes-and-clients/#execution-clients) để biết thêm chi tiết liên quan đến các ngôn ngữ lập trình cụ thể. Chúng tôi khuyên bạn nên kiểm tra tài liệu tham khảo của từng máy khách để biết thông tin hỗ trợ Giao diện Lập trình Ứng dụng mới nhất.
+
+## Thư viện tiện lợi {#convenience-libraries}
+
+Mặc dù bạn có thể chọn tương tác trực tiếp với các máy khách Ethereum thông qua Giao diện Lập trình Ứng dụng JSON-RPC, nhưng thường có các tùy chọn dễ dàng hơn cho các nhà phát triển ứng dụng phi tập trung. Nhiều thư viện [JavaScript](/developers/docs/apis/javascript/#available-libraries) và [Giao diện Lập trình Ứng dụng backend](/developers/docs/apis/backend/#available-libraries) tồn tại để cung cấp các trình bao bọc trên Giao diện Lập trình Ứng dụng JSON-RPC. Với các thư viện này, các nhà phát triển có thể viết các phương thức trực quan, một dòng bằng ngôn ngữ lập trình mà họ chọn để khởi tạo các yêu cầu JSON-RPC (ngầm) tương tác với Ethereum.
+
+## Các Giao diện Lập trình Ứng dụng của máy khách đồng thuận {#consensus-clients}
+
+Trang này chủ yếu đề cập đến Giao diện Lập trình Ứng dụng JSON-RPC được sử dụng bởi các máy khách thực thi Ethereum. Tuy nhiên, các máy khách đồng thuận cũng có một Giao diện Lập trình Ứng dụng RPC cho phép người dùng truy vấn thông tin về nút, yêu cầu các khối Beacon, trạng thái Beacon và các thông tin khác liên quan đến sự đồng thuận trực tiếp từ một nút. Giao diện Lập trình Ứng dụng này được ghi lại trên [trang web Giao diện Lập trình Ứng dụng Beacon](https://ethereum.github.io/beacon-APIs/#/).
+
+Một Giao diện Lập trình Ứng dụng nội bộ cũng được sử dụng để liên lạc giữa các máy khách trong một nút - nghĩa là nó cho phép máy khách đồng thuận và máy khách thực thi hoán đổi dữ liệu. Đây được gọi là 'Engine API' và các thông số kỹ thuật có sẵn trên [GitHub](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md).
+
+## Đặc tả máy khách thực thi {#spec}
+
+[Đọc toàn bộ đặc tả Giao diện Lập trình Ứng dụng JSON-RPC trên GitHub](https://github.com/ethereum/execution-apis). Giao diện Lập trình Ứng dụng này được ghi lại trên [trang web Giao diện Lập trình Ứng dụng Thực thi](https://ethereum.github.io/execution-apis/) và bao gồm một Trình kiểm tra để dùng thử tất cả các phương thức có sẵn.
+
+## Quy ước {#conventions}
+
+### Mã hóa giá trị hex {#hex-encoding}
+
+Hai loại dữ liệu chính được chuyển qua JSON: mảng byte chưa định dạng và số lượng. Cả hai đều được chuyển bằng mã hóa hex nhưng với các yêu cầu định dạng khác nhau.
+
+#### Số lượng {#quantities-encoding}
+
+Khi mã hóa số lượng (số nguyên, số): mã hóa dưới dạng hex, có tiền tố "0x", dạng biểu diễn nhỏ gọn nhất (ngoại lệ nhỏ: số không phải được biểu diễn dưới dạng "0x0").
+
+Đây là một vài ví dụ:
+
+- 0x41 (65 trong hệ thập phân)
+- 0x400 (1024 trong hệ thập phân)
+- SAI: 0x (phải luôn có ít nhất một chữ số - số không là "0x0")
+- SAI: 0x0400 (không cho phép số không ở đầu)
+- SAI: ff (phải có tiền tố 0x)
+
+### Dữ liệu chưa được định dạng {#unformatted-data-encoding}
+
+Khi mã hóa dữ liệu chưa định dạng (mảng byte, địa chỉ tài khoản, hàm băm, mảng bytecode): mã hóa dưới dạng hex, có tiền tố "0x", hai chữ số hex trên mỗi byte.
+
+Đây là một vài ví dụ:
+
+- 0x41 (kích thước 1, "A")
+- 0x004200 (kích thước 3, "0B0")
+- 0x (kích thước 0, "")
+- SAI: 0xf0f0f (phải là số chẵn các chữ số)
+- SAI: 004200 (phải có tiền tố 0x)
+
+### Thông số khối {#block-parameter}
+
+Các phương thức sau có thông số khối:
+
+- [eth_getBalance](#eth_getbalance)
+- [eth_getCode](#eth_getcode)
+- [eth_getTransactionCount](#eth_gettransactioncount)
+- [eth_getStorageAt](#eth_getstorageat)
+- [eth_call](#eth_call)
+
+Khi các yêu cầu được thực hiện để truy vấn trạng thái của Ethereum, thông số khối được cung cấp sẽ xác định chiều cao của khối.
+
+Các tùy chọn sau đây có thể có cho thông số khối:
+
+- `Chuỗi HEX` - một số khối nguyên
+- `Chuỗi "earliest"` cho khối sớm nhất/khối khởi nguyên
+- `Chuỗi "latest"` - cho khối được đề xuất mới nhất
+- `Chuỗi "safe"` - cho khối tiêu đề an toàn mới nhất
+- `Chuỗi "finalized"` - cho khối đã hoàn tất mới nhất
+- `Chuỗi "pending"` - cho trạng thái/giao dịch đang chờ xử lý
+
+## Ví dụ
+
+Trên trang này, chúng tôi cung cấp các ví dụ về cách sử dụng các điểm cuối API JSON_RPC riêng lẻ bằng công cụ dòng lệnh, [curl](https://curl.se). Các ví dụ điểm cuối riêng lẻ này được tìm thấy bên dưới trong phần [Ví dụ về Curl](#curl-examples). Ở phần sau của trang, chúng tôi cũng cung cấp một [ví dụ từ đầu đến cuối](#usage-example) để biên dịch và triển khai một hợp đồng thông minh bằng cách sử dụng một nút Geth, Giao diện Lập trình Ứng dụng JSON_RPC và curl.
+
+## Ví dụ về Curl {#curl-examples}
+
+Các ví dụ về việc sử dụng Giao diện Lập trình Ứng dụng JSON_RPC bằng cách thực hiện các yêu cầu [curl](https://curl.se) tới một nút Ethereum được cung cấp bên dưới. Mỗi ví dụ
+bao gồm mô tả về điểm cuối cụ thể, các tham số, loại trả về của nó và một ví dụ đã thực hiện về cách sử dụng nó.
+
+Các yêu cầu curl có thể trả về một thông điệp lỗi liên quan đến loại nội dung. Điều này là do tùy chọn `--data` đặt loại nội dung thành `application/x-www-form-urlencoded`. Nếu nút của bạn phàn nàn về điều này, hãy đặt tiêu đề theo cách thủ công bằng cách đặt `-H "Content-Type: application/json"` ở đầu cuộc gọi. Các ví dụ cũng không bao gồm tổ hợp URL/IP & cổng phải là đối số cuối cùng được cung cấp cho curl (ví dụ: `127.0.0.1:8545`). Một yêu cầu curl hoàn chỉnh bao gồm các dữ liệu bổ sung này có dạng sau:
+
+```shell
+curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545
+```
+
+## Gossip, Trạng thái, Lịch sử {#gossip-state-history}
+
+Một số phương pháp JSON-RPC cốt lõi yêu cầu dữ liệu từ mạng Ethereum và được phân loại gọn gàng thành ba loại chính: _Gossip, Trạng thái và Lịch sử_. Sử dụng các liên kết trong các phần này để chuyển đến từng phương thức hoặc sử dụng bảng mục lục để khám phá toàn bộ danh sách các phương thức.
+
+### Phương pháp Gossip {#gossip-methods}
+
+> Các phương pháp này theo dõi phần đầu của chuỗi. Đây là cách các giao dịch đi vòng quanh mạng, tìm đường vào các khối và cách các máy khách tìm hiểu về các khối mới.
+
+- [eth_blockNumber](#eth_blocknumber)
+- [eth_sendRawTransaction](#eth_sendrawtransaction)
+
+### Phương pháp Trạng thái {#state_methods}
+
+> Các phương pháp báo cáo trạng thái hiện tại của tất cả dữ liệu được lưu trữ. "Trạng thái" giống như một phần RAM lớn được chia sẻ và bao gồm số dư tài khoản, dữ liệu hợp đồng và ước tính gas.
+
+- [eth_getBalance](#eth_getbalance)
+- [eth_getStorageAt](#eth_getstorageat)
+- [eth_getTransactionCount](#eth_gettransactioncount)
+- [eth_getCode](#eth_getcode)
+- [eth_call](#eth_call)
+- [eth_estimateGas](#eth_estimategas)
+
+### Các phương pháp lịch sử {#history_methods}
+
+> Truy xuất các bản ghi lịch sử của mọi khối trở lại khối khởi nguyên. Đây giống như một tệp chỉ có thể nối thêm lớn và bao gồm tất cả các tiêu đề khối, nội dung khối, khối chú và biên lai giao dịch.
+
+- [eth_getBlockTransactionCountByHash](#eth_getblocktransactioncountbyhash)
+- [eth_getBlockTransactionCountByNumber](#eth_getblocktransactioncountbynumber)
+- [eth_getUncleCountByBlockHash](#eth_getunclecountbyblockhash)
+- [eth_getUncleCountByBlockNumber](#eth_getunclecountbyblocknumber)
+- [eth_getBlockByHash](#eth_getblockbyhash)
+- [eth_getBlockByNumber](#eth_getblockbynumber)
+- [eth_getTransactionByHash](#eth_gettransactionbyhash)
+- [eth_getTransactionByBlockHashAndIndex](#eth_gettransactionbyblockhashandindex)
+- [eth_getTransactionByBlockNumberAndIndex](#eth_gettransactionbyblocknumberandindex)
+- [eth_getTransactionReceipt](#eth_gettransactionreceipt)
+- [eth_getUncleByBlockHashAndIndex](#eth_getunclebyblockhashandindex)
+- [eth_getUncleByBlockNumberAndIndex](#eth_getunclebyblocknumberandindex)
+
+## Sân chơi API JSON-RPC
+
+Bạn có thể sử dụng [công cụ sân chơi](https://ethereum-json-rpc.com) để khám phá và dùng thử các phương thức Giao diện Lập trình Ứng dụng. Nó cũng cho bạn thấy những phương pháp và mạng nào được hỗ trợ bởi các nhà cung cấp nút khác nhau.
+
+## Các phương thức Giao diện Lập trình Ứng dụng JSON-RPC {#json-rpc-methods}
+
+### web3_clientVersion {#web3_clientversion}
+
+Trả về phiên bản máy khách hiện tại.
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`Chuỗi` - Phiên bản máy khách hiện tại
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}'
+// Kết quả
+{
+ "id":67,
+ "jsonrpc":"2.0",
+ "result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1"
+}
+```
+
+### web3_sha3 {#web3_sha3}
+
+Trả về Keccak-256 (_không phải_ SHA3-256 được tiêu chuẩn hóa) của dữ liệu đã cho.
+
+**Tham số**
+
+1. `DATA` - Dữ liệu để chuyển đổi thành một hàm băm SHA3
+
+```js
+params: ["0x68656c6c6f20776f726c64"]
+```
+
+**Trả về**
+
+`DATA` - Kết quả SHA3 của chuỗi đã cho.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}'
+// Kết quả
+{
+ "id":64,
+ "jsonrpc": "2.0",
+ "result": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"
+}
+```
+
+### net_version {#net_version}
+
+Trả về id mạng hiện tại.
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`Chuỗi` - Id mạng hiện tại.
+
+Danh sách đầy đủ các ID mạng hiện tại có tại [chainlist.org](https://chainlist.org). Một số cái phổ biến là:
+
+- `1`: Ethereum Mainnet
+- `11155111`: Mạng thử nghiệm Sepolia
+- `560048`: Mạng thử nghiệm Hoodi
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}'
+// Kết quả
+{
+ "id":67,
+ "jsonrpc": "2.0",
+ "result": "3"
+}
+```
+
+### net_listening {#net_listening}
+
+Trả về `true` nếu máy khách đang tích cực lắng nghe các kết nối mạng.
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`Boolean` - `true` khi đang lắng nghe, nếu không thì là `false`.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}'
+// Kết quả
+{
+ "id":67,
+ "jsonrpc":"2.0",
+ "result":true
+}
+```
+
+### net_peerCount {#net_peercount}
+
+Trả về số lượng peer hiện đang được kết nối với máy khách.
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`QUANTITY` - số nguyên của số peer đã kết nối.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}'
+// Kết quả
+{
+ "id":74,
+ "jsonrpc": "2.0",
+ "result": "0x2" // 2
+}
+```
+
+### eth_protocolVersion {#eth_protocolversion}
+
+Trả về phiên bản giao thức Ethereum hiện tại. Lưu ý rằng phương pháp này [không có sẵn trong Geth](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924).
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`Chuỗi` - Phiên bản giao thức Ethereum hiện tại
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}'
+// Kết quả
+{
+ "id":67,
+ "jsonrpc": "2.0",
+ "result": "54"
+}
+```
+
+### eth_syncing {#eth_syncing}
+
+Trả về một đối tượng có dữ liệu về trạng thái đồng bộ hóa hoặc `false`.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+Dữ liệu trả về chính xác khác nhau giữa các lần triển khai máy khách. Tất cả các máy khách đều trả về `False` khi nút không đồng bộ hóa và tất cả các máy khách đều trả về các trường sau.
+
+`Object|Boolean`, Một đối tượng có dữ liệu trạng thái đồng bộ hóa hoặc `FALSE`, khi không đồng bộ hóa:
+
+- `startingBlock`: `QUANTITY` - Khối mà tại đó quá trình nhập bắt đầu (sẽ chỉ được đặt lại sau khi quá trình đồng bộ hóa đạt đến phần đầu của nó)
+- `currentBlock`: `QUANTITY` - Khối hiện tại, giống như eth_blockNumber
+- `highestBlock`: `QUANTITY` - Khối cao nhất ước tính
+
+Tuy nhiên, các máy khách riêng lẻ cũng có thể cung cấp dữ liệu bổ sung. Ví dụ: Geth trả về như sau:
+
+```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"
+ }
+}
+```
+
+Trong khi đó Besu trả về:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "id": 51,
+ "result": {
+ "startingBlock": "0x0",
+ "currentBlock": "0x1518",
+ "highestBlock": "0x9567a3",
+ "pulledStates": "0x203ca",
+ "knownStates": "0x200636"
+ }
+}
+```
+
+Tham khảo tài liệu tham khảo cho máy khách cụ thể của bạn để biết thêm chi tiết.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": {
+ startingBlock: '0x384',
+ currentBlock: '0x386',
+ highestBlock: '0x454'
+ }
+}
+// Hoặc khi không đồng bộ hóa
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": false
+}
+```
+
+### eth_coinbase {#eth_coinbase}
+
+Trả về địa chỉ coinbase của máy khách.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+> **Lưu ý:** Phương pháp này đã không được dùng nữa kể từ **v1.14.0** và không còn được hỗ trợ. Cố gắng sử dụng phương pháp này sẽ dẫn đến lỗi "Phương pháp không được hỗ trợ".
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`DATA`, 20 byte - địa chỉ coinbase hiện tại.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}'
+// Kết quả
+{
+ "id":64,
+ "jsonrpc": "2.0",
+ "result": "0x407d73d8a49eeb85d32cf465507dd71d507100c1"
+}
+```
+
+### eth_chainId {#eth_chainId}
+
+Trả về ID chuỗi được sử dụng để ký các giao dịch được bảo vệ chống phát lại.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`chainId`, giá trị thập lục phân dưới dạng một chuỗi đại diện cho số nguyên của id chuỗi hiện tại.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}'
+// Kết quả
+{
+ "id":67,
+ "jsonrpc": "2.0",
+ "result": "0x1"
+}
+```
+
+### eth_mining {#eth_mining}
+
+Trả về `true` nếu máy khách đang tích cực khai thác các khối mới. Điều này chỉ có thể trả về `true` cho các mạng bằng chứng công việc và có thể không có sẵn trong một số máy khách kể từ khi có [The Merge](/roadmap/merge/).
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`Boolean` - trả về `true` nếu máy khách đang khai thác, ngược lại là `false`.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}'
+//
+{
+ "id":71,
+ "jsonrpc": "2.0",
+ "result": true
+}
+```
+
+### eth_hashrate {#eth_hashrate}
+
+Trả về số lượng hàm băm mỗi giây mà nút đang khai thác. Điều này chỉ có thể trả về `true` cho các mạng bằng chứng công việc và có thể không có sẵn trong một số máy khách kể từ khi có [The Merge](/roadmap/merge/).
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`QUANTITY` - số lượng hàm băm mỗi giây.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}'
+// Kết quả
+{
+ "id":71,
+ "jsonrpc": "2.0",
+ "result": "0x38a"
+}
+```
+
+### eth_gasPrice {#eth_gasprice}
+
+Trả về ước tính giá hiện tại cho mỗi gas tính bằng wei. Ví dụ, máy khách Besu kiểm tra 100 khối cuối cùng và trả về giá đơn vị gas trung bình theo mặc định.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`QUANTITY` - số nguyên của giá gas hiện tại tính bằng wei.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}'
+// Kết quả
+{
+ "id":73,
+ "jsonrpc": "2.0",
+ "result": "0x1dfd14000" // 8049999872 Wei
+}
+```
+
+### eth_accounts {#eth_accounts}
+
+Trả về một danh sách các địa chỉ thuộc sở hữu của máy khách.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`Mảng DATA`, 20 Byte - các địa chỉ thuộc sở hữu của máy khách.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"]
+}
+```
+
+### eth_blockNumber {#eth_blocknumber}
+
+Trả về số của khối gần đây nhất.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+Không
+
+**Trả về**
+
+`QUANTITY` - số nguyên của số khối hiện tại mà máy khách đang ở.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}'
+// Kết quả
+{
+ "id":83,
+ "jsonrpc": "2.0",
+ "result": "0x4b7" // 1207
+}
+```
+
+### eth_getBalance {#eth_getbalance}
+
+Trả về số dư của tài khoản tại một địa chỉ nhất định.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 20 Byte - địa chỉ để kiểm tra số dư.
+2. `QUANTITY|TAG` - số khối nguyên, hoặc chuỗi `"latest"`, `"earliest"`, `"pending"`, `"safe"`, hoặc `"finalized"`, xem [thông số khối](/developers/docs/apis/json-rpc/#block-parameter)
+
+```js
+params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]
+```
+
+**Trả về**
+
+`QUANTITY` - số nguyên của số dư hiện tại tính bằng wei.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x0234c8a3397aab58" // 158972490234375000
+}
+```
+
+### eth_getStorageAt {#eth_getstorageat}
+
+Trả về giá trị từ một vị trí lưu trữ tại một địa chỉ đã cho.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 20 Byte - địa chỉ của kho lưu trữ.
+2. `QUANTITY` - số nguyên của vị trí trong kho lưu trữ.
+3. `QUANTITY|TAG` - số khối nguyên, hoặc chuỗi `"latest"`, `"earliest"`, `"pending"`, `"safe"`, `"finalized"`, xem [thông số khối](/developers/docs/apis/json-rpc/#block-parameter)
+
+**Trả về**
+
+`DATA` - giá trị tại vị trí lưu trữ này.
+
+**Ví dụ**
+Việc tính toán vị trí chính xác phụ thuộc vào kho lưu trữ cần truy xuất. Hãy xem xét hợp đồng sau đây được triển khai tại `0x295a70b2de5e3953354a6a8344e616ed314d7251` bởi địa chỉ `0x391694e7e0b0cce554cb130d723a9d27458f9298`.
+
+```
+contract Storage {
+ uint pos0;
+ mapping(address => uint) pos1;
+ constructor() {
+ pos0 = 1234;
+ pos1[msg.sender] = 5678;
+ }
+}
+```
+
+Việc truy xuất giá trị của pos0 rất đơn giản:
+
+```js
+curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545
+{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"}
+```
+
+Việc truy xuất một phần tử của bản đồ khó hơn. Vị trí của một phần tử trong bản đồ được tính bằng:
+
+```js
+keccak(LeftPad32(key, 0), LeftPad32(map position, 0))
+```
+
+Điều này có nghĩa là để truy xuất kho lưu trữ trên pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"], chúng ta cần tính toán vị trí với:
+
+```js
+keccak(
+ decodeHex(
+ "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" +
+ "0000000000000000000000000000000000000000000000000000000000000001"
+ )
+)
+```
+
+Bảng điều khiển geth đi kèm với thư viện web3 có thể được sử dụng để thực hiện tính toán:
+
+```js
+> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
+undefined
+> web3.sha3(key, {"encoding": "hex"})
+"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"
+```
+
+Bây giờ để tìm nạp kho lưu trữ:
+
+```js
+curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545
+{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"}
+```
+
+### eth_getTransactionCount {#eth_gettransactioncount}
+
+Trả về số lượng giao dịch _đã gửi_ từ một địa chỉ.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 20 Byte - địa chỉ.
+2. `QUANTITY|TAG` - số khối nguyên, hoặc chuỗi `"latest"`, `"earliest"`, `"pending"`, `"safe"` hoặc `"finalized"`, xem [thông số khối](/developers/docs/apis/json-rpc/#block-parameter)
+
+```js
+params: [
+ "0x407d73d8a49eeb85d32cf465507dd71d507100c1",
+ "latest", // trạng thái ở khối mới nhất
+]
+```
+
+**Trả về**
+
+`QUANTITY` - số nguyên của số lượng giao dịch được gửi từ địa chỉ này.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x1" // 1
+}
+```
+
+### eth_getBlockTransactionCountByHash {#eth_getblocktransactioncountbyhash}
+
+Trả về số lượng giao dịch trong một khối từ một khối khớp với hàm băm khối đã cho.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 32 Byte - hàm băm của một khối
+
+```js
+params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"]
+```
+
+**Trả về**
+
+`QUANTITY` - số nguyên của số lượng giao dịch trong khối này.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x8b" // 139
+}
+```
+
+### eth_getBlockTransactionCountByNumber {#eth_getblocktransactioncountbynumber}
+
+Trả về số lượng giao dịch trong một khối khớp với số khối đã cho.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `QUANTITY|TAG` - số nguyên của một số khối, hoặc chuỗi `"earliest"`, `"latest"`, `"pending"`, `"safe"` hoặc `"finalized"`, như trong [thông số khối](/developers/docs/apis/json-rpc/#block-parameter).
+
+```js
+params: [
+ "0x13738ca", // 20396234
+]
+```
+
+**Trả về**
+
+`QUANTITY` - số nguyên của số lượng giao dịch trong khối này.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0x13738ca"],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x8b" // 139
+}
+```
+
+### eth_getUncleCountByBlockHash {#eth_getunclecountbyblockhash}
+
+Trả về số lượng khối chú trong một khối từ một khối khớp với hàm băm khối đã cho.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 32 Byte - hàm băm của một khối
+
+```js
+params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"]
+```
+
+**Trả về**
+
+`QUANTITY` - số nguyên của số lượng khối chú trong khối này.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x1" // 1
+}
+```
+
+### eth_getUncleCountByBlockNumber {#eth_getunclecountbyblocknumber}
+
+Trả về số lượng khối chú trong một khối từ một khối khớp với số khối đã cho.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `QUANTITY|TAG` - số nguyên của một số khối, hoặc chuỗi `"latest"`, `"earliest"`, `"pending"`, `"safe"` hoặc `"finalized"`, xem [thông số khối](/developers/docs/apis/json-rpc/#block-parameter)
+
+```js
+params: [
+ "0xe8", // 232
+]
+```
+
+**Trả về**
+
+`QUANTITY` - số nguyên của số lượng khối chú trong khối này.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x0" // 0
+}
+```
+
+### eth_getCode {#eth_getcode}
+
+Trả về mã tại một địa chỉ đã cho.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 20 Byte - địa chỉ
+2. `QUANTITY|TAG` - số khối nguyên, hoặc chuỗi `"latest"`, `"earliest"`, `"pending"`, `"safe"` hoặc `"finalized"`, xem [thông số khối](/developers/docs/apis/json-rpc/#block-parameter)
+
+```js
+params: [
+ "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
+ "0x5daf3b", // 6139707
+]
+```
+
+**Trả về**
+
+`DATA` - mã từ địa chỉ đã cho.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0x5daf3b"],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"
+}
+```
+
+### eth_sign {#eth_sign}
+
+Phương pháp ký tính toán một chữ ký cụ thể của Ethereum với: `sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`.
+
+Bằng cách thêm một tiền tố vào thông điệp, chữ ký được tính toán có thể được nhận dạng là một chữ ký cụ thể của Ethereum. Điều này ngăn chặn việc lạm dụng khi một ứng dụng phi tập trung độc hại có thể ký dữ liệu tùy ý (ví dụ: giao dịch) và sử dụng chữ ký để mạo danh nạn nhân.
+
+Lưu ý: địa chỉ để ký phải được mở khóa.
+
+**Tham số**
+
+1. `DATA`, 20 Byte - địa chỉ
+2. `DATA`, N Byte - thông điệp cần ký
+
+**Trả về**
+
+`DATA`: Chữ ký
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
+}
+```
+
+### eth_signTransaction {#eth_signtransaction}
+
+Ký một giao dịch có thể được gửi đến mạng sau này bằng [eth_sendRawTransaction](#eth_sendrawtransaction).
+
+**Tham số**
+
+1. `Object` - Đối tượng giao dịch
+
+- `type`:
+- `from`: `DATA`, 20 Byte - Địa chỉ mà giao dịch được gửi từ đó.
+- `to`: `DATA`, 20 Byte - (tùy chọn khi tạo hợp đồng mới) Địa chỉ mà giao dịch được chuyển đến.
+- `gas`: `QUANTITY` - (tùy chọn, mặc định: 90000) Số nguyên của gas được cung cấp cho việc thực hiện giao dịch. Nó sẽ trả lại lượng gas không sử dụng.
+- `gasPrice`: `QUANTITY` - (tùy chọn, mặc định: Sẽ được xác định) Số nguyên của gasPrice được sử dụng cho mỗi gas đã thanh toán, tính bằng Wei.
+- `value`: `QUANTITY` - (tùy chọn) Số nguyên của giá trị được gửi cùng với giao dịch này, tính bằng Wei.
+- `data`: `DATA` - Mã đã biên dịch của hợp đồng HOẶC hàm băm của chữ ký phương thức được gọi và các tham số được mã hóa.
+- `nonce`: `QUANTITY` - (tùy chọn) Số nguyên của một nonce. Điều này cho phép ghi đè các giao dịch đang chờ xử lý của chính bạn sử dụng cùng một nonce.
+
+**Trả về**
+
+`DATA`, Đối tượng giao dịch được mã hóa RLP do tài khoản đã chỉ định ký.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction","params": [{"data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675","from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155","gas": "0x76c0","gasPrice": "0x9184e72a000","to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567","value": "0x9184e72a"}]}'
+// Kết quả
+{
+ "id": 1,
+ "jsonrpc": "2.0",
+ "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
+}
+```
+
+### eth_sendTransaction {#eth_sendtransaction}
+
+Tạo giao dịch gọi hàm nhắn tin mới hoặc tạo hợp đồng, nếu trường dữ liệu chứa mã và ký bằng tài khoản được chỉ định trong `from`.
+
+**Tham số**
+
+1. `Object` - Đối tượng giao dịch
+
+- `from`: `DATA`, 20 Byte - Địa chỉ mà giao dịch được gửi từ đó.
+- `to`: `DATA`, 20 Byte - (tùy chọn khi tạo hợp đồng mới) Địa chỉ mà giao dịch được chuyển đến.
+- `gas`: `QUANTITY` - (tùy chọn, mặc định: 90000) Số nguyên của gas được cung cấp cho việc thực hiện giao dịch. Nó sẽ trả lại lượng gas không sử dụng.
+- `gasPrice`: `QUANTITY` - (tùy chọn, mặc định: Sẽ được xác định) Số nguyên của gasPrice được sử dụng cho mỗi gas đã thanh toán.
+- `value`: `QUANTITY` - (tùy chọn) Số nguyên của giá trị được gửi cùng với giao dịch này.
+- `input`: `DATA` - Mã đã biên dịch của hợp đồng HOẶC hàm băm của chữ ký phương thức được gọi và các tham số được mã hóa.
+- `nonce`: `QUANTITY` - (tùy chọn) Số nguyên của một nonce. Điều này cho phép ghi đè các giao dịch đang chờ xử lý của chính bạn sử dụng cùng một nonce.
+
+```js
+params: [
+ {
+ from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
+ to: "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
+ gas: "0x76c0", // 30400
+ gasPrice: "0x9184e72a000", // 10000000000000
+ value: "0x9184e72a", // 2441406250
+ input:
+ "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
+ },
+]
+```
+
+**Trả về**
+
+`DATA`, 32 Byte - hàm băm giao dịch hoặc hàm băm không nếu giao dịch chưa có sẵn.
+
+Sử dụng [eth_getTransactionReceipt](#eth_gettransactionreceipt) để lấy địa chỉ hợp đồng, sau khi giao dịch được đề xuất trong một khối, khi bạn tạo một hợp đồng.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
+}
+```
+
+### eth_sendRawTransaction {#eth_sendrawtransaction}
+
+Tạo giao dịch gọi hàm nhắn tin mới hoặc tạo hợp đồng cho các giao dịch đã ký.
+
+**Tham số**
+
+1. `DATA`, Dữ liệu giao dịch đã ký.
+
+```js
+params: [
+ "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
+]
+```
+
+**Trả về**
+
+`DATA`, 32 Byte - hàm băm giao dịch hoặc hàm băm không nếu giao dịch chưa có sẵn.
+
+Sử dụng [eth_getTransactionReceipt](#eth_gettransactionreceipt) để lấy địa chỉ hợp đồng, sau khi giao dịch được đề xuất trong một khối, khi bạn tạo một hợp đồng.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
+}
+```
+
+### eth_call {#eth_call}
+
+Thực hiện một gọi hàm nhắn tin mới ngay lập tức mà không cần tạo một giao dịch trên chuỗi khối. Thường được sử dụng để thực thi các hàm hợp đồng thông minh chỉ đọc, ví dụ như `balanceOf` cho hợp đồng ERC-20.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `Object` - Đối tượng gọi giao dịch
+
+- `from`: `DATA`, 20 Byte - (tùy chọn) Địa chỉ mà giao dịch được gửi từ đó.
+- `to`: `DATA`, 20 Byte - Địa chỉ mà giao dịch được chuyển đến.
+- `gas`: `QUANTITY` - (tùy chọn) Số nguyên của gas được cung cấp cho việc thực hiện giao dịch. eth_call tiêu thụ không gas, nhưng tham số này có thể cần thiết cho một số lần thực hiện.
+- `gasPrice`: `QUANTITY` - (tùy chọn) Số nguyên của gasPrice được sử dụng cho mỗi gas đã thanh toán
+- `value`: `QUANTITY` - (tùy chọn) Số nguyên của giá trị được gửi cùng với giao dịch này
+- `input`: `DATA` - (tùy chọn) Hàm băm của chữ ký phương thức và các tham số được mã hóa. Để biết chi tiết, xem [Giao diện nhị phân ứng dụng Hợp đồng Ethereum trong tài liệu tham khảo Solidity](https://docs.soliditylang.org/en/latest/abi-spec.html).
+
+2. `QUANTITY|TAG` - số khối nguyên, hoặc chuỗi `"latest"`, `"earliest"`, `"pending"`, `"safe"` hoặc `"finalized"`, xem [thông số khối](/developers/docs/apis/json-rpc/#block-parameter)
+
+**Trả về**
+
+`DATA` - giá trị trả về của hợp đồng đã thực hiện.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x"
+}
+```
+
+### eth_estimateGas {#eth_estimategas}
+
+Tạo và trả về một ước tính về lượng gas cần thiết để cho phép giao dịch hoàn tất. Giao dịch sẽ không được thêm vào chuỗi khối. Lưu ý rằng ước tính có thể lớn hơn đáng kể so với lượng gas thực sự được sử dụng bởi giao dịch, vì nhiều lý do bao gồm cơ chế Máy chủ ảo Ethereum và hiệu suất nút.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+Xem tham số [eth_call](#eth_call), ngoại trừ tất cả các thuộc tính đều là tùy chọn. Nếu không có giới hạn gas nào được chỉ định, geth sử dụng giới hạn gas khối từ khối đang chờ xử lý làm giới hạn trên. Do đó, ước tính được trả về có thể không đủ để thực hiện lệnh gọi/giao dịch khi lượng gas cao hơn giới hạn gas của khối đang chờ xử lý.
+
+**Trả về**
+
+`QUANTITY` - lượng gas đã sử dụng.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x5208" // 21000
+}
+```
+
+### eth_getBlockByHash {#eth_getblockbyhash}
+
+Trả về thông tin về một khối bằng hàm băm.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 32 Byte - Hàm băm của một khối.
+2. `Boolean` - Nếu `true`, nó sẽ trả về các đối tượng giao dịch đầy đủ, nếu `false` chỉ trả về hàm băm của các giao dịch.
+
+```js
+params: [
+ "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",
+ false,
+]
+```
+
+**Trả về**
+
+`Object` - Một đối tượng khối, hoặc `null` khi không tìm thấy khối nào:
+
+- `number`: `QUANTITY` - số khối. `null` khi đó là khối đang chờ xử lý.
+- `hash`: `DATA`, 32 Byte - hàm băm của khối. `null` khi đó là khối đang chờ xử lý.
+- `parentHash`: `DATA`, 32 Byte - hàm băm của khối cha.
+- `nonce`: `DATA`, 8 Byte - hàm băm của bằng chứng công việc được tạo ra. `null` khi đó là khối đang chờ xử lý, `0x0` cho các khối bằng chứng cổ phần (kể từ The Merge)
+- `sha3Uncles`: `DATA`, 32 Byte - SHA3 của dữ liệu khối chú trong khối.
+- `logsBloom`: `DATA`, 256 Byte - bộ lọc bloom cho nhật ký của khối. `null` khi đó là khối đang chờ xử lý.
+- `transactionsRoot`: `DATA`, 32 Byte - gốc của cây trie giao dịch của khối.
+- `stateRoot`: `DATA`, 32 Byte - gốc của cây trie trạng thái cuối cùng của khối.
+- `receiptsRoot`: `DATA`, 32 Byte - gốc của cây trie biên lai của khối.
+- `miner`: `DATA`, 20 Byte - địa chỉ của người hưởng lợi mà phần thưởng khối được trao.
+- `difficulty`: `QUANTITY` - số nguyên của độ khó cho khối này.
+- `totalDifficulty`: `QUANTITY` - số nguyên của tổng độ khó của chuỗi cho đến khối này.
+- `extraData`: `DATA` - trường "dữ liệu bổ sung" của khối này.
+- `size`: `QUANTITY` - số nguyên kích thước của khối này tính bằng byte.
+- `gasLimit`: `QUANTITY` - lượng gas tối đa được phép trong khối này.
+- `gasUsed`: `QUANTITY` - tổng lượng gas được sử dụng bởi tất cả các giao dịch trong khối này.
+- `timestamp`: `QUANTITY` - dấu thời gian unix khi khối được đối chiếu.
+- `transactions`: `Array` - Mảng các đối tượng giao dịch, hoặc hàm băm giao dịch 32 Byte tùy thuộc vào tham số cuối cùng được đưa ra.
+- `uncles`: `Array` - Mảng các hàm băm của khối chú.
+
+**Ví dụ**
+
+```js
+// Request
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}'
+// Result
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": {
+ "difficulty": "0x4ea3f27bc",
+ "extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32",
+ "gasLimit": "0x1388",
+ "gasUsed": "0x0",
+ "hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171",
+ "mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843",
+ "nonce": "0x689056015818adbe",
+ "number": "0x1b4",
+ "parentHash": "0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
+ "size": "0x220",
+ "stateRoot": "0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d",
+ "timestamp": "0x55ba467c",
+ "totalDifficulty": "0x78ed983323d",
+ "transactions": [
+ ],
+ "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "uncles": [
+ ]
+ }
+}
+```
+
+### eth_getBlockByNumber {#eth_getblockbynumber}
+
+Trả về thông tin về một khối theo số khối.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `QUANTITY|TAG` - số nguyên của một số khối, hoặc chuỗi `"earliest"`, `"latest"`, `"pending"`, `"safe"` hoặc `"finalized"`, như trong [thông số khối](/developers/docs/apis/json-rpc/#block-parameter).
+2. `Boolean` - Nếu `true`, nó sẽ trả về các đối tượng giao dịch đầy đủ, nếu `false` chỉ trả về hàm băm của các giao dịch.
+
+```js
+params: [
+ "0x1b4", // 436
+ true,
+]
+```
+
+**Trả về**
+Xem [eth_getBlockByHash](#eth_getblockbyhash)
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'
+```
+
+Kết quả xem [eth_getBlockByHash](#eth_getblockbyhash)
+
+### eth_getTransactionByHash {#eth_gettransactionbyhash}
+
+Trả về thông tin về một giao dịch được yêu cầu bằng hàm băm giao dịch.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 32 Byte - hàm băm của một giao dịch
+
+```js
+params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"]
+```
+
+**Trả về**
+
+`Object` - Một đối tượng giao dịch, hoặc `null` khi không tìm thấy giao dịch nào:
+
+- `blockHash`: `DATA`, 32 Byte - hàm băm của khối nơi giao dịch này diễn ra. `null` khi đang chờ xử lý.
+- `blockNumber`: `QUANTITY` - số khối nơi giao dịch này diễn ra. `null` khi đang chờ xử lý.
+- `from`: `DATA`, 20 Byte - địa chỉ của người gửi.
+- `gas`: `QUANTITY` - gas do người gửi cung cấp.
+- `gasPrice`: `QUANTITY` - giá gas do người gửi cung cấp tính bằng Wei.
+- `hash`: `DATA`, 32 Byte - hàm băm của giao dịch.
+- `input`: `DATA` - dữ liệu được gửi cùng với giao dịch.
+- `nonce`: `QUANTITY` - số lượng giao dịch được thực hiện bởi người gửi trước giao dịch này.
+- `to`: `DATA`, 20 Byte - địa chỉ của người nhận. `null` khi đó là một giao dịch tạo hợp đồng.
+- `transactionIndex`: `QUANTITY` - số nguyên của vị trí chỉ mục giao dịch trong khối. `null` khi đang chờ xử lý.
+- `value`: `QUANTITY` - giá trị được chuyển bằng Wei.
+- `v`: `QUANTITY` - id phục hồi ECDSA
+- `r`: `QUANTITY` - chữ ký ECDSA r
+- `s`: `QUANTITY` - chữ ký ECDSA s
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}'
+// Kết quả
+{
+ "jsonrpc":"2.0",
+ "id":1,
+ "result":{
+ "blockHash":"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
+ "blockNumber":"0x5daf3b", // 6139707
+ "from":"0xa7d9ddbe1f17865597fbd27ec712455208b6b76d",
+ "gas":"0xc350", // 50000
+ "gasPrice":"0x4a817c800", // 20000000000
+ "hash":"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",
+ "input":"0x68656c6c6f21",
+ "nonce":"0x15", // 21
+ "to":"0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb",
+ "transactionIndex":"0x41", // 65
+ "value":"0xf3dbb76162000", // 4290000000000000
+ "v":"0x25", // 37
+ "r":"0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",
+ "s":"0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c"
+ }
+}
+```
+
+### eth_getTransactionByBlockHashAndIndex {#eth_gettransactionbyblockhashandindex}
+
+Trả về thông tin về một giao dịch theo hàm băm khối và vị trí chỉ mục giao dịch.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 32 Byte - hàm băm của một khối.
+2. `QUANTITY` - số nguyên của vị trí chỉ mục giao dịch.
+
+```js
+params: [
+ "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
+ "0x0", // 0
+]
+```
+
+**Trả về**
+Xem [eth_getTransactionByHash](#eth_gettransactionbyhash)
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'
+```
+
+Kết quả xem [eth_getTransactionByHash](#eth_gettransactionbyhash)
+
+### eth_getTransactionByBlockNumberAndIndex {#eth_gettransactionbyblocknumberandindex}
+
+Trả về thông tin về một giao dịch theo số khối và vị trí chỉ mục giao dịch.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `QUANTITY|TAG` - một số khối, hoặc chuỗi `"earliest"`, `"latest"`, `"pending"`, `"safe"` hoặc `"finalized"`, như trong [thông số khối](/developers/docs/apis/json-rpc/#block-parameter).
+2. `QUANTITY` - vị trí chỉ mục giao dịch.
+
+```js
+params: [
+ "0x9c47cf", // 10241999
+ "0x24", // 36
+]
+```
+
+**Trả về**
+Xem [eth_getTransactionByHash](#eth_gettransactionbyhash)
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}'
+```
+
+Kết quả xem [eth_getTransactionByHash](#eth_gettransactionbyhash)
+
+### eth_getTransactionReceipt {#eth_gettransactionreceipt}
+
+Trả về biên lai của một giao dịch bằng hàm băm giao dịch.
+
+**Lưu ý** Rằng biên lai không có sẵn cho các giao dịch đang chờ xử lý.
+
+**Tham số**
+
+1. `DATA`, 32 Byte - hàm băm của một giao dịch
+
+```js
+params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"]
+```
+
+**Trả về**
+`Object` - Một đối tượng biên lai giao dịch, hoặc `null` khi không tìm thấy biên lai nào:
+
+- `transactionHash `: `DATA`, 32 Byte - hàm băm của giao dịch.
+- `transactionIndex`: `QUANTITY` - số nguyên của vị trí chỉ mục giao dịch trong khối.
+- `blockHash`: `DATA`, 32 Byte - hàm băm của khối nơi giao dịch này diễn ra.
+- `blockNumber`: `QUANTITY` - số khối nơi giao dịch này diễn ra.
+- `from`: `DATA`, 20 Byte - địa chỉ của người gửi.
+- `to`: `DATA`, 20 Byte - địa chỉ của người nhận. null khi đó là một giao dịch tạo hợp đồng.
+- `cumulativeGasUsed` : `QUANTITY ` - Tổng lượng gas được sử dụng khi giao dịch này được thực hiện trong khối.
+- `effectiveGasPrice` : `QUANTITY` - Tổng của phí cơ bản và tiền boa được trả cho mỗi đơn vị gas.
+- `gasUsed `: `QUANTITY ` - Lượng gas chỉ được sử dụng bởi giao dịch cụ thể này.
+- `contractAddress `: `DATA`, 20 Byte - Địa chỉ hợp đồng được tạo, nếu giao dịch là tạo hợp đồng, ngược lại là `null`.
+- `logs`: `Array` - Mảng các đối tượng nhật ký mà giao dịch này đã tạo.
+- `logsBloom`: `DATA`, 256 Byte - Bộ lọc Bloom cho các máy khách chế độ sáng để truy xuất nhanh các nhật ký liên quan.
+- `type`: `QUANTITY` - số nguyên của loại giao dịch, `0x0` cho các giao dịch cũ, `0x1` cho các loại danh sách truy cập, `0x2` cho phí động.
+
+Nó cũng trả về _một trong hai_ :
+
+- `root` : `DATA` 32 byte của gốc trạng thái sau giao dịch (trước Byzantium)
+- `status`: `QUANTITY` là `1` (thành công) hoặc `0` (thất bại)
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}'
+// Kết quả
+{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": {
+ "blockHash":
+ "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3",
+ "blockNumber": "0xeff35f",
+ "contractAddress": null, // chuỗi địa chỉ nếu nó được tạo
+ "cumulativeGasUsed": "0xa12515",
+ "effectiveGasPrice": "0x5a9c688d4",
+ "from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7",
+ "gasUsed": "0xb4c8",
+ "logs": [{
+ // nhật ký được trả về bởi getFilterLogs, v.v.
+ }],
+ "logsBloom": "0x00...0", // bộ lọc bloom 256 byte
+ "status": "0x1",
+ "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
+ "transactionHash":
+ "0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5",
+ "transactionIndex": "0x66",
+ "type": "0x2"
+ }
+}
+```
+
+### eth_getUncleByBlockHashAndIndex {#eth_getunclebyblockhashandindex}
+
+Trả về thông tin về một khối uncle của một khối theo hàm băm và vị trí chỉ mục uncle.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `DATA`, 32 Byte - Hàm băm của một khối.
+2. `QUANTITY` - Vị trí chỉ mục của khối chú.
+
+```js
+params: [
+ "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2",
+ "0x0", // 0
+]
+```
+
+**Trả về**
+Xem [eth_getBlockByHash](#eth_getblockbyhash)
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'
+```
+
+Kết quả xem [eth_getBlockByHash](#eth_getblockbyhash)
+
+**Lưu ý**: Một khối chú không chứa các giao dịch riêng lẻ.
+
+### eth_getUncleByBlockNumberAndIndex {#eth_getunclebyblocknumberandindex}
+
+Trả về thông tin về một khối uncle của một khối theo số và vị trí chỉ mục uncle.
+
+
+ Thử điểm cuối trong sân chơi
+
+
+**Tham số**
+
+1. `QUANTITY|TAG` - một số khối, hoặc chuỗi `"earliest"`, `"latest"`, `"pending"`, `"safe"`, `"finalized"`, như trong [thông số khối](/developers/docs/apis/json-rpc/#block-parameter).
+2. `QUANTITY` - vị trí chỉ mục của khối chú.
+
+```js
+params: [
+ "0x29c", // 668
+ "0x0", // 0
+]
+```
+
+**Trả về**
+Xem [eth_getBlockByHash](#eth_getblockbyhash)
+
+**Lưu ý**: Một khối chú không chứa các giao dịch riêng lẻ.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}'
+```
+
+Kết quả xem [eth_getBlockByHash](#eth_getblockbyhash)
+
+### eth_newFilter {#eth_newfilter}
+
+Tạo một đối tượng bộ lọc, dựa trên các tùy chọn bộ lọc, để thông báo khi trạng thái thay đổi (nhật ký).
+Để kiểm tra xem trạng thái đã thay đổi chưa, hãy gọi [eth_getFilterChanges](#eth_getfilterchanges).
+
+**Lưu ý về việc chỉ định các bộ lọc chủ đề:**
+Các chủ đề phụ thuộc vào thứ tự. Một giao dịch với một nhật ký có các chủ đề [A, B] sẽ được khớp bởi các bộ lọc chủ đề sau:
+
+- `[]` "bất cứ điều gì"
+- `[A]` "A ở vị trí đầu tiên (và bất cứ điều gì sau đó)"
+- `[null, B]` "bất cứ điều gì ở vị trí đầu tiên VÀ B ở vị trí thứ hai (và bất cứ điều gì sau đó)"
+- `[A, B]` "A ở vị trí đầu tiên VÀ B ở vị trí thứ hai (và bất cứ điều gì sau đó)"
+- `[[A, B], [A, B]]` "(A HOẶC B) ở vị trí đầu tiên VÀ (A HOẶC B) ở vị trí thứ hai (và bất cứ điều gì sau đó)"
+- **Tham số**
+
+1. `Object` - Các tùy chọn bộ lọc:
+
+- `fromBlock`: `QUANTITY|TAG` - (tùy chọn, mặc định: `"latest"`) Số khối nguyên, hoặc `"latest"` cho khối được đề xuất cuối cùng, `"safe"` cho khối an toàn cuối cùng, `"finalized"` cho khối đã hoàn tất cuối cùng, hoặc `"pending"`, `"earliest"` cho các giao dịch chưa có trong khối.
+- `toBlock`: `QUANTITY|TAG` - (tùy chọn, mặc định: `"latest"`) Số khối nguyên, hoặc `"latest"` cho khối được đề xuất cuối cùng, `"safe"` cho khối an toàn cuối cùng, `"finalized"` cho khối đã hoàn tất cuối cùng, hoặc `"pending"`, `"earliest"` cho các giao dịch chưa có trong khối.
+- `address`: `DATA|Array`, 20 Byte - (tùy chọn) Địa chỉ hợp đồng hoặc danh sách các địa chỉ mà từ đó các nhật ký sẽ bắt nguồn.
+- `topics`: `Array of DATA`, - (tùy chọn) Mảng 32 Byte `DATA` chủ đề. Các chủ đề phụ thuộc vào thứ tự. Mỗi chủ đề cũng có thể là một mảng DATA với các tùy chọn "hoặc".
+
+```js
+params: [
+ {
+ fromBlock: "0x1",
+ toBlock: "0x2",
+ address: "0x8888f1f195afa192cfee860698584c030f4c9db1",
+ topics: [
+ "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ null,
+ [
+ "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc",
+ ],
+ ],
+ },
+]
+```
+
+**Trả về**
+`QUANTITY` - Một id bộ lọc.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x1" // 1
+}
+```
+
+### eth_newBlockFilter {#eth_newblockfilter}
+
+Tạo một bộ lọc trong nút, để thông báo khi có một khối mới đến.
+Để kiểm tra xem trạng thái đã thay đổi chưa, hãy gọi [eth_getFilterChanges](#eth_getfilterchanges).
+
+**Tham số**
+Không có
+
+**Trả về**
+`QUANTITY` - Một id bộ lọc.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x1" // 1
+}
+```
+
+### eth_newPendingTransactionFilter {#eth_newpendingtransactionfilter}
+
+Tạo một bộ lọc trong nút, để thông báo khi có các giao dịch đang chờ xử lý mới.
+Để kiểm tra xem trạng thái đã thay đổi chưa, hãy gọi [eth_getFilterChanges](#eth_getfilterchanges).
+
+**Tham số**
+Không có
+
+**Trả về**
+`QUANTITY` - Một id bộ lọc.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": "0x1" // 1
+}
+```
+
+### eth_uninstallFilter {#eth_uninstallfilter}
+
+Gỡ cài đặt một bộ lọc với id đã cho. Luôn luôn nên được gọi khi không còn cần theo dõi.
+Ngoài ra, Bộ lọc sẽ hết thời gian chờ khi chúng không được yêu cầu với [eth_getFilterChanges](#eth_getfilterchanges) trong một khoảng thời gian.
+
+**Tham số**
+
+1. `QUANTITY` - Id bộ lọc.
+
+```js
+params: [
+ "0xb", // 11
+]
+```
+
+**Trả về**
+`Boolean` - `true` nếu bộ lọc được gỡ cài đặt thành công, ngược lại là `false`.
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc": "2.0",
+ "result": true
+}
+```
+
+### eth_getFilterChanges {#eth_getfilterchanges}
+
+Phương pháp bỏ phiếu cho một bộ lọc, trả về một mảng các nhật ký đã xảy ra kể từ lần bỏ phiếu cuối cùng.
+
+**Tham số**
+
+1. `QUANTITY` - id bộ lọc.
+
+```js
+params: [
+ "0x16", // 22
+]
+```
+
+**Trả về**
+`Array` - Mảng các đối tượng nhật ký, hoặc một mảng trống nếu không có gì thay đổi kể từ lần bỏ phiếu cuối cùng.
+
+- Đối với các bộ lọc được tạo bằng `eth_newBlockFilter`, giá trị trả về là các hàm băm khối (`DATA`, 32 Byte), ví dụ: `["0x3454645634534..."]`.
+
+- Đối với các bộ lọc được tạo bằng `eth_newPendingTransactionFilter`, giá trị trả về là các hàm băm giao dịch (`DATA`, 32 Byte), ví dụ: `["0x6345343454645..."]`.
+
+- Đối với các bộ lọc được tạo bằng `eth_newFilter`, nhật ký là các đối tượng có các tham số sau:
+ - `removed`: `TAG` - `true` khi nhật ký bị xóa, do tổ chức lại chuỗi. `false` nếu đó là một nhật ký hợp lệ.
+ - `logIndex`: `QUANTITY` - số nguyên của vị trí chỉ mục nhật ký trong khối. `null` khi đó là nhật ký đang chờ xử lý.
+ - `transactionIndex`: `QUANTITY` - số nguyên của vị trí chỉ mục giao dịch mà nhật ký được tạo từ đó. `null` khi đó là nhật ký đang chờ xử lý.
+ - `transactionHash`: `DATA`, 32 Byte - hàm băm của các giao dịch mà nhật ký này được tạo từ đó. `null` khi đó là nhật ký đang chờ xử lý.
+ - `blockHash`: `DATA`, 32 Byte - hàm băm của khối nơi nhật ký này diễn ra. `null` khi đang chờ xử lý. `null` khi đó là nhật ký đang chờ xử lý.
+ - `blockNumber`: `QUANTITY` - số khối nơi nhật ký này diễn ra. `null` khi đang chờ xử lý. `null` khi đó là nhật ký đang chờ xử lý.
+ - `address`: `DATA`, 20 Byte - địa chỉ mà nhật ký này bắt nguồn.
+ - `data`: `DATA` - dữ liệu nhật ký không được lập chỉ mục có độ dài thay đổi. (Trong _solidity_: không hoặc nhiều hơn 32 Byte đối số nhật ký không được lập chỉ mục.)
+ - `topics`: `Array of DATA` - Mảng từ 0 đến 4 32 Byte `DATA` của các đối số nhật ký được lập chỉ mục. (Trong _solidity_: Chủ đề đầu tiên là _hàm băm_ của chữ ký của sự kiện (ví dụ: `Deposit(address,bytes32,uint256)`), trừ khi bạn đã khai báo sự kiện với bộ chỉ định `anonymous`.)
+
+- **Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}'
+// Kết quả
+{
+ "id":1,
+ "jsonrpc":"2.0",
+ "result": [{
+ "logIndex": "0x1", // 1
+ "blockNumber":"0x1b4", // 436
+ "blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d",
+ "transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf",
+ "transactionIndex": "0x0", // 0
+ "address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d",
+ "data":"0x0000000000000000000000000000000000000000000000000000000000000000",
+ "topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"]
+ },{
+ ...
+ }]
+}
+```
+
+### eth_getFilterLogs {#eth_getfilterlogs}
+
+Trả về một mảng gồm tất cả các nhật ký khớp với bộ lọc có id đã cho.
+
+**Tham số**
+
+1. `QUANTITY` - Id bộ lọc.
+
+```js
+params: [
+ "0x16", // 22
+]
+```
+
+**Trả về**
+Xem [eth_getFilterChanges](#eth_getfilterchanges)
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}'
+```
+
+Kết quả xem [eth_getFilterChanges](#eth_getfilterchanges)
+
+### eth_getLogs {#eth_getlogs}
+
+Trả về một mảng gồm tất cả các nhật ký khớp với một đối tượng bộ lọc đã cho.
+
+**Tham số**
+
+1. `Object` - Các tùy chọn bộ lọc:
+
+- `fromBlock`: `QUANTITY|TAG` - (tùy chọn, mặc định: `"latest"`) Số khối nguyên, hoặc `"latest"` cho khối được đề xuất cuối cùng, `"safe"` cho khối an toàn cuối cùng, `"finalized"` cho khối đã hoàn tất cuối cùng, hoặc `"pending"`, `"earliest"` cho các giao dịch chưa có trong khối.
+- `toBlock`: `QUANTITY|TAG` - (tùy chọn, mặc định: `"latest"`) Số khối nguyên, hoặc `"latest"` cho khối được đề xuất cuối cùng, `"safe"` cho khối an toàn cuối cùng, `"finalized"` cho khối đã hoàn tất cuối cùng, hoặc `"pending"`, `"earliest"` cho các giao dịch chưa có trong khối.
+- `address`: `DATA|Array`, 20 Byte - (tùy chọn) Địa chỉ hợp đồng hoặc danh sách các địa chỉ mà từ đó các nhật ký sẽ bắt nguồn.
+- `topics`: `Array of DATA`, - (tùy chọn) Mảng 32 Byte `DATA` chủ đề. Các chủ đề phụ thuộc vào thứ tự. Mỗi chủ đề cũng có thể là một mảng DATA với các tùy chọn "hoặc".
+- `blockHash`: `DATA`, 32 Byte - (tùy chọn, **tương lai**) Với việc bổ sung EIP-234, `blockHash` sẽ là một tùy chọn bộ lọc mới giới hạn các nhật ký trả về cho một khối duy nhất có hàm băm 32 byte `blockHash`. Việc sử dụng `blockHash` tương đương với `fromBlock` = `toBlock` = số khối có hàm băm `blockHash`. Nếu `blockHash` có trong tiêu chí bộ lọc, thì cả `fromBlock` và `toBlock` đều không được phép.
+
+```js
+params: [
+ {
+ topics: [
+ "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ ],
+ },
+]
+```
+
+**Trả về**
+Xem [eth_getFilterChanges](#eth_getfilterchanges)
+
+**Ví dụ**
+
+```js
+// Yêu cầu
+curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}'
+```
+
+Kết quả xem [eth_getFilterChanges](#eth_getfilterchanges)
+
+## Ví dụ về cách sử dụng {#usage-example}
+
+### Triển khai hợp đồng bằng JSON_RPC {#deploying-contract}
+
+Phần này bao gồm một minh họa về cách triển khai một hợp đồng chỉ bằng giao diện RPC. Có các tuyến thay thế để triển khai các hợp đồng trong đó sự phức tạp này được trừu tượng hóa — ví dụ, sử dụng các thư viện được xây dựng trên giao diện RPC như [web3.js](https://web3js.readthedocs.io/) và [web3.py](https://github.com/ethereum/web3.py). Các bản tóm tắt này thường dễ hiểu hơn và ít bị lỗi hơn, nhưng vẫn hữu ích khi hiểu những gì đang xảy ra bên dưới.
+
+Sau đây là một hợp đồng thông minh đơn giản có tên là `Multiply7` sẽ được triển khai bằng giao diện JSON-RPC cho một nút Ethereum. Hướng dẫn này giả định rằng người đọc đã chạy một nút Geth. Thông tin thêm về các nút và máy khách có tại [đây](/developers/docs/nodes-and-clients/run-a-node). Vui lòng tham khảo tài liệu tham khảo của [máy khách](/developers/docs/nodes-and-clients/) cá nhân để xem cách bắt đầu JSON-RPC HTTP cho các máy khách không phải Geth. Hầu hết các máy khách mặc định phục vụ trên `localhost:8545`.
+
+```javascript
+contract Multiply7 {
+ event Print(uint);
+ function multiply(uint input) returns (uint) {
+ Print(input * 7);
+ return input * 7;
+ }
+}
+```
+
+Điều đầu tiên cần làm là đảm bảo giao diện RPC HTTP được bật. Điều này có nghĩa là chúng tôi cung cấp cho Geth cờ `--http` khi khởi động. Trong ví dụ này, chúng tôi sử dụng nút Geth trên một chuỗi phát triển riêng. Sử dụng phương pháp này, chúng ta không cần ether trên mạng thực.
+
+```bash
+geth --http --dev console 2>>geth.log
+```
+
+Thao tác này sẽ khởi động giao diện HTTP RPC trên `http://localhost:8545`.
+
+Chúng tôi có thể xác minh rằng giao diện đang chạy bằng cách truy xuất địa chỉ coinbase (bằng cách lấy địa chỉ đầu tiên từ mảng tài khoản) và số dư bằng [curl](https://curl.se). Xin lưu ý rằng dữ liệu trong các ví dụ này sẽ khác trên nút cục bộ của bạn. Nếu bạn muốn thử các lệnh này, hãy thay thế các tham số yêu cầu trong yêu cầu curl thứ hai bằng kết quả trả về từ yêu cầu đầu tiên.
+
+```bash
+curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":1}' -H "Content-Type: application/json" localhost:8545
+{"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]}
+
+curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545
+{"id":2,"jsonrpc":"2.0","result":"0x1639e49bba16280000"}
+```
+
+Vì các số được mã hóa bằng hex, số dư được trả về bằng wei dưới dạng một chuỗi hex. Nếu chúng ta muốn có số dư bằng ether dưới dạng một con số, chúng ta có thể sử dụng web3 từ bảng điều khiển Geth.
+
+```javascript
+web3.fromWei("0x1639e49bba16280000", "ether")
+// "410"
+```
+
+Bây giờ có một số ether trên chuỗi phát triển riêng của chúng tôi, chúng tôi có thể triển khai hợp đồng. Bước đầu tiên là biên dịch hợp đồng Multiply7 thành mã byte có thể được gửi đến EVM. Để cài đặt solc, trình biên dịch Solidity, hãy làm theo [tài liệu tham khảo Solidity](https://docs.soliditylang.org/en/latest/installing-solidity.html). (Bạn có thể muốn sử dụng bản phát hành `solc` cũ hơn để khớp với [phiên bản trình biên dịch được sử dụng cho ví dụ của chúng tôi](https://github.com/ethereum/solidity/releases/tag/v0.4.20).)
+
+Bước tiếp theo là biên dịch hợp đồng Multiply7 thành mã byte có thể được gửi đến Máy chủ ảo Ethereum.
+
+```bash
+echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin
+
+======= :Multiply7 =======
+Binary:
+6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029
+```
+
+Bây giờ chúng ta đã có mã đã biên dịch, chúng ta cần xác định chi phí gas để triển khai nó. Giao diện RPC có một phương thức `eth_estimateGas` sẽ cho chúng ta một ước tính.
+
+```bash
+curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 5}' -H "Content-Type: application/json" localhost:8545
+{"jsonrpc":"2.0","id":5,"result":"0x1c31e"}
+```
+
+Và cuối cùng triển khai hợp đồng.
+
+```bash
+curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "gas": "0x1c31e", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 6}' -H "Content-Type: application/json" localhost:8545
+{"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"}
+```
+
+Giao dịch được chấp nhận bởi nút và một hàm băm giao dịch được trả về. Hàm băm này có thể được sử dụng để theo dõi giao dịch. Bước tiếp theo là xác định địa chỉ nơi hợp đồng của chúng ta được triển khai. Mỗi giao dịch được thực thi sẽ tạo ra một biên nhận. Biên nhận này chứa nhiều thông tin khác nhau về giao dịch, chẳng hạn như giao dịch được bao gồm trong khối nào và Máy chủ ảo Ethereum đã sử dụng bao nhiêu gas. Nếu một giao dịch
+tạo ra một hợp đồng, nó cũng sẽ chứa địa chỉ hợp đồng. Chúng ta có thể truy xuất biên nhận bằng phương thức RPC `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"}}
+```
+
+Hợp đồng của chúng ta được tạo trên `0x4d03d617d700cf81935d7f797f4e2ae719648262`. Kết quả rỗng thay vì biên nhận có nghĩa là giao dịch chưa được đưa vào một khối. Hãy đợi một lát và kiểm tra xem máy khách đồng thuận của bạn có đang chạy không và thử lại.
+
+#### Tương tác với các hợp đồng thông minh {#interacting-with-smart-contract}
+
+Trong ví dụ này, chúng ta sẽ gửi một giao dịch bằng cách sử dụng `eth_sendTransaction` đến phương thức `multiply` của hợp đồng.
+
+`eth_sendTransaction` yêu cầu một số đối số, cụ thể là `from`, `to` và `data`. `From` là địa chỉ công khai của tài khoản của chúng ta và `to` là địa chỉ hợp đồng. Đối số `data` chứa một tải trọng xác định phương thức nào phải được gọi và với đối số nào. Đây là lúc [ABI (giao diện nhị phân ứng dụng)](https://docs.soliditylang.org/en/latest/abi-spec.html) phát huy tác dụng. ABI là một tệp JSON xác định cách định nghĩa và mã hóa dữ liệu cho Máy chủ ảo Ethereum.
+
+Các byte của tải trọng xác định phương thức nào trong hợp đồng được gọi. Đây là 4 byte đầu tiên từ hàm băm Keccak trên tên hàm và các loại đối số của nó, được mã hóa dưới dạng hex. Hàm nhân chấp nhận một uint là bí danh cho uint256. Điều này cho chúng ta:
+
+```javascript
+web3.sha3("multiply(uint256)").substring(0, 10)
+// "0xc6888fa1"
+```
+
+Bước tiếp theo là mã hóa các đối số. Chỉ có một uint256, ví dụ, giá trị 6. ABI có một phần chỉ định cách mã hóa các loại uint256.
+
+`int: enc(X)` là mã hóa bù hai của X theo kiểu big-endian, được đệm ở phía bậc cao (bên trái) bằng 0xff cho X âm và bằng các byte không cho X dương sao cho độ dài là bội số của 32 byte.
+
+Giá trị này mã hóa thành `0000000000000000000000000000000000000000000000000000000000000006`.
+
+Kết hợp bộ chọn hàm và đối số đã mã hóa, dữ liệu của chúng ta sẽ là `0xc6888fa10000000000000000000000000000000000000000000000000000000000000006`.
+
+Bây giờ có thể gửi giá trị này đến nút:
+
+```bash
+curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a", "to": "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' -H "Content-Type: application/json" localhost:8545
+{"id":8,"jsonrpc":"2.0","result":"0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74"}
+```
+
+Vì một giao dịch đã được gửi, một hàm băm giao dịch đã được trả về. Truy xuất biên nhận cho ra kết quả:
+
+```javascript
+{
+ blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",
+ blockNumber: 268,
+ contractAddress: null,
+ cumulativeGasUsed: 22631,
+ gasUsed: 22631,
+ logs: [{
+ address: "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d",
+ blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55",
+ blockNumber: 268,
+ data: "0x000000000000000000000000000000000000000000000000000000000000002a",
+ logIndex: 0,
+ topics: ["0x24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"],
+ transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",
+ transactionIndex: 0
+ }],
+ transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74",
+ transactionIndex: 0
+}
+```
+
+Biên nhận có chứa một nhật ký. Nhật ký này được tạo bởi Máy chủ ảo Ethereum khi thực thi giao dịch và được bao gồm trong biên nhận. Hàm `multiply` cho thấy sự kiện `Print` đã được đưa ra với đầu vào nhân với 7. Vì đối số cho sự kiện `Print` là một uint256, chúng ta có thể giải mã nó theo các quy tắc ABI, điều này sẽ cho chúng ta kết quả thập phân 42 như mong đợi. Ngoài dữ liệu, cần lưu ý rằng các chủ đề có thể được sử dụng để xác định sự kiện nào đã tạo ra nhật ký:
+
+```javascript
+web3.sha3("Print(uint256)")
+// "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"
+```
+
+Đây chỉ là một giới thiệu ngắn gọn về một số tác vụ phổ biến nhất, minh họa việc sử dụng trực tiếp JSON-RPC.
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Đặc tả JSON-RPC](http://www.jsonrpc.org/specification)
+- [Các nút và client](/developers/docs/nodes-and-clients/)
+- [API JavaScript](/developers/docs/apis/javascript/)
+- [API phụ trợ](/developers/docs/apis/backend/)
+- [Các ứng dụng thực thi](/developers/docs/nodes-and-clients/#execution-clients)
diff --git a/public/content/translations/vi/developers/docs/blocks/index.md b/public/content/translations/vi/developers/docs/blocks/index.md
new file mode 100644
index 00000000000..a8d83445223
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/blocks/index.md
@@ -0,0 +1,153 @@
+---
+title: Khối
+description: Tổng quan về khối trong chuỗi khối Ethereum – cấu trúc dữ liệu của chúng, lý do chúng cần thiết và cách chúng được tạo ra.
+lang: vi
+---
+
+Các khối là tập hợp các giao dịch kèm theo một hàm băm (Hash) của khối trước đó trong chuỗi. Điều này liên kết các khối lại với nhau (thành một chuỗi) vì các hàm băm được tạo ra bằng phương pháp mật mã học (Cryptography) từ dữ liệu của khối. Điều này ngăn chặn gian lận, bởi vì chỉ một thay đổi trong bất kỳ khối nào trong lịch sử cũng sẽ làm vô hiệu tất cả các khối tiếp theo, do toàn bộ các hàm băm sau đó sẽ thay đổi và mọi người đang vận hành chuỗi khối sẽ phát hiện ra.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Khối là một chủ đề rất dễ với người mới. Để giúp bạn hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc [Tài khoản](/developers/docs/accounts/), [Giao dịch](/developers/docs/transactions/) và [giới thiệu về Ethereum](/developers/docs/intro-to-ethereum/) của chúng tôi.
+
+## Tại sao lại là khối? {#why-blocks}
+
+Để đảm bảo tất cả những người tham gia mạng Ethereum duy trì trạng thái đồng bộ và thống nhất về lịch sử giao dịch chính xác, chúng ta gom các giao dịch lại thành các khối. Điều này có nghĩa là hàng chục (hoặc hàng trăm) giao dịch được ghi nhận, thống nhất và đồng bộ cùng một lúc.
+
+
+_Sơ đồ được điều chỉnh từ [minh họa Ethereum EVM](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_
+
+Bằng cách giãn cách thời gian ghi nhận, chúng ta cho tất cả những người tham gia mạng đủ thời gian để đạt được đồng thuận: mặc dù các yêu cầu giao dịch xảy ra hàng chục lần mỗi giây, nhưng các khối trên Ethereum chỉ được tạo và ghi nhận sau mỗi mười hai giây.
+
+## Cách các khối hoạt động {#how-blocks-work}
+
+Để lưu giữ lịch sử giao dịch, các khối được sắp xếp theo một thứ tự nghiêm ngặt (mỗi khối mới đều chứa một thông tin liên quan đến khối cha của nó), và giao dịch trong khối cũng được sắp xếp nghiêm ngặt theo cách tương tự. Trừ những trường hợp đặt biệt, bất kì lúc nào, tất cả những người tham gia mạng lưới thống nhất con số, lịch sử chính xác của khối và đang xử lí để gom các yêu cầu giao dịch đang diễn ra vào khối tiếp theo.
+
+Khi một khối được nối với nhau bằng cách chọn ra nút xác thực ngẫu nhiên trên mạng lưới, nó sẽ được phân tán đến tất cả mạng lưới; tất cả nút thêm nó vào khối cuối của chuỗi khối và nút xác thực mới sẽ được chọn để tạo khối tiếp theo. Quy trình lắp khối chính xác và quy trình ghi nhận/ đồng thuận hiện được quy định bởi giao thức bằng chứng cổ phần (PoS) của Ethereum.
+
+## Giao thức bằng chứng cổ phần {#proof-of-stake-protocol}
+
+Bằng chứng cổ phần (Proof-of-Stake) có ý nghĩa như sau:
+
+- Nút xác thực phải Stake (đặt cược) 32 ETH vào một hợp đồng ký quỹ như khoảng thế chấp phòng hành vi độc hại. Điều này giúp bảo vệ mạng lưới vì các hoạt động không trung thực dẫn đến một hoặc tất cả Stake bị hủy đi.
+- Ở mỗi Slot (mỗi 12 giây) một nút xác thực ngẫu nhiên được chọn để làm người để xuất khối. Họ sẽ gộp các giao dịch lại, xử lí chúng và xác định 'trạng thái'. Họ gói các thông tin này vào một khối và phân tán nó với những nút xác thực khác.
+- Những nút xác thực khác khi biết về khối mới sẽ xác thực lại những giao dịch để đảm bảo rằng họ đồng tình với đề xuất thay đổi trên trạng thái toàn mạng. Giả sử rằng khối hợp lệ, họ sẽ thêm nó vào dữ liệu của họ.
+- Nếu một nút xác thực biết về hai khối trong cùng Slot họ sẽ sử dụng thuật toán chọn nhánh (Fork Choise Algorithm) để chọn ra một nhánh được ủng hộ bởi phần lớn ETH được Stake.
+
+[Thông tin thêm về bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos)
+
+## Khối có gì trong đó? {#block-anatomy}
+
+Có rất nhiều thông tin nằm trong một khối. Ở cấp độ tổng quát nhất, một khối chứa các trường dữ liệu sau:
+
+| Trường dữ liệu | Mô tả |
+| :--------------- | :-------------------------------------------------------------------- |
+| `slot` | Slot mà khối đó thuộc về |
+| `proposer_index` | iD của trình xác thực đề xuất khối |
+| `parent_root` | kết quả hàm băm của khối trước |
+| `state_root` | hàm băm gốc của đối tượng trạng thái |
+| `phần body` | một đối tượng chứa nhiều trường dữ liệu, như được định nghĩa dưới đây |
+
+Phần `body` của khối chứa một số trường riêng:
+
+| Trường dữ liệu | Mô tả |
+| :------------------- | :------------------------------------------------------------------------------------------------------------------------------ |
+| `randao_reveal` | một giá trị được dùng để chọn người đề xuất khối tiếp theo |
+| `eth1_data` | thông tin về hợp đồng ký quỹ (deposit contract) |
+| `graffiti` | dữ liệu tùy ý được dùng để gắn nhãn cho các khối |
+| `proposer_slashings` | danh sách các nút xác thực sẽ bị phạt cắt quỹ (Slashing) |
+| `attester_slashings` | danh sách các nút xác thực chứng thực sẽ bị cắt quỹ (Slashing) |
+| `attestations` | danh sách các chứng thực được thực hiện đối với các slot trước đó |
+| `gửi tiền` | danh sách các khoản ký quỹ mới vào hợp đồng ký quỹ |
+| `voluntary_exits` | danh sách các nút xác thực tự nguyện rời khỏi mạng |
+| `sync_aggregate` | tập con các nút xác thực được dùng để phục vụ Light Client (Client có dữ liệu thấp hơn so với Client đầy đủ) |
+| `execution_payload` | các giao dịch được chuyển từ Client thực thi |
+
+Trường `attestations` chứa danh sách tất cả các chứng thực trong khối. Sự chứng thực (Attestations) có những loại dữ liệu riêng chứa những mảnh dữ liệu. Mỗi sự chứng thực chứa:
+
+| Trường dữ liệu | Mô tả |
+| :----------------- | :----------------------------------------------------------------------- |
+| `aggregation_bits` | một tập hợp những nút xác thực tham gia quá trình chứng nhận này |
+| `dữ liệu` | một hộp chưa những trường dữ liệu con |
+| `signature` | chữ ký tổng hợp của một tập hợp những người xác thực đối với phần `data` |
+
+Trường `data` trong `attestation` chứa những nội dung sau:
+
+| Trường dữ liệu | Mô tả |
+| :------------------ | :-------------------------------------------------------------- |
+| `slot` | những Slot liên quann đến sự chứng thực |
+| `index` | các chỉ số nút xác thực |
+| `beacon_block_root` | hàm băm gốc của khối Beacon được xem là phần đầu của chuỗi |
+| `nguồn` | cột mốc cuối cùng được xác nhận (Jusstified) |
+| `target` | khối ranh giới chu kỳ mới nhất |
+
+Việc thực thi các giao dịch trong `execution_payload` sẽ cập nhật trạng thái toàn cục. Tất cả các máy khách thực thi lại các giao dịch trong `execution_payload` để đảm bảo trạng thái mới khớp với trạng thái trong trường `state_root` của khối mới. Đây là cách một Client có thể biết được khối mới hợp lệ và an toàn để thêm vào chuỗi khối hay không. Bản thân `execution payload` là một đối tượng có một số trường. Ngoài ra còn có một `execution_payload_header` chứa thông tin tóm tắt quan trọng về dữ liệu thực thi. Những cấu trúc được sắp sếp như sau:
+
+`execution_payload_header` chứa các trường sau:
+
+| Trường dữ liệu | Mô tả |
+| :------------------ | :------------------------------------------------------------------------------------ |
+| `parent_hash` | kết quả băm của khối bố |
+| `fee_recipient` | địa chỉ tài khoản trả phí giao dịch đến |
+| `state_root` | hàm băm gốc của trạng thái toàn mạng lưới sau khi áp dụng các thay đổi trong khối này |
+| `receipts_root` | hàm băm của tất cả biên lai giao dịch (dữ liệu dạng cây) |
+| `logs_bloom` | cấu trúc trúc dữ liệu chứa các nhật kí sự kiện |
+| `prev_randao` | dữ liệu dùng trong lựa chọn nút xác thực ngẫu nhiên |
+| `block_number` | số của khối hiện tại |
+| `gas_limit` | lượng Gas tối đa cho phép ở khối này |
+| `gas_used` | lượng Gas thực tế sử dụng trong khối |
+| `timestamp` | thời gian của khối |
+| `extra_data` | dữ liệu bổ sung tùy ý dưới dạng Byte thô |
+| `base_fee_per_gas` | phí giao dịch cơ bản |
+| `block_hash` | Hàm băm của khối thực thi |
+| `transactions_root` | hàm băm gốc của các giao dịch trong dữ liệu thực thi |
+| `withdrawal_root` | hàm băm gốc của các lệnh rút trong dữ liệu thực thi |
+
+Bản thân `execution_payload` chứa những nội dung sau (lưu ý rằng nó giống hệt với phần header ngoại trừ việc thay vì chứa hàm băm gốc của các giao dịch, nó bao gồm danh sách thực tế các giao dịch và thông tin rút tiền):
+
+| Trường dữ liệu | Mô tả |
+| :----------------- | :------------------------------------------------------------------------------------ |
+| `parent_hash` | kết quả băm của khối bố |
+| `fee_recipient` | địa chỉ tài khoản trả phí giao dịch đến |
+| `state_root` | hàm băm gốc của trạng thái toàn mạng lưới sau khi áp dụng các thay đổi trong khối này |
+| `receipts_root` | hàm băm của tất cả biên lai giao dịch (dữ liệu dạng cây) |
+| `logs_bloom` | cấu trúc trúc dữ liệu chứa các nhật kí sự kiện |
+| `prev_randao` | dữ liệu dùng trong lựa chọn nút xác thực ngẫu nhiên |
+| `block_number` | số của khối hiện tại |
+| `gas_limit` | lượng Gas tối đa cho phép ở khối này |
+| `gas_used` | lượng Gas thực tế sử dụng trong khối |
+| `timestamp` | thời gian của khối |
+| `extra_data` | dữ liệu bổ sung tùy ý dưới dạng Byte thô |
+| `base_fee_per_gas` | phí giao dịch cơ bản |
+| `block_hash` | Hàm băm của khối thực thi |
+| `các giao dịch` | danh sách của những giao dịch sẽ được thực thi |
+| `rút tiền` | danh sách đối tượng rút |
+
+Danh sách `withdrawals` chứa các đối tượng `withdrawal` được cấu trúc theo cách sau:
+
+| Trường dữ liệu | Mô tả |
+| :--------------- | :------------------------- |
+| `địa chỉ` | địa chỉ tài khoải rút tiền |
+| `amount` | khối lượng tiền rút |
+| `index` | số thứ tự rút tiền |
+| `validatorIndex` | số thứ tự nút xác thực |
+
+## Thời gian khối {#block-time}
+
+Thời gian khối dùng để mô tả thời gian tách khối. Trong Ethereum, thời gian chia thành mỗi đơn vị 12 giây gọi là 'Slot'. Với mỗi slot một nút xác thực đựa lựa chọn để đề xuất khối. Giả sử rằng tất cả nút xác thực đang trực tuyến và hoạt động bình thường thì mỗi Slot sẽ có một khối, nghĩa rằng thời gian khối là 12 giây. Tuy nhiên, đôi khi nút xác thực có thể ngoại tuyến khi được gọi đề xuất khối, nghĩa là Slot đôi khi bị trống.
+
+Việc thực hiện sẽ khác nhau giữa hệ thống bằng chứng công việc nơi mà thời gian khối dựa theo xác suất và được điều chỉnh theo mục tiêu của giao thức độ khó đào. [Thời gian khối trung bình](https://etherscan.io/chart/blocktime) của Ethereum là một ví dụ hoàn hảo về điều này, qua đó quá trình chuyển đổi từ bằng chứng công việc sang bằng chứng cổ phần có thể được suy ra một cách rõ ràng dựa trên tính nhất quán của thời gian khối 12 giây mới.
+
+## Kích thước khối {#block-size}
+
+Một lưu ý quan trọng đó là bản thân khối cũng bị giới hạn về kích thước. Mỗi khối có kích thước mục tiêu là 30 triệu gas nhưng kích thước của các khối sẽ tăng hoặc giảm theo nhu cầu của mạng lưới, cho đến khi đạt giới hạn khối là 60 triệu gas (gấp 2 lần kích thước khối mục tiêu). Giới hạn Gas của khối có thể điều chỉnh lên hoặc xuống phụ thuộc vào tỉ lệ khoảng 1/1024 từ giới hạn Gas của khối trước. Và kết quả, nút xác thực có thể thay đổi giới hạn Gas của khối qua đồng thuận. Tổng lượng Gas được tiêu thụ bởi tất cả giao dịch trong khối phải nhỏ hơn mức giới hạn Gas mục tiêu của khối. Điều này rất quan trọng để đảm bảo rằng khối không thể có kích thước tùy ý. Nếu khối có thể có kích thước tùy ý, thì các nút xác thực bản đầy đủ (Full Node) sẽ không thể theo kịp mạng lưới do yêu cầu về dữ liệu trống và tốc độ (phần cứng không đủ mạnh mẽ). Khối càng lớn, càng cần nhiều sức mạnh tính toán để có thể xử lí chúng xong thời gian của Slot kế. Điều này là rủi ro tập trung hóa, và giải pháp là giới hạn kích thước khối.
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Giao dịch](/developers/docs/transactions/)
+- [Gas](/developers/docs/gas/)
+- [Bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos)
diff --git a/public/content/translations/vi/developers/docs/bridges/index.md b/public/content/translations/vi/developers/docs/bridges/index.md
new file mode 100644
index 00000000000..92cee9a7f0f
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/bridges/index.md
@@ -0,0 +1,138 @@
+---
+title: Các cầu nối
+description: Tổng quan về cầu nối cho các nhà phát triển
+lang: vi
+---
+
+Với sự gia tăng của các chuỗi khối L1 và các giải pháp [mở rộng](/developers/docs/scaling/) L2, cùng với số lượng ngày càng tăng của các ứng dụng phi tập trung hoạt động xuyên chuỗi, nhu cầu về giao tiếp và di chuyển tài sản giữa các chuỗi đã trở thành một phần thiết yếu của hạ tầng mạng. Có nhiều loại cầu nối khác nhau tồn tại để giúp điều này trở nên khả thi.
+
+## Nhu cầu về cầu nối {#need-for-bridges}
+
+Cầu tôn tại để kết nối các mạng lưới chuỗi khối. Chúng cho phép khả năng kết nối và khả năng tương tác giữa các chuỗi khối.
+
+Các chuỗi khối tồn tại trong những môi trường tách biệt, nghĩa là không có cách nào để các chuỗi khối tự nhiên trao đổi và giao tiếp với các chuỗi khối khác. Do đó, mặc dù có thể có nhiều hoạt động và đổi mới đáng kể trong một hệ sinh thái, nhưng nó vẫn bị giới hạn bởi sự thiếu kết nối và khả năng tương tác với các hệ sinh thái khác.
+
+Cầu nối mang đến một cách thức để các môi trường chuỗi khối tách biệt có thể kết nối với nhau. Chúng thiết lập một tuyến đường truyền giữa các chuỗi khối, nơi token, thông điệp, dữ liệu tùy ý và thậm chí cả lời gọi [hợp đồng thông minh](/developers/docs/smart-contracts/) có thể được chuyển từ chuỗi này sang chuỗi khác.
+
+## Lợi ích của cầu nối {#benefits-of-bridges}
+
+Nói một cách đơn giản, cầu nối mở ra nhiều trường hợp sử dụng bằng cách cho phép các mạng chuỗi khối trao đổi dữ liệu và di chuyển tài sản giữa chúng.
+
+Các chuỗi khối có những điểm mạnh, điểm yếu và cách tiếp cận riêng trong việc xây dựng ứng dụng (chẳng hạn như tốc độ, thông lượng, chi phí, v.v.). Cầu nối hỗ trợ sự phát triển của toàn bộ hệ sinh thái tiền mã hóa bằng cách cho phép các chuỗi khối tận dụng những đổi mới của nhau.
+
+Đối với các nhà phát triển, cầu nối cho phép những điều sau:
+
+- việc chuyển bất kỳ dữ liệu, thông tin và tài sản nào giữa các chuỗi.
+- mở khóa các tính năng và trường hợp sử dụng mới cho các giao thức khi cầu nối mở rộng không gian thiết kế cho những gì mà các giao thức có thể cung cấp. Ví dụ, một giao thức yield farming được triển khai ban đầu trên Ethereum Mainnet có thể cung cấp các pool thanh khoản trên tất cả các chuỗi tương thích với EVM.
+- cơ hội tận dụng những điểm mạnh của các chuỗi khối khác nhau. Ví dụ, các nhà phát triển có thể hưởng lợi từ mức phí thấp hơn do các giải pháp L2 cung cấp bằng cách triển khai ứng dụng phi tập trung của họ trên các rollup và sidechain, và người dùng có thể sử dụng cầu nối để di chuyển giữa chúng.
+- sự hợp tác giữa các nhà phát triển từ nhiều hệ sinh thái chuỗi khối khác nhau để xây dựng các sản phẩm mới.
+- thu hút người dùng và cộng đồng từ nhiều hệ sinh thái khác nhau đến với các ứng dụng phi tập trung của họ.
+
+## Các cầu nối hoạt động thế nào? {#how-do-bridges-work}
+
+Mặc dù có nhiều [loại thiết kế cầu nối](https://li.fi/knowledge-hub/blockchain-bridges-and-classification/), ba cách nổi bật để hỗ trợ việc chuyển tài sản xuyên chuỗi là:
+
+- **Khóa và đúc –** Khóa tài sản trên chuỗi nguồn và đúc tài sản trên chuỗi đích.
+- **Đốt và đúc –** Đốt tài sản trên chuỗi nguồn và đúc tài sản trên chuỗi đích.
+- **Hoán đổi nguyên tử –** Hoán đổi tài sản trên chuỗi nguồn lấy tài sản trên chuỗi đích với một bên khác.
+
+## Các loại cầu nối {#bridge-types}
+
+Các cầu nối thường có thể được phân loại vào một trong các nhóm sau:
+
+- **Cầu nối gốc –** Những cầu nối này thường được xây dựng để khởi tạo thanh khoản trên một chuỗi khối cụ thể, giúp người dùng dễ dàng chuyển tiền vào hệ sinh thái đó. Ví dụ: [Arbitrum Bridge](https://bridge.arbitrum.io/) được xây dựng để giúp người dùng thuận tiện khi kết nối từ Ethereum Mainnet sang Arbitrum. Các cầu nối tương tự khác bao gồm Polygon PoS Bridge, [Optimism Gateway](https://app.optimism.io/bridge), v.v.
+- **Cầu nối dựa trên người xác thực hoặc oracle –** Những cầu nối này dựa vào một tập hợp người xác thực bên ngoài hoặc các oracle để xác minh các giao dịch chuyển xuyên chuỗi. Ví dụ: Multichain và Across.
+- **Cầu nối truyền thông điệp tổng quát –** Những cầu nối này có thể chuyển tài sản cùng với thông điệp và dữ liệu tùy ý giữa các chuỗi. Ví dụ: Axelar, LayerZero và Nomad.
+- **Mạng lưới thanh khoản –** Những cầu nối này chủ yếu tập trung vào việc chuyển tài sản từ chuỗi này sang chuỗi khác thông qua các hoán đổi nguyên tử. Thông thường, chúng không hỗ trợ việc truyền thông điệp xuyên chuỗi. Ví dụ: Connext và Hop.
+
+## Những đánh đổi cần cân nhắc {#trade-offs}
+
+Với các cầu nối, không có giải pháp nào là hoàn hảo. Thay vào đó, chỉ có những đánh đổi được thực hiện để phục vụ một mục đích. Các nhà phát triển và người dùng có thể đánh giá các cầu nối dựa trên các yếu tố sau:
+
+- **Bảo mật –** Ai là người xác minh hệ thống? Các cầu nối được bảo mật bởi những người xác thực bên ngoài thường kém an toàn hơn so với các cầu nối được bảo mật cục bộ hoặc bảo mật gốc bởi những người xác thực của chính chuỗi khối.
+- **Tiện lợi –** Mất bao lâu để hoàn tất một giao dịch và người dùng cần ký bao nhiêu giao dịch? Đối với một nhà phát triển, việc tích hợp một cầu nối mất bao lâu và quá trình đó phức tạp đến mức nào?
+- **Khả năng kết nối –** Cầu nối có thể kết nối với những chuỗi đích khác nhau nào (ví dụ: rollup, chuỗi bên, các chuỗi khối lớp 1 khác, v.v.) và việc tích hợp một chuỗi khối mới khó đến mức nào?
+- **Khả năng truyền dữ liệu phức tạp hơn –** Liệu một cầu nối có thể cho phép truyền thông điệp và dữ liệu tùy ý phức tạp hơn giữa các chuỗi, hay nó chỉ hỗ trợ chuyển tài sản xuyên chuỗi?
+- **Hiệu quả chi phí –** Việc chuyển tài sản xuyên chuỗi thông qua một cầu nối tốn bao nhiêu chi phí? Thông thường, các cầu nối tính một khoản phí cố định hoặc biến đổi tùy thuộc vào chi phí gas và thanh khoản của các tuyến cụ thể. Việc đánh giá hiệu quả chi phí của một cầu nối dựa trên lượng vốn cần thiết để đảm bảo tính bảo mật của nó cũng là điều rất quan trọng.
+
+Ở mức độ khái quát, các cầu nối có thể được phân loại thành có niềm tin và không cần niềm tin.
+
+- **Có niềm tin –** Các cầu nối có niềm tin được xác minh bởi bên ngoài. Chúng sử dụng một tập hợp trình xác minh bên ngoài (Liên đoàn với đa chữ ký, hệ thống tính toán đa bên, mạng lưới oracle) để gửi dữ liệu giữa các chuỗi. Do đó, chúng có thể cung cấp khả năng kết nối tuyệt vời và cho phép truyền thông điệp tổng quát hoàn toàn giữa các chuỗi. Chúng cũng có xu hướng hoạt động tốt về tốc độ và hiệu quả chi phí. Điều này phải đánh đổi bằng tính bảo mật, vì người dùng phải dựa vào mức độ an toàn của chính cầu nối.
+- **Không cần niềm tin –** Những cầu nối này dựa vào các chuỗi khối mà chúng kết nối và những người xác thực của các chuỗi đó để chuyển thông điệp và token. Chúng được gọi là “không cần niềm tin” vì chúng không thêm các giả định niềm tin mới (ngoài các chuỗi khối). Do đó, các cầu nối không cần niềm tin được xem là an toàn hơn so với các cầu nối có niềm tin.
+
+Để đánh giá các cầu nối không cần niềm tin dựa trên những yếu tố khác, chúng ta phải phân loại chúng thành cầu nối truyền thông điệp tổng quát và mạng lưới thanh khoản.
+
+- **Cầu nối truyền thông điệp tổng quát –** Những cầu nối này nổi trội về mặt bảo mật và khả năng truyền dữ liệu phức tạp hơn giữa các chuỗi. Thông thường, chúng cũng có hiệu quả chi phí tốt. Tuy nhiên, những điểm mạnh này thường phải đánh đổi bằng khả năng kết nối đối với các cầu nối light client (ví dụ: IBC) và hạn chế về tốc độ đối với các cầu nối lạc quan (ví dụ: Nomad) sử dụng bằng chứng gian lận.
+- **Mạng lưới thanh khoản –** Những cầu nối này sử dụng hoán đổi nguyên tử để chuyển tài sản và là các hệ thống được xác minh cục bộ (tức là chúng sử dụng những người xác thực của các chuỗi khối nền tảng để xác minh giao dịch). Do đó, chúng nổi trội về bảo mật và tốc độ. Hơn nữa, chúng được xem là có hiệu quả chi phí tương đối và cung cấp khả năng kết nối tốt. Tuy nhiên, sự đánh đổi lớn nhất là chúng không thể truyền dữ liệu phức tạp hơn – vì chúng không hỗ trợ việc truyền thông điệp xuyên chuỗi.
+
+## Rủi ro với cầu nối {#risk-with-bridges}
+
+Các cầu nối chiếm ba [vụ tấn công lớn nhất trong DeFi](https://rekt.news/leaderboard/) và vẫn đang ở giai đoạn đầu của quá trình phát triển. Việc sử dụng bất kỳ cầu nối nào cũng tiềm ẩn các rủi ro sau:
+
+- **Rủi ro hợp đồng thông minh –** Mặc dù nhiều cầu nối đã vượt qua các cuộc kiểm toán thành công, nhưng chỉ cần một lỗ hổng trong hợp đồng thông minh là tài sản có thể bị phơi bày trước các cuộc tấn công (ví dụ: [Wormhole Bridge của Solana](https://rekt.news/wormhole-rekt/)).
+- **Rủi ro tài chính hệ thống** – Nhiều cầu nối sử dụng tài sản được bọc để đúc ra các phiên bản chuẩn của tài sản gốc trên một chuỗi mới. Điều này khiến hệ sinh thái phải đối mặt với rủi ro hệ thống, như chúng ta đã thấy các phiên bản token được bọc từng bị khai thác.
+- **Rủi ro đối tác –** Một số cầu nối sử dụng thiết kế có niềm tin, yêu cầu người dùng dựa trên giả định rằng những người xác thực sẽ không thông đồng để đánh cắp tiền của người dùng. Việc người dùng phải đặt niềm tin vào các bên thứ ba này khiến họ đối mặt với các rủi ro như rug pull, kiểm duyệt và các hoạt động độc hại khác.
+- **Các vấn đề còn bỏ ngỏ –** Do các cầu nối vẫn đang trong giai đoạn sơ khai của quá trình phát triển, có nhiều câu hỏi chưa có lời giải liên quan đến cách chúng sẽ hoạt động trong các điều kiện thị trường khác nhau, chẳng hạn như khi mạng bị tắc nghẽn hoặc trong những sự kiện bất ngờ như tấn công ở cấp độ mạng hay quay lui trạng thái. Sự không chắc chắn này tạo ra một số rủi ro, mức độ của chúng vẫn chưa được xác định.
+
+## Các dapp có thể sử dụng cầu nối như thế nào? {#how-can-dapps-use-bridges}
+
+Dưới đây là một số ứng dụng thực tiễn mà các nhà phát triển có thể cân nhắc về cầu và việc đưa dapp của họ hoạt động đa chuỗi:
+
+### Tích hợp cầu nối {#integrating-bridges}
+
+Đối với các nhà phát triển, có nhiều cách để thêm hỗ trợ cho các cầu:
+
+1. **Xây dựng cầu nối của riêng bạn –** Xây dựng một cầu nối bảo mật và đáng tin cậy không hề dễ dàng, đặc biệt nếu bạn chọn hướng tối thiểu hóa sự tin cậy. Hơn nữa, điều này đòi hỏi nhiều năm kinh nghiệm và chuyên môn kỹ thuật liên quan đến các nghiên cứu về khả năng mở rộng và khả năng tương tác. Ngoài ra, điều này còn đòi hỏi một đội ngũ trực tiếp vận hành để duy trì cầu nối và thu hút đủ thanh khoản để làm cho nó khả thi.
+
+2. **Hiển thị cho người dùng nhiều tùy chọn cầu nối –** Nhiều [ứng dụng phi tập trung](/developers/docs/dapps/) yêu cầu người dùng phải có token gốc của họ để tương tác. Để người dùng có thể truy cập token của mình, họ cung cấp nhiều tùy chọn cầu nối khác nhau trên trang web của họ. Tuy nhiên, phương pháp này chỉ là giải pháp tạm thời cho vấn đề, vì nó đưa người dùng ra khỏi giao diện của dapp và vẫn yêu cầu họ tương tác với các dapp và cầu nối khác. Đây là một trải nghiệm onboarding rườm rà, với nguy cơ người dùng mắc lỗi cao hơn.
+
+3. **Tích hợp một cầu nối –** Giải pháp này không yêu cầu ứng dụng phi tập trung phải dẫn người dùng đến các giao diện cầu nối và sàn giao dịch phi tập trung bên ngoài. Nó cho phép các ứng dụng phi tập trung cải thiện trải nghiệm onboarding của người dùng. Tuy nhiên, cách tiếp cận này cũng có những hạn chế:
+
+ - Việc đánh giá và duy trì các cầu nối rất khó khăn và tốn thời gian.
+ - Việc chọn một cầu nối duy nhất tạo ra một điểm thất bại và sự phụ thuộc duy nhất.
+ - Ứng dụng phi tập trung bị giới hạn bởi khả năng của cầu nối.
+ - Chỉ sử dụng cầu nối có thể sẽ chưa đủ. Các ứng dụng phi tập trung có thể cần các sàn DEX để cung cấp nhiều chức năng hơn, chẳng hạn như hoán đổi tài sản xuyên chuỗi.
+
+4. **Tích hợp nhiều cầu nối –** Giải pháp này giải quyết nhiều vấn đề liên quan đến việc tích hợp chỉ một cầu nối duy nhất. Tuy nhiên, nó cũng có những hạn chế, vì việc tích hợp nhiều cầu nối tốn nhiều tài nguyên và tạo ra gánh nặng kỹ thuật cùng chi phí truyền thông cho các nhà phát triển — nguồn lực quý giá nhất trong lĩnh vực crypto.
+
+5. **Tích hợp bộ tổng hợp cầu nối –** Một lựa chọn khác cho các ứng dụng phi tập trung là tích hợp giải pháp tổng hợp cầu nối, giúp họ truy cập vào nhiều cầu nối. Các bộ tổng hợp cầu nối kế thừa các điểm mạnh của tất cả các cầu nối và do đó không bị giới hạn bởi khả năng của bất kỳ cầu nối đơn lẻ nào. Đáng chú ý là các bộ tổng hợp cầu nối thường duy trì các tích hợp cầu nối, điều này giúp ứng dụng phi tập trung không phải bận tâm đến việc quản lý các khía cạnh kỹ thuật và vận hành của việc tích hợp cầu nối.
+
+Tuy vậy, các bộ tổng hợp cầu nối cũng có những hạn chế của riêng chúng. Chẳng hạn, mặc dù chúng có thể cung cấp nhiều lựa chọn cầu nối hơn, nhưng trên thị trường thường có nhiều cầu nối khác ngoài những cầu nối được cung cấp trên nền tảng của bộ tổng hợp. Hơn nữa, cũng giống như các cầu nối, các bộ tổng hợp cầu nối cũng phải đối mặt với rủi ro từ hợp đồng thông minh và công nghệ (càng nhiều hợp đồng thông minh = càng nhiều rủi ro).
+
+Nếu một ứng dụng phi tập trung đi theo hướng tích hợp một cầu nối hoặc một bộ tổng hợp, sẽ có những lựa chọn khác nhau tùy thuộc vào mức độ tích hợp được thực hiện sâu đến đâu. Chẳng hạn, nếu chỉ là tích hợp giao diện người dùng để cải thiện trải nghiệm khởi tạo cho người dùng, một ứng dụng phi tập trung sẽ tích hợp tiện ích. Tuy nhiên, nếu việc tích hợp nhằm khám phá các chiến lược xuyên chuỗi sâu hơn như staking, yield farming, v.v., thì ứng dụng phi tập trung sẽ tích hợp SDK hoặc API.
+
+### Triển khai một ứng dụng phi tập trung trên nhiều chuỗi {#deploying-a-dapp-on-multiple-chains}
+
+Để triển khai một ứng dụng phi tập trung trên nhiều chuỗi, các nhà phát triển có thể sử dụng các nền tảng phát triển như [Alchemy](https://www.alchemy.com/), [Hardhat](https://hardhat.org/), [Moralis](https://moralis.io/), v.v. Thông thường, các nền tảng này đi kèm với các plugin có thể kết hợp, cho phép các ứng dụng phi tập trung hoạt động xuyên chuỗi. Chẳng hạn, các nhà phát triển có thể sử dụng proxy triển khai xác định được cung cấp bởi [plugin hardhat-deploy](https://github.com/wighawag/hardhat-deploy).
+
+#### Ví dụ:
+
+- [Cách xây dựng các ứng dụng phi tập trung xuyên chuỗi](https://moralis.io/how-to-build-cross-chain-dapps/)
+- [Xây dựng một Sàn giao dịch NFT Xuyên chuỗi](https://youtu.be/WZWCzsB1xUE)
+- [Moralis: Xây dựng các ứng dụng phi tập trung NFT xuyên chuỗi](https://www.youtube.com/watch?v=ehv70kE1QYo)
+
+### Giám sát hoạt động hợp đồng trên các chuỗi {#monitoring-contract-activity-across-chains}
+
+Để giám sát hoạt động hợp đồng trên nhiều chuỗi, các nhà phát triển có thể sử dụng subgraph và các nền tảng dành cho nhà phát triển như Tenderly để quan sát hợp đồng thông minh theo thời gian thực. Các nền tảng như vậy cũng có các công cụ cung cấp chức năng giám sát dữ liệu nâng cao hơn cho các hoạt động xuyên chuỗi, chẳng hạn như kiểm tra [các sự kiện được hợp đồng phát ra](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events), v.v.
+
+#### Công cụ
+
+- [The Graph](https://thegraph.com/en/)
+- [Tenderly](https://tenderly.co/)
+
+## Đọc thêm {#further-reading}
+
+- [Cầu nối Chuỗi khối](/bridges/) – ethereum.org
+- [Khuôn khổ Rủi ro Cầu nối L2Beat](https://l2beat.com/bridges/summary)
+- [Cầu nối chuỗi khối: Xây dựng mạng lưới của các mạng mã hóa](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) - 8 tháng 9, 2021 – Dmitriy Berenzon
+- [Thế khó ba của khả năng tương tác](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) - 1 tháng 10, 2021 – Arjun Bhuptani
+- [Các cụm: Cách các cầu nối có niềm tin & tối thiểu hóa niềm tin định hình bối cảnh đa chuỗi](https://blog.celestia.org/clusters/) - 4 tháng 10, 2021 – Mustafa Al-Bassam
+- [LI.FI: Với cầu nối, niềm tin là một phổ](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) - 28 tháng 4, 2022 – Arjun Chand
+- [Tình trạng của các giải pháp tương tác Rollup](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) - 20 tháng 6, 2024 – Alex Hook
+- [Tận dụng bảo mật chung cho khả năng tương tác chuỗi chéo an toàn: Lagrange State Committees và hơn thế nữa](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) - 12 tháng 6, 2024 – Emmanuel Awosika
+
+Ngoài ra, dưới đây là một số bài thuyết trình giàu thông tin của [James Prestwich](https://twitter.com/_prestwich) có thể giúp phát triển sự hiểu biết sâu hơn về các cầu nối:
+
+- [Xây dựng cầu nối, không phải những hệ sinh thái khép kín](https://youtu.be/ZQJWMiX4hT0)
+- [Phân tích về cầu nối](https://youtu.be/b0mC-ZqN8Oo)
+- [Tại sao những cầu nối lại bốc cháy](https://youtu.be/c7cm2kd20j8)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/index.md
new file mode 100644
index 00000000000..747e466f2f7
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/index.md
@@ -0,0 +1,92 @@
+---
+title: Cơ chế đồng thuận
+description: Một sự giải thích về các giao thức đồng thuận trong hệ thống phân tán và vai trò của chúng trong Ethereum.
+lang: vi
+---
+
+Thuật ngữ 'cơ chế đồng thuận' thường được dùng để chỉ các giao thức 'Bằng chứng cổ phần', 'Bằng chứng công việc' hoặc 'Bằng chứng quyền hạn'. Tuy nhiên, đây chỉ là các thành phần trong cơ chế đồng thuận giúp bảo vệ chống lại [các cuộc tấn công Sybil](/glossary/#sybil-attack). Cơ chế đồng thuận là toàn bộ tập hợp các ý tưởng, giao thức và cơ chế khuyến khích, cho phép một tập hợp các nút phân tán đồng thuận về trạng thái của chuỗi khối.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước bài [giới thiệu về Ethereum](/developers/docs/intro-to-ethereum/) của chúng tôi.
+
+## Sự đồng thuận là gì? {#what-is-consensus}
+
+Thông qua sự đồng thuận, chúng ta có ý rằng một thoả thuận chung đã đạt được Hãy xem xét một nhóm người đi xem phim. Nếu không có bất đồng về sự lựa chọn bộ phim đã được đề xuất, thì đạt được một sự đồng thuận. Nếu có bất đồng, nhóm buộc phải có cách để quyết định sẽ xem bộ phim nào. Trong những trường hợp cực đoan, nhóm cuối cùng sẽ tách ra.
+
+Đối với chuỗi khối Ethereum, quá trình này được chính thức hoá và việc đạt được sự đồng thuận có nghĩa là ít nhất 66% số nút trên mạng đồng ý về trạng thái toàn cục của mạng.
+
+## Cơ chế đồng thuận là gì? {#what-is-a-consensus-mechanism}
+
+Thuật ngữ cơ chế đồng thuận chỉ toàn bộ tập hợp các giao thức, cơ chế khuyến khích và ý tưởng cho phép một mạng lưới các nút đồng thuận về trạng thái của chuỗi khối.
+
+Ethereum sử dụng cơ chế đồng thuận dựa trên bằng chứng cổ phần (proof-of-stake), trong đó tính bảo mật kinh tế-tiền điện tử được đảm bảo nhờ hệ thống phần thưởng và hình phạt áp dụng cho số vốn mà các staker đã khoá. Cấu trúc khuyến khích này thúc đẩy các staker độc lập vận hành trình xác thực trung thực, trừng phạt những người không như thế và tạo ra chi phí cực kỳ cao để tấn công mạng.
+
+Sau đó, có một giao thức quy định cách các trình xác thực trung thực được chọn để đề xuất hoặc xác thực khối, xử lý giao dịch và bỏ phiếu về quan điểm của họ về khối mới nhất trên chuỗi. Trong một số tình huống hiếm hoi khi nhiều khối ở cùng một vị trí gần đầu chuỗi, có một cơ chế lựa chọn fork chọn các khối tạo nên chuỗi 'nặng nhất', được đo bằng số lượng trình xác thực đã bỏ phiếu cho các khối theo số dư ether đã đặt cọc của họ.
+
+Một số khái niệm quan trọng đối với cơ chế đồng thuận không được định nghĩa rõ ràng trong mã nguồn, chẳng hạn như mức độ bảo mật bổ sung mà việc phối hợp xã hội ngoài hệ thống có thể cung cấp như biện pháp phòng thủ cuối cùng chống lại các cuộc tấn công vào mạng.
+
+Các thành phần này cùng nhau tạo thành cơ chế đồng thuận.
+
+## Các loại cơ chế đồng thuận {#types-of-consensus-mechanisms}
+
+### Dựa trên bằng chứng công việc {#proof-of-work}
+
+Giống như Bitcoin, Ethereum đã từng sử dụng giao thức đồng thuận dựa trên **bằng chứng công việc (PoW)**.
+
+#### Tạo khối {#pow-block-creation}
+
+Các thợ đào cạnh tranh để tạo ra các khối mới chứa các giao dịch đã được xử lý. Người chiến thắng chia sẻ khối mới với phần còn lại của mạng và kiếm được một số ETH mới được đúc. Cuộc đua giành chiến thắng bởi máy tính có thể giải câu đố toán học nhanh nhất. Điều này tạo ra liên kết mật mã giữa khối hiện tại và khối trước đó. Solving this puzzle is the work in "bằng chứng công việc". The canonical chain is then determined by a fork-choice rule that selects the set of blocks that have had the most work done to mine them.
+
+#### Bảo mật {#pow-security}
+
+Mạng lưới được bảo vệ an toàn bởi thực tế rằng bạn cần 51% sức mạnh tính toán của mạng để gian lận trong chuỗi. Điều này sẽ đòi hỏi đầu tư lớn vào thiết bị và năng lượng; bạn có khả năng chi tiêu nhiều hơn số tiền bạn có thể đạt được.
+
+Tìm hiểu thêm về [bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/)
+
+### Dựa trên bằng chứng cổ phần {#proof-of-stake}
+
+Ethereum hiện nay sử dụng một giao thức đồng thuận dựa trên **bằng chứng cổ phần (PoS)**.
+
+#### Tạo khối {#pos-block-creation}
+
+Các trình xác thực tạo ra các khối. Một trình xác thực được chọn ngẫu nhiên trong mỗi vị trí để làm người đề xuất khối. Máy chủ đồng thuận của họ sẽ yêu cầu một gói giao dịch dưới dạng 'tải trọng thực thi' từ máy chủ thực thi được ghép đôi với nó. Họ bao bọc điều này trong dữ liệu đồng thuận để tạo thành một khối, chúng gửi đến các nút khác trên mạng Ethereum. Việc sản xuất khối này được thưởng bằng ETH. Trong một số trường hợp hiếm hoi khi có nhiều khối có thể tồn tại cho một vị trí hoặc các nút nghe về các khối vào các thời điểm khác nhau, thuật toán lựa chọn fork sẽ chọn khối tạo thành chuỗi có trọng số chứng thực lớn nhất (trong đó trọng số là số lượng trình xác thực được chia tỷ lệ theo số dư ETH của họ).
+
+#### Bảo mật {#pos-security}
+
+Hệ thống Bằng chứng cổ phần bảo mật về mặt kinh tế tiền điện tử vì kẻ tấn công cố gắng kiểm soát chuỗi buộc phải hủy một lượng lớn ETH. Hệ thống phần thưởng khuyến khích những staker cá nhân hành xử trung thực và các hình phạt ngăn cản staker có hành vi độc hại.
+
+Tìm hiểu thêm về [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/)
+
+### Hướng dẫn trực quan {#types-of-consensus-video}
+
+Xem thêm về các loại cơ chế đồng thuận khác nhau được sử dụng trên Ethereum:
+
+
+
+### Kháng Sybil & lựa chọn chuỗi {#sybil-chain}
+
+Chỉ riêng Bằng chứng công việc và Bằng chứng cổ phần không phải là các giao thức đồng thuận, nhưng chúng thường được gọi như vậy để đơn giản hoá. Chúng thực ra là các cơ chế chống tấn công mạo nhận và lựa chọn người tạo khối; chúng là phương thức để quyết định ai là tác giả của khối mới nhất. Một thành phần quan trọng khác là thuật toán chọn chuỗi (còn gọi là fork choice), cho phép các nút mạng chọn một khối đúng duy nhất ở đầu chuỗi trong những tình huống có nhiều khối tồn tại ở cùng vị trí.
+
+**Kháng Sybil** đo lường cách một giao thức chống lại một cuộc tấn công Sybil. Khả năng chống lại loại tấn công này là điều cần thiết đối với một chuỗi khối phi tập trung và cho phép các thợ đào và trình xác thực được thưởng công bằng dựa trên tài nguyên họ đóng góp. Bằng chứng công việc và Bằng chứng cổ phần bảo vệ chống lại điều này bằng cách buộc người dùng tiêu tốn nhiều năng lượng hoặc đưa ra nhiều tài sản thế chấp. Những biện pháp bảo vệ này là một biện pháp răn đe kinh tế chống lại các cuộc tấn công mạo nhận.
+
+Một **quy tắc lựa chọn chuỗi** được sử dụng để quyết định chuỗi nào là chuỗi "chính xác". Bitcoin sử dụng quy tắc "chuỗi dài nhất", nghĩa là bất cứ chuỗi khối nào dài nhất sẽ là chuỗi được các nút còn lại công nhận là hợp lệ và làm việc cùng. Đối với các chuỗi Bằng chứng công việc, chuỗi dài nhất được xác định dựa trên tổng độ khó tích luỹ của bằng chứng công việc của chuỗi đó. Trước đây, Ethereum cũng đã từng sử dụng quy tắc chuỗi dài nhất; tuy nhiên, hiện nay Ethereum chạy trên cơ chế bằng chứng cổ phần nên đã áp dụng một thuật toán fork-choice cập nhật, đo 'trọng số' của chuỗi. Trọng số là tổng tích luỹ các phiếu bầu của các trình xác thực, được tính trọng số bởi số dư ether đã được trình xác thực đặt cọc.
+
+Ethereum sử dụng một cơ chế đồng thuận được gọi là [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) kết hợp [bằng chứng cổ phần Casper FFG](https://arxiv.org/abs/1710.09437) với [quy tắc lựa chọn phân nhánh GHOST](https://arxiv.org/abs/2003.03052).
+
+## Đọc thêm {#further-reading}
+
+- [Thuật toán đồng thuận chuỗi khối là gì?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm)
+- [Sự đồng thuận của Nakamoto là gì? Hướng dẫn Toàn diện cho Người mới bắt đầu](https://blockonomi.com/nakamoto-consensus/)
+- [Casper hoạt động như thế nào?](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d)
+- [Về tính bảo mật và hiệu năng của các chuỗi khối bằng chứng công việc](https://eprint.iacr.org/2016/555.pdf)
+- [Lỗi Byzantine](https://en.wikipedia.org/wiki/Byzantine_fault)
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/)
+- [Khai thác](/developers/docs/consensus-mechanisms/pow/mining/)
+- [Bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/)
+- [Bằng chứng ủy quyền](/developers/docs/consensus-mechanisms/poa/)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/poa/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/poa/index.md
new file mode 100644
index 00000000000..79abefad5b8
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/poa/index.md
@@ -0,0 +1,80 @@
+---
+title: Bằng chứng uỷ quyền (PoA)
+description: Giải thích về giao thức đồng thuận bằng chứng uỷ quyền và vai trò của nó trong hệ sinh thái chuỗi khối.
+lang: vi
+---
+
+**Bằng chứng uỷ quyền (PoA)** là một thuật toán đồng thuận dựa trên danh tiếng, là một phiên bản sửa đổi của [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/). Nó chủ yếu được sử dụng bởi các chuỗi riêng tư, mạng thử nghiệm và các mạng phát triển cục bộ. PoA là một thuật toán đồng thuận dựa trên danh tiếng yêu cầu sự tin tưởng vào một nhóm người ký được uỷ quyền để tạo ra các khối, thay vì một cơ chế dựa trên cổ phần trong PoS.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [các giao dịch](/developers/docs/transactions/), [các khối](/developers/docs/blocks/) và [các cơ chế đồng thuận](/developers/docs/consensus-mechanisms/).
+
+## Bằng chứng uỷ quyền (PoA) là gì? {#what-is-poa}
+
+Bằng chứng uỷ quyền là một phiên bản sửa đổi của **[bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/) (PoS)**, là một thuật toán đồng thuận dựa trên danh tiếng thay vì cơ chế dựa trên cổ phần trong PoS. Thuật ngữ này được Gavin Wood giới thiệu lần đầu tiên vào năm 2017, và thuật toán đồng thuận này chủ yếu được sử dụng bởi các chuỗi riêng tư, mạng thử nghiệm và các mạng phát triển cục bộ, vì nó khắc phục được nhu cầu về tài nguyên chất lượng cao như PoW, và khắc phục các vấn đề về khả năng mở rộng với PoS bằng cách có một tập hợp con nhỏ các nút lưu trữ chuỗi khối và tạo ra các khối.
+
+Bằng chứng uỷ quyền yêu cầu sự tin tưởng vào một nhóm người ký được uỷ quyền đã được thiết lập trong [khối nguyên thủy](/glossary/#genesis-block). Trong hầu hết các triển khai hiện tại, tất cả những người ký được uỷ quyền đều có quyền lực và đặc quyền như nhau khi xác định sự đồng thuận của chuỗi. Ý tưởng đằng sau việc đặt cược danh tiếng là mọi người xác thực được uỷ quyền đều được mọi người biết đến rộng rãi thông qua những thứ như nhận biết khách hàng của bạn (KYC), hoặc bằng cách có một tổ chức nổi tiếng là người xác thực duy nhất — bằng cách này, nếu một người xác thực làm bất cứ điều gì sai trái, danh tính của họ sẽ được biết đến.
+
+Có nhiều cách triển khai PoA, nhưng cách triển khai tiêu chuẩn của Ethereum là **clique**, triển khai [EIP-225](https://eips.ethereum.org/EIPS/eip-225). Clique thân thiện với nhà phát triển và là một tiêu chuẩn dễ triển khai, hỗ trợ tất cả các loại đồng bộ hóa máy khách. Các triển khai khác bao gồm [IBFT 2.0](https://besu.hyperledger.org/private-networks/concepts/poa) và [Aura](https://openethereum.github.io/Chain-specification).
+
+## Cách thức hoạt động {#how-it-works}
+
+Trong PoA, một nhóm người ký được uỷ quyền được chọn để tạo ra các khối mới. Những người ký được chọn dựa trên danh tiếng của họ, và họ là những người duy nhất được phép tạo ra các khối mới. Những người ký được chọn theo kiểu xoay vòng, và mỗi người ký được phép tạo một khối trong một khung thời gian cụ thể. Thời gian tạo khối là cố định, và những người ký được yêu cầu tạo một khối trong khung thời gian đó.
+
+Danh tiếng trong bối cảnh này không phải là một thứ có thể định lượng được mà là danh tiếng của các tập đoàn nổi tiếng như Microsoft và Google, do đó cách chọn những người ký đáng tin cậy không phải là thuật toán mà là hành động _tin tưởng_ bình thường của con người, trong đó một thực thể, ví dụ như Microsoft, tạo ra một mạng PoA riêng tư giữa hàng trăm hoặc hàng nghìn công ty khởi nghiệp và tự đóng vai trò là người ký đáng tin cậy duy nhất với khả năng thêm những người ký nổi tiếng khác như Google trong tương lai, các công ty khởi nghiệp chắc chắn sẽ tin tưởng Microsoft sẽ luôn hành động một cách trung thực và sử dụng mạng. Điều này giải quyết nhu cầu đặt cược vào các mạng nhỏ/riêng tư khác nhau được xây dựng cho các mục đích khác nhau để giữ cho chúng phi tập trung và hoạt động, cùng với nhu cầu về thợ đào, vốn tiêu tốn rất nhiều năng lượng và tài nguyên. Một số mạng riêng tư sử dụng tiêu chuẩn PoA như VeChain, và một số sửa đổi nó như Binance sử dụng [PoSA](https://academy.binance.com/en/glossary/proof-of-staked-authority-posa) là phiên bản tùy chỉnh sửa đổi của PoA và PoS.
+
+Quy trình bỏ phiếu được thực hiện bởi chính những người ký. Mỗi người ký bỏ phiếu cho việc thêm hoặc xóa một người ký trong khối của họ khi họ tạo một khối mới. Các phiếu bầu được các nút kiểm đếm, và những người ký được thêm vào hoặc xóa đi dựa trên các phiếu bầu đạt đến một ngưỡng nhất định `SIGNER_LIMIT`.
+
+Có thể có trường hợp xảy ra các phân nhánh nhỏ, độ khó của một khối phụ thuộc vào việc khối đó được ký theo lượt hay không theo lượt. Các khối “theo lượt” có độ khó 2 và các khối “không theo lượt” có độ khó 1. Trong trường hợp các phân nhánh nhỏ, chuỗi có hầu hết những người ký niêm phong các khối “theo lượt” sẽ tích lũy được độ khó cao nhất và chiến thắng.
+
+## Các vectơ tấn công {#attack-vectors}
+
+### Những người ký độc hại {#malicious-signers}
+
+Một người dùng độc hại có thể được thêm vào danh sách những người ký, hoặc một khóa/máy ký có thể bị xâm phạm. Trong kịch bản như vậy, giao thức cần có khả năng tự bảo vệ mình trước các cuộc tái tổ chức và gửi thư rác. Giải pháp được đề xuất là với một danh sách gồm N người ký được uỷ quyền, bất kỳ người ký nào cũng chỉ có thể đúc 1 khối trong mỗi K khối. Điều này đảm bảo rằng thiệt hại bị hạn chế, và phần còn lại của những người xác thực có thể bỏ phiếu loại bỏ người dùng độc hại.
+
+### Kiểm duyệt {#censorship-attack}
+
+Một vectơ tấn công thú vị khác là nếu một người ký (hoặc một nhóm người ký) cố gắng kiểm duyệt các khối bỏ phiếu loại bỏ họ khỏi danh sách uỷ quyền. Để giải quyết vấn đề này, tần suất đúc được phép của người ký bị giới hạn ở mức 1 trên N/2. Điều này đảm bảo rằng những người ký độc hại cần kiểm soát ít nhất 51% tài khoản ký, tại thời điểm đó họ sẽ thực sự trở thành nguồn sự thật mới cho chuỗi.
+
+### Thư rác {#spam-attack}
+
+Một vectơ tấn công nhỏ khác là những người ký độc hại chèn các đề xuất bỏ phiếu mới vào bên trong mọi khối mà họ đúc. Vì các nút cần kiểm đếm tất cả các phiếu bầu để tạo danh sách thực tế những người ký được uỷ quyền, chúng phải ghi lại tất cả các phiếu bầu theo thời gian. Nếu không đặt giới hạn cho cửa sổ bỏ phiếu, danh sách này có thể tăng chậm nhưng không có giới hạn. Giải pháp là đặt một cửa sổ _di động_ gồm W khối, sau đó các phiếu bầu được coi là đã cũ. _Một cửa sổ hợp lý có thể là 1-2 kỷ nguyên._
+
+### Các khối đồng thời {#concurrent-blocks}
+
+Trong mạng PoA, khi có N người ký được uỷ quyền, mỗi người ký được phép đúc 1 khối trong số K khối, điều đó có nghĩa là N-K+1 người xác thực được phép đúc tại bất kỳ thời điểm nào. Để ngăn những người xác thực này chạy đua tạo khối, mỗi người ký nên thêm một "độ lệch" ngẫu nhiên nhỏ vào thời điểm phát hành một khối mới. Mặc dù quá trình này đảm bảo rằng các phân nhánh nhỏ là rất hiếm, các phân nhánh không thường xuyên vẫn có thể xảy ra, giống như mạng chính. Nếu một người ký bị phát hiện lạm dụng quyền lực và gây ra sự hỗn loạn, những người ký khác có thể bỏ phiếu loại bỏ họ.
+
+Ví dụ: nếu có 10 người ký được uỷ quyền và mỗi người ký được phép tạo 1 khối trong số 20, thì tại bất kỳ thời điểm nào, 11 người xác thực có thể tạo khối. Để ngăn họ chạy đua tạo khối, mỗi người ký thêm một "độ lệch" ngẫu nhiên nhỏ vào thời điểm họ phát hành một khối mới. Điều này làm giảm sự xuất hiện của các phân nhánh nhỏ nhưng vẫn cho phép các phân nhánh không thường xuyên, như đã thấy trên Mạng chính Ethereum. Nếu một người ký lạm dụng quyền hạn của họ và gây ra gián đoạn, họ có thể bị bỏ phiếu loại khỏi mạng.
+
+## Ưu và nhược điểm {#pros-and-cons}
+
+| Ưu điểm | Nhược điểm |
+| --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Có khả năng mở rộng hơn các cơ chế phổ biến khác như PoS và PoW, vì nó dựa trên một số lượng giới hạn những người ký khối. | Các mạng PoA thường có một số lượng tương đối nhỏ các nút xác thực. Điều này làm cho mạng PoA trở nên tập trung hơn. |
+| Chuỗi khối PoA có chi phí vận hành và bảo trì cực kỳ rẻ. | Việc trở thành một người ký được uỷ quyền thường nằm ngoài tầm với của một người bình thường, vì chuỗi khối yêu cầu các thực thể có danh tiếng đã được xác lập. |
+| Các giao dịch được xác nhận rất nhanh vì có thể đạt dưới 1 giây vì chỉ cần một số lượng người ký giới hạn để xác thực các khối mới. | Những người ký độc hại có thể tái tổ chức, chi tiêu gấp đôi, kiểm duyệt các giao dịch trong mạng, những cuộc tấn công đó được giảm thiểu nhưng vẫn có thể xảy ra. |
+
+## Đọc thêm {#further-reading}
+
+- [EIP-225](https://eips.ethereum.org/EIPS/eip-225) _Tiêu chuẩn Clique_
+- [Nghiên cứu về Bằng chứng uỷ quyền](https://github.com/cryptoeconomics-study/website/blob/master/docs/sync/2.4-lecture.md) _Cryptoeconomics_
+- [Bằng chứng uỷ quyền là gì](https://forum.openzeppelin.com/t/proof-of-authority/3577) _OpenZeppelin_
+- [Giải thích về Bằng chứng uỷ quyền](https://academy.binance.com/en/articles/proof-of-authority-explained) _binance_
+- [PoA trong chuỗi khối](https://medium.com/techskill-brew/proof-of-authority-or-poa-in-blockchain-part-11-blockchain-series-be15b3321cba)
+- [Giải thích về Clique](https://medium.com/@Destiner/clique-cross-client-proof-of-authority-algorithm-for-ethereum-8b2a135201d)
+- [PoA không dùng nữa, đặc tả Aura](https://openethereum.github.io/Chain-specification)
+- [IBFT 2.0, một triển khai PoA khác](https://besu.hyperledger.org/private-networks/concepts/poa)
+
+### Tìm hiểu thêm từ video trực quan? Người học qua hình ảnh {#visual-learner}
+
+Xem giải thích trực quan về bằng chứng uỷ quyền:
+
+
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/)
+- [Bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/)
+
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md
new file mode 100644
index 00000000000..972f372fb37
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md
@@ -0,0 +1,167 @@
+---
+title: Tấn công Bằng chứng cổ phần của Ethereum và ngăn chặn
+description: Tìm hiểu về các hướng tấn công lên Bằng chứng cổ phần của Ethereum và cách mà chúng được ngăn chặn.
+lang: vi
+---
+
+Những kẻ trộm và phá hoại liên tục tìm kiếm các cơ hội để tấn công các ứng dụng khách của Ethereum. Trang này vạch ra các hướng tấn công đã được nhận diện vào lớp đồng thuận của Ethereum và cách các cuộc tấn công này được ngăn chặn. Thông tin trên trang này được tiếp nhận từ một [phiên bản dài hơn](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs).
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Một số kiến thức cơ bản về [Bằng chứng cổ phần] (/developers/docs/consensus-mechanisms/pos/) cần biết. Ngoài ra, sẽ hữu ích khi có hiểu biết cơ bản về [lớp khuyến khích] của Ethereum (/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) và thuật toán chọn nhánh, [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper).
+
+## Những kẻ tấn công muốn gì? {#what-do-attackers-want}
+
+Một lầm tưởng thường thấy là những kẻ tấn công trót lọt có thể tạo thêm ether, hoặc bòn rút ether từ các tài khoản tùy ý. Cả hai đều không thể xảy ra bởi tất cả các giao dịch đều được thực thi bởi tất cả những trình thực thi trên mạng lưới. Chúng phải đáp ứng các điều kiện hợp lệ cơ bản (ví dụ: các giao dịch được ký bằng khóa riêng tư của người gửi, người gửi có đủ số dư, v.v.), nếu không chúng sẽ bị đảo ngược. Có ba loại kết quả mà kẻ tấn công có thể thực sự hướng tới: tái tổ chức, gấp đôi tính kết luận cuối cùng hoặc trì hoãn tính kết luận cuối cùng.
+
+**“Tái tổ chức”** là sắp xếp lại các khối theo một trật tự mới, có thể là thêm hoặc bớt các khối của chuỗi chính tắc. Một hoạt động tái tổ chức gây hại có thể đảm bảo các khối nhất định được bao gồm hoặc bị loại bỏ, cho phép thực hiện chi tiêu gấp đôi hoặc bòn rút giá trị bằng cách chậy trước hoặc sau giao dịch để trục lợi (giá trị bòn rút tối đa). Tái tổ chức cũng có thể được dùng để ngăn chặn các giao dịch nhất định, không cho chúng được thêm vào chuỗi chính tắc - một hình thức che đậy thông tin. Dạng nguy hiểm nhất của tái tổ chức chính là “đảo ngược tính kết luận cuối cùng”, làm cho các khối bị loại bỏ hoặc thay thế mặc dù trước đó đã được hoàn thành. Việc này chỉ xảy ra khi có hơn ⅓ tổng số ether được ký gửi bị tiêu hủy bởi kẻ tấn công - việc đảm bảo này được gọi là “kinh tế tính kết luận cuối cùng” - sẽ được giải thích ở phần sau.
+
+**Gấp đôi tính kết luận cuối cùng** dù khó xảy ra nhưng là một trình trạng nghiêm trọng mà trong đó hai bản nhánh có thể cùng hoàn thành cùng lúc, làm cho chuỗi bị chia rẽ vĩnh viễn. Về mặt lý thuyết thì nó có thể xảy ra khi kẻ tấn công sẵn sàng mạo hiểm với 34% số ether được ký gửi. Cộng đồng sẽ buộc phải hợp tác ngoài chuỗi và kết luật xem sẽ theo đuổi chuỗi nào, lúc đó sẽ cần đến sức mạnh của lớp xã hội.
+
+Cuộc tấn công **trì hoãn tính kết luận cuối cùng** ngăn cản mạng lưới đạt đủ các điều kiện cần thiết để hoàn thành các phần của chuỗi. Nếu không có tính kết luận cuối cùng, rất khó để tin tưởng các ứng dụng tài chính được xây dụng trên Ethereum. Mục tiêu của cuộc tấn công trì hoãn quá tính kết luận cuối cùng thường đơn giản là để làm gián đoạn Ethereum hơn là để kiếm lợi nhuận trực tiếp, trừ khi kẻ tất công đặt sẵn những vị thế bán chiến lược.
+
+Một cuộc tất công vào lớp xã hội có thể nhắm đến việc làm suy yếu niềm tin cộng đồng với Ethereum, làm ether mất giá trị, giảm sự chấp thuận hoặc để làm yếu đi cộng đồng Ethereum nhằm khiến sự phối hợp ngoại tuyến trở nên khó khăn hơn.
+
+Với lý do tạo ra những thế lực thù địch có thể tấn công Ethereum, những phần sau sẽ phân tích _làm thế nào_ chúng có thể tiến hành.
+
+## Các phương thức Tấn công {#methods-of-attack}
+
+### Các cuộc tấn công Lớp 0 {#layer-0}
+
+Đầu tiên, các cá nhân không tích cực tham gia trong Ethereum (bằng cách chạy phần mềm ứng dụng) có thể tấn ông bằng cách nhắm đến lớp xã hội (lớp 0). Lớp 0 là nền tảng mà Ethereum được xây dựng trên nó và cũng như rằng bề mặt chịu rủi ro cho các cuộc tấn công đồng thuận có thể lan tỏa ra khác các lớp khác. Một số ví dụ bao gồm:
+
+- Một chiến dịch tuyên truyền tin giả / sai sự thật nhằm xói mòn niềm tin của cộng đồng dành cho lộ trình Ethereum, các nhà phát triển, ứng dụng,... Điều này có thể giảm lượng người sẵn lòng tham gia vào bảo mật mạng lưới, làm giảm sự phi tập trung và an ninh "kinh tế-mật mã học".
+
+- Các cuộc tấn công có chủ đích và/ hoặc hành vi đe dọa với cộng đồng người phát triển. Điều này có thể dẫn đến việc các nhà phát triển tự nguyện rời bỏ và giảm tiến trình của Ethereum.
+
+- Những quy định quá vô lý cũng có thể được cân nhắc là một cuộc tấn công lớp 0, bởi vì chúng nhanh chóng làm giảm động lực để tham gia và sử dụng rộng rãi.
+
+- Sự xâm nhập của các cá nhân tài giỏi nhưng có ác ý với cộng đồng nhà phát triển những người này sẽ nhắm tới việc làm chậm tiến trình bằng cách đánh lạc hướng các cuộc thảo luận, trì hoãn quyết định hoặc Spam,...
+
+- Tham nhũng là chìa khóa chính tác động đến quyết định trong hệ sinh thái Ethereum.
+
+Điều kiến cho các cuộc tấn công này đặc biệt nguy hiểm đó là nhiều trường hợp không cần đòi hỏi quá nhiều tài chính hoặc hiểu biết về kĩ thuật. Một cuộc tấn công lớp 0 có thể làm khuếch đại cuộc tấn công "kinh tế-mật mã học". Ví dụ, nếu tập hợp những người Stake ác ý được phép kiểm duyệt hoặc đảo ngược quyết định cuối cùng, thì việc làm suy yếu lớp xã hội có thể khiến khó hơn để điều phối cộng đồng bằng các kênh không chính thức.
+
+Phòng thủ với những cuộc tấn công lớp 0 không bao giờ là đơn giản, nhưng vẫn có thể thiết lập những nguyên tắc cơ bản. Một là duy trì tỉ lệ "nhiễu tín hiệu" đối với thông tin về Ethereum, tạo và lan truyền trong cộng đồng bằng những thành viên trung thực qua Blog, kênh Discord, nhãn dán dữ liệu, sách, Podcast và Youtube. Đây là cách tại ethereum.org chúng tôi cố gắng giữ những thông tin chính xác nhất và dịch nó ra nhiều ngôn ngữ nhất có thể. Phủ sóng không gian bằng thông chất lượng cao và memes là một cách tốt để phòng thủ trước thông tin sai lệch.
+
+Một biện pháp phòng thủ quan trọng khác trước các cuộc tấn công vào lớp xã hội là có những sứ mệnh rõ ràng và giao thức quản trị. Ethereum đã tự mình là nền tảng dẫn đầu về phi tập trung và bảo mật trong những hợp đồng thông minh lớp 1, đồng thời cung đề cao khả năng mở rộng và tính bền vững. Bất kể những bất đồng nào trong cộng đồng Ethereum, các nguyên tắc cốt lõi này luôn bị ảnh hưởng ở mức tối thiểu. Thẩm định một lập luận dựa trên các nguyên tắc cốt lõi và qua nhiều vòng rà soát trong quy trình EIP (đề xuất cải thiện Ethereum), có thể giúp cộng đồng nhận diện được ai là người tốt và xấu và giới hạn khả năng người xấu làm hại đến tương lai của Ethereum.
+
+Cuối cùng, điều tối quan trọng là cộng đồng Ethereum phải cở mở và chào đón tất cả người tham gia. Một cộng đồng không cởi mở, có sự phân biệt và thiên vị những cá nhân đặt biệt thì sẽ rất mỏng manh trước những cuộc tấn công vì có thể tạo ra câu chuyện để chia rẽ "bè phái". Chủ nghĩa bè phái và chủ nghĩa cực đoạn gây tổn hại cho cộng đồng và làm xói mòn bảo mật lớp 0. Những người thuộc cộng đồng Ethereum (Ethereans) có hứng thú với việc bảo vệ tính an toàn của mạng lưới nên coi hành vi của họ trên mạng và đời thực là đóng góp trực tiếp vào tính bảo mật của lớp 0 Ethereum.
+
+### Tấn công giao thức {#attacking-the-protocol}
+
+Bất kì ai cũng có thể chạy phần mềm Client Ethereum. Để có thể thêm nốt xác thực vào Client, người dùng cần phải đặt cược (Stake) 32 Ether vào trong một hợp đồng kí quỹ. Nút xác thực cho phép người dùng tham gia tích cực vào việc bảo mật mạng lưới Ethereum bằng cách đề xuất và xác nhận các khối mới. Người vận hành nút lúc này có tiếng nói để tác động đến nội dung tương lai của chuỗi khối – họ có thể làm điều đó một cách trung thực và gia tăng số Ether tích lũy thông qua phần thưởng, hoặc họ có thể tìm cách thao túng quy trình vì lợi ích riêng, đồng thời đối mặt với rủi ro mất phần Stake của mình. Một cách để tiến hành cuộc tấn công là tích lũy tỷ lệ Stake cao hơn trong tổng số ETH Stake trên mạng lưới và sử dụng chúng để bỏ phiếu áp đảo những nút xác thực trung thực. Tỷ lệ Stake mà kẻ tấn công kiểm soát càng lớn thì quyền biểu quyết của họ càng mạnh, đặc biệt tại một số mốc kinh tế mà chúng ta sẽ tìm hiểu sau. Tuy nhiên, hầu hết kẻ tấn công sẽ không thể tích lũy đủ lượng Ether để tấn công theo cách này, nên thay vào đó họ phải dùng những kỹ thuật tinh vi nhằm thao túng đa số thành viên trung thực hành động theo một hướng nhất định.
+
+Về cơ bản, tất cả các cuộc tấn công với số stake nhỏ đều là những biến thể của hai dạng hành vi độc hại từ nút xác thực: hoạt động ít (không thực hiện việc xác nhận/đề xuất hoặc thực hiện trễ) hoặc hoạt động quá mức (đề xuất/xác nhận quá nhiều lần trong một Slot). Ở dạng đơn giản nhất, những hành vi này có thể dễ dàng được xử lý bởi thuật toán chọn nhánh (Fork-Choice) và lớp khuyến khích (khuyến khích hành động đúng bằng thưởng), nhưng vẫn tồn tại những cách tinh vi để lợi dụng hệ thống nhằm đem lại lợi thế cho kẻ tấn công.
+
+### Tấn công sử dụng một lượng nhỏ ETH {#attacks-by-small-stakeholders}
+
+#### tái tổ chức chuỗi (Reorgs) {#reorgs}
+
+Một vài bài nghiên cứu đã giải thích các cuộc tấn công vào Ethereum có thể tạo ra một cuộc tái tổ chức chuỗi hoặc trì hoãn việc chốt cuối cùng với chỉ một tỷ lệ nhỏ tổng lượng Stake Ether trên mạng. Những cuộc tấn công này thường dựa vào việc kẻ tấn công giữ lại một số thông tin khỏi các nút xác thực khác rồi tung ra nó theo một cách tinh vi và/hoặc vào thời điểm thuận lợi. Chúng thường nhằm mục tiêu loại bỏ một hoặc một số khối trung thực khỏi chuỗi hợp lệ (Canonical Chain). [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) đã chỉ ra cách một nút xác thực tấn công có thể tạo và xác nhận một block (B) cho một slot cụ thể `n+1` nhưng lại không truyền nó cho các nút khác trong mạng. Thay vào đó, chúng giữ những khối đã được xác thực đó cho đến Slot `n+2`. Một nút trung thực đề xuất khối (`C`) cho Slot `n+2`. Gần như đồng thời, kẻ tấn công có thể phát hành khối (`B`) mà họ đã giữ lại cùng với sự chứng thực cho nó, và họ cũng bỏ phiếu xác nhận rằng `B` là đầu chuỗi với chuỗi các phiếu bầu cho Slot `n+2`, điều này từ chối hoàn toàn sự tồn tại của khối `C`. Khi khối `D` hợp lệ được phát hành, thuật toán chọn nhánh (Fork Choice) sẽ thấy `D` được xây dựng trên `B` có "trọng số" lớn hơn `D` xây trên `C`. Do đó kẻ tấn công đã thành công loại bỏ khối `C` hợp lệ ở Slot `n+2` khỏi chuỗi chuẩn bằng các sử dụng một cuộc tái tổ chức với độ dài 1 khối. [Một cuộc tấn công 34%](https://www.youtube.com/watch?v=6vzXwwk12ZE) cổ phần (Stake) có cơ hội rất cao để thành công, như được giải thích [trong ghi chú này](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair). Về mặt lý thuyết, mặc dù cuộc tấn công này có thể sử dụng ít cổ phần (Stake) hơn. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) miêu tả cuộc tấn công này có thể khả thi với 30% cổ phần, tuy nhiên đã được chứng minh rằng chỉ cần [2% tổng cổ phần](https://arxiv.org/pdf/2009.04987.pdf) và thậm chí có thể sử dụng [một nút xác thực](https://arxiv.org/abs/2110.10086#) bằng cách sử dụng các kỹ thuật cân bằng mà chúng ta sẽ xem xét trong phần tiếp theo.
+
+
+
+Một sơ đồ khái niệm của cuộc tấn công tái tổ chức một block (One-Block Reorg Attack) được mô tả ở trên (được điều chỉnh từ https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair)
+
+→ Một cuộc tấn công tinh vi hơn có thể chia tập hợp các nút trung thực thành những nhóm riêng biệt quan sát thấy đầu chuỗi khác nhau. Đây được gọi là **cuộc tấn công cân bằng**. Những kẻ tấn công chờ cơ hội để đề xuất khối và khi cơ hội đến và họ đề xuất hai khối cùng lúc một cách mập mờ. Họ gửi một khối cho một nữa nút trung thực và gửi khối kia cho nữa còn lại. Hành vi mập mờ sẽ bị thuật toán chọn nhánh phát hiện và người đề xuất khối sẽ bị cắt quỹ (Slashed) và loại khỏi mạng lưới, nhưng hai khối vẫn sẽ tồn tại và mỗi khói có khoảng một nữa tập nút xác thực xác nhận cho từng nhánh. Trong khi đó, những nút xác thực độc hại còn lại giữ sự chứng thực của mình. Sau đó, bằng cách có chọn lọc phát hành sự chứng thực ủng hộ một nhánh theo ý muốn để vừa đủ nút xác thực ngay khi thuật toán chọn nhánh thực thi, họ sẽ làm lệch cán cân ủng hộ về phía một nhánh mà họ muốn. Điều này có thể tiếp diễn mãi mãi, khi các nút xác thực tấn công duy trì việc chia rẽ các nút xác thực trên hai nhánh. Vì không có nhánh nào đạt được tỉ lệ 2/3 mạng lưới không thể chốt cuối cùng.
+
+**Tấn công Bounching** cũng tương tự. Các phiếu bầu được giữ lại bởi những nút tấn công. Thay vì phát hành phiếu bầu để duy trì việc cân bằng giữa hai nhánh, họ sử dụng phiếu bầu ở điểm thuận lợi để sử dụng các phiếu bầu của mình nhằm chứng thực ở các điểm kiểm soát sai cho chúng luân phiên giữa nhánh A và nhánh B. Việc chuyển qua lại chứng thực giữa hai nhánh này ngăn việc hình thành một cặp chứng thực liên tiếp để có thể chốt bất kì nhánh nào, khiến quá trình chốt cuối cùng bị trì hoãn.
+
+
+
+Cả tấn công Bouncing và cân bằng đều dựa trên việc kẻ tấn công có thể kiểm soát chính xác thời gian truyền thông điệp trên mạng lưới, đều mà khó làm được. Tuy nhiên, cơ chế ngăn ngừa đã được tích hợp vào giao thức dưới dạng tăng sức ảnh hưởng cho các thông điệp được gửi kịp thời so với các thông điệp chậm trễ. Đây còn biết đến là giải pháp [tăng sức ảnh hưởng cho đề xuất](https://github.com/ethereum/consensus-specs/pull/2730). Để chống lại tấn công Bouncing giao thức chọn nhánh đã được cập nhật sao cho điểm kiểm soát được chứng thực chỉ có thể được chuyển sang chuỗi thay thế trong vòng [1/3 thời gian Slot ở mỗi Slot](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114). Điều kiện này ngăn kẻ tấn công lưu trữ phiếu bầu trì hoãn lâu hơn - thuật toán chọn nhánh chỉ đơn giản là tuân thủ việc điểm kiểm soát mà nó đã chọn trong 1/3 chu kỳ đầu tiên, khoảng thời gian mà hầu hết các nút trung thực bỏ phiếu.
+
+Kết hợp lại, những giải pháp này tạo ra một tình huống mà trong đó một khối đề xuất lan tỏa rất nhanh ngay khi Slot bắt đầu, sau đó có một khoảng thời gian ~1/3 Slot (4 giây) trong đó khối mới này có thể khiến thuật toán chọn nhánh chuyển sang chuỗi khác. Sau mốc thời gian đó, những sự chứng thực đến từ những nút chậm sẽ bị giảm sức ảnh hưởng so với sự chứng thực đã đến sớm hơn. Điều này tạo lợi thế cho những người đề xuất và nút xác thực trong việc xác định đầu là đầu chuỗi và làm giảm đáng kể khả năng tấn công cân bằng hoặc Bouncing thành công.
+
+Cần lưu ý rằng việc tăng cường cho người đề xuất (proposer boosting) chỉ bảo vệ chống lại “các cuộc tái tổ chức rẻ tiền”, tức là những cuộc tấn công do kẻ tấn công có cổ phần nhỏ thực hiện. Thực tế, chính cơ chế "tăng ảnh hưởng cho người đề xuất" cũng có thể cổ đông lớn lợi dụng. Tác giả của [bài đăng này](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127) đã miêu tả cách mà những kẻ tấn công với 7% cổ phần có thể triển khai phiếu bầu một cách có chiến lượt để lừa nút trung thực xây trên nhánh của họ, tái thiết lập nhánh và loại bỏ khối hợp lệ. Cuộc tấn công này được đưa ra dựa trên giã định điều kiện đồ trễ lý tưởng, vốn rất hiếm khi xảy ra. Xác suất thành công của kẻ tấn công vẫn rất thấp, và việc nắm giữ nhiều cổ phần cũng đồng nghĩa với rủi ro vốn lớn hơn, tạo ra răn đe về kinh tế để không tấn công.
+
+Một [cuộc tấn công cân bằng nhắm vào luật LMD](https://ethresear.ch/t/balancing-attack-lmd-edition/11853) được đề xuất và được cho là khả thi ngay khi có cả cơ chế tăng ảnh hưởng người đề xuất. Một kẻ tấn công tạo ra hai chuỗi cạnh tranh bằng cách đưa ra hai khối mập mờ và phát tán mỗi khối cho nữa mạng lưới, thiết lập sự cân bằng giữa các nhánh. Sau đó, các nút thông đồng cùng nhau bỏ phiếu một các mập mờ, canh cho thời điểm mà một nữa mạng nhận phiếu của nhánh `A` trước, nữa còn lại nhận phiếu cho nhánh `B` trước. Vì quy tắc LMD loại bỏ chứng thực thứ hai chỉ giữ những chứng thực đầu tiên của mỗi nút xác thực, nên một nữa mạng sẽ nhìn thấy phiếu cho `A` và một nữa sẽ nhìn thấy phiếu `B` và không có `A`. Tác giả cho rằng quy tắc LMD đã trao cho kẻ tấn công một "quyền lực đáng kể" để tạo cuộc tấn công cân bằng.
+
+Kiểu tấn công LMD này được ngăn bằng cách [cập nhật thuật toán chọn nhánh](https://github.com/ethereum/consensus-specs/pull/2845) để loại bỏ hoàn toàn các nút sinh mâu thuẫn khỏi quá trình xem xét chọn nhánh. Các nút xác thực mập mờ cũng giảm sức ảnh hưởng trong tương lai theo thuật toán chọn nhánh. Điều này giúp ngăn chặn cuộc tấn công cân bằng đã đề cập, đồng thời duy trì khản năng chống chịu trước các cuộc tấn công tuyết lỡ (Avalanche Attacks).
+
+Một loại tấn công, có tên [**tấn công tuyết lỡ**](https://ethresear.ch/t/avalanche-attack-on-proof-of-stake-ghost/11854/3), được đề cập vào [nghiên cứu tháng 3 năm 2022](https://arxiv.org/pdf/2203.01315.pdf). Để tiến hành một cuộc tấn công tuyết lỡ, kẻ tấn công cần kiểm soát được nhiều người đề xuất khối liên tiếp. Trong mỗi khe thời gian đề xuất khối, kẻ tấn công giữ lại khối của mình, tích lũy chúng cho đến khi chuỗi trung thực đạt được trọng số nhánh con ngang bằng với các khối bị giữ lại. Sau đó, các khối bị giữ lại được tung ra để tạo ra sự mâu thuẫn tối đa (maximal equivocation). Tác giả cho rằng việc tăng ảnh hưởng cho người đề xuất - cách phòng thủ chính chống tấn công cân bằng và tấn công Bouncing - lại không bảo vệ được trước tấn công tuyết lỡ. Tuy nhiên, các tác giả cũng chỉ chứng minh cuộc tấn công này trong điều kiện lý tưởng của thuật toán chọn nhánh Ethereum - không phải thực nghiệm (họ dùng GHOST mà không có LMD).
+
+Tấn công tuyết lỡ này được giảm thiểu nhờ phần LMD trong thuật toán chọn nhánh LMD-GHOST. LMD có nghĩa là "dựa trên thông điệp mới nhất" (“Latest-Message-Driven”) và nó ám chỉ một bảng giữ bởi mỗi nút xác thực bao gồm các thông điệp gần đây nhất được gửi bởi các nút xác thực khác. Trường thông tin này chỉ cập nhật nếu có thông điệp mới hơn đến từ một Slot sau so với thông điệp đã lưu của nút xác thực đó. Trên thực tế đều này có nghĩa là trong mỗi Slot, thông điệp đầu tiên được nhận sẽ được tiếp nhận và những thông điệp tiếp theo sẽ được xem là mâu thuẫn và bị bỏ qua. Nói cách khác, các Client đồng thuận không tính các trường hợp mâu thuẫn này - chúng sử dụng thông điệp đầu tiên từ mỗi nút xác thực và đơn giản loại bỏ thông điệp trùng lặp, ngăn chặn cuộc tấn công tuyết lở.
+
+Có một số nâng cấp tiềm năng tương lai với quy tắc chọn nhánh có thể gia tăng mức độ an toàn bên cạnh cơ chế tăng ảnh hưởng người đề xuất. Một trong số đó là [hợp nhất quan điểm (View-Merge)](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), trong đó người kiểm chứng sẽ "đóng băng" quan điểm của họ về chọn nhánh trong vòng `n` giây trước khi Slot bắt đầu và người kiểm chứng sẽ giúp đồng bộ hóa quan điểm về chuỗi trên toàn mạng lưới. Một nâng cấp tiềm năng khác là [chốt chuỗi trong một Slot (Single-Slot Finality)](https://notes.ethereum.org/@vbuterin/single_slot_finality), giúp bảo vệ khỏi các cuộc tấn công dựa trên thời điểm truyền thông điệp bằng cách chốt cuối chuỗi trong vòng một Slot.
+
+#### Sự trì hoãn của việc chốt chuỗi {#finality-delay}
+
+[Nghiên cứu này](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf) vốn là nơi đầu tiên miêu tả cuộc tấn công tái tổ chức chuỗi bằng một khối chi phí thấp, cũng mô tả cuộc tấn công trì hoãn chốt chuỗi (Finality Delay hay còn gọi là "Liveness Failure") dựa trên việc kẻ tấn công trở thành người đề xuất khối tại ranh giới chu kỳ. Điều này rất quan trọng vì các ranh giới tại chu kỳ trở thành điểm kiểm tra mà một "Casper FFG" (cơ chế chung cuộc) được sử dụng để chốt một phần của chuỗi. Kẻ tấn công đơn giản giữ khối đến khi nút trung thực sử dụng phiếu bầu FFG ủng hộ ranh giới khối trước đó, xem khối đó như mục tiêu chốt chuỗi ở thời điểm hiện tại. Sau đó chúng tung ra khối bị giữ. Chúng chứng thực khối của mình và những nút trung thực cũng làm như vậy, tạo thành các nhánh có điểm kiểm soát mục tiêu khác nhau. Nếu chúng canh đúng thời điểm, chúng sẽ ngăn cản quá trình chốt chuỗi, vì không có đại đồng thuận 2/3 nào được chứng thực cho một trong hai nhánh. Càng ít cổ phần (Stake), thì việc canh thời gian càng phải chính xác hơn, vì kẻ tấn công kiểm soát trực tiếp ít sự chứng thực hơn, và xác suất kẻ tấn công nắm quyền nút xác thực đề xuất khối ranh giới chu kỳ cũng thấp hơn.
+
+#### Cuộc tấn công tầm xa {#long-range-attacks}
+
+Cũng có một số loại tấn công đặc thù cho chuỗi khối chạy cơ chế bằng chứng cổ phần, trong đó một nút xác thực tham gia vào khối khởi nguyên duy trì một nhánh riêng và song song với nhánh chuỗi khối trung thực, và cuối cùng thuyết phục tập hợp nút trung thực chuyển sang nhánh đó tại một thời điểm thích hợp về sau. Kiểu tấn công này là bất khả thi trên Ethereum nhờ vào bộ chốt chuỗi (Finality Gadget), cơ chế đảm bảo tất cả các nút đồng tình trạng thái của chuỗi trung thực theo một khoảng thời gian định kì (gọi là "Checkpoints" - điểm kiểm soát). Cơ chế đơn giản này vô hiệu hóa kẻ tấn công từ xa bởi vì Client của Ethereum sẽ không thực hiện tái tổ chức chuỗi đối với các khối đã được chốt chuỗi. Các nút mới tham gia mạng sẽ làm vậy bằng các tìm một trạng thái được băm đáng tin cậy gần đây (gọi là một "điểm kiểm soát [tin cậy gần đây - Weak Subjectivity](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/)) và sử dụng khối khởi nguyên giả để tiếp tục xây dựng chuỗi. Điều này tạo ra một cổng tin cậy ('trust gate') đối với những nút mới tham gia mạng lưới, trước khi nó có thể tự mình xác minh thông tin.
+
+#### Tấn công từ chối dịch vụ (Denial of Service) {#denial-of-service}
+
+Cơ chế bằng chứng cổ phần của Ethereum chọn một nút xác thực duy nhất từ tập hợp nút để làm người đề xuất khối trong mỗi Slot. Điều này có thể được tính toán bằng một hàm đã được công khai và do kẻ tấn công có thể phần nào xác định người đề xuất khối tiếp theo. Từ đó, kẻ tấn công có thể Spam đề xuất khối để ngăn cho trao đổi thông tin giữa các nút ngang hàng. Đối với phần còn lại của mạng, có vẻ như người đề xuất khối đang ngoại tuyến, và Slot đó sẽ đơn giản bị bỏ trống. Đây có thể xem là một hình thức kiểm duyệt với một số nút cụ thể, ngăn chúng thêm thông tin vào chuỗi khối. Việc triển khai bầu chọn người dẫn đầu bí mật (SSLE) hoặc các biến thể khác có thể giảm rủi ro tấn công từ chối dịch vụ (DoS), bởi vì chỉ có người đề xuất khối mới biết mình được chọn và lựa chọn này không thể bị biết trước. Điều này chưa được triển khai, nhưng đang là [lĩnh vực nghiên cứu và phát triển](https://ethresear.ch/t/secret-non-single-leader-election/11789) tích cực.
+
+Tất cả những điều này cho thấy rằng rất khó để tấn công Ethereum thành công chỉ với một lượng cổ phần nhỏ. Những kiểu tấn công khả thi được mô tả ở đây đều ở trong môi trường lý tưởng, những điều kiện mạng gần như bất khả thi hoặc các lỗ hổng tấn công đã được khắc phục bằng những bản vá nhỏ trên phần mềm Client. Tất nhiên, điều này không loại trừ khả năng tồn tại các lỗ hổng chưa biết đến ngoài kia, nhưng nó cho thấy rằng để một kẻ tấn công với lượng cổ phần thiểu số có thể thành công, thì cần đến mức độ thành thạo kỹ thuật cực kỳ cao, kiến thức sâu về lớp đồng thuận, và cả sự may mắn. Từ góc nhìn của kẻ tấn công, lựa chọn tốt nhất có lẽ là tích lũy càng nhiều Ether càng tốt và quay lại với tỷ lệ cổ phần lớn hơn trong tổng số.
+
+### Kẻ tấn công nắm giữ ≥ 33% tổng lượng cổ phần {#attackers-with-33-stake}
+
+Tất cả các cuộc tấn công được đề cập trước đó trong bài viết này đều có khả năng thành công cao hơn khi kẻ tấn công có nhiều Ether để Stake hơn để bỏ phiếu, và có nhiều nút xác thực hơn có thể được chọn làm người đề xuất trong mỗi Slot. Do đó, một nút xác thực độc hại có thể nhắm tới việc kiểm soát càng nhiều Ether được Stake càng tốt.
+
+Mốc 33% lượng Ether trên tổng mạng lưới là một ngưỡng quan trọng đối với kẻ tấn công, bởi vì chỉ cần nắm nhiều hơn mức này, họ đã có khả năng ngăn chuỗi đạt trạng thái chốt chuỗi mà không cần phải kiểm soát chi tiết hành động của các nút khác. Họ đơn giản chỉ cần cùng nhau “biến mất”. Nếu 1/3 hoặc nhiều hơn lượng Ether cổ phần được dùng để chứng thực độc hại hoặc không tham gia chứng thực, thì sẽ không tồn tại được đồng thuận đại đa số 2/3, và không thể chốt chuỗi. Biện pháp phòng thủ chống lại tình huống này là cơ chế rò rỉ khi không hoạt động (Inactivity Leak). Rò rỉ khi không hoạt động xác định những nút không thực hiện chứng thực, hoặc chứng thực trái ngược với số đông. Lượng Ether cổ phần của các nút không chứng thực này sẽ bị rút dần, cho đến khi tổng cộng họ chỉ còn chiếm dưới 1/3 cổ phần toàn mạng, từ đó có thể chốt chuỗi trở lại.
+
+Mục đích của rò rỉ khi không hoạt động là giúp chuỗi có thể chốt lại. Tuy nhiên, kẻ tấn công cũng sẽ mất đi một phần lượng Ether đã Stake. Tình trạng không hoạt động kéo dài ở các nút chiếm 33% tổng số Ether đã Stake sẽ cực kỳ tốn kém, ngay cả khi những nút này không bị cắt quỹ (Slashing).
+
+Giả sử mạng Ethereum không đồng bộ (tức là có độ trễ giữa việc gửi và nhận các thông điệp), một kẻ tấn công kiểm soát 34% tổng số cổ phần có thể gây ra tình trạng chốt chuỗi kép. Điều này xảy ra vì kẻ tấn công có thể mập mờ khi được chọn làm người đề xuất khối, rồi thực hiện bỏ phiếu đôi với toàn bộ nút của mình. Điều này tạo ra tình huống chuỗi khối bị chia nhánh, trong đó mỗi nhánh đều có 34% lượng Ether cổ phần bỏ phiếu cho nó. Mỗi nhánh chỉ cần thêm 50% nút còn lại bỏ phiếu ủng hộ, thì cả hai nhánh đều có thể đạt mức siêu đa số, và trong trường hợp đó cả hai chuỗi đều có thể được chốt. (Vì: 34% nút của kẻ tấn công + một nửa trong số 66% còn lại = 67% cho mỗi nhánh). Các khối cạnh tranh này cần phải được phân phối đến khoảng 50% nút trung thực mỗi bên. Do đó, cuộc tấn công này chỉ khả thi nếu kẻ tấn công có mức độ kiểm soát nhất định đối với thời điểm lan truyền thông điệp trên mạng, để có thể “đẩy” một nửa nút trung thực sang mỗi nhánh. Kẻ tấn công chắc chắn sẽ phải đánh mất toàn bộ côt phần của mình (34% trong tổng ~10 triệu Ether với tập nút xác thực hiện tại) để thực hiện được chốt chuỗi đôi, vì 34% nút của họ sẽ đồng thời bỏ phiếu đôi – một hành vi bị cắt quỹ với mức phạt tối đa. Biện pháp phòng thủ chống lại cuộc tấn công này chính là chi phí khổng lồ – phải hi sinh 34% tổng số Ether đã Stake. Để phục hồi sau cuộc tấn công này, cộng đồng Ethereum sẽ cần phải phối hợp bên ngoài và cùng đồng ý chọn đi theo một nhánh, bỏ qua nhánh còn lại.
+
+### Kẻ tấn công nắm giữ khoảng 50% tổng cổ phần {#attackers-with-50-stake}
+
+Với 50% lượng Ether cổ phần, một nhóm nút độc hại về mặt lý thuyết có thể chia chuỗi thành hai nhánh bằng nhau, rồi đơn giản sử dụng toàn bộ 50% cổ phần của mình để bỏ phiếu ngược lại với tập nút trung thực, từ đó duy trì hai nhánh và ngăn chốt chuỗi. Cơ chế rò rỉ khi không hoạt động trên cả hai nhánh cuối cùng cũng sẽ dẫn đến việc cả hai chuỗi đều được chốt. Tại thời điểm đó, lựa chọn duy nhất là quay về giải pháp khôi phục bằng cộng đồng.
+
+Khả năng một nhóm nút đối địch có thể duy trì chính xác 50% tổng số cổ phần là rất thấp, do sự biến động trong số lượng nút trung thực, độ trễ mạng, v.v. — chi phí khổng lồ để thực hiện một cuộc tấn công như vậy, kết hợp với xác suất thành công thấp, dường như là một yếu tố răn đe mạnh mẽ đối với một kẻ tấn công biết suy nghĩ, đặc biệt là khi chỉ cần đầu tư thêm một chút để nắm _nhiều_hơn_ 50% thì sẽ mở ra nhiều quyền lực hơn rất nhiều.
+
+Nếu nắm >50% tổng số cổ phần, kẻ tấn công có thể thống trị hoàn toàn thuật toán chọn nhánh. Trong trường hợp này, kẻ tấn công có thể chứng thực với tư cách đa số, cho phép họ có đủ quyền kiểm soát để thực hiện các tái tổ chức chuỗi ngắn mà không cần đánh lừa các Client trung thực. Các nút trung thực sẽ làm theo, vì thuật toán chọn nhánh của họ cũng sẽ nhìn thấy chuỗi được kẻ tấn công ủng hộ là “chuỗi nặng nhất”, và như vậy chuỗi đó sẽ có thể được chốt. Điều này cho phép kẻ tấn công kiểm duyệt một số giao dịch, thực hiện các tái tổ chức chuỗi ngắn, và khai thác tối đa MEV bằng cách sắp xếp lại khối theo hướng có lợi cho mình. Biện pháp phòng thủ chống lại điều này chính là chi phí khổng lồ để nắm giữ cổ phần đa số (hiện tại gần 19 tỷ đô la Mỹ), khoản cổ phần này sẽ bị đặt vào rủi ro bởi vì lớp xã hội nhiều khả năng sẽ can thiệp và lựa chọn đi theo nhánh trung thực thiểu số, khiến cổ phần của kẻ tấn công bị mất giá nghiêm trọng.
+
+### Kẻ tấn công sử dụng >=66% tổng cổ phần trên mạng lưới {#attackers-with-66-stake}
+
+Một kẻ tấn công nắm giữ 66% hoặc nhiều hơn tổng lượng Ether cổ phần có thể chốt chuỗi mà họ muốn mà không cần ép buộc bất kỳ nút trung thực nào. Kẻ tấn công có thể đơn giản bỏ phiếu cho nhánh mình ưa thích và sau đó chốt nó, chỉ vì họ sở hữu đa số đồng thuận một cách gian lận. Với tư cách là đa số cổ đông, kẻ tấn công sẽ luôn kiểm soát nội dung các khối đã được chốt, có quyền chi tiêu, quay ngược rồi chi tiêu lại, kiểm duyệt một số giao dịch, và tái tổ chức chuỗi tùy ý. Bằng cách mua thêm ether để kiểm soát 66% thay vì 51%, kẻ tấn công trên thực tế đã “mua” khả năng thực hiện tái tổ chức chuỗi sau chốt chuỗi và đảo ngược chốt chuỗi (tức là thay đổi cả lịch sử chuỗi lẫn kiểm soát tương lai chuỗi). Biện pháp phòng thủ thực sự ở đây là chi phí khổng lồ để nắm giữ 66% tổng lượng Ether cổ phần, cùng với lựa chọn dựa vào lớp xã hội để phối hợp và thống nhất đi theo một nhánh thay thế. Chúng ta sẽ tìm hiểu chi tiết hơn về điều này trong phần tiếp theo.
+
+## Con người/cộng đồng: tuyến phòng thủ cuối cùng {#people-the-last-line-of-defense}
+
+Nếu các nút xác thực gian lận thành công trong việc chốt phiên bản chuỗi mà họ muốn, thì cộng đồng Ethereum sẽ rơi vào một tình huống khó xử. Chuỗi chính thức sẽ chứa một phần gian lận được ghi hẳn vào lịch sử, trong khi các nút trung thực có thể bị phạt vì đã thực chứng cho một chuỗi thay thế (chuỗi trung thực). Lưu ý rằng một chuỗi đã chốt nhưng lại sai lệch cũng có thể xuất phát từ một lỗi trong Client chiếm đa số. Cuối cùng, phương án dự phòng tối hậu là dựa vào lớp xã hội (social layer – Layer 0) để giải quyết tình huống.
+
+Một điểm mạnh của cơ chế bằng chứng cổ phần của Ethereum đó là có một [biên độ chiến lược phòng thủ](https://youtu.be/1m12zgJ42dI?t=1712) mà cộng đồng có thể áp dụng khi đối mặt với cuộc tấn công.
+Một phản ứng tối thiểu có thể là buộc các nút của kẻ tấn công thoát khỏi mạng mà không kèm theo bất kỳ hình phạt bổ sung nào. Để tham gia lại mạng, kẻ tấn công sẽ phải đi qua hàng chờ kích hoạt, cơ chế này đảm bảo tập hợp nút chỉ tăng trưởng dần dần. Ví dụ, việc thêm đủ nút để nhân đôi lượng Ether đang Stake mất khoảng 200 ngày, về cơ bản cho các nút trung thực hoãn được 200 ngày trước khi kẻ tấn công có thể thử lại một cuộc tấn công 51%. Tuy nhiên, cộng đồng cũng có thể quyết định trừng phạt kẻ tấn công nghiêm khắc hơn, bằng cách thu hồi các phần thưởng trước đó hoặc đốt một phần (tới 100%) số vốn mà họ đã Stake.
+
+Dù kẻ tấn công bị áp đặt hình phạt nào đi nữa, cộng đồng cũng phải cùng nhau quyết định xem liệu chuỗi không trung thực, mặc dù được thuật toán chọn nhánh trong các client Ethereum ưu tiên, trên thực tế có phải là chuỗi không hợp lệ hay không, và rằng cộng đồng nên xây dựng tiếp trên chuỗi trung thực thay vì chuỗi đó. Các nút trung thực có thể cùng nhau đồng thuận xây dựng tiếp trên một nhánh của chuỗi khói Ethereum được cộng đồng chấp nhận, nhánh này có thể, ví dụ, đã tách ra khỏi chuỗi chuẩn hợp lệ trước khi cuộc tấn công bắt đầu, hoặc đã cưỡng bức loại bỏ các nút của kẻ tấn công. Các nút trung thực sẽ có động lực xây dựng trên chuỗi này bởi vì họ sẽ tránh được những hình phạt áp dụng cho việc họ không xác nhận chuỗi của kẻ tấn công. Các sàn giao dịch, on-ramps và những ứng dụng xây dựng trên Ethereum nhiều khả năng sẽ chọn chuỗi trung thực và đi theo các nút trung thực sang chuỗi khối trung thực.
+
+Tuy nhiên, đây sẽ là một thách thức lớn về quản trị. Một số người dùng và nút xác thực chắc chắn sẽ chịu tổn hại khi chuyển trở lại chuỗi trung thực; các giao dịch trong những khối được xác thực sau cuộc tấn công có thể bị hoàn tác, gây gián đoạn cho lớp ứng dụng, và đơn giản là làm lung lay niềm tin của một số người vốn theo quan điểm mã nguồn là luật. Các sàn giao dịch và ứng dụng nhiều khả năng đã liên kết những hành động ngoài chuỗi với các giao dịch trên chuỗi mà giờ đây có thể bị hoàn tác, khởi đầu một chuỗi dài các việc thu hồi và chỉnh sửa rất khó xử lý công bằng — đặc biệt nếu lợi nhuận phi pháp đã được trộn lẫn, gửi vào tài chính phi tập trung hoặc các công cụ phái sinh khác, gây ra hiệu ứng dây chuyền cho cả người dùng trung thực. Chắc chắn sẽ có một số người dùng, thậm chí là các tổ chức, đã hưởng lợi từ chuỗi gian lận có chủ đích hay tình cờ và họ có thể phản đối việc chọn chuỗi để bảo vệ lợi ích của mình. Đã có những lời kêu gọi tập dượt trước phản ứng cộng đồng đối với các cuộc tấn công >51%, để khi xảy ra có thể phối hợp và giảm thiểu thiệt hại một cách nhanh chóng. Vitalik đã có một số thảo luận hữu ích về vấn đề này trên ethresear.ch [tại đây](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) và [tại đây](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363) và trên Twitter [tại đây](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw). Mục tiêu của một phản ứng xã hội có sự phối hợp là phải nhắm trúng và cụ thể trong việc trừng phạt kẻ tấn công, đồng thời giảm thiểu tác động đối với những người dùng khác.
+
+Quản trị đã là một đề tài phức tạp. Điều phối một phản ứng khẩn cấp của lớp-0 đối với một chuỗi gian lận đã được chốt chắn chắn là thử thách lớn với cộng đồng Ethereum, nhưng đều này [đã diễn ra](/ethereum-forks/#dao-fork-summary) - [tận hai lần](/ethereum-forks/#tangerine-whistle) - trong lịch sử Ethereum.
+
+Tuy vậy, vẫn có một cảm giác khá an tâm khi biết rằng phương án dự phòng cuối cùng nằm ở đời thực. Rốt cuộc thì, dù có cả một tầng công nghệ phi thường phía trên, nếu điều tồi tệ nhất xảy ra, thì chính con người thật mới phải cùng nhau phối hợp để thoát khỏi tình huống đó.
+
+## Tóm tắt {#summary}
+
+Bài viết này tìm hiểu về một số cách mà kẻ tấn công có thể lợi dụng giao thức cơ chế bằng chứng cổ phần của Ethereum. Tái tổ chức và hoãn chốt chuỗi được bàn lợi dụng bởi kẻ tấn công để tăng tỷ lệ tổng Ether Stake. Nhìn chung, một kẻ tấn công càng có nhiều tiền càng có nhiều khả năng thành công bởi vì nó được chuyển thành sức mạnh bỏ phiếu tác động đến nội dung của khối tương lai. Tại một ngưỡng Eth Stake nhất định, kẻ tấn công sẽ lên cấp sức mạnh:
+
+33%: hoãn chốt chuỗi
+
+34%: hoãn chốt chuỗi, chốt chuỗi đôi
+
+51%: hoãn chốt chuỗi, chốt chuỗi đôi, kiểm duyệt, kiểm soát tương lai của chuỗi khối
+
+66%: hoãn chốt chuỗi, chốt chuỗi đôi, kiểm duyệt, kiểm soát tương lai và lịch sử của chuỗi khối
+
+Cũng tồn tại một loạt các kiểu tấn công tinh vi hơn, chỉ cần một lượng nhỏ Ether đã Stake, nhưng lại đòi hỏi kẻ tấn công phải có trình độ rất cao để kiểm soát chính xác thời điểm truyền thông điệp, nhằm khiến tập nút trung thực ngả theo phía mình.
+
+Nhìn chung, mặc dù có những hướng tấn công tiềm năng này, nhưng rủi ro thành công của một cuộc tấn công là thấp, chắc chắn còn thấp hơn so với cơ chế tương đương trong bằng chứng công việc. Nguyên nhân là do chi phí khổng lồ từ lượng Ether cổ phần mà kẻ tấn công phải đặt vào rủi ro nếu muốn áp đảo nút trung thực bằng sức mạnh bỏ phiếu. Cơ chế "vừa đấm vừa xoa" được tích hợp sẵn bảo vệ khỏi hầu hết các hành vi sai trái, đặc biệt là đối với những kẻ tấn công có lượng Stake nhỏ. Các cuộc tấn công tinh vi hơn như tấn công cân bằng hay Bouncing cũng khó có khả năng thành công, vì điều kiện mạng thực tế khiến việc kiểm soát chính xác việc phân phối thông điệp đến từng nhóm nút cụ thể là rất khó đạt được. Thêm vào đó, các đội ngũ phát triển Client đã nhanh chóng vá các lỗ hổng tấn công đã biết như Bouncing, cân bằng và tuyết lỡ chỉ bằng những bản vá đơn giản.
+
+Các cuộc tấn công 34%, 51% hoặc 66% nhiều khả năng sẽ cần đến sự phối hợp cộng đồng ngoài đời để giải quyết. Mặc dù điều này có thể sẽ gây đau đớn cho cộng đồng, nhưng khả năng cộng đồng có thể phản ứng ngoài đời lại là một yếu tố răn đe mạnh mẽ đối với kẻ tấn công. Lớp xã hội của Ethereum chính là chốt chặn cuối cùng – một cuộc tấn công thành công về mặt kỹ thuật vẫn có thể bị vô hiệu nếu cộng đồng đồng thuận chọn đi theo một nhánh trung thực. Sẽ có một cuộc chạy đua giữa kẻ tấn công và cộng đồng Ethereum – hàng tỷ đô la bỏ ra cho một cuộc tấn công 66% nhiều khả năng sẽ bị xóa sạch bởi một phản ứng cộng đồng được phối hợp thành công nếu nó được thực hiện đủ nhanh, để lại cho kẻ tấn công những túi Ether Stake kẹt cứng, không thanh khoản, nằm trên một chuỗi gian lận đã bị cộng đồng Ethereum phớt lờ. Khả năng điều này cuối cùng mang lại lợi nhuận cho kẻ tấn công là cực kỳ thấp, đủ để trở thành một biện pháp răn đe hiệu quả. Đó là lý do tại sao việc đầu tư duy trì một lớp xã hội gắn kết, với những giá trị được đồng thuận chặt chẽ, lại quan trọng đến vậy.
+
+## Đọc thêm {#further-reading}
+
+- [Thêm nhiều chi tiết ở trang này](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs)
+- [Vitalik bàn về tính chung cuộc trong chốt chuỗi](https://blog.ethereum.org/2016/05/09/on-settlement-finality/)
+- [Nghiên cứu LMD GHOST](https://arxiv.org/abs/2003.03052)
+- [Nghiên cứu về Casper-FFG](https://arxiv.org/abs/1710.09437)
+- [Nghiên cứu về Gasper](https://arxiv.org/pdf/2003.03052.pdf)
+- [Tăng ảnh hưởng người đề xuất](https://github.com/ethereum/consensus-specs/pull/2730)
+- [Tấn công Bouncing trên ethresear.ch](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114)
+- [Nghiên cứu SSLE](https://ethresear.ch/t/secret-non-single-leader-election/11789)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attestations/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attestations/index.md
new file mode 100644
index 00000000000..83cae64cc32
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attestations/index.md
@@ -0,0 +1,92 @@
+---
+title: Các chứng thực
+description: Mô tả về các chứng thực trên Ethereum bằng chứng cổ phần.
+lang: vi
+---
+
+Một trình xác thực dự kiến sẽ tạo, ký và phát một chứng thực trong mỗi tham số epoch. Trang này phác thảo các chứng thực này trông như thế nào và cách chúng được xử lý và truyền đạt giữa các máy khách đồng thuận.
+
+## Chứng thực là gì? {#what-is-an-attestation}
+
+Mỗi [tham số epoch](/glossary/#epoch) (6,4 phút), một trình xác thực sẽ đề xuất một chứng thực cho mạng. Chứng thực dành cho một slot cụ thể trong tham số epoch. Mục đích của chứng thực là bỏ phiếu ủng hộ quan điểm của trình xác thực về chuỗi, cụ thể là khối được chứng minh hợp lệ gần đây nhất và khối đầu tiên trong tham số epoch hiện tại (được gọi là các điểm kiểm tra `nguồn` và `đích`). Thông tin này được kết hợp cho tất cả các trình xác thực tham gia, cho phép mạng đạt được sự đồng thuận về trạng thái của chuỗi khối.
+
+Chứng thực chứa các thành phần sau:
+
+- `aggregation_bits`: danh sách bit của các trình xác thực trong đó vị trí ánh xạ tới chỉ mục của trình xác thực trong ủy ban của họ; giá trị (0/1) cho biết liệu trình xác thực đã ký `dữ liệu` hay chưa (tức là liệu họ có đang hoạt động và đồng ý với người đề xuất khối hay không)
+- `data`: các chi tiết liên quan đến chứng thực, như được định nghĩa bên dưới
+- `signature`: một chữ ký BLS tổng hợp các chữ ký của các trình xác thực riêng lẻ
+
+Nhiệm vụ đầu tiên của một trình xác thực chứng thực là xây dựng `dữ liệu`. `Dữ liệu` chứa các thông tin sau:
+
+- `slot`: Số slot mà chứng thực đề cập đến
+- `index`: Một số xác định ủy ban mà trình xác thực thuộc về trong một slot nhất định
+- `beacon_block_root`: Hàm băm gốc của khối mà trình xác thực nhìn thấy ở đầu chuỗi (kết quả của việc áp dụng thuật toán lựa chọn phân nhánh)
+- `source`: Một phần của phiếu bầu về tính kết luận cuối cùng cho biết những gì các trình xác thực xem là khối được chứng minh hợp lệ gần đây nhất
+- `target`: Một phần của phiếu bầu về tính kết luận cuối cùng cho biết những gì các trình xác thực xem là khối đầu tiên trong tham số epoch hiện tại
+
+Khi `dữ liệu` được xây dựng, trình xác thực có thể lật bit trong `aggregation_bits` tương ứng với chỉ mục trình xác thực của chính họ từ 0 thành 1 để cho thấy rằng họ đã tham gia.
+
+Cuối cùng, trình xác thực ký chứng thực và phát nó lên mạng.
+
+### Chứng thực tổng hợp {#aggregated-attestation}
+
+Có một chi phí đáng kể liên quan đến việc chuyển dữ liệu này xung quanh mạng cho mỗi trình xác thực. Do đó, các chứng thực từ các trình xác thực riêng lẻ được tổng hợp trong các mạng con trước khi được phát đi rộng rãi hơn. Điều này bao gồm việc tổng hợp các chữ ký lại với nhau để một chứng thực được phát đi bao gồm `dữ liệu` đồng thuận và một chữ ký duy nhất được hình thành bằng cách kết hợp chữ ký của tất cả các trình xác thực đồng ý với `dữ liệu` đó. Điều này có thể được kiểm tra bằng cách sử dụng `aggregation_bits` vì điều này cung cấp chỉ mục của mỗi trình xác thực trong ủy ban của họ (có ID được cung cấp trong `dữ liệu`) có thể được sử dụng để truy vấn các chữ ký riêng lẻ.
+
+Trong mỗi tham số epoch, 16 trình xác thực trong mỗi mạng con được chọn làm `bộ tổng hợp`. Các bộ tổng hợp thu thập tất cả các chứng thực mà họ nghe được qua mạng gossip có `dữ liệu` tương đương với dữ liệu của chính họ. Người gửi của mỗi chứng thực phù hợp được ghi lại trong `aggregation_bits`. Sau đó, các bộ tổng hợp phát tổng hợp chứng thực tới mạng rộng hơn.
+
+Khi một trình xác thực được chọn làm người đề xuất khối, họ sẽ đóng gói các chứng thực tổng hợp từ các mạng con cho đến slot mới nhất trong khối mới.
+
+### Vòng đời đưa vào của chứng thực {#attestation-inclusion-lifecycle}
+
+1. Tạo
+2. Truyền bá
+3. Tổng hợp
+4. Truyền bá
+5. Đưa vào
+
+Vòng đời chứng thực được phác thảo trong sơ đồ dưới đây:
+
+
+
+## Phần thưởng {#rewards}
+
+Các trình xác thực được thưởng khi gửi chứng thực. Phần thưởng chứng thực phụ thuộc vào các cờ tham gia (nguồn, đích và đầu), phần thưởng cơ bản và tỷ lệ tham gia.
+
+Mỗi cờ tham gia có thể là đúng hoặc sai, tùy thuộc vào chứng thực đã gửi và độ trễ đưa vào của nó.
+
+Tình huống tốt nhất xảy ra khi cả ba cờ đều đúng, trong trường hợp đó, một trình xác thực sẽ kiếm được (cho mỗi cờ đúng):
+
+`phần thưởng += phần thưởng cơ bản * trọng số cờ * tỷ lệ chứng thực cờ / 64`
+
+Tỷ lệ chứng thực cờ được đo bằng cách sử dụng tổng số dư hiệu dụng của tất cả các trình xác thực chứng thực cho cờ đã cho so với tổng số dư hiệu dụng đang hoạt động.
+
+### Phần thưởng cơ bản {#base-reward}
+
+Phần thưởng cơ bản được tính theo số lượng trình xác thực chứng thực và số dư ether đã đặt cọc hiệu dụng của họ:
+
+`phần thưởng cơ bản = số dư hiệu dụng của trình xác thực x 2^6 / SQRT(Số dư hiệu dụng của tất cả các trình xác thực đang hoạt động)`
+
+#### Độ trễ đưa vào {#inclusion-delay}
+
+Tại thời điểm các trình xác thực bỏ phiếu cho đầu chuỗi (`khối n`), `khối n+1` vẫn chưa được đề xuất. Do đó, các chứng thực tự nhiên được đưa vào **sau một khối**, vì vậy tất cả các chứng thực đã bỏ phiếu cho `khối n` là đầu chuỗi đều được đưa vào `khối n+1`, và **độ trễ đưa vào** là 1. Nếu độ trễ đưa vào tăng gấp đôi thành hai slot, phần thưởng chứng thực sẽ giảm một nửa, vì để tính phần thưởng chứng thực, phần thưởng cơ bản được nhân với nghịch đảo của độ trễ đưa vào.
+
+### Các kịch bản chứng thực {#attestation-scenarios}
+
+#### Thiếu Trình xác thực bỏ phiếu {#missing-voting-validator}
+
+Các trình xác thực có tối đa 1 tham số epoch để gửi chứng thực của họ. Nếu chứng thực bị bỏ lỡ trong tham số epoch 0, họ có thể gửi nó với độ trễ đưa vào trong tham số epoch 1.
+
+#### Thiếu Bộ tổng hợp {#missing-aggregator}
+
+Tổng cộng có 16 Bộ tổng hợp cho mỗi tham số epoch. Ngoài ra, các trình xác thực ngẫu nhiên đăng ký **hai mạng con trong 256 tham số epoch** và đóng vai trò dự phòng trong trường hợp thiếu các bộ tổng hợp.
+
+#### Thiếu người đề xuất khối {#missing-block-proposer}
+
+Lưu ý rằng trong một số trường hợp, một bộ tổng hợp may mắn cũng có thể trở thành người đề xuất khối. Nếu chứng thực không được đưa vào vì người đề xuất khối đã mất tích, người đề xuất khối tiếp theo sẽ lấy chứng thực tổng hợp và đưa nó vào khối tiếp theo. Tuy nhiên, **độ trễ đưa vào** sẽ tăng thêm một.
+
+## Đọc thêm {#further-reading}
+
+- [Các chứng thực trong đặc tả đồng thuận có chú thích của Vitalik](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata)
+- [Các chứng thực trong eth2book.info](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata)
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/block-proposal/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/block-proposal/index.md
new file mode 100644
index 00000000000..b00df239095
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/block-proposal/index.md
@@ -0,0 +1,69 @@
+---
+title: Khối đề xuất
+description: Giải thích cách các khối được đề xuất trong Ethereum bằng chứng cổ phần.
+lang: vi
+---
+
+Các khối là những đơn vị cơ bản của chuỗi khối. Các khối là những đơn vị thông tin riêng biệt được chuyển qua lại giữa các nút, được đồng thuận và được thêm vào cơ sở dữ liệu của mỗi nút. Trang này giải thích cách chúng được tạo ra.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Việc đề xuất khối là một phần của giao thức bằng chứng cổ phần. Để giúp bạn hiểu trang này, chúng tôi khuyên bạn nên đọc về [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/) và [kiến trúc khối](/developers/docs/blocks/).
+
+## Ai tạo ra các khối? {#who-produces-blocks}
+
+Các tài khoản trình xác thực đề xuất các khối. Các tài khoản trình xác thực được quản lý bởi các nhà điều hành nút, những người chạy phần mềm trình xác thực như một phần của máy khách thực thi và máy khách đồng thuận của họ và đã ký gửi ít nhất 32 ETH vào hợp đồng ký gửi. Tuy nhiên, mỗi trình xác thực chỉ thỉnh thoảng chịu trách nhiệm đề xuất một khối. Ethereum đo lường thời gian bằng slot và epoch. Mỗi slot dài mười hai giây, và 32 slot (6,4 phút) tạo thành một epoch. Mỗi slot là một cơ hội để thêm một khối mới trên Ethereum.
+
+### Lựa chọn ngẫu nhiên {#random-selection}
+
+Một trình xác thực duy nhất được chọn một cách giả ngẫu nhiên để đề xuất một khối trong mỗi slot. Không có cái gọi là sự ngẫu nhiên thực sự trong một chuỗi khối bởi vì nếu mỗi nút tạo ra các số ngẫu nhiên thực sự, chúng sẽ không thể đạt được sự đồng thuận. Thay vào đó, mục đích là làm cho quy trình lựa chọn trình xác thực không thể đoán trước được. Sự ngẫu nhiên được thực hiện trên Ethereum bằng cách sử dụng một thuật toán gọi là RANDAO, thuật toán này trộn một hàm băm từ người đề xuất khối với một hạt giống được cập nhật mỗi khối. Giá trị này được sử dụng để chọn một người xác thực cụ thể từ tổng bộ người xác thực. Việc lựa chọn trình xác thực được ấn định trước hai epoch như một cách để bảo vệ chống lại một số loại thao túng hạt giống nhất định.
+
+Mặc dù các trình xác thực thêm vào RANDAO trong mỗi slot, giá trị RANDAO toàn cục chỉ được cập nhật một lần mỗi epoch. Để tính toán chỉ số của người đề xuất khối tiếp theo, giá trị RANDAO được trộn với số slot để tạo ra một giá trị duy nhất trong mỗi slot. Xác suất một trình xác thực cá nhân được chọn không đơn giản là `1/N` (với `N` = tổng số trình xác thực đang hoạt động). Thay vào đó, nó được tính trọng số theo số dư ETH hiệu quả của mỗi trình xác thực. Số dư hiệu quả tối đa là 32 ETH (điều này có nghĩa là `số dư < 32 ETH` dẫn đến trọng số thấp hơn so với `số dư == 32 ETH`, nhưng `số dư > 32 ETH` không dẫn đến trọng số cao hơn so với `số dư == 32 ETH`).
+
+Chỉ một người đề xuất khối được chọn trong mỗi slot. Trong điều kiện bình thường, một người tạo khối duy nhất sẽ tạo và phát hành một khối duy nhất trong slot dành riêng cho họ. Việc tạo hai khối cho cùng một slot là một hành vi có thể bị cắt giảm, thường được gọi là "nhập nhằng".
+
+## Khối được tạo ra như thế nào? {#how-is-a-block-created}
+
+Người đề xuất khối dự kiến sẽ phát một khối beacon đã ký, khối này xây dựng trên đỉnh đầu gần đây nhất của chuỗi theo góc nhìn của thuật toán lựa chọn phân nhánh do họ tự chạy cục bộ. Thuật toán lựa chọn phân nhánh áp dụng bất kỳ sự chứng thực nào đang chờ trong hàng đợi còn sót lại từ slot trước, sau đó tìm khối có trọng lượng chứng thực tích lũy lớn nhất trong lịch sử của nó. Khối đó là khối cha của khối mới do người đề xuất tạo ra.
+
+Người đề xuất khối tạo ra một khối bằng cách thu thập dữ liệu từ cơ sở dữ liệu cục bộ và góc nhìn về chuỗi của riêng nó. Nội dung của khối được hiển thị trong đoạn mã dưới đây:
+
+```rust
+class BeaconBlockBody(Container):
+ randao_reveal: BLSSignature
+ eth1_data: Eth1Data
+ graffiti: Bytes32
+ proposer_slashings: List[ProposerSlashing, MAX_PROPOSER_SLASHINGS]
+ attester_slashings: List[AttesterSlashing, MAX_ATTESTER_SLASHINGS]
+ attestations: List[Attestation, MAX_ATTESTATIONS]
+ deposits: List[Deposit, MAX_DEPOSITS]
+ voluntary_exits: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS]
+ sync_aggregate: SyncAggregate
+ execution_payload: ExecutionPayload
+```
+
+Trường `randao_reveal` nhận một giá trị ngẫu nhiên có thể xác minh mà người đề xuất khối tạo ra bằng cách ký vào số epoch hiện tại. `eth1_data` là một phiếu bầu cho góc nhìn của người đề xuất khối về hợp đồng ký gửi, bao gồm gốc của cây Merkle ký gửi và tổng số lượng ký gửi cho phép các khoản ký gửi mới được xác minh. `graffiti` là một trường tùy chọn có thể được sử dụng để thêm một thông điệp vào khối. `proposer_slashings` và `attester_slashings` là các trường chứa bằng chứng cho thấy một số trình xác thực nhất định đã thực hiện các hành vi có thể bị cắt giảm theo góc nhìn của người đề xuất về chuỗi. `deposits` là một danh sách các khoản ký gửi của trình xác thực mới mà người đề xuất khối biết, và `voluntary_exits` là một danh sách các trình xác thực muốn thoát mà người đề xuất khối đã nghe nói đến trên mạng gossip của lớp đồng thuận. `sync_aggregate` là một vector cho thấy những trình xác thực nào trước đây đã được chỉ định vào một ủy ban đồng bộ (một tập hợp con các trình xác thực phục vụ dữ liệu máy khách nhẹ) và đã tham gia vào việc ký dữ liệu.
+
+`execution_payload` cho phép thông tin về các giao dịch được chuyển qua lại giữa máy khách thực thi và máy khách đồng thuận. `execution_payload` là một khối dữ liệu thực thi được lồng vào bên trong một khối beacon. Các trường bên trong `execution_payload` phản ánh cấu trúc khối được nêu trong Sách vàng Ethereum, ngoại trừ việc không có ommer và `prev_randao` tồn tại thay cho `difficulty`. Máy khách thực thi có quyền truy cập vào một nhóm giao dịch cục bộ mà nó đã nghe được trên mạng gossip của riêng mình. Các giao dịch này được thực thi cục bộ để tạo ra một cây trie trạng thái được cập nhật, được gọi là trạng thái sau. Các giao dịch được bao gồm trong `execution_payload` dưới dạng một danh sách được gọi là `transactions` và trạng thái sau được cung cấp trong trường `state-root`.
+
+Tất cả các dữ liệu này được thu thập trong một khối beacon, được ký và phát đến các máy ngang hàng của người đề xuất khối, những máy này sẽ lan truyền nó đến các máy ngang hàng của họ, v.v.
+
+Đọc thêm về [cấu trúc của các khối](/developers/docs/blocks).
+
+## Điều gì xảy ra với khối? {#what-happens-to-blocks}
+
+Khối được thêm vào cơ sở dữ liệu cục bộ của người đề xuất khối và được phát đến các máy ngang hàng qua mạng gossip của lớp đồng thuận. Khi một trình xác thực nhận được khối, nó sẽ xác minh dữ liệu bên trong đó, bao gồm việc kiểm tra rằng khối đó có khối cha chính xác, tương ứng với slot chính xác, chỉ số người đề xuất là chỉ số được mong đợi, việc tiết lộ RANDAO là hợp lệ và người đề xuất không bị cắt giảm. `execution_payload` được tách ra, và máy khách thực thi của trình xác thực sẽ thực thi lại các giao dịch trong danh sách để kiểm tra sự thay đổi trạng thái được đề xuất. Giả sử khối vượt qua tất cả các kiểm tra này, mỗi trình xác thực sẽ thêm khối đó vào chuỗi chính tắc của riêng mình. Quy trình sau đó bắt đầu lại trong slot tiếp theo.
+
+## Phần thưởng khối {#block-rewards}
+
+Người đề xuất khối nhận được thanh toán cho công việc của họ. Có một `base_reward` được tính như một hàm của số lượng trình xác thực đang hoạt động và số dư hiệu quả của chúng. Người đề xuất khối sau đó nhận được một phần của `base_reward` cho mỗi sự chứng thực hợp lệ có trong khối; càng nhiều trình xác thực chứng thực cho khối, phần thưởng của người đề xuất khối càng lớn. Cũng có một phần thưởng cho việc báo cáo các trình xác thực nên bị cắt giảm, bằng `1/512 * số dư hiệu quả` cho mỗi trình xác thực bị cắt giảm.
+
+[Thông tin thêm về phần thưởng và hình phạt](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties)
+
+## Đọc thêm {#further-reading}
+
+- [Giới thiệu về các khối](/developers/docs/blocks/)
+- [Giới thiệu về Cơ chế bảo chứng cổ phần](/developers/docs/consensus-mechanisms/pos/)
+- [Thông số kỹ thuật đồng thuận của Ethereum](https://github.com/ethereum/consensus-specs)
+- [Giới thiệu về Gasper](/developers/docs/consensus-mechanisms/pos/gasper/)
+- [Nâng cấp Ethereum](https://eth2book.info/)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/faqs/index.md
new file mode 100644
index 00000000000..12aada57162
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/faqs/index.md
@@ -0,0 +1,172 @@
+---
+title: Những câu hỏi thường gặp
+description: Những câu hỏi thường gặp về bằng chứng cổ phần trên Ethereum.
+lang: vi
+---
+
+## Bằng chứng cổ phần là gì {#what-is-proof-of-stake}
+
+Proof-of-stake (bằng chứng cố phần) là một dạng thuật toán có thể cung cấp tính bảo mật cho blockchain bằng cách đảm bảo rằng tài sản có giá trị sẽ bị mất đi đối với những kẻ tấn công hành xử không trung thực. Các hệ thống bằng chứng cổ phần yêu cầu một tập hợp các trình xác thực phải ký gửi tài sản, và tài sản này có thể bị tịch thu nếu trình xác thực thực hiện hành vi gian lận có thể chứng minh được. Ethereum sử dụng cơ chế bằng chứng cổ phần này để bảo mật blockchain.
+
+## Cơ chế bằng chứng cổ phần khác gì so với cơ chế bằng chứng công việc? {#comparison-to-proof-of-work}
+
+Cả cơ chế bằng chứng công việc và cơ chế bằng chứng cổ phần đều là những cơ chế nhằm ngăn chặn về mặt kinh tế các tác nhân độc hại khỏi việc gây quá tải hoặc gian lận mạng lưới. Trong cả hai trường hợp, các nút tham gia tích cực vào cơ chế đồng thuận sẽ phải đặt một loại tài sản nào đó “vào trong mạng lưới”, và họ sẽ mất nó nếu có hành vi sai trái.
+
+Trong cơ chế bằng chứng công việc, tài sản này là năng lượng. Nút, được gọi là thợ đào, chạy một thuật toán nhằm tính toán giá trị nhanh hơn bất kỳ nút nào khác. Nút nhanh nhất sẽ có quyền đề xuất một khối lên chuỗi. Để thay đổi lịch sử của chuỗi hoặc chiếm quyền đề xuất khối, một thợ đào sẽ phải sở hữu sức mạnh tính toán khổng lồ đến mức họ luôn giành chiến thắng. Điều này vô cùng tốn kém và khó thực hiện, giúp bảo vệ chuỗi khỏi các cuộc tấn công. Năng lượng cần thiết để “đào” bằng cơ chế bằng chứng công việc là một loại tài sản thực tế mà các thợ đào phải trả.
+
+Cơ chế bằng chứng cổ phần yêu cầu các nút, được gọi là những người xác thực, phải nộp trực tiếp một tài sản tiền mã hóa vào một hợp đồng thông minh. Nếu một người xác thực hành xử sai trái, số tiền điện tử này có thể bị tiêu hủy vì họ đã “đặt cọc” tài sản trực tiếp vào chuỗi thay vì gián tiếp thông qua việc tiêu thụ năng lượng.
+
+Cơ chế bằng chứng công việc tiêu tốn rất nhiều năng lượng vì điện năng bị thất thoát trong quá trình khai thác. Cơ chế bằng chứng cổ phần, ngược lại, chỉ yêu cầu một lượng năng lượng rất nhỏ – các trình xác thực Ethereum thậm chí có thể chạy trên những thiết bị công suất thấp như Raspberry Pi. Cơ chế bằng chứng cổ phần của Ethereum được cho là an toàn hơn so với bằng chứng công việc vì chi phí để tấn công cao hơn và hậu quả đối với kẻ tấn công cũng nghiêm trọng hơn.
+
+So sánh giữa bằng chứng công việc và bằng chứng cổ phần là một chủ đề gây nhiều tranh cãi. [Blog của Vitalik Buterin](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) và cuộc tranh luận giữa Justin Drake và Lyn Alden đã tóm tắt rõ ràng các luận điểm.
+
+
+
+## Cơ chế bằng chứng cổ phần có tiết kiệm năng lượng không? {#is-pos-energy-efficient}
+
+Đúng vậy. Các nút trong một mạng lưới bằng chứng cổ phần chỉ sử dụng một lượng năng lượng rất nhỏ. Một nghiên cứu của bên thứ ba kết luận rằng toàn bộ mạng Ethereum sử dụng cơ chế bằng chứng cổ phần chỉ tiêu thụ khoảng 0,0026 TWh mỗi năm – thấp hơn khoảng 13,000 lần so với việc chơi game tại Mỹ.
+
+[Tìm hiểu thêm về mức tiêu thụ năng lượng của Ethereum](/energy-consumption/).
+
+## Cơ chế bằng chứng cổ phần có an toàn không? {#is-pos-secure}
+
+Cơ chế bằng chứng cổ phần của Ethereum rất an toàn. Cơ chế này đã được nghiên cứu, phát triển và kiểm thử nghiêm ngặt trong hơn tám năm trước khi chính thức đưa vào hoạt động. Các bảo đảm về mặt an ninh khác với những blockchain sử dụng cơ chế bằng chứng công việc. Trong cơ chế bằng chứng cổ phần, các trình xác thực độc hại có thể bị trừng phạt trực tiếp (bị “cắt giảm”) và bị loại khỏi tập hợp xác thực, đồng thời mất đi một lượng lớn ETH. Trong cơ chế bằng chứng công việc, một kẻ tấn công có thể liên tục lặp lại cuộc tấn công miễn là họ có đủ sức mạnh băm. Việc thực hiện các cuộc tấn công tương tự trên Ethereum sử dụng cơ chế bằng chứng cổ phần tốn kém hơn nhiều so với bằng chứng công việc. Để ảnh hưởng đến tính sống còn của chuỗi, cần ít nhất 33% tổng số ETH đã đặt cọc trong mạng lưới (ngoại trừ các trường hợp tấn công cực kỳ tinh vi với khả năng thành công cực thấp). Để kiểm soát nội dung của các khối trong tương lai, cần ít nhất 51% tổng số ETH đã đặt cọc, và để viết lại lịch sử, cần hơn 66% tổng số tài sản đặt cọc. Giao thức Ethereum sẽ tiêu hủy những tài sản này trong các kịch bản tấn công 33% hoặc 51%, và bằng sự đồng thuận xã hội trong kịch bản tấn công 66%.
+
+- [Tìm hiểu thêm về cách bảo vệ bằng chứng cổ phần Ethereum khỏi những kẻ tấn công](/developers/docs/consensus-mechanisms/pos/attack-and-defense)
+- [Tìm hiểu thêm về thiết kế bằng chứng cổ phần](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51)
+
+## Cơ chế bằng chứng cổ phần có làm cho Ethereum rẻ hơn không? {#does-pos-make-ethereum-cheaper}
+
+Không. Chi phí để gửi một giao dịch (phí gas) được quyết định bởi một thị trường phí biến động, tăng lên khi nhu cầu mạng cao hơn. Cơ chế đồng thuận không trực tiếp ảnh hưởng đến điều này.
+
+[Tìm hiểu thêm về gas](/developers/docs/gas).
+
+## Nút, khách hàng và trình xác thực là gì? {#what-are-nodes-clients-and-validators}
+
+Nút là các máy tính được kết nối với mạng Ethereum. Khách hàng là phần mềm mà chúng chạy để biến máy tính thành một nút. Có hai loại khách hàng: khách hàng thực thi và khách hàng đồng thuận. Cả hai đều cần thiết để tạo ra một nút. Trình xác thực là một phần bổ sung tùy chọn cho khách hàng đồng thuận, cho phép nút tham gia vào cơ chế đồng thuận bằng chứng cổ phần. Điều này có nghĩa là tạo và đề xuất các khối khi được chọn, đồng thời chứng thực các khối mà họ nhận được trên mạng lưới. Để vận hành một trình xác thực, người vận hành nút phải gửi ký quỹ 32 ETH vào hợp đồng ký gửi.
+
+- [Tìm hiểu thêm về các nút và máy khách](/developers/docs/nodes-and-clients)
+- [Tìm hiểu thêm về đặt cọc](/staking)
+
+## Bằng chứng cổ phần có phải ý tưởng mới không? {#is-pos-new}
+
+Không. Một người dùng trên BitcoinTalk [đã đề xuất ý tưởng cơ bản về bằng chứng cổ phần](https://bitcointalk.org/index.php?topic=27787.0) như một bản nâng cấp cho Bitcoin vào năm 2011. Phải tới mười một năm sau mới sẵn sàng để tích hợp vào mạng chính Ethereum. Một số chuỗi khác đã triển khai bằng chứng cổ phần sớm hơn Ethereum, nhưng không phải cơ chế cụ thể của Ethereum (được gọi là Gasper).
+
+## Bằng chứng cổ phần của Ethereum có gì đặc biệt? {#why-is-ethereum-pos-special}
+
+Cơ chế bằng chứng cổ phần của Ethereum là độc nhất trong thiết kế của nó. Đây không phải là cơ chế bằng chứng cổ phần đầu tiên được thiết kế và triển khai, nhưng nó là cơ chế mạnh mẽ nhất. Cơ chế bằng chứng cổ phần được gọi là "Casper". Casper xác định cách người xác thực được chọn để đề xuất các khối, cách thức và thời điểm thực hiện các chứng thực, cách đếm các chứng thực, các phần thưởng và hình phạt dành cho người xác thực, các điều kiện xử phạt, các cơ chế an toàn như rò rỉ do không hoạt động, và các điều kiện cho "tính kết luận cuối cùng". Tính kết luận cuối cùng là điều kiện để một khối được coi là một phần vĩnh viễn của chuỗi chính tắc, nó phải được bỏ phiếu bởi ít nhất 66% tổng số ETH đã đặt cọc trên mạng. Các nhà nghiên cứu đã phát triển Casper dành riêng cho Ethereum, và Ethereum là chuỗi khối đầu tiên và duy nhất đã triển khai nó.
+
+Ngoài Casper, bằng chứng cổ phần của Ethereum sử dụng một thuật toán lựa chọn phân nhánh được gọi là LMD-GHOST. Điều này là cần thiết trong trường hợp phát sinh tình huống có hai khối tồn tại trong cùng một slot. Điều này tạo ra hai phân nhánh của chuỗi khối. LMD-GHOST chọn phân nhánh có "trọng số" chứng thực lớn nhất. Trọng số là số lượng các chứng thực được tính theo số dư hiệu lực của những người xác thực. LMD-GHOST là độc nhất của Ethereum.
+
+Sự kết hợp giữa Casper và LMD_GHOST được gọi là Gasper.
+
+[Tìm hiểu thêm về Gasper](/developers/docs/consensus-mechanisms/pos/gasper/)
+
+## Xử phạt là gì? {#what-is-slashing}
+
+Xử phạt là thuật ngữ chỉ việc phá hủy một phần cổ phần của người xác thực và loại bỏ người xác thực đó khỏi mạng. Số ETH bị mất trong một lần xử phạt sẽ thay đổi theo số lượng người xác thực bị xử phạt - điều này có nghĩa là những người xác thực thông đồng sẽ bị trừng phạt nặng hơn so với các cá nhân.
+
+[Tìm hiểu thêm về xử phạt](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing)
+
+## Tại sao người xác thực cần 32 ETH? {#why-32-eth}
+
+Người xác thực phải đặt cọc ETH để họ có thứ để mất nếu họ có hành vi sai trái. Lý do tại sao họ phải đặt cọc cụ thể 32 ETH là để cho phép các nút chạy trên phần cứng khiêm tốn. Nếu số ETH tối thiểu cho mỗi người xác thực thấp hơn, thì số lượng người xác thực và do đó số lượng thông điệp phải được xử lý trong mỗi slot sẽ tăng lên, có nghĩa là cần có phần cứng mạnh hơn để chạy một nút.
+
+## Người xác thực được chọn như thế nào? {#how-are-validators-selected}
+
+Một người xác thực duy nhất được chọn một cách ngẫu nhiên giả để đề xuất một khối trong mỗi slot bằng cách sử dụng một thuật toán gọi là RANDAO, thuật toán này trộn một hàm băm từ người đề xuất khối với một hạt giống được cập nhật mỗi khối. Giá trị này được sử dụng để chọn một người xác thực cụ thể từ tổng bộ người xác thực. Việc lựa chọn người xác thực được cố định trước hai epoch.
+
+[Tìm hiểu thêm về việc lựa chọn người xác thực](/developers/docs/consensus-mechanisms/pos/block-proposal)
+
+## Stake grinding là gì? {#what-is-stake-grinding}
+
+Stake grinding là một loại tấn công vào các mạng bằng chứng cổ phần, trong đó kẻ tấn công cố gắng làm sai lệch thuật toán lựa chọn người xác thực để ưu tiên cho những người xác thực của chính họ. Các cuộc tấn công stake grinding vào RANDAO yêu cầu khoảng một nửa tổng số ETH đã đặt cọc.
+
+[Tìm hiểu thêm về stake grinding](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability)
+
+## Xử phạt xã hội là gì? {#what-is-social-slashing}
+
+Xử phạt xã hội là khả năng cộng đồng phối hợp để tạo một phân nhánh của chuỗi khối nhằm đối phó với một cuộc tấn công. Nó cho phép cộng đồng phục hồi sau khi một kẻ tấn công hoàn tất một chuỗi không trung thực. Xử phạt xã hội cũng có thể được sử dụng để chống lại các cuộc tấn công kiểm duyệt.
+
+- [Tìm hiểu thêm về xử phạt xã hội](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7)
+- [Vitalik Buterin nói về xử phạt xã hội](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake)
+
+## Tôi có bị xử phạt không? {#will-i-get-slashed}
+
+Là một người xác thực, rất khó để bị xử phạt trừ khi bạn cố tình tham gia vào hành vi độc hại. Xử phạt chỉ được thực hiện trong các tình huống rất cụ thể, khi người xác thực đề xuất nhiều khối cho cùng một slot hoặc tự mâu thuẫn với các chứng thực của họ - những điều này rất khó xảy ra một cách vô tình.
+
+[Tìm hiểu thêm về các điều kiện xử phạt](https://eth2book.info/altair/part2/incentives/slashing)
+
+## Vấn đề nothing-at-stake là gì? {#what-is-nothing-at-stake-problem}
+
+Vấn đề nothing-at-stake là một vấn đề về mặt khái niệm với một số cơ chế bằng chứng cổ phần, nơi chỉ có phần thưởng mà không có hình phạt. Nếu không có gì để mất, một người xác thực thực dụng sẽ vui vẻ chứng thực cho bất kỳ, hoặc thậm chí nhiều, phân nhánh của chuỗi khối, vì điều này làm tăng phần thưởng của họ. Ethereum giải quyết vấn đề này bằng cách sử dụng các điều kiện về tính kết luận cuối cùng và xử phạt để đảm bảo một chuỗi chính tắc duy nhất.
+
+[Tìm hiểu thêm về vấn đề nothing-at-stake](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed)
+
+## Thuật toán lựa chọn nhánh là gì? {#what-is-a-fork-choice-algorithm}
+
+Thuật toán lựa chọn nhánh thực hiện các quy tắc để xác định chuỗi nào là chuỗi chuẩn. Trong điều kiện tối ưu, không cần đến quy tắc lựa chọn nhánh vì mỗi khe thời gian chỉ có một người đề xuất khối và một khối để lựa chọn. Tuy nhiên, đôi khi có thể xuất hiện nhiều khối cho cùng một khe thời gian hoặc thông tin đến chậm, dẫn đến nhiều lựa chọn khác nhau về cách các khối gần đầu chuỗi được sắp xếp. Trong những trường hợp này, tất cả các khách hàng đều phải thực thi một số quy tắc giống nhau để đảm bảo rằng họ đều chọn đúng chuỗi khối. Thuật toán lựa chọn nhánh mã hóa những quy tắc này.
+
+Thuật toán lựa chọn nhánh của Ethereum được gọi là LMD-GHOST. Nó chọn nhánh có trọng số xác thực lớn nhất, tức là nhánh mà phần ETH đặt cọc nhiều nhất đã bỏ phiếu.
+
+[Tìm hiểu thêm về LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper/#fork-choice)
+
+## Tính cuối cùng trong cơ chế bằng chứng cổ phần là gì? {#what-is-finality}
+
+Tính cuối cùng trong bằng chứng cổ phần là sự đảm bảo rằng một khối nhất định sẽ trở thành một phần vĩnh viễn của chuỗi chính và không thể bị đảo ngược trừ khi xảy ra lỗi đồng thuận, trong đó một kẻ tấn công phải đốt 33% tổng số ether đã đặt cọc. Đây là “tính cuối cùng kinh tế-mã hóa”, trái ngược với “tính cuối cùng xác suất” vốn liên quan đến các blockchain dùng bằng chứng công việc. Trong tính cuối cùng xác suất, không có trạng thái nào rõ ràng là đã hoàn tất hay chưa hoàn tất đối với các khối – nó chỉ đơn giản trở nên ít có khả năng hơn rằng một khối có thể bị loại bỏ khỏi chuỗi khi nó ngày càng cũ đi, và người dùng sẽ tự quyết định khi nào họ đủ tin tưởng rằng một khối là “an toàn”. Với tính cuối cùng kinh tế-mã hóa, các cặp khối điểm kiểm tra phải được ít nhất 66% lượng ether đặt cọc bỏ phiếu tán thành. Nếu điều kiện này được đáp ứng, các khối nằm giữa những điểm kiểm tra đó sẽ được xác nhận rõ ràng là “hoàn tất”.
+
+[Tìm hiểu thêm về tính kết luận cuối cùng](/developers/docs/consensus-mechanisms/pos/#finality)
+
+## Tính “chủ quan yếu” là gì? {#what-is-weak-subjectivity}
+
+Chủ quan yếu là một đặc điểm của các mạng lưới bằng chứng cổ phần, trong đó thông tin xã hội được sử dụng để xác nhận trạng thái hiện tại của blockchain. Các nút mới hoặc các nút tham gia lại mạng sau một thời gian ngoại tuyến dài có thể được cung cấp một điểm kiểm tra gần đây để nút đó có thể ngay lập tức nhận biết liệu mình đang ở trên chuỗi đúng hay không. Những trạng thái này được gọi là “các điểm kiểm tra của chủ quan yếu” và có thể được lấy từ những người vận hành nút khác ngoài kênh chính, hoặc từ các trình khám phá khối, hoặc từ một số điểm truy cập công khai.
+
+[Tìm hiểu thêm về tính chủ quan yếu](/developers/docs/consensus-mechanisms/pos/weak-subjectivity)
+
+## Cơ chế bằng chứng cổ phần có chống kiểm duyệt không? {#is-pos-censorship-resistant}
+
+Khả năng chống kiểm duyệt hiện tại vẫn khó chứng minh. Tuy nhiên, không giống như bằng chứng công việc, bằng chứng cổ phần cung cấp tùy chọn phối hợp cắt giảm để trừng phạt các trình xác thực có hành vi kiểm duyệt. Sắp tới sẽ có những thay đổi trong giao thức nhằm tách biệt những người xây dựng khối khỏi những người đề xuất khối và áp dụng danh sách các giao dịch mà người xây dựng phải đưa vào mỗi khối. Đề xuất này được gọi là “tách biệt người xây dựng và người đề xuất”, và nó giúp ngăn các trình xác thực kiểm duyệt giao dịch.
+
+[Tìm hiểu thêm về việc tách biệt người đề xuất-người xây dựng](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme)
+
+## Hệ thống bằng chứng cổ phần của Ethereum có thể bị tấn công 51% không? {#pos-51-attack}
+
+Đúng vậy. Bằng chứng cổ phần dễ bị tấn công 51%, giống như bằng chứng công việc. Thay vì kẻ tấn công cần 51% sức mạnh băm của mạng, thì trong cơ chế này kẻ tấn công cần 51% tổng số ETH đã đặt cọc. Một kẻ tấn công tích lũy được 51% tổng số tài sản đặt cọc sẽ kiểm soát thuật toán lựa chọn nhánh. Điều này cho phép kẻ tấn công kiểm duyệt một số giao dịch, thực hiện sắp xếp lại ngắn hạn và trích xuất MEV bằng cách sắp xếp lại các khối theo hướng có lợi cho họ.
+
+[Tìm hiểu thêm về các cuộc tấn công vào bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/attack-and-defense)
+
+## Sự phối hợp xã hội là gì, và tại sao nó cần thiết? {#what-is-social-coordination}
+
+Sự phối hợp xã hội là tuyến phòng thủ cuối cùng của Ethereum, cho phép một chuỗi trung thực có thể phục hồi sau một cuộc tấn công mà trong đó các khối gian lận đã được hoàn tất. Trong trường hợp này, cộng đồng Ethereum sẽ phải phối hợp “ngoài kênh chính” và đồng ý sử dụng một nhánh thiểu số trung thực, đồng thời cắt giảm các trình xác thực của kẻ tấn công trong quá trình đó. Điều này cũng đòi hỏi các ứng dụng và sàn giao dịch phải công nhận nhánh trung thực.
+
+[Đọc thêm về sự phối hợp xã hội](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense)
+
+## Người giàu có giàu thêm trong cơ chế bằng chứng cổ phần không? {#do-rich-get-richer}
+
+Càng có nhiều ETH để đặt cọc, một người càng có thể vận hành nhiều trình xác thực hơn và nhận được nhiều phần thưởng hơn. Phần thưởng tăng tuyến tính theo lượng ETH đã đặt cọc, và mọi người đều nhận được tỷ lệ lợi nhuận phần trăm như nhau. Cơ chế bằng chứng công việc làm người giàu trở nên giàu hơn nhiều so với cơ chế bằng chứng cổ phần, bởi vì những thợ đào giàu hơn có thể đầu tư vào phần cứng mạnh mẽ hơn.
+
+## Cơ chế bằng chứng cổ phần có tập trung hóa hơn bằng chứng công việc không? {#is-pos-decentralized}
+
+Không, bằng chứng công việc có xu hướng tập trung hóa vì chi phí khai thác tăng lên và loại bỏ dần các cá nhân, sau đó loại bỏ cả các công ty nhỏ, và cứ thế tiếp diễn. Vấn đề hiện tại của bằng chứng cổ phần là ảnh hưởng của các sản phẩm phái sinh đặt cọc thanh khoản (LSDs). Đây là các token đại diện cho ETH đã được đặt cọc bởi một nhà cung cấp nào đó, và mọi người có thể hoán đổi chúng trên các thị trường thứ cấp mà không cần rút ETH ra. LSDs cho phép người dùng đặt cọc với ít hơn 32 ETH, nhưng đồng thời cũng tạo ra rủi ro tập trung hóa nếu một vài tổ chức lớn có thể kiểm soát phần lớn lượng tài sản đặt cọc. Đây là lý do tại sao [đặt cọc một mình](/staking/solo) là lựa chọn tốt nhất cho Ethereum.
+
+[Tìm hiểu thêm về việc tập trung hóa cổ phần trong LSD](https://notes.ethereum.org/@djrtwo/risks-of-lsd)
+
+## Tại sao tôi chỉ có thể ký gửi ETH? {#why-can-i-only-stake-eth}
+
+ETH là tiền tệ nội địa của Ethereum. Việc có một loại tiền tệ duy nhất mà trong đó tất cả các cổ phần được định giá là điều cần thiết, cho cả việc hạch toán số dư hiệu lực để tính trọng số phiếu bầu và cho mục đích bảo mật. Bản thân ETH là một thành phần cơ bản của Ethereum chứ không phải là một hợp đồng thông minh. Việc kết hợp các loại tiền tệ khác sẽ làm tăng đáng kể độ phức tạp và giảm tính bảo mật của việc đặt cọc.
+
+## Ethereum có phải chuỗi khối duy nhất dùng bằng chứng cổ phần? {#is-ethereum-the-only-pos-blockchain}
+
+Không, có vài chuỗi khối bằng chứng cổ phần khác. Không có cái nào giống Ethereum. cơ chế bằng chứng cổ phần của Ethereum là độc nhất.
+
+## Sự kiện Hợp nhất là gì? {#what-is-the-merge}
+
+Sự kiện Hợp nhất là khoảnh khắc Ethereum tắt cơ chế đồng thuận bằng chứng công việc của mình và bật cơ chế đồng thuận bằng chứng cổ phẩn. Sự kiện Hợp nhất đã diễn ra vào 15 tháng 9 năm 2022.
+
+[Tìm hiểu thêm về The Merge](/roadmap/merge)
+
+## Tính hoạt động và tính an toàn là gì? {#what-are-liveness-and-safety}
+
+Tính hoạt động và tính an toàn là hai mối quan tâm bảo mật cơ bản đối với một chuỗi khối. Tính hoạt động là sự sẵn có của một chuỗi đang hoàn tất. Nếu chuỗi ngừng hoàn tất hoặc người dùng không thể truy cập dễ dàng, đó là những thất bại về tính hoạt động. Chi phí truy cập cực kỳ cao cũng có thể được coi là một thất bại về tính hoạt động. Tính an toàn đề cập đến mức độ khó khăn để tấn công chuỗi - tức là hoàn tất các điểm kiểm tra xung đột.
+
+[Đọc thêm trong tài liệu về Casper](https://arxiv.org/pdf/1710.09437.pdf)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/gasper/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/gasper/index.md
new file mode 100644
index 00000000000..6fdaa6c9371
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/gasper/index.md
@@ -0,0 +1,52 @@
+---
+title: Gasper
+description: Giải thích về cơ chế bằng chứng cổ phần Gasper.
+lang: vi
+---
+
+Gasper là sự kết hợp của Casper the Friendly Finality Gadget (Casper-FFG) và thuật toán lựa chọn phân nhánh LMD-GHOST. Các thành phần này cùng nhau tạo thành cơ chế đồng thuận bảo mật cho Ethereum bằng chứng cổ phần. Casper là cơ chế nâng cấp các khối nhất định thành "hoàn tất" để những người mới tham gia vào mạng có thể tin tưởng rằng họ đang đồng bộ hóa chuỗi chính tắc. Thuật toán lựa chọn phân nhánh sử dụng các phiếu bầu tích lũy để đảm bảo rằng các nút có thể dễ dàng chọn đúng khi các phân nhánh phát sinh trong chuỗi khối.
+
+**Lưu ý** rằng định nghĩa ban đầu của Casper-FFG đã được cập nhật một chút để đưa vào Gasper. Trên trang này, chúng tôi xem xét phiên bản đã cập nhật.
+
+## Lời mở đầu
+
+Để hiểu tài liệu này, cần phải đọc trang giới thiệu về [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/).
+
+## Vai trò của Gasper {#role-of-gasper}
+
+Gasper nằm trên một chuỗi khối bằng chứng cổ phần, nơi các nút cung cấp ether làm tiền ký quỹ bảo mật có thể bị hủy nếu chúng lười biếng hoặc không trung thực trong việc đề xuất hoặc xác thực các khối. Gasper là cơ chế xác định cách các trình xác thực được thưởng và bị phạt, quyết định chấp nhận và từ chối khối nào và xây dựng trên phân nhánh nào của chuỗi khối.
+
+## Tính kết luận cuối cùng là gì? {#what-is-finality}
+
+Tính kết luận cuối cùng là một thuộc tính của các khối nhất định có nghĩa là chúng không thể bị hoàn nguyên trừ khi đã có một lỗi đồng thuận nghiêm trọng và một kẻ tấn công đã phá hủy ít nhất 1/3 tổng số ether đã đặt cọc. Các khối đã hoàn tất có thể được coi là thông tin mà chuỗi khối chắc chắn. Một khối phải trải qua một quy trình nâng cấp hai bước để được hoàn tất:
+
+1. Hai phần ba tổng số ether đã đặt cọc phải đã bỏ phiếu ủng hộ việc đưa khối đó vào chuỗi chính tắc. Điều kiện này nâng cấp khối thành "hợp lý". Các khối hợp lý không có khả năng bị hoàn nguyên, nhưng có thể bị trong một số điều kiện nhất định.
+2. Khi một khối khác được hợp lý hóa trên một khối đã hợp lý, nó được nâng cấp thành "hoàn tất". Việc hoàn tất một khối là một cam kết đưa khối đó vào chuỗi chính tắc. Nó không thể bị hoàn nguyên trừ khi một kẻ tấn công phá hủy hàng triệu ether (hàng tỷ USD).
+
+Những nâng cấp khối này không xảy ra trong mọi slot. Thay vào đó, chỉ các khối ranh giới tham số epoch mới có thể được hợp lý hóa và hoàn tất. Các khối này được gọi là "điểm kiểm tra". Việc nâng cấp xem xét các cặp điểm kiểm tra. Một "liên kết siêu đa số" phải tồn tại giữa hai điểm kiểm tra liên tiếp (tức là, hai phần ba tổng số ether đã đặt cọc bỏ phiếu rằng điểm kiểm tra B là hậu duệ chính xác của điểm kiểm tra A) để nâng cấp điểm kiểm tra cũ hơn thành hoàn tất và khối gần đây hơn thành hợp lý.
+
+Bởi vì tính kết luận cuối cùng yêu cầu sự đồng ý của hai phần ba rằng một khối là chính tắc, một kẻ tấn công không thể tạo ra một chuỗi đã hoàn tất thay thế mà không:
+
+1. Sở hữu hoặc thao túng hai phần ba tổng số ether đã đặt cọc.
+2. Phá hủy ít nhất một phần ba tổng số ether đã đặt cọc.
+
+Điều kiện đầu tiên phát sinh vì cần có hai phần ba số ether đã đặt cọc để hoàn tất một chuỗi. Điều kiện thứ hai phát sinh bởi vì nếu hai phần ba tổng số cổ phần đã bỏ phiếu ủng hộ cả hai phân nhánh, thì một phần ba phải đã bỏ phiếu cho cả hai. Bỏ phiếu hai lần là một điều kiện phạt cắt giảm sẽ bị trừng phạt tối đa, và một phần ba tổng số cổ phần sẽ bị phá hủy. Kể từ tháng 5 năm 2022, điều này yêu cầu một kẻ tấn công phải đốt khoảng 10 tỷ đô la giá trị ether. Thuật toán hợp lý hóa và hoàn tất các khối trong Gasper là một dạng sửa đổi một chút của [Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437.pdf).
+
+### Ưu đãi và Phạt cắt giảm {#incentives-and-slashing}
+
+Các trình xác thực được thưởng vì đã đề xuất và xác thực các khối một cách trung thực. Ether được thưởng và được thêm vào cổ phần của họ. Mặt khác, các trình xác thực vắng mặt và không hành động khi được yêu cầu sẽ bỏ lỡ những phần thưởng này và đôi khi mất một phần nhỏ cổ phần hiện có của họ. Tuy nhiên, các hình phạt cho việc ngoại tuyến là nhỏ và, trong hầu hết các trường hợp, tương đương với chi phí cơ hội của việc bỏ lỡ phần thưởng. Tuy nhiên, một số hành động của trình xác thực rất khó thực hiện một cách vô tình và biểu thị một số ý định độc hại, chẳng hạn như đề xuất nhiều khối cho cùng một slot, chứng thực cho nhiều khối cho cùng một slot, hoặc mâu thuẫn với các phiếu bầu điểm kiểm tra trước đó. Đây là những hành vi "có thể bị phạt cắt giảm" bị phạt nặng hơn—phạt cắt giảm dẫn đến một phần cổ phần của trình xác thực bị phá hủy và trình xác thực bị loại khỏi mạng lưới các trình xác thực. Quá trình này mất 36 ngày. Vào ngày 1, có một hình phạt ban đầu lên đến 1 ETH. Sau đó, ether của trình xác thực bị phạt cắt giảm sẽ từ từ cạn kiệt trong suốt thời gian thoát, nhưng vào Ngày 18, họ nhận được một "hình phạt tương quan", hình phạt này lớn hơn khi có nhiều trình xác thực bị phạt cắt giảm cùng lúc. Hình phạt tối đa là toàn bộ cổ phần. Những phần thưởng và hình phạt này được thiết kế để khuyến khích các trình xác thực trung thực và ngăn cản các cuộc tấn công vào mạng.
+
+### Rò rỉ do không hoạt động {#inactivity-leak}
+
+Cũng như bảo mật, Gasper cũng cung cấp "tính sống động hợp lý". Đây là điều kiện mà miễn là hai phần ba tổng số ether đã đặt cọc đang bỏ phiếu một cách trung thực và tuân theo giao thức, chuỗi sẽ có thể hoàn tất bất kể bất kỳ hoạt động nào khác (chẳng hạn như các cuộc tấn công, vấn đề về độ trễ hoặc phạt cắt giảm). Nói cách khác, một phần ba tổng số ether đã đặt cọc phải bị xâm phạm bằng cách nào đó để ngăn chuỗi hoàn tất. Trong Gasper, có một tuyến phòng thủ bổ sung chống lại lỗi về tính sống động, được gọi là "rò rỉ do không hoạt động". Cơ chế này được kích hoạt khi chuỗi không thể hoàn tất trong hơn bốn tham số epoch. Các trình xác thực không tích cực chứng thực cho chuỗi đa số sẽ bị rút dần cổ phần của họ cho đến khi phe đa số giành lại được hai phần ba tổng số cổ phần, đảm bảo rằng các lỗi về tính sống động chỉ là tạm thời.
+
+### Lựa chọn phân nhánh {#fork-choice}
+
+Định nghĩa ban đầu của Casper-FFG bao gồm một thuật toán lựa chọn phân nhánh áp đặt quy tắc: `theo chuỗi chứa điểm kiểm tra hợp lý có độ cao lớn nhất` trong đó độ cao được định nghĩa là khoảng cách lớn nhất từ khối khởi nguyên. Trong Gasper, quy tắc lựa chọn phân nhánh ban đầu không còn được dùng nữa thay vào đó là một thuật toán phức tạp hơn có tên là LMD-GHOST. Điều quan trọng là phải nhận ra rằng trong điều kiện bình thường, quy tắc lựa chọn phân nhánh là không cần thiết - có một người đề xuất khối duy nhất cho mỗi slot, và các trình xác thực trung thực sẽ chứng thực cho nó. Chỉ trong trường hợp mạng không đồng bộ lớn hoặc khi một người đề xuất khối không trung thực đã đưa ra thông tin không nhất quán thì mới cần đến thuật toán lựa chọn phân nhánh. Tuy nhiên, khi những trường hợp đó phát sinh, thuật toán lựa chọn phân nhánh là một cơ chế phòng thủ quan trọng để bảo mật chuỗi chính xác.
+
+LMD-GHOST là viết tắt của "cây con quan sát được nặng nhất tham lam theo thông điệp mới nhất". Đây là một cách định nghĩa đầy thuật ngữ cho một thuật toán lựa chọn phân nhánh có trọng số chứng thực tích lũy lớn nhất làm phân nhánh chính tắc (cây con nặng nhất tham lam) và nếu nhận được nhiều thông điệp từ một trình xác thực, thì chỉ thông điệp mới nhất được xem xét (dựa trên thông điệp mới nhất). Trước khi thêm khối nặng nhất vào chuỗi chính tắc của mình, mọi trình xác thực đều đánh giá từng khối bằng quy tắc này.
+
+## Đọc thêm {#further-reading}
+
+- [Gasper: Kết hợp GHOST và Casper](https://arxiv.org/pdf/2003.03052.pdf)
+- [Casper the Friendly Finality Gadget](https://arxiv.org/pdf/1710.09437.pdf)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/index.md
new file mode 100644
index 00000000000..1defc744c96
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/index.md
@@ -0,0 +1,99 @@
+---
+title: Bằng chứng cổ phần (PoS)
+description: Giải thích về giao thức đồng thuận bằng chứng cổ phần và vai trò của nó trong Ethereum.
+lang: vi
+---
+
+Bằng chứng cổ phần (PoS) là nền tảng cho [cơ chế đồng thuận](/developers/docs/consensus-mechanisms/) của Ethereum. Ethereum đã chuyển sang cơ chế bằng chứng cổ phần vào năm 2022 vì nó an toàn hơn, ít tốn năng lượng hơn và tốt hơn cho việc triển khai các giải pháp mở rộng quy mô mới so với kiến trúc [bằng chứng công việc](/developers/docs/consensus-mechanisms/pow) trước đây.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [các cơ chế đồng thuận](/developers/docs/consensus-mechanisms/).
+
+## Proof-of-stake (bằng chứng cổ phần - PoS) là gì? {#what-is-pos}
+
+Bằng chứng cổ phần là cách để chứng minh rằng các Validators đã bỏ thứ gì đó có giá trị vào bên trong mạng lưới, thứ có thể bị phá huỷ nếu họ hành động không trung thực. Trong bằng chứng cổ phần của Ethereum, người xác thực sẽ đặt cọc vốn dưới dạng ETH vào hợp đồng thông minh trên Ethereum. Sau đó, người xác thực có trách nhiệm kiểm tra xem các khối mới được truyền qua mạng có hợp lệ hay không và đôi khi tự tạo và truyền các khối mới. Nếu họ cố gắng lừa đảo mạng (ví dụ bằng cách đề xuất nhiều khối khi họ chỉ nên gửi một khối hoặc gửi các chứng nhận xung đột), một số hoặc toàn bộ ETH họ đặt cọc có thể bị phá hủy.
+
+## Người xác thực {#validators}
+
+Để tham gia với tư cách là người xác thực, người dùng phải gửi 32 ETH vào hợp đồng gửi tiền và chạy ba phần mềm riêng biệt: ứng dụng thực hiện, ứng dụng đồng thuận và ứng dụng xác thực. Khi gửi ETH, người dùng sẽ tham gia vào hàng đợi kích hoạt để giới hạn số lượng người xác thực mới tham gia mạng. Sau khi được kích hoạt, người xác thực sẽ nhận được các khối mới từ những người ngang hàng trên mạng Ethereum. Các giao dịch được chuyển giao trong khối sẽ được thực hiện lại để kiểm tra xem những thay đổi được đề xuất đối với trạng thái của Ethereum có hợp lệ hay không và chữ ký khối sẽ được kiểm tra. Sau đó, người xác thực sẽ gửi một phiếu bầu (gọi là chứng thực) ủng hộ khối đó trên toàn mạng.
+
+Trong khi theo bằng chứng công việc, thời gian của các khối được xác định bởi độ khó khai thác thì theo bằng chứng cổ phần, nhịp độ được cố định. Thời gian trong bằng chứng cổ phần Ethereum được chia thành các slot (12 giây) và tham số epoch (32 slot). Một người xác thực được chọn ngẫu nhiên để trở thành người đề xuất khối trong mỗi vị trí. Người xác thực này chịu trách nhiệm tạo một khối mới và gửi nó đến các nút khác trên mạng. Ngoài ra, ở mỗi vị trí, một ủy ban gồm những người xác thực được chọn ngẫu nhiên, phiếu bầu của họ được sử dụng để xác định tính hợp lệ của khối được đề xuất. Chia người xác thực thành các ủy ban là rất quan trọng để quản lý được tải mạng. Các ủy ban phân chia nhóm người xác thực sao cho mọi người xác thực đang hoạt động đều chứng thực trong mọi tham số epoch, nhưng không phải trong mọi slot.
+
+## Cách một Giao dịch được Thực thi trong Ethereum PoS {#transaction-execution-ethereum-pos}
+
+Phần sau đây cung cấp lời giải thích toàn diện về cách thực hiện giao dịch trong cơ chế bằng chứng cổ phần của Ethereum.
+
+1. Người dùng tạo và ký một [giao dịch](/developers/docs/transactions/) bằng khóa riêng tư của họ. Tác vụ này thường được xử lý bởi một ví hoặc một thư viện như [ethers.js](https://docs.ethers.org/v6/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/), v.v. nhưng thực chất người dùng đang gửi yêu cầu tới một nút bằng [API JSON-RPC](/developers/docs/apis/json-rpc/) của Ethereum. Người dùng xác định số tiền gas mà họ sẵn sàng trả làm tiền boa cho người xác thực để khuyến khích họ đưa giao dịch vào một khối. [Phí ưu tiên](/developers/docs/gas/#priority-fee) được trả cho trình xác thực trong khi [phí cơ bản](/developers/docs/gas/#base-fee) bị đốt.
+2. Giao dịch được gửi đến một [máy khách thực thi](/developers/docs/nodes-and-clients/#execution-client) của Ethereum để xác minh tính hợp lệ của nó. Điều này có nghĩa là phải đảm bảo rằng người gửi có đủ ETH để thực hiện giao dịch và họ đã ký giao dịch bằng đúng khóa.
+3. Nếu giao dịch hợp lệ, ứng dụng thực hiện sẽ thêm giao dịch đó vào khu vực chờ cục bộ (danh sách các giao dịch đang chờ xử lý) và cũng phát nó đến các nút khác qua mạng gossip của lớp thực hiện. Khi các nút khác biết về giao dịch, chúng cũng sẽ thêm giao dịch đó vào khu vực chờ cục bộ của chúng. Người dùng nâng cao có thể không phát giao dịch của họ mà thay vào đó chuyển tiếp nó đến các trình tạo khối chuyên dụng như [Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview). Điều này cho phép họ sắp xếp các giao dịch trong các khối sắp tới để có lợi nhuận tối đa ([MEV](/developers/docs/mev/#mev-extraction)).
+4. Một trong các nút xác thực trên mạng là nút đề xuất khối cho slot hiện tại, trước đó đã được chọn ngẫu nhiên bằng RANDAO. Nút này chịu trách nhiệm xây dựng và phát khối tiếp theo sẽ được thêm vào chuỗi khối Ethereum và cập nhật trạng thái toàn cầu. Nút này bao gồm ba phần: ứng dụng thực thi, ứng dụng đồng thuận và ứng dụng xác thực. Ứng dụng thực thi sẽ đóng gói các giao dịch từ khu vực chờ cục bộ thành "tải trọng thực thi" và thực thi chúng cục bộ để tạo ra thay đổi trạng thái. Thông tin này được chuyển đến ứng dụng đồng thuận, tại đó tải trọng thực thi được gói lại thành một phần của "khối đèn hiệu" cũng chứa thông tin về phần thưởng, hình phạt, lệnh cắt, chứng thực, v.v. cho phép mạng đồng ý về trình tự các khối ở đầu chuỗi. Giao tiếp giữa máy khách thực thi và máy khách đồng thuận được mô tả chi tiết hơn trong [Kết nối Máy khách Đồng thuận và Máy khách Thực thi](/developers/docs/networking-layer/#connecting-clients).
+5. Các nút khác nhận được khối beacon mới trên mạng gossip lớp đồng thuận. Chúng chuyển nó đến ứng dụng thực hiện, tại đó các giao dịch được thực hiện lại cục bộ để đảm bảo thay đổi trạng thái được đề xuất là hợp lệ. Máy khách trình xác thực sau đó chứng thực rằng khối đó hợp lệ và là khối hợp lý tiếp theo trong khung nhìn của họ về chuỗi (nghĩa là nó được xây dựng trên chuỗi có trọng số chứng thực lớn nhất như được định nghĩa trong [quy tắc lựa chọn phân nhánh](/developers/docs/consensus-mechanisms/pos/#fork-choice)). Khối được thêm vào cơ sở dữ liệu cục bộ tại mỗi nút chứng thực khối đó.
+6. Giao dịch có thể được coi là "hoàn tất" nếu nó trở thành một phần của chuỗi có "liên kết siêu đa số" giữa hai điểm kiểm tra. Các điểm kiểm tra xuất hiện vào đầu mỗi tham số epoch và chúng tồn tại để tính đến thực tế là chỉ có một tập hợp con người xác thực đang hoạt động chứng thực trong mỗi slot, nhưng tất cả người xác thực đang hoạt động đều chứng thực trong mỗi tham số epoch. Do đó, chỉ giữa tham số epoch thì mới có thể chứng minh được 'liên kết siêu đa số' (đây là trường hợp 66% tổng số ETH được đặt cọc trên mạng đồng ý về hai điểm kiểm tra).
+
+Bạn có thể tìm thấy thông tin chi tiết hơn về tính kết luận cuối cùng bên dưới.
+
+## Tính kết luận cuối cùng {#finality}
+
+Một giao dịch có tính "cuối cùng" trong các mạng phân tán khi nó là một phần của khối không thể thay đổi nếu không có một lượng lớn ETH bị đốt cháy. Trên Ethereum bằng chứng cổ phần (Proof-of-Stake), việc này được quản lý bằng cách sử dụng các khối "checkpoint". Khối đầu tiên trong mỗi kỷ nguyên (epoch) là một checkpoint. Người xác thực bỏ phiếu cho các cặp checkpoint mà nó cho là hợp lệ. Nếu một cặp checkpoint thu hút được số phiếu đại diện cho ít nhất 2/3 tổng số ETH đã được stake thì checkpoint sẽ được nâng cấp. Khi cả hai (target) trở thành "được chứng minh là đúng" (justified) càng gần với hiện tại. Thì cả hai cái trước đó "được chứng minh là đúng" (justified) càng sớm bởi vì nó là "mục tiêu" (target) của kỷ nguyên (epoch) trước. Giờ nó được nâng cấp lên thành "hoàn thiện" (finalized). Quá trình nâng cấp các điểm kiểm tra này được xử lý bởi **[Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437)**. Casper-FFG là một công cụ xác định tính cuối cùng của khối cho sự đồng thuận. Một khi một khối được hoàn tất, nó không thể bị hoàn lại hoặc thay đổi nếu không có sự cắt giảm đa số người đặt cược, khiến nó không khả thi về mặt kinh tế.
+
+Để hoàn tác một khối đã hoàn tất, kẻ tấn công sẽ phải mất ít nhất một phần ba tổng nguồn cung ETH đã đặt cọc. Lý do chính xác cho điều này được giải thích trong [bài đăng trên blog của Ethereum Foundation](https://blog.ethereum.org/2016/05/09/on-settlement-finality/). Vì tính kết luận cuối cùng đòi hỏi phải có đa số hai phần ba, nên kẻ tấn công có thể ngăn chặn mạng đạt được tính kết luận cuối cùng bằng cách bỏ phiếu bằng một phần ba tổng số đặt cọt. Có một cơ chế để chống lại điều này: [rò rỉ do không hoạt động](https://eth2book.info/bellatrix/part2/incentives/inactivity). Tính năng này được kích hoạt bất cứ khi nào chuỗi không hoàn tất trong hơn bốn tham số epoch. Rò rỉ không hoạt động sẽ làm mất đi số ETH đã đặt cọc từ những người xác thực bỏ phiếu chống lại đa số, cho phép đa số giành lại được hai phần ba và hoàn thiện chuỗi.
+
+## Bảo mật kinh tế tiền mã hóa {#crypto-economic-security}
+
+Vận hành trình xác thực là một cam kết. Người xác thực được kỳ vọng sẽ duy trì đủ phần cứng và kết nối để tham gia xác thực khối và đề xuất. Đổi lại, người xác thực được trả bằng ETH (số dư đặt cọc của họ tăng lên). Mặt khác, việc tham gia với tư cách là người xác thực cũng mở ra những con đường mới cho người dùng tấn công mạng để trục lợi cá nhân hoặc phá hoại. Để ngăn chặn điều này, người xác thực sẽ mất phần thưởng ETH nếu họ không tham gia khi được yêu cầu và đặt cọc hiện tại của họ có thể bị hủy nếu họ hành xử không trung thực. Hai hành vi chính có thể bị coi là không trung thực: đề xuất nhiều khối trong một slot duy nhất (lập lờ) và gửi các chứng thực mâu thuẫn.
+
+Số lượng ETH bị cắt giảm phụ thuộc vào số lượng người xác thực cũng bị cắt giảm tại cùng thời điểm. Điều này được gọi là [\"hình phạt tương quan\"](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty), và nó có thể là nhỏ (~1% cổ phần cho một trình xác thực bị cắt giảm một mình) hoặc có thể dẫn đến việc 100% cổ phần của trình xác thực bị phá hủy (sự kiện cắt giảm hàng loạt). Nó được áp dụng vào giữa giai đoạn thoát bắt buộc bắt đầu bằng hình phạt ngay lập tức (tối đa 1 ETH) vào Ngày 1, hình phạt tương quan vào Ngày 18 và cuối cùng là bị loại khỏi mạng vào Ngày 36. Họ nhận được những hình phạt chứng thực nhỏ mỗi ngày vì họ có mặt trên mạng nhưng không gửi phiếu bầu. Tất cả điều này có nghĩa là một cuộc tấn công phối hợp sẽ rất tốn kém cho kẻ tấn công.
+
+## Lựa chọn phân nhánh {#fork-choice}
+
+Khi mạng hoạt động tối ưu và trung thực, sẽ chỉ có một khối mới ở đầu chuỗi và tất cả người xác thực đều chứng thực điều đó. Tuy nhiên, người xác thực có thể có quan điểm khác nhau về người đứng đầu chuỗi do độ trễ của mạng hoặc do người đề xuất khối đã không rõ ràng. Do đó, ứng dụng đồng thuận cần có một thuật toán để quyết định nên ưu tiên cái nào. Thuật toán được sử dụng trong bằng chứng cổ phần của Ethereum được gọi là [LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf), và nó hoạt động bằng cách xác định phân nhánh có trọng số chứng thực lớn nhất trong lịch sử của nó.
+
+## Bằng chứng cổ phần và bảo mật {#pos-and-security}
+
+Mối đe dọa về một [cuộc tấn công 51%](https://www.investopedia.com/terms/1/51-attack.asp) vẫn tồn tại trên bằng chứng cổ phần cũng như trên bằng chứng công việc, nhưng nó thậm chí còn rủi ro hơn cho những kẻ tấn công. Kẻ tấn công sẽ cần 51% số ETH đã đặt cọc. Sau đó, họ có thể sử dụng chứng thực riêng để đảm bảo rằng nĩa họ ưa thích là nĩa có nhiều chứng thực tích lũy nhất. 'Trọng số' của các chứng thực tích lũy là những gì ứng dụng đồng thuận sử dụng để xác định chuỗi chính xác, do đó kẻ tấn công này sẽ có thể biến nĩa của họ thành nĩa chuẩn. Tuy nhiên, điểm mạnh của bằng chứng cổ phần so với bằng chứng công việc là cộng đồng linh hoạt trong phản công. Ví dụ, những người xác thực trung thực có thể quyết định tiếp tục xây dựng trên chuỗi thiểu số và bỏ qua nĩa của kẻ tấn công trong khi khuyến khích các ứng dụng, sàn giao dịch và nhóm làm như vậy. Họ cũng có thể quyết định buộc kẻ tấn công phải rời khỏi mạng và phá hủy số ETH đã đặt cọc của họ. Đây là biện pháp phòng thủ kinh tế mạnh mẽ chống lại cuộc tấn công 51%.
+
+Ngoài các cuộc tấn công 51%, kẻ xấu cũng có thể thực hiện các hoạt động độc hại khác, chẳng hạn như:
+
+- các cuộc tấn công tầm xa (mặc dù tính kết luận cuối cùng vô hiệu hóa hướng tấn công này)
+- 'tổ chức lại' tầm ngắn (mặc dù việc đề xuất ưu tiên và thời hạn chứng thực làm giảm bớt điều này)
+- các cuộc tấn công bật nảy và cân bằng (cũng được giảm nhẹ bằng đề xuất ưu tiên và các cuộc tấn công này dù sao cũng chỉ được chứng minh trong điều kiện mạng lý tưởng)
+- tấn công tuyết lở (bị vô hiệu hóa bởi quy tắc thuật toán lựa chọn nĩa chỉ xem xét thông điệp mới nhất)
+
+Nhìn chung, bằng chứng cổ phần được triển khai trên Ethereum đã được chứng minh là bảo mật hơn về mặt kinh tế so với bằng chứng công việc.
+
+## Ưu và nhược điểm {#pros-and-cons}
+
+| Ưu điểm | Nhược điểm |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
+| Đặt cọc giúp cá nhân dễ dàng tham gia vào bảo mật mạng, thúc đẩy tính phi tập trung. nút người xác thực có thể chạy trên máy tính xách tay thông thường. Nhóm đặt cọc cho phép người dùng đặt cọc mà không cần có 32 ETH. | Bằng chứng cổ phần còn mới và ít được thử nghiệm thực tế hơn so với bằng chứng công việc |
+| Đặt cược có tính phi tập trung cao hơn. Các hiệu quả kinh tế theo quy mô không áp dụng theo cách giống như đối với khai thác PoW. | Bằng chứng cổ phần phức tạp hơn khi triển khai so với bằng chứng công việc |
+| Bằng chứng cổ phần cung cấp tính bảo mật kinh tế tiền điện tử cao hơn bằng chứng công việc | Người dùng cần chạy ba phần mềm để tham gia vào cơ chế bằng chứng cổ phần của Ethereum. |
+| Cần phải phát hành ít ETH mới hơn để khuyến khích những người tham gia mạng | |
+
+### So sánh với bằng chứng công việc {#comparison-to-proof-of-work}
+
+Ethereum ban đầu sử dụng bằng chứng công việc nhưng đã chuyển sang bằng chứng cổ phần vào tháng 9 năm 2022. PoS có một số ưu điểm so với PoW, chẳng hạn như:
+
+- hiệu quả năng lượng tốt hơn – không cần sử dụng nhiều năng lượng cho các tính toán bằng chứng công việc
+- rào cản gia nhập thấp hơn, yêu cầu phần cứng giảm – không cần phần cứng tinh nhuệ để có cơ hội tạo ra các khối mới
+- giảm rủi ro tập trung hóa – bằng chứng cổ phần sẽ dẫn đến nhiều nút bảo mật mạng hơn
+- vì nhu cầu năng lượng thấp nên cần ít phát hành ETH hơn để khuyến khích tham gia
+- hình phạt kinh tế cho hành vi sai trái làm cho cuộc tấn công kiểu 51% tốn kém hơn cho kẻ tấn công so với bằng chứng công việc
+- cộng đồng có thể dùng đến biện pháp phục hồi xã hội của một chuỗi trung thực nếu một cuộc tấn công 51% vượt qua được các biện pháp phòng thủ kinh tế tiền điện tử.
+
+## Đọc thêm {#further-reading}
+
+- [Câu hỏi thường gặp về Bằng chứng Cổ phần](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_
+- [Bằng chứng Cổ phần là gì](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_
+- [Bằng chứng Cổ phần là gì và Tại sao nó lại quan trọng](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_
+- [Tại sao nên dùng Bằng chứng Cổ phần (Tháng 11 năm 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_
+- [Bằng chứng Cổ phần: Làm thế nào tôi học được cách yêu tính chủ quan yếu](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_
+- [Tấn công và phòng thủ trên Ethereum bằng chứng cổ phần](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs)
+- [Triết lý Thiết kế Bằng chứng Cổ phần](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_
+- [Video: Vitalik Buterin giải thích về bằng chứng cổ phần cho Lex Fridman](https://www.youtube.com/watch?v=3yrqBG-7EVE)
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/)
+- [Bằng chứng ủy quyền](/developers/docs/consensus-mechanisms/poa/)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/keys/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/keys/index.md
new file mode 100644
index 00000000000..44f4bd91bc9
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/keys/index.md
@@ -0,0 +1,102 @@
+---
+title: Các khóa trong Ethereum bằng chứng cổ phần
+description: Giải thích về các khóa được sử dụng trong cơ chế đồng thuận bằng chứng cổ phần của Ethereum
+lang: vi
+---
+
+Ethereum bảo mật tài sản của người dùng bằng cách sử dụng mật mã hóa khóa công khai-riêng tư. Khóa công khai được sử dụng làm cơ sở cho một địa chỉ Ethereum—tức là nó hiển thị công khai và được sử dụng như một mã định danh duy nhất. Khóa riêng tư (hay khóa 'bí mật') chỉ nên được chủ tài khoản truy cập. Khóa riêng tư được sử dụng để 'ký' các giao dịch và dữ liệu để mật mã học có thể chứng minh rằng chủ sở hữu chấp thuận một hành động nào đó của một khóa riêng tư cụ thể.
+
+Các khóa của Ethereum được tạo bằng [mật mã hóa đường cong elip](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography).
+
+Tuy nhiên, khi Ethereum chuyển từ [bằng chứng công việc](/developers/docs/consensus-mechanisms/pow) sang [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos), một loại khóa mới đã được thêm vào Ethereum. Các khóa ban đầu vẫn hoạt động chính xác như trước—không có thay đổi nào đối với các khóa dựa trên đường cong elip bảo mật tài khoản. Tuy nhiên, người dùng cần một loại khóa mới để tham gia vào bằng chứng cổ phần bằng cách đặt cọc ETH và chạy trình xác thực. Nhu cầu này phát sinh từ những thách thức về khả năng mở rộng liên quan đến nhiều thông báo được truyền giữa một số lượng lớn trình xác thực, đòi hỏi một phương pháp mã hóa có thể dễ dàng tổng hợp để giảm lượng giao tiếp cần thiết cho mạng lưới đi đến đồng thuận.
+
+Loại khóa mới này sử dụng lược đồ chữ ký [**Boneh-Lynn-Shacham (BLS)**](https://wikipedia.org/wiki/BLS_digital_signature). BLS cho phép tổng hợp chữ ký rất hiệu quả nhưng cũng cho phép thiết kế ngược các khóa trình xác thực riêng lẻ được tổng hợp và lý tưởng cho việc quản lý các hành động giữa các trình xác thực.
+
+## Hai loại khóa của trình xác thực {#two-types-of-keys}
+
+Trước khi chuyển sang bằng chứng cổ phần, người dùng Ethereum chỉ có một khóa riêng tư dựa trên đường cong elip duy nhất để truy cập vào tiền của họ. Với sự ra đời của bằng chứng cổ phần, những người dùng muốn trở thành người đặt cọc đơn lẻ cũng cần có một **khóa trình xác thực** và một **khóa rút tiền**.
+
+### Khóa trình xác thực {#validator-key}
+
+Khóa ký của trình xác thực bao gồm hai yếu tố:
+
+- Khóa **riêng tư** của trình xác thực
+- Khóa **công khai** của trình xác thực
+
+Mục đích của khóa riêng tư của trình xác thực là ký các hoạt động trên chuỗi như đề xuất khối và chứng thực. Vì vậy, các khóa này phải được giữ trong ví nóng.
+
+Sự linh hoạt này có ưu điểm là di chuyển các khóa ký của trình xác thực rất nhanh từ thiết bị này sang thiết bị khác, tuy nhiên, nếu chúng bị mất hoặc bị đánh cắp, kẻ trộm có thể **hành động độc hại** theo một số cách:
+
+- Khiến trình xác thực bị phạt cắt giảm bằng cách:
+ - Trở thành người đề xuất và ký hai khối beacon khác nhau cho cùng một vị trí
+ - Trở thành người chứng thực và ký một chứng thực "bao quanh" một chứng thực khác
+ - Trở thành người chứng thực và ký hai chứng thực khác nhau có cùng mục tiêu
+- Buộc thoát tự nguyện, điều này ngăn trình xác thực tham gia đặt cọc và cấp quyền truy cập vào số dư ETH của nó cho chủ sở hữu khóa rút tiền
+
+**Khóa công khai của trình xác thực** được bao gồm trong dữ liệu giao dịch khi người dùng gửi ETH vào hợp đồng gửi tiền đặt cọc. Điều này được gọi là _dữ liệu gửi tiền_ và nó cho phép Ethereum xác định trình xác thực.
+
+### Thông tin xác thực rút tiền {#withdrawal-credentials}
+
+Mỗi trình xác thực có một thuộc tính được gọi là _thông tin xác thực rút tiền_. Byte đầu tiên của trường 32 byte này xác định loại tài khoản: `0x00` đại diện cho thông tin xác thực BLS ban đầu (trước Shapella, không thể rút), `0x01` đại diện cho thông tin xác thực cũ trỏ đến một địa chỉ thực thi và `0x02` đại diện cho loại thông tin xác thực gộp hiện đại.
+
+Các trình xác thực có khóa BLS `0x00` phải cập nhật các thông tin xác thực này để trỏ đến một địa chỉ thực thi nhằm kích hoạt các khoản thanh toán số dư vượt mức hoặc rút toàn bộ tiền khỏi việc đặt cọc. Điều này có thể được thực hiện bằng cách cung cấp một địa chỉ thực thi trong dữ liệu gửi tiền trong quá trình tạo khóa ban đầu, _HOẶC_ bằng cách sử dụng khóa rút tiền sau đó để ký và phát một thông báo `BLSToExecutionChange`.
+
+[Thông tin thêm về thông tin xác thực rút tiền của trình xác thực](/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/)
+
+### Khóa rút tiền {#withdrawal-key}
+
+Khóa rút tiền sẽ được yêu cầu để cập nhật thông tin xác thực rút tiền nhằm trỏ đến một địa chỉ thực thi, nếu không được đặt trong lần gửi tiền ban đầu. Điều này sẽ cho phép các khoản thanh toán số dư vượt mức bắt đầu được xử lý và cũng sẽ cho phép người dùng rút toàn bộ ETH đã đặt cọc của họ.
+
+Cũng giống như các khóa của trình xác thực, các khóa rút tiền cũng bao gồm hai thành phần:
+
+- Khóa **riêng tư** rút tiền
+- Khóa **công khai** rút tiền
+
+Mất khóa này trước khi cập nhật thông tin xác thực rút tiền thành loại `0x01` đồng nghĩa với việc mất quyền truy cập vào số dư của trình xác thực. Trình xác thực vẫn có thể ký các chứng thực và các khối vì các hành động này yêu cầu khóa riêng tư của trình xác thực, tuy nhiên có rất ít hoặc không có động lực nếu khóa rút tiền bị mất.
+
+Việc tách các khóa của trình xác thực khỏi các khóa tài khoản Ethereum cho phép một người dùng duy nhất chạy nhiều trình xác thực.
+
+
+
+**Lưu ý**: Việc thoát khỏi nhiệm vụ đặt cọc và rút số dư của trình xác thực hiện tại yêu cầu ký một [thông báo thoát tự nguyện (VEM)](https://mirror.xyz/ladislaus.eth/wmoBbUBes2Wp1_6DvP6slPabkyujSU7MZOFOC3QpErs&1) bằng khóa của trình xác thực. Tuy nhiên, [EIP-7002](https://eips.ethereum.org/EIPS/eip-7002) là một đề xuất sẽ cho phép người dùng kích hoạt việc thoát của trình xác thực và rút số dư của nó bằng cách ký các thông báo thoát bằng khóa rút tiền trong tương lai. Điều này sẽ giảm các giả định về sự tin cậy bằng cách cho phép những người đặt cọc ủy quyền ETH cho [các nhà cung cấp dịch vụ đặt cọc](/staking/saas/#what-is-staking-as-a-service) vẫn giữ quyền kiểm soát tiền của họ.
+
+## Tạo khóa từ một cụm từ khởi tạo {#deriving-keys-from-seed}
+
+Nếu cứ 32 ETH được đặt cọc lại yêu cầu một bộ 2 khóa hoàn toàn độc lập mới, việc quản lý khóa sẽ nhanh chóng trở nên khó khăn, đặc biệt là đối với những người dùng chạy nhiều trình xác thực. Thay vào đó, nhiều khóa trình xác thực có thể được tạo ra từ một bí mật chung duy nhất và việc lưu trữ bí mật duy nhất đó cho phép truy cập vào nhiều khóa trình xác thực.
+
+[Các từ gợi nhớ](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) và các đường dẫn là những tính năng nổi bật mà người dùng thường gặp khi [họ truy cập](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0) ví của họ. Từ gợi nhớ là một chuỗi các từ hoạt động như một hạt giống ban đầu cho một khóa riêng tư. Khi được kết hợp với dữ liệu bổ sung, từ gợi nhớ sẽ tạo ra một hàm băm được gọi là 'khóa chính'. Điều này có thể được coi là gốc của một cây. Các nhánh từ gốc này sau đó có thể được tạo ra bằng cách sử dụng một đường dẫn phân cấp để các nút con có thể tồn tại dưới dạng sự kết hợp của hàm băm của nút cha và chỉ mục của chúng trong cây. Đọc về các tiêu chuẩn [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) và [BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) để tạo khóa dựa trên từ gợi nhớ.
+
+Các đường dẫn này có cấu trúc sau, sẽ quen thuộc với những người dùng đã tương tác với ví phần cứng:
+
+```
+m/44'/60'/0'/0`
+```
+
+Các dấu gạch chéo trong đường dẫn này phân tách các thành phần của khóa riêng tư như sau:
+
+```
+master_key / purpose / coin_type / account / change / address_index
+```
+
+Logic này cho phép người dùng đính kèm càng nhiều trình xác thực càng tốt vào một **cụm từ gợi nhớ** duy nhất vì gốc cây có thể là chung và sự khác biệt có thể xảy ra ở các nhánh. Người dùng có thể **tạo ra bất kỳ số lượng khóa nào** từ cụm từ gợi nhớ.
+
+```
+ [m / 0]
+ /
+ /
+[m] - [m / 1]
+ \
+ \
+ [m / 2]
+```
+
+Mỗi nhánh được phân tách bằng dấu `/` vì vậy `m/2` có nghĩa là bắt đầu với khóa chính và đi theo nhánh 2. Trong sơ đồ bên dưới, một cụm từ gợi nhớ duy nhất được sử dụng để lưu trữ ba khóa rút tiền, mỗi khóa có hai trình xác thực được liên kết.
+
+
+
+## Đọc thêm {#further-reading}
+
+- [Bài đăng trên blog của Ethereum Foundation bởi Carl Beekhuizen](https://blog.ethereum.org/2020/05/21/keys/)
+- [Tạo khóa EIP-2333 BLS12-381](https://eips.ethereum.org/EIPS/eip-2333)
+- [EIP-7002: Lối thoát được kích hoạt bởi Lớp Thực thi](https://web.archive.org/web/20250125035123/https://research.2077.xyz/eip-7002-unpacking-improvements-to-staking-ux-post-merge)
+- [Quản lý khóa ở quy mô lớn](https://docs.ethstaker.cc/ethstaker-knowledge-base/scaled-node-operators/key-management-at-scale)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md
new file mode 100644
index 00000000000..ff1e107ca43
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md
@@ -0,0 +1,69 @@
+---
+title: Minh chứng theo cổ phần và minh chứng theo lao động
+description: Một sự so sánh giữa minh chứng theo cổ phần và minh chứng theo lao động của Ethereum nằm ở cơ chế đồng thuận
+lang: vi
+---
+
+Tại thời điếm sơ khai của Ethereum, minh chứng theo cổ phần khi ấy cẫn cần rất nhiều nghiên cứu và phát triển trước khi có thể đủ độ tin cậy bảo mật cho Ethereum. Minh chứng theo lao động lại là một phương thức đơn giản hơn hẳn đã được chứng minh bởi Bitcoin, có nghĩa là các nhà phát triển có thể triển khai cơ chế đó ngay khi khởi tạo Ethereum. Để minh chứng theo cổ phần có thể được sử dụng họ cần hoàn thiện nó trong vòng 8 năm sau đó.
+
+Bài viết này sẽ giải thích lý do đằng sau việc Ethereum chuyển đổi từ cơ chế minh chứng theo lao động sang minh chứng theo cổ phần và những hệ quả mang lại.
+
+## Bảo mật {#security}
+
+Các nhà nghiên cứu có căn cứ để cho rằng minh chứng theo cổ phần sẽ an toàn hơn minh chứng theo lao động. Tuy nhiên, nó chỉ mới được triển khai gần đây trên mạng chính thức của Ethereum nên sẽ có ít độ tin cậy qua thời gian hơn minh chứng theo lao động. Mục tiếp theo sẽ so sánh lợi và hại giữa mô hình bảo mật của minh chứng theo cổ phần và minh chứng theo lao động.
+
+### Chi phí để tấn công {#cost-to-attack}
+
+Trong cơ chế minh chứng theo cổ phần, người chứng minh cần yêu cầu tích trữ ("ký gửi") ít nhất 32 ETH cho một hợp đồng thông minh. Người minh chứng nếu vi phạm sẽ bị huỷ số ether đã gửi để trừng phạt. Để mạng lưới thống nhất, ít nhất 66% số người minh chứng cần bỏ phiếu với cùng một nhóm khối. Các khối được bỏ phiếu bởi >=66% số cổ phần sẽ trở nên "hoàn thiện", nghĩa là chúng không thể bị xóa hoặc sắp xếp lại.
+
+Tấn công mạng có nghĩa là ngăn việc chuỗi xác nhận hay đảm bảo một tập hợp cụ thể các khối mà bằng cách nào đó có lợi cho những kẻ tấn công. Điều này buộc kẻ tấn công phải bẻ hướng sự đồng thuận trung thực, hoặc bằng cách gom một lượng lớn ETH để tự mình bỏ phiếu, hoặc bằng cách lừa các validator trung thực bỏ phiếu theo ý hắn. Ngoại trừ những kiểu tấn công phức tạp và hiếm khi xảy ra nhằm đánh lừa validator trung thực, chi phí để tấn công Ethereum chính là lượng ETH mà kẻ tấn công phải stake đủ lớn để xoay chuyển sự đồng thuận theo ý mình.
+
+Chi phí tấn công thấp nhất là >33% tổng số cổ phần. Kẻ tấn công nắm giữ >33% tổng số cổ phần có thể gây ra sự chậm trễ trong việc hoàn thiện chỉ bằng cách ngoại tuyến. Đây là một vấn đề tương đối nhỏ đối với mạng vì có một cơ chế được gọi là "rò rỉ do không hoạt động" giúp rò rỉ cổ phần từ các trình xác thực ngoại tuyến cho đến khi phần lớn trực tuyến chiếm 66% cổ phần và có thể hoàn thiện chuỗi một lần nữa. Về mặt lý thuyết, kẻ tấn công cũng có thể gây ra việc hoàn thiện kép với hơn 33% tổng số cổ phần bằng cách tạo ra hai khối thay vì một khi họ được yêu cầu làm nhà sản xuất khối và sau đó bỏ phiếu kép với tất cả các trình xác thực của họ. Mỗi phân nhánh chỉ yêu cầu 50% các trình xác thực trung thực còn lại nhìn thấy mỗi khối trước, vì vậy nếu họ quản lý để định giờ thông điệp của mình một cách chính xác, họ có thể hoàn thiện cả hai phân nhánh. Khả năng thành công của việc này thấp, nhưng nếu kẻ tấn công có thể gây ra hoàn thiện kép, cộng đồng Ethereum sẽ phải quyết định đi theo một phân nhánh, trong trường hợp đó các trình xác thực của kẻ tấn công chắc chắn sẽ bị chém phạt ở phân nhánh còn lại.
+
+Với >33% tổng số cổ phần, kẻ tấn công có cơ hội gây ảnh hưởng nhỏ (trì hoãn hoàn thiện) hoặc nghiêm trọng hơn (hoàn thiện kép) lên mạng Ethereum. Với hơn 14.000.000 ETH được đặt cược trên mạng và mức giá đại diện là 1000 USD/ETH, chi phí tối thiểu để thực hiện các cuộc tấn công này là `1000 x 14.000.000 x 0.33 = 4.620.000.000 USD`. Kẻ tấn công sẽ mất số tiền này thông qua việc bị chém phạt và bị loại khỏi mạng. Để tấn công lần nữa, họ sẽ phải tích lũy >33% cổ phần (một lần nữa) và bị mất nó (một lần nữa). Mỗi nỗ lực tấn công mạng sẽ tốn >4,6 tỷ USD (với giá 1000 USD/ETH và 14 triệu ETH được đặt cược). Kẻ tấn công cũng bị loại khỏi mạng khi bị chém phạt, và họ phải tham gia một hàng đợi kích hoạt để tham gia lại. Điều này có nghĩa là tốc độ của một cuộc tấn công lặp lại không chỉ bị giới hạn bởi tốc độ mà kẻ tấn công có thể tích lũy >33% tổng số cổ phần mà còn bởi thời gian cần thiết để đưa tất cả các trình xác thực của họ lên mạng. Mỗi lần kẻ tấn công tấn công, họ sẽ nghèo đi nhiều, và phần còn lại của cộng đồng sẽ giàu lên, nhờ vào cú sốc nguồn cung kết quả.
+
+Các cuộc tấn công khác, chẳng hạn như tấn công 51% hoặc đảo ngược hoàn thiện với 66% tổng số cổ phần, đòi hỏi nhiều ETH hơn đáng kể và tốn kém hơn nhiều đối với kẻ tấn công.
+
+So sánh điều này với bằng chứng công việc. Chi phí để phát động một cuộc tấn công vào Ethereum bằng chứng công việc là chi phí để sở hữu ổn định >50% tổng tốc độ băm của mạng. Điều này tương đương với chi phí phần cứng và vận hành của đủ sức mạnh tính toán để cạnh tranh với các thợ đào khác nhằm tính toán các giải pháp bằng chứng công việc một cách nhất quán. Ethereum chủ yếu được đào bằng GPU thay vì ASIC, điều này giúp giữ chi phí thấp (mặc dù nếu Ethereum vẫn ở lại trên bằng chứng công việc, việc đào bằng ASIC có thể đã trở nên phổ biến hơn). Một đối thủ sẽ phải mua rất nhiều phần cứng và trả tiền điện để chạy nó nhằm tấn công mạng Ethereum bằng chứng công việc, nhưng tổng chi phí sẽ ít hơn chi phí cần thiết để tích lũy đủ ETH để phát động một cuộc tấn công. Một cuộc tấn công 51% trên bằng chứng công việc rẻ hơn ~[20 lần](https://youtu.be/1m12zgJ42dI?t=1562) so với bằng chứng cổ phần. Nếu cuộc tấn công bị phát hiện và chuỗi được phân nhánh cứng để loại bỏ các thay đổi của họ, kẻ tấn công có thể liên tục sử dụng cùng một phần cứng để tấn công phân nhánh mới.
+
+### Độ phức tạp {#complexity}
+
+Bằng chứng cổ phần phức tạp hơn nhiều so với bằng chứng công việc. Đây có thể là một điểm có lợi cho bằng chứng công việc vì khó có thể vô tình đưa các lỗi hoặc hiệu ứng không mong muốn vào các giao thức đơn giản hơn. Tuy nhiên, sự phức tạp đã được chế ngự bởi nhiều năm nghiên cứu và phát triển, mô phỏng và triển khai mạng thử nghiệm. Giao thức bằng chứng cổ phần đã được năm nhóm riêng biệt triển khai độc lập (trên mỗi lớp thực thi và lớp đồng thuận) bằng năm ngôn ngữ lập trình, mang lại khả năng phục hồi chống lại các lỗi của máy khách.
+
+Để phát triển và kiểm tra logic đồng thuận bằng chứng cổ phần một cách an toàn, Chuỗi Beacon đã được ra mắt hai năm trước khi bằng chứng cổ phần được triển khai trên Mạng chính Ethereum. Chuỗi Beacon hoạt động như một môi trường thử nghiệm để kiểm tra bằng chứng cổ phần, vì nó là một chuỗi khối trực tiếp triển khai logic đồng thuận bằng chứng cổ phần nhưng không động đến các giao dịch Ethereum thực — thực chất chỉ là đi đến sự đồng thuận trên chính nó. Sau khi nó đã ổn định và không có lỗi trong một thời gian đủ dài, Chuỗi Beacon đã được "hợp nhất" với Mạng chính Ethereum. Tất cả những điều này đã góp phần chế ngự sự phức tạp của bằng chứng cổ phần đến mức nguy cơ về các hậu quả không mong muốn hoặc lỗi máy khách là rất thấp.
+
+### Bề mặt tấn công {#attack-surface}
+
+Bằng chứng cổ phần phức tạp hơn bằng chứng công việc, điều đó có nghĩa là có nhiều vectơ tấn công tiềm năng hơn cần xử lý. Thay vì một mạng ngang hàng kết nối các máy khách, có hai mạng, mỗi mạng triển khai một giao thức riêng biệt. Việc có một trình xác thực cụ thể được chọn trước để đề xuất một khối trong mỗi slot tạo ra tiềm năng cho các cuộc tấn công từ chối dịch vụ, trong đó lượng lớn lưu lượng mạng làm cho trình xác thực cụ thể đó ngoại tuyến.
+
+Cũng có những cách mà kẻ tấn công có thể cẩn thận định thời gian phát hành các khối hoặc các chứng thực của họ để chúng được nhận bởi một tỷ lệ nhất định của mạng lưới trung thực, ảnh hưởng đến họ để bỏ phiếu theo những cách nhất định. Cuối cùng, một kẻ tấn công có thể chỉ cần tích lũy đủ ETH để đặt cược và thống trị cơ chế đồng thuận. Mỗi [vectơ tấn công này đều có các biện pháp phòng thủ liên quan](/developers/docs/consensus-mechanisms/pos/attack-and-defense), nhưng chúng không tồn tại để được phòng thủ dưới bằng chứng công việc.
+
+## Tính phi tập trung {#decentralization}
+
+Bằng chứng cổ phần phi tập trung hơn bằng chứng công việc vì các cuộc chạy đua vũ trang phần cứng khai thác có xu hướng loại bỏ các cá nhân và tổ chức nhỏ do giá cả. Mặc dù về mặt kỹ thuật, bất kỳ ai cũng có thể bắt đầu khai thác với phần cứng khiêm tốn, nhưng khả năng nhận được bất kỳ phần thưởng nào của họ là cực kỳ nhỏ so với các hoạt động khai thác của tổ chức. Với bằng chứng cổ phần, chi phí đặt cược và tỷ lệ lợi nhuận trên số cổ phần đó là như nhau đối với mọi người. Hiện tại, cần 32 ETH để chạy một trình xác thực.
+
+Mặt khác, sự ra đời của các công cụ phái sinh đặt cược thanh khoản đã dẫn đến những lo ngại về tập trung hóa vì một vài nhà cung cấp lớn quản lý lượng lớn ETH đã đặt cược. Điều này có vấn đề và cần được khắc phục càng sớm càng tốt, nhưng nó cũng phức tạp hơn vẻ bề ngoài. Các nhà cung cấp dịch vụ đặt cược tập trung không nhất thiết phải có quyền kiểm soát tập trung đối với các trình xác thực - thường đó chỉ là một cách để tạo ra một bể ETH trung tâm mà nhiều nhà điều hành nút độc lập có thể đặt cược mà không cần mỗi người tham gia phải có 32 ETH của riêng mình.
+
+Lựa chọn tốt nhất cho Ethereum là các trình xác thực được chạy cục bộ trên máy tính tại nhà, nhằm tối đa hóa tính phi tập trung. Đây là lý do tại sao Ethereum chống lại những thay đổi làm tăng yêu cầu phần cứng để chạy một nút/trình xác thực.
+
+## Tính bền vững {#sustainability}
+
+Bằng chứng cổ phần là một cách bảo mật chuỗi khối với chi phí carbon thấp. Theo bằng chứng công việc, các thợ đào cạnh tranh để giành quyền khai thác một khối. Các thợ đào thành công hơn khi họ có thể thực hiện các phép tính nhanh hơn, điều này khuyến khích đầu tư vào phần cứng và tiêu thụ năng lượng. Điều này đã được quan sát thấy đối với Ethereum trước khi nó chuyển sang bằng chứng cổ phần. Ngay trước khi chuyển đổi sang bằng chứng cổ phần, Ethereum đã tiêu thụ khoảng 78 TWh/năm - tương đương với một quốc gia nhỏ. Tuy nhiên, việc chuyển sang bằng chứng cổ phần đã giảm chi tiêu năng lượng này khoảng ~99,98%. Bằng chứng cổ phần đã biến Ethereum thành một nền tảng tiết kiệm năng lượng, ít carbon.
+
+[Tìm hiểu thêm về mức tiêu thụ năng lượng của Ethereum](/energy-consumption)
+
+## Phát hành {#issuance}
+
+Ethereum bằng chứng cổ phần có thể trả cho bảo mật của mình bằng cách phát hành ít coin hơn nhiều so với Ethereum bằng chứng công việc vì các trình xác thực không phải trả chi phí điện cao. Kết quả là, ETH có thể giảm lạm phát hoặc thậm chí trở nên giảm phát khi một lượng lớn ETH bị đốt cháy. Mức lạm phát thấp hơn có nghĩa là bảo mật của Ethereum rẻ hơn so với khi sử dụng bằng chứng công việc.
+
+## Tìm hiểu thêm từ video trực quan? Người học qua hình ảnh {#visual-learner}
+
+Xem Justin Drake giải thích những lợi ích của bằng chứng cổ phần so với bằng chứng công việc:
+
+
+
+## Đọc thêm {#further-reading}
+
+- [Triết lý thiết kế bằng chứng cổ phần của Vitalik](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51)
+- [Câu hỏi thường gặp về bằng chứng cổ phần của Vitalik](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake)
+- [Video "Giải thích đơn giản" về PoS và PoW](https://www.youtube.com/watch?v=M3EFi_POhps)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md
new file mode 100644
index 00000000000..1ae34a403ac
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md
@@ -0,0 +1,91 @@
+---
+title: Phần thưởng và hình phạt của Bằng chứng cổ phần
+description: Tìm hiểu về các ưu đãi trong giao thức trong Ethereum bằng chứng cổ phần.
+lang: vi
+---
+
+Ethereum được bảo mật bằng tiền mã hóa gốc của nó, ether (ETH). Các nhà khai thác nút muốn tham gia xác thực các khối và xác định phần đầu của chuỗi, hãy gửi ether vào [hợp đồng ký gửi](/staking/deposit-contract/) trên Ethereum. Sau đó, họ được trả bằng ether để chạy phần mềm trình xác thực nhằm kiểm tra tính hợp lệ của các khối mới nhận được qua mạng ngang hàng và áp dụng thuật toán lựa chọn phân nhánh để xác định phần đầu của chuỗi.
+
+Trình xác thực có hai vai trò chính: 1) kiểm tra các khối mới và “chứng thực” chúng nếu hợp lệ, 2) đề xuất các khối mới khi được chọn ngẫu nhiên từ tổng nhóm trình xác thực. Nếu trình xác thực không thực hiện một trong hai nhiệm vụ này khi được yêu cầu, họ sẽ bỏ lỡ khoản thanh toán bằng ether. Các trình xác thực đôi khi cũng được giao nhiệm vụ tổng hợp chữ ký và tham gia vào các ủy ban đồng bộ.
+
+Ngoài ra còn có một số hành động rất khó thực hiện một cách vô tình và biểu thị một số ý định độc hại, chẳng hạn như đề xuất nhiều khối cho cùng một slot hoặc chứng thực nhiều khối cho cùng một slot. Đây là những hành vi “có thể bị cắt giảm” dẫn đến việc trình xác thực bị đốt một lượng ether (lên đến 1 ETH) trước khi trình xác thực bị xóa khỏi mạng, quá trình này mất 36 ngày. Ether của trình xác thực bị cắt giảm sẽ dần dần cạn kiệt trong giai đoạn thoát, nhưng vào Ngày thứ 18, họ phải nhận một “hình phạt tương quan” lớn hơn khi có nhiều trình xác thực bị cắt giảm hơn trong cùng một khoảng thời gian. Do đó, cấu trúc khuyến khích của cơ chế đồng thuận sẽ trả công cho sự trung thực và trừng phạt những kẻ xấu.
+
+Tất cả các phần thưởng và hình phạt được áp dụng mỗi epoch một lần.
+
+Đọc tiếp để biết thêm chi tiết...
+
+## Phần thưởng và hình phạt {#rewards}
+
+### Phần thưởng {#rewards}
+
+Trình xác thực nhận được phần thưởng khi họ thực hiện các phiếu bầu nhất quán với phần lớn các trình xác thực khác, khi họ đề xuất các khối và khi họ tham gia vào các ủy ban đồng bộ. Giá trị của phần thưởng trong mỗi epoch được tính từ `base_reward`. Đây là đơn vị cơ sở mà các phần thưởng khác được tính toán. `base_reward` đại diện cho phần thưởng trung bình mà một trình xác thực nhận được trong điều kiện tối ưu cho mỗi epoch. Điều này được tính từ số dư hiệu dụng của trình xác thực và tổng số trình xác thực đang hoạt động như sau:
+
+```
+base_reward = effective_balance * (base_reward_factor / (base_rewards_per_epoch * sqrt(sum(active_balance))))
+```
+
+trong đó `base_reward_factor` là 64, `base_rewards_per_epoch` là 4 và `sum(active balance)` là tổng số ether đã đặt cược trên tất cả các trình xác thực đang hoạt động.
+
+Điều này có nghĩa là phần thưởng cơ bản tỷ lệ thuận với số dư hiệu dụng của trình xác thực và tỷ lệ nghịch với số lượng trình xác thực trên mạng. Càng nhiều trình xác thực, tổng lượng phát hành càng lớn (dưới dạng `sqrt(N)` nhưng `base_reward` cho mỗi trình xác thực càng nhỏ (dưới dạng `1/sqrt(N)`). Các yếu tố này ảnh hưởng đến APR cho một nút đặt cược. Đọc lý do cho điều này trong [ghi chú của Vitalik](https://notes.ethereum.org/@vbuterin/rkhCgQteN?type=view#Base-rewards).
+
+Tổng phần thưởng sau đó được tính bằng tổng của năm thành phần, mỗi thành phần có một trọng số xác định mức độ mà mỗi thành phần thêm vào tổng phần thưởng. Các thành phần là:
+
+```
+1. bỏ phiếu nguồn: trình xác thực đã bỏ phiếu kịp thời cho điểm kiểm tra nguồn chính xác
+2. bỏ phiếu mục tiêu: trình xác thực đã bỏ phiếu kịp thời cho điểm kiểm tra mục tiêu chính xác
+3. bỏ phiếu đầu: trình xác thực đã bỏ phiếu kịp thời cho khối đầu chính xác
+4. phần thưởng ủy ban đồng bộ: trình xác thực đã tham gia vào một ủy ban đồng bộ
+5. phần thưởng người đề xuất: trình xác thực đã đề xuất một khối trong slot chính xác
+```
+
+Trọng số cho mỗi thành phần như sau:
+
+```
+TIMELY_SOURCE_WEIGHT uint64(14)
+TIMELY_TARGET_WEIGHT uint64(26)
+TIMELY_HEAD_WEIGHT uint64(14)
+SYNC_REWARD_WEIGHT uint64(2)
+PROPOSER_WEIGHT uint64(8)
+```
+
+Các trọng số này có tổng là 64. Phần thưởng được tính bằng tổng các trọng số áp dụng chia cho 64. Một trình xác thực đã thực hiện các phiếu bầu nguồn, mục tiêu và đầu đúng lúc, đề xuất một khối và tham gia vào ủy ban đồng bộ có thể nhận được `64/64 * base_reward == base_reward`. Tuy nhiên, một trình xác thực thường không phải là người đề xuất khối, vì vậy phần thưởng tối đa của họ là `64-8 /64 * base_reward == 7/8 * base_reward`. Các trình xác thực không phải là người đề xuất khối cũng không thuộc ủy ban đồng bộ có thể nhận được `64-8-2 / 64 * base_reward == 6.75/8 * base_reward`.
+
+Một phần thưởng bổ sung được thêm vào để khuyến khích các sự chứng thực nhanh chóng. Đây là `inclusion_delay_reward`. Giá trị này bằng `base_reward` nhân với `1/delay`, trong đó `delay` là số lượng slot phân tách đề xuất khối và sự chứng thực. Ví dụ: nếu sự chứng thực được gửi trong vòng một slot của đề xuất khối, người chứng thực sẽ nhận được `base_reward * 1/1 == base_reward`. Nếu sự chứng thực đến trong slot tiếp theo, người chứng thực sẽ nhận được `base_reward * 1/2`, v.v.
+
+Người đề xuất khối nhận `8 / 64 * base_reward` cho **mỗi sự chứng thực hợp lệ** có trong khối, vì vậy giá trị thực tế của phần thưởng sẽ thay đổi theo quy mô cùng số lượng trình xác thực chứng thực. Người đề xuất khối cũng có thể tăng phần thưởng của mình bằng cách bao gồm bằng chứng về hành vi sai trái của các trình xác thực khác trong khối được đề xuất của họ. Những phần thưởng này là “củ cà rốt” khuyến khích sự trung thực của trình xác thực. Một người đề xuất khối bao gồm hành vi phạt cắt giảm sẽ được thưởng bằng `slashed_validators_effective_balance / 512`.
+
+### Hình phạt {#penalties}
+
+Cho đến nay, chúng tôi đã xem xét các trình xác thực hoạt động hoàn hảo, nhưng còn các trình xác thực không bỏ phiếu cho đầu, nguồn và mục tiêu kịp thời hoặc làm như vậy một cách chậm chạp thì sao?
+
+Các hình phạt cho việc bỏ lỡ các phiếu bầu mục tiêu và nguồn bằng với phần thưởng mà người chứng thực sẽ nhận được nếu họ đã gửi chúng. Điều này có nghĩa là thay vì được cộng phần thưởng vào số dư của mình, họ sẽ bị trừ đi một giá trị tương đương từ số dư của mình. Không có hình phạt nào cho việc bỏ lỡ phiếu bầu đầu (tức là phiếu bầu đầu chỉ được thưởng, không bao giờ bị phạt). Không có hình phạt nào liên quan đến `inclusion_delay` - phần thưởng sẽ không được cộng vào số dư của trình xác thực. Cũng không có hình phạt nào cho việc không đề xuất được một khối.
+
+Đọc thêm về phần thưởng và hình phạt trong [thông số kỹ thuật đồng thuận](https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/beacon-chain.md). Phần thưởng và hình phạt đã được điều chỉnh trong bản nâng cấp Bellatrix - hãy xem Danny Ryan và Vitalik thảo luận về điều này trong [video Peep an EIP](https://www.youtube.com/watch?v=iaAEGs1DMgQ).
+
+## Phạt cắt giảm {#slashing}
+
+Phạt cắt giảm là một hành động nghiêm trọng hơn dẫn đến việc loại bỏ một trình xác thực khỏi mạng và mất đi một phần ether đã đặt cược của họ. Có ba cách một trình xác thực có thể bị phạt cắt giảm, tất cả đều dẫn đến việc đề xuất hoặc chứng thực các khối không trung thực:
+
+- Bằng cách đề xuất và ký hai khối khác nhau cho cùng một slot
+- Bằng cách chứng thực một khối "bao quanh" một khối khác (thay đổi lịch sử một cách hiệu quả)
+- Bằng cách "bỏ phiếu kép" bằng cách chứng thực hai ứng cử viên cho cùng một khối
+
+Nếu những hành động này bị phát hiện, trình xác thực sẽ bị phạt cắt giảm. Điều này có nghĩa là 0,0078125 sẽ bị đốt ngay lập tức đối với một trình xác thực 32 ETH (thay đổi quy mô tuyến tính với số dư hoạt động), sau đó bắt đầu giai đoạn loại bỏ 36 ngày. Trong giai đoạn loại bỏ này, cổ phần của trình xác thực dần dần bị mất đi. Tại điểm giữa (Ngày thứ 18), một hình phạt bổ sung được áp dụng với mức độ thay đổi theo quy mô cùng tổng số ether đã đặt cược của tất cả các trình xác thực bị phạt cắt giảm trong 36 ngày trước sự kiện phạt cắt giảm. Điều này có nghĩa là khi càng nhiều trình xác thực bị phạt cắt giảm, mức độ phạt cắt giảm càng tăng. Mức phạt cắt giảm tối đa là toàn bộ số dư hiệu dụng của tất cả các trình xác thực bị phạt cắt giảm (tức là, nếu có nhiều trình xác thực bị phạt cắt giảm, họ có thể mất toàn bộ cổ phần của mình). Mặt khác, một sự kiện phạt cắt giảm đơn lẻ, riêng biệt chỉ đốt một phần nhỏ cổ phần của trình xác thực. Hình phạt giữa kỳ này thay đổi theo quy mô cùng số lượng trình xác thực bị phạt cắt giảm được gọi là "hình phạt tương quan".
+
+## Rò rỉ do không hoạt động {#inactivity-leak}
+
+Nếu lớp đồng thuận đã trải qua hơn bốn epoch mà không hoàn tất, một giao thức khẩn cấp được gọi là "rò rỉ do không hoạt động" sẽ được kích hoạt. Mục đích cuối cùng của việc rò rỉ do không hoạt động là tạo ra các điều kiện cần thiết để chuỗi phục hồi tính kết luận cuối cùng. Như đã giải thích ở trên, tính kết luận cuối cùng đòi hỏi đa số 2/3 tổng số ether đã đặt cược phải đồng ý về các điểm kiểm tra nguồn và mục tiêu. Nếu các trình xác thực đại diện cho hơn 1/3 tổng số trình xác thực ngoại tuyến hoặc không gửi các chứng thực chính xác thì không thể có đa số 2/3 để hoàn tất các điểm kiểm tra. Rò rỉ do không hoạt động cho phép cổ phần của các trình xác thực không hoạt động dần dần bị mất đi cho đến khi họ kiểm soát ít hơn 1/3 tổng số cổ phần, cho phép các trình xác thực đang hoạt động còn lại hoàn tất chuỗi. Tuy nhiên, dù nhóm trình xác thực không hoạt động lớn đến đâu, các trình xác thực đang hoạt động còn lại cuối cùng sẽ kiểm soát >2/3 cổ phần. Việc mất cổ phần là một động lực mạnh mẽ để các trình xác thực không hoạt động kích hoạt lại càng sớm càng tốt! Một kịch bản rò rỉ do không hoạt động đã xảy ra trên mạng thử nghiệm Medalla khi < 66% trình xác thực đang hoạt động có thể đi đến sự đồng thuận về phần đầu hiện tại của chuỗi khối. Rò rỉ do không hoạt động đã được kích hoạt và tính kết luận cuối cùng cuối cùng đã được lấy lại!
+
+Thiết kế phần thưởng, hình phạt và phạt cắt giảm của cơ chế đồng thuận khuyến khích các trình xác thực cá nhân hành xử đúng đắn. Tuy nhiên, từ những lựa chọn thiết kế này đã tạo ra một hệ thống khuyến khích mạnh mẽ việc phân phối đồng đều các trình xác thực trên nhiều máy khách và sẽ ngăn cản mạnh mẽ sự thống trị của một máy khách duy nhất.
+
+## Đọc thêm {#further-reading}
+
+- [Nâng cấp Ethereum: Lớp ưu đãi](https://eth2book.info/altair/part2/incentives)
+- [Các ưu đãi trong giao thức Casper kết hợp của Ethereum](https://arxiv.org/pdf/1903.04205.pdf)
+- [Thông số kỹ thuật có chú thích của Vitalik](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#rewards-and-penalties-1)
+- [Mẹo phòng chống phạt cắt giảm Eth2](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50)
+- [Phân tích hình phạt cắt giảm theo EIP-7251](https://ethresear.ch/t/slashing-penalty-analysis-eip-7251/16509)
+
+_Nguồn_
+
+- _[https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/](https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/)_
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md
new file mode 100644
index 00000000000..d670a01cffa
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md
@@ -0,0 +1,39 @@
+---
+title: Chủ quan yếu kém
+description: Giải thích về tính chủ quan yếu và vai trò của nó trong PoS Ethereum.
+lang: vi
+---
+
+Tính chủ quan trong các chuỗi khối đề cập đến sự phụ thuộc vào thông tin xã hội để đồng thuận về trạng thái hiện tại. Có thể có nhiều phân nhánh hợp lệ được chọn từ đó theo thông tin thu thập được từ các máy ngang hàng khác trên mạng. Ngược lại là tính khách quan, đề cập đến các chuỗi chỉ có một chuỗi hợp lệ duy nhất mà tất cả các nút nhất thiết sẽ đồng thuận bằng cách áp dụng các quy tắc được mã hóa của chúng. Ngoài ra còn có một trạng thái thứ ba, được gọi là tính chủ quan yếu. Điều này đề cập đến một chuỗi có thể tiến triển một cách khách quan sau khi một số mầm mống thông tin ban đầu được truy xuất một cách xã hội.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu trang này, trước tiên cần phải hiểu các nguyên tắc cơ bản của [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/).
+
+## Tính chủ quan yếu giải quyết những vấn đề gì? {#problems-ws-solves}
+
+Tính chủ quan vốn có trong các chuỗi khối bằng chứng cổ phần vì việc chọn chuỗi chính xác từ nhiều phân nhánh được thực hiện bằng cách đếm các phiếu bầu trong quá khứ. Điều này phơi bày chuỗi khối trước một số véc-tơ tấn công, bao gồm cả các cuộc tấn công tầm xa, theo đó các nút đã tham gia từ rất sớm trong chuỗi duy trì một phân nhánh thay thế mà chúng phát hành sau đó rất lâu để trục lợi. Ngoài ra, nếu 33% người xác thực rút cổ phần của họ nhưng vẫn tiếp tục chứng thực và tạo khối, họ có thể tạo ra một phân nhánh thay thế xung đột với chuỗi chính tắc. Các nút mới hoặc các nút đã ngoại tuyến trong một thời gian dài có thể không biết rằng những người xác thực tấn công này đã rút tiền của họ, vì vậy những kẻ tấn công có thể lừa họ đi theo một chuỗi không chính xác. Ethereum có thể giải quyết các véc-tơ tấn công này bằng cách áp đặt các ràng buộc làm giảm các khía cạnh chủ quan của cơ chế—và do đó là các giả định về sự tin cậy—xuống mức tối thiểu.
+
+## Các điểm kiểm tra tính chủ quan yếu {#ws-checkpoints}
+
+Tính chủ quan yếu được triển khai trong Ethereum bằng chứng cổ phần bằng cách sử dụng "các điểm kiểm tra tính chủ quan yếu". Đây là các gốc trạng thái mà tất cả các nút trên mạng đều đồng thuận thuộc về chuỗi chính tắc. Chúng phục vụ cùng mục đích "sự thật phổ quát" như các khối khởi nguyên, ngoại trừ việc chúng không nằm ở vị trí khởi nguyên trong chuỗi khối. Thuật toán lựa chọn phân nhánh tin tưởng rằng trạng thái chuỗi khối được xác định trong điểm kiểm tra đó là chính xác và nó xác minh chuỗi một cách độc lập và khách quan kể từ thời điểm đó trở đi. Các điểm kiểm tra hoạt động như "giới hạn hoàn nguyên" vì các khối nằm trước các điểm kiểm tra tính chủ quan yếu không thể bị thay đổi. Điều này làm suy yếu các cuộc tấn công tầm xa đơn giản bằng cách xác định các phân nhánh tầm xa là không hợp lệ như một phần của thiết kế cơ chế. Việc đảm bảo rằng các điểm kiểm tra tính chủ quan yếu được ngăn cách bởi một khoảng cách nhỏ hơn thời gian rút tiền của người xác thực đảm bảo rằng một người xác thực phân nhánh chuỗi sẽ bị phạt cắt giảm ít nhất một số tiền ngưỡng trước khi họ có thể rút cổ phần của mình và những người mới tham gia không thể bị lừa vào các phân nhánh không chính xác bởi những người xác thực đã rút cổ phần.
+
+## Sự khác biệt giữa các điểm kiểm tra tính chủ quan yếu và các khối đã hoàn tất {#difference-between-ws-and-finalized-blocks}
+
+Các khối đã hoàn tất và các điểm kiểm tra tính chủ quan yếu được các nút Ethereum xử lý khác nhau. Nếu một nút nhận biết được hai khối đã hoàn tất đang cạnh tranh nhau, thì nó sẽ bị giằng co giữa hai lựa chọn - nó không có cách nào để tự động xác định đâu là phân nhánh chính tắc. Đây là triệu chứng của sự cố đồng thuận. Ngược lại, một nút chỉ đơn giản là từ chối bất kỳ khối nào xung đột với điểm kiểm tra tính chủ quan yếu của nó. Từ góc nhìn của nút, điểm kiểm tra tính chủ quan yếu đại diện cho một sự thật tuyệt đối không thể bị phá vỡ bởi kiến thức mới từ các máy ngang hàng của nó.
+
+## Yếu đến mức nào? {#how-weak-is-weak}
+
+Khía cạnh chủ quan của bằng chứng cổ phần của Ethereum là yêu cầu một trạng thái gần đây (điểm kiểm tra tính chủ quan yếu) từ một nguồn đáng tin cậy để đồng bộ hóa. Rủi ro nhận được một điểm kiểm tra tính chủ quan yếu sai là rất thấp vì chúng có thể được kiểm tra đối chiếu với một số nguồn công khai độc lập như các trình duyệt khối hoặc nhiều nút. Tuy nhiên, luôn có một mức độ tin cậy nhất định được yêu cầu để chạy bất kỳ ứng dụng phần mềm nào, ví dụ, tin tưởng rằng các nhà phát triển phần mềm đã tạo ra phần mềm trung thực.
+
+Một điểm kiểm tra tính chủ quan yếu thậm chí có thể là một phần của phần mềm máy khách. Có thể cho rằng một kẻ tấn công có thể làm sai lệch điểm kiểm tra trong phần mềm và cũng có thể dễ dàng làm sai lệch chính phần mềm đó. Không có con đường kinh tế-mật mã thực sự nào để giải quyết vấn đề này, nhưng tác động của các nhà phát triển không đáng tin cậy được giảm thiểu trong Ethereum bằng cách có nhiều nhóm máy khách độc lập, mỗi nhóm xây dựng phần mềm tương đương bằng các ngôn ngữ khác nhau, tất cả đều có lợi ích cố hữu trong việc duy trì một chuỗi trung thực. Các trình duyệt khối cũng có thể cung cấp các điểm kiểm tra tính chủ quan yếu hoặc một cách để tham chiếu chéo các điểm kiểm tra thu được từ nơi khác với một nguồn bổ sung.
+
+Cuối cùng, các điểm kiểm tra có thể được yêu cầu từ các nút khác; có lẽ một người dùng Ethereum khác chạy một nút đầy đủ có thể cung cấp một điểm kiểm tra mà sau đó những người xác thực có thể xác minh với dữ liệu từ một trình duyệt khối. Nhìn chung, việc tin tưởng nhà cung cấp một điểm kiểm tra tính chủ quan yếu có thể được coi là có vấn đề tương tự như việc tin tưởng các nhà phát triển máy khách. Mức độ tin cậy tổng thể được yêu cầu là thấp. Điều quan trọng cần lưu ý là những cân nhắc này chỉ trở nên quan trọng trong trường hợp rất khó xảy ra là đa số người xác thực âm mưu tạo ra một phân nhánh thay thế của chuỗi khối. Trong bất kỳ trường hợp nào khác, chỉ có một chuỗi Ethereum để lựa chọn.
+
+## Đọc thêm {#further-reading}
+
+- [Tính chủ quan yếu trong Eth2](https://notes.ethereum.org/@adiasg/weak-subjectvity-eth2)
+- [Vitalik: Tôi đã học cách yêu tính chủ quan yếu như thế nào](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/)
+- [Tính chủ quan yếu (tài liệu Teku)](https://docs.teku.consensys.io/concepts/weak-subjectivity)
+- [Hướng dẫn về tính chủ quan yếu Giai đoạn 0](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/weak-subjectivity.md)
+- [Phân tích tính chủ quan yếu trong Ethereum 2.0](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md
new file mode 100644
index 00000000000..c640aa4253f
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md
@@ -0,0 +1,64 @@
+---
+title: Thông tin xác thực rút tiền
+description: Giải thích về các loại thông tin xác thực rút tiền của trình xác thực (0x00, 0x01, 0x02) và ý nghĩa của chúng đối với người đặt cọc Ethereum.
+lang: vi
+---
+
+Mỗi trình xác thực đều có một **thông tin xác thực rút tiền** để xác định cách thức và nơi ETH đã đặt cọc và phần thưởng của họ có thể được rút. Loại thông tin xác thực được biểu thị bằng byte đầu tiên: `0x00`, `0x01`, hoặc `0x02`. Việc hiểu các loại này rất quan trọng đối với các trình xác thực quản lý cổ phần của họ.
+
+## 0x00: Thông tin xác thực trước Shapella {#0x00-credentials}
+
+Loại `0x00` là định dạng thông tin xác thực rút tiền ban đầu có từ trước bản nâng cấp Shapella (tháng 4 năm 2023). Các trình xác thực có loại thông tin xác thực này không có địa chỉ rút tiền của lớp thực thi nào được đặt, nghĩa là tiền của họ vẫn bị khóa trên lớp đồng thuận. Nếu bạn vẫn còn thông tin xác thực `0x00`, bạn phải nâng cấp lên `0x01` hoặc `0x02` trước khi có thể nhận bất kỳ khoản rút tiền nào.
+
+## 0x01: Thông tin xác thực rút tiền cũ {#0x01-credentials}
+
+Loại `0x01` đã được giới thiệu cùng với bản nâng cấp Shapella và trở thành tiêu chuẩn cho các trình xác thực muốn đặt địa chỉ rút tiền của lớp thực thi. Với thông tin xác thực `0x01`:
+
+- Mọi số dư trên 32 ETH sẽ **tự động được quét** vào địa chỉ rút tiền của bạn
+- Việc thoát hoàn toàn sẽ đi qua hàng chờ thoát tiêu chuẩn
+- Phần thưởng trên 32 ETH không thể gộp lãi—chúng sẽ được quét định kỳ
+
+**Tại sao một số trình xác thực vẫn sử dụng 0x01:** Nó đơn giản và quen thuộc hơn. Nhiều trình xác thực đã gửi tiền sau Shapella và đã có loại này, và nó hoạt động tốt cho những ai muốn tự động rút số dư vượt mức.
+
+**Tại sao nó không được khuyến khích:** Với `0x01`, bạn mất khả năng gộp lãi phần thưởng trên 32 ETH. Mọi khoản dư thừa đều được quét tự động, điều này hạn chế tiềm năng kiếm tiền của trình xác thực của bạn và yêu cầu quản lý các khoản tiền đã rút một cách riêng biệt.
+
+## 0x02: Thông tin xác thực rút tiền gộp lãi {#0x02-credentials}
+
+Loại `0x02` đã được giới thiệu cùng với bản nâng cấp Pectra và là **lựa chọn được khuyến nghị** cho các trình xác thực ngày nay. Các trình xác thực có thông tin xác thực `0x02` đôi khi được gọi là "trình xác thực gộp lãi".
+
+Với thông tin xác thực `0x02`:
+
+- Phần thưởng trên 32 ETH được **gộp lãi** theo từng khoảng tăng 1 ETH cho đến số dư hiệu dụng tối đa là 2048 ETH
+- Các khoản rút một phần phải được yêu cầu thủ công (việc quét tự động chỉ xảy ra trên ngưỡng 2048 ETH)
+- Các trình xác thực có thể hợp nhất nhiều trình xác thực 32 ETH thành một trình xác thực có số dư cao hơn
+- Việc thoát hoàn toàn vẫn được hỗ trợ thông qua hàng chờ thoát tiêu chuẩn
+
+Cả rút tiền một phần và hợp nhất đều có thể được thực hiện thông qua [Hành động của Trình xác thực Launchpad](https://launchpad.ethereum.org/en/validator-actions).
+
+**Tại sao các trình xác thực nên ưu tiên 0x02:** Nó mang lại hiệu quả sử dụng vốn tốt hơn thông qua việc gộp lãi, kiểm soát nhiều hơn thời điểm rút tiền và hỗ trợ hợp nhất trình xác thực. Đối với những người đặt cọc đơn lẻ tích lũy phần thưởng theo thời gian, điều này có nghĩa là số dư hiệu dụng của họ—và do đó là phần thưởng của họ—có thể tăng lên trên 32 ETH mà không cần can thiệp thủ công.
+
+**Quan trọng:** Một khi bạn đã chuyển đổi từ `0x01` sang `0x02`, bạn không thể hoàn nguyên lại.
+
+Để có hướng dẫn chi tiết về việc chuyển đổi sang thông tin xác thực Loại 2 và tính năng MaxEB, hãy xem [trang giải thích MaxEB](/roadmap/pectra/maxeb/).
+
+## Tôi nên chọn cái nào? {#what-should-i-pick}
+
+- **Trình xác thực mới:** Chọn `0x02`. Đó là tiêu chuẩn hiện đại với khả năng gộp lãi và tính linh hoạt tốt hơn.
+- **Trình xác thực 0x01 hiện có:** Cân nhắc chuyển đổi sang `0x02` nếu bạn muốn phần thưởng được gộp lãi trên 32 ETH hoặc có kế hoạch hợp nhất các trình xác thực.
+- **Trình xác thực 0x00 hiện có:** Nâng cấp ngay lập tức—bạn không thể rút tiền mà không cập nhật thông tin xác thực của mình. Trước tiên, bạn phải chuyển đổi sang `0x01`, sau đó bạn có thể chuyển đổi sang `0x02`.
+
+## Các công cụ để quản lý thông tin xác thực rút tiền {#withdrawal-credential-tools}
+
+Một số công cụ hỗ trợ việc lựa chọn hoặc chuyển đổi giữa các loại thông tin xác thực:
+
+- **[Bệ phóng Đặt cọc Ethereum](https://launchpad.ethereum.org/en/validator-actions)** - Công cụ chính thức cho việc gửi tiền và quản lý trình xác thực, bao gồm chuyển đổi và hợp nhất thông tin xác thực
+- **[Trình quản lý Đặt cọc Pectra](https://pectrastaking.com)** - Giao diện người dùng web với hỗ trợ kết nối ví để chuyển đổi và hợp nhất
+- **[Công cụ CLI Vận hành Trình xác thực Pectra](https://github.com/Luganodes/Pectra-Batch-Contract)** - Công cụ dòng lệnh để chuyển đổi hàng loạt
+- **[Ethereal](https://github.com/wealdtech/ethereal)** - Công cụ CLI cho các hoạt động Ethereum bao gồm quản lý trình xác thực
+
+Để có danh sách đầy đủ các công cụ hợp nhất và hướng dẫn chuyển đổi chi tiết, hãy xem [bộ công cụ hợp nhất MaxEB](/roadmap/pectra/maxeb/#consolidation-tooling).
+
+## Đọc thêm {#further-reading}
+
+- [Các khóa trong Ethereum bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/keys/) - Tìm hiểu về các khóa của trình xác thực và cách chúng liên quan đến thông tin xác thực rút tiền
+- [MaxEB](/roadmap/pectra/maxeb/) - Hướng dẫn chi tiết về bản nâng cấp Pectra và tính năng số dư hiệu dụng tối đa
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/index.md
new file mode 100644
index 00000000000..d8d215f63b0
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/index.md
@@ -0,0 +1,114 @@
+---
+title: Bằng chứng công việc (PoW)
+description: Giải thích về giao thức đồng thuận bằng chứng công việc và vai trò của nó trong Ethereum.
+lang: vi
+---
+
+Mạng Ethereum bắt đầu bằng cách sử dụng một cơ chế đồng thuận có tên là **[Bằng chứng công việc (PoW)](/developers/docs/consensus-mechanisms/pow)**. Điều này cho phép các nút của mạng lưới Ethereum đồng thuận về trạng thái của tất cả các thông tin được ghi lại trên chuỗi khối Ethereum và ngăn chặn một số loại tấn công kinh tế nhất định. Tuy nhiên, Ethereum đã ngừng sử dụng bằng chứng công việc vào năm 2022 và thay vào đó bắt đầu sử dụng [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos).
+
+
+
+
+
+ Chứng chỉ công việc hiện đã bị loại bỏ. Ethereum không còn sử dụng bằng chứng công việc như một phần của cơ chế đồng thuận nữa. Thay vào đó, nó sử dụng bằng chứng cổ phần. Đọc thêm về [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) và [đặt cược](/staking/).
+
+
+
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [các giao dịch](/developers/docs/transactions/), [các khối](/developers/docs/blocks/) và [các cơ chế đồng thuận](/developers/docs/consensus-mechanisms/).
+
+## Bằng cứng công việc (PoW) là gì? {#what-is-pow}
+
+Sự đồng thuận Nakamoto, vốn sử dụng bằng chứng công việc, là cơ chế từng cho phép mạng Ethereum phi tập trung đạt được sự đồng thuận (tức là mọi nút đều đồng ý) về những việc như số dư tài khoản và thứ tự các giao dịch. Điều này ngăn người dùng "chi tiêu hai lần" số tiền của họ và đảm bảo rằng chuỗi Ethereum trở nên vô cùng khó bị tấn công hoặc thao túng. Các thuộc tính bảo mật này hiện đến từ bằng chứng cổ phần, sử dụng cơ chế đồng thuận được gọi là [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/).
+
+## Bằng chứng công việc và khai thác {#pow-and-mining}
+
+Chứng chỉ công việc là thuật toán nền tảng xác định độ khó và các quy tắc cho công việc mà các thợ đào thực hiện trên các chuỗi khối sử dụng cơ chế Chứng chỉ công việc. Khai thác chính là bản thân “công việc” đó. Đó là hành động thêm các khối hợp lệ vào chuỗi. Điều này quan trọng vì độ dài của chuỗi giúp mạng lưới xác định đúng nhánh của chuỗi khối. Càng nhiều “công việc” được thực hiện, chuỗi càng dài, số khối càng cao, mạng lưới càng chắc chắn về trạng thái hiện tại của mọi thứ.
+
+[Thông tin thêm về khai thác](/developers/docs/consensus-mechanisms/pow/mining/)
+
+## Cơ chế Chứng chỉ công việc của Ethereum hoạt động như thế nào? {#how-it-works}
+
+Các giao dịch trên Ethereum được xử lý thành các khối. Trong Ethereum sử dụng cơ chế Chứng chỉ công việc hiện đã bị loại bỏ, mỗi khối chứa:
+
+- khối độ khó - Ví dụ: 3.324.092.183.262.715
+- mixHash – ví dụ: `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29`
+- nonce – ví dụ: `0xd3ee432b4fb3d26b`
+
+Dữ liệu khối này liên quan trực tiếp đến bằng chứng công việc.
+
+### Công việc trong bằng chứng công việc {#the-work}
+
+Giao thức bằng chứng công việc, Ethash, yêu cầu các thợ đào phải trải qua một cuộc chạy đua thử và sai căng thẳng để tìm nonce cho một khối. Chỉ các khối có chuỗi số ngẫu nhiên hợp lệ mới có thể được thêm vào chuỗi.
+
+Khi chạy đua để tạo một khối, thợ khai thác lặp đi lặp lại một bộ dữ liệu, chỉ có thể thu được bằng cách tải xuống và chạy toàn bộ chuỗi (như một thợ khai thác thực hiện), qua một hàm toán học. Bộ dữ liệu này được sử dụng để tạo ra một giá trị hàm băm thấp hơn mức mục tiêu do độ khó của khối quyết định. Cách tốt nhất để thực hiện việc này là thông qua phương pháp thử và sai.
+
+Độ khó xác định mục tiêu cho giá trị băm. Mục tiêu càng thấp, tập hợp các giá trị băm hợp lệ càng nhỏ. Một khi được tạo ra, điều này trở nên cực kỳ dễ dàng để các thợ đào và các ứng dụng khác xác minh. Ngay cả khi chỉ một giao dịch thay đổi, giá trị băm sẽ hoàn toàn khác, báo hiệu gian lận.
+
+Băm giúp dễ dàng phát hiện gian lận. Nhưng Chứng chỉ công việc như một quá trình cũng là rào cản lớn ngăn việc tấn công chuỗi.
+
+### Bằng chứng công việc và bảo mật {#security}
+
+Các thợ đào được khuyến khích thực hiện công việc này trên chuỗi Ethereum chính. Có rất ít động lực để một nhóm thợ đào bắt đầu chuỗi riêng của họ - vì điều đó sẽ làm suy yếu hệ thống. Chuỗi khối dựa vào việc có một trạng thái duy nhất làm nguồn tin cậy.
+
+Mục tiêu của bằng chứng công việc là mở rộng chuỗi. Chuỗi dài nhất được tin tưởng là hợp lệ nhất vì nó có nhiều công việc tính toán nhất để tạo ra nó. Trong hệ thống PoW của Ethereum, gần như không thể tạo các khối mới để xóa giao dịch, tạo giao dịch giả, hoặc duy trì một chuỗi thứ hai. Điều này là vì một thợ khai thác ác ý sẽ phải luôn giải được chuỗi số ngẫu nhiên của khối nhanh hơn tất cả mọi người khác.
+
+Để liên tục tạo các khối hợp lệ nhưng ác ý, một thợ khai thác ác ý sẽ cần hơn 51% sức mạnh khai thác của mạng để vượt qua tất cả những người khác. Lượng “công việc” đó đòi hỏi rất nhiều sức mạnh tính toán tốn kém và năng lượng tiêu thụ có thể còn vượt quá lợi ích đạt được từ một cuộc tấn công.
+
+### Kinh tế học bằng chứng công việc {#economics}
+
+Chứng chỉ công việc cũng chịu trách nhiệm phát hành tiền mới vào hệ thống và khuyến khích các thợ khai thác thực hiện công việc.
+
+Kể từ [bản nâng cấp Constantinople](/ethereum-forks/#constantinople), các thợ đào tạo thành công một khối đã được thưởng hai ETH mới được đúc và một phần phí giao dịch. Các khối ommer cũng được bồi thường 1,75 ETH. Khối ommer là các khối hợp lệ được một thợ khai thác tạo ra gần như cùng lúc với thợ khai thác khác tạo khối chính thức, và cuối cùng khối chính thức được xác định dựa trên chuỗi nào được xây dựng tiếp trước. Các khối ommer thường xảy ra do độ trễ mạng.
+
+## Tính kết luận cuối cùng {#finality}
+
+Một giao dịch có “Tính kết luận cuối cùng” trên Ethereum khi nó là một phần của khối không thể thay đổi.
+
+Vì các thợ đào làm việc theo cách phi tập trung, hai khối hợp lệ có thể được khai thác cùng lúc. Điều này tạo ra một phân nhánh tạm thời. Cuối cùng, một trong các chuỗi này trở thành chuỗi được chấp nhận sau khi các khối tiếp theo được khai thác và thêm vào, làm cho nó dài hơn.
+
+Để làm phức tạp thêm mọi thứ, các giao dịch bị từ chối trên phân nhánh tạm thời có thể không được đưa vào chuỗi được chấp nhận. Điều này có nghĩa là nó có thể bị đảo ngược. Do đó, tính kết luận cuối cùng đề cập đến khoảng thời gian bạn nên chờ trước khi xem xét một giao dịch không thể đảo ngược. Với Ethereum bằng chứng công việc trước đây, càng có nhiều khối được khai thác trên một khối `N` cụ thể, thì độ tin cậy rằng các giao dịch trong `N` đã thành công và sẽ không bị đảo ngược càng cao. Hiện nay, với cơ chế bằng chứng cổ phần, tính cuối cùng của một khối là một đặc tính rõ ràng, thay vì mang tính xác suất.
+
+## Mức tiêu thụ năng lượng của bằng chứng công việc {#energy}
+
+Một trong những chỉ trích chính về chứng chỉ làm việc là lượng năng lượng cần thiết để giữ an toàn cho mạng lưới. Để duy trì bảo mật và tính phi tập trung, Ethereum khi sử dụng bằng chứng công việc đã tiêu thụ một lượng lớn năng lượng. Ngay trước khi chuyển sang bằng chứng cổ phần, các thợ đào Ethereum đã tiêu thụ tổng cộng khoảng 70 TWh/năm (tương đương mức tiêu thụ của Cộng hòa Séc - theo [digiconomist](https://digiconomist.net/) vào ngày 18 tháng 7 năm 2022).
+
+## Ưu và nhược điểm {#pros-and-cons}
+
+| Ưu điểm | Nhược điểm |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Bằng chứng công việc là trung lập. Bạn không cần ETH để bắt đầu và phần thưởng khối sẽ cho bạn từ 0ETH đến một số dư số dương. Với [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/), bạn cần có ETH để bắt đầu. | Bằng chứng công việc tiêu thụ quá nhiều năng lượng, gây hại cho môi trường. |
+| Bằng chứng công việc là một cơ chế đồng thuận kiểm thử, giúp Bitcoin và Ethereum duy trì tính bảo mật và tính phi tập trung trong nhiều năm. | Nếu bạn muốn khai thác, bạn cần thiết bị chuyên dụng đến mức việc bắt đầu là một khoản đầu tư lớn. |
+| So với bằng chứng cổ phần, nó tương đối dễ triển khai. | Do nhu cầu tính toán ngày càng tăng, các nhóm khai thác có thể chiếm ưu thế trong việc khai thác, dẫn đến tập trung hóa và rủi ro bảo mật. |
+
+## So sánh với bằng chứng cổ phần {#compared-to-pos}
+
+Ở cấp độ cao, bằng chứng cổ phần có cùng mục tiêu cuối cùng như bằng chứng công việc: giúp mạng phi tập trung đạt được sự đồng thuận một cách an toàn. Nhưng nó có một số khác biệt về quy trình và nhân sự:
+
+- Bằng chứng công việc thay thế tầm quan trọng của sức mạnh tính toán bằng ETH đã được đặt cọc.
+- Chứng chỉ gửi thay thế các thợ khai thác bằng các người xác thực. Các người xác thực đặt cọc ETH của họ để kích hoạt khả năng tạo các khối mới.
+- Các người xác thực không cạnh tranh để tạo khối; thay vào đó, họ được chọn ngẫu nhiên bởi một thuật toán.
+- Tính kết luận cuối cùng rõ ràng hơn: tại các điểm kiểm tra nhất định, nếu 2/3 trình xác thực đồng ý về trạng thái của khối, khối đó được coi là cuối cùng. Trình xác thực phải đặt cược toàn bộ tiền đặt cược của họ vào điều này, vì vậy nếu họ cố gắng thông đồng, họ sẽ mất toàn bộ tiền đặt cược.
+
+[Thông tin thêm về bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/)
+
+## Tìm hiểu thêm từ video trực quan? Người học qua hình ảnh {#visual-learner}
+
+
+
+## Đọc thêm {#further-reading}
+
+- [Tấn công đa số](https://en.bitcoin.it/wiki/Majority_attack)
+- [Về tính hoàn tất của quyết toán](https://blog.ethereum.org/2016/05/09/on-settlement-finality/)
+
+### Video {#videos}
+
+- [Giải thích kỹ thuật về các giao thức bằng chứng công việc](https://youtu.be/9V1bipPkCTU)
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Khai thác](/developers/docs/consensus-mechanisms/pow/mining/)
+- [Bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/)
+- [Bằng chứng ủy quyền](/developers/docs/consensus-mechanisms/poa/)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/index.md
new file mode 100644
index 00000000000..8627c0ad9e1
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/index.md
@@ -0,0 +1,86 @@
+---
+title: Khai thác
+description: Giải thích về cách hoạt động của việc khai thác trên Ethereum.
+lang: vi
+---
+
+
+
+
+
+Bằng chứng làm việc không còn là cơ chế đồng thuận nền tảng của Ethereum, nghĩa là việc khai thác đã bị tắt. Thay vào đó, Ethereum được bảo mật bởi các trình xác thực đặt cọc ETH. Bạn có thể bắt đầu đặt cọc ETH của mình ngay từ hôm nay. Đọc thêm về sự kiện hợp nhất, Bằng chứng cổ phần và Cổ phần. Trang này chỉ nhằm mục đích tham khảo lịch sử.
+
+
+
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [các giao dịch](/developers/docs/transactions/), [các khối](/developers/docs/blocks/) và [bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/).
+
+## Đào Ethereum là gì? {#what-is-ethereum-mining}
+
+Khai thác là quá trình tạo ra một khối giao dịch để thêm vào blockchain Ethereum trong kiến trúc bằng chứng làm việc của Ethereum, hiện đã bị loại bỏ.
+
+Từ mining bắt nguồn từ phép ẩn dụ vàng trong bối cảnh tiền điện tử. Vàng hay các kim loại quý thì khan hiếm, tương tự, các token số cũng khan hiếm, và cách duy nhất để tăng tổng lượng trong hệ thống Bằng chứng làm việc là thông qua khai thác. Trong Ethereum sử dụng bằng chứng làm việc, cách duy nhất để phát hành token là thông qua khai thác. Tuy nhiên, khác với vàng hay các kim loại quý, khai thác Ethereum còn là phương thức để bảo mật mạng lưới bằng cách tạo, xác minh, công bố và truyền tải các khối lên blockchain.
+
+Khai thác Ethers = Bảo mật mạng lưới
+
+Khai thác là mạch sống của bất kỳ blockchain nào sử dụng cơ chế Bằng chứng làm việc. Các thợ đào Ethereum – những máy tính chạy phần mềm – đã sử dụng thời gian và sức mạnh tính toán của mình để xử lý giao dịch và tạo khối trước khi Ethereum chuyển sang cơ chế Bằng chứng cổ phần.
+
+## Tại sao lại có các thợ đào? {#why-do-miners-exist}
+
+Trong các hệ thống phi tập trung như Ethereum, chúng ta cần đảm bảo rằng tất cả mọi người đồng thuận về thứ tự các giao dịch. Các thợ đào trợ giúp điều này xảy ra bằng cách giải các bài toán tính toán phức tạp để tạo khối, đồng thời bảo vệ mạng lưới khỏi các cuộc tấn công.
+
+[Thông tin thêm về bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/)
+
+Trước đây, bất kỳ ai cũng có thể khai thác trên mạng lưới Ethereum bằng máy tính của mình. Tuy nhiên, không phải ai cũng có thể khai thác Ether (ETH) một cách có lợi nhuận. Trong hầu hết các trường hợp, các thợ đào phải mua phần cứng máy tính chuyên dụng và có nguồn năng lượng giá rẻ. Các máy tính thông thường khó có thể kiếm đủ phần thưởng khối để bù đắp chi phí khai thác liên quan.
+
+### Chi phí khai thác {#cost-of-mining}
+
+- Chi phí tiềm ẩn cho phần cứng cần thiết để xây dựng và vận hành một dàn khai thác
+- Chi phí điện để cung cấp năng lượng cho dàn khai thác
+- Nếu bạn khai thác trong một bể, các bể này thường tính một mức phí cố định theo phần trăm trên mỗi khối mà bể tạo ra
+- Chi phí tiềm ẩn cho thiết bị hỗ trợ dàn khai thác (quạt thông gió, giám sát năng lượng, hệ thống điện, v.v.)
+
+Để tìm hiểu thêm về lợi nhuận khai thác, hãy sử dụng công cụ tính toán khai thác, chẳng hạn như công cụ do [Etherscan](https://etherscan.io/ether-mining-calculator) cung cấp.
+
+## Cách các giao dịch Ethereum đã được khai thác {#how-ethereum-transactions-were-mined}
+
+Phần sau đây cung cấp tổng quan về cách các giao dịch được khai thác trên Ethereum theo cơ chế Bằng chứng làm việc. Mô tả tương tự về quy trình này cho bằng chứng cổ phần của Ethereum có thể được tìm thấy [tại đây](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos).
+
+1. Một người dùng viết và ký một yêu cầu [giao dịch](/developers/docs/transactions/) bằng khóa riêng tư của một [tài khoản](/developers/docs/accounts/) nào đó.
+2. Người dùng phát tán yêu cầu giao dịch đến toàn bộ mạng Ethereum từ một [nút](/developers/docs/nodes-and-clients/) nào đó.
+3. Khi nhận được thông tin về yêu cầu giao dịch mới, mỗi nút trong mạng Ethereum sẽ thêm yêu cầu đó vào bộ nhớ tạm cục bộ, là danh sách tất cả các yêu cầu giao dịch mà chúng biết nhưng chưa được ghi vào chuỗi khối dưới dạng một khối.
+4. Tại một thời điểm nào đó, một nút khai thác tổng hợp vài chục hoặc hàng trăm yêu cầu giao dịch thành một [khối](/developers/docs/blocks/) tiềm năng, theo cách tối đa hóa [phí giao dịch](/developers/docs/gas/) mà họ kiếm được trong khi vẫn ở dưới giới hạn gas của khối. Nút khai thác sau đó sẽ là:
+ 1. Xác minh tính hợp lệ của từng yêu cầu giao dịch (tức là không ai đang cố gắng chuyển ether ra khỏi một tài khoản mà họ chưa ký, yêu cầu không bị sai định dạng, v.v.), sau đó thực thi mã của yêu cầu, làm thay đổi trạng thái bản sao cục bộ của Máy chủ ảo Ethereum của họ. Thợ đào sẽ nhận phí giao dịch của mỗi yêu cầu giao dịch đó vào tài khoản của chính họ.
+ 2. Bắt đầu quá trình tạo chứng chỉ hợp lệ cho khối tiềm năng, sau khi tất cả các yêu cầu giao dịch trong khối đã được xác minh và thực thi trên bản sao Máy chủ ảo Ethereum cục bộ.
+5. Cuối cùng, một thợ đào sẽ hoàn tất việc tạo chứng chỉ cho một khối, trong đó bao gồm yêu cầu giao dịch cụ thể của chúng ta. Sau đó, thợ khai thác phát tán khối đã hoàn tất, trong đó bao gồm chứng chỉ và một giá trị kiểm tra của trạng thái Máy chủ ảo Ethereum mới được khai báo.
+6. Các nút khác nhận được thông tin về khối mới. Họ xác minh chứng chỉ, tự thực thi tất cả các giao dịch trong khối (bao gồm cả giao dịch ban đầu do người dùng của chúng ta phát tán), và kiểm tra xem giá trị kiểm tra của trạng thái Máy chủ ảo Ethereum mới sau khi thực thi tất cả giao dịch có khớp với giá trị kiểm tra của trạng thái do khối của Thợ đào khai báo hay không. Chỉ sau đó, các nút này mới thêm khối này vào cuối chuỗi blockchain của họ và chấp nhận trạng thái Máy chủ ảo Ethereum mới là trạng thái chính thức.
+7. Mỗi nút sẽ xóa tất cả các giao dịch trong khối mới khỏi bộ nhớ tạm cục bộ của mình, nơi lưu trữ các yêu cầu giao dịch chưa được thực hiện.
+8. Các nút mới tham gia mạng sẽ tải xuống tất cả các khối theo thứ tự, bao gồm cả khối chứa giao dịch mà chúng ta quan tâm. Chúng khởi tạo một bản sao Máy chủ ảo Ethereum cục bộ (bắt đầu từ trạng thái trống), sau đó thực hiện quá trình thực thi mọi giao dịch trong từng khối trên bản sao Máy chủ ảo Ethereum cục bộ của mình, đồng thời kiểm tra giá trị kiểm tra trạng thái ở mỗi khối trong quá trình này.
+
+Mỗi giao dịch chỉ được khai thác một lần (được đưa vào khối mới và truyền đi lần đầu), nhưng lại được thực thi và xác minh bởi mọi người tham gia trong quá trình cập nhật trạng thái Máy chủ ảo Ethereum chính thức. Điều này nhấn mạnh một trong những phương châm cốt lõi của chuỗi khối: **Đừng tin, hãy xác minh**.
+
+## Các khối Ommer (chú) {#ommer-blocks}
+
+Khai thác khối trên cơ chế Bằng chứng công việc mang tính xác suất, nghĩa là đôi khi hai khối hợp lệ được công bố cùng lúc do độ trễ mạng. Trong trường hợp này, giao thức phải xác định chuỗi dài nhất (và do đó là chuỗi "hợp lệ" nhất) đồng thời đảm bảo công bằng cho các thợ khai thác bằng cách phần thưởng một phần cho khối hợp lệ nhưng không được đưa vào chuỗi. Điều này khuyến khích việc phân quyền hóa mạng hơn nữa, vì các thợ đào nhỏ hơn, những người có thể phải đối mặt với độ trễ cao hơn, vẫn có thể tạo ra lợi nhuận thông qua phần thưởng khối [ommer](/glossary/#ommer).
+
+Thuật ngữ "ommer" là cách gọi trung lập về giới tính được ưu tiên cho khối anh/chị/em của khối cha, nhưng đôi khi cũng được gọi là "chú". **Kể từ khi Ethereum chuyển sang bằng chứng cổ phần, các khối ommer không còn được khai thác nữa** vì chỉ có một người đề xuất được bầu trong mỗi slot. Bạn có thể thấy sự thay đổi này bằng cách xem [biểu đồ lịch sử](https://ycharts.com/indicators/ethereum_uncle_rate) của các khối ommer đã được khai thác.
+
+## Bản demo trực quan {#a-visual-demo}
+
+Hãy theo dõi Austin hướng dẫn bạn về việc khai thác và chuỗi khỗi proof of work.
+
+
+
+## Thuật toán khai thác {#mining-algorithm}
+
+Mạng chính Ethereum chỉ từng sử dụng một thuật toán khai thác - ['Ethash'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/). Ethash là thuật toán kế thừa của thuật toán R&D ban đầu có tên là ['Dagger-Hashimoto'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/).
+
+[Tìm hiểu thêm về các thuật toán khai thác](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/).
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Gas](/developers/docs/gas/)
+- [Máy chủ ảo Ethereum](/developers/docs/evm/)
+- [Bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/)
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md
new file mode 100644
index 00000000000..56cd5e88fb0
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md
@@ -0,0 +1,330 @@
+---
+title: Dagger-Hashimoto
+description: Một cái nhìn chi tiết về thuật toán Dagger-Hashimoto.
+lang: vi
+---
+
+Dagger-Hashimoto là bản triển khai nghiên cứu và đặc tả ban đầu cho thuật toán khai thác của Ethereum. Dagger-Hashimoto đã được thay thế bằng [Ethash](#ethash). Hoạt động khai thác đã bị tắt hoàn toàn tại [The Merge](/roadmap/merge/) vào ngày 15 tháng 9 năm 2022. Kể từ đó, Ethereum đã được bảo mật bằng cơ chế [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos). Trang này mang tính chất lịch sử - thông tin ở đây không còn phù hợp với Ethereum sau The Merge.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [sự đồng thuận bằng chứng công việc](/developers/docs/consensus-mechanisms/pow), [khai thác](/developers/docs/consensus-mechanisms/pow/mining) và [các thuật toán khai thác](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms).
+
+## Dagger-Hashimoto {#dagger-hashimoto}
+
+Dagger-Hashimoto nhằm đáp ứng hai mục tiêu:
+
+1. **Kháng ASIC**: lợi ích từ việc tạo ra phần cứng chuyên dụng cho thuật toán phải nhỏ nhất có thể
+2. **Khả năng xác minh của ứng dụng nhẹ**: một khối phải có thể được xác minh hiệu quả bởi một ứng dụng nhẹ.
+
+Với một sửa đổi bổ sung, chúng tôi cũng chỉ định cách thực hiện mục tiêu thứ ba nếu muốn, nhưng phải trả giá bằng sự phức tạp tăng thêm:
+
+**Lưu trữ toàn bộ chuỗi**: việc khai thác phải yêu cầu lưu trữ toàn bộ trạng thái chuỗi khối (do cấu trúc bất thường của cây trạng thái Ethereum, chúng tôi dự đoán rằng có thể thực hiện một số cắt tỉa, đặc biệt là đối với một số hợp đồng thường được sử dụng, nhưng chúng tôi muốn giảm thiểu điều này).
+
+## Tạo DAG {#dag-generation}
+
+Mã cho thuật toán sẽ được định nghĩa bằng Python bên dưới. Đầu tiên, chúng tôi cung cấp `encode_int` để sắp xếp các số nguyên không dấu có độ chính xác cụ thể thành các chuỗi. Nghịch đảo của nó cũng được đưa ra:
+
+```python
+NUM_BITS = 512
+
+def encode_int(x):
+ "Mã hóa một số nguyên x thành một chuỗi gồm 64 ký tự bằng cách sử dụng lược đồ big-endian"
+ o = ''
+ for _ in range(NUM_BITS / 8):
+ o = chr(x % 256) + o
+ x //= 256
+ return o
+
+def decode_int(s):
+ "Giải mã một số nguyên x từ một chuỗi bằng cách sử dụng lược đồ big-endian"
+ x = 0
+ for c in s:
+ x *= 256
+ x += ord(c)
+ return x
+```
+
+Tiếp theo, chúng tôi giả định rằng `sha3` là một hàm nhận một số nguyên và xuất ra một số nguyên, và `dbl_sha3` là một hàm double-sha3; nếu chuyển đổi mã tham chiếu này thành một bản triển khai, hãy sử dụng:
+
+```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)))
+```
+
+### Các tham số {#parameters}
+
+Các tham số được sử dụng cho thuật toán là:
+
+```python
+SAFE_PRIME_512 = 2**512 - 38117 # Số nguyên tố an toàn lớn nhất nhỏ hơn 2**512
+
+params = {
+ "n": 4000055296 * 8 // NUM_BITS, # Kích thước của bộ dữ liệu (4 Gigabyte); PHẢI LÀ BỘI SỐ CỦA 65536
+ "n_inc": 65536, # Gia số trong giá trị của n mỗi kỳ; PHẢI LÀ BỘI SỐ CỦA 65536
+ # với epochtime=20000 cho tốc độ tăng trưởng 882 MB mỗi năm
+ "cache_size": 2500, # Kích thước bộ nhớ đệm của ứng dụng nhẹ (có thể được chọn bởi ứng dụng nhẹ
+ # ; không thuộc đặc tả của thuật toán)
+ "diff": 2**14, # Độ khó (được điều chỉnh trong quá trình đánh giá khối)
+ "epochtime": 100000, # Độ dài của một epoch trong các khối (tần suất bộ dữ liệu được cập nhật)
+ "k": 1, # Số lượng nút mẹ của một nút
+ "w": w, # Được sử dụng để băm lũy thừa theo mô-đun
+ "accesses": 200, # Số lần truy cập bộ dữ liệu trong quá trình hashimoto
+ "P": SAFE_PRIME_512 # Số nguyên tố an toàn để băm và tạo số ngẫu nhiên
+}
+```
+
+`P` trong trường hợp này là một số nguyên tố được chọn sao cho `log₂(P)` nhỏ hơn 512 một chút, tương ứng với 512 bit mà chúng ta đã sử dụng để biểu diễn các con số của mình. Lưu ý rằng chỉ có nửa sau của DAG thực sự cần được lưu trữ, vì vậy yêu cầu RAM trên thực tế bắt đầu ở mức 1 GB và tăng 441 MB mỗi năm.
+
+### Xây dựng đồ thị Dagger {#dagger-graph-building}
+
+Nguyên hàm xây dựng đồ thị dagger được định nghĩa như sau:
+
+```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
+```
+
+Về cơ bản, nó bắt đầu một đồ thị dưới dạng một nút duy nhất, `sha3(seed)`, và từ đó bắt đầu tuần tự thêm các nút khác dựa trên các nút ngẫu nhiên trước đó. Khi một nút mới được tạo, một lũy thừa theo mô-đun của seed được tính toán để chọn ngẫu nhiên một số chỉ số nhỏ hơn `i` (sử dụng `x % i` ở trên), và các giá trị của các nút tại các chỉ số đó được sử dụng trong một phép tính để tạo ra một giá trị mới cho `x`, sau đó được đưa vào một hàm bằng chứng công việc nhỏ (dựa trên XOR) để cuối cùng tạo ra giá trị của đồ thị tại chỉ số `i`. Lý do đằng sau thiết kế đặc biệt này là để buộc truy cập tuần tự vào DAG; giá trị tiếp theo của DAG sẽ được truy cập không thể được xác định cho đến khi giá trị hiện tại được biết. Cuối cùng, lũy thừa theo mô-đun sẽ băm kết quả sâu hơn nữa.
+
+Thuật toán này dựa trên một số kết quả từ lý thuyết số. Xem phụ lục bên dưới để thảo luận.
+
+## Đánh giá ứng dụng nhẹ {#light-client-evaluation}
+
+Việc xây dựng đồ thị ở trên nhằm mục đích cho phép mỗi nút trong đồ thị được tái tạo bằng cách tính toán một cây con chỉ gồm một số lượng nhỏ các nút và chỉ yêu cầu một lượng nhỏ bộ nhớ phụ. Lưu ý rằng với k=1, cây con chỉ là một chuỗi các giá trị đi lên đến phần tử đầu tiên trong DAG.
+
+Hàm tính toán của ứng dụng nhẹ cho DAG hoạt động như sau:
+
+```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)
+```
+
+Về cơ bản, nó chỉ đơn giản là một bản viết lại của thuật toán trên, loại bỏ vòng lặp tính toán các giá trị cho toàn bộ DAG và thay thế việc tra cứu nút trước đó bằng một lệnh gọi đệ quy hoặc một tra cứu bộ nhớ đệm. Lưu ý rằng đối với `k=1`, bộ nhớ đệm là không cần thiết, mặc dù một tối ưu hóa sâu hơn thực sự tính toán trước vài nghìn giá trị đầu tiên của DAG và giữ đó làm bộ nhớ đệm tĩnh cho các phép tính; xem phụ lục để biết mã triển khai của việc này.
+
+## Bộ đệm kép của các DAG {#double-buffer}
+
+Trong một ứng dụng đầy đủ, một [_bộ đệm kép_](https://wikipedia.org/wiki/Multiple_buffering) gồm 2 DAG được tạo ra bởi công thức trên được sử dụng. Ý tưởng là các DAG được tạo ra mỗi `epochtime` khối theo các tham số ở trên. Thay vì ứng dụng sử dụng DAG mới nhất được tạo ra, nó sử dụng DAG trước đó. Lợi ích của việc này là nó cho phép các DAG được thay thế theo thời gian mà không cần phải kết hợp một bước mà các thợ đào phải đột ngột tính toán lại tất cả dữ liệu. Nếu không, có khả năng xử lý chuỗi sẽ bị chậm lại đột ngột và tạm thời ở các khoảng thời gian đều đặn và làm tăng đáng kể sự tập trung hóa. Do đó có rủi ro tấn công 51% trong vòng vài phút trước khi tất cả dữ liệu được tính toán lại.
+
+Thuật toán được sử dụng để tạo tập hợp các DAG được sử dụng để tính toán công việc cho một khối như sau:
+
+```python
+def get_prevhash(n):
+ from pyethereum.blocks import GENESIS_PREVHASH
+ from pyethereum import chain_manager
+ if n <= 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:
+ # Không thể có bộ đệm sau, chỉ cần tạo bộ đệm trước
+ 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}
+
+Ý tưởng đằng sau Hashimoto ban đầu là sử dụng chuỗi khối làm bộ dữ liệu, thực hiện một phép tính chọn N chỉ số từ chuỗi khối, thu thập các giao dịch tại các chỉ số đó, thực hiện phép XOR dữ liệu này và trả về giá trị băm của kết quả. Thuật toán ban đầu của Thaddeus Dryja, được dịch sang Python để đảm bảo tính nhất quán, như sau:
+
+```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_mix ^ (nonce << 192)
+```
+
+Thật không may, mặc dù Hashimoto được coi là khó về RAM, nó lại dựa vào số học 256-bit, vốn có chi phí tính toán đáng kể. Tuy nhiên, Dagger-Hashimoto chỉ sử dụng 64 bit có trọng số thấp nhất khi lập chỉ mục cho bộ dữ liệu của mình để giải quyết vấn đề này.
+
+```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)
+```
+
+Việc sử dụng double SHA3 cho phép một hình thức xác minh trước gần như tức thời, không có dữ liệu, chỉ xác minh rằng một giá trị trung gian chính xác đã được cung cấp. Lớp bằng chứng công việc bên ngoài này rất thân thiện với ASIC và khá yếu, nhưng tồn tại để làm cho việc tấn công DDoS trở nên khó khăn hơn vì một lượng nhỏ công việc đó phải được thực hiện để tạo ra một khối sẽ không bị từ chối ngay lập tức. Đây là phiên bản ứng dụng nhẹ:
+
+```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)
+```
+
+## Khai thác và xác minh {#mining-and-verifying}
+
+Bây giờ, chúng ta hãy kết hợp tất cả lại thành thuật toán khai thác:
+
+```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
+```
+
+Đây là thuật toán xác minh:
+
+```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
+```
+
+Xác minh thân thiện với ứng dụng nhẹ:
+
+```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
+```
+
+Ngoài ra, lưu ý rằng Dagger-Hashimoto áp đặt các yêu cầu bổ sung đối với tiêu đề khối:
+
+- Để xác minh hai lớp hoạt động, tiêu đề khối phải có cả nonce và giá trị trung gian trước khi qua sha3
+- Ở đâu đó, tiêu đề khối phải lưu trữ sha3 của seedset hiện tại
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Phụ lục {#appendix}
+
+Như đã lưu ý ở trên, RNG được sử dụng để tạo DAG dựa trên một số kết quả từ lý thuyết số. Đầu tiên, chúng tôi đảm bảo rằng Lehmer RNG, là cơ sở cho biến `picker`, có một chu kỳ dài. Thứ hai, chúng tôi chỉ ra rằng `pow(x,3,P)` sẽ không ánh xạ `x` tới `1` hoặc `P-1` với điều kiện `x ∈ [2,P-2]` ban đầu. Cuối cùng, chúng tôi chỉ ra rằng `pow(x,3,P)` có tỷ lệ xung đột thấp khi được coi là một hàm băm.
+
+### Trình tạo số ngẫu nhiên Lehmer {#lehmer-random-number}
+
+Mặc dù hàm `produce_dag` không cần tạo ra các số ngẫu nhiên không thiên vị, một mối đe dọa tiềm tàng là `seed**i % P` chỉ nhận một vài giá trị. Điều này có thể mang lại lợi thế cho những thợ đào nhận ra quy luật so với những người không nhận ra.
+
+Để tránh điều này, một kết quả từ lý thuyết số được sử dụng. Một [_Số nguyên tố an toàn_](https://en.wikipedia.org/wiki/Safe_prime) được định nghĩa là một số nguyên tố `P` sao cho `(P-1)/2` cũng là một số nguyên tố. Bậc của một thành viên `x` của [nhóm nhân](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ` được định nghĩa là `m` nhỏ nhất sao cho xᵐ mod P ≡ 1
+Với các định nghĩa này, chúng ta có:
+
+> Quan sát 1. Cho `x` là một thành viên của nhóm nhân `ℤ/Pℤ` đối với một số nguyên tố an toàn `P`. Nếu `x mod P ≠ 1 mod P` và `x mod P ≠ P-1 mod P`, thì bậc của `x` là `P-1` hoặc `(P-1)/2`.
+
+_Bằng chứng_. Vì `P` là một số nguyên tố an toàn, nên theo [Định lý Lagrange][lagrange], chúng ta có bậc của `x` là `1`, `2`, `(P-1)/2` hoặc `P-1`.
+
+Bậc của `x` không thể là `1`, vì theo Định lý nhỏ Fermat, chúng ta có:
+
+xP-1 mod P ≡ 1
+
+Do đó, `x` phải là một phần tử đơn vị nhân của `ℤ/nℤ`, là duy nhất. Vì chúng ta đã giả định rằng `x ≠ 1`, điều này là không thể.
+
+Bậc của `x` không thể là `2` trừ khi `x = P-1`, vì điều này sẽ vi phạm tính nguyên tố của `P`.
+
+Từ mệnh đề trên, chúng ta có thể nhận ra rằng việc lặp `(picker * init) % P` sẽ có độ dài chu kỳ ít nhất là `(P-1)/2`. Điều này là do chúng tôi đã chọn `P` là một số nguyên tố an toàn xấp xỉ bằng một lũy thừa cao hơn của hai, và `init` nằm trong khoảng `[2,2**256+1]`. Với độ lớn của `P`, chúng ta không bao giờ nên mong đợi một chu kỳ từ phép lũy thừa theo mô-đun.
+
+Khi chúng ta gán ô đầu tiên trong DAG (biến có nhãn `init`), chúng ta tính toán `pow(sha3(seed) + 2, 3, P)`. Thoạt nhìn, điều này không đảm bảo rằng kết quả không phải là `1` cũng không phải là `P-1`. Tuy nhiên, vì `P-1` là một số nguyên tố an toàn, chúng tôi có thêm sự đảm bảo sau đây, là hệ quả của Quan sát 1:
+
+> Quan sát 2. Cho `x` là một thành viên của nhóm nhân `ℤ/Pℤ` đối với một số nguyên tố an toàn `P`, và cho `w` là một số tự nhiên. Nếu `x mod P ≠ 1 mod P` và `x mod P ≠ P-1 mod P`, cũng như `w mod P ≠ P-1 mod P` và `w mod P ≠ 0 mod P`, thì `xʷ mod P ≠ 1 mod P` và `xʷ mod P ≠ P-1 mod P`
+
+### Lũy thừa theo mô-đun như một hàm băm {#modular-exponentiation}
+
+Đối với các giá trị nhất định của `P` và `w`, hàm `pow(x, w, P)` có thể có nhiều xung đột. Ví dụ, `pow(x,9,19)` chỉ nhận các giá trị `{1,18}`.
+
+Với `P` là số nguyên tố, thì `w` thích hợp cho một hàm băm lũy thừa theo mô-đun có thể được chọn bằng cách sử dụng kết quả sau:
+
+> Quan sát 3. Cho `P` là một số nguyên tố; `w` và `P-1` là nguyên tố cùng nhau khi và chỉ khi với mọi `a` và `b` trong `ℤ/Pℤ`:`aʷ mod P ≡ bʷ mod P` khi và chỉ khi `a mod P ≡ b mod P`
+
+Do đó, với `P` là số nguyên tố và `w` là nguyên tố cùng nhau với `P-1`, chúng ta có `|{pow(x, w, P) : x ∈ ℤ}| = P`, ngụ ý rằng hàm băm có tỷ lệ xung đột nhỏ nhất có thể.
+
+Trong trường hợp đặc biệt mà `P` là một số nguyên tố an toàn như chúng ta đã chọn, thì `P-1` chỉ có các ước số là 1, 2, `(P-1)/2` và `P-1`. Vì `P` > 7, chúng ta biết rằng 3 là nguyên tố cùng nhau với `P-1`, do đó `w=3` thỏa mãn mệnh đề trên.
+
+## Thuật toán đánh giá dựa trên bộ nhớ đệm hiệu quả hơn {#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/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md
new file mode 100644
index 00000000000..7b30db1634d
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md
@@ -0,0 +1,1022 @@
+---
+title: Ethash
+description: Cái nhìn chi tiết về thuật toán Ethash.
+lang: vi
+---
+
+
+
+
+
+ Ethash là thuật toán khai thác bằng chứng công việc của Ethereum. Bằng chứng công việc hiện đã được **tắt hoàn toàn** và Ethereum hiện được bảo mật bằng cách sử dụng [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/). Đọc thêm về [The Merge](/roadmap/merge/), [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/) và [đặt cược](/staking/). Trang này mang tính chất lịch sử!
+
+
+
+
+Ethash là một phiên bản sửa đổi của thuật toán [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto). Bằng chứng công việc Ethash có [độ khó bộ nhớ](https://wikipedia.org/wiki/Memory-hard_function), điều này được cho là làm cho thuật toán có khả năng kháng vi mạch tích hợp chuyên dụng (ASIC). Các vi mạch tích hợp chuyên dụng (ASIC) Ethash cuối cùng đã được phát triển nhưng việc khai thác bằng GPU vẫn là một lựa chọn khả thi cho đến khi bằng chứng công việc bị tắt. Ethash vẫn được sử dụng để khai thác các đồng tiền mã hóa khác trên các mạng bằng chứng công việc không phải của Ethereum.
+
+## Ethash hoạt động như thế nào? {#how-does-ethash-work}
+
+Độ khó bộ nhớ đạt được bằng một thuật toán bằng chứng công việc yêu cầu chọn các tập hợp con của một tài nguyên cố định phụ thuộc vào nonce và tiêu đề khối. Tài nguyên này (kích thước vài gigabyte) được gọi là DAG. DAG được thay đổi sau mỗi 30.000 khối, một khoảng thời gian ~125 giờ được gọi là một tham số epoch (khoảng 5,2 ngày) và mất một khoảng thời gian để tạo. Vì DAG chỉ phụ thuộc vào chiều cao khối, nó có thể được tạo trước, nhưng nếu không, máy khách cần đợi cho đến khi kết thúc quá trình này để tạo ra một khối. Nếu các máy khách không tạo trước và lưu vào bộ đệm DAG trước thời hạn, mạng có thể gặp phải độ trễ khối lớn ở mỗi lần chuyển tiếp tham số epoch. Lưu ý rằng DAG không cần phải được tạo để xác minh bằng chứng công việc, về cơ bản cho phép xác minh bằng cả CPU thấp và bộ nhớ nhỏ.
+
+Lộ trình chung mà thuật toán thực hiện như sau:
+
+1. Tồn tại một **seed** có thể được tính toán cho mỗi khối bằng cách quét qua các tiêu đề khối cho đến thời điểm đó.
+2. Từ seed, người ta có thể tính toán một **bộ đệm giả ngẫu nhiên 16 MB**. Các máy khách nhẹ lưu trữ bộ đệm.
+3. Từ bộ đệm, chúng ta có thể tạo ra một **bộ dữ liệu 1 GB**, với thuộc tính là mỗi mục trong bộ dữ liệu chỉ phụ thuộc vào một số lượng nhỏ các mục từ bộ đệm. Các máy khách đầy đủ và thợ đào lưu trữ bộ dữ liệu. Bộ dữ liệu tăng tuyến tính theo thời gian.
+4. Việc khai thác bao gồm việc lấy các lát ngẫu nhiên của bộ dữ liệu và băm chúng lại với nhau. Việc xác minh có thể được thực hiện với bộ nhớ thấp bằng cách sử dụng bộ đệm để tái tạo các phần cụ thể của bộ dữ liệu mà bạn cần, vì vậy bạn chỉ cần lưu trữ bộ đệm.
+
+Bộ dữ liệu lớn được cập nhật sau mỗi 30.000 khối, vì vậy phần lớn nỗ lực của một thợ đào sẽ là đọc bộ dữ liệu chứ không phải thay đổi nó.
+
+## Các định nghĩa {#definitions}
+
+Chúng tôi sử dụng các định nghĩa sau:
+
+```
+WORD_BYTES = 4 # byte trong một từ
+DATASET_BYTES_INIT = 2**30 # byte trong bộ dữ liệu tại genesis
+DATASET_BYTES_GROWTH = 2**23 # sự tăng trưởng của bộ dữ liệu trên mỗi tham số epoch
+CACHE_BYTES_INIT = 2**24 # byte trong bộ đệm tại genesis
+CACHE_BYTES_GROWTH = 2**17 # sự tăng trưởng của bộ đệm trên mỗi tham số epoch
+CACHE_MULTIPLIER=1024 # Kích thước của DAG so với bộ đệm
+EPOCH_LENGTH = 30000 # khối trên mỗi tham số epoch
+MIX_BYTES = 128 # độ rộng của mix
+HASH_BYTES = 64 # độ dài hàm băm tính bằng byte
+DATASET_PARENTS = 256 # số lượng các mục cha của mỗi phần tử trong bộ dữ liệu
+CACHE_ROUNDS = 3 # số vòng trong quá trình sản xuất bộ đệm
+ACCESSES = 64 # số lần truy cập trong vòng lặp hashimoto
+```
+
+### Việc sử dụng 'SHA3' {#sha3}
+
+Sự phát triển của Ethereum trùng hợp với sự phát triển của tiêu chuẩn SHA3 và quy trình
+tiêu chuẩn đã có một thay đổi muộn trong phần đệm của thuật toán băm cuối cùng, do đó các hàm băm
+"sha3_256" và "sha3_512" của Ethereum không phải là các hàm băm sha3 tiêu chuẩn, mà là một biến thể thường được gọi
+là "Keccak-256" và "Keccak-512" trong các ngữ cảnh khác. Xem thảo luận, ví dụ, [tại đây](https://eips.ethereum.org/EIPS/eip-1803), [tại đây](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use), hoặc [tại đây](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057).
+
+Vui lòng lưu ý điều đó khi các hàm băm "sha3" được đề cập trong phần mô tả thuật toán bên dưới.
+
+## Các tham số {#parameters}
+
+Các tham số cho bộ đệm và bộ dữ liệu của Ethash phụ thuộc vào số khối. Kích thước bộ đệm và kích thước bộ dữ liệu đều tăng tuyến tính; tuy nhiên, chúng tôi luôn lấy số nguyên tố cao nhất dưới ngưỡng tăng tuyến tính để giảm nguy cơ xảy ra các quy luật ngẫu nhiên dẫn đến hành vi tuần hoàn.
+
+```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
+```
+
+Các bảng giá trị kích thước bộ dữ liệu và kích thước bộ đệm được cung cấp trong phụ lục.
+
+## Tạo bộ đệm {#cache-generation}
+
+Bây giờ, chúng tôi chỉ định hàm để tạo một bộ đệm:
+
+```python
+def mkcache(cache_size, seed):
+ n = cache_size // HASH_BYTES
+
+ # Tạo tuần tự bộ dữ liệu ban đầu
+ o = [sha3_512(seed)]
+ for i in range(1, n):
+ o.append(sha3_512(o[-1]))
+
+ # Sử dụng một phiên bản ít vòng lặp của 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
+```
+
+Quá trình sản xuất bộ đệm bao gồm việc đầu tiên điền tuần tự 32 MB bộ nhớ, sau đó thực hiện hai lần duyệt thuật toán _RandMemoHash_ của Sergio Demian Lerner từ [_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf). Đầu ra là một tập hợp gồm 524.288 giá trị 64 byte.
+
+## Hàm tổng hợp dữ liệu {#date-aggregation-function}
+
+Chúng tôi sử dụng một thuật toán lấy cảm hứng từ [hàm băm FNV](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) trong một số trường hợp như một sự thay thế không liên kết cho XOR. Lưu ý rằng chúng tôi nhân số nguyên tố với toàn bộ đầu vào 32 bit, trái ngược với đặc tả FNV-1 nhân số nguyên tố với lần lượt một byte (octet).
+
+```python
+FNV_PRIME = 0x01000193
+
+def fnv(v1, v2):
+ return ((v1 * FNV_PRIME) ^ v2) % 2**32
+```
+
+Xin lưu ý, ngay cả sách vàng cũng chỉ định fnv là v1\*(FNV_PRIME ^ v2), tất cả các triển khai hiện tại đều nhất quán sử dụng định nghĩa trên.
+
+## Tính toán bộ dữ liệu đầy đủ {#full-dataset-calculation}
+
+Mỗi mục 64 byte trong bộ dữ liệu 1 GB đầy đủ được tính toán như sau:
+
+```python
+def calc_dataset_item(cache, i):
+ n = len(cache)
+ r = HASH_BYTES // WORD_BYTES
+ # khởi tạo mix
+ mix = copy.copy(cache[i % n])
+ mix[0] ^= i
+ mix = sha3_512(mix)
+ # thực hiện fnv với nhiều nút bộ đệm ngẫu nhiên dựa trên 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)
+```
+
+Về cơ bản, chúng tôi kết hợp dữ liệu từ 256 nút bộ đệm được chọn giả ngẫu nhiên và băm dữ liệu đó để tính toán nút bộ dữ liệu. Toàn bộ bộ dữ liệu sau đó được tạo bởi:
+
+```python
+def calc_dataset(full_size, cache):
+ return [calc_dataset_item(cache, i) for i in range(full_size // HASH_BYTES)]
+```
+
+## Vòng lặp chính {#main-loop}
+
+Bây giờ, chúng tôi chỉ định vòng lặp chính giống như "hashimoto", nơi chúng tôi tổng hợp dữ liệu từ bộ dữ liệu đầy đủ để tạo ra giá trị cuối cùng cho một tiêu đề và nonce cụ thể. `header` đại diện cho _hàm băm_ SHA3-256 của biểu diễn RLP của một tiêu đề khối _bị cắt ngắn_, tức là của một tiêu đề không bao gồm các trường **mixHash** và **nonce**. `nonce` là tám byte của một số nguyên không dấu 64 bit theo thứ tự big-endian. Vì vậy, `nonce[::-1]` là biểu diễn little-endian tám byte của giá trị đó:
+
+```python
+def hashimoto(header, nonce, full_size, dataset_lookup):
+ n = full_size / HASH_BYTES
+ w = MIX_BYTES // WORD_BYTES
+ mixhashes = MIX_BYTES / HASH_BYTES
+ # kết hợp header+nonce thành một seed 64 byte
+ s = sha3_512(header + nonce[::-1])
+ # bắt đầu mix với s được nhân bản
+ mix = []
+ for _ in range(MIX_BYTES / HASH_BYTES):
+ mix.extend(s)
+ # trộn trong các nút bộ dữ liệu ngẫu nhiên
+ 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)
+ # nén 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])
+```
+
+Về cơ bản, chúng tôi duy trì một "mix" rộng 128 byte và liên tục tìm nạp tuần tự 128 byte từ bộ dữ liệu đầy đủ và sử dụng hàm `fnv` để kết hợp nó với mix. 128 byte truy cập tuần tự được sử dụng để mỗi vòng của thuật toán luôn tìm nạp một trang đầy đủ từ RAM, giảm thiểu việc bỏ lỡ bộ đệm tra cứu biên dịch mà về mặt lý thuyết, các vi mạch tích hợp chuyên dụng (ASIC) có thể tránh được.
+
+Nếu đầu ra của thuật toán này thấp hơn mục tiêu mong muốn, thì nonce là hợp lệ. Lưu ý rằng việc áp dụng thêm `sha3_256` ở cuối đảm bảo rằng tồn tại một nonce trung gian có thể được cung cấp để chứng minh rằng ít nhất một lượng nhỏ công việc đã được thực hiện; việc xác minh PoW (Bằng chứng công việc) bên ngoài nhanh chóng này có thể được sử dụng cho các mục đích chống DDoS. Nó cũng dùng để cung cấp sự đảm bảo về mặt thống kê rằng kết quả là một số 256-bit không thiên vị.
+
+## Khai thác {#mining}
+
+Thuật toán khai thác được định nghĩa như sau:
+
+```python
+def mine(full_size, dataset, header, difficulty):
+ # đệm số không vào mục tiêu để so sánh với hàm băm trên cùng một chữ số
+ 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
+```
+
+## Định nghĩa hàm băm seed {#seed-hash}
+
+Để tính toán hàm băm seed sẽ được sử dụng để khai thác trên một khối nhất định, chúng tôi sử dụng thuật toán sau:
+
+```python
+ def get_seedhash(block):
+ s = '\x00' * 32
+ for i in range(block.number // EPOCH_LENGTH):
+ s = serialize_hash(sha3_256(s))
+ return s
+```
+
+Lưu ý rằng để khai thác và xác minh trơn tru, chúng tôi khuyên bạn nên tính toán trước các hàm băm seed và bộ dữ liệu trong tương lai trong một luồng riêng biệt.
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Phụ lục {#appendix}
+
+Đoạn mã sau đây nên được đặt trước nếu bạn muốn chạy đặc tả python ở trên dưới dạng mã.
+
+```python
+import sha3, copy
+
+# Giả định thứ tự bit little endian (giống như kiến trúc Intel)
+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
+
+# hàm băm sha3, đầu ra 64 byte
+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
+```
+
+### Kích thước dữ liệu {#data-sizes}
+
+Các bảng tra cứu sau đây cung cấp khoảng 2048 tham số epoch được lập bảng về kích thước dữ liệu và kích thước bộ đệm.
+
+```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/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md
new file mode 100644
index 00000000000..054b3f3daa0
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md
@@ -0,0 +1,42 @@
+---
+title: Thuật toán khai thác
+description: Một cái nhìn chi tiết về các thuật toán được sử dụng cho việc đào Ethereum.
+lang: vi
+---
+
+
+
+
+
+Bằng chứng làm việc không còn là cơ chế đồng thuận nền tảng của Ethereum, nghĩa là việc khai thác đã bị tắt. Thay vào đó, Ethereum được bảo mật bởi các trình xác thực đặt cọc ETH. Bạn có thể bắt đầu đặt cọc ETH của mình ngay từ hôm nay. Đọc thêm về sự kiện hợp nhất, Bằng chứng cổ phần và Cổ phần. Trang này chỉ nhằm mục đích tham khảo lịch sử.
+
+
+
+
+Việc đào Ethereum đã sử dụng một thuật toán gọi là Ethash. Ý tưởng cơ bản của thuật toán là thợ đào sẽ cố gắng tìm một giá trị nonce đầu vào bằng cách tính toán brute force, sao cho giá trị băm (hash) thu được nhỏ hơn một ngưỡng được xác định bởi độ khó (difficulty) đã tính toán. Mức độ khó này có thể được điều chỉnh linh hoạt, cho phép việc tạo khối diễn ra theo chu kỳ ổn định.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [sự đồng thuận bằng chứng công việc](/developers/docs/consensus-mechanisms/pow) và [khai thác](/developers/docs/consensus-mechanisms/pow/mining).
+
+## Dagger Hashimoto {#dagger-hashimoto}
+
+Dagger Hashimoto là một thuật toán nghiên cứu tiền thân cho việc đào Ethereum, sau đó đã được thay thế bởi Ethash. Đây là sự kết hợp của hai thuật toán khác nhau: Dagger và Hashimoto. Nó chỉ từng tồn tại như một bản thử nghiệm nghiên cứu và đã được thay thế bởi Ethash khi Ethereum Mainnet ra mắt.
+
+[Dagger](http://www.hashcash.org/papers/dagger.html) liên quan đến việc tạo ra một [Đồ thị có hướng không tuần hoàn](https://en.wikipedia.org/wiki/Directed_acyclic_graph), các lát cắt ngẫu nhiên của đồ thị này sẽ được băm lại với nhau. Nguyên tắc cốt lõi là mỗi giá trị nonce chỉ yêu cầu một phần nhỏ của toàn bộ cây dữ liệu lớn. Việc tính toán lại cây con cho mỗi nonce là không khả thi đối với việc đào – do đó cần phải lưu trữ cây dữ liệu – nhưng lại chấp nhận được khi chỉ cần xác minh một nonce duy nhất. Dagger được thiết kế để trở thành một giải pháp thay thế cho các thuật toán hiện có như Scrypt, vốn “nặng bộ nhớ” nhưng khó xác minh khi mức độ nặng bộ nhớ của chúng tăng lên đến mức an toàn thực sự. Tuy nhiên, Dagger dễ bị ảnh hưởng bởi tăng tốc phần cứng bộ nhớ chia sẻ và đã bị loại bỏ để nhường chỗ cho các hướng nghiên cứu khác.
+
+[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) là một thuật toán bổ sung khả năng chống ASIC bằng cách phụ thuộc vào I/O (tức là, việc đọc bộ nhớ là yếu tố giới hạn trong quá trình khai thác). Lý thuyết đặt ra rằng RAM sẵn có hơn so với năng lực tính toán; hàng tỷ đô la nghiên cứu đã được đầu tư vào việc tối ưu hóa RAM cho các trường hợp sử dụng khác nhau, vốn thường liên quan đến các mô hình truy cập gần như ngẫu nhiên (do đó gọi là “bộ nhớ truy cập ngẫu nhiên” – RAM). Do đó, RAM hiện có có khả năng ở mức gần tối ưu để đánh giá thuật toán. Hashimoto sử dụng blockchain như một nguồn dữ liệu, đồng thời đáp ứng các điều kiện (1) và (3) nêu trên.
+
+Dagger-Hashimoto đã sử dụng các phiên bản chỉnh sửa của thuật toán Dagger và Hashimoto. Điểm khác biệt giữa Dagger Hashimoto và Hashimoto là thay vì sử dụng blockchain như một nguồn dữ liệu, Dagger Hashimoto dùng một tập dữ liệu được tạo tùy chỉnh, được cập nhật dựa trên dữ liệu khối sau mỗi N khối. Tập dữ liệu được tạo bằng thuật toán Dagger, cho phép tính toán hiệu quả một tập con dành riêng cho từng nonce trong thuật toán xác minh light client. Điểm khác biệt giữa Dagger Hashimoto và Dagger là, không giống như trong Dagger ban đầu, tập dữ liệu được dùng để truy vấn khối là bán cố định, chỉ được cập nhật theo định kỳ (ví dụ: mỗi tuần một lần). Điều này có nghĩa là phần công sức để tạo tập dữ liệu gần như bằng không, do đó lập luận của Sergio Lerner về việc tăng tốc nhờ bộ nhớ chia sẻ trở nên không đáng kể.
+
+Thông tin thêm về [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto).
+
+## Ethash {#ethash}
+
+Ethash là thuật toán đào thực sự đã được sử dụng trên Ethereum Mainnet, dưới kiến trúc proof-of-work hiện đã bị loại bỏ. Ethash thực chất là tên mới được đặt cho một phiên bản cụ thể của Dagger-Hashimoto sau khi thuật toán này được cập nhật đáng kể, trong khi vẫn kế thừa các nguyên tắc cơ bản của tiền thân nó. Mạng chính Ethereum chỉ từng sử dụng Ethash - Dagger Hashimoto là một phiên bản nghiên cứu và phát triển (R&D) của thuật toán khai thác đã bị thay thế trước khi việc khai thác bắt đầu trên Mạng chính Ethereum.
+
+[Thông tin thêm về Ethash](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash).
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/dapps/index.md b/public/content/translations/vi/developers/docs/dapps/index.md
new file mode 100644
index 00000000000..0b7efefc3f0
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/dapps/index.md
@@ -0,0 +1,96 @@
+---
+title: Giới thiệu kỹ thuật về ứng dụng phi tập trung
+description:
+lang: vi
+---
+
+Một ứng dụng phi tập trung (dapp) là một ứng dụng được xây dựng trên một mạng phi tập trung kết hợp một [hợp đồng thông minh](/developers/docs/smart-contracts/) và một giao diện người dùng frontend. Trên Ethereum, các smartcontract có thể truy cập và minh bạch giống như các API mở, Dapp của bạn thậm chí có thể bao gồm một smartcontract mà người khác đã viết.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Trước khi tìm hiểu về các ứng dụng phi tập trung, bạn nên nắm những [kiến thức cơ bản về chuỗi khối](/developers/docs/intro-to-ethereum/) và đọc về mạng Ethereum cũng như cách nó được phi tập trung hóa.
+
+## Định nghĩa về dapp {#definition-of-a-dapp}
+
+Một dapp có backend của nó chạy trên một mạng phi tập trung ngang hàng. Ngược lại điều này với một ứng dụng có backend đang chạy trên các máy chủ tập trung.
+
+Một Dapp có thể có frontend và giao diện người dùng được viết bằng bất cứ ngôn ngữ nào ( giống như một app) để thực hiện các hành động tới backend. Hơn nữa, giao diện frontend của nó có thể được lưu trữ trên bộ nhớ phi tập trung như [IPFS](https://ipfs.io/).
+
+- **Phi tập trung** - các ứng dụng phi tập trung hoạt động trên Ethereum, một nền tảng phi tập trung công khai, mở, nơi không một cá nhân hay tổ chức nào có quyền kiểm soát
+- **Tất định** - các ứng dụng phi tập trung thực hiện cùng một chức năng bất kể môi trường mà chúng được thực thi
+- **Hoàn thiện Turing** - các ứng dụng phi tập trung có thể thực hiện bất kỳ hành động nào nếu được cung cấp đủ các tài nguyên cần thiết
+- **Cô lập** - các ứng dụng phi tập trung được thực thi trong một môi trường ảo được gọi là Máy ảo Ethereum (EVM), do đó, nếu hợp đồng thông minh có lỗi, nó sẽ không cản trở hoạt động bình thường của mạng chuỗi khối
+
+### Về hợp đồng thông minh {#on-smart-contracts}
+
+Để giới thiệu Dapps, chúng ta cần giới thiệu các smartcontract- một backend của dapp vì không có thuật ngữ nào tốt hơn để giới thiệu. Để có cái nhìn tổng quan chi tiết, hãy chuyển đến phần của chúng tôi về [hợp đồng thông minh](/developers/docs/smart-contracts/).
+
+Smartcontract là những code thực thi trên Ethereum blockchain và chạy chính xác như được lập trình. Sau khi các smart contract được triển khai trên network, bạn không thể thay đổi. Dapps có thể được phân cấp vì chúng được kiểm soát bởi logic được ghi trong contract, không phải là một cá nhân hay một tổ chức. Bạn cần thiết kế contract của mình rất cẩn thận và kiểm tra chúng một cách kĩ lưỡng.
+
+## Lợi ích của việc phát triển ứng dụng phi tập trung {#benefits-of-dapp-development}
+
+- **Không có thời gian chết** – Một khi hợp đồng thông minh được triển khai trên chuỗi khối, toàn bộ mạng lưới sẽ luôn có thể phục vụ các máy khách muốn tương tác với hợp đồng. Do đó, các tác nhân độc hại không thể khởi động các cuộc tấn công từ chối dịch vụ nhằm vào các dapp riêng lẻ.
+- **Quyền riêng tư** – Bạn không cần cung cấp danh tính trong thế giới thực để triển khai hoặc tương tác với một ứng dụng phi tập trung.
+- **Chống kiểm duyệt** – Không một thực thể đơn lẻ nào trên mạng có thể chặn người dùng gửi giao dịch, triển khai các ứng dụng phi tập trung, hoặc đọc dữ liệu từ chuỗi khối.
+- **Toàn vẹn dữ liệu tuyệt đối** – Dữ liệu được lưu trữ trên chuỗi khối là bất biến và không thể chối cãi, nhờ vào các nguyên hàm mật mã. Các tác nhân độc hại không thể giả mạo các giao dịch hoặc dữ liệu khác đã được công khai.
+- **Tính toán phi tín nhiệm/hành vi có thể xác minh** – Các hợp đồng thông minh có thể được phân tích và được đảm bảo thực thi theo những cách có thể dự đoán được mà không cần phải tin tưởng vào một cơ quan trung ương. Điều này không đúng trong các mô hình truyền thống, ví dụ: Khi sử dụng các ngân hàng online, chúng ta phải tin tưởng các tổ chức tài chính sẽ không sử dụng sai số liệu tài chính của chúng ta, giả mạo hồ sơ hoặc bị tấn công.
+
+## Nhược điểm của việc phát triển ứng dụng phi tập trung {#drawbacks-of-dapp-development}
+
+- **Bảo trì** – Các ứng dụng phi tập trung có thể khó bảo trì hơn vì mã và dữ liệu được công bố trên chuỗi khối khó sửa đổi hơn. Các developes khó có thể update dapp của họ sau khi chúng được release, ngay cả khi lỗi hoặc rủi ro bảo mật được xác định trong phiên bản cũ.
+- **Chi phí hiệu suất** – Có một chi phí hiệu suất rất lớn, và việc thay đổi quy mô là thực sự khó khăn. Để đạt được tính bảo mật, tính toàn vẹn và tính minh bạch mà Ethereum mong muốn thì các node đều chaỵ và lưu trữ mọi giao dịch. Cơ chế đồng thuận bằng chứng cổ phần cũng cần có thời gian.
+- **Tắc nghẽn mạng** – Khi một ứng dụng phi tập trung sử dụng quá nhiều tài nguyên tính toán, toàn bộ mạng sẽ bị tắc nghẽn. Hiện tại, theo tính toán thì network có thể xử lý khoảng 10-15 giao dịch mỗi giây. Nếu các yêu cầu giao dịch nhanh hơn mức này, nhóm các giao dịch chưa được xử lý sẽ nhanh chóng tăng vọt.
+- **Trải nghiệm người dùng** – Có thể khó hơn để thiết kế các trải nghiệm thân thiện với người dùng vì người dùng cuối thông thường có thể thấy quá khó để thiết lập một bộ công cụ cần thiết để tương tác với chuỗi khối một cách thực sự an toàn.
+- **Tập trung hóa** – Các giải pháp thân thiện với người dùng và nhà phát triển được xây dựng trên lớp cơ sở của Ethereum cuối cùng có thể trông giống như các dịch vụ tập trung. Ví dụ: các dịch vụ như vậy có thể lưu trữ khóa hoặc thông tin nhạy cảm khác ở phía máy chủ, phục vụ giao diện người dùng sử dụng máy chủ tập trung hoặc chạy logic nghiệp vụ quan trọng trên máy chủ tập trung trước khi ghi vào chuỗi khối. Tập trung hóa loại bỏ nhiều (nếu không phải tất cả) những lợi thế của blockchain so với mô hình truyền thống.
+
+## Tìm hiểu thêm từ video trực quan? Người học qua hình ảnh {#visual-learner}
+
+
+
+## Các công cụ để tạo các ứng dụng phi tập trung {#dapp-tools}
+
+**Scaffold-ETH _- Nhanh chóng thử nghiệm với Solidity bằng một giao diện frontend có thể tự điều chỉnh theo hợp đồng thông minh của bạn._**
+
+- [GitHub](https://github.com/scaffold-eth/scaffold-eth-2)
+- [Ví dụ về ứng dụng phi tập trung](https://punkwallet.io/)
+
+**Create Eth App _- Tạo các ứng dụng chạy trên Ethereum chỉ với một lệnh._**
+
+- [GitHub](https://github.com/paulrberg/create-eth-app)
+
+**One Click Dapp _- Công cụ FOSS để tạo giao diện frontend cho ứng dụng phi tập trung từ một [ABI](/glossary/#abi)._**
+
+- [oneclickdapp.com](https://oneclickdapp.com)
+- [GitHub](https://github.com/oneclickdapp/oneclickdapp-v1)
+
+**Etherflow _- Công cụ FOSS cho các nhà phát triển Ethereum để kiểm tra nút của họ, cũng như soạn và gỡ lỗi các lệnh gọi RPC từ trình duyệt._**
+
+- [etherflow.quiknode.io](https://etherflow.quiknode.io/)
+- [GitHub](https://github.com/abunsen/etherflow)
+
+**thirdweb _- Các bộ SDK cho mọi ngôn ngữ, hợp đồng thông minh, công cụ, và cơ sở hạ tầng cho việc phát triển web3._**
+
+- [Trang chủ](https://thirdweb.com/)
+- [Tài liệu tham khảo](https://portal.thirdweb.com/)
+- [GitHub](https://github.com/thirdweb-dev/)
+
+**Crossmint _- Nền tảng phát triển web3 cấp doanh nghiệp để triển khai các hợp đồng thông minh, cho phép thanh toán bằng thẻ tín dụng và đa chuỗi, và sử dụng các API để tạo, phân phối, bán, lưu trữ và chỉnh sửa NFT._**
+
+- [crossmint.com](https://www.crossmint.com)
+- [Tài liệu tham khảo](https://docs.crossmint.com)
+- [Discord](https://discord.com/invite/crossmint)
+
+## Đọc thêm {#further-reading}
+
+- [Khám phá các ứng dụng phi tập trung](/apps)
+- [Kiến trúc của một ứng dụng Web 3.0](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_
+- [Hướng dẫn về các ứng dụng phi tập trung năm 2021](https://limechain.tech/blog/what-are-dapps-the-2021-guide/) - _LimeChain_
+- [Ứng dụng phi tập trung là gì?](https://www.gemini.com/cryptopedia/decentralized-applications-defi-dapps) - _Gemini_
+- [Các ứng dụng phi tập trung phổ biến](https://www.alchemy.com/dapps) - _Alchemy_
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Giới thiệu về bộ công cụ Ethereum](/developers/docs/ethereum-stack/)
+- [Các khung phát triển](/developers/docs/frameworks/)
diff --git a/public/content/translations/vi/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/translations/vi/developers/docs/data-and-analytics/block-explorers/index.md
new file mode 100644
index 00000000000..c891ad9f1c4
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/data-and-analytics/block-explorers/index.md
@@ -0,0 +1,254 @@
+---
+title: Trình duyệt khối
+description: Giới thiệu về trình khám phá khối, thông tin của bạn ở trong thế giới của dữ liệu blockchain, nơi bạn có thể truy vấn thông tin về giao dịch, tài khoản, liên lạc và nhiều hơn nữa.
+lang: vi
+sidebarDepth: 3
+---
+
+Các trình duyệt khối là cổng thông tin của bạn đến dữ liệu của Ethereum. Bạn có thể sử dụng chúng để xem dữ liệu theo thời gian thực về các khối, giao dịch, người xác thực, tài khoản và các hoạt động trên chuỗi khác.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên hiểu các khái niệm cơ bản về Ethereum để có thể hiểu được dữ liệu mà trình duyệt khối cung cấp cho bạn. Bắt đầu với [phần giới thiệu về Ethereum](/developers/docs/intro-to-ethereum/).
+
+## Các dịch vụ {#services}
+
+- [Etherscan](https://etherscan.io/) -_Cũng có sẵn bằng tiếng Trung, tiếng Hàn, tiếng Nga và tiếng Nhật_
+- [3xpl](https://3xpl.com/ethereum)
+- [Beaconcha.in](https://beaconcha.in/)
+- [Blockchair](https://blockchair.com/ethereum) -_Cũng có sẵn bằng tiếng Tây Ban Nha, tiếng Pháp, tiếng Ý, tiếng Hà Lan, tiếng Bồ Đào Nha, tiếng Nga, tiếng Trung và tiếng Farsi_
+- [Blockscout](https://eth.blockscout.com/)
+- [Chainlens](https://www.chainlens.com/)
+- [Trình duyệt khối DexGuru](https://ethereum.dex.guru/)
+- [Etherchain](https://www.etherchain.org/)
+- [Ethplorer](https://ethplorer.io/) -_Cũng có sẵn bằng tiếng Trung, tiếng Tây Ban Nha, tiếng Pháp, tiếng Thổ Nhĩ Kỳ, tiếng Nga, tiếng Hàn và tiếng Việt_
+- [EthVM](https://www.ethvm.com/)
+- [OKLink](https://www.oklink.com/eth)
+- [Ethseer](https://ethseer.io)
+
+## Các công cụ mã nguồn mở {#open-source-tools}
+
+- [Otterscan](https://otterscan.io/)
+- [lazy-etherscan](https://github.com/woxjro/lazy-etherscan)
+
+## Dữ liệu {#data}
+
+Ethereum được thiết kế minh bạch để mọi thứ đều có thể kiểm chứng được. Các trình duyệt khối cung cấp một giao diện để nhận thông tin này. Và điều này dành cho cả mạng chính Ethereum và các mạng thử nghiệm, phòng khi bạn cần dữ liệu đó. Dữ liệu được chia thành dữ liệu thực thi và dữ liệu đồng thuận. Dữ liệu thực thi đề cập đến các giao dịch đã được thực hiện trong một khối cụ thể. Dữ liệu đồng thuận đề cập đến chính các khối và những người xác thực đã đề xuất chúng.
+
+Đây là bản tóm tắt các loại dữ liệu bạn có thể nhận được từ một trình duyệt khối.
+
+### Dữ liệu thực thi {#execution-data}
+
+Các khối mới được thêm vào Ethereum sau mỗi 12 giây (trừ khi người đề xuất khối bỏ lỡ lượt của mình), do đó, một luồng dữ liệu gần như không đổi được thêm vào các trình duyệt khối. Các khối chứa rất nhiều dữ liệu quan trọng mà bạn có thể thấy hữu ích:
+
+**Dữ liệu tiêu chuẩn**
+
+- Chiều cao khối - Số khối và độ dài của chuỗi khối (tính bằng khối) khi tạo khối hiện tại
+- Dấu thời gian - Thời điểm một khối được đề xuất
+- Các giao dịch - Số lượng giao dịch có trong khối
+- Người nhận phí - Địa chỉ đã nhận tiền boa phí gas từ các giao dịch
+- Phần thưởng khối - Lượng ETH được trao cho người xác thực đã đề xuất khối đó
+- Kích thước - Kích thước của dữ liệu trong khối (được đo bằng byte)
+- Gas đã sử dụng - Tổng số đơn vị gas được sử dụng bởi các giao dịch trong khối
+- Giới hạn gas - Tổng giới hạn gas được đặt bởi các giao dịch trong khối
+- Phí cơ bản mỗi gas - Hệ số nhân tối thiểu cần thiết để một giao dịch được đưa vào một khối
+- Phí bị đốt - Lượng ETH bị đốt trong khối
+- Dữ liệu bổ sung - Mọi dữ liệu bổ sung mà người xây dựng đã đưa vào khối
+
+**Dữ liệu nâng cao**
+
+- Hàm băm - Hàm băm mã hóa đại diện cho tiêu đề khối (mã định danh duy nhất của khối)
+- Hàm băm mẹ - Hàm băm của khối có trước khối hiện tại
+- StateRoot - Hàm băm gốc của cây Merkle lưu trữ toàn bộ trạng thái của hệ thống
+
+### Gas {#gas}
+
+Các trình duyệt khối không chỉ cung cấp cho bạn dữ liệu về việc sử dụng Gas trong các giao dịch và khối, mà một số còn cung cấp cho bạn thông tin về giá gas hiện tại của mạng. Điều này sẽ giúp bạn hiểu việc sử dụng mạng, gửi các giao dịch an toàn và không chi tiêu quá nhiều cho gas. Hãy tìm các API có thể giúp bạn đưa thông tin này vào giao diện sản phẩm của mình. Dữ liệu dành riêng cho gas bao gồm:
+
+- Ước tính các đơn vị gas cần thiết cho một giao dịch an toàn nhưng chậm (+ giá và thời gian ước tính)
+- Ước tính các đơn vị gas cần thiết cho một giao dịch trung bình (+ giá và thời gian ước tính)
+- Ước tính các đơn vị gas cần thiết cho một giao dịch nhanh (+ giá và thời gian ước tính)
+- Thời gian xác nhận trung bình dựa trên giá gas
+- Các hợp đồng đang tiêu thụ gas - nói cách khác, các sản phẩm phổ biến đang được sử dụng nhiều trên mạng
+- Các tài khoản đang chi tiêu gas - nói cách khác, những người dùng mạng thường xuyên
+
+### Các giao dịch {#transactions}
+
+Các trình duyệt khối đã trở thành một nơi phổ biến để mọi người theo dõi tiến trình giao dịch của họ. Đó là vì mức độ chi tiết bạn có thể nhận được mang lại sự chắc chắn hơn. Dữ liệu giao dịch bao gồm:
+
+**Dữ liệu tiêu chuẩn**
+
+- Hàm băm giao dịch - Một hàm băm được tạo khi giao dịch được gửi đi
+- Trạng thái - Chỉ báo liệu giao dịch đang chờ xử lý, không thành công hay đã thành công
+- Khối - Khối mà giao dịch đã được đưa vào
+- Dấu thời gian - Thời điểm một giao dịch được đưa vào một khối do một người xác thực đề xuất
+- Từ - Địa chỉ của tài khoản đã gửi giao dịch
+- Đến - Địa chỉ của người nhận hoặc hợp đồng thông minh mà giao dịch tương tác
+- Các token đã chuyển - Danh sách các token đã được chuyển như một phần của giao dịch
+- Giá trị - Tổng giá trị ETH đang được chuyển
+- Phí giao dịch - Số tiền trả cho người xác thực để xử lý giao dịch (được tính bằng giá gas\*gas đã sử dụng)
+
+**Dữ liệu nâng cao**
+
+- Giới hạn gas - Số đơn vị gas tối đa mà giao dịch này có thể tiêu thụ
+- Gas đã sử dụng - Lượng đơn vị gas thực tế mà giao dịch đã tiêu thụ
+- Giá gas - Giá được đặt cho mỗi đơn vị gas
+- Nonce - Số giao dịch cho địa chỉ `from` (lưu ý rằng số này bắt đầu từ 0, do đó, nonce `100` thực sự sẽ là giao dịch thứ 101 được gửi bởi tài khoản này)
+- Dữ liệu đầu vào - Bất kỳ thông tin bổ sung nào được yêu cầu bởi giao dịch
+
+### Các tài khoản {#accounts}
+
+Có rất nhiều dữ liệu bạn có thể truy cập về một tài khoản. Đây là lý do tại sao thường nên sử dụng nhiều tài khoản để tài sản và giá trị của bạn không thể bị theo dõi dễ dàng. Cũng có một số giải pháp đang được phát triển để làm cho các giao dịch và hoạt động tài khoản trở nên riêng tư hơn. Nhưng đây là dữ liệu có sẵn cho các tài khoản:
+
+**Tài khoản người dùng**
+
+- Địa chỉ tài khoản - Địa chỉ công khai bạn có thể sử dụng để gửi tiền đến
+- Số dư ETH - Lượng ETH được liên kết với tài khoản đó
+- Tổng giá trị ETH - Giá trị của ETH
+- Token - Các token được liên kết với tài khoản và giá trị của chúng
+- Lịch sử giao dịch - Danh sách tất cả các giao dịch mà tài khoản này là người gửi hoặc người nhận
+
+**Hợp đồng thông minh**
+
+Các tài khoản hợp đồng thông minh có tất cả dữ liệu mà một tài khoản người dùng sẽ có, nhưng một số trình duyệt khối thậm chí sẽ hiển thị một số thông tin mã. Các ví dụ bao gồm:
+
+- Người tạo hợp đồng - Địa chỉ đã triển khai hợp đồng lên Mainnet
+- Giao dịch tạo - Giao dịch bao gồm việc triển khai lên Mainnet
+- Mã nguồn - Mã Solidity hoặc Vyper của hợp đồng thông minh
+- ABI hợp đồng - Giao diện nhị phân ứng dụng của hợp đồng—các lệnh gọi mà hợp đồng thực hiện và dữ liệu nhận được
+- Mã tạo hợp đồng - Bytecode đã biên dịch của hợp đồng thông minh—được tạo khi bạn biên dịch một hợp đồng thông minh được viết bằng Solidity hoặc Vyper, v.v.
+- Sự kiện hợp đồng - Lịch sử các phương thức được gọi trong hợp đồng thông minh—về cơ bản là một cách để xem hợp đồng đang được sử dụng như thế nào và tần suất ra sao
+
+### Token {#tokens}
+
+Token là một loại hợp đồng nên chúng sẽ có dữ liệu tương tự như một hợp đồng thông minh. Nhưng vì chúng có giá trị và có thể được giao dịch nên chúng có các điểm dữ liệu bổ sung:
+
+- Loại - Cho dù chúng là ERC-20, ERC-721 hay một tiêu chuẩn token khác
+- Giá - Nếu là token ERC-20, chúng sẽ có giá trị thị trường hiện tại
+- Vốn hóa thị trường - Nếu là token ERC-20, chúng sẽ có vốn hóa thị trường (tính bằng giá\*tổng nguồn cung)
+- Tổng nguồn cung - Số lượng token đang lưu hành
+- Người nắm giữ - Số lượng địa chỉ nắm giữ token
+- Lượt chuyển - Số lần token đã được chuyển giữa các tài khoản
+- Lịch sử giao dịch - Lịch sử của tất cả các giao dịch bao gồm token
+- Địa chỉ hợp đồng - Địa chỉ của token đã được triển khai lên Mainnet
+- Số thập phân - Token ERC-20 có thể chia được và có các chữ số thập phân
+
+### Mạng {#network}
+
+Một số dữ liệu khối quan tâm đến sức khỏe của Ethereum một cách toàn diện hơn.
+
+- Tổng số giao dịch - Số lượng giao dịch kể từ khi Ethereum được tạo
+- Giao dịch mỗi giây - Số lượng giao dịch có thể xử lý trong một giây
+- Giá ETH - Định giá hiện tại của 1 ETH
+- Tổng cung ETH - Số lượng ETH đang lưu hành—hãy nhớ ETH mới được tạo ra với việc tạo ra mọi khối dưới dạng phần thưởng khối
+- Vốn hóa thị trường - Tính toán giá\*nguồn cung
+
+## Dữ liệu lớp đồng thuận {#consensus-layer-data}
+
+### Epoch {#epoch}
+
+Vì lý do bảo mật, các ủy ban người xác thực ngẫu nhiên được tạo ra vào cuối mỗi epoch (mỗi 6,4 phút). Dữ liệu epoch bao gồm:
+
+- Số epoch
+- Trạng thái hoàn tất - Liệu epoch đã được hoàn tất hay chưa (Có/Không)
+- Thời gian - Thời điểm epoch kết thúc
+- Sự chứng thực - Số lượng chứng thực trong epoch (phiếu bầu cho các khối trong các slot)
+- Tiền gửi - Số lượng tiền gửi ETH có trong epoch (người xác thực phải đặt cược ETH để trở thành người xác thực)
+- Việc phạt - Số lượng hình phạt dành cho người đề xuất khối hoặc người chứng thực
+- Sự tham gia bỏ phiếu - Lượng ETH đã đặt cược được sử dụng để chứng thực các khối
+- Người xác thực - Số lượng người xác thực hoạt động trong epoch
+- Số dư trung bình của người xác thực - Số dư trung bình của những người xác thực đang hoạt động
+- Slot - Số lượng slot có trong epoch (các slot bao gồm một khối hợp lệ)
+
+### Slot {#slot}
+
+Các slot là cơ hội để tạo khối, dữ liệu có sẵn cho mỗi slot bao gồm:
+
+- Epoch - Epoch mà trong đó slot có hiệu lực
+- Số slot
+- Trạng thái - Trạng thái của slot (Được đề xuất/Bị bỏ lỡ)
+- Thời gian - Dấu thời gian của slot
+- Người đề xuất - Người xác thực đã đề xuất khối cho slot
+- Gốc khối - Gốc cây băm của BeaconBlock
+- Gốc mẹ - Hàm băm của khối có trước
+- Gốc trạng thái - Gốc cây băm của BeaconState
+- Chữ ký
+- Tiết lộ Randao
+- Graffiti - Một người đề xuất khối có thể bao gồm một thông báo dài 32 byte trong đề xuất khối của mình
+- Dữ liệu thực thi
+ - Hàm băm khối
+ - Số lượng tiền gửi
+ - Gốc tiền gửi
+- Sự chứng thực - Số lượng chứng thực cho khối trong slot này
+- Tiền gửi - Số lượng tiền gửi trong slot này
+- Thoát tự nguyện - Số lượng người xác thực đã rời đi trong slot
+- Việc phạt - Số lượng hình phạt dành cho người đề xuất khối hoặc người chứng thực
+- Phiếu bầu - Những người xác thực đã bỏ phiếu cho khối trong slot này
+
+### Các khối {#blocks-1}
+
+Bằng chứng cổ phần chia thời gian thành các slot và epoch. Vì vậy, điều đó có nghĩa là có dữ liệu mới!
+
+- Người đề xuất - Người xác thực được chọn theo thuật toán để đề xuất khối mới
+- Epoch - Epoch mà trong đó khối được đề xuất
+- Slot - Slot mà trong đó khối được đề xuất
+- Sự chứng thực - Số lượng chứng thực có trong slot—các chứng thực giống như các phiếu bầu cho thấy khối đã sẵn sàng để đi đến Chuỗi Beacon
+
+### Người xác thực {#validators}
+
+Những người xác thực chịu trách nhiệm đề xuất các khối và chứng thực chúng trong các slot.
+
+- Số người xác thực - Số duy nhất đại diện cho người xác thực
+- Số dư hiện tại - Số dư của người xác thực bao gồm cả phần thưởng
+- Số dư hiệu dụng - Số dư của người xác thực được sử dụng để đặt cược
+- Thu nhập - Phần thưởng hoặc hình phạt mà người xác thực nhận được
+- Trạng thái - Liệu người xác thực hiện có đang trực tuyến và hoạt động hay không
+- Hiệu quả chứng thực - Thời gian trung bình để các chứng thực của người xác thực được đưa vào chuỗi
+- Đủ điều kiện kích hoạt - Ngày (và epoch) khi người xác thực có thể xác thực
+- Hoạt động từ - Ngày (và epoch) khi người xác thực bắt đầu hoạt động
+- Các khối đã đề xuất - Khối mà người xác thực đã đề xuất
+- Sự chứng thực - Các chứng thực mà người xác thực đã cung cấp
+- Tiền gửi - Địa chỉ gửi, hàm băm giao dịch, số khối, dấu thời gian, số tiền và trạng thái của khoản tiền gửi đặt cược do người xác thực thực hiện
+
+### Sự chứng thực {#attestations}
+
+Sự chứng thực là các phiếu bầu "đồng ý" để đưa các khối vào chuỗi. Dữ liệu của họ liên quan đến một bản ghi về sự chứng thực và những người xác thực đã chứng thực
+
+- Slot - Slot mà trong đó sự chứng thực diễn ra
+- Chỉ số ủy ban - Chỉ số của ủy ban tại một slot nhất định
+- Các bit tổng hợp - Đại diện cho sự chứng thực tổng hợp của tất cả những người xác thực tham gia vào việc chứng thực
+- Người xác thực - Những người xác thực đã cung cấp chứng thực
+- Gốc khối Beacon - Trỏ đến khối mà những người xác thực đang chứng thực
+- Nguồn - Trỏ đến epoch hợp lý mới nhất
+- Mục tiêu - Trỏ đến ranh giới epoch mới nhất
+- Chữ ký
+
+### Mạng {#network-1}
+
+Dữ liệu cấp cao nhất của lớp đồng thuận bao gồm những điều sau:
+
+- Epoch hiện tại
+- Slot hiện tại
+- Người xác thực đang hoạt động - Số lượng người xác thực đang hoạt động
+- Người xác thực đang chờ - Số lượng người xác thực đang chờ để được kích hoạt
+- ETH đã đặt cược - Lượng ETH đã đặt cược trong mạng
+- Số dư trung bình - Số dư ETH trung bình của những người xác thực
+
+## Trình duyệt khối {#block-explorers}
+
+- [Etherscan](https://etherscan.io/) - một trình duyệt khối bạn có thể sử dụng để tìm nạp dữ liệu cho Mainnet và mạng thử nghiệm của Ethereum
+- [3xpl](https://3xpl.com/ethereum) - một trình duyệt Ethereum mã nguồn mở không có quảng cáo cho phép tải xuống các bộ dữ liệu của nó
+- [Beaconcha.in](https://beaconcha.in/) - một trình duyệt khối mã nguồn mở cho Mainnet và mạng thử nghiệm của Ethereum
+- [Blockchair](https://blockchair.com/ethereum) - trình duyệt Ethereum riêng tư nhất. Cũng dùng để sắp xếp và lọc dữ liệu (mempool)
+- [Etherchain](https://www.etherchain.org/) - một trình duyệt khối cho Mainnet của Ethereum
+- [Ethplorer](https://ethplorer.io/) - một trình duyệt khối tập trung vào các token cho Mainnet của Ethereum và mạng thử nghiệm Kovan
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Giao dịch](/developers/docs/transactions/)
+- [Tài khoản](/developers/docs/accounts/)
+- [Các mạng](/developers/docs/networks/)
diff --git a/public/content/translations/vi/developers/docs/data-and-analytics/index.md b/public/content/translations/vi/developers/docs/data-and-analytics/index.md
new file mode 100644
index 00000000000..7cd76d195e9
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/data-and-analytics/index.md
@@ -0,0 +1,72 @@
+---
+title: Dữ liệu và phân tích
+description: Cách thu thập dữ liệu onchain và phân tích để sử dụng trong các ứng dụng phi tập trung của bạn
+lang: vi
+---
+
+## Giới thiệu {#Introduction}
+
+Khi việc sử dụng mạng ngày càng tăng, sẽ có một lượng lớn thông tin giá trị hơn trong dữ liệu onchain. Khi khối lượng dữ liệu tăng nhanh, việc tính toán và tổng hợp thông tin này để báo cáo hoặc làm cho một dapp có thể trở thành công việc tốn thời gian và công sức.
+
+Tận dụng các nhà cung cấp dữ liệu hiện có có thể tăng tốc độ phát triển, tạo ra kết quả chính xác hơn và giảm thiểu nỗ lực bảo trì liên tục. Điều này sẽ giúp cho một đội ngũ tập trung vào chức năng chính mà dự án của họ đang cố gắng cung cấp.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên hiểu khái niệm cơ bản về [Trình duyệt khối](/developers/docs/data-and-analytics/block-explorers/) để hiểu rõ hơn về cách sử dụng chúng trong bối cảnh phân tích dữ liệu. Ngoài ra, hãy tự làm quen với khái niệm về một [chỉ mục](/glossary/#index) để hiểu được những lợi ích mà chúng mang lại cho việc thiết kế hệ thống.
+
+Về các nguyên tắc cơ bản của kiến trúc, bạn cần hiểu [API](https://www.wikipedia.org/wiki/API) và [REST](https://www.wikipedia.org/wiki/Representational_state_transfer) là gì, dù chỉ trên lý thuyết.
+
+## Trình duyệt khối {#block-explorers}
+
+Nhiều [Trình duyệt khối](/developers/docs/data-and-analytics/block-explorers/) cung cấp các cổng [API](https://www.wikipedia.org/wiki/API) [RESTful](https://www.wikipedia.org/wiki/Representational_state_transfer) giúp các nhà phát triển có được khả năng hiển thị dữ liệu thời gian thực về các khối, giao dịch, người xác thực, tài khoản và các hoạt động trên chuỗi khác.
+
+Sau đó, các nhà phát triển có thể xử lý và chuyển đổi dữ liệu này để cung cấp cho người dùng của họ những thông tin chi tiết và tương tác độc đáo với [chuỗi khối](/glossary/#blockchain). Ví dụ, [Etherscan](https://etherscan.io) và [Blockscout](https://eth.blockscout.com) cung cấp dữ liệu thực thi và đồng thuận cho mỗi slot 12 giây.
+
+## The Graph {#the-graph}
+
+[The Graph](https://thegraph.com/) là một giao thức lập chỉ mục cung cấp một cách dễ dàng để truy vấn dữ liệu chuỗi khối thông qua các API mở được gọi là subgraph.
+
+Với The Graph, các nhà phát triển có thể hưởng lợi từ:
+
+- Lập chỉ mục phi tập trung: Cho phép lập chỉ mục dữ liệu chuỗi khối thông qua nhiều trình lập chỉ mục, do đó loại bỏ mọi điểm lỗi đơn lẻ
+- Truy vấn GraphQL: Cung cấp giao diện GraphQL mạnh mẽ để truy vấn dữ liệu đã được lập chỉ mục, giúp việc truy xuất dữ liệu trở nên cực kỳ đơn giản
+- Tùy chỉnh: Xác định logic của riêng bạn để chuyển đổi và lưu trữ dữ liệu chuỗi khối, đồng thời sử dụng lại các subgraph do các nhà phát triển khác xuất bản trên Mạng The Graph
+
+Làm theo hướng dẫn [bắt đầu nhanh](https://thegraph.com/docs/en/quick-start/) này để tạo, triển khai và truy vấn một subgraph trong vòng 5 phút.
+
+## Sự đa dạng của ứng dụng khách {#client-diversity}
+
+[Sự đa dạng của ứng dụng khách](/developers/docs/nodes-and-clients/client-diversity/) rất quan trọng đối với sức khỏe tổng thể của mạng Ethereum vì nó cung cấp khả năng phục hồi trước các lỗi và khai thác. Hiện có một số bảng thông tin về sự đa dạng của ứng dụng khách bao gồm [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [supermajority.info](https://supermajority.info//) và [Ethernodes](https://ethernodes.org/).
+
+## Dune Analytics {#dune-analytics}
+
+[Dune Analytics](https://dune.com/) xử lý trước dữ liệu chuỗi khối thành các bảng cơ sở dữ liệu quan hệ (DuneSQL), cho phép người dùng truy vấn dữ liệu chuỗi khối bằng SQL và xây dựng bảng thông tin dựa trên kết quả truy vấn. Dữ liệu trên chuỗi được sắp xếp thành 4 bảng thô: `blocks`, `transactions`, `logs` (sự kiện) và `traces` (lệnh gọi). Các hợp đồng và giao thức phổ biến đã được giải mã và mỗi loại có bộ bảng sự kiện và lệnh gọi riêng. Các bảng sự kiện và lệnh gọi đó được xử lý thêm và sắp xếp thành các bảng trừu tượng theo loại giao thức, ví dụ: dex, cho vay, stablecoin, v.v.
+
+## SQD {#sqd}
+
+[SQD](https://sqd.dev/) là một nền tảng dữ liệu phi tập trung, có khả năng mở rộng siêu lớn, được tối ưu hóa để cung cấp quyền truy cập hiệu quả, không cần cấp phép vào các tập dữ liệu lớn. Nền tảng này hiện đang phục vụ dữ liệu lịch sử trên chuỗi, bao gồm nhật ký sự kiện, biên lai giao dịch, dấu vết và chênh lệch trạng thái trên mỗi giao dịch. SQD cung cấp một bộ công cụ mạnh mẽ để tạo các quy trình trích xuất và xử lý dữ liệu tùy chỉnh, đạt tốc độ lập chỉ mục lên tới 150 nghìn khối mỗi giây.
+
+Để bắt đầu, hãy truy cập [tài liệu tham khảo](https://docs.sqd.dev/) hoặc xem [các ví dụ về EVM](https://github.com/subsquid-labs/squid-evm-examples) về những gì bạn có thể xây dựng với SQD.
+
+## Mạng SubQuery {#subquery-network}
+
+[SubQuery](https://subquery.network/) là một công cụ lập chỉ mục dữ liệu hàng đầu, cung cấp cho các nhà phát triển các API nhanh, đáng tin cậy, phi tập trung và tùy chỉnh cho các dự án web3 của họ. SubQuery trao quyền cho các nhà phát triển từ hơn 165 hệ sinh thái (bao gồm cả Ethereum) với dữ liệu được lập chỉ mục phong phú để xây dựng trải nghiệm trực quan và sống động cho người dùng của họ. Mạng SubQuery hỗ trợ các ứng dụng không thể ngăn cản của bạn bằng một mạng cơ sở hạ tầng có khả năng phục hồi và phi tập trung. Sử dụng bộ công cụ dành cho nhà phát triển chuỗi khối của SubQuery để xây dựng các ứng dụng web3 của tương lai mà không tốn thời gian xây dựng một backend tùy chỉnh cho các hoạt động xử lý dữ liệu.
+
+Để bắt đầu, hãy truy cập [hướng dẫn bắt đầu nhanh với Ethereum](https://academy.subquery.network/quickstart/quickstart_chains/ethereum-gravatar.html) để bắt đầu lập chỉ mục dữ liệu chuỗi khối Ethereum trong vài phút trong môi trường Docker cục bộ để thử nghiệm trước khi hoạt động chính thức trên [dịch vụ được quản lý của SubQuery](https://managedservice.subquery.network/) hoặc trên [mạng phi tập trung của SubQuery](https://app.subquery.network/dashboard).
+
+## Ngôn ngữ truy vấn EVM {#evm-query-language}
+
+Ngôn ngữ truy vấn EVM (EQL) là một ngôn ngữ giống SQL được thiết kế để truy vấn các chuỗi EVM (Máy ảo Ethereum). Mục tiêu cuối cùng của EQL là hỗ trợ các truy vấn quan hệ phức tạp trên các thành phần hạng nhất của chuỗi EVM (khối, tài khoản và giao dịch) đồng thời cung cấp cho các nhà phát triển và nhà nghiên cứu một cú pháp tiện dụng để sử dụng hàng ngày. Với EQL, các nhà phát triển có thể tìm nạp dữ liệu chuỗi khối bằng cách sử dụng cú pháp quen thuộc giống SQL và loại bỏ nhu cầu về mã soạn sẵn phức tạp. EQL hỗ trợ các yêu cầu dữ liệu chuỗi khối tiêu chuẩn (ví dụ: truy xuất nonce và số dư của tài khoản trên Ethereum hoặc tìm nạp kích thước khối và dấu thời gian hiện tại) và liên tục bổ sung hỗ trợ cho các yêu cầu và bộ tính năng phức tạp hơn.
+
+## Đọc thêm {#further-reading}
+
+- [Khám phá dữ liệu tiền mã hóa I: Các kiến trúc luồng dữ liệu](https://web.archive.org/web/20250125012042/https://research.2077.xyz/exploring-crypto-data-1-data-flow-architectures)
+- [Tổng quan về Mạng Graph](https://thegraph.com/docs/en/about/)
+- [Sân chơi truy vấn Graph](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current)
+- [Các ví dụ về mã API trên EtherScan](https://etherscan.io/apis#contracts)
+- [Tài liệu tham khảo API trên Blockscout](https://docs.blockscout.com/devs/apis)
+- [Trình khám phá Chuỗi Hải Đăng Beaconcha.in](https://beaconcha.in)
+- [Kiến thức cơ bản về Dune](https://docs.dune.com/#dune-basics)
+- [Hướng dẫn bắt đầu nhanh với Ethereum của SubQuery](https://academy.subquery.network/indexer/quickstart/quickstart_chains/ethereum-gravatar.html)
+- [Tổng quan về Mạng SQD](https://docs.sqd.dev/)
+- [Ngôn ngữ truy vấn EVM](https://eql.sh/blog/alpha-release-notes)
diff --git a/public/content/translations/vi/developers/docs/data-availability/blockchain-data-storage-strategies/index.md b/public/content/translations/vi/developers/docs/data-availability/blockchain-data-storage-strategies/index.md
new file mode 100644
index 00000000000..bdf67181d38
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/data-availability/blockchain-data-storage-strategies/index.md
@@ -0,0 +1,118 @@
+---
+title: Chiến lược lưu trữ dữ liệu chuỗi khối
+description: Có một số cách để lưu trữ dữ liệu bằng chuỗi khối. Bài viết này sẽ so sánh các chiến lược khác nhau, chi phí và sự đánh đổi của chúng, cũng như các yêu cầu để sử dụng nó một cách an toàn.
+lang: vi
+---
+
+Có nhiều cách để lưu trữ thông tin trực tiếp trên chuỗi khối, hoặc theo cách được bảo mật bởi chuỗi khối:
+
+- Blob EIP-4844
+- Calldata
+- Ngoài chuỗi với các cơ chế L1
+- "Mã" hợp đồng
+- Sự kiện
+- Lưu trữ máy ảo Ethereum
+
+Việc lựa chọn phương pháp nào để sử dụng dựa trên một số tiêu chí:
+
+- Nguồn thông tin. Thông tin trong calldata không thể đến trực tiếp từ chính chuỗi khối.
+- Đích đến của thông tin. Calldata chỉ có sẵn trong giao dịch bao gồm nó. Các sự kiện hoàn toàn không thể truy cập trên chuỗi.
+- Mức độ phức tạp nào là chấp nhận được? Các máy tính chạy một nút quy mô đầy đủ có thể thực hiện nhiều xử lý hơn một ứng dụng khách nhẹ trong một ứng dụng chạy trên trình duyệt.
+- Có cần thiết phải tạo điều kiện truy cập dễ dàng vào thông tin từ mọi nút không?
+- Các yêu cầu bảo mật.
+
+## Các yêu cầu bảo mật {#security-requirements}
+
+Nhìn chung, bảo mật thông tin bao gồm ba thuộc tính:
+
+- _Tính bảo mật_, các thực thể không được phép không được phép đọc thông tin. Điều này quan trọng trong nhiều trường hợp, nhưng không phải ở đây. _Không có bí mật nào trên chuỗi khối_. Các chuỗi khối hoạt động vì bất kỳ ai cũng có thể xác minh các chuyển đổi trạng thái, vì vậy không thể sử dụng chúng để lưu trữ bí mật trực tiếp. Có nhiều cách để lưu trữ thông tin bí mật trên chuỗi khối, nhưng tất cả chúng đều dựa vào một số thành phần ngoài chuỗi để lưu trữ ít nhất một khóa.
+
+- _Tính toàn vẹn_, thông tin là chính xác, nó không thể bị thay đổi bởi các thực thể không được ủy quyền, hoặc theo những cách không được ủy quyền (ví dụ: chuyển [token ERC-20](https://eips.ethereum.org/EIPS/eip-20#events) mà không có sự kiện `Transfer`). Trên chuỗi khối, mọi nút đều xác minh mọi thay đổi trạng thái, điều này đảm bảo tính toàn vẹn.
+
+- _Tính sẵn có_, thông tin có sẵn cho bất kỳ thực thể được ủy quyền nào. Trên chuỗi khối, điều này thường đạt được bằng cách làm cho thông tin có sẵn trên mọi [nút đầy đủ](https://ethereum.org/developers/docs/nodes-and-clients#full-node).
+
+Các giải pháp khác nhau ở đây đều có tính toàn vẹn tuyệt vời, vì các hàm băm được đăng trên L1. Tuy nhiên, chúng có các đảm bảo về tính sẵn có khác nhau.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên có hiểu biết tốt về [các nguyên tắc cơ bản của chuỗi khối](/developers/docs/intro-to-ethereum/). Trang này cũng giả định người đọc đã quen thuộc với [khối](/developers/docs/blocks/), [giao dịch](/developers/docs/transactions/) và các chủ đề liên quan khác.
+
+## Blob EIP-4844 {#eip-4844-blobs}
+
+Bắt đầu với [bản nâng cấp Dencun](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/beacon-chain.md), chuỗi khối Ethereum bao gồm [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), bổ sung các blob dữ liệu vào Ethereum với thời gian tồn tại giới hạn (ban đầu khoảng [18 ngày](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/p2p-interface.md#configuration)). Chúng được định giá riêng biệt với [gas thực thi](/developers/docs/gas), mặc dù sử dụng một cơ chế tương tự. Chúng là một cách rẻ tiền để đăng dữ liệu tạm thời.
+
+Trường hợp sử dụng chính cho các blob EIP-4844 là để các rollup xuất bản các giao dịch của chúng. [Gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups) cần xuất bản các giao dịch trên chuỗi khối của họ. Những giao dịch đó phải có sẵn cho bất kỳ ai trong [thời gian thử thách](https://docs.optimism.io/connect/resources/glossary#challenge-period) để cho phép [người xác thực](https://docs.optimism.io/connect/resources/glossary#validator) sửa lỗi nếu [trình sắp xếp thứ tự](https://docs.optimism.io/connect/resources/glossary#sequencer) của rollup đăng một gốc trạng thái không chính xác.
+
+Tuy nhiên, một khi thời gian thử thách đã qua và gốc trạng thái được hoàn tất, mục đích còn lại để biết các giao dịch này là để sao chép trạng thái hiện tại của chuỗi. Trạng thái này cũng có sẵn từ các nút chuỗi, với yêu cầu xử lý ít hơn nhiều. Vì vậy, thông tin giao dịch vẫn nên được lưu giữ ở một vài nơi, chẳng hạn như [trình khám phá khối](/developers/docs/data-and-analytics/block-explorers), nhưng không cần phải trả tiền cho mức độ chống kiểm duyệt mà Ethereum cung cấp.
+
+[Rollup không kiến thức](/developers/docs/scaling/zk-rollups/#data-availability) cũng đăng dữ liệu giao dịch của họ để cho phép các nút khác sao chép trạng thái hiện có và xác minh bằng chứng hợp lệ, nhưng một lần nữa đó là một yêu cầu ngắn hạn.
+
+Tại thời điểm viết bài, việc đăng trên EIP-4844 tốn một wei (10-18 ETH) mỗi byte, một con số không đáng kể so với [21.000 gas thực thi mà bất kỳ giao dịch nào, bao gồm cả giao dịch đăng blob, đều tốn](https://eth.blockscout.com/tx/0xf6cfaf0431c73dd1d96369a5e6707d64f463ccf477a4131265397f1d81466929?tab=index). Bạn có thể xem giá EIP-4844 hiện tại trên [blobscan.com](https://blobscan.com/blocks).
+
+Đây là các địa chỉ để xem các blob được đăng bởi một số rollup nổi tiếng.
+
+| Rollup | Địa chỉ hộp thư |
+| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
+| [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://blobscan.com/address/0xFF00000000000000000000000000000000000010) |
+| [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://blobscan.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) |
+| [Base](https://base.org/) | [`0xFF00000000000000000000000000000000008453`](https://blobscan.com/address/0xFF00000000000000000000000000000000008453) |
+
+## Calldata {#calldata}
+
+Calldata đề cập đến các byte được gửi như một phần của giao dịch. Nó được lưu trữ như một phần của bản ghi vĩnh viễn của chuỗi khối trong khối bao gồm giao dịch đó.
+
+Đây là phương pháp rẻ nhất để đưa dữ liệu vĩnh viễn vào chuỗi khối. Chi phí cho mỗi byte là 4 gas thực thi (nếu byte là 0) hoặc 16 gas (bất kỳ giá trị nào khác). Nếu dữ liệu được nén, đây là một phương pháp tiêu chuẩn, thì mọi giá trị byte đều có khả năng như nhau, vì vậy chi phí trung bình là khoảng 15,95 gas mỗi byte.
+
+Tại thời điểm viết bài, giá là 12 gwei/gas và 2300 $/ETH, có nghĩa là chi phí khoảng 45 xu cho mỗi kilobyte. Bởi vì đây là phương pháp rẻ nhất trước EIP-4844, đây là phương pháp mà các rollup đã sử dụng để lưu trữ thông tin giao dịch, thông tin này cần có sẵn cho [các thử thách lỗi](https://docs.optimism.io/stack/protocol/overview#fault-proofs), nhưng không cần phải truy cập trực tiếp trên chuỗi.
+
+Đây là các địa chỉ để xem các giao dịch được đăng bởi một số rollup nổi tiếng.
+
+| Rollup | Địa chỉ hộp thư |
+| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- |
+| [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000000010) |
+| [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://eth.blockscout.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) |
+| [Base](https://base.org/) | [`0xFF00000000000000000000000000000000008453`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000008453) |
+
+## Ngoài chuỗi với cơ chế L1 {#offchain-with-l1-mechs}
+
+Tùy thuộc vào sự đánh đổi về bảo mật của bạn, có thể chấp nhận đặt thông tin ở nơi khác và sử dụng một cơ chế đảm bảo dữ liệu có sẵn khi cần. Có hai yêu cầu để điều này hoạt động:
+
+1. Đăng một [hàm băm](https://en.wikipedia.org/wiki/Cryptographic_hash_function) của dữ liệu trên chuỗi khối, được gọi là _cam kết đầu vào_. Đây có thể là một từ 32 byte duy nhất, vì vậy nó không tốn kém. Miễn là cam kết đầu vào có sẵn, tính toàn vẹn được đảm bảo vì không khả thi để tìm bất kỳ dữ liệu nào khác sẽ băm ra cùng một giá trị. Vì vậy, nếu dữ liệu không chính xác được cung cấp, nó có thể được phát hiện.
+
+2. Có một cơ chế đảm bảo tính sẵn có. Ví dụ: trong [Redstone](https://redstone.xyz/docs/what-is-redstone), bất kỳ nút nào cũng có thể gửi một thử thách về tính sẵn có. Nếu trình sắp xếp thứ tự không phản hồi trên chuỗi trước thời hạn, cam kết đầu vào sẽ bị hủy, vì vậy thông tin được coi là chưa bao giờ được đăng.
+
+Điều này có thể chấp nhận được đối với một gộp giao dịch lạc quan vì chúng tôi đã dựa vào việc có ít nhất một người xác minh trung thực cho gốc trạng thái. Một người xác minh trung thực như vậy cũng sẽ đảm bảo rằng nó có dữ liệu để xử lý các khối và đưa ra một thử thách về tính sẵn có nếu thông tin không có sẵn ngoài chuỗi. Loại gộp giao dịch lạc quan này được gọi là [plasma](/developers/docs/scaling/plasma/).
+
+## Mã hợp đồng {#contract-code}
+
+Thông tin chỉ cần được viết một lần, không bao giờ bị ghi đè và cần có sẵn trên chuỗi có thể được lưu trữ dưới dạng mã hợp đồng. Điều này có nghĩa là chúng tôi tạo một "hợp đồng thông minh" với dữ liệu và sau đó sử dụng [`EXTCODECOPY`](https://www.evm.codes/#3c?fork=shanghai) để đọc thông tin. Ưu điểm là sao chép mã tương đối rẻ.
+
+Ngoài chi phí mở rộng bộ nhớ, `EXTCODECOPY` tốn 2600 gas cho lần truy cập đầu tiên vào một hợp đồng (khi nó ở trạng thái "lạnh") và 100 gas cho các lần sao chép tiếp theo từ cùng một hợp đồng cộng với 3 gas cho mỗi từ 32 byte. So với calldata, có giá 15,95 mỗi byte, thì cách này rẻ hơn bắt đầu từ khoảng 200 byte. Dựa trên [công thức tính chi phí mở rộng bộ nhớ](https://www.evm.codes/about#memoryexpansion), miễn là bạn không cần nhiều hơn 4MB bộ nhớ, chi phí mở rộng bộ nhớ sẽ nhỏ hơn chi phí thêm calldata.
+
+Tất nhiên, đây chỉ là chi phí để _đọc_ dữ liệu. Để tạo hợp đồng tốn khoảng 32.000 gas + 200 gas/byte. Phương pháp này chỉ kinh tế khi cùng một thông tin cần được đọc nhiều lần trong các giao dịch khác nhau.
+
+Mã hợp đồng có thể vô nghĩa, miễn là nó không bắt đầu bằng `0xEF`. Các hợp đồng bắt đầu bằng `0xEF` được hiểu là [định dạng đối tượng ethereum](https://notes.ethereum.org/@ipsilon/evm-object-format-overview), có các yêu cầu nghiêm ngặt hơn nhiều.
+
+## Sự kiện {#events}
+
+[Các sự kiện](https://docs.alchemy.com/docs/solidity-events) được phát ra bởi các hợp đồng thông minh và được đọc bởi phần mềm ngoài chuỗi.
+Ưu điểm của chúng là mã ngoài chuỗi có thể lắng nghe các sự kiện. Chi phí là [gas](https://www.evm.codes/#a0?fork=cancun), 375 cộng với 8 gas cho mỗi byte dữ liệu. Với 12 gwei/gas và 2300 $/ETH, điều này tương đương với một xu cộng với 22 xu cho mỗi kilobyte.
+
+## Lưu trữ {#storage}
+
+Các hợp đồng thông minh có quyền truy cập vào [lưu trữ bền vững](https://docs.alchemy.com/docs/smart-contract-storage-layout#what-is-storage-memory). Tuy nhiên, nó rất tốn kém. Việc ghi một từ 32 byte vào một khe lưu trữ trống trước đó có thể [tốn 22.100 gas](https://www.evm.codes/#55?fork=cancun). Với 12 gwei/gas và 2300 $/ETH, con số này là khoảng 61 xu cho mỗi hoạt động ghi, hoặc 19,5 đô la cho mỗi kilobyte.
+
+Đây là hình thức lưu trữ đắt nhất trong Ethereum.
+
+## Tóm tắt {#summary}
+
+Bảng này tóm tắt các tùy chọn khác nhau, ưu và nhược điểm của chúng.
+
+| Loại lưu trữ | Nguồn dữ liệu | Đảm bảo tính sẵn có | Tính sẵn có trên chuỗi | Các giới hạn bổ sung |
+| ----------------------------- | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------------------- |
+| Blob EIP-4844 | Ngoài chuỗi | Ethereum đảm bảo trong [~18 ngày](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/p2p-interface.md#configuration) | Chỉ có hàm băm | |
+| Calldata | Ngoài chuỗi | Ethereum đảm bảo mãi mãi (một phần của chuỗi khối) | Chỉ có sẵn nếu được ghi vào hợp đồng và tại giao dịch đó | |
+| Ngoài chuỗi với các cơ chế L1 | Ngoài chuỗi | Đảm bảo "một người xác minh trung thực" trong thời gian thử thách | Chỉ hàm băm | Được đảm bảo bởi cơ chế thử thách, chỉ trong thời gian thử thách |
+| Mã hợp đồng | Trên chuỗi hoặc ngoài chuỗi | Ethereum đảm bảo mãi mãi (một phần của chuỗi khối) | Có | Được ghi vào một địa chỉ "ngẫu nhiên", không thể bắt đầu bằng `0xEF` |
+| Sự kiện | Trên chuỗi | Ethereum đảm bảo mãi mãi (một phần của chuỗi khối) | Không | |
+| Lưu trữ | Trên chuỗi | Ethereum đảm bảo mãi mãi (một phần của chuỗi khối và trạng thái hiện tại cho đến khi bị ghi đè) | Có | |
diff --git a/public/content/translations/vi/developers/docs/data-availability/index.md b/public/content/translations/vi/developers/docs/data-availability/index.md
new file mode 100644
index 00000000000..3041053dc4f
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/data-availability/index.md
@@ -0,0 +1,84 @@
+---
+title: Tính khả dụng dữ liệu
+description: Tổng quan về các vấn đề và giải pháp liên quan đến tính sẵn sàng của dữ liệu trong Ethereum
+lang: vi
+---
+
+"Đừng tin tưởng, hãy xác minh" là một câu châm ngôn phổ biến trong Ethereum. Ý tưởng là nút của bạn có thể xác minh một cách độc lập rằng thông tin nó nhận được là chính xác bằng cách thực hiện tất cả các giao dịch trong các khối mà nó nhận được từ các máy ngang hàng để đảm bảo rằng các thay đổi được đề xuất khớp chính xác với các thay đổi được tính toán độc lập bởi nút. Điều này có nghĩa là các nút không cần phải tin rằng những người gửi khối là trung thực. Điều này là không thể nếu dữ liệu bị thiếu.
+
+**Tính sẵn sàng của dữ liệu** đề cập đến sự tự tin mà người dùng có thể có rằng dữ liệu cần thiết để xác minh một khối thực sự có sẵn cho tất cả những người tham gia mạng. Đối với các nút đầy đủ trên Lớp 1 của Ethereum, điều này tương đối đơn giản; nút đầy đủ tải xuống một bản sao của tất cả dữ liệu trong mỗi khối - dữ liệu _phải_ có sẵn để có thể tải xuống. Một khối có dữ liệu bị thiếu sẽ bị loại bỏ thay vì được thêm vào chuỗi khối. Đây là "tính sẵn sàng của dữ liệu trên chuỗi" và là một tính năng của các chuỗi khối nguyên khối. Các nút đầy đủ không thể bị lừa để chấp nhận các giao dịch không hợp lệ vì chúng tự tải xuống và thực hiện mọi giao dịch. Tuy nhiên, đối với các chuỗi khối mô-đun, các rollup Lớp 2 và các ứng dụng khách nhẹ, bối cảnh về tính sẵn sàng của dữ liệu phức tạp hơn, đòi hỏi một số quy trình xác minh phức tạp hơn.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên có kiến thức tốt về [các nguyên tắc cơ bản của chuỗi khối](/developers/docs/intro-to-ethereum/), đặc biệt là [các cơ chế đồng thuận](/developers/docs/consensus-mechanisms/). Trang này cũng giả định rằng người đọc đã quen thuộc với [khối](/developers/docs/blocks/), [giao dịch](/developers/docs/transactions/), [nút](/developers/docs/nodes-and-clients/), [các giải pháp mở rộng](/developers/docs/scaling/) và các chủ đề liên quan khác.
+
+## Vấn đề về tính sẵn sàng của dữ liệu {#the-data-availability-problem}
+
+Vấn đề về tính sẵn sàng của dữ liệu là nhu cầu chứng minh cho toàn bộ mạng rằng dạng tóm tắt của một số dữ liệu giao dịch đang được thêm vào chuỗi khối thực sự đại diện cho một tập hợp các giao dịch hợp lệ, nhưng làm như vậy mà không yêu cầu tất cả các nút phải tải xuống tất cả dữ liệu. Dữ liệu giao dịch đầy đủ là cần thiết để xác minh các khối một cách độc lập, nhưng việc yêu cầu tất cả các nút tải xuống tất cả dữ liệu giao dịch là một rào cản đối với việc mở rộng. Các giải pháp cho vấn đề về tính sẵn sàng của dữ liệu nhằm cung cấp đủ sự đảm bảo rằng dữ liệu giao dịch đầy đủ đã được cung cấp để xác minh cho những người tham gia mạng không tự tải xuống và lưu trữ dữ liệu.
+
+[Các nút nhẹ](/developers/docs/nodes-and-clients/light-clients) và [các rollup Lớp 2](/developers/docs/scaling) là những ví dụ quan trọng về những người tham gia mạng yêu cầu sự đảm bảo mạnh mẽ về tính sẵn sàng của dữ liệu nhưng không thể tự tải xuống và xử lý dữ liệu giao dịch. Việc tránh tải xuống dữ liệu giao dịch là điều làm cho các nút nhẹ trở nên nhẹ và cho phép các rollup trở thành giải pháp mở rộng hiệu quả.
+
+Tính sẵn sàng của dữ liệu cũng là một mối quan tâm quan trọng đối với các ứng dụng khách Ethereum ["không trạng thái"](/roadmap/statelessness) trong tương lai không cần tải xuống và lưu trữ dữ liệu trạng thái để xác minh các khối. Các ứng dụng khách không trạng thái vẫn cần chắc chắn rằng dữ liệu có sẵn ở _đâu đó_ và đã được xử lý chính xác.
+
+## Các giải pháp về tính sẵn sàng của dữ liệu {#data-availability-solutions}
+
+### Lấy mẫu tính sẵn sàng của dữ liệu (DAS) {#data-availability-sampling}
+
+Lấy mẫu tính sẵn sàng của dữ liệu (DAS) là một cách để mạng kiểm tra xem dữ liệu có sẵn hay không mà không gây quá nhiều áp lực cho bất kỳ nút riêng lẻ nào. Mỗi nút (bao gồm cả các nút không tham gia staking) tải xuống một tập hợp con nhỏ, được chọn ngẫu nhiên của tổng dữ liệu. Việc tải xuống thành công các mẫu xác nhận với độ tin cậy cao rằng tất cả dữ liệu đều có sẵn. Điều này dựa trên mã hóa xóa dữ liệu, giúp mở rộng một bộ dữ liệu nhất định với thông tin dự phòng (cách thực hiện điều này là điều chỉnh một hàm được gọi là _đa thức_ trên dữ liệu và đánh giá đa thức đó tại các điểm bổ sung). Điều này cho phép khôi phục dữ liệu gốc từ dữ liệu dự phòng khi cần thiết. Hệ quả của việc tạo dữ liệu này là nếu _bất kỳ_ dữ liệu gốc nào không có sẵn, _một nửa_ dữ liệu mở rộng sẽ bị thiếu! Lượng mẫu dữ liệu được mỗi nút tải xuống có thể được điều chỉnh để _cực kỳ_ có khả năng ít nhất một trong các mảnh dữ liệu được mỗi ứng dụng khách lấy mẫu sẽ bị thiếu _nếu_ thực sự có ít hơn một nửa dữ liệu.
+
+DAS sẽ được sử dụng để đảm bảo các nhà khai thác rollup cung cấp dữ liệu giao dịch của họ sau khi [Full Danksharding](/roadmap/danksharding/#what-is-danksharding) được triển khai. Các nút Ethereum sẽ lấy mẫu ngẫu nhiên dữ liệu giao dịch được cung cấp trong các blob bằng cách sử dụng lược đồ dự phòng đã giải thích ở trên để đảm bảo rằng tất cả dữ liệu đều tồn tại. Kỹ thuật tương tự cũng có thể được sử dụng để đảm bảo các nhà sản xuất khối cung cấp tất cả dữ liệu của họ cho các ứng dụng khách nhẹ bảo mật. Tương tự, trong [tách biệt người đề xuất-người xây dựng](/roadmap/pbs), chỉ người xây dựng khối mới được yêu cầu xử lý toàn bộ khối - các trình xác thực khác sẽ xác minh bằng cách lấy mẫu tính sẵn sàng của dữ liệu.
+
+### Các ủy ban về tính sẵn sàng của dữ liệu {#data-availability-committees}
+
+Các Ủy ban về tính sẵn sàng của dữ liệu (DAC) là các bên đáng tin cậy cung cấp hoặc chứng thực tính sẵn sàng của dữ liệu. Các DAC có thể được sử dụng thay cho, [hoặc kết hợp với](https://hackmd.io/@vbuterin/sharding_proposal#Why-not-use-just-committees-and-not-DAS) DAS. Các đảm bảo bảo mật đi kèm với các ủy ban phụ thuộc vào thiết lập cụ thể. Ví dụ: Ethereum sử dụng các tập hợp con được lấy mẫu ngẫu nhiên của các trình xác thực để chứng thực tính sẵn sàng của dữ liệu cho các nút nhẹ.
+
+DAC cũng được một số validium sử dụng. DAC là một tập hợp các nút đáng tin cậy lưu trữ các bản sao dữ liệu ngoài chuỗi. DAC được yêu cầu cung cấp dữ liệu trong trường hợp có tranh chấp. Các thành viên của DAC cũng công bố các chứng thực trên chuỗi để chứng minh rằng dữ liệu đã nói thực sự có sẵn. Một số validium thay thế DAC bằng hệ thống trình xác thực bằng chứng cổ phần (PoS). Ở đây, bất kỳ ai cũng có thể trở thành trình xác thực và lưu trữ dữ liệu ngoài chuỗi. Tuy nhiên, họ phải cung cấp một “khoản ký quỹ”, được gửi vào một hợp đồng thông minh. Trong trường hợp có hành vi độc hại, chẳng hạn như trình xác thực giữ lại dữ liệu, khoản ký quỹ có thể bị phạt. Các ủy ban về tính sẵn sàng của dữ liệu bằng chứng cổ phần an toàn hơn đáng kể so với các DAC thông thường vì chúng trực tiếp khuyến khích hành vi trung thực.
+
+## Tính sẵn sàng của dữ liệu và các nút nhẹ {#data-availability-and-light-nodes}
+
+[Các nút nhẹ](/developers/docs/nodes-and-clients/light-clients) cần xác thực tính chính xác của các tiêu đề khối mà chúng nhận được mà không cần tải xuống dữ liệu khối. Cái giá của sự nhẹ nhàng này là không có khả năng xác minh độc lập các tiêu đề khối bằng cách thực hiện lại các giao dịch cục bộ theo cách mà các nút đầy đủ thực hiện.
+
+Các nút nhẹ của Ethereum tin tưởng các bộ ngẫu nhiên gồm 512 trình xác thực đã được chỉ định cho một _ủy ban đồng bộ hóa_. Ủy ban đồng bộ hóa hoạt động như một DAC báo hiệu cho các ứng dụng khách nhẹ rằng dữ liệu trong tiêu đề là chính xác bằng cách sử dụng chữ ký mật mã. Hàng ngày, ủy ban đồng bộ hóa sẽ làm mới. Mỗi tiêu đề khối cảnh báo các nút nhẹ về việc trình xác thực nào sẽ ký vào khối _tiếp theo_, vì vậy chúng không thể bị lừa để tin tưởng một nhóm độc hại giả vờ là ủy ban đồng bộ hóa thực sự.
+
+Tuy nhiên, điều gì sẽ xảy ra nếu một kẻ tấn công bằng cách nào đó _thực sự_ quản lý để chuyển một tiêu đề khối độc hại cho các ứng dụng khách nhẹ và thuyết phục họ rằng nó đã được ký bởi một ủy ban đồng bộ hóa trung thực? Trong trường hợp đó, kẻ tấn công có thể bao gồm các giao dịch không hợp lệ và ứng dụng khách nhẹ sẽ chấp nhận chúng một cách mù quáng, vì chúng không kiểm tra độc lập tất cả các thay đổi trạng thái được tóm tắt trong tiêu đề khối. Để bảo vệ chống lại điều này, ứng dụng khách nhẹ có thể sử dụng các bằng chứng gian lận.
+
+Cách các bằng chứng gian lận này hoạt động là một nút đầy đủ, khi thấy một quá trình chuyển đổi trạng thái không hợp lệ được lan truyền trên mạng, có thể nhanh chóng tạo ra một mẩu dữ liệu nhỏ chứng minh rằng một quá trình chuyển đổi trạng thái được đề xuất không thể phát sinh từ một tập hợp giao dịch nhất định và phát sóng dữ liệu đó cho các máy ngang hàng. Các nút nhẹ có thể nhận các bằng chứng gian lận đó và sử dụng chúng để loại bỏ các tiêu đề khối xấu, đảm bảo chúng ở trên cùng một chuỗi trung thực với các nút đầy đủ.
+
+Điều này dựa vào việc các nút đầy đủ có quyền truy cập vào dữ liệu giao dịch đầy đủ. Một kẻ tấn công phát sóng một tiêu đề khối xấu và cũng không cung cấp dữ liệu giao dịch sẽ có thể ngăn các nút đầy đủ tạo ra các bằng chứng gian lận. Các nút đầy đủ có thể có thể báo hiệu một cảnh báo về một khối xấu, nhưng chúng không thể sao lưu cảnh báo của mình bằng bằng chứng, vì dữ liệu không được cung cấp để tạo ra bằng chứng từ đó!
+
+Giải pháp cho vấn đề về tính sẵn sàng của dữ liệu này là DAS. Các nút nhẹ tải xuống các phần ngẫu nhiên rất nhỏ của dữ liệu trạng thái đầy đủ và sử dụng các mẫu để xác minh rằng bộ dữ liệu đầy đủ có sẵn. Xác suất thực tế của việc giả định sai về tính sẵn sàng của dữ liệu đầy đủ sau khi tải xuống N phần ngẫu nhiên có thể được tính toán ([đối với 100 phần, xác suất là 10^-30](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html), tức là cực kỳ khó xảy ra).
+
+Ngay cả trong kịch bản này, các cuộc tấn công chỉ giữ lại một vài byte cũng có thể không bị các ứng dụng khách đưa ra yêu cầu dữ liệu ngẫu nhiên phát hiện. Mã hóa xóa khắc phục điều này bằng cách tái tạo lại các mẩu dữ liệu bị thiếu nhỏ có thể được sử dụng để kiểm tra các thay đổi trạng thái được đề xuất. Sau đó, một bằng chứng gian lận có thể được xây dựng bằng cách sử dụng dữ liệu được tái tạo, ngăn chặn các nút nhẹ chấp nhận các tiêu đề xấu.
+
+**Lưu ý:** DAS và bằng chứng gian lận vẫn chưa được triển khai cho các ứng dụng khách nhẹ Ethereum bằng chứng cổ phần, nhưng chúng có trong lộ trình, rất có thể sẽ ở dạng bằng chứng dựa trên ZK-SNARK. Các ứng dụng khách nhẹ ngày nay dựa vào một dạng DAC: chúng xác minh danh tính của ủy ban đồng bộ hóa và sau đó tin tưởng vào các tiêu đề khối đã ký mà chúng nhận được.
+
+## Tính sẵn sàng của dữ liệu và các rollup Lớp 2 {#data-availability-and-layer-2-rollups}
+
+[Các giải pháp mở rộng Lớp 2](/layer-2/), chẳng hạn như [rollup](/glossary/#rollups), giảm chi phí giao dịch và tăng thông lượng của Ethereum bằng cách xử lý các giao dịch ngoài chuỗi. Các giao dịch rollup được nén và đăng lên Ethereum theo lô. Các lô đại diện cho hàng nghìn giao dịch ngoài chuỗi riêng lẻ trong một giao dịch duy nhất trên Ethereum. Điều này làm giảm tắc nghẽn trên lớp cơ sở và giảm phí cho người dùng.
+
+Tuy nhiên, chỉ có thể tin tưởng các giao dịch 'tóm tắt' được đăng lên Ethereum nếu sự thay đổi trạng thái được đề xuất có thể được xác minh và xác nhận một cách độc lập là kết quả của việc áp dụng tất cả các giao dịch ngoài chuỗi riêng lẻ. Nếu các nhà khai thác rollup không cung cấp dữ liệu giao dịch để xác minh này, thì họ có thể gửi dữ liệu không chính xác đến Ethereum.
+
+[Gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups/) đăng dữ liệu giao dịch nén lên Ethereum và đợi một khoảng thời gian (thường là 7 ngày) để cho phép các trình xác minh độc lập kiểm tra dữ liệu. Nếu bất kỳ ai xác định được vấn đề, họ có thể tạo ra một bằng chứng gian lận và sử dụng nó để thách thức rollup. Điều này sẽ khiến chuỗi quay trở lại và bỏ qua khối không hợp lệ. Điều này chỉ có thể thực hiện được nếu dữ liệu có sẵn. Hiện tại, có hai cách mà các gộp giao dịch lạc quan đăng dữ liệu giao dịch lên L1. Một số rollup cung cấp dữ liệu vĩnh viễn dưới dạng `CALLDATA`, tồn tại vĩnh viễn trên chuỗi. Với việc triển khai EIP-4844, một số rollup thay vào đó đăng dữ liệu giao dịch của họ vào bộ lưu trữ blob rẻ hơn. Đây không phải là bộ lưu trữ vĩnh viễn. Các trình xác minh độc lập phải truy vấn các blob và đưa ra các thách thức của họ trong vòng ~18 ngày trước khi dữ liệu bị xóa khỏi lớp 1 của Ethereum. Tính sẵn sàng của dữ liệu chỉ được đảm bảo bởi giao thức Ethereum trong khoảng thời gian cố định ngắn đó. Sau đó, nó trở thành trách nhiệm của các thực thể khác trong hệ sinh thái Ethereum. Bất kỳ nút nào cũng có thể xác minh tính sẵn sàng của dữ liệu bằng cách sử dụng DAS, tức là bằng cách tải xuống các mẫu dữ liệu blob nhỏ, ngẫu nhiên.
+
+[Các rollup không kiến thức (ZK)](/developers/docs/scaling/zk-rollups) không cần đăng dữ liệu giao dịch vì [các bằng chứng hợp lệ không kiến thức](/glossary/#zk-proof) đảm bảo tính chính xác của các quá trình chuyển đổi trạng thái. Tuy nhiên, tính sẵn sàng của dữ liệu vẫn là một vấn đề vì chúng ta không thể đảm bảo chức năng của ZK-rollup (hoặc tương tác với nó) mà không có quyền truy cập vào dữ liệu trạng thái của nó. Ví dụ: người dùng không thể biết số dư của mình nếu một nhà khai thác giữ lại thông tin chi tiết về trạng thái của rollup. Ngoài ra, họ không thể thực hiện cập nhật trạng thái bằng cách sử dụng thông tin có trong một khối mới được thêm vào.
+
+## Tính sẵn sàng của dữ liệu so với khả năng truy xuất dữ liệu {#data-availability-vs-data-retrievability}
+
+Tính sẵn sàng của dữ liệu khác với khả năng truy xuất dữ liệu. Tính sẵn sàng của dữ liệu là sự đảm bảo rằng các nút đầy đủ đã có thể truy cập và xác minh toàn bộ tập hợp các giao dịch liên quan đến một khối cụ thể. Điều đó không nhất thiết có nghĩa là dữ liệu có thể truy cập được mãi mãi.
+
+Khả năng truy xuất dữ liệu là khả năng các nút truy xuất _thông tin lịch sử_ từ chuỗi khối. Dữ liệu lịch sử này không cần thiết để xác minh các khối mới, nó chỉ được yêu cầu để đồng bộ hóa các nút đầy đủ từ khối khởi nguyên hoặc phục vụ các yêu cầu lịch sử cụ thể.
+
+Giao thức cốt lõi của Ethereum chủ yếu quan tâm đến tính sẵn sàng của dữ liệu, không phải khả năng truy xuất dữ liệu. Khả năng truy xuất dữ liệu có thể được cung cấp bởi một số lượng nhỏ các nút lưu trữ do bên thứ ba điều hành, hoặc nó có thể được phân phối trên toàn mạng bằng cách sử dụng lưu trữ tệp phi tập trung như [Mạng Portal](https://www.ethportal.net/).
+
+## Đọc thêm {#further-reading}
+
+- [Tính sẵn sàng của dữ liệu là cái quái gì?](https://medium.com/blockchain-capital-blog/wtf-is-data-availability-80c2c95ded0f)
+- [Tính sẵn sàng của dữ liệu là gì?](https://coinmarketcap.com/academy/article/what-is-data-availability)
+- [Giới thiệu cơ bản về kiểm tra tính sẵn sàng của dữ liệu](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html)
+- [Giải thích về đề xuất phân mảnh + DAS](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling)
+- [Lưu ý về tính sẵn sàng của dữ liệu và mã hóa xóa](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)
+- [Các ủy ban về tính sẵn sàng của dữ liệu.](https://medium.com/starkware/data-availability-e5564c416424)
+- [Các ủy ban về tính sẵn sàng của dữ liệu bằng chứng cổ phần.](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf)
+- [Các giải pháp cho vấn đề truy xuất dữ liệu](https://notes.ethereum.org/@vbuterin/data_sharding_roadmap#Who-would-store-historical-data-under-sharding)
+- [Tính sẵn sàng của dữ liệu hoặc: Các rollup đã học cách ngừng lo lắng và yêu Ethereum như thế nào](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum)
+- [EIP-7623: Tăng chi phí Calldata](https://web.archive.org/web/20250515194659/https://research.2077.xyz/eip-7623-increase-calldata-cost)
diff --git a/public/content/translations/vi/developers/docs/data-structures-and-encoding/index.md b/public/content/translations/vi/developers/docs/data-structures-and-encoding/index.md
new file mode 100644
index 00000000000..666b9883239
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/data-structures-and-encoding/index.md
@@ -0,0 +1,32 @@
+---
+title: Cấu trúc dữ liệu và mã hoá
+description: Tổng quan về các cấu trúc dữ liệu cơ bản của Ethereum.
+lang: vi
+sidebarDepth: 2
+---
+
+Ethereum tạo, lưu trữ và chuyển một lượng lớn dữ liệu. Dữ liệu này phải được định dạng theo những cách được tiêu chuẩn hóa và tiết kiệm bộ nhớ để cho phép bất kỳ ai [chạy một nút](/run-a-node/) trên phần cứng cấp tiêu dùng tương đối khiêm tốn. Để đạt được điều này, một số cấu trúc dữ liệu cụ thể được sử dụng trên ngăn xếp Ethereum.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên hiểu các nguyên tắc cơ bản của Ethereum và [phần mềm máy khách](/developers/docs/nodes-and-clients/). Nên làm quen với lớp mạng và [Giấy trắng Ethereum](/whitepaper/).
+
+## Các cấu trúc dữ liệu {#data-structures}
+
+### Patricia merkle tries {#patricia-merkle-tries}
+
+Patricia Merkle Tries là các cấu trúc mã hóa các cặp khóa-giá trị thành một cây trie mang tính tất định và được xác thực bằng mật mã. Những cấu trúc này được sử dụng rộng rãi trên lớp thực thi của Ethereum.
+
+[Tìm hiểu thêm về Patricia Merkle Tries](/developers/docs/data-structures-and-encoding/patricia-merkle-trie)
+
+### Tiền tố Độ dài Đệ quy {#recursive-length-prefix}
+
+Tiền tố độ dài đệ quy (RLP) là một phương pháp tuần tự hóa được sử dụng rộng rãi trên lớp thực thi của Ethereum.
+
+[Tìm hiểu thêm về RLP](/developers/docs/data-structures-and-encoding/rlp)
+
+### Tuần tự hóa Đơn giản {#simple-serialize}
+
+Tuần tự hóa đơn giản (SSZ) là định dạng tuần tự hóa chủ đạo trên lớp đồng thuận của Ethereum vì khả năng tương thích của nó với việc merkle hóa.
+
+[Tìm hiểu thêm về SSZ](/developers/docs/data-structures-and-encoding/ssz)
diff --git a/public/content/translations/vi/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/translations/vi/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md
new file mode 100644
index 00000000000..55d802d6e03
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md
@@ -0,0 +1,266 @@
+---
+title: Cây Merkle Patricia
+description: Giới thiệu về Cây Merkle Patricia.
+lang: vi
+sidebarDepth: 2
+---
+
+Trạng thái của Ethereum (toàn bộ các tài khoản, số dư và hợp đồng thông minh), được mã hóa thành một phiên bản đặc biệt của cấu trúc dữ liệu thường được biết đến trong khoa học máy tính với tên gọi là Cây Merkle. Cấu trúc này hữu ích cho nhiều ứng dụng trong mật mã học vì nó tạo ra một mối quan hệ có thể xác minh được giữa tất cả các phần dữ liệu riêng lẻ bị vướng vào trong cây, tạo ra một giá trị **gốc** duy nhất có thể được sử dụng để chứng minh mọi thứ về dữ liệu.
+
+Cấu trúc dữ liệu của Ethereum là một 'Cây Merkle-Patricia đã sửa đổi', được đặt tên như vậy vì nó vay mượn một số tính năng của PATRICIA (Thuật toán thực tế để truy xuất thông tin được mã hóa bằng chữ và số) và vì nó được thiết kế để truy xuất dữ liệu hiệu quả các mục bao gồm trạng thái Ethereum.
+
+Một cây Merkle-Patricia mang tính xác định và có thể xác minh bằng phương pháp mật mã: Cách duy nhất để tạo ra một gốc trạng thái là tính toán nó từ mỗi phần riêng lẻ của trạng thái, và hai trạng thái giống hệt nhau có thể dễ dàng được chứng minh bằng cách so sánh băm gốc và các băm dẫn đến nó (_một bằng chứng Merkle_). Ngược lại, không có cách nào để tạo ra hai trạng thái khác nhau với cùng một băm gốc và mọi nỗ lực sửa đổi trạng thái bằng các giá trị khác nhau sẽ dẫn đến một băm gốc trạng thái khác. Về mặt lý thuyết, cấu trúc này cung cấp 'chén thánh' về hiệu quả `O(log(n))` cho việc chèn, tra cứu và xóa.
+
+Trong tương lai gần, Ethereum có kế hoạch chuyển sang cấu trúc [Cây Verkle](/roadmap/verkle-trees), điều này sẽ mở ra nhiều khả năng mới cho các cải tiến giao thức trong tương lai.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, bạn nên có kiến thức cơ bản về [các hàm băm](https://en.wikipedia.org/wiki/Hash_function), [cây Merkle](https://en.wikipedia.org/wiki/Merkle_tree), [cây (tries)](https://en.wikipedia.org/wiki/Trie) và [tuần tự hóa](https://en.wikipedia.org/wiki/Serialization). Bài viết này bắt đầu bằng phần mô tả về một [cây cơ số](https://en.wikipedia.org/wiki/Radix_tree) cơ bản, sau đó giới thiệu dần các sửa đổi cần thiết cho cấu trúc dữ liệu được tối ưu hóa hơn của Ethereum.
+
+## Các cây cơ số cơ bản {#basic-radix-tries}
+
+Trong một cây cơ số cơ bản, mọi nút trông như sau:
+
+```
+ [i_0, i_1 ... i_n, value]
+```
+
+Trong đó `i_0 ...` i_n`biểu thị các ký hiệu của bảng chữ cái (thường là nhị phân hoặc thập lục phân),`value`là giá trị cuối tại nút, và các giá trị trong`i_0, i_1 ...` các vị trí i_n` là `NULL` hoặc con trỏ tới (trong trường hợp của chúng ta là băm của) các nút khác. Điều này tạo thành một kho lưu trữ `(khóa, giá trị)` cơ bản.
+
+Giả sử bạn muốn sử dụng cấu trúc dữ liệu cây cơ số để duy trì một thứ tự trên một tập hợp các cặp khóa-giá trị. Để tìm giá trị hiện được ánh xạ tới khóa `dog` trong cây, trước tiên bạn sẽ chuyển đổi `dog` thành các chữ cái của bảng chữ cái (cho ra `64 6f 67`), sau đó đi xuống cây theo đường dẫn đó cho đến khi bạn tìm thấy giá trị. Nghĩa là, bạn bắt đầu bằng cách tra cứu băm gốc trong một DB khóa/giá trị phẳng để tìm nút gốc của cây. Nó được biểu diễn dưới dạng một mảng các khóa trỏ đến các nút khác. Bạn sẽ sử dụng giá trị tại chỉ mục `6` làm khóa và tra cứu nó trong DB khóa/giá trị phẳng để lấy nút ở cấp thấp hơn. Sau đó chọn chỉ mục `4` để tra cứu giá trị tiếp theo, rồi chọn chỉ mục `6`, v.v., cho đến khi, sau khi bạn đi theo đường dẫn: `root -> 6 -> 4 -> 6 -> 15 -> 6 -> 7`, bạn sẽ tra cứu giá trị của nút và trả về kết quả.
+
+Có sự khác biệt giữa việc tra cứu một cái gì đó trong 'cây' và 'DB' khóa/giá trị phẳng cơ bản. Cả hai đều xác định các sắp xếp khóa/giá trị, nhưng DB cơ bản có thể thực hiện tra cứu 1 bước truyền thống cho một khóa. Việc tra cứu một khóa trong cây đòi hỏi nhiều lần tra cứu DB cơ bản để đến được giá trị cuối cùng được mô tả ở trên. Hãy gọi cái sau là `path` để loại bỏ sự mơ hồ.
+
+Các thao tác cập nhật và xóa đối với cây cơ số có thể được định nghĩa như sau:
+
+```python
+ def update(node_hash, path, value):
+ curnode = db.get(node_hash) if node_hash else [NULL] * 17
+ newnode = curnode.copy()
+ if path == "":
+ newnode[-1] = value
+ else:
+ newindex = update(curnode[path[0]], path[1:], value)
+ newnode[path[0]] = newindex
+ db.put(hash(newnode), newnode)
+ return hash(newnode)
+
+ def delete(node_hash, path):
+ if node_hash is NULL:
+ return NULL
+ else:
+ curnode = db.get(node_hash)
+ newnode = curnode.copy()
+ if path == "":
+ newnode[-1] = NULL
+ else:
+ newindex = delete(curnode[path[0]], path[1:])
+ newnode[path[0]] = newindex
+
+ if all(x is NULL for x in newnode):
+ return NULL
+ else:
+ db.put(hash(newnode), newnode)
+ return hash(newnode)
+```
+
+Một cây cơ số "Merkle" được xây dựng bằng cách liên kết các nút sử dụng các thông báo băm mật mã được tạo ra một cách xác định. Việc định địa chỉ nội dung này (trong DB khóa/giá trị `khóa == keccak256(rlp(giá trị))`) cung cấp một sự đảm bảo toàn vẹn bằng mật mã của dữ liệu được lưu trữ. Nếu băm gốc của một cây cho trước được biết đến công khai, thì bất kỳ ai có quyền truy cập vào dữ liệu lá cơ bản đều có thể xây dựng một bằng chứng rằng cây bao gồm một giá trị nhất định tại một đường dẫn cụ thể bằng cách cung cấp các băm của mỗi nút nối một giá trị cụ thể với gốc cây.
+
+Kẻ tấn công không thể cung cấp bằng chứng về một cặp `(đường dẫn, giá trị)` không tồn tại vì băm gốc cuối cùng dựa trên tất cả các băm bên dưới nó. Bất kỳ sửa đổi cơ bản nào cũng sẽ thay đổi băm gốc. Bạn có thể nghĩ về băm như một biểu diễn nén của thông tin cấu trúc về dữ liệu, được bảo mật bởi sự bảo vệ tiền ảnh của hàm băm.
+
+Chúng ta sẽ gọi một đơn vị nguyên tử của cây cơ số (ví dụ: một ký tự thập lục phân đơn, hoặc số nhị phân 4 bit) là một "nibble". Trong khi duyệt một đường dẫn mỗi lần một nibble, như đã mô tả ở trên, các nút có thể tham chiếu tối đa đến 16 con nhưng bao gồm một phần tử `value`. Do đó, chúng ta biểu diễn chúng dưới dạng một mảng có độ dài 17. Chúng ta gọi các mảng 17 phần tử này là "nút nhánh".
+
+## Cây Merkle Patricia {#merkle-patricia-trees}
+
+Các cây cơ số có một hạn chế lớn: chúng không hiệu quả. Nếu bạn muốn lưu trữ một liên kết `(đường dẫn, giá trị)` trong đó đường dẫn, giống như trong Ethereum, dài 64 ký tự (số lượng nibble trong `bytes32`), chúng ta sẽ cần hơn một kilobyte dung lượng bổ sung để lưu trữ một cấp cho mỗi ký tự, và mỗi lần tra cứu hoặc xóa sẽ mất đủ 64 bước. Cây Patricia được giới thiệu sau đây sẽ giải quyết vấn đề này.
+
+### Tối ưu hóa {#optimization}
+
+Một nút trong một cây Merkle Patricia là một trong những loại sau:
+
+1. `NULL` (được biểu thị bằng chuỗi trống)
+2. `branch` Một nút 17 mục `[ v0 ...` v15, vt ]\`
+3. `leaf` Một nút 2 mục `[ encodedPath, value ]`
+4. `extension` Một nút 2 mục `[ encodedPath, key ]`
+
+Với các đường dẫn 64 ký tự, không thể tránh khỏi việc sau khi duyệt qua vài lớp đầu tiên của cây, bạn sẽ đến một nút nơi không có đường dẫn phân kỳ nào tồn tại ít nhất một phần đường đi xuống. Để tránh phải tạo ra tới 15 nút `NULL` thưa thớt dọc theo đường dẫn, chúng tôi rút ngắn đường đi xuống bằng cách thiết lập một nút `extension` có dạng `[ encodedPath, key ]`, trong đó `encodedPath` chứa "đường dẫn một phần" để bỏ qua (sử dụng một mã hóa nhỏ gọn được mô tả bên dưới) và `key` dùng cho lần tra cứu DB tiếp theo.
+
+Đối với một nút `leaf`, có thể được đánh dấu bằng một cờ trong nibble đầu tiên của `encodedPath`, đường dẫn mã hóa tất cả các đoạn đường dẫn của nút trước đó và chúng ta có thể tra cứu trực tiếp `value`.
+
+Tuy nhiên, việc tối ưu hóa trên lại gây ra sự mơ hồ.
+
+Khi duyệt các đường dẫn theo nibble, chúng ta có thể kết thúc với một số lượng nibble lẻ cần duyệt, nhưng vì tất cả dữ liệu được lưu trữ ở định dạng `bytes`. Không thể phân biệt được, chẳng hạn, giữa nibble `1` và các nibble `01` (cả hai đều phải được lưu trữ là `<01>`). Để chỉ định độ dài lẻ, đường dẫn một phần được đặt trước bằng một cờ.
+
+### Đặc tả: Mã hóa nhỏ gọn của chuỗi hex với dấu kết thúc tùy chọn {#specification}
+
+Việc gắn cờ cho cả _độ dài đường dẫn một phần còn lại là lẻ so với chẵn_ và _nút lá so với nút mở rộng_ như được mô tả ở trên nằm ở nibble đầu tiên của đường dẫn một phần của bất kỳ nút 2 mục nào. Chúng dẫn đến kết quả sau:
+
+| ký tự hex | bit | loại nút | độ dài đường dẫn |
+| --------- | ---- | -------------------------------- | ---------------- |
+| 0 | 0000 | mở rộng | chẵn |
+| 1 | 0001 | mở rộng | lẻ |
+| 2 | 0010 | kết thúc (lá) | chẵn |
+| 3 | 0011 | kết thúc (lá) | lẻ |
+
+Đối với độ dài đường dẫn còn lại là chẵn (`0` hoặc `2`), một nibble "đệm" `0` khác sẽ luôn theo sau.
+
+```python
+ def compact_encode(hexarray):
+ term = 1 if hexarray[-1] == 16 else 0
+ if term:
+ hexarray = hexarray[:-1]
+ oddlen = len(hexarray) % 2
+ flags = 2 * term + oddlen
+ if oddlen:
+ hexarray = [flags] + hexarray
+ else:
+ hexarray = [flags] + [0] + hexarray
+ # hexarray 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
+```
+
+Ví dụ:
+
+```python
+ > [1, 2, 3, 4, 5, ...]
+ '11 23 45'
+ > [0, 1, 2, 3, 4, 5, ...]
+ '00 01 23 45'
+ > [0, f, 1, c, b, 8, 10]
+ '20 0f 1c b8'
+ > [f, 1, c, b, 8, 10]
+ '3f 1c b8'
+```
+
+Đây là mã mở rộng để lấy một nút trong cây Merkle Patricia:
+
+```python
+ def get_helper(node_hash, path):
+ if path == []:
+ return node_hash
+ if node_hash == "":
+ return ""
+ curnode = rlp.decode(node_hash if len(node_hash) < 32 else db.get(node_hash))
+ if len(curnode) == 2:
+ (k2, v2) = curnode
+ k2 = compact_decode(k2)
+ if k2 == path[: len(k2)]:
+ return get(v2, path[len(k2) :])
+ else:
+ return ""
+ elif len(curnode) == 17:
+ return get_helper(curnode[path[0]], path[1:])
+
+ def get(node_hash, path):
+ path2 = []
+ for i in range(len(path)):
+ path2.push(int(ord(path[i]) / 16))
+ path2.push(ord(path[i]) % 16)
+ path2.push(16)
+ return get_helper(node_hash, path2)
+```
+
+### Ví dụ về cây {#example-trie}
+
+Giả sử chúng ta muốn có một cây chứa bốn cặp đường dẫn/giá trị `('do', 'verb')`, `('dog', 'puppy')`, `('doge', 'coins')`, `('horse', 'stallion')`.
+
+Đầu tiên, chúng ta chuyển đổi cả đường dẫn và giá trị thành `bytes`. Dưới đây, các biểu diễn byte thực tế cho _đường dẫn_ được biểu thị bằng `<>`, mặc dù _giá trị_ vẫn được hiển thị dưới dạng chuỗi, được biểu thị bằng `''`, để dễ hiểu hơn (chúng thực sự cũng sẽ là `bytes`):
+
+```
+ <64 6f> : 'verb'
+ <64 6f 67> : 'puppy'
+ <64 6f 67 65> : 'coins'
+ <68 6f 72 73 65> : 'stallion'
+```
+
+Bây giờ, chúng ta xây dựng một cây như vậy với các cặp khóa/giá trị sau trong DB cơ bản:
+
+```
+ rootHash: [ <16>, hashA ]
+ hashA: [ <>, <>, <>, <>, hashB, <>, <>, <>, [ <20 6f 72 73 65>, 'stallion' ], <>, <>, <>, <>, <>, <>, <>, <> ]
+ hashB: [ <00 6f>, hashC ]
+ hashC: [ <>, <>, <>, <>, <>, <>, hashD, <>, <>, <>, <>, <>, <>, <>, <>, <>, 'verb' ]
+ hashD: [ <17>, [ <>, <>, <>, <>, <>, <>, [ <35>, 'coins' ], <>, <>, <>, <>, <>, <>, <>, <>, <>, 'puppy' ] ]
+```
+
+Khi một nút được tham chiếu bên trong một nút khác, những gì được bao gồm là `keccak256(rlp.encode(node))`, nếu `len(rlp.encode(node)) >= 32` thì ngược lại là `node`, trong đó `rlp.encode` là hàm mã hóa [RLP](/developers/docs/data-structures-and-encoding/rlp).
+
+Lưu ý rằng khi cập nhật một cây, người ta cần lưu trữ cặp khóa/giá trị `(keccak256(x), x)` trong một bảng tra cứu liên tục _nếu_ nút mới được tạo có độ dài >= 32. Tuy nhiên, nếu nút ngắn hơn, người ta không cần phải lưu trữ bất cứ điều gì, vì hàm f(x) = x là có thể đảo ngược.
+
+## Các cây trong Ethereum {#tries-in-ethereum}
+
+Tất cả các cây merkle trong lớp thực thi của Ethereum đều sử dụng Cây Merkle Patricia.
+
+Từ một tiêu đề khối có 3 gốc từ 3 trong số các cây này.
+
+1. stateRoot
+2. transactionsRoot
+3. receiptsRoot
+
+### Cây trạng thái {#state-trie}
+
+Có một cây trạng thái toàn cục, và nó được cập nhật mỗi khi một ứng dụng xử lý một khối. Trong đó, một `path` luôn là: `keccak256(ethereumAddress)` và một `value` luôn là: `rlp(ethereumAccount)`. Cụ thể hơn, một `tài khoản` Ethereum là một mảng 4 mục gồm `[nonce,balance,storageRoot,codeHash]`. Tại thời điểm này, cần lưu ý rằng `storageRoot` này là gốc của một cây patricia khác:
+
+### Cây lưu trữ {#storage-trie}
+
+Cây lưu trữ là nơi _tất cả_ dữ liệu hợp đồng tồn tại. Có một cây lưu trữ riêng cho mỗi tài khoản. Để truy xuất các giá trị tại các vị trí lưu trữ cụ thể tại một địa chỉ nhất định, cần có địa chỉ lưu trữ, vị trí số nguyên của dữ liệu được lưu trữ trong bộ lưu trữ và ID khối. Sau đó, chúng có thể được chuyển làm đối số cho `eth_getStorageAt` được định nghĩa trong JSON-RPC API, ví dụ: để truy xuất dữ liệu trong vị trí lưu trữ 0 cho địa chỉ `0x295a70b2de5e3953354a6a8344e616ed314d7251`:
+
+```bash
+curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545
+
+{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"}
+
+```
+
+Việc truy xuất các phần tử khác trong bộ lưu trữ phức tạp hơn một chút vì trước tiên phải tính toán vị trí trong cây lưu trữ. Vị trí được tính bằng băm `keccak256` của địa chỉ và vị trí lưu trữ, cả hai đều được đệm bên trái bằng các số không cho đến độ dài 32 byte. Ví dụ: vị trí của dữ liệu trong vị trí lưu trữ 1 cho địa chỉ `0x391694e7e0b0cce554cb130d723a9d27458f9298` là:
+
+```python
+keccak256(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"))
+```
+
+Trong bảng điều khiển Geth, điều này có thể được tính như sau:
+
+```
+> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001"
+undefined
+> web3.sha3(key, {"encoding": "hex"})
+"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9"
+```
+
+`path` do đó là `keccak256(<6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9>)`. Bây giờ có thể sử dụng điều này để truy xuất dữ liệu từ cây lưu trữ như trước:
+
+```bash
+curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545
+
+{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"}
+```
+
+Lưu ý: `storageRoot` cho một tài khoản Ethereum mặc định là trống nếu đó không phải là tài khoản hợp đồng.
+
+### Cây giao dịch {#transaction-trie}
+
+Có một cây giao dịch riêng cho mỗi khối, lại lưu trữ các cặp `(khóa, giá trị)`. Một đường dẫn ở đây là: `rlp(transactionIndex)` đại diện cho khóa tương ứng với một giá trị được xác định bởi:
+
+```python
+if legacyTx:
+ value = rlp(tx)
+else:
+ value = TxType | encode(tx)
+```
+
+Thông tin thêm về điều này có thể được tìm thấy trong tài liệu [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718).
+
+### Cây biên lai {#receipts-trie}
+
+Mỗi khối có cây Biên lai riêng. Một `path` ở đây là: `rlp(transactionIndex)`. `transactionIndex` là chỉ mục của nó trong khối mà nó được bao gồm. Cây biên lai không bao giờ được cập nhật. Tương tự như cây Giao dịch, có các biên lai hiện tại và cũ. Để truy vấn một biên lai cụ thể trong cây Biên lai, cần có chỉ mục của giao dịch trong khối của nó, tải trọng biên lai và loại giao dịch. Biên lai được trả về có thể thuộc loại `Receipt` được định nghĩa là sự nối chuỗi của `TransactionType` và `ReceiptPayload` hoặc nó có thể thuộc loại `LegacyReceipt` được định nghĩa là `rlp([status, cumulativeGasUsed, logsBloom, logs])`.
+
+Thông tin thêm về điều này có thể được tìm thấy trong tài liệu [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718).
+
+## Đọc thêm {#further-reading}
+
+- [Cây Merkle Patricia đã sửa đổi — Cách Ethereum lưu một trạng thái](https://medium.com/codechain/modified-merkle-patricia-trie-how-ethereum-saves-a-state-e6d7555078dd)
+- [Merkling trong Ethereum](https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/)
+- [Tìm hiểu về cây Ethereum](https://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/)
diff --git a/public/content/translations/vi/developers/docs/data-structures-and-encoding/rlp/index.md b/public/content/translations/vi/developers/docs/data-structures-and-encoding/rlp/index.md
new file mode 100644
index 00000000000..e834b423cf2
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/data-structures-and-encoding/rlp/index.md
@@ -0,0 +1,163 @@
+---
+title: Recursive-length prefix (RLP) serialization
+description: Giải thích về mã hóa rlp trong excution layer của Ethereum.
+lang: vi
+sidebarDepth: 2
+---
+
+Recursive Length Prefix (RLP) serialization được sử dụng phổ biến trong các execution client của Ethereum. RLP chuẩn hóa việc truyền dữ liệu giữa các node với một định dạng tiết kiệm không gian. Mục đích của RLP là mã hóa các mảng dữ liệu nhị phân lồng nhau bất kỳ, và RLP là phương thức mã hóa chính được sử dụng để tuần tự hóa các đối tượng trong excution layer của Ethereum. Mục đích chính của RLP là mã hóa cấu trúc; ngoại trừ các số nguyên dương, RLP ủy thác việc mã hóa các kiểu dữ liệu cụ thể (ví dụ: chuỗi, số thực) cho các giao thức bậc cao hơn. Các số nguyên dương phải được biểu diễn dưới dạng nhị phân big-endian không có số không ở đầu (do đó làm cho giá trị số nguyên không tương đương với mảng byte trống). Các số nguyên dương được giải tuần tự hóa có số không ở đầu phải bị coi là không hợp lệ bởi bất kỳ giao thức bậc cao nào sử dụng RLP.
+
+Thông tin thêm trong [sách vàng Ethereum (Phụ lục B)](https://ethereum.github.io/yellowpaper/paper.pdf#page=19).
+
+Để sử dụng RLP để mã hóa một dictionary, 2 chuẩn được sử dụng là:
+
+- sử dụng `[[k1,v1],[k2,v2]...]` với các khóa theo thứ tự từ điển
+- sử dụng mã hóa Patricia Tree bậc cao như Ethereum
+
+## Định nghĩa {#definition}
+
+Phương thức mã hóa RLP lấy một item. Một item được định nghĩa như sau:
+
+- một chuỗi (tức là mảng byte) là một mục
+- một list các item là một item
+- một số nguyên dương là một mục
+
+Ví dụ, tất cả các mục dưới đều là item:
+
+- một chuỗi rỗng;
+- chuỗi chứa từ "cat";
+- một list chứa số lượng chuỗi bất kỳ;
+- và các cấu trúc dữ liệu phức tạp hơn như `["cat", ["puppy", "cow"], "horse", [[]], "pig", [""], "sheep"]`.
+- số `100`
+
+Lưu ý rằng trong ngữ cảnh của phần còn lại của trang này, 'chuỗi' có nghĩa là "một số byte dữ liệu nhị phân nhất định"; không có mã hóa đặc biệt nào được sử dụng và không có kiến thức nào về nội dung của các chuỗi được ngụ ý (ngoại trừ theo yêu cầu của quy tắc chống lại các số nguyên dương không tối thiểu).
+
+Mã hóa RLP được định nghĩa như sau:
+
+- Đối với một số nguyên dương, nó được chuyển đổi thành mảng byte ngắn nhất mà diễn giải big-endian của nó là số nguyên, và sau đó được mã hóa thành một chuỗi theo các quy tắc bên dưới.
+- Đối với một byte đơn có giá trị trong phạm vi `[0x00, 0x7f]` (thập phân `[0, 127]`), byte đó là mã hóa RLP của chính nó.
+- Nếu không, nếu một chuỗi dài 0-55 byte, mã hóa RLP bao gồm một byte đơn có giá trị **0x80** (hệ thập phân 128) cộng với độ dài của chuỗi, theo sau là chuỗi. Do đó, phạm vi của byte đầu tiên là `[0x80, 0xb7]` (hệ thập phân `[128, 183]`).
+- Nếu một chuỗi dài hơn 55 byte, mã hóa RLP bao gồm một byte đơn có giá trị **0xb7** (hệ thập phân 183) cộng với độ dài tính bằng byte của độ dài chuỗi ở dạng nhị phân, theo sau là độ dài của chuỗi, theo sau là chuỗi. Ví dụ: một chuỗi dài 1024 byte sẽ được mã hóa là `\xb9\x04\x00` (hệ thập phân `185, 4, 0`) theo sau là chuỗi. Ở đây, `0xb9` (183 + 2 = 185) là byte đầu tiên, theo sau là 2 byte `0x0400` (hệ thập phân 1024) biểu thị độ dài của chuỗi thực tế. Do đó, phạm vi của byte đầu tiên là `[0xb8, 0xbf]` (hệ thập phân `[184, 191]`).
+- Nếu một chuỗi dài 2^64 byte, hoặc dài hơn, nó có thể không được mã hóa.
+- Nếu tổng tải trọng của một danh sách (tức là tổng độ dài của tất cả các mục được mã hóa RLP) dài 0-55 byte, mã hóa RLP bao gồm một byte đơn có giá trị **0xc0** cộng với độ dài của tải trọng, theo sau là sự nối tiếp của các mã hóa RLP của các mục. Do đó, phạm vi của byte đầu tiên là `[0xc0, 0xf7]` (hệ thập phân `[192, 247]`).
+- Nếu tổng tải trọng của một danh sách dài hơn 55 byte, mã hóa RLP bao gồm một byte đơn có giá trị **0xf7** cộng với độ dài tính bằng byte của độ dài tải trọng ở dạng nhị phân, theo sau là độ dài của tải trọng, theo sau là sự nối tiếp của các mã hóa RLP của các mục. Do đó, phạm vi của byte đầu tiên là `[0xf8, 0xff]` (hệ thập phân `[248, 255]`).
+
+Đây là trong code:
+
+```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)
+```
+
+## Ví dụ {#examples}
+
+- chuỗi "dog" = [ 0x83, 'd', 'o', 'g' ]
+- danh sách [ "cat", "dog" ] = `[ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]`
+- chuỗi trống ('null') = `[ 0x80 ]`
+- danh sách trống = `[ 0xc0 ]`
+- số nguyên 0 = `[ 0x80 ]`
+- byte '\\x00' = `[ 0x00 ]`
+- byte '\\x0f' = `[ 0x0f ]`
+- các byte '\\x04\\x00' = `[ 0x82, 0x04, 0x00 ]`
+- [biểu diễn lý thuyết tập hợp](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers) của ba, `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]`
+- chuỗi "Lorem ipsum dolor sit amet, consectetur adipisicing elit" = `[ 0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ...` , 'e', 'l', 'i', 't' ]\`
+
+## Giải mã RLP {#rlp-decoding}
+
+Dựa theo các quy tắc và quy trình mã hóa RLP, đầu vào của mã hóa RLP được coi là một mảng dữ liệu nhị phân. Quá trình giải mã hóa RLP như sau:
+
+1. theo byte đầu tiên (tức là tiền tố) của dữ liệu đầu vào và giải mã kiểu dữ liệu, độ dài của dữ liệu thực tế và độ lệch;
+
+2. theo loại và độ lệch của dữ liệu, giải mã dữ liệu tương ứng, tuân thủ quy tắc mã hóa tối thiểu cho các số nguyên dương;
+
+3. tiếp tục giải mã hóa phần còn lại của đầu vào;
+
+Trong số đó, các quy tắc giải mã kiểu dữ liệu và offset như sau:
+
+1. dữ liệu là một chuỗi nếu phạm vi của byte đầu tiên (tức là tiền tố) là [0x00, 0x7f] và chuỗi chính xác là chính byte đầu tiên đó;
+
+2. dữ liệu là một chuỗi nếu phạm vi của byte đầu tiên là [0x80, 0xb7] và chuỗi có độ dài bằng byte đầu tiên trừ đi 0x80 theo sau byte đầu tiên;
+
+3. dữ liệu là một chuỗi nếu phạm vi của byte đầu tiên là [0xb8, 0xbf] và độ dài của chuỗi có độ dài tính bằng byte bằng byte đầu tiên trừ đi 0xb7 theo sau byte đầu tiên và chuỗi theo độ dài của chuỗi;
+
+4. dữ liệu là một list nếu phạm vi của byte đầu tiên là [0xc0, 0xf7], và phần mã hóa rlp của tất cả item của list có độ lớn băngf byte đầu tiên trừ 0xc0 theo sau byte đầu tiên;
+
+5. dữ liệu là một list nếu phạm vi của byte đầu tiên là [0xb8, 0xff] và toàn bộ payload của list có độ dài bằng byte đầu tiên trừ đi 0xf7 theo sau byte đầu tiên, và các mã hóa rlp của các item nối tiếp nhau nằm tiếp sau;
+
+Đây là trong code:
+
+```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
+```
+
+## Đọc thêm {#further-reading}
+
+- [RLP trong Ethereum](https://medium.com/coinmonks/data-structure-in-ethereum-episode-1-recursive-length-prefix-rlp-encoding-decoding-d1016832f919)
+- [Hậu trường Ethereum: RLP](https://medium.com/coinmonks/ethereum-under-the-hood-part-3-rlp-decoding-df236dc13e58)
+- [Coglio, A. (2020). Ethereum's Recursive Length Prefix in ACL2. arXiv preprint arXiv:2009.13769.](https://arxiv.org/abs/2009.13769)
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Cây Merkle Patricia](/developers/docs/data-structures-and-encoding/patricia-merkle-trie)
diff --git a/public/content/translations/vi/developers/docs/data-structures-and-encoding/ssz/index.md b/public/content/translations/vi/developers/docs/data-structures-and-encoding/ssz/index.md
new file mode 100644
index 00000000000..c2a4b7482d6
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/data-structures-and-encoding/ssz/index.md
@@ -0,0 +1,150 @@
+---
+title: Tuần tự hóa đơn giản
+description: Giải thích về định dạng SSZ của Ethereum.
+lang: vi
+sidebarDepth: 2
+---
+
+**Tuần tự hóa đơn giản (SSZ)** là phương thức tuần tự hóa được sử dụng trên Beacon Chain. Nó thay thế tuần tự hóa RLP được sử dụng trên lớp thực thi ở mọi nơi trên lớp đồng thuận ngoại trừ giao thức khám phá ngang hàng. Để tìm hiểu thêm về tuần tự hóa RLP, xem [Tiền tố độ dài đệ quy (RLP)](/developers/docs/data-structures-and-encoding/rlp/). SSZ được thiết kế để có tính xác định và cũng để Merkle hóa một cách hiệu quả. SSZ có thể được coi là có hai thành phần: một lược đồ tuần tự hóa và một lược đồ Merkle hóa được thiết kế để hoạt động hiệu quả với cấu trúc dữ liệu đã được tuần tự hóa.
+
+## SSZ hoạt động như thế nào? {#how-does-ssz-work}
+
+### Tuần tự hóa {#serialization}
+
+SSZ là một lược đồ tuần tự hóa không tự mô tả - thay vào đó, nó dựa trên một lược đồ phải được biết trước. Mục tiêu của tuần tự hóa SSZ là biểu diễn các đối tượng có độ phức tạp tùy ý dưới dạng các chuỗi byte. Đây là một quy trình rất đơn giản đối với "các loại cơ bản". Phần tử chỉ đơn giản là được chuyển đổi thành các byte thập lục phân. Các loại cơ bản bao gồm:
+
+- số nguyên không dấu
+- Boolean
+
+Đối với các loại "hỗn hợp" phức tạp, việc tuần tự hóa sẽ phức tạp hơn bởi vì loại hỗn hợp chứa nhiều phần tử có thể có các loại khác nhau hoặc kích thước khác nhau, hoặc cả hai. Khi các đối tượng này đều có độ dài cố định (tức là kích thước của các phần tử sẽ luôn không đổi bất kể giá trị thực tế của chúng) việc tuần tự hóa chỉ đơn giản là chuyển đổi mỗi phần tử trong loại hỗn hợp được sắp xếp thành các chuỗi byte little-endian. Những chuỗi byte này được nối với nhau. Đối tượng được tuần tự hóa có biểu diễn danh sách byte của các phần tử có độ dài cố định theo cùng thứ tự chúng xuất hiện trong đối tượng được giải tuần tự hóa.
+
+Đối với các loại có độ dài thay đổi, dữ liệu thực tế được thay thế bằng một giá trị "offset" (độ dời) tại vị trí của phần tử đó trong đối tượng được tuần tự hóa. Dữ liệu thực tế được thêm vào một heap ở cuối đối tượng được tuần tự hóa. Giá trị offset là chỉ mục cho sự bắt đầu của dữ liệu thực tế trong heap, hoạt động như một con trỏ đến các byte liên quan.
+
+Ví dụ dưới đây minh họa cách hoạt động của việc đặt offset cho một container có cả các phần tử có độ dài cố định và thay đổi:
+
+```Rust
+
+ struct Dummy {
+
+ number1: u64,
+ number2: u64,
+ vector: Vec,
+ number3: u64
+ }
+
+ dummy = Dummy{
+
+ number1: 37,
+ number2: 55,
+ vector: vec![1,2,3,4],
+ number3: 22,
+ }
+
+ serialized = ssz.serialize(dummy)
+
+```
+
+`serialized` sẽ có cấu trúc sau (ở đây chỉ được đệm tới 4 bit, trong thực tế được đệm tới 32 bit, và giữ nguyên biểu diễn `int` cho rõ ràng):
+
+```
+[37, 0, 0, 0, 55, 0, 0, 0, 16, 0, 0, 0, 22, 0, 0, 0, 1, 2, 3, 4]
+------------ ----------- ----------- ----------- ----------
+ | | | | |
+ number1 number2 offset cho number 3 giá trị cho
+ vector vector
+
+```
+
+được chia thành nhiều dòng cho rõ ràng:
+
+```
+[
+ 37, 0, 0, 0, # mã hóa little-endian của `number1`.
+ 55, 0, 0, 0, # mã hóa little-endian của `number2`.
+ 16, 0, 0, 0, # "Offset" cho biết giá trị của `vector` bắt đầu từ đâu (little-endian 16).
+ 22, 0, 0, 0, # mã hóa little-endian của `number3`.
+ 1, 2, 3, 4, # Các giá trị thực tế trong `vector`.
+]
+```
+
+Đây vẫn là một sự đơn giản hóa - các số nguyên và số không trong sơ đồ trên thực sự sẽ được lưu trữ dưới dạng danh sách byte, như thế này:
+
+```
+[
+ 10100101000000000000000000000000 # mã hóa little-endian của `number1`
+ 10110111000000000000000000000000 # mã hóa little-endian của `number2`.
+ 10010000000000000000000000000000 # "Offset" cho biết giá trị của `vector` bắt đầu từ đâu (little-endian 16).
+ 10010110000000000000000000000000 # mã hóa little-endian của `number3`.
+ 10000001100000101000001110000100 # Giá trị thực tế của trường `bytes`.
+]
+```
+
+Vì vậy, các giá trị thực tế cho các loại có độ dài thay đổi được lưu trữ trong một heap ở cuối đối tượng được tuần tự hóa với các offset của chúng được lưu trữ ở các vị trí chính xác trong danh sách các trường được sắp xếp.
+
+Cũng có một số trường hợp đặc biệt yêu cầu xử lý cụ thể, chẳng hạn như loại `BitList` yêu cầu thêm giới hạn độ dài trong quá trình tuần tự hóa và xóa bỏ trong quá trình giải tuần tự hóa. Thông tin chi tiết đầy đủ có trong [thông số kỹ thuật SSZ](https://github.com/ethereum/consensus-specs/blob/dev/ssz/simple-serialize.md).
+
+### Giải tuần tự hóa {#deserialization}
+
+Để giải tuần tự hóa đối tượng này cần có lược đồ. Lược đồ xác định bố cục chính xác của dữ liệu được tuần tự hóa để mỗi phần tử cụ thể có thể được giải tuần tự hóa từ một blob byte thành một đối tượng có ý nghĩa với các phần tử có đúng loại, giá trị, kích thước và vị trí. Chính lược đồ sẽ cho trình giải tuần tự hóa biết giá trị nào là giá trị thực và giá trị nào là offset. Tất cả các tên trường sẽ biến mất khi một đối tượng được tuần tự hóa, nhưng được khởi tạo lại khi giải tuần tự hóa theo lược đồ.
+
+Xem [ssz.dev](https://www.ssz.dev/overview) để biết giải thích tương tác về vấn đề này.
+
+## Merkle hóa {#merkleization}
+
+Đối tượng được tuần tự hóa SSZ này sau đó có thể được Merkle hóa - tức là được chuyển đổi thành một biểu diễn cây Merkle của cùng một dữ liệu. Đầu tiên, số lượng các đoạn 32 byte trong đối tượng được tuần tự hóa được xác định. Đây là các "lá" của cây. Tổng số lá phải là lũy thừa của 2 để việc băm các lá lại với nhau cuối cùng tạo ra một gốc cây băm duy nhất. Nếu không phải như vậy một cách tự nhiên, các lá bổ sung chứa 32 byte số không sẽ được thêm vào. Theo sơ đồ:
+
+```
+ gốc cây băm
+ / \
+ / \
+ / \
+ / \
+ hàm băm của lá hàm băm của lá
+ 1 và 2 3 và 4
+ / \ / \
+ / \ / \
+ / \ / \
+ lá1 lá2 lá3 lá4
+```
+
+Cũng có những trường hợp các lá của cây không phân bố đều một cách tự nhiên như trong ví dụ trên. Ví dụ, lá 4 có thể là một container với nhiều phần tử yêu cầu thêm "độ sâu" vào cây Merkle, tạo ra một cây không đều.
+
+Thay vì gọi các phần tử cây này là lá X, nút X, v.v., chúng ta có thể đặt cho chúng các chỉ mục tổng quát hóa, bắt đầu với gốc = 1 và đếm từ trái sang phải dọc theo mỗi cấp. Đây là chỉ mục tổng quát hóa được giải thích ở trên. Mỗi phần tử trong danh sách được tuần tự hóa có một chỉ mục tổng quát hóa bằng `2**depth + idx`, trong đó idx là vị trí được đánh chỉ mục từ 0 của nó trong đối tượng được tuần tự hóa và depth là số cấp trong cây Merkle, có thể được xác định bằng logarit cơ số hai của số phần tử (lá).
+
+## Chỉ mục tổng quát hóa {#generalized-indices}
+
+Chỉ mục tổng quát hóa là một số nguyên đại diện cho một nút trong cây Merkle nhị phân, trong đó mỗi nút có một chỉ mục tổng quát hóa là `2 ** depth + index in row`.
+
+```
+ 1 --độ sâu = 0 2**0 + 0 = 1
+ 2 3 --độ sâu = 1 2**1 + 0 = 2, 2**1+1 = 3
+ 4 5 6 7 --độ sâu = 2 2**2 + 0 = 4, 2**2 + 1 = 5...
+
+```
+
+Biểu diễn này tạo ra một chỉ mục nút cho mỗi mẩu dữ liệu trong cây Merkle.
+
+## Đa bằng chứng {#multiproofs}
+
+Việc cung cấp danh sách các chỉ mục tổng quát hóa đại diện cho một phần tử cụ thể cho phép chúng ta xác minh nó với gốc cây băm. Gốc này là phiên bản thực tế được chúng ta chấp nhận. Bất kỳ dữ liệu nào chúng ta được cung cấp đều có thể được xác minh so với thực tế đó bằng cách chèn nó vào đúng vị trí trong cây Merkle (được xác định bởi chỉ mục tổng quát hóa của nó) và quan sát thấy rằng gốc không đổi. Có các hàm trong thông số kỹ thuật [tại đây](https://github.com/ethereum/consensus-specs/blob/dev/ssz/merkle-proofs.md#merkle-multiproofs) chỉ ra cách tính toán tập hợp tối thiểu các nút cần thiết để xác minh nội dung của một tập hợp các chỉ mục tổng quát hóa cụ thể.
+
+Ví dụ, để xác minh dữ liệu ở chỉ mục 9 trong cây bên dưới, chúng ta cần hàm băm của dữ liệu tại các chỉ mục 8, 9, 5, 3, 1.
+Hàm băm của (8,9) phải bằng hàm băm (4), được băm với 5 để tạo ra 2, được băm với 3 để tạo ra gốc cây 1. Nếu dữ liệu không chính xác được cung cấp cho 9, gốc sẽ thay đổi - chúng ta sẽ phát hiện ra điều này và không xác minh được nhánh.
+
+```
+* = dữ liệu cần thiết để tạo bằng chứng
+
+ 1*
+ 2 3*
+ 4 5* 6 7
+8* 9* 10 11 12 13 14 15
+
+```
+
+## Đọc thêm {#further-reading}
+
+- [Nâng cấp Ethereum: SSZ](https://eth2book.info/altair/part2/building_blocks/ssz)
+- [Nâng cấp Ethereum: Merkle hóa](https://eth2book.info/altair/part2/building_blocks/merkleization)
+- [Các triển khai SSZ](https://github.com/ethereum/consensus-specs/issues/2138)
+- [Máy tính SSZ](https://simpleserialize.com/)
+- [SSZ.dev](https://www.ssz.dev/)
diff --git a/public/content/translations/vi/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md b/public/content/translations/vi/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md
new file mode 100644
index 00000000000..d3e822bc774
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md
@@ -0,0 +1,195 @@
+---
+title: Định nghĩa lưu trữ bí mật Web3
+description: Định nghĩa chính thức cho lưu trữ bí mật web3
+lang: vi
+sidebarDepth: 2
+---
+
+Để làm cho ứng dụng của bạn hoạt động trên Ethereum, bạn có thể sử dụng đối tượng web3 được cung cấp bởi thư viện web3.js. Về cơ bản, nó giao tiếp với một nút cục bộ thông qua các lệnh gọi RPC. [web3](https://github.com/ethereum/web3.js/) hoạt động với bất kỳ nút Ethereum nào hiển thị một lớp RPC.
+
+`web3` chứa đối tượng `eth` - 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)
+})
+
+/** kết quả
+ * [ 'web3', 3 ] tệp khóa web3 (v3)
+ * [ 'ethersale', undefined ] tệp khóa Ethersale
+ * null tệp khóa không hợp lệ
+ */
+```
+
+Tài liệu này ghi lại **phiên bản 3** của Định nghĩa Lưu trữ Bí mật Web3.
+
+## Định nghĩa {#definition}
+
+Việc mã hóa và giải mã thực tế của tệp phần lớn không thay đổi so với phiên bản 1, ngoại trừ việc thuật toán mã hóa không còn được cố định là AES-128-CBC (AES-128-CTR hiện là yêu cầu tối thiểu). Hầu hết các ý nghĩa/thuật toán đều tương tự như phiên bản 1, ngoại trừ `mac`, được cho là SHA3 (keccak-256) của các chuỗi nối của 16 byte thứ hai từ bên trái của khóa dẫn xuất cùng với toàn bộ `ciphertext`.
+
+Các tệp khóa bí mật được lưu trữ trực tiếp trong `~/.web3/keystore` (cho các hệ thống tương tự Unix) và `~/AppData/Web3/keystore` (cho Windows). Chúng có thể được đặt tên bất cứ thứ gì, nhưng một quy ước tốt là `.json`, trong đó `` là UUID 128-bit được gán cho khóa bí mật (một proxy bảo vệ quyền riêng tư cho địa chỉ của khóa bí mật).
+
+Tất cả các tệp như vậy đều có một mật khẩu liên quan. Để lấy được khóa bí mật của một tệp `.json` nhất định, đầu tiên hãy lấy khóa mã hóa của tệp; điều này được thực hiện bằng cách lấy mật khẩu của tệp và chuyển nó qua một hàm dẫn xuất khóa như được mô tả bởi khóa `kdf`. Các tham số tĩnh và động phụ thuộc vào KDF cho hàm KDF được mô tả trong khóa `kdfparams`.
+
+PBKDF2 phải được hỗ trợ bởi tất cả các triển khai tuân thủ tối thiểu, được biểu thị qua:
+
+- `kdf`: `pbkdf2`
+
+Đối với PBKDF2, kdfparams bao gồm:
+
+- `prf`: Phải là `hmac-sha256` (có thể được mở rộng trong tương lai);
+- `c`: số lần lặp;
+- `salt`: salt được chuyển đến PBKDF;
+- `dklen`: độ dài cho khóa dẫn xuất. Phải >= 32.
+
+Sau khi khóa của tệp đã được dẫn xuất, nó sẽ được xác minh thông qua việc dẫn xuất MAC. MAC sẽ được tính toán bằng hàm băm SHA3 (keccak-256) của mảng byte được hình thành dưới dạng các chuỗi nối của 16 byte thứ hai từ bên trái của khóa dẫn xuất với nội dung của khóa `ciphertext`, tức là:
+
+```js
+KECCAK(DK[16..31] ++ )
+```
+
+(trong đó `++` là toán tử nối chuỗi)
+
+Giá trị này cần được so sánh với nội dung của khóa `mac`; nếu chúng khác nhau, cần yêu cầu một mật khẩu khác (hoặc hủy bỏ hoạt động).
+
+Sau khi khóa của tệp đã được xác minh, văn bản mã hóa (khóa `ciphertext` trong tệp) có thể được giải mã bằng cách sử dụng thuật toán mã hóa đối xứng được chỉ định bởi khóa `cipher` và được tham số hóa thông qua khóa `cipherparams`. Nếu kích thước khóa dẫn xuất và kích thước khóa của thuật toán không khớp, các byte ngoài cùng bên phải được đệm số không của khóa dẫn xuất sẽ được sử dụng làm khóa cho thuật toán.
+
+Tất cả các triển khai tuân thủ tối thiểu phải hỗ trợ thuật toán AES-128-CTR, được biểu thị qua:
+
+- `cipher: aes-128-ctr`
+
+Mật mã này có các tham số sau, được cung cấp dưới dạng các khóa cho khóa cipherparams:
+
+- `iv`: vectơ khởi tạo 128 bit cho mật mã.
+
+Khóa cho mật mã là 16 byte ngoài cùng bên trái của khóa dẫn xuất, tức là `DK[0..15]`
+
+Việc tạo/mã hóa một khóa bí mật về cơ bản là ngược lại với các hướng dẫn này. Hãy đảm bảo rằng `uuid`, `salt` và `iv` thực sự ngẫu nhiên.
+
+Ngoài trường `version`, vốn đóng vai trò như một định danh "cứng" của phiên bản, các triển khai cũng có thể sử dụng `minorversion` để theo dõi các thay đổi nhỏ hơn, không gây gián đoạn cho định dạng.
+
+## Vectơ thử nghiệm {#test-vectors}
+
+Chi tiết:
+
+- `Địa chỉ`: `008aeeda4d805471df9b2a5b0f38a0c3bcba786b`
+- `ICAP`: `XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67`
+- `UUID`: `3198bc9c-6672-5ab3-d9954942343ae5b6`
+- `Mật khẩu`: `testpassword`
+- `Bí mật`: `7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d`
+
+### PBKDF2-SHA-256 {#PBKDF2-SHA-256}
+
+Vectơ thử nghiệm sử dụng `AES-128-CTR` và `PBKDF2-SHA-256`:
+
+Nội dung tệp của `~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.json`:
+
+```json
+{
+ "crypto": {
+ "cipher": "aes-128-ctr",
+ "cipherparams": {
+ "iv": "6087dab2f9fdbbfaddc31a909735c1e6"
+ },
+ "ciphertext": "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46",
+ "kdf": "pbkdf2",
+ "kdfparams": {
+ "c": 262144,
+ "dklen": 32,
+ "prf": "hmac-sha256",
+ "salt": "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"
+ },
+ "mac": "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2"
+ },
+ "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6",
+ "version": 3
+}
+```
+
+**Các bước trung gian**:
+
+`Khóa dẫn xuất`: `f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551`
+`Phần thân MAC`: `e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46`
+`MAC`: `517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2`
+`Khóa mật mã`: `f06d69cdc7da0faffb1008270bca38f5`
+
+### Scrypt {#scrypt}
+
+Vectơ thử nghiệm sử dụng AES-128-CTR và Scrypt:
+
+```json
+{
+ "crypto": {
+ "cipher": "aes-128-ctr",
+ "cipherparams": {
+ "iv": "740770fce12ce862af21264dab25f1da"
+ },
+ "ciphertext": "dd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2",
+ "kdf": "scrypt",
+ "kdfparams": {
+ "dklen": 32,
+ "n": 262144,
+ "p": 1,
+ "r": 8,
+ "salt": "25710c2ccd7c610b24d068af83b959b7a0e5f40641f0c82daeb1345766191034"
+ },
+ "mac": "337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c"
+ },
+ "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6",
+ "version": 3
+}
+```
+
+**Các bước trung gian**:
+
+`Khóa dẫn xuất`: `7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d`
+`Phần thân MAC`: `edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2`
+`MAC`: `337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c`
+`Khóa mật mã`: `7446f59ecc301d2d79bc3302650d8a5c`
+
+## Những thay đổi so với Phiên bản 1 {#alterations-from-v2}
+
+Phiên bản này sửa một số điểm không nhất quán với phiên bản 1 được xuất bản [tại đây](https://github.com/ethereum/homestead-guide/blob/master/old-docs-for-reference/go-ethereum-wiki.rst/Passphrase-protected-key-store-spec.rst). Tóm lại, chúng là:
+
+- Việc viết hoa không có cơ sở và không nhất quán (scrypt viết thường, Kdf viết hoa/thường, MAC viết hoa).
+- Địa chỉ không cần thiết và làm ảnh hưởng đến quyền riêng tư.
+- `Salt` về bản chất là một tham số của hàm dẫn xuất khóa và xứng đáng được liên kết với nó, chứ không phải với mã hóa nói chung.
+- _SaltLen_ không cần thiết (chỉ cần lấy nó từ Salt).
+- Hàm dẫn xuất khóa được đưa ra, tuy nhiên thuật toán mã hóa lại được chỉ định cứng.
+- `Version` về bản chất là số nhưng lại là một chuỗi (có thể tạo phiên bản có cấu trúc bằng một chuỗi, nhưng có thể coi là nằm ngoài phạm vi đối với một định dạng tệp cấu hình hiếm khi thay đổi).
+- `KDF` và `cipher` về mặt khái niệm là các khái niệm song song tuy nhiên lại được tổ chức khác nhau.
+- `MAC` được tính toán thông qua một mẩu dữ liệu không phân biệt khoảng trắng(!)
+
+Những thay đổi đã được thực hiện đối với định dạng để tạo ra tệp sau, tương đương về mặt chức năng với ví dụ được đưa ra trên trang được liên kết trước đó:
+
+```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
+}
+```
+
+## Những thay đổi so với Phiên bản 2 {#alterations-from-v2}
+
+Phiên bản 2 là một triển khai C++ ban đầu với một số lỗi. Tất cả các yếu tố thiết yếu vẫn không thay đổi so với nó.
diff --git a/public/content/translations/vi/developers/docs/design-and-ux/dex-design-best-practice/index.md b/public/content/translations/vi/developers/docs/design-and-ux/dex-design-best-practice/index.md
new file mode 100644
index 00000000000..2428ead0826
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/design-and-ux/dex-design-best-practice/index.md
@@ -0,0 +1,220 @@
+---
+title: Thực hành tốt nhất về thiết kế sàn giao dịch phi tập trung (DEX)
+description: Hướng dẫn giải thích các quyết định về UX/UI để hoán đổi token.
+lang: vi
+---
+
+Kể từ khi Uniswap ra mắt vào năm 2018, đã có hàng trăm sàn giao dịch phi tập trung được ra mắt trên hàng chục chuỗi khác nhau.
+Nhiều sàn trong số này đã giới thiệu các yếu tố mới hoặc thêm vào những điểm nhấn riêng, nhưng giao diện nhìn chung vẫn giữ nguyên.
+
+Một lý do cho điều này là [Định luật Jakob](https://lawsofux.com/jakobs-law/):
+
+> Người dùng dành phần lớn thời gian của họ trên các trang web khác. Điều này có nghĩa là người dùng thích trang web của bạn hoạt động theo cách tương tự như tất cả các trang web khác mà họ đã biết.
+
+Nhờ những nhà đổi mới ban đầu như Uniswap, Pancakeswap và Sushiswap, người dùng DeFi có một ý tưởng chung về giao diện của một DEX.
+Vì lý do này, một cái gì đó giống như “thực hành tốt nhất” hiện đang xuất hiện. Chúng ta thấy ngày càng có nhiều quyết định thiết kế được tiêu chuẩn hóa trên các trang web. Bạn có thể thấy sự phát triển của các DEX như một ví dụ khổng lồ về việc thử nghiệm trực tiếp. Những thứ hoạt động hiệu quả thì được giữ lại, những thứ không hiệu quả thì bị loại bỏ. Vẫn có không gian cho cá tính, nhưng có những tiêu chuẩn nhất định mà một DEX nên tuân thủ.
+
+Bài viết này là bản tóm tắt về:
+
+- những gì cần bao gồm
+- làm thế nào để nó dễ sử dụng nhất có thể
+- các cách chính để tùy chỉnh thiết kế
+
+Tất cả các wireframe ví dụ đều được tạo riêng cho bài viết này, mặc dù tất cả chúng đều dựa trên các dự án thực tế.
+
+Bộ công cụ Figma cũng được bao gồm ở phía dưới - hãy thoải mái sử dụng nó và tăng tốc các wireframe của riêng bạn!
+
+## Cấu trúc cơ bản của một DEX {#basic-anatomy-of-a-dex}
+
+Giao diện người dùng thường chứa ba thành phần:
+
+1. Biểu mẫu chính
+2. Nút
+3. Bảng chi tiết
+
+
+
+## Các biến thể {#variations}
+
+Đây sẽ là một chủ đề chung trong bài viết này, nhưng có nhiều cách khác nhau để các thành phần này có thể được sắp xếp. “Bảng chi tiết” có thể là:
+
+- Phía trên nút
+- Phía dưới nút
+- Ẩn trong một bảng accordion
+- Và/hoặc trên cửa sổ “xem trước”
+
+Lưu ý: Cửa sổ “xem trước” là tùy chọn, nhưng nếu bạn hiển thị rất ít chi tiết trên giao diện người dùng chính, nó sẽ trở nên cần thiết.
+
+## Cấu trúc của biểu mẫu chính {#structure-of-the-main-form}
+
+Đây là hộp nơi bạn thực sự chọn loại token bạn muốn hoán đổi. Thành phần bao gồm một trường nhập liệu và một nút nhỏ trong một hàng.
+
+Các DEX thường hiển thị các chi tiết bổ sung ở một hàng phía trên và một hàng phía dưới, mặc dù điều này có thể được định cấu hình khác nhau.
+
+
+
+## Các biến thể {#variations2}
+
+Hai biến thể giao diện người dùng được hiển thị ở đây; một biến thể không có đường viền, tạo ra một thiết kế rất mở và một biến thể trong đó hàng nhập liệu có đường viền, tạo sự tập trung vào thành phần đó.
+
+
+
+Cấu trúc cơ bản này cho phép **bốn thông tin quan trọng** được hiển thị trong thiết kế: một ở mỗi góc. Nếu chỉ có một hàng trên/dưới, thì chỉ có hai vị trí.
+
+Trong quá trình phát triển của DeFi, rất nhiều thứ khác nhau đã được đưa vào đây.
+
+## Thông tin chính cần bao gồm {#key-info-to-include}
+
+- Số dư trong ví
+- Nút Tối đa
+- Giá trị tương đương bằng tiền pháp định
+- Tác động giá đối với số tiền “nhận được”
+
+Trong những ngày đầu của DeFi, giá trị tương đương bằng tiền pháp định thường bị thiếu. Nếu bạn đang xây dựng bất kỳ loại dự án Web3 nào, điều cần thiết là phải hiển thị giá trị tương đương bằng tiền pháp định. Người dùng vẫn suy nghĩ theo đơn vị tiền tệ địa phương, vì vậy để phù hợp với các mô hình tư duy trong thế giới thực, điều này nên được bao gồm.
+
+Trên trường thứ hai (nơi bạn chọn token mà bạn đang hoán đổi sang), bạn cũng có thể bao gồm tác động giá bên cạnh số tiền pháp định, bằng cách tính toán sự khác biệt giữa số tiền nhập vào và số tiền đầu ra ước tính. Đây là một chi tiết khá hữu ích để bao gồm.
+
+Các nút phần trăm (ví dụ: 25%, 50%, 75%) có thể là một tính năng hữu ích, nhưng chúng chiếm nhiều không gian hơn, thêm nhiều lời kêu gọi hành động hơn và tăng thêm gánh nặng tinh thần. Tương tự với thanh trượt phần trăm. Một số quyết định về giao diện người dùng này sẽ phụ thuộc vào thương hiệu và loại người dùng của bạn.
+
+Các chi tiết bổ sung có thể được hiển thị bên dưới biểu mẫu chính. Vì loại thông tin này chủ yếu dành cho người dùng chuyên nghiệp, nên có thể:
+
+- giữ nó ở mức tối thiểu nhất có thể, hoặc;
+- ẩn nó trong một bảng accordion
+
+
+
+## Thông tin bổ sung cần bao gồm {#extra-info-to-include}
+
+- Giá Token
+- Trượt giá
+- Số tiền tối thiểu nhận được
+- Đầu ra dự kiến
+- Tác động giá
+- Ước tính chi phí gas
+- Các khoản phí khác
+- Định tuyến lệnh
+
+Có thể cho rằng, một số chi tiết này có thể là tùy chọn.
+
+Định tuyến lệnh rất thú vị, nhưng không tạo ra nhiều khác biệt cho hầu hết người dùng.
+
+Một số chi tiết khác chỉ đơn giản là trình bày lại cùng một thứ theo những cách khác nhau. Ví dụ, “số tiền tối thiểu nhận được” và “trượt giá” là hai mặt của cùng một vấn đề. Nếu bạn đặt mức trượt giá là 1%, thì số tiền tối thiểu bạn có thể nhận được = đầu ra dự kiến-1%. Một số giao diện người dùng sẽ hiển thị số tiền dự kiến, số tiền tối thiểu và độ trượt giá… Điều này hữu ích nhưng có thể là thừa thãi.
+
+Hầu hết người dùng dù sao cũng sẽ để mặc định độ trượt giá.
+
+“Tác động giá” thường được hiển thị trong ngoặc đơn bên cạnh giá trị tương đương bằng tiền pháp định trong trường “đến”. Đây là một chi tiết ux tuyệt vời để thêm vào, nhưng nếu nó đã được hiển thị ở đây, liệu có thực sự cần phải hiển thị lại ở bên dưới không? Và sau đó lại một lần nữa trên màn hình xem trước?
+
+Nhiều người dùng (đặc biệt là những người hoán đổi số lượng nhỏ) sẽ không quan tâm đến những chi tiết này; họ sẽ chỉ cần nhập một số và nhấn hoán đổi.
+
+
+
+Chính xác những chi tiết nào được hiển thị sẽ phụ thuộc vào đối tượng của bạn và cảm giác bạn muốn ứng dụng mang lại.
+
+Nếu bạn bao gồm mức chịu trượt giá trong bảng chi tiết, bạn cũng nên làm cho nó có thể chỉnh sửa trực tiếp từ đây. Đây là một ví dụ điển hình về một “trình tăng tốc”; một mẹo UX gọn gàng có thể tăng tốc quy trình của người dùng có kinh nghiệm mà không ảnh hưởng đến khả năng sử dụng chung của ứng dụng.
+
+
+
+Bạn nên suy nghĩ cẩn thận không chỉ về một thông tin cụ thể trên một màn hình, mà về toàn bộ luồng:
+Nhập số trong Biểu mẫu chính → Quét chi tiết → Nhấp vào Màn hình xem trước (nếu bạn có màn hình xem trước).
+Bảng chi tiết có nên hiển thị mọi lúc không, hay người dùng cần nhấp vào để mở rộng?
+Bạn có nên tạo ra sự cản trở bằng cách thêm màn hình xem trước không? Điều này buộc người dùng phải chậm lại và cân nhắc giao dịch của họ, điều này có thể hữu ích. Nhưng liệu họ có muốn xem lại tất cả các thông tin giống nhau không? Điều gì là hữu ích nhất cho họ tại thời điểm này?
+
+## Tùy chọn thiết kế {#design-options}
+
+Như đã đề cập, phần lớn điều này phụ thuộc vào phong cách cá nhân của bạn
+Người dùng của bạn là ai?
+Thương hiệu của bạn là gì?
+Bạn muốn một giao diện “chuyên nghiệp” hiển thị mọi chi tiết, hay bạn muốn tối giản?
+Ngay cả khi bạn đang nhắm đến những người dùng chuyên nghiệp muốn có tất cả thông tin có thể, bạn vẫn nên nhớ những lời khôn ngoan của Alan Cooper:
+
+> Dù giao diện của bạn đẹp đến đâu, dù tuyệt vời đến đâu, sẽ tốt hơn nếu nó ít hơn.
+
+### Cấu trúc {#structure}
+
+- token ở bên trái, hoặc token ở bên phải
+- 2 hàng hoặc 3
+- chi tiết ở trên hoặc dưới nút
+- chi tiết được mở rộng, thu nhỏ hoặc không hiển thị
+
+### Kiểu thành phần {#component-style}
+
+- trống
+- có đường viền
+- được điền
+
+Từ quan điểm UX thuần túy, kiểu giao diện người dùng ít quan trọng hơn bạn nghĩ. Các xu hướng hình ảnh đến và đi theo chu kỳ, và rất nhiều sở thích là chủ quan.
+
+Cách dễ nhất để cảm nhận điều này - và suy nghĩ về các cấu hình khác nhau - là xem một số ví dụ và sau đó tự mình thử nghiệm.
+
+Bộ công cụ Figma đi kèm chứa các thành phần trống, có đường viền và được điền.
+
+Hãy xem các ví dụ dưới đây để thấy các cách khác nhau mà bạn có thể kết hợp tất cả chúng lại với nhau:
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Nhưng token nên ở bên nào? {#but-which-side-should-the-token-go-on}
+
+Điểm mấu chốt là nó có lẽ không tạo ra sự khác biệt lớn đối với khả năng sử dụng. Tuy nhiên, có một vài điều cần lưu ý, có thể khiến bạn nghiêng về một bên hoặc bên kia.
+
+Thật thú vị khi thấy xu hướng thay đổi theo thời gian. Uniswap ban đầu đặt token ở bên trái, nhưng sau đó đã chuyển nó sang bên phải. Sushiswap cũng đã thực hiện thay đổi này trong một lần nâng cấp thiết kế. Hầu hết, nhưng không phải tất cả, các giao thức đã làm theo.
+
+Quy ước tài chính truyền thống đặt ký hiệu tiền tệ trước con số, ví dụ: $50, €50, £50, nhưng chúng ta _nói_ 50 đô la, 50 Euro, 50 bảng Anh.
+
+Đối với người dùng phổ thông - đặc biệt là người đọc từ trái sang phải, từ trên xuống dưới - việc đặt token ở bên phải có lẽ sẽ cảm thấy tự nhiên hơn.
+
+
+
+Đặt token ở bên trái và tất cả các con số ở bên phải trông đối xứng một cách dễ chịu, đó là một điểm cộng, nhưng có một nhược điểm khác đối với bố cục này.
+
+Quy luật về sự gần gũi nói rằng các mục ở gần nhau được coi là có liên quan. Theo đó, chúng ta muốn đặt các mục liên quan cạnh nhau. Số dư token liên quan trực tiếp đến chính token đó và sẽ thay đổi bất cứ khi nào một token mới được chọn. Do đó, việc số dư token nằm cạnh nút chọn token sẽ hợp lý hơn một chút. Nó có thể được di chuyển xuống dưới token, nhưng điều đó phá vỡ tính đối xứng của bố cục.
+
+Cuối cùng, có những ưu và nhược điểm cho cả hai lựa chọn, nhưng điều thú vị là xu hướng dường như đang hướng về việc đặt token ở bên phải.
+
+## Hành vi của nút {#button-behavior}
+
+Đừng tạo một nút riêng cho Phê duyệt. Cũng đừng có một cú nhấp riêng cho Phê duyệt. Người dùng muốn Hoán đổi, vì vậy chỉ cần ghi “hoán đổi” trên nút và bắt đầu quá trình phê duyệt như bước đầu tiên. Một cửa sổ có thể hiển thị tiến trình bằng một trình theo bước, hoặc một thông báo đơn giản “tx 1 của 2 - đang phê duyệt”.
+
+
+
+
+
+### Nút như trợ giúp theo ngữ cảnh {#button-as-contextual-help}
+
+Nút có thể thực hiện nhiệm vụ kép như một cảnh báo!
+
+Đây thực sự là một mẫu thiết kế khá bất thường bên ngoài Web3, nhưng đã trở thành tiêu chuẩn bên trong nó. Đây là một sự đổi mới tốt vì nó tiết kiệm không gian và giữ sự chú ý tập trung.
+
+Nếu hành động chính - HOÁN ĐỔI - không khả dụng do lỗi, lý do có thể được giải thích bằng nút, ví dụ:
+
+- chuyển mạng
+- kết nối ví
+- các lỗi khác nhau
+
+Nút cũng có thể được **ánh xạ tới hành động** cần được thực hiện. Ví dụ: nếu người dùng không thể hoán đổi vì họ đang ở sai mạng, nút sẽ hiển thị “chuyển sang Ethereum” và khi người dùng nhấp vào nút, nó sẽ chuyển mạng sang Ethereum. Điều này tăng tốc đáng kể luồng người dùng.
+
+
+
+
+
+## Tự xây dựng với tệp figma này {#build-your-own-with-this-figma-file}
+
+Nhờ sự làm việc chăm chỉ của nhiều giao thức, thiết kế DEX đã được cải thiện rất nhiều. Chúng tôi biết người dùng cần thông tin gì, cách chúng tôi nên hiển thị nó và cách làm cho luồng trở nên mượt mà nhất có thể.
+Hy vọng bài viết này cung cấp một cái nhìn tổng quan vững chắc về các nguyên tắc UX.
+
+Nếu bạn muốn thử nghiệm, vui lòng sử dụng bộ wireframe Figma. Nó được giữ đơn giản nhất có thể, nhưng có đủ tính linh hoạt để xây dựng cấu trúc cơ bản theo nhiều cách khác nhau.
+
+[Bộ wireframe Figma](https://www.figma.com/community/file/1393606680816807382/dex-wireframes-kit)
+
+DeFi sẽ tiếp tục phát triển và luôn có chỗ để cải thiện.
+
+Chúc may mắn!
diff --git a/public/content/translations/vi/developers/docs/design-and-ux/heuristics-for-web3/index.md b/public/content/translations/vi/developers/docs/design-and-ux/heuristics-for-web3/index.md
new file mode 100644
index 00000000000..48a583b85b8
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/design-and-ux/heuristics-for-web3/index.md
@@ -0,0 +1,138 @@
+---
+title: 7 quy tắc kinh nghiệm cho thiết kế giao diện Web3
+description: Các nguyên tắc để cải thiện khả năng sử dụng của Web3
+lang: vi
+---
+
+Các quy tắc kinh nghiệm về khả năng sử dụng là những “quy tắc chung” rộng mà bạn có thể sử dụng để đo lường khả năng sử dụng của trang web của mình.
+7 quy tắc kinh nghiệm ở đây được thiết kế riêng cho Web3 và nên được sử dụng cùng với [10 nguyên tắc chung về thiết kế tương tác](https://www.nngroup.com/articles/ten-usability-heuristics/) của Jakob Nielsen.
+
+## Bảy quy tắc kinh nghiệm về khả năng sử dụng cho web3 {#seven-usability-heuristics-for-web3}
+
+1. Phản hồi theo sau hành động
+2. Bảo mật và tin cậy
+3. Thông tin quan trọng nhất phải rõ ràng
+4. Thuật ngữ dễ hiểu
+5. Các hành động càng ngắn càng tốt
+6. Kết nối mạng được hiển thị rõ và linh hoạt
+7. Điều khiển từ ứng dụng, không phải từ ví
+
+## Định nghĩa và ví dụ {#definitions-and-examples}
+
+### 1. Phản hồi theo sau hành động {#feedback-follows-action}
+
+**Phải rõ ràng khi có điều gì đó đã xảy ra, hoặc đang xảy ra.**
+
+Người dùng quyết định các bước tiếp theo dựa trên kết quả của các bước trước đó. Do đó, điều cần thiết là họ phải được thông báo về trạng thái hệ thống. Điều này đặc biệt quan trọng trong Web3 vì các giao dịch đôi khi có thể mất một khoảng thời gian ngắn để được xác nhận vào chuỗi khối. Nếu không có phản hồi thông báo cho họ chờ đợi, người dùng sẽ không chắc liệu có điều gì đã xảy ra hay không.
+
+**Mẹo:**
+
+- Thông báo cho người dùng thông qua tin nhắn, thông báo và các cảnh báo khác.
+- Thông báo thời gian chờ đợi một cách rõ ràng.
+- Nếu một hành động mất nhiều hơn vài giây, hãy trấn an người dùng bằng đồng hồ đếm giờ hoặc hoạt ảnh để họ cảm thấy như có điều gì đó đang xảy ra.
+- Nếu một quy trình có nhiều bước, hãy hiển thị từng bước.
+
+**Ví dụ:**
+Hiển thị từng bước liên quan đến một giao dịch giúp người dùng biết họ đang ở đâu trong quy trình. Các biểu tượng phù hợp cho người dùng biết trạng thái hành động của họ.
+
+
+
+### 2. Bảo mật và tin cậy được tích hợp sẵn {#security-and-trust-are-backed-in}
+
+Bảo mật nên được ưu tiên và điều này nên được nhấn mạnh cho người dùng.
+Mọi người rất quan tâm đến dữ liệu của họ. An toàn thường là mối quan tâm hàng đầu của người dùng, vì vậy nó cần được xem xét ở mọi cấp độ của thiết kế. Bạn nên luôn tìm cách giành được sự tin tưởng của người dùng, nhưng cách bạn làm điều này có thể có ý nghĩa khác nhau trên các ứng dụng khác nhau. Nó không nên là một sự suy tính sau, mà nên được thiết kế một cách có ý thức xuyên suốt. Xây dựng niềm tin trong suốt trải nghiệm người dùng, bao gồm các kênh xã hội và tài liệu tham khảo, cũng như giao diện người dùng cuối cùng. Những thứ như mức độ phi tập trung, trạng thái đa chữ ký của ngân quỹ và liệu nhóm có được tiết lộ danh tính hay không, tất cả đều ảnh hưởng đến niềm tin của người dùng
+
+**Mẹo:**
+
+- Tự hào liệt kê các cuộc kiểm toán của bạn
+- Thực hiện nhiều cuộc kiểm toán
+- Quảng cáo bất kỳ tính năng an toàn nào mà bạn đã thiết kế
+- Nêu bật các rủi ro có thể xảy ra, bao gồm cả các tích hợp cơ bản
+- Thông báo về sự phức tạp của các chiến lược
+- Xem xét các vấn đề không liên quan đến giao diện người dùng có thể ảnh hưởng đến nhận thức của người dùng về sự an toàn
+
+**Ví dụ:**
+Bao gồm các cuộc kiểm toán của bạn ở phần chân trang, với kích thước nổi bật.
+
+
+
+### 3. Thông tin quan trọng nhất phải rõ ràng {#the-most-important-info-is-obvious}
+
+Đối với các hệ thống phức tạp, chỉ hiển thị dữ liệu phù hợp nhất. Xác định điều gì là quan trọng nhất và ưu tiên hiển thị nó.
+Quá nhiều thông tin sẽ gây choáng ngợp và người dùng thường chỉ tập trung vào một phần thông tin khi đưa ra quyết định. Trong DeFi, đây có thể sẽ là APR trên các ứng dụng lợi suất và LTV trên các ứng dụng cho vay.
+
+**Mẹo:**
+
+- Nghiên cứu người dùng sẽ khám phá ra chỉ số quan trọng nhất
+- Làm cho thông tin chính lớn, và các chi tiết khác nhỏ và không phô trương
+- Mọi người không đọc, họ quét; hãy đảm bảo thiết kế của bạn có thể quét được
+
+**Ví dụ:** Các token lớn có đầy đủ màu sắc rất dễ tìm thấy khi quét. APR được làm lớn và được tô sáng bằng màu nhấn.
+
+
+
+### 4. Thuật ngữ rõ ràng {#clear-terminology}
+
+Thuật ngữ phải dễ hiểu và phù hợp.
+Biệt ngữ kỹ thuật có thể là một trở ngại lớn, vì nó đòi hỏi việc xây dựng một mô hình tư duy hoàn toàn mới. Người dùng không thể liên hệ thiết kế với các từ, cụm từ và khái niệm mà họ đã biết. Mọi thứ dường như khó hiểu và xa lạ, và có một đường cong học tập dốc đứng trước khi họ có thể cố gắng sử dụng nó. Một người dùng có thể tiếp cận DeFi muốn tiết kiệm một số tiền, và những gì họ tìm thấy là: Khai thác, farming, đặt cược, emissions, bribes, vaults, lockers, veTokens, vesting, epoch, thuật toán phi tập trung, thanh khoản thuộc sở hữu của giao thức…
+Cố gắng sử dụng các thuật ngữ đơn giản sẽ được hiểu bởi nhóm người rộng nhất. Đừng phát minh ra các thuật ngữ hoàn toàn mới chỉ cho dự án của bạn.
+
+**Mẹo:**
+
+- Sử dụng thuật ngữ đơn giản và nhất quán
+- Sử dụng ngôn ngữ hiện có càng nhiều càng tốt
+- Đừng tự đặt ra các thuật ngữ của riêng bạn
+- Tuân theo các quy ước khi chúng xuất hiện
+- Giáo dục người dùng càng nhiều càng tốt
+
+**Ví dụ:**
+“Phần thưởng của bạn” là một thuật ngữ trung lập, được hiểu rộng rãi; không phải là một từ mới được tạo ra cho dự án này. Các phần thưởng được định giá bằng USD để phù hợp với các mô hình tư duy trong thế giới thực, ngay cả khi bản thân các phần thưởng đó ở dạng một token khác.
+
+
+
+### 5. Các hành động càng ngắn càng tốt {#actions-are-as-short-as-possible}
+
+Tăng tốc độ tương tác của người dùng bằng cách nhóm các hành động phụ.
+Điều này có thể được thực hiện ở cấp độ hợp đồng thông minh, cũng như giao diện người dùng. Người dùng không cần phải di chuyển từ phần này của hệ thống sang phần khác – hoặc rời khỏi hệ thống hoàn toàn – để hoàn thành một hành động thông thường.
+
+**Mẹo:**
+
+- Kết hợp "Phê duyệt" với các hành động khác nếu có thể
+- Gói các bước ký càng gần nhau càng tốt
+
+**Ví dụ:** Kết hợp “thêm thanh khoản” và “đặt cược” là một ví dụ đơn giản về một trình tăng tốc giúp người dùng tiết kiệm cả thời gian và gas.
+
+
+
+### 6. Kết nối mạng được hiển thị rõ và linh hoạt {#network-connections-are-visible-and-flexible}
+
+Thông báo cho người dùng về mạng họ đang kết nối và cung cấp các phím tắt rõ ràng để thay đổi mạng.
+Điều này đặc biệt quan trọng trên các ứng dụng đa chuỗi. Các chức năng chính của ứng dụng vẫn phải được hiển thị khi bị ngắt kết nối hoặc kết nối với một mạng không được hỗ trợ.
+
+**Mẹo:**
+
+- Hiển thị càng nhiều phần của ứng dụng càng tốt khi bị ngắt kết nối
+- Hiển thị mạng mà người dùng hiện đang kết nối
+- Đừng bắt người dùng phải vào ví để đổi mạng
+- Nếu ứng dụng yêu cầu người dùng chuyển mạng, hãy nhắc hành động từ lời kêu gọi hành động chính
+- Nếu ứng dụng chứa các thị trường hoặc hầm cho nhiều mạng, hãy nêu rõ người dùng hiện đang xem bộ nào
+
+**Ví dụ:** Hiển thị cho người dùng mạng mà họ đang kết nối và cho phép họ thay đổi mạng đó trên thanh ứng dụng.
+
+
+
+### 7. Điều khiển từ ứng dụng, không phải từ ví {#control-from-the-app-not-the-wallet}
+
+Giao diện người dùng nên cho người dùng biết mọi thứ họ cần biết và cho họ quyền kiểm soát mọi thứ họ cần làm.
+Trong Web3, có những hành động bạn thực hiện trong giao diện người dùng và những hành động bạn thực hiện trong ví. Nói chung, bạn bắt đầu một hành động trong giao diện người dùng và sau đó xác nhận nó trong ví. Người dùng có thể cảm thấy không thoải mái nếu hai luồng này không được tích hợp cẩn thận.
+
+**Mẹo:**
+
+- Thông báo trạng thái hệ thống qua phản hồi trong giao diện người dùng
+- Lưu giữ hồ sơ lịch sử của họ
+- Cung cấp liên kết đến các trình duyệt khối cho các giao dịch cũ
+- Cung cấp các phím tắt để thay đổi mạng.
+
+**Ví dụ:** Một vùng chứa tinh tế cho người dùng thấy những token có liên quan mà họ có trong ví của mình và CTA chính cung cấp một lối tắt để thay đổi mạng.
+
+
diff --git a/public/content/translations/vi/developers/docs/design-and-ux/index.md b/public/content/translations/vi/developers/docs/design-and-ux/index.md
new file mode 100644
index 00000000000..694383ab39e
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/design-and-ux/index.md
@@ -0,0 +1,86 @@
+---
+title: Thiết kế và UX trong web3
+description: Giới thiệu về thiết kế và nghiên cứu UX trong không gian web3 và Ethereum
+lang: vi
+---
+
+Bạn mới làm quen với việc thiết kế với Ethereum? Đây là nơi phù hợp cho bạn. Cộng đồng Ethereum đã biên soạn các tài nguyên để giới thiệu cho bạn những kiến thức cơ bản về thiết kế và nghiên cứu web3. Bạn sẽ tìm hiểu về các khái niệm cốt lõi có thể khác với các thiết kế ứng dụng khác mà bạn đã quen thuộc.
+
+Bạn có cần tìm hiểu kiến thức cơ bản hơn về web3 trước không? Hãy xem [**trung tâm Tìm hiểu**](/learn/).
+
+## Bắt đầu với nghiên cứu người dùng {#start-with-user-research}
+
+Thiết kế hiệu quả không chỉ dừng lại ở việc tạo ra các giao diện người dùng hấp dẫn về mặt hình ảnh. Nó bao gồm việc hiểu biết sâu sắc về nhu cầu, mục tiêu và các yếu tố thúc đẩy của người dùng. Do đó, chúng tôi đặc biệt khuyến nghị tất cả các nhà thiết kế áp dụng một quy trình thiết kế, chẳng hạn như [**quy trình kim cương kép**](https://en.wikipedia.org/wiki/Double_Diamond_\(design_process_model\)), để đảm bảo rằng công việc của họ là có chủ đích và mục tiêu rõ ràng.
+
+- [Web3 cần thêm các Nhà nghiên cứu và Nhà thiết kế UX](https://blog.akasha.org/akasha-conversations-9-web3-needs-more-ux-researchers-and-designers) - Tổng quan về mức độ trưởng thành của thiết kế hiện tại
+- [Hướng dẫn đơn giản về Nghiên cứu UX trong web3](https://uxplanet.org/a-complete-guide-to-ux-research-for-web-3-0-products-d6bead20ebb1) - Hướng dẫn đơn giản về cách thực hiện nghiên cứu
+- [Cách tiếp cận các quyết định UX trong Web3](https://archive.devcon.org/archive/watch/6/data-empathy-how-to-approach-ux-decisions-in-web3/) - Tổng quan ngắn gọn về nghiên cứu định lượng và định tính cũng như sự khác biệt giữa hai loại (video, 6 phút)
+- [Trở thành một nhà nghiên cứu UX trong web3](https://medium.com/@georgia.rakusen/what-its-like-being-a-user-researcher-in-web3-6a4bcc096849) - Quan điểm cá nhân về việc trở thành một nhà nghiên cứu UX trong web3
+
+## Các nghiên cứu trong web3 {#research-in-web3}
+
+Đây là danh sách tuyển chọn các nghiên cứu người dùng được thực hiện trong web3 có thể giúp ích cho các quyết định về thiết kế và sản phẩm hoặc là nguồn cảm hứng để thực hiện nghiên cứu của riêng bạn.
+
+| Lĩnh vực tập trung | Họ tên |
+| :-------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Giới thiệu về tiền mã hóa | [The Reown Pulse 2024: Tâm lý & Cách sử dụng của người tiêu dùng tiền mã hóa](https://reown.com/blog/unveiling-walletconnects-consumer-crypto-report) |
+| Giới thiệu về tiền mã hóa | [CRADL: UX trong Tiền mã hóa](https://docs.google.com/presentation/d/1s2OPSH5sMJzxRYaJSSRTe8W2iIoZx0PseIV-WeZWD1s/edit?usp=sharing) |
+| Giới thiệu về tiền mã hóa | [CRADL: Giới thiệu về Tiền mã hóa](https://docs.google.com/presentation/d/1R9nFuzA-R6SxaGCKhoMbE4Vxe0JxQSTiHXind3LVq_w/edit?usp=sharing) |
+| Giới thiệu về tiền mã hóa | [Báo cáo UX của Bitcoin](https://github.com/patestevao/BitcoinUX-report/blob/master/report.md) |
+| Giới thiệu về tiền mã hóa | [ConSensys: Trạng thái nhận thức về Web3 trên toàn thế giới năm 2023](https://consensys.io/insight-report/web3-and-crypto-global-survey-2023) |
+| Giới thiệu về tiền mã hóa | [NEAR: Tăng tốc hành trình hướng tới sự chấp nhận](https://drive.google.com/file/d/1VuaQP4QSaQxR5ddQKTMGI0b0rWdP7uGn/view) |
+| Cổ phần | [OpenUX: UX của nhà vận hành nút Rocket Pool](https://storage.googleapis.com/rocketpool/RocketPool-NodeOperator-UX-Report-Jan-2024.pdf) |
+| Cổ phần | [Cổ phần: Các xu hướng chính, điểm chính và dự đoán - Người tham gia cổ phần Eth](https://lookerstudio.google.com/u/0/reporting/cafcee00-e1af-4148-bae8-442a88ac75fa/page/p_ja2srdhh2c?s=hmbTWDh9hJo) |
+| Cổ phần | [Cổ phần nhiều ứng dụng](https://github.com/threshold-network/UX-User-Research/blob/main/Multi-App%20Staking%20\(MAS\)/iterative-user-study/MAS%20Iterative%20User%20Study.pdf) |
+| DAO | [Cập nhật Nghiên cứu DAO 2022: Nhà xây dựng DAO cần gì?](https://blog.aragon.org/2022-dao-research-update/) |
+| DeFi | [Nhóm bảo hiểm](https://github.com/threshold-network/UX-User-Research/tree/main/Keep%20Coverage%20Pool) |
+| DeFi | [ConSensys: Báo cáo Nghiên cứu Người dùng DeFi năm 2022](https://cdn2.hubspot.net/hubfs/4795067/ConsenSys%20Codefi-Defi%20User%20ResearchReport.pdf) |
+| Metaverse | [Metaverse: Báo cáo Nghiên cứu Người dùng](https://www.politico.com/f/?id=00000187-7685-d820-a7e7-7e85d1420000) |
+| Metaverse | [Đi Safari: Nghiên cứu người dùng trong Metaverse](https://archive.devcon.org/archive/watch/6/going-on-safari-researching-users-in-the-metaverse/?tab=YouTube) (video, 27 phút) |
+
+## Thiết kế cho web3 {#design-for-web3}
+
+- [Sổ tay thiết kế UX cho Web3](https://web3ux.design/) - Hướng dẫn thực tế để thiết kế các ứng dụng Web3
+- [Các nguyên tắc thiết kế Web3](https://medium.com/@lyricalpolymath/web3-design-principles-f21db2f240c1) - Một khuôn khổ các quy tắc UX cho các ứng dụng phi tập trung dựa trên chuỗi khối
+- [Các nguyên tắc thiết kế chuỗi khối](https://medium.com/design-ibm/blockchain-design-principles-599c5c067b6e) - Những bài học được rút ra bởi nhóm thiết kế chuỗi khối tại IBM
+- [Neueux.com](https://neueux.com/apps) - Thư viện giao diện người dùng của các luồng người dùng với nhiều tùy chọn lọc đa dạng
+- [Khủng hoảng về khả năng sử dụng của Web3: Những điều bạn CẦN biết!](https://www.youtube.com/watch?v=oBSXT_6YDzg) - Một cuộc thảo luận nhóm về những cạm bẫy của việc xây dựng dự án tập trung vào nhà phát triển (video, 34 phút)
+
+## Bắt đầu {#getting-started}
+
+- [Phương pháp phỏng đoán cho Web3](/developers/docs/design-and-ux/heuristics-for-web3/) - 7 phương pháp phỏng đoán cho thiết kế giao diện Web3
+- [Các phương pháp tốt nhất để thiết kế sàn giao dịch phi tập trung (DEX)](/developers/docs/design-and-ux/dex-design-best-practice/) - Hướng dẫn thiết kế các sàn giao dịch phi tập trung
+
+## Các trường hợp điển hình về thiết kế Web3 {#design-case-studies}
+
+- [Deep Work Studio](https://www.deepwork.studio/case-studies)
+- [Bán NFT trên OpenSea](https://builtformars.com/case-studies/opensea)
+- [Phân tích UX ví, cách các ví cần thay đổi](https://www.youtube.com/watch?v=oTpuxYj8JWI&ab_channel=ETHDenver) (video, 20 phút)
+
+## Tiền thưởng thiết kế {#bounties}
+
+- [Dework](https://app.dework.xyz/bounties)
+- [Các cuộc thi hackathon của Buildbox](https://app.buidlbox.io/)
+- [Các cuộc thi hackathon của ETHGlobal](https://ethglobal.com/)
+
+## Các DAO và cộng đồng thiết kế {#design-daos-and-communities}
+
+Tham gia vào các tổ chức chuyên nghiệp do cộng đồng điều hành hoặc tham gia các nhóm thiết kế để thảo luận về các chủ đề và xu hướng liên quan đến thiết kế và nghiên cứu với các thành viên khác.
+
+- [Vectordao.com](https://vectordao.com/)
+- [Deepwork.studio](https://www.deepwork.studio/)
+- [We3.co](https://we3.co/)
+- [Openux.xyz](https://openux.xyz/)
+
+## Các hệ thống thiết kế và các tài nguyên thiết kế khác {#design-systems-and-resources}
+
+- [Thiết kế Optimism](https://www.figma.com/@optimism) (Figma)
+- [Hệ thống thiết kế Ethereum.org](https://www.figma.com/@ethdotorg) (Figma)
+- [Finity, một hệ thống thiết kế của Polygon](https://www.figma.com/community/file/1073921725197233598/finity-design-system) (Figma)
+- [Hệ thống thiết kế Kleros](https://www.figma.com/community/file/999852250110186964/kleros-design-system) (Figma)
+- [Hệ thống thiết kế Safe](https://www.figma.com/community/file/1337417127407098506/safe-design-system) (Figma)
+- [Hệ thống thiết kế ENS](https://thorin.ens.domains/)
+- [Hệ thống thiết kế Mirror](https://degen-xyz.vercel.app/)
+
+**Các bài viết và dự án được niêm yết trên trang này không phải là sự chứng thực chính thức** và chỉ được cung cấp cho mục đích thông tin.
+Chúng tôi thêm các liên kết vào trang này dựa trên các tiêu chí trong [chính sách niêm yết](/contributing/design/adding-design-resources) của chúng tôi. Nếu bạn muốn chúng tôi thêm một dự án/bài viết, hãy chỉnh sửa trang này trên [GitHub](https://github.com/ethereum/ethereum-org-website/blob/dev/public/content/developers/docs/design-and-ux/index.md).
diff --git a/public/content/translations/vi/developers/docs/development-networks/index.md b/public/content/translations/vi/developers/docs/development-networks/index.md
new file mode 100644
index 00000000000..c20d20c9c46
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/development-networks/index.md
@@ -0,0 +1,71 @@
+---
+title: Mạng lưới phát triển
+description: Tổng quan về mạng lưới phát triển và các công cụ sẵn có để giúp xây dựng các ứng dụng Ethereum.
+lang: vi
+---
+
+Khi xây dựng một ứng dụng Ethereum với hợp đồng thông minh, bạn sẽ muốn chạy nó trên mạng cục bộ để xem nó hoạt động như thế nào trước khi triển khai.
+
+Tương tự như cách bạn có thể chạy một máy chủ cục bộ trên máy tính của mình để phát triển web, bạn có thể sử dụng mạng phát triển để tạo một phiên bản chuỗi khối cục bộ nhằm kiểm tra ứng dụng phi tập trung của mình. Các mạng phát triển Ethereum này cung cấp các tính năng cho phép lặp lại nhanh hơn nhiều so với một mạng thử nghiệm công khai (ví dụ: bạn không cần phải xoay sở để có được ETH từ một vòi mạng thử nghiệm).
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên hiểu những [kiến thức cơ bản về ngăn xếp Ethereum](/developers/docs/ethereum-stack/) và [mạng Ethereum](/developers/docs/networks/) trước khi đi sâu vào mạng phát triển.
+
+## Mạng lưới phát triển là gì? {#what-is-a-development-network}
+
+Mạng phát triển thực chất là các máy khách Ethereum (các bản triển khai của Ethereum) được thiết kế đặc biệt cho việc phát triển cục bộ.
+
+**Tại sao không chỉ chạy một nút Ethereum tiêu chuẩn cục bộ?**
+
+Bạn _có thể_ [chạy một nút](/developers/docs/nodes-and-clients/#running-your-own-node) nhưng vì các mạng phát triển được xây dựng có mục đích để phát triển, chúng thường đi kèm với các tính năng tiện lợi như:
+
+- Tạo dữ liệu một cách tất định cho chuỗi khối cục bộ của bạn (ví dụ: các tài khoản có số dư ETH).
+- Tạo khối ngay lập tức với mỗi giao dịch nhận được, theo thứ tự và không có độ trễ
+- Chức năng gỡ lỗi và ghi nhật ký nâng cao
+
+## Các công cụ có sẵn {#available-projects}
+
+**Lưu ý**: Hầu hết [các khung phát triển](/developers/docs/frameworks/) đều bao gồm một mạng phát triển tích hợp sẵn. Chúng tôi khuyên bạn nên bắt đầu với một khung để [thiết lập môi trường phát triển cục bộ của bạn](/developers/local-environment/).
+
+### Mạng Hardhat {#hardhat-network}
+
+Một mạng Ethereum cục bộ được thiết kế để phát triển. Nó cho phép bạn triển khai các hợp đồng, chạy thử nghiệm và gỡ lỗi mã của mình.
+
+Mạng Hardhat được tích hợp sẵn với Hardhat, một môi trường phát triển Ethereum dành cho các chuyên gia.
+
+- [Trang web](https://hardhat.org/)
+- [GitHub](https://github.com/NomicFoundation/hardhat)
+
+### Các Chuỗi Hải Đăng cục bộ {#local-beacon-chains}
+
+Một số máy khách đồng thuận có các công cụ tích hợp sẵn để khởi chạy các Chuỗi Hải Đăng cục bộ cho mục đích thử nghiệm. Hướng dẫn cho Lighthouse, Nimbus và Lodestar có sẵn:
+
+- [Mạng thử nghiệm cục bộ sử dụng Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/)
+- [Mạng thử nghiệm cục bộ sử dụng Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets)
+
+### Các chuỗi thử nghiệm Ethereum công khai {#public-beacon-testchains}
+
+Ngoài ra còn có hai bản triển khai thử nghiệm công khai được duy trì của Ethereum: Sepolia và Hoodi. Mạng thử nghiệm được đề xuất với sự hỗ trợ dài hạn là Hoodi, mà bất kỳ ai cũng có thể tự do xác thực. Sepolia sử dụng một bộ trình xác thực được cấp phép, có nghĩa là không có quyền truy cập chung cho các trình xác thực mới trên mạng thử nghiệm này.
+
+- [Launchpad Cổ phần Hoodi](https://hoodi.launchpad.ethereum.org/)
+
+### Gói Kurtosis Ethereum {#kurtosis}
+
+Kurtosis là một hệ thống xây dựng cho các môi trường thử nghiệm đa vùng chứa, cho phép các nhà phát triển khởi chạy cục bộ các phiên bản có thể tái tạo của mạng chuỗi khối.
+
+Gói Kurtosis Ethereum có thể được sử dụng để nhanh chóng khởi tạo một mạng thử nghiệm Ethereum có thể tham số hóa, có khả năng mở rộng cao và riêng tư trên Docker hoặc Kubernetes. Gói này hỗ trợ tất cả các máy khách Lớp thực thi (EL) và Lớp đồng thuận (CL) chính. Kurtosis xử lý linh hoạt tất cả các ánh xạ cổng cục bộ và các kết nối dịch vụ cho một mạng đại diện được sử dụng trong các quy trình xác thực và kiểm thử liên quan đến cơ sở hạ tầng cốt lõi của Ethereum.
+
+- [Gói mạng Ethereum](https://github.com/kurtosis-tech/ethereum-package)
+- [Trang web](https://www.kurtosis.com/)
+- [GitHub](https://github.com/kurtosis-tech/kurtosis)
+- [Tài liệu](https://docs.kurtosis.com/)
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các khung phát triển](/developers/docs/frameworks/)
+- [Thiết lập môi trường phát triển cục bộ](/developers/local-environment/)
diff --git a/public/content/translations/vi/developers/docs/ethereum-stack/index.md b/public/content/translations/vi/developers/docs/ethereum-stack/index.md
new file mode 100644
index 00000000000..f690ecaac63
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/ethereum-stack/index.md
@@ -0,0 +1,61 @@
+---
+title: Giới thiệu về Ethereum stack
+description: Một hướng dẫn về các lớp khác nhau của nền tảng Ethereum và cách chúng kết hợp với nhau.
+lang: vi
+---
+
+Giống như bất kỳ bộ phần mềm nào, "bộ Ethereum" hoàn chỉnh sẽ khác nhau tùy theo từng dự án dựa trên mục tiêu của bạn.
+
+Tuy nhiên, có những thành phần chính của Ethereum giúp chúng ta hình dung cách mà các ứng dụng phần mềm tương tác với chuỗi khối của Ethereum. Hiểu các lớp trong stack sẽ giúp bạn nắm bắt được những cách khác nhau mà Ethereum có thể được tích hợp vào các phần mềm dự án.
+
+## Cấp 1: Máy ảo Ethereum {#ethereum-virtual-machine}
+
+[Máy ảo Ethereum (EVM)](/developers/docs/evm/) là môi trường thực thi cho các hợp đồng thông minh trên Ethereum. Tất cả các hợp đồng thông minh và thay đổi trạng thái trên chuỗi khối Ethereum đều được thực thi bởi [các giao dịch](/developers/docs/transactions/). EVM xử lý toàn bộ quy trình giao dịch trên mạng Ethereum.
+
+Giống như bất kỳ máy ảo nào, EVM tạo ra một lớp trừu tượng giữa các mã và máy đang chạy (một nút Ethereum). Hiện tại, EVM đang chạy trên hàng ngàn nút phân bổkhắp nơi trên thế giới.
+
+Chi tiết thì EVM sử dụng một bộ lệnh opcode để thực hiện các tác vụ cụ thể. Các mã vận hành này (140 mã riêng biệt) cho phép EVM [hoàn thiện Turing](https://en.wikipedia.org/wiki/Turing_completeness), nghĩa là EVM có thể tính toán gần như mọi thứ, miễn là có đủ tài nguyên.
+
+Là một nhà phát triển dapp, bạn không cần phải biết quá nhiều về EVM—chỉ cần biết rằng nó tồn tại và giữ cho tất cả các ứng dụng trên Ethereum hoạt động một cách trơn tru mà không xảy ra bất kỳ gián đoạn nào.
+
+## Cấp 2: Hợp đồng thông minh {#smart-contracts}
+
+[Các hợp đồng thông minh](/developers/docs/smart-contracts/) là các chương trình thực thi chạy trên chuỗi khối Ethereum.
+
+Các hợp đồng thông minh được viết bằng các [ngôn ngữ lập trình](/developers/docs/smart-contracts/languages/) cụ thể, được biên dịch thành mã byte EVM (các lệnh máy cấp thấp được gọi là mã vận hành).
+
+Hợp đồng thông minh không chỉ là thư viện mã nguồn mở, mà thực ra chúng giống như dịch vụ API mở luôn hoạt động và không thể bị tắt. Hợp đồng thông minh cung cấp các chức năng công khai mà người dùng và các ứng dụng ([các ứng dụng phi tập trung](/developers/docs/dapps/)) có thể tương tác mà không cần sự cho phép. Bất kỳ ứng dụng nào cũng có thể tích hợp với các hợp đồng thông minh đã triển khai để tạo nên chức năng, chẳng hạn như thêm [nguồn cấp dữ liệu](/developers/docs/oracles/) hoặc để hỗ trợ hoán đổi token. Ngoài ra, bất kỳ ai cũng có thể triển khai các hợp đồng thông minh mới trên Ethereum để thêm chức năng tùy chỉnh nhằm đáp ứng nhu cầu của ứng dụng của họ.
+
+Nếu bạn là một nhà phát triển dapp, bạn chỉ cần viết hợp đồng thông minh nếu muốn thêm chức năng tùy chỉnh trên chuỗi khối Ethereum. Bạn có thể thấy rằng bạn có thể đáp ứng hầu hết hoặc tất cả nhu cầu của dự án chỉ bằng cách tích hợp với các hợp đồng thông minh hiện có, chẳng hạn như nếu bạn muốn hỗ trợ thanh toán bằng stablecoin hoặc cho phép trao đổi token một cách phi tập trung.
+
+## Cấp 3: Các nút Ethereum {#ethereum-nodes}
+
+Để một ứng dụng có thể tương tác với chuỗi khối Ethereum, ứng dụng đó phải kết nối với một [nút Ethereum](/developers/docs/nodes-and-clients/). Kết nối với một nút cho phép bạn đọc dữ liệu blockchain và cũng có thể gửi giao dịch đến mạng.
+
+Các nút Ethereum là những máy tính chạy phần mềm - một client Ethereum. Một client là một bản triển khai của Ethereum, giúp xác minh tất cả các giao dịch trong mỗi khối, giữ cho mạng lưới an toàn và dữ liệu chính xác. **Các nút Ethereum là chuỗi khối Ethereum**. Họ cùng nhau lưu trữ trạng thái của blockchain Ethereum và đạt được sự đồng thuận về các giao dịch để biến đổi trạng thái của blockchain.
+
+Bằng cách kết nối ứng dụng của bạn với một nút Ethereum (thông qua [API JSON-RPC](/developers/docs/apis/json-rpc/)), ứng dụng của bạn có thể đọc dữ liệu từ chuỗi khối (chẳng hạn như số dư tài khoản của người dùng) cũng như quảng bá các giao dịch mới đến mạng lưới (chẳng hạn như chuyển ETH giữa các tài khoản người dùng hoặc thực thi các chức năng của hợp đồng thông minh).
+
+## Cấp 4: API máy khách Ethereum {#ethereum-client-apis}
+
+Nhiều thư viện tiện ích (được xây dựng và duy trì bởi cộng đồng mã nguồn mở của Ethereum) cho phép ứng dụng của bạn kết nối và giao tiếp với chuỗi khối Ethereum.
+
+Nếu ứng dụng hướng tới người dùng của bạn là một ứng dụng web, bạn có thể chọn `npm install` một [API JavaScript](/developers/docs/apis/javascript/) trực tiếp trong frontend của mình. Hoặc có lẽ bạn sẽ chọn triển khai chức năng này ở phía máy chủ, bằng cách sử dụng API [Python](/developers/docs/programming-languages/python/) hoặc [Java](/developers/docs/programming-languages/java/).
+
+Mặc dù những API này không phải là một phần cần thiết trong hệ thống, nhưng chúng giúp đơn giản hóa rất nhiều khi làm việc trực tiếp với một nút Ethereum. Chúng cũng cung cấp các hàm tiện ích (ví dụ: chuyển đổi ETH sang Gwei) để với tư cách là một nhà phát triển, bạn có thể dành ít thời gian hơn để xử lý những điều phức tạp của các máy khách Ethereum và dành nhiều thời gian hơn để tập trung vào chức năng dành riêng cho ứng dụng của bạn.
+
+## Cấp 5: Các ứng dụng cho người dùng cuối {#end-user-applications}
+
+Ở cấp độ cao nhất của stack là việc khách hàng sử dụng ứng dụng Đây là những ứng dụng tiêu chuẩn mà bạn thường xuyên sử dụng và xây dựng ngày nay: chủ yếu là ứng dụng web và ứng dụng di động.
+
+Cách mà bạn phát triển những giao diện người dùng này cơ bản vẫn như vậy. Người dùng thường không cần phải biết ứng dụng họ đang sử dụng được xây dựng trên nền tảng chuỗi khối
+
+## Bạn đã sẵn sàng chọn stack cho mình? Sẵn sàng chọn stack của bạn? {#ready-to-choose-your-stack}
+
+Hãy xem hướng dẫn của chúng tôi để [thiết lập môi trường phát triển cục bộ](/developers/local-environment/) cho ứng dụng Ethereum của bạn.
+
+## Đọc thêm {#further-reading}
+
+- [Kiến trúc của một ứng dụng Web 3.0](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/evm/index.md b/public/content/translations/vi/developers/docs/evm/index.md
new file mode 100644
index 00000000000..e332133fd9e
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/evm/index.md
@@ -0,0 +1,88 @@
+---
+title: Máy chủ Ảo Ethereum
+description: Một bài giới thiệu về máy chủ ảo Ethereum và cách nó liên quan đến trạng thái, giao dịch và hợp đồng thông minh.
+lang: vi
+---
+
+Máy chủ ảo Ethereum là một môi trường ảo phi tập trung, thực thi mã một cách nhất quán và an toàn trên tất cả các nút của Ethereum. Các nút chạy EVM để thực thi các hợp đồng thông minh, sử dụng "[gas](/developers/docs/gas/)" để đo lường nỗ lực tính toán cần thiết cho các [thao tác](/developers/docs/evm/opcodes/), đảm bảo phân bổ tài nguyên hiệu quả và an ninh mạng.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Một số kiến thức cơ bản về các thuật ngữ phổ biến trong khoa học máy tính như [byte](https://wikipedia.org/wiki/Byte), [bộ nhớ](https://wikipedia.org/wiki/Computer_memory) và [ngăn xếp](https://wikipedia.org/wiki/Stack_\(abstract_data_type\)) là cần thiết để hiểu về EVM. Sẽ rất hữu ích nếu bạn quen thuộc với các khái niệm về mật mã học/chuỗi khối như [hàm băm](https://wikipedia.org/wiki/Cryptographic_hash_function) và [cây Merkle](https://wikipedia.org/wiki/Merkle_tree).
+
+## Từ sổ cái đến máy trạng thái {#from-ledger-to-state-machine}
+
+Sự tương tự của 'sổ cái phân tán' thường được sử dụng để mô tả các blockchain như Bitcoin, cho phép một loại tiền tệ phi tập trung sử dụng các công cụ cơ bản của mật mã. Sổ cái duy trì một bản ghi các hoạt động, và nó phải tuân theo một tập hợp quy tắc quy định những gì một người có thể và không thể làm để thay đổi sổ cái. Ví dụ: một địa chỉ Bitcoin không thể tiêu nhiều Bitcoin hơn số Bitcoin đã nhận trước đó. Các quy tắc này làm nền tảng cho tất cả các giao dịch trên Bitcoin và nhiều blockchain khác.
+
+Mặc dù Ethereum có tiền mã hóa gốc của riêng mình (ether) tuân theo các quy tắc trực quan gần như giống hệt nhau, nhưng nó cũng cho phép một chức năng mạnh mẽ hơn nhiều: [hợp đồng thông minh](/developers/docs/smart-contracts/). Đối với tính năng phức tạp hơn này, cần phải có một phép loại suy phức tạp hơn. Thay vì là một sổ cái phân tán, Ethereum là một [máy trạng thái](https://wikipedia.org/wiki/Finite-state_machine) phân tán. Trạng thái của Ethereum là một cấu trúc dữ liệu lớn không chỉ chứa tất cả các tài khoản và số dư mà còn chứa một _trạng thái máy_, có thể thay đổi từ khối này sang khối khác theo một bộ quy tắc được xác định trước, và có thể thực thi mã máy tùy ý. Các quy tắc cụ thể của việc thay đổi trạng thái từ khối này sang khối khác được xác định bởi EVM.
+
+
+_Sơ đồ được phỏng theo [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_
+
+## Hàm chuyển đổi trạng thái của Ethereum {#the-ethereum-state-transition-function}
+
+EVM hoạt động như một hàm toán học: Cho một đầu vào, nó tạo ra một đầu ra xác định. Do đó, sẽ rất hữu ích nếu mô tả Ethereum một cách chính thức hơn là có một **hàm chuyển đổi trạng thái**:
+
+```
+Y(S, T)= S'
+```
+
+Cho một trạng thái hợp lệ cũ `(S)` và một tập hợp các giao dịch hợp lệ mới `(T)`, hàm chuyển đổi trạng thái Ethereum `Y(S, T)` tạo ra một trạng thái đầu ra hợp lệ mới `S'`
+
+### Trạng thái {#state}
+
+Trong bối cảnh của Ethereum, trạng thái là một cấu trúc dữ liệu khổng lồ được gọi là [Cây Patricia Merkle đã sửa đổi](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/), nơi lưu giữ tất cả các [tài khoản](/developers/docs/accounts/) được liên kết bằng các hàm băm và có thể rút gọn thành một hàm băm gốc duy nhất được lưu trữ trên chuỗi khối.
+
+### Các giao dịch {#transactions}
+
+Giao dịch là hướng dẫn được ký bằng mật mã từ các tài khoản. Có hai loại giao dịch: giao dịch dẫn đến cuộc gọi tin nhắn và giao dịch dẫn đến tạo hợp đồng.
+
+Việc tạo hợp đồng sẽ dẫn đến việc tạo ra một tài khoản hợp đồng mới chứa bytecode [hợp đồng thông minh](/developers/docs/smart-contracts/anatomy/) đã được biên dịch. Bất cứ khi nào tài khoản khác thực hiện một cuộc gọi thông báo đến hợp đồng đó, nó sẽ thực thi bytecode của nó.
+
+## Các lệnh của EVM {#evm-instructions}
+
+EVM thực thi như một [máy ngăn xếp](https://wikipedia.org/wiki/Stack_machine) với độ sâu 1024 mục. Mỗi mục là một 256 bit word, được chọn để dễ sử dụng với mật mã 256 bit (chẳng hạn như băm Keccak-256 hoặc chữ ký secp256k1).
+
+Trong quá trình thực thi, EVM duy trì một _bộ nhớ_ tạm thời (dưới dạng một mảng byte được định địa chỉ theo từ), bộ nhớ này không tồn tại giữa các giao dịch.
+
+### Lưu trữ tạm thời
+
+Lưu trữ tạm thời là một kho khóa-giá trị cho mỗi giao dịch, được truy cập thông qua các mã vận hành `TSTORE` và `TLOAD`. Nó tồn tại trong tất cả các lệnh gọi nội bộ trong cùng một giao dịch nhưng sẽ bị xóa vào cuối giao dịch. Không giống như bộ nhớ, lưu trữ tạm thời được mô hình hóa như một phần của trạng thái EVM thay vì khung thực thi, nhưng nó không được ghi vào trạng thái toàn cục. Lưu trữ tạm thời cho phép chia sẻ trạng thái tạm thời một cách tiết kiệm gas giữa các lệnh gọi nội bộ trong một giao dịch.
+
+### Lưu trữ
+
+Các hợp đồng chứa một cây _lưu trữ_ Patricia Merkle (dưới dạng mảng từ có thể định địa chỉ theo từ), được liên kết với tài khoản liên quan và là một phần của trạng thái toàn cục. Loại lưu trữ bền vững này khác với lưu trữ tạm thời, vốn chỉ khả dụng trong suốt thời gian của một giao dịch duy nhất và không phải là một phần của cây lưu trữ bền vững của tài khoản.
+
+### Mã vận hành
+
+Bytecode của hợp đồng thông minh đã biên dịch sẽ thực thi dưới dạng một số [mã vận hành](/developers/docs/evm/opcodes) EVM, thực hiện các hoạt động ngăn xếp tiêu chuẩn như `XOR`, `AND`, `ADD`, `SUB`, v.v. EVM cũng triển khai một số hoạt động ngăn xếp dành riêng cho chuỗi khối, chẳng hạn như `ADDRESS`, `BALANCE`, `BLOCKHASH`, v.v. Tập hợp mã vận hành cũng bao gồm `TSTORE` và `TLOAD`, cung cấp quyền truy cập vào lưu trữ tạm thời.
+
+
+_Sơ đồ được phỏng theo [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_
+
+## Các phiên bản triển khai EVM {#evm-implementations}
+
+Tất cả các triển khai của EVM phải tuân theo đặc điểm kỹ thuật được mô tả trong Ethereum Yellowpaper.
+
+Trong lịch sử mười năm của Ethereum, EVM đã trải qua nhiều lần sửa đổi và có một số phiên bản triển khai EVM bằng nhiều ngôn ngữ lập trình khác nhau.
+
+[Các máy khách thực thi của Ethereum](/developers/docs/nodes-and-clients/#execution-clients) bao gồm một phiên bản triển khai EVM. Ngoài ra, còn có nhiều bản triển khai độc lập, bao gồm:
+
+- [Py-EVM](https://github.com/ethereum/py-evm) - _Python_
+- [evmone](https://github.com/ethereum/evmone) - _C++_
+- [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) - _JavaScript_
+- [revm](https://github.com/bluealloy/revm) - _Rust_
+
+## Đọc thêm {#further-reading}
+
+- [Sách Vàng Ethereum](https://ethereum.github.io/yellowpaper/paper.pdf)
+- [Sách Jello hay KEVM: Ngữ nghĩa của EVM trong K](https://jellopaper.org/)
+- [Sách Be](https://github.com/chronaeon/beigepaper)
+- [Mã vận hành Máy ảo Ethereum](https://www.ethervm.io/)
+- [Tham chiếu tương tác về mã vận hành của Máy ảo Ethereum](https://www.evm.codes/)
+- [Giới thiệu ngắn trong tài liệu của Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6)
+- [Làm chủ Ethereum - Máy ảo Ethereum](https://github.com/ethereumbook/ethereumbook/blob/openedition/13evm.asciidoc)
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Gas](/developers/docs/gas/)
diff --git a/public/content/translations/vi/developers/docs/evm/opcodes/index.md b/public/content/translations/vi/developers/docs/evm/opcodes/index.md
new file mode 100644
index 00000000000..d4afd51a56b
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/evm/opcodes/index.md
@@ -0,0 +1,177 @@
+---
+title: Mã lệnh cho EVM
+description: Một danh sách cho những mã lệnh cho máy chủ ảo Ethereum.
+lang: vi
+---
+
+## Tổng quan {#overview}
+
+Đây là phiên bản cập nhật của trang tham khảo EVM tại [wolflo/evm-opcodes](https://github.com/wolflo/evm-opcodes).
+Cũng được lấy từ [Sách Vàng](https://ethereum.github.io/yellowpaper/paper.pdf), [Sách Jello](https://jellopaper.org/evm/), và bản triển khai [geth](https://github.com/ethereum/go-ethereum).
+Điều này được tạo ra với mục đích trở thành một tài liệu tham khảo dễ tiếp cận, nhưng nó không quá chặt chẽ.
+Nếu bạn muốn đảm bảo tính chính xác và hiểu rõ mọi trường hợp đặc biệt, thì nên tham khảo sách Jello hoặc trực tiếp xem cách Client được triển khai.
+
+Bạn đang tìm một bản tham khảo có tương tác? Xem tại [evm.codes](https://www.evm.codes/).
+
+Về các hoạt động với chi phí gas động, xem [gas.md](https://github.com/wolflo/evm-opcodes/blob/main/gas.md).
+
+💡 Mẹo nhanh: Để xem toàn bộ các dòng, hãy sử dụng `[shift] + scroll` để cuộn ngang trên máy tính.
+
+| Stack | Họ tên | Gas | Stack ban đầu | Kết quả Stack | Bộ nhớ/ lưu trữ | Lưu ý | |
+| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
+| 00 | STOP | 0 | | | | dừng thực thi | |
+| 01 | ADD | 3 | `a, b` | `a + b` | | phép cộng (u)int256 modulo 2\*\*256 | |
+| 02 | MUL | 5 | `a, b` | `a * b` | | phép nhân (u)int256 modulo 2\*\*256 | |
+| 03 | SUB | 3 | `a, b` | `a - b` | | phép trừ (u)int256 modulo 2\*\*256 | |
+| 04 | DIV | 5 | `a, b` | `a // b` | | phép chia uint256 | |
+| 05 | SDIV | 5 | `a, b` | `a // b` | | phép chia int256 | |
+| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 modulo | |
+| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 modulo | |
+| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | phép cộng (u)int256 modulo N | |
+| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | phép nhân (u)int256 modulo N | |
+| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | phép lũy thừa uint256 modulo 2\*\*256 | |
+| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [mở rộng dấu](https://wikipedia.org/wiki/Sign_extension) `x` từ `(b+1)` byte lên 32 byte | |
+| 0C-0F | _không hợp lệ_ | | | | | | |
+| 10 | LT | 3 | `a, b` | `a < b` | | uint256 nhỏ hơn | |
+| 11 | GT | 3 | `a, b` | `a > b` | | uint256 lớn hơn | |
+| 12 | SLT | 3 | `a, b` | `a < b` | | int256 nhỏ hơn | |
+| 13 | SGT | 3 | `a, b` | `a > b` | | int256 lớn hơn | |
+| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 bằng nhau | |
+| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 bằng không | |
+| 16 | AND | 3 | `a, b` | `a && b` | | phép AND bit | |
+| 17 | OR | 3 | `a, b` | `a \\|\\| b` | | phép OR bit | |
+| 18 | XOR | 3 | `a, b` | `a ^ b` | | phép XOR bit | |
+| 19 | NOT | 3 | `a` | `~a` | | phép NOT bit | |
+| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | byte thứ `i` của (u)int256 `x`, từ bên trái | |
+| 1B | SHL | 3 | `shift, val` | `val << shift` | | dịch trái | |
+| 1C | SHR | 3 | `shift, val` | `val >> shift` | | dịch phải logic | |
+| 1D | DUP5 | 3 | `shift, val` | `val >> shift` | | dịch phải số học | |
+| 1E-1F | _không hợp lệ_ | | | | | | |
+| 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 | _không hợp lệ_ | | | | | | |
+| 30 | ADDRESS | 2 | `.` | `address(this)` | | địa chỉ của hợp đồng đang thực thi | |
+| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | số dư, tính bằng wei | |
+| 32 | ORIGIN | 2 | `.` | `tx.origin` | | địa chỉ đã khởi tạo tx | |
+| 33 | CALLER | 2 | `.` | `msg.sender` | | địa chỉ của người gửi msg | |
+| 34 | CALLVALUE | 2 | `.` | `msg.value` | | giá trị msg, tính bằng wei | |
+| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | đọc một từ từ dữ liệu msg tại chỉ mục `idx` | |
+| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | độ dài dữ liệu msg, tính bằng byte | |
+| 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] | sao chép dữ liệu msg | |
+| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | độ dài mã của hợp đồng đang thực thi, tính bằng byte | |
+| 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] | sao chép chỉ thị biên dịch của hợp đồng đang thực thi |
+| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | giá gas của tx, tính bằng wei trên mỗi đơn vị 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)` | | kích thước mã tại addr, tính bằng byte | |
+| 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] | sao chép mã từ `addr` | |
+| 3D | RETURNDATASIZE | 2 | `.` | `size` | | kích thước dữ liệu trả về từ lệnh gọi bên ngoài cuối cùng, tính bằng byte | |
+| 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] | sao chép dữ liệu trả về từ lệnh gọi bên ngoài cuối cùng | |
+| 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` | | địa chỉ của người đề xuất khối hiện tại | |
+| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | dấu thời gian của khối hiện tại | |
+| 43 | NUMBER | 2 | `.` | `block.number` | | số của khối hiện tại | |
+| 44 | PREVRANDAO | 2 | `.` | `randomness beacon` | | mốc báo hiệu ngẫu nhiên | |
+| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | giới hạn gas của khối hiện tại | |
+| 46 | CHAINID | 2 | `.` | `chain_id` | | đẩy [ID chuỗi](https://eips.ethereum.org/EIPS/eip-155) hiện tại vào ngăn xếp | |
+| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | số dư của hợp đồng đang thực thi, tính bằng wei | |
+| 48 | BASEFEE | 2 | `.` | `block.basefee` | | phí cơ bản của khối hiện tại | |
+| 49 | BLOBHASH | 3 | `idx` | `tx.blob_versioned_hashes[idx]` | | [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) | |
+| 4A | BLOBBASEFEE | 2 | `.` | `block.blobbasefee` | | phí cơ bản của blob của khối hiện tại ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516)) | |
+| 4B-4F | _không hợp lệ_ | | | | | | |
+| 50 | POP | 2 | `_anon` | `.` | | xóa mục khỏi đầu ngăn xếp và loại bỏ nó | |
+| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | đọc một từ từ bộ nhớ tại độ lệch `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 | ghi một từ vào bộ nhớ | |
+| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | ghi một byte vào bộ nhớ | |
+| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | đọc một từ từ bộ nhớ lưu trữ | |
+| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | ghi một từ vào bộ nhớ lưu trữ | |
+| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` đánh dấu rằng `pc` chỉ được gán nếu `dst` là một jumpdest hợp lệ | |
+| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ?` dst : $pc + 1\` | |
+| 58 | PC | 2 | `.` | `$pc` | | bộ đếm chương trình | |
+| 59 | MSIZE | 2 | `.` | `len(mem)` | | kích thước bộ nhớ trong ngữ cảnh thực thi hiện tại, tính bằng byte | |
+| 5A | GAS | 2 | `.` | `gasRemaining` | | | |
+| 5B | JUMPDEST | 1 | | | đánh dấu đích nhảy hợp lệ | một đích nhảy hợp lệ, ví dụ một đích nhảy không nằm trong dữ liệu đẩy | |
+| 5C | TLOAD | 100 | `key` | `tstorage[key]` | | đọc một từ từ lưu trữ tạm thời ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | |
+| 5D | TSTORE | 100 | `key, val` | `.` | tstorage[key] := val | ghi một từ vào lưu trữ tạm thời ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | |
+| 5E | MCOPY | 3+3\*words+[A0](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `dstOst, ost, len` | `.` | mem[dstOst] := mem[ost:ost+len] | sao chép bộ nhớ từ vùng này sang vùng khác ([EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)) | |
+| 5F | PUSH0 | 2 | `.` | `uint8` | | đẩy giá trị hằng số 0 vào ngăn xếp | |
+| 60 | PUSH1 | 3 | `.` | `uint8` | | đẩy giá trị 1-byte vào ngăn xếp | |
+| 61 | PUSH2 | 3 | `.` | `uint16` | | đẩy giá trị 2-byte vào ngăn xếp | |
+| 62 | PUSH3 | 3 | `.` | `uint24` | | đẩy giá trị 3-byte vào ngăn xếp | |
+| 63 | PUSH4 | 3 | `.` | `uint32` | | đẩy giá trị 4-byte vào ngăn xếp | |
+| 64 | PUSH5 | 3 | `.` | `uint40` | | đẩy giá trị 5-byte vào ngăn xếp | |
+| 65 | PUSH6 | 3 | `.` | `uint48` | | đẩy giá trị 6-byte vào ngăn xếp | |
+| 66 | PUSH7 | 3 | `.` | `uint56` | | đẩy giá trị 7-byte vào ngăn xếp | |
+| 67 | PUSH8 | 3 | `.` | `uint64` | | đẩy giá trị 8-byte vào ngăn xếp | |
+| 68 | PUSH9 | 3 | `.` | `uint72` | | đẩy giá trị 9-byte vào ngăn xếp | |
+| 69 | PUSH10 | 3 | `.` | `uint80` | | đẩy giá trị 10-byte vào ngăn xếp | |
+| 6A | PUSH11 | 3 | `.` | `uint88` | | đẩy giá trị 11-byte vào ngăn xếp | |
+| 6B | PUSH12 | 3 | `.` | `uint96` | | đẩy giá trị 12-byte vào ngăn xếp | |
+| 6C | PUSH13 | 3 | `.` | `uint104` | | đẩy giá trị 13-byte vào ngăn xếp | |
+| 6D | PUSH14 | 3 | `.` | `uint112` | | đẩy giá trị 14-byte vào ngăn xếp | |
+| 6E | PUSH15 | 3 | `.` | `uint120` | | đẩy giá trị 15-byte vào ngăn xếp | |
+| 6F | PUSH16 | 3 | `.` | `uint128` | | đẩy giá trị 16-byte vào ngăn xếp | |
+| 70 | PUSH17 | 3 | `.` | `uint136` | | đẩy giá trị 17-byte vào ngăn xếp | |
+| 71 | PUSH18 | 3 | `.` | `uint144` | | đẩy giá trị 18-byte vào ngăn xếp | |
+| 72 | PUSH19 | 3 | `.` | `uint152` | | đẩy giá trị 19-byte vào ngăn xếp | |
+| 73 | PUSH20 | 3 | `.` | `uint160` | | đẩy giá trị 20-byte vào ngăn xếp | |
+| 74 | PUSH21 | 3 | `.` | `uint168` | | đẩy giá trị 21-byte vào ngăn xếp | |
+| 75 | PUSH22 | 3 | `.` | `uint176` | | đẩy giá trị 22-byte vào ngăn xếp | |
+| 76 | PUSH23 | 3 | `.` | `uint184` | | đẩy giá trị 23-byte vào ngăn xếp | |
+| 77 | PUSH24 | 3 | `.` | `uint192` | | đẩy giá trị 24-byte vào ngăn xếp | |
+| 78 | PUSH25 | 3 | `.` | `uint200` | | đẩy giá trị 25-byte vào ngăn xếp | |
+| 79 | PUSH26 | 3 | `.` | `uint208` | | đẩy giá trị 26-byte vào ngăn xếp | |
+| 7A | PUSH27 | 3 | `.` | `uint216` | | đẩy giá trị 27-byte vào ngăn xếp | |
+| 7B | PUSH28 | 3 | `.` | `uint224` | | đẩy giá trị 28-byte vào ngăn xếp | |
+| 7C | PUSH29 | 3 | `.` | `uint232` | | đẩy giá trị 29-byte vào ngăn xếp | |
+| 7D | PUSH30 | 3 | `.` | `uint240` | | đẩy giá trị 30-byte vào ngăn xếp | |
+| 7E | PUSH31 | 3 | `.` | `uint248` | | đẩy giá trị 31-byte vào ngăn xếp | |
+| 7F | PUSH32 | 3 | `.` | `uint256` | | đẩy giá trị 32-byte vào ngăn xếp | |
+| 80 | DUP1 | 3 | `a` | `a, a` | | sao chép giá trị thứ 1 trên ngăn xếp | |
+| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | sao chép giá trị thứ 2 trên ngăn xếp | |
+| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | sao chép giá trị thứ 3 trên ngăn xếp | |
+| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | sao chép giá trị thứ 4 trên ngăn xếp | |
+| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 5 trên ngăn xếp | |
+| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 6 trên ngăn xếp | |
+| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 7 trên ngăn xếp | |
+| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 8 trên ngăn xếp | |
+| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 9 trên ngăn xếp | |
+| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 10 trên ngăn xếp | |
+| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 11 trên ngăn xếp | |
+| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 12 trên ngăn xếp | |
+| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 13 trên ngăn xếp | |
+| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 14 trên ngăn xếp | |
+| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 15 trên ngăn xếp | |
+| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | sao chép giá trị thứ 16 trên ngăn xếp | |
+| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | |
+| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | |
+| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | |
+| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | |
+| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | |
+| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | |
+| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG2(memory[ost:ost+len-1], topic0, topic1) | |
+| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | |
+| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | |
+| A5-EF | _không hợp lệ_ | | | | | | |
+| 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 | giống như DELEGATECALL, nhưng không truyền `msg.sender` và `msg.value` gốc | |
+| 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 | _không hợp lệ_ | | | | | | |
+| 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 | _không hợp lệ_ | | | | | | |
+| 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) | | | opcode không hợp lệ được chỉ định - [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` | `.` | | gửi tất cả ETH đến `addr`; nếu được thực thi trong cùng một giao dịch mà một hợp đồng được tạo thì nó sẽ phá hủy hợp đồng đó | |
diff --git a/public/content/translations/vi/developers/docs/frameworks/index.md b/public/content/translations/vi/developers/docs/frameworks/index.md
new file mode 100644
index 00000000000..22c6ffae996
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/frameworks/index.md
@@ -0,0 +1,154 @@
+---
+title: Framework phát triển Dapp
+description: Khám phá những lợi thế của các khung phát triển và so sánh các tùy chọn hiện có.
+lang: vi
+---
+
+## Giới thiệu về các framework {#introduction-to-frameworks}
+
+Việc xây dựng một ứng dụng phi tập trung hoàn chỉnh đòi hỏi
+những thành phần công nghệ khác nhau. Các framework phần mềm bao gồm nhiều tính năng cần thiết hoặc cung cấp các hệ thống plugin dễ dàng để lựa chọn các công cụ mà bạn mong muốn.
+
+Các framework đi kèm với nhiều chức năng sẵn có, chẳng hạn như :
+
+- Các tính năng để tạo ra một phiên bản blockchain cục bộ.
+- Các tiện ích để biên dịch và kiểm tra hợp đồng thông minh của bạn.
+- Các tiện ích bổ sung phát triển client để xây dựng ứng dụng hướng tới người dùng của bạn
+ trong cùng một dự án/kho lưu trữ.
+- Cấu hình để kết nối với các mạng Ethereum và triển khai
+ các hợp đồng, cho dù đó là một phiên bản đang chạy cục bộ, hay một trong
+ các mạng công khai của Ethereum.
+- Phân phối ứng dụng phi tập trung - tích hợp với các tùy chọn lưu trữ
+ như IPFS.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Trước khi đi sâu vào các framework, chúng tôi khuyên bạn nên đọc qua phần giới thiệu của chúng tôi về [các ứng dụng phi tập trung](/developers/docs/dapps/) và [ngăn xếp Ethereum](/developers/docs/ethereum-stack/).
+
+## Các framework có sẵn {#available-frameworks}
+
+**Foundry** - **_Foundry là một bộ công cụ cực nhanh, di động và có thể mô-đun hóa để phát triển ứng dụng Ethereum_**
+
+- [Cài đặt Foundry](https://book.getfoundry.sh/)
+- [Sách về Foundry](https://book.getfoundry.sh/)
+- [Trò chuyện cộng đồng Foundry trên Telegram](https://t.me/foundry_support)
+- [Awesome Foundry](https://github.com/crisgarner/awesome-foundry)
+
+**Hardhat -** **_Môi trường phát triển Ethereum dành cho các chuyên gia._**
+
+- [hardhat.org](https://hardhat.org)
+- [GitHub](https://github.com/nomiclabs/hardhat)
+
+**Ape -** **_Công cụ phát triển hợp đồng thông minh dành cho các Pythonista, Nhà khoa học dữ liệu và Chuyên gia bảo mật._**
+
+- [Tài liệu](https://docs.apeworx.io/ape/stable/)
+- [GitHub](https://github.com/ApeWorX/ape)
+
+**Web3j -** **_Một nền tảng để phát triển các ứng dụng chuỗi khối trên JVM._**
+
+- [Trang chủ](https://www.web3labs.com/web3j-sdk)
+- [Tài liệu](https://docs.web3j.io)
+- [GitHub](https://github.com/web3j/web3j)
+
+**ethers-kt -** **_Thư viện Kotlin/Java/Android không đồng bộ, hiệu suất cao cho các chuỗi khối dựa trên EVM._**
+
+- [GitHub](https://github.com/Kr1ptal/ethers-kt)
+- [Các ví dụ](https://github.com/Kr1ptal/ethers-kt/tree/master/examples)
+- [Discord](https://discord.gg/rx35NzQGSb)
+
+**Create Eth App -** **_Tạo các ứng dụng chạy trên Ethereum chỉ bằng một lệnh. Có nhiều lựa chọn về các khung giao diện người dùng (UI) và mẫu DeFi để chọn lựa._**
+
+- [GitHub](https://github.com/paulrberg/create-eth-app)
+- [Các mẫu](https://github.com/PaulRBerg/create-eth-app/tree/develop/templates)
+
+**Scaffold-Eth -** **_Ethers.js + Hardhat + các thành phần và hook của React cho web3: mọi thứ bạn cần để bắt đầu xây dựng các ứng dụng phi tập trung được hỗ trợ bởi các hợp đồng thông minh._**
+
+- [GitHub](https://github.com/scaffold-eth/scaffold-eth-2)
+
+**Tenderly -** **_Nền tảng phát triển Web3 cho phép các nhà phát triển chuỗi khối xây dựng, kiểm thử, gỡ lỗi, giám sát và vận hành các hợp đồng thông minh và cải thiện UX của ứng dụng phi tập trung._**
+
+- [Trang web](https://tenderly.co/)
+- [Tài liệu](https://docs.tenderly.co/)
+
+**The Graph -** **_The Graph để truy vấn dữ liệu chuỗi khối một cách hiệu quả._**
+
+- [Trang web](https://thegraph.com/)
+- [Hướng dẫn](/developers/tutorials/the-graph-fixing-web3-data-querying/)
+
+**Alchemy -** **_Nền tảng phát triển Ethereum._**
+
+- [alchemy.com](https://www.alchemy.com/)
+- [GitHub](https://github.com/alchemyplatform)
+- [Discord](https://discord.com/invite/alchemyplatform)
+
+**NodeReal -** **_Nền tảng phát triển Ethereum._**
+
+- [Nodereal.io](https://nodereal.io/)
+- [GitHub](https://github.com/node-real)
+- [Discord](https://discord.gg/V5k5gsuE)
+
+**thirdweb SDK -** **_Xây dựng các ứng dụng web3 có thể tương tác với các hợp đồng thông minh của bạn bằng các SDK và CLI mạnh mẽ của chúng tôi._**
+
+- [Tài liệu](https://portal.thirdweb.com/sdk/)
+- [GitHub](https://github.com/thirdweb-dev/)
+
+**Chainstack -** **_Nền tảng phát triển Web3 (Ethereum và các chuỗi khác)._**
+
+- [chainstack.com](https://www.chainstack.com/)
+- [GitHub](https://github.com/chainstack)
+- [Discord](https://discord.gg/BSb5zfp9AT)
+
+**Crossmint -** **_Nền tảng phát triển web3 cấp doanh nghiệp, cho phép bạn xây dựng các ứng dụng NFT trên tất cả các chuỗi lớn, các chuỗi EVM (và các chuỗi khác)._**
+
+- [Trang web](https://www.crossmint.com)
+- [Tài liệu tham khảo](https://docs.crossmint.com)
+- [Discord](https://discord.com/invite/crossmint)
+
+**Brownie -** **_Môi trường phát triển và framework kiểm thử dựa trên Python._**
+
+- [Tài liệu](https://eth-brownie.readthedocs.io/en/latest/)
+- [GitHub](https://github.com/eth-brownie/brownie)
+- **Brownie hiện tại không được bảo trì**
+
+**OpenZeppelin SDK -** **_Bộ công cụ Hợp đồng thông minh Tối thượng: Một bộ công cụ giúp bạn phát triển, biên dịch, nâng cấp, triển khai và tương tác với các hợp đồng thông minh._**
+
+- [OpenZeppelin Defender SDK](https://docs.openzeppelin.com/defender/sdk)
+- [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk)
+- [Diễn đàn cộng đồng](https://forum.openzeppelin.com/c/support/17)
+- **Việc phát triển SDK OpenZeppelin đã kết thúc**
+
+**Catapulta -** **_Công cụ triển khai hợp đồng thông minh đa chuỗi, tự động hóa việc xác minh trong các trình khám phá khối, theo dõi các hợp đồng thông minh đã triển khai và chia sẻ báo cáo triển khai, dạng plug-and-play cho các dự án Foundry và Hardhat._**
+
+- [Trang web](https://catapulta.sh/)
+- [Tài liệu](https://catapulta.sh/docs)
+- [Github](https://github.com/catapulta-sh)
+
+**GoldRush (do Covalent cung cấp) -** **_GoldRush cung cấp bộ API dữ liệu chuỗi khối toàn diện nhất cho các nhà phát triển, nhà phân tích và doanh nghiệp. Cho dù bạn đang xây dựng bảng điều khiển DeFi, ví, bot giao dịch, tác tử AI hay nền tảng tuân thủ, các API dữ liệu đều cung cấp quyền truy cập nhanh, chính xác và thân thiện với nhà phát triển vào dữ liệu trên chuỗi thiết yếu mà bạn cần_**
+
+- [Trang web](https://goldrush.dev/)
+- [Tài liệu](https://goldrush.dev/docs/chains/ethereum)
+- [GitHub](https://github.com/covalenthq)
+- [Discord](https://www.covalenthq.com/discord/)
+
+**Wake -** **_Framework Python tất cả trong một để kiểm thử hợp đồng, fuzzing, triển khai, quét lỗ hổng và điều hướng mã._**
+
+- [Trang chủ](https://getwake.io/)
+- [Tài liệu](https://ackeeblockchain.com/wake/docs/latest/)
+- [GitHub](https://github.com/Ackee-Blockchain/wake)
+- [Tiện ích mở rộng VS Code](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity)
+
+**Veramo -** **_Framework mã nguồn mở, dạng mô-đun và bất khả tri, giúp các nhà phát triển ứng dụng phi tập trung dễ dàng xây dựng danh tính phi tập trung và thông tin xác thực có thể kiểm chứng trong các ứng dụng của họ._**
+
+- [Trang chủ](https://veramo.io/)
+- [Tài liệu](https://veramo.io/docs/basics/introduction)
+- [GitHub](https://github.com/uport-project/veramo)
+- [Discord](https://discord.com/invite/FRRBdjemHV)
+- [Gói NPM](https://www.npmjs.com/package/@veramo/core)
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Thiết lập môi trường phát triển cục bộ](/developers/local-environment/)
diff --git a/public/content/translations/vi/developers/docs/gas/index.md b/public/content/translations/vi/developers/docs/gas/index.md
new file mode 100644
index 00000000000..a10ef387342
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/gas/index.md
@@ -0,0 +1,151 @@
+---
+title: Gas và phí
+metaTitle: "Gas và phí Ethereum: tổng quan kỹ thuật"
+description: Tìm hiểu về phí gas của Ethereum, cách chúng được tính toán và vai trò của chúng trong bảo mật mạng lưới cũng như xử lý giao dịch.
+lang: vi
+---
+
+Gas rất quan trong cho mạng lưới Ethereum. Nó là nhiên liệu để cho mạng lưới hoạt động, nó tương tự như một chiếc xe hơi cần xăng để chạy.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [các giao dịch](/developers/docs/transactions/) và [EVM](/developers/docs/evm/).
+
+## Gas là gì? {#what-is-gas}
+
+Gas đề cập đến đơn vị mà nó đo lường số lượng hiệu quả tính toán cần thiết để thực hiện các hoạt động cụ thể trên mạng lưới Ethereum.
+
+Vì mỗi giao dịch Ethereum cần tài nguyên tính toán để thực hiện, cần thanh toán cho những tài nguyên đó để bảo đảm Ethereum không bị ảnh hưởng bởi spam và không bị kẹt trong các vòng lặp tính toán. Tài nguyên tính toán được trả với dạng phí gas.
+
+Phí gas là **lượng gas được dùng để thực hiện một tác vụ nào đó, nhân với giá của mỗi đơn vị gas**. Phí được thanh toán dù giao dịch thành công hay thất bại.
+
+
+_Sơ đồ được phỏng theo [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_
+
+Phí gas phải được thanh toán bằng đồng tiền bản địa của Ethereum, ether (ETH). Giá gas thường được niêm yết bằng gwei, một đơn vị nhỏ hơn của ETH. Mỗi gwei bằng một phần một tỉ của mỗi ETH. (0,000000001 ETH hay 10-9 ETH).
+
+Ví dụ: thay vì nói rằng giá gas của bạn là 0,000000001 ether, bạn có thể nói rằng giá gas của mình là 1 gwei.
+
+Từ ‘gwei’ là dạng rút gọn của ‘giga-wei’, có nghĩa là ‘một tỷ wei’. Một gwei bằng một tỉ wei. Bản thân Wei (được đặt theo tên của [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), người tạo ra [b-money](https://www.investopedia.com/terms/b/bmoney.asp)) là đơn vị nhỏ nhất của ETH.
+
+## Phí gas được tính như thế nào? {#how-are-gas-fees-calculated}
+
+Bạn có thể cài đặt lượng gas bạn muốn trả khi bạn gửi một giao dịch. Bằng cách trả giá một lượng gas nhất định, bạn đang đấu giá để giao dịch của mình được đưa vào khối tiếp theo. Nếu như bạn đề nghị quá ít, các nút xác thực sẽ ít khi chọn giao dịch của bạn để thêm vào, nghĩa là giao dịch của bạn sẽ được sử lý sau hoặc không được xử lí. Nếu bạn trả giá có cao, bạn có thể sẽ phí ETH. Vậy thì, làm cách nào để biết nên trả bao nhiêu?
+
+Tổng số gas bạn phải trả được chia thành hai thành phần: `phí cơ bản` và `phí ưu tiên` (tiền boa).
+
+`phí cơ bản` được giao thức quy định—bạn phải trả ít nhất số tiền này để giao dịch của bạn được coi là hợp lệ. `phí ưu tiên` là một khoản tiền boa mà bạn thêm vào phí cơ bản để làm cho giao dịch của bạn hấp dẫn đối với những người xác thực để họ chọn đưa nó vào khối tiếp theo.
+
+Một giao dịch chỉ trả `phí cơ bản` về mặt kỹ thuật là hợp lệ nhưng hiếm khi được đưa vào vì nó không mang lại động lực cho người xác thực chọn nó thay vì bất kỳ giao dịch nào khác. Phí `ưu tiên` 'vừa đủ' được quyết định bởi độ bận rộn của mạng lưới tại thời điểm bạn gửi giao dịch—nếu có nhiều nhu cầu thì bạn có thể phải đặt phí `ưu tiên` cao hơn, nhưng khi có ít nhu cầu hơn, bạn có thể trả ít hơn.
+
+Lấy ví dụ, giả sử Jordan muốn thanh toán 1 ETH cho Taylor. Một giao dịch ETH cần phải có 21,000 đơn vị Gas, và phí cơ bản là 10 Gwei. Jordan thêm hoa hồng 2 Gwei.
+
+Tổng phí bây giờ sẽ bằng:
+
+`lượng Gas sử dụng * (phí cơ bản + phí ưu tiên)`
+
+trong đó `phí cơ bản` là giá trị do giao thức đặt ra và `phí ưu tiên` là giá trị do người dùng đặt ra như một khoản tiền boa cho người xác thực.
+
+ví dụ: `21.000 * (10 + 2) = 252.000 gwei` (0,000252 ETH).
+
+Khi mà Jordan gửi tiền, 1,000252 ETH sẽ được lấy từ tài khoản của Jordan. Taylor sẽ nhận được 1,00000 ETH. Nút xác thực sẽ nhận phí ưu tiên 0,000042 ETH. `phí cơ bản` 0,00021 ETH sẽ bị đốt.
+
+### Phí cơ bản {#base-fee}
+
+Mọi khối đều có phí cơ bản đóng vai trò là giá khởi điểm. Để đủ điều kiện đưa vào một khối, giá đề xuất cho mỗi loại gas ít nhất phải bằng mức phí cơ bản. Phí cơ bản được tính toán độc lập với khối hiện tại và thay vào đó được xác định bởi các khối trước đó, giúp cho phí giao dịch trở nên dễ đoán hơn cho người dùng. Khi khối được tạo, **phí cơ bản này sẽ bị "đốt"**, loại bỏ nó khỏi lưu thông.
+
+Phí cơ bản được tính bằng một công thức so sánh kích thước của khối trước đó (lượng gas được sử dụng cho tất cả các giao dịch) với kích thước mục tiêu (một nửa giới hạn gas). Phí cơ bản sẽ tăng hoặc giảm tối đa 12,5% cho mỗi khối nếu kích thước khối mục tiêu lần lượt cao hơn hoặc thấp hơn mục tiêu. Sự tăng trưởng theo cấp số nhân này khiến việc duy trì kích thước khối ở mức cao vô thời hạn trở nên không khả thi về mặt kinh tế.
+
+| Khối số | Bao gồm Gas | Tăng phí | Phí cơ bản hiện tại |
+| ------- | ----------: | -------: | ------------------: |
+| 1 | 18 triệu | 0% | 100 gwei |
+| 2 | 36 triệu | 0% | 100 gwei |
+| 3 | 36 triệu | 12,5% | 112,5 Gwei |
+| 4 | 36 triệu | 12,5% | 126,6 Gwei |
+| 5 | 36 triệu | 12,5% | 142,4 Gwei |
+| 6 | 36 triệu | 12,5% | 160,2 Gwei |
+| 7 | 36 triệu | 12,5% | 180,2 Gwei |
+| 8 | 36 triệu | 12,5% | 202,7 Gwei |
+
+Trong bảng trên, một ví dụ được minh họa bằng cách sử dụng 36 triệu làm giới hạn gas. Theo ví dụ này, để tạo một giao dịch trên khối số 9, một ví sẽ cho người dùng biết chắc chắn rằng **phí cơ bản tối đa** được thêm vào khối tiếp theo là `phí cơ bản hiện tại * 112,5%` hoặc `202,7 gwei * 112,5% = 228,1 gwei`.
+
+Đây là một lưu ý quan trọng vì rất ít khi chúng ta thấy các đợt tăng giá kéo dài của những khối đầy, bởi vì tốc độ tăng của phí cơ sở trước một khối đầy diễn ra rất nhanh.
+
+| Khối số | Bao gồm Gas | Tăng phí | Phí cơ bản hiện tại |
+| --------------------------------------------------- | --------------------------------------------------: | -------: | --------------------------------------------------: |
+| 30 | 36 triệu | 12,5% | 2705,6 Gwei |
+| ... | ... | 12,5% | ... |
+| 50 | 36 triệu | 12,5% | 28531,3 Gwei |
+| ... | ... | 12,5% | ... |
+| 100 | 36 triệu | 12,5% | 10302608,6 Gwei |
+
+### Phí ưu tiên (tiền boa) {#priority-fee}
+
+Phí ưu tiên (tiền boa) khuyến khích những người xác thực tối đa hóa số lượng giao dịch trong một khối, chỉ bị giới hạn bởi giới hạn gas của khối. Nếu không có tiền boa, một người xác thực hợp lý có thể bao gồm ít giao dịch hơn—hoặc thậm chí không có giao dịch nào—mà không bị phạt trực tiếp từ lớp thực thi hay lớp đồng thuận, vì phần thưởng staking không phụ thuộc vào số lượng giao dịch trong một khối. Ngoài ra, tiền boa cho phép người dùng trả giá cao hơn những người khác để được ưu tiên trong cùng một khối, báo hiệu một cách hiệu quả về tính cấp thiết.
+
+### Phí tối đa {#maxfee}
+
+Để thực hiện một giao dịch trên mạng lưới, người dùng có thể chỉ định giới hạn tối đa mà họ sẵn sàng trả để giao dịch của họ được thực hiện. Tham số tùy chọn này được gọi là `maxFeePerGas`. Để một giao dich được thực hiện, phí tối đã phải lớn hơn tổng của ( phí cơ bản + tiền thưởng). Người dùng sẽ được hoàn lại khoản chênh lệch giữa phí tối đa và tổng chi phí cơ bản + tiền thưởng.
+
+### Kích thước khối {#block-size}
+
+Mỗi khối có kích thước mục tiêu bằng một nửa giới hạn gas hiện tại, nhưng kích thước của các khối sẽ tăng hoặc giảm theo nhu cầu của mạng, cho đến khi đạt đến giới hạn khối (gấp 2 lần kích thước khối mục tiêu). Giao thức đạt được kích thước khối trung bình cân bằng ở mức mục tiêu thông qua quá trình _tâtonnement_ (thăm dò giá). Điều này có nghĩa là nếu kích thước khối lớn hơn kích thước mục tiêu, giao thức sẽ tăng phí cơ sở cho khối tiếp theo. Tương tự, giao thức sẽ giảm phí cơ sở nếu kích thước khối nhỏ hơn kích thước mục tiêu.
+
+Mức điều chỉnh của phí cơ sở tỷ lệ thuận với độ chênh lệch giữa kích thước khối hiện tại và kích thước mục tiêu. Đây là một phép tính tuyến tính từ -12,5% cho một khối trống, 0% tại kích thước mục tiêu, cho đến +12,5% cho một khối đạt đến giới hạn gas. Giới hạn gas có thể dao động theo thời gian dựa trên tín hiệu của người xác thực, cũng như thông qua các bản nâng cấp mạng. Bạn có thể [xem các thay đổi về giới hạn gas theo thời gian tại đây](https://eth.blockscout.com/stats/averageGasLimit?interval=threeMonths).
+
+[Tìm hiểu thêm về các khối](/developers/docs/blocks/)
+
+### Tính toán phí gas trong thực tế {#calculating-fees-in-practice}
+
+Bạn có thể nêu rõ số tiền mà mình sẵn sàng trả để giao dịch được thực hiện. Tuy nhiên, hầu hết các nhà cung cấp ví sẽ tự động đặt một mức phí giao dịch khuyến nghị (phí cơ sở + phí ưu tiên được đề xuất) để giảm bớt sự phức tạp cho người dùng.
+
+## Tại sao phí Gas tồn tại? {#why-do-gas-fees-exist}
+
+Tóm lại, phí Gas giúp giữ cho mạng lưới Ethereum an toàn. Bằng cách yêu cầu trả phí cho mỗi phép tính hoàn tất trên mạng, chúng ta ngăn chặn những kẻ xấu Spam mạng lưới. Để tránh các vòng lặp vô hạn (dù là vô tình hay ác ý) hoặc các sự lãng phí tính toán khác trong mã nguồn, mỗi giao dịch đều phải đặt ra một giới hạn về số bước tính toán có thể sử dụng khi thực thi mã nguồn. Đơn vị cơ bản của tính toán là “Gas”.
+
+Mặc dù một giao dịch có bao gồm một giới hạn, nhưng bất kỳ lượng gas nào không được sử dụng trong giao dịch sẽ được trả lại cho người dùng (ví dụ: `phí tối đa - (phí cơ bản + tiền boa)` sẽ được trả lại).
+
+
+_Sơ đồ được phỏng theo [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_
+
+## Giới hạn gas là gì? {#what-is-gas-limit}
+
+Giới hạn gas là lượng gas tối đa bạn sẵn sàng trả cho một giao dịch. Các giao dịch phức tạp hơn liên quan đến [hợp đồng thông minh](/developers/docs/smart-contracts/) đòi hỏi nhiều công việc tính toán hơn, vì vậy chúng yêu cầu giới hạn gas cao hơn so với một thanh toán đơn giản. Một giao dịch chuyển ETH tiêu chuẩn yêu cầu giới hạn là 21.000 đơn vị gas.
+
+Ví dụ, nếu bạn đặt giới hạn Gas là 50.000 cho một giao dịch chuyển ETH đơn giản, EVM sẽ tiêu thụ 21.000 và bạn sẽ nhận lại 29.000 còn dư. Tuy nhiên, nếu bạn đặt quá ít gas, chẳng hạn giới hạn Gas là 20.000 cho một giao dịch chuyển ETH đơn giản, thì giao dịch sẽ thất bại trong giai đoạn xác thực. Nó sẽ bị từ chối trước khi được ghi vào một khối, và gas sẽ không bị tiêu thụ. Ngoài ra, nếu một giao dịch hết Gas trong quá trình thực thi (ví dụ: một hợp đồng thông minh sử dụng hết toàn bộ Gas khi mới chạy được nửa chừng), máy chủ ảo Ethereum sẽ hoàn tác tất cả các thay đổi, nhưng toàn bộ lượng Gas đã cung cấp vẫn sẽ bị tiêu thụ cho phần công việc đã thực hiện.
+
+## Tại sao phí gas có thể lên cao đến vậy? {#why-can-gas-fees-get-so-high}
+
+Phí gas cao là do sự phổ biến của Ethereum. Nếu nhu cầu quá cao, người dùng phải đưa ra mức phí ưu tiên lớn hơn để cố gắng trả giá cao hơn các giao dịch của những người dùng khác. Lượng tip cao hơn sẽ tăng cơ hội giao dịch của bạn được ghi vào khối tiếp theo. Đồng thồi, các ứng dụng hợp đồng thông minh phức tạp cần xử lý nhiều tác vụ hơn để thực hiện chức năng của chúng, nên có thể tiêu thụ rất nhiều gas.
+
+## Các sáng kiến để giảm chi phí gas {#initiatives-to-reduce-gas-costs}
+
+Các [bản nâng cấp khả năng mở rộng](/roadmap/) của Ethereum cuối cùng sẽ giải quyết một số vấn đề về phí gas, điều này sẽ cho phép nền tảng xử lý hàng nghìn giao dịch mỗi giây và mở rộng quy mô trên toàn cầu.
+
+Layer 2 là là sáng kiến chính để cải thiện về mặt chi phí gas, trải nghiệm người dùng và khả năng mở rộng quy mô.
+
+[Tìm hiểu thêm về mở rộng quy mô lớp 2](/developers/docs/scaling/#layer-2-scaling)
+
+## Giám sát phí gas {#monitoring-gas-fees}
+
+Nếu bạn muốn theo dõi phí gas để có thể tiêu ít ETH hơn, bạn có thể tận dụng nhiều công cụ khác nhau như:
+
+- [Etherscan](https://etherscan.io/gastracker) _Công cụ ước tính giá gas giao dịch_
+- [Blockscout](https://eth.blockscout.com/gas-tracker) _Công cụ ước tính giá gas giao dịch mã nguồn mở_
+- [ETH Gas Tracker](https://www.ethgastracker.com/) _Giám sát và theo dõi giá gas của Ethereum và L2 để giảm phí giao dịch và tiết kiệm tiền_
+- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _Tiện ích mở rộng trên Chrome ước tính gas hỗ trợ cả giao dịch cũ Loại 0 và giao dịch EIP-1559 Loại 2._
+- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _Tính phí gas bằng tiền tệ địa phương của bạn cho các loại giao dịch khác nhau trên Mainnet, Arbitrum và Polygon._
+
+## Các công cụ liên quan {#related-tools}
+
+- [Nền tảng Gas của Blocknative](https://www.blocknative.com/gas) _API ước tính gas được cung cấp bởi nền tảng dữ liệu mempool toàn cầu của Blocknative_
+- [Gas Network](https://gas.network) Các Oracle Gas trên chuỗi. Hỗ trợ hơn 35 chuỗi.
+
+## Đọc thêm {#further-reading}
+
+- [Giải thích về Gas trên Ethereum](https://defiprime.com/gas)
+- [Giảm mức tiêu thụ gas của Hợp đồng thông minh của bạn](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a)
+- [Các chiến lược tối ưu hóa gas cho nhà phát triển](https://www.alchemy.com/overviews/solidity-gas-optimization)
+- [Tài liệu về EIP-1559](https://eips.ethereum.org/EIPS/eip-1559).
+- [Các tài nguyên về EIP-1559 của Tim Beiko](https://hackmd.io/@timbeiko/1559-resources)
+- [EIP-1559: Tách biệt Cơ chế khỏi Meme](https://web.archive.org/web/20241126205908/https://research.2077.xyz/eip-1559-separating-mechanisms-from-memes)
diff --git a/public/content/translations/vi/developers/docs/ides/index.md b/public/content/translations/vi/developers/docs/ides/index.md
new file mode 100644
index 00000000000..eca4bf2f559
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/ides/index.md
@@ -0,0 +1,64 @@
+---
+title: Môi trường phát triển tích hợp (IDE)
+description: Tìm hiểu về các IDE dựa trên web và máy tính bàn cho phát triển Ethereum, bao gồm Remix, VS Code và các plugin phổ biến.
+lang: vi
+---
+
+Khi nói đến việc thiết lập [môi trường phát triển tích hợp (IDE)](https://wikipedia.org/wiki/Integrated_development_environment), việc lập trình các ứng dụng trên Ethereum tương tự như lập trình bất kỳ dự án phần mềm nào khác. Có nhiều tùy chọn để lựa chọn, vì vậy vào cuối ngày, hãy chọn IDE hoặc trình soạn thảo mã phù hợp nhất với sở thích của bạn. Có lẽ lựa chọn IDE tốt nhất cho phát triển Ethereum của bạn là IDE mà bạn đã quen sử dụng cho phát triển phần mềm truyền thống.
+
+## Các IDE dựa trên web {#web-based-ides}
+
+Nếu bạn muốn mày mò với mã trước khi [thiết lập môi trường phát triển cục bộ](/developers/local-environment/), các ứng dụng web này được xây dựng riêng cho việc phát triển hợp đồng thông minh Ethereum.
+
+**[Remix](https://remix.ethereum.org/)** - **_IDE dựa trên web với tính năng phân tích tĩnh tích hợp và một máy ảo blockchain thử nghiệm_**
+
+- [Tài liệu](https://remix-ide.readthedocs.io/en/latest/#)
+- [Gitter](https://gitter.im/ethereum/remix)
+
+**[ChainIDE](https://chainide.com/)** - **_Một IDE đa chuỗi dựa trên đám mây_**
+
+- [Tài liệu](https://chainide.gitbook.io/chainide-english-1/)
+- [Diễn đàn trợ giúp](https://forum.chainide.com/)
+
+**[Replit (Solidity Starter - Beta)](https://replit.com/@replit/Solidity-starter-beta)** - **_Một môi trường phát triển tùy chỉnh được cho Ethereum với tính năng tải lại nóng, kiểm tra lỗi và hỗ trợ mạng thử nghiệm hàng đầu_**
+
+- [Tài liệu](https://docs.replit.com/)
+
+**[Tenderly Sandbox](https://sandbox.tenderly.co/)** - **_Một môi trường tạo mẫu nhanh, nơi bạn có thể viết, thực thi và gỡ lỗi các hợp đồng thông minh trong trình duyệt bằng Solidity và JavaScript_**
+
+**[EthFiddle](https://ethfiddle.com/)** - **_IDE dựa trên web cho phép bạn viết, biên dịch và gỡ lỗi hợp đồng thông minh của mình_**
+
+- [Gitter](https://gitter.im/loomnetwork/ethfiddle)
+
+## Các IDE cho máy tính để bàn {#desktop-ides}
+
+Hầu hết các IDEs nổi tiếng đều đã phát triển các tiện ích để nâng cao trải nghiệm phát triển Ethereum. Ở mức tối thiểu, chúng cung cấp tính năng tô sáng cú pháp cho [các ngôn ngữ hợp đồng thông minh](/developers/docs/smart-contracts/languages/).
+
+**Visual Studio Code -** **_IDE đa nền tảng chuyên nghiệp với sự hỗ trợ chính thức của Ethereum_**
+
+- [Visual Studio Code](https://code.visualstudio.com/)
+- [Mẫu mã](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md)
+- [GitHub](https://github.com/microsoft/vscode)
+
+**Các IDE của JetBrains (IntelliJ IDEA, v.v.) -** **_Các công cụ thiết yếu cho nhà phát triển và các đội ngũ phần mềm_**
+
+- [JetBrains](https://www.jetbrains.com/)
+- [GitHub](https://github.com/JetBrains)
+- [IntelliJ Solidity](https://github.com/intellij-solidity/intellij-solidity/)
+
+**Remix Desktop -** **_Trải nghiệm Remix IDE trên máy tính của bạn_**
+
+- [Tải xuống](https://github.com/ethereum/remix-desktop/releases)
+- [GitHub](https://github.com/ethereum/remix-desktop)
+
+## Các plugin và tiện ích mở rộng {#plugins-extensions}
+
+- [solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) - Ngôn ngữ Solidity của Ethereum dành cho Visual Studio Code
+- [Solidity + Hardhat for VS Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) - Hỗ trợ Solidity và Hardhat bởi đội ngũ Hardhat
+- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) - Trình định dạng mã sử dụng prettier
+
+## Đọc thêm {#further-reading}
+
+- [Các IDE Ethereum](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _- Danh sách các IDE Ethereum của Alchemy_
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/index.md b/public/content/translations/vi/developers/docs/index.md
new file mode 100644
index 00000000000..899ecb3d9e5
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/index.md
@@ -0,0 +1,25 @@
+---
+title: Tài liệu dành cho nhà phát triển Ethereum
+description: Giới thiệu tài liệu hướng dẫn cho lập trình viên trên ethereum.org.
+lang: vi
+---
+
+Tài liệu này được thiết kế để giúp bạn xây dựng với Ethereum. Nó bao gồm Ethereum như một khái niệm, giải thích về công nghệ Ethereum, và tài liệu về các chủ đề nâng cao cho các ứng dụng và trường hợp sử dụng phức tạp hơn.
+
+Đây là một nỗ lực cộng đồng mã nguồn mở, vì vậy hãy thoải mái đề xuất các chủ đề mới, thêm nội dung mới và cung cấp ví dụ ở bất kỳ đâu bạn nghĩ là hữu ích. Tất cả tài liệu tham khảo có thể được chỉnh sửa qua GitHub – nếu bạn không chắc chắn về cách thực hiện, [hãy làm theo các hướng dẫn này](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md).
+
+## Các mô-đun phát triển {#development-modules}
+
+Nếu đây là lần đầu tiên bạn thử nghiệm phát triển trên Ethereum, chúng tôi khuyên bạn nên bắt đầu từ những điều cơ bản và làm việc theo tiến trình như một cuốn sách.
+
+### Các chủ đề nền tảng {#foundational-topics}
+
+
+
+### Hệ thống công nghệ của Ethereum {#ethereum-stack}
+
+
+
+### Nâng cao {#advanced}
+
+
diff --git a/public/content/translations/vi/developers/docs/intro-to-ether/index.md b/public/content/translations/vi/developers/docs/intro-to-ether/index.md
new file mode 100644
index 00000000000..257d5ecaee8
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/intro-to-ether/index.md
@@ -0,0 +1,78 @@
+---
+title: Giới thiệu kỹ thuật về ether
+description: Giới thiệu cho nhà phát triển về đồng tiền mã hóa ether.
+lang: vi
+---
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để giúp bạn hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước [Giới thiệu về Ethereum](/developers/docs/intro-to-ethereum/).
+
+## Tiền mã hóa là gì? {#what-is-a-cryptocurrency}
+
+Một tiền điện tử là một phương tiện trao đổi được bảo mật hóa bằng một sổ cái sử dụng công nghệ blockchain.
+
+Một phương tiện trao đổi là bất kỳ thứ gì được chấp nhận rộng rãi như thanh toán cho hàng hóa và dịch vụ và sổ cái là một kho dữ liệu theo dõi các giao dịch. Công nghệ blockchain cho phép người dùng tạo các giao dịch trên sổ cái mà không phụ thuộc vào một bên thứ ba để duy trì nó.
+
+Tiền điện tử đầu tiên là Bitcoin, được tạo ra bởi Satoshi Nakamoto. Kể từ khi Bitcoin được phát hành vào năm 2009, mọi người đã tạo ra hàng nghìn loại tiền điện tử trên nhiều chuỗi khối khác nhau.
+
+## Ether là gì? {#what-is-ether}
+
+**Ether (ETH)** là tiền mã hóa được sử dụng cho nhiều việc trên mạng Ethereum. Về cơ bản, đây là hình thức thanh toán duy nhất được chấp nhận cho các khoản phí giao dịch và sau [The Merge](/roadmap/merge), ether là bắt buộc để xác thực và đề xuất các khối trên Mainnet. Ether cũng được sử dụng làm một hình thức tài sản thế chấp chính trong các thị trường cho vay [DeFi](/defi), làm một đơn vị tài khoản trong các thị trường NFT, làm khoản thanh toán kiếm được khi thực hiện dịch vụ hoặc bán hàng hóa trong thế giới thực, và hơn thế nữa.
+
+Ethereum cho phép các nhà phát triển tạo [**ứng dụng phi tập trung (dapps)**](/developers/docs/dapps), tất cả đều chia sẻ một nguồn tài nguyên điện toán chung. Bể dùng chung này có hạn, nên Ethereum cần một cơ chế để quyết định xem ai được sử dụng. Nếu không, một dapp có thể vô tình hoặc cố tình tiêu thụ toàn bộ tài nguyên mạng lưới, làm cản trở người khác sử dụng.
+
+Tiền điện tử Ether hỗ trợ một cơ chế định giá cho sức mạnh tính toán của Ethereum. Khi người dùng muốn thực hiện giao dịch, họ phải trả ether để giao dịch của họ được công nhận trên chuỗi khối. Các chi phí sử dụng này được gọi là [phí gas](/developers/docs/gas/), và phí gas phụ thuộc vào lượng tài nguyên điện toán cần thiết để thực hiện giao dịch và nhu cầu về tài nguyên điện toán trên toàn mạng tại thời điểm đó.
+
+Do đó, kể cả nếu dapp hiểm độc gửi đi một vòng lặp vô tận, giao dịch sẽ dần tiêu tốn hết ether và kết thúc, cho phép mạng lưới trở lại bình thường.
+
+Việc [nhầm lẫn](https://abcnews.go.com/Business/bitcoin-slumps-week-low-amid-renewed-worries-chinese/story?id=78399845) giữa Ethereum và ether là rất phổ biến — khi mọi người đề cập đến "giá của Ethereum", họ đang mô tả giá của ether.
+
+## Đúc ether {#minting-ether}
+
+Khai thác là quá trình được đó ether mới được tạo trên sổ cái Ethereum. Giao thức Ethereum cơ bản tạo ra ether mơi và người dùng không thể tạo ether.
+
+Ether được tạo ra khi một khối mới được tạo trên chuỗi khối Ethereum. Tổng lượng phát hành tuỳ thuộc vào số lượng nút xác thực và số lượng ether họ đã ký gửi. Số lượng phát hành được chia đều cho các nút trong trường hợp hoàn hảo là tất cả các nút xác thực đều thật thà và trực tuyến, nhưng trong thực tế, số lượng ấy tuỳ thuộc vào hiệu suất của nút xác thực. Khoảng 1/8 tổng lượng phát hành được trao cho người đề xuất khối; phần còn lại được phân phối cho các nút xác thực khác. Người đề xuất khối cũng nhận được tiền hoa hồng từ phí giao dịch và thu nhập liên quan đến MEV, nhưng đến từ Ether được tái lưu thông, chứ không phải phát hành mới.
+
+## Đốt ether {#burning-ether}
+
+Song song với việc tạo ether qua phần thường khối, ether cũng có thể bị xoá bỏ qua một quá trình gọi là 'đốt'. Khi ether bị đốt, nó sẽ vĩnh viễn bị loại bỏ khỏi lưu thông.
+
+Việc đốt ether xảy ra trong mọi giao dịch trên Ethereum. Khi người dùng thanh toán cho các giao dịch của họ, một khoản phí gas cơ bản, do mạng đặt ra theo nhu cầu giao dịch giúp đơn giản hoá việc ước tính phí giao dịch trên Ethereum. Điều này, cùng với kích thước khối thay đổi và mức phí Gas tối đa, giúp đơn giản hóa việc ước tính phí giao dịch trên Ethereum. Khi nhu cầu mạng cao, [các khối](https://eth.blockscout.com/block/22580057) có thể đốt nhiều ether hơn lượng chúng đúc, bù trừ một cách hiệu quả cho việc phát hành ether.
+
+Đốt phí cơ bản làm giảm khả năng của người tạo khối thao túng giao dịch. Ví dụ, nếu người tạo khối nhận được phí cơ bản, họ có thể đưa các giao dịch của chính mình vào một cách miễn phí và tăng phí cơ bản cho mọi người khác. Ngoài ra, họ có thể hoàn trả phí cơ bản cho một số người dùng ngoài chuỗi, dẫn đến một thị trường phí giao dịch phức tạp và kém minh bạch hơn.
+
+## Các mệnh giá của ether {#denominations}
+
+Vì giá trị của nhiều giao dịch trên Ethereum là nhỏ, nên Ether có nhiều mệnh giá, có thể được dùng như các đơn vị tính nhỏ hơn. Trong những đơn vị này, Wei và Gwei là quan trọng nhất.
+
+Wei là lượng ether nhỏ nhất có thể có, và do đó, nhiều triển khai kỹ thuật, chẳng hạn như [Sách vàng Ethereum](https://ethereum.github.io/yellowpaper/paper.pdf), sẽ dựa trên Wei cho mọi tính toán.
+
+Gwei, viết tắt của giga-wei, được sử dụng thường xuyên để miêu tả phí gas trên Ethereum.
+
+| Đơn vị | Giá trị ether | Thường Sử Dụng Trong |
+| ------ | ---------------- | ----------------------- |
+| Wei | 10-18 | Các phát triển kỹ thuật |
+| Gwei | 10-9 | Đọc phí gas |
+
+## Chuyển ether {#transferring-ether}
+
+Mỗi giao dịch trên Ethereum chứa một trường `value`, chỉ định lượng ether sẽ được chuyển, được tính bằng wei, để gửi từ địa chỉ của người gửi đến địa chỉ người nhận.
+
+Khi địa chỉ người nhận là một [hợp đồng thông minh](/developers/docs/smart-contracts/), lượng ether được chuyển này có thể được dùng để trả phí gas khi hợp đồng thông minh thực thi mã của nó.
+
+[Tìm hiểu thêm về các giao dịch](/developers/docs/transactions/)
+
+## Truy vấn ether {#querying-ether}
+
+Người dùng có thể truy vấn số dư ether của bất kỳ [tài khoản](/developers/docs/accounts/) nào bằng cách kiểm tra trường `balance` của tài khoản, trường này cho thấy lượng ether nắm giữ được tính bằng wei.
+
+[Etherscan](https://etherscan.io) và [Blockscout](https://eth.blockscout.com) là những công cụ phổ biến để kiểm tra số dư địa chỉ thông qua các ứng dụng trên nền tảng web. Ví dụ: [trang Blockscout này](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) hiển thị số dư của Ethereum Foundation. Số dư tài khoản cũng có thể được truy vấn qua các ví hay yêu cầu trực tiếp đến các nút.
+
+## Đọc thêm {#further-reading}
+
+- [Định nghĩa ether và Ethereum](https://www.cmegroup.com/education/courses/introduction-to-ether/defining-ether-and-ethereum.html) – _CME Group_
+- [Sách trắng Ethereum](/whitepaper/): Đề xuất ban đầu cho Ethereum. Tài liệu này bao gồm một miêu tả về ether và động lực đằng sau sự ra đời của nó.
+- [Công cụ tính Gwei](https://www.alchemy.com/gwei-calculator): Sử dụng công cụ tính gwei này để dễ dàng chuyển đổi giữa wei, gwei và ether. Chỉ cần điền bất kỳ wei, gwei hay ETH và tự động tính toán lượng quy đổi.
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
new file mode 100644
index 00000000000..6ba7041196f
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
@@ -0,0 +1,124 @@
+---
+title: Giới thiệu kỹ thuật về Ethereum
+description: Một bản hướng dẫn cho các nhà phát triển ứng dụng phi tập trung cho đến các khái niệm cốt lõi của Ethereum.
+lang: vi
+---
+
+## Chuỗi khối là gì? {#what-is-a-blockchain}
+
+Một chuỗi khối là một cơ sở dữ liệu công khai được cập nhật và chia sẻ giữa nhiều máy tính trong một mạng lưới.
+
+"Khối" đề cập đến dữ liệu và trạng thái được lưu trữ trong các nhóm liên tiếp, được biết đến là "các khối". Khi bạn gửi ETH đến người khác, dữ liệu của giao dịch cần được thêm vào một khối để được coi là thành công.
+
+"Chuỗi" liên quan đến thực tế rằng, mỗi khối tham chiếu mã hóa đến khối mẹ của chúng. Hay nói cách khác, các khối được xâu chuỗi với nhau. Dữ liệu trong một khối không thể thay đổi mà không làm các khối tiếp theo nó thay đổi, điều mà sẽ cần đến sự đồng thuận của toàn mạng lưới.
+
+Mọi máy tính trong mạng lưới cần phải đồng ý về mỗi khối mới và toàn phần chuỗi. Những máy tính được biết đến là các "nút". Các nút đảm bảo tất cả mọi người tiếp xúc với mạng chuỗi khối có cùng dữ liệu. Để đạt được sự đồng thuận phân tán này, chuỗi khối cần một cơ chế đồng thuận.
+
+Ethereum sử dụng một [cơ chế đồng thuận dựa trên bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/). Bất cư ai muốn thêm khối vào chuỗi phải ký gửi ETH - đồng tiền bản địa của Ethereum - làm thế chấp và chạy phần mềm nút xác thực. Những "nút xác thực" này sẽ được chọn ngẫu nhiên để đề nghị thêm khối và được kiểm tra bởi các nút xác thực khác và ghi vào chuỗi khối. Có một hệ thống thưởng và phạt được sử dụng để khuyến khích những người tham gia trung thực và có mặt trực tuyến nhiều nhất có thể.
+
+Nếu bạn muốn xem cách dữ liệu chuỗi khối được băm và sau đó được thêm vào lịch sử tham chiếu khối, hãy chắc chắn xem [bản demo này](https://andersbrownworth.com/blockchain/blockchain) của Anders Brownworth và xem video đi kèm bên dưới.
+
+Xem Ander giải thích hàm băm trong chuỗi khối:
+
+
+
+## Ethereum Là gì? {#what-is-ethereum}
+
+Ethereum là một chuỗi khối với một máy tính nhúng vào nó. Nó là nền tảng để xây dựng ứng dụng và tổ chức trong một môi trường phi tập trung, không cần xin phép và chống kiểm duyệt.
+
+Nếu như trong vũ trụ Ethereum, sẽ chỉ có một, máy tính chuẩn tắc duy nhất (được gọi là máy chủ ảo Ethereum) mà toàn bộ mạng lưới Ethereum đều đồng thuận về trạng thái của nó. Những ai tham gia vào mạng lưới Ethereum (mỗi nút Ethereum) giữ một phiên bản trạng thái của máy tính này. Thêm vào đó, những người tham gia có thể phát tán những yêu cầu từ máy chủ để thực hiện phép tính tùy thích. Khi nào những yêu cầu đó được phát tán đi, những người tham gia mạng lưới sẽ tham gia xác thực, hợp thuwcss hóa, và xử lí tính toán. Sự thực thi này làm một thay đổi trên trạng thái máy chủ ảo Ethereum (EVM), được ghi nhận và phát tán ra khắp mạng lưới.
+
+Những yêu cầu tính toán này được gọi là yêu cầu giao dịch; những ghi chép của tất cả giao dịch và trạng thái EVM hiện tại được lưu trữ trên chuỗi khối, sau đó được lưu trữ và đồng tình ở trên tất cả các nút.
+
+Các cơ chế mật mã học đảm bảo rằng một khi giao dịch được xác minh là hợp lệ và thêm vào mạng lưới, thì sau không thể bị giả mạo hoặc chỉnh sửa. Các cơ chế tương từ cũng đảm bảo rằng mọi giao dịch đều đưcọ ký và thực thi với quyền hạn phù hợp (không ai có thể gửi tài sản số từ tài khoản của Alice ngoại trừ chính Alice).
+
+## Ether là gì? {#what-is-ether}
+
+**Ether (ETH)** là đồng tiền mã hóa gốc của Ethereum. Mục đích của ETH là để cho phép một thị trường tính tồn tại. Một thị trường như vậy cung cấp động lực kinh tế cho những người tham gia để họ xác minh và thực thi các yêu cầu giao dịch, đồng thời cung cấp tài nguyên tính toán cho mạng lưới.
+
+Bất kỳ người tham gia nào phát sóng một yêu cầu giao dịch cũng phải cung cấp cho mạng lưới một lượng ETH nhất định như một khoản thưởng. Mạng lưới sẽ đốt một phần của chi phí này và trao phần còn lại cho bất kỳ ai cuối cùng thực hiện công việc xác minh giao dịch, thực thi nó, ghi nhận nó lên chuỗi khối và phát sóng nó đến toàn bộ mạng lưới.
+
+Lượng ETH được trả phụ thuộc và tài nguyên cần để tính toán. Những phần thưởng này cũng chặn những kẻ tham gia mạng lưới với mục đích xấu làm tắc nghẽn mạng lưới bằng cách thực hiện một vòng lặp tính toán vô tận hoặc một phép tính siêu tiêu tốn tài nguyên, bởi vì họ sẽ phải trả phí cho tài nguyên tính toán.
+
+Eth cũng sử dụng cơ chế "mật mã học-kinh tế" để đảm bảo an toàn mạn lưới trong 3 phương pháp chính: 1) nó được sử dụng để thưởng cho nút xác thực người đề xuất khối hoặc răn đe những trường hợp gian lận bởi những nút xác thực khác; 2) nó được sử dụng để Stake bởi các nút xác thực, đóng vai trò là tài sản thế chấp chống lại hành vi gian lận - nếu như nút xác thực cố gian lận thì ETH của họ bị hủy đi; 3) nó là một công cụ để làm trọng số phiếu bầu cho việc đề xuất khối mới, cho phép đưa vào phần quy tắc chọn nhánh (Fork-Choice) của cơ chế đồng thuận.
+
+## Hợp đồng thông minh là gì? Hợp đồng thông minh là gì? {#what-are-smart-contracts}
+
+Trong thực tế, người tham gia không viết mã mới mỗi khi họ muốn yêu cầu một phép tính toán trên EVM. Thay vào đó, người lập trình ứng dụng tải các chương trình (các đoạn mã có thể tái sử dụng) lên trạng thái của EVM, và người dùng gửi yêu cầu để thực thi các đoạn mã này với những tham số khác nhau. Chúng tôi gọi các chương trình được tải lên và thực thi bởi mạng là "hợp đồng thông minh".
+
+Có thể nghĩ đơn giản là hợp đồng thông minh giống như một máy bán hàng tự động: một kịch bản khi mà ở một giới hạn nhất định, thực hiện hành động hoặc tính toán nếu như đúng điều kiện. Ví dụ, một hợp đồng thông minh bán hàng đơn giản có thể tạo ra và gán quyền sở hữu của một tài sản số nếu người gọi gửi ETH đến một người nhận cụ thể.
+
+Bất kỳ nhà phát triển nào cũng có thể tạo một hợp đồng thông minh và công khai nó cho mạng lưới, sử dụng chuỗi khối làm lớp dữ liệu, với một khoản phí trả cho mạng lưới. Sau đó, bất kỳ người dùng nào cũng có thể gọi hợp đồng thông minh để thực thi mã nguồn của nó, cũng với một khoản phí trả cho mạng lưới.
+
+Từ đó, với hợp đồng thông minh, các nhà phát triển có thể xây dựng và thực thi những ứng dụng và dịch vụ có độ phức tạp tùy ý như: chợ bán hàng, công cụ tài chính, game,...
+
+## Thuật ngữ {#terminology}
+
+### Chuỗi khối {#blockchain}
+
+Thứ tự của những khối được ghi vĩnh viễn lên mạng lưới Ethereum và trong lịch sử của mạng lưới. Sở dĩ được gọi như vậy là vì mỗi khối đều chứa tham chiếu đến khối trước đó, điều này giúp chúng ta duy trì thứ tự giữa tất cả các khối (và do đó là toàn bộ lịch sử chính xác).
+
+### ETH {#eth}
+
+**Ether (ETH)** là đồng tiền mã hóa gốc của Ethereum. Người dùng trả ETH cho người khác để được thực thi mã nguồn của họ.
+
+[Tìm hiểu thêm về ETH](/developers/docs/intro-to-ether/)
+
+### Máy ảo Ethereum {#evm}
+
+Máy chủ ảo Ethereum là một máy chủ ảo toàn cầu mà trạng thái của mỗi người tham gia mạng lưới của Ethereum được lưu trữ và đồng thuận. Bất kì người tham gia có thể yêu câu một thực thi mã nguồn tùy thích trên EVM; mã nguồn được thực thi sẽ thay đổi trạng thái của EVM.
+
+[Tìm hiểu thêm về EVM](/developers/docs/evm/)
+
+### Các nút {#nodes}
+
+Một máy móc đời thực đang lưu trữ trạng thái của EVM. Các nút giao tiếp với nhau để đề lan truyền thông tin về trạng thái EVM và thay đổi trạng thái mới. Bất kì người dùng nào cũng có thể yêu cầu mã người phát tán và yêu cầu mã nguồn thực thi trên một nút. Mạng lưới Ethereum chính nó là tập hợp những nút Ethereum mà chúng nó giao tiếp với nhau.
+
+[Tìm hiểu thêm về các nút](/developers/docs/nodes-and-clients/)
+
+### Các tài khoản {#accounts}
+
+Nơi ETH được lưu trữ. Người dùng có thể khởi tạo tài khoản, nạp ETH vào tài khoản, và chuyển ETH từ tài khoản của mình sang cho người dùng khác. Các tài khoản và số dư tài khoản được lưu trữ trong một bảng tính lớn trong EVM; chúng là một phần của trạng thái tổng thể của EVM.
+
+[Tìm hiểu thêm về các tài khoản](/developers/docs/accounts/)
+
+### Các giao dịch {#transactions}
+
+Một "yêu cầu giao dịch" là thuật ngữ chính thức cho một yêu cầu thực thi mã nguồn trên EVM, và "một giao dịch" là một yêu cầu giao dịch đã được hoàn tất và liên kết thay đổi trong trạng thái mạng lưới EVM. Bất kì người dùng nào cũng có thể phát tán yêu cầu giao dịch cho mạng lưới từ nút. Để yêu cầu giao dịch ảnh hưởng lên trạng thái đã được đồng thuận trên EVM, nó phải được thực thi hợp lệ, và "ghi trên mạng lưới" bởi một nút khác. Thực thi bất kì mã nguồn nào gây nên thay đổi trạng thái EVM; tới khi được ghi, trạng thái này được lan truyền cho tất cả nút trong mạng lưới. Một vài ví dụ cho những giao dịch:
+
+- Gửi X ETH từ tài khoản của tôi tới tài khoản của Alice.
+- Công khai một mã nguồn hợp đồng thông minh lên máy chủ EVM.
+- Thực thi một mã nguồn của hợp đồng thông minh tại địa chỉ X trên EVM, với đồng ý Y.
+
+[Tìm hiểu thêm về các giao dịch](/developers/docs/transactions/)
+
+### Các khối {#blocks}
+
+Khối lượng giao dịch rất cao, nên các giao dịch được "cam kết" theo lô, hay các khối. Khối nói chúng chứa hàng chục đến hàng trăm giao dịch.
+
+[Tìm hiểu thêm về các khối](/developers/docs/blocks/)
+
+### Hợp đồng thông minh {#smart-contracts}
+
+Một mẫu mã nguồn tái sử dụng (một chương trình) mà lập trình viên công khai trên trạng thái EVM. Bất kì ai cũng có thể yêu câu cầu một mã nguồn hợp đồng thông minh thực thi bằng cách gửi yêu cầu giao dịch. Bởi vì các nhà phát triển có thể viết các ứng dụng thực thi tùy ý vào EVM (trò chơi, thị trường, công cụ tài chính, v.v.) bằng cách xuất bản các hợp đồng thông minh, chúng cũng thường được gọi là [dapps, hay Các ứng dụng phi tập trung](/developers/docs/dapps/).
+
+[Tìm hiểu thêm về hợp đồng thông minh](/developers/docs/smart-contracts/)
+
+## Đọc thêm {#further-reading}
+
+- [Sách trắng Ethereum](/whitepaper/)
+- [Rốt cuộc thì Ethereum hoạt động như thế nào?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) - _Preethi Kasireddy_ (**Lưu ý:** tài liệu này vẫn có giá trị nhưng xin lưu ý rằng nó được viết trước [The Merge](/roadmap/merge) và do đó vẫn đề cập đến cơ chế bằng chứng công việc của Ethereum - Ethereum hiện được bảo mật bằng [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos))
+
+### Tìm hiểu thêm từ video trực quan? Người học qua hình ảnh {#visual-learner}
+
+Chuỗi video này cho phép khám phá các chủ đề nền tảng:
+
+
+
+[Danh sách phát về những kiến thức cơ bản của Ethereum](https://youtube.com/playlist?list=PLqgutSGloqiJyyoL0zvLVFPS-GMD2wKa5&si=kZTf5I7PKGTXDsOZ)
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Hướng dẫn cho nhà phát triển về Ethereum, phần 1](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _– Một khám phá Ethereum rất thân thiện với người mới bắt đầu, sử dụng Python và web3.py_
diff --git a/public/content/translations/vi/developers/docs/mev/index.md b/public/content/translations/vi/developers/docs/mev/index.md
new file mode 100644
index 00000000000..3261a6ade01
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/mev/index.md
@@ -0,0 +1,221 @@
+---
+title: Nhuận quyền thợ đào (MEV)
+description: An introduction to maximal extractable value (MEV)
+lang: vi
+---
+
+Giá trị trích xuất tối đa (MEV) đề cập đến giá trị tối đa có thể được trích xuất từ việc sản xuất khối ngoài phần thưởng khối tiêu chuẩn và phí gas bằng cách bao gồm, loại trừ và thay đổi thứ tự các giao dịch trong một khối.
+
+## Giá trị trích xuất tối đa {#maximal-extractable-value}
+
+Giá trị trích xuất tối đa lần đầu tiên được áp dụng trong bối cảnh [bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/), và ban đầu được gọi là "giá trị thợ đào có thể trích xuất". Điều này là do trong bằng chứng công việc, các thợ đào kiểm soát việc bao gồm, loại trừ và sắp xếp thứ tự giao dịch. Tuy nhiên, kể từ khi chuyển đổi sang bằng chứng cổ phần thông qua [The Merge](/roadmap/merge), những người xác thực đã chịu trách nhiệm cho các vai trò này và việc khai thác không còn là một phần của giao thức Ethereum. Tuy nhiên, các phương pháp trích xuất giá trị vẫn tồn tại, do đó thuật ngữ "Giá trị trích xuất tối đa" hiện được sử dụng thay thế.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Hãy chắc chắn rằng bạn đã quen thuộc với [giao dịch](/developers/docs/transactions/), [khối](/developers/docs/blocks/), [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos) và [gas](/developers/docs/gas/). Việc quen thuộc với [các ứng dụng phi tập trung](/apps/) và [DeFi](/defi/) cũng rất hữu ích.
+
+## Trích xuất MEV {#mev-extraction}
+
+Về lý thuyết, MEV hoàn toàn thuộc về những người xác thực vì họ là bên duy nhất có thể đảm bảo việc thực hiện một cơ hội MEV có lợi nhuận. Tuy nhiên, trên thực tế, một phần lớn MEV được trích xuất bởi những người tham gia mạng độc lập được gọi là "người tìm kiếm." Người tìm kiếm chạy các thuật toán phức tạp trên dữ liệu chuỗi khối để phát hiện các cơ hội MEV có lợi nhuận và có các bot để tự động gửi các giao dịch có lợi nhuận đó đến mạng.
+
+Dù sao thì những người xác thực cũng nhận được một phần trong tổng số tiền MEV vì những người tìm kiếm sẵn sàng trả phí gas cao (phí này sẽ thuộc về người xác thực) để đổi lấy khả năng cao hơn về việc các giao dịch có lợi nhuận của họ được đưa vào một khối. Giả sử những người tìm kiếm có lý trí về mặt kinh tế, phí gas mà người tìm kiếm sẵn sàng trả sẽ là một khoản tiền lên tới 100% MEV của người tìm kiếm (bởi vì nếu phí gas cao hơn, người tìm kiếm sẽ mất tiền).
+
+Với điều đó, đối với một số cơ hội MEV có tính cạnh tranh cao, chẳng hạn như [kinh doanh chênh lệch giá DEX](#mev-examples-dex-arbitrage), người tìm kiếm có thể phải trả 90% hoặc thậm chí nhiều hơn tổng doanh thu MEV của họ dưới dạng phí gas cho người xác thực vì có rất nhiều người muốn chạy cùng một giao dịch kinh doanh chênh lệch giá có lợi nhuận. Điều này là do cách duy nhất để đảm bảo rằng giao dịch kinh doanh chênh lệch giá của họ được chạy là nếu họ gửi giao dịch với giá gas cao nhất.
+
+### Gas golfing {#mev-extraction-gas-golfing}
+
+Động lực này đã khiến việc giỏi "gas golfing" — lập trình các giao dịch sao cho chúng sử dụng lượng gas ít nhất — trở thành một lợi thế cạnh tranh, bởi vì nó cho phép những người tìm kiếm đặt giá gas cao hơn trong khi vẫn giữ nguyên tổng phí gas của họ (vì phí gas = giá gas \* gas đã sử dụng).
+
+Một vài kỹ thuật gas golf nổi tiếng bao gồm: sử dụng các địa chỉ bắt đầu bằng một chuỗi số không dài (ví dụ: [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://eth.blockscout.com/address/0x0000000000C521824EaFf97Eac7B73B084ef9306)) vì chúng chiếm ít không gian hơn (và do đó tốn ít gas hơn) để lưu trữ; và để lại số dư token [ERC-20](/developers/docs/standards/tokens/erc-20/) nhỏ trong các hợp đồng, vì việc khởi tạo một khe lưu trữ (trường hợp nếu số dư là 0) sẽ tốn nhiều gas hơn là cập nhật một khe lưu trữ. Việc tìm ra nhiều kỹ thuật hơn để giảm mức sử dụng gas là một lĩnh vực nghiên cứu tích cực của những người tìm kiếm.
+
+### Những kẻ chạy trước tổng quát {#mev-extraction-generalized-frontrunners}
+
+Thay vì lập trình các thuật toán phức tạp để phát hiện các cơ hội MEV có lợi nhuận, một số người tìm kiếm chạy những kẻ chạy trước tổng quát. Những kẻ chạy trước tổng quát là các bot theo dõi mempool để phát hiện các giao dịch có lợi nhuận. Kẻ chạy trước sẽ sao chép mã của giao dịch có khả năng sinh lời, thay thế các địa chỉ bằng địa chỉ của kẻ chạy trước và chạy giao dịch cục bộ để kiểm tra kỹ rằng giao dịch đã sửa đổi có mang lại lợi nhuận cho địa chỉ của kẻ chạy trước hay không. Nếu giao dịch thực sự có lãi, kẻ chạy trước sẽ gửi giao dịch đã sửa đổi với địa chỉ được thay thế và giá gas cao hơn, "chạy trước" giao dịch ban đầu và nhận được MEV của người tìm kiếm ban đầu.
+
+### Flashbots {#mev-extraction-flashbots}
+
+Flashbots là một dự án độc lập mở rộng các máy khách thực thi với một dịch vụ cho phép người tìm kiếm gửi các giao dịch MEV cho người xác thực mà không tiết lộ chúng cho mempool công khai. Điều này ngăn các giao dịch bị chạy trước bởi những kẻ chạy trước tổng quát.
+
+## Các ví dụ về MEV {#mev-examples}
+
+MEV xuất hiện trên chuỗi khối theo một vài cách.
+
+### Kinh doanh chênh lệch giá trên DEX {#mev-examples-dex-arbitrage}
+
+Kinh doanh chênh lệch giá trên [sàn giao dịch phi tập trung](/glossary/#dex) (DEX) là cơ hội MEV đơn giản và nổi tiếng nhất. Do đó, đây cũng là cơ hội cạnh tranh nhất.
+
+Nó hoạt động như thế này: nếu hai DEX đang cung cấp một token ở hai mức giá khác nhau, ai đó có thể mua token trên DEX giá thấp hơn và bán nó trên DEX giá cao hơn trong một giao dịch nguyên tử duy nhất. Nhờ cơ chế của chuỗi khối, đây là hình thức kinh doanh chênh lệch giá thực sự không có rủi ro.
+
+[Đây là một ví dụ](https://eth.blockscout.com/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4) về một giao dịch kinh doanh chênh lệch giá có lợi nhuận, trong đó một người tìm kiếm đã biến 1.000 ETH thành 1.045 ETH bằng cách tận dụng các mức giá khác nhau của cặp ETH/Dai trên Uniswap so với Sushiswap.
+
+### Thanh lý {#mev-examples-liquidations}
+
+Thanh lý giao thức cho vay là một cơ hội MEV nổi tiếng khác.
+
+Các giao thức cho vay như Maker và Aave yêu cầu người dùng gửi một số tài sản thế chấp (ví dụ: ETH). Tài sản thế chấp đã gửi này sau đó được sử dụng để cho những người dùng khác vay.
+
+Người dùng sau đó có thể vay tài sản và token từ người khác tùy thuộc vào nhu cầu của họ (ví dụ: bạn có thể vay MKR nếu muốn bỏ phiếu trong một đề xuất quản trị của MakerDAO) lên đến một tỷ lệ phần trăm nhất định trên tài sản thế chấp đã gửi của họ. Ví dụ: nếu số tiền vay tối đa là 30%, một người dùng gửi 100 Dai vào giao thức có thể vay một tài sản khác trị giá lên tới 30 Dai. Giao thức xác định tỷ lệ phần trăm khả năng vay chính xác.
+
+Khi giá trị tài sản thế chấp của người đi vay biến động, khả năng vay của họ cũng vậy. Nếu do biến động của thị trường, giá trị của tài sản đã vay vượt quá, giả sử là 30% giá trị tài sản thế chấp của họ (một lần nữa, tỷ lệ phần trăm chính xác được xác định bởi giao thức), giao thức thường cho phép bất kỳ ai thanh lý tài sản thế chấp, ngay lập tức trả hết nợ cho người cho vay (điều này tương tự như cách [lệnh gọi ký quỹ](https://www.investopedia.com/terms/m/margincall.asp) hoạt động trong tài chính truyền thống). Nếu bị thanh lý, người đi vay thường phải trả một khoản phí thanh lý khá lớn, một phần trong số đó sẽ thuộc về người thanh lý — đó là nơi cơ hội MEV xuất hiện.
+
+Những người tìm kiếm cạnh tranh để phân tích cú pháp dữ liệu chuỗi khối nhanh nhất có thể để xác định người đi vay nào có thể bị thanh lý và là người đầu tiên gửi giao dịch thanh lý và tự mình thu phí thanh lý.
+
+### Giao dịch kẹp {#mev-examples-sandwich-trading}
+
+Giao dịch kẹp là một phương pháp trích xuất MEV phổ biến khác.
+
+Để thực hiện giao dịch kẹp, một người tìm kiếm sẽ theo dõi mempool để tìm các giao dịch DEX lớn. Ví dụ, giả sử ai đó muốn mua 10.000 UNI bằng Dai trên Uniswap. Một giao dịch có quy mô này sẽ có tác động đáng kể đến cặp UNI/Dai, có khả năng làm tăng đáng kể giá của UNI so với Dai.
+
+Một người tìm kiếm có thể tính toán tác động giá gần đúng của giao dịch lớn này đối với cặp UNI/Dai và thực hiện một lệnh mua tối ưu ngay _trước_ giao dịch lớn, mua UNI với giá rẻ, sau đó thực hiện một lệnh bán ngay _sau_ giao dịch lớn, bán nó với giá cao hơn do lệnh lớn gây ra.
+
+Tuy nhiên, giao dịch kẹp có rủi ro cao hơn vì nó không phải là nguyên tử (không giống như kinh doanh chênh lệch giá DEX, như đã mô tả ở trên) và dễ bị [tấn công salmonella](https://github.com/Defi-Cartel/salmonella).
+
+### MEV NFT {#mev-examples-nfts}
+
+MEV trong không gian NFT là một hiện tượng mới nổi và không nhất thiết phải có lợi nhuận.
+
+Tuy nhiên, vì các giao dịch NFT xảy ra trên cùng một chuỗi khối được chia sẻ bởi tất cả các giao dịch Ethereum khác, những người tìm kiếm cũng có thể sử dụng các kỹ thuật tương tự như những kỹ thuật được sử dụng trong các cơ hội MEV truyền thống trên thị trường NFT.
+
+Ví dụ, nếu có một đợt phát hành NFT phổ biến và một người tìm kiếm muốn một NFT hoặc một bộ NFT nhất định, họ có thể lập trình một giao dịch sao cho họ là người đầu tiên xếp hàng để mua NFT đó, hoặc họ có thể mua toàn bộ bộ NFT trong một giao dịch duy nhất. Hoặc nếu một NFT bị [niêm yết nhầm với giá thấp](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent), một người tìm kiếm có thể chạy trước những người mua khác và giành lấy nó với giá rẻ.
+
+Một ví dụ nổi bật về MEV NFT đã xảy ra khi một người tìm kiếm đã chi 7 triệu đô la để [mua](https://eth.blockscout.com/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5?tab=txs) tất cả các Cryptopunk ở mức giá sàn. Một nhà nghiên cứu chuỗi khối đã [giải thích trên Twitter](https://twitter.com/IvanBogatyy/status/1422232184493121538) cách người mua đã làm việc với một nhà cung cấp MEV để giữ bí mật việc mua hàng của họ.
+
+### Đuôi dài {#mev-examples-long-tail}
+
+Kinh doanh chênh lệch giá trên DEX, thanh lý và giao dịch kẹp đều là những cơ hội MEV rất nổi tiếng và không có khả năng mang lại lợi nhuận cho những người tìm kiếm mới. Tuy nhiên, có một cái đuôi dài gồm các cơ hội MEV ít được biết đến hơn (MEV NFT được cho là một cơ hội như vậy).
+
+Những người tìm kiếm mới bắt đầu có thể tìm thấy nhiều thành công hơn bằng cách tìm kiếm MEV trong cái đuôi dài hơn này. [Bảng công việc MEV](https://github.com/flashbots/mev-job-board) của Flashbot niêm yết một số cơ hội mới nổi.
+
+## Tác động của MEV {#effects-of-mev}
+
+MEV không hoàn toàn xấu — có cả hậu quả tích cực và tiêu cực đối với MEV trên Ethereum.
+
+### Mặt tốt {#effects-of-mev-the-good}
+
+Nhiều dự án DeFi dựa vào các tác nhân có lý trí về mặt kinh tế để đảm bảo tính hữu dụng và ổn định của các giao thức của họ. Ví dụ: kinh doanh chênh lệch giá trên DEX đảm bảo rằng người dùng nhận được mức giá tốt nhất, chính xác nhất cho token của họ và các giao thức cho vay dựa vào việc thanh lý nhanh chóng khi người đi vay giảm xuống dưới tỷ lệ thế chấp để đảm bảo người cho vay được trả lại tiền.
+
+Nếu không có những người tìm kiếm hợp lý tìm kiếm và khắc phục những thiếu hiệu quả kinh tế và tận dụng các ưu đãi kinh tế của giao thức, các giao thức DeFi và các ứng dụng phi tập trung nói chung có thể không mạnh mẽ như ngày nay.
+
+### Mặt xấu {#effects-of-mev-the-bad}
+
+Ở lớp ứng dụng, một số dạng MEV, như giao dịch kẹp, dẫn đến trải nghiệm tồi tệ hơn rõ ràng cho người dùng. Những người dùng bị kẹp phải đối mặt với tình trạng trượt giá gia tăng và thực hiện giao dịch của họ tồi tệ hơn.
+
+Ở lớp mạng, những kẻ chạy trước tổng quát và các cuộc đấu giá giá gas mà chúng thường tham gia (khi hai hoặc nhiều kẻ chạy trước cạnh tranh để giao dịch của họ được đưa vào khối tiếp theo bằng cách tăng dần giá gas cho giao dịch của chính họ) dẫn đến tắc nghẽn mạng và giá gas cao cho tất cả những người khác đang cố gắng chạy các giao dịch thông thường.
+
+Ngoài những gì đang xảy ra _bên trong_ các khối, MEV có thể có những tác động bất lợi _giữa_ các khối. Nếu MEV có sẵn trong một khối vượt quá đáng kể phần thưởng khối tiêu chuẩn, người xác thực có thể được khuyến khích tổ chức lại các khối và tự mình nắm bắt MEV, gây ra sự tái tổ chức chuỗi khối và bất ổn về sự đồng thuận.
+
+Khả năng tái tổ chức chuỗi khối này đã được [khám phá trước đây trên chuỗi khối Bitcoin](https://dl.acm.org/doi/10.1145/2976749.2978408). Khi phần thưởng khối của Bitcoin giảm một nửa và phí giao dịch chiếm một phần ngày càng lớn trong phần thưởng khối, các tình huống nảy sinh khi các thợ đào trở nên có lý do kinh tế để từ bỏ phần thưởng của khối tiếp theo và thay vào đó khai thác lại các khối trong quá khứ với phí cao hơn. Với sự phát triển của MEV, tình huống tương tự có thể xảy ra ở Ethereum, đe dọa tính toàn vẹn của chuỗi khối.
+
+## Trạng thái của MEV {#state-of-mev}
+
+Việc khai thác MEV đã bùng nổ vào đầu năm 2021, dẫn đến giá gas cực kỳ cao trong vài tháng đầu năm. Sự xuất hiện của rơ-le MEV của Flashbots đã làm giảm hiệu quả của các công cụ chạy trước tổng quát và đã đưa các cuộc đấu giá giá gas ra ngoài chuỗi, làm giảm giá gas cho người dùng thông thường.
+
+Trong khi nhiều người tìm kiếm vẫn đang kiếm bộn tiền từ MEV, khi các cơ hội ngày càng được biết đến nhiều hơn và ngày càng có nhiều người tìm kiếm cạnh tranh cho cùng một cơ hội, người xác thực sẽ chiếm được ngày càng nhiều tổng doanh thu MEV (bởi vì cùng loại đấu giá gas như được mô tả ban đầu ở trên cũng xảy ra trong Flashbots, mặc dù ở chế độ riêng tư, và người xác thực sẽ chiếm được doanh thu gas kết quả). MEV cũng không phải là duy nhất đối với Ethereum, và khi các cơ hội trở nên cạnh tranh hơn trên Ethereum, những người tìm kiếm đang chuyển sang các chuỗi khối thay thế như Binance Smart Chain, nơi tồn tại các cơ hội MEV tương tự như trên Ethereum với ít sự cạnh tranh hơn.
+
+Mặt khác, quá trình chuyển đổi từ bằng chứng công việc sang bằng chứng cổ phần và nỗ lực không ngừng nhằm mở rộng quy mô Ethereum bằng cách sử dụng các rollup đều làm thay đổi bối cảnh MEV theo những cách vẫn còn hơi chưa rõ ràng. Vẫn chưa rõ việc có những người đề xuất khối được đảm bảo và biết trước một chút sẽ thay đổi động lực của việc trích xuất MEV như thế nào so với mô hình xác suất trong bằng chứng công việc hoặc điều này sẽ bị gián đoạn như thế nào khi [bầu cử lãnh đạo bí mật duy nhất](https://ethresear.ch/t/secret-non-single-leader-election/11789) và [công nghệ trình xác thực phân tán](/staking/dvt/) được triển khai. Tương tự, vẫn còn phải xem các cơ hội MEV tồn tại khi hầu hết hoạt động của người dùng được chuyển khỏi Ethereum và sang các rollup và shard lớp 2 của nó.
+
+## MEV trong Bằng chứng cổ phần Ethereum (PoS) {#mev-in-ethereum-proof-of-stake}
+
+Như đã giải thích, MEV có những tác động tiêu cực đến trải nghiệm người dùng tổng thể và bảo mật lớp đồng thuận. Nhưng quá trình chuyển đổi của Ethereum sang sự đồng thuận bằng chứng cổ phần (được mệnh danh là “The Merge”) có khả năng giới thiệu các rủi ro mới liên quan đến MEV:
+
+### Tập trung hóa trình xác thực {#validator-centralization}
+
+Trong Ethereum sau The Merge, những người xác thực (đã đặt cọc bảo mật 32 ETH) đi đến sự đồng thuận về tính hợp lệ của các khối được thêm vào Chuỗi Hải Đăng. Vì 32 ETH có thể nằm ngoài tầm với của nhiều người, [tham gia một bể staking](/staking/pools/) có thể là một lựa chọn khả thi hơn. Tuy nhiên, một sự phân bổ lành mạnh của [những người staking đơn lẻ](/staking/solo/) là lý tưởng, vì nó giảm thiểu sự tập trung hóa của những người xác thực và cải thiện tính bảo mật của Ethereum.
+
+Tuy nhiên, việc khai thác MEV được cho là có khả năng đẩy nhanh quá trình tập trung hóa trình xác thực. Điều này một phần là do, khi người xác thực [kiếm được ít hơn cho việc đề xuất các khối](/roadmap/merge/issuance/#how-the-merge-impacts-ETH-supply) so với các thợ đào trước đây, việc khai thác MEV đã [ảnh hưởng lớn đến thu nhập của người xác thực](https://github.com/flashbots/eth2-research/blob/main/notebooks/mev-in-eth2/eth2-mev-calc.ipynb) kể từ [The Merge](/roadmap/merge/).
+
+Các bể staking lớn hơn có thể sẽ có nhiều tài nguyên hơn để đầu tư vào các tối ưu hóa cần thiết để nắm bắt các cơ hội MEV. Các bể này càng trích xuất nhiều MEV, chúng càng có nhiều tài nguyên để cải thiện khả năng trích xuất MEV của mình (và tăng tổng doanh thu), về cơ bản tạo ra [tính kinh tế theo quy mô](https://www.investopedia.com/terms/e/economiesofscale.asp#).
+
+Với ít tài nguyên hơn, những người staking đơn lẻ có thể không thể kiếm lợi từ các cơ hội MEV. Điều này có thể làm tăng áp lực lên những người xác thực độc lập để tham gia các bể staking mạnh mẽ để tăng thu nhập của họ, làm giảm sự phi tập trung trong Ethereum.
+
+### Mempool được cấp phép {#permissioned-mempools}
+
+Để đối phó với các cuộc tấn công kẹp và chạy trước, các nhà giao dịch có thể bắt đầu tiến hành các giao dịch ngoài chuỗi với những người xác thực để bảo mật giao dịch. Thay vì gửi một giao dịch MEV tiềm năng đến mempool công khai, nhà giao dịch sẽ gửi nó trực tiếp đến người xác thực, người sẽ đưa nó vào một khối và chia lợi nhuận với nhà giao dịch.
+
+“Các bể tối” là một phiên bản lớn hơn của sự sắp xếp này và hoạt động như các mempool chỉ cho phép truy cập, được cấp phép, mở cho những người dùng sẵn sàng trả một số khoản phí nhất định. Xu hướng này sẽ làm giảm tính không cần cấp phép và không cần tin cậy của Ethereum và có khả năng biến chuỗi khối thành một cơ chế “trả tiền để chơi” có lợi cho người trả giá cao nhất.
+
+Các mempool được cấp phép cũng sẽ đẩy nhanh các rủi ro tập trung hóa được mô tả trong phần trước. Các bể lớn chạy nhiều trình xác thực có thể sẽ được hưởng lợi từ việc cung cấp quyền riêng tư giao dịch cho các nhà giao dịch và người dùng, làm tăng doanh thu MEV của họ.
+
+Chống lại các vấn đề liên quan đến MEV này trong Ethereum sau The Merge là một lĩnh vực nghiên cứu cốt lõi. Cho đến nay, hai giải pháp được đề xuất để giảm tác động tiêu cực của MEV đối với sự phi tập trung và bảo mật của Ethereum sau The Merge là [**Phân tách Người đề xuất-Người xây dựng (PBS)**](/roadmap/pbs/) và [**API của Người xây dựng**](https://github.com/ethereum/builder-specs).
+
+### Phân tách Người đề xuất-Người xây dựng {#proposer-builder-separation}
+
+Trong cả bằng chứng công việc và bằng chứng cổ phần, một nút xây dựng một khối sẽ đề xuất nó để thêm vào chuỗi cho các nút khác tham gia vào sự đồng thuận. Một khối mới trở thành một phần của chuỗi chính tắc sau khi một thợ đào khác xây dựng trên nó (trong PoW) hoặc nó nhận được sự chứng thực từ phần lớn người xác thực (trong PoS).
+
+Sự kết hợp giữa vai trò nhà sản xuất khối và người đề xuất khối là nguyên nhân gây ra hầu hết các vấn đề liên quan đến MEV được mô tả trước đây. Ví dụ, các nút đồng thuận được khuyến khích kích hoạt các cuộc tái tổ chức chuỗi trong [các cuộc tấn công kẻ cướp thời gian](https://www.mev.wiki/attack-examples/time-bandit-attack) để tối đa hóa thu nhập MEV.
+
+[Phân tách người đề xuất-người xây dựng](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) (PBS) được thiết kế để giảm thiểu tác động của MEV, đặc biệt là ở lớp đồng thuận. Tính năng chính của PBS là phân tách các quy tắc của nhà sản xuất khối và người đề xuất khối. Người xác thực vẫn chịu trách nhiệm đề xuất và bỏ phiếu cho các khối, nhưng một loại thực thể chuyên biệt mới, được gọi là **người xây dựng khối**, được giao nhiệm vụ sắp xếp các giao dịch và xây dựng các khối.
+
+Trong PBS, người xây dựng khối tạo một gói giao dịch và đặt giá thầu để được đưa vào khối Chuỗi Hải Đăng (dưới dạng “tải trọng thực thi”). Người xác thực được chọn để đề xuất khối tiếp theo sau đó sẽ kiểm tra các giá thầu khác nhau và chọn gói có phí cao nhất. PBS về cơ bản tạo ra một thị trường đấu giá, nơi những người xây dựng đàm phán với những người xác thực bán không gian khối.
+
+Các thiết kế PBS hiện tại sử dụng [sơ đồ cam kết-tiết lộ](https://gitcoin.co/blog/commit-reveal-scheme-on-ethereum/) trong đó người xây dựng chỉ xuất bản một cam kết mật mã đối với nội dung của khối (tiêu đề khối) cùng với giá thầu của họ. Sau khi chấp nhận giá thầu thắng cuộc, người đề xuất sẽ tạo một đề xuất khối đã ký bao gồm tiêu đề khối. Người xây dựng khối dự kiến sẽ xuất bản toàn bộ nội dung khối sau khi thấy đề xuất khối đã ký và nó cũng phải nhận đủ [sự chứng thực](/glossary/#attestation) từ những người xác thực trước khi được hoàn tất.
+
+#### Làm thế nào việc phân tách người đề xuất-người xây dựng giảm thiểu tác động của MEV? {#how-does-pbs-curb-mev-impact}
+
+Việc phân tách người đề xuất-người xây dựng trong giao thức làm giảm tác động của MEV đối với sự đồng thuận bằng cách loại bỏ việc trích xuất MEV khỏi phạm vi của người xác thực. Thay vào đó, những người xây dựng khối chạy phần cứng chuyên dụng sẽ nắm bắt các cơ hội MEV trong tương lai.
+
+Tuy nhiên, điều này không loại trừ hoàn toàn người xác thực khỏi thu nhập liên quan đến MEV, vì người xây dựng phải đặt giá thầu cao để các khối của họ được người xác thực chấp nhận. Tuy nhiên, với việc người xác thực không còn trực tiếp tập trung vào việc tối ưu hóa thu nhập MEV, mối đe dọa về các cuộc tấn công kẻ cướp thời gian sẽ giảm.
+
+Việc phân tách người đề xuất-người xây dựng cũng làm giảm rủi ro tập trung hóa của MEV. Ví dụ, việc sử dụng sơ đồ cam kết-tiết lộ loại bỏ nhu cầu người xây dựng tin tưởng người xác thực không ăn cắp cơ hội MEV hoặc tiết lộ nó cho những người xây dựng khác. Điều này làm giảm rào cản cho những người staking đơn lẻ hưởng lợi từ MEV, nếu không, những người xây dựng sẽ có xu hướng ủng hộ các bể lớn có uy tín ngoài chuỗi và tiến hành các giao dịch ngoài chuỗi với họ.
+
+Tương tự, người xác thực không cần phải tin tưởng người xây dựng không giữ lại nội dung khối hoặc xuất bản các khối không hợp lệ vì việc thanh toán là vô điều kiện. Phí của người xác thực vẫn được xử lý ngay cả khi khối được đề xuất không có sẵn hoặc bị những người xác thực khác tuyên bố là không hợp lệ. Trong trường hợp sau, khối chỉ đơn giản là bị loại bỏ, buộc người xây dựng khối phải mất tất cả phí giao dịch và doanh thu MEV.
+
+### API của Người xây dựng {#builder-api}
+
+Mặc dù việc phân tách người đề xuất-người xây dựng hứa hẹn sẽ làm giảm tác động của việc trích xuất MEV, nhưng việc triển khai nó đòi hỏi những thay đổi đối với giao thức đồng thuận. Cụ thể, quy tắc [lựa chọn phân nhánh](/developers/docs/consensus-mechanisms/pos/#fork-choice) trên Chuỗi Hải Đăng sẽ cần được cập nhật. [API của Người xây dựng](https://github.com/ethereum/builder-specs) là một giải pháp tạm thời nhằm cung cấp một triển khai hoạt động của việc phân tách người đề xuất-người xây dựng, mặc dù có các giả định về độ tin cậy cao hơn.
+
+API của Người xây dựng là một phiên bản sửa đổi của [API Công cụ](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) được các ứng dụng lớp đồng thuận sử dụng để yêu cầu tải trọng thực thi từ các ứng dụng lớp thực thi. Như được nêu trong [đặc tả trình xác thực trung thực](https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/validator.md), các trình xác thực được chọn cho nhiệm vụ đề xuất khối sẽ yêu cầu một gói giao dịch từ một máy khách thực thi được kết nối, mà họ sẽ đưa vào khối Chuỗi Hải Đăng được đề xuất.
+
+API của Người xây dựng cũng hoạt động như một phần mềm trung gian giữa người xác thực và máy khách lớp thực thi; nhưng nó khác biệt vì nó cho phép người xác thực trên Chuỗi Hải Đăng lấy khối từ các thực thể bên ngoài (thay vì xây dựng khối cục bộ bằng máy khách thực thi).
+
+Dưới đây là tổng quan về cách hoạt động của API của Người xây dựng:
+
+1. API của Người xây dựng kết nối trình xác thực với mạng lưới các trình xây dựng khối đang chạy các máy khách lớp thực thi. Giống như trong PBS, người xây dựng là các bên chuyên biệt đầu tư vào việc xây dựng khối đòi hỏi nhiều tài nguyên và sử dụng các chiến lược khác nhau để tối đa hóa doanh thu kiếm được từ MEV + tiền boa ưu tiên.
+
+2. Một người xác thực (chạy một máy khách lớp đồng thuận) yêu cầu tải trọng thực thi cùng với các giá thầu từ mạng lưới các nhà xây dựng. Giá thầu từ các nhà xây dựng sẽ chứa tiêu đề tải trọng thực thi—một cam kết mật mã đối với nội dung của tải trọng—và một khoản phí phải trả cho người xác thực.
+
+3. Người xác thực xem xét các giá thầu đến và chọn tải trọng thực thi có phí cao nhất. Sử dụng API của Người xây dựng, người xác thực tạo một đề xuất khối Chuỗi Hải Đăng "bị che" chỉ bao gồm chữ ký của họ và tiêu đề tải trọng thực thi và gửi nó cho người xây dựng.
+
+4. Người xây dựng chạy API của Người xây dựng dự kiến sẽ phản hồi bằng tải trọng thực thi đầy đủ khi thấy đề xuất khối bị che. Điều này cho phép người xác thực tạo một khối Chuỗi Hải Đăng "đã ký", mà họ sẽ lan truyền khắp mạng.
+
+5. Một người xác thực sử dụng API của Người xây dựng vẫn được kỳ vọng sẽ xây dựng một khối cục bộ trong trường hợp người xây dựng khối không phản hồi kịp thời, để họ không bỏ lỡ phần thưởng đề xuất khối. Tuy nhiên, người xác thực không thể tạo một khối khác bằng cách sử dụng các giao dịch vừa được tiết lộ hoặc một bộ khác, vì điều đó sẽ tương đương với _hành vi gian lận_ (ký hai khối trong cùng một khe), đây là một hành vi có thể bị phạt.
+
+Một ví dụ về việc triển khai API của Người xây dựng là [MEV Boost](https://github.com/flashbots/mev-boost), một cải tiến trên [cơ chế đấu giá Flashbots](https://docs.flashbots.net/Flashbots-auction/overview) được thiết kế để hạn chế các ngoại ứng tiêu cực của MEV trên Ethereum. Đấu giá Flashbots cho phép những người xác thực trong bằng chứng cổ phần thuê ngoài công việc xây dựng các khối có lợi nhuận cho các bên chuyên biệt được gọi là **người tìm kiếm**.
+
+
+Những người tìm kiếm tìm kiếm các cơ hội MEV sinh lợi và gửi các gói giao dịch cho những người đề xuất khối cùng với một [giá thầu kín](https://en.wikipedia.org/wiki/First-price_sealed-bid_auction) để được đưa vào khối. Người xác thực chạy mev-geth, một phiên bản phân nhánh của ứng dụng go-ethereum (Geth) chỉ cần chọn gói có lợi nhuận cao nhất và đưa nó vào như một phần của khối mới. Để bảo vệ những người đề xuất khối (người xác thực) khỏi thư rác và các giao dịch không hợp lệ, các gói giao dịch sẽ đi qua **bộ chuyển tiếp** để xác thực trước khi đến tay người đề xuất.
+
+MEV Boost giữ lại các hoạt động tương tự như đấu giá Flashbots ban đầu, mặc dù có các tính năng mới được thiết kế cho quá trình chuyển đổi sang bằng chứng cổ phần của Ethereum. Những người tìm kiếm vẫn tìm thấy các giao dịch MEV có lợi nhuận để đưa vào các khối, nhưng một loại bên chuyên biệt mới, được gọi là **người xây dựng**, chịu trách nhiệm tổng hợp các giao dịch và các gói thành các khối. Một người xây dựng chấp nhận giá thầu kín từ những người tìm kiếm và chạy các tối ưu hóa để tìm ra thứ tự có lợi nhất.
+
+Bộ chuyển tiếp vẫn chịu trách nhiệm xác thực các gói giao dịch trước khi chuyển chúng cho người đề xuất. Tuy nhiên, MEV Boost giới thiệu **ký quỹ** chịu trách nhiệm cung cấp [tính khả dụng của dữ liệu](/developers/docs/data-availability/) bằng cách lưu trữ các phần thân khối do người xây dựng gửi và các tiêu đề khối do người xác thực gửi. Ở đây, một người xác thực được kết nối với một rơ le yêu cầu các tải trọng thực thi có sẵn và sử dụng thuật toán sắp xếp của MEV Boost để chọn tiêu đề tải trọng có giá thầu cao nhất + tiền boa MEV.
+
+#### API của Người xây dựng giảm thiểu tác động của MEV như thế nào? {#how-does-builder-api-curb-mev-impact}
+
+Lợi ích cốt lõi của API của Người xây dựng là tiềm năng dân chủ hóa quyền truy cập vào các cơ hội MEV. Việc sử dụng các sơ đồ cam kết-tiết lộ giúp loại bỏ các giả định về lòng tin và giảm bớt rào cản gia nhập cho những người xác thực đang tìm cách hưởng lợi từ MEV. Điều này sẽ làm giảm áp lực đối với những người staking đơn lẻ trong việc tích hợp với các bể staking lớn để tăng lợi nhuận MEV.
+
+Việc triển khai rộng rãi API của Người xây dựng sẽ khuyến khích sự cạnh tranh lớn hơn giữa những người xây dựng khối, điều này làm tăng khả năng chống kiểm duyệt. Khi những người xác thực xem xét giá thầu từ nhiều người xây dựng, một người xây dựng có ý định kiểm duyệt một hoặc nhiều giao dịch của người dùng phải trả giá cao hơn tất cả những người xây dựng không kiểm duyệt khác để thành công. Điều này làm tăng đáng kể chi phí kiểm duyệt người dùng và không khuyến khích hành vi này.
+
+Một số dự án, chẳng hạn như MEV Boost, sử dụng API của Người xây dựng như một phần của cấu trúc tổng thể được thiết kế để cung cấp quyền riêng tư giao dịch cho một số bên nhất định, chẳng hạn như các nhà giao dịch đang cố gắng tránh các cuộc tấn công chạy trước/kẹp. Điều này đạt được bằng cách cung cấp một kênh liên lạc riêng tư giữa người dùng và người xây dựng khối. Không giống như các mempool được cấp phép được mô tả trước đó, cách tiếp cận này có lợi vì những lý do sau:
+
+1. Sự tồn tại của nhiều người xây dựng trên thị trường khiến việc kiểm duyệt trở nên không thực tế, điều này mang lại lợi ích cho người dùng. Ngược lại, sự tồn tại của các bể tối tập trung và dựa trên sự tin cậy sẽ tập trung quyền lực vào tay một vài người xây dựng khối và làm tăng khả năng kiểm duyệt.
+
+2. Phần mềm API của Người xây dựng là nguồn mở, cho phép bất kỳ ai cũng có thể cung cấp dịch vụ xây dựng khối. Điều này có nghĩa là người dùng không bị buộc phải sử dụng bất kỳ trình xây dựng khối cụ thể nào và cải thiện tính trung lập và không cần cấp phép của Ethereum. Hơn nữa, các nhà giao dịch tìm kiếm MEV sẽ không vô tình góp phần vào việc tập trung hóa bằng cách sử dụng các kênh giao dịch riêng tư.
+
+## Tài nguyên liên quan {#related-resources}
+
+- [Tài liệu Flashbots](https://docs.flashbots.net/)
+- [Flashbots GitHub](https://github.com/flashbots/pm)
+- [mevboost.org](https://www.mevboost.org/) - _Công cụ theo dõi với các thống kê thời gian thực cho các relay của MEV-Boost và người xây dựng khối_
+
+## Đọc thêm {#further-reading}
+
+- [Giá trị có thể khai thác của thợ đào (MEV) là gì?](https://blog.chain.link/what-is-miner-extractable-value-mev/)
+- [MEV và Tôi](https://www.paradigm.xyz/2021/02/mev-and-me)
+- [Ethereum là một khu rừng tối](https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest/)
+- [Thoát khỏi Khu rừng tối](https://samczsun.com/escaping-the-dark-forest/)
+- [Flashbots: Chạy trước Khủng hoảng MEV](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752)
+- [Chủ đề MEV của @bertcmiller](https://twitter.com/bertcmiller/status/1402665992422047747)
+- [MEV-Boost: Kiến trúc Flashbots sẵn sàng cho The Merge](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177)
+- [MEV Boost là gì](https://www.alchemy.com/overviews/mev-boost)
+- [Tại sao nên chạy mev-boost?](https://writings.flashbots.net/writings/why-run-mevboost/)
+- [Sách Hướng dẫn của Người quá giang về Ethereum](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum)
diff --git a/public/content/translations/vi/developers/docs/networking-layer/index.md b/public/content/translations/vi/developers/docs/networking-layer/index.md
new file mode 100644
index 00000000000..44268b32bf1
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/networking-layer/index.md
@@ -0,0 +1,163 @@
+---
+title: Lớp mạng
+description: Giới thiệu về lớp mạng của Ethereum.
+lang: vi
+sidebarDepth: 2
+---
+
+Ethereum là một mạng ngang hàng với hàng nghìn nút phải có khả năng giao tiếp với nhau bằng các giao thức được tiêu chuẩn hóa. "Lớp mạng" là một chồng các giao thức cho phép các nút đó tìm thấy nhau và trao đổi thông tin. Điều này bao gồm việc "lan truyền" thông tin (giao tiếp một-nhiều) qua mạng cũng như hoán đổi các yêu cầu và phản hồi giữa các nút cụ thể (giao tiếp một-một). Mỗi nút phải tuân thủ các quy tắc mạng cụ thể để đảm bảo chúng đang gửi và nhận thông tin chính xác.
+
+Có hai phần trong phần mềm máy khách (máy khách thực thi và máy khách đồng thuận), mỗi phần có một chồng mạng riêng biệt. Cũng như giao tiếp với các nút Ethereum khác, các máy khách thực thi và đồng thuận phải giao tiếp với nhau. Trang này đưa ra giải thích giới thiệu về các giao thức cho phép giao tiếp này.
+
+Các máy khách thực thi lan truyền các giao dịch qua mạng ngang hàng của lớp thực thi. Điều này đòi hỏi giao tiếp được mã hóa giữa các máy ngang hàng đã được xác thực. Khi một trình xác thực được chọn để đề xuất một khối, các giao dịch từ bể giao dịch cục bộ của nút sẽ được chuyển đến các máy khách đồng thuận thông qua kết nối RPC cục bộ, và sẽ được đóng gói vào các khối Beacon. Các máy khách đồng thuận sau đó sẽ lan truyền các khối Beacon qua mạng p2p của chúng. Điều này đòi hỏi hai mạng p2p riêng biệt: một mạng kết nối các máy khách thực thi để lan truyền giao dịch và một mạng kết nối các máy khách đồng thuận để lan truyền khối.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Một số kiến thức về [các nút và máy khách](/developers/docs/nodes-and-clients/) của Ethereum sẽ hữu ích để hiểu trang này.
+
+## Lớp Thực thi {#execution-layer}
+
+Các giao thức mạng của lớp thực thi được chia thành hai chồng:
+
+- chồng khám phá: được xây dựng trên UDP và cho phép một nút mới tìm các nút ngang hàng để kết nối
+
+- chồng DevP2P: nằm trên TCP và cho phép các nút trao đổi thông tin
+
+Cả hai chồng hoạt động song song. Chồng khám phá đưa những người tham gia mạng mới vào mạng, và chồng DevP2P cho phép các tương tác của họ.
+
+### Khám phá {#discovery}
+
+Khám phá là quá trình tìm kiếm các nút khác trong mạng. Quá trình này được khởi động bằng cách sử dụng một bộ nhỏ các nút khởi động (bootnodes) (các nút có địa chỉ được [mã hóa cứng](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go) vào máy khách để chúng có thể được tìm thấy ngay lập tức và kết nối máy khách với các nút ngang hàng). Các nút khởi động này chỉ tồn tại để giới thiệu một nút mới cho một bộ các nút ngang hàng - đây là mục đích duy nhất của chúng, chúng không tham gia vào các tác vụ máy khách thông thường như đồng bộ hóa chuỗi và chúng chỉ được sử dụng trong lần đầu tiên máy khách được khởi chạy.
+
+Giao thức được sử dụng cho các tương tác giữa nút và nút khởi động là một dạng sửa đổi của [Kademlia](https://medium.com/coinmonks/a-brief-overview-of-kademlia-and-its-use-in-various-decentralized-platforms-da08a7f72b8f) sử dụng [bảng băm phân tán](https://en.wikipedia.org/wiki/Distributed_hash_table) để chia sẻ danh sách các nút. Mỗi nút có một phiên bản của bảng này chứa thông tin cần thiết để kết nối với các nút ngang hàng gần nhất. Sự 'gần gũi' này không phải là về mặt địa lý - khoảng cách được xác định bởi sự tương đồng của ID nút. Bảng của mỗi nút được làm mới thường xuyên như một tính năng bảo mật. Ví dụ, trong giao thức khám phá [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5), các nút cũng có thể gửi 'quảng cáo' hiển thị các giao thức phụ mà máy khách hỗ trợ, cho phép các nút ngang hàng thương lượng về các giao thức mà cả hai có thể sử dụng để giao tiếp.
+
+Quá trình khám phá bắt đầu bằng một trò chơi PING-PONG. Một PING-PONG thành công sẽ "liên kết" nút mới với một nút khởi động. Thông báo ban đầu cảnh báo một nút khởi động về sự tồn tại của một nút mới tham gia vào mạng là một `PING`. Gói `PING` này bao gồm thông tin đã được băm về nút mới, nút khởi động và một dấu thời gian hết hạn. Nút khởi động nhận `PING` và trả về một `PONG` chứa hàm băm của `PING`. Nếu các hàm băm của `PING` và `PONG` khớp nhau, kết nối giữa nút mới và nút khởi động được xác minh và chúng được cho là đã "liên kết".
+
+Sau khi liên kết, nút mới có thể gửi yêu cầu `FIND-NEIGHBOURS` tới nút khởi động. Dữ liệu được trả về bởi nút khởi động bao gồm một danh sách các nút ngang hàng mà nút mới có thể kết nối. Nếu các nút không được liên kết, yêu cầu `FIND-NEIGHBOURS` sẽ thất bại, do đó nút mới sẽ không thể tham gia vào mạng.
+
+Khi nút mới nhận được danh sách các nút lân cận từ nút khởi động, nó bắt đầu một cuộc trao đổi PING-PONG với mỗi nút trong số đó. Các PING-PONG thành công sẽ liên kết nút mới với các nút lân cận của nó, cho phép trao đổi thông điệp.
+
+```
+khởi động máy khách --> kết nối với nút khởi động --> liên kết với nút khởi động --> tìm các nút lân cận --> liên kết với các nút lân cận
+```
+
+Các máy khách thực thi hiện đang sử dụng giao thức khám phá [Discv4](https://github.com/ethereum/devp2p/blob/master/discv4.md) và đang có nỗ lực tích cực để chuyển sang giao thức [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5).
+
+#### ENR: Bản ghi nút Ethereum {#enr}
+
+[Bản ghi nút Ethereum (ENR)](/developers/docs/networking-layer/network-addresses/) là một đối tượng chứa ba yếu tố cơ bản: một chữ ký (hàm băm của nội dung bản ghi được tạo theo một lược đồ nhận dạng đã thỏa thuận), một số thứ tự theo dõi các thay đổi đối với bản ghi, và một danh sách tùy ý các cặp khóa:giá trị. Đây là một định dạng có khả năng tương thích trong tương lai, cho phép trao đổi thông tin nhận dạng dễ dàng hơn giữa các nút ngang hàng mới và là định dạng [địa chỉ mạng](/developers/docs/networking-layer/network-addresses) được ưa thích cho các nút Ethereum.
+
+#### Tại sao khám phá được xây dựng trên UDP? {#why-udp}
+
+UDP không hỗ trợ bất kỳ kiểm tra lỗi, gửi lại các gói bị lỗi, hoặc tự động mở và đóng kết nối - thay vào đó nó chỉ gửi một luồng thông tin liên tục đến một mục tiêu, bất kể nó có được nhận thành công hay không. Chức năng tối thiểu này cũng có nghĩa là chi phí tối thiểu, làm cho loại kết nối này rất nhanh. Đối với việc khám phá, nơi một nút chỉ đơn giản muốn cho biết sự hiện diện của mình để sau đó thiết lập một kết nối chính thức với một nút ngang hàng, UDP là đủ. Tuy nhiên, đối với phần còn lại của chồng mạng, UDP không phù hợp với mục đích. Việc trao đổi thông tin giữa các nút khá phức tạp và do đó cần một giao thức có đầy đủ tính năng hơn có thể hỗ trợ gửi lại, kiểm tra lỗi, v.v. Chi phí bổ sung liên quan đến TCP là xứng đáng với chức năng bổ sung. Do đó, phần lớn của chồng P2P hoạt động trên TCP.
+
+### DevP2P {#devp2p}
+
+Bản thân DevP2P là một chồng các giao thức mà Ethereum triển khai để thiết lập và duy trì mạng ngang hàng. Sau khi các nút mới tham gia vào mạng, các tương tác của chúng được điều chỉnh bởi các giao thức trong chồng [DevP2P](https://github.com/ethereum/devp2p). Tất cả những giao thức này đều nằm trên TCP và bao gồm giao thức truyền tải RLPx, giao thức dây (wire protocol) và một số giao thức phụ. [RLPx](https://github.com/ethereum/devp2p/blob/master/rlpx.md) là giao thức điều chỉnh việc khởi tạo, xác thực và duy trì các phiên giữa các nút. RLPx mã hóa các thông báo bằng RLP (Recursive Length Prefix - Tiền tố độ dài đệ quy), đây là một phương pháp mã hóa dữ liệu rất hiệu quả về không gian thành một cấu trúc tối thiểu để gửi giữa các nút.
+
+Một phiên RLPx giữa hai nút bắt đầu bằng một cái bắt tay mã hóa ban đầu. Điều này liên quan đến việc nút gửi một thông báo xác thực (auth message) sau đó được xác minh bởi nút ngang hàng. Sau khi xác minh thành công, nút ngang hàng tạo ra một thông báo xác nhận xác thực (auth-acknowledgement message) để trả về cho nút khởi tạo. Đây là một quá trình trao đổi khóa cho phép các nút giao tiếp một cách riêng tư và an toàn. Một cái bắt tay mã hóa thành công sau đó sẽ kích hoạt cả hai nút gửi thông báo "hello" cho nhau "trên đường truyền". Giao thức dây được khởi tạo bằng một cuộc trao đổi thông báo hello thành công.
+
+Các thông báo hello chứa:
+
+- phiên bản giao thức
+- ID máy khách
+- cổng
+- ID nút
+- danh sách các giao thức phụ được hỗ trợ
+
+Đây là thông tin cần thiết cho một tương tác thành công vì nó xác định những khả năng được chia sẻ giữa cả hai nút và cấu hình giao tiếp. Có một quá trình thương lượng giao thức phụ, trong đó danh sách các giao thức phụ được hỗ trợ bởi mỗi nút được so sánh và những giao thức chung cho cả hai nút có thể được sử dụng trong phiên.
+
+Cùng với các thông báo hello, giao thức dây cũng có thể gửi một thông báo "ngắt kết nối" để cảnh báo cho một nút ngang hàng rằng kết nối sẽ bị đóng. Giao thức dây cũng bao gồm các thông báo PING và PONG được gửi định kỳ để giữ cho một phiên luôn mở. Do đó, các cuộc trao đổi giao thức RLPx và giao thức dây thiết lập nền tảng cho việc giao tiếp giữa các nút, cung cấp giàn giáo để trao đổi thông tin hữu ích theo một giao thức phụ cụ thể.
+
+### Các giao thức phụ {#sub-protocols}
+
+#### Giao thức dây {#wire-protocol}
+
+Khi các nút ngang hàng được kết nối và một phiên RLPx đã được bắt đầu, giao thức dây xác định cách các nút ngang hàng giao tiếp. Ban đầu, giao thức dây xác định ba nhiệm vụ chính: đồng bộ hóa chuỗi, lan truyền khối và trao đổi giao dịch. Tuy nhiên, sau khi Ethereum chuyển sang bằng chứng cổ phần, việc lan truyền khối và đồng bộ hóa chuỗi đã trở thành một phần của lớp đồng thuận. Trao đổi giao dịch vẫn nằm trong phạm vi của các máy khách thực thi. Trao đổi giao dịch là việc trao đổi các giao dịch đang chờ xử lý giữa các nút để những người xây dựng khối có thể chọn một số trong số chúng để đưa vào khối tiếp theo. Thông tin chi tiết về các nhiệm vụ này có tại [đây](https://github.com/ethereum/devp2p/blob/master/caps/eth.md). Các máy khách hỗ trợ các giao thức phụ này sẽ hiển thị chúng thông qua [JSON-RPC](/developers/docs/apis/json-rpc/).
+
+#### les (giao thức phụ Ethereum nhẹ) {#les}
+
+Đây là một giao thức tối thiểu để đồng bộ hóa các máy khách nhẹ. Theo truyền thống, giao thức này hiếm khi được sử dụng vì các nút đầy đủ được yêu cầu phục vụ dữ liệu cho các máy khách nhẹ mà không được khuyến khích. Hành vi mặc định của các máy khách thực thi là không phục vụ dữ liệu máy khách nhẹ qua les. Thông tin thêm có trong [thông số kỹ thuật](https://github.com/ethereum/devp2p/blob/master/caps/les.md) của les.
+
+#### Snap {#snap}
+
+[Giao thức snap](https://github.com/ethereum/devp2p/blob/master/caps/snap.md#ethereum-snapshot-protocol-snap) là một tiện ích mở rộng tùy chọn cho phép các nút ngang hàng trao đổi ảnh chụp nhanh các trạng thái gần đây, cho phép các nút ngang hàng xác minh dữ liệu tài khoản và lưu trữ mà không cần phải tải xuống các nút trung gian của cây Merkle.
+
+#### Wit (giao thức witness) {#wit}
+
+[Giao thức witness](https://github.com/ethereum/devp2p/blob/master/caps/wit.md#ethereum-witness-protocol-wit) là một tiện ích mở rộng tùy chọn cho phép trao đổi các bằng chứng trạng thái giữa các nút ngang hàng, giúp đồng bộ hóa các máy khách đến đỉnh của chuỗi.
+
+#### Whisper {#whisper}
+
+Whisper là một giao thức nhằm mục đích cung cấp dịch vụ nhắn tin an toàn giữa các nút ngang hàng mà không cần ghi bất kỳ thông tin nào vào chuỗi khối. Nó từng là một phần của giao thức dây DevP2P nhưng hiện đã không còn được dùng nữa. Các [dự án liên quan](https://wakunetwork.com/) khác tồn tại với mục tiêu tương tự.
+
+## Lớp đồng thuận {#consensus-layer}
+
+Các máy khách đồng thuận tham gia vào một mạng ngang hàng riêng biệt với một thông số kỹ thuật khác. Các máy khách đồng thuận cần tham gia vào việc lan truyền khối để chúng có thể nhận các khối mới từ các nút ngang hàng và quảng bá chúng khi đến lượt chúng là người đề xuất khối. Tương tự như lớp thực thi, điều này trước tiên đòi hỏi một giao thức khám phá để một nút có thể tìm thấy các nút ngang hàng và thiết lập các phiên an toàn để trao đổi các khối, các chứng thực, v.v.
+
+### Khám phá {#consensus-discovery}
+
+Tương tự như các máy khách thực thi, các máy khách đồng thuận sử dụng [discv5](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-discovery-domain-discv5) trên UDP để tìm kiếm các nút ngang hàng. Việc triển khai discv5 của lớp đồng thuận khác với việc triển khai của các máy khách thực thi chỉ ở chỗ nó bao gồm một bộ điều hợp kết nối discv5 vào một chồng [libP2P](https://libp2p.io/), loại bỏ DevP2P. Các phiên RLPx của lớp thực thi không còn được dùng nữa để thay thế cho bắt tay kênh an toàn nhiễu của libP2P.
+
+### ENRs {#consensus-enr}
+
+ENR cho các nút đồng thuận bao gồm khóa công khai, địa chỉ IP, các cổng UDP và TCP của nút và hai trường dành riêng cho sự đồng thuận: trường bit mạng con chứng thực và khóa `eth2`. Trường hợp đầu tiên giúp các nút dễ dàng tìm thấy các nút ngang hàng tham gia vào các mạng con lan truyền chứng thực cụ thể. Khóa `eth2` chứa thông tin về phiên bản phân nhánh Ethereum mà nút đang sử dụng, đảm bảo các nút ngang hàng đang kết nối với đúng Ethereum.
+
+### libP2P {#libp2p}
+
+Chồng libP2P hỗ trợ tất cả các giao tiếp sau khi khám phá. Các máy khách có thể quay số và lắng nghe trên IPv4 và/hoặc IPv6 như được định nghĩa trong ENR của chúng. Các giao thức trên lớp libP2P có thể được chia thành các miền lan truyền (gossip) và yêu cầu/phản hồi (req/resp).
+
+### Lan truyền {#gossip}
+
+Miền lan truyền bao gồm tất cả thông tin phải được lan truyền nhanh chóng trên toàn mạng. Điều này bao gồm các khối beacon, bằng chứng, chứng thực, thoát và các hành vi phạt. Điều này được truyền bằng libP2P gossipsub v1 và dựa vào các siêu dữ liệu khác nhau được lưu trữ cục bộ tại mỗi nút, bao gồm kích thước tối đa của các tải trọng lan truyền để nhận và truyền. Thông tin chi tiết về miền lan truyền có tại [đây](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub).
+
+### Yêu cầu-phản hồi {#request-response}
+
+Miền yêu cầu-phản hồi chứa các giao thức để các máy khách yêu cầu thông tin cụ thể từ các nút ngang hàng của chúng. Các ví dụ bao gồm việc yêu cầu các khối Beacon cụ thể khớp với các hàm băm gốc nhất định hoặc trong một phạm vi các slot. Các phản hồi luôn được trả về dưới dạng các byte được mã hóa SSZ và nén bằng snappy.
+
+## Tại sao máy khách đồng thuận lại ưu tiên SSZ hơn RLP? {#ssz-vs-rlp}
+
+SSZ là viết tắt của tuần tự hóa đơn giản (simple serialization). Nó sử dụng các độ lệch cố định giúp dễ dàng giải mã các phần riêng lẻ của một thông báo đã được mã hóa mà không cần phải giải mã toàn bộ cấu trúc, điều này rất hữu ích cho máy khách đồng thuận vì nó có thể lấy hiệu quả các mẩu thông tin cụ thể từ các thông báo đã được mã hóa. Nó cũng được thiết kế đặc biệt để tích hợp với các giao thức Merkle, với các lợi ích về hiệu quả liên quan cho việc Merkle hóa. Vì tất cả các hàm băm trong lớp đồng thuận đều là các gốc Merkle, điều này tạo nên một cải tiến đáng kể. SSZ cũng đảm bảo các biểu diễn duy nhất của các giá trị.
+
+## Kết nối các máy khách thực thi và đồng thuận {#connecting-clients}
+
+Cả máy khách đồng thuận và máy khách thực thi đều chạy song song. Chúng cần được kết nối để máy khách đồng thuận có thể cung cấp hướng dẫn cho máy khách thực thi, và máy khách thực thi có thể chuyển các gói giao dịch cho máy khách đồng thuận để đưa vào các khối Beacon. Giao tiếp giữa hai máy khách có thể được thực hiện bằng cách sử dụng kết nối RPC cục bộ. Một API được gọi là ['Engine-API'](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) xác định các hướng dẫn được gửi giữa hai máy khách. Vì cả hai máy khách đều nằm sau một danh tính mạng duy nhất, chúng chia sẻ một ENR (bản ghi nút Ethereum) chứa một khóa riêng cho mỗi máy khách (khóa eth1 và khóa eth2).
+
+Tóm tắt luồng điều khiển được hiển thị bên dưới, với chồng mạng liên quan trong ngoặc.
+
+### Khi máy khách đồng thuận không phải là người sản xuất khối: {#when-consensus-client-is-not-block-producer}
+
+- Máy khách đồng thuận nhận một khối thông qua giao thức lan truyền khối (p2p đồng thuận)
+- Máy khách đồng thuận xác thực trước khối, tức là đảm bảo khối đến từ một người gửi hợp lệ với siêu dữ liệu chính xác
+- Các giao dịch trong khối được gửi đến lớp thực thi dưới dạng tải trọng thực thi (kết nối RPC cục bộ)
+- Lớp thực thi thực hiện các giao dịch và xác thực trạng thái trong tiêu đề khối (tức là kiểm tra các hàm băm khớp nhau)
+- Lớp thực thi chuyển dữ liệu xác thực trở lại lớp đồng thuận, khối hiện được coi là đã được xác thực (kết nối RPC cục bộ)
+- Lớp đồng thuận thêm khối vào đầu chuỗi khối của chính nó và chứng thực cho nó, quảng bá chứng thực qua mạng (p2p đồng thuận)
+
+### Khi máy khách đồng thuận là người sản xuất khối: {#when-consensus-client-is-block-producer}
+
+- Máy khách đồng thuận nhận được thông báo rằng nó là người sản xuất khối tiếp theo (p2p đồng thuận)
+- Lớp đồng thuận gọi phương thức `create block` trong máy khách thực thi (RPC cục bộ)
+- Lớp thực thi truy cập vào mempool giao dịch đã được điền bởi giao thức lan truyền giao dịch (p2p thực thi)
+- Máy khách thực thi gói các giao dịch thành một khối, thực hiện các giao dịch và tạo ra một hàm băm khối
+- Máy khách đồng thuận lấy các giao dịch và hàm băm khối từ máy khách thực thi và thêm chúng vào khối beacon (RPC cục bộ)
+- Máy khách đồng thuận quảng bá khối qua giao thức lan truyền khối (p2p đồng thuận)
+- Các máy khách khác nhận khối được đề xuất thông qua giao thức lan truyền khối và xác thực như được mô tả ở trên (p2p đồng thuận)
+
+Một khi khối đã được chứng thực bởi đủ các trình xác thực, nó sẽ được thêm vào đầu chuỗi, được biện minh và cuối cùng được hoàn tất.
+
+
+
+
+Sơ đồ lớp mạng cho các máy khách đồng thuận và thực thi, từ [ethresear.ch](https://ethresear.ch/t/eth1-eth2-client-relationship/7248)
+
+## Đọc thêm {#further-reading}
+
+[DevP2P](https://github.com/ethereum/devp2p)
+[LibP2p](https://github.com/libp2p/specs)
+[Thông số kỹ thuật mạng lớp đồng thuận](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure)
+[kademlia sang discv5](https://vac.dev/kademlia-to-discv5)
+[Bài báo Kademlia](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf)
+[Giới thiệu về mạng p2p của Ethereum](https://p2p.paris/en/talks/intro-ethereum-networking/)
+[Mối quan hệ eth1/eth2](http://ethresear.ch/t/eth1-eth2-client-relationship/7248)
+[Video chi tiết về việc hợp nhất và máy khách eth2](https://www.youtube.com/watch?v=zNIrIninMgg)
diff --git a/public/content/translations/vi/developers/docs/networking-layer/network-addresses/index.md b/public/content/translations/vi/developers/docs/networking-layer/network-addresses/index.md
new file mode 100644
index 00000000000..a2f54509922
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/networking-layer/network-addresses/index.md
@@ -0,0 +1,39 @@
+---
+title: Các địa chỉ mạng
+description: Giới thiệu về địa chỉ mạng.
+lang: vi
+sidebarDepth: 2
+---
+
+Các nút Ethereum phải tự nhận dạng bằng một số thông tin cơ bản để kết nối với các nút ngang hàng. Để đảm bảo bất kỳ nút ngang hàng tiềm năng nào cũng có thể diễn giải thông tin này, thông tin sẽ được chuyển tiếp theo một trong ba định dạng được tiêu chuẩn hóa mà bất kỳ nút Ethereum nào cũng có thể hiểu được: multiaddr, enode hoặc Ethereum Node Records (ENRs). ENR là tiêu chuẩn hiện tại cho các địa chỉ mạng Ethereum.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Cần có một số hiểu biết về [lớp mạng](/developers/docs/networking-layer/) của Ethereum để hiểu trang này.
+
+## Multiaddr {#multiaddr}
+
+Định dạng địa chỉ nút Ethereum ban đầu là 'multiaddr' (viết tắt của 'multi-addresses'). Multiaddr là một định dạng phổ quát được thiết kế cho các mạng ngang hàng. Các địa chỉ được biểu thị dưới dạng các cặp khóa-giá trị với các khóa và giá trị được phân tách bằng dấu gạch chéo. Ví dụ: multiaddr cho một nút có địa chỉ IPv4 `192.168.22.27` đang lắng nghe trên cổng TCP `33000` trông như sau:
+
+`/ip4/192.168.22.27/tcp/33000`
+
+Đối với một nút Ethereum, multiaddr chứa ID nút (một hàm băm của khóa công khai của nút đó):
+
+`/ip4/192.168.22.27/tcp/33000/p2p/5t7Nv7dG2d6ffbvAiewVsEwWweU3LdebSqX2y1bPrW8br`
+
+## Enode {#enode}
+
+Enode là một cách để nhận dạng một nút Ethereum bằng định dạng địa chỉ URL. ID nút dạng thập lục phân được mã hóa trong phần tên người dùng của URL, được phân tách khỏi máy chủ bằng ký hiệu @. Tên máy chủ chỉ có thể được cung cấp dưới dạng địa chỉ IP; tên DNS không được phép. Cổng trong phần tên máy chủ là cổng lắng nghe TCP. Nếu các cổng TCP và UDP (khám phá) khác nhau, cổng UDP được chỉ định là tham số truy vấn "discport".
+
+Trong ví dụ sau, URL nút mô tả một nút có địa chỉ IP `10.3.58.6`, cổng TCP `30303` và cổng khám phá UDP `30301`.
+
+`enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303?discport=30301`
+
+## Bản ghi nút Ethereum (ENRs) {#enr}
+
+Bản ghi nút Ethereum (ENRs) là một định dạng được tiêu chuẩn hóa cho các địa chỉ mạng trên Ethereum. Chúng thay thế multiaddr và enode. Những bản ghi này đặc biệt hữu ích vì chúng cho phép trao đổi thông tin nhiều hơn giữa các nút. ENR chứa một chữ ký, số thứ tự và các trường mô tả chi tiết sơ đồ nhận dạng được sử dụng để tạo và xác thực các chữ ký. ENR cũng có thể được điền với dữ liệu tùy ý được sắp xếp dưới dạng các cặp khóa-giá trị. Các cặp khóa-giá trị này chứa địa chỉ IP của nút và thông tin về các giao thức con mà nút có thể sử dụng. Máy khách đồng thuận sử dụng [cấu trúc ENR cụ thể](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure) để xác định các nút khởi động và cũng bao gồm một trường `eth2` chứa thông tin về phân nhánh Ethereum hiện tại và mạng con tán gẫu chứng thực (mạng này kết nối nút với một tập hợp các nút ngang hàng cụ thể có các chứng thực được tổng hợp lại với nhau).
+
+## Đọc thêm {#further-reading}
+
+- [EIP-778: Bản ghi nút Ethereum (ENR)](https://eips.ethereum.org/EIPS/eip-778)
+- [LibP2P: Multiaddr-Enode-ENR?!](https://consensys.net/diligence/blog/2020/09/libp2p-multiaddr-enode-enr/)
diff --git a/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
new file mode 100644
index 00000000000..1c94ac88039
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
@@ -0,0 +1,89 @@
+---
+title: Mạng Portal
+description: Tổng quan về Mạng Portal - một mạng đang trong quá trình phát triển được thiết kế để hỗ trợ các máy khách có tài nguyên thấp.
+lang: vi
+---
+
+Ethereum là một mạng lưới bao gồm các máy tính chạy phần mềm máy khách Ethereum. Mỗi máy tính này được gọi là một 'nút'. Phần mềm máy khách cho phép một nút gửi và nhận dữ liệu trên mạng Ethereum và xác minh dữ liệu theo các quy tắc giao thức của Ethereum. Các nút lưu giữ rất nhiều dữ liệu lịch sử trong bộ nhớ đĩa và bổ sung vào đó khi chúng nhận được các gói thông tin mới, được gọi là các khối, từ các nút khác trên mạng. Điều này là cần thiết để luôn kiểm tra xem một nút có thông tin nhất quán với phần còn lại của mạng hay không. Điều này có nghĩa là việc chạy một nút có thể yêu cầu rất nhiều dung lượng đĩa. Một số hoạt động của nút cũng có thể yêu cầu nhiều RAM.
+
+Để giải quyết vấn đề lưu trữ trên đĩa này, các nút 'nhẹ' đã được phát triển để yêu cầu thông tin từ các nút đầy đủ thay vì tự lưu trữ tất cả. Tuy nhiên, điều này có nghĩa là nút nhẹ không tự xác minh thông tin một cách độc lập mà thay vào đó là tin tưởng một nút khác. Điều đó cũng có nghĩa là các nút đầy đủ phải thực hiện thêm công việc để phục vụ các nút nhẹ đó.
+
+Mạng Portal là một thiết kế mạng mới cho Ethereum nhằm giải quyết vấn đề tính sẵn có của dữ liệu cho các nút "nhẹ" mà không cần phải tin tưởng hoặc gây thêm áp lực cho các nút đầy đủ, bằng cách chia sẻ dữ liệu cần thiết thành các phần nhỏ trên toàn mạng.
+
+Tìm hiểu thêm về [các nút và máy khách](/developers/docs/nodes-and-clients/)
+
+## Tại sao chúng ta cần Mạng Portal {#why-do-we-need-portal-network}
+
+Các nút Ethereum lưu trữ bản sao đầy đủ hoặc một phần của chuỗi khối Ethereum. Bản sao cục bộ này được sử dụng để xác thực các giao dịch và đảm bảo nút đang theo đúng chuỗi. Dữ liệu được lưu trữ cục bộ này cho phép các nút xác minh một cách độc lập rằng dữ liệu đến là hợp lệ và chính xác mà không cần phải tin tưởng bất kỳ thực thể nào khác.
+
+Bản sao cục bộ của chuỗi khối cùng với dữ liệu trạng thái và biên nhận liên quan chiếm rất nhiều dung lượng trên đĩa cứng của nút. Ví dụ, một ổ cứng 2TB được khuyến nghị để chạy một nút sử dụng [Geth](https://geth.ethereum.org) được ghép nối với một máy khách đồng thuận. Sử dụng snap sync, chỉ lưu trữ dữ liệu chuỗi từ một bộ khối tương đối gần đây, Geth thường chiếm khoảng 650GB dung lượng đĩa nhưng tăng khoảng 14GB/tuần (bạn có thể định kỳ cắt tỉa nút trở lại 650GB).
+
+Điều này có nghĩa là việc chạy các nút có thể tốn kém, vì một lượng lớn dung lượng đĩa phải được dành riêng cho Ethereum. Có một số giải pháp cho vấn đề này trên lộ trình của Ethereum, bao gồm [hết hạn lịch sử](/roadmap/statelessness/#history-expiry), [hết hạn trạng thái](/roadmap/statelessness/#state-expiry) và [tính không trạng thái](/roadmap/statelessness/). Tuy nhiên, có thể phải mất vài năm nữa những giải pháp này mới được triển khai. Cũng có những [nút nhẹ](/developers/docs/nodes-and-clients/light-clients/) không lưu bản sao dữ liệu chuỗi của riêng chúng, chúng yêu cầu dữ liệu cần thiết từ các nút đầy đủ. Tuy nhiên, điều này có nghĩa là các nút nhẹ phải tin tưởng các nút đầy đủ sẽ cung cấp dữ liệu trung thực và cũng gây áp lực lên các nút đầy đủ phải phục vụ dữ liệu mà các nút nhẹ cần.
+
+Mạng Portal nhằm cung cấp một cách thay thế cho các nút nhẹ để lấy dữ liệu mà không yêu cầu tin tưởng hoặc tăng đáng kể khối lượng công việc mà các nút đầy đủ phải thực hiện. Cách thực hiện điều này là giới thiệu một phương pháp mới để các nút Ethereum chia sẻ dữ liệu trên toàn mạng.
+
+## Mạng Portal hoạt động như thế nào? {#how-does-portal-network-work}
+
+Các nút Ethereum có các giao thức nghiêm ngặt xác định cách chúng giao tiếp với nhau. Các máy khách thực thi giao tiếp bằng một bộ giao thức con được gọi là [DevP2P](/developers/docs/networking-layer/#devp2p), trong khi các máy khách đồng thuận sử dụng một chồng giao thức con khác gọi là [libP2P](/developers/docs/networking-layer/#libp2p). Các giao thức này xác định các loại dữ liệu có thể được truyền giữa các nút.
+
+
+
+Các nút cũng có thể phục vụ dữ liệu cụ thể thông qua [API JSON-RPC](/developers/docs/apis/json-rpc/), đó là cách các ứng dụng và ví hoán đổi thông tin với các nút Ethereum. Tuy nhiên, không có giao thức nào trong số này là lý tưởng để phục vụ dữ liệu cho các máy khách nhẹ.
+
+Các máy khách nhẹ hiện không thể yêu cầu các phần dữ liệu chuỗi cụ thể qua DevP2P hoặc libP2p vì các giao thức đó chỉ được thiết kế để cho phép đồng bộ hóa chuỗi và truyền bá các khối và giao dịch. Các máy khách nhẹ không muốn tải xuống thông tin này vì điều đó sẽ khiến chúng không còn "nhẹ" nữa.
+
+API JSON-RPC cũng không phải là lựa chọn lý tưởng cho các yêu cầu dữ liệu của máy khách nhẹ, vì nó phụ thuộc vào kết nối với một nút đầy đủ cụ thể hoặc nhà cung cấp RPC tập trung có thể phục vụ dữ liệu. Điều này có nghĩa là máy khách nhẹ phải tin tưởng nút/nhà cung cấp cụ thể đó là trung thực, và nút đầy đủ cũng có thể phải xử lý nhiều yêu cầu từ nhiều máy khách nhẹ, làm tăng yêu cầu về băng thông của họ.
+
+Điểm mấu chốt của Mạng Portal là suy nghĩ lại toàn bộ thiết kế, xây dựng đặc biệt cho tính gọn nhẹ, bên ngoài các ràng buộc thiết kế của các máy khách Ethereum hiện có.
+
+Ý tưởng cốt lõi của Mạng Portal là tận dụng những phần tốt nhất của chồng mạng hiện tại bằng cách cho phép thông tin cần thiết cho các máy khách nhẹ, chẳng hạn như dữ liệu lịch sử và danh tính của khối đứng đầu chuỗi hiện tại, được phục vụ thông qua một mạng phi tập trung ngang hàng kiểu DevP2P gọn nhẹ sử dụng [DHT](https://en.wikipedia.org/wiki/Distributed_hash_table) (tương tự như Bittorrent).
+
+Ý tưởng là thêm các phần nhỏ của tổng dữ liệu lịch sử Ethereum và một số trách nhiệm nút cụ thể cho mỗi nút. Sau đó, các yêu cầu được phục vụ bằng cách tìm kiếm các nút lưu trữ dữ liệu cụ thể đã được yêu cầu và truy xuất dữ liệu đó từ chúng.
+
+Điều này đảo ngược mô hình thông thường của các nút nhẹ tìm một nút duy nhất và yêu cầu chúng lọc và phục vụ khối lượng lớn dữ liệu; thay vào đó, chúng nhanh chóng lọc một mạng lưới lớn các nút mà mỗi nút xử lý một lượng nhỏ dữ liệu.
+
+Mục tiêu là cho phép một mạng lưới phi tập trung gồm các máy khách Portal nhẹ có thể:
+
+- theo dõi khối đứng đầu chuỗi
+- đồng bộ hóa dữ liệu chuỗi gần đây và lịch sử
+- truy xuất dữ liệu trạng thái
+- truyền bá các giao dịch
+- thực thi các giao dịch bằng [Máy ảo Ethereum (EVM)](/developers/docs/evm/)
+
+Những lợi ích của thiết kế mạng này là:
+
+- giảm sự phụ thuộc vào các nhà cung cấp tập trung
+- Giảm sử dụng băng thông Internet
+- Đồng bộ hóa tối thiểu hoặc bằng không
+- Có thể truy cập được đối với các thiết bị có tài nguyên hạn chế (\<1 GB RAM, \<100 MB dung lượng đĩa, 1 CPU)
+
+Bảng dưới đây hiển thị các chức năng của các máy khách hiện có mà Mạng Portal có thể cung cấp, cho phép người dùng truy cập các chức năng này trên các thiết bị có tài nguyên rất thấp.
+
+### Các Mạng Portal
+
+| Máy khách nhẹ Beacon | Mạng trạng thái | Lant truyền giao dịch | Mạng lịch sử |
+| -------------------- | ----------------------------- | --------------------- | ------------- |
+| Chuỗi Beacon nhẹ | Lưu trữ tài khoản và hợp đồng | Mempool nhẹ | Tiêu đề |
+| Dữ liệu giao thức | | | Nội dung khối |
+| | | | Biên nhận |
+
+## Đa dạng máy khách theo mặc định {#client-diversity-as-default}
+
+Các nhà phát triển Mạng Portal cũng đã đưa ra lựa chọn thiết kế là xây dựng bốn máy khách Mạng Portal riêng biệt ngay từ ngày đầu.
+
+Các máy khách của Mạng Portal là:
+
+- [Trin](https://github.com/ethereum/trin): viết bằng Rust
+- [Fluffy](https://fluffy.guide): viết bằng Nim
+- [Ultralight](https://github.com/ethereumjs/ultralight): viết bằng Typescript
+- [Shisui](https://github.com/zen-eth/shisui): viết bằng Go
+
+Việc có nhiều triển khai máy khách độc lập giúp tăng cường khả năng phục hồi và tính phi tập trung của mạng Ethereum.
+
+Nếu một máy khách gặp sự cố hoặc lỗ hổng, các máy khách khác có thể tiếp tục hoạt động trơn tru, ngăn chặn một điểm lỗi duy nhất. Ngoài ra, các triển khai máy khách đa dạng thúc đẩy sự đổi mới và cạnh tranh, thúc đẩy các cải tiến và giảm rủi ro đơn văn hóa trong hệ sinh thái.
+
+## Đọc thêm {#further-reading}
+
+- [Mạng Portal (Piper Merriam tại Devcon Bogota)](https://www.youtube.com/watch?v=0stc9jnQLXA).
+- [Discord Mạng Portal](https://discord.gg/CFFnmE7Hbs)
+- [Trang web Mạng Portal](https://www.ethportal.net/)
diff --git a/public/content/translations/vi/developers/docs/networks/index.md b/public/content/translations/vi/developers/docs/networks/index.md
new file mode 100644
index 00000000000..a15b623614d
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/networks/index.md
@@ -0,0 +1,216 @@
+---
+title: Mạng
+description: Tổng quan về các mạng của Ethereum và nơi nhận ether testnet (ETH) để thử nghiệm ứng dụng của bạn.
+lang: vi
+---
+
+Mạng lưới Ethereum là nhóm máy tính được kết nối sử dụng giao thức Ethereum để giao tiếp. Chỉ có một mạng chính Ethereum, nhưng các mạng độc lập tuân theo cùng một bộ quy tắc giao thức được tạo ra để thử nghiệm và phát triển. Có nhiều "mạng lưới" độc lập tuân theo giao thức mà không tương tác với nhau. Bạn có thể bắt đầu một mạng cục bộ trên máy tính của bạn để có thể thử nghiệm hợp đồng thông minh và ứng dụng Web3.
+
+Tài khoản Ethereum của bạn sẽ hoạt động trên các mạng lưới khác nhau, nhưng số dư tài khoản và lịch sử giao dịch của bạn sẽ không được chuyển lên từ mạng Ethereum chính. Đối với mục đích thử nghiệm, sẽ rất có ích nếu biết rõ mạng lưới nào đang khả dụng và cách nhận testnet ETH để trải nghiệm. Nói chung, về yếu tố bảo mật, sử dụng lại một tài khoản mạng chính trên mạng lưới thử nghiệm là không được khuyến khích và ngược lại.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên hiểu [những điều cơ bản về Ethereum](/developers/docs/intro-to-ethereum/) trước khi tìm hiểu về các mạng khác nhau, vì các mạng thử nghiệm sẽ cung cấp cho bạn một phiên bản Ethereum giá rẻ, an toàn để thử nghiệm.
+
+## Mạng công khai {#public-networks}
+
+Các mạng lưới công cộng có thể được truy cập bởi bất kì ai trên thế giới có kết nối internet. Bất kỳ ai cũng có thể đọc hoặc tạo giao dịch trên chuỗi khối công cộng và xác minh các giao dịch đang được thực thi. Sự đồng thuận giữa các cá nhân ngang hàng sẽ quyết định việc thêm các giao dịch và trạng thái của mạng lưới.
+
+### Mạng chính Ethereum {#ethereum-mainnet}
+
+Mainnet là chuỗi khối Etherem công cộng chính, nơi các giao dịch có giá trị thực diễn ra trên sổ cái phân tán.
+
+Khi cộng đồng và các sàn giao dịch bàn tán về giá ETH, nghĩa là họ đang nói về Mainnet ETH.
+
+### Các mạng thử nghiệm Ethereum {#ethereum-testnets}
+
+Bên cạnh Mainnet, còn có những mạng testnet công cộng. Đây là những mạng lưới được sử dụng bởi các nhà phát triển giao thức và các nhà phát triển hợp đồng thông minh để kiểm tra các nâng cấp giao thức cũng như các hợp đồng thông minh tiềm năng trong môi trường sản xuất tương tự trước khi triển khai trên Mainnet. Hãy nghĩ về điều này như một sự tương tự như máy chủ sản xuất so với máy chủ staging.
+
+Bạn nên thử nghiệm code của bất cứ hợp đồng nào bạn viết trên testnet trước khi triển khai trên Mainnet. Trong số các ứng dụng phi tập trung (dapp) được tích hợp với các hợp đồng thông minh hiện nay, hầu hết các dự án này đều có bản sao triển khai trên testnet.
+
+Hầu hết mạng thử nghiệm ban đầu bắt đầu bằng việc sử dụng cơ chế đồng thuận bằng chứng ủy quyền (Proof-of-Authority) được cấp quyền hạng. Điều này có nghĩa là một số lượng nhỏ các nút được chọn để xác thực giao dịch và tạo khối mới – đặt cược danh tính của họ trong quá trình này. Thay vào đó, một số tính năng của mạng thử nghiệm mở cơ chế đồng thuận bằng chứng cổ phần nơi mà mọi người có thể chạy nút xác thực, giống như mạng chính Ethereum.
+
+ETH trên mạng thử nghiệm sẽ không có giá trị thực; tuy nhiên, nếu chúng được thị trường tạo ra cho một số loại mạng thử nghiệm ETH đã trở nên khan hiếm và khó kiếm được. Vì bạn càn ETH để có thể tương tác với mạng Ethereum (thậm chí là mạng thử nghiệm), nhiều người sẽ lấy ETH mạng thử nghiệm từ phân phối (Faucets). Hầu hết faucets là các ứng dụng web nơi bạn có thể nhập địa chỉ mà bạn yêu cầu gửi ETH tới.
+
+#### Tôi nên dùng testnet nào?
+
+Hai mạng thử nghiệm công khai mà nhà lập trình Client thực sự đang duy trì là Sepolia và Hoodi. Sepolia là mạng lưới cho hợp đồng và nhà phát triển ứng dụng để thử nghiệm ứng dụng của họ. Mạng Hoodi cho phép nhà lập trình giao thức thử nghiệm nâng cấp mạng lưới, và giúp người Stake thử nghiệm vận hành nút xác thực.
+
+#### Sepolia {#sepolia}
+
+**Sepolia được khuyến nghị cho thử nghiệm phát triển ứng dụng mặc định**. Mạng Sepolia sử dụng một tập hợp trình xác thực được cấp phép do các đội ngũ client và thử nghiệm kiểm soát.
+
+##### Các nguồn
+
+- [Trang web](https://sepolia.dev/)
+- [GitHub](https://github.com/eth-clients/sepolia)
+- [Otterscan](https://sepolia.otterscan.io/)
+- [Etherscan](https://sepolia.etherscan.io)
+- [Blockscout](https://eth-sepolia.blockscout.com/)
+
+##### Faucets
+
+- [Vòi Alchemy Sepolia](https://www.alchemy.com/faucets/ethereum-sepolia)
+- [Vòi Chain Platform Sepolia](https://faucet.chainplatform.co/faucets/ethereum-sepolia/)
+- [Vòi Chainstack Sepolia](https://faucet.chainstack.com/sepolia-testnet-faucet)
+- [Vòi Hệ sinh thái Ethereum](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia)
+- [Vòi ethfaucet.com Sepolia](https://ethfaucet.com/networks/ethereum)
+- [Vòi Google Cloud Web3 Sepolia](https://cloud.google.com/application/web3/faucet/ethereum/sepolia)
+- [Grabteeth](https://grabteeth.xyz/)
+- [Vòi Infura Sepolia](https://www.infura.io/faucet)
+- [Vòi PoW](https://sepolia-faucet.pk910.de/)
+- [Vòi QuickNode Sepolia](https://faucet.quicknode.com/ethereum/sepolia)
+
+#### Hoodi {#hoodi}
+
+Hoodi là một mạng thử nghiệm dùng để thử nghiệm xác thực và Staking. Mạng Hoodi cho phép người dùng muốn chạy nút xác thực cho mạng thử nghiệm. Người Stake muốn thử nghiệm nâng cấp giao thức trước khi họ tiến hành trên mạng chính nên sử dụng Hoodi.
+
+- Đội ngũ xác thực mở, người đặt cược có thể thử nghiệm các bản nâng cấp mạng lưới
+- Trạng thái lớn, có ích cho việc thử nghiệm các tương tác giữa các hợp đồng thông minh phức tạp
+- Đông bộ hoá lâu hơn và yêu cầu bộ nhớ cao hơn để vận hành một nút
+
+##### Các nguồn
+
+- [Trang web](https://hoodi.ethpandaops.io/)
+- [GitHub](https://github.com/eth-clients/hoodi)
+- [Trình khám phá](https://explorer.hoodi.ethpandaops.io/)
+- [Đồng bộ hóa điểm kiểm tra](https://checkpoint-sync.hoodi.ethpandaops.io/)
+- [Otterscan](https://hoodi.otterscan.io/)
+- [Etherscan](https://hoodi.etherscan.io/)
+
+##### Faucets
+
+- [Vòi Chain Platform Hoodi](https://faucet.chainplatform.co/faucets/ethereum-hoodi/)
+- [Vòi Hoodi](https://hoodi.ethpandaops.io/)
+- [Vòi PoW](https://hoodi-faucet.pk910.de/)
+
+#### Ephemery {#ephemery}
+
+Ephemery là một mạng thử nghiệm độc nhất luôn được đặt lại vào mỗi tháng. Trạng thái thực thi và đồng thuận được đảo ngược về khởi nguyên mỗi 28 ngày, điều đó có nghĩa là những gì diễn ra trên mạng lưới là nhanh chóng phai mờ. Điều này phù hợp cho những thử nghiệm ngắn hạn, khởi tạo node nhanh và các ứng dụng kiểu “hello world” không cần tính lâu dài.
+
+- Một trạng thái mới, thử nghiệm ngắn hạn cho các nút xác thực và ứng dụng
+- Chỉ bao gồm bộ hợp đồng cơ bản
+- Mở một bộ nút xác thực và dễ dàng tiếp cận một lượng lớn tài sản
+- Yêu câu của nút nhỏ nhất và đồng bộ nhanh nhất, trung bình <5GB
+
+##### Các nguồn
+
+- [Trang web](https://ephemery.dev/)
+- [GitHub](https://github.com/ephemery-testnet/ephemery-resources)
+- [Trò chuyện cộng đồng](https://matrix.to/#/#staker-testnet:matrix.org)
+- [Blockscout](https://explorer.ephemery.dev/)
+- [Otterscan](https://otter.bordel.wtf/)
+- [Trình khám phá Beacon](https://beaconlight.ephemery.dev/)
+- [Đồng bộ hóa điểm kiểm tra](https://checkpoint-sync.ephemery.ethpandaops.io)
+- [Bệ phóng](https://launchpad.ephemery.dev/)
+
+#### Faucets
+
+- [Vòi Bordel](https://faucet.bordel.wtf/)
+- [Vòi PoW Pk910](https://ephemery-faucet.pk910.de/)
+
+#### Holesky (không còn được dùng) {#holesky}
+
+Mạng thử nghiệm Holesky sẽ bị ngừng sử dụng kể từ tháng 9 năm 2025. Những người vận hành Staking và nhà cung cấp cơ sở hạ tầng nên sử dụng Hoodi thay để thử nghiệm nút xác thực.
+
+- [Thông báo Ngừng hoạt động Mạng thử nghiệm Holesky](https://blog.ethereum.org/2025/09/01/holesky-shutdown-announcement) - _Blog EF, ngày 1 tháng 9 năm 2025_
+- [Cập nhật Mạng thử nghiệm Holesky và Hoodi](https://blog.ethereum.org/en/2025/03/18/hoodi-holesky) - _Blog EF, ngày 18 tháng 3 năm 2025_
+
+### Các mạng thử nghiệm Lớp 2 {#layer-2-testnets}
+
+[Lớp 2 (L2)](/layer-2/) là một thuật ngữ chung để mô tả một tập hợp các giải pháp mở rộng quy mô cụ thể của Ethereum. Một layer 2 là một chuỗi khối riêng biệt giúp mở rộng Ethereum và kế thừa sự bảo mật của Ethereum. Testnet của các Layer 2 thường được kết hợp chặt chẽ với các testnet công cộng của Ethereum.
+
+#### Arbitrum Sepolia {#arbitrum-sepolia}
+
+Một mạng thử nghiệm cho [Arbitrum](https://arbitrum.io/).
+
+##### Các nguồn
+
+- [Etherscan](https://sepolia.arbiscan.io/)
+- [Blockscout](https://sepolia-explorer.arbitrum.io/)
+
+##### Faucets
+
+- [Vòi Alchemy Arbitrum Sepolia](https://www.alchemy.com/faucets/arbitrum-sepolia)
+- [Vòi Chainlink Arbitrum Sepolia](https://faucets.chain.link/arbitrum-sepolia)
+- [Vòi ethfaucet.com Arbitrum Sepolia](https://ethfaucet.com/networks/arbitrum)
+- [Vòi QuickNode Arbitrum Sepolia](https://faucet.quicknode.com/arbitrum/sepolia)
+
+#### Optimistic Sepolia {#optimistic-sepolia}
+
+Một mạng thử nghiệm cho [Optimism](https://www.optimism.io/).
+
+##### Các nguồn
+
+- [Etherscan](https://sepolia-optimistic.etherscan.io/)
+- [Blockscout](https://optimism-sepolia.blockscout.com/)
+
+##### Faucets
+
+- [Vòi Alchemy](https://www.alchemy.com/faucets/optimism-sepolia)
+- [Vòi Chainlink](https://faucets.chain.link/optimism-sepolia)
+- [Vòi ethfaucet.com Optimism Sepolia](https://ethfaucet.com/networks/optimism)
+- [Vòi mạng thử nghiệm](https://docs.optimism.io/builders/tools/build/faucets)
+
+#### Starknet Sepolia {#starknet-sepolia}
+
+Một mạng thử nghiệm cho [Starknet](https://www.starknet.io).
+
+##### Các nguồn
+
+- [Starkscan](https://sepolia.starkscan.co/)
+
+##### Faucets
+
+- [Vòi Alchemy](https://www.alchemy.com/faucets/starknet-sepolia)
+- [Vòi Blast Starknet Sepolia](https://blastapi.io/faucets/starknet-sepolia-eth)
+- [Vòi Starknet](https://starknet-faucet.vercel.app/)
+
+## Mạng riêng tư {#private-networks}
+
+Một mạng Ethereum là mạng riêng tư nếu các nút của nó không được kết nối với mạng công cộng (ví dụ: Mạng chính hoặc mạng thử nghiệm). Trong bối cảnh này, riêng tư chỉ có nghĩa là dành riêng hoặc bị cô lập, thay vì được bảo vệ hoặc an toàn.
+
+### Mạng phát triển {#development-networks}
+
+Khi phát triển một ứng dụng Ethereum, bạn sẽ muốn chạy thử trên một mạng lưới riêng tư để xem nó hoạt động thế nào trước khi triển khai nó. Tương tự như cách bạn tạo một máy chủ cục bộ trên máy tính của mình để phát triển web, bạn có thể tạo một phiên bản chuỗi khối cục bộ để kiểm tra dapp của mình. Điều này cho phép sự lặp lại diễn ra nhanh hơn nhiều so với testnet công cộng.
+
+Có một vài dự án và các công cụ dành riêng cho mục đích hỗ trợ quá trình này. Tìm hiểu thêm về [mạng phát triển](/developers/docs/development-networks/).
+
+### Mạng liên hợp {#consortium-networks}
+
+Quá trình đồng thuận được kiểm soát bởi một tập hợp các nút đáng tin cậy được xác định trước. Ví dụ, một mạng lưới riêng tư của các tổ chức học thuật nổi tiếng mà mỗi tổ chức sẽ điều hành một node duy nhất và các khối được xác minh bởi một số lượng chữ kí nhất định trong mạng lưới.
+
+Nếu một mạng lưới Ethereum công khai giống như internet công cộng, thì một mạng lưới tập đoàn sẽ giống như internet nội bộ.
+
+## Tại sao các mạng thử nghiệm Ethereum được đặt tên theo các ga tàu điện ngầm? {#why-naming}
+
+Nhiều mạng thử nghiệm Ethereum được đặt tên theo các ga tàu điện ngầm hoặc ga tàu hỏa ngoài đời thực. Truyền thống đặt tên này bắt đầu từ sớm và phản ánh các thành phố toàn cầu nơi những người đóng góp đã sống hoặc làm việc. Điều này mang tính biểu tượng, dễ nhớ và thiết thực. Cũng giống như các mạng thử nghiệm được tách biệt khỏi mạng chính Ethereum, các tuyến tàu điện ngầm cũng chạy tách biệt với giao thông trên mặt đất.
+
+### Các mạng thử nghiệm thường dùng và cũ {#common-and-legacy-testnets}
+
+- **Sepolia** - Một khu phố được kết nối bằng tàu điện ngầm ở Athens, Hy Lạp. Hiện được sử dụng để thử nghiệm hợp đồng thông minh và ứng dụng phi tập trung.
+- **Hoodi** - Được đặt theo tên ga tàu điện ngầm Hoodi ở Bengaluru, Ấn Độ. Được sử dụng để thử nghiệm trình xác thực và nâng cấp giao thức.
+- **Goerli** _(không còn được dùng)_ - Được đặt theo tên của Görlitzer Bahnhof ở Berlin, Đức.
+- **Rinkeby** _(không còn được dùng)_ - Được đặt theo tên một vùng ngoại ô của Stockholm có ga tàu điện ngầm.
+- **Ropsten** _(không còn được dùng)_ - Ám chỉ một khu vực và bến phà/nhà ga tàu điện ngầm cũ ở Stockholm.
+- **Kovan** _(không còn được dùng)_ - Được đặt tên theo một ga MRT của Singapore.
+- **Morden** _(không còn được dùng)_ - Được đặt theo tên một ga Tàu điện ngầm London. Mạng thử nghiệm công khai đầu tiên của Ethereum.
+
+### Các mạng thử nghiệm chuyên dụng khác {#other-testnets}
+
+Một số mạng thử nghiệm được tạo ra để thử nghiệm ngắn hạn hoặc dành riêng cho nâng cấp và không nhất thiết phải theo chủ đề tàu điện ngầm:
+
+- **Holesky** _(không còn được dùng)_ - Được đặt theo tên của nhà ga Holešovice ở Praha. Được sử dụng để thử nghiệm trình xác thực; không còn được dùng vào năm 2025.
+- **Kiln**, **Zhejiang**, **Shandong**, **Prater**, **Pyrmont**, **Olympic** _(tất cả đều không còn được dùng)_ và **Ephemery** - Được xây dựng chuyên cho các mô phỏng nâng cấp như The Merge, Shanghai, hoặc các thử nghiệm trình xác thực. Một số tên theo vùng hoặc theo chủ đề chứ không dựa trên tàu điện ngầm.
+
+Việc sử dụng tên các ga tàu điện ngầm giúp các nhà phát triển nhanh chóng xác định và ghi nhớ các mạng thử nghiệm mà không cần phải dựa vào ID chuỗi dạng số. Nó cũng phản ánh văn hóa của Ethereum: thiết thực, toàn cầu và lấy con người làm trung tâm.
+
+## Các công cụ liên quan {#related-tools}
+
+- [Chainlist](https://chainlist.org/) _danh sách các mạng EVM để kết nối ví và nhà cung cấp với ID chuỗi và ID mạng phù hợp_
+- [Các chuỗi dựa trên EVM](https://github.com/ethereum-lists/chains) _repo GitHub chứa siêu dữ liệu chuỗi hỗ trợ Chainlist_
+
+## Đọc thêm {#further-reading}
+
+- [Đề xuất: Vòng đời có thể dự đoán của Mạng thử nghiệm Ethereum](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17)
+- [Sự phát triển của các mạng thử nghiệm Ethereum](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/)
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/archive-nodes/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/archive-nodes/index.md
new file mode 100644
index 00000000000..dbe3ca662b7
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/archive-nodes/index.md
@@ -0,0 +1,81 @@
+---
+title: Nút Lưu Trữ Ethereum
+description: Tổng quan về các nút lưu trữ
+lang: vi
+sidebarDepth: 2
+---
+
+Một nút lưu trữ là một phiên bản của máy khách Ethereum được cấu hình để xây dựng kho lưu trữ tất cả các trạng thái lịch sử. Đây là một công cụ hữu ích cho một số trường hợp sử dụng nhất định nhưng có thể khó chạy hơn một nút đầy đủ.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên hiểu khái niệm về [nút Ethereum](/developers/docs/nodes-and-clients/), [kiến trúc của nó](/developers/docs/nodes-and-clients/node-architecture/), [chiến lược đồng bộ hóa](/developers/docs/nodes-and-clients/#sync-modes), các phương pháp [chạy](/developers/docs/nodes-and-clients/run-a-node/) và [sử dụng chúng](/developers/docs/apis/json-rpc/).
+
+## Nút lưu trữ là gì
+
+Để nắm được tầm quan trọng của nút lưu trữ, hãy làm rõ khái niệm về "trạng thái". Ethereum có thể được gọi là _máy trạng thái dựa trên giao dịch_. Nó bao gồm các tài khoản và ứng dụng thực hiện các giao dịch làm thay đổi trạng thái của chúng. Dữ liệu toàn cầu với thông tin về từng tài khoản và hợp đồng được lưu trữ trong cơ sở dữ liệu trie được gọi là trạng thái. Điều này được xử lý bởi máy khách lớp thực thi (EL) và bao gồm:
+
+- Số dư tài khoản và số nonce
+- Mã hợp đồng và bộ nhớ lưu trữ
+- Dữ liệu liên quan đến sự đồng thuận, ví dụ: Hợp đồng Gửi tiền Đặt cược
+
+Để tương tác với mạng lưới, xác minh và tạo các khối mới, máy khách Ethereum phải cập nhật những thay đổi gần đây nhất (phần cuối của chuỗi) và do đó là trạng thái hiện tại. Một máy khách lớp thực thi được cấu hình như một nút đầy đủ sẽ xác minh và tuân theo trạng thái mới nhất của mạng nhưng chỉ lưu vào bộ nhớ đệm một vài trạng thái trong quá khứ, ví dụ: trạng thái được liên kết với 128 khối cuối cùng, để nó có thể xử lý việc tổ chức lại chuỗi và cung cấp quyền truy cập nhanh vào dữ liệu gần đây. Trạng thái gần đây là những gì tất cả các máy khách cần để xác minh các giao dịch đến và sử dụng mạng.
+
+Bạn có thể hình dung trạng thái như một ảnh chụp nhanh tức thời của mạng tại một khối nhất định và kho lưu trữ như một bản phát lại lịch sử.
+
+Các trạng thái lịch sử có thể được cắt bỏ một cách an toàn vì chúng không cần thiết cho hoạt động của mạng và sẽ là thừa thãi vô ích nếu máy khách lưu giữ tất cả dữ liệu lỗi thời. Các trạng thái tồn tại trước một số khối gần đây (ví dụ: 128 khối trước khối đứng đầu) sẽ bị loại bỏ một cách hiệu quả. Các nút đầy đủ chỉ lưu giữ dữ liệu chuỗi khối lịch sử (các khối và giao dịch) và các ảnh chụp nhanh lịch sử không thường xuyên mà chúng có thể sử dụng để tái tạo các trạng thái cũ hơn theo yêu cầu. Chúng thực hiện điều này bằng cách thực thi lại các giao dịch trong quá khứ trong máy ảo ethereum (EVM), việc này có thể đòi hỏi nhiều tính toán khi trạng thái mong muốn ở xa ảnh chụp nhanh gần nhất.
+
+Tuy nhiên, điều này có nghĩa là việc truy cập trạng thái lịch sử trên một nút đầy đủ sẽ tiêu tốn rất nhiều tài nguyên tính toán. Máy khách có thể cần thực hiện tất cả các giao dịch trong quá khứ và tính toán một trạng thái lịch sử từ khối khởi nguyên. Các nút lưu trữ giải quyết vấn đề này bằng cách không chỉ lưu trữ các trạng thái gần đây nhất mà còn mọi trạng thái lịch sử được tạo sau mỗi khối. Về cơ bản, nó đánh đổi với yêu cầu không gian đĩa lớn hơn.
+
+Điều quan trọng cần lưu ý là mạng không phụ thuộc vào các nút lưu trữ để lưu giữ và cung cấp tất cả dữ liệu lịch sử. Như đã đề cập ở trên, tất cả các trạng thái tạm thời trong lịch sử đều có thể được lấy ra trên một nút đầy đủ. Các giao dịch được lưu trữ bởi bất kỳ nút đầy đủ nào (hiện tại dưới 400G) và có thể được phát lại để xây dựng toàn bộ kho lưu trữ.
+
+### Trường hợp sử dụng
+
+Việc sử dụng Ethereum thông thường như gửi giao dịch, triển khai hợp đồng, xác minh sự đồng thuận, v.v. không yêu cầu quyền truy cập vào các trạng thái lịch sử. Người dùng không bao giờ cần nút lưu trữ để tương tác tiêu chuẩn với mạng.
+
+Lợi ích chính của việc lưu trữ trạng thái là truy cập nhanh vào các truy vấn về các trạng thái lịch sử. Ví dụ: nút lưu trữ sẽ nhanh chóng trả về các kết quả như:
+
+- _Số dư ETH của tài khoản 0x1337..._ tại khối 15537393?_
+- _Số dư của token 0x trong hợp đồng 0x tại khối 1920000 là bao nhiêu?_
+
+Như đã giải thích ở trên, một nút đầy đủ sẽ cần tạo dữ liệu này bằng cách thực thi máy ảo ethereum (EVM), việc này sử dụng CPU và tốn thời gian. Các nút lưu trữ truy cập chúng trên đĩa và phục vụ phản hồi ngay lập tức. Đây là một tính năng hữu ích cho một số bộ phận của cơ sở hạ tầng, ví dụ:
+
+- Các nhà cung cấp dịch vụ như trình khám phá khối
+- Các nhà nghiên cứu
+- Các nhà phân tích bảo mật
+- Các nhà phát triển ứng dụng phi tập trung
+- Kiểm toán và tuân thủ
+
+Có nhiều [dịch vụ](/developers/docs/nodes-and-clients/nodes-as-a-service/) miễn phí khác nhau cũng cho phép truy cập vào dữ liệu lịch sử. Vì việc chạy một nút lưu trữ đòi hỏi nhiều hơn, nên quyền truy cập này hầu hết bị hạn chế và chỉ hoạt động cho việc truy cập không thường xuyên. Nếu dự án của bạn yêu cầu quyền truy cập liên tục vào dữ liệu lịch sử, bạn nên cân nhắc tự chạy một nút.
+
+## Triển khai và sử dụng
+
+Nút lưu trữ trong bối cảnh này có nghĩa là dữ liệu được cung cấp bởi các máy khách lớp thực thi hướng tới người dùng khi chúng xử lý cơ sở dữ liệu trạng thái và cung cấp các điểm cuối JSON-RPC. Các tùy chọn cấu hình, thời gian đồng bộ hóa và kích thước cơ sở dữ liệu có thể khác nhau tùy theo máy khách. Để biết chi tiết, vui lòng tham khảo tài liệu do máy khách của bạn cung cấp.
+
+Trước khi bắt đầu nút lưu trữ của riêng bạn, hãy tìm hiểu về sự khác biệt giữa các máy khách và đặc biệt là các [yêu cầu phần cứng](/developers/docs/nodes-and-clients/run-a-node/#requirements) khác nhau. Hầu hết các máy khách không được tối ưu hóa cho tính năng này và kho lưu trữ của chúng yêu cầu hơn 12TB dung lượng. Ngược lại, các triển khai như Erigon có thể lưu trữ cùng một dữ liệu trong dung lượng dưới 3TB, điều này khiến chúng trở thành cách hiệu quả nhất để chạy một nút lưu trữ.
+
+## Các phương pháp được đề xuất
+
+Ngoài các [đề xuất chung để chạy một nút](/developers/docs/nodes-and-clients/run-a-node/), một nút lưu trữ có thể đòi hỏi nhiều hơn về phần cứng và bảo trì. Xem xét các [tính năng chính](https://github.com/ledgerwatch/erigon#key-features) của Erigon, phương pháp tiếp cận thiết thực nhất là sử dụng triển khai máy khách [Erigon](/developers/docs/nodes-and-clients/#erigon).
+
+### Phần cứng
+
+Luôn đảm bảo xác minh các yêu cầu phần cứng cho một chế độ nhất định trong tài liệu của máy khách.
+Yêu cầu lớn nhất đối với các nút lưu trữ là không gian đĩa. Tùy thuộc vào máy khách, nó thay đổi từ 3TB đến 12TB. Ngay cả khi HDD có thể được coi là một giải pháp tốt hơn cho lượng lớn dữ liệu, việc đồng bộ hóa và liên tục cập nhật khối đứng đầu của chuỗi sẽ yêu cầu ổ SSD. Ổ đĩa [SATA](https://www.cleverfiles.com/help/sata-hard-drive.html) là đủ tốt nhưng nó phải có chất lượng đáng tin cậy, ít nhất là [TLC](https://blog.synology.com/tlc-vs-qlc-ssds-what-are-the-differences). Các đĩa có thể được lắp vào máy tính để bàn hoặc máy chủ có đủ khe cắm. Các thiết bị chuyên dụng như vậy là lý tưởng để chạy nút có thời gian hoạt động cao. Hoàn toàn có thể chạy nó trên máy tính xách tay nhưng tính di động sẽ đi kèm với một chi phí bổ sung.
+
+Tất cả dữ liệu cần phải nằm gọn trong một ổ đĩa, do đó các đĩa phải được nối với nhau, ví dụ: bằng [RAID0](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0) hoặc LVM. Cũng có thể đáng xem xét việc sử dụng [ZFS](https://en.wikipedia.org/wiki/ZFS) vì nó hỗ trợ "Sao chép khi ghi" (Copy-on-write), đảm bảo dữ liệu được ghi chính xác vào đĩa mà không có bất kỳ lỗi cấp thấp nào.
+
+Để ổn định và bảo mật hơn trong việc ngăn ngừa hỏng cơ sở dữ liệu do vô tình, đặc biệt là trong một thiết lập chuyên nghiệp, hãy xem xét sử dụng [bộ nhớ ECC](https://en.wikipedia.org/wiki/ECC_memory) nếu hệ thống của bạn hỗ trợ. Kích thước của RAM thường được khuyên là giống như đối với một nút đầy đủ nhưng nhiều RAM hơn có thể giúp tăng tốc độ đồng bộ hóa.
+
+Trong quá trình đồng bộ hóa ban đầu, các máy khách ở chế độ lưu trữ sẽ thực hiện mọi giao dịch kể từ khối khởi nguyên. Tốc độ thực thi hầu hết bị giới hạn bởi CPU, vì vậy một CPU nhanh hơn có thể giúp rút ngắn thời gian đồng bộ hóa ban đầu. Trên một máy tính tiêu dùng trung bình, quá trình đồng bộ hóa ban đầu có thể mất tới một tháng.
+
+## Đọc thêm {#further-reading}
+
+- [Nút đầy đủ Ethereum và Nút lưu trữ](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) - _QuickNode, tháng 9 năm 2022_
+- [Xây dựng Nút lưu trữ Ethereum của riêng bạn](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) - _Thomas Jay Rush, tháng 8 năm 2021_
+- [Cách thiết lập Erigon, RPC của Erigon và TrueBlocks (scrape và API) làm dịch vụ](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _– Magnus Hansson, cập nhật tháng 9 năm 2022_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các nút và client](/developers/docs/nodes-and-clients/)
+- [Chạy một nút](/developers/docs/nodes-and-clients/run-a-node/)
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/bootnodes/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/bootnodes/index.md
new file mode 100644
index 00000000000..2b2e0f5b992
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/bootnodes/index.md
@@ -0,0 +1,31 @@
+---
+title: Giới thiệu về các bootnode Ethereum
+description: Thông tin cơ bản bạn cần biết để hiểu về các bootnode
+lang: vi
+---
+
+Khi một nút mới tham gia mạng Ethereum, nó cần kết nối với các nút đã có trên mạng để sau đó khám phá các nút ngang hàng mới. Các điểm vào mạng Ethereum này được gọi là bootnode. Các ứng dụng thường có một danh sách các bootnode được mã hóa cứng vào chúng. Các bootnode này thường được vận hành bởi đội ngũ devops của Ethereum Foundation hoặc chính các đội ngũ phát triển ứng dụng. Lưu ý rằng bootnode không giống như các nút tĩnh. Các nút tĩnh được gọi lặp đi lặp lại, trong khi các bootnode chỉ được gọi khi không có đủ nút ngang hàng để kết nối và một nút cần khởi tạo một số kết nối mới.
+
+## Kết nối với một bootnode {#connect-to-a-bootnode}
+
+Hầu hết các ứng dụng đều có danh sách các bootnode được tích hợp sẵn, nhưng bạn cũng có thể muốn chạy bootnode của riêng mình hoặc sử dụng một bootnode không có trong danh sách được mã hóa cứng của ứng dụng. Trong trường hợp này, bạn có thể chỉ định chúng khi khởi động ứng dụng của mình, như sau (ví dụ dành cho Geth, vui lòng kiểm tra tài liệu tham khảo của ứng dụng của bạn):
+
+```
+geth --bootnodes "enode://@:"
+```
+
+## Chạy một bootnode {#run-a-bootnode}
+
+Bootnode là các nút đầy đủ không nằm sau NAT ([Dịch địa chỉ mạng](https://www.geeksforgeeks.org/network-address-translation-nat/)). Mọi nút đầy đủ đều có thể hoạt động như một bootnode miễn là nó có sẵn công khai.
+
+Khi bạn khởi động một nút, nó sẽ ghi lại [enode](/developers/docs/networking-layer/network-addresses/#enode) của bạn, đây là một mã định danh công khai mà những người khác có thể sử dụng để kết nối với nút của bạn.
+
+Enode thường được tạo lại sau mỗi lần khởi động lại, vì vậy hãy đảm bảo xem tài liệu tham khảo của ứng dụng để biết cách tạo enode cố định cho bootnode của bạn.
+
+Để trở thành một bootnode tốt, bạn nên tăng số lượng nút ngang hàng tối đa có thể kết nối với nó. Việc chạy một bootnode với nhiều nút ngang hàng sẽ làm tăng đáng kể yêu cầu về băng thông.
+
+## Các bootnode có sẵn {#available-bootnodes}
+
+Bạn có thể tìm thấy một danh sách các bootnode tích hợp sẵn trong go-ethereum [tại đây](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go#L23). Các bootnode này được duy trì bởi Ethereum Foundation và đội ngũ go-ethereum.
+
+Có các danh sách bootnode khác được duy trì bởi các tình nguyện viên. Vui lòng đảm bảo luôn bao gồm ít nhất một bootnode chính thức, nếu không bạn có thể bị tấn công che khuất.
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/client-diversity/index.md
new file mode 100644
index 00000000000..a81fb32e14e
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/client-diversity/index.md
@@ -0,0 +1,132 @@
+---
+title: Đa máy khách
+description: Giải thích chuyên sâu về tầm quan trọng của đa máy khách trên Ethereum.
+lang: vi
+sidebarDepth: 2
+---
+
+Hành vi của một node Ethereum được kiểm soát bởi phần mềm máy khách mà nó chạy. Có một số máy khách Ethereum cấp độ sản xuất đang tồn tại, mỗi loại được phát triển và duy trì bằng những ngôn ngữ khác nhau bởi những đội ngũ riêng biệt. Máy khách được xây dựng đến một thông số kỹ thuật cụ thể để đảm bảo chúng tương tác liền mạch với nhau và có cùng chức năng cũng như cung cấp trải nghiệm người dùng cân xứng. Tuy nhiên, hiện nay, việc phân phối máy khách trên các node không đủ đồng đều để phát huy hết tiềm năng của việc củng cố mạng. Lí tưởng nhất, người dùng được phân chia đồng đều để sử dụng các máy khách khác nhau với mục đích làm đa dạng máy khách nhất có thể.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Nếu bạn chưa hiểu nút và máy khách là gì, hãy xem [nút và máy khách](/developers/docs/nodes-and-clients/). [Lớp thực thi](/glossary/#execution-layer) và [lớp đồng thuận](/glossary/#consensus-layer) được định nghĩa trong bảng thuật ngữ.
+
+## Tại sao nên có nhiều loại máy khách? {#why-multiple-clients}
+
+Nhiều máy khách được phát triển và duy trì độc lập tồn tại vì tính đa dạng của máy khách giúp mạng trở nên linh hoạt hơn trước lỗi hệ thống và các cuộc tấn công. Đa máy khách là thế mạnh độc nhất của Ethereum - các blockchain khác phải đánh cược rằng một máy khách duy nhất sẽ không sụp đổ. Tuy nhiên, việc có sẵn nhiều máy khách là chưa đủ, chúng phải được cộng đồng chấp nhận và tổng số nút đang hoạt động phải được phân bổ tương đối đồng đều giữa chúng.
+
+## Tại sao đa máy khách quan trọng? {#client-diversity-importance}
+
+Có nhiều loại máy khách được phát triển và duy trì độc lập là rất quan trọng đối với sức khỏe của mạng phi tập trung. Hãy cùng tìm hiểu lí do vì sao.
+
+### Lỗi {#bugs}
+
+Một lỗi trong một loại máy khách riêng lẻ sẽ gây ít rủi ro đến mạng lưới hơn khi chỉ đại diện một số ít nodes Ethereum. Với sự phân bố gần như đồng đều của các nodes trên nhiều loại máy khách, khả năng hầu hết các máy khách gặp phải sự cố chung là nhỏ và kết quả là mạng sẽ mạnh mẽ hơn.
+
+### Khả năng chống lại các cuộc tấn công {#resilience}
+
+Sự đa dạng của máy khách cũng giúp chống lại các cuộc tấn công. Ví dụ: một cuộc tấn công [lừa một máy khách cụ thể](https://twitter.com/vdWijden/status/1437712249926393858) vào một nhánh cụ thể của chuỗi khó có thể thành công vì các máy khách khác khó có thể bị khai thác theo cùng một cách và chuỗi chính tắc vẫn không bị tổn hại. Sự đa dạng máy khách thấp làm tăng rủi ro liên quan đến các vụ hack trên máy khách chiếm ưu thế. Tính đa dạng của máy khách đã được chứng minh là một biện pháp phòng thủ quan trọng chống lại các cuộc tấn công độc hại trên mạng. Ví dụ, cuộc tấn công từ chối dịch vụ Thượng Hải năm 2016 có thể xảy ra vì những kẻ tấn công đã có thể lừa máy khách chiếm ưu thế (Geth) thực hiện một thao tác I/O đĩa chậm hàng chục nghìn lần mỗi khối. Vì các máy khách thay thế đang trực tuyến không gặp phải lỗ hổng tương tự, Ethereum đã có thể chống lại cuộc tấn công và tiếp tục hoạt động trong khi lỗ hổng tại Geth đã được khắc phục.
+
+### Tính hoàn tất của bằng chứng cổ phần {#finality}
+
+Một lỗi trong phần mềm Client đồng thuận mà hơn 33% nút xác thực của Ethereum có thể ngăn chặn lớp đồng thuận chốt kết quả, nghĩa là người dùng có thể không tin tưởng rằng các giao dịch sẽ không thể bị đảo ngược thay thay đổi vào một thời điểm nào đó. Điều này sẽ rất rắc rối với nhiều ứng dụng được xây dựng trên Ethereum, đặc biệt là DeFi.
+
+ Tệ hơn nữa, một lỗi nghiêm trọng trong một máy khách chiếm đa số hai phần ba có thể khiến chuỗi bị phân tách và hoàn tất không chính xác, dẫn đến một nhóm lớn các trình xác thực bị kẹt trên một chuỗi không hợp lệ. Nếu họ muốn quay trở lại chuỗi hợp lệ, những người xác thực này sẽ phải đối mặt với slashing hoặc việc rút tiền tự nguyện và khởi động lại chậm chạp tốn kém. Mức độ của một lần slashing tăng lên theo số lượng nodes mắc lỗi với 2/3 đa số bị cắt giảm tối đa (32 ETH).
+
+Mặc dù đây là những tình huống khó xảy ra, nhưng hệ sinh thái Ethereum có thể giảm thiểu rủi ro bằng cách cân bằng việc phân phối máy khách trên các nodes đang hoạt động. Lý tưởng nhất là không có máy khách đồng thuận nào đạt được 33% thị phần trong tổng số nodes.
+
+### Trách nhiệm chung {#responsibility}
+
+Chi phí con người cũng xảy ra khi sở hữu đa số máy khách. Nó đặt quá nhiều căng thẳng và trách nhiệm lên một đội ngũ phát triển nhỏ. Sự đa dạng của máy khách càng ít thì gánh nặng trách nhiệm đối với các nhà phát triển duy trì đa số máy khách càng lớn. Phân bổ trách nhiệm này cho nhiều nhóm sẽ tốt cho cả sức khỏe của mạng lưới các nodes của Ethereum và cả mạng lưới con người.
+
+## Tính đa dạng của máy khách hiện tại {#current-client-diversity}
+
+### Các máy khách thực thi {#execution-clients-breakdown}
+
+
+
+### Các máy khách đồng thuận {#consensus-clients-breakdown}
+
+
+
+Sơ đồ này có thể đã lỗi thời — truy cập [ethernodes.org](https://ethernodes.org) và [clientdiversity.org](https://clientdiversity.org) để có thông tin mới nhất.
+
+Hai biểu đồ hình tròn ở trên hiển thị ảnh chụp nhanh về tính đa dạng của máy khách hiện tại cho lớp thực thi và lớp đồng thuận (tại thời điểm viết vào tháng 10 năm 2025). Tính đa dạng của máy khách đã được cải thiện trong những năm qua, và lớp thực thi đã chứng kiến sự sụt giảm trong sự thống trị của [Geth](https://geth.ethereum.org/), theo sau là [Nethermind](https://www.nethermind.io/nethermind-client) ở vị trí thứ hai, [Besu](https://besu.hyperledger.org/) thứ ba và [Erigon](https://github.com/ledgerwatch/erigon) thứ tư, trong khi các máy khách khác chiếm dưới 3% mạng lưới. Máy khách được sử dụng phổ biến nhất trên lớp đồng thuận—[Lighthouse](https://lighthouse.sigmaprime.io/)—có thị phần khá gần với máy khách phổ biến thứ hai. [Prysm](https://prysmaticlabs.com/#projects) và [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) chiếm lần lượt khoảng 31% và 14%, và các máy khách khác hiếm khi được sử dụng.
+
+Dữ liệu lớp thực thi được lấy từ [supermajority.info](https://supermajority.info/) vào ngày 26 tháng 10 năm 2025. Dữ liệu cho các máy khách đồng thuận được lấy từ [Michael Sproul](https://github.com/sigp/blockprint). Dữ liệu Client đồng thuận khó thu thập hơn, vì các Client đồng thuận không phải lúc nào cũng để lại dấu vết rõ ràng để dùng nhận diện chúng. Dữ liệu được tạo bằng một thuật toán phân loại mà đôi khi nhầm lẫn một số máy khách thiểu số (xem [tại đây](https://twitter.com/sproulM_/status/1440512518242197516) để biết thêm chi tiết). Trong sơ đồ trên, những phân loại không rõ ràng này được gán nhãn dạng hoặc/hoặc (ví dụ: Nimbus/Teku). Tuy nhiên, rõ ràng là phần lớn mạng đang vận hành Prysm. Mặc dù chỉ là snapshot, nhưng các giá trị từ sơ đồ cung cấp ý một cái nhìn chung về trạng thái đa dạng của máy khách hiện nay.
+
+Dữ liệu mới nhất về tính đa dạng của máy khách cho lớp đồng thuận hiện có tại [clientdiversity.org](https://clientdiversity.org/).
+
+## Lớp thực thi {#execution-layer}
+
+Cho đến nay, cuộc trò chuyện xung quanh sự đa dạng máy khách chủ yếu tập trung vào lớp đồng thuận. Tuy nhiên, máy khách thực thi [Geth](https://geth.ethereum.org) hiện chiếm khoảng 85% tổng số nút. Tỷ lệ này có vấn đề vì những lý do tương tự như đối máy khách đồng thuận. Ví dụ: một lỗi trong Geth ảnh hưởng đến việc xử lý giao dịch hoặc xây dựng tải trọng thực thi có thể dẫn đến việc máy khách đồng thuận hoàn thiện các giao dịch có vấn đề hoặc bị lỗi. Do đó, Ethereum sẽ lành mạnh hơn với sự phân phối máy khách thực thi đồng đều, lý tưởng nhất là không có máy khách nào chiếm hơn 33% mạng.
+
+## Sử dụng máy khách thiểu số {#use-minority-client}
+
+Giải quyết vấn đề đa dạng Client không chỉ đòi hỏi người dùng cá nhận chọn Client ít phổ biến - mà còn cần nhóm nút xác thực hoặc tổ chức như dApp lớn cùng sàn giao dịch cũng đa dạng các Client. Tuy nhiên, tất cả người dùng có thể góp phần khắc phục sự mất cân bằng hiện tại và bình thường hóa việc sử dụng tất cả các phần mềm Ethereum có sẵn. Sau sự kiện hợp nhất, tất cả người vận hành node sẽ được yêu cầu chạy máy khách thực thi và máy khách đồng thuận. Chọn tổ hợp các máy khách được gợi ý bên dưới sẽ giúp gia tăng sự đa dạng máy khách.
+
+### Các ứng dụng thực thi {#execution-clients}
+
+- [Besu](https://www.hyperledger.org/use/besu)
+- [Nethermind](https://downloads.nethermind.io/)
+- [Erigon](https://github.com/ledgerwatch/erigon)
+- [Go-Ethereum](https://geth.ethereum.org/)
+- [Reth](https://reth.rs/)
+
+### Các ứng dụng đồng thuận {#consensus-clients}
+
+- [Nimbus](https://nimbus.team/)
+- [Lighthouse](https://github.com/sigp/lighthouse)
+- [Teku](https://consensys.io/teku)
+- [Lodestar](https://github.com/ChainSafe/lodestar)
+- [Prysm](https://prysm.offchainlabs.com/docs/)
+- [Grandine](https://docs.grandine.io/)
+
+Người dùng am hiểu kĩ thuật có thể giúp đẩy nhanh quá trình này bằng cách viết các hướng dẫn và tài liệu dành cho các máy khách thiểu số và khuyến khích các đồng nghiệp vận hành nút của họ di chuyển khỏi các máy khách chiếm ưu thế. Hướng dẫn chuyển sang một máy khách đồng thuận thiểu số có sẵn trên [clientdiversity.org](https://clientdiversity.org/).
+
+## Bảng điều khiển tính đa dạng của máy khách {#client-diversity-dashboards}
+
+Một số bảng thông tin cung cấp số liệu thống kê về tính đa dạng của máy khách theo thời gian thực cho lớp thực thi và đồng thuận.
+
+**Lớp đồng thuận:**
+
+- [Rated.network](https://www.rated.network/)
+- [clientdiversity.org](https://clientdiversity.org/)
+
+**Lớp thực thi:**
+
+- [supermajority.info](https://supermajority.info//)
+- [Ethernodes](https://ethernodes.org/)
+
+## Đọc thêm {#further-reading}
+
+- [Tính đa dạng của máy khách trên lớp đồng thuận của Ethereum](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA)
+- [Bản nâng cấp The Merge của Ethereum: Tự chịu rủi ro khi chạy máy khách đa số!](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _Dankrad Fiest, ngày 24 tháng 3 năm 2022_
+- [Tầm quan trọng của tính đa dạng của máy khách](https://our.status.im/the-importance-of-client-diversity/)
+- [Danh sách các dịch vụ nút Ethereum](https://ethereumnodes.com/)
+- ["Five Whys" về vấn đề đa dạng máy khách](https://notes.ethereum.org/@afhGjrKfTKmksTOtqhB9RQ/BJGj7uh08)
+- [Tính đa dạng của Ethereum và cách giải quyết (YouTube)](https://www.youtube.com/watch?v=1hZgCaiqwfU)
+- [clientdiversity.org](https://clientdiversity.org/)
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Chạy một nút Ethereum](/run-a-node/)
+- [Các nút và client](/developers/docs/nodes-and-clients/)
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/index.md
new file mode 100644
index 00000000000..2e4bd3347f3
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/index.md
@@ -0,0 +1,319 @@
+---
+title: Nodes và máy khách
+description: Tổng quan về các nút Ethereum và phần mềm client, cộng thêm cách thiết lập một nút và tại sao bạn nên làm điều đó.
+lang: vi
+sidebarDepth: 2
+---
+
+Ethereum là một mạng lưới phân tán gồm các máy tính (gọi là nút) chạy phần mềm có khả năng xác minh các khối và dữ liệu giao dịch. Phần mềm phải được chạy trên máy tính của bạn để biến nó thành một nút Ethereum. Có hai phần mềm riêng biệt (được gọi là 'clients') cần thiết để hình thành một nút.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên hiểu khái niệm về mạng ngang hàng và [những điều cơ bản về EVM](/developers/docs/evm/) trước khi tìm hiểu sâu hơn và chạy phiên bản máy khách Ethereum của riêng bạn. Hãy xem [phần giới thiệu về Ethereum](/developers/docs/intro-to-ethereum/) của chúng tôi.
+
+Nếu bạn mới tìm hiểu về chủ đề nút, chúng tôi khuyên bạn nên xem qua phần giới thiệu thân thiện với người dùng của chúng tôi về [việc chạy một nút Ethereum](/run-a-node).
+
+## Node và clients là gì? {#what-are-nodes-and-clients}
+
+Một "Node" là bất kỳ phiên bản nào của phần mềm client Ethereum được kết nối với các máy tính khác cũng chạy phần mềm Ethereum, tạo thành một mạng. Một client (cơ chế) là một phiên bản của Ethereum xác thực dữ liệu theo quy tắc của giao thức và giữ cho mạng an toàn. Một nút cần chạy hai cơ chế : một cơ chế đồng thuận và một cơ chế thực thi.
+
+- Cơ chế thực thi (còn được gọi là động cơ thực thi, cơ chế EL hoặc trước đây là cơ chế Eth1) lắng nghe các giao dịch mới được phát sóng trong mạng, thực thi chúng trong EVM và giữ trạng thái và cơ sở dữ liệu mới nhất của tất cả dữ liệu Ethereum hiện tại.
+- Cơ chế đồng thuận (còn được gọi là Beacon Node, cơ chế CL hoặc trước đây là cơ chế Eth2) sử dụng thuật toán đồng thuận proof-of-stake, giúp mạng lưới đạt được sự đồng thuận dựa trên dữ liệu đã được xác thực từ cơ chế thực thi. Còn có một phần mềm thứ ba, gọi là 'validator', có thể được thêm vào cơ chế đồng thuận, giúp một nút tham gia vào việc bảo mật mạng lưới.
+
+Những cơ chế này làm việc cùng nhau để theo dõi đầu của chuỗi Ethereum và cho phép người dùng tương tác với mạng Ethereum. Thiết kế mô-đun với nhiều phần mềm hoạt động cùng nhau được gọi là [sự phức tạp được đóng gói](https://vitalik.eth.limo/general/2022/02/28/complexity.html). Cách tiếp cận này giúp việc thực hiện [The Merge](/roadmap/merge) liền mạch hơn, giúp phần mềm máy khách dễ bảo trì và phát triển hơn, đồng thời cho phép tái sử dụng các máy khách riêng lẻ, ví dụ, trong [hệ sinh thái lớp 2](/layer-2/).
+
+
+Sơ đồ đơn giản hóa về một máy khách thực thi và máy khách đồng thuận được ghép nối.
+
+### Sự đa dạng của ứng dụng khách {#client-diversity}
+
+Cả [máy khách thực thi](/developers/docs/nodes-and-clients/#execution-clients) và [máy khách đồng thuận](/developers/docs/nodes-and-clients/#consensus-clients) đều tồn tại ở nhiều ngôn ngữ lập trình khác nhau do các nhóm khác nhau phát triển.
+
+Việc có nhiều cơ chế triển khai có thể làm cho mạng mạnh hơn bằng cách giảm sự phụ thuộc vào một mã nguồn duy nhất. Mục tiêu lý tưởng là đạt được sự đa dạng mà không có cơ chế nào chiếm ưu thế trong mạng lưới, từ đó loại bỏ một điểm yếu tiềm ẩn duy nhất.
+Sự đa dạng về ngôn ngữ cũng thu hút một cộng đồng lập trình viên rộng lớn hơn và cho phép họ tạo ra các ngôn ngữ tích hợp mà họ thích.
+
+Tìm hiểu thêm về [sự đa dạng của máy khách](/developers/docs/nodes-and-clients/client-diversity/).
+
+Những triển khai này có điểm chung là chúng đều tuân theo một quy định duy nhất. Thông số kỹ thuật quyết định cách mà mạng lưới và blockchain Ethereum hoạt động. Mọi chi tiết kỹ thuật đều được định nghĩa và các thông số có thể được tìm thấy như sau:
+
+- Ban đầu, [Sách Vàng Ethereum](https://ethereum.github.io/yellowpaper/paper.pdf)
+- [Thông số kỹ thuật thực thi](https://github.com/ethereum/execution-specs/)
+- [Thông số kỹ thuật đồng thuận](https://github.com/ethereum/consensus-specs)
+- [Các EIP](https://eips.ethereum.org/) được triển khai trong các [bản nâng cấp mạng](/ethereum-forks/) khác nhau
+
+### Theo dõi các nút trong mạng {#network-overview}
+
+Nhiều trình theo dõi cung cấp cái nhìn tổng quát theo thời gian thực về các nút trong mạng lưới Ethereum. Lưu ý rằng do tính chất của các mạng phi tập trung, những trình thu thập thông tin này chỉ có thể cung cấp một cái nhìn hạn chế về mạng và có thể đưa ra những kết quả khác nhau.
+
+- [Bản đồ các nút](https://etherscan.io/nodetracker) của Etherscan
+- [Ethernodes](https://ethernodes.org/) của Bitfly
+- [Nodewatch](https://www.nodewatch.io/) của Chainsafe, thu thập dữ liệu các nút đồng thuận
+- [Monitoreth](https://monitoreth.io/) - của MigaLabs, một công cụ giám sát mạng phi tập trung
+- [Báo cáo tình trạng mạng hàng tuần](https://probelab.io) - của ProbeLab, sử dụng [Nebula crawler](https://github.com/dennis-tra/nebula) và các công cụ khác
+
+## Các loại nút {#node-types}
+
+Nếu bạn muốn [chạy nút của riêng mình](/developers/docs/nodes-and-clients/run-a-node/), bạn nên hiểu rằng có các loại nút khác nhau tiêu thụ dữ liệu theo những cách khác nhau. In fact, clients can run three different types of nodes: light, full and archive. Trên thực tế, ứng dụng có thể chạy ba loại nút khác nhau: nút nhẹ, nút đầy đủ và nút lưu trữ. Đồng bộ hóa có nghĩa là nó có thể lấy thông tin mới nhất về trạng thái của Ethereum nhanh như thế nào.
+
+### Nút đầy đủ {#full-node}
+
+Các nút đầy đủ sẽ xác thực từng khối một của blockchain, bao gồm việc tải về và kiểm tra nội dung khối và dữ liệu trạng thái cho mỗi khối. Có nhiều loại nút đầy đủ khác nhau - một số bắt đầu từ khối genesis và xác minh từng khối trong toàn bộ lịch sử của blockchain. Các nút khác bắt đầu xác minh tại một khối gần đây hơn mà chúng tin là hợp lệ (ví dụ: 'đồng bộ hóa snap' của Geth). Bất kể bắt đầu xác thực ở đâu, các nút đầy đủ chỉ giữ một bản sao cục bộ của dữ liệu tương đối mới (thường là 128 khối mới nhất), cho phép xóa dữ liệu cũ để tiết kiệm không gian ổ đĩa. Dữ liệu cũ có thể được tạo lại khi cần.
+
+- Lưu trữ toàn bộ dữ liệu blockchain (mặc dù điều này sẽ được làm sạch định kỳ nên nút đầy đủ không lưu trữ tất cả dữ liệu trạng thái từ lúc khởi đầu).
+- Tham gia vào quá trình xác thực khối, xác minh tất cả các khối và trạng thái.
+- Tất cả các trạng thái có thể được truy xuất từ bộ nhớ cục bộ hoặc được tái tạo từ 'ảnh chụp' bởi một nút đầy đủ.
+- Đáp ứng mạng lưới và cung cấp dữ liệu theo yêu cầu.
+
+### Nút lưu trữ {#archive-node}
+
+Các nút lưu trữ là những nút đầy đủ, chúng xác minh mọi khối từ lúc bắt đầu và không bao giờ xóa bất kỳ dữ liệu nào đã tải xuống.
+
+- Lưu trữ mọi thứ được giữ trong nút đầy đủ và xây dựng một kho lưu trữ các lịch sử trạng thái. Nó cần thiết nếu bạn muốn kiểm tra một cái gì đó như số dư tài khoản ở khối #4,000,000, hoặc chỉ đơn giản và đáng tin cậy để kiểm tra bộ giao dịch của bạn mà không cần xác minh chúng bằng cách theo dõi.
+- Dữ liệu này thể hiện đơn vị terabyte, điều này khiến các nút lưu trữ trở nên không hấp dẫn với người dùng bình thường nhưng có thể hữu ích cho các dịch vụ như trình khám phá khối, nhà cung cấp ví và phân tích chuỗi.
+
+Việc đồng bộ ứng dụng ở chế độ khác ngoài lưu trữ sẽ dẫn đến dữ liệu blockchain bị cắt giảm. Điều này có nghĩa là không có kho lưu trữ tất cả các lịch sử trạng thái nhưng nút đầy đủ có thể xây dựng chúng theo yêu cầu.
+
+Tìm hiểu thêm về [các nút lưu trữ](/developers/docs/nodes-and-clients/archive-nodes).
+
+### Nút nhẹ {#light-node}
+
+Thay vì tải xuống từng khối, các nút nhẹ chỉ tải xuống tiêu đề của các khối. Những tiêu đề này chứa thông tin tóm tắt về nội dung của các khối. Bất kỳ thông tin nào khác mà nút nhẹ yêu cầu sẽ được yêu cầu từ một nút đầy đủ. Nút nhẹ sau đó có thể độc lập xác minh dữ liệu mà họ nhận được với các gốc trạng thái trong đầu khối. Cụm nút nhẹ cho phép người dùng tham gia vào mạng Ethereum mà không cần phần cứng mạnh mẽ hoặc băng thông cao cần thiết để chạy các nút hoàn chỉnh. Cuối cùng, các nút nhẹ có thể chạy trên điện thoại di động hoặc các thiết bị nhúng. Các nút nhẹ không tham gia vào sự đồng thuận (tức là chúng không thể là trình xác thực), nhưng chúng có thể truy cập chuỗi khối Ethereum với cùng chức năng và đảm bảo bảo mật như một nút đầy đủ.
+
+Các ứng dụng nhẹ là một lĩnh vực đang được phát triển tích cực cho Ethereum và chúng tôi mong đợi sẽ thấy các ứng dụng nhẹ mới cho lớp đồng thuận và lớp thực thi trong thời gian tới.
+Cũng có những tuyến tiềm năng để cung cấp dữ liệu máy khách nhẹ qua [mạng gossip](https://www.ethportal.net/). Điều này có lợi vì mạng lưới tin đồn có thể hỗ trợ một mạng lưới các nút nhẹ mà không cần yêu cầu các nút đầy đủ phục vụ các yêu cầu.
+
+Ethereum chưa hỗ trợ một số lượng lớn các nút nhẹ, nhưng hỗ trợ nút nhẹ là một lĩnh vực dự kiến sẽ phát triển nhanh chóng trong tương lai gần. Cụ thể, các máy khách như [Nimbus](https://nimbus.team/), [Helios](https://github.com/a16z/helios) và [LodeStar](https://lodestar.chainsafe.io/) hiện đang tập trung nhiều vào các nút nhẹ.
+
+## Tại sao tôi nên vận hành một nút Ethereum? {#why-should-i-run-an-ethereum-node}
+
+Chạy một nút cho phép bạn sử dụng Ethereum trực tiếp, không cần tin tưởng và riêng tư, đồng thời hỗ trợ mạng lưới bằng cách giúp nó mạnh mẽ và phi tập trung hơn.
+
+### Lợi ích cho bạn {#benefits-to-you}
+
+Việc chạy nút riêng của bạn cho phép bạn sử dụng Ethereum một cách riêng tư, tự cung cấp và không cần tin tưởng. Bạn không cần phải tin tưởng vào mạng vì bạn có thể tự xác minh dữ liệu với ứng dụng của mình. "Đừng tin tưởng, hãy xác minh" là một phương châm phổ biến trong blockchain.
+
+- Nút của bạn xác minh tất cả các giao dịch và khối theo quy tắc đồng thuận một cách độc lập. Điều này có nghĩa là bạn không cần phải dựa vào bất kỳ nút nào khác trong mạng hoặc hoàn toàn tin tưởng chúng.
+- Bạn có thể sử dụng ví Ethereum với nút riêng của mình. Bạn có thể sử dụng dapps một cách an toàn và riêng tư hơn vì bạn sẽ không phải làm lộ địa chỉ và số dư của mình cho các bên trung gian. Mọi thứ có thể được kiểm tra với ứng dụng của bạn. [MetaMask](https://metamask.io), [Frame](https://frame.sh/) và [nhiều loại ví khác](/wallets/find-wallet/) cung cấp tính năng nhập RPC, cho phép chúng sử dụng nút của bạn.
+- Bạn có thể chạy và tự lưu trữ các dịch vụ khác mà phụ thuộc vào dữ liệu từ Ethereum. Chẳng hạn, điều này có thể là một trình xác thực Beacon Chain, phần mềm giống như layer 2, hạ tầng, công cụ khám phá khối, bộ xử lý thanh toán, v.v.
+- Bạn có thể cung cấp các [điểm cuối RPC](/developers/docs/apis/json-rpc/) tùy chỉnh của riêng mình. Bạn thậm chí có thể cung cấp các điểm kết nối này công khai cho cộng đồng để giúp họ tránh xa những nhà cung cấp trung tâm lớn.
+- Bạn có thể kết nối với nút của mình bằng **Giao tiếp giữa các tiến trình (IPC)** hoặc viết lại nút để tải chương trình của bạn dưới dạng một plugin. Điều này cho phép độ trễ thấp, rất hữu ích, ví dụ: khi xử lý nhiều dữ liệu bằng các thư viện web3 hoặc khi bạn cần thay thế các giao dịch của mình nhanh nhất có thể (tức là giao dịch đi trước).
+- Bạn có thể trực tiếp staking ETH để bảo vệ mạng lưới và nhận thưởng. Xem [đặt cược solo](/staking/solo/) để bắt đầu.
+
+
+
+### Lợi ích cho mạng {#network-benefits}
+
+Một tập hợp đa dạng các nút là rất quan trọng cho sức khỏe, an ninh và khả năng hoạt động bền vững của Ethereum.
+
+- Các nút hoàn chỉnh thực thi các quy tắc đồng thuận nên họ không thể bị đánh lừa để chấp nhận các khối không tuân theo. Điều này cung cấp thêm bảo mật cho mạng vì nếu tất cả các nút đều là nút nhẹ, không thực hiện xác minh đầy đủ, thì các xác thực viên có thể tấn công mạng.
+- Trong trường hợp một cuộc tấn công vượt qua các hàng rào phòng thủ kinh tế-mã hóa của [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/#what-is-pos), một cuộc khôi phục xã hội có thể được thực hiện bởi các nút đầy đủ chọn theo chuỗi trung thực.
+- Nhiều nút trong mạng sẽ tạo ra một mạng lưới đa dạng và mạnh mẽ hơn, đó là mục tiêu cuối cùng của việc phi tập trung, giúp tạo ra một hệ thống đáng tin cậy và không bị kiểm duyệt.
+- Các nút hoàn thiện cung cấp quyền truy cập vào dữ liệu blockchain cho các client nhẹ phụ thuộc vào nó. Các nút nhẹ không lưu trữ toàn bộ chuỗi khối, thay vào đó chúng xác minh dữ liệu thông qua [các gốc trạng thái trong phần đầu khối](/developers/docs/blocks/#block-anatomy). Họ có thể yêu cầu thêm thông tin từ các hoàn thiện nếu họ cần.
+
+Nếu bạn vận hành một nút hoàn thiện, toàn bộ mạng Ethereum sẽ được hưởng lợi từ điều đó, ngay cả khi bạn không vận hành một trình xác nhận.
+
+## Chạy nút của riêng bạn {#running-your-own-node}
+
+Bạn có muốn chạy client Ethereum của riêng mình không?
+
+Để có phần giới thiệu thân thiện với người mới bắt đầu, hãy truy cập trang [chạy một nút](/run-a-node) của chúng tôi để tìm hiểu thêm.
+
+Nếu bạn là người dùng có kỹ thuật hơn, hãy tìm hiểu sâu hơn về các chi tiết và tùy chọn về cách [khởi chạy nút của riêng bạn](/developers/docs/nodes-and-clients/run-a-node/).
+
+## Các lựa chọn thay thế {#alternatives}
+
+Setting up your own node can cost you time and resources but you don’t always need to run your own instance. Trong trường hợp này, bạn có thể sử dụng một nhà cung cấp API bên thứ ba. Để có cái nhìn tổng quan về việc sử dụng các dịch vụ này, hãy xem [nút dưới dạng dịch vụ](/developers/docs/nodes-and-clients/nodes-as-a-service/).
+
+Nếu có ai đó chạy một nút Ethereum với API công cộng trong cộng đồng của bạn, bạn có thể điều chỉnh ví của mình tới một nút cộng đồng qua tùy biến RPC và có được sự riêng tư hơn so với việc sử dụng một bên thứ ba nào đó mà bạn tin tưởng.
+
+Mặt khác, nếu bạn điều hành một khách hàng, bạn có thể chia sẻ nó với bạn bè của mình, những người có thể cần đến.
+
+## Các ứng dụng thực thi {#execution-clients}
+
+Cộng đồng Ethereum duy trì nhiều client thực thi mã nguồn mở (trước đây gọi là 'client Eth1' hoặc đơn giản là 'client Ethereum'), được phát triển bởi các đội ngũ khác nhau sử dụng các ngôn ngữ lập trình khác nhau. Điều này giúp mạng mạnh hơn và [đa dạng](/developers/docs/nodes-and-clients/client-diversity/) hơn. Mục tiêu lý tưởng là đạt được sự đa dạng mà không có khách hàng nào chiếm ưu thế để giảm thiểu bất kỳ điểm thất bại nào.
+
+Bảng này tóm tắt các clients khác nhau. Tất cả chúng đều vượt qua các [bài kiểm tra máy khách](https://github.com/ethereum/tests) và được bảo trì tích cực để luôn cập nhật các bản nâng cấp mạng.
+
+| Client | Ngôn ngữ | Hệ điều hành | Mạng | Chiến lược đồng bộ | State pruning |
+| ------------------------------------------------------------------------------------------- | ------------------------ | --------------------- | ------------------------- | ------------------------------------------------------------------------------- | --------------- |
+| [Geth](https://geth.ethereum.org/) | Go | Linux, Windows, macOS | Mainnet, Sepolia, Holesky | [Snap](#snap-sync), [Full](#full-sync) | Archive, Pruned |
+| [Nethermind](https://www.nethermind.io/) | C#, .NET | Linux, Windows, macOS | Mainnet, Sepolia, Holesky | [Snap](#snap-sync) (không phục vụ), Fast, [Full](#full-sync) | Archive, Pruned |
+| [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux, Windows, macOS | Mainnet, Sepolia, Holesky | [Snap](#snap-sync), [Fast](#fast-sync), [Full](#full-sync) | Archive, Pruned |
+| [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux, Windows, macOS | Mainnet, Sepolia, Holesky | [Full](#full-sync) | Archive, Pruned |
+| [Reth](https://reth.rs/) | Rust | Linux, Windows, macOS | Mainnet, Sepolia, Holesky | [Full](#full-sync) | Archive, Pruned |
+| [EthereumJS](https://github.com/ethereumjs/ethereumjs-monorepo) _(beta)_ | TypeScript | Linux, Windows, macOS | Sepolia, Holesky | [Full](#full-sync) | Pruned |
+
+Để biết thêm về các mạng được hỗ trợ, hãy đọc về [các mạng Ethereum](/developers/docs/networks/).
+
+Mỗi khách hàng có những trường hợp sử dụng và lợi thế riêng, vì vậy bạn nên chọn một cái dựa trên sở thích của chính mình. Sự đa dạng cho phép các ứng dụng tập trung vào các tính năng khác nhau và các đối tượng người dùng khác nhau. Bạn có thể muốn chọn một ứng dụng dựa trên các tính năng, hỗ trợ, ngôn ngữ lập trình hoặc giấy phép.
+
+### Besu {#besu}
+
+Hyperledger Besu là một ứng dụng Ethereum cấp doanh nghiệp dành cho các mạng công cộng và có quyền truy cập. Nó cung cấp tất cả các tính năng của Ethereum Mainnet, từ việc theo dõi đến GraphQL, có khả năng giám sát rộng rãi và được hỗ trợ bởi ConsenSys, cả trong các kênh cộng đồng mở và thông qua các thỏa thuận mức dịch vụ thương mại cho các doanh nghiệp. Bạn có thể muốn chọn một ứng dụng dựa trên các tính năng, hỗ trợ, ngôn ngữ lập trình hoặc giấy phép.
+
+[Tài liệu](https://besu.hyperledger.org/en/stable/) mở rộng của Besu sẽ hướng dẫn bạn qua tất cả các chi tiết về các tính năng và thiết lập của nó.
+
+### Erigon {#erigon}
+
+Erigon, trước đây được biết đến với tên gọi Turbo-Geth, bắt đầu như một nhánh của Go Ethereum hướng tới hiệu suất tốc độ và tiết kiệm không gian ổ đĩa. Erigon là một triển khai hoàn toàn được thiết kế lại của Ethereum, hiện đang được viết bằng ngôn ngữ Go nhưng cũng có các triển khai bằng ngôn ngữ khác đang được phát triển. Mục tiêu của Erigon là cung cấp một triển khai Ethereum nhanh hơn, linh hoạt hơn và tối ưu hơn. Nó có thể thực hiện việc đồng bộ nút lưu trữ đầy đủ sử dụng khoảng 2TB dung lượng ổ đĩa, trong vòng chưa đầy 3 ngày.
+
+### Go Ethereum {#geth}
+
+Go Ethereum (viết tắt là Geth) là một trong những triển khai gốc của giao thức Ethereum. Hiện nay, đây là ứng dụng phổ biến nhất với số lượng người dùng lớn nhất và đa dạng công cụ dành cho người sử dụng và nhà phát triển. Nó được viết bằng ngôn ngữ Go, hoàn toàn mã nguồn mở và được cấp phép theo GNU LGPL v3.
+
+Tìm hiểu thêm về Geth trong [tài liệu](https://geth.ethereum.org/docs/) của nó.
+
+### Nethermind {#nethermind}
+
+Nethermind là một triển khai của Ethereum được tạo ra với công nghệ C# .NET, được cấp phép với LGPL-3.0, hoạt động trên tất cả các nền tảng chính bao gồm ARM. Nó cung cấp hiệu suất tuyệt vời với:
+
+- một máy ảo được tối ưu hóa
+- Truy cập trạng thái
+- mạng lưới và các tính năng phong phú như bảng điều khiển Prometheus/Grafana, hỗ trợ ghi nhật ký doanh nghiệp seq, theo dõi JSON-RPC và các plugin phân tích.
+
+Nethermind cũng có [tài liệu chi tiết](https://docs.nethermind.io), hỗ trợ nhà phát triển mạnh mẽ, một cộng đồng trực tuyến và hỗ trợ 24/7 cho người dùng cao cấp.
+
+### Reth {#reth}
+
+Reth (viết tắt của Rust Ethereum) là một triển khai nút đầy đủ Ethereum, tập trung vào việc thân thiện với người dùng, có tính mô-đun cao, nhanh chóng và hiệu quả. Reth ban đầu được xây dựng và phát triển bởi Paradigm, và được cấp phép theo các giấy phép Apache và MIT.
+
+Reth đã sẵn sàng cho sản xuất và phù hợp để sử dụng trong các môi trường quan trọng như staking hoặc dịch vụ yêu cầu thời gian hoạt động cao. Hoạt động tốt trong các trường hợp sử dụng mà yêu cầu hiệu suất cao với biên lợi nhuận lớn như RPC, MEV, lập chỉ mục, mô phỏng và các hoạt động P2P.
+
+Tìm hiểu thêm bằng cách xem [Sách Reth](https://reth.rs/), hoặc [kho GitHub của Reth](https://github.com/paradigmxyz/reth?tab=readme-ov-file#reth).
+
+### Đang phát triển {#execution-in-development}
+
+Những ứng dụng này vẫn đang ở giai đoạn phát triển sớm và chưa được khuyến nghị sử dụng trong sản xuất.
+
+#### EthereumJS {#ethereumjs}
+
+Khách hàng thực thi EthereumJS (EthereumJS) được viết bằng TypeScript và bao gồm một số gói, bao gồm các nguyên tố Ethereum cốt lõi được thể hiện qua các lớp Block, Transaction và Merkle-Patricia Trie, cũng như các thành phần cốt lõi của khách hàng bao gồm việc triển khai Máy ảo Ethereum (EVM), một lớp blockchain, và ngăn xếp mạng DevP2P.
+
+Tìm hiểu thêm về nó bằng cách đọc [tài liệu](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master) của nó
+
+## Các ứng dụng đồng thuận {#consensus-clients}
+
+Có nhiều máy khách đồng thuận (trước đây gọi là máy khách 'Eth2') để hỗ trợ các [nâng cấp đồng thuận](/roadmap/beacon-chain/). Chúng chịu trách nhiệm cho tất cả logic liên quan đến sự đồng thuận bao gồm thuật toán chọn phân nhánh, xử lý các chứng thực và quản lý phần thưởng cũng như hình phạt của [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos).
+
+| Client | Ngôn ngữ | Hệ điều hành | Mạng |
+| ------------------------------------------------------------- | ---------- | --------------------- | ------------------------------------------------------------------- |
+| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux, Windows, macOS | Chuỗi Hải Đăng, Holesky, Pyrmont, Sepolia, và nhiều hơn nữa |
+| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux, Windows, macOS | Chuỗi Hải Đăng, Holesky, Sepolia, và nhiều hơn nữa |
+| [Nimbus](https://nimbus.team/) | Nim | Linux, Windows, macOS | Chuỗi Hải Đăng, Holesky, Sepolia, và nhiều hơn nữa |
+| [Prysm](https://prysm.offchainlabs.com/docs/) | Go | Linux, Windows, macOS | Chuỗi Hải Đăng, Gnosis, Holesky, Pyrmont, Sepolia, và nhiều hơn nữa |
+| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux, Windows, macOS | Chuỗi Hải Đăng, Gnosis, Holesky, Sepolia, và nhiều hơn nữa |
+| [Grandine](https://docs.grandine.io/) | Rust | Linux, Windows, macOS | Chuỗi Hải Đăng, Holesky, Sepolia, và nhiều hơn nữa |
+
+### Lighthouse {#lighthouse}
+
+Lighthouse là một bản triển khai hệ thống đồng thuận, được viết bằng ngôn ngữ Rust và phát hành theo giấy phép Apache-2.0. Lighthouse được duy trì bởi Sigma Prime và đã ổn định, sẵn sàng cho môi trường sản xuất kể từ khi Chuỗi Hải Đăng ra đời. Nhiều doanh nghiệp, nhóm Cổ phần và cá nhân đang tin dùng. Nó hướng tới mục tiêu bảo mật, hiệu năng cao và khả năng tương tác trong nhiều môi trường khác nhau, từ máy tính cá nhân đến các hệ thống triển khai tự động phức tạp.
+
+Tài liệu có thể được tìm thấy trong [Sách Lighthouse](https://lighthouse-book.sigmaprime.io/)
+
+### Lodestar {#lodestar}
+
+Lodestar là một bản triển khai hệ thống đồng thuận đã sẵn sàng cho môi trường sản xuất, được viết bằng Typescript theo giấy phép LGPL-3.0. Nó được duy trì bởi Lưới Bảo vệ Hệ thống và là hệ thống đồng thuận mới nhất dành cho người đóng góp cổ phần cá nhân, nhà phát triển và nhà nghiên cứu. Lodestar bao gồm một nút ngọn hải đăng và một hệ thống xác thực, được vận hành bởi các triển khai giao thức Ethereum viết bằng JavaScript. Lodestar hướng đến việc cải thiện khả năng sử dụng của Ethereum thông qua hệ thống ánh sáng, mở rộng khả năng tiếp cận cho nhiều nhà phát triển hơn và tiếp tục đóng góp vào sự đa dạng của hệ sinh thái.
+
+Thông tin thêm có thể được tìm thấy trên [trang web Lodestar](https://lodestar.chainsafe.io/)
+
+### Nimbus {#nimbus}
+
+Nimbus là một bản triển khai của hệ thống đồng thuận được viết bằng ngôn ngữ Nim, phát hành theo giấy phép Apache-2.0. Đây là một hệ thống đã sẵn sàng cho môi trường sản xuất, hiện đang được sử dụng bởi những người gửi cổ phần độc lập và các hồ cổ phần. Nimbus được thiết kế với hiệu quả tài nguyên làm trọng tâm, cho phép chạy dễ dàng trên cả các thiết bị hạn chế tài nguyên lẫn hạ tầng doanh nghiệp, mà vẫn đảm bảo tính ổn định và hiệu suất phần thưởng. Dấu chân tài nguyên nhẹ hơn đồng nghĩa với việc hệ thống có biên độ an toàn lớn hơn khi mạng lưới rơi vào tình trạng căng thẳng hoặc quá tải.
+
+Tìm hiểu thêm trong [tài liệu Nimbus](https://nimbus.guide/)
+
+### Prysm {#prysm}
+
+Prysm là một hệ thống đồng thuận đầy đủ tính năng, mã nguồn mở, được viết bằng Go và phân phối theo giấy phép GPL-3.0. Prysm đi kèm với tùy chọn giao diện phần mềm web UI, đồng thời ưu tiên trải nghiệm người dùng, tài liệu hướng dẫn rõ ràng và khả năng tùy chỉnh cao, phù hợp cho cả người dùng tự gửi cổ phần tại nhà lẫn tổ chức cổ phần quy mô lớn.
+
+Truy cập [tài liệu Prysm](https://prysm.offchainlabs.com/docs/) để tìm hiểu thêm.
+
+### Teku {#teku}
+
+Teku là một trong những hệ thống đồng thuận gốc từ thời Chuỗi Hải Đăng sự sáng thế, được phát triển ngay từ những ngày đầu của Ethereum Bằng chứng Cổ phần. Bên cạnh những mục tiêu quen thuộc (bảo mật, độ bền vững, tính ổn định, khả năng sử dụng và hiệu năng), Teku đặc biệt hướng đến việc tuân thủ đầy đủ mọi tiêu chuẩn của các hệ thống đồng thuận.
+
+Teku cung cấp các tùy chọn triển khai hết sức linh hoạt. Nút Ngọn hải đăng và hệ thống xác thực có thể được chạy cùng nhau trong một tiến trình duy nhất, điều này vô cùng tiện lợi cho những người cổ phần cá nhân; hoặc chúng cũng có thể được chạy tách biệt để phục vụ các hoạt động cổ phần phức tạp hơn. Ngoài ra, Teku hoàn toàn có thể tương tác với [Web3Signer](https://github.com/ConsenSys/web3signer/) để bảo mật khóa ký và bảo vệ chống chém.
+
+Teku được viết bằng Java và có giấy phép Apache 2,0. Teku được viết bằng Java và có giấy phép Apache 2.0. Tìm hiểu thêm trong [tài liệu Teku](https://docs.teku.consensys.net/en/latest/).
+
+### Grandine {#grandine}
+
+Grandine là một thực hiện khách đồng thuận, được viết bằng Rust theo giấy phép GPL-3.0. Nó được duy trì bởi Đội ngũ Cốt lõi Grandine và nhanh chóng, hiệu suất cao và nhẹ. Nó phù hợp với nhiều loại stakers khác nhau, từ những stakers đơn lẻ chạy trên các thiết bị tài nguyên thấp như Raspberry Pi đến tổ chức stakers lớn điều hành hàng chục nghìn trình xác thực.
+
+Tài liệu có thể được tìm thấy trong [Sách Grandine](https://docs.grandine.io/)
+
+## Các chế độ đồng bộ hóa {#sync-modes}
+
+Để theo dõi và xác minh dữ liệu hiện tại trên mạng, khách hàng Ethereum cần đồng bộ với trạng thái mạng mới nhất. Điều này được thực hiện bằng cách tải dữ liệu từ các đồng nghiệp, xác minh tính toàn vẹn của chúng một cách an toàn bằng mật mã, và xây dựng một cơ sở dữ liệu blockchain cục bộ.
+
+Chế độ đồng bộ hóa đại diện cho các phương pháp khác nhau trong quá trình này với nhiều thỏa hiệp khác nhau. Khách hàng cũng khác nhau trong việc triển khai các thuật toán đồng bộ. Luôn tham khảo tài liệu chính thức của khách hàng mà bạn đã chọn để biết thông tin chi tiết về cách triển khai.
+
+### Các chế độ đồng bộ hóa của lớp thực thi {#execution-layer-sync-modes}
+
+Lớp thực thi có thể hoạt động ở các chế độ khác nhau để phù hợp với các trường hợp sử dụng khác nhau, từ việc tái thực thi trạng thái toàn cầu của chuỗi khối đến việc chỉ đồng bộ với đỉnh của chuỗi từ một điểm kiểm tra đáng tin cậy.
+
+#### Đồng bộ hóa đầy đủ {#full-sync}
+
+Một đồng bộ hoàn chỉnh tải xuống tất cả các khối (bao gồm tiêu đề và nội dung khối) và tái tạo trạng thái của chuỗi khối theo từng bước bằng cách thực hiện từng khối từ khởi nguồn.
+
+- Giảm thiểu sự tin cậy và cung cấp mức độ an ninh cao nhất bằng cách xác minh từng giao dịch.
+- Với số lượng giao dịch ngày càng tăng, quá trình xử lý tất cả các giao dịch có thể mất từ vài ngày đến vài tuần.
+
+[Các nút lưu trữ](#archive-node) thực hiện đồng bộ hóa đầy đủ để xây dựng (và giữ lại) lịch sử hoàn chỉnh về các thay đổi trạng thái được thực hiện bởi mọi giao dịch trong mọi khối.
+
+#### Đồng bộ hóa nhanh {#fast-sync}
+
+Giống như việc đồng bộ hoàn chỉnh, việc đồng bộ nhanh tải xuống tất cả các khối (bao gồm tiêu đề, giao dịch và biên nhận). Tuy nhiên, thay vì xử lý lại các giao dịch lịch sử, một quá trình đồng bộ nhanh dựa vào các biên lai cho đến khi đạt đến đỉnh gần đây, khi đó nó chuyển sang nhập và xử lý các khối để cung cấp một nút hoàn chỉnh.
+
+- Chiến lược đồng bộ nhanh.
+- Giảm nhu cầu xử lý để ưu tiên sử dụng băng thông.
+
+#### Đồng bộ hóa snap {#snap-sync}
+
+Đồng bộ snap cũng xác minh chuỗi từng khối một. Tuy nhiên, thay vì bắt đầu từ khối genesis, một bản đồng bộ snap sẽ bắt đầu từ một điểm kiểm tra 'đáng tin' gần đây hơn, mà đã được biết là một phần của chuỗi khối thực. Nút lưu lại các điểm kiểm tra định kỳ trong khi xóa dữ liệu cũ hơn một khoảng thời gian nhất định. Các bức ảnh chụp này được sử dụng để tái tạo dữ liệu trạng thái khi cần thiết, thay vì lưu trữ nó mãi mãi.
+
+- Chiến lược đồng bộ nhanh nhất, hiện đang là mặc định trên mạng chính Ethereum.
+- Tiết kiệm rất nhiều dung lượng đĩa và băng thông mạng mà không hi sinh tính bảo mật.
+
+[Thêm về đồng bộ hóa snap](https://github.com/ethereum/devp2p/blob/master/caps/snap.md).
+
+#### Đồng bộ hóa nhẹ {#light-sync}
+
+Client nhẹ tải xuống tất cả các tiêu đề khối, dữ liệu khối và kiểm tra một số một cách ngẫu nhiên. Chỉ đồng bộ hóa đầu chuỗi từ điểm kiểm tra tin cậy.
+
+- Chỉ nhận được trạng thái mới nhất trong khi dựa vào sự tin tưởng vào các nhà phát triển và cơ chế đồng thuận.
+- Khách hàng sẵn sàng sử dụng với trạng thái mạng hiện tại trong vài phút.
+
+**Lưu ý** Đồng bộ hóa nhẹ chưa hoạt động với Ethereum bằng chứng cổ phần - các phiên bản mới của đồng bộ hóa nhẹ sẽ sớm được phát hành!
+
+[Thêm về các máy khách nhẹ](/developers/docs/nodes-and-clients/light-clients/)
+
+### Các chế độ đồng bộ hóa của lớp đồng thuận {#consensus-layer-sync-modes}
+
+#### Đồng bộ hóa lạc quan {#optimistic-sync}
+
+Đồng bộ lạc quan là một chiến lược đồng bộ sau khi hợp nhất, được thiết kế theo dạng tùy chọn và tương thích ngược, cho phép các nút thực hiện đồng bộ thông qua những phương thức đã được thiết lập sẵn. Công cụ thực thi có thể nhập các khối beacon một cách _lạc quan_ mà không cần xác minh đầy đủ, tìm phần đầu mới nhất, sau đó bắt đầu đồng bộ hóa chuỗi bằng các phương pháp trên. Sau đó, khi client thực thi đã đồng bộ, nó sẽ thông báo cho client đồng thuận về tính hợp lệ của các giao dịch trong Beacon Chain.
+
+[Thêm về đồng bộ hóa lạc quan](https://github.com/ethereum/consensus-specs/blob/dev/sync/optimistic.md)
+
+#### Đồng bộ hóa điểm kiểm tra {#checkpoint-sync}
+
+Một đồng bộ hóa checkpoint, còn được biết đến là đồng bộ hóa chủ yếu yếu, tạo ra trải nghiệm người dùng tốt hơn cho việc đồng bộ hóa một Nút Beacon. Nó dựa trên các giả định về [tính chủ quan yếu](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/) cho phép đồng bộ hóa Chuỗi Hải Đăng từ một điểm kiểm tra tính chủ quan yếu gần đây thay vì từ khối khởi nguyên. Đồng bộ hóa điểm kiểm tra giúp thời gian đồng bộ hóa ban đầu nhanh hơn đáng kể với các giả định tin cậy tương tự như đồng bộ hóa từ [khối khởi nguyên](/glossary/#genesis-block).
+
+Trên thực tế, điều này có nghĩa là nút của bạn kết nối với một dịch vụ từ xa để tải về các trạng thái đã hoàn tất gần đây và tiếp tục xác minh dữ liệu từ điểm đó. Bên thứ ba cung cấp dữ liệu được tin cậy và nên được lựa chọn một cách cẩn thận.
+
+[Thêm về đồng bộ hóa điểm kiểm tra](https://notes.ethereum.org/@djrtwo/ws-sync-in-practice)
+
+## Đọc thêm {#further-reading}
+
+- [Ethereum 101 - Phần 2 - Tìm hiểu về các nút](https://kauri.io/ethereum-101-part-2-understanding-nodes/48d5098292fd4f11b251d1b1814f0bba/a) _– Wil Barnes, ngày 13 tháng 2 năm 2019_
+- [Chạy các nút đầy đủ Ethereum: Hướng dẫn cho người có ít động lực](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, ngày 7 tháng 11 năm 2019_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các khối](/developers/docs/blocks/)
+- [Các mạng](/developers/docs/networks/)
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Biến Raspberry Pi 4 của bạn thành một nút trình xác thực chỉ bằng cách flash thẻ MicroSD – Hướng dẫn cài đặt](/developers/tutorials/run-node-raspberry-pi/) _– Flash Raspberry Pi 4 của bạn, cắm cáp ethernet, kết nối ổ SSD và bật nguồn thiết bị để biến Raspberry Pi 4 thành một nút Ethereum đầy đủ chạy lớp thực thi (Mainnet) và/hoặc lớp đồng thuận (Chuỗi Hải Đăng / trình xác thực)._
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/light-clients/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/light-clients/index.md
new file mode 100644
index 00000000000..3c578feda1b
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/light-clients/index.md
@@ -0,0 +1,61 @@
+---
+title: Các ứng dụng nhẹ
+description: Giới thiệu về nút nhẹ Ethereum(Ethereum light client).
+lang: vi
+---
+
+Chạy một nút đầy đủ (full node) là cách thức không cần sự tin cậy, đảm bảo sự riêng tư, phi tập trung và chống kiểm duyệt nhất để tương tác với Ethereum. Với một nút đầy đủ, bạn giữ bản sao chuỗi khối của riêng mình mà bạn có thể truy vấn ngay lập tức và bạn có quyền truy cập trực tiếp vào mạng ngang hàng của Ethereum. Tuy nhiên, việc chạy một nút đầy đủ đòi hỏi một lượng bộ nhớ, bộ lưu trữ và CPU đáng kể. Điều này có nghĩa là không phải ai cũng có thể chạy nút riêng của mình. Có một số giải pháp cho vấn đề này trên lộ trình phát triển của Ethereum, bao gồm sự phi trạng thái(statelessness), nhưng chúng còn nhiều năm nữa mới được triển khai. Lời giải ngắn hạn cho vấn đề này là đánh đổi một số lợi ích của việc chạy nút đầy đủ để có được hiệu suất cao, cho phép các nút chạy với cấu hình phần cứng rất thấp. Các nút thực hiện sự đánh đổi này được gọi là nút nhẹ(light clients).
+
+## Máy khách gọn nhẹ là gì {#what-is-a-light-client}
+
+Nút nhẹ là nút chạy phần mềm light client. Thay vì giữ các bản sao cục bộ của dữ liệu blockchain và xác minh một cách độc lập tất cả các thay đổi, thì họ yêu cầu các dữ liệu cần thiết từ một số nhà cung cấp. Nhà cung cấp ở đây có thể là một kết nối trực tiếp tới một nút đầy đủ hoặc thông qua một số máy chủ RPC tập trung. Dữ liệu sau đó được xác minh bởi nút nhẹ, cho phép nó bắt kịp với phần đầu của chuỗi. Nút nhẹ chỉ xử lý các tiêu đề khối, đôi khi sẽ tải xuống toàn bộ khối. Nút có thể khác nhau về dung lượng, tùy thuộc vào sự phối hợp giữ Client nhẹ và đầy đủ mà chúng đang chạy. Ví dụ: cấu hình nhẹ nhất sẽ là chạy ứng dụng Client thực thi nhẹ (light execution client) và ứng dụng Client đồng thuận nhẹ (light consensus client). Cũng có khả năng là nhiều nút sẽ chọn chạy các máy khách đồng thuận nhẹ với các máy khách thực thi đầy đủ hoặc ngược lại. khách thực thi đầy đủ hoặc ngược lại.
+
+## Cách Client nhẹ hoạt động? {#how-do-light-clients-work}
+
+Khi Ethereum sử dung cơ chế đồng thuận bằng chứng cổ phần, một hạ tầng mới được giới thiệu chuyên dụng cho hỗ trợ Client nhẹ. Cách thức hoạt động của nó là chọn ngẫu nhiên một tập hợp con gồm 512 nút xác thực sau mỗi 1,1 ngày để đóng vai trò là một **ủy ban đồng bộ**. Ủy ban đồng bộ sẽ ký vào đầu chuỗi của khối hiện tại. Mỗi một đầu khối chứa một đa chữ ký của nút xác thực đồng bộ trong ủy ban và một trường Bits thể hiện rằng nút xác thực nào đã ký và nút nào không. Mỗi một đầu chuỗi cũng bao gồm một danh sách nút xác thực được mong đợi tham gia ký khối tiếp theo. Điều này có nghĩa rằng Client nhẹ có thể nhanh chóng thấy rằng ủy ban đồng bộ đã ký vào dữ liệu mà họ nhận được, và họ cũng kiểm tra việc ủy ban đồng bộ này là đúng bằng cách với danh sách ủy ban đồng thuận mà nó được thông báo sẽ mong đợi trong khối trước đó. Bằng cách này, Client nhẹ có thể liên tục cập nhật thông tin về khối Ethereum mới nhất mà không cần thực sự tải xuống toàn bộ khối, chỉ cần tải đầu chuỗi chứa thông tin tóm tắt.
+
+Trên lớp thực thi không có một mô tả cụ thể cho Client thực thi nhẹ. Phạm vi của một Client thực thi nhẹ có thể khác nhau: từ "chế độ nhẹ" của một Client thực thi đầy đủ — tức là vẫn có đầy đủ chức năng EVM và mạng của một nút đầy đủ nhưng chỉ xác minh đầu chuỗi mà không tải xuống dữ liệu đi kèm — cho đến một Client tối giản hơn, phụ thuộc nhiều vào việc chuyển tiếp các yêu cầu đến một bên cung cấp RPC để tương tác với Ethereum.
+
+## Tại sao Client nhẹ lại quan trọng? {#why-are-light-clients-important}
+
+Client nhẹ quan trọng bởi vì cho phép người dùng xác thực dữ liệu đến thay vì mù quán tin vào người cung cấp thông tin rằng thông tin họ cung cấp là đúng và đầy đủ, trong lúc sử dụng một phần rất nhỏ của tài nguyên tính toán của một nút đầy đủ. Dữ liệu mà các Client nhẹ nhận được có thể được đối chiếu với đầu chuỗi mà chúng biết đã được ký bởi ít nhất 2/3 trong một tập hợp ngẫu nhiên gồm 512 nút xác thực của Ethereum. Đây là một bằng chứng rất thuyết phục cho thấy dữ liệu đó là chính xác.
+
+Client nhẹ chỉ sử dụng một lượng rất nhỏ sức mạnh tính toán, bộ nhớ và lưu trữ, vì vậy nó có thể chạy trên điện thoại di động, được nhúng trong một ứng dụng hoặc như một phần của trình duyệt. Client nhẹ là cách để giảm thiểu việc cần sự tin tưởng qua Ethereum, nhưng vẫn mượt mà khi dựa vào một nhà cung cấp thứ ba.
+
+Hãy lấy một ví dụ đơn giản. Tưởng tượng rằng bạn muốn xem số dư tài khoản của bạn. Để làm điều này bạn phải yêu cầu đến nút Ethereum. Nút đó sẽ kiểm tra trạng thái của Ethereum đang có trên cục bộ về thông tin số dư của tài khoản đó và trả về kết quả. Nếu bạn không có quyền truy cập trực tiếp vào một nút, thì có những nhà vận hành tập trung cung cấp dữ liệu này dưới dạng dịch vụ. Bạn sẽ phải gửi yêu cầu cho họ, họ kiểm tra nút của họ, và trả kết quả về cho bạn. Vấn đề với việc này là bạn phải tin người cung cấp gửi bạn kết quả đúng. Bạn không bao giờ biết được kết quả có đúng không vì bạn không xác thực được bằng chính mình.
+
+Một Client nhẹ sẽ giải quyết vấn đề này. Bạn vẫn sẽ yêu cầu thông tin từ người cung cấp bên ngoài, nhưng khi bạn nhận dữ liệu nó sẽ đi kèm với bằng chứng mà nút nhẹ của bạn có thể kiểm tra lại thông tin mà nó nhận được ở đầu chuỗi. Điều này có nghĩa Ethereum đơn giản hóa việc xác thực tính đúng sai của dữ liệu thay vì phải tin vào nhà cung cấp.
+
+## Những đổi mới nào mà Client nhẹ mang lại? {#what-innovations-do-light-clients-enable}
+
+Lợi ích chính của Client nhẹ là cho phép nhiều người hơn truy cập Ethereum một cách độc lập, với yêu cầu phần cứng không đáng kể và ít phụ thuộc vào bên thứ ba. Điều này tốt cho người dùng vì họ có thể tự xác minh dữ liệu của mình, và cũng tốt cho mạng lưới vì nó làm tăng số lượng và sự đa dạng của các nút đang xác minh chuỗi.
+
+Khả năng chạy các nút Ethereum trên những thiết bị có bộ nhớ, dung lượng lưu trữ và sức mạnh xử lý rất nhỏ là một trong những lĩnh vực đổi mới lớn mà Client nhẹ mở ra. Trong khi hiện nay các nút Ethereum yêu cầu nhiều tài nguyên tính toán, thì Client nhẹ có thể được nhúng vào trình duyệt, chạy trên điện thoại di động, và thậm chí có thể trên các thiết bị nhỏ hơn như đồng hồ thông minh. Điều này có nghĩa ví Ethereum với Client trong đó sẽ chạy trên điện thoại di động. Điều này có nghĩa là các ví di động có thể trở nên phi tập trung hơn nhiều, vì chúng sẽ không phải tin tưởng vào các nhà cung cấp dữ liệu tập trung để lấy dữ liệu.
+
+Một phần mở rộng của điều này là việc kích hoạt các thiết bị **Internet of things (IoT)**. Một Client nhẹ có thể được dùng để nhanh chóng chứng minh bạn sở hữu một lượng Token hoặc một NFT nào đó, với tất cả các đảm bảo an toàn từ ủy ban đồng bộ, và từ đó kích hoạt một hành động trên mạng lưới IoT. Hãy tưởng tượng một [dịch vụ cho thuê xe đạp](https://youtu.be/ZHNrAXf3RDE?t=929) sử dụng một ứng dụng có máy khách gọn nhẹ được nhúng để nhanh chóng xác minh rằng bạn sở hữu NFT của dịch vụ cho thuê đó, và nếu vậy, sẽ mở khóa một chiếc xe đạp để bạn có thể đi!
+
+Ethereum Rollups cũng sẽ hưởng lợi tù Clients nhẹ. Một trong những vấn đề của Rollups đã là những vụ Hack nhắm vào cầu nối cho phép quỹ di chuyển từ mạng chính Ethereum đến Rollup. Một lỗ hổng là các cổng dữ liệu mà Rollups sử dụng để phát hiện việc một người dùng đã gửi tiền vào cầu nối. Nếu một cổng dữ liệu cung cấp dữ liệu sai, chúng có thể đánh lừa Rollup khiến nó tưởng rằng đã có khoản gửi vào cầu nối và từ đó giải phóng sai tiền. Một Client nhẹ được nhúng trong Rollup có thể được dùng để chống lại các cổng dữ liệu bị hỏng, bởi vì khoản gửi vào cầu nối có thể đi kèm với một bằng chứng mà Rollup có thể xác minh trước khi giải phóng bất kỳ Token nào. Cùng một khái niệm này cũng có thể được áp dụng cho các cầu nối liên chuỗi khác.
+
+Client nhẹ cũng được dùng trong nâng cấp ví Ethereum. Thay vì tin tưởng dữ liệu từ nhà cung cấp RPC, ví của bạn có thể xác thực dữ liệu bằng cách sử dụng Client nhẹ nhúng. Điều này sẽ thêm bảo mật vào ví của bạn. Nếu nhà cung cấp RPC không trung thực và cung cấp cho bạn dữ liệu sai, Client nhẹ được nhúng sẽ báo bạn điều đó!
+
+## Tình trạng phát triển của Client nhẹ hiện nay như thế nào? {#current-state-of-development}
+
+Hiện có một số Client nhẹ đang được phát triển, bao gồm Client nhẹ cho thực thi, đồng thuận, và loại kết hợp thực thi/đồng thuận. Đây là những bản triển khai Client nhẹ mà chúng tôi biết tại thời điểm viết trang này:
+
+- [Lodestar](https://github.com/ChainSafe/lodestar/tree/unstable/packages/light-client): máy khách đồng thuận gọn nhẹ bằng TypeScript
+- [Helios](https://github.com/a16z/helios): máy khách gọn nhẹ thực thi và đồng thuận kết hợp bằng Rust
+- [Geth](https://github.com/ethereum/go-ethereum/tree/master/beacon/light): chế độ gọn nhẹ cho máy khách thực thi (đang phát triển) bằng Go
+- [Nimbus](https://nimbus.guide/el-light-client.html): máy khách đồng thuận gọn nhẹ bằng Nim
+
+Theo chúng tôi được biết, chưa có sản phẩm nào trong số này được coi là sẵn sàng để sản xuất.
+
+Ngoài ra, còn rất nhiều việc đang được thực hiện để cải thiện các cách mà các máy khách gọn nhẹ có thể truy cập dữ liệu Ethereum. Hiện tại, các máy khách gọn nhẹ dựa vào các yêu cầu RPC tới các nút đầy đủ sử dụng mô hình máy khách/máy chủ, nhưng trong tương lai, dữ liệu có thể được yêu cầu theo cách phi tập trung hơn bằng cách sử dụng một mạng chuyên dụng như [Mạng Portal](https://www.ethportal.net/) có thể phục vụ dữ liệu cho các máy khách gọn nhẹ bằng giao thức gossip ngang hàng.
+
+Các mục khác trong [lộ trình](/roadmap/) như [cây Verkle](/roadmap/verkle-trees/) và [tính không trạng thái](/roadmap/statelessness/) cuối cùng sẽ mang lại sự đảm bảo an ninh của các máy khách gọn nhẹ ngang bằng với các máy khách đầy đủ.
+
+## Đọc thêm {#further-reading}
+
+- [Zsolt Felfodhi nói về các máy khách Geth gọn nhẹ](https://www.youtube.com/watch?v=EPZeFXau-RE)
+- [Etan Kissling nói về mạng lưới máy khách gọn nhẹ](https://www.youtube.com/watch?v=85MeiMA4dD8)
+- [Etan Kissling nói về các máy khách gọn nhẹ sau The Merge](https://www.youtube.com/watch?v=ZHNrAXf3RDE)
+- [Piper Merriam: Con đường quanh co đến các máy khách gọn nhẹ có chức năng](https://snakecharmers.ethereum.org/the-winding-road-to-functional-light-clients/)
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/node-architecture/index.md
new file mode 100644
index 00000000000..bcc18cc0ff9
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/node-architecture/index.md
@@ -0,0 +1,59 @@
+---
+title: Kiến trúc nốt
+description: Giới thiệu về cách tổ chức các nút Ethereum.
+lang: vi
+---
+
+Một nút Ethereum bao gồm hai máy khách: một [máy khách thực thi](/developers/docs/nodes-and-clients/#execution-clients) và một [máy khách đồng thuận ](/developers/docs/nodes-and-clients/#consensus-clients). Để một nút đề xuất một khối mới, nó cũng phải chạy một [máy khách xác thực](#validators).
+
+Khi Ethereum sử dụng [bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/), một máy khách thực thi là đủ để chạy một nút Ethereum đầy đủ. Tuy nhiên, kể từ khi triển khai [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pow/), máy khách thực thi phải được sử dụng cùng với một phần mềm khác được gọi là [máy khách đồng thuận ](/developers/docs/nodes-and-clients/#consensus-clients).
+
+Sơ đồ dưới đây cho thấy mối quan hệ giữa hai máy khách Ethereum. Hai máy khách kết nối với các mạng ngang hàng (P2P) tương ứng của riêng chúng. Cần có các mạng P2P riêng biệt vì các máy khách thực thi lan truyền các giao dịch qua mạng P2P của chúng, cho phép chúng quản lý vùng giao dịch cục bộ của mình, trong khi các máy khách đồng thuận lan truyền các khối qua mạng P2P của chúng, cho phép sự đồng thuận và phát triển chuỗi.
+
+
+
+_Có một số tùy chọn cho máy khách thực thi bao gồm Erigon, Nethermind và Besu_.
+
+Để cấu trúc hai máy khách này hoạt động, các máy khách đồng thuận phải chuyển các gói giao dịch cho máy khách thực thi. Máy khách thực thi thực hiện các giao dịch cục bộ để xác thực rằng các giao dịch đó không vi phạm bất kỳ quy tắc nào của Ethereum và bản cập nhật được đề xuất cho trạng thái của Ethereum là chính xác. Khi một nút được chọn làm trình sản xuất khối, phiên bản máy khách đồng thuận của nó sẽ yêu cầu các gói giao dịch từ máy khách thực thi để đưa vào khối mới và thực thi chúng để cập nhật trạng thái chung. Máy khách đồng thuận điều khiển máy khách thực thi thông qua kết nối RPC cục bộ bằng [Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md).
+
+## Máy khách thực thi làm gì? {#execution-client}
+
+Máy khách thực thi chịu trách nhiệm xác thực, xử lý và lan truyền giao dịch, cùng với việc quản lý trạng thái và hỗ trợ Máy ảo Ethereum ([EVM](/developers/docs/evm/)). Nó **không** chịu trách nhiệm xây dựng khối, lan truyền khối hoặc xử lý logic đồng thuận. Những việc này thuộc phạm vi của máy khách đồng thuận .
+
+Máy khách thực thi tạo ra các tải trọng thực thi - danh sách các giao dịch, cây trạng thái được cập nhật và các dữ liệu liên quan đến việc thực thi khác. Các máy khách đồng thuận bao gồm tải trọng thực thi trong mọi khối. Máy khách thực thi cũng chịu trách nhiệm thực thi lại các giao dịch trong các khối mới để đảm bảo chúng hợp lệ. Việc thực thi các giao dịch được thực hiện trên máy tính nhúng của máy khách thực thi, được gọi là [Máy ảo Ethereum (EVM)](/developers/docs/evm).
+
+Máy khách thực thi cũng cung cấp giao diện người dùng cho Ethereum thông qua [các phương thức RPC](/developers/docs/apis/json-rpc) cho phép người dùng truy vấn chuỗi khối Ethereum, gửi giao dịch và triển khai các hợp đồng thông minh. Thông thường, các lệnh gọi RPC được xử lý bởi một thư viện như [Web3js](https://docs.web3js.org/), [Web3py](https://web3py.readthedocs.io/en/v5/), hoặc bởi một giao diện người dùng như ví trình duyệt.
+
+Tóm lại, máy khách thực thi là:
+
+- một cổng kết nối của người dùng đến Ethereum
+- nơi chứa Máy ảo Ethereum, trạng thái của Ethereum và vùng giao dịch.
+
+## Máy khách đồng thuận làm gì? {#consensus-client}
+
+Máy khách đồng thuận xử lý tất cả logic cho phép một nút đồng bộ với mạng Ethereum. Điều này bao gồm việc nhận các khối từ các máy ngang hàng và chạy thuật toán lựa chọn phân nhánh để đảm bảo nút luôn đi theo chuỗi có sự tích lũy nhiều nhất các chứng thực (được tính trọng số theo số dư hiệu dụng của nút xác thực). Tương tự như máy khách thực thi, các máy khách đồng thuận có mạng P2P riêng mà qua đó chúng chia sẻ các khối và chứng thực.
+
+Máy khách đồng thuận không tham gia vào việc chứng thực hoặc đề xuất các khối - việc này được thực hiện bởi một nút xác thực, một tiện ích bổ sung tùy chọn cho một máy khách đồng thuận . Một máy khách đồng thuận không có nút xác thực chỉ theo kịp phần đầu của chuỗi, cho phép nút duy trì đồng bộ. Điều này cho phép người dùng giao dịch với Ethereum bằng máy khách thực thi của họ, tự tin rằng họ đang ở trên đúng chuỗi.
+
+## Người xác thực {#validators}
+
+Việc đặt cược và chạy phần mềm nút xác thực giúp một nút đủ điều kiện được chọn để đề xuất một khối mới. Các nhà vận hành nút có thể thêm một nút xác thực vào các máy khách đồng thuận của họ bằng cách ký gửi 32 ETH vào hợp đồng ký gửi. Máy khách xác thực đi kèm với máy khách đồng thuận và có thể được thêm vào một nút bất kỳ lúc nào. Nút xác thực xử lý các chứng thực và đề xuất khối. Nó cũng cho phép một nút tích lũy phần thưởng hoặc mất ETH thông qua các hình phạt hoặc slashing.
+
+[Thêm về việc đặt cược](/staking/).
+
+## So sánh các thành phần của một nút {#node-comparison}
+
+| Máy khách thực thi | Máy khách đồng thuận | Nút xác thực |
+| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ |
+| Lan truyền các giao dịch qua mạng P2P của nó | Lan truyền các khối và chứng thực qua mạng P2P của nó | Đề xuất các khối |
+| Thực thi/thực thi lại các giao dịch | Chạy thuật toán lựa chọn phân nhánh | Tích lũy phần thưởng/hình phạt |
+| Xác minh các thay đổi trạng thái sắp tới | Theo dõi phần đầu của chuỗi | Tạo chứng thực |
+| Quản lý trạng thái và cây biên nhận | Quản lý trạng thái Beacon (chứa thông tin đồng thuận và thực thi) | Yêu cầu đặt cược 32 ETH |
+| Tạo tải trọng thực thi | Theo dõi tính ngẫu nhiên tích lũy trong RANDAO (một thuật toán cung cấp tính ngẫu nhiên có thể xác minh để lựa chọn nút xác thực và các hoạt động đồng thuận khác) | Có thể bị slashing |
+| Cung cấp API JSON-RPC để tương tác với Ethereum | Theo dõi sự hợp lý hóa và sự hoàn tất | |
+
+## Đọc thêm {#further-reading}
+
+- [Bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos)
+- [Đề xuất khối](/developers/docs/consensus-mechanisms/pos/block-proposal)
+- [Phần thưởng và hình phạt dành cho nút xác thực](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties)
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md
new file mode 100644
index 00000000000..1c34832bc6c
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md
@@ -0,0 +1,418 @@
+---
+title: Nốt như một dịch vụ
+description: Một cái nhìn tổng quan cho người mới bắt đầu về dịch vụ node, những ưu và nhược điểm, và các nhà cung cấp phổ biến.
+lang: vi
+sidebarDepth: 2
+---
+
+## Giới thiệu {#Introduction}
+
+Việc chạy [nút Ethereum](/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) của riêng bạn có thể gặp nhiều thách thức, đặc biệt là khi mới bắt đầu hoặc khi mở rộng quy mô nhanh chóng. Có một [số dịch vụ](#popular-node-services) chạy cơ sở hạ tầng nút được tối ưu hóa cho bạn, vì vậy bạn có thể tập trung vào việc phát triển ứng dụng hoặc sản phẩm của mình. Chúng tôi sẽ giải thích cách hoạt động của các dịch vụ node, ưu và nhược điểm khi sử dụng chúng và liệt kê các nhà cung cấp nếu bạn quan tâm đến việc bắt đầu.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Nếu bạn chưa hiểu nút và máy khách là gì, hãy xem [Nút và máy khách](/developers/docs/nodes-and-clients/).
+
+## Người đặt cược {#stakoooooooooooooors}
+
+Những nhà đầu tư lập phải tự vận hành cơ sở hạ tầng của mình thay vì dựa vào các nhà cung cấp bên thứ ba. Điều này có nghĩa là chạy một cơ thế thực thi kết hợp với một cơ chế đồng thuận. Trước [The Merge](/roadmap/merge), bạn có thể chỉ chạy máy khách đồng thuận và sử dụng nhà cung cấp tập trung cho dữ liệu thực thi; điều này không còn khả thi nữa - một người đặt cược độc lập phải chạy cả hai máy khách. Tuy nhiên, có những dịch vụ có sẵn để làm đơn giản hóa quá trình này.
+
+[Đọc thêm về cách chạy nút](/developers/docs/nodes-and-clients/run-a-node/).
+
+Các dịch vụ được mô tả trên trang này dành cho các nút không có staking.
+
+## Dịch vụ nút hoạt động như thể nào? {#how-do-node-services-work}
+
+Các nhà cung cấp dịch vụ nút vận hành các cơ chế nút phân tán ở phía sau cho bạn, vì vậy bạn không cần phải làm điều đó.
+
+Các dịch vụ này thường cung cấp một mã API mà bạn có thể sử dụng để ghi và đọc từ blockchain. Các dịch vụ này thường bao gồm quyền truy cập vào [các mạng thử nghiệm Ethereum](/developers/docs/networks/#ethereum-testnets) ngoài Mạng chính.
+
+Một số dịch vụ cung cấp cho bạn một nút chuyên dụng mà họ quản lý, trong khi những dịch vụ khác sử dụng bộ cân bằng tải để phân phối hoạt động giữa các node.
+
+Hầu như tất cả các dịch vụ nút đều cực kỳ dễ tích hợp, chỉ cần thay đổi dòng trong mã của bạn để hoán đổi nút tự lưu trữ hoặc thậm chí chuyển đổi giữa các dịch vụ.
+
+Thông thường, các dịch vụ nút sẽ chạy nhiều loại [máy khách nút](/developers/docs/nodes-and-clients/#execution-clients) và [loại nút](/developers/docs/nodes-and-clients/#node-types), cho phép bạn truy cập các nút đầy đủ và nút lưu trữ ngoài các phương thức dành riêng cho máy khách trong một API.
+
+Cần lưu ý rằng các dịch vụ nút không và không nên lưu trữ khóa riêng tư hoặc thông tin của bạn.
+
+## Lợi ích của việc sử dụng dịch vụ nút là gì? {#benefits-of-using-a-node-service}
+
+Lợi ích chính của việc sử dụng dịch vụ nút là không cần phải dành thời gian kỹ thuật để bảo trì và quản lý các nút một cách tự làm. Điều này cho phép bạn tập trung vào việc xây dựng sản phẩm của mình thay vì phải lo lắng về việc bảo trì hạ tầng.
+
+Việc vận hành các nút của riêng bạn có thể rất tốn kém, từ chi phí lưu trữ đến băng thông và thời gian kỹ thuật quý giá. Các vấn đề như việc tăng cường thêm nút khi mở rộng quy mô, nâng cấp các nút lên các phiên bản mới nhất, và đảm bảo tính nhất quán của trạng thái có thể làm phân tâm khỏi việc xây dựng và chi tiêu tài nguyên cho sản phẩm web3 mà bạn mong muốn.
+
+## Những nhược điểm của việc sử dụng dịch vụ nút là gì? {#cons-of-using-a-node-service}
+
+Bằng cách sử dụng dịch vụ nút, bạn đang tập trung hóa khía cạnh cơ sở hạ tầng của sản phẩm của mình. Vì lý do này, các dự án coi sự phi tập trung là vô cùng quan trọng có thể ưu tiên việc tự lưu trữ các nút thay vì thuê ngoài cho bên thứ ba.
+
+Đọc thêm về [lợi ích của việc chạy nút của riêng bạn](/developers/docs/nodes-and-clients/#benefits-to-you).
+
+## Các dịch vụ nút phổ biến {#popular-node-services}
+
+Dưới đây là danh sách một số nhà cung cấp nút Ethereum phổ biến nhất, xin vui lòng bổ sung bất kỳ nhà cung cấp nào còn thiếu! Mỗi dịch vụ nút cung cấp các lợi ích và tính năng khác nhau bên cạnh các gói miễn phí hoặc trả phí, bạn nên tìm hiểu xem dịch vụ nào phù hợp nhất với nhu cầu của bạn trước khi đưa ra quyết định.
+
+- [**Alchemy**](https://alchemy.com/)
+ - [Tài liệu](https://www.alchemy.com/docs/)
+ - Tính năng
+ - Gói miễn phí lớn nhất với 300 triệu đơn vị tính toán mỗi tháng (~30 triệu yêu cầu getLatestBlock)
+ - Hỗ trợ đa chuỗi cho Polygon, Starknet, Optimism, Arbitrum
+ - Cung cấp năng lượng cho khoảng 70% các ứng dụng phi tập trung Ethereum lớn nhất và khối lượng giao dịch DeFi
+ - Cảnh báo webhook tức thì qua Alchemy Notify
+ - Hỗ trợ và độ tin cậy/ổn định tốt nhất trong phân khúc
+ - API NFT của Alchemy
+ - Bảng điều khiển với Request Explorer, Mempool Watcher và Composer
+ - Truy cập nguồn cấp testnet tích hợp
+ - Cộng đồng nhà phát triển Discord năng động với 18.000 thành viên
+
+- [**Allnodes**](https://www.allnodes.com/)
+ - [Tài liệu](https://docs.allnodes.com/)
+ - Tính năng
+ - Không giới hạn tỷ lệ với mã thông báo PublicNode được tạo trên trang portfolio của Allnodes.
+ - Các điểm cuối RPC miễn phí tập trung vào quyền riêng tư (hơn 100 chuỗi khối) trên [PublicNode](https://www.publicnode.com)
+ - Các nút chuyên dụng không giới hạn tốc độ cho hơn 90 chuỗi khối
+ - Các nút lưu trữ chuyên dụng cho hơn 30 chuỗi khối
+ - Có sẵn tại 3 khu vực (Mỹ, EU, Châu Á)
+ - Ảnh chụp nhanh cho hơn 100 chuỗi khối trên [PublicNode](https://www.publicnode.com/snapshots)
+ - Hỗ trợ kỹ thuật 24/7 với SLA thời gian hoạt động từ 99.90%-99.98% (tùy thuộc vào gói dịch vụ).
+ - Giá cho mỗi giờ
+ - Thanh toán với Credit Card, PayPal hoặc Crypto
+
+- [**All That Node**](https://allthatnode.com/)
+ - [Tài liệu](https://docs.allthatnode.com/)
+ - Tính năng
+ - 50.000 yêu cầu mỗi ngày với gói miễn phí
+ - Hỗ trợ lên tới 40 giao thức
+ - Hỗ trợ API JSON-RPC (EVM, Tendermint), REST và Websocket
+ - Truy cập không giới hạn vào dữ liệu lưu trữ
+ - Hỗ trợ kỹ thuật 24/7 và thời gian hoạt động lên tới 99,9%
+ - Faucet có sẵn trên đa chuỗi
+ - Truy cập điểm cuối không giới hạn với số lượng khóa API không giới hạn
+ - Hỗ trợ Theo dấu/Gỡ lỗi
+ - Tự động cập nhật
+
+- [**Amazon Managed Blockchain**](https://aws.amazon.com/managed-blockchain/)
+ - [Tài liệu](https://aws.amazon.com/managed-blockchain/resources/)
+ - Tính năng
+ - Quản lý tất cả các nút Ethereum
+ - Có sẵn tại 6 quốc gia
+ - JSON-RPC qua HTTP và WebSockets an toàn
+ - Hỗ trợ 3 chuỗi
+ - SLAs, AWS hỗ trợ 24/7
+ - Go-ethereum và Lighthouse
+
+- [**Ankr**](https://www.ankr.com/)
+ - [Tài liệu](https://docs.ankr.com/)
+ - Tính năng
+ - Giao thức Ankr - truy cập mở đến các điểm cuối Public RPC API cho 8+ chuỗi
+ - Cân bằng tải và giám sát tình trạng của nút để tạo ra một cổng kết nối nhanh chóng và đáng tin cậy đến nút gần nhất có sẵn
+ - Gói cao cấp cho phép điểm cuối WSS và giới hạn tỷ lệ không giới hạn
+ - Triển khai nút đầy đủ và nút xác thực chỉ với một cú nhấp chuột cho hơn 40 chuỗi
+ - Mở rộng theo tiến độ
+ - Bộ công cụ phân tích
+ - Dashboard
+ - Các điểm cuối RPC, HTTPS và WSS
+ - Hỗ trợ tức thì
+
+- [**Blast**](https://blastapi.io/)
+ - [Tài liệu](https://docs.blastapi.io/)
+ - Tính năng
+ - Hỗ trợ RPC và WSS
+ - Lưu trữ nút đa vùng
+ - Cơ sở hạ tầng phi tập trung
+ - API Công khai
+ - Kế hoạch dành riêng miễn phí
+ - Hỗ trợ đa chuỗi (17+ chuỗi khỗi)
+ - Kho lưu trữ các nút
+ - Hỗ trợ Discord 24/7
+ - Giám sát và cảnh báo 24/7
+ - Mức SLA tổng thể là 99,9%
+ - Thanh toán bằng tiền điện tử
+
+- [**BlockDaemon**](https://blockdaemon.com/)
+ - [Tài liệu](https://ubiquity.docs.blockdaemon.com/)
+ - Lợi ích
+ - Dashboard
+ - Trên cơ sở từng nút
+ - Phân tích
+
+- [**BlockPI**](https://blockpi.io/)
+ - [Tài liệu](https://docs.blockpi.io/)
+ - Tính năng
+ - Cấu trúc nút mạnh mẽ và phân tán
+ - Tối đa 40 điểm cuối HTTPS và WSS
+ - Gói đăng ký miễn phí và gói hàng tháng
+ - Phương pháp theo sát + Hỗ trợ dữ liệu lưu trữ
+ - Gói dịch vụ có hiệu lực lên đến 90 ngày
+ - Kế hoạch tùy chỉnh và phương thức thanh toán theo nhu cầu
+ - Thanh toán bằng tiền điện tử
+ - Hỗ trợ trực tiếp & Hỗ trợ kỹ thuật
+
+- [**Chainbase**](https://www.chainbase.com/)
+ - [Tài liệu](https://docs.chainbase.com)
+ - Tính năng
+ - Dịch vụ RPC sẵn sàng, nhanh chóng và có khả năng mở rộng
+ - Hỗ trợ đa chuỗi
+ - Miễn thuế
+ - Dashboard thân thiện với người sử dụng
+ - Cung cấp dịch vụ dữ liệu blockchain vượt xa RPC
+
+- [**Chainstack**](https://chainstack.com/)
+ - [Tài liệu](https://docs.chainstack.com/)
+ - Tính năng
+ - Chia sẻ nút miễn phí
+ - Các nút lưu trữ chung
+ - Hỗ trợ GraphQL
+ - Điểm truy cập RPC và WSS
+ - Cụm nút đầy đủ và nút lưu trữ chuyên dụng
+ - Thời gian đồng bộ nhanh cho các khai triển chuyên dụng
+ - Mang theo đám mây của bạn
+ - Giá cho mỗi giờ
+ - Hỗ trợ trực tiếp 24/7
+
+- [**dRPC**](https://drpc.org/)
+ - [Tài liệu](https://drpc.org/docs)
+ - NodeCloud: Cơ sở hạ tầng RPC cắm và chạy bắt đầu từ 10 đô la (USD)—tốc độ tối đa, không giới hạn
+ - Các tính năng của NodeCloud:
+ - Hỗ trợ API cho 185 mạng lưới
+ - Pool phân tán với hơn 40 nhà cung cấp
+ - Phạm vi phủ sóng toàn cầu với chín (9) cụm địa lý
+ - Hệ thống cân bằng tải được hỗ trợ bởi AI
+ - Giá cố định trả theo mức sử dụng—không tăng giá, không hết hạn, không ràng buộc
+ - Không giới hạn khóa, tinh chỉnh khóa chi tiết, vai trò nhóm, bảo vệ giao diện người dùng
+ - Tỷ lệ cố định cho các phương thức là 20 đơn vị tính toán (CU) cho mỗi phương thức
+ - [Danh sách chuỗi điểm cuối công khai](https://drpc.org/chainlist)
+ - [Công cụ tính giá](https://drpc.org/pricing#calculator)
+ - NodeCore: ngăn xếp mã nguồn mở cho các tổ chức muốn có toàn quyền kiểm soát
+
+- [**GetBlock**](https://getblock.io/)
+ - [Tài liệu](https://getblock.io/docs/get-started/authentication-with-api-key/)
+ - Tính năng
+ - Truy cập hơn 40 nút chuỗi khối
+ - 40.000 yêu cầu miễn phí mỗi ngày
+ - Số lượng khóa API không giới hạn
+ - Tốc độ kết nối cao ở mức 1GB/giây
+ - Theo dõi + Lưu trữ
+ - Phân tích chuyên sâu
+ - Tự động cập nhật
+ - Hỗ trợ kĩ thuật
+
+- [**InfStones**](https://infstones.com/)
+ - Tính năng
+ - Tùy chọn gói miễn phí
+ - Mở rộng theo tiến độ
+ - Phân tích
+ - Dashboard
+ - Điểm truy cập API độc nhất
+ - Đầy đủ nút chuyên dụng
+ - Thời gian đồng bộ nhanh cho các khai triển chuyên dụng
+ - Hỗ trợ trực tiếp 24/7
+ - Truy cập hơn 50 nút chuỗi khối
+
+- [**Infura**](https://infura.io/)
+ - [Tài liệu](https://infura.io/docs)
+ - Tính năng
+ - Tùy chọn gói miễn phí
+ - Mở rộng theo tiến độ
+ - Dữ liệu lưu trữ có phí
+ - Hỗ trợ trực tiếp
+ - Dashboard
+
+- [**Kaleido**](https://kaleido.io/)
+ - [Tài liệu](https://docs.kaleido.io/)
+ - Tính năng
+ - Gói khởi đầu miễn phí
+ - Triển khai nút Ethereum với một chạm
+ - Máy khách và thuật toán có thể tùy chỉnh (Geth, Quorum & Besu || PoA, IBFT & Raft)
+ - Hơn 500 API dịch vụ và quản trị
+ - Giao diện RESTful cho việc gửi giao dịch Ethereum (hỗ trợ bởi Apache Kafka)
+ - Các luồng ra cho việc phân phối sự kiện (hỗ trợ bởi Apache Kafka)
+ - Bộ sưu tập chuyên sâu các dịch vụ "ngoài chuỗi" và dịch vụ phụ trợ (ví dụ: truyền tải tin nhắn được mã hóa song phương)
+ - Quá trình khởi tạo mạng đơn giản với quản lý và kiểm soát quyền truy cập dựa trên vai trò
+ - Quản lý người dùng tinh vi cho cả quản trị viên và người dùng cuối
+ - Cơ sở hạ tầng quy mô lớn, kiên cố, đạt chuẩn doanh nghiệp
+ - Quản lý khóa riêng tư Cloud HSM
+ - Liên kết mạng chính Ethereum
+ - Chứng nhận ISO 27k và SOC 2 loại 2
+ - Cấu hình thời gian chạy động (ví dụ: thêm tích hợp đám mây, thay đổi các cổng vào của nút, v.v.)
+ - Hỗ trợ cho việc triển khai đa đám mây, đa vùng và phối hợp lai.
+ - Giá cả dựa trên SaaS theo giờ đơn
+ - Hỗ trợ SLAs và 24x7
+
+- [**Lava Network**](https://www.lavanet.xyz/)
+ - [Tài liệu](https://docs.lavanet.xyz/)
+ - Tính năng
+ - Sử dụng testnet miễn phí
+ - Sự dư thừa phi tập trung để đảm bảo tính khả dụng cao
+ - Mã nguồn mở
+ - SDK phi tập trung hoàn toàn
+ - Tích hợp Ethers.js
+ - Giao diện quản lý dự án trực quan
+ - Tính toàn vẹn dữ liệu dựa trên đồng thuận
+ - Hỗ trợ đa chuỗi
+
+- [**Moralis**](https://moralis.io/)
+ - [Tài liệu](https://docs.moralis.io/)
+ - Tính năng
+ - Chia sẻ nút miễn phí
+ - Miễn phí lưu trữ các nút chia sẻ
+ - Chính sách tập trung vào quyền riêng tư (không lưu giữ nhật ký)
+ - Hỗ trợ chuỗi chéo
+ - Mở rộng theo tiến độ
+ - Dashboard
+ - SDK Ethereum độc nhất
+ - Điểm truy cập API độc nhất
+ - Hỗ trợ kỹ thuật, trực tiếp
+
+- [**NodeReal MegaNode**](https://nodereal.io/)
+ - [Tài liệu](https://docs.nodereal.io/docs/introduction)
+ - Tính năng
+ - Dịch vụ API RPC đáng tin cậy, nhanh chóng và có khả năng mở rộng.
+ - API nâng cao dành cho các nhà phát triển web3
+ - Hỗ trợ đa chuỗi
+ - Bắt đầu miễn phí
+
+- [**NOWNodes**](https://nownodes.io/)
+ - [Tài liệu](https://documenter.getpostman.com/view/13630829/TVmFkLwy)
+ - Tính năng
+ - Truy cập hơn 50 nút chuỗi khối
+ - Khoá API miễn phí
+ - Trình duyệt khối
+ - Thời gian phản hồi APO ⩽ 1 giây
+ - Nhóm hỗ trợ 24/7
+ - Người quản lý tài khoản cá nhân
+ - Các nút chia sẻ, lưu trữ, sao lưu và chuyên dụng.
+
+- [**Pocket Network**](https://www.pokt.network/)
+ - [Tài liệu](https://docs.pokt.network/home/)
+ - Tính năng
+ - Thị trường và giao thức RPC phi tập trung
+ - 1 triệu yêu cầu mỗi ngày miễn phí (theo điểm kết nối, tối đa 2)
+ - [Điểm cuối công khai](https://docs.pokt.network/developers/public-endpoints)
+ - Chương trình Pre-Stake+ (nếu bạn cần hơn 1 triệu yêu cầu mỗi ngày)
+ - Hỗ trợ hơn 15 chuỗi khối
+ - Hơn 6400 nút đang kiếm POKT để phục vụ các ứng dụng.
+ - Hỗ trợ Nút lưu trữ, Nút lưu trữ có Theo dõi, & Nút Mạng thử nghiệm
+ - Sự đa dạng của các nút mạng chính Ethereum
+ - Không có điểm chết đơn lẻ
+ - Không có thời gian ngừng
+ - Chi phí hiệu quả với Tokenomics gần như không có (cọc POKT một lần để nhận băng thông mạng)
+ - Không có chi phí chìm hàng tháng, biến cơ sở hạ tầng của bạn thành tài sản.
+ - Cân bằng tải được tích hợp sẵn trong giao thức
+ - Tăng quy mô vô hạn số lượng yêu cầu mỗi ngày và số nút mỗi giờ khi bạn tiến hành.
+ - Lựa chọn riêng tư nhất, không bị kiểm duyệt
+ - Hỗ trợ lập trình viên thực hành
+ - Bảng điều khiển và phân tích [Pocket Portal](https://bit.ly/ETHorg_POKTportal)
+
+- [**QuickNode**](https://www.quicknode.com)
+ - [Tài liệu](https://www.quicknode.com/docs/)
+ - Tính năng
+ - Hỗ trợ kỹ thuật 24/7 & cộng đồng nhà phát triển trên Discord
+ - Mạng lưới đa đám mây/kim loại, cân bằng địa lý, độ trễ thấp
+ - Hỗ trợ đa chuỗi (Optimism, Arbitrum, Polygon + 11 others)
+ - Các lớp trung gian cho tốc độ và sự ổn định (định tuyến cuộc gọi, bộ nhớ đệm, lập chỉ mục)
+ - Giám sát hợp đồng thông minh thông qua Webhooks
+ - Bảng điều khiển trực quan, bộ phân tích, trình biên soạn RPC
+ - Các tính năng bảo mật nâng cao (JWT, ẩn danh, whitelisting)
+ - Dữ liệu NFT và phân tích API
+ - [Chứng nhận SOC2](https://www.quicknode.com/security)
+ - Phù hợp cho các nhà phát triển đến doanh nghiệp
+
+- [**Rivet**](https://rivet.cloud/)
+ - [Tài liệu](https://rivet.readthedocs.io/en/latest/)
+ - Tính năng
+ - Tùy chọn gói miễn phí
+ - Mở rộng theo tiến độ
+
+- [**SenseiNode**](https://senseinode.com)
+ - [Tài liệu](https://docs.senseinode.com/)
+ - Tính năng
+ - Các nút chuyên dụng và chia sẻ
+ - Dashboard
+ - Lưu trữ trên AWS với nhiều nhà cung cấp khác nhau ở các địa điểm khắp Mỹ Latinh.
+ - Cơ chế Prysm và Lighthouse
+
+- [**SettleMint**](https://console.settlemint.com/)
+ - [Tài liệu](https://docs.settlemint.com/)
+ - Tính năng
+ - Dùng thử miễn phí
+ - Mở rộng theo tiến độ
+ - Hỗ trợ GraphQL
+ - Điểm truy cập RPC và WSS
+ - Đầy đủ nút chuyên dụng
+ - Mang theo đám mây của bạn
+ - Bộ công cụ phân tích
+ - Dashboard
+ - Giá cho mỗi giờ
+ - Hỗ trợ tức thì
+
+- [**Tenderly**](https://tenderly.co/web3-gateway)
+ - [Tài liệu](https://docs.tenderly.co/web3-gateway/web3-gateway)
+ - Tính năng
+ - Gói miễn phí bao gồm 25 triệu Đơn vị Tenderly mỗi tháng
+ - Truy cập miễn phí vào dữ liệu lịch sử
+ - Nhanh hơn đến 8 lần cho các tác vụ đọc nặng!
+ - Truy cập đọc nhất quán 100%
+ - Điểm truy cập JSON-RPC
+ - Trình xây dựng yêu cầu RPC dựa trên giao diện và xem trước yêu cầu
+ - Kết hợp chặt chẽ với các công cụ phát triển, gỡ lỗi và kiểm thử của Tenderly
+ - Giả lập giao dịch
+ - Phân tích và lọc dữ liệu sử dụng
+ - Quản lý khoá truy cập dễ dàng
+ - Hỗ trợ kỹ thuật tận tình qua chat, email và Discord
+
+- [**Tokenview**](https://services.tokenview.io/)
+ - [Tài liệu](https://services.tokenview.io/docs?type=nodeService)
+ - Tính năng
+ - Hỗ trợ kỹ thuật 24/7 & cộng đồng nhà phát triển trên Telegram
+ - Hỗ trợ đa chuỗi (Bitcoin, Ethereum, Tron, BNB Smart Chain, Ethereum Classic)
+ - Cả hai điểm truy cập RPC và WSS đều mở để sử dụng
+ - Truy cập không giới hạn vào dữ liệu lưu trữ API
+ - Bảng điều khiển với Trình khám phá yêu cầu và Bộ theo dõi Mempool
+ - API dữ liệu NFT và thông báo Webhook
+ - Thanh toán bằng tiền điện tử
+ - Hỗ trợ ngoài cho các yêu cầu hành vi bổ sung
+
+- [**Watchdata**](https://watchdata.io/)
+ - [Tài liệu](https://docs.watchdata.io/)
+ - Tính năng
+ - Độ tin cậy của dữ liệu
+ - Kết nối liên tục mà không bị gián đoạn
+ - Tự động hoá quy trình
+ - Miễn thuế
+ - Giới hạn cao phù hợp với mọi người dùng
+ - Hỗ trợ cho các nút khác nhau
+ - Mở rộng quy mô tài nguyên
+ - Tốc độ xử lý cao
+
+- [**ZMOK**](https://zmok.io/)
+ - [Tài liệu](https://docs.zmok.io/)
+ - Tính năng
+ - Dịch vụ Front-running
+ - Giao dịch mempool toàn cầu với phương pháp lọc,tìm kiếm
+ - Phí TX không giới hạn và Gas vô tận để gửi giao dịch
+ - Việc thu thập nhanh chóng khối mới và đọc chuỗi khối.
+ - Cam kết mức giá tốt nhất cho mỗi lượt gọi API
+
+- [**Zeeve**](https://www.zeeve.io/)
+ - [Tài liệu](https://www.zeeve.io/docs/)
+ - Tính năng
+ - Nền tảng tự động hóa không mã cấp doanh nghiệp cung cấp việc triển khai, giám sát và quản lý các nút và mạng Blockchain.
+ - Hơn 30 Giao thức & Tích hợp được hỗ trợ, và đang tiếp tục được bổ sung
+ - Các dịch vụ hạ tầng web3 gia tăng giá trị như lưu trữ phi tập trung, danh tính phi tập trung và các API dữ liệu Blockchain Ledger cho các trường hợp sử dụng trong thế giới thực.
+ - Hỗ trợ 24/7 và theo dõi chủ động giúp đảm bảo sức khỏe của các nút mọi lúc.
+ - Các điểm cuối RPC cung cấp quyền truy cập đã xác thực vào các API, quản lý dễ dàng với bảng điều khiển và phân tích trực quan.
+ - Cung cấp cả tùy chọn đám mây quản lý và đám mây tự chọn, cho bạn nhiều sự lựa chọn và hỗ trợ tất cả các nhà cung cấp đám mây lớn như AWS, Azure, Google Cloud, Digital Ocean và cả trên cơ sở.
+ - Chúng tôi sử dụng định tuyến thông minh để luôn kết nối với nút gần nhất với người dùng của bạn.
+
+## Đọc thêm {#further-reading}
+
+- [Danh sách các dịch vụ nút Ethereum](https://ethereumnodes.com/)
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các nút và client](/developers/docs/nodes-and-clients/)
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Bắt đầu phát triển Ethereum bằng Alchemy](/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/)
+- [Hướng dẫn gửi giao dịch bằng web3 và Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/run-a-node/index.md
new file mode 100644
index 00000000000..58ed5fb5bea
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/run-a-node/index.md
@@ -0,0 +1,482 @@
+---
+title: Đăng kí nốt Ethereum của bạn
+description: Một giới thiệu chung về cách tự vận hành một Client Ethereum.
+lang: vi
+sidebarDepth: 2
+---
+
+Chạy nút của bạn cho bạn rất nhiều lợi ích, mở ra nhiều tiềm năng, và giúp hộ trợ hệ sinh thái. Bài viết này sẽ hướng dẫn bạn cách triển khai nút của bạn và tham gia vào xác thực giao dịch Ethereum.
+
+Lưu ý rằng sau [The Merge](/roadmap/merge), cần phải có hai máy khách để chạy một nút Ethereum; một **máy khách lớp thực thi (EL)** và một **máy khách lớp đồng thuận (CL)**. Bài viết này sẽ hướng dẫn bạn cài đặt như thế nào, điều chỉnh và kết nối hai Client đó để chạy nút Ethereum.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên hiểu nút Ethereum là gì và tại sao bạn có thể muốn chạy một Client. Điều này được đề cập trong [Các nút và máy khách](/developers/docs/nodes-and-clients/).
+
+Nếu bạn là người mới tìm hiểu về chủ đề chạy nút hoặc đang tìm kiếm một con đường ít kỹ thuật hơn, chúng tôi khuyên bạn trước tiên nên xem qua phần giới thiệu thân thiện với người dùng của chúng tôi về [việc chạy một nút Ethereum](/run-a-node).
+
+## Lựa chọn phương pháp {#choosing-approach}
+
+Bước đầu tiên triển khai một nút của bạn là chọn cách bạn sẽ làm nó. Dựa trên những yêu cầu và đa dạng khả năng, bạn phải chọn Client thực thi (hoặc cả Client thực thi và đồng thuận), môi trường (phần cứng, hệ điều hành), và tham số cho tùy chỉnh Client.
+
+Bài viết này sẽ hướng dẫn bạn qua các quyết định này và giúp bạn tìm một hướng để chạy Ethereum theo từng trường hợp.
+
+Để chọn từ các cách triển khai máy khách, hãy xem tất cả [máy khách thực thi](/developers/docs/nodes-and-clients/#execution-clients), [máy khách đồng thuận](/developers/docs/nodes-and-clients/#consensus-clients) sẵn sàng cho Mạng chính và tìm hiểu về [tính đa dạng của máy khách](/developers/docs/nodes-and-clients/client-diversity).
+
+Quyết định xem nên chạy phần mềm trên [phần cứng của riêng bạn hay trên đám mây](#local-vs-cloud), xem xét các [yêu cầu](#requirements) của máy khách.
+
+Sau khi chuẩn bị môi trường, hãy cài đặt các máy khách đã chọn bằng [giao diện thân thiện với người mới bắt đầu](#automatized-setup) hoặc [thủ công](#manual-setup) bằng terminal với các tùy chọn nâng cao.
+
+Khi nút đang chạy và đồng bộ hóa, bạn đã sẵn sàng [sử dụng nó](#using-the-node), nhưng hãy nhớ theo dõi việc [bảo trì](#operating-the-node) nút.
+
+
+
+### Môi trường và phần cứng {#environment-and-hardware}
+
+#### Cục bộ hay đám mây {#local-vs-cloud}
+
+Client Ethereum có thể được chạy trên những máy tính dạng thương mại và không đòi hỏi phần cứng đặt biệt, như máy đào chẳng hạn. Vì vậy, bạn có rất nhiều lựa chọn đa dạng để thiết lập nút dựa trên những gì bạn cần.
+Để đơn giản hóa, hãy nghĩ về việc chạy nút trên một máy chủ vật lý tại nhà và chạy trên máy chủ đám mây:
+
+- Đám mây
+ - Các nhà cung cấp dịch vụ cung cấp thời gian hoạt động của máy chủ cao và địa chỉ IP tĩnh công khai
+ - Có một máy chủ chuyên dụng hay máy chủ ảo sẽ dễ chịu hơn việc phải tự mình xây
+ - Đánh đổi là việc phải tin tưởng một bên thứ ba - người cung cấp máy chủ
+ - Bởi vì đòi hỏi về dung lượng lưu trữ cho một nút đầy đủ, giá của việc thuê một máy chủ có thể cao
+- Tự vận hành tại nhà
+ - Không cần tin tưởng vào ai và là cách tiếp cận có tính chủ quyền hơn
+ - Chỉ cần chi trả một lần
+ - Một lựa chọn là mua những máy lắp sẵn
+ - Bạn có thể phải tự mình chuẩn bị, bảo trì, và có thể phải sửa chữa máy và kết nối mạng
+
+Cả hai lựa chọn đều có những lợi thế khác nhau được tóm gọn ở trên. Nếu bạn cần một giải pháp đám mây, thay vì những dịch vụ đám mây truyền thống, cũng có những dịch vụ tập trung vào những người triển khai nút. Hãy xem [các nút dưới dạng dịch vụ](/developers/docs/nodes-and-clients/nodes-as-a-service/) để biết thêm các tùy chọn về các nút được lưu trữ.
+
+#### Phần cứng {#hardware}
+
+Tuy nhiên, một mạng lưới chống kiểm duyệt, phi tập trung không nên dựa vào người cung cấp đám mây. Thay vào đó, tự chạy nút của bạn tại nhà là một cách tốt cho hệ sinh thái hơn. [Các ước tính](https://www.ethernodes.org/networkType/cl/Hosting) cho thấy một phần lớn các nút chạy trên đám mây, điều này có thể trở thành một điểm lỗi duy nhất.
+
+Client Ethereum có thể được chạy trên máy tính, máy tính cá nhân (laptop), máy chủ, hoặc là chỉ một máy tính bo mạch đơn. Trong khi sử dụng Client trên máy tính cá nhân của bạn là khả thi, có một máy chuyên dụng cho nút của bạn có thể cải thiện rất nhiều hiệu suất của nó và bảo mật trong khi giảm thiểu ảnh hưởng lên máy chính của bạn.
+
+Sử dụng phần cứng của bạn có thể rất dễ dàng. Có rất nhiều những lựa chọn đơn giản cũng như là cấu hình nâng cao cho những người có kiến thức kĩ thuật. Vậy hãy cùng nhau nhìn vào các yêu cầu và chi phí để chạy một Client Ethereum trên máy của bạn.
+
+#### Các yêu cầu {#requirements}
+
+Yêu cầu phần cứng sẽ khác nhau bởi Client tuy nhiên nhìn chung cũng không có cao đến vậy vì nút cũng chỉ cần duy trì đồng bộ. Đừng nhầm lẫn nó với việc đào, mà trong đó việc đào đòi hỏi rất nhiều sức mạnh tính toán. Tuy nhiên, thời gian đồng bộ và hiệu suất sẽ được cải thiện khi phần cứng mạnh hơn.
+
+Trước khi cài đặt bất kỳ client nào, hãy đảm bảo rằng máy tính của bạn có đủ tài nguyên để chạy nó. Bạn có thể xem các yêu cầu tối thiểu và khuyến nghị ở bên dưới.
+
+Điểm nghẽn lớn nhất đối với phần cứng của bạn thường là dung lượng ổ đĩa. Việc đồng bộ chuỗi khối Ethereum tiêu tốn rất nhiều tác vụ đọc/ghi và cần rất nhiều dung lượng lưu trữ. Tốt nhất là bạn nên có một **ổ cứng thể rắn (SSD)** với hàng trăm GB dung lượng trống, vẫn còn dư ngay cả sau khi đồng bộ xong.
+
+Kích thước của cơ sở dữ liệu và tốc độ đồng bộ hóa ban đầu phụ thuộc vào máy khách đã chọn, cấu hình của nó và [chiến lược đồng bộ hóa](/developers/docs/nodes-and-clients/#sync-modes).
+
+Đồng thời, hãy đảm bảo kết nối internet của bạn không bị giới hạn bởi [mức dung lượng băng thông](https://wikipedia.org/wiki/Data_cap). Khuyến nghị nên dùng kết nối không giới hạn, vì quá trình đồng bộ ban đầu và dữ liệu phát tán lên mạng có thể vượt quá giới hạn của bạn.
+
+##### Hệ điều hành
+
+Tất cả các Client đều hỗ trợ các hệ điều hành phổ biến – Linux, MacOS, Windows. Điều này có nghĩa là bạn có thể chạy node trên máy tính để bàn thông thường hoặc máy chủ với hệ điều hành (OS) phù hợp nhất với bạn. Hãy đảm bảo hệ điều hành của bạn luôn được cập nhật để tránh các sự cố tiềm ẩn và lỗ hổng bảo mật.
+
+##### Yêu cầu tối thiểu
+
+- CPU 2+ lõi xử lí
+- 8 GB RAM
+- 2TB SSD
+- Băng thông tối thiểu 10 MBit/giây
+
+##### Thông số khuyến nghị
+
+- CPU nhanh với 4+ lõi xử lí
+- Trên 16BN RAM
+- Ổ cứng SSD nhanh với 2+TB
+- Băng thông từ 25 MBit/giây trở lên
+
+Việc đồng bộ phương thức và Client bạn chọn sẽ ảnh hưởng đến đòi hỏi lưu lượng dự trữ, nhưng chúng tôi ước lượng dung lượng bạn cần cho mỗi Client như bên dưới.
+
+| Client | Dung lượng ổ cứng (đồng bộ nhanh) | Dung lượng ổ cứng (lưu trữ toàn bộ) |
+| ---------- | ---------------------------------------------------- | ------------------------------------------------------ |
+| Besu | 800GB+ | 12TB+ |
+| Erigon | N/A | 2.5TB+ |
+| Geth | 500GB+ | 12TB+ |
+| Nethermind | 500GB+ | 12TB+ |
+| Reth | N/A | 2.2TB+ |
+
+- Lưu ý: Erigon và Reth không hỗ trợ chế độ đồng bộ nhanh (snap sync), nhưng có thể thực hiện "Full Pruning - quá trình bỏ dữ liệu không cần thiết giảm dung lượng" (~2TB đối với Erigon, ~1.2TB đối với Reth)
+
+Đối với máy khách đồng thuận, yêu cầu về dung lượng cũng phụ thuộc vào việc triển khai máy khách và các tính năng được bật (ví dụ: trình slasher của trình xác thực) nhưng thường cần thêm 200GB cho dữ liệu beacon. Với số lượng nút xác thực lớn, thông lượng cũng cần phải tăng theo. Bạn có thể tìm thấy [chi tiết về các yêu cầu của máy khách đồng thuận trong phân tích này](https://mirror.xyz/0x934e6B4D7eee305F8C9C42b46D6EEA09CcFd5EDc/b69LBy8p5UhcGJqUAmT22dpvdkU-Pulg2inrhoS9Mbc).
+
+#### Các giải pháp cắm và chạy {#plug-and-play}
+
+Cách dễ nhất để chạy nút bằng phần cứng riêng là sử dụng thiết bị Plug-and-Play (cắm vào rồi chạy). Các máy được cấu hình sẵn từ nhà cung cấp mang lại trải nghiệm đơn giản nhất: đặt hàng, kết nối, chạy. Mọi cấu hình đều được lắp sẵn và chạy tự động, đi kèm hướng dẫn trực quan và bảng thông tin để giám xác cũng như quản lý phần mềm.
+
+- [DappNode](https://dappnode.io/)
+- [Avado](https://ava.do/)
+
+#### Ethereum trên máy tính một bo mạch {#ethereum-on-a-single-board-computer}
+
+Một cách đơn giản và rẻ để chạy một nút Ethereum là sử dụng máy tính bo mạch đơn, ngay cả với thiết kế ARM như Raspberry Pi. [Ethereum trên ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) cung cấp các image dễ chạy của nhiều máy khách thực thi và máy khách đồng thuận cho Raspberry Pi và các bo mạch ARM khác.
+
+Nhỏ gọn, giá rẻ và tiết kiệm như thế này rất lý tưởng để chạy node tại nhà, nhưng hãy lưu ý đến hiệu năng hạn chế của chúng.
+
+## Khởi chạy nút {#spinning-up-node}
+
+Việc cài đặt Client thực tế có thể chạy bằng những công cụ cài đặt tự động hoặc thủ công, bằng cách tự cài đặt phần mềm Client trực tiếp.
+
+Đối với người dùng ít kinh nghiệm, khuyến nghị thường là sử dụng công cụ cài tự động, phần mềm hướng dẫn bạn trong quá trình cài đặt và tự động hóa thiết lập Client. Tuy nhiên, nếu bạn có một chút kinh nghiệm sử dụng Terminal, thì các bước cài đặt thủ công sẽ khá dễ thực hiện.
+
+### Thiết lập có hướng dẫn {#automatized-setup}
+
+Có rất nhiều dữ án thân thiện với người dùng nhằm cải thiện trải nghiệm thiết lập một Client. Các Laucher này cung cấp khả năng cài đặt và cấu hình Client một cách tự động, một số thậm chí còn có giao diện đồ họa để hướng dẫn cài đặt và giảm sát các Client.
+
+Dưới đây là một vài dự án mà giúp bạn cài đặt và kiểm soát Client chỉ với và cú nhấp chuột:
+
+- [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path) - DappNode không chỉ đi kèm với một máy từ một nhà cung cấp. Phần mềm, tức là trình khởi chạy nút và trung tâm điều khiển với nhiều tính năng, có thể được sử dụng trên bất kỳ phần cứng nào.
+- [EthPillar](https://www.coincashew.com/coins/overview-eth/ethpillar) - Cách nhanh nhất và dễ nhất để thiết lập một nút đầy đủ. Công cụ cài đặt một dòng lệnh và giao diện TUI để quản lý nút. Miễn phí. Mã nguồn mở. Là công cụ chung của cộng đồng Ethereum bởi những người tự Stake. Hỗ trợ ARM64 và AMD64.
+- [eth-docker](https://eth-docker.net/) - Thiết lập tự động bằng Docker tập trung vào việc đặt cược dễ dàng và an toàn, yêu cầu kiến thức cơ bản về terminal và Docker, được khuyến nghị cho người dùng có kinh nghiệm hơn một chút.
+- [Stereum](https://stereum-dev.github.io/ethereum-node-web-docs) - Trình khởi chạy để cài đặt máy khách trên một máy chủ từ xa thông qua kết nối SSH với một hướng dẫn thiết lập GUI, trung tâm điều khiển và nhiều tính năng khác.
+- [NiceNode](https://www.nicenode.xyz/) - Trình khởi chạy với trải nghiệm người dùng đơn giản để chạy một nút trên máy tính của bạn. Chỉ cần chọn Client và khỏi chạy bằng vài cú nhấp chuột. Vẫn trong quá trình phát triển.
+- [Sedge](https://docs.sedge.nethermind.io/docs/intro) - Công cụ thiết lập nút tự động tạo cấu hình Docker bằng trình hướng dẫn CLI. Được viết bằng Go bởi Nethermind.
+
+### Thiết lập máy khách thủ công {#manual-setup}
+
+Một trong những lựa chọn là tải về, xác thực, và thiết lập phần mềm Client thủ công. Ngay cả khi một số Client cung cấp giao diện đồ họa, thì việc cài đặt thủ công vẫn đòi hỏi kỹ năng cơ bản với Terminal, nhưng lại mang đến nhiều tính linh hoạt hơn.
+
+Như đã giải thích trước đó, việc thiết lập một nút Ethereum riêng của bạn sẽ cần chạy một cặp Client: Client đồng thuận và Client thực thi. Một số Client có thể bao gồm Light Client của loại còn lại và có thể đồng bộ mà không cần bất kỳ phần mềm nào khác. Tuy nhiên, việc xác minh không cần tin tưởng đầy đủ thì bắt buộc phải có cả hai loại Client.
+
+#### Tải phần mềm máy khách {#getting-the-client}
+
+Đầu tiên, bạn cần tải phần mềm [máy khách thực thi](/developers/docs/nodes-and-clients/#execution-clients) và [máy khách đồng thuận](/developers/docs/nodes-and-clients/#consensus-clients) mà bạn muốn.
+
+Bạn chỉ cần đơn giản tải xuống một ứng dụng thực thi hoặc gói cài đặt phù hợp với hệ điều hành và cấu hình phần cứng của mình. Luôn kiểm tra chữ ký và mã băm của các gói đã tải về. Một số Client cũng cung cấp kho lưu trữ hoặc hình ảnh Docker để cài đặt và cập nhật dễ hơn. Tất cả các Client đều là mã nguồn mở, vì vậy bạn có thể tự xây dựng chúng từ đầu. Đây là một phương pháp nâng cao hơn, nhưng một số trường hợp có thể sẽ cần dùng đến.
+
+Hướng dẫn cài đặt cho từng Client có sẵn tài liệu được liên kết ở danh sách Client phía trên.
+
+Dưới đây là các trang phát hành của Client, nơi bạn có thể tìm thấy các bản dựng sẵn hoặc hướng dẫn cài đặt:
+
+##### Máy khách thực thi
+
+- [Besu](https://github.com/hyperledger/besu/releases)
+- [Erigon](https://github.com/ledgerwatch/erigon/releases)
+- [Geth](https://geth.ethereum.org/downloads/)
+- [Nethermind](https://downloads.nethermind.io/)
+- [Reth](https://reth.rs/installation/installation.html)
+
+Cũng cần lưu ý rằng tính đa dạng của máy khách là một [vấn đề trên lớp thực thi](/developers/docs/nodes-and-clients/client-diversity/#execution-layer). Cũng khuyến nghị người đọc rằng cân nhắc chạy Client thực thi đang chiếm thiểu số.
+
+##### Máy khách đồng thuận
+
+- [Lighthouse](https://github.com/sigp/lighthouse/releases/latest)
+- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source) (Không cung cấp tệp nhị phân dựng sẵn, chỉ cung cấp ảnh Docker hoặc phải dựng từ mã nguồn)
+- [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)
+
+[Tính đa dạng của máy khách](/developers/docs/nodes-and-clients/client-diversity/) là rất quan trọng đối với các nút đồng thuận chạy các trình xác thực. Nếu như phần lớn nút xác thực chạy chỉ một loại Client, sự an toàn của mạng lưới bị đặt vào rủi ro. Vì vậy việc cân nhắc sử dụng Client thiểu số là được khuyến khích.
+
+[Xem mức sử dụng máy khách mạng mới nhất](https://clientdiversity.org/) và tìm hiểu thêm về [tính đa dạng của máy khách](/developers/docs/nodes-and-clients/client-diversity).
+
+##### Xác thực phần mềm
+
+Khi tải phần mềm từ Internet, nên xác thực tính hợp lệ của nó. Bước này không bắt buộc nhưng đặc biệt quan trọng cho cơ sở hạ tầng như Client của Ethereum, thì việc nhận biết các khả năng tấn công tiềm ẩn và tránh chúng là rất quan trọng. Nếu bạn tải một tùy chọn có sẵn, bạn cần phải tin tưởng nó và rủi ro rằng kẻ tấn công có thể đổi phương thức thực thi thành hành vi độc hại.
+
+Lập trình viên sẽ ký các bản phát hành kỹ thuật số của họ với khóa PGP của họ, để bạn có thể xác minh bằng mật mã rằng bạn đang chạy đúng phần mềm mà họ tạo ra. Bạn chỉ cần lấy khóa công khai (Public Key) mà nhà phát triển sử dụng, những khóa này sẽ được tìm thấy trên trang phát hành Client hoặc trong tài liệu. Sau khi tải xuống bản phát hành của máy khách và chữ ký của nó, bạn có thể sử dụng một triển khai PGP, ví dụ: [GnuPG](https://gnupg.org/download/index.html) để dễ dàng xác minh chúng. Xem hướng dẫn về cách xác minh phần mềm nguồn mở bằng `gpg` trên [linux](https://www.tecmint.com/verify-pgp-signature-downloaded-software/) hoặc [Windows/MacOS](https://freedom.press/training/verifying-open-source-software/).
+
+Một hình thức xác minh khác là đảm bảo rằng hàm băm, một phương thức tạo dấu vân tay bằng mật mã học, của phần mềm bạn tải về trùng với lại hàm băm mà nhà lập trình cung cấp. Cái này sẽ dễ hơn sử dụng PGP, và một số Client chỉ có lựa chọn này. Chỉ cần chạy hàm băm trên một phần mềm đã tải về so sánh giá trị kết quả băm trên trang phát hành. Ví dụ:
+
+```sh
+sha256sum teku-22.6.1.tar.gz\n\n9b2f8c1f8d4dab0404ce70ea314ff4b3c77e9d27aff9d1e4c1933a5439767dde
+```
+
+#### Thiết lập máy khách {#client-setup}
+
+Sau khi cài đặt, tải xuống hoặc biên dịch phần mềm Client, bạn đã sẵn sàng để chạy nó. Điều này chỉ có nghĩa là nó cần được chạy với cấu hình phù hợp. Các client cung cấp nhiều tùy chọn cấu hình, cho phép kích hoạt nhiều tính năng khác nhau.
+
+Hãy bắt đầu với các tùy chọn có thể ảnh hưởng đáng kể đến hiệu năng của Client và mức tiêu thụ dữ liệu. [Các chế độ đồng bộ hóa](/developers/docs/nodes-and-clients/#sync-modes) đại diện cho các phương pháp khác nhau để tải xuống và xác thực dữ liệu chuỗi khối. Trước khi khởi chạy nút, bạn nên quyết định sẽ sử dụng mạng nào và chế độ đồng bộ nào. Những yếu tố quan trọng nhất cần cân nhắc là dung lượng ổ đĩa và thời gian đồng bộ mà Client sẽ cần. Hãy chú ý đến tài liệu của Client để xác định chế độ đồng bộ nào là mặc định. Nếu chế độ đó không phù hợp, hãy chọn một chế độ khác dựa trên mức độ bảo mật, dữ liệu có sẵn và chi phí. Ngoài thuật toán đồng bộ, bạn cũng có thể thiết lập việc cắt bớt các loại dữ liệu cũ khác nhau. Cắt tỉa (pruning) cho phép xóa dữ liệu lỗi thời, tức là xóa các nút trie trạng thái không thể truy cập được từ các khối gần đây.
+
+Các tùy chọn cấu hình cơ bản khác bao gồm: chọn mạng (Mạng chính hoặc mạng thử nghiệm), bật điểm cuối HTTP cho RPC hoặc WebSockets, v.v. Bạn có thể tìm thấy tất cả các tính năng và tùy chọn trong tài liệu của Client. Nhiều cấu hình Client có thể được thiết lập bằng cách chạy Client với Flag tương ứng trực tiếp trong CLI hoặc trong tệp cấu hình. Mỗi Client có đôi chút khác biệt; vì vậy hãy luôn tham khảo tài liệu chính thức hoặc trang trợ giúp của nó để biết chi tiết về các tùy chọn cấu hình.
+
+Với mục đích thử nghiệm, bạn có thể muốn chạy Client trên một trong các mạng mạng thử nghiệm. [Xem tổng quan về các mạng được hỗ trợ](/developers/docs/nodes-and-clients/#execution-clients).
+
+Ví dụ về việc chạy Client thực thi với cấu hình cơ bản có thể được tìm thấy trong phần tiếp theo.
+
+#### Khởi động máy khách thực thi {#starting-the-execution-client}
+
+Trước khi bắt đàu phần mềm Client Ethereum, hãy thực hiện một bước kiểm tra cuối cùng để đảm bảo môi trường đã sẵn sàng. Ví dụ, hãy đảm bảo rằng:
+
+- Có đủ dung lượng ổ đĩa, xét theo mạng và chế độ đồng bộ mà bạn đã chọn.
+- Bộ nhớ (RAM) và CPU không bị chiếm dụng bởi các chương trình khác.
+- Hệ điều hành đã được cập nhật lên phiên bản mới nhất.
+- Hệ thống có thời gian và ngày tháng chính xác.
+- Bộ định tuyến và tường lửa của bạn chấp nhận các kết nối trên các cổng tiếp nhận thông tin. Mặc định, Ethereum Client sử dụng một cổng thông tin (TCP) và một cổng giao thức (UDP), cả hai đều là 30303 theo mặc định.
+
+Hãy chạy Client của bạn trên một mạng thử nghiệm trước, để đảm bảo mọi thứ hoạt động chính xác.
+
+Bạn cần khai báo bất kỳ thiết lập nào của Client không phải mặc định ngay từ đầu. Bạn có thể sử dụng Flag hoặc tệp cấu hình để khai báo cấu hình mong muốn. Các tính năng và cách viết cấu hình ở mỗi Client đều khác nhau. Hãy xem tài liệu của Client của bạn để thêm chi tiết.
+
+Các máy khách thực thi và đồng thuận giao tiếp thông qua một điểm cuối đã được xác thực được chỉ định trong [Engine API](https://github.com/ethereum/execution-apis/tree/main/src/engine). Để kết nối với một máy khách đồng thuận, máy khách thực thi phải tạo một [`jwtsecret`](https://jwt.io/) tại một đường dẫn đã biết. Vì lý do bảo mật và ổn định, các Client nên chạy trên cùng một máy, và cả hai Client phải biết đường dẫn này, vì nó được dùng để xác thực kết nối RPC cục bộ giữa chúng. Client xác thực cũng phải có một cổng giao thức dành cho các API đã được xác thực.
+
+Token này được phần mềm Client tự động tạo ra, nhưng trong một số trường hợp, bạn có thể cần phải tự tạo thủ công. Bạn có thể tạo nó bằng [OpenSSL](https://www.openssl.org/):
+
+```sh
+openssl rand -hex 32 > jwtsecret
+```
+
+#### Chạy máy khách thực thi {#running-an-execution-client}
+
+Phần này sẽ hướng dẫn bạn cách bắt đầu từ Client thực thi. Đây chỉ là một ví dụ về cấu hình cơ bản, dùng để khởi chạy Client với các thiết lập sau:
+
+- Xác định mạng để kết nối, trong ví dụ này là mạng chính
+ - Thay vào đó, bạn có thể chọn [một trong các mạng thử nghiệm](/developers/docs/networks/) để thử nghiệm sơ bộ thiết lập của mình
+- Xác định thư mục dữ liệu, nơi tất cả dữ liệu bao gồm cả chuỗi khối sẽ được lưu trữ
+ - Hãy đảm bảo thay thế đường dẫn ví dụ bằng một đường dẫn thực tế, ví dụ trỏ tới ổ cứng ngoài của bạn
+- Kích hoạt các giao diện để giao tiếp với Client
+ - Bao gồm JSON-RPC và Engine API để giao tiếp với Client đồng thuận
+- Xác định đường dẫn tới `jwtsecret` cho API được xác thực
+ - Hãy đảm bảo thay thế đường dẫn ví dụ bằng một đường dẫn thực tế mà các máy khách có thể truy cập, ví dụ: `/tmp/jwtsecret`
+
+Hãy nhớ rằng đây chỉ là một ví dụ cơ bản, tất cả các thiết lập khác sẽ được đặt về mặc định. Hãy chủ ý trên tài liệu của từng Client và tìm hiểu về những giá trị, cài đặt và tính năng mặc định. Những tính năng thêm, ví dụ cho chạy một nút xác thực, theo dõi,... vui lòng tìm hiểu tài liệu cụ thể cho Client đó.
+
+> Lưu ý rằng dấu gạch chéo ngược `\` trong các ví dụ chỉ dành cho mục đích định dạng; các cờ cấu hình có thể được xác định trên một dòng.
+
+##### Chạy Besu
+
+Ví dụ này khởi động Besu trên Mạng chính, lưu trữ dữ liệu chuỗi khối ở định dạng mặc định tại `/data/ethereum`, bật JSON-RPC và Engine RPC để kết nối máy khách đồng thuận. Engine API được xác thực bằng token `jwtsecret` và chỉ các lệnh gọi từ `localhost` mới được cho phép.
+
+```sh
+besu --network=mainnet \
+ --data-path=/data/ethereum \
+ --rpc-http-enabled=true \
+ --engine-rpc-enabled=true \
+ --engine-host-allowlist="*" \
+ --engine-jwt-enabled=true \
+ --engine-jwt-secret=/path/to/jwtsecret
+```
+
+Besu cũng đi kèm với lựa chọn khi cài đặt, nó sẽ hỏi danh sách câu hỏi và tạo tệp cấu hình. Chạy một Laucher tương tác sử dựng:
+
+```sh
+besu --Xlauncher
+```
+
+[Tài liệu của Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) chứa các tùy chọn bổ sung và chi tiết cấu hình.
+
+##### Chạy Erigon
+
+Ví dụ này khởi động Erigon trên Mạng chính, lưu trữ dữ liệu chuỗi khối tại `/data/ethereum`, bật JSON-RPC, xác định các không gian tên (namespace) nào được phép và bật xác thực để kết nối máy khách đồng thuận được xác định bởi đường dẫn `jwtsecret`.
+
+```sh
+erigon --chain mainnet \
+ --datadir /data/ethereum \
+ --http --http.api=engine,eth,web3,net \
+ --authrpc.jwtsecret=/path/to/jwtsecret
+```
+
+Mặc định, Erigon thực hiện đồng bộ đầy đủ với ổ cứng 8GB, và kết quả sẽ tạo ra hơn 2TB dữ liệu lưu trữ. Hãy đảm bảo `datadir` đang trỏ đến đĩa có đủ dung lượng trống hoặc xem xét cờ `--prune` có thể cắt bớt các loại dữ liệu khác nhau. Kiểm tra `--help` của Erigon để tìm hiểu thêm.
+
+##### Chạy Geth
+
+Ví dụ này khởi động Geth trên Mạng chính, lưu trữ dữ liệu chuỗi khối tại `/data/ethereum`, bật JSON-RPC và xác định không gian tên nào được phép. Nó cũng bật xác thực để kết nối máy khách đồng thuận, yêu cầu đường dẫn đến `jwtsecret` và tùy chọn xác định kết nối nào được phép, trong ví dụ của chúng tôi là chỉ từ `localhost`.
+
+```sh
+geth --mainnet \
+ --datadir "/data/ethereum" \
+ --http --authrpc.addr localhost \
+ --authrpc.vhosts="localhost" \
+ --authrpc.port 8551
+ --authrpc.jwtsecret=/path/to/jwtsecret
+```
+
+Kiểm tra [tài liệu về tất cả các tùy chọn cấu hình](https://geth.ethereum.org/docs/fundamentals/command-line-options) và tìm hiểu thêm về [việc chạy Geth với một máy khách đồng thuận](https://geth.ethereum.org/docs/getting-started/consensus-clients).
+
+##### Chạy Nethermind
+
+Nethermind cung cấp nhiều [tùy chọn cài đặt](https://docs.nethermind.io/get-started/installing-nethermind) khác nhau. Gói cài đặt đi kèm với nhiều tệp thực thi, trong đó có Launcher với phần cài đặt hướng dẫn, giúp bạn tạo cấu hình bằng cách tương tác. Ngoài ra, còn có Runner, chính là tệp thực thi, và bạn có thể chạy nó trực tiếp với các cấu hình Flag. JSON-RPC được bật theo mặc định.
+
+```sh
+Nethermind.Runner --config mainnet \
+ --datadir /data/ethereum \
+ --JsonRpc.JwtSecretFile=/path/to/jwtsecret
+```
+
+Tài liệu của Nethermind cung cấp một [hướng dẫn hoàn chỉnh](https://docs.nethermind.io/get-started/running-node/) về việc chạy Nethermind với máy khách đồng thuận.
+
+Một Client thực thi sẽ khởi động các chức năng cốt lõi của nó, mở các endpoint đã chọn và bắt đầu tìm kiếm các nút ngang hàng. Sau khi tìm thấy các nút ngang hàng thành công, Client sẽ bắt đầu quá trình đồng bộ. Client thực thi sẽ chờ kết nối từ Client đồng thuận. Dữ liệu chuỗi khối hiện tại sẽ khả dụng khi Client đã đồng bộ thành công với trạng thái mới nhất.
+
+##### Chạy Reth
+
+Ví dụ này chạy Reth trên mạng chính, sử dụng dữ liệu địa điểm mặc định. Bật xác thực JSON-RPC và Engine RPC để kết nối máy khách đồng thuận được xác định bởi đường dẫn `jwtsecret`, chỉ cho phép các lệnh gọi từ `localhost`.
+
+```sh
+reth node \
+ --authrpc.jwtsecret /path/to/jwtsecret \
+ --authrpc.addr 127.0.0.1 \
+ --authrpc.port 8551
+```
+
+Xem [Cấu hình Reth](https://reth.rs/run/config.html?highlight=data%20directory#configuring-reth) để tìm hiểu thêm về các thư mục dữ liệu mặc định. [Tài liệu của Reth](https://reth.rs/run/mainnet.html) chứa các tùy chọn bổ sung và chi tiết cấu hình.
+
+#### Khởi động máy khách đồng thuận {#starting-the-consensus-client}
+
+Client đồng thuận phải được bắt đầu với cấu hình cổng giao thức phù hợp để kết nối RPC cục bộ tới Client thực thi. Client đồng thuận phải chạy với cổng của Client thực thi đã mở được truyền vào như tham số cấu hình.
+
+Máy khách đồng thuận cũng cần đường dẫn đến `jwt-secret` của máy khách thực thi để xác thực kết nối RPC giữa chúng. Giống như ví dụ thực thi ở trên, mỗi Client đồng thuận có một cấu hình Flag sử dụng thư mục Token jwt như một tham số. Điều này phải nhất quán với đường dẫn `jwtsecret` được cung cấp cho máy khách thực thi.
+
+Nếu bạn dự định chạy một nút xác thực, hãy nhớ thêm một cấu hình Flag để chỉ định địa chỉ Ethereum của người nhận phí. Đây là nơi phần thưởng Ether cho nút của bạn sẽ được tích lũy. Mỗi máy khách đồng thuận có một tùy chọn, ví dụ: `--suggested-fee-recipient=0xabcd1`, nhận một địa chỉ Ethereum làm đối số.
+
+Khi khởi động một Nút Beacon trên một mạng thử nghiệm, bạn có thể tiết kiệm đáng kể thời gian đồng bộ hóa bằng cách sử dụng một điểm cuối công khai cho [đồng bộ hóa điểm kiểm duyệt (Checkpoint sync)](https://notes.ethereum.org/@launchpad/checkpoint-sync).
+
+#### Chạy một máy khách đồng thuận {#running-a-consensus-client}
+
+##### Chạy Lighthouse
+
+Trước khi chạy Lighthouse, hãy tìm hiểu thêm về cách cài đặt và cấu hình nó trong [Sách Lighthouse](https://lighthouse-book.sigmaprime.io/installation.html).
+
+```sh
+lighthouse beacon_node \
+ --network mainnet \
+ --datadir /data/ethereum \
+ --http \
+ --execution-endpoint http://127.0.0.1:8551 \
+ --execution-jwt /path/to/jwtsecret
+```
+
+##### Chạy Lodestart
+
+Cập nhật phần mềm Lodestart bằng cách biên dịch hoặc tải xuống Docker image. Tìm hiểu thêm trong [tài liệu](https://chainsafe.github.io/lodestar/) và [hướng dẫn thiết lập](https://hackmd.io/@philknows/rk5cDvKmK) toàn diện hơn.
+
+```sh
+lodestar beacon \
+ --dataDir="/data/ethereum" \
+ --network=mainnet \
+ --eth1.enabled=true \
+ --execution.urls="http://127.0.0.1:8551" \
+ --jwt-secret="/path/to/jwtsecret"
+```
+
+##### Chạy Nimbus
+
+Nimbus hoạt động như Client đồng thuận và thực thi. Nó có thể được chạy trên nhiều loại thiết bị thậm chí là khả năng tính toán thấp.
+Sau khi [cài đặt các gói phụ thuộc và chính Nimbus](https://nimbus.guide/quick-start.html), bạn có thể chạy máy khách đồng thuận của nó:
+
+```sh
+nimbus_beacon_node \
+ --network=mainnet \
+ --web3-url=http://127.0.0.1:8551 \
+ --rest \
+ --jwt-secret="/path/to/jwtsecret"
+```
+
+##### Chạy Prysm
+
+Prysm đi kèm với một tập lệnh cho phép cài đặt tự động một cách dễ dàng. Chi tiết có thể được tìm thấy trong [tài liệu của Prysm](https://prysm.offchainlabs.com/docs/install-prysm/install-with-script/).
+
+```sh
+./prysm.sh beacon-chain \
+ --mainnet \
+ --datadir /data/ethereum \
+ --execution-endpoint=http://localhost:8551 \
+ --jwt-secret=/path/to/jwtsecret
+```
+
+##### Chạy Teku
+
+```sh
+teku --network mainnet \
+ --data-path "/data/ethereum" \
+ --ee-endpoint http://localhost:8551 \
+ --ee-jwt-secret-file "/path/to/jwtsecret"
+```
+
+Khi một Client đồng thuận kết nối với Client thực thi để đọc hợp đồng ký gửi và nhận diện các nút xác thực, nó cũng đồng thời kết nối với các nút Beacon ngang hàng khác và bắt đầu đồng bộ các Slot đồng thuận từ khởi nguyên. Khi nút Beacon đạt tới chu kỳ hiện tại, Beacon API sẽ khả dụng cho các nút xác thực của bạn. Tìm hiểu thêm về [các API của Nút Beacon](https://eth2docs.vercel.app/).
+
+### Thêm Trình xác thực {#adding-validators}
+
+Một Client đồng thuận đóng vai trò là nút Beacon để các nút xác thực có thể kết nối. Mỗi Client đồng thuận có phần mềm xác thực riêng được miêu tả chi tiết trong tài liệu của nó.
+
+Việc chạy trình xác thực của riêng bạn cho phép [đặt cược solo](/staking/solo/), phương pháp có tác động lớn nhất và phi tín nhiệm để hỗ trợ mạng Ethereum. Tuy nhiên, điều này đòi hỏi khoảng cọc là 32 ETH. Để chạy một trình xác thực trên nút của riêng bạn với số tiền nhỏ hơn, một bể (pool) phi tập trung với các nhà khai thác nút không cần cấp phép, chẳng hạn như [Rocket Pool](https://rocketpool.net/node-operators), có thể sẽ khiến bạn quan tâm.
+
+Cách dễ nhất để bắt đầu với việc đặt cược và tạo khóa trình xác thực là sử dụng [Hoodi Testnet Staking Launchpad](https://hoodi.launchpad.ethereum.org/), cho phép bạn kiểm tra thiết lập của mình bằng cách [chạy các nút trên Hoodi](https://notes.ethereum.org/@launchpad/hoodi). Khi bạn đã sẵn sàng cho Mạng chính, bạn có thể lặp lại các bước này bằng cách sử dụng [Mainnet Staking Launchpad](https://launchpad.ethereum.org/).
+
+Xem [trang đặt cược](/staking) để có cái nhìn tổng quan về các tùy chọn đặt cược.
+
+### Sử dụng nút {#using-the-node}
+
+Các máy khách thực thi cung cấp các [điểm cuối API RPC](/developers/docs/apis/json-rpc/) mà bạn có thể sử dụng để gửi giao dịch, tương tác hoặc triển khai các hợp đồng thông minh trên mạng Ethereum theo nhiều cách khác nhau:
+
+- Gọi chúng theo cách thủ công bằng một giao thức phù hợp (ví dụ: sử dụng `curl`)
+- Đính kèm một bảng điều khiển (console) được cung cấp (ví dụ: `geth attach`)
+- Triển khai chúng trong các ứng dụng sử dụng thư viện web3, ví dụ: [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview), [ethers](https://github.com/ethers-io/ethers.js/)
+
+Các Client khác nhau có những thực thi khác nhau về RPC endpoint. Tuy nhiên đã có tiêu chuẩn JSON-RPC mà bạn có thể sử dụng được cho mỗi Client. Để có cái nhìn tổng quan, [hãy đọc tài liệu JSON-RPC](/developers/docs/apis/json-rpc/). Các ứng dụng cần thông tin từ mạng Ethereum có thể sử dụng RPC này. Ví dụ: ví phổ biến MetaMask cho phép bạn [kết nối với điểm cuối RPC của riêng mình](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node) với các lợi ích mạnh mẽ về quyền riêng tư và bảo mật.
+
+Tất cả các máy khách đồng thuận đều cung cấp một [API Beacon](https://ethereum.github.io/beacon-APIs) có thể được sử dụng để kiểm tra trạng thái của máy khách đồng thuận hoặc tải xuống các khối và dữ liệu đồng thuận bằng cách gửi yêu cầu bằng các công cụ như [Curl](https://curl.se). Các thông tin có thể được tìm thấy trên tài liệu của từng Client đồng thuận.
+
+#### Tiếp cận RPC {#reaching-rpc}
+
+Cổng mặc định cho JSON-RPC của máy khách thực thi là `8545` nhưng bạn có thể sửa đổi các cổng của các điểm cuối cục bộ trong cấu hình. Theo mặc định, giao diện RPC chỉ có thể truy cập được cục bộ trên máy tính của bạn. Để có thể truy cập từ xa, bạn có thể muốn hiển thị nó ra công khai bằng cách thay đổi địa chỉ thành `0.0.0.0`. Điều này sẽ giúp nó có thể truy cập được qua mạng cục bộ và các địa chỉ IP công cộng. Trong hầu hết trường hợp, bạn cũng sẽ cần thiết lập cổng chuyển tiếp trên bộ định tuyến của mình.
+
+Hãy hết sức thận trọng khi mở cổng ra Internet, vì việc này sẽ cho phép bất kỳ ai trên mạng điều khiển nút của bạn. Kẻ tấn công có thể truy cập vào nút của bạn để làm sập hệ thống hoặc đánh cắp tiền nếu bạn đang dùng Client như một ví.
+
+Một cách giải quyết là ngăn không cho các phương thức RPC có thể gây hại bị chỉnh sửa. Ví dụ, với Geth, bạn có thể khai báo các phương thức có thể sửa đổi bằng một cờ: `--http.api web3,eth,txpool`.
+
+Việc truy cập vào giao diện RPC có thể được mở rộng thông qua việc phát triển API tầng biên hoặc các ứng dụng máy chủ web, như Nginx, và kết nối chúng với địa chỉ và cổng cục bộ của Client. Tận dụng một lớp trung gian cũng cho phép các nhà phát triển thiết lập chứng chỉ cho các kết nối `https` an toàn đến giao diện RPC.
+
+Việc thiết lập một máy chủ Web, proxy hoặc REST API công khai không phải là cách duy nhất để cung cấp quyền truy cập tới RPC endpoint của nút. Một cách khác để thiết lập một điểm cuối có thể truy cập công khai mà vẫn bảo vệ quyền riêng tư là chạy nút của bạn trên dịch vụ onion [Tor](https://www.torproject.org/) của riêng bạn. Điều này cho phép bạn truy cập RPC từ bên ngoài mạng cục bộ mà không cần địa chỉ IP công cộng hoặc mở cổng công khai. Tuy nhiên, việc sử dụng cấu hình này có thể khiến RPC endpoint chỉ truy cập được thông qua mạng Tor, vốn không được tất cả ứng dụng hỗ trợ và có thể dẫn đến sự cố kết nối.
+
+Để làm điều này, bạn phải tạo [dịch vụ onion](https://community.torproject.org/onion-services/) của riêng mình. Xem [tài liệu](https://community.torproject.org/onion-services/setup/) về thiết lập dịch vụ onion để tự lưu trữ. Bạn có thể trỏ nó tới một trang chủ Web dùng Proxy tới cổng RPC hoặc trỏ trực tiếp tới RPC.
+
+Cuối cùng, một trong những cách phổ biến nhất là cung cấp quyền truy cập vào mạng nội bộ thông qua VPN. Tùy thuộc vào trường hợp sử dụng và số lượng người dùng cần truy cập vào nút của bạn, một kết nối VPN an toàn có thể là một lựa chọn. OpenVPN là một SSL VPN đầy đủ tính năng, triển khai mở rộng mạng an toàn ở lớp 2 hoặc 3 của OSI bằng cách sử dụng giao thức SSL/TLS tiêu chuẩn ngành, hỗ trợ các phương thức xác thực máy khách linh hoạt dựa trên chứng chỉ, thẻ thông minh và/hoặc thông tin đăng nhập bằng tên người dùng/mật khẩu, và cho phép các chính sách kiểm soát truy cập cụ thể của người dùng hoặc nhóm sử dụng các quy tắc tường lửa được áp dụng cho giao diện VPN ảo.
+
+### Vận hành nút {#operating-the-node}
+
+Bạn nên theo dõi thường xuyên nút của bạn để chắc rằng nó đang chạy một cách đúng. Bạn có thể cần bảo dưỡng định kì.
+
+#### Giữ cho nút luôn trực tuyến {#keeping-node-online}
+
+Nút của bạn không cần phải trực tuyến mọi thời điểm, nhưng bạn nên giữ nó trực tuyến càng nhiều càng tốt giúp nó đồng bộ với mạng lưới. Bạn có thể tắt nó để làm mới nó, nhưng hãy hiểu như thế này:
+
+- Tắt nó có thể tốn một vài phút nếu như trạng thái vẫn đang được viết vào ổ đĩa.
+- Ép tắt đột ngột có thể làm tổn hại dữ liệu bắt buộc bạn phải tái đồng bộ hóa toàn bộ nút.
+- Client của bạn sẽ mất đồng bộ mới mạng lưới và cần tái đồng bộ nếu như bạn khởi động lại nó. Trong khi nút bắt đầu đồng độ kể từ lúc nó bị tắt đi, quá tình có thể tốn thời gian tùy thuộc vào thời gian nó ngoại tuyến.
+
+_Điều này không áp dụng cho các nút trình xác thực lớp đồng thuận._ Việc đưa nút của bạn ngoại tuyến sẽ ảnh hưởng đến tất cả các dịch vụ phụ thuộc vào nó. Nếu bạn đang chạy một nút cho mục đích _đặt cược_, bạn nên cố gắng giảm thiểu thời gian chết nhiều nhất có thể.
+
+#### Tạo các dịch vụ máy khách {#creating-client-services}
+
+Cân nhắc tạo một Service để chạy Client tự động khi bật lên. Ví dụ, trên các máy chủ Linux, một phương pháp hay là tạo một dịch vụ, ví dụ, với `systemd`, thực thi máy khách với cấu hình phù hợp, dưới một người dùng có các đặc quyền hạn chế và tự động khởi động lại.
+
+#### Cập nhật máy khách {#updating-clients}
+
+Bạn cần phải giữ cho phần mềm máy khách của bạn được cập nhật với các bản vá bảo mật, tính năng và [EIP](/eips/) mới nhất. Đặc biệt là trước các [phân nhánh cứng](/ethereum-forks/), hãy chắc chắn bạn đang chạy các phiên bản máy khách chính xác.
+
+> Trước các bản cập nhật mạng quan trọng, EF sẽ đăng một bài trên [blog](https://blog.ethereum.org) của mình. Bạn có thể [đăng ký nhận các thông báo này](https://blog.ethereum.org/category/protocol#subscribe) để nhận thông báo qua thư khi nút của bạn cần cập nhật.
+
+Cập nhật Client rất đơn giản. Mỗi Client có một chỉ dẫn cụ thể trong tài liệu của họ, nhưng quá trình này chỉ thường để tải phiên bản mới nhất và phải khởi động lại Client với tệp thực thi mới. Client sẽ quay trở về guồng cũ, nhưng với bản cập nhật mới.
+
+Mỗi bản triển khai Client đều có một chuỗi String mà con người có thể đọc được, được dùng trong giao thức ngang hàng, nhưng cũng có thể truy cập từ dòng lệnh. Biến String này cho phép người dùng kiểm tra xem họ có đang chạy đúng phiên bản hay không, đồng thời cho phép các trình duyệt khối và các công cụ phân tích khác định lượng sự phân bố của từng Client cụ thể trên mạng lưới. Hãy tham khảo tài liệu hướng dẫn của từng client để biết thêm thông tin về phiên bản String.
+
+#### Chạy các dịch vụ bổ sung {#running-additional-services}
+
+Chạy nút của bạn cho phép bạn dung Service đòi hỏi truy cập vào RPC của Client Ethereum. Đây là các dịch vụ được xây dựng trên Ethereum như [các giải pháp lớp 2](/developers/docs/scaling/#layer-2-scaling), backend cho ví, trình khám phá khối, các công cụ cho nhà phát triển và cơ sở hạ tầng Ethereum khác.
+
+#### Giám sát nút {#monitoring-the-node}
+
+Để có thể theo dõi / đo lường nút của bạn, hãy cân nhắc thu thập số liệu. Client cung cấp các Endpoint số liệu nhờ đó bạn có dữ liệu toàn diện về nút của mình. Sử dụng các công cụ như [InfluxDB](https://www.influxdata.com/get-influxdb/) hoặc [Prometheus](https://prometheus.io/) để tạo cơ sở dữ liệu mà bạn có thể biến thành các hình ảnh hóa và biểu đồ trong phần mềm như [Grafana](https://grafana.com/). Có nhiều cách thiết lập để sử dụng phần mềm này và các bảng điều khiển Grafana khác nhau giúp bạn trực quan hóa nút của mình cũng như toàn bộ mạng lưới. Ví dụ, hãy xem [hướng dẫn về giám sát Geth](/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/).
+
+Là một phần trong quá trình giám sát, hãy đảm bảo bạn theo dõi hiệu suất của máy. Trong quá trình đồng bộ ban đầu của nút, phần mềm Client có thể tiêu tốn rất nhiều CPU và RAM. Ngoài Grafana, bạn cũng có thể sử dụng các công cụ mà hệ điều hành cung cấp như htop hoặc uptime để thực hiện việc này.
+
+## Đọc thêm {#further-reading}
+
+- [Hướng dẫn Đặt cọc Ethereum](https://github.com/SomerEsat/ethereum-staking-guides) - _Somer Esat, thường xuyên cập nhật_
+- [Hướng dẫn | Cách thiết lập trình xác thực để đặt cược Ethereum trên mạng chính](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, thường xuyên cập nhật_
+- [Hướng dẫn của ETHStaker về việc chạy các trình xác thực trên các mạng thử nghiệm](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, được cập nhật thường xuyên_
+- [Ứng dụng mẫu AWS Blockchain Node Runner cho các Nút Ethereum](https://aws-samples.github.io/aws-blockchain-node-runners/docs/Blueprints/Ethereum) - _AWS, thường xuyên cập nhật_
+- [Câu hỏi thường gặp về The Merge cho các nhà khai thác nút](https://notes.ethereum.org/@launchpad/node-faq-merge) - _Tháng 7 năm 2022_
+- [Phân tích các yêu cầu phần cứng để trở thành một nút xác thực đầy đủ của Ethereum](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24 tháng 9 năm 2018_
+- [Chạy các nút đầy đủ Ethereum: Hướng dẫn cho người có ít động lực](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, ngày 7 tháng 11 năm 2019_
+- [Chạy một nút Hyperledger Besu trên Mạng chính Ethereum: Lợi ích, Yêu cầu và Thiết lập](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– Felipe Faraggi, 7 tháng 5 năm 2020_
+- [Triển khai Máy khách Nethermind Ethereum với Ngăn xếp Giám sát](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth, 8 tháng 7 năm 2020_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các nút và client](/developers/docs/nodes-and-clients/)
+- [Các khối](/developers/docs/blocks/)
+- [Các mạng](/developers/docs/networks/)
diff --git a/public/content/translations/vi/developers/docs/oracles/index.md b/public/content/translations/vi/developers/docs/oracles/index.md
new file mode 100644
index 00000000000..e6678bbb9f3
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/oracles/index.md
@@ -0,0 +1,433 @@
+---
+title: Oracles
+description: Oracle cung cấp cho hợp đồng thông minh Ethereum quyền truy cập vào dữ liệu thực tế, mở ra nhiều trường hợp sử dụng hơn và mang lại giá trị lớn hơn cho người dùng.
+lang: vi
+---
+
+Oracles là các ứng dụng tạo ra dữ liệu cung cấp thông tin từ bên ngoài cho blockchain cho hợp đồng thông minh. Điều này là cần thiết vì các hợp đồng thông minh dựa trên Ethereum không thể truy cập thông tin bên ngoài mạng blockchain theo mặc định.
+
+Việc cung cấp cho các hợp đồng thông minh khả năng thực thi dựa trên dữ liệu ngoài chuỗi mở rộng tiện ích và giá trị của các ứng dụng phi tập trung. Chẳng hạn, các thị trường dự đoán trên chuỗi sử dụng các oracle để cung cấp thông tin về kết quả mà họ dùng để xác thực dự đoán của người dùng. Giả sử Alice đặt cược 20 ETH vào ai sẽ trở thành tổng thống tiếp theo của Hoa Kỳ. Tổng thống. Trong trường hợp đó, dapp dự đoán thị trường cần một oracle để xác nhận kết quả bầu cử và xem Alice có đủ điều kiện nhận tiền thưởng không.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Trang này giả định rằng người đọc đã quen thuộc với các nguyên tắc cơ bản của Ethereum, bao gồm [các nút](/developers/docs/nodes-and-clients/), [cơ chế đồng thuận](/developers/docs/consensus-mechanisms/) và [EVM](/developers/docs/evm/). Bạn cũng nên nắm vững về [hợp đồng thông minh](/developers/docs/smart-contracts/) và [cấu trúc hợp đồng thông minh](/developers/docs/smart-contracts/anatomy/), đặc biệt là [các sự kiện](/glossary/#events).
+
+## Một blockchain oracle là gì? {#what-is-a-blockchain-oracle}
+
+Oracle là các ứng dụng tìm nguồn, xác minh và truyền thông tin bên ngoài (tức là thông tin được lưu trữ ngoài chuỗi) tới các hợp đồng thông minh chạy trên chuỗi khối. Ngoài việc lấy dữ liệu offchain và phát sóng nó trên Ethereum, các oracle còn có thể đẩy thông tin từ blockchain tới các hệ thống bên ngoài, ví dụ như mở khóa một ổ khóa thông minh khi người dùng gửi phí qua giao dịch Ethereum.
+
+Nếu không có oracle, hợp đồng thông minh sẽ bị giới hạn hoàn toàn trong dữ liệu trên chuỗi.
+
+Các oracle khác nhau dựa trên nguồn dữ liệu (một hoặc nhiều nguồn), mô hình tin cậy (tập trung hoặc phi tập trung) và kiến trúc hệ thống (đọc ngay, xuất bản-theo dõi, và yêu cầu-phản hồi). Chúng ta cũng có thể phân biệt các oracle dựa trên việc chúng lấy dữ liệu bên ngoài để sử dụng cho các hợp đồng trên chuỗi (oracle đầu vào), gửi thông tin từ blockchain đến các ứng dụng ngoài chuỗi (oracle đầu ra), hoặc thực hiện các tác vụ tính toán ngoài chuỗi (oracle tính toán).
+
+## Tại sao hợp đồng thông minh lại cần oracle? {#why-do-smart-contracts-need-oracles}
+
+Nhiều lập trình viên coi hợp đồng thông minh như là mã chạy ở những địa chỉ cụ thể trên blockchain. Tuy nhiên, một [quan điểm tổng quát hơn về hợp đồng thông minh](/smart-contracts/) là chúng là các chương trình phần mềm tự thực thi có khả năng thực thi các thỏa thuận giữa các bên khi các điều kiện cụ thể được đáp ứng - do đó có thuật ngữ “hợp đồng thông minh”.
+
+Tuy nhiên, việc sử dụng hợp đồng thông minh để thi hành các thỏa thuận giữa các cá nhân không phải là điều đơn giản, vì Ethereum mang tính nhất quán.” Một [hệ thống xác định](https://en.wikipedia.org/wiki/Deterministic_algorithm) là một hệ thống luôn tạo ra kết quả giống nhau với một trạng thái ban đầu và một đầu vào cụ thể, nghĩa là không có sự ngẫu nhiên hoặc biến đổi trong quá trình tính toán đầu ra từ đầu vào.
+
+Để đạt được sự thực thi có tính xác định, các chuỗi khối giới hạn các nút chỉ đạt được sự đồng thuận về các câu hỏi nhị phân đơn giản (đúng/sai) bằng cách sử dụng _duy nhất_ dữ liệu được lưu trữ trên chính chuỗi khối đó. Ví dụ về những câu hỏi như vậy bao gồm:
+
+- “Chủ sở hữu tài khoản (được xác định bởi một khóa công khai) có ký kết giao dịch này bằng khóa riêng đã được kết nối hay không?”
+- “Tài khoản này có đủ tiền để thanh toán giao dịch không?”
+- "Giao dịch này có hợp lệ trong bối cảnh hợp đồng thông minh này không?", v.v.
+
+Nếu các chuỗi khối nhận thông tin từ các nguồn bên ngoài (tức là từ thế giới thực), tính xác định sẽ không thể đạt được, ngăn cản các nút thống nhất về tính hợp lệ của các thay đổi đối với trạng thái của chuỗi khối. Ví dụ, một hợp đồng thông minh thực hiện giao dịch dựa trên tỷ giá hối đoái ETH-USD hiện tại được lấy từ một giá API truyền thống. Con số này có khả năng thay đổi thường xuyên (chưa kể rằng API có thể bị ngừng hỗ trợ hoặc bị tấn công), điều này có nghĩa là các nút thực hiện cùng một mã hợp đồng sẽ đạt được những kết quả khác nhau.
+
+Đối với một blockchain công cộng như Ethereum, có hàng ngàn nút xử lý giao dịch trên toàn thế giới, tính nhất quán là rất quan trọng. Với việc không có cơ quan trung ương nào đóng vai trò là nguồn thông tin chính xác, các nút cần có cơ chế để đạt được trạng thái giống nhau sau khi áp dụng cùng một giao dịch. Nếu có trường hợp mà nút A chạy mã hợp đồng thông minh và nhận được '3' như kết quả, trong khi nút B nhận được '7' sau khi chạy cùng một giao dịch, điều đó sẽ dẫn đến sự đồng thuận bị phá hoại và làm mất giá trị của Ethereum như một nền tảng máy tính phi tập trung.
+
+Tình huống này cũng chỉ ra vấn đề với việc thiết kế blockchain để lấy thông tin từ các nguồn bên ngoài. Tuy nhiên, các oracle giải quyết vấn đề này bằng cách lấy thông tin từ các nguồn ngoài chuỗi và lưu trữ nó trên blockchain để hợp đồng thông minh sử dụng. Vì thông tin được lưu trữ trên chuỗi không thể bị thay đổi và có sẵn công khai, các nút Ethereum có thể sử dụng một cách an toàn dữ liệu oracle đã nhập từ ngoài chuỗi để tính toán các thay đổi trạng thái mà không làm mất tính đồng thuận.
+
+Để thực hiện điều này, một oracle thường được cấu thành từ một hợp đồng thông minh hoạt động trên chuỗi và một số thành phần ngoài chuỗi. Hợp đồng onchain nhận các yêu cầu dữ liệu từ các hợp đồng thông minh khác, sau đó chuyển tiếp đến thành phần offchain (gọi là nút oracle). Nút oracle này có thể truy vấn các nguồn dữ liệu—ví dụ như sử dụng các giao diện lập trình ứng dụng (APIs)—và gửi các giao dịch để lưu trữ dữ liệu yêu cầu trong bộ nhớ của hợp đồng thông minh.
+
+Về cơ bản, một oracle blockchain kết nối khoảng cách thông tin giữa blockchain và môi trường bên ngoài, tạo ra các "hợp đồng thông minh lai". Hợp đồng thông minh lai là loại hợp đồng hoạt động dựa trên sự kết hợp giữa mã hợp đồng trên chuỗi và hạ tầng ngoài chuỗi. Các thị trường dự đoán phi tập trung là một ví dụ tuyệt vời về hợp đồng thông minh lai. Một số ví dụ khác có thể bao gồm hợp đồng thông minh bảo hiểm mùa màng mà sẽ thanh toán khi một nhóm oracles xác định rằng một số hiện tượng thời tiết nhất định đã xảy ra.
+
+## Vấn đề oracle là gì? {#the-oracle-problem}
+
+Các Oracle giải quyết một vấn đề quan trọng, nhưng cũng gây ra một số phức tạp, ví dụ:
+
+- Làm sao để chúng ta kiểm tra rằng thông tin đã được thêm vào từ nguồn chuẩn hoặc không bị can thiệp?
+
+- Làm thế nào để chúng ta đảm bảo rằng dữ liệu này luôn sẵn có và được cập nhật thường xuyên?
+
+Nó được gọi là “vấn đề oracle” cho thấy những vấn đề gặp phải khi sử dụng oracle blockchain để gửi dữ liệu vào hợp đồng thông minh. Dữ liệu từ một oracle phải chính xác thì hợp đồng thông minh mới hoạt động đúng. Hơn nữa, việc phải ‘tin tưởng’ vào các nhà điều hành oracle để cung cấp thông tin chính xác làm giảm đi khía cạnh 'không cần tin tưởng' của hợp đồng thông minh.
+
+Các oracle khác nhau đưa ra những giải pháp khác nhau cho vấn đề oracle, mà chúng ta sẽ khám phá sau. Thường thì người ta đánh giá các Oracles dựa trên khả năng xử lý những thách thức sau:
+
+1. **Tính chính xác**: Một oracle không nên khiến các hợp đồng thông minh kích hoạt thay đổi trạng thái dựa trên dữ liệu ngoài chuỗi không hợp lệ. Một oracle phải đảm bảo _tính xác thực_ và _tính toàn vẹn_ của dữ liệu. Tính xác thực có nghĩa là dữ liệu được lấy từ nguồn chính xác, trong khi tính toàn vẹn có nghĩa là dữ liệu vẫn còn nguyên vẹn (tức là không bị thay đổi) trước khi được gửi lên chuỗi.
+
+2. **Tính khả dụng**: Một oracle không nên trì hoãn hoặc ngăn chặn các hợp đồng thông minh thực hiện các hành động và kích hoạt các thay đổi trạng thái. Điều này có nghĩa là dữ liệu từ một oracle phải _sẵn có theo yêu cầu_ mà không bị gián đoạn.
+
+3. **Tính tương thích về ưu đãi**: Một oracle nên khuyến khích các nhà cung cấp dữ liệu ngoài chuỗi gửi thông tin chính xác cho các hợp đồng thông minh. Tính tương thích về ưu đãi bao gồm _khả năng quy kết_ và _trách nhiệm giải trình_. Khả năng quy trách nhiệm cho phép liên kết một phần thông tin bên ngoài với nhà cung cấp của nó, trong khi trách nhiệm buộc các nhà cung cấp dữ liệu phải chịu trách nhiệm về thông tin họ cung cấp, để họ có thể được thưởng hoặc bị phạt dựa trên chất lượng của thông tin được cung cấp.
+
+## Dịch vụ oracle blockchain hoạt động như thế nào? {#how-does-a-blockchain-oracle-service-work}
+
+### Người dùng {#users}
+
+Người dùng là các thực thể (tức là, các hợp đồng thông minh) cần thông tin bên ngoài chuỗi khối để hoàn thành các hành động cụ thể. Quy trình làm việc cơ bản của một dịch vụ oracle bắt đầu bằng việc người dùng gửi yêu cầu dữ liệu đến hợp đồng oracle. Các yêu cầu dữ liệu thường sẽ trả lời một số hoặc tất cả những câu hỏi sau:
+
+1. Những nguồn nào mà các nút offchain có thể tham khảo để lấy thông tin đã yêu cầu?
+
+2. Cách mà các phóng viên xử lý thông tin từ các nguồn dữ liệu và trích xuất các điểm dữ liệu hữu ích là như thế nào?
+
+3. Có bao nhiêu nút oracle có thể tham gia vào việc truy xuất dữ liệu?
+
+4. Làm sao để xử lý sự thiếu nhất quán trong báo cáo oracle?
+
+5. Phương pháp nào nên được áp dụng trong việc lọc các bài nộp và tổng hợp báo cáo thành một giá trị duy nhất?
+
+### Hợp đồng Oracle {#oracle-contract}
+
+Hợp đồng oracle là thành phần onchain của dịch vụ oracle. Nó lắng nghe các yêu cầu dữ liệu từ các hợp đồng khác, chuyển câu hỏi dữ liệu tới các nút oracle, và phát sóng dữ liệu được trả về cho các hợp đồng client. Hợp đồng này có thể thực hiện một số phép toán trên các điểm dữ liệu trả về để tạo ra một giá trị tổng hợp gửi đến hợp đồng yêu cầu.
+
+Hợp đồng oracle cung cấp một số chức năng mà các hợp đồng client gọi đến khi thực hiện yêu cầu dữ liệu. Khi nhận được một truy vấn mới, hợp đồng thông minh sẽ phát ra một [sự kiện nhật ký](/developers/docs/smart-contracts/anatomy/#events-and-logs) với các chi tiết của yêu cầu dữ liệu. Điều này thông báo cho các nút ngoài chuỗi đã đăng ký theo dõi nhật ký (thường sử dụng một lệnh như `eth_subscribe` JSON-RPC), sau đó các nút này sẽ tiến hành truy xuất dữ liệu được xác định trong sự kiện nhật ký.
+
+Dưới đây là một [ví dụ về hợp đồng oracle](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) của Pedro Costa. Đây là một dịch vụ oracle đơn giản có thể truy vấn các API ngoài chuỗi theo yêu cầu của các hợp đồng thông minh khác và lưu trữ thông tin được yêu cầu trên blockchain:
+
+```solidity
+pragma solidity >=0.4.21 <0.6.0;
+
+contract Oracle {
+ Request[] requests; //danh sách các yêu cầu được thực hiện cho hợp đồng
+ uint currentId = 0; //id yêu cầu tăng dần
+ uint minQuorum = 2; //số lượng phản hồi tối thiểu cần nhận trước khi công bố kết quả cuối cùng
+ uint totalOracleCount = 3; //Số lượng oracle được mã hóa cứng
+
+ //định nghĩa một yêu cầu api chung
+ struct Request {
+ uint id; //id yêu cầu
+ string urlToQuery; //url của API
+ string attributeToFetch; //thuộc tính json (khóa) để truy xuất trong phản hồi
+ string agreedValue; //giá trị từ khóa
+ mapping(uint => string) answers; //câu trả lời do các oracle cung cấp
+ mapping(address => uint) quorum; //các oracle sẽ truy vấn câu trả lời (1=oracle chưa bỏ phiếu, 2=oracle đã bỏ phiếu)
+ }
+
+ //sự kiện kích hoạt oracle bên ngoài chuỗi khối
+ event NewRequest (
+ uint id,
+ string urlToQuery,
+ string attributeToFetch
+ );
+
+ //được kích hoạt khi có sự đồng thuận về kết quả cuối cùng
+ event UpdatedRequest (
+ uint id,
+ string urlToQuery,
+ string attributeToFetch,
+ string agreedValue
+ );
+
+ function createRequest (
+ string memory _urlToQuery,
+ string memory _attributeToFetch
+ )
+ public
+ {
+ uint length = requests.push(Request(currentId, _urlToQuery, _attributeToFetch, ""));
+ Request storage r = requests[length-1];
+
+ //Địa chỉ oracle được mã hóa cứng
+ r.quorum[address(0x6c2339b46F41a06f09CA0051ddAD54D1e582bA77)] = 1;
+ r.quorum[address(0xb5346CF224c02186606e5f89EACC21eC25398077)] = 1;
+ r.quorum[address(0xa2997F1CA363D11a0a35bB1Ac0Ff7849bc13e914)] = 1;
+
+ //khởi chạy một sự kiện để oracle bên ngoài chuỗi khối phát hiện
+ emit NewRequest (
+ currentId,
+ _urlToQuery,
+ _attributeToFetch
+ );
+
+ //tăng id yêu cầu
+ currentId++;
+ }
+
+ //được oracle gọi để ghi lại câu trả lời của nó
+ function updateRequest (
+ uint _id,
+ string memory _valueRetrieved
+ ) public {
+
+ Request storage currRequest = requests[_id];
+
+ //kiểm tra xem oracle có nằm trong danh sách các oracle đáng tin cậy không
+ //và nếu oracle chưa bỏ phiếu
+ if(currRequest.quorum[address(msg.sender)] == 1){
+
+ //đánh dấu rằng địa chỉ này đã bỏ phiếu
+ currRequest.quorum[msg.sender] = 2;
+
+ //lặp qua "mảng" câu trả lời cho đến khi có một vị trí trống và lưu giá trị truy xuất được
+ uint tmpI = 0;
+ bool found = false;
+ while(!found) {
+ //tìm slot trống đầu tiên
+ if(bytes(currRequest.answers[tmpI]).length == 0){
+ found = true;
+ currRequest.answers[tmpI] = _valueRetrieved;
+ }
+ tmpI++;
+ }
+
+ uint currentQuorum = 0;
+
+ //lặp qua danh sách oracle và kiểm tra xem có đủ oracle (số đại biểu tối thiểu)
+ //đã bỏ phiếu cho cùng một câu trả lời như câu trả lời hiện tại
+ for(uint i = 0; i < totalOracleCount; i++){
+ bytes memory a = bytes(currRequest.answers[i]);
+ bytes memory b = bytes(_valueRetrieved);
+
+ if(keccak256(a) == keccak256(b)){
+ currentQuorum++;
+ if(currentQuorum >= minQuorum){
+ currRequest.agreedValue = _valueRetrieved;
+ emit UpdatedRequest (
+ currRequest.id,
+ currRequest.urlToQuery,
+ currRequest.attributeToFetch,
+ currRequest.agreedValue
+ );
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Các nút Oracle {#oracle-nodes}
+
+Nút oracle là thành phần offchain của dịch vụ oracle. Nó lấy thông tin từ các nguồn bên ngoài, như API được lưu trữ trên máy chủ của bên thứ ba, và đưa nó lên blockchain để các hợp đồng thông minh sử dụng. Các nút Oracle lắng nghe các sự kiện từ hợp đồng oracle onchain và tiến hành hoàn thành nhiệm vụ được mô tả trong nhật ký.
+
+Một nhiệm vụ phổ biến của các nút oracle là gửi yêu cầu [HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp) đến một dịch vụ API, phân tích cú pháp phản hồi để trích xuất dữ liệu liên quan, định dạng nó thành một đầu ra mà chuỗi khối có thể đọc được và gửi nó lên chuỗi bằng cách đưa nó vào một giao dịch tới hợp đồng oracle. Nút oracle cũng có thể được yêu cầu xác nhận tính hợp lệ và toàn vẹn của thông tin đã nộp bằng cách sử dụng “bằng chứng xác thực”, mà chúng tôi sẽ khám phá sau.
+
+Các tính toán oracle cũng dựa vào các nút bên ngoài chuỗi để thực hiện các nhiệm vụ tính toán mà sẽ không khả thi để thực hiện onchain, do chi phí gas và giới hạn kích thước khối. Chẳng hạn, nút oracle có thể được giao nhiệm vụ tạo ra một con số ngẫu nhiên có thể xác minh được (ví dụ, cho các trò chơi dựa trên blockchain).
+
+## Các mẫu thiết kế Oracle {#oracle-design-patterns}
+
+Các Oracle có nhiều loại khác nhau, bao gồm _đọc ngay lập tức_, _xuất bản-đăng ký_ và _yêu cầu-phản hồi_, trong đó hai loại sau là phổ biến nhất trong các hợp đồng thông minh của Ethereum. Ở đây chúng ta sẽ nói ngắn gọn về các mô hình publish-subscribe và request-response.
+
+### Oracle xuất bản-đăng ký {#publish-subscribe-oracles}
+
+Mô hình oracle này cung cấp một "dữ liệu cung cấp" mà các hợp đồng khác có thể đọc thường xuyên để lấy thông tin. Dữ liệu trong trường hợp này được dự kiến sẽ thay đổi thường xuyên, vì vậy hợp đồng client phải theo dõi các cập nhật về dữ liệu trong kho của oracle. Một ví dụ là một oracle cung cấp thông tin giá ETH-USD mới nhất cho người dùng.
+
+### Oracle yêu cầu-phản hồi {#request-response-oracles}
+
+Mô hình yêu cầu-phản hồi cho phép hợp đồng client yêu cầu dữ liệu tùy ý ngoài những gì được cung cấp bởi oracle kiểu công bố-đăng ký. Các oracle yêu cầu-phản hồi là lý tưởng khi tập dữ liệu quá lớn để lưu trữ trong bộ nhớ của hợp đồng thông minh, và/hoặc người dùng chỉ cần một phần nhỏ của dữ liệu vào bất kỳ thời điểm nào.Hợp đồng thông minh
+
+Mặc dù phức tạp hơn các mô hình xuất bản-đăng ký, các oracle yêu cầu-phản hồi về cơ bản là những gì chúng tôi đã mô tả ở phần trước. Bộ oracle sẽ có một phần trên chuỗi giúp nhận yêu cầu dữ liệu và chuyển nó cho một nút ngoài chuỗi để xử lý.
+
+Người dùng bắt buộc phải trả phí để lấy thông tin từ nguồn ngoài chuỗi. Hợp đồng client cũng phải cung cấp ngân sách để chi trả cho các chi phí xăng dầu phát sinh bởi hợp đồng oracle trong việc trả lại phản hồi thông qua hàm callback được chỉ định trong yêu cầu.
+
+## Oracle tập trung và phi tập trung {#types-of-oracles}
+
+### Oracle tập trung {#centralized-oracles}
+
+Một oracle tập trung được kiểm soát bởi một thực thể duy nhất chịu trách nhiệm tổng hợp thông tin offchain và cập nhật dữ liệu của hợp đồng oracle theo yêu cầu. Oracle tập trung thì hiệu quả vì chúng dựa vào một nguồn thông tin duy nhất. Chúng có thể hoạt động tốt hơn trong các trường hợp mà các tập dữ liệu độc quyền được công bố trực tiếp bởi chủ sở hữu với một chữ ký được công nhận rộng rãi. Tuy nhiên, chúng cũng mang theo những bất lợi:
+
+#### Đảm bảo tính chính xác thấp {#low-correctness-guarantees}
+
+Với các oracle tập trung, không có cách nào để xác nhận thông tin được cung cấp là chính xác hay không. Ngay cả những nhà cung cấp "có uy tín" cũng có thể trở nên trái đạo đức hoặc bị tấn công mạng. Nếu oracle bị chiếm đoạt, các hợp đồng thông minh sẽ thực thi dựa trên dữ liệu xấu.
+
+#### Tính khả dụng kém {#poor-availability}
+
+Các oracle tập trung không đảm bảo sẽ luôn cung cấp dữ liệu offchain cho các hợp đồng thông minh khác. Nếu nhà cung cấp quyết định tắt dịch vụ hoặc một tin tặc chiếm đoạt thành phần offchain của oracle, hợp đồng thông minh của bạn sẽ có nguy cơ bị 'tấn công từ chối dịch vụ' (DoS).
+
+#### Tính tương thích về ưu đãi kém {#poor-incentive-compatibility}
+
+Các oracle tập trung thường có thiết kế kém hoặc không có chính sách khuyến khích đối với nhà cung cấp dữ liệu để gửi thông tin chính xác/không thay đổi. Trả tiền cho oracle để đảm bảo đúng không có nghĩa là họ sẽ trung thực. Vấn đề này trở nên nghiêm trọng hơn khi lượng giá trị được kiểm soát bởi các hợp đồng thông minh gia tăng.
+
+### Oracle phi tập trung {#decentralized-oracles}
+
+Các oracle phi tập trung được thiết kế để vượt qua những hạn chế của các oracle tập trung bằng cách loại bỏ các điểm lỗi đơn lẻ. Một dịch vụ oracle phi tập trung bao gồm nhiều người tham gia trong một mạng lưới ngang hàng để đạt được sự đồng thuận về dữ liệu ngoài chuỗi trước khi gửi nó đến một hợp đồng thông minh.
+
+Một oracle phi tập trung nên (về lý thuyết) không yêu cầu quyền truy cập, không cần tin cậy và không bị quản lý bởi một bên trung tâm; trên thực tế, sự phân cấp giữa các oracle đang tồn tại trên một phổ. Có những mạng lưới oracle bán phi tập trung, nơi bất kỳ ai cũng có thể tham gia, nhưng có một 'chủ sở hữu' có quyền phê duyệt hoặc loại bỏ các nút dựa trên hiệu suất của chúng trong quá khứ. Cả mạng lưới oracle phi tập trung hoàn toàn cũng tồn tại: thường thì chúng chạy như các blockchain độc lập và có các cơ chế đồng thuận rõ ràng để phối hợp các nút và trừng phạt các hành vi sai trái.
+
+Việc sử dụng các oracle phi tập trung mang lại những lợi ích sau:
+
+### Đảm bảo tính chính xác cao {#high-correctness-guarantees}
+
+Các oracle phi tập trung cố gắng đạt được độ chính xác của dữ liệu bằng cách sử dụng các phương pháp khác nhau. Điều này bao gồm việc sử dụng các chứng cứ chứng minh tính xác thực và toàn vẹn của thông tin đã được trả lại, và yêu cầu nhiều bên cùng đồng thuận về tính hợp lệ của dữ liệu bên ngoài.
+
+#### Bằng chứng xác thực {#authenticity-proofs}
+
+Chứng minh tính xác thực là các cơ chế mã hóa cho phép xác minh độc lập thông tin được lấy từ các nguồn bên ngoài. Những bằng chứng này có thể xác thực nguồn gốc của thông tin và phát hiện những thay đổi có thể có đối với dữ liệu sau khi lấy.
+
+Ví dụ về các bằng chứng xác thực bao gồm:
+
+**Bằng chứng Bảo mật Tầng Vận chuyển (TLS)**: Các nút Oracle thường truy xuất dữ liệu từ các nguồn bên ngoài bằng cách sử dụng kết nối HTTP an toàn dựa trên giao thức Bảo mật Tầng Vận chuyển (TLS). Một số oracle phi tập trung sử dụng bằng chứng xác thực để xác minh các phiên TLS (tức là xác nhận việc trao đổi thông tin giữa một nút và một máy chủ cụ thể) và xác nhận rằng nội dung của phiên đó không bị thay đổi.
+
+**Chứng thực Môi trường Thực thi Đáng tin cậy (TEE)**: [Môi trường thực thi đáng tin cậy](https://en.wikipedia.org/wiki/Trusted_execution_environment) (TEE) là một môi trường tính toán trong hộp cát được cách ly khỏi các quy trình hoạt động của hệ thống máy chủ của nó. TEEs đảm bảo rằng bất kỳ mã ứng dụng nào hoặc dữ liệu được lưu trữ/sử dụng trong môi trường tính toán đều giữ được tính toàn vẹn, bảo mật và không bị thay đổi. Người dùng cũng có thể tạo một bản xác nhận để chứng minh rằng một phiên bản ứng dụng đang chạy trong môi trường thực thi tin cậy.
+
+Một số loại oracle phi tập trung yêu cầu các nhà điều hành nút oracle cung cấp các chứng thực TEE. Điều này xác nhận với người dùng rằng nhà điều hành nút đang chạy một phiên bản của client oracle trong môi trường thực thi đáng tin cậy. TEEs ngăn chặn các quy trình bên ngoài thay đổi hoặc đọc mã và dữ liệu của ứng dụng, do đó, những chứng thực đó chứng minh rằng nút oracle đã giữ thông tin nguyên vẹn và bảo mật.
+
+#### Xác thực thông tin dựa trên sự đồng thuận {#consensus-based-validation-of-information}
+
+Các oracle tập trung dựa vào một nguồn thông tin duy nhất khi cung cấp dữ liệu cho hợp đồng thông minh, điều này có thể dẫn đến việc công bố thông tin không chính xác. Các oracle phi tập trung giải quyết vấn đề này bằng cách dựa vào nhiều nút oracle để truy vấn thông tin onchain. Bằng cách so sánh dữ liệu từ nhiều nguồn khác nhau, các oracle phi tập trung giảm thiểu rủi ro truyền tải thông tin không hợp lệ đến các hợp đồng trên chuỗi.
+
+Tuy nhiên, các oracle phi tập trung phải đối mặt với những khác biệt trong thông tin được thu thập từ nhiều nguồn ngoài chuỗi. Để giảm thiểu sự khác biệt trong thông tin và đảm bảo rằng dữ liệu truyền đến hợp đồng oracle phản ánh ý kiến chung của các nút oracle, các oracle phi tập trung sử dụng những cơ chế sau đây:
+
+##### Bỏ phiếu/staking trên độ chính xác của dữ liệu
+
+Một số mạng lưới oracle phi tập trung yêu cầu người tham gia bỏ phiếu hoặc cược vào độ chính xác của các câu trả lời cho các truy vấn dữ liệu (ví dụ: "Ai đã thắng cuộc bầu cử tổng thống Mỹ năm 2020?") sử dụng token gốc của mạng. Một giao thức tổng hợp sau đó sẽ tổng hợp các phiếu bầu và cổ phần, và lấy câu trả lời được đa số ủng hộ làm câu trả lời hợp lệ.
+
+Những node có câu trả lời khác với phần đa sẽ bị phạt bằng cách phát token của chúng cho những node khác cung cấp giá trị chính xác hơn. Việc buộc các nút phải cung cấp một khoản ký quỹ trước khi cung cấp dữ liệu sẽ khuyến khích những phản hồi trung thực, vì họ được cho là những tác nhân kinh tế hợp lý với mục đích tối đa hóa lợi nhuận.
+
+Việc đặt cọc/bỏ phiếu cũng bảo vệ các oracle phi tập trung khỏi các [cuộc tấn công Sybil](/glossary/#sybil-attack), trong đó các tác nhân độc hại tạo ra nhiều danh tính để lũng đoạn hệ thống đồng thuận. Tuy nhiên, việc staking không thể ngăn chặn việc "freeloading" (các node oracle sao chép thông tin từ người khác) và "xác thực lười biếng" (các node oracle chỉ đi theo số đông mà không tự xác minh thông tin).
+
+##### Cơ chế điểm Schelling
+
+[Điểm Schelling](https://en.wikipedia.org/wiki/Focal_point_\(game_theory\)) là một khái niệm lý thuyết trò chơi giả định rằng nhiều thực thể sẽ luôn mặc định chọn một giải pháp chung cho một vấn đề trong trường hợp không có bất kỳ sự giao tiếp nào. Cơ chế điểm Schelling thường được sử dụng trong các mạng oracle phi tập trung để giúp các nút đạt được sự đồng thuận về câu trả lời cho các yêu cầu dữ liệu.
+
+Một ý tưởng ban đầu cho việc này là [SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed/), một nguồn cấp dữ liệu được đề xuất nơi những người tham gia gửi câu trả lời cho các câu hỏi "vô hướng" (các câu hỏi mà câu trả lời được mô tả bằng độ lớn, ví dụ: "giá của ETH là bao nhiêu?"), cùng với một khoản tiền gửi. Những người dùng cung cấp các giá trị trong khoảng từ [phân vị](https://en.wikipedia.org/wiki/Percentile) thứ 25 đến thứ 75 sẽ được thưởng, trong khi những người có giá trị sai lệch nhiều so với giá trị trung vị sẽ bị phạt.
+
+Mặc dù SchellingCoin không tồn tại ngày nay, một số oracle phi tập trung—đáng chú ý là [Oracle của Giao thức Maker](https://docs.makerdao.com/smart-contract-modules/oracle-module)—sử dụng cơ chế điểm schelling để cải thiện độ chính xác của dữ liệu oracle. Mỗi Oracle Maker bao gồm một mạng lưới P2P ngoài chuỗi của các nút ("người chuyển tiếp" và "nguồn thông tin") chịu trách nhiệm gửi giá thị trường cho các tài sản thế chấp và một hợp đồng "Medianizer" trên chuỗi để tính toán giá trị trung vị của tất cả các giá trị đã được cung cấp. Khi thời gian trì hoãn được chỉ định đã kết thúc, giá trị trung vị này trở thành mức giá tham chiếu mới cho tài sản liên quan.
+
+Các ví dụ khác về các oracle sử dụng cơ chế điểm Schelling bao gồm [Báo cáo ngoài chuỗi của Chainlink](https://docs.chain.link/architecture-overview/off-chain-reporting) và [Witnet](https://witnet.io/). Trong cả hai hệ thống, các phản hồi từ các nút oracle trong mạng lưới ngang hàng được tổng hợp thành một giá trị tổng hợp duy nhất, chẳng hạn như giá trị trung bình hoặc trung vị. Các nút sẽ nhận được phần thưởng hoặc bị trừng phạt dựa trên mức độ mà câu trả lời của chúng phù hợp hoặc sai lệch so với giá trị tổng hợp.
+
+Cơ chế điểm Schelling rất hấp dẫn vì chúng tối thiểu hóa dấu tích trên chuỗi (chỉ cần gửi một giao dịch) trong khi đảm bảo tính phi tập trung. Điều này có thể xảy ra bởi vì các nút phải phê duyệt danh sách các phản hồi đã được gửi trước khi nó được đưa vào thuật toán để tính toán giá trị trung bình/trung vị.
+
+### Tính khả dụng {#availability}
+
+Dịch vụ oracle phi tập trung đảm bảo khả năng tiệp cận cao đối với dữ liệu ngoài chuỗi cho các hợp đồng thông minh. Điều này được thực hiện bằng cách phân cấp cả nguồn thông tin ngoài chuỗi và các nút chịu trách nhiệm chuyển giao thông tin trên chuỗi.
+
+Điều này đảm bảo khả năng chịu lỗi vì hợp đồng oracle có thể dựa vào nhiều nút (mà cũng phụ thuộc vào nhiều nguồn dữ liệu) để thực hiện các truy vấn từ các hợp đồng khác. Sự phi tập trung ở cấp độ nguồn _và_ cấp độ người vận hành nút là rất quan trọng—một mạng lưới các nút oracle phục vụ thông tin được truy xuất từ cùng một nguồn sẽ gặp phải vấn đề tương tự như một oracle tập trung.
+
+Cũng có khả năng để các oracle dựa trên cổ phần có thể cắt giảm quyền hạn của các nhà điều hành nút, những người không phản hồi nhanh chóng các yêu cầu dữ liệu. Điều này thực sự khuyến khích các node oracle đầu tư vào hạ tầng chịu lỗi và cung cấp dữ liệu một cách kịp thời.
+
+### Tính tương thích về ưu đãi tốt {#good-incentive-compatibility}
+
+Các oracle phi tập trung thực hiện các thiết kế ưu đãi khác nhau để ngăn chặn hành vi [Byzantine](https://en.wikipedia.org/wiki/Byzantine_fault) giữa các nút oracle. Cụ thể, chúng đạt được _khả năng quy kết_ và _trách nhiệm giải trình_:
+
+1. Các nút oracle phi tập trung thường phải ký dữ liệu mà họ cung cấp để đáp ứng yêu cầu dữ liệu. Thông tin này giúp đánh giá lịch sử hiệu suất của các nút oracle, để người dùng có thể lọc ra các nút oracle không đáng tin cậy khi thực hiện yêu cầu dữ liệu. Một ví dụ là [Hệ thống Danh tiếng Thuật toán](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system) của Witnet.
+
+2. Các oracle phi tập trung—như đã được giải thích trước đó—có thể yêu cầu các nút đặt cọc vào độ tin cậy của dữ liệu mà họ cung cấp. Nếu yêu cầu được xác minh, khoản đặt cọc này có thể được hoàn trả cùng với phần thưởng cho dịch vụ trung thực. Tuy nhiên, nó cũng có thể bị cắt giảm nếu thông tin không chính xác, điều này cung cấp một mức độ trách nhiệm nhất định.
+
+## Các ứng dụng của oracle trong hợp đồng thông minh {#applications-of-oracles-in-smart-contracts}
+
+Dưới đây là một số trường hợp sử dụng phổ biến của oracle trong Ethereum:
+
+### Truy xuất dữ liệu tài chính {#retrieving-financial-data}
+
+Các ứng dụng [tài chính phi tập trung](/defi/) (DeFi) cho phép cho vay, đi vay và giao dịch tài sản ngang hàng. Điều này thường đòi hỏi việc thu thập các thông tin tài chính khác nhau, bao gồm dữ liệu tỷ giá hối đoái (để tính toán giá trị fiat của các loại tiền điện tử hoặc so sánh giá token) và dữ liệu thị trường vốn (để tính toán giá trị của các tài sản được token hóa, chẳng hạn như vàng hoặc đô la Mỹ).
+
+Chẳng hạn, một giao thức cho vay DeFi cần truy vấn giá thị trường hiện tại cho các tài sản (ví dụ: ETH) được gửi làm tài sản đảm bảo. Điều này cho phép hợp đồng xác định giá trị của tài sản thế chấp và xác định số tiền mà nó có thể mượn từ hệ thống.
+
+Các "oracle giá" phổ biến (như chúng thường được gọi) trong DeFi bao gồm Nguồn cấp dữ liệu giá của Chainlink, [Nguồn cấp dữ liệu giá mở](https://compound.finance/docs/prices) của Giao thức Compound, [Giá trung bình theo thời gian (TWAP)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) của Uniswap và [Oracle của Maker](https://docs.makerdao.com/smart-contract-modules/oracle-module).
+
+Các nhà phát triển nên hiểu rõ những lưu ý đi kèm với những oracle giá này trước khi tích hợp chúng vào dự án của họ. [Bài viết](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/) này cung cấp một phân tích chi tiết về những gì cần xem xét khi có kế hoạch sử dụng bất kỳ oracle giá nào đã được đề cập.
+
+Dưới đây là một ví dụ về cách bạn có thể truy xuất giá ETH mới nhất trong hợp đồng thông minh của mình bằng cách sử dụng nguồn cấp dữ liệu giá Chainlink:
+
+```solidity
+pragma solidity ^0.6.7;
+
+import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";
+
+contract PriceConsumerV3 {
+
+ AggregatorV3Interface internal priceFeed;
+
+ /**
+ * Mạng: Kovan
+ * Bộ tổng hợp: ETH/USD
+ * Địa chỉ: 0x9326BFA02ADD2366b30bacB125260Af641031331
+ */
+ constructor() public {
+ priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);
+ }
+
+ /**
+ * Trả về giá mới nhất
+ */
+ function getLatestPrice() public view returns (int) {
+ (
+ uint80 roundID,
+ int price,
+ uint startedAt,
+ uint timeStamp,
+ uint80 answeredInRound
+ ) = priceFeed.latestRoundData();
+ return price;
+ }
+}
+```
+
+### Tạo ra sự ngẫu nhiên có thể xác minh {#generating-verifiable-randomness}
+
+Một số ứng dụng blockchain, chẳng hạn như trò chơi dựa trên blockchain hoặc các hình thức xổ số, đòi hỏi mức độ không thể đoán trước và ngẫu nhiên cao để hoạt động hiệu quả. Tuy nhiên, việc thực thi xác định của các chuỗi khối loại bỏ sự ngẫu nhiên.
+
+Cách tiếp cận ban đầu là sử dụng các hàm mã hóa giả ngẫu nhiên, chẳng hạn như `blockhash`, nhưng những hàm này có thể bị [các thợ đào thao túng](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.) giải thuật toán bằng chứng công việc. Ngoài ra, việc Ethereum [chuyển sang bằng chứng cổ phần](/roadmap/merge/) có nghĩa là các nhà phát triển không còn có thể dựa vào `blockhash` cho tính ngẫu nhiên trên chuỗi. [Cơ chế RANDAO](https://eth2book.info/altair/part2/building_blocks/randomness) của Chuỗi Beacon cung cấp một nguồn ngẫu nhiên thay thế.
+
+Có thể tạo ra giá trị ngẫu nhiên ở ngoài chuỗi và gửi nó vào chuỗi, nhưng việc làm như vậy đòi hỏi yêu cầu độ tin cậy cao đối với người dùng. Họ phải tin rằng giá trị được tạo ra thực sự thông qua các cơ chế không thể dự đoán và không bị thay đổi trong quá trình vận chuyển.
+
+Các oracle được thiết kế cho tính toán ngoài chuỗi giải quyết vấn đề này bằng cách tạo ra các kết quả ngẫu nhiên một cách an toàn ngoài chuỗi, sau đó phát sóng lên chuỗi cùng với các bằng chứng mật mã chứng minh tính vô định của quá trình này. Một ví dụ là [Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/) (Hàm ngẫu nhiên có thể xác minh), là một trình tạo số ngẫu nhiên (RNG) công bằng và chống giả mạo có thể chứng minh được, hữu ích cho việc xây dựng các hợp đồng thông minh đáng tin cậy cho các ứng dụng dựa trên các kết quả không thể đoán trước.
+
+### Nhận kết quả cho các sự kiện {#getting-outcomes-for-events}
+
+Với các oracle, việc tạo ra smart contracts để phản ứng với các sự kiện thực tế thật dễ dàng. Dịch vụ Oracle giúp điều này trở nên khả thi bằng cách cho phép hợp đồng kết nối với các API bên ngoài thông qua các thành phần offchain và sử dụng thông tin từ những nguồn dữ liệu đó. Chẳng hạn, ứng dụng dự đoán đã đề cập ở trên có thể yêu cầu một oracle trả về kết quả bầu cử từ một nguồn bên ngoài đáng tin cậy (ví dụ: Associated Press).
+
+Việc sử dụng oracle để thu thập dữ liệu dựa trên các kết quả trong thế giới thực mở ra nhiều trường hợp sử dụng mới; ví dụ, một sản phẩm bảo hiểm phi tập trung cần thông tin chính xác về thời tiết, thiên tai, v.v. để hoạt động hiệu quả.
+
+### Tự động hóa hợp đồng thông minh {#automating-smart-contracts}
+
+Hợp đồng thông minh không tự động thực thi; mà thay vào đó, một tài khoản do bên ngoài sở hữu (EOA) hoặc một tài khoản hợp đồng khác phải kích hoạt các hàm phù hợp để thực hiện mã của hợp đồng. Trong hầu hết các trường hợp, phần lớn các hàm của hợp đồng là công khai và có thể được gọi bởi các EOA và các hợp đồng khác.
+
+Nhưng cũng có những _hàm riêng tư_ trong một hợp đồng mà người khác không thể truy cập;, nhưng chúng lại rất quan trọng đối với chức năng tổng thể của một dapp. Các ví dụ bao gồm một hàm `mintERC721Token()` định kỳ đúc NFT mới cho người dùng, một hàm để trao các khoản thanh toán trong một thị trường dự đoán, hoặc một hàm để mở khóa các token đã đặt cọc trong một DEX.
+
+Các nhà phát triển sẽ cần kích hoạt các chức năng như vậy theo khoảng thời gian nhất định để ứng dụng hoạt động mượt mà. Tuy nhiên, điều này có thể dẫn đến việc mất nhiều giờ cho các nhiệm vụ tầm thường của các nhà phát triển, đó là lý do tại sao tự động hóa việc thực hiện hợp đồng thông minh lại hấp dẫn.
+
+Một số mạng lưới oracle phi tập trung cung cấp dịch vụ tự động hóa, cho phép các nút oracle ngoài chuỗi kích hoạt các chức năng hợp đồng thông minh theo các tham số được xác nhận từ người dùng. Thông thường, điều này yêu cầu "đăng ký" hợp đồng mục tiêu với dịch vụ oracle, cung cấp quỹ để thanh toán cho người vận hành oracle, và chỉ định các điều kiện hoặc thời gian để kích hoạt hợp đồng.
+
+[Mạng Keeper](https://chain.link/keepers) của Chainlink cung cấp các tùy chọn cho các hợp đồng thông minh để thuê ngoài các nhiệm vụ bảo trì thường xuyên theo cách giảm thiểu sự tin cậy và phi tập trung. Đọc [tài liệu chính thức của Keeper](https://docs.chain.link/docs/chainlink-keepers/introduction/) để biết thông tin về việc làm cho hợp đồng của bạn tương thích với Keeper và sử dụng dịch vụ Upkeep.
+
+## Cách sử dụng các oracle chuỗi khối {#use-blockchain-oracles}
+
+Có nhiều ứng dụng oracle mà bạn có thể tích hợp vào dapp Ethereum của mình:
+
+**[Chainlink](https://chain.link/)** - _Các mạng oracle phi tập trung của Chainlink cung cấp các đầu vào, đầu ra và tính toán chống giả mạo để hỗ trợ các hợp đồng thông minh tiên tiến trên bất kỳ chuỗi khối nào._
+
+**[RedStone Oracles](https://redstone.finance/)** - _RedStone là một oracle mô-đun phi tập trung cung cấp các nguồn cấp dữ liệu được tối ưu hóa về gas._ Nó chuyên cung cấp các nguồn cấp dữ liệu giá cho các tài sản mới nổi, chẳng hạn như token đặt cọc thanh khoản (LST), token đặt cọc lại thanh khoản (LRT), và các sản phẩm phái sinh đặt cọc Bitcoin._
+
+**[Chronicle](https://chroniclelabs.org/)** - _Chronicle vượt qua những hạn chế hiện tại của việc chuyển dữ liệu trên chuỗi bằng cách phát triển các oracle thực sự có thể mở rộng, tiết kiệm chi phí, phi tập trung và có thể xác minh._
+
+**[Witnet](https://witnet.io/)** - _Witnet là một oracle không cần cấp phép, phi tập trung và chống kiểm duyệt, giúp các hợp đồng thông minh phản ứng với các sự kiện trong thế giới thực với sự đảm bảo kinh tế-mã hóa mạnh mẽ._
+
+**[UMA Oracle](https://uma.xyz)** - _Oracle lạc quan của UMA cho phép các hợp đồng thông minh nhanh chóng nhận bất kỳ loại dữ liệu nào cho các ứng dụng khác nhau, bao gồm bảo hiểm, các công cụ phái sinh tài chính và thị trường dự đoán._
+
+**[Tellor](https://tellor.io/)** - _Tellor là một giao thức oracle minh bạch và không cần cấp phép để hợp đồng thông minh của bạn có thể dễ dàng lấy bất kỳ dữ liệu nào bất cứ khi nào cần._
+
+**[Band Protocol](https://bandprotocol.com/)** - _Band Protocol là một nền tảng oracle dữ liệu chuỗi chéo, tổng hợp và kết nối dữ liệu thế giới thực và các API với các hợp đồng thông minh._
+
+**[Pyth Network](https://pyth.network/)** - _Mạng Pyth là một mạng oracle tài chính của bên thứ nhất được thiết kế để xuất bản dữ liệu thế giới thực liên tục trên chuỗi trong một môi trường chống giả mạo, phi tập trung và tự duy trì._
+
+**[API3 DAO](https://www.api3.org/)** - _API3 DAO đang cung cấp các giải pháp oracle của bên thứ nhất mang lại sự minh bạch, bảo mật và khả năng mở rộng nguồn lớn hơn trong một giải pháp phi tập trung cho các hợp đồng thông minh_
+
+**[Supra](https://supra.com/)** - Một bộ công cụ tích hợp theo chiều dọc gồm các giải pháp chuỗi chéo liên kết tất cả các chuỗi khối, công khai (L1 và L2) hoặc riêng tư (doanh nghiệp), cung cấp các nguồn cấp dữ liệu giá oracle phi tập trung có thể được sử dụng cho các trường hợp sử dụng trên chuỗi và ngoài chuỗi.
+
+**[Gas Network](https://gas.network/)** - Một nền tảng oracle phân tán cung cấp dữ liệu giá gas theo thời gian thực trên khắp các chuỗi khối. Bằng cách đưa dữ liệu từ các nhà cung cấp dữ liệu giá gas hàng đầu lên chuỗi, Mạng Gas đang giúp thúc đẩy khả năng tương tác. Mạng Gas hỗ trợ dữ liệu cho hơn 35 chuỗi, bao gồm Mạng chính Ethereum và nhiều L2 hàng đầu.
+
+## Đọc thêm {#further-reading}
+
+**Bài viết**
+
+- [Oracle Chuỗi khối là gì?](https://chain.link/education/blockchain-oracles) — _Chainlink_
+- [Oracle Chuỗi khối là gì?](https://medium.com/better-programming/what-is-a-blockchain-oracle-f5ccab8dbd72) — _Patrick Collins_
+- [Oracle phi tập trung: tổng quan toàn diện](https://medium.com/fabric-ventures/decentralised-oracles-a-comprehensive-overview-d3168b9a8841) — _Julien Thevenard_
+- [Triển khai một Oracle Chuỗi khối trên Ethereum](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) – _Pedro Costa_
+- [Tại sao các hợp đồng thông minh không thể thực hiện các lệnh gọi API?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) — _StackExchange_
+- [Vì vậy bạn muốn sử dụng một oracle giá](https://samczsun.com/so-you-want-to-use-a-price-oracle/) — _samczsun_
+
+**Video**
+
+- [Oracle và sự mở rộng tiện ích của chuỗi khối](https://youtu.be/BVUZpWa8vpw) — _Real Vision Finance_
+
+**Hướng dẫn**
+
+- [Cách lấy giá hiện tại của Ethereum trong Solidity](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) — _Chainlink_
+- [Tiêu thụ Dữ liệu Oracle](https://docs.chroniclelabs.org/Developers/tutorials/Remix) — _Chronicle_
+
+**Các dự án mẫu**
+
+- [Dự án khởi đầu Chainlink đầy đủ cho Ethereum trong Solidity](https://github.com/hackbg/chainlink-fullstack) — _HackBG_
diff --git a/public/content/translations/vi/developers/docs/programming-languages/dart/index.md b/public/content/translations/vi/developers/docs/programming-languages/dart/index.md
new file mode 100644
index 00000000000..691a52effbf
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/dart/index.md
@@ -0,0 +1,30 @@
+---
+title: Ethereum cho các nhà phát triển Dart
+description: Tìm hiểu cách phát triển cho Ethereum bằng ngôn ngữ Dart
+lang: vi
+incomplete: true
+---
+
+## Bắt đầu với hợp đồng thông minh và ngôn ngữ Solidity {#getting-started-with-smart-contracts-and-solidity}
+
+## Hướng dẫn {#tutorials}
+
+- [Flutter và Chuỗi khối – Dapp Hello World](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/) sẽ hướng dẫn bạn tất cả các bước để bắt đầu:
+ 1. Viết một hợp đồng thông minh bằng [Solidity](https://soliditylang.org/)
+ 2. Viết một giao diện người dùng bằng Dart
+- [Xây dựng một dapp di động với Flutter](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a) ngắn hơn nhiều, có thể sẽ tốt hơn nếu bạn đã biết những điều cơ bản
+- Nếu bạn thích học bằng cách xem video, bạn có thể xem [Xây dựng ứng dụng Flutter Chuỗi khối đầu tiên của bạn](https://www.youtube.com/watch?v=3Eeh3pJ6PeA), video này dài khoảng một giờ
+- Nếu bạn thiếu kiên nhẫn, bạn có thể thích [Xây dựng một ứng dụng phi tập trung Chuỗi khối bằng Flutter và Dart trên Ethereum](https://www.youtube.com/watch?v=jaMFEOCq_1s), video này chỉ dài khoảng hai mươi phút
+- [Tích hợp MetaMask trong ứng dụng Flutter với Web3Modal của WalletConnect](https://www.youtube.com/watch?v=v_M2buHCpc4) - video ngắn này sẽ hướng dẫn bạn các bước tích hợp MetaMask vào ứng dụng Flutter của bạn bằng thư viện [Web3Modal](https://pub.dev/packages/web3modal_flutter) của WalletConnect
+- [Khóa học Bootcamp cho nhà phát triển chuỗi khối di động với Solidity & Flutter](https://youtube.com/playlist?list=PL4V4Unlk5luhQ26ERO6hWEbcUwHDSSmVH) - danh sách phát khóa học dành cho nhà phát triển chuỗi khối di động full-stack
+
+## Làm việc với các máy khách Ethereum {#working-with-ethereum-clients}
+
+Bạn có thể sử dụng Ethereum để tạo các ứng dụng phi tập trung (hay "dapps") sử dụng các lợi ích của công nghệ tiền mã hóa và chuỗi khối.
+Hiện có ít nhất hai thư viện được duy trì cho Dart để sử dụng [API JSON-RPC](/developers/docs/apis/json-rpc/) cho Ethereum.
+
+1. [Web3dart từ pwa.ir](https://pub.dev/packages/web3dart)
+2. [Ethereum 5.0.0 từ darticulate.com](https://pub.dev/packages/ethereum)
+
+Ngoài ra còn có các thư viện bổ sung cho phép bạn thao tác với các địa chỉ Ethereum cụ thể, hoặc cho phép bạn truy xuất giá của các loại tiền mã hóa khác nhau.
+[Bạn có thể xem danh sách đầy đủ tại đây](https://pub.dev/dart/packages?q=ethereum).
diff --git a/public/content/translations/vi/developers/docs/programming-languages/delphi/index.md b/public/content/translations/vi/developers/docs/programming-languages/delphi/index.md
new file mode 100644
index 00000000000..fd94eb9f951
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/delphi/index.md
@@ -0,0 +1,56 @@
+---
+title: Ethereum cho các nhà phát triển Delphi
+description: Tìm hiểu cách phát triển Ethereum sử dụng ngôn ngữ lập trình Delphi
+lang: vi
+incomplete: true
+---
+
+
+
+Tìm hiểu cách phát triển Ethereum sử dụng ngôn ngữ lập trình Delphi
+
+
+
+Sử dụng Ethereum để tạo các ứng dụng phi tập trung (hay "dapps") sử dụng các lợi ích của công nghệ tiền điện tử và chuỗi khối. Các ứng dụng phi tập trung này có thể đáng tin cậy, có nghĩa là một khi chúng được triển khai lên Ethereum, chúng sẽ luôn chạy như được lập trình. Chúng có thể kiểm soát các tài sản kỹ thuật số để tạo ra những loại ứng dụng tài chính mới. Chúng có thể được phân cấp, có nghĩa là không một thực thể hay người nào kiểm soát chúng và gần như không thể kiểm duyệt.
+
+Xây dựng các ứng dụng phi tập trung trên Ethereum và tương tác với các hợp đồng thông minh bằng ngôn ngữ lập trình Delphi!
+
+## Bắt đầu với hợp đồng thông minh và ngôn ngữ Solidity {#getting-started-with-smart-contracts-and-the-solidity-language}
+
+**Các bước đầu tiên để tích hợp Delphi với Ethereum**
+
+Cần một hướng dẫn cơ bản hơn? Tham khảo [ethereum.org/learn](/learn/) hoặc [ethereum.org/developers](/developers/).
+
+- [Giải thích về Chuỗi khối](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained)
+- [Tìm hiểu về Hợp đồng thông minh](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract)
+- [Viết Hợp đồng thông minh đầu tiên của bạn](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract)
+- [Tìm hiểu cách Biên dịch và Triển khai Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment)
+
+## Tài liệu tham khảo và liên kết cho người mới bắt đầu {#beginner-references-and-links}
+
+**Giới thiệu thư viện Delphereum**
+
+- [Delphereum là gì?](https://github.com/svanas/delphereum/blob/master/README.md)
+- [Kết nối Delphi với một chuỗi khối cục bộ (trong bộ nhớ)](https://medium.com/@svanas/connecting-delphi-to-a-local-in-memory-blockchain-9a1512d6c5b0)
+- [Kết nối Delphi với Mạng chính Ethereum](https://medium.com/@svanas/connecting-delphi-to-the-ethereum-main-net-5faf1feffd83)
+- [Kết nối Delphi với các Hợp đồng thông minh](https://medium.com/@svanas/connecting-delphi-to-smart-contracts-3146b12803a1)
+
+**Bạn muốn bỏ qua thiết lập bây giờ và tiến thẳng đến các mẫu?**
+
+- [Hợp đồng thông minh và Delphi trong 3 phút - Phần 1](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-61d998571d)
+- [Hợp đồng thông minh và Delphi trong 3 phút - Phần 2](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-part-2-446925faa47b)
+
+## Các bài viết trình độ trung cấp {#intermediate-articles}
+
+- [Tạo chữ ký thông điệp đã ký của Ethereum trong Delphi](https://medium.com/@svanas/generating-an-ethereum-signed-message-signature-in-delphi-75661ce5031b)
+- [Chuyển ether bằng Delphi](https://medium.com/@svanas/transferring-ether-with-delphi-b5f24b1a98a4)
+- [Chuyển token ERC-20 bằng Delphi](https://medium.com/@svanas/transferring-erc-20-tokens-with-delphi-bb44c05b295d)
+
+## Các mẫu sử dụng nâng cao {#advanced-use-patterns}
+
+- [Delphi và Dịch vụ Định danh Ethereum (ENS)](https://medium.com/@svanas/delphi-and-ethereum-name-service-ens-4443cd278af7)
+- [QuikNode, Ethereum và Delphi](https://medium.com/@svanas/quiknode-ethereum-and-delphi-f7bfc9671c23)
+- [Delphi và Khu rừng tối Ethereum](https://svanas.medium.com/delphi-and-the-ethereum-dark-forest-5b430da3ad93)
+- [Hoán đổi một token này lấy một token khác trong Delphi](https://svanas.medium.com/swap-one-token-for-another-in-delphi-bcb999c47f7)
+
+Tìm kiếm thêm tài nguyên? Tham khảo [ethereum.org/developers](/developers/).
diff --git a/public/content/translations/vi/developers/docs/programming-languages/dot-net/index.md b/public/content/translations/vi/developers/docs/programming-languages/dot-net/index.md
new file mode 100644
index 00000000000..e55eabd4f14
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/dot-net/index.md
@@ -0,0 +1,86 @@
+---
+title: Ethereum cho nhà phát triển .NET
+description: Tìm hiểu cách phát triển Ethereum bằng cách sử dụng các dự án và công cụ dựa trên cơ sở .NET
+lang: vi
+incomplete: true
+---
+
+Tìm hiểu cách phát triển cho Ethereum bằng các dự án và công cụ dựa trên .NET
+
+Sử dụng Ethereum để tạo các ứng dụng phi tập trung (hay "dapps") sử dụng các lợi ích của công nghệ tiền điện tử và chuỗi khối. Các ứng dụng phi tập trung này có thể đáng tin cậy, có nghĩa là một khi chúng được triển khai lên Ethereum, chúng sẽ luôn chạy như được lập trình. Chúng có thể kiểm soát các tài sản kỹ thuật số để tạo ra những loại ứng dụng tài chính mới. Chúng có thể được phân cấp, có nghĩa là không một thực thể hay người nào kiểm soát chúng và gần như không thể kiểm duyệt.
+
+Xây dựng các ứng dụng phi tập trung trên Ethereum và tương tác với các hợp đồng thông minh bằng các công cụ và ngôn ngữ từ kho công nghệ của Microsoft - Hỗ trợ C#, # Visual Basic .NET, F#, trên các công cụ như VSCode và Visual Studio, trên .NET Framework / .NET Core / .NET Standard. Triển khai chuỗi khối Ethereum trên Azure bằng chuỗi khối Microsoft Azure trong vài phút. Mang tình yêu của .NET đến Ethereum!
+
+## Bắt đầu với hợp đồng thông minh và ngôn ngữ Solidity {#getting-started-with-smart-contracts-and-the-solidity-language}
+
+**Thực hiện các bước đầu tiên để tích hợp .NET với Ethereum**
+
+Cần một hướng dẫn cơ bản hơn? Tham khảo [ethereum.org/learn](/learn/) hoặc [ethereum.org/developers](/developers/).
+
+- [Giải thích về Chuỗi khối](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained)
+- [Tìm hiểu về Hợp đồng thông minh](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract)
+- [Viết Hợp đồng thông minh đầu tiên của bạn](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract)
+- [Tìm hiểu cách Biên dịch và Triển khai Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment)
+
+## Tài liệu tham khảo và liên kết cho người mới bắt đầu {#beginner-references-and-links}
+
+**Giới thiệu thư viện Nethereum và mã VS Solidity**
+
+- [Nethereum, Bắt đầu](https://docs.nethereum.com/en/latest/getting-started/)
+- [Cài đặt Solidity cho VS Code](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity)
+- [Quy trình làm việc của một Nhà phát triển .NET để Tạo và Gọi các Hợp đồng thông minh Ethereum](https://medium.com/coinmonks/a-net-developers-workflow-for-creating-and-calling-ethereum-smart-contracts-44714f191db2)
+- [Tích hợp hợp đồng thông minh với Nethereum](https://kauri.io/#collections/Getting%20Started/smart-contracts-integration-with-nethereum/#smart-contracts-integration-with-nethereumm)
+- [Kết nối các Hợp đồng thông minh chuỗi khối .NET và Ethereum với Nethereum](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), cũng có trong [中文版](https://medium.com/my-blockchain-development-daily-journey/%E4%BD%BF%E7%94%A8nethereum%E9%80%A3%E6%8E%A5-net%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%B6%B2%E5%8D%80%E5%A1%8A%E9%8F%88%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84-4a96d35ad1e1)
+- [Nethereum - Một thư viện tích hợp .NET nguồn mở cho chuỗi khối](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/)
+- [Ghi các Giao dịch Ethereum vào Cơ sở dữ liệu SQL bằng Nethereum](https://medium.com/coinmonks/writing-ethereum-transactions-to-sql-database-using-nethereum-fd94e0e4fa36)
+- [Xem cách triển khai các hợp đồng thông minh Ethereum dễ dàng bằng C# và VisualStudio](https://koukia.ca/deploy-ethereum-smart-contracts-using-c-and-visualstudio-5be188ae928c)
+
+**Bạn muốn bỏ qua thiết lập bây giờ và tiến thẳng đến các mẫu?**
+
+- [Playground](http://playground.nethereum.com/) - Tương tác với Ethereum và tìm hiểu cách sử dụng Nethereum thông qua trình duyệt.
+ - Truy vấn Số dư Tài khoản [C#](http://playground.nethereum.com/csharp/id/1001) [VB.NET](http://playground.nethereum.com/vb/id/2001)
+ - Truy vấn Số dư Hợp đồng thông minh ERC20 [C#](http://playground.nethereum.com/csharp/id/1005) [VB.NET](http://playground.nethereum.com/vb/id/2004)
+ - Chuyển ether đến một Tài khoản [C#](http://playground.nethereum.com/csharp/id/1003) [VB.NET](http://playground.nethereum.com/vb/id/2003)
+ - ... Và nhiều hơn thế!
+
+## Các bài viết trình độ trung cấp {#intermediate-articles}
+
+- [Sổ làm việc/Danh sách mẫu Nethereum](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/)
+- [Triển khai Chuỗi thử nghiệm Phát triển của riêng bạn](https://github.com/Nethereum/Testchains)
+- [Plugin Codegen của VSCode cho Solidity](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/)
+- [Unity và Ethereum: Tại sao và như thế nào](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how)
+- [Tạo API Web ASP.NET Core cho các ứng dụng phi tập trung của Ethereum](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/)
+- [Sử dụng Nethereum Web3 để triển khai Hệ thống Theo dõi Chuỗi Cung ứng](http://blog.pomiager.com/post/using-nethereum-web3-to-implement-a-supply-chain-traking-system4)
+- [Xử lý khối Nethereum](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), với [mẫu C# Playground](http://playground.nethereum.com/csharp/id/1025)
+- [Phát trực tuyến Websocket của Nethereum](https://nethereum.readthedocs.io/en/latest/nethereum-subscriptions-streaming/)
+- [Kaleido và Nethereum](https://kaleido.io/kaleido-and-nethereum/)
+- [Quorum và Nethereum](https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Quorum/README.md)
+
+## Các mẫu sử dụng nâng cao {#advanced-use-patterns}
+
+- [Azure Key Vault và Nethereum](https://github.com/Azure-Samples/bc-community-samples/tree/master/akv-nethereum)
+- [Nethereum.DappHybrid](https://github.com/Nethereum/Nethereum.DappHybrid)
+- [Kiến trúc tham chiếu backend của Ujo Nethereum](https://docs.nethereum.com/en/latest/nethereum-ujo-backend-sample/)
+
+## Các dự án, công cụ .NET và những thứ thú vị khác {#dot-net-projects-tools-and-other-fun-stuff}
+
+- [Sân chơi Nethereum](http://playground.nethereum.com/) - _Biên dịch, tạo và chạy các đoạn mã Nethereum trong trình duyệt_
+- [Nethereum Codegen Blazor](https://github.com/Nethereum/Nethereum.CodeGen.Blazor) - _Trình tạo mã Nethereum với giao diện người dùng trong Blazor_
+- [Nethereum Blazor](https://github.com/Nethereum/NethereumBlazor) - _Một trình khám phá chuỗi khối nhẹ .NET Wasm SPA và ví đơn giản_
+- [Công cụ Quy tắc Nghiệp vụ Wonka](https://docs.nethereum.com/en/latest/wonka/) - _Một công cụ quy tắc nghiệp vụ (cho cả nền tảng .NET và nền tảng Ethereum) vốn được định hướng bởi siêu dữ liệu_
+- [Nethermind](https://github.com/NethermindEth/nethermind) - _Một ứng dụng khách Ethereum .NET Core cho Linux, Windows, MacOS_
+- [eth-utils](https://github.com/ethereum/eth-utils/) - _các hàm tiện ích để làm việc với các codebase liên quan đến Ethereum_
+- [TestChains](https://github.com/Nethereum/TestChains) - _Các chuỗi phát triển .NET được cấu hình sẵn để phản hồi nhanh (PoA)_
+
+Tìm kiếm thêm tài nguyên? Tham khảo [ethereum.org/developers](/developers/).
+
+## Những người đóng góp cho cộng đồng .NET {#dot-net-community-contributors}
+
+Tại Nethereum, chúng tôi chủ yếu sinh hoạt trên [Gitter](https://gitter.im/Nethereum/Nethereum) nơi mọi người đều có thể hỏi/trả lời câu hỏi, nhận trợ giúp hoặc chỉ thư giãn. Hãy thoải mái tạo một PR hoặc mở một vấn đề trên [kho lưu trữ GitHub của Nethereum](https://github.com/Nethereum), hoặc chỉ cần duyệt qua nhiều dự án phụ/mẫu mà chúng tôi có. Bạn cũng có thể tìm thấy chúng tôi trên [Discord](https://discord.gg/jQPrR58FxX)!
+
+Nếu bạn mới sử dụng Nethermind và cần trợ giúp để bắt đầu, hãy tham gia [Discord](http://discord.gg/PaCMRFdvWT) của chúng tôi. Những nhà phát triển của chúng tôi luôn sãn sàng để trả lời câu hỏi của bạn. Đừng ngần ngại mở một PR hoặc nêu bất kỳ vấn đề nào trên [kho lưu trữ GitHub của Nethermind](https://github.com/NethermindEth/nethermind).
+
+## Các danh sách tổng hợp khác {#other-aggregated-lists}
+
+[Trang web chính thức của Nethereum](https://nethereum.com/)
+[Trang web chính thức của Nethermind](https://nethermind.io/)
diff --git a/public/content/translations/vi/developers/docs/programming-languages/elixir/index.md b/public/content/translations/vi/developers/docs/programming-languages/elixir/index.md
new file mode 100644
index 00000000000..71d69229b10
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/elixir/index.md
@@ -0,0 +1,55 @@
+---
+title: Ethereum cho các nhà phát triển Elixir
+description: Tìm hiểu cách phát triển cho Ethereum bằng cách sử dụng các dự án và công cụ dựa trên Elixir.
+lang: vi
+incomplete: false
+---
+
+Tìm hiểu cách phát triển cho Ethereum bằng cách sử dụng các dự án và công cụ dựa trên Elixir.
+
+Sử dụng Ethereum để tạo các ứng dụng phi tập trung (hay "dapps") sử dụng các lợi ích của công nghệ tiền điện tử và chuỗi khối. Các ứng dụng phi tập trung này có thể không cần tin cậy, nghĩa là một khi chúng được triển khai lên Ethereum, chúng sẽ luôn chạy như được lập trình. Chúng có thể kiểm soát các tài sản kỹ thuật số để tạo ra các loại ứng dụng tài chính mới. Chúng có thể được phân cấp, có nghĩa là không một thực thể hay người nào kiểm soát chúng và gần như không thể kiểm duyệt.
+
+## Bắt đầu với hợp đồng thông minh và ngôn ngữ Solidity {#getting-started-with-smart-contracts-and-solidity}
+
+**Thực hiện các bước đầu tiên để tích hợp Elixir với Ethereum**
+
+Cần một hướng dẫn cơ bản hơn? Tham khảo [ethereum.org/learn](/learn/) hoặc [ethereum.org/developers](/developers/).
+
+- [Giải thích về Chuỗi khối](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained)
+- [Tìm hiểu về Hợp đồng thông minh](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract)
+- [Viết Hợp đồng thông minh đầu tiên của bạn](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract)
+- [Tìm hiểu cách Biên dịch và Triển khai Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment)
+
+## Các bài viết cho người mới bắt đầu {#beginner-articles}
+
+- [Cuối cùng cũng hiểu về tài khoản Ethereum](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe)
+- [Ethers — Một thư viện Web3 Ethereum hàng đầu cho Elixir](https://medium.com/@alisinabh/announcing-ethers-a-first-class-ethereum-web3-library-for-elixir-1d64e9409122)
+
+## Các bài viết trình độ trung cấp {#intermediate-articles}
+
+- [Cách ký các giao dịch hợp đồng Ethereum thô bằng Elixir](https://kohlerjp.medium.com/how-to-sign-raw-ethereum-contract-transactions-with-elixir-f8822bcc813b)
+- [Hợp đồng thông minh Ethereum và Elixir](https://medium.com/agile-alpha/ethereum-smart-contracts-and-elixir-c7c4b239ddb4)
+
+## Các dự án và công cụ Elixir {#elixir-projects-and-tools}
+
+### Đang hoạt động {#active}
+
+- [block_keys](https://github.com/ExWeb3/block_keys) - _Triển khai BIP32 & BIP44 trong Elixir (Phân cấp nhiều tài khoản cho các Ví xác định)_
+- [ethereumex](https://github.com/mana-ethereum/ethereumex) - _Máy khách JSON-RPC Elixir cho chuỗi khối Ethereum_
+- [ethers](https://github.com/ExWeb3/elixir_ethers) - _Một thư viện Web3 toàn diện để tương tác với các hợp đồng thông minh trên Ethereum bằng Elixir_
+- [ethers_kms](https://github.com/ExWeb3/elixir_ethers_kms) - _Một thư viện trình ký KMS cho Ethers (ký giao dịch với AWS KMS)_
+- [ex_abi](https://github.com/poanetwork/ex_abi) - _Triển khai trình phân tích cú pháp/bộ giải mã/bộ mã hóa Giao diện nhị phân ứng dụng Ethereum trong Elixir_
+- [ex_keccak](https://github.com/ExWeb3/ex_keccak) - _Thư viện Elixir để tính toán các hàm băm Keccak SHA3-256 bằng NIF được xây dựng từ crate tiny-keccak của Rust_
+- [ex_rlp](https://github.com/mana-ethereum/ex_rlp) - _Triển khai Elixir cho mã hóa RLP (Recursive Length Prefix) của Ethereum_
+
+### Đã lưu trữ / Không còn được bảo trì {#archived--no-longer-maintained}
+
+- [eth](https://hex.pm/packages/eth) - _Các tiện ích Ethereum cho Elixir_
+- [exw3](https://github.com/hswick/exw3) - _Máy khách RPC Ethereum cấp cao cho Elixir_
+- [mana](https://github.com/mana-ethereum/mana) - _Triển khai nút đầy đủ Ethereum được viết bằng Elixir_
+
+Tìm kiếm thêm tài nguyên? Hãy xem [trang chủ dành cho Nhà phát triển của chúng tôi](/developers/).
+
+## Những người đóng góp cho cộng đồng Elixir {#elixir-community-contributors}
+
+[Kênh Slack #ethereum của Elixir](https://elixir-lang.slack.com/archives/C5RPZ3RJL) là nơi có một cộng đồng đang phát triển nhanh chóng và là tài nguyên chuyên dụng cho các cuộc thảo luận về bất kỳ dự án nào ở trên và các chủ đề liên quan.
diff --git a/public/content/translations/vi/developers/docs/programming-languages/golang/index.md b/public/content/translations/vi/developers/docs/programming-languages/golang/index.md
new file mode 100644
index 00000000000..6c783a25d8f
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/golang/index.md
@@ -0,0 +1,84 @@
+---
+title: Ethereum cho nhà phát triển Go
+description: Tìm hiểu cách phát triển Ethereum bằng cách sử dụng các dự án và công cụ dựa trên cơ sở Go
+lang: vi
+incomplete: true
+---
+
+Tìm hiểu cách phát triển Ethereum bằng cách sử dụng các dự án và công cụ dựa trên cơ sở Go
+
+Sử dụng Ethereum để tạo ra các ứng dụng phi tập trung (hay gọi là dapp). Các ứng dụng phi tập trung này có thể đáng tin cậy, có nghĩa là một khi chúng được triển khai lên Ethereum, chúng sẽ luôn chạy như được lập trình. Chúng là phi tập trung, nghĩa là chạy trên một mạng ngang hàng và không có điểm thất bại duy nhất. Không có thực thể hoặc cá nhân nào kiểm soát chúng và chúng gần như không thể kiểm duyệt. Chúng có thể quản lý tài sản kỹ thuật số để tạo ra các loại ứng dụng mới.
+
+## Bắt đầu với hợp đồng thông minh và ngôn ngữ Solidity {#getting-started-with-smart-contracts-and-solidity}
+
+**Thực hiện các bước đầu tiên để tích hợp Go với Ethereum**
+
+Cần một hướng dẫn cơ bản hơn? Tham khảo [ethereum.org/learn](/learn/) hoặc [ethereum.org/developers](/developers/).
+
+- [Giải thích về Chuỗi khối](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained)
+- [Tìm hiểu về Hợp đồng thông minh](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract)
+- [Viết Hợp đồng thông minh đầu tiên của bạn](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract)
+- [Tìm hiểu cách Biên dịch và Triển khai Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment)
+- [Hướng dẫn về Hợp đồng](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial)
+
+## Các bài viết và sách cho người mới bắt đầu {#beginner-articles-and-books}
+
+- [Bắt đầu với Geth](https://medium.com/@tzhenghao/getting-started-with-geth-c1a30b8d6458)
+- [Sử dụng Golang để kết nối với Ethereum](https://www.youtube.com/watch?v=-7uChuO_VzM)
+- [Triển khai Hợp đồng thông minh Ethereum bằng Golang](https://www.youtube.com/watch?v=pytGqQmDslE)
+- [Hướng dẫn từng bước để kiểm tra và triển khai hợp đồng thông minh Ethereum bằng Go](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78)
+- [Sách điện tử: Phát triển Ethereum với Go](https://goethereumbook.org/) - _Phát triển các ứng dụng Ethereum bằng Go_
+
+## Các bài viết và tài liệu cho trình độ trung cấp {#intermediate-articles-and-docs}
+
+- [Tài liệu Go Ethereum](https://geth.ethereum.org/docs/) - _Tài liệu cho Ethereum Golang chính thức_
+- [Hướng dẫn cho lập trình viên Erigon](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) - _Hướng dẫn có hình minh họa bao gồm cây trạng thái, đa bằng chứng và xử lý giao dịch_
+- [Erigon và Ethereum không trạng thái](https://youtu.be/3-Mn7OckSus?t=394) - _Hội nghị Cộng đồng Ethereum 2020 (EthCC 3)_
+- [Erigon: tối ưu hóa các ứng dụng Ethereum](https://www.youtube.com/watch?v=CSpc1vZQW2Q) - _Devcon 4 2018_
+- [Go Ethereum GoDoc](https://godoc.org/github.com/ethereum/go-ethereum)
+- [Tạo một ứng dụng phi tập trung trong Go với Geth](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/creating-a-dapp-in-go-with-geth/)
+- [Làm việc với Mạng riêng tư Ethereum bằng Golang và Geth](https://myhsts.org/tutorial-learn-how-to-work-with-ethereum-private-network-with-golang-with-geth.php)
+- [Kiểm thử đơn vị các hợp đồng Solidity trên Ethereum bằng Go](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281)
+- [Tham khảo nhanh về việc sử dụng Geth như một thư viện](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e)
+
+## Các mẫu sử dụng nâng cao {#advanced-use-patterns}
+
+- [Backend mô phỏng của GETH](https://kauri.io/#collections/An%20ethereum%20test%20toolkit%20in%20Go/the-geth-simulated-backend/#_top)
+- [Các ứng dụng Chuỗi khối dưới dạng Dịch vụ (Blockchain-as-a-Service) sử dụng Ethereum và Quorum](https://blockchain.dcwebmakers.com/blockchain-as-a-service-apps-using-ethereum-and-quorum.html)
+- [Lưu trữ phân tán IPFS và Swarm trong các ứng dụng Chuỗi khối Ethereum](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html)
+- [Các ứng dụng di động: Thư viện và các nút Ethereum Inproc](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes)
+- [Các ứng dụng phi tập trung gốc: Các ràng buộc Go với hợp đồng Ethereum](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts)
+
+## Các dự án và công cụ của Go {#go-projects-and-tools}
+
+- [Geth / Go Ethereum](https://github.com/ethereum/go-ethereum) - _Bản triển khai chính thức bằng Go của giao thức Ethereum_
+- [Phân tích mã nguồn Go Ethereum](https://github.com/ZtesoftCS/go-ethereum-code-analysis) - _Xem xét và phân tích mã nguồn Go Ethereum_
+- [Erigon](https://github.com/ledgerwatch/erigon) - _Một phái sinh nhanh hơn của Go Ethereum, tập trung vào các nút lưu trữ_
+- [Golem](https://github.com/golemfactory/golem) - _Golem đang tạo ra một thị trường toàn cầu cho sức mạnh tính toán_
+- [Quorum](https://github.com/jpmorganchase/quorum) - _Một bản triển khai được cấp phép của Ethereum, hỗ trợ quyền riêng tư dữ liệu_
+- [Lăng kính (Prysm)](https://github.com/prysmaticlabs/prysm) - _Bản triển khai bằng Go của Ethereum 'Serenity' 2.0_
+- [Eth Tweet](https://github.com/yep/eth-tweet) - _Twitter phi tập trung: Một dịch vụ tiểu blog chạy trên chuỗi khối Ethereum_
+- [Plasma MVP Golang](https://github.com/kyokan/plasma) — _Bản triển khai và mở rộng bằng Golang của đặc tả Plasma khả thi tối thiểu_
+- [Bể đào Ethereum mã nguồn mở](https://github.com/sammy007/open-ethereum-pool) - _Một bể đào Ethereum mã nguồn mở_
+- [Ví HD Ethereum](https://github.com/miguelmota/go-ethereum-hdwallet) - _Các dẫn xuất ví HD Ethereum trong Go_
+- [Multi Geth](https://github.com/multi-geth/multi-geth) - _Hỗ trợ nhiều loại mạng Ethereum_
+- [Ứng dụng Geth phiên bản nhẹ](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) - _Bản triển khai Geth của Giao thức con Ethereum phiên bản nhẹ_
+- [SDK Ethereum Golang](https://github.com/everFinance/goether) - _Một bản triển khai ví Ethereum đơn giản và các tiện ích trong Golang_
+- [SDK Covalent Golang](https://github.com/covalenthq/covalent-api-sdk-go) - _Truy cập dữ liệu chuỗi khối hiệu quả thông qua SDK Go cho hơn 200 chuỗi khối_
+
+Tìm kiếm thêm tài nguyên? Tham khảo [ethereum.org/developers](/developers/)
+
+## Những người đóng góp cho cộng đồng Go {#go-community-contributors}
+
+- [Geth Discord](https://discordapp.com/invite/nthXNEv)
+- [Geth Gitter](https://gitter.im/ethereum/go-ethereum)
+- [Gophers Slack](https://invite.slack.golangbridge.org/) - [kênh #ethereum](https://gophers.slack.com/messages/C9HP1S9V2)
+- [StackExchange - Ethereum](https://ethereum.stackexchange.com/)
+- [Multi Geth Gitter](https://gitter.im/ethoxy/multi-geth)
+- [Ethereum Gitter](https://gitter.im/ethereum/home)
+- [Gitter cho Ứng dụng Geth phiên bản nhẹ](https://gitter.im/ethereum/light-client)
+
+## Các danh sách tổng hợp khác {#other-aggregated-lists}
+
+- [Awesome Ethereum](https://github.com/btomashvili/awesome-ethereum)
+- [Consensys: Danh sách đầy đủ các công cụ dành cho nhà phát triển Ethereum](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [Nguồn trên GitHub](https://github.com/ConsenSys/ethereum-developer-tools-list)
diff --git a/public/content/translations/vi/developers/docs/programming-languages/index.md b/public/content/translations/vi/developers/docs/programming-languages/index.md
new file mode 100644
index 00000000000..7e60650e1ee
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/index.md
@@ -0,0 +1,32 @@
+---
+title: Ngôn ngữ lập trình
+description: Khám phá các tài nguyên phát triển Ethereum cho các ngôn ngữ lập trình khác nhau bao gồm JavaScript, Python, Go, Rust, và nhiều hơn nữa.
+lang: vi
+---
+
+Một quan niệm sai lầm phổ biến là các nhà phát triển phải viết [hợp đồng thông minh](/developers/docs/smart-contracts/) để xây dựng trên Ethereum. Điều này không đúng.
+Một trong những điểm tuyệt vời của mạng lưới và cộng đồng Ethereum là bạn có thể [tham gia](/community/) bằng gần như bất kỳ ngôn ngữ lập trình nào.
+
+Ethereum và cộng đồng Ethereum ủng hộ mã nguồn mở. Bạn có thể tìm thấy các dự án cộng đồng - tích hợp client, APIs, phát triển framwork, kiểm tra công cụ - trong một loạt các ngôn ngữ khác nhau.
+
+## Chọn ngôn ngữ của bạn {#data}
+
+Chọn ngôn ngữ lập trình của bạn và tìm các dự án, Tài liệu,và các cộng đồng ảo:
+
+- [Ethereum cho các nhà phát triển Dart](/developers/docs/programming-languages/dart/)
+- [Ethereum cho các nhà phát triển Delphi](/developers/docs/programming-languages/delphi/)
+- [Ethereum cho các nhà phát triển .NET](/developers/docs/programming-languages/dot-net/)
+- [Ethereum cho các nhà phát triển Elixir](/developers/docs/programming-languages/elixir/)
+- [Ethereum cho các nhà phát triển Go](/developers/docs/programming-languages/golang/)
+- [Ethereum cho các nhà phát triển Java](/developers/docs/programming-languages/java/)
+- [Ethereum cho các nhà phát triển JavaScript](/developers/docs/programming-languages/javascript/)
+- [Ethereum cho các nhà phát triển Python](/developers/docs/programming-languages/python/)
+- [Ethereum cho các nhà phát triển Ruby](/developers/docs/programming-languages/ruby/)
+- [Ethereum cho các nhà phát triển Rust](/developers/docs/programming-languages/rust/)
+
+### Sẽ thế nào nếu ngôn ngữ của tôi không được hỗ trợ {#other-lang}
+
+Nếu bạn muốn liên kết đến các tài nguyên hoặc giới thiệu một cộng đồng ảo cho một ngôn ngữ lập trình bổ sung, bạn có thể yêu cầu một trang mới bằng cách [mở một vấn đề](https://github.com/ethereum/ethereum-org-website/issues/new/choose).
+
+Nếu bạn chỉ muốn viết mã để tương tác với chuỗi khối bằng một ngôn ngữ hiện không được hỗ trợ
+bạn có thể sử dụng [giao diện JSON-RPC](/developers/docs/apis/json-rpc/) để kết nối với mạng lưới Ethereum. Bất kỳ ngôn ngữ lập trình nào sử dụng TCP/IP đề có thể sử dụng giao diện này.
diff --git a/public/content/translations/vi/developers/docs/programming-languages/java/index.md b/public/content/translations/vi/developers/docs/programming-languages/java/index.md
new file mode 100644
index 00000000000..2a9a419aae8
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/java/index.md
@@ -0,0 +1,64 @@
+---
+title: Ethereum cho nhà phát triển Java
+description: Tìm hiểu cách phát triển Ethereum bằng cách sử dụng các dự án và công cụ dựa trên cơ sở Java
+lang: vi
+incomplete: true
+---
+
+Tìm hiểu cách phát triển cho Ethereum bằng các dự án và công cụ dựa trên Java
+
+Sử dụng Ethereum để tạo các ứng dụng phi tập trung (hay "dapps") sử dụng các lợi ích của công nghệ tiền điện tử và chuỗi khối. Các ứng dụng phi tập trung này có thể đáng tin cậy, có nghĩa là một khi chúng được triển khai lên Ethereum, chúng sẽ luôn chạy như được lập trình. Chúng có thể kiểm soát các tài sản kỹ thuật số để tạo ra những loại ứng dụng tài chính mới. Chúng có thể được phân cấp, có nghĩa là không một thực thể hay người nào kiểm soát chúng và gần như không thể kiểm duyệt.
+
+## Bắt đầu với hợp đồng thông minh và ngôn ngữ Solidity {#getting-started-with-smart-contracts-and-solidity}
+
+**Thực hiện các bước đầu tiên để tích hợp Java với Ethereum**
+
+Cần một hướng dẫn cơ bản hơn? Hãy xem [ethereum.org/learn](/learn/) hoặc [ethereum.org/developers.](/developers/)
+
+- [Giải thích về Chuỗi khối](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained)
+- [Tìm hiểu về Hợp đồng thông minh](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract)
+- [Viết Hợp đồng thông minh đầu tiên của bạn](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract)
+- [Tìm hiểu cách Biên dịch và Triển khai Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment)
+
+## Làm việc với các máy khách Ethereum {#working-with-ethereum-clients}
+
+Tìm hiểu cách sử dụng [Web3J](https://github.com/web3j/web3j) và Hyperledger Besu, hai trình khách Java Ethereum hàng đầu
+
+- [Kết nối với một trình khách Ethereum bằng Java, Eclipse và Web3J](https://kauri.io/article/b9eb647c47a546bc95693acc0be72546/connecting-to-an-ethereum-client-with-java-eclipse-and-web3j)
+- [Quản lý tài khoản Ethereum bằng Java và Web3j](https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3j)
+- [Tạo trình bao bọc Java từ Hợp đồng thông minh của bạn](https://kauri.io/article/84475132317d4d6a84a2c42eb9348e4b/generate-a-java-wrapper-from-your-smart-contract)
+- [Tương tác với một Hợp đồng thông minh Ethereum](https://kauri.io/article/14dc434d11ef4ee18bf7d57f079e246e/interacting-with-an-ethereum-smart-contract-in-java)
+- [Lắng nghe các Sự kiện Hợp đồng thông minh Ethereum](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java)
+- [Sử dụng Besu (Pantheon), trình khách Java Ethereum với Linux](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux)
+- [Chạy nút Hyperledger Besu (Pantheon) trong các bài kiểm tra tích hợp Java](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests)
+- [Bảng tóm tắt Web3j](https://kauri.io/web3j-cheat-sheet-\(java-ethereum\)/5dfa1ea941ac3d0001ce1d90/c)
+
+Tìm hiểu cách sử dụng [ethers-kt](https://github.com/Kr1ptal/ethers-kt), một thư viện Kotlin không đồng bộ, hiệu năng cao để tương tác với các chuỗi khối dựa trên EVM. Nhắm mục tiêu các nền tảng JVM và Android.
+
+- [Chuyển token ERC20](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/abi/TransferERC20.kt)
+- [Hoán đổi UniswapV2 với tính năng lắng nghe sự kiện](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/tokenswapwitheventlistening/TokenSwapWithEventListening.kt)
+- [Trình theo dõi số dư ETH / ERC20](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/balancetracker/BalanceTracker.kt)
+
+## Các bài viết trình độ trung cấp {#intermediate-articles}
+
+- [Quản lý lưu trữ trong ứng dụng Java với IPFS](https://kauri.io/article/3e8494f4f56f48c4bb77f1f925c6d926/managing-storage-in-a-java-application-with-ipfs)
+- [Quản lý token ERC20 trong Java với Web3j](https://kauri.io/article/d13e911bbf624108b1d5718175a5e0a0/manage-erc20-tokens-in-java-with-web3j)
+- [Trình quản lý Giao dịch Web3j](https://kauri.io/article/4cb780bb4d0846438d11885a25b6d7e7/web3j-transaction-managers)
+
+## Các mẫu sử dụng nâng cao {#advanced-use-patterns}
+
+- [Sử dụng Eventeum để xây dựng bộ đệm dữ liệu hợp đồng thông minh Java](https://kauri.io/article/fe81ee9612eb4e5a9ab72790ef24283d/using-eventeum-to-build-a-java-smart-contract-data-cache)
+
+## Các dự án và công cụ Java {#java-projects-and-tools}
+
+- [Web3J (Thư viện để tương tác với các trình khách Ethereum)](https://github.com/web3j/web3j)
+- [ethers-kt (Thư viện Kotlin/Java/Android không đồng bộ, hiệu năng cao cho các chuỗi khối dựa trên EVM.)](https://github.com/Kr1ptal/ethers-kt)
+- [Eventeum (Trình lắng nghe sự kiện)](https://github.com/ConsenSys/eventeum)
+- [Mahuta (Công cụ phát triển IPFS)](https://github.com/ConsenSys/mahuta)
+
+Tìm kiếm thêm tài nguyên? Hãy xem tại [ethereum.org/developers.](/developers/)
+
+## Những người đóng góp cho cộng đồng Java {#java-community-contributors}
+
+- [IO Builders](https://io.builders)
+- [Kauri](https://kauri.io)
diff --git a/public/content/translations/vi/developers/docs/programming-languages/javascript/index.md b/public/content/translations/vi/developers/docs/programming-languages/javascript/index.md
new file mode 100644
index 00000000000..03e16be59b7
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/javascript/index.md
@@ -0,0 +1,72 @@
+---
+title: Ethereum cho nhà phát triển JavaScript
+description: Tìm hiểu cách phát triển Ethereum bằng cách sử dụng các dự án và công cụ dựa trên cơ sở JavaScript.
+lang: vi
+---
+
+Java script là một ngôn ngữ nổi tiếng trong mạng lưới Ethereum. Trên thực tế, có một [nhóm](https://github.com/ethereumjs) chuyên mang càng nhiều thành phần của Ethereum sang JavaScript càng tốt.
+
+Có nhiều cơ hội để viết JavaScript (hoặc một ngôn ngữ tương tự) ở [tất cả các cấp độ của ngăn xếp](/developers/docs/ethereum-stack/).
+
+## Tương tác với Ethereum {#interact-with-ethereum}
+
+### Thư viện API JavaScript {#javascript-api-libraries}
+
+Nếu bạn muốn viết JavaScript để truy vấn chuỗi khối, gửi giao dịch và hơn thế nữa, cách thuận tiện nhất để làm điều này là sử dụng [thư viện API JavaScript](/developers/docs/apis/javascript/). Các API này cho phép các nhà phát triển dễ dàng tương tác với các [nút trong mạng Ethereum](/developers/docs/nodes-and-clients/).
+
+Bạn có thể sử dụng những thư viện này để tương tác với hợp đồng thông minh trên Ethereum, vì vậy có thể xây dựng một ứng dụng phi tập trung dapp mà bạn chỉ cần sử dụng JavaScript để tương tác với các hợp đồng đã tồn tại.
+
+**Hãy xem qua**
+
+- [Web3.js](https://web3js.readthedocs.io)
+- [Ethers.js](https://ethers.org) – _bao gồm việc triển khai ví Ethereum và các tiện ích trong JavaScript và TypeScript._
+- [viem](https://viem.sh) – _một Giao diện TypeScript cho Ethereum, cung cấp các yếu tố nguyên thuỷ không trạng thái cấp thấp để tương tác với Ethereum._
+- [Drift](https://ryangoree.github.io/drift/) – _một siêu thư viện TypeScript với bộ nhớ đệm, hook và các bản mô phỏng thử nghiệm tích hợp sẵn để phát triển Ethereum một cách dễ dàng trên các thư viện web3._
+
+### Hợp đồng thông minh {#smart-contracts}
+
+Nếu bạn là một nhà phát triển JavaScript và muốn tự viết hợp đồng thông minh, bạn có thể muốn làm quen với [Solidity](https://solidity.readthedocs.io). Đây là ngôn ngữ hợp đồng thông minh phổ biến nhất và nó có cú pháp giống với JavaScript, điều này có thể giúp việc học trở nên dễ dàng hơn.
+
+Thông tin thêm về [hợp đồng thông minh](/developers/docs/smart-contracts/).
+
+## Tìm hiểu về giao thức {#understand-the-protocol}
+
+### Máy ảo Ethereum {#the-ethereum-virtual-machine}
+
+Có một bản triển khai JavaScript của [máy ảo Ethereum](/developers/docs/evm/). Nó hỗ trợ các quy tắc fork mới nhất. Quy tắc phân nhánh đề cập đến những thay đổi được thực hiện đối với EVM do kết quả của các nâng cấp theo kế hoạch.
+
+Nó được chia thành nhiều gói JavaScript khác nhau mà bạn có thể xem qua để hiểu rõ hơn:
+
+- Tài khoản
+- Khối
+- Chuỗi khối tự nó
+- Các giao dịch
+- Thêm nữa...
+
+Điều này sẽ giúp bạn hiểu những thứ như "cấu trúc dữ liệu của một tài khoản là gì?".
+
+Nếu bạn thích đọc mã, đoạn mã JavaScript này có thể là một sự thay thế tuyệt vời cho việc đọc tài liệu của chúng tôi.
+
+**Hãy xem qua EVM**
+[`@ethereumjs/evm`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/evm)
+
+### Nút và máy khách {#nodes-and-clients}
+
+Một client Ethereumjs đang được phát triển tích cực cho phép bạn đào sâu vào cách các client Ethereum hoạt động bằng một ngôn ngữ bạn hiểu; JavaScript!
+
+**Hãy xem qua máy khách**
+[`@ethereumjs/client`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/client)
+
+## Các dự án khác {#other-projects}
+
+Ngoài ra còn có rất nhiều điều hoạt động khác đang diễn ra trong lĩnh vực Ethereum JavaScript, bao gồm:
+
+- các thư viện tiện ích ví.
+- các công cụ để tạo, nhập và xuất khoá Ethereum.
+- một bản triển khai của `merkle-patricia-tree` – một cấu trúc dữ liệu được nêu trong sách vàng Ethereum.
+
+Tìm hiểu sâu hơn về bất cứ điều gì bạn quan tâm nhất tại [repo EthereumJS](https://github.com/ethereumjs)
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/programming-languages/python/index.md b/public/content/translations/vi/developers/docs/programming-languages/python/index.md
new file mode 100644
index 00000000000..40754e74551
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/python/index.md
@@ -0,0 +1,99 @@
+---
+title: Ethereum cho nhà phát triển Python
+description: Tìm hiểu cách phát triển Ethereum bằng cách sử dụng các dự án và công cụ dựa trên cơ sở Python
+lang: vi
+incomplete: true
+---
+
+Tìm hiểu cách phát triển cho Ethereum bằng các dự án và công cụ dựa trên Python
+
+Sử dụng Ethereum để tạo các ứng dụng phi tập trung (hay "dapps") sử dụng các lợi ích của công nghệ tiền điện tử và chuỗi khối. Các ứng dụng phi tập trung này có thể đáng tin cậy, có nghĩa là một khi chúng được triển khai lên Ethereum, chúng sẽ luôn chạy như được lập trình. Chúng có thể kiểm soát các tài sản kỹ thuật số để tạo ra những loại ứng dụng tài chính mới. Chúng có thể được phân cấp, có nghĩa là không một thực thể hay người nào kiểm soát chúng và gần như không thể kiểm duyệt.
+
+## Bắt đầu với hợp đồng thông minh và ngôn ngữ Solidity {#getting-started-with-smart-contracts-and-solidity}
+
+**Thực hiện các bước đầu tiên để tích hợp Python với Ethereum**
+
+Cần một hướng dẫn cơ bản hơn? Tham khảo [ethereum.org/learn](/learn/) hoặc [ethereum.org/developers](/developers/).
+
+- [Giải thích về Chuỗi khối](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained)
+- [Tìm hiểu về Hợp đồng thông minh](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract)
+- [Viết Hợp đồng thông minh đầu tiên của bạn](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract)
+- [Tìm hiểu cách Biên dịch và Triển khai Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment)
+- [Báo cáo tình hình của Python trong chuỗi khối năm 2023](https://tradingstrategy.ai/blog/the-state-of-python-in-blockchain-in-2023)
+
+## Các bài viết cho người mới bắt đầu {#beginner-articles}
+
+- [Tổng quan về web3.py](https://web3py.readthedocs.io/en/latest/overview.html)
+- [Tham quan Hệ sinh thái Python của Ethereum](https://snakecharmers.ethereum.org/python-ecosystem/)
+- [Hướng dẫn về Ethereum dành cho Nhà phát triển (Python)](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/)
+- [Xứng đáng nhận giải: Hướng dẫn Hackathon Python trên Ethereum](https://snakecharmers.ethereum.org/prize-worthy/)
+- [Giới thiệu về Hợp đồng thông minh với Vyper](https://kauri.io/#collections/Getting%20Started/an-introduction-to-smart-contracts-with-vyper/)
+- [Làm thế nào để phát triển hợp đồng Ethereum bằng Python Flask?](https://medium.com/coinmonks/how-to-develop-ethereum-contract-using-python-flask-9758fe65976e)
+- [Giới thiệu về Web3.py · Ethereum cho các Nhà phát triển Python](https://www.dappuniversity.com/articles/web3-py-intro)
+- [Cách gọi một hàm Hợp đồng thông minh bằng Python và web3.py](https://stackoverflow.com/questions/57580702/how-to-call-a-smart-contract-function-using-python-and-web3-py)
+
+## Các bài viết trình độ trung cấp {#intermediate-articles}
+
+- [Những người bạn của web3.py: Giới thiệu về Ape](https://snakecharmers.ethereum.org/intro-to-ape/)
+- [Phát triển ứng dụng phi tập trung cho Lập trình viên Python](https://levelup.gitconnected.com/dapps-development-for-python-developers-f52b32b54f28)
+- [Tạo Giao diện Ethereum bằng Python: Phần 1](https://hackernoon.com/creating-a-python-ethereum-interface-part-1-4d2e47ea0f4d)
+- [Hợp đồng thông minh Ethereum bằng Python: hướng dẫn toàn diện (phần nào)](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988)
+
+## Các mẫu sử dụng nâng cao {#advanced-use-patterns}
+
+- [Các mẫu web3.py: Đăng ký Sự kiện theo thời gian thực](https://snakecharmers.ethereum.org/subscriptions/)
+- [Các mẫu web3.py: WebSocketProvider](https://snakecharmers.ethereum.org/websocketprovider/)
+- [Biên dịch, triển khai và gọi hợp đồng thông minh Ethereum bằng Python](https://yohanes.gultom.id/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/)
+- [Phân tích Hợp đồng thông minh Solidity bằng Slither](https://kauri.io/#collections/DevOps/analyze-solidity-smart-contracts-with-slither/#analyze-solidity-smart-contracts-with-slither)
+- [Hướng dẫn Fintech trên Chuỗi khối: Cho vay và Vay mượn bằng Python](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/)
+
+## Bài viết được lưu trữ
+
+- [Triển khai token ERC20 của riêng bạn bằng Python và Brownie](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58)
+- [Sử dụng Brownie và Python để triển khai Hợp đồng thông minh](https://dev.to/patrickalphac/using-brownie-for-to-deploy-smart-contracts-1kkp)
+- [Tạo NFT trên OpenSea bằng Brownie](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/)
+
+## Các dự án và công cụ Python {#python-projects-and-tools}
+
+### Đang hoạt động: {#active}
+
+- [Web3.py](https://github.com/ethereum/web3.py) - _Thư viện Python để tương tác với Ethereum_
+- [Vyper](https://github.com/ethereum/vyper/) - _Ngôn ngữ Hợp đồng thông minh theo phong cách Python cho EVM_
+- [Ape](https://github.com/ApeWorX/ape) - _Công cụ phát triển hợp đồng thông minh cho các Pythonista, Nhà khoa học dữ liệu và Chuyên gia bảo mật_
+- [py-evm](https://github.com/ethereum/py-evm) - _triển khai máy ảo Ethereum_
+- [eth-tester](https://github.com/ethereum/eth-tester) - _công cụ để kiểm thử các ứng dụng dựa trên Ethereum_
+- [eth-utils](https://github.com/ethereum/eth-utils/) - _các hàm tiện ích để làm việc với các codebase liên quan đến Ethereum_
+- [py-solc-x](https://pypi.org/project/py-solc-x/) - _Trình bao bọc Python xung quanh trình biên dịch solc solidity với hỗ trợ phiên bản 0.5.x_
+- [pymaker](https://github.com/makerdao/pymaker) - _API Python cho các hợp đồng Maker_
+- [siwe](https://github.com/signinwithethereum/siwe-py) - _Đăng nhập bằng Ethereum (siwe) cho Python_
+- [Web3 DeFi cho các tích hợp Ethereum](https://github.com/tradingstrategy-ai/web3-ethereum-defi) - _Một gói Python với các tích hợp sẵn sàng cho ERC-20, Uniswap và các dự án phổ biến khác_
+- [Wake](https://getwake.io) - _Framework Python tất cả trong một để kiểm thử hợp đồng, fuzzing, triển khai, quét lỗ hổng và điều hướng mã (máy chủ ngôn ngữ - [Công cụ cho Solidity](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity))_
+
+### Đã lưu trữ / Không còn được bảo trì: {#archived--no-longer-maintained}
+
+- [Trinity](https://github.com/ethereum/trinity) - _Máy khách Python của Ethereum_
+- [Mamba](https://github.com/arjunaskykok/mamba) - _framework để viết, biên dịch và triển khai các hợp đồng thông minh được viết bằng ngôn ngữ Vyper_
+- [Brownie](https://github.com/eth-brownie/brownie) - _Framework Python để triển khai, kiểm thử và tương tác với các hợp đồng thông minh Ethereum_
+- [pydevp2p](https://github.com/ethereum/pydevp2p) - _triển khai ngăn xếp P2P của Ethereum_
+- [py-wasm](https://github.com/ethereum/py-wasm) - _Triển khai trình thông dịch web assembly bằng Python_
+
+Tìm kiếm thêm tài nguyên? Tham khảo [ethereum.org/developers](/developers/).
+
+## Các dự án sử dụng bộ công cụ Python {#projects-using-python-tooling}
+
+Các dự án dựa trên Ethereum sau đây sử dụng các công cụ được đề cập ở trang này. Code và thực tiễn tối ưu.
+
+- [Yearn Finance](https://yearn.finance/) và [kho lưu trữ Hợp đồng Kho bạc Yearn](https://github.com/yearn/yearn-vaults)
+- [Curve](https://www.curve.finance/) và [kho lưu trữ hợp đồng thông minh Curve](https://github.com/curvefi/curve-contract)
+- [BadgerDAO](https://badger.com/) và [các hợp đồng thông minh sử dụng chuỗi công cụ Brownie](https://github.com/Badger-Finance/badger-system)
+- [Sushi](https://sushi.com/) sử dụng Python trong việc quản lý và triển khai các hợp đồng vesting của họ](https://github.com/sushiswap/sushi-vesting-protocols)
+- [Alpha Finance](https://alphafinance.io/), nổi tiếng với Alpha Homora, sử dụng [Brownie để kiểm thử và triển khai các hợp đồng thông minh](https://github.com/AlphaFinanceLab/alpha-staking-contract)
+
+## Thảo luận của Cộng đồng Python {#python-community-contributors}
+
+- [Discord Cộng đồng Ethereum Python](https://discord.gg/9zk7snTfWe) để thảo luận về Web3.py và các framework Python khác
+- [Discord của Vyper](https://discord.gg/SdvKC79cJk) để thảo luận về lập trình hợp đồng thông minh Vyper
+
+## Các danh sách tổng hợp khác {#other-aggregated-lists}
+
+Wiki của Vyper có một [danh sách tài nguyên đáng kinh ngạc cho Vyper](https://github.com/vyperlang/vyper/wiki/Vyper-tools-and-resources)
\ No newline at end of file
diff --git a/public/content/translations/vi/developers/docs/programming-languages/ruby/index.md b/public/content/translations/vi/developers/docs/programming-languages/ruby/index.md
new file mode 100644
index 00000000000..2abb2887fec
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/ruby/index.md
@@ -0,0 +1,60 @@
+---
+title: Ethereum cho các nhà phát triển Ruby
+description: Tìm hiểu cách phát triển cho Ethereum bằng cách sử dụng các dự án và công cụ dựa trên Ruby.
+lang: vi
+incomplete: false
+---
+
+Tìm hiểu cách phát triển cho Ethereum bằng cách sử dụng các dự án và công cụ dựa trên Ruby.
+
+Sử dụng Ethereum để tạo các ứng dụng phi tập trung (hay "dapps") sử dụng các lợi ích của công nghệ tiền điện tử và chuỗi khối. Các ứng dụng phi tập trung này có thể không cần tin cậy, nghĩa là một khi chúng được triển khai lên Ethereum, chúng sẽ luôn chạy như được lập trình. Chúng có thể kiểm soát các tài sản kỹ thuật số để tạo ra các loại ứng dụng tài chính mới. Chúng có thể được phân cấp, có nghĩa là không một thực thể hay người nào kiểm soát chúng và gần như không thể kiểm duyệt.
+
+## Bắt đầu với hợp đồng thông minh và ngôn ngữ Solidity {#getting-started-with-smart-contracts-and-solidity}
+
+**Thực hiện các bước đầu tiên để tích hợp Ruby với Ethereum**
+
+Cần một hướng dẫn cơ bản hơn? Tham khảo [ethereum.org/learn](/learn/) hoặc [ethereum.org/developers](/developers/).
+
+- [Giải thích về Chuỗi khối](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained)
+- [Tìm hiểu về Hợp đồng thông minh](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract)
+- [Viết Hợp đồng thông minh đầu tiên của bạn](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract)
+- [Tìm hiểu cách Biên dịch và Triển khai Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment)
+
+## Các bài viết cho người mới bắt đầu {#beginner-articles}
+
+- [Cuối cùng cũng hiểu về tài khoản Ethereum](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe)
+- [Cuối cùng là xác thực người dùng Rails bằng MetaMask](https://dev.to/q9/finally-authenticating-rails-users-with-metamask-3fj)
+- [Cách kết nối với mạng Ethereum bằng Ruby](https://www.quicknode.com/guides/web3-sdks/how-to-connect-to-the-ethereum-network-using-ruby)
+- [Cách tạo địa chỉ Ethereum mới trong Ruby](https://www.quicknode.com/guides/web3-sdks/how-to-generate-a-new-ethereum-address-in-ruby)
+
+## Các bài viết trình độ trung cấp {#intermediate-articles}
+
+- [Ứng dụng chuỗi khối với Ruby](https://www.nopio.com/blog/blockchain-app-ruby/)
+- [Sử dụng Ruby, được kết nối với Ethereum, để thực thi Hợp đồng thông minh](https://titanwolf.org/Network/Articles/Article?AID=87285822-9b25-49d5-ba2a-7ad95fff7ef9)
+
+## Các dự án và công cụ Ruby {#ruby-projects-and-tools}
+
+### Đang hoạt động {#active}
+
+- [eth.rb](https://github.com/q9f/eth.rb) - _Thư viện Ruby và máy khách RPC để xử lý các tài khoản, thông điệp và giao dịch Ethereum_
+- [keccak.rb](https://github.com/q9f/keccak.rb) - _Hàm băm Keccak (SHA3) được Ethereum sử dụng_
+- [siwe-ruby](https://github.com/signinwithethereum/siwe-ruby) - _Triển khai bằng Ruby của tính năng Đăng nhập bằng Ethereum_
+- [siwe-rails](https://github.com/signinwithethereum/siwe-rails) - _Gem của Rails bổ sung các tuyến đăng nhập cục bộ SIWE_
+- [siwe-rails-examples](https://github.com/signinwithethereum/siwe-rails-examples) - _Ví dụ về SIWE sử dụng Ruby on Rails với bộ điều khiển tùy chỉnh_
+- [omniauth-siwe](https://github.com/signinwithethereum/omniauth-siwe) - _Chiến lược OmniAuth cho tính năng Đăng nhập bằng Ethereum (SIWE)_
+- [omniauth-nft](https://github.com/valthon/omniauth-nft) - _Chiến lược OmniAuth để xác thực thông qua quyền sở hữu NFT_
+- [ethereum-on-rails](https://github.com/q9f/ethereum-on-rails) - _Mẫu Ethereum trên Rails cho phép kết nối MetaMask với Ruby on Rails_
+
+### Đã lưu trữ / Không còn được bảo trì {#archived--no-longer-maintained}
+
+- [web3-eth](https://github.com/spikewilliams/vtada-ethereum) - _Gọi các phương thức RPC của nút Ethereum bằng Ruby_
+- [ethereum_tree](https://github.com/longhoangwkm/ethereum_tree) - _Thư viện Ruby để tạo các địa chỉ ETH từ một ví xác định phân cấp theo tiêu chuẩn BIP32_
+- [etherlite](https://github.com/budacom/etherlite) - _Tích hợp Ethereum cho Ruby on Rails_
+- [ethereum.rb](https://github.com/EthWorks/ethereum.rb) - _Máy khách Ethereum của Ruby sử dụng giao diện JSON-RPC để gửi giao dịch, tạo và tương tác với các hợp đồng cũng như là bộ công cụ hữu ích để làm việc với nút Ethereum_
+- [omniauth-ethereum.rb](https://github.com/q9f/omniauth-ethereum.rb) - _Triển khai chiến lược nhà cung cấp Ethereum cho OmniAuth_
+
+Tìm kiếm thêm tài nguyên? Hãy xem [trang chủ dành cho Nhà phát triển của chúng tôi](/developers/).
+
+## Những người đóng góp cho cộng đồng Ruby {#ruby-community-contributors}
+
+[Nhóm Ethereum Ruby trên Telegram](https://t.me/ruby_eth) là nơi có một cộng đồng đang phát triển nhanh chóng và là tài nguyên chuyên dụng cho các cuộc thảo luận về bất kỳ dự án nào ở trên và các chủ đề liên quan.
diff --git a/public/content/translations/vi/developers/docs/programming-languages/rust/index.md b/public/content/translations/vi/developers/docs/programming-languages/rust/index.md
new file mode 100644
index 00000000000..c9097ac6be6
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/programming-languages/rust/index.md
@@ -0,0 +1,65 @@
+---
+title: Ethereum cho nhà phát triển Rust
+description: Tìm hiểu cách phát triển Ethereum bằng cách sử dụng các dự án và công cụ dựa trên cơ sở Rust
+lang: vi
+incomplete: true
+---
+
+Tìm hiểu cách phát triển cho Ethereum bằng các dự án và công cụ dựa trên Rust
+
+Sử dụng Ethereum để tạo các ứng dụng phi tập trung (hay "dapps") sử dụng các lợi ích của công nghệ tiền điện tử và chuỗi khối. Các ứng dụng phi tập trung này có thể đáng tin cậy, có nghĩa là một khi chúng được triển khai lên Ethereum, chúng sẽ luôn chạy như được lập trình. Chúng có thể kiểm soát các tài sản kỹ thuật số để tạo ra những loại ứng dụng tài chính mới. Chúng có thể được phân cấp, có nghĩa là không một thực thể hay người nào kiểm soát chúng và gần như không thể kiểm duyệt.
+
+## Bắt đầu với hợp đồng thông minh và ngôn ngữ Solidity {#getting-started-with-smart-contracts-and-solidity}
+
+**Thực hiện các bước đầu tiên để tích hợp Rust với Ethereum**
+
+Cần một hướng dẫn cơ bản hơn? Tham khảo [ethereum.org/learn](/learn/) hoặc [ethereum.org/developers](/developers/).
+
+- [Giải thích về Chuỗi khối](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained)
+- [Tìm hiểu về Hợp đồng thông minh](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract)
+- [Viết Hợp đồng thông minh đầu tiên của bạn](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract)
+- [Tìm hiểu cách Biên dịch và Triển khai Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment)
+
+## Các bài viết cho người mới bắt đầu {#beginner-articles}
+
+- [Máy khách Ethereum Rust](https://openethereum.github.io/) \* **Lưu ý rằng OpenEthereum [đã không còn được dùng nữa](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) và không còn được bảo trì.** Hãy sử dụng một cách thận trọng và tốt nhất là chuyển sang một bản triển khai máy khách khác.
+- [Gửi giao dịch đến Ethereum bằng Rust](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/)
+- [Hướng dẫn từng bước về cách viết hợp đồng trong Rust Wasm cho Kovan](https://github.com/paritytech/pwasm-tutorial)
+
+## Các bài viết trình độ trung cấp {#intermediate-articles}
+
+## Các mẫu sử dụng nâng cao {#advanced-use-patterns}
+
+- [Thư viện externs pwasm_ethereum để tương tác với mạng tương tự Ethereum](https://github.com/openethereum/pwasm-ethereum)
+
+- [Xây dựng một ứng dụng trò chuyện phi tập trung bằng JavaScript và Rust](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52)
+
+- [Xây dựng một ứng dụng Việc cần làm phi tập trung bằng Vue.js & Rust](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb)
+
+- [Xây dựng một chuỗi khối bằng Rust](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/)
+
+## Các dự án và công cụ Rust {#rust-projects-and-tools}
+
+- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) - _Bộ sưu tập externs để tương tác với mạng tương tự Ethereum_
+- [Lighthouse](https://github.com/sigp/lighthouse) - _Máy khách lớp đồng thuận Ethereum nhanh chóng_
+- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) - _Đề xuất thiết kế lại lớp thực thi hợp đồng thông minh của Ethereum sử dụng một tập con xác định của WebAssembly_
+- [oasis_std](https://docs.rs/oasis-std/latest/oasis_std/index.html) - _Tài liệu tham khảo API OASIS_
+- [Solaris](https://github.com/paritytech/sol-rs) - _Bộ kiểm thử đơn vị Hợp đồng thông minh Solidity sử dụng EVM của Máy khách Parity gốc._
+- [SputnikVM](https://github.com/rust-blockchain/evm) - _Bản triển khai Máy ảo Ethereum bằng Rust_
+- [Wavelet](https://wavelet.perlin.net/docs/smart-contracts) - _Hợp đồng thông minh Wavelet bằng Rust_
+- [Foundry](https://github.com/foundry-rs/foundry) - _Bộ công cụ để phát triển ứng dụng Ethereum_
+- [Alloy](https://alloy.rs) - _Thư viện hiệu suất cao, được kiểm thử kỹ lưỡng và có tài liệu đầy đủ để tương tác với Ethereum và các chuỗi dựa trên EVM khác._
+- [Ethers_rs](https://github.com/gakonst/ethers-rs) - _Thư viện Ethereum và triển khai ví_
+- [SewUp](https://github.com/second-state/SewUp) - _Một thư viện giúp bạn xây dựng hợp đồng Ethereum webassembly bằng Rust, giống như phát triển trên một backend thông thường_
+- [Substreams](https://github.com/streamingfast/substreams) - _Công nghệ lập chỉ mục dữ liệu chuỗi khối song song_
+- [Reth](https://github.com/paradigmxyz/reth) Reth (viết tắt của Rust Ethereum) là một bản triển khai nút đầy đủ mới của Ethereum
+- [Awesome Ethereum Rust](https://github.com/Vid201/awesome-ethereum-rust) - _Một bộ sưu tập các dự án được tuyển chọn trong hệ sinh thái Ethereum được viết bằng Rust_
+
+Tìm kiếm thêm tài nguyên? Hãy xem tại [ethereum.org/developers.](/developers/)
+
+## Những người đóng góp cho cộng đồng Rust {#rust-community-contributors}
+
+- [Ethereum WebAssembly](https://gitter.im/ewasm/Lobby)
+- [Oasis Gitter](https://gitter.im/Oasis-official/Lobby)
+- [Parity Gitter](https://gitter.im/paritytech/parity)
+- [Enigma](https://discord.gg/SJK32GY)
diff --git a/public/content/translations/vi/developers/docs/scaling/index.md b/public/content/translations/vi/developers/docs/scaling/index.md
new file mode 100644
index 00000000000..d24886e4291
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/scaling/index.md
@@ -0,0 +1,113 @@
+---
+title: Thay đổi quy mô
+description: Một giới thiệu về các tùy chọn mở rộng khác nhau đang được cộng đồng Ethereum phát triển.
+lang: vi
+sidebarDepth: 3
+---
+
+## Tổng quan về việc thay đổi quy mô {#scaling-overview}
+
+Khi số lượng người sử dụng Ethereum tăng lên, blockchain đã đạt đến những giới hạn nhất định về khả năng. Điều này đã làm tăng chi phí sử dụng mạng, tạo ra nhu cầu về 'giải pháp mở rộng'. Có nhiều giải pháp đang được nghiên cứu, thử nghiệm và triển khai, áp dụng các phương pháp khác nhau để đạt được những mục tiêu tương tự.
+
+Mục tiêu chính của khả năng mở rộng là tăng tốc độ giao dịch (tính kết luận cuối cùng nhanh hơn) và thông lượng giao dịch (số lượng giao dịch mỗi giây cao hơn) mà không phải hy sinh tính phi tập trung hay tính bảo mật. Trên chuỗi khối Ethereum lớp 1, nhu cầu cao dẫn đến các giao dịch chậm hơn và [giá gas](/developers/docs/gas/) không khả thi. Việc tăng cường khả năng mạng về tốc độ và băng thông là điều cơ bản đối với việc chấp nhận Ethereum một cách có ý nghĩa và rộng rãi.
+
+Trong khi tốc độ và thông lượng là quan trọng, việc các giải pháp mở rộng nhằm đạt được những mục tiêu này vẫn phải duy trì tính phân cấp và an toàn là điều thiết yếu. Giữ cho rào cản gia nhập thấp cho các nhà điều hành nút là rất quan trọng để ngăn chặn sự tiến triển hướng tới sức mạnh tính toán tập trung và không an toàn.
+
+Về mặt khái niệm, chúng ta đầu tiên phân loại việc mở rộng thành hai loại: mở rộng trên chuỗi và mở rộng ngoài chuỗi.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên có sự hiểu biết vững chắc về tất cả các chủ đề cơ bản. Việc triển khai các giải pháp mở rộng là một bước tiến cao, vì công nghệ này chưa được thử nghiệm nhiều trong thực tế và vẫn đang được nghiên cứu và phát triển.
+
+## Thay đổi quy mô trên chuỗi {#onchain-scaling}
+
+Thay đổi quy mô trên chuỗi yêu cầu thay đổi đối với giao thức Ethereum (lớp 1 [Mainnet](/glossary/#mainnet)). Trong một thời gian dài, việc chia nhỏ blockchain được kỳ vọng sẽ mở rộng quy mô cho Ethereum. Điều này sẽ liên quan đến việc chia nhỏ chuỗi khối thành các phần riêng biệt (shard) để được xác thực bởi các tập hợp validator. Tuy nhiên, việc mở rộng bằng các lớp cuộn thứ hai đã trở thành kỹ thuật mở rộng chính. Điều này được hỗ trợ bởi việc bổ sung một dạng dữ liệu mới với chi phí thấp gắn liền với các khối Ethereum, được thiết kế đặc biệt để làm cho việc sử dụng rollup trở nên rẻ hơn cho người dùng.
+
+### Phân mảnh dữ liệu {#sharding}
+
+Sharding là quá trình phân chia cơ sở dữ liệu. Các tập con của các trình xác thực sẽ chịu trách nhiệm cho từng shard riêng lẻ thay vì theo dõi toàn bộ Ethereum. Sharding đã nằm trong [lộ trình](/roadmap/) của Ethereum một thời gian dài, và từng được dự định sẽ ra mắt trước The Merge để chuyển sang bằng chứng cổ phần. Tuy nhiên, sự phát triển nhanh chóng của [rollup lớp 2](#layer-2-scaling) và sự ra đời của [Danksharding](/roadmap/danksharding) (thêm các blob dữ liệu rollup vào khối Ethereum mà người xác thực có thể xác minh rất hiệu quả) đã khiến cộng đồng Ethereum ủng hộ việc thay đổi quy mô lấy rollup làm trung tâm thay vì thay đổi quy mô bằng sharding. Điều này cũng sẽ giúp giữ cho logic đồng thuận của Ethereum đơn giản hơn.
+
+## Thay đổi quy mô ngoài chuỗi {#offchain-scaling}
+
+Giải pháp ngoại chuỗi được triển khai tách biệt với Mainnet layer 1 - chúng không yêu cầu thay đổi nào đối với giao thức Ethereum hiện tại. Một số giải pháp, được gọi là giải pháp "lớp 2", có được tính bảo mật trực tiếp từ sự đồng thuận của Ethereum lớp 1, chẳng hạn như [gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups/), [Rollup không kiến thức](/developers/docs/scaling/zk-rollups/) hoặc [kênh trạng thái](/developers/docs/scaling/state-channels/). Các giải pháp khác liên quan đến việc tạo ra các chuỗi mới dưới nhiều hình thức khác nhau có được tính bảo mật riêng biệt với Mainnet, chẳng hạn như [chuỗi bên](#sidechains), [validium](#validium) hoặc [chuỗi plasma](#plasma). Các giải pháp này giao tiếp với Mainnet nhưng thu được an ninh theo cách khác nhau để đạt được nhiều mục tiêu.
+
+### Thay đổi quy mô lớp 2 {#layer-2-scaling}
+
+Danh mục giải pháp offchain này có được sự bảo mật từ mạng chính Ethereum.
+
+Lớp 2 là thuật ngữ tổng hợp chỉ các giải pháp được thiết kế nhằm giúp mở rộng ứng dụng của bạn bằng cách xử lý giao dịch ngoài mạng chính Ethereum (lớp 1) trong khi tận dụng mô hình bảo mật phi tập trung mạnh mẽ của mạng chính. Tốc độ giao dịch bị ảnh hưởng khi mạng bận, khiến trải nghiệm người dùng trở nên kém cho một số loại dapps. Và khi mạng lưới trở nên bận rộn hơn, giá gas sẽ tăng lên khi những người gửi giao dịch nỗ lực để đưa ra giá đấu thầu cao hơn nhau. Điều này có thể khiến việc sử dụng Ethereum trở nên rất tốn kém.
+
+Hầu hết các giải pháp lớp 2 đều tập trung vào một máy chủ hoặc một cụm máy chủ, mỗi máy chủ có thể được gọi là nút, trình xác thực, nhà điều hành, trình tuần tự, nhà sản xuất khối, hoặc thuật ngữ tương tự. Tùy thuộc vào việc triển khai, các nút lớp 2 này có thể được vận hành bởi các cá nhân, doanh nghiệp hoặc tổ chức sử dụng chúng, hoặc bởi một nhà điều hành bên thứ ba, hoặc bởi một nhóm lớn các cá nhân (tương tự như Mainnet). Nói chung, các giao dịch được gửi đến các nút layer 2 này thay vì được gửi trực tiếp đến layer 1 (Mainnet). Đối với một số giải pháp, thực thể layer 2 sẽ kết hợp chúng thành các nhóm trước khi gán chúng vào layer 1, sau đó chúng được bảo mật bởi layer 1 và không thể bị thay đổi. Chi tiết về cách thức thực hiện điều này khác nhau đáng kể giữa các công nghệ và triển khai lớp 2 khác nhau.
+
+Một trường hợp cụ thể của Layer 2 có thể được thiết kế để mở và chia sẻ cho nhiều ứng dụng khác nhau sử dụng chung, hoặc có thể được triển khai bởi một dự án cụ thể và chỉ phục vụ riêng cho ứng dụng của dự án đó.
+
+#### Tại sao Layer 2 lại cần thiết? {#why-is-layer-2-needed}
+
+- Số giao dịch mỗi giây tăng lên rất nhiều cải thiện trải nghiệm người dùng và giảm tắc nghẽn mạng trên Mainnet Ethereum.
+- Các giao dịch được tổng hợp thành một giao dịch duy nhất trên Mainnet Ethereum, giảm phí gas cho người dùng và làm cho Ethereum trở nên toàn diện và dễ tiếp cận hơn với mọi người ở khắp nơi.
+- Mọi cập nhật về khả năng mở rộng không nên được thực hiện với cái giá phải trả cho sự phân cấp hoặc an ninh – layer 2 được xây dựng trên nền tảng Ethereum.
+- Có những mạng layer 2 cụ thể cho ứng dụng mang lại bộ hiệu quả riêng khi làm việc với tài sản quy mô lớn.
+
+[Thêm về lớp 2](/layer-2/).
+
+#### Rollup {#rollups}
+
+Rollups thực hiện việc thực thi giao dịch ngoài layer 1 và sau đó dữ liệu được đăng lên layer 1 nơi đạt được sự đồng thuận. Khi dữ liệu giao dịch được bao gồm trong các khối layer 1, điều này cho phép các rollup được bảo vệ bởi tính bảo mật gốc của Ethereum.
+
+Có hai loại rollup với các mô hình bảo mật khác nhau:
+
+- **Gộp giao dịch lạc quan**: giả định rằng các giao dịch là hợp lệ theo mặc định và chỉ chạy tính toán, thông qua [**bằng chứng gian lận**](/glossary/#fraud-proof), trong trường hợp có thách thức. [Thêm về gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups/).
+- **Rollup không kiến thức**: chạy tính toán ngoài chuỗi và gửi [**bằng chứng hợp lệ**](/glossary/#validity-proof) cho chuỗi. [Thêm về Rollup không kiến thức](/developers/docs/scaling/zk-rollups/).
+
+#### Kênh trạng thái {#channels}
+
+Các kênh nhà nước sử dụng hợp đồng đa chữ ký để cho phép các bên tham gia giao dịch nhanh chóng và tự do ngoài chuỗi, sau đó thanh toán cuối cùng với mạng chính. Điều này giảm thiểu tắc nghẽn mạng, phí tổn và thời gian trễ. Hai loại kênh này hiện tại là kênh nhà nước và kênh thanh toán.
+
+Tìm hiểu thêm về [kênh trạng thái](/developers/docs/scaling/state-channels/).
+
+### Chuỗi bên {#sidechains}
+
+Một sidechain là một blockchain độc lập tương thích với EVM chạy song song với Mainnet. Những cái này tương thích với Ethereum thông qua các cầu hai chiều và hoạt động theo các quy tắc đồng thuận và tham số khối mà họ đã chọn.
+
+Tìm hiểu thêm về [Chuỗi bên](/developers/docs/scaling/sidechains/).
+
+### Plasma {#plasma}
+
+Chuỗi plasma là một chuỗi khối riêng biệt được neo vào chuỗi Ethereum chính và sử dụng bằng chứng gian lận (như [gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups/)) để phân xử các tranh chấp.
+
+Tìm hiểu thêm về [Plasma](/developers/docs/scaling/plasma/).
+
+### Validium {#validium}
+
+Một chuỗi Validium sử dụng chứng minh tính hợp lệ giống như các rollup không biết nhưng dữ liệu không được lưu trữ trên chuỗi Ethereum lớp 1 chính. Điều này có thể dẫn đến 10.000 giao dịch mỗi giây cho mỗi chuỗi Validium và có thể chạy nhiều chuỗi song song.
+
+Tìm hiểu thêm về [Validium](/developers/docs/scaling/validium/).
+
+## Tại sao cần nhiều giải pháp mở rộng đến vậy? {#why-do-we-need-these}
+
+- Nhiều giải pháp có thể giúp giảm tình trạng tắc nghẽn tổng thể ở bất kỳ phần nào của mạng và cũng ngăn chặn các điểm thất bại đơn lẻ.
+- Toàn thể lớn hơn tổng của các phần của nó. Các giải pháp khác nhau có thể tồn tại và hoạt động hài hòa, cho phép tạo ra hiệu ứng bùng nổ đối với tốc độ giao dịch và lưu lượng trong tương lai.
+- Không phải tất cả các giải pháp đều yêu cầu sử dụng trực tiếp thuật toán đồng thuận Ethereum, và các phương án thay thế có thể mang lại những lợi ích mà nếu không có sẽ khó có được.
+
+## Tìm hiểu thêm từ video trực quan? Người học qua hình ảnh {#visual-learner}
+
+
+
+_Lưu ý rằng lời giải thích trong video sử dụng thuật ngữ "Layer 2" để chỉ tất cả các giải pháp mở rộng ngoài chuỗi, trong khi chúng tôi phân biệt "Layer 2" như một giải pháp ngoài chuỗi mà có được độ an toàn thông qua sự đồng thuận của Mainnet lớp 1._
+
+
+
+## Đọc thêm {#further-reading}
+
+- [Lộ trình Ethereum lấy rollup làm trung tâm](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_
+- [Phân tích cập nhật về các giải pháp thay đổi quy mô Lớp 2 cho Ethereum](https://www.l2beat.com/)
+- [Đánh giá các Giải pháp Thay đổi quy mô lớp 2 của Ethereum: Khung so sánh](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955)
+- [Hướng dẫn chưa đầy đủ về Rollup](https://vitalik.eth.limo/general/2021/01/05/rollup.html)
+- [ZK-Rollup được Ethereum hỗ trợ: Dẫn đầu thế giới](https://hackmd.io/@canti/rkUT0BD8K)
+- [Gộp giao dịch lạc quan và ZK Rollup](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/)
+- [Tại sao rollup + phân đoạn dữ liệu là giải pháp bền vững duy nhất cho khả năng mở rộng cao](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48)
+- [Loại Lớp 3 nào là hợp lý?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html)
+- [Tính sẵn sàng của dữ liệu hoặc: Các rollup đã học cách ngừng lo lắng và yêu Ethereum như thế nào](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum)
+- [Hướng dẫn thực tế về Rollup của Ethereum](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups)
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/vi/developers/docs/scaling/optimistic-rollups/index.md
new file mode 100644
index 00000000000..e23de3a8580
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/scaling/optimistic-rollups/index.md
@@ -0,0 +1,265 @@
+---
+title: Optimistic Rollups
+description: Giới thiệu về Optimistic rollups - một giải pháp mở rộng dành cho cộng đồng Ethereum.
+lang: vi
+---
+
+Optimistic rollups là một giao thức layer 2 (L2) được thiết kế với mục đích mở rộng thông lượng của lớp Ethereum cơ sở. Những rollup này giảm bớt nhu cầu tính toán trên mạng lưới Ethereum bằng việc xử lý các giao dịch offchain, vì thế tăng đáng kể tốc độ xử lý. Không giống như các giải pháp mở rộng quy mô khác, chẳng hạn như [các chuỗi bên](/developers/docs/scaling/sidechains/), các gộp giao dịch lạc quan có được sự bảo mật từ Mạng chính bằng cách công bố kết quả giao dịch trên chuỗi, hoặc [các chuỗi plasma](/developers/docs/scaling/plasma/), vốn cũng xác minh các giao dịch trên Ethereum bằng bằng chứng gian lận nhưng lưu trữ dữ liệu giao dịch ở nơi khác.
+
+Tốc độ xử lý chậm, chi phí cao như là một phần của việc sử dụng Ethereum, optimistic rollups có thể cung cấp các cải tiến về khả năng mở rộng lên 10-100 lần. Các gộp giao dịch lạc quan cũng ghi các giao dịch vào Ethereum dưới dạng `calldata` hoặc trong [các blob](/roadmap/danksharding/), giúp giảm chi phí gas cho người dùng.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên đọc và hiểu các trang của chúng tôi về [mở rộng Ethereum](/developers/docs/scaling/) và [lớp 2](/layer-2/).
+
+## Optimistic rollup là gì? {#what-is-an-optimistic-rollup}
+
+Rollup lạc quan là một phương án để mở rộng mạng lưới Ethereum bằng cách dịch chuyển xử lý tính toán và lưu trữ dữ liệu ra offchain. Các gộp giao dịch lạc quan thực thi các giao dịch bên ngoài Ethereum, nhưng đăng dữ liệu giao dịch lên Mạng chính dưới dạng `calldata` hoặc trong [các blob](/roadmap/danksharding/).
+
+Các đơn vị vận hành Rollup Lạc Quan sẽ gộp nhiều giao dịch lại với nhau offchain thành nhiều lô lớn trước khi gửi tới Ethereum. Các giải quyết này cho phép phân bổ chi phí trên những giao dịch trong một đợt, vô hình chung sẽ giảm chi phí cho người dùng cuối cùng. Nén để giảm lượng dữ liệu được đăng trên Ethereum là cách Optimistic rollups sử dụng.
+
+Rollup Lạc Quan được coi là "lạc quan" vì đều mặc định các giao dịch offchain là hợp lệ và không đăng những bằng chứng hợp lệ cho các lô giao dịch khi gửi lên onchain. Điều này tách biệt các gộp giao dịch lạc quan khỏi [các gộp giao dịch không kiến thức](/developers/docs/scaling/zk-rollups) vốn công bố [bằng chứng hợp lệ](/glossary/#validity-proof) mật mã cho các giao dịch ngoài chuỗi.
+
+Thay vào đó, các Optimistic rollups dựa vào một bằng chứng gian lận để phát hiện các giao dịch không được tính toán chính xác. Sau khi một lô gộp giao dịch được gửi trên Ethereum, sẽ có một khoảng thời gian (được gọi là giai đoạn thử thách) mà trong đó bất kỳ ai cũng có thể thách thức kết quả của một giao dịch gộp bằng cách tính toán [bằng chứng gian lận](/glossary/#fraud-proof).
+
+Nếu bằng chứng gian lận được hoàn thành, giao thức tổng hợp sẽ thực hiện lại (các) giao dịch và cập nhật trạng thái của bản tổng hợp cho phù hợp. Hệ quả khác của việc chứng minh gian lận thành công là trình sắp xếp chịu trách nhiệm bao gồm giao dịch được thực hiện không chính xác trong một khối nhận lỗi.
+
+Nếu các lô tổng hợp vượt qua những thử thách ( nghĩa là tất cả các giao dịch được thực hiện chính xác) sau khi giai đoạn thử thách kết thúc, thì lô đó được coi là hợp lệ và được chấp nhận trên Ethereum. Những người khác có thể tiếp tục phát triển trên một khối rollup chưa được xác nhận, nhưng lưu ý : kết quả giao dịch sẽ bị đảo người nếu dựa trên một giao dịch được thực hiện không chính xác đã được công bố trước đó.
+
+## Các optimistic rollups tương tác với Ethereum như thế nào ? Các gộp giao dịch lạc quan và Ethereum {#optimistic-rollups-and-Ethereum}
+
+Các gộp giao dịch lạc quan là [các giải pháp mở rộng quy mô ngoài chuỗi](/developers/docs/scaling/#offchain-scaling) được xây dựng để hoạt động trên nền tảng Ethereum. Mỗi optimistic rollup được quản lý bởi một tập hợp các hợp đồng thông minh được triển khai trên mạng lưới Ethereum. Những rollup lạc quan xử lý giao dịch ngoài mạng lưới Ethereum chính, nhưng đăng những giao dịch offchain này (theo lô) vào một hợp đồng rollup onchain. Giống như chuỗi khối Ethereum, bản ghi giao dịch này là bất biến vào tạo thành "chuỗi optimistic rollup".
+
+Cấu trúc của một rollup lạc quan bao gồm các phần sau:
+
+**Hợp đồng trên chuỗi**: Hoạt động của gộp giao dịch lạc quan được kiểm soát bởi các hợp đồng thông minh chạy trên Ethereum. Điều này bao gồm các hợp đồng lưu trữ các khối rollup, theo dõi các cập nhật trạng thái trên rollup và tra soát tiền gửi của người dùng. Theo nghĩa này, Ethereum đóng vai trò là lớp cơ sở hay "lớp 1" cho các gộp giao dịch lạc quan.
+
+**Máy ảo (VM) ngoài chuỗi**: Mặc dù các hợp đồng quản lý giao thức gộp giao dịch lạc quan chạy trên Ethereum, giao thức gộp giao dịch thực hiện tính toán và lưu trữ trạng thái trên một máy ảo khác tách biệt với [Máy ảo Ethereum](/developers/docs/evm/). Máy ảo offchain là nơi các ứng dụng tồn tại và trạng thái dữ liệu được thực thi; nó đóng vai trò là tầng lớp ở trên hay còn gọi là "layer 2" cho một rollup lạc quan.
+
+Vì các rollup lạc quan được thiết kế để chạy các chương trình được viết hoặc biên dịch cho EVM, nên máy ảo offchain cũng tích hợp nhiều thông số kỹ thuật EVM. Ngoài ra, các bằng chứng gian lận được tính toán trên chuỗi cho phép mạng Ethereum thực thi tính hợp lệ của các thay đổi trạng thái được tính toán trong VM ngoài chuỗi.
+
+Các optimistic rollup được mô tả là 'các giải pháp mở rộng quy mô kết hợp' bởi vì, mặc dù chúng tồn tại dưới dạng các giao thức riêng biệt, nhưng các đặc tính bảo mật của chúng có nguồn gốc từ Ethereum. Trong một vài thứ khác, Ethereum đảm bảo tính chính xác của việc rollup tính toán offchain và khả năng truy cập dữ liệu đằng sau phép tính. Điều này làm cho các gộp giao dịch lạc quan an toàn hơn so với các giao thức mở rộng quy mô hoàn toàn ngoài chuỗi (ví dụ: [các chuỗi bên](/developers/docs/scaling/sidechains/)) không phụ thuộc vào Ethereum để bảo mật.
+
+Những yếu tố dựa trên giao thức chính của Ethereum mà optimistic rollup áp dụng :
+
+### Tính khả dụng của dữ liệu {#data-availability}
+
+Như đã đề cập, các gộp giao dịch lạc quan đăng dữ liệu giao dịch lên Ethereum dưới dạng `calldata` hoặc [các blob](/roadmap/danksharding/). Vì quá trình thực thi của rollup dựa trên các giao dịch đã gửi nên bất kỳ ai cũng có thể sử dụng thông tin này — được cố định trên lớp cơ sở của Ethereum — để thực hiện trạng thái của rollup và xác minh tính đúng đắn của các chuyển đổi trạng thái.
+
+[Tính khả dụng của dữ liệu](/developers/docs/data-availability/) là rất quan trọng vì nếu không có quyền truy cập vào dữ liệu trạng thái, những người thách thức không thể xây dựng bằng chứng gian lận để tranh chấp các hoạt động gộp giao dịch không hợp lệ. Việc Ethereum cung cấp dữ liệu sẵn có, nguy cơ bị các nhà khai thác rollup xử lý các hành vi độc hại (ví dụ: gửi các khối không hợp lệ) sẽ giảm xuống.
+
+### Chống kiểm duyệt {#censorship-resistance}
+
+Các đợt optimistic rollup cũng dựa vào Ethereum để chống lại sự kiểm duyệt. Trong một optimistic rollup, một thực thể tập trung (người điều hành) chịu trách nhiệm xử lý các giao dịch và gửi các khối tổng hợp cho Ethereum. Điều này có một số ý nghĩa:
+
+- Nhà khai thác rollup có thể kiểm duyệt người dùng bằng cách chuyển sang chế độ ngoại tuyến hoàn toàn hoặc bằng cách từ chối sản xuất các khối bao gồm các giao dịch nhất định trong đó.
+
+- Có thể ngăn chặn người dùng rút tiền được gửi trong hợp đồng rollup bằng cách giữ lại dữ liệu trạng thái cần thiết để Merkle bằng chứng về quyền sở hữu. Dữ liệu trạng thái giữ lại cũng có thể che giấu trạng thái của rollup với người dùng và ngăn họ tương tác với rollup.
+
+Những rollup lạc quan giải quyết vấn đề này bằng cách yêu cầu đơn vị vận hành phải đăng dữ liệu liên quan đến cập nhật trạng thái lên Ethereum. Việc rollup đăng dữ liệu onchain có những ưu điểm sau:
+
+- Nếu đơn vị vận hành rollup lạc quan bị offline hoặc dừng khởi tạo lô dữ liệu giao dịch, một nút mạng lưới khác có thể dùng dữ liệu sẵn có để khôi phục trạng thái rollup cuối cùng và tiếp tục tạo khối.
+
+- Người dùng có thể sử dụng dữ liệu giao dịch để tạo ra bằng chứng Merkle chứng minh việc sở hữu tiền và rút tài sản ra khỏi rollup.
+
+- Người dùng có thể gửi những giao dịch của họ ở L1 thay vì gửi tới sequencer, trong trường hợp này sequencer phải xử lý giao dịch trong một khoảng thời gian nhất định để tiếp tục khởi tạo khối hợp lệ.
+
+### Thanh toán {#settlement}
+
+Một vai trò khác của Ethereum trong ngữ cảnh của các rollup lạc quan là trở thành một tầng lớp chuyên quyết toán. Một tầng lớp chuyên quyết toán là nền tảng neo giữ cho toàn bộ hệ sinh thái blockchain, đảm bảo tính bảo mật và là nguồn kết luận cuối cùng khách quan khi có tranh chấp xảy ra trên các mạng lưới khác (chẳng hạn như rollup lạc quan trong trường hợp này) cần phân xử.
+
+Mainnet của Ethereum là trung tâm hoà giải tranh chấp thông qua việc xác minh bằng chứng gian lận cho các rollup lạc quan. Hơn nữa, các giao dịch được thực hiện trên gộp giao dịch chỉ được coi là cuối cùng _sau khi_ khối gộp giao dịch được chấp nhận trên Ethereum. Một khi giao dịch rollup được ghi vào tầng lớp nền Ethereum, nó sẽ không thể bị đảo ngược (ngoại trừ trường hợp cực kỳ hiếm là chuỗi các khối bị thay đổi tổ chức).
+
+## Các rollup lạc quan hoạt động như thế nào? {#how-optimistic-rollups-work}
+
+### Thực thi và tổng hợp giao dịch {#transaction-execution-and-aggregation}
+
+Người dùng gửi giao dịch của họ tới những "đơn vị vận hành", đây là những nút mạng lưới chịu trách nhiệm xử lý giao dịch trên rollup lạc quan. Hay còn gọi là "đơn vị xác minh" hoặc "đơn vị tổng hợp", đơn vị vận hành sẽ gom các giao dịch, nén dữ liệu ở dưới lại, và đăng khối đó lên Ethereum.
+
+Mặc dù bất kỳ ai cũng có thể trở thành người xác thực, nhưng những người xác thực gộp giao dịch lạc quan phải cung cấp một khoản ký quỹ trước khi tạo khối, giống như một [hệ thống bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/). Khoản ký quỹ này có thể bị phạt cắt giảm nếu đơn vị xác minh đưa lên một khối sai hoặc tiếp tục xây dựng trên một khối cũ nhưng không hợp lệ (dù khối mới của họ là hợp lệ). Nhờ đó, rollup lạc quan tận dụng các động lực kinh tế thông qua mật mã để buộc đơn vị xác minh phải hành xử trung thực.
+
+Những đơn vị xác minh khác trên chuỗi rollup lạc quan sẽ phải thực hiện lại các giao dịch đã nộp bằng chính bản sao trạng thái dữ liệu rollup của họ. Nếu trạng thái dữ liệu cuối cùng của đơn vị xác minh không trùng với trạng thái mà đơn vị vận hành đề xuất, họ có thể khởi động quy trình khiếu nại và tính toán bằng chứng gian lận.
+
+Một số rollup lạc quan không dùng hệ thống đơn vị xác minh mở, mà chỉ có một "sequencer" duy nhất để vận hành mạng mưới. Tương tự như đơn vị xác minh, sequencer xử lý giao dịch, tạo khối rollup và đẩy lô giao dịch rollup lên mạng lưới L1 (Ethereum).
+
+Sequencer khác với đơn vị vận hành thông thường của rollup ở chỗ họ có khả năng kiểm soát thứ tự giao dịch nhiều hơn. Hơn nữa, sequencer được ưu tiên truy cập mạng lưới rollup và là đơn vị duy nhất có quyền gửi giao dịch đến hợp đồng trên mạng lưới. Những giao dịch từ các nút mạng lưới mà không phải sequencer hoặc từ người dùng sẽ được đưa vào hàng chờ riêng, đợi đến khi sequencer gom chúng vào một lô mới.
+
+#### Gửi các khối gộp giao dịch lên Ethereum {#submitting-blocks-to-ethereum}
+
+Như đã nói ở trên, đơn vị vận hành của rollup lạc quan gom các giao dịch offchain thành một lô và chuyển lên Ethereum để chứng thực. Quá trình này bao gồm việc nén dữ liệu liên quan đến giao dịch và công bố nó trên Ethereum dưới dạng `calldata` hoặc trong các blob.
+
+`calldata` là một vùng không thể sửa đổi, không liên tục trong một hợp đồng thông minh, hoạt động chủ yếu giống như [bộ nhớ](/developers/docs/smart-contracts/anatomy/#memory). Mặc dù `calldata` tồn tại trên chuỗi như một phần của [nhật ký lịch sử](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) của chuỗi khối, nó không được lưu trữ như một phần trạng thái của Ethereum. Vì `calldata` không chạm vào bất kỳ phần nào của trạng thái Ethereum, nên việc lưu trữ dữ liệu trên chuỗi bằng cách này sẽ rẻ hơn so với lưu vào trạng thái.
+
+Từ khóa `calldata` cũng được sử dụng trong Solidity để truyền các đối số cho một hàm hợp đồng thông minh tại thời điểm thực thi. `calldata` xác định hàm đang được gọi trong một giao dịch và giữ các đầu vào cho hàm dưới dạng một chuỗi byte tùy ý.
+
+Trong bối cảnh các gộp giao dịch lạc quan, `calldata` được sử dụng để gửi dữ liệu giao dịch đã nén đến hợp đồng trên chuỗi. Một đơn vị vận hành rollup thêm một lô mới bằng cách gọi những hàm cần thiết trong hợp đồng rollup và gửi dữ liệu đã nén dưới dạng tham số truyền vào hàm. Sử dụng `calldata` giúp giảm phí người dùng vì hầu hết các chi phí mà các gộp giao dịch phải chịu đều đến từ việc lưu trữ dữ liệu trên chuỗi.
+
+Đây là [một ví dụ](https://eth.blockscout.com/tx/0x9102bfce17c58b5fc1c974c24b6bb7a924fb5fbd7c4cd2f675911c27422a5591) về việc gửi một lô gộp giao dịch để cho thấy khái niệm này hoạt động như thế nào. Trình sắp xếp thứ tự đã gọi phương thức `appendSequencerBatch()` và chuyển dữ liệu giao dịch đã nén làm đầu vào bằng cách sử dụng `calldata`.
+
+Một số rollup bây giờ sử dụng blobs để đăng các lô giao dịch đến Ethereum.
+
+Các blob không thể sửa đổi và không liên tục (giống như `calldata`) nhưng sẽ bị cắt bỏ khỏi lịch sử sau ~18 ngày. Để biết thêm thông tin về các blob, hãy xem [Danksharding](/roadmap/danksharding).
+
+### Cam kết trạng thái {#state-commitments}
+
+Tại bất kỳ thời điểm nào, trạng thái của gộp giao dịch lạc quan (tài khoản, số dư, mã hợp đồng, v.v.) được tổ chức dưới dạng một [cây Merkle](/whitepaper/#merkle-trees) được gọi là “cây trạng thái”. Gốc của cây Merkle này (gốc trạng thái), tham chiếu đến trạng thái mới nhất của gộp giao dịch, được băm và lưu trữ trong hợp đồng gộp giao dịch. Mỗi quá trình chuyển đổi trạng thái trên chuỗi sẽ tạo ra một trạng thái gộp giao dịch mới, mà một nhà điều hành cam kết bằng cách tính toán một gốc trạng thái mới.
+
+Nhà điều hành được yêu cầu gửi cả gốc trạng thái cũ và gốc trạng thái mới khi đăng các lô. Nếu gốc trạng thái cũ khớp với gốc trạng thái hiện có trong hợp đồng trên chuỗi, gốc trạng thái hiện có sẽ bị loại bỏ và thay thế bằng gốc trạng thái mới.
+
+Nhà điều hành gộp giao dịch cũng được yêu cầu cam kết một gốc Merkle cho chính lô giao dịch đó. Điều này cho phép bất kỳ ai chứng minh sự bao gồm của một giao dịch trong lô (trên L1) bằng cách trình bày một [bằng chứng Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/).
+
+Các cam kết trạng thái, đặc biệt là các gốc trạng thái, là cần thiết để chứng minh tính đúng đắn của các thay đổi trạng thái trong một gộp giao dịch lạc quan. Hợp đồng gộp giao dịch chấp nhận các gốc trạng thái mới từ các nhà điều hành ngay sau khi chúng được đăng, nhưng sau đó có thể xóa các gốc trạng thái không hợp lệ để khôi phục gộp giao dịch về trạng thái chính xác của nó.
+
+### Chứng minh gian lận {#fraud-proving}
+
+Như đã giải thích, các gộp giao dịch lạc quan cho phép bất kỳ ai công bố các khối mà không cần cung cấp bằng chứng về tính hợp lệ. Tuy nhiên, để đảm bảo chuỗi vẫn an toàn, các gộp giao dịch lạc quan chỉ định một khoảng thời gian mà trong đó bất kỳ ai cũng có thể tranh chấp một quá trình chuyển đổi trạng thái. Do đó, các khối gộp giao dịch được gọi là “khẳng định” vì bất kỳ ai cũng có thể tranh chấp tính hợp lệ của chúng.
+
+Nếu ai đó tranh chấp một khẳng định, thì giao thức gộp giao dịch sẽ bắt đầu tính toán bằng chứng gian lận. Mọi loại bằng chứng gian lận đều có tính tương tác—ai đó phải đăng một khẳng định trước khi người khác có thể thách thức nó. Sự khác biệt nằm ở số vòng tương tác cần thiết để tính toán bằng chứng gian lận.
+
+Các lược đồ chứng minh tương tác một vòng sẽ phát lại các giao dịch bị tranh chấp trên L1 để phát hiện các khẳng định không hợp lệ. Giao thức gộp giao dịch mô phỏng việc thực thi lại giao dịch bị tranh chấp trên L1 (Ethereum) bằng cách sử dụng hợp đồng xác minh, với gốc trạng thái được tính toán sẽ xác định ai là người chiến thắng trong thử thách. Nếu tuyên bố của người thách thức về trạng thái chính xác của gộp giao dịch là đúng, nhà điều hành sẽ bị phạt bằng cách bị cắt giảm khoản ký quỹ của họ.
+
+Tuy nhiên, việc thực thi lại các giao dịch trên L1 để phát hiện gian lận đòi hỏi phải công bố các cam kết trạng thái cho các giao dịch riêng lẻ và làm tăng lượng dữ liệu mà các gộp giao dịch phải công bố trên chuỗi. Việc phát lại các giao dịch cũng gây ra chi phí gas đáng kể. Vì những lý do này, các gộp giao dịch lạc quan đang chuyển sang chứng minh tương tác nhiều vòng, vốn đạt được cùng một mục tiêu (tức là phát hiện các hoạt động gộp giao dịch không hợp lệ) với hiệu quả cao hơn.
+
+#### Chứng minh tương tác nhiều vòng {#multi-round-interactive-proving}
+
+Chứng minh tương tác nhiều vòng bao gồm một giao thức qua lại giữa người khẳng định và người thách thức được giám sát bởi một hợp đồng xác minh L1, mà cuối cùng sẽ quyết định bên nào nói dối. Sau khi một nút L2 thách thức một khẳng định, người khẳng định được yêu cầu chia khẳng định bị tranh chấp thành hai nửa bằng nhau. Mỗi khẳng định riêng lẻ trong trường hợp này sẽ chứa số bước tính toán bằng nhau.
+
+Người thách thức sau đó sẽ chọn khẳng định mà họ muốn thách thức. Quá trình phân chia (được gọi là “giao thức chia đôi”) tiếp tục cho đến khi cả hai bên tranh chấp một khẳng định về một bước thực thi _duy nhất_. Tại thời điểm này, hợp đồng L1 sẽ giải quyết tranh chấp bằng cách đánh giá lệnh (và kết quả của nó) để bắt bên gian lận.
+
+Người khẳng định được yêu cầu cung cấp "bằng chứng một bước" để xác minh tính hợp lệ của phép tính một bước bị tranh chấp. Nếu người khẳng định không cung cấp được bằng chứng một bước, hoặc người xác minh L1 cho rằng bằng chứng không hợp lệ, họ sẽ thua trong thử thách.
+
+Một số lưu ý về loại bằng chứng gian lận này:
+
+1. Chứng minh gian lận tương tác nhiều vòng được coi là hiệu quả vì nó giảm thiểu công việc mà chuỗi L1 phải làm trong việc phân xử tranh chấp. Thay vì phát lại toàn bộ giao dịch, chuỗi L1 chỉ cần thực thi lại một bước trong quá trình thực thi của gộp giao dịch.
+
+2. Các giao thức chia đôi làm giảm lượng dữ liệu được đăng trên chuỗi (không cần phải công bố các cam kết trạng thái cho mọi giao dịch). Ngoài ra, các giao dịch gộp giao dịch lạc quan không bị giới hạn bởi giới hạn gas của Ethereum. Ngược lại, các gộp giao dịch lạc quan thực thi lại các giao dịch phải đảm bảo một giao dịch L2 có giới hạn gas thấp hơn để mô phỏng việc thực thi của nó trong một giao dịch Ethereum duy nhất.
+
+3. Một phần khoản ký quỹ của người khẳng định độc hại được trao cho người thách thức, trong khi phần còn lại bị đốt cháy. Việc đốt cháy ngăn chặn sự thông đồng giữa những người xác thực; nếu hai người xác thực thông đồng để khởi tạo các thử thách giả mạo, họ vẫn sẽ mất một phần đáng kể trong toàn bộ số tiền đã ký quỹ.
+
+4. Chứng minh tương tác nhiều vòng yêu cầu cả hai bên (người khẳng định và người thách thức) phải thực hiện các hành động trong khoảng thời gian được chỉ định. Việc không hành động trước khi hết thời hạn sẽ khiến bên không thực hiện nghĩa vụ bị xử thua trong thử thách.
+
+#### Tại sao bằng chứng gian lận lại quan trọng đối với các gộp giao dịch lạc quan {#fraud-proof-benefits}
+
+Bằng chứng gian lận rất quan trọng vì chúng tạo điều kiện cho _tính hữu hạn không cần tin cậy_ trong các gộp giao dịch lạc quan. Tính hữu hạn không cần tin cậy là một đặc tính của các gộp giao dịch lạc quan đảm bảo rằng một giao dịch—miễn là nó hợp lệ—cuối cùng sẽ được xác nhận.
+
+Các nút độc hại có thể cố gắng trì hoãn việc xác nhận một khối gộp giao dịch hợp lệ bằng cách bắt đầu các thử thách sai. Tuy nhiên, bằng chứng gian lận cuối cùng sẽ chứng minh tính hợp lệ của khối gộp giao dịch và khiến nó được xác nhận.
+
+Điều này cũng liên quan đến một thuộc tính bảo mật khác của các gộp giao dịch lạc quan: tính hợp lệ của chuỗi phụ thuộc vào sự tồn tại của _một_ nút trung thực. Nút trung thực có thể thúc đẩy chuỗi một cách chính xác bằng cách đăng các khẳng định hợp lệ hoặc tranh chấp các khẳng định không hợp lệ. Trong mọi trường hợp, các nút độc hại tham gia vào các tranh chấp với nút trung thực sẽ mất tiền đặt cọc trong quá trình chứng minh gian lận.
+
+### Khả năng tương tác L1/L2 {#l1-l2-interoperability}
+
+Các gộp giao dịch lạc quan được thiết kế để có khả năng tương tác với Mạng chính Ethereum và cho phép người dùng chuyển tin nhắn và dữ liệu tùy ý giữa L1 và L2. Chúng cũng tương thích với EVM, vì vậy bạn có thể chuyển [các ứng dụng phi tập trung](/developers/docs/dapps/) hiện có sang các gộp giao dịch lạc quan hoặc tạo các ứng dụng phi tập trung mới bằng các công cụ phát triển Ethereum.
+
+#### 1. Chuyển động tài sản {#asset-movement}
+
+##### Tham gia gộp giao dịch
+
+Để sử dụng một gộp giao dịch lạc quan, người dùng gửi ETH, token ERC-20 và các tài sản được chấp nhận khác vào hợp đồng [cầu nối](/developers/docs/bridges/) của gộp giao dịch trên L1. Hợp đồng cầu nối sẽ chuyển tiếp giao dịch đến L2, nơi một lượng tài sản tương đương được đúc và gửi đến địa chỉ đã chọn của người dùng trên gộp giao dịch lạc quan.
+
+Các giao dịch do người dùng tạo (như gửi tiền từ L1 > L2) thường được xếp vào hàng đợi cho đến khi trình sắp xếp thứ tự gửi lại chúng vào hợp đồng gộp giao dịch. Tuy nhiên, để duy trì khả năng chống kiểm duyệt, các gộp giao dịch lạc quan cho phép người dùng gửi giao dịch trực tiếp đến hợp đồng gộp giao dịch trên chuỗi nếu nó đã bị trì hoãn quá thời gian tối đa cho phép.
+
+Một số gộp giao dịch lạc quan áp dụng một cách tiếp cận đơn giản hơn để ngăn chặn các trình sắp xếp thứ tự kiểm duyệt người dùng. Ở đây, một khối được xác định bởi tất cả các giao dịch được gửi đến hợp đồng L1 kể từ khối trước đó (ví dụ: các khoản tiền gửi) ngoài các giao dịch được xử lý trên chuỗi gộp giao dịch. Nếu một trình sắp xếp thứ tự bỏ qua một giao dịch L1, nó sẽ công bố gốc trạng thái sai (có thể chứng minh được); do đó, các trình sắp xếp thứ tự không thể trì hoãn các tin nhắn do người dùng tạo ra sau khi được đăng trên L1.
+
+##### Thoát khỏi gộp giao dịch
+
+Việc rút tiền từ một gộp giao dịch lạc quan về Ethereum khó khăn hơn do cơ chế chứng minh gian lận. Nếu một người dùng khởi tạo một giao dịch L2 > L1 để rút tiền được ký quỹ trên L1, họ phải đợi cho đến khi giai đoạn thử thách—kéo dài khoảng bảy ngày—kết thúc. Tuy nhiên, quá trình rút tiền tự nó khá đơn giản.
+
+Sau khi yêu cầu rút tiền được khởi tạo trên gộp giao dịch L2, giao dịch được bao gồm trong lô tiếp theo, trong khi tài sản của người dùng trên gộp giao dịch bị đốt cháy. Sau khi lô được công bố trên Ethereum, người dùng có thể tính toán một bằng chứng Merkle để xác minh sự bao gồm của giao dịch thoát của họ trong khối. Sau đó, vấn đề chỉ là chờ đợi qua giai đoạn trì hoãn để hoàn tất giao dịch trên L1 và rút tiền về Mạng chính.
+
+Để tránh phải chờ một tuần trước khi rút tiền về Ethereum, người dùng gộp giao dịch lạc quan có thể sử dụng **nhà cung cấp thanh khoản** (LP). Một nhà cung cấp thanh khoản đảm nhận quyền sở hữu của một khoản rút tiền L2 đang chờ xử lý và trả tiền cho người dùng trên L1 (để đổi lấy một khoản phí).
+
+Các nhà cung cấp thanh khoản có thể kiểm tra tính hợp lệ của yêu cầu rút tiền của người dùng (bằng cách tự thực thi chuỗi) trước khi giải phóng tiền. Bằng cách này, họ có sự đảm bảo rằng giao dịch cuối cùng sẽ được xác nhận (tức là tính hữu hạn không cần tin cậy).
+
+#### 2. Khả năng tương thích với EVM {#evm-compatibility}
+
+Đối với các nhà phát triển, lợi thế của các gộp giao dịch lạc quan là khả năng tương thích của chúng—hoặc tốt hơn nữa là tương đương—với [Máy ảo Ethereum (EVM)](/developers/docs/evm/). Các gộp giao dịch tương thích với EVM tuân thủ các thông số kỹ thuật trong [Sách vàng Ethereum](https://ethereum.github.io/yellowpaper/paper.pdf) và hỗ trợ EVM ở cấp độ bytecode.
+
+Khả năng tương thích EVM trong các gộp giao dịch lạc quan có những lợi ích sau:
+
+i. Các nhà phát triển có thể di chuyển các hợp đồng thông minh hiện có trên Ethereum sang các chuỗi gộp giao dịch lạc quan mà không cần phải sửa đổi nhiều cơ sở mã. Điều này có thể tiết kiệm thời gian cho các nhóm phát triển khi triển khai các hợp đồng thông minh Ethereum trên L2.
+
+ii. Các nhà phát triển và các nhóm dự án sử dụng các gộp giao dịch lạc quan có thể tận dụng cơ sở hạ tầng của Ethereum. Điều này bao gồm các ngôn ngữ lập trình, thư viện mã, công cụ kiểm thử, phần mềm máy khách, cơ sở hạ tầng triển khai, v.v.
+
+Việc sử dụng các bộ công cụ hiện có là quan trọng vì những công cụ này đã được kiểm toán, gỡ lỗi và cải tiến rộng rãi trong nhiều năm. Nó cũng loại bỏ sự cần thiết cho các nhà phát triển Ethereum phải học cách xây dựng với một bộ công cụ phát triển hoàn toàn mới.
+
+#### 3. Các lệnh gọi hợp đồng chuỗi chéo {#cross-chain-contract-calls}
+
+Người dùng (tài khoản thuộc sở hữu bên ngoài) tương tác với các hợp đồng L2 bằng cách gửi một giao dịch đến hợp đồng gộp giao dịch hoặc để một trình sắp xếp thứ tự hoặc người xác thực làm điều đó cho họ. Các gộp giao dịch lạc quan cũng cho phép các tài khoản hợp đồng trên Ethereum tương tác với các hợp đồng L2 bằng cách sử dụng các hợp đồng cầu nối để chuyển tiếp tin nhắn và chuyển dữ liệu giữa L1 và L2. Điều này có nghĩa là bạn có thể lập trình một hợp đồng L1 trên Mạng chính Ethereum để gọi các hàm thuộc về các hợp đồng trên một gộp giao dịch lạc quan L2.
+
+Các lệnh gọi hợp đồng chuỗi chéo xảy ra không đồng bộ—nghĩa là lệnh gọi được khởi tạo trước, sau đó được thực thi vào một thời điểm sau đó. Điều này khác với các lệnh gọi giữa hai hợp đồng trên Ethereum, nơi lệnh gọi tạo ra kết quả ngay lập tức.
+
+Một ví dụ về lệnh gọi hợp đồng chuỗi chéo là việc gửi token được mô tả trước đó. Một hợp đồng trên L1 ký quỹ token của người dùng và gửi một tin nhắn đến một hợp đồng L2 được ghép nối để đúc một lượng token tương đương trên gộp giao dịch.
+
+Vì các lệnh gọi tin nhắn chuỗi chéo dẫn đến việc thực thi hợp đồng, người gửi thường được yêu cầu chi trả [chi phí gas](/developers/docs/gas/) cho việc tính toán. Bạn nên đặt giới hạn gas cao để ngăn giao dịch bị thất bại trên chuỗi đích. Kịch bản cầu nối token là một ví dụ điển hình; nếu phía L1 của giao dịch (gửi token) hoạt động, nhưng phía L2 (đúc token mới) thất bại do gas thấp, khoản tiền gửi sẽ không thể phục hồi được.
+
+Cuối cùng, chúng ta cần lưu ý rằng các lệnh gọi tin nhắn L2 > L1 giữa các hợp đồng cần tính đến sự chậm trễ (các lệnh gọi L1 > L2 thường được thực thi sau vài phút). Điều này là do các tin nhắn được gửi đến Mạng chính từ gộp giao dịch lạc quan không thể được thực thi cho đến khi cửa sổ thử thách hết hạn.
+
+## Phí của gộp giao dịch lạc quan hoạt động như thế nào? {#how-do-optimistic-rollup-fees-work}
+
+Các gộp giao dịch lạc quan sử dụng một cơ chế phí gas, giống như Ethereum, để biểu thị số tiền người dùng trả cho mỗi giao dịch. Các khoản phí được tính trên các gộp giao dịch lạc quan phụ thuộc vào các thành phần sau:
+
+1. **Ghi trạng thái**: Các gộp giao dịch lạc quan công bố dữ liệu giao dịch và tiêu đề khối (bao gồm hàm băm của tiêu đề khối trước đó, gốc trạng thái, gốc lô) lên Ethereum dưới dạng một `blob`, hoặc "đối tượng lớn nhị phân". [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) đã giới thiệu một giải pháp tiết kiệm chi phí để bao gồm dữ liệu trên chuỗi. Một `blob` là một trường giao dịch mới cho phép các gộp giao dịch đăng dữ liệu chuyển đổi trạng thái đã nén lên Ethereum L1. Không giống như `calldata`, vốn vẫn tồn tại vĩnh viễn trên chuỗi, các blob chỉ tồn tại trong thời gian ngắn và có thể bị cắt bỏ khỏi các máy khách sau [4096 epoch](https://github.com/ethereum/consensus-specs/blob/81f3ea8322aff6b9fb15132d050f8f98b16bdba4/configs/mainnet.yaml#L147) (khoảng 18 ngày). Bằng cách sử dụng các blob để đăng các lô giao dịch đã nén, các gộp giao dịch lạc quan có thể giảm đáng kể chi phí ghi giao dịch vào L1.
+
+2. **Gas blob đã sử dụng**: Các giao dịch mang blob sử dụng một cơ chế phí động tương tự như cơ chế được giới thiệu bởi [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559). Phí gas cho các giao dịch loại 3 tính đến phí cơ bản cho các blob, được xác định bởi mạng lưới dựa trên nhu cầu về không gian blob và việc sử dụng không gian blob của giao dịch đang được gửi.
+
+3. **Phí của nhà điều hành L2**: Đây là số tiền trả cho các nút gộp giao dịch để bù đắp cho các chi phí tính toán phát sinh trong quá trình xử lý giao dịch, giống như phí gas trên Ethereum. Các nút gộp giao dịch tính phí giao dịch thấp hơn vì các L2 có khả năng xử lý cao hơn và không phải đối mặt với tình trạng tắc nghẽn mạng buộc những người xác thực trên Ethereum phải ưu tiên các giao dịch có phí cao hơn.
+
+Các gộp giao dịch lạc quan áp dụng một số cơ chế để giảm phí cho người dùng, bao gồm gộp các giao dịch và nén `calldata` để giảm chi phí công bố dữ liệu. Bạn có thể kiểm tra [công cụ theo dõi phí L2](https://l2fees.info/) để có cái nhìn tổng quan theo thời gian thực về chi phí sử dụng các gộp giao dịch lạc quan dựa trên Ethereum.
+
+## Các gộp giao dịch lạc quan mở rộng quy mô Ethereum như thế nào? {#scaling-ethereum-with-optimistic-rollups}
+
+Như đã giải thích, các gộp giao dịch lạc quan công bố dữ liệu giao dịch đã nén trên Ethereum để đảm bảo tính khả dụng của dữ liệu. Khả năng nén dữ liệu được công bố trên chuỗi là rất quan trọng để mở rộng thông lượng trên Ethereum bằng các gộp giao dịch lạc quan.
+
+Chuỗi Ethereum chính đặt ra giới hạn về lượng dữ liệu mà các khối có thể chứa, được tính bằng đơn vị gas ([kích thước khối trung bình](/developers/docs/blocks/#block-size) là 15 triệu gas). Mặc dù điều này hạn chế lượng gas mà mỗi giao dịch có thể sử dụng, nó cũng có nghĩa là chúng ta có thể tăng số giao dịch được xử lý trên mỗi khối bằng cách giảm dữ liệu liên quan đến giao dịch—cải thiện trực tiếp khả năng mở rộng.
+
+Các gộp giao dịch lạc quan sử dụng một số kỹ thuật để đạt được việc nén dữ liệu giao dịch và cải thiện tỷ lệ TPS. Ví dụ, [bài viết](https://vitalik.eth.limo/general/2021/01/05/rollup.html) này so sánh dữ liệu mà một giao dịch người dùng cơ bản (gửi ether) tạo ra trên Mạng chính so với lượng dữ liệu mà cùng giao dịch đó tạo ra trên một gộp giao dịch:
+
+| Thông số | Ethereum (L1) | Gộp giao dịch (L2) |
+| ------------- | ---------------------------------------------------- | ------------------------------------- |
+| Nonce | ~3 | 0 |
+| Giá gas | ~8 | 0-0.5 |
+| Gas | 3 | 0-0.5 |
+| Đến | 21 | 4 |
+| Giá trị | 9 | ~3 |
+| Chữ ký | ~68 (2 + 33 + 33) | ~0.5 |
+| Từ | 0 (phục hồi từ chữ ký) | 4 |
+| **Tổng cộng** | **~112 byte** | **~12 byte** |
+
+Thực hiện một số tính toán sơ bộ trên những con số này có thể giúp cho thấy những cải tiến về khả năng mở rộng mà một gộp giao dịch lạc quan mang lại:
+
+1. Kích thước mục tiêu cho mỗi khối là 15 triệu gas và chi phí để xác minh một byte dữ liệu là 16 gas. Chia kích thước khối trung bình cho 16 gas (15.000.000/16) cho thấy khối trung bình có thể chứa **937.500 byte dữ liệu**.
+2. Nếu một giao dịch gộp giao dịch cơ bản sử dụng 12 byte, thì khối Ethereum trung bình có thể xử lý **78.125 giao dịch gộp giao dịch** (937.500/12) hoặc **39 lô gộp giao dịch** (nếu mỗi lô chứa trung bình 2.000 giao dịch).
+3. Nếu một khối mới được sản xuất trên Ethereum cứ sau 15 giây, thì tốc độ xử lý của gộp giao dịch sẽ vào khoảng **5.208 giao dịch mỗi giây**. Điều này được thực hiện bằng cách chia số lượng giao dịch gộp giao dịch cơ bản mà một khối Ethereum có thể chứa (**78.125**) cho thời gian khối trung bình (**15 giây**).
+
+Đây là một ước tính khá lạc quan, vì các giao dịch gộp giao dịch lạc quan không thể chiếm toàn bộ một khối trên Ethereum. Tuy nhiên, nó có thể đưa ra một ý tưởng sơ bộ về mức độ tăng khả năng mở rộng mà các gộp giao dịch lạc quan có thể mang lại cho người dùng Ethereum (các triển khai hiện tại cung cấp tới 2.000 TPS).
+
+Sự ra đời của [phân mảnh dữ liệu](/roadmap/danksharding/) trên Ethereum được kỳ vọng sẽ cải thiện khả năng mở rộng trong các gộp giao dịch lạc quan. Bởi vì các giao dịch gộp giao dịch phải chia sẻ không gian khối với các giao dịch không phải gộp giao dịch khác, khả năng xử lý của chúng bị giới hạn bởi thông lượng dữ liệu trên chuỗi Ethereum chính. Danksharding sẽ tăng không gian có sẵn cho các chuỗi L2 để công bố dữ liệu trên mỗi khối, bằng cách sử dụng lưu trữ "blob" rẻ hơn, không lâu dài thay vì `CALLDATA` đắt đỏ, vĩnh viễn.
+
+### Ưu và nhược điểm của các gộp giao dịch lạc quan {#optimistic-rollups-pros-and-cons}
+
+| Ưu điểm | Nhược điểm |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Cung cấp những cải tiến lớn về khả năng mở rộng mà không phải hy sinh tính bảo mật hoặc tính không cần tin cậy. | Trì hoãn trong việc hoàn tất giao dịch do các thách thức gian lận tiềm tàng. |
+| Dữ liệu giao dịch được lưu trữ trên chuỗi lớp 1, cải thiện tính minh bạch, bảo mật, khả năng chống kiểm duyệt và phân quyền. | Các nhà điều hành gộp giao dịch tập trung (trình sắp xếp thứ tự) có thể ảnh hưởng đến thứ tự giao dịch. |
+| Chứng minh gian lận đảm bảo tính hữu hạn không cần tin cậy và cho phép các nhóm thiểu số trung thực bảo mật chuỗi. | Nếu không có nút trung thực nào, một nhà điều hành độc hại có thể đánh cắp tiền bằng cách đăng các khối và cam kết trạng thái không hợp lệ. |
+| Việc tính toán bằng chứng gian lận mở cho nút L2 thông thường, không giống như bằng chứng hợp lệ (được sử dụng trong các gộp giao dịch ZK) yêu cầu phần cứng đặc biệt. | Mô hình bảo mật dựa vào ít nhất một nút trung thực thực hiện các giao dịch gộp giao dịch và gửi bằng chứng gian lận để thách thức các chuyển đổi trạng thái không hợp lệ. |
+| Các gộp giao dịch được hưởng lợi từ "tính sống động không cần tin cậy" (bất kỳ ai cũng có thể buộc chuỗi tiến lên bằng cách thực hiện các giao dịch và đăng các khẳng định) | Người dùng phải đợi thời gian thử thách một tuần hết hạn trước khi rút tiền về Ethereum. |
+| Các gộp giao dịch lạc quan dựa vào các ưu đãi kinh tế mã hóa được thiết kế tốt để tăng cường bảo mật trên chuỗi. | Các gộp giao dịch phải đăng tất cả dữ liệu giao dịch trên chuỗi, điều này có thể làm tăng chi phí. |
+| Khả năng tương thích với EVM và Solidity cho phép các nhà phát triển chuyển các hợp đồng thông minh gốc của Ethereum sang các gộp giao dịch hoặc sử dụng các bộ công cụ hiện có để tạo các ứng dụng phi tập trung mới. | |
+
+### Giải thích trực quan về các gộp giao dịch lạc quan {#optimistic-video}
+
+Tìm hiểu thêm từ video trực quan? Xem Finematics giải thích về các gộp giao dịch lạc quan:
+
+
+
+## Đọc thêm về các gộp giao dịch lạc quan
+
+- [Các gộp giao dịch lạc quan hoạt động như thế nào (Hướng dẫn Toàn diện)](https://www.alchemy.com/overviews/optimistic-rollups)
+- [Gộp giao dịch chuỗi khối là gì? Giới thiệu kỹ thuật](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction)
+- [Hướng dẫn cần thiết về Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum)
+- [Hướng dẫn thực hành về các gộp giao dịch Ethereum](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups)
+- [Tình trạng của Bằng chứng Gian lận trong các L2 của Ethereum](https://web.archive.org/web/20241124154627/https://research.2077.xyz/the-state-of-fraud-proofs-in-ethereum-l2s)
+- [Gộp giao dịch của Optimism thực sự hoạt động như thế nào?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work)
+- [Tìm hiểu sâu về OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52)
+- [Máy ảo Lạc quan là gì?](https://www.alchemy.com/overviews/optimistic-virtual-machine)
diff --git a/public/content/translations/vi/developers/docs/scaling/plasma/index.md b/public/content/translations/vi/developers/docs/scaling/plasma/index.md
new file mode 100644
index 00000000000..2a87f413fbd
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/scaling/plasma/index.md
@@ -0,0 +1,176 @@
+---
+title: Các chuỗi Plasma
+description: Giới thiệu về các chuỗi Plasma như một giải pháp thay đổi quy mô hiện đang được cộng đồng Ethereum sử dụng.
+lang: vi
+incomplete: true
+sidebarDepth: 3
+---
+
+Chuỗi Plasma là một chuỗi khối riêng biệt được neo vào Mạng chính Ethereum nhưng thực hiện các giao dịch ngoài chuỗi bằng cơ chế xác thực khối riêng. Các chuỗi Plasma đôi khi được gọi là chuỗi "con", về cơ bản là các bản sao nhỏ hơn của Mạng chính Ethereum. Các chuỗi Plasma sử dụng [bằng chứng gian lận](/glossary/#fraud-proof) (giống như [các gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups/)) để phân xử các tranh chấp.
+
+Cây Merkle cho phép tạo ra một chồng chuỗi vô tận có thể hoạt động để giảm tải băng thông từ các chuỗi mẹ (bao gồm cả Mạng chính Ethereum). Tuy nhiên, trong khi các chuỗi này có được một số bảo mật từ Ethereum (thông qua bằng chứng gian lận), thì tính bảo mật và hiệu quả của chúng lại bị ảnh hưởng bởi một số hạn chế về thiết kế.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên có hiểu biết tốt về tất cả các chủ đề nền tảng và hiểu biết ở cấp độ cao về [việc thay đổi quy mô của Ethereum](/developers/docs/scaling/).
+
+## Plasma là gì?
+
+Plasma là một khuôn khổ để cải thiện khả năng mở rộng trong các chuỗi khối công khai như Ethereum. Như được mô tả trong [sách trắng Plasma](http://plasma.io/plasma.pdf) ban đầu, các chuỗi Plasma được xây dựng trên một chuỗi khối khác (được gọi là "chuỗi gốc"). Mỗi "chuỗi con" kéo dài từ chuỗi gốc và thường được quản lý bởi một hợp đồng thông minh được triển khai trên chuỗi mẹ.
+
+Hợp đồng Plasma hoạt động, cùng với các chức năng khác, như một [cầu nối](/developers/docs/bridges/) cho phép người dùng di chuyển tài sản giữa Mạng chính Ethereum và chuỗi Plasma. Mặc dù điều này làm cho chúng tương tự như [các chuỗi bên](/developers/docs/scaling/sidechains/), các chuỗi plasma được hưởng lợi — ít nhất là ở một mức độ nào đó — từ tính bảo mật của Mạng chính Ethereum. Điều này không giống như các chuỗi bên hoàn toàn chịu trách nhiệm về tính bảo mật của chúng.
+
+## Plasma hoạt động như thế nào?
+
+Các thành phần cơ bản của khuôn khổ Plasma là:
+
+### Tính toán ngoài chuỗi {#offchain-computation}
+
+Tốc độ xử lý hiện tại của Ethereum bị giới hạn ở khoảng 15-20 giao dịch mỗi giây, làm giảm khả năng thay đổi quy mô trong ngắn hạn để xử lý nhiều người dùng hơn. Vấn đề này tồn tại chủ yếu là do [cơ chế đồng thuận](/developers/docs/consensus-mechanisms/) của Ethereum yêu cầu nhiều nút ngang hàng xác minh mọi cập nhật đối với trạng thái của chuỗi khối.
+
+Mặc dù cơ chế đồng thuận của Ethereum là cần thiết để bảo mật, nó có thể không áp dụng cho mọi trường hợp sử dụng. Ví dụ: Alice có thể không cần các khoản thanh toán hàng ngày của mình cho Bob cho một tách cà phê được xác minh bởi toàn bộ mạng Ethereum vì giữa hai bên đã có một số sự tin tưởng nhất định.
+
+Plasma cho rằng Mạng chính Ethereum không cần xác minh tất cả các giao dịch. Thay vào đó, chúng ta có thể xử lý các giao dịch ngoài Mạng chính, giải phóng các nút khỏi việc phải xác thực mọi giao dịch.
+
+Tính toán ngoài chuỗi là cần thiết vì các chuỗi Plasma có thể tối ưu hóa tốc độ và chi phí. Ví dụ: một chuỗi Plasma có thể — và thường xuyên nhất là — sử dụng một "người vận hành" duy nhất để quản lý việc sắp xếp thứ tự và thực hiện các giao dịch. Chỉ với một thực thể xác minh các giao dịch, thời gian xử lý trên chuỗi plasma nhanh hơn Mạng chính Ethereum.
+
+### Cam kết trạng thái {#state-commitments}
+
+Trong khi Plasma thực hiện các giao dịch ngoài chuỗi, chúng được giải quyết trên lớp thực thi Ethereum chính — nếu không, các chuỗi Plasma không thể hưởng lợi từ sự đảm bảo bảo mật của Ethereum. Nhưng việc hoàn tất các giao dịch ngoài chuỗi mà không biết trạng thái của chuỗi plasma sẽ phá vỡ mô hình bảo mật và cho phép sự gia tăng của các giao dịch không hợp lệ. Đây là lý do tại sao người vận hành, thực thể chịu trách nhiệm sản xuất các khối trên chuỗi plasma, được yêu cầu xuất bản các "cam kết trạng thái" trên Ethereum theo định kỳ.
+
+[Lược đồ cam kết](https://en.wikipedia.org/wiki/Commitment_scheme) là một kỹ thuật mã hóa để cam kết một giá trị hoặc một tuyên bố mà không tiết lộ nó cho một bên khác. Các cam kết có tính "ràng buộc" theo nghĩa là bạn không thể thay đổi giá trị hoặc tuyên bố một khi bạn đã cam kết với nó. Các cam kết trạng thái trong Plasma có dạng "gốc Merkle" (bắt nguồn từ [cây Merkle](/whitepaper/#merkle-trees)) mà người vận hành gửi theo các khoảng thời gian đến hợp đồng Plasma trên chuỗi Ethereum.
+
+Gốc Merkle là các nguyên hàm mã hóa cho phép nén lượng lớn thông tin. Gốc Merkle (còn được gọi là "gốc khối" trong trường hợp này) có thể đại diện cho tất cả các giao dịch trong một khối. Gốc Merkle cũng giúp dễ dàng xác minh rằng một phần dữ liệu nhỏ là một phần của tập dữ liệu lớn hơn. Ví dụ, người dùng có thể tạo [bằng chứng Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/#main-content) để chứng minh sự bao gồm của một giao dịch trong một khối cụ thể.
+
+Gốc Merkle rất quan trọng để cung cấp thông tin về trạng thái ngoài chuỗi cho Ethereum. Bạn có thể nghĩ về gốc Merkle như là các "điểm lưu": người vận hành đang nói, "Đây là trạng thái của chuỗi Plasma tại thời điểm x, và đây là gốc Merkle làm bằng chứng." Người vận hành đang cam kết với _trạng thái hiện tại_ của chuỗi plasma với một gốc Merkle, đó là lý do tại sao nó được gọi là "cam kết trạng thái".
+
+### Vào và thoát {#entries-and-exits}
+
+Để người dùng Ethereum tận dụng lợi thế của Plasma, cần có một cơ chế để di chuyển tiền giữa Mạng chính và các chuỗi plasma. Tuy nhiên, chúng ta không thể tùy tiện gửi ether đến một địa chỉ trên chuỗi plasma — các chuỗi này không tương thích, vì vậy giao dịch sẽ thất bại hoặc dẫn đến mất tiền.
+
+Plasma sử dụng một hợp đồng chính chạy trên Ethereum để xử lý việc vào và ra của người dùng. Hợp đồng chính này cũng chịu trách nhiệm theo dõi các cam kết trạng thái (đã giải thích trước đó) và trừng phạt hành vi không trung thực thông qua các bằng chứng gian lận (sẽ nói thêm về điều này sau).
+
+#### Vào chuỗi plasma {#entering-the-plasma-chain}
+
+Để vào chuỗi plasma, Alice (người dùng) sẽ phải gửi ETH hoặc bất kỳ token ERC-20 nào vào hợp đồng plasma. Người vận hành plasma, người theo dõi các khoản tiền gửi của hợp đồng, tạo lại một số tiền bằng với khoản tiền gửi ban đầu của Alice và chuyển nó đến địa chỉ của cô ấy trên chuỗi plasma. Alice được yêu cầu chứng thực việc nhận tiền trên chuỗi con và sau đó có thể sử dụng số tiền này cho các giao dịch.
+
+#### Thoát khỏi chuỗi plasma {#exiting-the-plasma-chain}
+
+Thoát khỏi chuỗi plasma phức tạp hơn việc vào chuỗi vì một số lý do. Lý do lớn nhất là, trong khi Ethereum có thông tin về trạng thái của chuỗi plasma, nó không thể xác minh thông tin đó có đúng hay không. Một người dùng độc hại có thể đưa ra một khẳng định không chính xác ("Tôi có 1000 ETH") và thoát khỏi việc cung cấp các bằng chứng giả để sao lưu cho tuyên bố đó.
+
+Để ngăn chặn việc rút tiền độc hại, một "thời gian thử thách" được đưa ra. Trong thời gian thử thách (thường là một tuần), bất kỳ ai cũng có thể thách thức yêu cầu rút tiền bằng cách sử dụng bằng chứng gian lận. Nếu thử thách thành công, thì yêu cầu rút tiền sẽ bị từ chối.
+
+Tuy nhiên, thông thường, người dùng trung thực và đưa ra các tuyên bố chính xác về số tiền họ sở hữu. Trong trường hợp này, Alice sẽ bắt đầu một yêu cầu rút tiền trên chuỗi gốc (Ethereum) bằng cách gửi một giao dịch đến hợp đồng plasma.
+
+Cô ấy cũng phải cung cấp một bằng chứng Merkle xác minh rằng một giao dịch tạo ra tiền của cô ấy trên chuỗi Plasma đã được bao gồm trong một khối. Điều này là cần thiết cho các lần lặp lại của Plasma, chẳng hạn như [Plasma MVP](https://www.learnplasma.org/en/learn/mvp.html), sử dụng mô hình [Đầu ra Giao dịch Chưa được Chi tiêu (UTXO)](https://en.wikipedia.org/wiki/Unspent_transaction_output).
+
+Những loại khác, như [Plasma Cash](https://www.learnplasma.org/en/learn/cash.html), đại diện cho các khoản tiền dưới dạng [token không thể thay thế](/developers/docs/standards/tokens/erc-721/) thay vì UTXO. Trong trường hợp này, việc rút tiền đòi hỏi bằng chứng về quyền sở hữu các token trên chuỗi Plasma. Điều này được thực hiện bằng cách gửi hai giao dịch gần đây nhất liên quan đến token và cung cấp một bằng chứng Merkle xác minh sự bao gồm của các giao dịch đó trong một khối.
+
+Người dùng cũng phải thêm một khoản ký quỹ vào yêu cầu rút tiền như một sự đảm bảo cho hành vi trung thực. Nếu một người thách thức chứng minh yêu cầu rút tiền của Alice là không hợp lệ, khoản ký quỹ của cô ấy sẽ bị phạt và một phần trong số đó sẽ được chuyển cho người thách thức như một phần thưởng.
+
+Nếu thời gian thử thách trôi qua mà không có ai cung cấp bằng chứng gian lận, yêu cầu rút tiền của Alice được coi là hợp lệ, cho phép cô ấy lấy lại tiền gửi từ hợp đồng Plasma trên Ethereum.
+
+### Phân xử tranh chấp {#dispute-arbitration}
+
+Giống như bất kỳ chuỗi khối nào, các chuỗi plasma cần một cơ chế để thực thi tính toàn vẹn của các giao dịch trong trường hợp những người tham gia có hành vi độc hại (ví dụ: chi tiêu gấp đôi). Để đạt được mục tiêu này, các chuỗi plasma sử dụng bằng chứng gian lận để phân xử các tranh chấp liên quan đến tính hợp lệ của các chuyển đổi trạng thái và xử phạt các hành vi xấu. Các bằng chứng gian lận được sử dụng như một cơ chế mà qua đó một chuỗi con Plasma nộp đơn khiếu nại lên chuỗi mẹ của nó hoặc lên chuỗi gốc.
+
+Bằng chứng gian lận chỉ đơn giản là một tuyên bố rằng một chuyển đổi trạng thái cụ thể là không hợp lệ. Một ví dụ là nếu một người dùng (Alice) cố gắng chi tiêu cùng một khoản tiền hai lần. Có lẽ cô ấy đã chi tiêu UTXO trong một giao dịch với Bob và muốn chi tiêu cùng một UTXO (hiện là của Bob) trong một giao dịch khác.
+
+Để ngăn chặn việc rút tiền, Bob sẽ xây dựng một bằng chứng gian lận bằng cách cung cấp bằng chứng về việc Alice đã chi tiêu UTXO nói trên trong một giao dịch trước đó và một bằng chứng Merkle về sự bao gồm của giao dịch trong một khối. Quy trình tương tự cũng hoạt động trong Plasma Cash — Bob sẽ cần cung cấp bằng chứng rằng Alice trước đó đã chuyển các token mà cô ấy đang cố gắng rút.
+
+Nếu thử thách của Bob thành công, yêu cầu rút tiền của Alice sẽ bị hủy. Tuy nhiên, cách tiếp cận này phụ thuộc vào khả năng của Bob trong việc theo dõi chuỗi để tìm các yêu cầu rút tiền. Nếu Bob ngoại tuyến, thì Alice có thể xử lý việc rút tiền độc hại sau khi hết thời gian thử thách.
+
+## Vấn đề thoát hàng loạt trong plasma {#the-mass-exit-problem-in-plasma}
+
+Vấn đề thoát hàng loạt xảy ra khi một số lượng lớn người dùng cố gắng rút khỏi một chuỗi plasma cùng một lúc. Lý do vấn đề này tồn tại liên quan đến một trong những vấn đề lớn nhất của Plasma: **tính không sẵn có của dữ liệu**.
+
+Tính sẵn có của dữ liệu là khả năng xác minh rằng thông tin cho một khối được đề xuất đã thực sự được xuất bản trên mạng chuỗi khối. Một khối là "không có sẵn" nếu nhà sản xuất xuất bản chính khối đó nhưng giữ lại dữ liệu được sử dụng để tạo khối.
+
+Các khối phải có sẵn nếu các nút có thể tải xuống khối và xác minh tính hợp lệ của các giao dịch. Các chuỗi khối đảm bảo tính sẵn có của dữ liệu bằng cách buộc các nhà sản xuất khối phải đăng tất cả dữ liệu giao dịch trên chuỗi.
+
+Tính sẵn có của dữ liệu cũng giúp bảo mật các giao thức thay đổi quy mô ngoài chuỗi được xây dựng trên lớp cơ sở của Ethereum. Bằng cách buộc các người vận hành trên các chuỗi này xuất bản dữ liệu giao dịch trên Ethereum, bất kỳ ai cũng có thể thách thức các khối không hợp lệ bằng cách xây dựng các bằng chứng gian lận tham chiếu đến trạng thái chính xác của chuỗi.
+
+Các chuỗi Plasma chủ yếu lưu trữ dữ liệu giao dịch với người vận hành và **không xuất bản bất kỳ dữ liệu nào trên Mạng chính** (tức là, ngoài các cam kết trạng thái định kỳ). Điều này có nghĩa là người dùng phải dựa vào người vận hành để cung cấp dữ liệu khối nếu họ cần tạo bằng chứng gian lận thách thức các giao dịch không hợp lệ. Nếu hệ thống này hoạt động, thì người dùng luôn có thể sử dụng bằng chứng gian lận để bảo mật tiền.
+
+Vấn đề bắt đầu khi người vận hành, chứ không phải bất kỳ người dùng nào, là bên hành động độc hại. Bởi vì người vận hành có toàn quyền kiểm soát chuỗi khối, họ có nhiều động cơ hơn để thúc đẩy các chuyển đổi trạng thái không hợp lệ ở quy mô lớn hơn, chẳng hạn như ăn cắp tiền thuộc về người dùng trên chuỗi plasma.
+
+Trong trường hợp này, việc sử dụng hệ thống bằng chứng gian lận cổ điển không hoạt động. Người vận hành có thể dễ dàng thực hiện một giao dịch không hợp lệ chuyển tiền của Alice và Bob vào ví của họ và che giấu dữ liệu cần thiết để tạo bằng chứng gian lận. Điều này có thể thực hiện được vì người vận hành không bắt buộc phải cung cấp dữ liệu cho người dùng hoặc Mạng chính.
+
+Do đó, giải pháp lạc quan nhất là cố gắng thực hiện một cuộc "thoát hàng loạt" của người dùng khỏi chuỗi plasma. Việc thoát hàng loạt làm chậm kế hoạch ăn cắp tiền của người vận hành độc hại và cung cấp một số biện pháp bảo vệ cho người dùng. Các yêu cầu rút tiền được sắp xếp theo thứ tự dựa trên thời điểm mỗi UTXO (hoặc token) được tạo ra, ngăn chặn các người vận hành độc hại chạy trước người dùng trung thực.
+
+Tuy nhiên, chúng ta vẫn cần một cách để xác minh tính hợp lệ của các yêu cầu rút tiền trong một cuộc thoát hàng loạt — để ngăn chặn các cá nhân cơ hội lợi dụng sự hỗn loạn để xử lý các lần thoát không hợp lệ. Giải pháp rất đơn giản: yêu cầu người dùng đăng **trạng thái hợp lệ cuối cùng của chuỗi** để rút tiền của họ.
+
+Nhưng cách tiếp cận này vẫn có vấn đề. Ví dụ: nếu tất cả người dùng trên chuỗi plasma cần thoát (điều này có thể xảy ra trong trường hợp có người vận hành độc hại), thì toàn bộ trạng thái hợp lệ của chuỗi plasma phải được đổ vào lớp cơ sở của Ethereum cùng một lúc. Với kích thước tùy ý của các chuỗi plasma (thông lượng cao = nhiều dữ liệu hơn) và các ràng buộc về tốc độ xử lý của Ethereum, đây không phải là một giải pháp lý tưởng.
+
+Mặc dù các trò chơi thoát nghe có vẻ hay về mặt lý thuyết, nhưng các cuộc thoát hàng loạt trong đời thực có thể sẽ gây ra tắc nghẽn trên toàn mạng trên chính Ethereum. Bên cạnh việc gây hại cho chức năng của Ethereum, một cuộc thoát hàng loạt được phối hợp kém có nghĩa là người dùng có thể không thể rút tiền trước khi người vận hành rút cạn mọi tài khoản trên chuỗi plasma.
+
+## Ưu và nhược điểm của plasma {#pros-and-cons-of-plasma}
+
+| Ưu điểm | Nhược điểm |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Cung cấp thông lượng cao và chi phí thấp cho mỗi giao dịch. | Không hỗ trợ tính toán chung (không thể chạy các hợp đồng thông minh). Chỉ các giao dịch chuyển token cơ bản, hoán đổi và một vài loại giao dịch khác được hỗ trợ thông qua logic vị từ. |
+| Tốt cho các giao dịch giữa những người dùng tùy ý (không có chi phí phát sinh cho mỗi cặp người dùng nếu cả hai đều được thiết lập trên chuỗi plasma) | Cần phải theo dõi mạng định kỳ (yêu cầu về tính sống động) hoặc ủy thác trách nhiệm này cho người khác để đảm bảo an toàn cho tiền của bạn. |
+| Các chuỗi Plasma có thể được điều chỉnh cho các trường hợp sử dụng cụ thể không liên quan đến chuỗi chính. Bất kỳ ai, kể cả các doanh nghiệp, đều có thể tùy chỉnh các hợp đồng thông minh Plasma để cung cấp cơ sở hạ tầng có thể mở rộng hoạt động trong các bối cảnh khác nhau. | Dựa vào một hoặc nhiều người vận hành để lưu trữ dữ liệu và cung cấp dữ liệu theo yêu cầu. |
+| Giảm tải trên Mạng chính Ethereum bằng cách di chuyển tính toán và lưu trữ ra ngoài chuỗi. | Việc rút tiền bị trì hoãn trong vài ngày để cho phép các thử thách. Đối với các tài sản có thể thay thế, điều này có thể được giảm thiểu bởi các nhà cung cấp thanh khoản, nhưng có một chi phí vốn liên quan. |
+| | Nếu có quá nhiều người dùng cố gắng thoát đồng thời, Mạng chính Ethereum có thể bị tắc nghẽn. |
+
+## Plasma so với các giao thức thay đổi quy mô lớp 2 {#plasma-vs-layer-2}
+
+Trong khi Plasma từng được coi là một giải pháp thay đổi quy mô hữu ích cho Ethereum, nó đã bị loại bỏ để chuyển sang các [giao thức thay đổi quy mô lớp 2 (L2)](/layer-2/). Các giải pháp thay đổi quy mô L2 khắc phục một số vấn đề của Plasma:
+
+### Hiệu quả {#efficiency}
+
+[Các gộp giao dịch không kiến thức](/developers/docs/scaling/zk-rollups) tạo ra các bằng chứng mã hóa về tính hợp lệ của mỗi lô giao dịch được xử lý ngoài chuỗi. Điều này ngăn người dùng (và người vận hành) thúc đẩy các chuyển đổi trạng thái không hợp lệ, loại bỏ nhu cầu về thời gian thử thách và các trò chơi thoát. Điều đó cũng có nghĩa là người dùng không phải theo dõi chuỗi định kỳ để bảo mật tiền của họ.
+
+### Hỗ trợ các hợp đồng thông minh {#support-for-smart-contracts}
+
+Một vấn đề khác với khuôn khổ plasma là [không có khả năng hỗ trợ việc thực thi các hợp đồng thông minh Ethereum](https://ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598/4). Do đó, hầu hết các triển khai của Plasma chủ yếu được xây dựng cho các khoản thanh toán đơn giản hoặc trao đổi token ERC-20.
+
+Ngược lại, các gộp giao dịch lạc quan, tương thích với [Máy ảo Ethereum](/developers/docs/evm/) và có thể chạy các [hợp đồng thông minh](/developers/docs/smart-contracts/) gốc của Ethereum, khiến chúng trở thành một giải pháp hữu ích và _bảo mật_ để thay đổi quy mô [các ứng dụng phi tập trung](/developers/docs/dapps/). Tương tự, các kế hoạch đang được tiến hành để [tạo một triển khai không kiến thức của EVM (zkEVM)](https://ethresear.ch/t/a-zk-evm-specification/11549) sẽ cho phép các ZK-rollup xử lý logic tùy ý và thực thi các hợp đồng thông minh.
+
+### Tính không sẵn có của dữ liệu {#data-unavailability}
+
+Như đã giải thích trước đó, plasma gặp phải vấn đề về tính sẵn có của dữ liệu. Nếu một người vận hành độc hại thúc đẩy một quá trình chuyển đổi không hợp lệ trên chuỗi plasma, người dùng sẽ không thể thách thức nó vì người vận hành có thể giữ lại dữ liệu cần thiết để tạo bằng chứng gian lận. Các gộp giao dịch giải quyết vấn đề này bằng cách buộc các người vận hành đăng dữ liệu giao dịch trên Ethereum, cho phép bất kỳ ai xác minh trạng thái của chuỗi và tạo bằng chứng gian lận nếu cần.
+
+### Vấn đề thoát hàng loạt {#mass-exit-problem}
+
+Các ZK-rollup và gộp giao dịch lạc quan đều giải quyết vấn đề thoát hàng loạt của Plasma theo nhiều cách khác nhau. Ví dụ: một ZK-rollup dựa trên các cơ chế mã hóa đảm bảo rằng người vận hành không thể ăn cắp tiền của người dùng trong bất kỳ trường hợp nào.
+
+Tương tự, các gộp giao dịch lạc quan áp đặt một khoảng thời gian trì hoãn đối với việc rút tiền, trong đó bất kỳ ai cũng có thể bắt đầu một thử thách và ngăn chặn các yêu cầu rút tiền độc hại. Mặc dù điều này tương tự như Plasma, nhưng điểm khác biệt là người xác minh có quyền truy cập vào dữ liệu cần thiết để tạo bằng chứng gian lận. Do đó, người dùng rollup không cần phải tham gia vào một cuộc di cư điên cuồng, "người đầu tiên ra ngoài" đến Mạng chính Ethereum.
+
+## Plasma khác với chuỗi bên và phân mảnh như thế nào? {#plasma-sidechains-sharding}
+
+Plasma, chuỗi bên và phân mảnh khá giống nhau vì tất cả chúng đều kết nối với Mạng chính Ethereum theo một cách nào đó. Tuy nhiên, mức độ và sức mạnh của các kết nối này khác nhau, điều này ảnh hưởng đến các thuộc tính bảo mật của từng giải pháp thay đổi quy mô.
+
+### Plasma so với chuỗi bên {#plasma-vs-sidechains}
+
+Một [chuỗi bên](/developers/docs/scaling/sidechains/) là một chuỗi khối được vận hành độc lập được kết nối với Mạng chính Ethereum thông qua một cầu nối hai chiều. [Các cầu nối](/bridges/) cho phép người dùng trao đổi các token giữa hai chuỗi khối để giao dịch trên chuỗi bên, giảm tắc nghẽn trên Mạng chính Ethereum và cải thiện khả năng mở rộng.
+Các chuỗi bên sử dụng một cơ chế đồng thuận riêng biệt và thường nhỏ hơn nhiều so với Mạng chính Ethereum. Do đó, việc kết nối tài sản với các chuỗi này có nguy cơ gia tăng; do thiếu sự đảm bảo bảo mật được kế thừa từ Mạng chính Ethereum trong mô hình chuỗi bên, người dùng có nguy cơ mất tiền trong một cuộc tấn công vào chuỗi bên.
+
+Ngược lại, các chuỗi plasma có được sự bảo mật từ Mạng chính. Điều này làm cho chúng an toàn hơn một cách có thể đo lường được so với các chuỗi bên. Cả chuỗi bên và chuỗi plasma đều có thể có các giao thức đồng thuận khác nhau, nhưng sự khác biệt là chuỗi plasma xuất bản các gốc Merkle cho mỗi khối trên Mạng chính Ethereum. Gốc khối là những mẩu thông tin nhỏ mà chúng ta có thể sử dụng để xác minh thông tin về các giao dịch xảy ra trên chuỗi plasma. Nếu một cuộc tấn công xảy ra trên chuỗi plasma, người dùng có thể rút tiền của họ một cách an toàn về Mạng chính bằng cách sử dụng các bằng chứng thích hợp.
+
+### Plasma so với phân mảnh {#plasma-vs-sharding}
+
+Cả chuỗi plasma và chuỗi phân mảnh đều định kỳ xuất bản các bằng chứng mã hóa cho Mạng chính Ethereum. Tuy nhiên, cả hai đều có các thuộc tính bảo mật khác nhau.
+
+Các chuỗi phân mảnh cam kết các "tiêu đề đối chiếu" với Mạng chính có chứa thông tin chi tiết về từng phân mảnh dữ liệu. Các nút trên Mạng chính xác minh và thực thi tính hợp lệ của các phân mảnh dữ liệu, giảm khả năng chuyển đổi phân mảnh không hợp lệ và bảo vệ mạng khỏi hoạt động độc hại.
+
+Plasma khác biệt vì Mạng chính chỉ nhận được thông tin tối thiểu về trạng thái của các chuỗi con. Điều này có nghĩa là Mạng chính không thể xác minh hiệu quả các giao dịch được thực hiện trên các chuỗi con, khiến chúng kém an toàn hơn.
+
+**Lưu ý** rằng việc phân mảnh chuỗi khối Ethereum không còn nằm trong lộ trình. Nó đã được thay thế bằng việc thay đổi quy mô thông qua các gộp giao dịch và [Danksharding](/roadmap/danksharding).
+
+### Sử dụng Plasma {#use-plasma}
+
+Nhiều dự án cung cấp các triển khai Plasma mà bạn có thể tích hợp vào các ứng dụng phi tập trung của mình:
+
+- [Polygon](https://polygon.technology/) (trước đây là Matic Network)
+
+## Đọc thêm {#further-reading}
+
+- [Tìm hiểu về Plasma](https://www.learnplasma.org/en/)
+- [Lời nhắc nhanh về ý nghĩa của "bảo mật được chia sẻ" và tại sao nó lại quan trọng như vậy](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/)
+- [Chuỗi bên so với Plasma so với Phân mảnh](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html)
+- [Tìm hiểu về Plasma, Phần 1: Các vấn đề cơ bản](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics)
+- [Sự sống và cái chết của Plasma](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#)
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/scaling/sidechains/index.md b/public/content/translations/vi/developers/docs/scaling/sidechains/index.md
new file mode 100644
index 00000000000..f907481ff7b
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/scaling/sidechains/index.md
@@ -0,0 +1,73 @@
+---
+title: Chuỗi bên
+description: Giới thiệu về chuỗi bên như một giải pháp mở rộng quy mô hiện đang được cộng đồng Ethereum sử dụng.
+lang: vi
+sidebarDepth: 3
+---
+
+Chuỗi bên là một chuỗi khối riêng biệt chạy độc lập với Ethereum và được kết nối với Mạng chính Ethereum bằng cầu nối hai chiều. Các chuỗi bên có thể có các thông số khối riêng biệt và [các thuật toán đồng thuận](/developers/docs/consensus-mechanisms/), thường được thiết kế để xử lý giao dịch hiệu quả. Tuy nhiên, việc sử dụng chuỗi bên có sự đánh đổi, vì chúng không kế thừa các thuộc tính bảo mật của Ethereum. Không giống như [các giải pháp mở rộng quy mô lớp 2](/layer-2/), các chuỗi bên không đăng các thay đổi trạng thái và dữ liệu giao dịch trở lại Mạng chính Ethereum.
+
+Các chuỗi bên cũng hy sinh một mức độ phân cấp hoặc bảo mật nhất định để đạt được thông lượng cao ([thế khó ba nan giải về khả năng mở rộng](https://vitalik.eth.limo/general/2021/05/23/scaling.html)). Tuy nhiên, Ethereum cam kết mở rộng quy mô mà không ảnh hưởng đến tính phi tập trung và bảo mật.
+
+## Các chuỗi bên hoạt động như thế nào? {#how-do-sidechains-work}
+
+Các chuỗi bên là các chuỗi khối độc lập, với lịch sử, lộ trình phát triển và các cân nhắc thiết kế khác nhau. Mặc dù chuỗi bên có thể có một số điểm tương đồng ở bề ngoài với Ethereum, nó có một số tính năng đặc biệt.
+
+### Các thuật toán đồng thuận {#consensus-algorithms}
+
+Một trong những phẩm chất làm cho các chuỗi bên trở nên độc nhất (tức là khác với Ethereum) là thuật toán đồng thuận được sử dụng. Các chuỗi bên không dựa vào Ethereum để có được sự đồng thuận và có thể chọn các giao thức đồng thuận thay thế phù hợp với nhu cầu của chúng. Một số ví dụ về thuật toán đồng thuận được sử dụng trên các chuỗi bên bao gồm:
+
+- [Bằng chứng ủy quyền](/developers/docs/consensus-mechanisms/poa/)
+- [Bằng chứng cổ phần được ủy quyền](https://en.bitcoin.it/wiki/Delegated_proof_of_stake)
+- [Khả năng chịu lỗi Byzantine](https://decrypt.co/resources/byzantine-fault-tolerance-what-is-it-explained).
+
+Giống như Ethereum, các chuỗi bên có các nút xác thực để xác minh và xử lý các giao dịch, sản xuất các khối và lưu trữ trạng thái chuỗi khối. Trình xác thực cũng chịu trách nhiệm duy trì sự đồng thuận trên toàn mạng và bảo mật mạng trước các cuộc tấn công độc hại.
+
+#### Các thông số khối {#block-parameters}
+
+Ethereum đặt ra các giới hạn về [thời gian tạo khối](/developers/docs/blocks/#block-time) (tức là thời gian cần thiết để tạo ra các khối mới) và [kích thước khối](/developers/docs/blocks/#block-size) (tức là lượng dữ liệu chứa trong mỗi khối được tính bằng gas). Ngược lại, các chuỗi bên thường áp dụng các thông số khác nhau, chẳng hạn như thời gian tạo khối nhanh hơn và giới hạn gas cao hơn, để đạt được thông lượng cao, giao dịch nhanh và phí thấp.
+
+Mặc dù điều này có một số lợi ích, nó có những tác động quan trọng đối với tính phi tập trung và bảo mật của mạng. Các thông số khối, như thời gian tạo khối nhanh và kích thước khối lớn, làm tăng độ khó của việc chạy một nút đầy đủ—để lại một vài "siêu nút" chịu trách nhiệm bảo mật chuỗi. Trong một kịch bản như vậy, khả năng thông đồng của trình xác thực hoặc một cuộc tiếp quản chuỗi độc hại sẽ tăng lên.
+
+Để các chuỗi khối mở rộng quy mô mà không gây hại cho tính phi tập trung, việc chạy một nút phải mở cho tất cả mọi người—không nhất thiết phải là các bên có phần cứng chuyên dụng. Đây là lý do tại sao các nỗ lực đang được tiến hành để đảm bảo mọi người đều có thể [chạy một nút đầy đủ](/developers/docs/nodes-and-clients/#why-should-i-run-an-ethereum-node) trên mạng Ethereum.
+
+### Khả năng tương thích với EVM {#evm-compatibility}
+
+Một số chuỗi bên tương thích với EVM và có thể thực thi các hợp đồng được phát triển cho [Máy ảo Ethereum (EVM)](/developers/docs/evm/). Các chuỗi bên tương thích với EVM hỗ trợ các hợp đồng thông minh [được viết bằng Solidity](/developers/docs/smart-contracts/languages/), cũng như các ngôn ngữ hợp đồng thông minh EVM khác, điều đó có nghĩa là các hợp đồng thông minh được viết cho Mạng chính Ethereum cũng sẽ hoạt động trên các chuỗi bên tương thích với EVM.
+
+Điều này có nghĩa là nếu bạn muốn sử dụng [ứng dụng phi tập trung](/developers/docs/dapps/) của mình trên một chuỗi bên, bạn chỉ cần triển khai [hợp đồng thông minh](/developers/docs/smart-contracts/) của mình tới chuỗi bên này. Nó trông, cảm nhận và hoạt động giống như Mạng chính—bạn viết các hợp đồng bằng Solidity và tương tác với chuỗi thông qua RPC của chuỗi bên.
+
+Vì các chuỗi bên tương thích với EVM, chúng được coi là một [giải pháp mở rộng quy mô](/developers/docs/scaling/) hữu ích cho các ứng dụng phi tập trung gốc của Ethereum. Với ứng dụng phi tập trung của bạn trên một chuỗi bên, người dùng có thể hưởng phí gas thấp hơn và giao dịch nhanh hơn, đặc biệt là nếu Mạng chính bị tắc nghẽn.
+
+Tuy nhiên, như đã giải thích trước đó, việc sử dụng chuỗi bên có những đánh đổi đáng kể. Mỗi chuỗi bên chịu trách nhiệm về bảo mật của riêng mình và không kế thừa các thuộc tính bảo mật của Ethereum. Điều này làm tăng khả năng xảy ra hành vi độc hại có thể ảnh hưởng đến người dùng của bạn hoặc khiến tiền của họ gặp rủi ro.
+
+### Chuyển động tài sản {#asset-movement}
+
+Để một chuỗi khối riêng biệt trở thành một chuỗi bên cho Mạng chính Ethereum, nó cần có khả năng tạo điều kiện thuận lợi cho việc chuyển tài sản từ và đến Mạng chính Ethereum. Khả năng tương tác này với Ethereum đạt được bằng cách sử dụng một cầu nối chuỗi khối. [Cầu nối](/bridges/) sử dụng các hợp đồng thông minh được triển khai trên Mạng chính Ethereum và một chuỗi bên để kiểm soát việc kết nối các quỹ giữa chúng.
+
+Trong khi các cầu nối giúp người dùng chuyển tiền giữa Ethereum và chuỗi bên, tài sản không được di chuyển vật lý qua hai chuỗi. Thay vào đó, các cơ chế thường liên quan đến việc đúc và đốt được sử dụng để chuyển giá trị qua các chuỗi. Tìm hiểu thêm về [cách các cầu nối hoạt động](/developers/docs/bridges/#how-do-bridges-work).
+
+## Ưu và nhược điểm của các chuỗi bên {#pros-and-cons-of-sidechains}
+
+| Ưu điểm | Nhược điểm |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Công nghệ nền tảng của các chuỗi bên đã được thiết lập tốt và được hưởng lợi từ nghiên cứu sâu rộng và những cải tiến trong thiết kế. | Các chuỗi bên đánh đổi một mức độ phi tập trung và không cần tin cậy nhất định để có khả năng mở rộng. |
+| Các chuỗi bên hỗ trợ tính toán chung và cung cấp khả năng tương thích với EVM (chúng có thể chạy các ứng dụng phi tập trung gốc của Ethereum). | Một chuỗi bên sử dụng một cơ chế đồng thuận riêng biệt và không được hưởng lợi từ các đảm bảo bảo mật của Ethereum. |
+| Các chuỗi bên sử dụng các mô hình đồng thuận khác nhau để xử lý các giao dịch một cách hiệu quả và giảm phí giao dịch cho người dùng. | Các chuỗi bên đòi hỏi các giả định tin cậy cao hơn (ví dụ: một số đại biểu của các trình xác thực chuỗi bên độc hại có thể thực hiện hành vi gian lận). |
+| Các chuỗi bên tương thích với EVM cho phép các ứng dụng phi tập trung mở rộng hệ sinh thái của chúng. | |
+
+### Sử dụng các chuỗi bên {#use-sidechains}
+
+Nhiều dự án cung cấp các triển khai chuỗi bên mà bạn có thể tích hợp vào các ứng dụng phi tập trung của mình:
+
+- [Polygon PoS](https://polygon.technology/solutions/polygon-pos)
+- [Skale](https://skale.network/)
+- [Chuỗi Gnosis (trước đây là xDai)](https://www.gnosischain.com/)
+- [Loom Network](https://loomx.io/)
+- [Metis Andromeda](https://www.metis.io/)
+
+## Đọc thêm {#further-reading}
+
+- [Mở rộng quy mô các ứng dụng phi tập trung của Ethereum thông qua các chuỗi bên](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _8 tháng 2, 2018 - Georgios Konstantopoulos_
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/scaling/state-channels/index.md b/public/content/translations/vi/developers/docs/scaling/state-channels/index.md
new file mode 100644
index 00000000000..3ec5e290a86
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/scaling/state-channels/index.md
@@ -0,0 +1,261 @@
+---
+title: Các Kênh Trạng Thái
+description: Giới thiệu về các kênh trạng thái và kênh thanh toán như một giải pháp mở rộng hiện đang được cộng đồng Ethereum sử dụng.
+lang: vi
+sidebarDepth: 3
+---
+
+Các kênh trạng thái cho phép người tham gia giao dịch ngoài chuỗi một cách an toàn trong khi giữ tương tác với Ethereum Mainnet ở mức tối thiểu. Các bên ngang hàng trong kênh có thể tiến hành một số lượng giao dịch ngoài chuỗi tùy ý trong khi chỉ cần gửi hai giao dịch trên chuỗi để mở và đóng kênh. Điều này cho phép thông lượng giao dịch cực cao và giúp người dùng giảm chi phí.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên đọc và hiểu các trang của chúng tôi về [mở rộng Ethereum](/developers/docs/scaling/) và [lớp 2](/layer-2/).
+
+## Kênh là gì? {#what-are-channels}
+
+Các blockchain công khai, chẳng hạn như Ethereum, đối mặt với những thách thức về khả năng mở rộng do kiến trúc phân tán của chúng: các giao dịch trên chuỗi phải được thực thi bởi tất cả các nút. Các nút phải có khả năng xử lý khối lượng giao dịch trong một khối bằng phần cứng khiêm tốn, đặt ra giới hạn về thông lượng giao dịch để giữ cho mạng lưới được phi tập trung. Các kênh blockchain giải quyết vấn đề này bằng cách cho phép người dùng tương tác ngoài chuỗi trong khi vẫn dựa vào sự bảo mật của chuỗi chính để thanh toán cuối cùng.
+
+Các kênh là các giao thức ngang hàng đơn giản cho phép hai bên thực hiện nhiều giao dịch với nhau và sau đó chỉ đăng kết quả cuối cùng lên blockchain. Kênh sử dụng mật mã học để chứng minh rằng dữ liệu tóm tắt mà họ tạo ra thực sự là kết quả của một tập hợp các giao dịch trung gian hợp lệ. Một hợp đồng thông minh ["đa chữ ký"](/developers/docs/smart-contracts/#multisig) đảm bảo các giao dịch được ký bởi các bên chính xác.
+
+Với các kênh, các thay đổi trạng thái được thực thi và xác thực bởi các bên quan tâm, giảm thiểu tính toán trên lớp thực thi của Ethereum. Điều này làm giảm tắc nghẽn trên Ethereum và cũng tăng tốc độ xử lý giao dịch cho người dùng.
+
+Mỗi kênh được quản lý bởi một [hợp đồng thông minh đa chữ ký](/developers/docs/smart-contracts/#multisig) chạy trên Ethereum. Để mở một kênh, những người tham gia triển khai hợp đồng kênh trên chuỗi và gửi tiền vào đó. Cả hai bên cùng ký một bản cập nhật trạng thái để khởi tạo trạng thái của kênh, sau đó họ có thể giao dịch nhanh chóng và tự do ngoài chuỗi.
+
+Để đóng kênh, người tham gia gửi trạng thái cuối cùng đã được đồng thuận của kênh lên trên chuỗi. Sau đó, hợp đồng thông minh phân phối số tiền đã khóa theo số dư của mỗi người tham gia trong trạng thái cuối cùng của kênh.
+
+Các kênh ngang hàng đặc biệt hữu ích trong các tình huống mà một số người tham gia được xác định trước muốn giao dịch với tần suất cao mà không phải chịu chi phí phát sinh rõ ràng. Các kênh blockchain được chia thành hai loại: **kênh thanh toán** và **kênh trạng thái**.
+
+## Kênh thanh toán {#payment-channels}
+
+Một kênh thanh toán được mô tả tốt nhất là một "sổ cái hai chiều" được duy trì chung bởi hai người dùng. Số dư ban đầu của sổ cái là tổng số tiền gửi được khóa trong hợp đồng trên chuỗi trong giai đoạn mở kênh. Việc chuyển tiền qua kênh thanh toán có thể được thực hiện ngay lập tức và không cần sự tham gia của chính blockchain, ngoại trừ việc tạo kênh trên chuỗi một lần ban đầu và việc đóng kênh cuối cùng.
+
+Các bản cập nhật số dư của sổ cái (tức là trạng thái của kênh thanh toán) yêu cầu sự chấp thuận của tất cả các bên trong kênh. Một bản cập nhật kênh, được ký bởi tất cả những người tham gia kênh, được coi là cuối cùng, giống như một giao dịch trên Ethereum.
+
+Các kênh thanh toán là một trong những giải pháp mở rộng sớm nhất được thiết kế để giảm thiểu hoạt động tốn kém trên chuỗi của các tương tác người dùng đơn giản (ví dụ: chuyển ETH, hoán đổi nguyên tử, thanh toán vi mô). Những người tham gia kênh có thể thực hiện số lượng giao dịch tức thì, không mất phí không giới hạn với nhau miễn là tổng số tiền chuyển của họ không vượt quá số token đã gửi.
+
+## Kênh trạng thái {#state-channels}
+
+Ngoài việc hỗ trợ thanh toán ngoài chuỗi, các kênh thanh toán đã không chứng tỏ được sự hữu ích trong việc xử lý logic chuyển đổi trạng thái chung. Các kênh trạng thái được tạo ra để giải quyết vấn đề này và làm cho các kênh trở nên hữu ích cho việc mở rộng quy mô tính toán đa dụng.
+
+Các kênh trạng thái vẫn có nhiều điểm chung với các kênh thanh toán. Ví dụ, người dùng tương tác bằng cách trao đổi các thông điệp được ký bằng mật mã (giao dịch), mà những người tham gia kênh khác cũng phải ký. Nếu một bản cập nhật trạng thái được đề xuất không được tất cả những người tham gia ký, nó sẽ bị coi là không hợp lệ.
+
+Tuy nhiên, ngoài việc giữ số dư của người dùng, kênh còn theo dõi trạng thái hiện tại của bộ lưu trữ của hợp đồng (tức là giá trị của các biến hợp đồng).
+
+Điều này giúp có thể thực thi một hợp đồng thông minh ngoài chuỗi giữa hai người dùng. Trong kịch bản này, các bản cập nhật trạng thái nội bộ của hợp đồng thông minh chỉ yêu cầu sự chấp thuận của các bên ngang hàng đã tạo ra kênh.
+
+Mặc dù điều này giải quyết vấn đề về khả năng mở rộng đã được mô tả trước đó, nó có những hàm ý về bảo mật. Trên Ethereum, tính hợp lệ của các chuyển đổi trạng thái được thực thi bởi giao thức đồng thuận của mạng. Điều này làm cho việc đề xuất một bản cập nhật không hợp lệ cho trạng thái của hợp đồng thông minh hoặc thay đổi việc thực thi hợp đồng thông minh là không thể.
+
+Các kênh trạng thái không có các đảm bảo bảo mật tương tự. Ở một mức độ nào đó, một kênh trạng thái là một phiên bản thu nhỏ của Mainnet. Với một tập hợp người tham gia hạn chế thực thi các quy tắc, khả năng xảy ra hành vi độc hại (ví dụ: đề xuất các bản cập nhật trạng thái không hợp lệ) tăng lên. Các kênh trạng thái có được sự bảo mật từ một hệ thống phân xử tranh chấp dựa trên [bằng chứng gian lận](/glossary/#fraud-proof).
+
+## Cách hoạt động của các kênh trạng thái {#how-state-channels-work}
+
+Về cơ bản, hoạt động trong một kênh trạng thái là một phiên tương tác liên quan đến người dùng và một hệ thống blockchain. Người dùng chủ yếu giao tiếp với nhau ngoài chuỗi và chỉ tương tác với blockchain cơ sở để mở kênh, đóng kênh hoặc giải quyết các tranh chấp tiềm tàng giữa những người tham gia.
+
+Phần sau đây trình bày quy trình làm việc cơ bản của một kênh trạng thái:
+
+### Mở kênh {#opening-the-channel}
+
+Việc mở một kênh yêu cầu người tham gia cam kết tiền vào một hợp đồng thông minh trên Mainnet. Khoản tiền gửi cũng có chức năng như một tab ảo, vì vậy các bên tham gia có thể giao dịch tự do mà không cần phải thanh toán ngay lập tức. Chỉ khi kênh được hoàn tất trên chuỗi, các bên mới thanh toán cho nhau và rút lại những gì còn lại trong tab của họ.
+
+Khoản tiền gửi này cũng đóng vai trò như một khoản thế chấp để đảm bảo hành vi trung thực từ mỗi người tham gia. Nếu người gửi tiền bị phát hiện có hành vi độc hại trong giai đoạn giải quyết tranh chấp, hợp đồng sẽ cắt giảm (slash) tiền gửi của họ.
+
+Các bên ngang hàng trong kênh phải ký một trạng thái ban đầu mà tất cả họ đều đồng ý. Điều này đóng vai trò là khối khởi nguồn của kênh trạng thái, sau đó người dùng có thể bắt đầu giao dịch.
+
+### Sử dụng kênh {#using-the-channel}
+
+Sau khi khởi tạo trạng thái của kênh, các bên ngang hàng tương tác bằng cách ký các giao dịch và gửi cho nhau để phê duyệt. Những người tham gia bắt đầu cập nhật trạng thái bằng các giao dịch này và ký các bản cập nhật trạng thái từ những người khác. Mỗi giao dịch bao gồm những điều sau:
+
+- Một **nonce**, hoạt động như một ID duy nhất cho các giao dịch và ngăn chặn các cuộc tấn công phát lại. Nó cũng xác định thứ tự mà các bản cập nhật trạng thái đã xảy ra (điều này rất quan trọng để giải quyết tranh chấp)
+
+- Trạng thái cũ của kênh
+
+- Trạng thái mới của kênh
+
+- Giao dịch kích hoạt quá trình chuyển đổi trạng thái (ví dụ: Alice gửi 5 ETH cho Bob)
+
+Các bản cập nhật trạng thái trong kênh không được phát trên chuỗi như trường hợp thông thường khi người dùng tương tác trên Mainnet, điều này phù hợp với mục tiêu của các kênh trạng thái là giảm thiểu dấu chân trên chuỗi. Miễn là những người tham gia đồng ý về các bản cập nhật trạng thái, chúng có tính cuối cùng như một giao dịch Ethereum. Những người tham gia chỉ cần phụ thuộc vào sự đồng thuận của Mainnet nếu có tranh chấp phát sinh.
+
+### Đóng kênh {#closing-the-channel}
+
+Việc đóng một kênh trạng thái yêu cầu gửi trạng thái cuối cùng, đã được đồng thuận của kênh đến hợp đồng thông minh trên chuỗi. Các chi tiết được tham chiếu trong bản cập nhật trạng thái bao gồm số lần di chuyển của mỗi người tham gia và danh sách các giao dịch đã được phê duyệt.
+
+Sau khi xác minh rằng bản cập nhật trạng thái là hợp lệ (tức là nó được ký bởi tất cả các bên), hợp đồng thông minh sẽ hoàn tất kênh và phân phối số tiền đã khóa theo kết quả của kênh. Các khoản thanh toán được thực hiện ngoài chuỗi được áp dụng cho trạng thái của Ethereum và mỗi người tham gia nhận được phần còn lại của số tiền đã khóa.
+
+Kịch bản được mô tả ở trên đại diện cho những gì xảy ra trong trường hợp thuận lợi. Đôi khi, người dùng có thể không đạt được thỏa thuận và hoàn tất kênh (trường hợp không thuận lợi). Bất kỳ điều nào sau đây có thể đúng với tình huống này:
+
+- Những người tham gia ngoại tuyến và không đề xuất được các chuyển đổi trạng thái
+
+- Những người tham gia từ chối đồng ký các bản cập nhật trạng thái hợp lệ
+
+- Những người tham gia cố gắng hoàn tất kênh bằng cách đề xuất một bản cập nhật trạng thái cũ cho hợp đồng trên chuỗi
+
+- Những người tham gia đề xuất các chuyển đổi trạng thái không hợp lệ để người khác ký
+
+Bất cứ khi nào sự đồng thuận giữa các bên tham gia trong một kênh bị phá vỡ, lựa chọn cuối cùng là dựa vào sự đồng thuận của Mainnet để thực thi trạng thái cuối cùng, hợp lệ của kênh. Trong trường hợp này, việc đóng kênh trạng thái đòi hỏi phải giải quyết các tranh chấp trên chuỗi.
+
+### Giải quyết tranh chấp {#settling-disputes}
+
+Thông thường, các bên trong một kênh đồng ý về việc đóng kênh trước và đồng ký vào quá trình chuyển đổi trạng thái cuối cùng, mà họ gửi đến hợp đồng thông minh. Khi bản cập nhật được phê duyệt trên chuỗi, việc thực thi hợp đồng thông minh ngoài chuỗi kết thúc và những người tham gia thoát khỏi kênh với tiền của họ.
+
+Tuy nhiên, một bên có thể gửi một yêu cầu trên chuỗi để kết thúc việc thực thi của hợp đồng thông minh và hoàn tất kênh—mà không cần chờ sự chấp thuận của đối tác. Nếu bất kỳ tình huống phá vỡ sự đồng thuận nào được mô tả trước đó xảy ra, một trong hai bên có thể kích hoạt hợp đồng trên chuỗi để đóng kênh và phân phối tiền. Điều này cung cấp **tính không cần tin cậy**, đảm bảo rằng các bên trung thực có thể rút tiền gửi của họ bất kỳ lúc nào, bất kể hành động của bên kia.
+
+Để xử lý việc thoát kênh, người dùng phải gửi bản cập nhật trạng thái hợp lệ cuối cùng của ứng dụng đến hợp đồng trên chuỗi. Nếu điều này được xác nhận (tức là nó có chữ ký của tất cả các bên), thì tiền sẽ được phân phối lại theo hướng có lợi cho họ.
+
+Tuy nhiên, có một sự chậm trễ trong việc thực hiện các yêu cầu thoát của một người dùng. Nếu yêu cầu kết thúc kênh được nhất trí phê duyệt, thì giao dịch thoát trên chuỗi sẽ được thực hiện ngay lập tức.
+
+Sự chậm trễ xảy ra trong các lần thoát của một người dùng do khả năng có các hành động gian lận. Ví dụ, một người tham gia kênh có thể cố gắng hoàn tất kênh trên Ethereum bằng cách gửi một bản cập nhật trạng thái cũ hơn trên chuỗi.
+
+Để đối phó, các kênh trạng thái cho phép người dùng trung thực thách thức các bản cập nhật trạng thái không hợp lệ bằng cách gửi trạng thái mới nhất, hợp lệ của kênh lên trên chuỗi. Các kênh trạng thái được thiết kế sao cho các bản cập nhật trạng thái mới hơn, được đồng thuận sẽ ghi đè lên các bản cập nhật trạng thái cũ hơn.
+
+Khi một bên ngang hàng kích hoạt hệ thống giải quyết tranh chấp trên chuỗi, bên còn lại được yêu cầu phải phản hồi trong một giới hạn thời gian (được gọi là cửa sổ thách thức). Điều này cho phép người dùng thách thức giao dịch thoát, đặc biệt nếu bên kia đang áp dụng một bản cập nhật cũ.
+
+Dù trong trường hợp nào, người dùng kênh luôn có đảm bảo về tính cuối cùng mạnh mẽ: nếu quá trình chuyển đổi trạng thái mà họ sở hữu được tất cả các thành viên ký và là bản cập nhật gần đây nhất, thì nó có tính cuối cùng tương đương với một giao dịch trên chuỗi thông thường. Họ vẫn phải thách thức bên kia trên chuỗi, nhưng kết quả duy nhất có thể xảy ra là hoàn tất trạng thái hợp lệ cuối cùng mà họ nắm giữ.
+
+### Các kênh trạng thái tương tác với Ethereum như thế nào? {#how-do-state-channels-interact-with-ethereum}
+
+Mặc dù tồn tại dưới dạng các giao thức ngoài chuỗi, các kênh trạng thái có một thành phần trên chuỗi: hợp đồng thông minh được triển khai trên Ethereum khi mở kênh. Hợp đồng này kiểm soát các tài sản được gửi vào kênh, xác minh các bản cập nhật trạng thái và phân xử các tranh chấp giữa những người tham gia.
+
+Các kênh trạng thái không công bố dữ liệu giao dịch hoặc cam kết trạng thái lên Mainnet, không giống như các giải pháp mở rộng [lớp 2](/layer-2/). Tuy nhiên, chúng được kết nối với Mainnet nhiều hơn, chẳng hạn như [các chuỗi bên](/developers/docs/scaling/sidechains/), khiến chúng an toàn hơn phần nào.
+
+Các kênh trạng thái dựa vào giao thức Ethereum chính cho những điều sau:
+
+#### 1. Tính khả dụng {#liveness}
+
+Hợp đồng trên chuỗi được triển khai khi mở kênh chịu trách nhiệm về chức năng của kênh. Nếu hợp đồng đang chạy trên Ethereum, thì kênh luôn có sẵn để sử dụng. Ngược lại, một chuỗi bên luôn có thể thất bại, ngay cả khi Mainnet đang hoạt động, khiến tiền của người dùng gặp rủi ro.
+
+#### 2. Bảo mật {#security}
+
+Ở một mức độ nào đó, các kênh trạng thái dựa vào Ethereum để cung cấp bảo mật và bảo vệ người dùng khỏi các bên ngang hàng độc hại. Như đã thảo luận trong các phần sau, các kênh sử dụng cơ chế bằng chứng gian lận cho phép người dùng thách thức các nỗ lực hoàn tất kênh bằng một bản cập nhật không hợp lệ hoặc đã cũ.
+
+Trong trường hợp này, bên trung thực cung cấp trạng thái hợp lệ mới nhất của kênh như một bằng chứng gian lận cho hợp đồng trên chuỗi để xác minh. Bằng chứng gian lận cho phép các bên không tin tưởng lẫn nhau thực hiện các giao dịch ngoài chuỗi mà không gây rủi ro cho tiền của họ trong quá trình này.
+
+#### 3. Tính kết luận cuối cùng {#finality}
+
+Các bản cập nhật trạng thái được người dùng kênh ký chung được coi là tốt như các giao dịch trên chuỗi. Tuy nhiên, tất cả hoạt động trong kênh chỉ đạt được tính cuối cùng thực sự khi kênh được đóng trên Ethereum.
+
+Trong trường hợp lạc quan, cả hai bên có thể hợp tác và ký vào bản cập nhật trạng thái cuối cùng và gửi lên chuỗi để đóng kênh, sau đó tiền sẽ được phân phối theo trạng thái cuối cùng của kênh. Trong trường hợp bi quan, khi ai đó cố gắng gian lận bằng cách đăng một bản cập nhật trạng thái không chính xác trên chuỗi, giao dịch của họ sẽ không được hoàn tất cho đến khi cửa sổ thách thức kết thúc.
+
+## Các kênh trạng thái ảo {#virtual-state-channels}
+
+Việc triển khai một kênh trạng thái một cách đơn giản sẽ là triển khai một hợp đồng mới khi hai người dùng muốn thực thi một ứng dụng ngoài chuỗi. Điều này không chỉ không khả thi mà còn phủ nhận hiệu quả chi phí của các kênh trạng thái (chi phí giao dịch trên chuỗi có thể tăng lên nhanh chóng).
+
+Để giải quyết vấn đề này, "các kênh ảo" đã được tạo ra. Không giống như các kênh thông thường yêu cầu các giao dịch trên chuỗi để mở và kết thúc, một kênh ảo có thể được mở, thực thi và hoàn tất mà không cần tương tác với chuỗi chính. Thậm chí có thể giải quyết các tranh chấp ngoài chuỗi bằng phương pháp này.
+
+Hệ thống này dựa trên sự tồn tại của cái gọi là "các kênh sổ cái", đã được cấp vốn trên chuỗi. Các kênh ảo giữa hai bên có thể được xây dựng trên một kênh sổ cái hiện có, với (các) chủ sở hữu của kênh sổ cái đóng vai trò trung gian.
+
+Người dùng trong mỗi kênh ảo tương tác thông qua một phiên bản hợp đồng mới, với kênh sổ cái có thể hỗ trợ nhiều phiên bản hợp đồng. Trạng thái của kênh sổ cái cũng chứa nhiều hơn một trạng thái lưu trữ hợp đồng, cho phép thực thi song song các ứng dụng ngoài chuỗi giữa những người dùng khác nhau.
+
+Giống như các kênh thông thường, người dùng trao đổi các bản cập nhật trạng thái để tiến triển máy trạng thái. Trừ khi có tranh chấp phát sinh, bên trung gian chỉ cần được liên hệ khi mở hoặc kết thúc kênh.
+
+### Các kênh thanh toán ảo {#virtual-payment-channels}
+
+Các kênh thanh toán ảo hoạt động dựa trên cùng một ý tưởng với các kênh trạng thái ảo: những người tham gia được kết nối với cùng một mạng có thể chuyển các thông điệp mà không cần phải mở một kênh mới trên chuỗi. Trong các kênh thanh toán ảo, việc chuyển giá trị được định tuyến thông qua một hoặc nhiều bên trung gian, với sự đảm bảo rằng chỉ người nhận dự định mới có thể nhận được tiền đã chuyển.
+
+## Các ứng dụng của kênh trạng thái {#applications-of-state-channels}
+
+### Thanh toán {#payments}
+
+Các kênh blockchain ban đầu là các giao thức đơn giản cho phép hai người tham gia thực hiện các giao dịch chuyển tiền ngoài chuỗi nhanh chóng, phí thấp mà không phải trả phí giao dịch cao trên Mainnet. Ngày nay, các kênh thanh toán vẫn hữu ích cho các ứng dụng được thiết kế để trao đổi và gửi ether và token.
+
+Thanh toán dựa trên kênh có những ưu điểm sau:
+
+1. **Thông lượng**: Số lượng giao dịch ngoài chuỗi trên mỗi kênh không liên quan đến thông lượng của Ethereum, vốn bị ảnh hưởng bởi nhiều yếu tố khác nhau, đặc biệt là kích thước khối và thời gian khối. Bằng cách thực thi các giao dịch ngoài chuỗi, các kênh blockchain có thể đạt được thông lượng cao hơn.
+
+2. **Quyền riêng tư**: Vì các kênh tồn tại ngoài chuỗi, chi tiết về các tương tác giữa những người tham gia không được ghi lại trên blockchain công khai của Ethereum. Người dùng kênh chỉ phải tương tác trên chuỗi khi cấp vốn và đóng kênh hoặc giải quyết tranh chấp. Do đó, các kênh rất hữu ích cho những cá nhân muốn có các giao dịch riêng tư hơn.
+
+3. **Độ trễ**: Các giao dịch ngoài chuỗi được thực hiện giữa những người tham gia kênh có thể được giải quyết ngay lập tức, nếu cả hai bên hợp tác, giúp giảm sự chậm trễ. Ngược lại, việc gửi một giao dịch trên Mainnet đòi hỏi phải đợi các nút xử lý giao dịch, tạo một khối mới với giao dịch và đạt được sự đồng thuận. Người dùng cũng có thể cần đợi thêm các xác nhận khối trước khi coi một giao dịch là đã hoàn tất.
+
+4. **Chi phí**: Các kênh trạng thái đặc biệt hữu ích trong các tình huống mà một nhóm người tham gia sẽ trao đổi nhiều bản cập nhật trạng thái trong một thời gian dài. Chi phí duy nhất phát sinh là việc mở và đóng hợp đồng thông minh của kênh trạng thái; mọi thay đổi trạng thái giữa việc mở và đóng kênh sẽ rẻ hơn so với lần trước vì chi phí thanh toán được phân bổ tương ứng.
+
+Việc triển khai các kênh trạng thái trên các giải pháp lớp 2, chẳng hạn như [rollup](/developers/docs/scaling/#rollups), có thể khiến chúng trở nên hấp dẫn hơn nữa cho các khoản thanh toán. Mặc dù các kênh cung cấp các khoản thanh toán rẻ, chi phí thiết lập hợp đồng trên chuỗi trên Mainnet trong giai đoạn mở có thể trở nên đắt đỏ—đặc biệt là khi phí gas tăng đột biến. Các rollup dựa trên Ethereum cung cấp [phí giao dịch thấp hơn](https://l2fees.info/) và có thể giảm chi phí phát sinh cho người tham gia kênh bằng cách giảm phí thiết lập.
+
+### Thanh toán vi mô {#microtransactions}
+
+Thanh toán vi mô là các khoản thanh toán có giá trị thấp (ví dụ: thấp hơn một phần nhỏ của đô la) mà các doanh nghiệp không thể xử lý mà không bị thua lỗ. Các thực thể này phải trả tiền cho các nhà cung cấp dịch vụ thanh toán, điều mà họ không thể làm nếu lợi nhuận trên các khoản thanh toán của khách hàng quá thấp để có thể kiếm lời.
+
+Các kênh thanh toán giải quyết vấn đề này bằng cách giảm chi phí phát sinh liên quan đến các giao dịch vi mô. Ví dụ, một Nhà cung cấp Dịch vụ Internet (ISP) có thể mở một kênh thanh toán với một khách hàng, cho phép họ truyền các khoản thanh toán nhỏ mỗi khi họ sử dụng dịch vụ.
+
+Ngoài chi phí mở và đóng kênh, người tham gia không phải chịu thêm chi phí nào cho các giao dịch vi mô (không có phí gas). Đây là một tình huống đôi bên cùng có lợi vì khách hàng có sự linh hoạt hơn trong việc trả bao nhiêu cho các dịch vụ và các doanh nghiệp không bị mất đi các giao dịch vi mô có lợi nhuận.
+
+### Các ứng dụng phi tập trung {#decentralized-applications}
+
+Giống như các kênh thanh toán, các kênh trạng thái có thể thực hiện các khoản thanh toán có điều kiện theo các trạng thái cuối cùng của máy trạng thái. Các kênh trạng thái cũng có thể hỗ trợ logic chuyển đổi trạng thái tùy ý, giúp chúng hữu ích cho việc thực thi các ứng dụng chung ngoài chuỗi.
+
+Các kênh trạng thái thường bị giới hạn trong các ứng dụng theo lượt đơn giản, vì điều này giúp quản lý dễ dàng hơn các khoản tiền đã cam kết cho hợp đồng trên chuỗi. Ngoài ra, với một số lượng hạn chế các bên cập nhật trạng thái của ứng dụng ngoài chuỗi theo từng khoảng thời gian, việc trừng phạt hành vi không trung thực là tương đối đơn giản.
+
+Hiệu quả của một ứng dụng kênh trạng thái cũng phụ thuộc vào thiết kế của nó. Ví dụ, một nhà phát triển có thể triển khai hợp đồng kênh ứng dụng trên chuỗi một lần và cho phép những người chơi khác sử dụng lại ứng dụng mà không cần phải lên chuỗi. Trong trường hợp này, kênh ứng dụng ban đầu đóng vai trò như một kênh sổ cái hỗ trợ nhiều kênh ảo, mỗi kênh chạy một phiên bản mới của hợp đồng thông minh của ứng dụng ngoài chuỗi.
+
+Một trường hợp sử dụng tiềm năng cho các ứng dụng kênh trạng thái là các trò chơi hai người chơi đơn giản, trong đó tiền được phân phối dựa trên kết quả của trò chơi. Lợi ích ở đây là người chơi không cần phải tin tưởng nhau (tính không cần tin cậy) và hợp đồng trên chuỗi, chứ không phải người chơi, kiểm soát việc phân bổ tiền và giải quyết tranh chấp (tính phi tập trung).
+
+Các trường hợp sử dụng khả thi khác cho các ứng dụng kênh trạng thái bao gồm quyền sở hữu tên ENS, sổ cái NFT, và nhiều hơn nữa.
+
+### Chuyển khoản nguyên tử {#atomic-transfers}
+
+Các kênh thanh toán ban đầu bị giới hạn trong việc chuyển tiền giữa hai bên, hạn chế khả năng sử dụng của chúng. Tuy nhiên, sự ra đời của các kênh ảo đã cho phép các cá nhân định tuyến các giao dịch chuyển tiền qua các bên trung gian (tức là nhiều kênh p2p) mà không cần phải mở một kênh mới trên chuỗi.
+
+Thường được mô tả là "chuyển tiền đa chặng", các khoản thanh toán được định tuyến là nguyên tử (tức là tất cả các phần của giao dịch đều thành công hoặc nó hoàn toàn thất bại). Chuyển khoản nguyên tử sử dụng [Hợp đồng Khóa thời gian Băm (HTLCs)](https://en.bitcoin.it/wiki/Hash_Time_Locked_Contracts) để đảm bảo thanh toán chỉ được giải phóng nếu các điều kiện nhất định được đáp ứng, do đó giảm rủi ro đối tác.
+
+## Nhược điểm của việc sử dụng các kênh trạng thái {#drawbacks-of-state-channels}
+
+### Các giả định về tính khả dụng {#liveness-assumptions}
+
+Để đảm bảo hiệu quả, các kênh trạng thái đặt ra giới hạn thời gian về khả năng của những người tham gia kênh để phản hồi các tranh chấp. Quy tắc này giả định rằng các bên ngang hàng sẽ luôn trực tuyến để giám sát hoạt động của kênh và tranh luận các thách thức khi cần thiết.
+
+Trong thực tế, người dùng có thể ngoại tuyến vì những lý do ngoài tầm kiểm soát của họ (ví dụ: kết nối internet kém, lỗi cơ học, v.v.). Nếu một người dùng trung thực ngoại tuyến, một bên ngang hàng độc hại có thể khai thác tình hình bằng cách trình bày các trạng thái trung gian cũ cho hợp đồng phân xử và đánh cắp số tiền đã cam kết.
+
+Một số kênh sử dụng "watchtowers" (tháp canh)—các thực thể chịu trách nhiệm theo dõi các sự kiện tranh chấp trên chuỗi thay cho những người khác và thực hiện các hành động cần thiết, như cảnh báo các bên liên quan. Tuy nhiên, điều này có thể làm tăng chi phí sử dụng một kênh trạng thái.
+
+### Tính không sẵn có của dữ liệu {#data-unavailability}
+
+Như đã giải thích trước đó, việc thách thức một tranh chấp không hợp lệ đòi hỏi phải trình bày trạng thái mới nhất, hợp lệ của kênh trạng thái. Đây là một quy tắc khác dựa trên một giả định—rằng người dùng có quyền truy cập vào trạng thái mới nhất của kênh.
+
+Mặc dù việc mong đợi người dùng kênh lưu trữ các bản sao của trạng thái ứng dụng ngoài chuỗi là hợp lý, dữ liệu này có thể bị mất do lỗi hoặc hỏng hóc cơ học. Nếu người dùng không sao lưu dữ liệu, họ chỉ có thể hy vọng rằng bên kia không hoàn tất một yêu cầu thoát không hợp lệ bằng cách sử dụng các chuyển đổi trạng thái cũ mà họ sở hữu.
+
+Người dùng Ethereum không phải đối mặt với vấn đề này vì mạng lưới thực thi các quy tắc về tính khả dụng của dữ liệu. Dữ liệu giao dịch được lưu trữ và lan truyền bởi tất cả các nút và có sẵn để người dùng tải xuống nếu và khi cần thiết.
+
+### Các vấn đề về thanh khoản {#liquidity-issues}
+
+Để thiết lập một kênh blockchain, những người tham gia cần phải khóa tiền trong một hợp đồng thông minh trên chuỗi trong suốt vòng đời của kênh. Điều này làm giảm tính thanh khoản của người dùng kênh và cũng giới hạn các kênh cho những người có đủ khả năng để giữ tiền bị khóa trên Mainnet.
+
+Tuy nhiên, các kênh sổ cái—do một nhà cung cấp dịch vụ ngoài chuỗi (OSP) vận hành—có thể giảm bớt các vấn đề về thanh khoản cho người dùng. Hai bên ngang hàng được kết nối với một kênh sổ cái có thể tạo ra một kênh ảo, mà họ có thể mở và hoàn tất hoàn toàn ngoài chuỗi, bất cứ lúc nào họ muốn.
+
+Các nhà cung cấp dịch vụ ngoài chuỗi cũng có thể mở các kênh với nhiều bên ngang hàng, làm cho chúng hữu ích cho việc định tuyến thanh toán. Tất nhiên, người dùng phải trả phí cho các OSP cho dịch vụ của họ, điều này có thể không mong muốn đối với một số người.
+
+### Tấn công gây rối {#griefing-attacks}
+
+Các cuộc tấn công gây rối là một đặc điểm phổ biến của các hệ thống dựa trên bằng chứng gian lận. Một cuộc tấn công gây rối không trực tiếp mang lại lợi ích cho kẻ tấn công nhưng gây ra sự phiền toái (tức là, tổn hại) cho nạn nhân, do đó có tên gọi này.
+
+Việc chứng minh gian lận dễ bị tấn công gây rối vì bên trung thực phải phản hồi mọi tranh chấp, ngay cả những tranh chấp không hợp lệ, nếu không sẽ có nguy cơ mất tiền. Một người tham gia độc hại có thể quyết định liên tục đăng các chuyển đổi trạng thái cũ trên chuỗi, buộc bên trung thực phải phản hồi bằng trạng thái hợp lệ. Chi phí của các giao dịch trên chuỗi đó có thể tăng lên nhanh chóng, khiến các bên trung thực bị thiệt hại trong quá trình này.
+
+### Tập hợp người tham gia được xác định trước {#predefined-participant-sets}
+
+Theo thiết kế, số lượng người tham gia tạo nên một kênh trạng thái vẫn cố định trong suốt vòng đời của nó. Điều này là do việc cập nhật tập hợp người tham gia sẽ làm phức tạp hoạt động của kênh, đặc biệt là khi cấp vốn cho kênh hoặc giải quyết tranh chấp. Việc thêm hoặc bớt người tham gia cũng sẽ yêu cầu hoạt động trên chuỗi bổ sung, làm tăng chi phí phát sinh cho người dùng.
+
+Mặc dù điều này làm cho các kênh trạng thái dễ hiểu hơn, nó lại hạn chế tính hữu dụng của các thiết kế kênh đối với các nhà phát triển ứng dụng. Điều này một phần giải thích tại sao các kênh trạng thái đã bị loại bỏ để chuyển sang các giải pháp mở rộng khác, chẳng hạn như rollup.
+
+### Xử lý giao dịch song song {#parallel-transaction-processing}
+
+Những người tham gia trong kênh trạng thái gửi các bản cập nhật trạng thái theo lượt, đó là lý do tại sao chúng hoạt động tốt nhất cho "các ứng dụng theo lượt" (ví dụ: một ván cờ vua hai người chơi). Điều này loại bỏ nhu cầu xử lý các bản cập nhật trạng thái đồng thời và giảm bớt công việc mà hợp đồng trên chuỗi phải làm để trừng phạt những người đăng bản cập nhật cũ. Tuy nhiên, một tác dụng phụ của thiết kế này là các giao dịch phụ thuộc lẫn nhau, làm tăng độ trễ và làm giảm trải nghiệm người dùng tổng thể.
+
+Một số kênh trạng thái giải quyết vấn đề này bằng cách sử dụng thiết kế "song công toàn phần" (full-duplex) tách trạng thái ngoài chuỗi thành hai trạng thái "đơn công" (simplex) một chiều, cho phép cập nhật trạng thái đồng thời. Các thiết kế như vậy cải thiện thông lượng ngoài chuỗi và giảm sự chậm trễ của giao dịch.
+
+## Sử dụng các kênh trạng thái {#use-state-channels}
+
+Nhiều dự án cung cấp các triển khai của các kênh trạng thái mà bạn có thể tích hợp vào các ứng dụng phi tập trung của mình:
+
+- [Connext](https://connext.network/)
+- [Kchannels](https://www.kchannels.io/)
+- [Perun](https://perun.network/)
+- [Raiden](https://raiden.network/)
+- [Statechannels.org](https://statechannels.org/)
+
+## Đọc thêm {#further-reading}
+
+**Các kênh trạng thái**
+
+- [Tìm hiểu về các giải pháp mở rộng lớp 2 của Ethereum: Kênh trạng thái, Plasma và Truebit](https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4) _– Josh Stark, 12 tháng 2 năm 2018_
+- [Các kênh trạng thái - một lời giải thích](https://www.jeffcoleman.ca/state-channels/) _Ngày 6 tháng 11 năm 2015 - Jeff Coleman_
+- [Những điều cơ bản về các kênh trạng thái](https://education.district0x.io/general-topics/understanding-ethereum/basics-state-channels/) _District0x_
+- [Các kênh trạng thái Blockchain: Tình hình hiện tại](https://ieeexplore.ieee.org/document/9627997)
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/scaling/validium/index.md b/public/content/translations/vi/developers/docs/scaling/validium/index.md
new file mode 100644
index 00000000000..f59bea52b16
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/scaling/validium/index.md
@@ -0,0 +1,166 @@
+---
+title: Validium
+description: Giới thiệu về một giải pháp mở rộng, Validium hiện đang được cộng đồng Ethereum sử dụng.
+lang: vi
+sidebarDepth: 3
+---
+
+Validium là một [giải pháp mở rộng quy mô](/developers/docs/scaling/) thực thi tính toàn vẹn của các giao dịch bằng các bằng chứng hợp lệ như [ZK-rollup](/developers/docs/scaling/zk-rollups/), nhưng không lưu trữ dữ liệu giao dịch trên Mạng chính Ethereum. Mặc dù tính khả dụng của dữ liệu ngoài chuỗi mang lại những sự đánh đổi, nhưng nó có thể dẫn đến những cải tiến lớn về khả năng mở rộng (validium có thể xử lý [khoảng 9.000 giao dịch trở lên mỗi giây](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263)).
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên đọc và hiểu trang của chúng tôi về [mở rộng quy mô Ethereum](/developers/docs/scaling/) và [lớp 2](/layer-2).
+
+## Validium là gì? {#what-is-validium}
+
+Validium là các giải pháp mở rộng quy mô sử dụng tính khả dụng và tính toán dữ liệu ngoài chuỗi, được thiết kế để cải thiện thông lượng bằng cách xử lý các giao dịch bên ngoài Mạng chính Ethereum. Giống như các ZK-rollup, validium xuất bản [bằng chứng không kiến thức](/glossary/#zk-proof) để xác minh các giao dịch ngoài chuỗi trên Ethereum. Điều này ngăn chặn các chuyển đổi trạng thái không hợp lệ và tăng cường đảm bảo an ninh cho chuỗi validium.
+
+Các "bằng chứng hợp lệ" này có thể ở dạng ZK-SNARK (Đối số Kiến thức Không Tương tác Ngắn gọn Không Kiến thức) hoặc ZK-STARK (Đối số Kiến thức Minh bạch Có thể Mở rộng Không Kiến thức). Thông tin thêm về [bằng chứng không kiến thức](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/).
+
+Các khoản tiền thuộc về người dùng validium được kiểm soát bởi một hợp đồng thông minh trên Ethereum. Validium cung cấp khả năng rút tiền gần như tức thì, giống như các ZK-rollup; một khi bằng chứng hợp lệ cho yêu cầu rút tiền đã được xác minh trên Mạng chính, người dùng có thể rút tiền bằng cách cung cấp [bằng chứng Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/). Bằng chứng Merkle xác thực việc giao dịch rút tiền của người dùng được bao gồm trong một lô giao dịch đã được xác minh, cho phép hợp đồng trên chuỗi xử lý việc rút tiền.
+
+Tuy nhiên, người dùng validium có thể bị đóng băng tiền và bị hạn chế rút tiền. Điều này có thể xảy ra nếu những người quản lý tính khả dụng của dữ liệu trên chuỗi validium giữ lại dữ liệu trạng thái ngoài chuỗi từ người dùng. Nếu không có quyền truy cập vào dữ liệu giao dịch, người dùng không thể tính toán bằng chứng Merkle cần thiết để chứng minh quyền sở hữu tiền và thực hiện rút tiền.
+
+Đây là điểm khác biệt chính giữa validium và ZK-rollup—vị trí của chúng trên phổ tính khả dụng của dữ liệu. Cả hai giải pháp đều tiếp cận việc lưu trữ dữ liệu theo cách khác nhau, điều này có ý nghĩa đối với tính bảo mật và tính phi tín nhiệm.
+
+## Validium tương tác với Ethereum như thế nào? {#how-do-validiums-interact-with-ethereum}
+
+Validium là các giao thức mở rộng quy mô được xây dựng trên chuỗi Ethereum hiện có. Mặc dù nó thực hiện các giao dịch ngoài chuỗi, một chuỗi validium được quản lý bởi một tập hợp các hợp đồng thông minh được triển khai trên Mạng chính, bao gồm:
+
+1. **Hợp đồng xác minh**: Hợp đồng xác minh kiểm tra tính hợp lệ của các bằng chứng do nhà điều hành validium gửi khi thực hiện cập nhật trạng thái. Điều này bao gồm các bằng chứng hợp lệ chứng thực tính chính xác của các giao dịch ngoài chuỗi và bằng chứng về tính khả dụng của dữ liệu để xác minh sự tồn tại của dữ liệu giao dịch ngoài chuỗi.
+
+2. **Hợp đồng chính**: Hợp đồng chính lưu trữ các cam kết trạng thái (gốc Merkle) do các nhà sản xuất khối gửi và cập nhật trạng thái của validium sau khi một bằng chứng hợp lệ được xác minh trên chuỗi. Hợp đồng này cũng xử lý các khoản tiền gửi vào và rút ra từ chuỗi validium.
+
+Validium cũng dựa vào chuỗi Ethereum chính cho những điều sau:
+
+### Thanh toán {#settlement}
+
+Các giao dịch được thực hiện trên validium không thể được xác nhận hoàn toàn cho đến khi chuỗi mẹ xác minh tính hợp lệ của chúng. Tất cả các hoạt động được tiến hành trên validium cuối cùng phải được thanh toán trên Mạng chính. Chuỗi khối Ethereum cũng cung cấp "đảm bảo thanh toán" cho người dùng validium, có nghĩa là các giao dịch ngoài chuỗi không thể bị đảo ngược hoặc thay đổi sau khi đã được cam kết trên chuỗi.
+
+### Bảo mật {#security}
+
+Ethereum, hoạt động như một lớp thanh toán, cũng đảm bảo tính hợp lệ của các chuyển đổi trạng thái trên validium. Các giao dịch ngoài chuỗi được thực hiện trên chuỗi validium được xác minh thông qua một hợp đồng thông minh trên lớp Ethereum cơ sở.
+
+Nếu hợp đồng xác minh trên chuỗi cho rằng bằng chứng không hợp lệ, các giao dịch sẽ bị từ chối. Điều này có nghĩa là các nhà điều hành phải đáp ứng các điều kiện hợp lệ do giao thức Ethereum thực thi trước khi cập nhật trạng thái của validium.
+
+## Validium hoạt động như thế nào? {#how-does-validium-work}
+
+### Các giao dịch {#transactions}
+
+Người dùng gửi giao dịch cho nhà điều hành, một nút chịu trách nhiệm thực hiện các giao dịch trên chuỗi validium. Một số validium có thể sử dụng một nhà điều hành duy nhất để thực thi chuỗi hoặc dựa vào cơ chế [bằng chứng cổ phần (PoS)](/developers/docs/consensus-mechanisms/pos/) để luân chuyển các nhà điều hành.
+
+Nhà điều hành tổng hợp các giao dịch thành một lô và gửi đến một mạch chứng minh để tạo bằng chứng. Mạch chứng minh chấp nhận lô giao dịch (và các dữ liệu liên quan khác) làm đầu vào và tạo ra một bằng chứng hợp lệ xác minh rằng các hoạt động đã được thực hiện một cách chính xác.
+
+### Cam kết trạng thái {#state-commitments}
+
+Trạng thái của validium được băm thành một cây Merkle với gốc được lưu trữ trong hợp đồng chính trên Ethereum. Gốc Merkle, còn được gọi là gốc trạng thái, hoạt động như một cam kết mã hóa đối với trạng thái hiện tại của các tài khoản và số dư trên validium.
+
+Để thực hiện cập nhật trạng thái, nhà điều hành phải tính toán một gốc trạng thái mới (sau khi thực hiện các giao dịch) và gửi nó đến hợp đồng trên chuỗi. Nếu bằng chứng hợp lệ, trạng thái được đề xuất sẽ được chấp nhận và validium chuyển sang gốc trạng thái mới.
+
+### Gửi và rút tiền {#deposits-and-withdrawals}
+
+Người dùng chuyển tiền từ Ethereum sang validium bằng cách gửi ETH (hoặc bất kỳ token nào tương thích với ERC) vào hợp đồng trên chuỗi. Hợp đồng chuyển tiếp sự kiện gửi tiền đến validium ngoài chuỗi, nơi địa chỉ của người dùng được ghi có một số tiền bằng với số tiền gửi của họ. Nhà điều hành cũng bao gồm giao dịch gửi tiền này trong một lô mới.
+
+Để chuyển tiền trở lại Mạng chính, người dùng validium bắt đầu một giao dịch rút tiền và gửi nó cho nhà điều hành, người xác thực yêu cầu rút tiền và đưa nó vào một lô. Tài sản của người dùng trên chuỗi validium cũng bị hủy trước khi họ có thể thoát khỏi hệ thống. Khi bằng chứng hợp lệ liên quan đến lô được xác minh, người dùng có thể gọi hợp đồng chính để rút phần còn lại của khoản tiền gửi ban đầu của họ.
+
+Như một cơ chế chống kiểm duyệt, giao thức validium cho phép người dùng rút tiền trực tiếp từ hợp đồng validium mà không cần thông qua nhà điều hành. Trong trường hợp này, người dùng cần cung cấp bằng chứng Merkle cho hợp đồng xác minh để chứng minh một tài khoản được bao gồm trong gốc trạng thái. Nếu bằng chứng được chấp nhận, người dùng có thể gọi hàm rút tiền của hợp đồng chính để rút tiền của họ ra khỏi validium.
+
+### Gửi lô {#batch-submission}
+
+Sau khi thực hiện một lô giao dịch, nhà điều hành gửi bằng chứng hợp lệ liên quan đến hợp đồng xác minh và đề xuất một gốc trạng thái mới cho hợp đồng chính. Nếu bằng chứng hợp lệ, hợp đồng chính sẽ cập nhật trạng thái của validium và hoàn tất kết quả của các giao dịch trong lô.
+
+Không giống như ZK-rollup, các nhà sản xuất khối trên validium không bắt buộc phải xuất bản dữ liệu giao dịch cho các lô giao dịch (chỉ có tiêu đề khối). Điều này làm cho validium trở thành một giao thức mở rộng quy mô hoàn toàn ngoài chuỗi, trái ngược với các giao thức mở rộng quy mô "lai" (tức là [lớp 2](/layer-2/)) xuất bản dữ liệu trạng thái trên chuỗi Ethereum chính bằng cách sử dụng dữ liệu blob, `calldata` hoặc kết hợp cả hai.
+
+### Tính khả dụng của dữ liệu {#data-availability}
+
+Như đã đề cập, validium sử dụng mô hình tính khả dụng của dữ liệu ngoài chuỗi, trong đó các nhà điều hành lưu trữ tất cả dữ liệu giao dịch bên ngoài Mạng chính Ethereum. Dấu chân dữ liệu trên chuỗi thấp của Validium giúp cải thiện khả năng mở rộng (thông lượng không bị giới hạn bởi khả năng xử lý dữ liệu của Ethereum) và giảm phí người dùng (chi phí xuất bản dữ liệu trên chuỗi thấp hơn).
+
+Tuy nhiên, tính khả dụng của dữ liệu ngoài chuỗi lại đặt ra một vấn đề: dữ liệu cần thiết để tạo hoặc xác minh bằng chứng Merkle có thể không khả dụng. Điều này có nghĩa là người dùng có thể không thể rút tiền từ hợp đồng trên chuỗi nếu các nhà điều hành có hành vi độc hại.
+
+Nhiều giải pháp validium khác nhau cố gắng giải quyết vấn đề này bằng cách phi tập trung hóa việc lưu trữ dữ liệu trạng thái. Điều này liên quan đến việc buộc các nhà sản xuất khối phải gửi dữ liệu cơ bản cho "những người quản lý tính khả dụng của dữ liệu", những người chịu trách nhiệm lưu trữ dữ liệu ngoài chuỗi và cung cấp dữ liệu đó cho người dùng khi có yêu cầu.
+
+Những người quản lý tính khả dụng của dữ liệu trong validium chứng thực tính khả dụng của dữ liệu cho các giao dịch ngoài chuỗi bằng cách ký vào mỗi lô validium. Những chữ ký này tạo thành một dạng "bằng chứng về tính khả dụng" mà hợp đồng xác minh trên chuỗi sẽ kiểm tra trước khi phê duyệt các bản cập nhật trạng thái.
+
+Các validium khác nhau trong cách tiếp cận quản lý tính khả dụng của dữ liệu. Một số dựa vào các bên đáng tin cậy để lưu trữ dữ liệu trạng thái, trong khi những người khác sử dụng các trình xác thực được chỉ định ngẫu nhiên cho nhiệm vụ này.
+
+#### Ủy ban khả dụng dữ liệu (DAC) {#data-availability-committee}
+
+Để đảm bảo tính khả dụng của dữ liệu ngoài chuỗi, một số giải pháp validium chỉ định một nhóm các thực thể đáng tin cậy, được gọi chung là ủy ban khả dụng dữ liệu (DAC), để lưu trữ các bản sao của trạng thái và cung cấp bằng chứng về tính khả dụng của dữ liệu. DAC dễ triển khai hơn và đòi hỏi ít sự phối hợp hơn vì số lượng thành viên thấp.
+
+Tuy nhiên, người dùng phải tin tưởng DAC sẽ cung cấp dữ liệu khi cần thiết (ví dụ: để tạo bằng chứng Merkle). Có khả năng các thành viên của ủy ban khả dụng dữ liệu [bị một tác nhân độc hại xâm phạm](https://notes.ethereum.org/DD7GyItYQ02d0ax_X-UbWg?view), sau đó có thể giữ lại dữ liệu ngoài chuỗi.
+
+[Thông tin thêm về các ủy ban khả dụng dữ liệu trong validium](https://medium.com/starkware/data-availability-e5564c416424).
+
+#### Tính khả dụng của dữ liệu được bảo đảm {#bonded-data-availability}
+
+Các validium khác yêu cầu những người tham gia chịu trách nhiệm lưu trữ dữ liệu ngoại tuyến phải đặt cược (tức là khóa) token trong một hợp đồng thông minh trước khi đảm nhận vai trò của họ. Khoản cược này đóng vai trò như một “bảo đảm” để đảm bảo hành vi trung thực của những người quản lý tính khả dụng của dữ liệu và giảm bớt các giả định về sự tin cậy. Nếu những người tham gia này không chứng minh được tính khả dụng của dữ liệu, khoản bảo đảm sẽ bị cắt giảm.
+
+Trong một kế hoạch tính khả dụng của dữ liệu được bảo đảm, bất kỳ ai cũng có thể được chỉ định để giữ dữ liệu ngoài chuỗi một khi họ cung cấp khoản cược cần thiết. Điều này mở rộng nhóm những người quản lý tính khả dụng của dữ liệu đủ điều kiện, giảm sự tập trung hóa ảnh hưởng đến các ủy ban khả dụng dữ liệu (DAC). Quan trọng hơn, cách tiếp cận này dựa vào các ưu đãi kinh tế tiền mã hóa để ngăn chặn hoạt động độc hại, điều này an toàn hơn đáng kể so với việc chỉ định các bên đáng tin cậy để bảo mật dữ liệu ngoại tuyến trong validium.
+
+[Thông tin thêm về tính khả dụng của dữ liệu được bảo đảm trong validium](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf).
+
+## Volition và validium {#volitions-and-validium}
+
+Validium mang lại nhiều lợi ích nhưng đi kèm với sự đánh đổi (đáng chú ý nhất là tính khả dụng của dữ liệu). Nhưng, cũng như nhiều giải pháp mở rộng quy mô khác, validium phù hợp với các trường hợp sử dụng cụ thể—đó là lý do tại sao volition được tạo ra.
+
+Volition kết hợp một ZK-rollup và chuỗi validium và cho phép người dùng chuyển đổi giữa hai giải pháp mở rộng quy mô. Với volition, người dùng có thể tận dụng tính khả dụng của dữ liệu ngoài chuỗi của validium cho các giao dịch nhất định, đồng thời vẫn giữ được quyền tự do chuyển sang giải pháp khả dụng dữ liệu trên chuỗi (ZK-rollup) nếu cần. Điều này về cơ bản mang lại cho người dùng quyền tự do lựa chọn sự đánh đổi theo hoàn cảnh riêng của họ.
+
+Một sàn giao dịch phi tập trung (DEX) có thể thích sử dụng cơ sở hạ tầng có thể mở rộng và riêng tư của validium cho các giao dịch có giá trị cao. Nó cũng có thể sử dụng ZK-rollup cho những người dùng muốn đảm bảo an ninh cao hơn và tính phi tín nhiệm của ZK-rollup.
+
+## Validium và khả năng tương thích với EVM {#validiums-and-evm-compatibility}
+
+Giống như ZK-rollup, validium chủ yếu phù hợp với các ứng dụng đơn giản, chẳng hạn như hoán đổi token và thanh toán. Việc hỗ trợ tính toán chung và thực thi hợp đồng thông minh giữa các validium rất khó thực hiện, do chi phí đáng kể để chứng minh các chỉ dẫn của [EVM](/developers/docs/evm/) trong một mạch bằng chứng không kiến thức.
+
+Một số dự án validium cố gắng giải quyết vấn đề này bằng cách biên dịch các ngôn ngữ tương thích với EVM (ví dụ: Solidity, Vyper) để tạo bytecode tùy chỉnh được tối ưu hóa cho việc chứng minh hiệu quả. Một nhược điểm của phương pháp này là các máy ảo thân thiện với bằng chứng không kiến thức mới có thể không hỗ trợ các mã vận hành EVM quan trọng và các nhà phát triển phải viết trực tiếp bằng ngôn ngữ cấp cao để có trải nghiệm tối ưu. Điều này tạo ra nhiều vấn đề hơn nữa: nó buộc các nhà phát triển phải xây dựng các ứng dụng phi tập trung với một bộ công cụ phát triển hoàn toàn mới và phá vỡ khả năng tương thích với cơ sở hạ tầng Ethereum hiện tại.
+
+Tuy nhiên, một số nhóm đang cố gắng tối ưu hóa các mã vận hành EVM hiện có cho các mạch chứng minh ZK. Điều này sẽ dẫn đến sự phát triển của một Máy ảo Ethereum không kiến thức (zkEVM), một máy ảo tương thích với EVM tạo ra các bằng chứng để xác minh tính đúng đắn của việc thực thi chương trình. Với zkEVM, các chuỗi validium có thể thực thi các hợp đồng thông minh ngoài chuỗi và gửi bằng chứng hợp lệ để xác minh một phép tính ngoài chuỗi (mà không cần phải thực thi lại) trên Ethereum.
+
+[Thông tin thêm về zkEVM](https://www.alchemy.com/overviews/zkevm).
+
+## Validium mở rộng quy mô Ethereum như thế nào? {#scaling-ethereum-with-validiums}
+
+### 1. Lưu trữ dữ liệu ngoài chuỗi {#offchain-data-storage}
+
+Các dự án mở rộng quy mô Lớp 2, chẳng hạn như gộp giao dịch lạc quan và ZK-rollup, đánh đổi khả năng mở rộng vô hạn của các giao thức mở rộng quy mô ngoài chuỗi thuần túy (ví dụ: [Plasma](/developers/docs/scaling/plasma/)) để lấy tính bảo mật bằng cách xuất bản một số dữ liệu giao dịch trên L1. Nhưng điều này có nghĩa là các thuộc tính khả năng mở rộng của các bản gộp bị giới hạn bởi băng thông dữ liệu trên Mạng chính Ethereum ([phân mảnh dữ liệu](/roadmap/danksharding/) đề xuất cải thiện dung lượng lưu trữ dữ liệu của Ethereum vì lý do này).
+
+Validium đạt được khả năng mở rộng bằng cách giữ tất cả dữ liệu giao dịch ngoài chuỗi và chỉ đăng các cam kết trạng thái (và bằng chứng hợp lệ) khi chuyển tiếp các cập nhật trạng thái đến chuỗi Ethereum chính. Tuy nhiên, sự tồn tại của các bằng chứng hợp lệ mang lại cho validium sự đảm bảo an ninh cao hơn so với các giải pháp mở rộng quy mô ngoài chuỗi thuần túy khác, bao gồm Plasma và [chuỗi bên](/developers/docs/scaling/sidechains/). Bằng cách giảm lượng dữ liệu mà Ethereum phải xử lý trước khi xác thực các giao dịch ngoài chuỗi, các thiết kế validium giúp mở rộng đáng kể thông lượng trên Mạng chính.
+
+### 2. Bằng chứng đệ quy {#recursive-proofs}
+
+Bằng chứng đệ quy là một bằng chứng hợp lệ xác minh tính hợp lệ của các bằng chứng khác. Những "bằng chứng của các bằng chứng" này được tạo ra bằng cách tổng hợp đệ quy nhiều bằng chứng cho đến khi một bằng chứng cuối cùng xác minh tất cả các bằng chứng trước đó được tạo ra. Bằng chứng đệ quy giúp mở rộng quy mô tốc độ xử lý của chuỗi khối bằng cách tăng số lượng giao dịch có thể được xác minh trên mỗi bằng chứng hợp lệ.
+
+Thông thường, mỗi bằng chứng hợp lệ mà nhà điều hành validium gửi cho Ethereum để xác minh sẽ xác thực tính toàn vẹn của một khối duy nhất. Trong khi đó, một bằng chứng đệ quy duy nhất có thể được sử dụng để xác nhận tính hợp lệ của một số khối validium cùng một lúc—điều này có thể thực hiện được vì mạch chứng minh có thể tổng hợp đệ quy một số bằng chứng khối thành một bằng chứng cuối cùng. Nếu hợp đồng xác minh trên chuỗi chấp nhận bằng chứng đệ quy, tất cả các khối cơ bản sẽ được hoàn tất ngay lập tức.
+
+## Ưu và nhược điểm của validium {#pros-and-cons-of-validium}
+
+| Ưu điểm | Nhược điểm |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Bằng chứng hợp lệ thực thi tính toàn vẹn của các giao dịch ngoài chuỗi và ngăn các nhà điều hành hoàn tất các cập nhật trạng thái không hợp lệ. | Việc tạo ra các bằng chứng hợp lệ đòi hỏi phần cứng đặc biệt, điều này gây ra rủi ro tập trung hóa. |
+| Tăng hiệu quả sử dụng vốn cho người dùng (không có sự chậm trễ trong việc rút tiền trở lại Ethereum) | Hỗ trợ hạn chế cho tính toán chung/hợp đồng thông minh; yêu cầu các ngôn ngữ chuyên biệt để phát triển. |
+| Không dễ bị tấn công bởi một số cuộc tấn công kinh tế mà các hệ thống dựa trên bằng chứng gian lận phải đối mặt trong các ứng dụng có giá trị cao. | Yêu cầu sức mạnh tính toán cao để tạo ra các bằng chứng ZK; không hiệu quả về chi phí cho các ứng dụng có thông lượng thấp. |
+| Giảm phí gas cho người dùng bằng cách không đăng calldata lên Mạng chính Ethereum. | Thời gian hoàn tất chủ quan chậm hơn (10-30 phút để tạo bằng chứng ZK) nhưng nhanh hơn để hoàn tất hoàn toàn vì không có độ trễ thời gian tranh chấp. |
+| Phù hợp với các trường hợp sử dụng cụ thể, như giao dịch hoặc chơi game trên chuỗi khối ưu tiên quyền riêng tư và khả năng mở rộng của giao dịch. | Người dùng có thể bị ngăn không cho rút tiền vì việc tạo bằng chứng Merkle về quyền sở hữu đòi hỏi dữ liệu ngoài chuỗi phải luôn khả dụng. |
+| Tính khả dụng của dữ liệu ngoài chuỗi cung cấp mức thông lượng cao hơn và tăng khả năng mở rộng. | Mô hình bảo mật dựa trên các giả định tin cậy và các ưu đãi kinh tế tiền mã hóa, không giống như ZK-rollup, vốn hoàn toàn dựa vào các cơ chế bảo mật mã hóa. |
+
+### Sử dụng Validium/Volition {#use-validium-and-volitions}
+
+Nhiều dự án cung cấp các triển khai của Validium và volition mà bạn có thể tích hợp vào các ứng dụng phi tập trung của mình:
+
+**StarkWare StarkEx** - _StarkEx là một giải pháp mở rộng quy mô Lớp 2 (L2) của Ethereum dựa trên các bằng chứng hợp lệ. Nó có thể hoạt động ở các chế độ khả dụng dữ liệu ZK-Rollup hoặc Validium._
+
+- [Tài liệu](https://docs.starkware.co/starkex-v4/starkex-deep-dive/data-availability-modes#validium)
+- [Trang web](https://starkware.co/starkex/)
+
+**Matter Labs zkPorter**- _zkPorter là một giao thức mở rộng quy mô Lớp 2 giải quyết vấn đề tính khả dụng của dữ liệu bằng một phương pháp lai kết hợp các ý tưởng của zkRollup và phân mảnh. Nó có thể hỗ trợ một số lượng phân mảnh tùy ý, mỗi phân mảnh có chính sách khả dụng dữ liệu riêng._
+
+- [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf)
+- [Tài liệu](https://docs.zksync.io/zksync-protocol/rollup/data-availability)
+- [Trang web](https://zksync.io/)
+
+## Đọc thêm {#further-reading}
+
+- [Validium và Ma trận 2x2 của Lớp 2 — Số 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two)
+- [ZK-rollup và Validium](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263)
+- [Volition và Phổ Khả dụng Dữ liệu Mới nổi](https://medium.com/starkware/volition-and-the-emerging-data-availability-spectrum-87e8bfa09bb)
+- [Rollup, Validium và Volition: Tìm hiểu về các Giải pháp Mở rộng quy mô Ethereum Hot nhất](https://www.defipulse.com/blog/rollups-validiums-and-volitions-learn-about-the-hottest-ethereum-scaling-solutions)
+- [Hướng dẫn thực tế về Rollup của Ethereum](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups)
diff --git a/public/content/translations/vi/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/vi/developers/docs/scaling/zk-rollups/index.md
new file mode 100644
index 00000000000..581490a69a0
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/scaling/zk-rollups/index.md
@@ -0,0 +1,257 @@
+---
+title: Tổng hợp không cần kiến thức
+description: Giới thiệu về tổng hợp không cần thông tin - một giải pháp mở rộng được sử dụng bởi cộng đồng Ethereum.
+lang: vi
+---
+
+Rollup không kiến thức (rollup ZK) là các [giải pháp thay đổi quy mô](/developers/docs/scaling/) lớp 2 giúp tăng thông lượng trên Mạng chính Ethereum bằng cách chuyển việc tính toán và lưu trữ trạng thái ra ngoài chuỗi. ZK-rollups có thể xử lý hàng ngàn giao dịch thành 1 gói và sau đó chuyển một số dữ liệu tóm tắt tối thiếu lên Mạng chính. Các dữ liệu tóm tắt này xác định những thay đổi cần được thực hiện trên trạng thái Ethereum và một số mật mã chứng minh các thay đổi đó là chính xác.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên đọc và hiểu trang của chúng tôi về [mở rộng quy mô Ethereum](/developers/docs/scaling/) và [lớp 2](/layer-2).
+
+## Tổng hợp không cần thông tin là gì? {#what-are-zk-rollups}
+
+**Rollup không kiến thức (rollup ZK)** gộp (hoặc 'cuộn lại') các giao dịch thành các lô được thực thi ngoài chuỗi. Tính toán ngoài chuỗi giúp giảm lượng dữ liệu phải đăng lên chuỗi khối. Những nhà vận hành ZK-rollup gửi bản tóm tắt các thay đổi cần thiết để thể hiện cho tất cả các giao dịch trong một đợt thay vì gửi từng giao dịch đơn lẻ. Chúng cũng tạo ra [bằng chứng hợp lệ](/glossary/#validity-proof) để chứng minh tính đúng đắn của các thay đổi.
+
+Trạng thái của rollup ZK được duy trì bởi một hợp đồng thông minh được triển khai trên mạng Ethereum. Để cập nhật trạng thái này, các nút rollup ZK phải gửi bằng chứng hợp lệ để xác minh. Như đã đề cập, bằng chứng hợp lệ là một đảm bảo mật mã học rằng thay đổi trạng thái do rollup đề xuất thực sự là kết quả của việc thực thi một lô giao dịch nhất định. Điều này có nghĩa là các rollup ZK chỉ cần cung cấp bằng chứng hợp lệ để hoàn tất giao dịch trên Ethereum thay vì đăng tất cả dữ liệu giao dịch trên chuỗi như [gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups/).
+
+Không có độ trễ khi chuyển tiền từ rollup ZK sang Ethereum vì các giao dịch rút tiền được thực thi ngay khi hợp đồng rollup ZK xác minh bằng chứng hợp lệ. Ngược lại, việc rút tiền từ các gộp giao dịch lạc quan phải chịu một độ trễ để cho phép bất kỳ ai thách thức giao dịch rút tiền bằng một [bằng chứng gian lận](/glossary/#fraud-proof).
+
+Các rollup ZK ghi giao dịch vào Ethereum dưới dạng `calldata`. `calldata` là nơi dữ liệu được bao gồm trong các lệnh gọi bên ngoài đến các hàm của hợp đồng thông minh được lưu trữ. Thông tin trong `calldata` được công bố trên chuỗi khối, cho phép bất kỳ ai có thể tự tái tạo lại trạng thái của rollup một cách độc lập. Các rollup ZK sử dụng các kỹ thuật nén để giảm dữ liệu giao dịch—ví dụ, tài khoản được biểu thị bằng một chỉ mục thay vì một địa chỉ, giúp tiết kiệm 28 byte dữ liệu. Việc công bố dữ liệu trên chuỗi là một chi phí đáng kể đối với các rollup, do đó việc nén dữ liệu có thể giảm phí cho người dùng.
+
+## Các rollup ZK tương tác với Ethereum như thế nào? {#zk-rollups-and-ethereum}
+
+Một chuỗi rollup ZK là một giao thức ngoài chuỗi hoạt động trên chuỗi khối Ethereum và được quản lý bởi các hợp đồng thông minh Ethereum trên chuỗi. Các rollup ZK thực thi giao dịch bên ngoài Mạng chính, nhưng định kỳ cam kết các lô giao dịch ngoài chuỗi vào một hợp đồng rollup trên chuỗi. Bản ghi giao dịch này là bất biến, giống như chuỗi khối Ethereum, và tạo thành chuỗi rollup ZK.
+
+Kiến trúc cốt lõi của rollup ZK bao gồm các thành phần sau:
+
+1. **Các hợp đồng trên chuỗi**: Như đã đề cập, giao thức rollup ZK được kiểm soát bởi các hợp đồng thông minh chạy trên Ethereum. Điều này bao gồm hợp đồng chính lưu trữ các khối rollup, theo dõi các khoản tiền gửi và giám sát các bản cập nhật trạng thái. Một hợp đồng trên chuỗi khác (hợp đồng trình xác minh) xác minh các bằng chứng không kiến thức được gửi bởi các nhà sản xuất khối. Do đó, Ethereum đóng vai trò là lớp cơ sở hoặc "lớp 1" cho rollup ZK.
+
+2. **Máy ảo ngoài chuỗi (VM)**: Trong khi giao thức rollup ZK tồn tại trên Ethereum, việc thực thi giao dịch và lưu trữ trạng thái diễn ra trên một máy ảo riêng biệt độc lập với [máy ảo Ethereum](/developers/docs/evm/). VM ngoài chuỗi này là môi trường thực thi cho các giao dịch trên rollup ZK và đóng vai trò là lớp thứ cấp hoặc "lớp 2" cho giao thức rollup ZK. Các bằng chứng hợp lệ được xác minh trên Mạng chính Ethereum đảm bảo tính đúng đắn của các chuyển đổi trạng thái trong VM ngoài chuỗi.
+
+Các rollup ZK là "giải pháp thay đổi quy mô kết hợp"—các giao thức ngoài chuỗi hoạt động độc lập nhưng lấy được sự bảo mật từ Ethereum. Cụ thể, mạng Ethereum thực thi tính hợp lệ của các bản cập nhật trạng thái trên rollup ZK và đảm bảo tính sẵn có của dữ liệu đằng sau mỗi bản cập nhật cho trạng thái của rollup. Do đó, các rollup ZK an toàn hơn đáng kể so với các giải pháp thay đổi quy mô hoàn toàn ngoài chuỗi, chẳng hạn như [chuỗi bên](/developers/docs/scaling/sidechains/), vốn chịu trách nhiệm về các thuộc tính bảo mật của chúng, hoặc [validium](/developers/docs/scaling/validium/), vốn cũng xác minh các giao dịch trên Ethereum bằng các bằng chứng hợp lệ, nhưng lưu trữ dữ liệu giao dịch ở nơi khác.
+
+Các rollup ZK dựa vào giao thức chính của Ethereum cho những điều sau đây:
+
+### Tính khả dụng của dữ liệu {#data-availability}
+
+Các rollup ZK công bố dữ liệu trạng thái cho mọi giao dịch được xử lý ngoài chuỗi tới Ethereum. Với dữ liệu này, các cá nhân hoặc doanh nghiệp có thể tái tạo trạng thái của rollup và tự xác thực chuỗi. Ethereum cung cấp dữ liệu này cho tất cả những người tham gia mạng dưới dạng `calldata`.
+
+Các rollup ZK không cần công bố nhiều dữ liệu giao dịch trên chuỗi vì các bằng chứng hợp lệ đã xác minh tính xác thực của các chuyển đổi trạng thái. Tuy nhiên, việc lưu trữ dữ liệu trên chuỗi vẫn rất quan trọng vì nó cho phép xác minh độc lập, không cần cấp phép trạng thái của chuỗi L2, từ đó cho phép bất kỳ ai gửi các lô giao dịch, ngăn chặn các nhà khai thác độc hại kiểm duyệt hoặc đóng băng chuỗi.
+
+Dữ liệu trên chuỗi là cần thiết để người dùng tương tác với rollup. Nếu không có quyền truy cập vào dữ liệu trạng thái, người dùng không thể truy vấn số dư tài khoản của họ hoặc khởi tạo các giao dịch (ví dụ: rút tiền) dựa vào thông tin trạng thái.
+
+### Tính cuối cùng của giao dịch {#transaction-finality}
+
+Ethereum hoạt động như một lớp thanh toán cho các rollup ZK: các giao dịch L2 chỉ được hoàn tất nếu hợp đồng L1 chấp nhận bằng chứng hợp lệ. Điều này loại bỏ rủi ro các nhà khai thác độc hại làm hỏng chuỗi (ví dụ: đánh cắp tiền của rollup) vì mọi giao dịch phải được phê duyệt trên Mạng chính. Ngoài ra, Ethereum đảm bảo rằng các hoạt động của người dùng không thể bị đảo ngược sau khi được hoàn tất trên L1.
+
+### Chống kiểm duyệt {#censorship-resistance}
+
+Hầu hết các rollup ZK sử dụng một "siêu nút" (nhà khai thác) để thực thi giao dịch, sản xuất các lô và gửi các khối đến L1. Mặc dù điều này đảm bảo hiệu quả, nó làm tăng rủi ro bị kiểm duyệt: các nhà khai thác rollup ZK độc hại có thể kiểm duyệt người dùng bằng cách từ chối đưa giao dịch của họ vào các lô.
+
+Như một biện pháp bảo mật, các rollup ZK cho phép người dùng gửi giao dịch trực tiếp đến hợp đồng rollup trên Mạng chính nếu họ nghĩ rằng mình đang bị nhà khai thác kiểm duyệt. Điều này cho phép người dùng buộc thoát khỏi rollup ZK để về Ethereum mà không cần phải dựa vào sự cho phép của nhà khai thác.
+
+## ZK-rollups hoạt động như thế nào? {#how-do-zk-rollups-work}
+
+### Các giao dịch {#transactions}
+
+Người dùng trong rollup ZK ký giao dịch và gửi cho các nhà khai thác L2 để xử lý và đưa vào lô tiếp theo. Trong một số trường hợp, nhà khai thác là một thực thể tập trung, được gọi là trình sắp xếp thứ tự, người thực thi giao dịch, tổng hợp chúng thành các lô và gửi đến L1. Trình sắp xếp thứ tự trong hệ thống này là thực thể duy nhất được phép sản xuất các khối L2 và thêm các giao dịch rollup vào hợp đồng rollup ZK.
+
+Các rollup ZK khác có thể luân chuyển vai trò nhà khai thác bằng cách sử dụng một tập hợp trình xác thực [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/). Các nhà khai thác tiềm năng gửi tiền vào hợp đồng rollup, với kích thước của mỗi khoản cổ phần ảnh hưởng đến cơ hội của người đặt cược được chọn để sản xuất lô rollup tiếp theo. Cổ phần của nhà khai thác có thể bị cắt giảm nếu họ hành động độc hại, điều này khuyến khích họ đăng các khối hợp lệ.
+
+#### Cách các rollup ZK công bố dữ liệu giao dịch trên Ethereum {#how-zk-rollups-publish-transaction-data-on-ethereum}
+
+Như đã giải thích, dữ liệu giao dịch được công bố trên Ethereum dưới dạng `calldata`. `calldata` là một vùng dữ liệu trong một hợp đồng thông minh được sử dụng để truyền các đối số cho một hàm và hoạt động tương tự như [bộ nhớ](/developers/docs/smart-contracts/anatomy/#memory). Mặc dù `calldata` không được lưu trữ như một phần của trạng thái Ethereum, nó vẫn tồn tại trên chuỗi như một phần của [nhật ký lịch sử](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) của chuỗi Ethereum. `calldata` không ảnh hưởng đến trạng thái của Ethereum, khiến nó trở thành một cách rẻ tiền để lưu trữ dữ liệu trên chuỗi.
+
+Từ khóa `calldata` thường xác định phương thức hợp đồng thông minh đang được gọi bởi một giao dịch và giữ các đầu vào cho phương thức dưới dạng một chuỗi byte tùy ý. Các rollup ZK sử dụng `calldata` để công bố dữ liệu giao dịch đã nén trên chuỗi; nhà khai thác rollup chỉ cần thêm một lô mới bằng cách gọi hàm yêu cầu trong hợp đồng rollup và truyền dữ liệu đã nén dưới dạng các đối số của hàm. Điều này giúp giảm chi phí cho người dùng vì một phần lớn phí rollup được dùng để lưu trữ dữ liệu giao dịch trên chuỗi.
+
+### Cam kết trạng thái {#state-commitments}
+
+Trạng thái của rollup ZK, bao gồm các tài khoản và số dư L2, được biểu diễn dưới dạng một [cây Merkle](/whitepaper/#merkle-trees). Một hàm băm mật mã học của gốc cây Merkle (gốc Merkle) được lưu trữ trong hợp đồng trên chuỗi, cho phép giao thức rollup theo dõi các thay đổi trong trạng thái của rollup ZK.
+
+Rollup chuyển sang một trạng thái mới sau khi thực hiện một tập hợp các giao dịch mới. Nhà khai thác đã khởi tạo quá trình chuyển đổi trạng thái được yêu cầu tính toán một gốc trạng thái mới và gửi đến hợp đồng trên chuỗi. Nếu bằng chứng hợp lệ liên quan đến lô được xác thực bởi hợp đồng trình xác minh, gốc Merkle mới sẽ trở thành gốc trạng thái chính tắc của rollup ZK.
+
+Bên cạnh việc tính toán các gốc trạng thái, nhà khai thác rollup ZK cũng tạo ra một gốc lô—gốc của một cây Merkle bao gồm tất cả các giao dịch trong một lô. Khi một lô mới được gửi, hợp đồng rollup sẽ lưu trữ gốc lô, cho phép người dùng chứng minh một giao dịch (ví dụ: một yêu cầu rút tiền) đã được bao gồm trong lô. Người dùng sẽ phải cung cấp chi tiết giao dịch, gốc lô và một [bằng chứng Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) cho thấy đường dẫn bao gồm.
+
+### Bằng chứng hợp lệ {#validity-proofs}
+
+Gốc trạng thái mới mà nhà khai thác rollup ZK gửi đến hợp đồng L1 là kết quả của các bản cập nhật cho trạng thái của rollup. Giả sử Alice gửi 10 token cho Bob, nhà khai thác chỉ cần giảm số dư của Alice đi 10 và tăng số dư của Bob lên 10. Sau đó, nhà khai thác sẽ băm dữ liệu tài khoản đã cập nhật, xây dựng lại cây Merkle của rollup và gửi gốc Merkle mới đến hợp đồng trên chuỗi.
+
+Nhưng hợp đồng rollup sẽ không tự động chấp nhận cam kết trạng thái được đề xuất cho đến khi nhà khai thác chứng minh rằng gốc Merkle mới là kết quả của các bản cập nhật chính xác cho trạng thái của rollup. Nhà khai thác rollup ZK thực hiện điều này bằng cách tạo ra một bằng chứng hợp lệ, một cam kết mật mã học ngắn gọn xác minh tính đúng đắn của các giao dịch đã được gộp thành lô.
+
+Bằng chứng hợp lệ cho phép các bên chứng minh tính đúng đắn của một tuyên bố mà không tiết lộ chính tuyên bố đó—do đó, chúng còn được gọi là bằng chứng không kiến thức. Các rollup ZK sử dụng bằng chứng hợp lệ để xác nhận tính đúng đắn của các chuyển đổi trạng thái ngoài chuỗi mà không cần phải thực thi lại các giao dịch trên Ethereum. Những bằng chứng này có thể ở dạng [ZK-SNARK](https://arxiv.org/abs/2202.06877) (Bằng chứng tri thức ngắn gọn không tương tác không kiến thức) hoặc [ZK-STARK](https://eprint.iacr.org/2018/046) (Bằng chứng tri thức minh bạch có thể mở rộng không kiến thức).
+
+Cả SNARK và STARK đều giúp chứng thực tính toàn vẹn của việc tính toán ngoài chuỗi trong các rollup ZK, mặc dù mỗi loại bằng chứng đều có những đặc điểm riêng biệt.
+
+**ZK-SNARKs**
+
+Để giao thức ZK-SNARK hoạt động, việc tạo ra một Chuỗi tham chiếu chung (CRS) là cần thiết: CRS cung cấp các tham số công khai để chứng minh và xác minh các bằng chứng hợp lệ. Tính bảo mật của hệ thống chứng minh phụ thuộc vào việc thiết lập CRS; nếu thông tin được sử dụng để tạo các tham số công khai rơi vào tay các tác nhân độc hại, chúng có thể tạo ra các bằng chứng hợp lệ giả.
+
+Một số rollup ZK cố gắng giải quyết vấn đề này bằng cách sử dụng một [nghi thức tính toán đa bên (MPC)](https://zkproof.org/2021/06/30/setup-ceremonies/amp/), liên quan đến các cá nhân đáng tin cậy, để tạo ra các tham số công khai cho mạch ZK-SNARK. Mỗi bên đóng góp một chút ngẫu nhiên (được gọi là "chất thải độc hại") vào việc xây dựng CRS, mà họ phải phá hủy ngay lập tức.
+
+Các thiết lập đáng tin cậy được sử dụng vì chúng làm tăng tính bảo mật của việc thiết lập CRS. Miễn là có một người tham gia trung thực phá hủy đầu vào của họ, tính bảo mật của hệ thống ZK-SNARK được đảm bảo. Tuy nhiên, cách tiếp cận này đòi hỏi phải tin tưởng những người liên quan sẽ xóa đi sự ngẫu nhiên đã lấy mẫu của họ và không làm suy yếu các đảm bảo bảo mật của hệ thống.
+
+Ngoài các giả định về sự tin cậy, ZK-SNARK phổ biến vì kích thước bằng chứng nhỏ và thời gian xác minh không đổi. Vì việc xác minh bằng chứng trên L1 chiếm phần lớn chi phí vận hành một rollup ZK, các L2 sử dụng ZK-SNARK để tạo ra các bằng chứng có thể được xác minh nhanh chóng và rẻ tiền trên Mạng chính.
+
+**ZK-STARKs**
+
+Giống như ZK-SNARK, ZK-STARK chứng minh tính hợp lệ của việc tính toán ngoài chuỗi mà không tiết lộ các đầu vào. Tuy nhiên, ZK-STARK được coi là một cải tiến so với ZK-SNARK vì khả năng mở rộng và tính minh bạch của chúng.
+
+ZK-STARK 'minh bạch', vì chúng có thể hoạt động mà không cần thiết lập đáng tin cậy của một Chuỗi tham chiếu chung (CRS). Thay vào đó, ZK-STARK dựa vào sự ngẫu nhiên có thể xác minh công khai để thiết lập các tham số cho việc tạo và xác minh bằng chứng.
+
+ZK-STARK cũng cung cấp khả năng mở rộng cao hơn vì thời gian cần thiết để chứng minh và xác minh bằng chứng hợp lệ tăng _gần như tuyến tính_ so với độ phức tạp của phép tính toán cơ bản. Với ZK-SNARK, thời gian chứng minh và xác minh thay đổi quy mô _tuyến tính_ so với kích thước của phép tính toán cơ bản. Điều này có nghĩa là ZK-STARK đòi hỏi ít thời gian hơn ZK-SNARK để chứng minh và xác minh khi có liên quan đến các bộ dữ liệu lớn, làm cho chúng hữu ích cho các ứng dụng có khối lượng lớn.
+
+ZK-STARK cũng an toàn trước các máy tính lượng tử, trong khi Mật mã đường cong Elliptic (ECC) được sử dụng trong ZK-SNARK được nhiều người tin là dễ bị tấn công bởi máy tính lượng tử. Nhược điểm của ZK-STARK là chúng tạo ra kích thước bằng chứng lớn hơn, đắt hơn để xác minh trên Ethereum.
+
+#### Bằng chứng hợp lệ hoạt động như thế nào trong các rollup ZK? {#validity-proofs-in-zk-rollups}
+
+##### Tạo bằng chứng
+
+Trước khi chấp nhận giao dịch, nhà khai thác sẽ thực hiện các kiểm tra thông thường. Điều này bao gồm việc xác nhận rằng:
+
+- Các tài khoản người gửi và người nhận là một phần của cây trạng thái.
+- Người gửi có đủ tiền để xử lý giao dịch.
+- Giao dịch là chính xác và khớp với khóa công khai của người gửi trên rollup.
+- Nonce của người gửi là chính xác, v.v.
+
+Khi nút rollup ZK có đủ giao dịch, nó sẽ tổng hợp chúng thành một lô và biên dịch các đầu vào cho mạch chứng minh để biên dịch thành một bằng chứng ZK ngắn gọn. Điều này bao gồm:
+
+- Một gốc cây Merkle bao gồm tất cả các giao dịch trong lô.
+- Các bằng chứng Merkle cho các giao dịch để chứng minh việc bao gồm trong lô.
+- Các bằng chứng Merkle cho mỗi cặp người gửi-người nhận trong các giao dịch để chứng minh các tài khoản đó là một phần của cây trạng thái của rollup.
+- Một tập hợp các gốc trạng thái trung gian, được lấy từ việc cập nhật gốc trạng thái sau khi áp dụng các bản cập nhật trạng thái cho mỗi giao dịch (tức là, giảm tài khoản người gửi và tăng tài khoản người nhận).
+
+Mạch chứng minh tính toán bằng chứng hợp lệ bằng cách "lặp" qua mỗi giao dịch và thực hiện các kiểm tra tương tự mà nhà khai thác đã hoàn thành trước khi xử lý giao dịch. Đầu tiên, nó xác minh tài khoản của người gửi là một phần của gốc trạng thái hiện có bằng cách sử dụng bằng chứng Merkle được cung cấp. Sau đó, nó giảm số dư của người gửi, tăng nonce của họ, băm dữ liệu tài khoản đã cập nhật và kết hợp nó với bằng chứng Merkle để tạo ra một gốc Merkle mới.
+
+Gốc Merkle này phản ánh sự thay đổi duy nhất trong trạng thái của rollup ZK: một sự thay đổi trong số dư và nonce của người gửi. Điều này có thể thực hiện được vì bằng chứng Merkle được sử dụng để chứng minh sự tồn tại của tài khoản được sử dụng để lấy ra gốc trạng thái mới.
+
+Mạch chứng minh thực hiện quy trình tương tự trên tài khoản của người nhận. Nó kiểm tra xem tài khoản của người nhận có tồn tại dưới gốc trạng thái trung gian không (sử dụng bằng chứng Merkle), tăng số dư của họ, băm lại dữ liệu tài khoản và kết hợp nó với bằng chứng Merkle để tạo ra một gốc trạng thái mới.
+
+Quá trình này lặp lại cho mọi giao dịch; mỗi "vòng lặp" tạo ra một gốc trạng thái mới từ việc cập nhật tài khoản của người gửi và một gốc mới tiếp theo từ việc cập nhật tài khoản của người nhận. Như đã giải thích, mỗi bản cập nhật cho gốc trạng thái đại diện cho một phần của cây trạng thái của rollup đang thay đổi.
+
+Mạch chứng minh ZK lặp lại trên toàn bộ lô giao dịch, xác minh chuỗi các bản cập nhật dẫn đến một gốc trạng thái cuối cùng sau khi giao dịch cuối cùng được thực thi. Gốc Merkle cuối cùng được tính toán sẽ trở thành gốc trạng thái chính tắc mới nhất của rollup ZK.
+
+##### Xác minh bằng chứng
+
+Sau khi mạch chứng minh xác minh tính đúng đắn của các bản cập nhật trạng thái, nhà khai thác L2 gửi bằng chứng hợp lệ đã được tính toán đến hợp đồng trình xác minh trên L1. Mạch xác minh của hợp đồng sẽ xác minh tính hợp lệ của bằng chứng và cũng kiểm tra các đầu vào công khai là một phần của bằng chứng:
+
+- **Gốc trạng thái trước**: Gốc trạng thái cũ của rollup ZK (tức là, trước khi các giao dịch được gộp thành lô được thực thi), phản ánh trạng thái hợp lệ cuối cùng được biết của chuỗi L2.
+
+- **Gốc trạng thái sau**: Gốc trạng thái mới của rollup ZK (tức là, sau khi thực thi các giao dịch được gộp thành lô), phản ánh trạng thái mới nhất của chuỗi L2. Gốc trạng thái sau là gốc cuối cùng được lấy ra sau khi áp dụng các bản cập nhật trạng thái trong mạch chứng minh.
+
+- **Gốc lô**: Gốc Merkle của lô, được lấy ra bằng cách _merklize_ các giao dịch trong lô và băm gốc của cây.
+
+- **Đầu vào giao dịch**: Dữ liệu liên quan đến các giao dịch được thực thi như một phần của lô đã gửi.
+
+Nếu bằng chứng thỏa mãn mạch (tức là, nó hợp lệ), điều đó có nghĩa là tồn tại một chuỗi các giao dịch hợp lệ chuyển rollup từ trạng thái trước đó (được đánh dấu bằng mật mã bởi gốc trạng thái trước) sang một trạng thái mới (được đánh dấu bằng mật mã bởi gốc trạng thái sau). Nếu gốc trạng thái trước khớp với gốc được lưu trữ trong hợp đồng rollup, và bằng chứng là hợp lệ, hợp đồng rollup sẽ lấy gốc trạng thái sau từ bằng chứng và cập nhật cây trạng thái của nó để phản ánh trạng thái đã thay đổi của rollup.
+
+### Vào và thoát {#entries-and-exits}
+
+Người dùng tham gia vào rollup ZK bằng cách gửi token vào hợp đồng của rollup được triển khai trên chuỗi L1. Giao dịch này được xếp hàng đợi vì chỉ có các nhà khai thác mới có thể gửi giao dịch đến hợp đồng rollup.
+
+Nếu hàng đợi tiền gửi đang chờ bắt đầu đầy, nhà khai thác rollup ZK sẽ lấy các giao dịch tiền gửi và gửi chúng đến hợp đồng rollup. Khi tiền của người dùng đã ở trong rollup, họ có thể bắt đầu giao dịch bằng cách gửi giao dịch cho nhà khai thác để xử lý. Người dùng có thể xác minh số dư trên rollup bằng cách băm dữ liệu tài khoản của họ, gửi hàm băm đến hợp đồng rollup và cung cấp một bằng chứng Merkle để xác minh so với gốc trạng thái hiện tại.
+
+Rút tiền từ một rollup ZK về L1 rất đơn giản. Người dùng khởi tạo giao dịch rút tiền bằng cách gửi tài sản của họ trên rollup đến một tài khoản được chỉ định để đốt. Nếu nhà khai thác bao gồm giao dịch trong lô tiếp theo, người dùng có thể gửi yêu cầu rút tiền đến hợp đồng trên chuỗi. Yêu cầu rút tiền này sẽ bao gồm:
+
+- Bằng chứng Merkle chứng minh việc bao gồm giao dịch của người dùng vào tài khoản đốt trong một lô giao dịch
+
+- Dữ liệu giao dịch
+
+- Gốc lô
+
+- Địa chỉ L1 để nhận tiền đã gửi
+
+Hợp đồng rollup băm dữ liệu giao dịch, kiểm tra xem gốc lô có tồn tại không và sử dụng bằng chứng Merkle để kiểm tra xem hàm băm giao dịch có phải là một phần của gốc lô không. Sau đó, hợp đồng thực hiện giao dịch rút tiền và gửi tiền đến địa chỉ đã chọn của người dùng trên L1.
+
+## Rollup ZK và khả năng tương thích với EVM {#zk-rollups-and-evm-compatibility}
+
+Không giống như các gộp giao dịch lạc quan, các rollup ZK không dễ dàng tương thích với [Máy ảo Ethereum (EVM)](/developers/docs/evm/). Việc chứng minh các phép tính EVM đa dụng trong các mạch khó khăn và tốn nhiều tài nguyên hơn so với việc chứng minh các phép tính đơn giản (như việc chuyển token được mô tả trước đó).
+
+Tuy nhiên, [những tiến bộ trong công nghệ không kiến thức](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now) đang khơi dậy sự quan tâm mới đối với việc gói gọn các phép tính EVM trong các bằng chứng không kiến thức. Những nỗ lực này hướng tới việc tạo ra một triển khai EVM không kiến thức (zkEVM) có thể xác minh hiệu quả tính đúng đắn của việc thực thi chương trình. Một zkEVM tái tạo các mã vận hành EVM hiện có để chứng minh/xác minh trong các mạch, cho phép thực thi các hợp đồng thông minh.
+
+Giống như EVM, một zkEVM chuyển đổi giữa các trạng thái sau khi phép tính được thực hiện trên một số đầu vào. Sự khác biệt là zkEVM cũng tạo ra các bằng chứng không kiến thức để xác minh tính đúng đắn của mỗi bước trong quá trình thực thi chương trình. Bằng chứng hợp lệ có thể xác minh tính đúng đắn của các hoạt động chạm đến trạng thái của VM (bộ nhớ, ngăn xếp, lưu trữ) và chính phép tính (tức là, hoạt động có gọi đúng mã vận hành và thực thi chúng một cách chính xác không?).
+
+Sự ra đời của các rollup ZK tương thích với EVM được kỳ vọng sẽ giúp các nhà phát triển tận dụng các đảm bảo về khả năng mở rộng và bảo mật của các bằng chứng không kiến thức. Quan trọng hơn, khả năng tương thích với cơ sở hạ tầng gốc của Ethereum có nghĩa là các nhà phát triển có thể xây dựng các ứng dụng phi tập trung thân thiện với ZK bằng cách sử dụng các bộ công cụ và ngôn ngữ quen thuộc (và đã được thử nghiệm thực tế).
+
+## Phí rollup ZK hoạt động như thế nào? {#how-do-zk-rollup-fees-work}
+
+Số tiền người dùng phải trả cho các giao dịch trên các rollup ZK phụ thuộc vào phí gas, giống như trên Mạng chính Ethereum. Tuy nhiên, phí gas hoạt động khác nhau trên L2 và bị ảnh hưởng bởi các chi phí sau:
+
+1. **Ghi trạng thái**: Có một chi phí cố định để ghi vào trạng thái của Ethereum (tức là, gửi một giao dịch trên chuỗi khối Ethereum). Các rollup ZK giảm chi phí này bằng cách gộp các giao dịch thành lô và phân bổ chi phí cố định cho nhiều người dùng.
+
+2. **Công bố dữ liệu**: Các rollup ZK công bố dữ liệu trạng thái cho mọi giao dịch tới Ethereum dưới dạng `calldata`. Chi phí `calldata` hiện được điều chỉnh bởi [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), quy định chi phí là 16 gas cho các byte khác không và 4 gas cho các byte bằng không của `calldata`. Chi phí phải trả cho mỗi giao dịch bị ảnh hưởng bởi lượng `calldata` cần được đăng trên chuỗi cho nó.
+
+3. **Phí nhà khai thác L2**: Đây là số tiền trả cho nhà khai thác rollup để bù đắp cho các chi phí tính toán phát sinh trong quá trình xử lý giao dịch, giống như [phí giao dịch "phí ưu tiên (tiền boa)"](/developers/docs/gas/#how-are-gas-fees-calculated) trên Mạng chính Ethereum.
+
+4. **Tạo và xác minh bằng chứng**: Các nhà khai thác rollup ZK phải tạo ra các bằng chứng hợp lệ cho các lô giao dịch, điều này tốn nhiều tài nguyên. Việc xác minh các bằng chứng không kiến thức trên Mạng chính cũng tốn gas (~ 500.000 gas).
+
+Ngoài việc gộp các giao dịch thành lô, các rollup ZK còn giảm phí cho người dùng bằng cách nén dữ liệu giao dịch. Bạn có thể [xem tổng quan theo thời gian thực](https://l2fees.info/) về chi phí sử dụng các rollup ZK của Ethereum.
+
+## Các rollup ZK thay đổi quy mô của Ethereum như thế nào? {#scaling-ethereum-with-zk-rollups}
+
+### Nén dữ liệu giao dịch {#transaction-data-compression}
+
+Các rollup ZK mở rộng thông lượng trên lớp cơ sở của Ethereum bằng cách đưa việc tính toán ra ngoài chuỗi, nhưng sự thúc đẩy thực sự cho việc thay đổi quy mô đến từ việc nén dữ liệu giao dịch. [Kích thước khối](/developers/docs/blocks/#block-size) của Ethereum giới hạn dữ liệu mà mỗi khối có thể chứa và do đó, số lượng giao dịch được xử lý trên mỗi khối. Bằng cách nén dữ liệu liên quan đến giao dịch, các rollup ZK tăng đáng kể số lượng giao dịch được xử lý trên mỗi khối.
+
+Các rollup ZK có thể nén dữ liệu giao dịch tốt hơn các gộp giao dịch lạc quan vì chúng không phải đăng tất cả dữ liệu cần thiết để xác thực mỗi giao dịch. Chúng chỉ phải đăng dữ liệu tối thiểu cần thiết để xây dựng lại trạng thái mới nhất của các tài khoản và số dư trên rollup.
+
+### Bằng chứng đệ quy {#recursive-proofs}
+
+Một lợi thế của các bằng chứng không kiến thức là các bằng chứng có thể xác minh các bằng chứng khác. Ví dụ, một ZK-SNARK duy nhất có thể xác minh các ZK-SNARK khác. Những "bằng chứng của bằng chứng" như vậy được gọi là bằng chứng đệ quy và làm tăng đáng kể thông lượng trên các rollup ZK.
+
+Hiện tại, các bằng chứng hợp lệ được tạo ra trên cơ sở từng khối và được gửi đến hợp đồng L1 để xác minh. Tuy nhiên, việc xác minh các bằng chứng khối đơn lẻ giới hạn thông lượng mà các rollup ZK có thể đạt được vì chỉ có một khối có thể được hoàn tất khi nhà khai thác gửi một bằng chứng.
+
+Tuy nhiên, các bằng chứng đệ quy cho phép hoàn tất nhiều khối với một bằng chứng hợp lệ duy nhất. Điều này là do mạch chứng minh tổng hợp đệ quy nhiều bằng chứng khối cho đến khi một bằng chứng cuối cùng được tạo ra. Nhà khai thác L2 gửi bằng chứng đệ quy này, và nếu hợp đồng chấp nhận nó, tất cả các khối liên quan sẽ được hoàn tất ngay lập tức. Với các bằng chứng đệ quy, số lượng giao dịch rollup ZK có thể được hoàn tất trên Ethereum theo từng khoảng thời gian sẽ tăng lên.
+
+### Ưu và nhược điểm của rollup ZK {#zk-rollups-pros-and-cons}
+
+| Ưu điểm | Nhược điểm |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| Các bằng chứng hợp lệ đảm bảo tính đúng đắn của các giao dịch ngoài chuỗi và ngăn các nhà khai thác thực hiện các chuyển đổi trạng thái không hợp lệ. | Chi phí liên quan đến việc tính toán và xác minh bằng chứng hợp lệ là đáng kể và có thể làm tăng phí cho người dùng rollup. |
+| Cung cấp tính cuối cùng của giao dịch nhanh hơn vì các bản cập nhật trạng thái được phê duyệt ngay khi các bằng chứng hợp lệ được xác minh trên L1. | Việc xây dựng các rollup ZK tương thích với EVM rất khó khăn do sự phức tạp của công nghệ không kiến thức. |
+| Dựa vào các cơ chế mật mã học phi tín nhiệm để bảo mật, không phải sự trung thực của các tác nhân được khuyến khích như với [gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups/#optimistic-pros-and-cons). | Việc tạo ra các bằng chứng hợp lệ đòi hỏi phần cứng chuyên dụng, điều này có thể khuyến khích sự kiểm soát tập trung của chuỗi bởi một vài bên. |
+| Lưu trữ dữ liệu cần thiết để khôi phục trạng thái ngoài chuỗi trên L1, đảm bảo tính bảo mật, chống kiểm duyệt và phi tập trung hóa. | Các nhà khai thác tập trung (trình sắp xếp thứ tự) có thể ảnh hưởng đến thứ tự của các giao dịch. |
+| Người dùng được hưởng lợi từ hiệu quả vốn cao hơn và có thể rút tiền từ L2 mà không có sự chậm trễ. | Các yêu cầu về phần cứng có thể làm giảm số lượng người tham gia có thể buộc chuỗi phải tiến triển, làm tăng nguy cơ các nhà khai thác độc hại đóng băng trạng thái của rollup và kiểm duyệt người dùng. |
+| Không phụ thuộc vào các giả định về tính sống động và người dùng không phải xác thực chuỗi để bảo vệ tiền của họ. | Một số hệ thống chứng minh (ví dụ: ZK-SNARK) yêu cầu một thiết lập đáng tin cậy, nếu bị xử lý sai, có thể gây nguy hiểm cho mô hình bảo mật của một rollup ZK. |
+| Việc nén dữ liệu tốt hơn có thể giúp giảm chi phí công bố `calldata` trên Ethereum và giảm thiểu phí rollup cho người dùng. | |
+
+### Giải thích trực quan về các rollup ZK {#zk-video}
+
+Xem Finematics giải thích về các rollup ZK:
+
+
+
+## Ai đang làm việc trên một zkEVM? {#zkevm-projects}
+
+Các dự án đang làm việc trên zkEVM bao gồm:
+
+- **[zkEVM](https://github.com/privacy-scaling-explorations/zkevm-specs)** - _zkEVM là một dự án được tài trợ bởi Ethereum Foundation để phát triển một rollup ZK tương thích với EVM và một cơ chế để tạo ra các bằng chứng hợp lệ cho các khối Ethereum._
+
+- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** - _là một ZK Rollup phi tập trung trên mạng chính Ethereum đang làm việc trên một Máy ảo Ethereum không kiến thức (zkEVM) thực thi các giao dịch Ethereum một cách minh bạch, bao gồm cả các hợp đồng thông minh với các xác thực bằng chứng không kiến thức._
+
+- **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll là một công ty định hướng công nghệ đang làm việc để xây dựng một Giải pháp Lớp 2 zkEVM gốc cho Ethereum._
+
+- **[Taiko](https://taiko.xyz)** - _Taiko là một rollup ZK phi tập trung, tương đương với Ethereum (một [ZK-EVM Loại 1](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))._
+
+- **[ZKsync](https://docs.zksync.io/)** - _ZKsync Era là một ZK Rollup tương thích với EVM được xây dựng bởi Matter Labs, được cung cấp bởi zkEVM của riêng nó._
+
+- **[Starknet](https://starkware.co/starknet/)** - _StarkNet là một giải pháp thay đổi quy mô lớp 2 tương thích với EVM được xây dựng bởi StarkWare._
+
+- **[Morph](https://www.morphl2.io/)** - _Morph là một giải pháp thay đổi quy mô rollup kết hợp sử dụng bằng chứng zk để giải quyết vấn đề thách thức về trạng thái Lớp 2._
+
+- **[Linea](https://linea.build)** - _Linea là một Lớp 2 zkEVM tương đương Ethereum được xây dựng bởi Consensys, hoàn toàn phù hợp với hệ sinh thái Ethereum._
+
+## Đọc thêm về rollup ZK {#further-reading-on-zk-rollups}
+
+- [Rollup không kiến thức là gì?](https://coinmarketcap.com/alexandria/glossary/zero-knowledge-rollups)
+- [Rollup không kiến thức là gì?](https://alchemy.com/blog/zero-knowledge-rollups)
+- [Hướng dẫn thực hành về các gộp giao dịch Ethereum](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups)
+- [STARKs so với SNARKs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/)
+- [zkEVM là gì?](https://www.alchemy.com/overviews/zkevm)
+- [Các loại ZK-EVM: Tương đương Ethereum, tương đương EVM, Loại 1, Loại 4 và các từ thông dụng khó hiểu khác](https://taiko.mirror.xyz/j6KgY8zbGTlTnHRFGW6ZLVPuT0IV0_KmgowgStpA0K4)
+- [Giới thiệu về zkEVM](https://hackmd.io/@yezhang/S1_KMMbGt)
+- [L2 ZK-EVM là gì?](https://linea.mirror.xyz/qD18IaQ4BROn_Y40EBMTUTdJHYghUtdECscSWyMvm8M)
+- [Tài nguyên Awesome-zkEVM](https://github.com/LuozhuZhang/awesome-zkevm)
+- [ZK-SNARKS dưới góc nhìn kỹ thuật](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html)
+- [Làm thế nào SNARK có thể tồn tại?](https://vitalik.eth.limo/general/2021/01/26/snarks.html)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/vi/developers/docs/smart-contracts/anatomy/index.md
new file mode 100644
index 00000000000..cd8c0bd4077
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/anatomy/index.md
@@ -0,0 +1,658 @@
+---
+title: Cấu trúc của các hợp đồng thông minh
+description: Hiểu rõ hơn về cấu trúc của một hợp đồng thông minh - các hàm, dữ liệu và các biến.
+lang: vi
+---
+
+Hợp đồng thông minh là một chương trình chạy tại một địa chỉ của người dùng trên mạng Ethereum. Chúng được tạo nên bởi dữ liệu và các hàm. Khi nhận được một giao dịch, các hợp đồng thông minh sẽ thực thi. Dưới đây là tổng quan về những gì tạo nên một hợp đồng thông minh.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Hãy đảm bảo rằng bạn đã đọc về [hợp đồng thông minh](/developers/docs/smart-contracts/) trước tiên. Tài liệu này giả định rằng bạn đã biết rõ các ngôn ngữ lập trình như JavaScript hoặc Python.
+
+## Dữ liệu {#data}
+
+Bất kỳ dữ liệu hợp đồng nào cũng phải được gán cho một vị trí: `storage` hoặc `memory`. Việc chỉnh sửa nơi lưu trữ trong một hợp đồng thông minh rất tốn kém, vì vậy bạn cần cân nhắc xem dữ liệu của mình sẽ được lưu ở đâu.
+
+### Lưu trữ {#storage}
+
+Storage là nơi lưu trữu các dữ liệu được truy không thường xuyên, ít khi được sửa đổi và được đại diện bởi các biến trạng thái. Các giá trị này được lưu trữ vĩnh viễn trên chuỗi khối. Bạn cần khai báo kiểu dữ liệu để hợp đồng có thể theo dõi được dung lượng lưu trữ trên chuỗi khối mà nó cần khi biên dịch.
+
+```solidity
+// Ví dụ về Solidity
+contract SimpleStorage {
+ uint storedData; // Biến trạng thái
+ // ...
+}
+```
+
+```python
+# Ví dụ về Vyper
+storedData: int128
+```
+
+Nếu bạn đã từng lập trình hướng đối tượng, bạn có thể sẽ quen với hầu hết các loại ngôn ngữ. Tuy nhiên, `address` có thể sẽ là một khái niệm mới đối với bạn nếu bạn mới bắt đầu phát triển trên Ethereum.
+
+Một loại `address` có thể chứa một địa chỉ Ethereum tương đương với 20 byte hoặc 160 bit. Nó trả về một giá trị bắt đầu bằng 0x ở dạng thập lục phân.
+
+Các loại kiểu dữ liệu khác:
+
+- boolean
+- interger
+- fixed point numbers
+- mảng tĩnh
+- mảng byte có kích thước động
+- giá trị cố định hữu tỉ và số nguyên
+- giá trị cố định chuỗi
+- giá trị cố định thập lục phân
+- enums
+
+Để rõ hơn, hãy tìm hiểu thêm các tài liệu:
+
+- [Xem các loại Vyper](https://docs.vyperlang.org/en/v0.1.0-beta.6/types.html#value-types)
+- [Xem các loại Solidity](https://docs.soliditylang.org/en/latest/types.html#value-types)
+
+### Bộ nhớ {#memory}
+
+Memory là nơi lưu trữ các giá trị chỉ được sử dụng trong khi thực thi một hàm của hợp đồng và được đại diện bởi các biến memory. Vì các giá trị đó không được lưu trữ vĩnh viễn trên chuỗi khối nên chúng không tốn nhiều tài nguyên khi sử dụng.
+
+Tìm hiểu thêm về cách Máy ảo Ethereum (EVM) lưu trữ dữ liệu (Storage, Memory và Stack) trong [tài liệu Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#storage-memory-and-the-stack).
+
+### Các biến môi trường {#environment-variables}
+
+Bên cạnh những biến mà bạn định nghĩa trong hợp đồng của bạn, có một số biến toàn cục đặc biệt. Chúng được sử dụng chủ yếu để cung cấp thông tin về chuỗi khối hoặc giao dịch hiện tại.
+
+Ví dụ:
+
+| **Thuộc tính** | **Biến trạng thái** | **Mô tả** |
+| ----------------- | ------------------- | ----------------------------------------------------------- |
+| `block.timestamp` | uint256 | Khối epoch timestamp hiện tại |
+| `msg.sender` | địa chỉ | Người gửi thông điệp (cuộc gọi hiện tại) |
+
+## Các hàm {#functions}
+
+Nói một cách đơn giản, các hàm được dùng để lấy thông tin hoặc thiết lập thông tin để phản hồi các giao dịch đến.
+
+Có hai loại lời gọi hàm:
+
+- `internal` – các hàm này không tạo lệnh gọi EVM
+ - Các hàm nội bộ và biến trạng thái chỉ có thể được truy cập nội bộ (tức là từ bên trong hợp đồng hiện tại hoặc các hợp đồng kế thừa từ nó)
+- `external` – các hàm này tạo lệnh gọi EVM
+ - Các hàm external là một phần của giao diện hợp đồng, điều này có nghĩa là các hàm này có thể được gọi từ các hợp đồng khác và qua các giao dịch. Một hàm bên ngoài `f` không thể được gọi nội bộ (tức là `f()` không hoạt động, nhưng `this.f()` thì hoạt động).
+
+Chúng cũng có thể là `public` hoặc `private`
+
+- Các hàm `public` có thể được gọi nội bộ từ bên trong hợp đồng hoặc bên ngoài thông qua các thông điệp
+- Các hàm `private` chỉ hiển thị đối với hợp đồng mà chúng được định nghĩa và không hiển thị trong các hợp đồng phái sinh
+
+Tất cả các hàm và các biến trạng thái đều có thể được khởi tạo là public hoặc private
+
+Dưới đây là một hàm có chức năng cập nhật một biến trạng thái cho một hợp đồng:
+
+```solidity
+// Ví dụ về Solidity
+function update_name(string value) public {
+ dapp_name = value;
+}
+```
+
+- Tham số `value` của loại `string` được chuyển vào hàm: `update_name`
+- Hàm được khai báo là `public`, nghĩa là bất kỳ ai cũng có thể truy cập
+- Hàm không được khai báo `view` nên có thể sửa đổi trạng thái hợp đồng
+
+### Các hàm View {#view-functions}
+
+Các hàm này không được phép chỉnh sửa trạng thái dữ liệu của hợp đồng. Ví dụ phổ biến là hàm "getter" - bạn có thể sử dụng hàm này để lấy thông tin số dư của người dùng chẳng hạn.
+
+```solidity
+// Ví dụ về Solidity
+function balanceOf(address _owner) public view returns (uint256 _balance) {
+ return ownerPizzaCount[_owner];
+}
+```
+
+```python
+dappName: public(string)
+
+@view
+@public
+def readName() -> string:
+ return dappName
+```
+
+Những điều được coi là thay đổi trạng thái hợp đồng:
+
+1. Ghi vào các biến trạng thái.
+2. [Phát sự kiện](https://docs.soliditylang.org/en/v0.7.0/contracts.html#events).
+3. [Tạo các hợp đồng khác](https://docs.soliditylang.org/en/v0.7.0/control-structures.html#creating-contracts).
+4. Sử dụng `selfdestruct`.
+5. Gửi Ethers qua các lời gọi.
+6. Gọi bất kỳ hàm nào không được đánh dấu là `view` hoặc `pure`.
+7. Sử dụng các lời gọi cấp thấp.
+8. Sử dụng mã assembly nội dòng có chứa các mã vận hành nhất định.
+
+### Các hàm constructor {#constructor-functions}
+
+Các hàm `constructor` chỉ được thực thi một lần khi hợp đồng được triển khai lần đầu tiên. Giống như `constructor` trong nhiều ngôn ngữ lập trình dựa trên lớp, các hàm này thường khởi tạo các biến trạng thái theo các giá trị được chỉ định của chúng.
+
+```solidity
+// Ví dụ về Solidity
+// Khởi tạo dữ liệu của hợp đồng, đặt `owner`
+// thành địa chỉ của người tạo hợp đồng.
+constructor() public {
+ // Tất cả các hợp đồng thông minh đều dựa vào các giao dịch bên ngoài để kích hoạt các hàm của chúng.
+ // `msg` là một biến toàn cục bao gồm dữ liệu liên quan về giao dịch nhất định,
+ // chẳng hạn như địa chỉ của người gửi và giá trị ETH có trong giao dịch.
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties
+ owner = msg.sender;
+}
+```
+
+```python
+# Ví dụ về Vyper
+
+@external
+def __init__(_beneficiary: address, _bidding_time: uint256):
+ self.beneficiary = _beneficiary
+ self.auctionStart = block.timestamp
+ self.auctionEnd = self.auctionStart + _bidding_time
+```
+
+### Các hàm dựng sẵn {#built-in-functions}
+
+Ngoài các biến và các hàm bạn định nghĩa trong hợp đồng của bạn, còn có một số hàm tích hợp đặc biệt. Ví dụ rõ ràng nhất là:
+
+- `address.send()` – Solidity
+- `send(address)` – Vyper
+
+Hai hàm trên cho phép những hợp đồng gửi ETH đến các tài khoản khác.
+
+## Viết hàm {#writing-functions}
+
+Hàm của bạn cần:
+
+- biến tham số và kiểu dữ liệu của nó (nếu hàm đó cho phép truyền các tham số)
+- khai báo internal/external
+- khai báo pure/view/payable
+- kiểu dữ liệu trả về (nếu hàm đó trả về một giá trị)
+
+```solidity
+pragma solidity >=0.4.0 <=0.6.0;
+
+contract ExampleDapp {
+ string dapp_name; // biến trạng thái
+
+ // Được gọi khi hợp đồng được triển khai và khởi tạo giá trị
+ constructor() public {
+ dapp_name = "Ứng dụng phi tập trung ví dụ của tôi";
+ }
+
+ // Hàm Get
+ function read_name() public view returns(string) {
+ return dapp_name;
+ }
+
+ // Hàm Set
+ function update_name(string value) public {
+ dapp_name = value;
+ }
+}
+```
+
+Một hợp đồng hoàn chỉnh có thể trông giống như trên. Ở đây, hàm `constructor` cung cấp một giá trị ban đầu cho biến `dapp_name`.
+
+## Các sự kiện và nhật ký {#events-and-logs}
+
+Sự kiện cho phép hợp đồng thông minh của bạn giao tiếp với giao diện người dùng hoặc các ứng dụng đăng ký khác. Khi một giao dịch được xác thực và thêm vào một khối, các hợp đồng thông minh có thể phát ra tín hiệu và ghi lại thông tin, điều này sẽ được phần mềm phía trước xử lý và sử dụng.
+
+## Các ví dụ có chú thích {#annotated-examples}
+
+Dưới đây là một vài ví dụ được viết bằng Solidity. Nếu bạn muốn thử nghiệm với mã, bạn có thể tương tác với chúng trong [Remix](http://remix.ethereum.org).
+
+### Xin chào thế giới {#hello-world}
+
+```solidity
+// Chỉ định phiên bản của Solidity, sử dụng lập phiên bản ngữ nghĩa.
+// Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+pragma solidity ^0.5.10;
+
+// Định nghĩa một hợp đồng có tên là `HelloWorld`.
+// Hợp đồng là một tập hợp các hàm và dữ liệu (trạng thái của nó).
+// Sau khi được triển khai, một hợp đồng sẽ nằm tại một địa chỉ cụ thể trên chuỗi khối Ethereum.
+// Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+contract HelloWorld {
+
+ // Khai báo một biến trạng thái `message` thuộc loại `string`.
+ // Các biến trạng thái là các biến có giá trị được lưu trữ vĩnh viễn trong bộ lưu trữ hợp đồng.
+ // Từ khóa `public` giúp các biến có thể truy cập được từ bên ngoài hợp đồng
+ // và tạo một hàm mà các hợp đồng hoặc ứng dụng khách khác có thể gọi để truy cập giá trị.
+ string public message;
+
+ // Tương tự như nhiều ngôn ngữ lập trình hướng đối tượng dựa trên lớp, một hàm constructor là
+ // một hàm đặc biệt chỉ được thực thi khi tạo hợp đồng.
+ // Các hàm constructor được sử dụng để khởi tạo dữ liệu của hợp đồng.
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ constructor(string memory initMessage) public {
+ // Chấp nhận một đối số chuỗi `initMessage` và đặt giá trị
+ // vào biến lưu trữ `message` của hợp đồng).
+ message = initMessage;
+ }
+
+ // Một hàm public chấp nhận một đối số chuỗi
+ // và cập nhật biến lưu trữ `message`.
+ function update(string memory newMessage) public {
+ message = newMessage;
+ }
+}
+```
+
+### Token {#token}
+
+```solidity
+pragma solidity ^0.5.10;
+
+contract Token {
+ // Một `address` có thể so sánh với một địa chỉ email - nó được dùng để xác định một tài khoản trên Ethereum.
+ // Các địa chỉ có thể đại diện cho một hợp đồng thông minh hoặc tài khoản bên ngoài (người dùng).
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/types.html#address
+ address public owner;
+
+ // Một `mapping` về cơ bản là một cấu trúc dữ liệu bảng băm.
+ // `mapping` này gán một số nguyên không dấu (số dư token) cho một địa chỉ (người nắm giữ token).
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types
+ mapping (address => uint) public balances;
+
+ // Các sự kiện cho phép ghi lại hoạt động trên chuỗi khối.
+ // Các ứng dụng khách Ethereum có thể lắng nghe các sự kiện để phản ứng với các thay đổi trạng thái hợp đồng.
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events
+ event Transfer(address from, address to, uint amount);
+
+ // Khởi tạo dữ liệu của hợp đồng, đặt `owner`
+ // thành địa chỉ của người tạo hợp đồng.
+ constructor() public {
+ // Tất cả các hợp đồng thông minh đều dựa vào các giao dịch bên ngoài để kích hoạt các hàm của chúng.
+ // `msg` là một biến toàn cục bao gồm dữ liệu liên quan về giao dịch nhất định,
+ // chẳng hạn như địa chỉ của người gửi và giá trị ETH có trong giao dịch.
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties
+ owner = msg.sender;
+ }
+
+ // Tạo một lượng token mới và gửi chúng đến một địa chỉ.
+ function mint(address receiver, uint amount) public {
+ // `require` là một cấu trúc điều khiển được sử dụng để thực thi các điều kiện nhất định.
+ // Nếu câu lệnh `require` ước tính là `false`, một ngoại lệ sẽ được kích hoạt,
+ // hoàn nguyên tất cả các thay đổi được thực hiện đối với trạng thái trong lệnh gọi hiện tại.
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions
+
+ // Chỉ chủ sở hữu hợp đồng mới có thể gọi hàm này
+ require(msg.sender == owner, "Bạn không phải là chủ sở hữu.");
+
+ // Thực thi số lượng token tối đa
+ require(amount < 1e60, "Vượt quá mức phát hành tối đa");
+
+ // Tăng số dư của `receiver` lên `amount`
+ balances[receiver] += amount;
+ }
+
+ // Gửi một lượng token hiện có từ bất kỳ người gọi nào đến một địa chỉ.
+ function transfer(address receiver, uint amount) public {
+ // Người gửi phải có đủ token để gửi
+ require(amount <= balances[msg.sender], "Số dư không đủ.");
+
+ // Điều chỉnh số dư token của hai địa chỉ
+ balances[msg.sender] -= amount;
+ balances[receiver] += amount;
+
+ // Phát sự kiện được xác định trước đó
+ emit Transfer(msg.sender, receiver, amount);
+ }
+}
+```
+
+### Tài sản kỹ thuật số duy nhất {#unique-digital-asset}
+
+```solidity
+pragma solidity ^0.5.10;
+
+// Nhập các ký hiệu từ các tệp khác vào hợp đồng hiện tại.
+// Trong trường hợp này, một loạt các hợp đồng trợ giúp từ OpenZeppelin.
+// Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#importing-other-source-files
+
+import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol";
+import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
+import "../node_modules/@openzeppelin/contracts/introspection/ERC165.sol";
+import "../node_modules/@openzeppelin/contracts/math/SafeMath.sol";
+
+// Từ khóa `is` được sử dụng để kế thừa các hàm và từ khóa từ các hợp đồng bên ngoài.
+// Trong trường hợp này, `CryptoPizza` kế thừa từ các hợp đồng `IERC721` và `ERC165`.
+// Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance
+contract CryptoPizza is IERC721, ERC165 {
+ // Sử dụng thư viện SafeMath của OpenZeppelin để thực hiện các phép toán số học một cách an toàn.
+ // Tìm hiểu thêm: https://docs.openzeppelin.com/contracts/2.x/api/math#SafeMath
+ using SafeMath for uint256;
+
+ // Các biến trạng thái không đổi trong Solidity tương tự như các ngôn ngữ khác
+ // nhưng bạn phải gán từ một biểu thức không đổi tại thời điểm biên dịch.
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constant-state-variables
+ uint256 constant dnaDigits = 10;
+ uint256 constant dnaModulus = 10 ** dnaDigits;
+ bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
+
+ // Các loại cấu trúc cho phép bạn xác định loại của riêng mình
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/types.html#structs
+ struct Pizza {
+ string name;
+ uint256 dna;
+ }
+
+ // Tạo một mảng trống gồm các cấu trúc Pizza
+ Pizza[] public pizzas;
+
+ // Ánh xạ từ ID pizza đến địa chỉ của chủ sở hữu
+ mapping(uint256 => address) public pizzaToOwner;
+
+ // Ánh xạ từ địa chỉ của chủ sở hữu đến số lượng token sở hữu
+ mapping(address => uint256) public ownerPizzaCount;
+
+ // Ánh xạ từ ID token đến địa chỉ được phê duyệt
+ mapping(uint256 => address) pizzaApprovals;
+
+ // Bạn có thể lồng các ánh xạ, ví dụ này ánh xạ chủ sở hữu với các phê duyệt của nhà điều hành
+ mapping(address => mapping(address => bool)) private operatorApprovals;
+
+ // Hàm nội bộ để tạo một Pizza ngẫu nhiên từ chuỗi (tên) và DNA
+ function _createPizza(string memory _name, uint256 _dna)
+ // Từ khóa `internal` có nghĩa là hàm này chỉ hiển thị
+ // trong hợp đồng này và các hợp đồng kế thừa từ hợp đồng này
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#visibility-and-getters
+ internal
+ // `isUnique` là một bộ điều chỉnh hàm kiểm tra xem pizza đã tồn tại chưa
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html#function-modifiers
+ isUnique(_name, _dna)
+ {
+ // Thêm Pizza vào mảng Pizza và lấy id
+ uint256 id = SafeMath.sub(pizzas.push(Pizza(_name, _dna)), 1);
+
+ // Kiểm tra xem chủ sở hữu Pizza có giống với người dùng hiện tại không
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions
+
+ // lưu ý rằng address(0) là địa chỉ không,
+ // cho biết rằng pizza[id] chưa được phân bổ cho một người dùng cụ thể.
+
+ assert(pizzaToOwner[id] == address(0));
+
+ // Ánh xạ Pizza cho chủ sở hữu
+ pizzaToOwner[id] = msg.sender;
+ ownerPizzaCount[msg.sender] = SafeMath.add(
+ ownerPizzaCount[msg.sender],
+ 1
+ );
+ }
+
+ // Tạo một Pizza ngẫu nhiên từ chuỗi (tên)
+ function createRandomPizza(string memory _name) public {
+ uint256 randDna = generateRandomDna(_name, msg.sender);
+ _createPizza(_name, randDna);
+ }
+
+ // Tạo DNA ngẫu nhiên từ chuỗi (tên) và địa chỉ của chủ sở hữu (người tạo)
+ function generateRandomDna(string memory _str, address _owner)
+ public
+ // Các hàm được đánh dấu là `pure` cam kết không đọc hoặc sửa đổi trạng thái
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#pure-functions
+ pure
+ returns (uint256)
+ {
+ // Tạo uint ngẫu nhiên từ chuỗi (tên) + địa chỉ (chủ sở hữu)
+ uint256 rand = uint256(keccak256(abi.encodePacked(_str))) +
+ uint256(_owner);
+ rand = rand % dnaModulus;
+ return rand;
+ }
+
+ // Trả về mảng Pizza được tìm thấy bởi chủ sở hữu
+ function getPizzasByOwner(address _owner)
+ public
+ // Các hàm được đánh dấu là `view` cam kết không sửa đổi trạng thái
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#view-functions
+ view
+ returns (uint256[] memory)
+ {
+ // Sử dụng vị trí lưu trữ `memory` để lưu trữ các giá trị chỉ trong
+ // vòng đời của lệnh gọi hàm này.
+ // Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/introduction-to-smart-contracts.html#storage-memory-and-the-stack
+ uint256[] memory result = new uint256[](ownerPizzaCount[_owner]);
+ uint256 counter = 0;
+ for (uint256 i = 0; i < pizzas.length; i++) {
+ if (pizzaToOwner[i] == _owner) {
+ result[counter] = i;
+ counter++;
+ }
+ }
+ return result;
+ }
+
+ // Chuyển Pizza và quyền sở hữu cho địa chỉ khác
+ function transferFrom(address _from, address _to, uint256 _pizzaId) public {
+ require(_from != address(0) && _to != address(0), "Địa chỉ không hợp lệ.");
+ require(_exists(_pizzaId), "Pizza không tồn tại.");
+ require(_from != _to, "Không thể chuyển đến cùng một địa chỉ.");
+ require(_isApprovedOrOwner(msg.sender, _pizzaId), "Địa chỉ không được phê duyệt.");
+
+ ownerPizzaCount[_to] = SafeMath.add(ownerPizzaCount[_to], 1);
+ ownerPizzaCount[_from] = SafeMath.sub(ownerPizzaCount[_from], 1);
+ pizzaToOwner[_pizzaId] = _to;
+
+ // Phát sự kiện được xác định trong hợp đồng IERC721 đã nhập
+ emit Transfer(_from, _to, _pizzaId);
+ _clearApproval(_to, _pizzaId);
+ }
+
+ /**
+ * Chuyển quyền sở hữu của một ID token nhất định sang một địa chỉ khác một cách an toàn
+ * Nếu địa chỉ mục tiêu là một hợp đồng, nó phải triển khai `onERC721Received`,
+ * được gọi khi thực hiện một lần chuyển an toàn và trả về giá trị đặc biệt
+ * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`;
+ * nếu không, việc chuyển khoản sẽ bị hoàn nguyên.
+ */
+ function safeTransferFrom(address from, address to, uint256 pizzaId)
+ public
+ {
+ // solium-disable-next-line arg-overflow
+ this.safeTransferFrom(from, to, pizzaId, "");
+ }
+
+ /**
+ * Chuyển quyền sở hữu của một ID token nhất định sang một địa chỉ khác một cách an toàn
+ * Nếu địa chỉ mục tiêu là một hợp đồng, nó phải triển khai `onERC721Received`,
+ * được gọi khi thực hiện một lần chuyển an toàn và trả về giá trị đặc biệt
+ * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`;
+ * nếu không, việc chuyển khoản sẽ bị hoàn nguyên.
+ */
+ function safeTransferFrom(
+ address from,
+ address to,
+ uint256 pizzaId,
+ bytes memory _data
+ ) public {
+ this.transferFrom(from, to, pizzaId);
+ require(_checkOnERC721Received(from, to, pizzaId, _data), "Phải triển khai onERC721Received.");
+ }
+
+ /**
+ * Hàm nội bộ để gọi `onERC721Received` trên một địa chỉ mục tiêu
+ * Lệnh gọi không được thực thi nếu địa chỉ mục tiêu không phải là hợp đồng
+ */
+ function _checkOnERC721Received(
+ address from,
+ address to,
+ uint256 pizzaId,
+ bytes memory _data
+ ) internal returns (bool) {
+ if (!isContract(to)) {
+ return true;
+ }
+
+ bytes4 retval = IERC721Receiver(to).onERC721Received(
+ msg.sender,
+ from,
+ pizzaId,
+ _data
+ );
+ return (retval == _ERC721_RECEIVED);
+ }
+
+ // Đốt một Pizza - phá hủy hoàn toàn Token
+ // Bộ điều chỉnh hàm `external` có nghĩa là hàm này là
+ // một phần của giao diện hợp đồng và các hợp đồng khác có thể gọi nó
+ function burn(uint256 _pizzaId) external {
+ require(msg.sender != address(0), "Địa chỉ không hợp lệ.");
+ require(_exists(_pizzaId), "Pizza không tồn tại.");
+ require(_isApprovedOrOwner(msg.sender, _pizzaId), "Địa chỉ không được phê duyệt.");
+
+ ownerPizzaCount[msg.sender] = SafeMath.sub(
+ ownerPizzaCount[msg.sender],
+ 1
+ );
+ pizzaToOwner[_pizzaId] = address(0);
+ }
+
+ // Trả về số lượng Pizza theo địa chỉ
+ function balanceOf(address _owner) public view returns (uint256 _balance) {
+ return ownerPizzaCount[_owner];
+ }
+
+ // Trả về chủ sở hữu của Pizza được tìm thấy bằng id
+ function ownerOf(uint256 _pizzaId) public view returns (address _owner) {
+ address owner = pizzaToOwner[_pizzaId];
+ require(owner != address(0), "ID Pizza không hợp lệ.");
+ return owner;
+ }
+
+ // Phê duyệt địa chỉ khác để chuyển quyền sở hữu Pizza
+ function approve(address _to, uint256 _pizzaId) public {
+ require(msg.sender == pizzaToOwner[_pizzaId], "Phải là chủ sở hữu Pizza.");
+ pizzaApprovals[_pizzaId] = _to;
+ emit Approval(msg.sender, _to, _pizzaId);
+ }
+
+ // Trả về địa chỉ được phê duyệt cho Pizza cụ thể
+ function getApproved(uint256 _pizzaId)
+ public
+ view
+ returns (address operator)
+ {
+ require(_exists(_pizzaId), "Pizza không tồn tại.");
+ return pizzaApprovals[_pizzaId];
+ }
+
+ /**
+ * Hàm riêng tư để xóa phê duyệt hiện tại của một ID token nhất định
+ * Hoàn nguyên nếu địa chỉ đã cho thực sự không phải là chủ sở hữu của token
+ */
+ function _clearApproval(address owner, uint256 _pizzaId) private {
+ require(pizzaToOwner[_pizzaId] == owner, "Phải là chủ sở hữu pizza.");
+ require(_exists(_pizzaId), "Pizza không tồn tại.");
+ if (pizzaApprovals[_pizzaId] != address(0)) {
+ pizzaApprovals[_pizzaId] = address(0);
+ }
+ }
+
+ /*
+ * Đặt hoặc bỏ đặt phê duyệt của một nhà điều hành nhất định
+ * Một nhà điều hành được phép chuyển tất cả các token của người gửi thay mặt họ
+ */
+ function setApprovalForAll(address to, bool approved) public {
+ require(to != msg.sender, "Không thể phê duyệt địa chỉ của chính mình");
+ operatorApprovals[msg.sender][to] = approved;
+ emit ApprovalForAll(msg.sender, to, approved);
+ }
+
+ // Cho biết một nhà điều hành có được một chủ sở hữu nhất định phê duyệt hay không
+ function isApprovedForAll(address owner, address operator)
+ public
+ view
+ returns (bool)
+ {
+ return operatorApprovals[owner][operator];
+ }
+
+ // Nhận quyền sở hữu Pizza - chỉ dành cho người dùng được phê duyệt
+ function takeOwnership(uint256 _pizzaId) public {
+ require(_isApprovedOrOwner(msg.sender, _pizzaId), "Địa chỉ không được phê duyệt.");
+ address owner = this.ownerOf(_pizzaId);
+ this.transferFrom(owner, msg.sender, _pizzaId);
+ }
+
+ // Kiểm tra xem Pizza có tồn tại không
+ function _exists(uint256 pizzaId) internal view returns (bool) {
+ address owner = pizzaToOwner[pizzaId];
+ return owner != address(0);
+ }
+
+ // Kiểm tra xem địa chỉ có phải là chủ sở hữu hoặc được phê duyệt để chuyển Pizza không
+ function _isApprovedOrOwner(address spender, uint256 pizzaId)
+ internal
+ view
+ returns (bool)
+ {
+ address owner = pizzaToOwner[pizzaId];
+ // Disable solium check because of
+ // https://github.com/duaraghav8/Solium/issues/175
+ // solium-disable-next-line operator-whitespace
+ return (spender == owner ||
+ this.getApproved(pizzaId) == spender ||
+ this.isApprovedForAll(owner, spender));
+ }
+
+ // Kiểm tra xem Pizza có phải là duy nhất và chưa tồn tại không
+ modifier isUnique(string memory _name, uint256 _dna) {
+ bool result = true;
+ for (uint256 i = 0; i < pizzas.length; i++) {
+ if (
+ keccak256(abi.encodePacked(pizzas[i].name)) ==
+ keccak256(abi.encodePacked(_name)) &&
+ pizzas[i].dna == _dna
+ ) {
+ result = false;
+ }
+ }
+ require(result, "Pizza với tên như vậy đã tồn tại.");
+ _;
+ }
+
+ // Trả về việc địa chỉ mục tiêu có phải là một hợp đồng không
+ function isContract(address account) internal view returns (bool) {
+ uint256 size;
+ // Hiện tại không có cách nào tốt hơn để kiểm tra xem có hợp đồng trong một địa chỉ hay không
+ // ngoài việc kiểm tra kích thước của mã tại địa chỉ đó.
+ // Xem https://ethereum.stackexchange.com/a/14016/36603
+ // để biết thêm chi tiết về cách hoạt động của nó.
+ // TODO Kiểm tra lại điều này trước khi phát hành Serenity, bởi vì tất cả các địa chỉ sau đó sẽ là
+ // hợp đồng.
+ // solium-disable-next-line security/no-inline-assembly
+ assembly {
+ size := extcodesize(account)
+ }
+ return size > 0;
+ }
+}
+```
+
+## Đọc thêm {#further-reading}
+
+Xem thêm tài liệu của Solidity và Vyper để có cái nhìn tổng quát hơn về các hợp đồng thông minh:
+
+- [Solidity](https://docs.soliditylang.org/)
+- [Vyper](https://docs.vyperlang.org/en/stable/)
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Hợp đồng thông minh](/developers/docs/smart-contracts/)
+- [Máy ảo Ethereum](/developers/docs/evm/)
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Thu nhỏ hợp đồng để chống lại giới hạn kích thước hợp đồng](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Một số mẹo thực tế để giảm kích thước hợp đồng thông minh của bạn._
+- [Ghi dữ liệu từ các hợp đồng thông minh bằng các sự kiện](/developers/tutorials/logging-events-smart-contracts/) _– Giới thiệu về các sự kiện hợp đồng thông minh và cách bạn có thể sử dụng chúng để ghi dữ liệu._
+- [Tương tác với các hợp đồng khác từ Solidity](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Cách triển khai một hợp đồng thông minh từ một hợp đồng hiện có và tương tác với nó._
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/vi/developers/docs/smart-contracts/compiling/index.md
new file mode 100644
index 00000000000..ad2936d8a05
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/compiling/index.md
@@ -0,0 +1,282 @@
+---
+title: Biên soạn hợp đồng thông minh
+description: Lí do tại sao bạn cần biên dịch các hợp đồng thông minh và quá trình biên dịch thực chất là làm gì.
+lang: vi
+incomplete: true
+---
+
+Bạn cần biên dịch hợp đồng để ứng dụng web của bạn và Máy ảo Ethereum (EVM) có thể hiểu nó.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Có thể hữu ích cho bạn khi đọc phần giới thiệu của chúng tôi về [hợp đồng thông minh](/developers/docs/smart-contracts/) và [máy ảo Ethereum](/developers/docs/evm/) trước khi đọc về biên dịch.
+
+## EVM {#the-evm}
+
+Để [EVM](/developers/docs/evm/) có thể chạy hợp đồng của bạn, nó cần phải ở dạng **bytecode**. Biên dịch hợp đồng này:
+
+```solidity
+pragma solidity 0.4.24;
+
+contract Greeter {
+
+ function greet() public view returns (string memory) {
+ return "Hello";
+ }
+
+}
+```
+
+**thành bytecode này**
+
+```
+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
+```
+
+Đây được gọi là **mã vận hành**. Các mã lệnh EVM là những hướng dẫn cấp thấp mà Máy ảo Ethereum (EVM) có thể thực thi. Mỗi opcode đại diện cho một thao tác cụ thể, như là các phép toán số học, thao tác logic, xử lý dữ liệu, điều khiển luồng, v.v.
+
+[Tìm hiểu thêm về mã vận hành](/developers/docs/evm/opcodes/)
+
+## Ứng dụng web {#web-applications}
+
+Trình biên dịch cũng sẽ tạo ra **Giao diện nhị phân ứng dụng (ABI)** mà bạn cần để ứng dụng của bạn có thể hiểu hợp đồng và gọi các hàm của hợp đồng.
+
+Giao diện nhị phân ứng dụng là một file JSON miêu tả hợp đồng đã triển khai và các hàm của hợp đồng thông minh đó. Điều này giúp thu hẹp khoảng cách giữa web2 và web3
+
+Một [thư viện máy khách JavaScript](/developers/docs/apis/javascript/) sẽ đọc **ABI** để bạn có thể gọi hợp đồng thông minh của mình trong giao diện ứng dụng web của bạn.
+
+Bên dưới là giao diện nhị phân ứng dụng của hợp đồng ERC-20 token. Một ERC-20 là một token bạn có thể giao dịch trên Ethereum.
+
+```json
+[
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "balance",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ }
+]
+```
+
+## Đọc thêm {#further-reading}
+
+- [Đặc tả ABI](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các thư viện máy khách JavaScript](/developers/docs/apis/javascript/)
+- [Máy ảo Ethereum](/developers/docs/evm/)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/composability/index.md b/public/content/translations/vi/developers/docs/smart-contracts/composability/index.md
new file mode 100644
index 00000000000..386419f0b92
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/composability/index.md
@@ -0,0 +1,76 @@
+---
+title: Tính khả thi của hợp đồng thông minh
+description: Tìm hiểu cách các hợp đồng thông minh có thể được kết hợp như các khối Lego để xây dựng các dapps phức tạp bằng cách tái sử dụng các thành phần có sẵn.
+lang: vi
+incomplete: true
+---
+
+## Giới thiệu ngắn gọn {#a-brief-introduction}
+
+Hợp đồng thông minh trên Ethereum là công khai và có thể xem như là các API mở. Bạn không cần phải viết hợp đồng thông minh của riêng mình để trở thành một nhà phát triển dapp, bạn chỉ cần biết cách tương tác với chúng. Ví dụ: bạn có thể sử dụng các hợp đồng thông minh hiện có của [Uniswap](https://uniswap.exchange/swap), một sàn giao dịch phi tập trung, để xử lý tất cả logic hoán đổi token trong ứng dụng của bạn – bạn không cần phải bắt đầu từ đầu. Hãy xem một số hợp đồng [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts) và [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts) của họ.
+
+## Khái niệm tính khả hợp thành là gì? {#what-is-composability}
+
+Tính khả hợp thành là việc kết hợp các yếu tố khác nhau để tạo ra hệ thống hoặc kết quả mới. Trong phát triển phần mềm, khả năng kết hợp có nghĩa là các nhà phát triển có thể tái sử dụng các thành phần phần mềm hiện có để xây dựng các ứng dụng mới. Một cách tốt để hiểu tính khả thi của việc kết hợp là xem các yếu tố có thể kết hợp như những viên gạch Lego. Mỗi viên Lego có thể kết hợp với nhau, cho phép bạn xây dựng những cấu trúc phức tạp bằng cách kết hợp các viên Lego khác nhau.
+
+Trong Ethereum, mỗi hợp đồng thông minh đều có thể được coi như một viên Lego—bạn có thể sử dụng các hợp đồng thông minh từ các dự án khác như những khối xây dựng cho dự án của mình. Điều này có nghĩa là bạn không cần phải tốn thời gian để phát minh lại bánh xe hoặc xây dựng từ đầu.
+
+## Cách thức hoạt động của tính khả hợp thành là gì? {#how-does-composability-work}
+
+Hợp đồng thông minh Ethereum giống như các API công cộng, vì vậy bất kỳ ai cũng có thể tương tác với hợp đồng hoặc tích hợp chúng vào các ứng dụng phi tập trung (dapps) để tăng cường chức năng. Tính khả hợp thành của hợp đồng thông minh thường dựa trên ba nguyên tắc: tính mô-đun, tự trị và khả năng khám phá.
+
+\*\*1. **Tính mô-đun**: Đây là khả năng của các thành phần riêng lẻ để thực hiện một nhiệm vụ cụ thể. Trong Ethereum, mỗi hợp đồng thông minh đều có một trường hợp sử dụng cụ thể (như đã trình bày trong ví dụ về Uniswap).
+
+\*\*2. **Tính tự chủ**: Các thành phần có thể kết hợp phải có khả năng hoạt động độc lập. Mỗi hợp đồng thông minh trong Ethereum đều tự thực thi và có thể hoạt động mà không cần dựa vào các thành phần khác của hệ thống.
+
+\*\*3. **Khả năng khám phá**: Các nhà phát triển không thể gọi các hợp đồng bên ngoài hoặc tích hợp các thư viện phần mềm vào các ứng dụng nếu chúng không được công khai. Theo thiết kế, các hợp đồng thông minh là mã nguồn mở; bất kỳ ai cũng có thể gọi một hợp đồng thông minh hoặc sao chép cơ sở mã.
+
+## Lợi ích của khả năng kết hợp {#benefits-of-composability}
+
+### Chu kỳ phát triển ngắn hơn {#shorter-development-cycle}
+
+Khả năng kết hợp giúp giảm bớt công việc mà các nhà phát triển phải làm khi tạo [các ứng dụng phi tập trung](/apps/#what-are-dapps). [Như Naval Ravikant đã nói:](https://twitter.com/naval/status/1444366754650656770) "Mã nguồn mở có nghĩa là mọi vấn đề chỉ cần được giải quyết một lần."
+
+Nếu có một hợp đồng thông minh giải quyết một vấn đề nào đó, các nhà phát triển khác có thể tái sử dụng nó, vì vậy họ không cần phải giải quyết cùng một vấn đề. Bằng cách này, các nhà phát triển có thể tận dụng các thư viện phần mềm hiện có và thêm chức năng bổ sung để tạo ra các dapp mới.
+
+### Sự đổi mới lớn hơn {#greater-innovation}
+
+Tính khả thi cho phép các lập trình viên thoải mái sáng tạo và thử nghiệm, vì họ có thể sử dụng lại, chỉnh sửa, sao chép hoặc tích hợp mã nguồn mở để đạt được kết quả mong muốn. Do đó, các đội ngũ phát triển dành ít thời gian cho các chức năng cơ bản và có thể dành nhiều thời gian hơn để thử nghiệm các tính năng mới.
+
+### Trải nghiệm người dùng tốt hơn {#better-user-experience}
+
+Khả năng tương tác giữa các thành phần của hệ sinh thái Ethereum cải thiện trải nghiệm của người dùng. Người dùng có thể truy cập vào chức năng cao hơn khi các ứng dụng phi tập trung (dapps) tích hợp các hợp đồng thông minh bên ngoài so với một hệ sinh thái phân mảnh, nơi mà các ứng dụng không thể giao tiếp với nhau.
+
+Chúng ta sẽ lấy một ví dụ từ giao dịch arbitrage để minh họa lợi ích của việc tương tác với nhau:
+
+Nếu một token đang được giao dịch ở mức giá cao hơn trên `sàn giao dịch A` so với `sàn giao dịch B`, bạn có thể tận dụng sự chênh lệch giá để kiếm lợi nhuận. Tuy nhiên, bạn chỉ có thể làm điều đó nếu có đủ vốn để tài trợ cho giao dịch (tức là mua token từ `sàn giao dịch B` và bán trên `sàn giao dịch A`).
+
+Trong một trường hợp bạn không có đủ vốn để giao dịch, một khoản vay nóng có thể là lựa chọn lý tưởng. [Các khoản vay nhanh](/defi/#flash-loans) có tính kỹ thuật cao, nhưng ý tưởng cơ bản là bạn có thể vay tài sản (không cần tài sản thế chấp) và trả lại chúng trong _một_ giao dịch duy nhất.
+
+Quay lại ví dụ ban đầu, một nhà giao dịch chênh lệch giá có thể vay một khoản vay nhanh lớn, mua token từ `sàn giao dịch B`, bán chúng trên `sàn giao dịch A`, trả lại vốn + lãi và giữ lại lợi nhuận, tất cả trong cùng một giao dịch. Logic phức tạp này yêu cầu kết hợp các lệnh gọi đến nhiều hợp đồng, điều này sẽ không khả thi nếu các hợp đồng thông minh thiếu tính tương tác.
+
+## Các ví dụ về khả năng kết hợp trong Ethereum {#composability-in-ethereum}
+
+### Hoán đổi token {#token-swaps}
+
+Nếu bạn tạo một ứng dụng phi tập trung (dapp) yêu cầu thanh toán giao dịch bằng ETH, bạn có thể cho phép người dùng thanh toán bằng các token ERC-20 khác bằng cách tích hợp logic hoán đổi token. Đoạn mã sẽ tự động chuyển đổi token của người dùng sang ETH trước khi hợp đồng thực hiện hàm gọi.
+
+### Quản trị {#governance}
+
+Xây dựng các hệ thống quản trị riêng cho một [DAO](/dao/) có thể tốn kém và mất nhiều thời gian. Thay vào đó, bạn có thể sử dụng một bộ công cụ quản trị mã nguồn mở, chẳng hạn như [Aragon Client](https://client.aragon.org/), để khởi tạo DAO của mình nhằm nhanh chóng tạo ra một khuôn khổ quản trị.
+
+### Quản lý danh tính {#identity-management}
+
+Thay vì xây dựng một hệ thống xác thực tùy chỉnh hoặc dựa vào các nhà cung cấp tập trung, bạn có thể tích hợp các công cụ danh tính phi tập trung (DID) để quản lý xác thực cho người dùng. Một ví dụ là [SpruceID](https://www.spruceid.com/), một bộ công cụ mã nguồn mở cung cấp chức năng "Đăng nhập bằng Ethereum" cho phép người dùng xác thực danh tính bằng ví Ethereum.
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Khởi động phát triển giao diện người dùng cho ứng dụng phi tập trung của bạn với create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– Tổng quan về cách sử dụng create-eth-app để tạo ra các ứng dụng với các hợp đồng thông minh phổ biến có sẵn._
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+- [Khả năng kết hợp là sự đổi mới](https://a16zcrypto.com/posts/article/how-composability-unlocks-crypto-and-everything-else/)
+- [Tại sao khả năng kết hợp lại quan trọng đối với Web3](https://hackernoon.com/why-composability-matters-for-web3)
+- [Khả năng kết hợp là gì?](https://blog.aragon.org/what-is-composability/#:~:text=Aragon,connect%20to%20every%20other%20piece.)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/vi/developers/docs/smart-contracts/deploying/index.md
new file mode 100644
index 00000000000..ed9a1c1c68a
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/deploying/index.md
@@ -0,0 +1,81 @@
+---
+title: Triển khai hợp đồng thông minh
+description: Hãy học cách triển khai hợp đồng thông minh lên các mạng Ethereum, bao gồm các yêu cầu trước, công cụ và các bước triển khai.
+lang: vi
+---
+
+Bạn cần phải triển khai hợp đồng thông minh của bạn để nó có thể khả thi cho tất cả người dùng trên một mạng Ethereum.
+
+Để triển khai một hợp đồng thông minh, bạn chỉ cần gửi một giao dịch Ethereum có chứa mã đã được biên dịch của hợp đồng thông minh đó mà không chỉ định bất kỳ người nhận nào.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên hiểu về [mạng Ethereum](/developers/docs/networks/), [các giao dịch](/developers/docs/transactions/) và [cấu trúc của hợp đồng thông minh](/developers/docs/smart-contracts/anatomy/) trước khi triển khai hợp đồng thông minh.
+
+Việc triển khai một hợp đồng cũng tốn ether (ETH) vì chúng được lưu trữ trên chuỗi khối, vì vậy bạn nên làm quen với [gas và phí](/developers/docs/gas/) trên Ethereum.
+
+Cuối cùng, bạn sẽ cần phải biên dịch hợp đồng của mình trước khi triển khai, vì vậy hãy chắc chắn rằng bạn đã đọc về [việc biên dịch các hợp đồng thông minh](/developers/docs/smart-contracts/compiling/).
+
+## Cách triển khai một hợp đồng thông minh {#how-to-deploy-a-smart-contract}
+
+### Những gì bạn sẽ cần {#what-youll-need}
+
+- Mã bytecode của hợp đồng của bạn – mã này được tạo ra thông qua [quá trình biên dịch](/developers/docs/smart-contracts/compiling/)
+- ETH cho Gas - bạn sẽ thiết lập giới hạn gas của bạn như các giao dịch khác, vì vậy hãy lưu ý rằng sự triển khai hợp đồng cần rất nhiều gas hơn là một giao dịch ETH đơn giản
+- một tập lệnh triển khai hoặc plugin
+- quyền truy cập vào một [nút Ethereum](/developers/docs/nodes-and-clients/), bằng cách tự chạy nút của riêng bạn, kết nối với một nút công khai hoặc thông qua khóa API bằng cách sử dụng một [dịch vụ nút](/developers/docs/nodes-and-clients/nodes-as-a-service/)
+
+### Các bước để triển khai một hợp đồng thông minh {#steps-to-deploy}
+
+Các bước cụ thể sẽ phụ thuộc vào sự phát triển framework được đề cập. Ví dụ, bạn có thể xem qua [tài liệu của Hardhat về việc triển khai hợp đồng của bạn](https://hardhat.org/docs/tutorial/deploying) hoặc [tài liệu của Foundry về việc triển khai và xác minh một hợp đồng thông minh](https://book.getfoundry.sh/forge/deploying). Sau khi được triển khai, hợp đồng của bạn sẽ có một địa chỉ Ethereum giống như các [tài khoản](/developers/docs/accounts/) khác và có thể được xác minh bằng cách sử dụng [các công cụ xác minh mã nguồn](/developers/docs/smart-contracts/verifying/#source-code-verification-tools).
+
+## Các công cụ liên quan {#related-tools}
+
+**Remix - _Remix IDE cho phép phát triển, triển khai và quản lý các hợp đồng thông minh cho các chuỗi khối giống như Ethereum_**
+
+- [Remix](https://remix.ethereum.org)
+
+**Tenderly - _Nền tảng phát triển Web3 cung cấp các tính năng gỡ lỗi, theo dõi và các khối xây dựng cơ sở hạ tầng cho việc phát triển, thử nghiệm, giám sát và vận hành các hợp đồng thông minh_**
+
+- [tenderly.co](https://tenderly.co/)
+- [Tài liệu](https://docs.tenderly.co/)
+- [GitHub](https://github.com/Tenderly)
+- [Discord](https://discord.gg/eCWjuvt)
+
+**Hardhat - _Một môi trường phát triển để biên dịch, triển khai, thử nghiệm và gỡ lỗi phần mềm Ethereum của bạn_**
+
+- [hardhat.org](https://hardhat.org/getting-started/)
+- [Tài liệu về việc triển khai hợp đồng của bạn](https://hardhat.org/docs/tutorial/deploying)
+- [GitHub](https://github.com/nomiclabs/hardhat)
+- [Discord](https://discord.com/invite/TETZs2KK4k)
+
+**thirdweb - _Dễ dàng triển khai bất kỳ hợp đồng nào tới bất kỳ chuỗi tương thích EVM nào, bằng một lệnh duy nhất_**
+
+- [Tài liệu tham khảo](https://portal.thirdweb.com/deploy/)
+
+**Crossmint - _Nền tảng phát triển Web3 cấp doanh nghiệp để triển khai hợp đồng thông minh, hỗ trợ thanh toán bằng thẻ tín dụng và đa chuỗi, đồng thời sử dụng API để tạo, phân phối, bán, lưu trữ và chỉnh sửa NFT._**
+
+- [crossmint.com](https://www.crossmint.com)
+- [Tài liệu tham khảo](https://docs.crossmint.com)
+- [Discord](https://discord.com/invite/crossmint)
+- [Blog](https://blog.crossmint.com)
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Triển khai hợp đồng thông minh đầu tiên của bạn](/developers/tutorials/deploying-your-first-smart-contract/) _– Lời giới thiệu về việc triển khai hợp đồng thông minh đầu tiên của bạn trên một mạng thử nghiệm Ethereum._
+- [Hello World | hướng dẫn về hợp đồng thông minh](/developers/tutorials/hello-world-smart-contract/) _– Một hướng dẫn dễ thực hiện để tạo và triển khai một hợp đồng thông minh cơ bản trên Ethereum._
+- [Tương tác với các hợp đồng khác từ Solidity](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Cách triển khai một hợp đồng thông minh từ một hợp đồng hiện có và tương tác với nó._
+- [Cách thu nhỏ kích thước hợp đồng của bạn](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _- Cách giảm kích thước hợp đồng của bạn để giữ nó không vượt quá giới hạn và tiết kiệm gas_
+
+## Đọc thêm {#further-reading}
+
+- [https://docs.openzeppelin.com/learn/deploying-and-interacting](https://docs.openzeppelin.com/learn/deploying-and-interacting) - _OpenZeppelin_
+- [Triển khai hợp đồng của bạn với Hardhat](https://hardhat.org/docs/tutorial/deploying) - _Nomic Labs_
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các khung phát triển](/developers/docs/frameworks/)
+- [Chạy một nút Ethereum](/developers/docs/nodes-and-clients/run-a-node/)
+- [Nút dưới dạng dịch vụ](/developers/docs/nodes-and-clients/nodes-as-a-service)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/vi/developers/docs/smart-contracts/formal-verification/index.md
new file mode 100644
index 00000000000..3d1cd299714
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/formal-verification/index.md
@@ -0,0 +1,284 @@
+---
+title: Xác minh hình thức của các hợp đồng thông minh
+description: Tổng quan về xác minh hình thức cho các hợp đồng thông minh Ethereum
+lang: vi
+---
+
+[Hợp đồng thông minh](/developers/docs/smart-contracts/) đang tạo điều kiện để tạo ra các ứng dụng phi tập trung, không cần tin cậy và mạnh mẽ, giới thiệu các trường hợp sử dụng mới và mở khóa giá trị cho người dùng. Bởi vì các hợp đồng thông minh xử lý lượng giá trị lớn, bảo mật là một yếu tố quan trọng cần cân nhắc đối với các nhà phát triển.
+
+Xác minh hình thức là một trong những kỹ thuật được khuyến nghị để cải thiện [bảo mật hợp đồng thông minh](/developers/docs/smart-contracts/security/). Xác minh hình thức, sử dụng [các phương pháp hình thức](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/) để đặc tả, thiết kế và xác minh các chương trình, đã được sử dụng trong nhiều năm để đảm bảo tính đúng đắn của các hệ thống phần cứng và phần mềm quan trọng.
+
+Khi được triển khai trong các hợp đồng thông minh, xác minh hình thức có thể chứng minh rằng logic nghiệp vụ của hợp đồng đáp ứng một đặc tả được xác định trước. So với các phương pháp khác để đánh giá tính đúng đắn của mã hợp đồng, chẳng hạn như kiểm thử, xác minh hình thức đưa ra những đảm bảo mạnh mẽ hơn rằng một hợp đồng thông minh là đúng về mặt chức năng.
+
+## Xác minh hình thức là gì? {#what-is-formal-verification}
+
+Xác minh hình thức đề cập đến quá trình đánh giá tính đúng đắn của một hệ thống đối với một đặc tả hình thức. Nói một cách đơn giản, xác minh hình thức cho phép chúng tôi kiểm tra xem hành vi của một hệ thống có thỏa mãn một số yêu cầu hay không (tức là nó có làm những gì chúng ta muốn hay không).
+
+Các hành vi dự kiến của hệ thống (trong trường hợp này là một hợp đồng thông minh) được mô tả bằng cách sử dụng mô hình hóa hình thức, trong khi các ngôn ngữ đặc tả cho phép tạo ra các thuộc tính hình thức. Các kỹ thuật xác minh hình thức sau đó có thể xác minh rằng việc triển khai của một hợp đồng tuân thủ đặc tả của nó và suy ra bằng chứng toán học về tính đúng đắn của việc triển khai đó. Khi một hợp đồng thỏa mãn đặc tả của nó, nó được mô tả là “đúng về mặt chức năng”, “đúng theo thiết kế” hoặc “đúng theo cấu trúc”.
+
+### Mô hình hình thức là gì? {#what-is-a-formal-model}
+
+Trong khoa học máy tính, [mô hình hình thức](https://en.wikipedia.org/wiki/Model_of_computation) là một mô tả toán học về một quá trình tính toán. Các chương trình được trừu tượng hóa thành các hàm toán học (phương trình), với mô hình mô tả cách kết quả đầu ra của các hàm được tính toán dựa trên một đầu vào nhất định.
+
+Các mô hình hình thức cung cấp một mức độ trừu tượng mà trên đó việc phân tích hành vi của một chương trình có thể được đánh giá. Sự tồn tại của các mô hình hình thức cho phép tạo ra một _đặc tả hình thức_, mô tả các thuộc tính mong muốn của mô hình được đề cập.
+
+Các kỹ thuật khác nhau được sử dụng để mô hình hóa các hợp đồng thông minh cho việc xác minh hình thức. Ví dụ, một số mô hình được sử dụng để suy luận về hành vi cấp cao của một hợp đồng thông minh. Những kỹ thuật mô hình hóa này áp dụng quan điểm hộp đen cho các hợp đồng thông minh, xem chúng như các hệ thống chấp nhận đầu vào và thực hiện tính toán dựa trên các đầu vào đó.
+
+Các mô hình cấp cao tập trung vào mối quan hệ giữa các hợp đồng thông minh và các tác nhân bên ngoài, chẳng hạn như tài khoản sở hữu bên ngoài (EOA), tài khoản hợp đồng và môi trường chuỗi khối. Các mô hình như vậy hữu ích cho việc xác định các thuộc tính đặc tả cách một hợp đồng nên hoạt động để phản hồi lại các tương tác nhất định của người dùng.
+
+Ngược lại, các mô hình hình thức khác tập trung vào hành vi cấp thấp của một hợp đồng thông minh. Mặc dù các mô hình cấp cao có thể giúp suy luận về chức năng của hợp đồng, chúng có thể không nắm bắt được các chi tiết về hoạt động bên trong của việc triển khai. Các mô hình cấp thấp áp dụng quan điểm hộp trắng để phân tích chương trình và dựa vào các biểu diễn cấp thấp hơn của các ứng dụng hợp đồng thông minh, chẳng hạn như dấu vết chương trình và [đồ thị luồng điều khiển](https://en.wikipedia.org/wiki/Control-flow_graph), để suy luận về các thuộc tính liên quan đến việc thực thi của hợp đồng.
+
+Các mô hình cấp thấp được coi là lý tưởng vì chúng đại diện cho việc thực thi thực tế của một hợp đồng thông minh trong môi trường thực thi của Ethereum (tức là [EVM](/developers/docs/evm/)). Các kỹ thuật mô hình hóa cấp thấp đặc biệt hữu ích trong việc thiết lập các thuộc tính an toàn quan trọng trong các hợp đồng thông minh và phát hiện các lỗ hổng tiềm ẩn.
+
+### Đặc tả hình thức là gì? {#what-is-a-formal-specification}
+
+Đặc tả đơn giản là một yêu cầu kỹ thuật mà một hệ thống cụ thể phải thỏa mãn. Trong lập trình, các đặc tả đại diện cho các ý tưởng chung về việc thực thi của một chương trình (tức là, chương trình nên làm gì).
+
+Trong bối cảnh của các hợp đồng thông minh, các đặc tả hình thức đề cập đến _các thuộc tính_—các mô tả hình thức về các yêu cầu mà một hợp đồng phải thỏa mãn. Các thuộc tính như vậy được mô tả là "bất biến" và đại diện cho các khẳng định logic về việc thực thi của một hợp đồng phải luôn đúng trong mọi hoàn cảnh có thể xảy ra, không có bất kỳ ngoại lệ nào.
+
+Do đó, chúng ta có thể coi một đặc tả hình thức là một tập hợp các câu lệnh được viết bằng một ngôn ngữ hình thức mô tả việc thực thi dự kiến của một hợp đồng thông minh. Các đặc tả bao gồm các thuộc tính của một hợp đồng và xác định cách hợp đồng nên hoạt động trong các hoàn cảnh khác nhau. Mục đích của xác minh hình thức là để xác định xem một hợp đồng thông minh có sở hữu những thuộc tính này (bất biến) hay không và những thuộc tính này không bị vi phạm trong quá trình thực thi.
+
+Các đặc tả hình thức rất quan trọng trong việc phát triển các triển khai bảo mật của các hợp đồng thông minh. Các hợp đồng không triển khai các bất biến hoặc có các thuộc tính bị vi phạm trong quá trình thực thi dễ bị tổn thương bởi các lỗ hổng có thể gây hại cho chức năng hoặc gây ra các khai thác độc hại.
+
+## Các loại đặc tả hình thức cho hợp đồng thông minh {#formal-specifications-for-smart-contracts}
+
+Các đặc tả hình thức cho phép suy luận toán học về tính đúng đắn của việc thực thi chương trình. Cũng như các mô hình hình thức, các đặc tả hình thức có thể nắm bắt các thuộc tính cấp cao hoặc hành vi cấp thấp của một triển khai hợp đồng.
+
+Các đặc tả hình thức được bắt nguồn bằng cách sử dụng các yếu tố của [logic chương trình](https://en.wikipedia.org/wiki/Logic_programming), cho phép suy luận hình thức về các thuộc tính của một chương trình. Một logic chương trình có các quy tắc hình thức thể hiện (bằng ngôn ngữ toán học) hành vi dự kiến của một chương trình. Nhiều logic chương trình khác nhau được sử dụng trong việc tạo ra các đặc tả hình thức, bao gồm [logic khả năng tiếp cận](https://en.wikipedia.org/wiki/Reachability_problem), [logic thời gian](https://en.wikipedia.org/wiki/Temporal_logic), và [logic Hoare](https://en.wikipedia.org/wiki/Hoare_logic).
+
+Các đặc tả hình thức cho các hợp đồng thông minh có thể được phân loại rộng rãi thành các đặc tả **cấp cao** hoặc **cấp thấp**. Bất kể một đặc tả thuộc loại nào, nó phải mô tả một cách đầy đủ và rõ ràng thuộc tính của hệ thống đang được phân tích.
+
+### Đặc tả cấp cao {#high-level-specifications}
+
+Như tên gọi, một đặc tả cấp cao (còn được gọi là "đặc tả hướng mô hình") mô tả hành vi cấp cao của một chương trình. Các đặc tả cấp cao mô hình hóa một hợp đồng thông minh như một [máy trạng thái hữu hạn](https://en.wikipedia.org/wiki/Finite-state_machine) (FSM), có thể chuyển đổi giữa các trạng thái bằng cách thực hiện các hoạt động, với logic thời gian được sử dụng để xác định các thuộc tính hình thức cho mô hình FSM.
+
+[Logic thời gian](https://en.wikipedia.org/wiki/Temporal_logic) là "các quy tắc để suy luận về các mệnh đề được xác định theo thời gian (ví dụ: "Tôi _luôn_ đói" hoặc "Tôi sẽ _cuối cùng_ cũng đói")." Khi được áp dụng vào xác minh hình thức, logic thời gian được sử dụng để nêu ra các khẳng định về hành vi đúng của các hệ thống được mô hình hóa dưới dạng máy trạng thái. Cụ thể, một logic thời gian mô tả các trạng thái tương lai mà một hợp đồng thông minh có thể ở trong và cách nó chuyển đổi giữa các trạng thái.
+
+Các đặc tả cấp cao thường nắm bắt hai thuộc tính thời gian quan trọng cho các hợp đồng thông minh: **an toàn** và **tính sống động**. Các thuộc tính an toàn đại diện cho ý tưởng rằng “không có điều tồi tệ nào xảy ra” và thường thể hiện tính bất biến. Một thuộc tính an toàn có thể xác định các yêu cầu phần mềm chung, chẳng hạn như không bị [bế tắc](https://www.techtarget.com/whatis/definition/deadlock), hoặc thể hiện các thuộc tính dành riêng cho miền cho các hợp đồng (ví dụ: các bất biến về kiểm soát truy cập cho các hàm, các giá trị có thể chấp nhận của các biến trạng thái hoặc các điều kiện cho việc chuyển token).
+
+Lấy ví dụ yêu cầu an toàn này, bao gồm các điều kiện để sử dụng `transfer()` hoặc `transferFrom()` trong các hợp đồng token ERC-20: _“Số dư của người gửi không bao giờ thấp hơn số lượng token được yêu cầu gửi đi.”_. Mô tả bằng ngôn ngữ tự nhiên này của một bất biến của hợp đồng có thể được dịch thành một đặc tả hình thức (toán học), sau đó có thể được kiểm tra nghiêm ngặt về tính hợp lệ.
+
+Các thuộc tính sống động khẳng định rằng “cuối cùng điều tốt đẹp sẽ xảy ra” và liên quan đến khả năng của một hợp đồng để tiến triển qua các trạng thái khác nhau. Một ví dụ về thuộc tính sống động là “tính thanh khoản”, đề cập đến khả năng của một hợp đồng để chuyển số dư của nó cho người dùng theo yêu cầu. Nếu thuộc tính này bị vi phạm, người dùng sẽ không thể rút tài sản được lưu trữ trong hợp đồng, giống như những gì đã xảy ra với [sự cố ví Parity](https://www.cnbc.com/2017/11/08/accidental-bug-may-have-frozen-280-worth-of-ether-on-parity-wallet.html).
+
+### Các đặc tả cấp thấp {#low-level-specifications}
+
+Các đặc tả cấp cao lấy điểm khởi đầu là một mô hình trạng thái hữu hạn của một hợp đồng và xác định các thuộc tính mong muốn của mô hình này. Ngược lại, các đặc tả cấp thấp (còn được gọi là "đặc tả hướng thuộc tính") thường mô hình hóa các chương trình (hợp đồng thông minh) như các hệ thống bao gồm một tập hợp các hàm toán học và mô tả hành vi đúng của các hệ thống như vậy.
+
+Nói một cách đơn giản, các đặc tả cấp thấp phân tích _dấu vết chương trình_ và cố gắng xác định các thuộc tính của một hợp đồng thông minh trên các dấu vết này. Dấu vết đề cập đến các chuỗi thực thi hàm làm thay đổi trạng thái của một hợp đồng thông minh; do đó, các đặc tả cấp thấp giúp đặc tả các yêu cầu cho việc thực thi nội bộ của một hợp đồng.
+
+Các đặc tả hình thức cấp thấp có thể được đưa ra dưới dạng các thuộc tính kiểu Hoare hoặc các bất biến trên các đường dẫn thực thi.
+
+### Thuộc tính kiểu Hoare {#hoare-style-properties}
+
+[Logic Hoare](https://en.wikipedia.org/wiki/Hoare_logic) cung cấp một bộ quy tắc hình thức để suy luận về tính đúng đắn của các chương trình, bao gồm cả các hợp đồng thông minh. Một thuộc tính kiểu Hoare được biểu diễn bằng một bộ ba Hoare `{P}c{Q}`, trong đó `c` là một chương trình và `P` và `Q` là các vị từ trên trạng thái của `c` (tức là chương trình), được mô tả chính thức là _tiền điều kiện_ và _hậu điều kiện_, tương ứng.
+
+Tiền điều kiện là một vị từ mô tả các điều kiện cần thiết để thực thi đúng một hàm; người dùng gọi vào hợp đồng phải thỏa mãn yêu cầu này. Hậu điều kiện là một vị từ mô tả điều kiện mà một hàm thiết lập nếu được thực thi đúng; người dùng có thể mong đợi điều kiện này là đúng sau khi gọi vào hàm. Một _bất biến_ trong logic Hoare là một vị từ được bảo toàn bởi việc thực thi một hàm (tức là nó không thay đổi).
+
+Các đặc tả kiểu Hoare có thể đảm bảo _tính đúng đắn một phần_ hoặc _tính đúng đắn toàn phần_. Việc triển khai một hàm hợp đồng là "đúng một phần" nếu tiền điều kiện đúng trước khi hàm được thực thi, và nếu việc thực thi kết thúc, hậu điều kiện cũng đúng. Bằng chứng về tính đúng đắn toàn phần có được nếu một tiền điều kiện là đúng trước khi hàm thực thi, việc thực thi được đảm bảo sẽ kết thúc và khi kết thúc, hậu điều kiện là đúng.
+
+Việc có được bằng chứng về tính đúng đắn toàn phần là khó khăn vì một số lần thực thi có thể bị trì hoãn trước khi kết thúc, hoặc không bao giờ kết thúc. Tuy nhiên, câu hỏi về việc liệu việc thực thi có kết thúc hay không có thể coi là một điểm tranh luận vì cơ chế Gas của Ethereum ngăn chặn các vòng lặp chương trình vô hạn (việc thực thi kết thúc thành công hoặc kết thúc do lỗi 'hết gas').
+
+Các đặc tả hợp đồng thông minh được tạo bằng logic Hoare sẽ có các tiền điều kiện, hậu điều kiện và các bất biến được xác định cho việc thực thi các hàm và vòng lặp trong một hợp đồng. Các tiền điều kiện thường bao gồm khả năng có các đầu vào sai cho một hàm, với các hậu điều kiện mô tả phản hồi dự kiến cho các đầu vào như vậy (ví dụ: đưa ra một ngoại lệ cụ thể). Bằng cách này, các thuộc tính kiểu Hoare có hiệu quả trong việc đảm bảo tính đúng đắn của các triển khai hợp đồng.
+
+Nhiều khung xác minh hình thức sử dụng các đặc tả kiểu Hoare để chứng minh tính đúng đắn về mặt ngữ nghĩa của các hàm. Cũng có thể thêm các thuộc tính kiểu Hoare (dưới dạng các khẳng định) trực tiếp vào mã hợp đồng bằng cách sử dụng các câu lệnh `require` và `assert` trong Solidity.
+
+`require` thể hiện một tiền điều kiện hoặc bất biến và thường được sử dụng để xác thực đầu vào của người dùng, trong khi `assert` nắm bắt một hậu điều kiện cần thiết cho sự an toàn. Ví dụ, việc kiểm soát truy cập hợp lý cho các hàm (một ví dụ về thuộc tính an toàn) có thể đạt được bằng cách sử dụng `require` như một kiểm tra tiền điều kiện về danh tính của tài khoản gọi. Tương tự, một bất biến về các giá trị cho phép của các biến trạng thái trong một hợp đồng (ví dụ: tổng số token đang lưu hành) có thể được bảo vệ khỏi bị vi phạm bằng cách sử dụng `assert` để xác nhận trạng thái của hợp đồng sau khi thực thi hàm.
+
+### Các thuộc tính cấp dấu vết {#trace-level-properties}
+
+Các đặc tả dựa trên dấu vết mô tả các hoạt động chuyển đổi một hợp đồng giữa các trạng thái khác nhau và các mối quan hệ giữa các hoạt động này. Như đã giải thích trước đó, dấu vết là các chuỗi hoạt động làm thay đổi trạng thái của một hợp đồng theo một cách cụ thể.
+
+Cách tiếp cận này dựa trên mô hình của các hợp đồng thông minh như là các hệ thống chuyển đổi trạng thái với một số trạng thái được xác định trước (được mô tả bởi các biến trạng thái) cùng với một bộ các chuyển đổi được xác định trước (được mô tả bởi các hàm hợp đồng). Hơn nữa, một [đồ thị luồng điều khiển](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/) (CFG), là một biểu diễn đồ họa của luồng thực thi của một chương trình, thường được sử dụng để mô tả ngữ nghĩa hoạt động của một hợp đồng. Ở đây, mỗi dấu vết được biểu diễn như một đường đi trên đồ thị luồng điều khiển.
+
+Chủ yếu, các đặc tả cấp dấu vết được sử dụng để suy luận về các mẫu thực thi nội bộ trong các hợp đồng thông minh. Bằng cách tạo các đặc tả cấp dấu vết, chúng ta khẳng định các đường dẫn thực thi có thể chấp nhận (tức là các chuyển đổi trạng thái) cho một hợp đồng thông minh. Sử dụng các kỹ thuật, chẳng hạn như thực thi biểu tượng, chúng ta có thể xác minh một cách hình thức rằng việc thực thi không bao giờ đi theo một đường dẫn không được xác định trong mô hình hình thức.
+
+Hãy sử dụng một ví dụ về một hợp đồng [DAO](/dao/) có một số hàm có thể truy cập công khai để mô tả các thuộc tính cấp dấu vết. Ở đây, chúng tôi giả định hợp đồng DAO cho phép người dùng thực hiện các hoạt động sau:
+
+- Gửi tiền
+
+- Bỏ phiếu cho một đề xuất sau khi gửi tiền
+
+- Yêu cầu hoàn tiền nếu họ không bỏ phiếu cho một đề xuất
+
+Ví dụ về các thuộc tính cấp dấu vết có thể là _"những người dùng không gửi tiền không thể bỏ phiếu cho một đề xuất"_ hoặc _"những người dùng không bỏ phiếu cho một đề xuất phải luôn có thể yêu cầu hoàn tiền"_. Cả hai thuộc tính đều khẳng định các chuỗi thực thi ưu tiên (việc bỏ phiếu không thể xảy ra _trước khi_ gửi tiền và việc yêu cầu hoàn tiền không thể xảy ra _sau khi_ bỏ phiếu cho một đề xuất).
+
+## Các kỹ thuật xác minh hình thức của hợp đồng thông minh {#formal-verification-techniques}
+
+### Kiểm tra mô hình {#model-checking}
+
+Kiểm tra mô hình là một kỹ thuật xác minh hình thức trong đó một thuật toán kiểm tra một mô hình hình thức của một hợp đồng thông minh so với đặc tả của nó. Trong việc kiểm tra mô hình, các hợp đồng thông minh thường được biểu diễn dưới dạng các hệ thống chuyển đổi trạng thái, trong khi các thuộc tính về các trạng thái hợp đồng được phép được xác định bằng logic thời gian.
+
+Việc kiểm tra mô hình đòi hỏi phải tạo ra một biểu diễn toán học trừu tượng của một hệ thống (tức là một hợp đồng) và thể hiện các thuộc tính của hệ thống này bằng các công thức bắt nguồn từ [logic mệnh đề](https://www.baeldung.com/cs/propositional-logic). Điều này đơn giản hóa nhiệm vụ của thuật toán kiểm tra mô hình, cụ thể là chứng minh rằng một mô hình toán học thỏa mãn một công thức logic đã cho.
+
+Việc kiểm tra mô hình trong xác minh hình thức chủ yếu được sử dụng để đánh giá các thuộc tính thời gian mô tả hành vi của một hợp đồng theo thời gian. Các thuộc tính thời gian cho các hợp đồng thông minh bao gồm _an toàn_ và _tính sống động_, mà chúng tôi đã giải thích trước đó.
+
+Ví dụ, một thuộc tính bảo mật liên quan đến kiểm soát truy cập (ví dụ: _Chỉ chủ sở hữu của hợp đồng mới có thể gọi `selfdestruct`_) có thể được viết bằng logic hình thức. Sau đó, thuật toán kiểm tra mô hình có thể xác minh xem hợp đồng có thỏa mãn đặc tả hình thức này không.
+
+Việc kiểm tra mô hình sử dụng kỹ thuật khám phá không gian trạng thái, bao gồm việc xây dựng tất cả các trạng thái có thể có của một hợp đồng thông minh và cố gắng tìm các trạng thái có thể đạt được dẫn đến vi phạm thuộc tính. Tuy nhiên, điều này có thể dẫn đến một số lượng trạng thái vô hạn (được gọi là "vấn đề bùng nổ trạng thái"), do đó các trình kiểm tra mô hình dựa vào các kỹ thuật trừu tượng để có thể phân tích hiệu quả các hợp đồng thông minh.
+
+### Chứng minh định lý {#theorem-proving}
+
+Chứng minh định lý là một phương pháp suy luận toán học về tính đúng đắn của các chương trình, bao gồm cả các hợp đồng thông minh. Nó bao gồm việc chuyển đổi mô hình của hệ thống hợp đồng và các đặc tả của nó thành các công thức toán học (các câu lệnh logic).
+
+Mục tiêu của việc chứng minh định lý là xác minh sự tương đương logic giữa các câu lệnh này. “Tương đương logic” (còn gọi là “song suy luận logic”) là một loại mối quan hệ giữa hai câu lệnh sao cho câu lệnh đầu tiên là đúng _khi và chỉ khi_ câu lệnh thứ hai là đúng.
+
+Mối quan hệ cần thiết (tương đương logic) giữa các câu lệnh về mô hình của một hợp đồng và thuộc tính của nó được xây dựng như một câu lệnh có thể chứng minh được (gọi là một định lý). Sử dụng một hệ thống suy luận hình thức, trình chứng minh định lý tự động có thể xác minh tính hợp lệ của định lý. Nói cách khác, một trình chứng minh định lý có thể chứng minh một cách kết luận rằng mô hình của một hợp đồng thông minh khớp chính xác với các đặc tả của nó.
+
+Trong khi việc kiểm tra mô hình mô hình hóa các hợp đồng như các hệ thống chuyển đổi với các trạng thái hữu hạn, việc chứng minh định lý có thể xử lý việc phân tích các hệ thống trạng thái vô hạn. Tuy nhiên, điều này có nghĩa là một trình chứng minh định lý tự động không phải lúc nào cũng có thể biết liệu một vấn đề logic có "quyết định được" hay không.
+
+Do đó, thường cần có sự trợ giúp của con người để hướng dẫn trình chứng minh định lý trong việc suy ra các bằng chứng về tính đúng đắn. Việc sử dụng nỗ lực của con người trong việc chứng minh định lý làm cho nó tốn kém hơn so với việc kiểm tra mô hình, vốn được tự động hóa hoàn toàn.
+
+### Thực thi biểu tượng {#symbolic-execution}
+
+Thực thi biểu tượng là một phương pháp phân tích một hợp đồng thông minh bằng cách thực thi các hàm sử dụng _giá trị biểu tượng_ (ví dụ: `x > 5`) thay vì _giá trị cụ thể_ (ví dụ: `x == 5`). Là một kỹ thuật xác minh hình thức, thực thi biểu tượng được sử dụng để suy luận hình thức về các thuộc tính cấp dấu vết trong mã của một hợp đồng.
+
+Thực thi biểu tượng biểu diễn một dấu vết thực thi dưới dạng một công thức toán học trên các giá trị đầu vào biểu tượng, còn được gọi là _vị từ đường dẫn_. Một [trình giải SMT](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) được sử dụng để kiểm tra xem một vị từ đường dẫn có "thỏa mãn được" hay không (tức là có tồn tại một giá trị có thể thỏa mãn công thức). Nếu một đường dẫn dễ bị tổn thương có thể thỏa mãn được, trình giải SMT sẽ tạo ra một giá trị cụ thể kích hoạt việc điều khiển thực thi đến đường dẫn đó.
+
+Giả sử một hàm của hợp đồng thông minh nhận đầu vào là một giá trị `uint` (`x`) và hoàn nguyên khi `x` lớn hơn `5` và cũng nhỏ hơn `10`. Việc tìm một giá trị cho `x` gây ra lỗi bằng quy trình kiểm thử thông thường sẽ đòi hỏi phải chạy qua hàng chục trường hợp kiểm thử (hoặc nhiều hơn) mà không có sự đảm bảo thực sự tìm thấy một đầu vào gây lỗi.
+
+Ngược lại, một công cụ thực thi biểu tượng sẽ thực thi hàm với giá trị biểu tượng: `X > 5 ∧ X < 10` (tức là `x` lớn hơn 5 VÀ `x` nhỏ hơn 10). Vị từ đường dẫn liên quan `x = X > 5 ∧ X < 10` sau đó sẽ được đưa cho một trình giải SMT để giải quyết. Nếu một giá trị cụ thể thỏa mãn công thức `x = X > 5 ∧ X < 10`, trình giải SMT sẽ tính toán nó—ví dụ, trình giải có thể tạo ra `7` làm giá trị cho `x`.
+
+Bởi vì thực thi biểu tượng dựa trên các đầu vào của một chương trình, và tập hợp các đầu vào để khám phá tất cả các trạng thái có thể đạt được có khả năng là vô hạn, nó vẫn là một hình thức kiểm thử. Tuy nhiên, như được hiển thị trong ví dụ, thực thi biểu tượng hiệu quả hơn so với kiểm thử thông thường để tìm các đầu vào gây ra vi phạm thuộc tính.
+
+Hơn nữa, thực thi biểu tượng tạo ra ít kết quả dương tính giả hơn so với các kỹ thuật dựa trên thuộc tính khác (ví dụ: fuzzing) tạo ra các đầu vào ngẫu nhiên cho một hàm. Nếu một trạng thái lỗi được kích hoạt trong quá trình thực thi biểu tượng, thì có thể tạo ra một giá trị cụ thể gây ra lỗi và tái tạo vấn đề.
+
+Thực thi biểu tượng cũng có thể cung cấp một mức độ chứng minh toán học về tính đúng đắn. Hãy xem xét ví dụ sau về một hàm hợp đồng có bảo vệ chống tràn số:
+
+```
+function safe_add(uint x, uint y) returns(uint z){
+
+ z = x + y;
+ require(z>=x);
+ require(z>=y);
+
+ return z;
+}
+```
+
+Một dấu vết thực thi dẫn đến tràn số nguyên sẽ cần thỏa mãn công thức: `z = x + y AND (z >= x) AND (z >= y) AND (z < x OR z < y)` Một công thức như vậy khó có thể được giải quyết, do đó nó đóng vai trò như một bằng chứng toán học rằng hàm `safe_add` không bao giờ bị tràn.
+
+### Tại sao sử dụng xác minh hình thức cho các hợp đồng thông minh? {#benefits-of-formal-verification}
+
+#### Nhu cầu về độ tin cậy {#need-for-reliability}
+
+Xác minh hình thức được sử dụng để đánh giá tính đúng đắn của các hệ thống quan trọng về an toàn mà sự cố của chúng có thể gây ra những hậu quả tàn khốc, chẳng hạn như tử vong, thương tích hoặc phá sản tài chính. Các hợp đồng thông minh là các ứng dụng có giá trị cao kiểm soát lượng giá trị khổng lồ, và những lỗi đơn giản trong thiết kế có thể dẫn đến [những tổn thất không thể phục hồi cho người dùng](https://www.freecodecamp.org/news/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce/amp/). Tuy nhiên, việc xác minh hình thức một hợp đồng trước khi triển khai có thể tăng cường đảm bảo rằng nó sẽ hoạt động như mong đợi một khi chạy trên chuỗi khối.
+
+Độ tin cậy là một chất lượng rất được mong đợi trong bất kỳ hợp đồng thông minh nào, đặc biệt là vì mã được triển khai trong Máy ảo Ethereum (EVM) thường là bất biến. Với việc nâng cấp sau khi ra mắt không dễ dàng tiếp cận, nhu cầu đảm bảo độ tin cậy của các hợp đồng làm cho việc xác minh hình thức trở nên cần thiết. Xác minh hình thức có thể phát hiện các vấn đề phức tạp, chẳng hạn như tràn số nguyên và thiếu số, tái hòa nhập và tối ưu hóa Gas kém, mà có thể bị các kiểm toán viên và người kiểm thử bỏ qua.
+
+#### Chứng minh tính đúng đắn về chức năng {#prove-functional-correctness}
+
+Kiểm thử chương trình là phương pháp phổ biến nhất để chứng minh rằng một hợp đồng thông minh thỏa mãn một số yêu cầu. Điều này bao gồm việc thực thi một hợp đồng với một mẫu dữ liệu mà nó dự kiến sẽ xử lý và phân tích hành vi của nó. Nếu hợp đồng trả về các kết quả mong đợi cho dữ liệu mẫu, thì các nhà phát triển có bằng chứng khách quan về tính đúng đắn của nó.
+
+Tuy nhiên, cách tiếp cận này không thể chứng minh việc thực thi đúng cho các giá trị đầu vào không phải là một phần của mẫu. Do đó, việc kiểm thử một hợp đồng có thể giúp phát hiện lỗi (tức là, nếu một số đường dẫn mã không trả về kết quả mong muốn trong quá trình thực thi), nhưng **nó không thể chứng minh một cách kết luận sự vắng mặt của lỗi**.
+
+Ngược lại, xác minh hình thức có thể chứng minh một cách hình thức rằng một hợp đồng thông minh thỏa mãn các yêu cầu cho một phạm vi vô hạn các lần thực thi _mà không_ cần chạy hợp đồng. Điều này đòi hỏi phải tạo ra một đặc tả hình thức mô tả chính xác các hành vi đúng của hợp đồng và phát triển một mô hình hình thức (toán học) của hệ thống hợp đồng. Sau đó, chúng ta có thể theo một quy trình chứng minh hình thức để kiểm tra tính liên tục giữa mô hình của hợp đồng và đặc tả của nó.
+
+Với xác minh hình thức, câu hỏi về việc xác minh liệu logic nghiệp vụ của một hợp đồng có thỏa mãn các yêu cầu hay không là một mệnh đề toán học có thể được chứng minh hoặc bác bỏ. Bằng cách chứng minh hình thức một mệnh đề, chúng ta có thể xác minh một số lượng vô hạn các trường hợp kiểm thử với một số lượng hữu hạn các bước. Bằng cách này, xác minh hình thức có triển vọng tốt hơn trong việc chứng minh một hợp đồng là đúng về mặt chức năng đối với một đặc tả.
+
+#### Các mục tiêu xác minh lý tưởng {#ideal-verification-targets}
+
+Mục tiêu xác minh mô tả hệ thống sẽ được xác minh hình thức. Xác minh hình thức được sử dụng tốt nhất trong "các hệ thống nhúng" (các phần mềm nhỏ, đơn giản là một phần của một hệ thống lớn hơn). Chúng cũng lý tưởng cho các lĩnh vực chuyên biệt có ít quy tắc, vì điều này giúp dễ dàng sửa đổi các công cụ để xác minh các thuộc tính dành riêng cho lĩnh vực đó.
+
+Các hợp đồng thông minh—ít nhất, ở một mức độ nào đó—đáp ứng cả hai yêu cầu. Ví dụ, kích thước nhỏ của các hợp đồng Ethereum làm cho chúng dễ dàng cho việc xác minh hình thức. Tương tự, EVM tuân theo các quy tắc đơn giản, giúp việc đặc tả và xác minh các thuộc tính ngữ nghĩa cho các chương trình chạy trong EVM trở nên dễ dàng hơn.
+
+### Chu kỳ phát triển nhanh hơn {#faster-development-cycle}
+
+Các kỹ thuật xác minh hình thức, chẳng hạn như kiểm tra mô hình và thực thi biểu tượng, thường hiệu quả hơn so với việc phân tích thông thường mã hợp đồng thông minh (được thực hiện trong quá trình kiểm thử hoặc kiểm toán). Điều này là do xác minh hình thức dựa trên các giá trị biểu tượng để kiểm tra các khẳng định ("điều gì sẽ xảy ra nếu người dùng cố gắng rút _n_ ether?") không giống như kiểm thử sử dụng các giá trị cụ thể ("điều gì sẽ xảy ra nếu người dùng cố gắng rút 5 ether?").
+
+Các biến đầu vào biểu tượng có thể bao gồm nhiều lớp giá trị cụ thể, do đó các phương pháp xác minh hình thức hứa hẹn độ bao phủ mã lớn hơn trong một khung thời gian ngắn hơn. Khi được sử dụng hiệu quả, xác minh hình thức có thể đẩy nhanh chu kỳ phát triển cho các nhà phát triển.
+
+Xác minh hình thức cũng cải thiện quy trình xây dựng các ứng dụng phi tập trung (dapps) bằng cách giảm các lỗi thiết kế tốn kém. Việc nâng cấp các hợp đồng (nếu có thể) để sửa các lỗ hổng đòi hỏi phải viết lại nhiều codebase và tốn nhiều công sức hơn cho việc phát triển. Xác minh hình thức có thể phát hiện nhiều lỗi trong các triển khai hợp đồng mà có thể bị các người kiểm thử và kiểm toán viên bỏ qua và cung cấp cơ hội lớn để khắc phục các vấn đề đó trước khi triển khai một hợp đồng.
+
+## Nhược điểm của xác minh hình thức {#drawbacks-of-formal-verification}
+
+### Chi phí lao động thủ công {#cost-of-manual-labor}
+
+Xác minh hình thức, đặc biệt là xác minh bán tự động trong đó con người hướng dẫn trình chứng minh suy ra các bằng chứng về tính đúng đắn, đòi hỏi nhiều lao động thủ công. Hơn nữa, việc tạo ra đặc tả hình thức là một hoạt động phức tạp đòi hỏi trình độ kỹ năng cao.
+
+Những yếu tố này (nỗ lực và kỹ năng) làm cho việc xác minh hình thức trở nên đòi hỏi và tốn kém hơn so với các phương pháp thông thường để đánh giá tính đúng đắn trong các hợp đồng, chẳng hạn như kiểm thử và kiểm toán. Tuy nhiên, việc trả chi phí cho một cuộc kiểm toán xác minh đầy đủ là thực tế, xét đến chi phí của các lỗi trong các triển khai hợp đồng thông minh.
+
+### Kết quả âm tính giả {#false-negatives}
+
+Xác minh hình thức chỉ có thể kiểm tra xem việc thực thi của hợp đồng thông minh có khớp với đặc tả hình thức hay không. Do đó, điều quan trọng là phải đảm bảo đặc tả mô tả đúng các hành vi dự kiến của một hợp đồng thông minh.
+
+Nếu các đặc tả được viết kém, các vi phạm thuộc tính—chỉ ra các lần thực thi dễ bị tổn thương—không thể được phát hiện bởi cuộc kiểm toán xác minh hình thức. Trong trường hợp này, một nhà phát triển có thể giả định sai rằng hợp đồng không có lỗi.
+
+### Vấn đề về hiệu suất {#performance-issues}
+
+Xác minh hình thức gặp phải một số vấn đề về hiệu suất. Ví dụ, các vấn đề bùng nổ trạng thái và đường dẫn gặp phải trong quá trình kiểm tra mô hình và kiểm tra biểu tượng, tương ứng, có thể ảnh hưởng đến các quy trình xác minh. Ngoài ra, các công cụ xác minh hình thức thường sử dụng các trình giải SMT và các trình giải ràng buộc khác trong lớp cơ sở của chúng, và các trình giải này dựa vào các quy trình tính toán chuyên sâu.
+
+Ngoài ra, không phải lúc nào các trình xác minh chương trình cũng có thể xác định được một thuộc tính (được mô tả dưới dạng một công thức logic) có thể được thỏa mãn hay không (vấn đề "[tính quyết định được](https://en.wikipedia.org/wiki/Decision_problem)") bởi vì một chương trình có thể không bao giờ kết thúc. Do đó, có thể không thể chứng minh một số thuộc tính cho một hợp đồng ngay cả khi nó được đặc tả tốt.
+
+## Công cụ xác minh hình thức cho các hợp đồng thông minh Ethereum {#formal-verification-tools}
+
+### Các ngôn ngữ đặc tả để tạo đặc tả hình thức {#specification-languages}
+
+**Act**: __Act cho phép đặc tả các cập nhật lưu trữ, các điều kiện trước/sau và các bất biến của hợp đồng. Bộ công cụ của nó cũng có các backend chứng minh có thể chứng minh nhiều thuộc tính thông qua Coq, các trình giải SMT, hoặc hevm.__
+
+- [GitHub](https://github.com/ethereum/act)
+- [Tài liệu tham khảo](https://github.com/argotorg/act)
+
+**Scribble** - __Scribble chuyển đổi các chú thích mã trong ngôn ngữ đặc tả Scribble thành các khẳng định cụ thể kiểm tra đặc tả.__
+
+- [Tài liệu tham khảo](https://docs.scribble.codes/)
+
+**Dafny** - __Dafny là một ngôn ngữ lập trình sẵn sàng cho việc xác minh, dựa vào các chú thích cấp cao để suy luận và chứng minh tính đúng đắn của mã.__
+
+- [GitHub](https://github.com/dafny-lang/dafny)
+
+### Các trình xác minh chương trình để kiểm tra tính đúng đắn {#program-verifiers}
+
+**Certora Prover** - _Certora Prover là một công cụ xác minh hình thức tự động để kiểm tra tính đúng đắn của mã trong các hợp đồng thông minh. Các đặc tả được viết bằng CVL (Ngôn ngữ xác minh Certora), với các vi phạm thuộc tính được phát hiện bằng sự kết hợp giữa phân tích tĩnh và giải quyết ràng buộc._
+
+- [Trang web](https://www.certora.com/)
+- [Tài liệu tham khảo](https://docs.certora.com/en/latest/index.html)
+
+**Solidity SMTChecker** - __SMTChecker của Solidity là một trình kiểm tra mô hình tích hợp dựa trên SMT (Lý thuyết mô đun thỏa mãn) và giải Horn. Nó xác nhận xem mã nguồn của hợp đồng có khớp với các đặc tả trong quá trình biên dịch hay không và kiểm tra tĩnh các vi phạm về thuộc tính an toàn.__
+
+- [GitHub](https://github.com/ethereum/solidity)
+
+**solc-verify** - __solc-verify là một phiên bản mở rộng của trình biên dịch Solidity có thể thực hiện xác minh hình thức tự động trên mã Solidity bằng cách sử dụng các chú thích và xác minh chương trình theo mô-đun.__
+
+- [GitHub](https://github.com/SRI-CSL/solidity)
+
+**KEVM** - __KEVM là một ngữ nghĩa hình thức của Máy ảo Ethereum (EVM) được viết bằng khung K. KEVM có thể thực thi và có thể chứng minh một số khẳng định liên quan đến thuộc tính bằng cách sử dụng logic khả năng tiếp cận.__
+
+- [GitHub](https://github.com/runtimeverification/evm-semantics)
+- [Tài liệu tham khảo](https://jellopaper.org/)
+
+### Các khung logic để chứng minh định lý {#theorem-provers}
+
+**Isabelle** - _Isabelle/HOL là một trợ lý chứng minh cho phép các công thức toán học được biểu diễn bằng một ngôn ngữ hình thức và cung cấp các công cụ để chứng minh các công thức đó. Ứng dụng chính là việc hình thức hóa các chứng minh toán học và đặc biệt là xác minh hình thức, bao gồm việc chứng minh tính đúng đắn của phần cứng hoặc phần mềm máy tính và chứng minh các thuộc tính của các ngôn ngữ và giao thức máy tính._
+
+- [GitHub](https://github.com/isabelle-prover)
+- [Tài liệu tham khảo](https://isabelle.in.tum.de/documentation.html)
+
+**Rocq** - _Rocq là một trình chứng minh định lý tương tác cho phép bạn xác định các chương trình bằng các định lý và tạo ra các bằng chứng về tính đúng đắn được kiểm tra bằng máy một cách tương tác._
+
+- [GitHub](https://github.com/rocq-prover/rocq)
+- [Tài liệu tham khảo](https://rocq-prover.org/docs)
+
+### Các công cụ dựa trên thực thi biểu tượng để phát hiện các mẫu dễ bị tổn thương trong các hợp đồng thông minh {#symbolic-execution-tools}
+
+**Manticore** - __Một công cụ để phân tích mã byte EVM dựa trên thực thi biểu tượng_._
+
+- [GitHub](https://github.com/trailofbits/manticore)
+- [Tài liệu tham khảo](https://github.com/trailofbits/manticore/wiki)
+
+**hevm** - __hevm là một công cụ thực thi biểu tượng và trình kiểm tra tương đương cho mã byte EVM.__
+
+- [GitHub](https://github.com/dapphub/dapptools/tree/master/src/hevm)
+
+**Mythril** - _Một công cụ thực thi biểu tượng để phát hiện các lỗ hổng trong các hợp đồng thông minh Ethereum_
+
+- [GitHub](https://github.com/ConsenSys/mythril-classic)
+- [Tài liệu tham khảo](https://mythril-classic.readthedocs.io/en/develop/)
+
+## Đọc thêm {#further-reading}
+
+- [Cách Hoạt động của Xác minh Hình thức đối với Hợp đồng Thông minh](https://runtimeverification.com/blog/how-formal-verification-of-smart-contracts-works/)
+- [Cách Xác minh Hình thức có thể Đảm bảo Hợp đồng Thông minh Không có Lỗi](https://media.consensys.net/how-formal-verification-can-ensure-flawless-smart-contracts-cbda8ad99bd1)
+- [Tổng quan về các Dự án Xác minh Hình thức trong Hệ sinh thái Ethereum](https://github.com/leonardoalt/ethereum_formal_verification_overview)
+- [Xác minh Hình thức Từ đầu đến cuối Hợp đồng Thông minh Ký gửi Ethereum 2.0](https://runtimeverification.com/blog/end-to-end-formal-verification-of-ethereum-2-0-deposit-smart-contract/)
+- [Xác minh hình thức Hợp đồng thông minh phổ biến nhất thế giới](https://www.zellic.io/blog/formal-verification-weth)
+- [SMTChecker và Xác minh Hình thức](https://docs.soliditylang.org/en/v0.8.15/smtchecker.html)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/index.md b/public/content/translations/vi/developers/docs/smart-contracts/index.md
new file mode 100644
index 00000000000..b5e604f5ac3
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/index.md
@@ -0,0 +1,112 @@
+---
+title: Giới thiệu về hợp đồng thông minh
+description: Một cái nhìn tổng quan về hợp đồng thông minh, tập trung vào các đặc điểm và giới hạn độc đáo của chúng.
+lang: vi
+---
+
+## Hợp đồng thông minh là gì? Hợp đồng thông minh là gì? {#what-is-a-smart-contract}
+
+Một "hợp đồng thông minh" đơn giản chỉ là một chương trình hoạt động trên chuỗi khối Ethereum. Đó là một bộ mã (các hàm của nó) và dữ liệu (trạng thái của nó) tồn tại tại một địa chỉ cụ thể trên chuỗi khối Ethereum.
+
+Hợp đồng thông minh là một loại [tài khoản Ethereum](/developers/docs/accounts/). Điều này có nghĩa là họ có một số dư và có thể trở thành đối tượng của các giao dịch. Tuy nhiên, chúng không được điều khiển bởi người dùng, mà được triển khai vào mạng và hoạt động theo chương trình đã được lập. Các tài khoản người dùng sau đó có thể tương tác với một hợp đồng thông minh bằng cách gửi các giao dịch thực thi một chức năng được xác định trong hợp đồng thông minh. Hợp đồng thông minh có thể xác định các quy tắc, giống như một hợp đồng thông thường, và tự động thực thi chúng qua mã. Hợp đồng thông minh không thể bị xóa theo mặc định, và các tương tác với chúng là không thể đảo ngược.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Nếu bạn mới bắt đầu hoặc đang tìm kiếm một phần giới thiệu ít kỹ thuật hơn, chúng tôi khuyên bạn nên xem [phần giới thiệu về hợp đồng thông minh](/smart-contracts/) của chúng tôi.
+
+Hãy chắc chắn rằng bạn đã đọc về [tài khoản](/developers/docs/accounts/), [giao dịch](/developers/docs/transactions/) và [máy ảo Ethereum](/developers/docs/evm/) trước khi bước vào thế giới hợp đồng thông minh.
+
+## Máy bán hàng tự động kỹ thuật số {#a-digital-vending-machine}
+
+Có lẽ phép ẩn dụ tốt nhất cho một hợp đồng thông minh là một máy bán hàng tự động, như được mô tả bởi [Nick Szabo](https://unenumerated.blogspot.com/). Với những đầu vào đúng, một đầu ra nhất định được đảm bảo.
+
+Để lấy một món ăn nhẹ từ máy bán hàng tự động:
+
+```
+tiền + lựa chọn đồ ăn nhẹ = nhả đồ ăn nhẹ
+```
+
+Lô-gic này được lập trình vào trong máy bán hàng tự động.
+
+Một hợp đồng thông minh, giống như một máy bán hàng tự động, có logic được lập trình sẵn. Dưới đây là một ví dụ đơn giản về cách máy bán hàng này sẽ trông như thế nào nếu nó được viết dưới dạng hợp đồng thông minh bằng ngôn ngữ Solidity:
+
+```solidity
+pragma solidity 0.8.7;
+
+contract VendingMachine {
+
+ // Khai báo các biến trạng thái của hợp đồng
+ address public owner;
+ mapping (address => uint) public cupcakeBalances;
+
+ // Khi hợp đồng 'VendingMachine' được triển khai:
+ // 1. đặt địa chỉ triển khai làm chủ sở hữu hợp đồng
+ // 2. đặt số dư cupcake của hợp đồng thông minh đã triển khai thành 100
+ constructor() {
+ owner = msg.sender;
+ cupcakeBalances[address(this)] = 100;
+ }
+
+ // Cho phép chủ sở hữu tăng số dư cupcake của hợp đồng thông minh
+ function refill(uint amount) public {
+ require(msg.sender == owner, "Chỉ chủ sở hữu mới có thể nạp thêm.");
+ cupcakeBalances[address(this)] += amount;
+ }
+
+ // Cho phép bất kỳ ai mua cupcake
+ function purchase(uint amount) public payable {
+ require(msg.value >= amount * 1 ether, "Bạn phải trả ít nhất 1 ETH cho mỗi cupcake");
+ require(cupcakeBalances[address(this)] >= amount, "Không đủ cupcake trong kho để hoàn tất giao dịch mua này");
+ cupcakeBalances[address(this)] -= amount;
+ cupcakeBalances[msg.sender] += amount;
+ }
+}
+```
+
+Giống như cách mà máy bán hàng tự động loại bỏ nhu cầu về một nhân viên bán hàng, hợp đồng thông minh có thể thay thế các trung gian trong nhiều ngành công nghiệp.
+
+## Không cần cấp phép {#permissionless}
+
+Bất kỳ ai cũng có thể viết một hợp đồng thông minh và triển khai nó lên mạng. Bạn chỉ cần học cách viết mã bằng [ngôn ngữ hợp đồng thông minh](/developers/docs/smart-contracts/languages/) và có đủ ETH để triển khai hợp đồng của mình. Việc triển khai một hợp đồng thông minh về mặt kỹ thuật là một giao dịch, vì vậy bạn cần phải trả [gas](/developers/docs/gas/) giống như cách bạn trả gas cho một lần chuyển ETH đơn giản. Tuy nhiên, chi phí gas cho việc triển khai hợp đồng cao hơn nhiều.
+
+Ethereum có các ngôn ngữ thân thiện với nhà phát triển để viết các hợp đồng thông minh:
+
+- Solidity
+- Vyper
+
+[Thêm về các ngôn ngữ](/developers/docs/smart-contracts/languages/)
+
+Tuy nhiên, chúng phải được biên soạn trước khi có thể triển khai để máy ảo của Ethereum có thể hiểu và lưu trữ hợp đồng. [Thêm về việc biên dịch](/developers/docs/smart-contracts/compiling/)
+
+## Tính kết hợp {#composability}
+
+Hợp đồng thông minh trên Ethereum là công khai và có thể xem như là các API mở. Điều này có nghĩa là bạn có thể gọi các hợp đồng thông minh khác trong hợp đồng thông minh của riêng bạn để mở rộng đáng kể những gì có thể thực hiện. Các hợp đồng có thể triển khai các hợp đồng khác.
+
+Tìm hiểu thêm về [tính kết hợp của hợp đồng thông minh](/developers/docs/smart-contracts/composability/).
+
+## Các hạn chế {#limitations}
+
+Các hợp đồng thông minh đơn thuần không thể lấy thông tin về các sự kiện "thế giới thực" vì chúng không thể truy cập dữ liệu từ các nguồn ngoài chuỗi. Điều này có nghĩa là họ không thể phản ứng với các sự kiện trong thế giới thực. Điều này là do thiết kế. Việc phụ thuộc vào thông tin bên ngoài có thể gây tổn hại đến sự đồng thuận, điều này rất quan trọng cho bảo mật và tính phi tập trung.
+
+Tuy nhiên, điều quan trọng là các ứng dụng blockchain phải có khả năng sử dụng dữ liệu ngoài chuỗi. Giải pháp là các [oracle](/developers/docs/oracles/), là những công cụ thu thập dữ liệu ngoài chuỗi và cung cấp cho các hợp đồng thông minh.
+
+Một hạn chế khác của hợp đồng thông minh là kích thước tối đa của hợp đồng. Một hợp đồng thông minh có thể tối đa là 24KB, nếu không thì sẽ hết gas. Vấn đề này có thể được giải quyết bằng cách sử dụng [The Diamond Pattern](https://eips.ethereum.org/EIPS/eip-2535).
+
+## Hợp đồng đa chữ ký {#multisig}
+
+Hợp đồng nhiều chữ ký (Multisig) là các tài khoản hợp đồng thông minh yêu cầu nhiều chữ ký hợp lệ để thực hiện một giao dịch. Điều này rất hữu ích để tránh các điểm thất bại đơn lẻ cho các hợp đồng nắm giữ số tiền đáng kể ether hoặc các token khác. Multisig cũng phân chia trách nhiệm trong việc thực hiện hợp đồng và quản lý khóa giữa nhiều bên, ngăn chặn việc mất một khóa riêng lẻ dẫn đến việc mất tiền không thể khôi phục. Vì những lý do này, các hợp đồng đa chữ ký có thể được sử dụng cho việc quản trị DAO đơn giản. Hợp đồng đa chữ ký yêu cầu N chữ ký trong số M chữ ký được chấp nhận (trong đó N ≤ M và M > 1) để thực thi. `N = 3, M = 5` và `N = 4, M = 7` thường được sử dụng. Một multisig 4/7 cần bốn trong bảy chữ ký hợp lệ. Điều này có nghĩa là các quỹ vẫn có thể được thu hồi ngay cả khi ba chữ ký bị mất. Trong trường hợp này, điều đó cũng có nghĩa là phần lớn những người nắm giữ khóa phải đồng ý và ký tên thì hợp đồng mới có hiệu lực.
+
+## Các tài nguyên về hợp đồng thông minh {#smart-contract-resources}
+
+**Hợp đồng OpenZeppelin -** **_Thư viện để phát triển hợp đồng thông minh an toàn._**
+
+- [openzeppelin.com/contracts/](https://openzeppelin.com/contracts/)
+- [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts)
+- [Diễn đàn cộng đồng](https://forum.openzeppelin.com/c/general/16)
+
+## Đọc thêm {#further-reading}
+
+- [Coinbase: Hợp đồng thông minh là gì?](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract)
+- [Chainlink: Hợp đồng thông minh là gì?](https://chain.link/education/smart-contracts)
+- [Video: Giải thích đơn giản - Hợp đồng thông minh](https://youtu.be/ZE2HxTmxfrI)
+- [Cyfrin Updraft: Nền tảng học và kiểm toán Web3](https://updraft.cyfrin.io)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md b/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md
new file mode 100644
index 00000000000..0581e993733
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md
@@ -0,0 +1,324 @@
+---
+title: Ngôn ngữ hợp đồng thông minh
+description: Tổng quan và so sánh hai ngôn ngữ chính dùng để xây dựng hợp đồng thông minh - Solidity và Vyper.
+lang: vi
+---
+
+Một khía cạnh tuyệt vời của Ethereum đó chính là những hợp đồng thông minh có thể được viết nên bởi các ngôn ngữ lập trình tương đối thân thiện. Nếu bạn đã có kinh nghiệm với Python hoặc bất kỳ [ngôn ngữ dấu ngoặc nhọn nào](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages), bạn có thể tìm thấy một ngôn ngữ có cú pháp quen thuộc.
+
+Hai ngôn ngữ hoạt động và được duy trì phổ biến nhất là:
+
+- Solidity
+- Vyper
+
+Remix IDE cung cấp một môi trường phát triển toàn diện cho việc tạo và kiểm tra hợp đồng bằng cả Solidity và Vyper. [Hãy thử Remix IDE trong trình duyệt](https://remix.ethereum.org) để bắt đầu lập trình.
+
+Các nhà phát triển có kinh nghiệm hơn cũng có thể muốn sử dụng Yul, một ngôn ngữ trung gian cho [Máy ảo Ethereum](/developers/docs/evm/), hoặc Yul+, một phần mở rộng của Yul.
+
+Nếu bạn muốn tìm hiểu thêm và thử nghiệm các ngôn ngữ mới vẫn đang được phát triển mạnh mẽ, bạn có thể thử Fe, một ngôn ngữ hợp đồng thông minh mới nổi hiện nay còn trong giai đoạn sơ khai.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Những kiến thức trước đây về các ngôn ngữ lập trình, đặc biệt là JavaScript hoặc Python, có thể giúp bạn hiểu được sự khác biệt trong những ngôn ngữ hợp đồng thông minh. Chúng tôi cũng khuyến nghị bạn nắm rõ hợp đồng thông minh như một khái niệm trước khi đi sâu vào sự so sánh giữa các ngôn ngữ. [Giới thiệu về hợp đồng thông minh](/developers/docs/smart-contracts/).
+
+## Solidity {#solidity}
+
+- Là ngôn ngữ bậc cao và hướng đối tượng để triển khai các hợp đồng thông minh.
+- Ngôn ngữ ngoặc nhọn, chịu sự ảnh hưởng mạnh mẽ bởi C++.
+- Nhập tĩnh (kiểu dữ liệu của biến sẽ được xác định ở thời điểm biên dịch).
+- Hỗ Trợ:
+ - Kế thừa (để bạn có thể mở rộng các hợp đồng khác).
+ - Các thư viện (bạn có thể tạo ra những đoạn mã có thể tái sử dụng để gọi chúng vào các hợp đồng khác - tương tựng như hàm tĩnh trong một lớp tĩnh ở các ngôn ngữ lập trình hướng đối tượng khác).
+ - Các kiểu dữ liệu phức tạp do người dùng tự định nghĩa.
+
+### Các liên kết quan trọng {#important-links}
+
+- [Tài liệu tham khảo](https://docs.soliditylang.org/en/latest/)
+- [Cổng thông tin ngôn ngữ Solidity](https://soliditylang.org/)
+- [Solidity qua ví dụ](https://docs.soliditylang.org/en/latest/solidity-by-example.html)
+- [GitHub](https://github.com/ethereum/solidity/)
+- [Phòng trò chuyện Solidity Gitter](https://gitter.im/ethereum/solidity) được bắc cầu đến [Phòng trò chuyện Solidity Matrix](https://matrix.to/#/#ethereum_solidity:gitter.im)
+- [Bảng tính nhanh](https://reference.auditless.com/cheatsheet)
+- [Blog Solidity](https://blog.soliditylang.org/)
+- [Twitter của Solidity](https://twitter.com/solidity_lang)
+
+### Hợp đồng mẫu {#example-contract}
+
+```solidity
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity >= 0.7.0;
+
+contract Coin {
+ // Từ khóa "public" giúp các biến
+ // có thể truy cập được từ các hợp đồng khác
+ address public minter;
+ mapping (address => uint) public balances;
+
+ // Các sự kiện cho phép các ứng dụng
+ // phản ứng với các thay đổi hợp đồng cụ thể mà bạn khai báo
+ event Sent(address from, address to, uint amount);
+
+ // Mã hàm khởi tạo chỉ được chạy khi hợp đồng
+ // được tạo
+ constructor() {
+ minter = msg.sender;
+ }
+
+ // Gửi một lượng coin mới được tạo tới một địa chỉ
+ // Chỉ có thể được gọi bởi người tạo hợp đồng
+ function mint(address receiver, uint amount) public {
+ require(msg.sender == minter);
+ require(amount < 1e60);
+ balances[receiver] += amount;
+ }
+
+ // Gửi một lượng coin hiện có
+ // từ bất kỳ người gọi nào đến một địa chỉ
+ function send(address receiver, uint amount) public {
+ require(amount <= balances[msg.sender], "Số dư không đủ.");
+ balances[msg.sender] -= amount;
+ balances[receiver] += amount;
+ emit Sent(msg.sender, receiver, amount);
+ }
+}
+```
+
+Ví dụ trên sẽ cho bạn biết cú phát của hợp đồng được viết bằng Solidity là như thế nào. Để có mô tả chi tiết hơn về các hàm và biến, [xem tài liệu](https://docs.soliditylang.org/en/latest/contracts.html).
+
+## Vyper {#vyper}
+
+- Ngôn ngữ lập trình Python
+- Strong typing (kiểu dữ liệu của một đối tượng không thay đổi đột ngột, không tường minh)
+- Mã biên dịch gọn và dễ hiểu
+- Tạo mã bytecode hiệu quả
+- Được tạo ra với mục đích là it tính năng hơn Solidity để tăng sự an toàn của hợp đồng và dễ kiểm tra hơn. Vyper không hỗ trợ:
+ - Modifiers
+ - Tính kế thừa
+ - Mã assembly nội dòng
+ - Nạp chồng hàm
+ - Nạp chồng toán tử
+ - Đệ quy
+ - Vòng lặp vô hạn
+ - Các fixed points nhị phân
+
+Để biết thêm thông tin, [đọc cơ sở lý luận của Vyper](https://vyper.readthedocs.io/en/latest/index.html).
+
+### Các liên kết quan trọng {#important-links-1}
+
+- [Tài liệu tham khảo](https://vyper.readthedocs.io)
+- [Vyper qua ví dụ](https://vyper.readthedocs.io/en/latest/vyper-by-example.html)
+- [Thêm ví dụ về Vyper](https://vyper-by-example.org/)
+- [GitHub](https://github.com/vyperlang/vyper)
+- [Trò chuyện cộng đồng Vyper trên Discord](https://discord.gg/SdvKC79cJk)
+- [Bảng tính nhanh](https://reference.auditless.com/cheatsheet)
+- [Các bộ khung và công cụ phát triển hợp đồng thông minh cho Vyper](/developers/docs/programming-languages/python/)
+- [VyperPunk - học cách bảo mật và hack các hợp đồng thông minh Vyper](https://github.com/SupremacyTeam/VyperPunk)
+- [Vyper Hub để phát triển](https://github.com/zcor/vyper-dev)
+- [Các ví dụ hợp đồng thông minh Vyper hay nhất](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts)
+- [Các tài nguyên chọn lọc tuyệt vời về Vyper](https://github.com/spadebuilders/awesome-vyper)
+
+### Ví dụ {#example}
+
+```python
+# Đấu giá mở
+
+# Tham số đấu giá
+# Người thụ hưởng nhận tiền từ người trả giá cao nhất
+beneficiary: public(address)
+auctionStart: public(uint256)
+auctionEnd: public(uint256)
+
+# Trạng thái hiện tại của phiên đấu giá
+highestBidder: public(address)
+highestBid: public(uint256)
+
+# Đặt thành true ở cuối, không cho phép bất kỳ thay đổi nào
+ended: public(bool)
+
+# Theo dõi các giá thầu được hoàn lại để chúng ta có thể tuân theo mẫu rút tiền
+pendingReturns: public(HashMap[address, uint256])
+
+# Tạo một phiên đấu giá đơn giản với `_bidding_time`
+# giây thời gian đấu giá thay mặt cho
+# địa chỉ người thụ hưởng `_beneficiary`.
+@external
+def __init__(_beneficiary: address, _bidding_time: uint256):
+ self.beneficiary = _beneficiary
+ self.auctionStart = block.timestamp
+ self.auctionEnd = self.auctionStart + _bidding_time
+
+# Đặt giá cho phiên đấu giá với giá trị được gửi
+# cùng với giao dịch này.
+# Giá trị sẽ chỉ được hoàn lại nếu
+# không thắng phiên đấu giá.
+@external
+@payable
+def bid():
+ # Kiểm tra xem thời gian đặt giá đã kết thúc chưa.
+ assert block.timestamp < self.auctionEnd
+ # Kiểm tra xem giá thầu có đủ cao không
+ assert msg.value > self.highestBid
+ # Theo dõi khoản tiền hoàn lại cho người trả giá cao trước đó
+ self.pendingReturns[self.highestBidder] += self.highestBid
+ # Theo dõi giá thầu cao mới
+ self.highestBidder = msg.sender
+ self.highestBid = msg.value
+
+# Rút lại một giá thầu đã được hoàn lại trước đó. Mẫu rút tiền được
+# sử dụng ở đây để tránh một vấn đề bảo mật. Nếu các khoản hoàn trả được gửi trực tiếp
+# như một phần của bid(), một hợp đồng đặt giá độc hại có thể chặn
+# các khoản hoàn trả đó và do đó chặn các giá thầu cao hơn mới được đưa vào.
+@external
+def withdraw():
+ pending_amount: uint256 = self.pendingReturns[msg.sender]
+ self.pendingReturns[msg.sender] = 0
+ send(msg.sender, pending_amount)
+
+# Kết thúc phiên đấu giá và gửi giá thầu cao nhất
+# cho người thụ hưởng.
+@external
+def endAuction():
+ # Một nguyên tắc hay là cấu trúc các hàm tương tác
+ # với các hợp đồng khác (tức là chúng gọi các hàm hoặc gửi ether)
+ # thành ba giai đoạn:
+ # 1. kiểm tra các điều kiện
+ # 2. thực hiện các hành động (có khả năng thay đổi các điều kiện)
+ # 3. tương tác với các hợp đồng khác
+ # Nếu các giai đoạn này bị trộn lẫn, hợp đồng khác có thể gọi
+ # lại vào hợp đồng hiện tại và sửa đổi trạng thái hoặc gây ra
+ # các hiệu ứng (thanh toán ether) được thực hiện nhiều lần.
+ # Nếu các hàm được gọi trong nội bộ bao gồm tương tác với các hợp đồng
+ # bên ngoài, chúng cũng phải được coi là tương tác với
+ # các hợp đồng bên ngoài.
+
+ # 1. Điều kiện
+ # Kiểm tra xem thời gian kết thúc đấu giá đã đến chưa
+ assert block.timestamp >= self.auctionEnd
+ # Kiểm tra xem hàm này đã được gọi chưa
+ assert not self.ended
+
+ # 2. Tác động
+ self.ended = True
+
+ # 3. Tương tác
+ send(self.beneficiary, self.highestBid)
+```
+
+Ví dụ trên sẽ cho bạn biết cú phát của hợp đồng được viết bằng Vyper là như thế nào. Để có mô tả chi tiết hơn về các hàm và biến, [xem tài liệu](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction).
+
+## Yul và Yul+ {#yul}
+
+Nếu bạn mới tiếp cận Ethereum và chưa thực hiện bất kỳ đoạn mã nào với các ngôn ngữ lập trình hợp đồng thông minh, chúng tôi khuyên bạn nên bắt đầu với Solidity hoặc Vyper. Bạn chỉ nên tìm hiểu Yul hoặc Yu+ khi bạn đã quen thuộc với các kĩ thuật tốt nhất về bảo mật hợp đồng thông minh và các chi tiết công việc với Máy chủ ảo Ethereum.
+
+**Yul**
+
+- Là ngôn ngữ trung gian cho Ethereum.
+- Hỗ trợ [Máy chủ ảo Ethereum (EVM)](/developers/docs/evm) và [Ewasm](https://github.com/ewasm), một WebAssembly đặc trưng của Ethereum, và được thiết kế để trở thành một mẫu số chung có thể sử dụng được của cả hai nền tảng.
+- Mục tiêu tốt cho các giai đoạn tối ưu hóa cấp cao, có thể mang lại lợi ích ngang nhau cho cả hai nền tảng Máy chủ ảo Ethereum và Ewasm.
+
+**Yul+**
+
+- Ngôn ngữ bậc thấp, có các tiện ích mở rộng hiệu quả hơn Yul.
+- Ban đầu được thiết kế cho một hợp đồng [gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups/).
+- Yul+ có thể được xem là một đề xuất nâng cấp thử nghiệm cho Yul với việc bổ sung các tính năng mới.
+
+### Các liên kết quan trọng {#important-links-2}
+
+- [Tài liệu Yul](https://docs.soliditylang.org/en/latest/yul.html)
+- [Tài liệu Yul+](https://github.com/fuellabs/yulp)
+- [Bài viết giới thiệu Yul+](https://medium.com/@fuellabs/introducing-yul-a-new-low-level-language-for-ethereum-aa64ce89512f)
+
+### Hợp đồng mẫu {#example-contract-2}
+
+Ví dụ đơn giản sau đây thực hiện một hàm lũy thừa. Nó có thể được biên dịch bằng `solc --strict-assembly --bin input.yul`. Ví dụ này nên được đặt trong thư mục input.yul.
+
+```
+{
+ function power(base, exponent) -> result
+ {
+ switch exponent
+ case 0 { result := 1 }
+ case 1 { result := base }
+ default
+ {
+ result := power(mul(base, base), div(exponent, 2))
+ if mod(exponent, 2) { result := mul(base, result) }
+ }
+ }
+ let res := power(calldataload(0), calldataload(32))
+ mstore(0, res)
+ return(0, 32)
+}
+```
+
+Nếu bạn đã có nhiều kinh nghiệm với các hợp đồng thông minh, bạn có thể tìm thấy một bản triển khai ERC20 đầy đủ bằng Yul [tại đây](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example).
+
+## Fe {#fe}
+
+- Là ngôn ngữ nhập tĩnh cho Máy ảo Ethereum (EVM).
+- Được lấy cảm hứng từ Python và Rust.
+- Dễ học - kể cả với những lập trình viên mới tiếp cận hệ sinh thái Ethereum.
+- Quá trình phát triển Fe vẫn đang ở giai đoạn đầu với bản phát hành alpha được công bố vào 01/2021.
+
+### Các liên kết quan trọng {#important-links-3}
+
+- [GitHub](https://github.com/ethereum/fe)
+- [Thông báo về Fe](https://snakecharmers.ethereum.org/fe-a-new-language-for-the-ethereum-ecosystem/)
+- [Lộ trình Fe 2021](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg)
+- [Trò chuyện Fe trên Discord](https://discord.com/invite/ywpkAXFjZH)
+- [Twitter của Fe](https://twitter.com/official_fe)
+
+### Hợp đồng mẫu {#example-contract-3}
+
+Dưới đây là một hợp đồng đơn giản được triển khai bằng Fe.
+
+```
+type BookMsg = bytes[100]
+
+contract GuestBook:
+ pub guest_book: map
+
+ event Signed:
+ book_msg: BookMsg
+
+ pub def sign(book_msg: BookMsg):
+ self.guest_book[msg.sender] = book_msg
+
+ emit Signed(book_msg=book_msg)
+
+ pub def get_msg(addr: address) -> BookMsg:
+ return self.guest_book[addr].to_mem()
+
+```
+
+## Cách lựa chọn {#how-to-choose}
+
+Như những ngôn ngữ lập trình khác, điều này tùy thuộc vào sở thích cá nhân cũng như việc chọn đúng ngôn ngữ để phù hợp với nhu cầu công việc đó.
+
+Dưới đây là một vài gợi ý mà bạn có thể cân nhắc nếu bạn chưa từng thử lập trình một ngôn ngữ nào trước đây:
+
+### Thế mạnh của Solidity? {#solidity-advantages}
+
+- Có nhiều tài liệu hướng dẫn và các bộ công cụ học tập dành cho người mới bắt đầu. Xem thêm về điều đó trong phần [Học bằng cách viết mã](/developers/learning-tools/).
+- Có sẵn các công cụ phát triển ổn định.
+- Solidity có một cộng đồng các nhà phát triển lớp mạnh, điều đó có nghĩa là bạn sẽ luôn tìm được hầu hết các câu trả lời về những vấn đề của bạn một cách nhanh chóng.
+
+### Thế mạnh của Vyper? {#vyper-advatages}
+
+- Một cách tuyệt vời để bắt đầu cho những lập trình viên Python muốn xây dựng hợp đồng thông minh.
+- Vyper có ít tính năng hơn vì thế phù hợp cho việc phác thảo nhanh các mẫu ý tưởng.
+- Vyper nhắm đến việc đơn giản hóa việc kiểm định và giúp con người có thể hiểu được ở mức tối đa.
+
+### Thế mạnh của Yul và Yul+? {#yul-advantages}
+
+- Ngôn ngữ cấp thấp đơn giản.
+- Cho phép tiếp cận gần hơn đến phần gốc máy chủ ảo Ethereum, giúp tối ưu hóa việc sử dụng gas trong các hợp động của bạn.
+
+## So sánh các ngôn ngữ {#language-comparisons}
+
+Để so sánh cú pháp cơ bản, vòng đời hợp đồng, giao diện, toán tử, cấu trúc dữ liệu, hàm, luồng điều khiển và hơn thế nữa, hãy xem [bảng tính nhanh của Auditless](https://reference.auditless.com/cheatsheet/).
+
+## Đọc thêm {#further-reading}
+
+- [Thư viện Hợp đồng Solidity của OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/)
+- [Solidity qua ví dụ](https://solidity-by-example.org)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/vi/developers/docs/smart-contracts/libraries/index.md
new file mode 100644
index 00000000000..dae8337da76
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/libraries/index.md
@@ -0,0 +1,117 @@
+---
+title: Các thư viện hợp đồng thông minh
+description: Khám phá các thư viện hợp đồng thông minh có thể tái sử dụng và phát triển khối để tăng tốc độ phát triển dự án Ethereum của bạn.
+lang: vi
+---
+
+Bạn không cần phải viết mọi hợp đồng thông minh trong dự án của mình ngay từ đầu. Có rất nhiều thư viện hợp đồng thông minh mã nguồn mở cung cấp các khối xây dựng có thể tái sử dụng cho dự án của bạn, điều này sẽ giúp bạn không cần phải tạo lại những thứ sẵn có.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Trước khi đến với các thư viện hợp đồng thông minh, tốt hơn là bạn nên hiểu rõ cấu trúc của một hợp đồng thông minh. Hãy chuyển đến [cấu trúc hợp đồng thông minh](/developers/docs/smart-contracts/anatomy/) nếu bạn chưa thực hiện.
+
+## Thư viện có những gì {#whats-in-a-library}
+
+Bạn có thể thường tìm kiếm hai loại khối xây dựng trong thư viện hợp đồng thông minh: các hành vi tái sử dụng (các hàm được định nghĩa trong một lớp) mà bạn có thể thêm vào hợp đồng, và triển khai nhiều tiêu chuẩn khác nhau.
+
+### Các hành vi {#behaviors}
+
+Khi viết hợp đồng thông minh, rất có thể bạn sẽ thấy mình viết đi viết lại các mẫu tương tự, như chỉ định một địa chỉ _admin_ để thực hiện các hoạt động được bảo vệ trong một hợp đồng, hoặc thêm nút _tạm dừng_ khẩn cấp trong trường hợp xảy ra sự cố không mong muốn.
+
+Các thư viện hợp đồng thông minh thường cung cấp các triển khai có thể tái sử dụng của các hành vi này dưới dạng [thư viện](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) hoặc thông qua [kế thừa](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) trong Solidity.
+
+Ví dụ: sau đây là phiên bản đơn giản hóa của [hợp đồng `Ownable`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol) từ [thư viện Hợp đồng OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts), hợp đồng này chỉ định một địa chỉ làm chủ sở hữu hợp đồng và cung cấp một bổ từ để hạn chế quyền truy cập vào một phương thức chỉ dành cho chủ sở hữu đó.
+
+```solidity
+contract Ownable {
+ address public owner;
+
+ constructor() internal {
+ owner = msg.sender;
+ }
+
+ modifier onlyOwner() {
+ require(owner == msg.sender, "Ownable: người gọi không phải là chủ sở hữu");
+ _;
+ }
+}
+```
+
+Để sử dụng một khối xây dựng như thế này trong hợp đồng của bạn, bạn sẽ cần khai báo khối đó trước tiên, và sau đó mở rộng nó trong hợp đồng của chính bạn. Điều này sẽ cho phép bạn sử dụng bổ từ do hợp đồng `Ownable` cơ sở cung cấp để bảo mật các hàm của riêng bạn.
+
+```solidity
+import ".../Ownable.sol"; // Đường dẫn đến thư viện đã nhập
+
+contract MyContract is Ownable {
+ // Hàm sau chỉ có thể được gọi bởi chủ sở hữu
+ function secured() onlyOwner public {
+ msg.sender.transfer(1 ether);
+ }
+}
+```
+
+Một ví dụ phổ biến khác là [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) hoặc [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html). Đây là những thư viện (trái ngược lại với các hợp đồng gốc) cung cấp các hàm toán học với với kiểm tra Overflow, không được cung cấp bằng ngôn ngữ. Đây là một cách tốt để thực hành khi sử dụng một trong hai thư viện này thay vì các toán tử cơ bản để bảo vệ hợp đồng của bạn khỏi Overflow, điều này có thể gây ra những hậu quả khó lường!
+
+### Các tiêu chuẩn {#standards}
+
+Để tạo điều kiện thuận lợi cho [tính khả hợp và khả năng tương tác](/developers/docs/smart-contracts/composability/), cộng đồng Ethereum đã xác định một số tiêu chuẩn dưới dạng **ERCs**. Bạn có thể đọc thêm về chúng trong phần [tiêu chuẩn](/developers/docs/standards/).
+
+Khi bao gồm ERC như một phần của các hợp đồng của bạn, tốt hơn là bạn nên tìm kiếm các triển khai tiêu chuẩn thay vì cố gắng tự tạo của riêng mình. Nhiều thư viện hợp đồng thông minh bao gồm các triển khai cho các ERC phổ biến nhất. Ví dụ: [tiêu chuẩn token có thể thay thế ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) phổ biến có thể được tìm thấy trong [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) và [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20). Ngoài ra, một vài ERC cũng cung cấp các triển khai chuẩn như một phần của chính bản thân ERC.
+
+Một điều đáng chú ý đó là một vài ERC không độc lập mà nó là phần bổ sung của các ERC khác. Ví dụ: [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) thêm một tiện ích mở rộng vào ERC20 để cải thiện khả năng sử dụng của nó.
+
+## Cách thêm thư viện {#how-to}
+
+Hãy luôn tham khảo tài liệu của thư viện mà bạn đang sử dụng để đọc những hướng dẫn cụ thể về cách đưa thư viện đó vào dự án của bạn. Một số thư viện hợp đồng Solidity được đóng gói bằng `npm`, vì vậy bạn chỉ cần `npm install` chúng. Hầu hết các công cụ để [biên dịch](/developers/docs/smart-contracts/compiling/) hợp đồng sẽ tìm trong `node_modules` của bạn để tìm các thư viện hợp đồng thông minh, vì vậy bạn có thể làm như sau:
+
+```solidity
+// Thao tác này sẽ tải thư viện @openzeppelin/contracts từ node_modules của bạn
+import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
+
+contract MyNFT is ERC721 {
+ constructor() ERC721("MyNFT", "MNFT") public { }
+}
+```
+
+Bất kể bạn sử dụng phương pháp nào, khi đưa vào một thư viện, hãy luôn để mắt đến phiên bản [ngôn ngữ](/developers/docs/smart-contracts/languages/). Ví dụ, bạn có thể không sử dụng được một thư viện cho Solidity 0.6 nếu bạn đang lập trình hợp đồng của bạn bằng Solidity 0.5.
+
+## Khi nào nên sử dụng {#when-to-use}
+
+Sử dụng một thư viện hợp đồng thông minh cho dự án của bạn sẽ mang đến nhiều lợi ích. Đầu tiên và quan trọng nhất, nó sẽ tiết kiệm thời gian cho bạn bằng việc cung cấp các khối xây dựng sẵn sàng sử dụng mà bạn có thể sử dụng trong hệ thống của bạn hơn là tự viết mã cho chúng.
+
+Bảo mật cũng là một điểm cộng lớn. Các thư viện hợp đồng thông minh mã nguồn mở thường được kiểm tra rất kỹ. Với nhiều dự án phụ thuộc vào chúng, cộng đồng có động lực mạnh mẽ để giữ cho các thư viện ấy luôn được kiểm tra liên tục. Việc tìm các lỗi trong đoạn mã của ứng dụng phổ biến hơn là tìm trong các thư viện hợp đồng tái sử dụng. Một số thư viện cũng trải qua [kiểm toán bên ngoài](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audits) để tăng cường bảo mật.
+
+Tuy nhiên, sử dụng các thư viện hợp đồng thông minh mang đến rủi ro khi chúng sẽ đưa các đoạn mã mà bạn không quen thuộc vào dự án của bạn. Sẽ rất tuyệt khi thêm một hợp đồng và sử dụng nó trực tiếp vào trong dự án của bạn, nhưng nếu không rõ chức năng của hợp đồng đó, bạn có thể vô tình gây ra sự cố trong hệ thống của mình do một hành vi mà bạn không ngờ đến. Hãy luôn chắc chắn là mình đã đọc các tài liệu tham khảo của những đoạn mã mà bạn thêm vào, và sau đó xem xét đoạn mã đó trước khi biến nó thành một phần của dự án!
+
+Cuối cùng, khi quyết định có sử dụng một thư viện hay không, hãy cân nhắc đến tổng thể sử dụng của nó. Một thư viện được áp dụng rộng rãi có lợi ích là sở hữu một cộng đồng lớn mạnh và có nhiều lập trình viên luôn kiểm tra các vấn đề của nó. Bảo mật nên là trọng tâm chính của bạn khi xây dựng hợp đồng thông minh!
+
+## Các công cụ liên quan {#related-tools}
+
+**OpenZeppelin Contracts -** **_Thư viện phổ biến nhất để phát triển hợp đồng thông minh bảo mật._**
+
+- [Tài liệu](https://docs.openzeppelin.com/contracts/)
+- [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts)
+- [Diễn đàn cộng đồng](https://forum.openzeppelin.com/c/general/16)
+
+**DappSys -** **_Các khối xây dựng an toàn, đơn giản, linh hoạt cho các hợp đồng thông minh._**
+
+- [Tài liệu](https://dappsys.readthedocs.io/)
+- [GitHub](https://github.com/dapphub/dappsys)
+
+**HQ20 -** **_Một dự án Solidity với các hợp đồng, thư viện và ví dụ để giúp bạn xây dựng các ứng dụng phân tán đầy đủ tính năng cho thế giới thực._**
+
+- [GitHub](https://github.com/HQ20/contracts)
+
+**thirdweb Solidity SDK -** **_Cung cấp các công cụ cần thiết để xây dựng các hợp đồng thông minh tùy chỉnh một cách hiệu quả._**
+
+- [Tài liệu](https://portal.thirdweb.com/contracts/build/overview)
+- [GitHub](https://github.com/thirdweb-dev/contracts)
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Những lưu ý về bảo mật cho các nhà phát triển Ethereum](/developers/docs/smart-contracts/security/) _– Hướng dẫn về các lưu ý bảo mật khi xây dựng hợp đồng thông minh, bao gồm cả việc sử dụng thư viện._
+- [Tìm hiểu về hợp đồng thông minh token ERC-20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _-Hướng dẫn về tiêu chuẩn ERC20, được cung cấp bởi nhiều thư viện._
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/naming/index.md b/public/content/translations/vi/developers/docs/smart-contracts/naming/index.md
new file mode 100644
index 00000000000..0a8d13941c8
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/naming/index.md
@@ -0,0 +1,101 @@
+---
+title: Đặt tên cho hợp đồng thông minh
+description: Các phương pháp hay nhất để đặt tên cho hợp đồng thông minh Ethereum bằng ENS
+lang: vi
+---
+
+Hợp đồng thông minh là nền tảng của cơ sở hạ tầng phi tập trung của Ethereum, cho phép các ứng dụng và giao thức tự trị. Nhưng ngay cả khi các khả năng của hợp đồng phát triển, người dùng và nhà phát triển vẫn dựa vào các địa chỉ thập lục phân thô để xác định và tham chiếu các hợp đồng này.
+
+Việc đặt tên cho các hợp đồng thông minh bằng [Dịch vụ Định danh Ethereum (ENS)](https://ens.domains/) giúp cải thiện trải nghiệm người dùng bằng cách loại bỏ các địa chỉ hợp đồng thập lục phân và giảm rủi ro từ các cuộc tấn công như đầu độc địa chỉ và tấn công giả mạo. Hướng dẫn này giải thích tại sao việc đặt tên cho hợp đồng thông minh lại quan trọng, cách thức thực hiện và các công cụ có sẵn như [Enscribe](https://www.enscribe.xyz) để đơn giản hóa quy trình và giúp các nhà phát triển áp dụng phương pháp này.
+
+## Tại sao nên đặt tên cho hợp đồng thông minh? {#why-name-contracts}
+
+### Các định danh mà con người có thể đọc được {#human-readable-identifiers}
+
+Thay vì tương tác với các địa chỉ hợp đồng không rõ ràng như `0x8f8e...f9e3`, các nhà phát triển và người dùng có thể sử dụng các tên mà con người có thể đọc được như `v2.myapp.eth`. Điều này giúp đơn giản hóa các tương tác với hợp đồng thông minh.
+
+Điều này có thể thực hiện được nhờ [Dịch vụ Định danh Ethereum](https://ens.domains/) cung cấp dịch vụ đặt tên phi tập trung cho các địa chỉ Ethereum. Điều này tương tự như cách Dịch vụ Tên Miền (DNS) cho phép người dùng internet truy cập các địa chỉ mạng bằng một tên như ethereum.org thay vì thông qua một địa chỉ IP như `104.18.176.152`.
+
+### Cải thiện bảo mật và độ tin cậy {#improved-security-and-trust}
+
+Các hợp đồng được đặt tên giúp giảm thiểu các giao dịch vô tình đến sai địa chỉ. Chúng cũng giúp người dùng xác định các hợp đồng gắn với các ứng dụng hoặc thương hiệu cụ thể. Điều này bổ sung một lớp tin cậy về mặt danh tiếng, đặc biệt khi các tên được gắn vào các tên miền mẹ nổi tiếng như `uniswap.eth`.
+
+Do độ dài 42 ký tự của địa chỉ Ethereum, người dùng rất khó xác định những thay đổi nhỏ trong địa chỉ, nơi một vài ký tự đã bị sửa đổi. Ví dụ: một địa chỉ như `0x58068646C148E313CB414E85d2Fe89dDc3426870` thường sẽ bị các ứng dụng dành cho người dùng như ví rút gọn thành `0x580...870`. Người dùng khó có thể nhận thấy một địa chỉ độc hại khi một vài ký tự đã bị thay đổi.
+
+Loại kỹ thuật này được sử dụng trong các cuộc tấn công giả mạo và đầu độc địa chỉ, nơi người dùng bị lừa tin rằng họ đang tương tác hoặc gửi tiền đến đúng địa chỉ, trong khi thực tế địa chỉ đó chỉ giống với địa chỉ chính xác nhưng không phải là một.
+
+Tên ENS cho ví và hợp đồng giúp bảo vệ khỏi các loại tấn công này. Giống như các cuộc tấn công giả mạo DNS, các cuộc tấn công giả mạo ENS cũng có thể được che giấu, tuy nhiên, người dùng có nhiều khả năng nhận thấy một lỗi chính tả trong tên ENS hơn là một sửa đổi nhỏ đối với một địa chỉ thập lục phân.
+
+### UX tốt hơn cho ví và trình khám phá {#better-ux}
+
+Khi một hợp đồng thông minh đã được định cấu hình bằng tên ENS, các ứng dụng như ví và trình khám phá chuỗi khối có thể hiển thị tên ENS cho các hợp đồng thông minh, thay vì các địa chỉ thập lục phân. Điều này mang lại sự nâng cao đáng kể về trải nghiệm người dùng (UX) cho người dùng.
+
+Ví dụ: khi tương tác với một ứng dụng như Uniswap, người dùng thường sẽ thấy rằng ứng dụng họ đang tương tác được lưu trữ trên trang web `uniswap.org`, nhưng họ sẽ được hiển thị một địa chỉ hợp đồng thập lục phân nếu Uniswap chưa đặt tên cho các hợp đồng thông minh của họ bằng ENS. Nếu hợp đồng được đặt tên, thay vào đó, họ có thể thấy `v4.contracts.uniswap.eth` hữu ích hơn nhiều.
+
+## Đặt tên tại thời điểm triển khai so với sau khi triển khai {#when-to-name}
+
+Có hai thời điểm có thể đặt tên cho hợp đồng thông minh:
+
+- **Tại thời điểm triển khai**: gán một tên ENS cho hợp đồng khi nó được triển khai.
+- **Sau khi triển khai**: ánh xạ một địa chỉ hợp đồng hiện có với một tên ENS mới.
+
+Cả hai phương pháp đều dựa vào việc có quyền sở hữu hoặc quản lý quyền truy cập vào một tên miền ENS để họ có thể tạo và thiết lập các bản ghi ENS.
+
+## Cách hoạt động của việc đặt tên ENS cho các hợp đồng {#how-ens-naming-works}
+
+Các tên ENS được lưu trữ trên chuỗi và phân giải thành các địa chỉ Ethereum thông qua các trình phân giải ENS. Để đặt tên cho một hợp đồng thông minh:
+
+1. Đăng ký hoặc kiểm soát một tên miền ENS mẹ (ví dụ: `myapp.eth`)
+2. Tạo một tên miền phụ (ví dụ: `v1.myapp.eth`)
+3. Thiết lập bản ghi `địa chỉ` của tên miền phụ thành địa chỉ hợp đồng
+4. Thiết lập bản ghi ngược của hợp đồng thành ENS để cho phép tìm thấy tên thông qua địa chỉ của nó
+
+Các tên ENS có cấu trúc phân cấp và hỗ trợ không giới hạn tên phụ. Việc thiết lập các bản ghi này thường bao gồm việc tương tác với sổ đăng ký ENS và các hợp đồng trình phân giải công khai.
+
+## Công cụ để đặt tên cho hợp đồng {#tools}
+
+Có hai phương pháp để đặt tên cho hợp đồng thông minh. Sử dụng [Ứng dụng ENS](https://app.ens.domains) với một số bước thủ công hoặc sử dụng [Enscribe](https://www.enscribe.xyz). Những điều này được nêu dưới đây.
+
+### Thiết lập ENS thủ công {#manual-ens-setup}
+
+Sử dụng [Ứng dụng ENS](https://app.ens.domains/), các nhà phát triển có thể tạo các tên phụ theo cách thủ công và thiết lập các bản ghi địa chỉ chuyển tiếp. Tuy nhiên, họ không thể thiết lập một tên chính cho một hợp đồng thông minh bằng cách thiết lập bản ghi ngược cho tên đó thông qua ứng dụng ENS. Phải thực hiện các bước thủ công được đề cập trong [tài liệu ENS](https://docs.ens.domains/web/naming-contracts/).
+
+### Enscribe {#enscribe}
+
+[Enscribe](https://www.enscribe.xyz) đơn giản hóa việc đặt tên hợp đồng thông minh bằng ENS và nâng cao niềm tin của người dùng vào các hợp đồng thông minh. Nó cung cấp:
+
+- **Triển khai và đặt tên nguyên tử**: Gán một tên ENS khi triển khai một hợp đồng mới
+- **Đặt tên sau triển khai**: Gắn tên cho các hợp đồng đã được triển khai
+- **Hỗ trợ đa chuỗi**: Hoạt động trên Ethereum và các mạng L2 nơi ENS được hỗ trợ
+- **Dữ liệu xác minh hợp đồng**: Bao gồm dữ liệu xác minh hợp đồng được lấy từ nhiều nguồn để tăng cường niềm tin cho người dùng
+
+Enscribe hỗ trợ các tên ENS do người dùng cung cấp hoặc các tên miền riêng của nó nếu người dùng không có tên ENS.
+
+Bạn có thể truy cập [Ứng dụng Enscribe](https://app.enscribe.xyz) để bắt đầu đặt tên và xem các hợp đồng thông minh.
+
+## Các phương pháp tốt nhất{#best-practices}
+
+- **Sử dụng các tên rõ ràng, có phiên bản** như `v1.myapp.eth` để làm cho việc nâng cấp hợp đồng trở nên minh bạch
+- **Thiết lập bản ghi ngược** để liên kết hợp đồng với tên ENS nhằm đảm bảo khả năng hiển thị trong các ứng dụng như ví và trình khám phá chuỗi khối.
+- **Theo dõi ngày hết hạn một cách chặt chẽ** nếu bạn muốn ngăn chặn những thay đổi vô tình về quyền sở hữu
+- **Xác minh nguồn hợp đồng** để người dùng có thể tin tưởng rằng hợp đồng được đặt tên hoạt động như mong đợi
+
+## Rủi ro {#risks}
+
+Việc đặt tên cho các hợp đồng thông minh mang lại những lợi ích đáng kể cho người dùng Ethereum, tuy nhiên, chủ sở hữu các tên miền ENS phải cảnh giác trong việc quản lý chúng. Các rủi ro đáng chú ý bao gồm:
+
+- **Hết hạn**: Giống như tên DNS, việc đăng ký tên ENS có thời hạn hữu hạn. Do đó, điều quan trọng là chủ sở hữu phải theo dõi ngày hết hạn của tên miền và gia hạn chúng trước khi hết hạn. Cả Ứng dụng ENS và Enscribe đều cung cấp các chỉ báo trực quan cho chủ sở hữu tên miền khi sắp đến ngày hết hạn.
+- **Thay đổi quyền sở hữu**: Các bản ghi ENS được biểu thị dưới dạng NFT trên Ethereum, trong đó chủ sở hữu của một tên miền `.eth` cụ thể sở hữu NFT được liên kết. Do đó, nếu một tài khoản khác nắm quyền sở hữu NFT này, chủ sở hữu mới có thể sửa đổi bất kỳ bản ghi ENS nào mà họ thấy phù hợp.
+
+Để giảm thiểu những rủi ro đó, tài khoản chủ sở hữu cho các tên miền cấp 2 (2LD) `.eth` nên được bảo mật thông qua ví đa chữ ký với các tên miền phụ được tạo để quản lý việc đặt tên hợp đồng. Bằng cách đó, trong trường hợp có bất kỳ thay đổi quyền sở hữu nào do vô tình hoặc độc hại ở cấp tên miền phụ, chúng có thể bị chủ sở hữu 2LD ghi đè.
+
+## Tương lai của việc đặt tên hợp đồng {#future}
+
+Việc đặt tên hợp đồng đang trở thành một phương pháp hay nhất cho việc phát triển dapp, tương tự như cách tên miền thay thế địa chỉ IP trên web. Khi nhiều cơ sở hạ tầng hơn như ví, trình khám phá và bảng điều khiển tích hợp phân giải ENS cho các hợp đồng, các hợp đồng được đặt tên sẽ cải thiện sự an toàn và giảm lỗi trên toàn hệ sinh thái.
+
+Bằng cách làm cho các hợp đồng thông minh dễ nhận biết và suy luận hơn, việc đặt tên giúp thu hẹp khoảng cách giữa người dùng và ứng dụng trên Ethereum, cải thiện cả sự an toàn và UX cho người dùng.
+
+## Đọc thêm {#further-reading}
+
+- [Đặt tên cho Hợp đồng thông minh bằng ENS](https://docs.ens.domains/web/naming-contracts/)
+- [Đặt tên cho Hợp đồng thông minh bằng Enscribe](https://www.enscribe.xyz/docs).
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/security/index.md b/public/content/translations/vi/developers/docs/smart-contracts/security/index.md
new file mode 100644
index 00000000000..e6bcafe933b
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/security/index.md
@@ -0,0 +1,576 @@
+---
+title: Bảo mật hợp đồng thông minh
+description: Một tổng hợp về hướng dẫn xây dựng hợp đồng để xây dựng nên hợp đồng Ethereum thông minh và an toàn
+lang: vi
+---
+
+Hợp đồng thông minh cực kỳ linh hoạt và có khả năng điều khiển được một lượng lớn giá trị và số liệu, trong khi đang chạy logic bất biến dựa trên mã được triển khai trên blockchain. Cái này đã tạo ra một hệ sinh thái sôi động gồm các ứng dụng phi tập trung và đáng tin cậy, điều này mang lại rất nhiều lợi thế so với các hệ thống cũ. Chúng còn đại diện cho những cơ hội cho những kẻ tấn công ngắm đến lợi nhuận bằng cách khai thác các lỗ hổng trong hợp đồng thông minh.
+
+Các chuỗi khối công khai, như Ethereum, càng làm phức tạp thêm vấn đề bảo mật của các hợp đồng thông minh. Mã hợp đồng đã triển khai _thường_ không thể thay đổi để vá các lỗ hổng bảo mật, trong khi tài sản bị đánh cắp từ các hợp đồng thông minh cực kỳ khó theo dõi và hầu như không thể phục hồi do tính bất biến.
+
+Mặc dù các con số khác nhau, người ta ước tính rằng tổng giá trị bị đánh cắp hoặc mất mát do các khiếm khuyết bảo mật trong hợp đồng thông minh đã dễ dàng vượt qua 1 tỷ đô la. Điều này bao gồm các sự cố nổi tiếng, chẳng hạn như [vụ hack DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 triệu ETH bị đánh cắp, trị giá hơn 1 tỷ đô la theo giá ngày nay), [vụ hack ví đa chữ ký Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (mất 30 triệu đô la cho hacker) và [sự cố ví Parity bị đóng băng](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (hơn 300 triệu đô la ETH bị khóa vĩnh viễn).
+
+Các vấn đề nói trên khiến các nhà phát triển bắt buộc phải đầu tư nỗ lực vào việc xây dựng các hợp đồng thông minh an toàn, mạnh mẽ và có khả năng phục hồi. Bảo mật hợp đồng thông minh là một vấn đề nghiêm túc và mọi nhà phát triển nên học hỏi. Hướng dẫn này sẽ đề cập đến các cân nhắc về bảo mật cho các nhà phát triển Ethereum và khám phá các tài nguyên để cải thiện bảo mật hợp đồng thông minh.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Hãy chắc chắn rằng bạn đã quen thuộc với [các nguyên tắc cơ bản về phát triển hợp đồng thông minh](/developers/docs/smart-contracts/) trước khi giải quyết vấn đề bảo mật.
+
+## Hướng dẫn xây dựng hợp đồng thông minh Ethereum an toàn {#smart-contract-security-guidelines}
+
+### 1. Thiết kế các biện pháp kiểm soát truy cập phù hợp {#design-proper-access-controls}
+
+Trong các hợp đồng thông minh, các hàm được đánh dấu là `public` hoặc `external` có thể được gọi bởi bất kỳ tài khoản sở hữu bên ngoài (EOA) hoặc tài khoản hợp đồng nào. Việc chỉ định khả năng hiển thị công khai cho các hàm là cần thiết nếu bạn muốn người khác tương tác với hợp đồng của mình. Tuy nhiên, các hàm được đánh dấu là `private` chỉ có thể được gọi bởi các hàm trong hợp đồng thông minh, chứ không phải các tài khoản bên ngoài. Việc cấp cho mọi người tham gia mạng quyền truy cập vào các chức năng của hợp đồng có thể gây ra sự cố, đặc biệt nếu điều đó có nghĩa là bất kỳ ai cũng có thể thực hiện các hoạt động nhạy cảm (ví dụ: đúc token mới).
+
+Để ngăn chặn việc sử dụng trái phép các chức năng của hợp đồng thông minh, cần phải thực hiện các biện pháp kiểm soát truy cập an toàn. Cơ chế kiểm soát truy cập hạn chế khả năng sử dụng các chức năng nhất định trong hợp đồng thông minh đối với các thực thể được phê duyệt, chẳng hạn như các tài khoản chịu trách nhiệm quản lý hợp đồng. **Mô hình có thể sở hữu** và **kiểm soát dựa trên vai trò** là hai mô hình hữu ích để triển khai kiểm soát truy cập trong các hợp đồng thông minh:
+
+#### Mô hình có thể sở hữu {#ownable-pattern}
+
+Trong mô hình Có thể sở hữu, một địa chỉ được đặt làm "chủ sở hữu" của hợp đồng trong quá trình tạo hợp đồng. Các hàm được bảo vệ được gán một công cụ sửa đổi `OnlyOwner`, đảm bảo hợp đồng xác thực danh tính của địa chỉ gọi trước khi thực thi hàm. Các lệnh gọi đến các chức năng được bảo vệ từ các địa chỉ khác ngoài chủ sở hữu hợp đồng luôn được hoàn nguyên, ngăn chặn truy cập không mong muốn.
+
+#### Kiểm soát truy cập dựa trên vai trò {#role-based-access-control}
+
+Việc đăng ký một địa chỉ duy nhất với tư cách là `Owner` trong một hợp đồng thông minh sẽ có nguy cơ tập trung hóa và là một điểm lỗi duy nhất. Nếu khóa tài khoản của chủ sở hữu bị xâm phạm, kẻ tấn công có thể tấn công hợp đồng sở hữu. Đây là lý do tại sao việc sử dụng mô hình kiểm soát truy cập dựa trên vai trò với nhiều tài khoản quản trị có thể là một lựa chọn tốt hơn.
+
+Trong kiểm soát truy cập dựa trên vai trò, quyền truy cập vào các chức năng nhạy cảm được phân phối giữa một nhóm người tham gia đáng tin cậy. Ví dụ: một tài khoản có thể chịu trách nhiệm đúc token, trong khi một tài khoản khác thực hiện nâng cấp hoặc tạm dừng hợp đồng. Việc phân cấp quyền kiểm soát truy cập theo cách này giúp loại bỏ các điểm lỗi duy nhất và giảm các giả định về sự tin cậy cho người dùng.
+
+##### Sử dụng ví đa chữ ký
+
+Một cách tiếp cận khác để triển khai kiểm soát truy cập an toàn là sử dụng [tài khoản đa chữ ký](/developers/docs/smart-contracts/#multisig) để quản lý hợp đồng. Không giống như EOA thông thường, tài khoản đa chữ ký thuộc sở hữu của nhiều thực thể và yêu cầu chữ ký từ một số lượng tài khoản tối thiểu—ví dụ như 3 trên 5—để thực hiện giao dịch.
+
+Sử dụng đa chữ ký để kiểm soát truy cập sẽ tạo ra một lớp bảo mật bổ sung vì các hành động trên hợp đồng mục tiêu yêu cầu sự đồng ý của nhiều bên. Điều này đặc biệt hữu ích nếu cần sử dụng mẫu Có thể sở hữu, vì nó khiến kẻ tấn công hoặc người trong cuộc lừa đảo khó thao túng các chức năng hợp đồng nhạy cảm cho các mục đích xấu.
+
+### 2. Sử dụng các câu lệnh require(), assert() và revert() để bảo vệ các hoạt động của hợp đồng {#use-require-assert-revert}
+
+Như đã đề cập, bất kỳ ai cũng có thể gọi các chức năng công khai trong hợp đồng thông minh của bạn sau khi nó được triển khai trên chuỗi khối. Vì bạn không thể biết trước các tài khoản bên ngoài sẽ tương tác với một hợp đồng như thế nào, lý tưởng nhất là triển khai các biện pháp bảo vệ nội bộ chống lại các hoạt động có vấn đề trước khi triển khai. Bạn có thể thực thi hành vi chính xác trong các hợp đồng thông minh bằng cách sử dụng các câu lệnh `require()`, `assert()` và `revert()` để kích hoạt các ngoại lệ và hoàn nguyên các thay đổi trạng thái nếu việc thực thi không đáp ứng các yêu cầu nhất định.
+
+**`require()`**: `require` được định nghĩa ở đầu các hàm và đảm bảo các điều kiện được xác định trước được đáp ứng trước khi hàm được gọi được thực thi. Câu lệnh `require` có thể được sử dụng để xác thực đầu vào của người dùng, kiểm tra các biến trạng thái hoặc xác thực danh tính của tài khoản gọi trước khi tiếp tục với một hàm.
+
+**`assert()`**: `assert()` được sử dụng để phát hiện các lỗi nội bộ và kiểm tra các vi phạm "bất biến" trong mã của bạn. Một bất biến là một khẳng định logic về trạng thái của một hợp đồng phải luôn đúng cho tất cả các lần thực thi hàm. Một ví dụ về bất biến là tổng cung tối đa hoặc số dư của một hợp đồng token. Việc sử dụng `assert()` đảm bảo rằng hợp đồng của bạn không bao giờ đạt đến trạng thái dễ bị tấn công và nếu có, tất cả các thay đổi đối với các biến trạng thái sẽ được khôi phục.
+
+**`revert()`**: `revert()` có thể được sử dụng trong câu lệnh if-else để kích hoạt một ngoại lệ nếu điều kiện yêu cầu không được thỏa mãn. Hợp đồng mẫu bên dưới sử dụng `revert()` để bảo vệ việc thực thi các hàm:
+
+```
+pragma solidity ^0.8.4;
+
+contract VendingMachine {
+ address owner;
+ error Unauthorized();
+ function buy(uint amount) public payable {
+ if (amount > msg.value / 2 ether)
+ revert("Không cung cấp đủ Ether.");
+ // Thực hiện giao dịch mua.
+ }
+ function withdraw() public {
+ if (msg.sender != owner)
+ revert Unauthorized();
+
+ payable(msg.sender).transfer(address(this).balance);
+ }
+}
+```
+
+### 3. Kiểm tra hợp đồng thông minh và xác minh tính đúng đắn của mã {#test-smart-contracts-and-verify-code-correctness}
+
+Tính bất biến của mã chạy trong [Máy ảo Ethereum](/developers/docs/evm/) có nghĩa là các hợp đồng thông minh đòi hỏi mức độ đánh giá chất lượng cao hơn trong giai đoạn phát triển. Kiểm tra hợp đồng của bạn một cách rộng rãi và quan sát nó để tìm bất kỳ kết quả không mong muốn nào sẽ cải thiện đáng kể tính bảo mật và bảo vệ người dùng của bạn về lâu dài.
+
+Phương pháp thông thường là viết các bài kiểm tra đơn vị nhỏ bằng cách sử dụng dữ liệu giả mà hợp đồng dự kiến sẽ nhận được từ người dùng. [Kiểm tra đơn vị](/developers/docs/smart-contracts/testing/#unit-testing) rất tốt để kiểm tra chức năng của một số hàm nhất định và đảm bảo hợp đồng thông minh hoạt động như mong đợi.
+
+Thật không may, kiểm tra đơn vị có hiệu quả tối thiểu trong việc cải thiện bảo mật hợp đồng thông minh khi được sử dụng một cách riêng lẻ. Một bài kiểm tra đơn vị có thể chứng minh một hàm thực thi đúng với dữ liệu giả, nhưng các bài kiểm tra đơn vị chỉ hiệu quả khi các bài kiểm tra đó được viết ra. Điều này gây khó khăn cho việc phát hiện các trường hợp đặc biệt bị bỏ sót và các lỗ hổng có thể phá vỡ tính an toàn của hợp đồng thông minh của bạn.
+
+Một cách tiếp cận tốt hơn là kết hợp kiểm tra đơn vị với kiểm tra dựa trên thuộc tính được thực hiện bằng cách sử dụng [phân tích tĩnh và động](/developers/docs/smart-contracts/testing/#static-dynamic-analysis). Phân tích tĩnh dựa trên các biểu diễn cấp thấp, chẳng hạn như [biểu đồ luồng điều khiển](https://en.wikipedia.org/wiki/Control-flow_graph) và [cây cú pháp trừu tượng](https://deepsource.io/glossary/ast/) để phân tích các trạng thái chương trình có thể đạt được và các đường thực thi. Trong khi đó, các kỹ thuật phân tích động, chẳng hạn như [kiểm tra mờ hợp đồng thông minh](https://www.cyfrin.io/blog/smart-contract-fuzzing-and-invariants-testing-foundry), thực thi mã hợp đồng với các giá trị đầu vào ngẫu nhiên để phát hiện các hoạt động vi phạm các thuộc tính bảo mật.
+
+[Xác minh chính thức](/developers/docs/smart-contracts/formal-verification) là một kỹ thuật khác để xác minh các thuộc tính bảo mật trong hợp đồng thông minh. Không giống như kiểm thử thông thường, xác minh chính thức có thể chứng minh một cách thuyết phục sự không có lỗi trong một hợp đồng thông minh. Điều này đạt được bằng cách tạo một đặc tả chính thức nắm bắt các thuộc tính bảo mật mong muốn và chứng minh rằng một mô hình chính thức của các hợp đồng tuân thủ đặc tả này.
+
+### 4. Yêu cầu đánh giá độc lập về mã của bạn {#get-independent-code-reviews}
+
+Sau khi thử nghiệm hợp đồng của bạn, tốt nhất là nhờ người khác kiểm tra mã nguồn để tìm bất kỳ vấn đề bảo mật nào. Thử nghiệm sẽ không phát hiện ra mọi sai sót trong hợp đồng thông minh, nhưng việc có được một đánh giá độc lập sẽ làm tăng khả năng phát hiện các lỗ hổng.
+
+#### Kiểm toán {#audits}
+
+Việc ủy thác kiểm toán hợp đồng thông minh là một cách để tiến hành đánh giá mã độc lập. Các kiểm toán viên đóng một vai trò quan trọng trong việc đảm bảo rằng các hợp đồng thông minh được bảo mật và không có các khiếm khuyết về chất lượng cũng như lỗi thiết kế.
+
+Điều đó nói rằng, bạn nên tránh coi kiểm toán là một viên đạn bạc. Các cuộc kiểm toán hợp đồng thông minh sẽ không phát hiện ra mọi lỗi và chủ yếu được thiết kế để cung cấp một vòng đánh giá bổ sung, có thể giúp phát hiện các vấn đề mà các nhà phát triển bỏ sót trong quá trình phát triển và thử nghiệm ban đầu. Bạn cũng nên tuân theo các phương pháp hay nhất để làm việc với các kiểm toán viên, chẳng hạn như ghi lại mã đúng cách và thêm nhận xét nội tuyến, để tối đa hóa lợi ích của việc kiểm toán hợp đồng thông minh.
+
+- [Mẹo và thủ thuật kiểm toán hợp đồng thông minh](https://twitter.com/tinchoabbate/status/1400170232904400897) - _@tinchoabbate_
+- [Tận dụng tối đa cuộc kiểm toán của bạn](https://inference.ag/blog/2023-08-14-tips/) - _Inference_
+
+#### Tiền thưởng săn lỗi {#bug-bounties}
+
+Thiết lập một chương trình tiền thưởng săn lỗi là một cách tiếp cận khác để thực hiện các bài đánh giá mã bên ngoài. Tiền thưởng săn lỗi là một phần thưởng tài chính dành cho các cá nhân (thường là hacker mũ trắng) phát hiện ra các lỗ hổng trong một ứng dụng.
+
+Khi được sử dụng đúng cách, tiền thưởng săn lỗi sẽ khuyến khích các thành viên của cộng đồng hacker kiểm tra mã của bạn để tìm các sai sót nghiêm trọng. Một ví dụ thực tế là "lỗi tiền vô hạn" có thể cho phép kẻ tấn công tạo ra một lượng ether không giới hạn trên [Optimism](https://www.optimism.io/), một giao thức [Lớp 2](/layer-2/) chạy trên Ethereum. May mắn thay, một hacker mũ trắng đã [phát hiện ra lỗ hổng](https://www.saurik.com/optimism.html) và thông báo cho đội ngũ, [kiếm được một khoản thanh toán lớn trong quá trình này](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/).
+
+Một chiến lược hữu ích là đặt khoản thanh toán của chương trình tiền thưởng săn lỗi tương ứng với số tiền đang bị đe dọa. Được mô tả là “[tiền thưởng săn lỗi có thể mở rộng](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)”, cách tiếp cận này cung cấp các ưu đãi tài chính để các cá nhân tiết lộ các lỗ hổng một cách có trách nhiệm thay vì khai thác chúng.
+
+### 5. Tuân thủ các phương pháp hay nhất trong quá trình phát triển hợp đồng thông minh {#follow-smart-contract-development-best-practices}
+
+Sự tồn tại của các cuộc kiểm toán và tiền thưởng săn lỗi không miễn trừ trách nhiệm của bạn trong việc viết mã chất lượng cao. Bảo mật hợp đồng thông minh tốt bắt đầu bằng việc tuân theo các quy trình thiết kế và phát triển phù hợp:
+
+- Lưu trữ tất cả mã trong một hệ thống kiểm soát phiên bản, chẳng hạn như git
+
+- Thực hiện tất cả các sửa đổi mã thông qua các yêu cầu kéo
+
+- Đảm bảo các yêu cầu kéo có ít nhất một người đánh giá độc lập—nếu bạn đang làm việc một mình trong một dự án, hãy cân nhắc tìm các nhà phát triển khác và trao đổi đánh giá mã
+
+- Sử dụng một [môi trường phát triển](/developers/docs/frameworks/) để kiểm tra, biên dịch, triển khai các hợp đồng thông minh
+
+- Chạy mã của bạn qua các công cụ phân tích mã cơ bản, chẳng hạn như, [Cyfrin Aderyn](https://github.com/Cyfrin/aderyn), Mythril và Slither. Lý tưởng nhất là bạn nên làm điều này trước khi mỗi yêu cầu kéo được hợp nhất và so sánh sự khác biệt trong đầu ra
+
+- Đảm bảo mã của bạn biên dịch không có lỗi và trình biên dịch Solidity không phát ra cảnh báo nào
+
+- Ghi lại tài liệu mã của bạn đúng cách (sử dụng [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html)) và mô tả chi tiết về kiến trúc hợp đồng bằng ngôn ngữ dễ hiểu. Điều này sẽ giúp người khác kiểm toán và xem xét mã của bạn dễ dàng hơn.
+
+### 6. Thực hiện các kế hoạch phục hồi sau thảm họa mạnh mẽ {#implement-disaster-recovery-plans}
+
+Việc thiết kế các biện pháp kiểm soát truy cập an toàn, triển khai các công cụ sửa đổi chức năng và các đề xuất khác có thể cải thiện tính bảo mật của hợp đồng thông minh, nhưng chúng không thể loại trừ khả năng bị khai thác độc hại. Xây dựng các hợp đồng thông minh an toàn đòi hỏi phải “chuẩn bị cho thất bại” và có một kế hoạch dự phòng để ứng phó hiệu quả với các cuộc tấn công. Một kế hoạch phục hồi sau thảm họa phù hợp sẽ kết hợp một số hoặc tất cả các thành phần sau:
+
+#### Nâng cấp hợp đồng {#contract-upgrades}
+
+Mặc dù các hợp đồng thông minh của Ethereum mặc định là bất biến, nhưng có thể đạt được một mức độ biến đổi nhất định bằng cách sử dụng các mẫu nâng cấp. Việc nâng cấp hợp đồng là cần thiết trong trường hợp một sai sót nghiêm trọng khiến hợp đồng cũ của bạn không thể sử dụng được và việc triển khai logic mới là lựa chọn khả thi nhất.
+
+Các cơ chế nâng cấp hợp đồng hoạt động khác nhau, nhưng “mẫu ủy quyền” là một trong những phương pháp phổ biến hơn để nâng cấp các hợp đồng thông minh. [Các mẫu ủy quyền](https://www.cyfrin.io/blog/upgradeable-proxy-smart-contract-pattern) chia trạng thái và logic của một ứng dụng giữa _hai_ hợp đồng. Hợp đồng đầu tiên (được gọi là 'hợp đồng ủy quyền') lưu trữ các biến trạng thái (ví dụ: số dư của người dùng), trong khi hợp đồng thứ hai (được gọi là 'hợp đồng logic') giữ mã để thực thi các chức năng của hợp đồng.
+
+Các tài khoản tương tác với hợp đồng ủy quyền, hợp đồng này sẽ chuyển tất cả các lệnh gọi hàm đến hợp đồng logic bằng cách sử dụng lệnh gọi cấp thấp [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries). Không giống như một lệnh gọi thông điệp thông thường, `delegatecall()` đảm bảo mã chạy tại địa chỉ của hợp đồng logic được thực thi trong ngữ cảnh của hợp đồng gọi. Điều này có nghĩa là hợp đồng logic sẽ luôn ghi vào bộ lưu trữ của proxy (thay vì bộ lưu trữ của chính nó) và các giá trị ban đầu của `msg.sender` và `msg.value` được bảo toàn.
+
+Việc ủy quyền các cuộc gọi đến hợp đồng logic yêu cầu lưu trữ địa chỉ của nó trong bộ nhớ của hợp đồng ủy quyền. Do đó, việc nâng cấp logic của hợp đồng chỉ là vấn đề triển khai một hợp đồng logic khác và lưu trữ địa chỉ mới trong hợp đồng ủy quyền. Vì các lệnh gọi tiếp theo đến hợp đồng proxy được tự động định tuyến đến hợp đồng logic mới, bạn sẽ “nâng cấp” hợp đồng mà không thực sự sửa đổi mã.
+
+[Thông tin thêm về nâng cấp hợp đồng](/developers/docs/smart-contracts/upgrading/).
+
+#### Dừng khẩn cấp {#emergency-stops}
+
+Như đã đề cập, việc kiểm toán và thử nghiệm rộng rãi không thể phát hiện ra tất cả các lỗi trong một hợp đồng thông minh. Nếu một lỗ hổng xuất hiện trong mã của bạn sau khi triển khai, việc vá nó là không thể vì bạn không thể thay đổi mã đang chạy tại địa chỉ hợp đồng. Ngoài ra, các cơ chế nâng cấp (ví dụ: các mẫu proxy) có thể mất thời gian để thực hiện (chúng thường yêu cầu sự chấp thuận từ các bên khác nhau), điều này chỉ mang lại cho kẻ tấn công nhiều thời gian hơn để gây ra nhiều thiệt hại hơn.
+
+Lựa chọn cuối cùng là triển khai một chức năng “dừng khẩn cấp” để chặn các cuộc gọi đến các chức năng dễ bị tấn công trong hợp đồng. Các điểm dừng khẩn cấp thường bao gồm các thành phần sau:
+
+1. Một biến Boolean toàn cục cho biết hợp đồng thông minh đang ở trạng thái dừng hay không. Biến này được đặt thành `false` khi thiết lập hợp đồng, nhưng sẽ trở về `true` sau khi hợp đồng bị dừng.
+
+2. Các hàm tham chiếu đến biến Boolean trong quá trình thực thi của chúng. Các hàm như vậy có thể truy cập được khi hợp đồng thông minh không bị dừng và trở nên không thể truy cập được khi tính năng dừng khẩn cấp được kích hoạt.
+
+3. Một thực thể có quyền truy cập vào chức năng dừng khẩn cấp, đặt biến Boolean thành `true`. Để ngăn chặn các hành động độc hại, các cuộc gọi đến chức năng này có thể bị hạn chế đối với một địa chỉ đáng tin cậy (ví dụ: chủ sở hữu hợp đồng).
+
+Khi hợp đồng kích hoạt dừng khẩn cấp, một số chức năng nhất định sẽ không thể gọi được. Điều này đạt được bằng cách bao bọc các chức năng chọn lọc trong một công cụ sửa đổi tham chiếu đến biến toàn cục. Dưới đây là [một ví dụ](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol) mô tả việc triển khai mẫu này trong các hợp đồng:
+
+```solidity
+// Mã này chưa được kiểm toán chuyên nghiệp và không đảm bảo về tính an toàn hoặc tính đúng đắn. Tự chịu rủi ro khi sử dụng.
+
+contract EmergencyStop {
+
+ bool isStopped = false;
+
+ modifier stoppedInEmergency {
+ require(!isStopped);
+ _;
+ }
+
+ modifier onlyWhenStopped {
+ require(isStopped);
+ _;
+ }
+
+ modifier onlyAuthorized {
+ // Kiểm tra quyền của msg.sender tại đây
+ _;
+ }
+
+ function stopContract() public onlyAuthorized {
+ isStopped = true;
+ }
+
+ function resumeContract() public onlyAuthorized {
+ isStopped = false;
+ }
+
+ function deposit() public payable stoppedInEmergency {
+ // Logic gửi tiền diễn ra ở đây
+ }
+
+ function emergencyWithdraw() public onlyWhenStopped {
+ // Rút tiền khẩn cấp diễn ra ở đây
+ }
+}
+```
+
+Ví dụ này cho thấy các tính năng cơ bản của các điểm dừng khẩn cấp:
+
+- `isStopped` là một Boolean đánh giá thành `false` ở đầu và `true` khi hợp đồng vào chế độ khẩn cấp.
+
+- Các công cụ sửa đổi chức năng `onlyWhenStopped` và `stoppedInEmergency` kiểm tra biến `isStopped`. `stoppedInEmergency` được sử dụng để kiểm soát các chức năng không thể truy cập được khi hợp đồng dễ bị tấn công (ví dụ: `deposit()`). Các cuộc gọi đến các chức năng này sẽ chỉ đơn giản là hoàn nguyên.
+
+`onlyWhenStopped` được sử dụng cho các chức năng có thể gọi được trong trường hợp khẩn cấp (ví dụ: `emergencyWithdraw()`). Các chức năng như vậy có thể giúp giải quyết tình huống, do đó chúng bị loại trừ khỏi danh sách “các chức năng bị hạn chế”.
+
+Sử dụng chức năng dừng khẩn cấp cung cấp một biện pháp ngăn chặn hiệu quả để đối phó với các lỗ hổng nghiêm trọng trong hợp đồng thông minh của bạn. Tuy nhiên, nó làm tăng nhu cầu người dùng phải tin tưởng các nhà phát triển không kích hoạt nó vì những lý do tự phục vụ. Để đạt được mục tiêu này, việc phân cấp quyền kiểm soát việc dừng khẩn cấp bằng cách tuân theo cơ chế bỏ phiếu trên chuỗi, khóa thời gian hoặc sự chấp thuận từ ví đa chữ ký là những giải pháp khả thi.
+
+#### Giám sát sự kiện {#event-monitoring}
+
+[Các sự kiện](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events) cho phép bạn theo dõi các lệnh gọi đến các chức năng của hợp đồng thông minh và giám sát các thay đổi đối với các biến trạng thái. Lý tưởng nhất là lập trình hợp đồng thông minh của bạn để phát ra một sự kiện bất cứ khi nào một bên nào đó thực hiện một hành động quan trọng về mặt an toàn (ví dụ: rút tiền).
+
+Việc ghi nhật ký các sự kiện và giám sát chúng ngoài chuỗi cung cấp thông tin chi tiết về các hoạt động của hợp đồng và hỗ trợ phát hiện các hành động độc hại nhanh hơn. Điều này có nghĩa là nhóm của bạn có thể phản ứng nhanh hơn với các vụ tấn công và thực hiện hành động để giảm thiểu tác động đến người dùng, chẳng hạn như tạm dừng các chức năng hoặc thực hiện nâng cấp.
+
+Bạn cũng có thể chọn một công cụ giám sát có sẵn tự động chuyển tiếp cảnh báo bất cứ khi nào có người tương tác với hợp đồng của bạn. Các công cụ này sẽ cho phép bạn tạo các cảnh báo tùy chỉnh dựa trên các trình kích hoạt khác nhau, chẳng hạn như khối lượng giao dịch, tần suất gọi hàm hoặc các hàm cụ thể có liên quan. Ví dụ: bạn có thể lập trình một cảnh báo xuất hiện khi số tiền rút trong một giao dịch vượt qua một ngưỡng nhất định.
+
+### 7. Thiết kế hệ thống quản trị an toàn {#design-secure-governance-systems}
+
+Bạn có thể muốn phân cấp ứng dụng của mình bằng cách chuyển quyền kiểm soát các hợp đồng thông minh cốt lõi cho các thành viên cộng đồng. Trong trường hợp này, hệ thống hợp đồng thông minh sẽ bao gồm một mô-đun quản trị—một cơ chế cho phép các thành viên cộng đồng phê duyệt các hành động quản trị thông qua một hệ thống quản trị trên chuỗi. Ví dụ, một đề xuất nâng cấp hợp đồng ủy quyền lên một triển khai mới có thể được bỏ phiếu bởi những người nắm giữ token.
+
+Quản trị phi tập trung có thể có lợi, đặc biệt là vì nó dung hòa lợi ích của các nhà phát triển và người dùng cuối. Tuy nhiên, các cơ chế quản trị hợp đồng thông minh có thể gây ra những rủi ro mới nếu được triển khai không chính xác. Một kịch bản hợp lý là nếu một kẻ tấn công có được quyền biểu quyết khổng lồ (được đo bằng số lượng token nắm giữ) bằng cách vay [khoản vay nhanh](/defi/#flash-loans) và thông qua một đề xuất độc hại.
+
+Một cách để ngăn chặn các vấn đề liên quan đến quản trị trên chuỗi là [sử dụng khóa thời gian](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/). Khóa thời gian ngăn không cho hợp đồng thông minh thực hiện một số hành động nhất định cho đến khi một khoảng thời gian cụ thể trôi qua. Các chiến lược khác bao gồm gán “trọng số biểu quyết” cho mỗi token dựa trên thời gian nó đã được khóa, hoặc đo lường quyền biểu quyết của một địa chỉ tại một thời điểm lịch sử (ví dụ: 2-3 khối trong quá khứ) thay vì khối hiện tại. Cả hai phương pháp đều làm giảm khả năng nhanh chóng tích lũy quyền biểu quyết để thay đổi các cuộc bỏ phiếu trên chuỗi.
+
+Thêm về [thiết kế các hệ thống quản trị an toàn](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/), [các cơ chế bỏ phiếu khác nhau trong các DAO](https://hackernoon.com/governance-is-the-holy-grail-for-daos) và [các vectơ tấn công DAO phổ biến tận dụng DeFi](https://dacian.me/dao-governance-defi-attacks) trong các liên kết được chia sẻ.
+
+### 8. Giảm độ phức tạp trong mã đến mức tối thiểu {#reduce-code-complexity}
+
+Các nhà phát triển phần mềm truyền thống đã quen thuộc với nguyên tắc KISS (“giữ nó đơn giản, ngu ngốc”), khuyên không nên đưa sự phức tạp không cần thiết vào thiết kế phần mềm. Điều này tuân theo suy nghĩ lâu đời rằng “các hệ thống phức tạp thất bại theo những cách phức tạp” và dễ bị lỗi tốn kém hơn.
+
+Giữ mọi thứ đơn giản là điều đặc biệt quan trọng khi viết các hợp đồng thông minh, vì các hợp đồng thông minh có khả năng kiểm soát một lượng lớn giá trị. Một mẹo để đạt được sự đơn giản khi viết các hợp đồng thông minh là sử dụng lại các thư viện hiện có, chẳng hạn như [Hợp đồng OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/), nếu có thể. Bởi vì các thư viện này đã được các nhà phát triển kiểm toán và thử nghiệm rộng rãi, việc sử dụng chúng sẽ làm giảm khả năng gây ra lỗi bằng cách viết chức năng mới từ đầu.
+
+Một lời khuyên phổ biến khác là viết các hàm nhỏ và giữ cho các hợp đồng có tính mô-đun bằng cách chia logic kinh doanh thành nhiều hợp đồng. Việc viết mã đơn giản hơn không chỉ làm giảm bề mặt tấn công trong một hợp đồng thông minh, mà còn giúp dễ dàng suy luận về tính đúng đắn của toàn bộ hệ thống và phát hiện các lỗi thiết kế có thể xảy ra sớm.
+
+### 9. Phòng chống các lỗ hổng hợp đồng thông minh phổ biến {#mitigate-common-smart-contract-vulnerabilities}
+
+#### Tái nhập {#reentrancy}
+
+EVM không cho phép đồng thời, nghĩa là hai hợp đồng liên quan đến một lệnh gọi thông điệp không thể chạy đồng thời. Một lệnh gọi bên ngoài sẽ tạm dừng việc thực thi và bộ nhớ của hợp đồng đang gọi cho đến khi lệnh gọi trả về, tại thời điểm đó việc thực thi sẽ tiếp tục bình thường. Quá trình này có thể được mô tả chính thức là chuyển [luồng điều khiển](https://www.computerhope.com/jargon/c/contflow.htm) sang một hợp đồng khác.
+
+Mặc dù hầu như vô hại, việc chuyển luồng điều khiển đến các hợp đồng không đáng tin cậy có thể gây ra các vấn đề, chẳng hạn như tái nhập. Một cuộc tấn công tái nhập xảy ra khi một hợp đồng độc hại gọi lại một hợp đồng dễ bị tấn công trước khi lệnh gọi hàm ban đầu hoàn tất. Loại tấn công này được giải thích tốt nhất bằng một ví dụ.
+
+Hãy xem xét một hợp đồng thông minh đơn giản ('Nạn nhân') cho phép bất kỳ ai gửi và rút ether:
+
+```solidity
+// Hợp đồng này dễ bị tấn công. Không sử dụng trong sản xuất
+
+contract Victim {
+ mapping (address => uint256) public balances;
+
+ function deposit() external payable {
+ balances[msg.sender] += msg.value;
+ }
+
+ function withdraw() external {
+ uint256 amount = balances[msg.sender];
+ (bool success, ) = msg.sender.call.value(amount)("");
+ require(success);
+ balances[msg.sender] = 0;
+ }
+}
+```
+
+Hợp đồng này hiển thị hàm `withdraw()` để cho phép người dùng rút ETH đã gửi trước đó trong hợp đồng. Khi xử lý một yêu cầu rút tiền, hợp đồng thực hiện các hoạt động sau:
+
+1. Kiểm tra số dư ETH của người dùng
+2. Gửi tiền đến địa chỉ gọi
+3. Đặt lại số dư của họ về 0, ngăn người dùng rút thêm tiền
+
+Hàm `withdraw()` trong hợp đồng `Victim` tuân theo mẫu “kiểm tra-tương tác-hiệu ứng”. Nó _kiểm tra_ xem các điều kiện cần thiết cho việc thực thi có được thỏa mãn không (tức là người dùng có số dư ETH dương) và thực hiện _tương tác_ bằng cách gửi ETH đến địa chỉ của người gọi, trước khi áp dụng _hiệu ứng_ của giao dịch (tức là giảm số dư của người dùng).
+
+Nếu `withdraw()` được gọi từ một tài khoản sở hữu bên ngoài (EOA), hàm sẽ thực thi như mong đợi: `msg.sender.call.value()` gửi ETH cho người gọi. Tuy nhiên, nếu `msg.sender` là một tài khoản hợp đồng thông minh gọi `withdraw()`, việc gửi tiền bằng `msg.sender.call.value()` cũng sẽ kích hoạt mã được lưu trữ tại địa chỉ đó để chạy.
+
+Hãy tưởng tượng đây là mã được triển khai tại địa chỉ hợp đồng:
+
+```solidity
+ contract Attacker {
+ function beginAttack() external payable {
+ Victim(victim_address).deposit.value(1 ether)();
+ Victim(victim_address).withdraw();
+ }
+
+ function() external payable {
+ if (gasleft() > 40000) {
+ Victim(victim_address).withdraw();
+ }
+ }
+}
+```
+
+Hợp đồng này được thiết kế để thực hiện ba việc:
+
+1. Chấp nhận tiền gửi từ một tài khoản khác (có thể là EOA của kẻ tấn công)
+2. Gửi 1 ETH vào hợp đồng Nạn nhân
+3. Rút 1 ETH được lưu trữ trong hợp đồng thông minh
+
+Không có gì sai ở đây, ngoại trừ việc `Attacker` có một hàm khác gọi lại `withdraw()` trong `Victim` nếu lượng gas còn lại từ `msg.sender.call.value` đến lớn hơn 40.000. Điều này cho phép `Attacker` có khả năng tái nhập `Victim` và rút thêm tiền _trước khi_ lần gọi `withdraw` đầu tiên hoàn tất. Chu trình trông như thế này:
+
+```solidity
+- EOA của kẻ tấn công gọi `Attacker.beginAttack()` với 1 ETH
+- `Attacker.beginAttack()` gửi 1 ETH vào `Victim`
+- `Attacker` gọi `withdraw()` trong `Victim`
+- `Victim` kiểm tra số dư của `Attacker` (1 ETH)
+- `Victim` gửi 1 ETH cho `Attacker` (kích hoạt hàm mặc định)
+- `Attacker` gọi lại `Victim.withdraw()` (lưu ý rằng `Victim` chưa giảm số dư của `Attacker` từ lần rút đầu tiên)
+- `Victim` kiểm tra số dư của `Attacker` (vẫn là 1 ETH vì nó chưa áp dụng hiệu ứng của lần gọi đầu tiên)
+- `Victim` gửi 1 ETH cho `Attacker` (kích hoạt hàm mặc định và cho phép `Attacker` tái nhập vào hàm `withdraw`)
+- Quá trình này lặp lại cho đến khi `Attacker` hết gas, tại thời điểm đó `msg.sender.call.value` trả về mà không kích hoạt thêm các lần rút tiền
+- `Victim` cuối cùng áp dụng kết quả của giao dịch đầu tiên (và các giao dịch tiếp theo) vào trạng thái của nó, do đó số dư của `Attacker` được đặt về 0
+```
+
+Tóm lại là vì số dư của người gọi không được đặt về 0 cho đến khi việc thực thi hàm hoàn tất, các lần gọi tiếp theo sẽ thành công và cho phép người gọi rút số dư của họ nhiều lần. Loại tấn công này có thể được sử dụng để rút cạn tiền của một hợp đồng thông minh, giống như những gì đã xảy ra trong [vụ hack DAO năm 2016](https://www.coindesk.com/learn/understanding-the-dao-attack). Các cuộc tấn công tái nhập vẫn là một vấn đề nghiêm trọng đối với các hợp đồng thông minh ngày nay như [danh sách công khai về các khai thác tái nhập](https://github.com/pcaversaccio/reentrancy-attacks) cho thấy.
+
+##### Làm thế nào để ngăn chặn các cuộc tấn công tái nhập
+
+Một cách tiếp cận để đối phó với tái nhập là tuân theo [mô hình kiểm tra-hiệu ứng-tương tác](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern). Mẫu này sắp xếp thứ tự thực thi các hàm theo cách mà mã thực hiện các kiểm tra cần thiết trước khi tiếp tục thực thi sẽ đứng đầu, theo sau là mã thao túng trạng thái hợp đồng, với mã tương tác với các hợp đồng khác hoặc EOA sẽ đến cuối cùng.
+
+Mô hình kiểm tra-hiệu ứng-tương tác được sử dụng trong phiên bản sửa đổi của hợp đồng `Victim` được hiển thị bên dưới:
+
+```solidity
+contract NoLongerAVictim {
+ function withdraw() external {
+ uint256 amount = balances[msg.sender];
+ balances[msg.sender] = 0;
+ (bool success, ) = msg.sender.call.value(amount)("");
+ require(success);
+ }
+}
+```
+
+Hợp đồng này thực hiện một _kiểm tra_ số dư của người dùng, áp dụng _hiệu ứng_ của hàm `withdraw()` (bằng cách đặt lại số dư của người dùng về 0), và tiến hành thực hiện _tương tác_ (gửi ETH đến địa chỉ của người dùng). Điều này đảm bảo hợp đồng cập nhật bộ nhớ của nó trước khi thực hiện lệnh gọi bên ngoài, loại bỏ điều kiện tái nhập đã cho phép cuộc tấn công đầu tiên. Hợp đồng `Attacker` vẫn có thể gọi lại vào `NoLongerAVictim`, nhưng vì `balances[msg.sender]` đã được đặt thành 0, các lần rút tiền bổ sung sẽ gây ra lỗi.
+
+Một lựa chọn khác là sử dụng khóa loại trừ lẫn nhau (thường được mô tả là "mutex") để khóa một phần trạng thái của hợp đồng cho đến khi một lệnh gọi hàm hoàn tất. Điều này được thực hiện bằng cách sử dụng một biến Boolean được đặt thành `true` trước khi hàm thực thi và trở về `false` sau khi lệnh gọi hoàn tất. Như đã thấy trong ví dụ bên dưới, việc sử dụng mutex bảo vệ một hàm khỏi các lệnh gọi đệ quy trong khi lệnh gọi ban đầu vẫn đang được xử lý, ngăn chặn hiệu quả việc tái nhập.
+
+```solidity
+pragma solidity ^0.7.0;
+
+contract MutexPattern {
+ bool locked = false;
+ mapping(address => uint256) public balances;
+
+ modifier noReentrancy() {
+ require(!locked, "Bị chặn do tái nhập.");
+ locked = true;
+ _;
+ locked = false;
+ }
+ // Hàm này được bảo vệ bởi một mutex, vì vậy các lệnh gọi tái nhập từ bên trong `msg.sender.call` không thể gọi lại `withdraw`.
+ // Câu lệnh `return` đánh giá thành `true` nhưng vẫn đánh giá câu lệnh `locked = false` trong công cụ sửa đổi
+ function withdraw(uint _amount) public payable noReentrancy returns(bool) {
+ require(balances[msg.sender] >= _amount, "Không có số dư để rút.");
+
+ balances[msg.sender] -= _amount;
+ (bool success, ) = msg.sender.call{value: _amount}("");
+ require(success);
+
+ return true;
+ }
+}
+```
+
+Bạn cũng có thể sử dụng hệ thống [thanh toán kéo](https://docs.openzeppelin.com/contracts/5.x/api/security#PullPayment) yêu cầu người dùng rút tiền từ các hợp đồng thông minh, thay vì hệ thống "thanh toán đẩy" gửi tiền đến các tài khoản. Điều này loại bỏ khả năng vô tình kích hoạt mã tại các địa chỉ không xác định (và cũng có thể ngăn chặn một số cuộc tấn công từ chối dịch vụ).
+
+#### Tràn số và thiếu số nguyên {#integer-underflows-and-overflows}
+
+Tràn số nguyên xảy ra khi kết quả của một phép toán số học nằm ngoài phạm vi giá trị chấp nhận được, khiến nó "lăn" về giá trị có thể biểu diễn thấp nhất. Ví dụ, một `uint8` chỉ có thể lưu trữ các giá trị lên tới 2^8-1=255. Các phép toán số học dẫn đến các giá trị cao hơn `255` sẽ tràn và đặt lại `uint` thành `0`, tương tự như cách đồng hồ đo quãng đường trên xe hơi đặt lại về 0 khi đạt đến quãng đường tối đa (999999).
+
+Tràn số nguyên xảy ra vì những lý do tương tự: kết quả của một phép toán số học nằm dưới phạm vi chấp nhận được. Giả sử bạn đã cố gắng giảm `0` trong một `uint8`, kết quả sẽ chỉ đơn giản là quay trở lại giá trị có thể biểu diễn tối đa (`255`).
+
+Cả tràn số nguyên và thiếu số đều có thể dẫn đến những thay đổi không mong muốn đối với các biến trạng thái của hợp đồng và dẫn đến việc thực thi không theo kế hoạch. Dưới đây là một ví dụ cho thấy cách kẻ tấn công có thể khai thác tràn số học trong một hợp đồng thông minh để thực hiện một hoạt động không hợp lệ:
+
+```
+pragma solidity ^0.7.6;
+
+// Hợp đồng này được thiết kế để hoạt động như một kho tiền thời gian.
+// Người dùng có thể gửi tiền vào hợp đồng này nhưng không thể rút tiền trong ít nhất một tuần.
+// Người dùng cũng có thể kéo dài thời gian chờ đợi vượt quá thời gian chờ 1 tuần.
+
+/*
+1. Triển khai TimeLock
+2. Triển khai Attack với địa chỉ của TimeLock
+3. Gọi Attack.attack gửi 1 ether. Bạn sẽ có thể ngay lập tức
+ rút ether của mình.
+
+Chuyện gì đã xảy ra?
+Attack đã làm cho TimeLock.lockTime bị tràn và có thể rút tiền
+trước thời gian chờ 1 tuần.
+*/
+
+contract TimeLock {
+ mapping(address => uint) public balances;
+ mapping(address => uint) public lockTime;
+
+ function deposit() external payable {
+ balances[msg.sender] += msg.value;
+ lockTime[msg.sender] = block.timestamp + 1 weeks;
+ }
+
+ function increaseLockTime(uint _secondsToIncrease) public {
+ lockTime[msg.sender] += _secondsToIncrease;
+ }
+
+ function withdraw() public {
+ require(balances[msg.sender] > 0, "Không đủ tiền");
+ require(block.timestamp > lockTime[msg.sender], "Thời gian khóa chưa hết hạn");
+
+ uint amount = balances[msg.sender];
+ balances[msg.sender] = 0;
+
+ (bool sent, ) = msg.sender.call{value: amount}("");
+ require(sent, "Không gửi được Ether");
+ }
+}
+
+contract Attack {
+ TimeLock timeLock;
+
+ constructor(TimeLock _timeLock) {
+ timeLock = TimeLock(_timeLock);
+ }
+
+ fallback() external payable {}
+
+ function attack() public payable {
+ timeLock.deposit{value: msg.value}();
+ /*
+ nếu t = thời gian khóa hiện tại thì chúng ta cần tìm x sao cho
+ x + t = 2**256 = 0
+ vậy x = -t
+ 2**256 = type(uint).max + 1
+ vậy x = type(uint).max + 1 - t
+ */
+ timeLock.increaseLockTime(
+ type(uint).max + 1 - timeLock.lockTime(address(this))
+ );
+ timeLock.withdraw();
+ }
+}
+```
+
+##### Làm thế nào để ngăn chặn tràn số và thiếu số nguyên
+
+Kể từ phiên bản 0.8.0, trình biên dịch Solidity từ chối mã dẫn đến tràn số và thiếu số nguyên. Tuy nhiên, các hợp đồng được biên dịch với phiên bản trình biên dịch thấp hơn nên thực hiện kiểm tra các hàm liên quan đến các phép toán số học hoặc sử dụng một thư viện (ví dụ: [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) để kiểm tra tràn/thiếu số.
+
+#### Thao tác Oracle {#oracle-manipulation}
+
+[Oracles](/developers/docs/oracles/) lấy thông tin ngoài chuỗi và gửi nó lên chuỗi để các hợp đồng thông minh sử dụng. Với các oracle, bạn có thể thiết kế các hợp đồng thông minh tương tác với các hệ thống ngoài chuỗi, chẳng hạn như thị trường vốn, mở rộng đáng kể ứng dụng của chúng.
+
+Nhưng nếu oracle bị hỏng và gửi thông tin không chính xác lên chuỗi, các hợp đồng thông minh sẽ thực thi dựa trên các đầu vào sai, điều này có thể gây ra sự cố. Đây là cơ sở của “vấn đề oracle”, liên quan đến nhiệm vụ đảm bảo thông tin từ một oracle blockchain là chính xác, cập nhật và kịp thời.
+
+Một mối quan tâm bảo mật liên quan là sử dụng một oracle trên chuỗi, chẳng hạn như một sàn giao dịch phi tập trung, để lấy giá giao ngay cho một tài sản. Các nền tảng cho vay trong ngành [tài chính phi tập trung (DeFi)](/defi/) thường làm điều này để xác định giá trị tài sản thế chấp của người dùng để xác định số tiền họ có thể vay.
+
+Giá DEX thường chính xác, phần lớn là do các nhà kinh doanh chênh lệch giá khôi phục sự cân bằng trên thị trường. Tuy nhiên, chúng có thể bị thao túng, đặc biệt nếu oracle trên chuỗi tính toán giá tài sản dựa trên các mẫu giao dịch lịch sử (như thường lệ).
+
+Ví dụ, một kẻ tấn công có thể tăng giá giao ngay của một tài sản một cách nhân tạo bằng cách vay một khoản vay nhanh ngay trước khi tương tác với hợp đồng cho vay của bạn. Việc truy vấn DEX để biết giá của tài sản sẽ trả về một giá trị cao hơn bình thường (do “lệnh mua” lớn của kẻ tấn công làm lệch nhu cầu đối với tài sản), cho phép họ vay nhiều hơn mức họ nên vay. Các "cuộc tấn công cho vay nhanh" như vậy đã được sử dụng để khai thác sự phụ thuộc vào các oracle giá giữa các ứng dụng DeFi, khiến các giao thức thiệt hại hàng triệu đô la tiền bị mất.
+
+##### Làm thế nào để ngăn chặn thao tác oracle
+
+Yêu cầu tối thiểu để [tránh thao túng oracle](https://www.cyfrin.io/blog/price-oracle-manipultion-attacks-with-examples) là sử dụng một mạng oracle phi tập trung truy vấn thông tin từ nhiều nguồn để tránh các điểm lỗi duy nhất. Trong hầu hết các trường hợp, các oracle phi tập trung có các ưu đãi kinh tế tiền mã hóa tích hợp để khuyến khích các nút oracle báo cáo thông tin chính xác, khiến chúng an toàn hơn các oracle tập trung.
+
+Nếu bạn dự định truy vấn một oracle trên chuỗi để biết giá tài sản, hãy cân nhắc sử dụng một oracle triển khai cơ chế giá trung bình theo thời gian (TWAP). Một [oracle TWAP](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) truy vấn giá của một tài sản tại hai thời điểm khác nhau (mà bạn có thể sửa đổi) và tính toán giá giao ngay dựa trên mức trung bình thu được. Việc chọn các khoảng thời gian dài hơn sẽ bảo vệ giao thức của bạn khỏi thao túng giá vì các lệnh lớn được thực hiện gần đây không thể ảnh hưởng đến giá tài sản.
+
+## Tài nguyên bảo mật hợp đồng thông minh cho các nhà phát triển {#smart-contract-security-resources-for-developers}
+
+### Các công cụ để phân tích hợp đồng thông minh và xác minh tính đúng đắn của mã {#code-analysis-tools}
+
+- **[Các công cụ và thư viện kiểm thử](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)** - _Bộ sưu tập các công cụ và thư viện tiêu chuẩn ngành để thực hiện các bài kiểm thử đơn vị, phân tích tĩnh và phân tích động trên các hợp đồng thông minh._
+
+- **[Các công cụ xác minh chính thức](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools)** - _Các công cụ để xác minh tính đúng đắn về mặt chức năng trong các hợp đồng thông minh và kiểm tra các bất biến._
+
+- **[Các dịch vụ kiểm toán hợp đồng thông minh](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)** - _Danh sách các tổ chức cung cấp dịch vụ kiểm toán hợp đồng thông minh cho các dự án phát triển Ethereum._
+
+- **[Các nền tảng tiền thưởng săn lỗi](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** - _Các nền tảng để phối hợp các chương trình tiền thưởng săn lỗi và thưởng cho việc tiết lộ có trách nhiệm các lỗ hổng nghiêm trọng trong các hợp đồng thông minh._
+
+- **[Fork Checker](https://forkchecker.hashex.org/)** - _Một công cụ trực tuyến miễn phí để kiểm tra tất cả thông tin có sẵn về một hợp đồng được phân nhánh._
+
+- **[ABI Encoder](https://abi.hashex.org/)** - _Một dịch vụ trực tuyến miễn phí để mã hóa các hàm và đối số hàm tạo của hợp đồng Solidity của bạn._
+
+- **[Aderyn](https://github.com/Cyfrin/aderyn)** - _Công cụ phân tích tĩnh Solidity, duyệt qua Cây cú pháp trừu tượng (AST) để xác định các lỗ hổng đáng ngờ và in ra các vấn đề ở định dạng markdown dễ sử dụng._
+
+### Các công cụ để giám sát hợp đồng thông minh {#smart-contract-monitoring-tools}
+
+- **[Tenderly Real-Time Alerting](https://tenderly.co/monitoring)** - _Một công cụ để nhận thông báo theo thời gian thực khi các sự kiện bất thường hoặc không mong muốn xảy ra trên các hợp đồng thông minh hoặc ví của bạn._
+
+### Các công cụ để quản trị an toàn các hợp đồng thông minh {#smart-contract-administration-tools}
+
+- **[Safe](https://safe.global/)** - _Ví hợp đồng thông minh chạy trên Ethereum yêu cầu một số lượng người tối thiểu phải phê duyệt một giao dịch trước khi nó có thể xảy ra (M-of-N)._
+
+- **[OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/)** - _Thư viện hợp đồng để triển khai các tính năng quản trị, bao gồm quyền sở hữu hợp đồng, nâng cấp, kiểm soát truy cập, quản trị, khả năng tạm dừng và hơn thế nữa._
+
+### Dịch vụ kiểm toán hợp đồng thông minh {#smart-contract-auditing-services}
+
+- **[ConsenSys Diligence](https://diligence.consensys.io/)** - _Dịch vụ kiểm toán hợp đồng thông minh giúp các dự án trên toàn hệ sinh thái chuỗi khối đảm bảo các giao thức của họ sẵn sàng ra mắt và được xây dựng để bảo vệ người dùng._
+
+- **[CertiK](https://www.certik.com/)** - _Công ty bảo mật chuỗi khối tiên phong trong việc sử dụng công nghệ Xác minh chính thức tiên tiến trên các hợp đồng thông minh và mạng chuỗi khối._
+
+- **[Trail of Bits](https://www.trailofbits.com/)** - _Công ty an ninh mạng kết hợp nghiên cứu bảo mật với tâm lý của kẻ tấn công để giảm thiểu rủi ro và củng cố mã._
+
+- **[PeckShield](https://peckshield.com/)** - _Công ty bảo mật chuỗi khối cung cấp các sản phẩm và dịch vụ cho sự bảo mật, quyền riêng tư và khả năng sử dụng của toàn bộ hệ sinh thái chuỗi khối._
+
+- **[QuantStamp](https://quantstamp.com/)** - _Dịch vụ kiểm toán tạo điều kiện cho việc áp dụng công nghệ chuỗi khối vào xu hướng chủ đạo thông qua các dịch vụ đánh giá bảo mật và rủi ro._
+
+- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** - _Công ty bảo mật hợp đồng thông minh cung cấp các cuộc kiểm toán bảo mật cho các hệ thống phân tán._
+
+- **[Runtime Verification](https://runtimeverification.com/)** - _Công ty bảo mật chuyên về mô hình hóa chính thức và xác minh các hợp đồng thông minh._
+
+- **[Hacken](https://hacken.io)** - _Kiểm toán viên an ninh mạng Web3 mang lại phương pháp tiếp cận 360 độ cho bảo mật chuỗi khối._
+
+- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Các dịch vụ kiểm toán Solidity và Cairo, đảm bảo tính toàn vẹn của các hợp đồng thông minh và sự an toàn của người dùng trên Ethereum và Starknet._
+
+- **[HashEx](https://hashex.org/)** - _HashEx tập trung vào kiểm toán chuỗi khối và hợp đồng thông minh để đảm bảo an ninh cho tiền mã hóa, cung cấp các dịch vụ như phát triển hợp đồng thông minh, kiểm thử thâm nhập, tư vấn chuỗi khối._
+
+- **[Code4rena](https://code4rena.com/)** - _Nền tảng kiểm toán cạnh tranh khuyến khích các chuyên gia bảo mật hợp đồng thông minh tìm ra các lỗ hổng và giúp web3 trở nên an toàn hơn._
+
+- **[CodeHawks](https://codehawks.com/)** - _Nền tảng kiểm toán cạnh tranh tổ chức các cuộc thi kiểm toán hợp đồng thông minh cho các nhà nghiên cứu bảo mật._
+
+- **[Cyfrin](https://cyfrin.io)** - _Công ty hàng đầu về bảo mật Web3, ươm mầm bảo mật tiền mã hóa thông qua các sản phẩm và dịch vụ kiểm toán hợp đồng thông minh._
+
+- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Công ty bảo mật Web3 cung cấp các dịch vụ kiểm toán bảo mật cho các hệ thống blockchain thông qua một đội ngũ kiểm toán viên giàu kinh nghiệm và các công cụ tốt nhất._
+
+- **[Oxorio](https://oxor.io/)** - _Dịch vụ kiểm toán hợp đồng thông minh và bảo mật blockchain với chuyên môn về EVM, Solidity, ZK, công nghệ chuỗi chéo cho các công ty tiền mã hóa và các dự án DeFi._
+
+- **[Inference](https://inference.ag/)** - _Công ty kiểm toán bảo mật, chuyên về kiểm toán hợp đồng thông minh cho các chuỗi khối dựa trên EVM. Nhờ các kiểm toán viên chuyên gia của mình, họ xác định các vấn đề tiềm ẩn và đề xuất các giải pháp khả thi để khắc phục chúng trước khi triển khai._
+
+### Các nền tảng tiền thưởng săn lỗi {#bug-bounty-platforms}
+
+- **[Immunefi](https://immunefi.com/)** - _Nền tảng tiền thưởng săn lỗi cho các hợp đồng thông minh và các dự án DeFi, nơi các nhà nghiên cứu bảo mật xem xét mã, tiết lộ các lỗ hổng, được trả tiền và làm cho tiền mã hóa an toàn hơn._
+
+- **[HackerOne](https://www.hackerone.com/)** - _Nền tảng điều phối lỗ hổng và tiền thưởng săn lỗi kết nối các doanh nghiệp với những người kiểm thử thâm nhập và các nhà nghiên cứu an ninh mạng._
+
+- **[HackenProof](https://hackenproof.com/)** - _Nền tảng tiền thưởng săn lỗi chuyên nghiệp cho các dự án tiền mã hóa (DeFi, Hợp đồng thông minh, Ví, CEX và hơn thế nữa), nơi các chuyên gia bảo mật cung cấp dịch vụ phân loại và các nhà nghiên cứu được trả tiền cho các báo cáo lỗi có liên quan, đã được xác minh._
+
+- **[Sherlock](https://www.sherlock.xyz/)** - _Bảo lãnh phát hành trong Web3 cho bảo mật hợp đồng thông minh, với các khoản thanh toán cho kiểm toán viên được quản lý thông qua các hợp đồng thông minh để đảm bảo rằng các lỗi có liên quan được thanh toán một cách công bằng._
+
+- **[CodeHawks](https://www.codehawks.com/)** - _Nền tảng tiền thưởng săn lỗi cạnh tranh, nơi các kiểm toán viên tham gia các cuộc thi và thử thách bảo mật, và (sắp tới) trong các cuộc kiểm toán riêng của họ._
+
+### Các ấn phẩm về các lỗ hổng và khai thác hợp đồng thông minh đã biết {#common-smart-contract-vulnerabilities-and-exploits}
+
+- **[ConsenSys: Các cuộc tấn công đã biết trong Hợp đồng thông minh](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/)** - _Giải thích thân thiện với người mới bắt đầu về các lỗ hổng hợp đồng quan trọng nhất, với mã mẫu cho hầu hết các trường hợp._
+
+- **[SWC Registry](https://swcregistry.io/)** - _Danh sách được tuyển chọn các mục Liệt kê Điểm yếu Chung (CWE) áp dụng cho các hợp đồng thông minh Ethereum._
+
+- **[Rekt](https://rekt.news/)** - _Ấn phẩm được cập nhật thường xuyên về các vụ tấn công và khai thác tiền mã hóa nổi tiếng, cùng với các báo cáo khám nghiệm chi tiết._
+
+### Các thử thách để học bảo mật hợp đồng thông minh {#challenges-for-learning-smart-contract-security}
+
+- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - _Danh sách được tuyển chọn các trò chơi chiến tranh bảo mật blockchain, các thử thách, và các cuộc thi [Capture The Flag](https://www.webopedia.com/definitions/ctf-event/amp/) và các bài viết giải pháp._
+
+- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** - _Trò chơi chiến tranh để học bảo mật tấn công của các hợp đồng thông minh DeFi và xây dựng kỹ năng săn lỗi và kiểm toán bảo mật._
+
+- **[Ethernaut](https://ethernaut.openzeppelin.com/)** - _Trò chơi chiến tranh dựa trên Web3/Solidity, trong đó mỗi cấp độ là một hợp đồng thông minh cần phải bị 'tấn công'._
+
+- **[HackenProof x HackTheBox](https://app.hackthebox.com/tracks/HackenProof-Track)** - _Thử thách hack hợp đồng thông minh, lấy bối cảnh trong một cuộc phiêu lưu giả tưởng. Việc hoàn thành thành công thử thách cũng cho phép truy cập vào một chương trình tiền thưởng săn lỗi riêng tư._
+
+### Các phương pháp hay nhất để bảo mật hợp đồng thông minh {#smart-contract-security-best-practices}
+
+- **[ConsenSys: Các phương pháp hay nhất về bảo mật hợp đồng thông minh Ethereum](https://consensys.github.io/smart-contract-best-practices/)** - _Danh sách toàn diện các hướng dẫn để bảo mật các hợp đồng thông minh Ethereum._
+
+- **[Nascent: Bộ công cụ bảo mật đơn giản](https://github.com/nascentxyz/simple-security-toolkit)** - _Bộ sưu tập các hướng dẫn và danh sách kiểm tra tập trung vào bảo mật thực tế để phát triển hợp đồng thông minh._
+
+- **[Solidity Patterns](https://fravoll.github.io/solidity-patterns/)** - _Tổng hợp hữu ích các mẫu bảo mật và các phương pháp hay nhất cho ngôn ngữ lập trình hợp đồng thông minh Solidity._
+
+- **[Tài liệu Solidity: Các cân nhắc về bảo mật](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** - _Hướng dẫn viết các hợp đồng thông minh an toàn với Solidity._
+
+- **[Tiêu chuẩn xác minh bảo mật hợp đồng thông minh](https://github.com/securing/SCSVS)** - _Danh sách kiểm tra mười bốn phần được tạo ra để tiêu chuẩn hóa bảo mật của các hợp đồng thông minh cho các nhà phát triển, kiến trúc sư, người đánh giá bảo mật và các nhà cung cấp._
+
+- **[Học bảo mật và kiểm toán hợp đồng thông minh](https://updraft.cyfrin.io/courses/security)** - _Khóa học bảo mật và kiểm toán hợp đồng thông minh tối ưu, được tạo ra cho các nhà phát triển hợp đồng thông minh muốn nâng cao các phương pháp hay nhất về bảo mật của họ và trở thành các nhà nghiên cứu bảo mật._
+
+### Hướng dẫn về bảo mật hợp đồng thông minh {#tutorials-on-smart-contract-security}
+
+- [Cách viết các hợp đồng thông minh an toàn](/developers/tutorials/secure-development-workflow/)
+
+- [Cách sử dụng Slither để tìm lỗi hợp đồng thông minh](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/)
+
+- [Cách sử dụng Manticore để tìm lỗi hợp đồng thông minh](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/)
+
+- [Hướng dẫn bảo mật hợp đồng thông minh](/developers/tutorials/smart-contract-security-guidelines/)
+
+- [Cách tích hợp an toàn hợp đồng token của bạn với các token tùy ý](/developers/tutorials/token-integration-checklist/)
+
+- [Cyfrin Updraft - Khóa học đầy đủ về bảo mật và kiểm toán hợp đồng thông minh](https://updraft.cyfrin.io/courses/security)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/testing/index.md b/public/content/translations/vi/developers/docs/smart-contracts/testing/index.md
new file mode 100644
index 00000000000..b3e18ac2588
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/testing/index.md
@@ -0,0 +1,310 @@
+---
+title: Thử nghiệm hợp đồng thông minh
+description: Tổng quan về kỹ thuật và những điều cần cân nhắc khi kiểm tra hợp đồng thông minh Ethereum.
+lang: vi
+---
+
+Các blockchain công khai như Ethereum không thể thay đổi, nên rất khó để sửa đổi mã hợp đồng thông minh sau khi đã triển khai. [Các mẫu nâng cấp hợp đồng](/developers/docs/smart-contracts/upgrading/) để thực hiện "nâng cấp ảo" có tồn tại, nhưng chúng rất khó thực hiện và đòi hỏi sự đồng thuận của xã hội. Hơn nữa, một bản nâng cấp chỉ có thể sửa lỗi _sau khi_ nó được phát hiện—nếu kẻ tấn công phát hiện ra lỗ hổng trước, hợp đồng thông minh của bạn có nguy cơ bị khai thác.
+
+Vì những lý do này, việc kiểm tra các hợp đồng thông minh trước khi [triển khai](/developers/docs/smart-contracts/deploying/) lên Mạng chính là một yêu cầu tối thiểu về [bảo mật](/developers/docs/smart-contracts/security/). Có nhiều cách để kiểm tra hợp đồng và đánh giá độ chính xác của mã; thứ bạn chọn sẽ phụ thuộc vào nhu cầu của bạn. Dù sao thì, một bộ kiểm thử bao gồm nhiều công cụ và phương pháp khác nhau là lựa chọn tuyệt vời để phát hiện cả những lỗ hổng bảo mật nhỏ và lớn trong mã hợp đồng.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Trang này giải thích cách kiểm tra hợp đồng thông minh trước khi triển khai trên mạng Ethereum. Điều này giả định rằng bạn đã quen thuộc với [các hợp đồng thông minh](/developers/docs/smart-contracts/).
+
+## Kiểm tra hợp đồng thông minh là gì? Kiểm tra hợp đồng thông minh là gì? {#what-is-smart-contract-testing}
+
+Kiểm tra hợp đồng thông minh là quá trình xác nhận rằng mã của hợp đồng thông minh hoạt động như mong đợi. Việc kiểm tra là cần thiết để xác minh liệu một hợp đồng thông minh cụ thể có đáp ứng các yêu cầu về độ tin cậy, tính hữu dụng và an ninh hay không.
+
+Mặc dù có nhiều cách tiếp cận khác nhau, nhưng hầu hết các phương pháp kiểm tra đều cần thực hiện một hợp đồng thông minh với một mẫu nhỏ dữ liệu mà nó dự kiến sẽ xử lý. Nếu hợp đồng tạo ra kết quả đúng cho dữ liệu mẫu, nó được cho là hoạt động chính xác. Hầu hết các công cụ kiểm tra cung cấp tài nguyên để viết và thực thi các [trường hợp kiểm tra](https://en.m.wikipedia.org/wiki/Test_case) để kiểm tra xem việc thực thi hợp đồng có khớp với kết quả mong đợi hay không.
+
+### Tại sao việc kiểm tra hợp đồng thông minh lại quan trọng? Tầm quan trọng của việc kiểm tra các hợp đồng thông minh {#importance-of-testing-smart-contracts}
+
+Vì các hợp đồng thông minh thường quản lý các tài sản tài chính có giá trị cao, những lỗi lập trình nhỏ có thể và thường dẫn đến [những khoản thua lỗ lớn cho người dùng](https://rekt.news/leaderboard/). Việc kiểm tra kỹ lưỡng có thể giúp bạn tìm ra lỗi và vấn đề trong mã của hợp đồng thông minh sớm hơn, từ đó sửa chữa trước khi đưa lên Mainnet.
+
+Mặc dù có thể nâng cấp hợp đồng nếu phát hiện lỗi, nhưng việc nâng cấp thì khá phức tạp và có thể [gây ra lỗi](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/) nếu không được xử lý đúng cách. Việc nâng cấp một hợp đồng càng làm trái nguyên tắc không biến đổi và đặt thêm gánh nặng về niềm tin lên người dùng. Ngược lại, một kế hoạch toàn diện để thử nghiệm hợp đồng của bạn giảm thiểu rủi ro bảo mật hợp đồng thông minh và giảm nhu cầu thực hiện các nâng cấp logic phức tạp sau khi triển khai.
+
+## Các phương pháp kiểm tra hợp đồng thông minh {#methods-for-testing-smart-contracts}
+
+Các phương pháp kiểm tra hợp đồng thông minh của Ethereum được chia thành hai loại chính: **kiểm tra tự động** và **kiểm tra thủ công**. Kiểm thử tự động và kiểm thử thủ công đều mang lại những lợi ích và hạn chế riêng, nhưng bạn có thể kết hợp cả hai để tạo ra một kế hoạch vững chắc trong việc phân tích các hợp đồng thông minh của mình.
+
+### Kiểm tra tự động {#automated-testing}
+
+Kiểm thử tự động sử dụng các công cụ để tự động kiểm tra mã hợp đồng thông minh nhằm phát hiện lỗi trong quá trình thực thi. Lợi ích của việc kiểm tra tự động đến từ việc sử dụng [các tập lệnh](https://www.techtarget.com/whatis/definition/script?amp=1) để hướng dẫn đánh giá các chức năng của hợp đồng. Các bài kiểm thử theo kịch bản có thể được lập lịch để chạy nhiều lần với sự can thiệp của con người tối thiểu, khiến kiểm thử tự động hiệu quả hơn so với các phương pháp kiểm thử thủ công.
+
+Kiểm thử tự động đặc biệt hữu ích khi các bài kiểm thử lặp đi lặp lại và tốn nhiều thời gian; khó thực hiện thủ công; dễ bị lỗi do con người; hoặc liên quan đến việc đánh giá các chức năng quan trọng của hợp đồng thông minh. Nhưng các công cụ kiểm tra tự động có thể có những nhược điểm—chúng có thể bỏ lỡ một số lỗi nhất định và tạo ra nhiều [kết quả dương tính giả](https://www.contrastsecurity.com/glossary/false-positive). Do đó, việc kết hợp kiểm thử tự động với kiểm thử thủ công cho hợp đồng thông minh là lý tưởng.
+
+### Kiểm tra thủ công {#manual-testing}
+
+Kiểm thử thủ công có sự hỗ trợ của con người và bao gồm việc thực hiện từng trường hợp kiểm thử trong bộ kiểm thử của bạn lần lượt, nhằm phân tích độ chính xác của hợp đồng thông minh. Điều này khác với kiểm thử tự động, nơi bạn có thể chạy đồng thời nhiều bài kiểm thử tách biệt trên một hợp đồng thông minh và nhận được báo cáo hiển thị tất cả các bài kiểm thử thành công và thất bại.
+
+Kiểm thử thủ công có thể được thực hiện bởi một cá nhân theo một kế hoạch kiểm thử đã được viết sẵn, bao quát các kịch bản kiểm thử khác nhau. Bạn cũng có thể để nhiều cá nhân hoặc nhóm tương tác với một hợp đồng thông minh trong một khoảng thời gian xác định như một phần của kiểm thử thủ công. Người kiểm thử sẽ so sánh hành vi thực tế của hợp đồng thông minh với hành vi dự kiến, và đánh dấu bất kỳ khác biệt nào là lỗi.
+
+Kiểm thử thủ công hiệu quả đòi hỏi nguồn lực đáng kể (kỹ năng, thời gian, tiền bạc và công sức), và do lỗi con người, việc bỏ sót một số lỗi trong quá trình thực hiện kiểm thử là điều có thể xảy ra. Nhưng việc kiểm tra thủ công cũng có lợi đó—ví dụ như một người kiểm tra (như một kiểm toán viên) có thể dùng trực giác để phát hiện những trường hợp đặc biệt mà công cụ kiểm tra tự động có thể bỏ lỡ.
+
+## Kiểm tra tự động cho các hợp đồng thông minh {#automated-testing-for-smart-contracts}
+
+### Kiểm tra đơn vị {#unit-testing-for-smart-contracts}
+
+Kiểm thử đơn vị đánh giá các hàm hợp đồng một cách riêng biệt và kiểm tra rằng từng thành phần hoạt động chính xác. Các bài kiểm thử đơn vị tốt nên đơn giản, nhanh chóng để chạy và cung cấp một ý tưởng rõ ràng về những gì đã sai nếu các bài kiểm tra không thành công.
+
+Các bài kiểm thử đơn vị rất hữu ích để kiểm tra rằng các hàm trả về giá trị như mong đợi và rằng việc lưu trữ hợp đồng được cập nhật đúng sau khi thực thi hàm hay không. Hơn nữa, việc chạy các bài kiểm thử đơn vị sau khi thực hiện thay đổi trong mã nguồn hợp đồng đảm bảo rằng việc thêm logic mới không gây ra lỗi. Dưới đây là một số hướng dẫn để thực hiện các bài kiểm thử đơn vị hiệu quả:
+
+#### Hướng dẫn kiểm tra đơn vị cho các hợp đồng thông minh {#unit-testing-guidelines}
+
+##### 1. Hiểu rõ quy trình và logic kinh doanh trong hợp đồng của bạn
+
+Trước khi viết bài kiểm tra đơn vị, nó sẽ giúp việc biết được hợp đồng thông minh cung cấp những chức năng gì và người dùng sẽ truy cập và sử dụng những chức năng đó như thế nào. Điều này đặc biệt hữu ích cho việc chạy [các bài kiểm tra luồng chính](https://en.m.wikipedia.org/wiki/Happy_path) nhằm xác định xem các hàm trong một hợp đồng có trả về đầu ra chính xác cho các đầu vào hợp lệ của người dùng hay không. Chúng tôi sẽ giải thích khái niệm này bằng cách sử dụng ví dụ (rút gọn) này về [một hợp đồng đấu giá](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction)
+
+```solidity
+constructor(
+ uint biddingTime,
+ address payable beneficiaryAddress
+ ) {
+ beneficiary = beneficiaryAddress;
+ auctionEndTime = block.timestamp + biddingTime;
+ }
+
+function bid() external payable {
+
+ if (block.timestamp > auctionEndTime)
+ revert AuctionAlreadyEnded();
+
+ if (msg.value <= highestBid)
+ revert BidNotHighEnough(highestBid);
+
+ 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);
+ }
+}
+```
+
+Đây là một hợp đồng đấu giá đơn giản được thiết kế để nhận các giá thầu trong thời gian đấu giá. Nếu `highestBid` tăng lên, người đặt giá cao nhất trước đó sẽ nhận lại tiền của họ; khi thời gian đấu giá kết thúc, `beneficiary` sẽ gọi hợp đồng để nhận tiền.
+
+Các bài kiểm tra đơn vị cho một hợp đồng như thế này sẽ bao gồm các chức năng khác nhau mà người dùng có thể gọi khi tương tác với hợp đồng. Một ví dụ là một bài kiểm tra đơn vị để kiểm tra xem người dùng có thể đặt giá thầu khi phiên đấu giá đang diễn ra hay không (tức là, các lệnh gọi đến `bid()` thành công) hoặc một bài kiểm tra để kiểm tra xem người dùng có thể đặt giá thầu cao hơn `highestBid` hiện tại hay không.
+
+Hiểu quy trình hoạt động của hợp đồng cũng giúp dễ dàng hơn trong việc viết các bài kiểm tra đơn vị để kiểm tra xem việc thực hiện có đáp ứng yêu cầu hay không. Ví dụ: hợp đồng đấu giá quy định rằng người dùng không thể đặt giá thầu khi phiên đấu giá đã kết thúc (tức là, khi `auctionEndTime` thấp hơn `block.timestamp`). Do đó, một nhà phát triển có thể chạy một bài kiểm tra đơn vị để kiểm tra xem các lệnh gọi đến hàm `bid()` có thành công hay thất bại khi phiên đấu giá kết thúc hay không (tức là, khi `auctionEndTime` > `block.timestamp`).
+
+##### 2. Đánh giá tất cả các giả định liên quan đến việc thực hiện hợp đồng.
+
+Việc ghi lại mọi giả định về việc thực hiện hợp đồng và viết các bài kiểm tra đơn vị để xác minh tính hợp lệ của những giả định đó là rất quan trọng. Ngoài việc cung cấp bảo vệ chống lại việc thực hiện bất ngờ, việc kiểm tra các tuyên bố buộc bạn phải suy nghĩ về các hoạt động có thể làm hỏng mô hình an ninh của hợp đồng thông minh. Ngoài việc cung cấp bảo vệ chống lại việc thực hiện bất ngờ, việc kiểm tra các tuyên bố buộc bạn phải suy nghĩ về các hoạt động có thể làm hỏng mô hình an ninh của hợp đồng thông minh.
+
+Nhiều framework kiểm thử đơn vị cho phép bạn tạo ra các khẳng định—những câu đơn giản nói về những gì một hợp đồng có thể và không thể làm—và chạy thử nghiệm để xem những khẳng định đó có đúng khi thực thi hay không. Một lập trình viên làm việc trên hợp đồng đấu giá đã đề cập ở trên có thể đưa ra các khẳng định sau về hành vi của nó trước khi thực hiện các bài kiểm tra tiêu cực:
+
+- Người dùng không thể đặt giá khi buổi đấu giá đã kết thúc hoặc chưa bắt đầu.
+
+- Hợp đồng đấu giá sẽ trở lại trạng thái ban đầu nếu một khoản đấu giá thấp hơn ngưỡng chấp nhận.
+
+- Người dùng không thắng thầu sẽ được hoàn lại số tiền của họ.
+
+**Lưu ý**: Một cách khác để kiểm tra các giả định là viết các bài kiểm tra kích hoạt [các công cụ sửa đổi hàm](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers) trong một hợp đồng, đặc biệt là các câu lệnh `require`, `assert`, và `if…else`.
+
+##### 3. Đo lường mã phủ
+
+[Độ bao phủ của mã](https://en.m.wikipedia.org/wiki/Code_coverage) là một chỉ số kiểm tra dùng để theo dõi số lượng nhánh, dòng và câu lệnh trong mã của bạn được thực thi trong các bài kiểm tra. Các bài kiểm tra nên có độ phủ mã tốt để giảm thiểu rủi ro về các lỗ hổng chưa được kiểm tra. Nếu không có đủ độ bao phủ, bạn có thể giả định sai rằng hợp đồng của bạn là an toàn bởi vì tất cả các bài kiểm tra đều đạt yêu cầu, trong khi vẫn còn tồn tại những lỗ hổng trong các đoạn mã chưa được kiểm tra. Việc ghi nhận mức độ bao phủ mã cao, tuy nhiên, đảm bảo rằng tất cả các câu lệnh/hàm trong một hợp đồng thông minh đã được kiểm tra đầy đủ về tính chính xác.
+
+##### 4. Sử dụng các khung thử nghiệm phát triển tốt.
+
+Chất lượng của các công cụ được sử dụng trong việc chạy các bài kiểm tra đơn vị cho hợp đồng thông minh của bạn là rất quan trọng. Một khung thử nghiệm lý tưởng là khung thường xuyên được duy trì; cung cấp các tính năng hữu ích (ví dụ, khả năng ghi nhật ký và báo cáo); và phải được sử dụng rộng rãi và kiểm định bởi các nhà phát triển khác.
+
+Các framework kiểm thử đơn vị cho hợp đồng thông minh Solidity có ở nhiều ngôn ngữ khác nhau (chủ yếu là JavaScript, Python và Rust). Xem một số hướng dẫn dưới đây để biết thông tin về cách bắt đầu chạy các bài kiểm tra đơn với các framework kiểm tra khác nhau:
+
+- **[Chạy các bài kiểm tra đơn vị với Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)**
+- **[Chạy các bài kiểm tra đơn vị với Foundry](https://book.getfoundry.sh/forge/writing-tests)**
+- **[Chạy các bài kiểm tra đơn vị với Waffle](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests)**
+- **[Chạy các bài kiểm tra đơn vị với Remix](https://remix-ide.readthedocs.io/en/latest/unittesting.html#write-tests)**
+- **[Chạy các bài kiểm tra đơn vị với Ape](https://docs.apeworx.io/ape/stable/userguides/testing.html)**
+- **[Chạy các bài kiểm tra đơn vị với Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)**
+- **[Chạy các bài kiểm tra đơn vị với Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)**
+
+### Kiểm tra tích hợp {#integration-testing-for-smart-contracts}
+
+Trong khi kiểm thử đơn vị gỡ lỗi các hàm hợp đồng một cách độc lập, các bài kiểm tra tích hợp đánh giá các thành phần của một hợp đồng thông minh như một tổng thể. Kiểm thử tích hợp có thể phát hiện các vấn đề phát sinh từ việc gọi giữa các hợp đồng hoặc các tương tác giữa các hàm khác nhau trong cùng một hợp đồng thông minh. Ví dụ: các bài kiểm tra tích hợp có thể giúp kiểm tra xem những thứ như [kế thừa](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) và tiêm phụ thuộc có hoạt động bình thường hay không.
+
+Kiểm thử tích hợp có ích nếu hợp đồng của bạn áp dụng kiến trúc mô-đun hoặc giao tiếp với các hợp đồng trên chuỗi khác trong quá trình thực thi. Một cách để chạy các bài kiểm tra tích hợp là [phân nhánh chuỗi khối](/glossary/#fork) ở một độ cao cụ thể (sử dụng một công cụ như [Forge](https://book.getfoundry.sh/forge/fork-testing) hoặc [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks)) và mô phỏng các tương tác giữa hợp đồng của bạn và các hợp đồng đã triển khai.
+
+Blockchain phân nhánh sẽ hoạt động tương tự như Mainnet và có các tài khoản với trạng thái và số dư đi kèm. Nhưng nó chỉ hoạt động như một môi trường phát triển cục bộ được cách ly, có nghĩa là bạn sẽ không cần ETH thật cho các giao dịch, chẳng hạn như, và các thay đổi của bạn sẽ không ảnh hưởng đến giao thức Ethereum thực.
+
+### Kiểm tra dựa trên thuộc tính {#property-based-testing-for-smart-contracts}
+
+Kiểm thử dựa trên thuộc tính là quá trình kiểm tra xem một hợp đồng thông minh có thỏa mãn một số thuộc tính đã được định nghĩa hay không. Các thuộc tính đưa ra những điều kiện về cách thức hoạt động của hợp đồng mà người ta mong đợi sẽ giữ nguyên trong các tình huống khác nhau—một ví dụ về thuộc tính của hợp đồng thông minh có thể là "Các phép toán số học trong hợp đồng không bao giờ bị tràn hoặc thiếu."
+
+**Phân tích tĩnh** và **phân tích động** là hai kỹ thuật phổ biến để thực hiện kiểm tra dựa trên thuộc tính, và cả hai đều có thể xác minh rằng mã cho một chương trình (một hợp đồng thông minh trong trường hợp này) thỏa mãn một số thuộc tính được xác định trước. Một số công cụ kiểm tra dựa trên thuộc tính đi kèm với các quy tắc đã được định nghĩa trước về các thuộc tính hợp đồng mong đợi và kiểm tra mã theo các quy tắc đó, trong khi những công cụ khác cho phép bạn tạo các thuộc tính tùy chỉnh cho hợp đồng thông minh.
+
+#### Phân tích tĩnh {#static-analysis}
+
+Một trình phân tích tĩnh nhận mã nguồn của một hợp đồng thông minh và đưa ra kết quả xem liệu hợp đồng có đáp ứng một thuộc tính nào đó hay không. Khác với phân tích động, phân tích tĩnh không cần thực thi hợp đồng để phân tích tính chính xác của nó. Phân tích tĩnh thì sẽ xem xét tất cả các đường đi có thể có mà một hợp đồng thông minh có thể thực hiện trong quá trình chạy (tức là, bằng cách xem xét cấu trúc của mã nguồn để xác định điều gì sẽ xảy ra với hoạt động của hợp đồng trong thời gian thực).
+
+[Linting](https://www.perforce.com/blog/qac/what-is-linting) và [kiểm tra tĩnh](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis) là các phương pháp phổ biến để chạy phân tích tĩnh trên các hợp đồng. Cả hai đều yêu cầu phân tích các biểu diễn cấp thấp của việc thực thi hợp đồng, chẳng hạn như [cây cú pháp trừu tượng](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree) và [đồ thị luồng điều khiển](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/) do trình biên dịch xuất ra.
+
+Trong hầu hết các trường hợp, phân tích tĩnh hữu ích để phát hiện các vấn đề an toàn như việc sử dụng các cấu trúc không an toàn, lỗi cú pháp, hoặc vi phạm tiêu chuẩn lập trình trong mã hợp đồng. Tuy nhiên, các công cụ phân tích tĩnh thường không đáng tin cậy trong việc phát hiện những lỗ hổng sâu hơn, và có thể tạo ra quá nhiều cảnh báo sai.
+
+#### Phân tích động {#dynamic-analysis}
+
+Phân tích động tạo ra các đầu vào tượng trưng (ví dụ, trong [thực thi tượng trưng](https://en.m.wikipedia.org/wiki/Symbolic_execution)) hoặc các đầu vào cụ thể (ví dụ, trong [fuzzing](https://owasp.org/www-community/Fuzzing)) cho các hàm của hợp đồng thông minh để xem liệu có bất kỳ dấu vết thực thi nào vi phạm các thuộc tính cụ thể hay không. Hình thức kiểm thử dựa trên thuộc tính này khác với kiểm thử đơn vị ở chỗ các trường hợp test bao gồm nhiều tình huống và chương trình đảm nhận việc tạo ra các trường hợp kiểm thử.
+
+[Fuzzing](https://www.halborn.com/blog/post/what-is-fuzz-testing-fuzzing) là một ví dụ về một kỹ thuật phân tích động để xác minh các thuộc tính tùy ý trong các hợp đồng thông minh. Một bộ thử nghiệm (fuzzer) kích hoạt các hàm trong một hợp đồng mục tiêu với các biến thể ngẫu nhiên hoặc sai định dạng của một giá trị đầu vào đã định nghĩa. Nếu hợp đồng thông minh gặp lỗi (ví dụ, khi một điều kiện bị sai), vấn đề sẽ được đánh dấu và những đầu vào dẫn đến việc thực thi theo con đường dễ bị tổn thương sẽ được đưa vào báo cáo.
+
+Fuzzing rất hữu ích để kiểm tra cơ chế xác thực đầu vào của hợp đồng thông minh, vì việc xử lý không đúng các đầu vào không mong muốn có thể dẫn đến việc thực thi không mong muốn và tạo ra những tác động nguy hiểm. Cách kiểm tra dựa trên thuộc tính này có thể tuyệt vời vì nhiều lý do:
+
+1. **Việc viết các trường hợp kiểm tra để bao quát nhiều kịch bản là một điều khó khăn.** Một bài kiểm tra thuộc tính chỉ yêu cầu bạn xác định một hành vi và một phạm vi dữ liệu để kiểm tra hành vi đó—chương trình sẽ tự động tạo ra các trường hợp kiểm tra dựa trên thuộc tính đã được định nghĩa.
+
+2. **Bộ kiểm tra của bạn có thể không đủ để bao phủ tất cả các đường đi có thể trong chương trình.** Ngay cả khi đạt được 100% độ bao phủ, vẫn có thể bỏ lỡ các trường hợp biên.
+
+3. **Các bài kiểm tra đơn vị chứng minh rằng hợp đồng thực thi đúng với dữ liệu mẫu, nhưng liệu hợp đồng có thực thi đúng với các đầu vào ngoài mẫu hay không vẫn chưa rõ.** Các bài kiểm tra thuộc tính thực thi hợp đồng mục tiêu với nhiều biến thể của một giá trị đầu vào nhất định để tìm các dấu vết thực thi gây ra sự thất bại trong xác nhận. Do đó, một bài kiểm tra thuộc tính cung cấp nhiều đảm bảo hơn rằng hợp đồng thực thi đúng đắn cho một lớp rộng các dữ liệu đầu vào.
+
+### Hướng dẫn chạy kiểm tra dựa trên thuộc tính cho các hợp đồng thông minh {#running-property-based-tests}
+
+Việc chạy kiểm tra dựa trên thuộc tính thường bắt đầu bằng việc xác định một thuộc tính (ví dụ: không có [tràn số nguyên](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)) hoặc một tập hợp các thuộc tính mà bạn muốn xác minh trong một hợp đồng thông minh. Có thể bạn cũng cần xác định một khoảng giá trị mà chương trình có thể tạo dữ liệu cho đầu vào giao dịch khi viết các bài kiểm tra thuộc tính.
+
+Khi được cấu hình đúng cách, công cụ kiểm tra tài sản sẽ thực thi các chức năng hợp đồng thông minh của bạn với các đầu vào được tạo ra ngẫu nhiên. Nếu có bất kỳ khẳng định vi phạm nào, bạn nên nhận được một báo cáo với dữ liệu đầu vào cụ thể vi phạm thuộc tính đang được đánh giá. Xem một số hướng dẫn dưới đây để bắt đầu với việc chạy thử nghiệm dựa trên thuộc tính với các công cụ khác nhau:
+
+- **[Phân tích tĩnh các hợp đồng thông minh với Slither](https://github.com/crytic/slither)**
+- **[Phân tích tĩnh các hợp đồng thông minh với Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)**
+- **[Kiểm tra dựa trên thuộc tính với Brownie](https://eth-brownie.readthedocs.io/en/stable/tests-hypothesis-property.html)**
+- **[Fuzzing hợp đồng với Foundry](https://book.getfoundry.sh/forge/fuzz-testing)**
+- **[Fuzzing hợp đồng với Echidna](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna#echidna-tutorial)**
+- **[Fuzzing hợp đồng với Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/fuzzing/)**
+- **[Thực thi tượng trưng các hợp đồng thông minh với Manticore](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore#manticore-tutorial)**
+- **[Thực thi tượng trưng các hợp đồng thông minh với Mythril](https://mythril-classic.readthedocs.io/en/master/tutorial.html)**
+
+## Kiểm tra thủ công cho các hợp đồng thông minh {#manual-testing-for-smart-contracts}
+
+Kiểm tra thủ công các hợp đồng thông minh thường diễn ra sau trong chu trình phát triển, sau khi đã chạy các bài kiểm tra tự động. Hình thức kiểm tra này đánh giá hợp đồng thông minh như một sản phẩm đã được tích hợp hoàn chỉnh để xem nó có hoạt động như đã được chỉ định trong các yêu cầu kỹ thuật hay không.
+
+### Kiểm tra hợp đồng trên chuỗi khối cục bộ {#testing-on-local-blockchain}
+
+Mặc dù việc kiểm thử tự động ở môi trường cục bộ có thể cung cấp thông tin hữu ích để gỡ lỗi, nhưng bạn sẽ muốn biết cách hợp đồng thông minh của bạn hoạt động trong môi trường sản xuất. Nhưng mà, triển khai lên chuỗi chính của Ethereum sẽ tốn phí gas - chưa kể rằng bạn hoặc người dùng của bạn có thể mất tiền thật nếu hợp đồng thông minh của bạn vẫn còn lỗi.
+
+Kiểm tra hợp đồng của bạn trên một chuỗi khối cục bộ (còn được gọi là [mạng phát triển](/developers/docs/development-networks/)) là một giải pháp thay thế được đề xuất cho việc kiểm tra trên Mạng chính. Một blockchain cục bộ là bản sao của blockchain Ethereum chạy trực tiếp trên máy tính của bạn, mô phỏng hành vi của lớp thực thi của Ethereum. Vì vậy, bạn có thể lập trình các giao dịch để tương tác với một hợp đồng mà không bị chịu chi phí lớn.
+
+Chạy hợp đồng trên một blockchain cục bộ có thể hữu ích như một hình thức kiểm thử tích hợp thủ công. [Các hợp đồng thông minh có tính kết hợp cao](/developers/docs/smart-contracts/composability/), cho phép bạn tích hợp với các giao thức hiện có—nhưng bạn vẫn cần đảm bảo rằng các tương tác trên chuỗi phức tạp như vậy tạo ra kết quả chính xác.
+
+[Thông tin thêm về các mạng phát triển.](/developers/docs/development-networks/)
+
+### Kiểm tra hợp đồng trên các mạng thử nghiệm {#testing-contracts-on-testnets}
+
+Mạng thử nghiệm hoặc testnet hoạt động giống như Ethereum Mainnet, ngoại trừ việc nó sử dụng ether (ETH) không có giá trị thực tế. Triển khai hợp đồng của bạn trên [mạng thử nghiệm](/developers/docs/networks/#ethereum-testnets) có nghĩa là bất kỳ ai cũng có thể tương tác với nó (ví dụ: thông qua giao diện người dùng của ứng dụng phi tập trung) mà không gặp rủi ro về tiền bạc.
+
+Cách kiểm tra thủ công này rất hữu ích để đánh giá quy trình hoạt động của ứng dụng từ góc nhìn của người dùng. Tại đây, những người thử nghiệm beta cũng có thể thực hiện các thử nghiệm và báo cáo bất kỳ vấn đề nào liên quan đến logic kinh doanh của hợp đồng và chức năng tổng thể.
+
+Triển khai trên testnet sau khi thử nghiệm trên một blockchain nội bộ thật sự là lựa chọn tuyệt vời vì cái đó giống với cách hoạt động của Ethereum Virtual Machine hơn. Do đó, việc nhiều dự án gốc Ethereum triển khai các dapp trên mạng thử nghiệm để đánh giá hoạt động của hợp đồng thông minh trong điều kiện thực tế là điều phổ biến.
+
+[Thông tin thêm về các mạng thử nghiệm Ethereum.](/developers/docs/development-networks/#public-beacon-testchains)
+
+## Kiểm tra và xác minh chính thức {#testing-vs-formal-verification}
+
+Trong khi việc kiểm tra giúp xác nhận rằng một hợp đồng trả về kết quả mong đợi cho một số đầu vào dữ liệu, nó không thể chứng minh một cách kết luận rằng điều tương tự cũng đúng cho các đầu vào không được sử dụng trong quá trình kiểm tra. Do đó, việc kiểm tra một hợp đồng thông minh không thể đảm bảo "tính đúng đắn về chức năng" (tức là, nó không thể cho thấy một chương trình hoạt động như yêu cầu đối với _tất cả_ các bộ giá trị đầu vào).
+
+Xác minh hình thức là một phương pháp đánh giá tính đúng đắn của phần mềm bằng cách kiểm tra xem mô hình chính thức của chương trình có khớp với đặc tả chính thức hay không. Một mô hình hình thức là một biểu diễn toán học trừu tượng của một chương trình, trong khi một đặc tả hình thức định nghĩa các thuộc tính của chương trình (tức là, các khẳng định logic về việc thực thi của chương trình).
+
+Bởi vì các thuộc tính được viết bằng các thuật ngữ toán học, điều này giúp có thể xác minh rằng một mô hình hình thức (toán học) của hệ thống thỏa mãn một đặc tả bằng cách sử dụng các quy tắc suy diễn logic. Vậy nên, các công cụ xác minh chính thức được cho là tạo ra ‘bằng chứng toán học’ về tính đúng đắn của hệ thống.
+
+Không giống như kiểm tra, xác minh chính thức có thể được sử dụng để xác minh việc thực thi một hợp đồng thông minh thỏa mãn một đặc tả chính thức cho _tất cả_ các lần thực thi (tức là, nó không có lỗi) mà không cần thực thi nó với dữ liệu mẫu. Không chỉ giúp tiết kiệm thời gian cho việc chạy hàng tá bài kiểm tra đơn vị, mà nó còn hiệu quả hơn trong việc phát hiện các lỗ hổng ẩn. Nói như vậy, các kỹ thuật xác minh chính thức nằm trên một phổ tùy thuộc vào độ khó thực hiện và tính hữu ích của chúng.
+
+[Thông tin thêm về xác minh chính thức cho các hợp đồng thông minh.](/developers/docs/smart-contracts/formal-verification)
+
+## Kiểm tra và kiểm toán và tiền thưởng săn lỗi {#testing-vs-audits-bug-bounties}
+
+Như đã đề cập, việc kiểm tra kỹ lưỡng hiếm khi đảm bảo hoàn toàn không có lỗi trong một hợp đồng; các phương pháp xác minh hình thức có thể cung cấp sự đảm bảo mạnh mẽ hơn về độ chính xác nhưng hiện tại thì khó sử dụng và tốn kém.
+
+Dù sao, bạn có thể tăng khả năng phát hiện lỗ hổng hợp đồng bằng cách nhờ xem xét mã độc lập. [Kiểm toán hợp đồng thông minh](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/) và [tiền thưởng săn lỗi](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) là hai cách để người khác phân tích hợp đồng của bạn.
+
+Các buổi kiểm toán được thực hiện bởi những kiểm toán viên có kinh nghiệm trong việc tìm ra các lỗ hổng bảo mật và các thực hành phát triển kém trong hợp đồng thông minh. Một cuộc kiểm toán thường sẽ bao gồm việc kiểm tra (và có thể là xác minh chính thức) cũng như một đánh giá thủ công về toàn bộ mã nguồn.
+
+Ngược lại, một chương trình tiền thưởng săn lỗi thường bao gồm việc cung cấp một phần thưởng tài chính cho một cá nhân (thường được mô tả là [tin tặc mũ trắng](https://en.wikipedia.org/wiki/White_hat_\(computer_security\))) phát hiện ra một lỗ hổng trong một hợp đồng thông minh và tiết lộ nó cho các nhà phát triển. Giải thưởng lỗi tương tự như các cuộc kiểm toán vì nó liên quan đến việc yêu cầu người khác giúp tìm ra các lỗi trong hợp đồng thông minh.
+
+Sự khác biệt chính là các chương trình bug bounty mở cửa cho cộng đồng lập trình viên/ hacker rộng rãi và thu hút một lớp các hacker mũ trắng và các chuyên gia an ninh độc lập với những kỹ năng và kinh nghiệm độc đáo. Điều này có thể là một lợi thế so với việc kiểm toán hợp đồng thông minh chủ yếu dựa vào các đội ngũ có thể chỉ sở hữu kiến thức hạn hẹp hoặc chuyên môn hạn chế.
+
+## Các công cụ và thư viện kiểm tra {#testing-tools-and-libraries}
+
+### Các công cụ kiểm tra đơn vị {#unit-testing-tools}
+
+- **[solidity-coverage](https://github.com/sc-forks/solidity-coverage)** - _Công cụ đo độ bao phủ mã cho các hợp đồng thông minh được viết bằng Solidity._
+
+- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** - _Framework để phát triển và kiểm tra hợp đồng thông minh nâng cao (dựa trên ethers.js)_.
+
+- **[Remix Tests](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** - _Công cụ để kiểm tra các hợp đồng thông minh Solidity. Làm việc dưới Remix IDE với plugin "Kiểm thử Solidity" được sử dụng để viết và chạy các trường hợp test cho một hợp đồng._
+
+- **[OpenZeppelin Test Helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** - _Thư viện xác nhận để kiểm tra hợp đồng thông minh Ethereum. Hãy đảm bảo rằng các hợp đồng của bạn hoạt động như mong đợi!_
+
+- **[Framework kiểm tra đơn vị Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie sử dụng Pytest, một framework kiểm tra giàu tính năng cho phép bạn viết các bài kiểm tra nhỏ với mã tối thiểu, có khả năng mở rộng tốt cho các dự án lớn và có khả năng mở rộng cao._
+
+- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry cung cấp Forge, một framework kiểm tra Ethereum nhanh và linh hoạt có khả năng thực hiện các bài kiểm tra đơn vị đơn giản, kiểm tra tối ưu hóa gas và fuzzing hợp đồng._
+
+- **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework để kiểm tra các hợp đồng thông minh dựa trên ethers.js, Mocha và Chai._
+
+- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** - _Framework phát triển và kiểm tra dựa trên Python cho các hợp đồng thông minh nhắm vào Máy ảo Ethereum._
+
+- **[Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** - _Framework dựa trên Python để kiểm tra đơn vị và fuzzing với khả năng gỡ lỗi mạnh mẽ và hỗ trợ kiểm tra chuỗi chéo, sử dụng pytest và Anvil để có trải nghiệm người dùng và hiệu suất tốt nhất._
+
+### Các công cụ kiểm tra dựa trên thuộc tính {#property-based-testing-tools}
+
+#### Các công cụ phân tích tĩnh {#static-analysis-tools}
+
+- **[Slither](https://github.com/crytic/slither)** - _Framework phân tích tĩnh Solidity dựa trên Python để tìm các lỗ hổng, nâng cao khả năng hiểu mã và viết các phân tích tùy chỉnh cho các hợp đồng thông minh._
+
+- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** - _Công cụ linter để thực thi các phương pháp hay nhất về văn phong và bảo mật cho ngôn ngữ lập trình hợp đồng thông minh Solidity._
+
+- **[Cyfrin Aderyn](https://cyfrin.io/tools/aderyn)** - _Trình phân tích tĩnh dựa trên Rust được thiết kế đặc biệt cho bảo mật và phát triển hợp đồng thông minh Web3._
+
+- **[Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** - _Framework phân tích tĩnh dựa trên Python với các công cụ phát hiện lỗ hổng và chất lượng mã, các máy in để trích xuất thông tin hữu ích từ mã và hỗ trợ viết các mô-đun con tùy chỉnh._
+
+- **[Slippy](https://github.com/fvictorio/slippy)** - _Một linter đơn giản và mạnh mẽ cho Solidity._
+
+#### Các công cụ phân tích động {#dynamic-analysis-tools}
+
+- **[Echidna](https://github.com/crytic/echidna/)** - _Công cụ fuzzer hợp đồng nhanh để phát hiện các lỗ hổng trong các hợp đồng thông minh thông qua kiểm tra dựa trên thuộc tính._
+
+- **[Diligence Fuzzing](https://consensys.net/diligence/fuzzing/)** - _Công cụ fuzzing tự động hữu ích để phát hiện các vi phạm thuộc tính trong mã hợp đồng thông minh._
+
+- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** - _Framework thực thi tượng trưng động để phân tích mã byte EVM._
+
+- **[Mythril](https://github.com/ConsenSys/mythril-classic)** - _Công cụ đánh giá mã byte EVM để phát hiện các lỗ hổng hợp đồng bằng cách sử dụng phân tích vết, phân tích kết hợp và kiểm tra luồng điều khiển._
+
+- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** - _Scribble là một ngôn ngữ đặc tả và công cụ xác minh thời gian chạy cho phép bạn chú thích các hợp đồng thông minh với các thuộc tính cho phép bạn tự động kiểm tra các hợp đồng bằng các công cụ như Diligence Fuzzing hoặc MythX._
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Tổng quan và so sánh các sản phẩm kiểm tra khác nhau](/developers/tutorials/guide-to-smart-contract-security-tools/) \_
+- [Cách sử dụng Echidna để kiểm tra các hợp đồng thông minh](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/)
+- [Cách sử dụng Manticore để tìm lỗi hợp đồng thông minh](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/)
+- [Cách sử dụng Slither để tìm lỗi hợp đồng thông minh](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/)
+- [Cách mô phỏng các hợp đồng Solidity để kiểm tra](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/)
+- [Cách chạy các bài kiểm tra đơn vị trong Solidity bằng Foundry](https://www.rareskills.io/post/foundry-testing-solidity)
+
+## Đọc thêm {#further-reading}
+
+- [Hướng dẫn chuyên sâu về kiểm tra các hợp đồng thông minh Ethereum](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297)
+- [Cách kiểm tra các hợp đồng thông minh Ethereum](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d)
+- [Hướng dẫn kiểm tra đơn vị của MolochDAO cho các nhà phát triển](https://github.com/MolochVentures/moloch/tree/4e786db8a4aa3158287e0935dcbc7b1e43416e38/test#moloch-testing-guide)
+- [Cách kiểm tra các hợp đồng thông minh như một ngôi sao nhạc rock](https://forum.openzeppelin.com/t/test-smart-contracts-like-a-rockstar/1001)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/upgrading/index.md b/public/content/translations/vi/developers/docs/smart-contracts/upgrading/index.md
new file mode 100644
index 00000000000..007b4a75921
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/upgrading/index.md
@@ -0,0 +1,165 @@
+---
+title: Nâng cấp hợp đồng thông minh
+description: Tổng quan về các mẫu nâng cấp cho hợp đồng thông minh Ethereum
+lang: vi
+---
+
+Hợp đồng thông minh trên Ethereum là các chương trình tự thực thi chạy trong Máy ảo Ethereum (EVM). Các chương trình này được thiết kế bất biến, giúp ngăn chặn mọi cập nhật đối với logic nghiệp vụ sau khi hợp đồng được triển khai.
+
+Mặc dù tính bất biến là cần thiết cho tính không cần tin cậy, tính phi tập trung và tính bảo mật của các hợp đồng thông minh, nhưng nó có thể là một nhược điểm trong một số trường hợp nhất định. Ví dụ: mã bất biến có thể khiến các nhà phát triển không thể sửa các hợp đồng dễ bị tấn công.
+
+Tuy nhiên, việc tăng cường nghiên cứu nhằm cải thiện các hợp đồng thông minh đã dẫn đến sự ra đời của một số mẫu nâng cấp. Các mẫu nâng cấp này cho phép các nhà phát triển nâng cấp các hợp đồng thông minh (trong khi vẫn duy trì tính bất biến) bằng cách đặt logic nghiệp vụ vào các hợp đồng khác nhau.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Bạn nên có hiểu biết tốt về [hợp đồng thông minh](/developers/docs/smart-contracts/), [cấu trúc của hợp đồng thông minh](/developers/docs/smart-contracts/anatomy/) và [Máy ảo Ethereum (EVM)](/developers/docs/evm/). Hướng dẫn này cũng giả định rằng người đọc đã nắm được kiến thức lập trình hợp đồng thông minh.
+
+## Nâng cấp hợp đồng thông minh là gì? {#what-is-a-smart-contract-upgrade}
+
+Nâng cấp hợp đồng thông minh bao gồm việc thay đổi logic nghiệp vụ của hợp đồng thông minh trong khi vẫn giữ nguyên trạng thái của hợp đồng. Điều quan trọng là phải làm rõ rằng khả năng nâng cấp và khả năng thay đổi là không giống nhau, đặc biệt là trong bối cảnh hợp đồng thông minh.
+
+Bạn vẫn không thể thay đổi một chương trình đã được triển khai đến một địa chỉ trên mạng Ethereum. Nhưng bạn có thể thay đổi mã được thực thi khi người dùng tương tác với hợp đồng thông minh.
+
+Điều này có thể được thực hiện thông qua các phương pháp sau:
+
+1. Tạo nhiều phiên bản của một hợp đồng thông minh và di chuyển trạng thái (tức là dữ liệu) từ hợp đồng cũ sang một phiên bản mới của hợp đồng.
+
+2. Tạo các hợp đồng riêng biệt để lưu trữ logic nghiệp vụ và trạng thái.
+
+3. Sử dụng các mẫu proxy để ủy quyền các lệnh gọi hàm từ một hợp đồng proxy bất biến đến một hợp đồng logic có thể sửa đổi.
+
+4. Tạo một hợp đồng chính bất biến giao tiếp với và dựa vào các hợp đồng vệ tinh linh hoạt để thực hiện các chức năng cụ thể.
+
+5. Sử dụng mẫu kim cương để ủy quyền các lệnh gọi hàm từ hợp đồng proxy đến các hợp đồng logic.
+
+### Cơ chế nâng cấp số 1: Di chuyển hợp đồng {#contract-migration}
+
+Di chuyển hợp đồng dựa trên việc tạo phiên bản—ý tưởng tạo và quản lý các trạng thái duy nhất của cùng một phần mềm. Việc di chuyển hợp đồng bao gồm việc triển khai một phiên bản mới của một hợp đồng thông minh hiện có và chuyển lưu trữ và số dư sang hợp đồng mới.
+
+Hợp đồng mới được triển khai sẽ có một bộ nhớ trống, cho phép bạn khôi phục dữ liệu từ hợp đồng cũ và ghi nó vào bản triển khai mới. Sau đó, bạn sẽ cần cập nhật tất cả các hợp đồng đã tương tác với hợp đồng cũ để phản ánh địa chỉ mới.
+
+Bước cuối cùng trong việc di chuyển hợp đồng là thuyết phục người dùng chuyển sang sử dụng hợp đồng mới. Phiên bản hợp đồng mới sẽ giữ lại số dư và địa chỉ của người dùng, điều này giúp duy trì tính bất biến. Nếu đó là hợp đồng dựa trên token, bạn cũng sẽ cần liên hệ với các sàn giao dịch để loại bỏ hợp đồng cũ và sử dụng hợp đồng mới.
+
+Di chuyển hợp đồng là một biện pháp tương đối đơn giản và an toàn để nâng cấp các hợp đồng thông minh mà không làm gián đoạn các tương tác của người dùng. Tuy nhiên, việc di chuyển thủ công bộ nhớ và số dư của người dùng sang hợp đồng mới tốn nhiều thời gian và có thể phát sinh chi phí gas cao.
+
+[Thông tin thêm về di chuyển hợp đồng.](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/)
+
+### Cơ chế nâng cấp số 2: Tách dữ liệu {#data-separation}
+
+Một phương pháp khác để nâng cấp hợp đồng thông minh là tách logic nghiệp vụ và lưu trữ dữ liệu thành các hợp đồng riêng biệt. Điều này có nghĩa là người dùng tương tác với hợp đồng logic, trong khi dữ liệu được lưu trữ trong hợp đồng lưu trữ.
+
+Hợp đồng logic chứa mã được thực thi khi người dùng tương tác với ứng dụng. Nó cũng giữ địa chỉ của hợp đồng lưu trữ và tương tác với nó để lấy và thiết lập dữ liệu.
+
+Trong khi đó, hợp đồng lưu trữ giữ trạng thái liên quan đến hợp đồng thông minh, chẳng hạn như số dư và địa chỉ của người dùng. Lưu ý rằng hợp đồng lưu trữ thuộc sở hữu của hợp đồng logic và được cấu hình với địa chỉ của hợp đồng logic tại thời điểm triển khai. Điều này ngăn các hợp đồng không được ủy quyền gọi hợp đồng lưu trữ hoặc cập nhật dữ liệu của nó.
+
+Theo mặc định, hợp đồng lưu trữ là bất biến—nhưng bạn có thể thay thế hợp đồng logic mà nó trỏ đến bằng một bản triển khai mới. Điều này sẽ thay đổi mã chạy trong EVM, trong khi vẫn giữ nguyên bộ nhớ và số dư.
+
+Sử dụng phương pháp nâng cấp này yêu cầu cập nhật địa chỉ của hợp đồng logic trong hợp đồng lưu trữ. Bạn cũng phải cấu hình hợp đồng logic mới với địa chỉ của hợp đồng lưu trữ vì những lý do đã giải thích trước đó.
+
+Mẫu tách dữ liệu được cho là dễ triển khai hơn so với di chuyển hợp đồng. Tuy nhiên, bạn sẽ phải quản lý nhiều hợp đồng và triển khai các lược đồ ủy quyền phức tạp để bảo vệ các hợp đồng thông minh khỏi các nâng cấp độc hại.
+
+### Cơ chế nâng cấp số 3: Các mẫu proxy {#proxy-patterns}
+
+Mẫu proxy cũng sử dụng phương pháp tách dữ liệu để giữ logic nghiệp vụ và dữ liệu trong các hợp đồng riêng biệt. Tuy nhiên, trong một mẫu proxy, hợp đồng lưu trữ (được gọi là proxy) sẽ gọi hợp đồng logic trong quá trình thực thi mã. Đây là phương pháp đảo ngược của phương pháp tách dữ liệu, trong đó hợp đồng logic gọi hợp đồng lưu trữ.
+
+Đây là những gì xảy ra trong một mẫu proxy:
+
+1. Người dùng tương tác với hợp đồng proxy, nơi lưu trữ dữ liệu nhưng không giữ logic nghiệp vụ.
+
+2. Hợp đồng proxy lưu trữ địa chỉ của hợp đồng logic và ủy quyền tất cả các lệnh gọi hàm cho hợp đồng logic (nơi chứa logic nghiệp vụ) bằng hàm `delegatecall`.
+
+3. Sau khi lệnh gọi được chuyển tiếp đến hợp đồng logic, dữ liệu trả về từ hợp đồng logic sẽ được truy xuất và trả lại cho người dùng.
+
+Sử dụng các mẫu proxy đòi hỏi sự hiểu biết về hàm **delegatecall**. Về cơ bản, `delegatecall` là một mã vận hành cho phép một hợp đồng gọi một hợp đồng khác, trong khi việc thực thi mã thực tế diễn ra trong ngữ cảnh của hợp đồng gọi. Một hệ quả của việc sử dụng `delegatecall` trong các mẫu proxy là hợp đồng proxy đọc và ghi vào bộ nhớ của nó và thực thi logic được lưu trữ tại hợp đồng logic như thể đang gọi một hàm nội bộ.
+
+Từ [tài liệu tham khảo Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#delegatecall-callcode-and-libraries):
+
+> _Tồn tại một biến thể đặc biệt của một lệnh gọi hàm nhắn tin, có tên là **delegatecall**, giống hệt với một lệnh gọi hàm nhắn tin ngoại trừ việc mã tại địa chỉ đích được thực thi trong ngữ cảnh (tức là tại địa chỉ) của hợp đồng gọi và `msg.sender` cùng `msg.value` không thay đổi giá trị của chúng._ _Điều này có nghĩa là một hợp đồng có thể tải động mã từ một địa chỉ khác trong thời gian chạy. Lưu trữ, địa chỉ hiện tại và số dư vẫn tham chiếu đến hợp đồng gọi, chỉ có mã được lấy từ địa chỉ được gọi._
+
+Hợp đồng proxy biết cách gọi `delegatecall` bất cứ khi nào người dùng gọi một hàm vì nó có một hàm `fallback` được tích hợp sẵn. Trong lập trình Solidity, [hàm dự phòng](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function) được thực thi khi một lệnh gọi hàm không khớp với các hàm được chỉ định trong hợp đồng.
+
+Để mẫu proxy hoạt động, cần phải viết một hàm dự phòng tùy chỉnh chỉ định cách hợp đồng proxy xử lý các lệnh gọi hàm mà nó không hỗ trợ. Trong trường hợp này, hàm dự phòng của proxy được lập trình để khởi tạo một delegatecall và định tuyến lại yêu cầu của người dùng đến bản triển khai hợp đồng logic hiện tại.
+
+Hợp đồng proxy là bất biến theo mặc định, nhưng các hợp đồng logic mới với logic nghiệp vụ được cập nhật có thể được tạo. Việc thực hiện nâng cấp sau đó là vấn đề thay đổi địa chỉ của hợp đồng logic được tham chiếu trong hợp đồng proxy.
+
+Bằng cách trỏ hợp đồng proxy đến một hợp đồng logic mới, mã được thực thi khi người dùng gọi hàm của hợp đồng proxy sẽ thay đổi. Điều này cho phép chúng tôi nâng cấp logic của hợp đồng mà không cần yêu cầu người dùng tương tác với hợp đồng mới.
+
+Các mẫu proxy là một phương pháp phổ biến để nâng cấp các hợp đồng thông minh vì chúng loại bỏ những khó khăn liên quan đến việc di chuyển hợp đồng. Tuy nhiên, các mẫu proxy phức tạp hơn khi sử dụng và có thể gây ra các lỗi nghiêm trọng, chẳng hạn như [xung đột bộ chọn hàm](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357), nếu được sử dụng không đúng cách.
+
+[Thông tin thêm về các mẫu proxy](https://blog.openzeppelin.com/proxy-patterns/).
+
+### Cơ chế nâng cấp số 4: Mẫu chiến lược {#strategy-pattern}
+
+Kỹ thuật này bị ảnh hưởng bởi [mẫu chiến lược](https://en.wikipedia.org/wiki/Strategy_pattern), khuyến khích việc tạo ra các chương trình phần mềm giao tiếp với các chương trình khác để triển khai các tính năng cụ thể. Áp dụng mẫu chiến lược cho việc phát triển Ethereum có nghĩa là xây dựng một hợp đồng thông minh gọi các hàm từ các hợp đồng khác.
+
+Hợp đồng chính trong trường hợp này chứa logic nghiệp vụ cốt lõi, nhưng giao tiếp với các hợp đồng thông minh khác ("hợp đồng vệ tinh") để thực hiện các chức năng nhất định. Hợp đồng chính này cũng lưu trữ địa chỉ cho mỗi hợp đồng vệ tinh và có thể chuyển đổi giữa các bản triển khai khác nhau của hợp đồng vệ tinh.
+
+Bạn có thể xây dựng một hợp đồng vệ tinh mới và cấu hình hợp đồng chính với địa chỉ mới. Điều này cho phép bạn thay đổi _chiến lược_ (tức là triển khai logic mới) cho một hợp đồng thông minh.
+
+Mặc dù tương tự như mẫu proxy đã được thảo luận trước đó, mẫu chiến lược lại khác biệt vì hợp đồng chính, nơi người dùng tương tác, nắm giữ logic nghiệp vụ. Sử dụng mẫu này mang lại cho bạn cơ hội để giới thiệu những thay đổi hạn chế đối với hợp đồng thông minh mà không ảnh hưởng đến cơ sở hạ tầng cốt lõi.
+
+Nhược điểm chính là mẫu này chủ yếu hữu ích cho việc triển khai các nâng cấp nhỏ. Ngoài ra, nếu hợp đồng chính bị xâm phạm (ví dụ, thông qua một vụ hack), bạn không thể sử dụng phương pháp nâng cấp này.
+
+### Cơ chế nâng cấp số 5: Mẫu kim cương {#diamond-pattern}
+
+Mẫu kim cương có thể được coi là một cải tiến so với mẫu proxy. Các mẫu kim cương khác với các mẫu proxy vì hợp đồng proxy kim cương có thể ủy quyền các lệnh gọi hàm cho nhiều hơn một hợp đồng logic.
+
+Các hợp đồng logic trong mẫu kim cương được gọi là _facet_. Để làm cho mẫu kim cương hoạt động, bạn cần tạo một ánh xạ trong hợp đồng proxy để ánh xạ [các bộ chọn hàm](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector) đến các địa chỉ facet khác nhau.
+
+Khi người dùng thực hiện một lệnh gọi hàm, hợp đồng proxy sẽ kiểm tra ánh xạ để tìm facet chịu trách nhiệm thực thi hàm đó. Sau đó, nó gọi `delegatecall` (sử dụng hàm dự phòng) và chuyển hướng lệnh gọi đến hợp đồng logic thích hợp.
+
+Mẫu nâng cấp kim cương có một số ưu điểm so với các mẫu nâng cấp proxy truyền thống:
+
+1. Nó cho phép bạn nâng cấp một phần nhỏ của hợp đồng mà không cần thay đổi toàn bộ mã. Sử dụng mẫu proxy để nâng cấp đòi hỏi phải tạo một hợp đồng logic hoàn toàn mới, ngay cả đối với các nâng cấp nhỏ.
+
+2. Tất cả các hợp đồng thông minh (bao gồm cả các hợp đồng logic được sử dụng trong các mẫu proxy) đều có giới hạn kích thước 24KB, đây có thể là một hạn chế—đặc biệt đối với các hợp đồng phức tạp đòi hỏi nhiều chức năng hơn. Mẫu kim cương giúp giải quyết vấn đề này dễ dàng bằng cách chia các chức năng trên nhiều hợp đồng logic.
+
+3. Các mẫu proxy áp dụng phương pháp tiếp cận toàn diện để kiểm soát truy cập. Một thực thể có quyền truy cập vào các chức năng nâng cấp có thể thay đổi _toàn bộ_ hợp đồng. Nhưng mẫu kim cương cho phép một cách tiếp cận cấp phép theo mô-đun, nơi bạn có thể hạn chế các thực thể nâng cấp một số chức năng nhất định trong một hợp đồng thông minh.
+
+[Thông tin thêm về mẫu kim cương](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w).
+
+## Ưu và nhược điểm của việc nâng cấp hợp đồng thông minh {#pros-and-cons-of-upgrading-smart-contracts}
+
+| Ưu điểm | Nhược điểm |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Việc nâng cấp hợp đồng thông minh có thể giúp dễ dàng sửa các lỗ hổng được phát hiện trong giai đoạn sau triển khai. | Việc nâng cấp các hợp đồng thông minh phủ nhận ý tưởng về tính bất biến của mã, điều này có ý nghĩa đối với tính phi tập trung và bảo mật. |
+| Các nhà phát triển có thể sử dụng các nâng cấp logic để thêm các tính năng mới cho các ứng dụng phi tập trung. | Người dùng phải tin tưởng các nhà phát triển sẽ không sửa đổi các hợp đồng thông minh một cách tùy tiện. |
+| Việc nâng cấp hợp đồng thông minh có thể cải thiện sự an toàn cho người dùng cuối vì các lỗi có thể được sửa chữa nhanh chóng. | Việc lập trình chức năng nâng cấp vào các hợp đồng thông minh sẽ thêm một lớp phức tạp khác và làm tăng khả năng xảy ra các lỗi nghiêm trọng. |
+| Các nâng cấp hợp đồng giúp các nhà phát triển có nhiều không gian hơn để thử nghiệm các tính năng khác nhau và cải thiện các ứng dụng phi tập trung theo thời gian. | Cơ hội nâng cấp các hợp đồng thông minh có thể khuyến khích các nhà phát triển khởi chạy dự án nhanh hơn mà không cần thực hiện thẩm định trong giai đoạn phát triển. |
+| | Việc kiểm soát truy cập không an toàn hoặc tập trung hóa trong các hợp đồng thông minh có thể giúp các tác nhân độc hại thực hiện các nâng cấp trái phép dễ dàng hơn. |
+
+## Những lưu ý khi nâng cấp hợp đồng thông minh {#considerations-for-upgrading-smart-contracts}
+
+1. Sử dụng các cơ chế kiểm soát/ủy quyền truy cập an toàn để ngăn chặn các nâng cấp hợp đồng thông minh trái phép, đặc biệt nếu sử dụng các mẫu proxy, mẫu chiến lược hoặc tách dữ liệu. Một ví dụ là hạn chế quyền truy cập vào chức năng nâng cấp, để chỉ chủ sở hữu của hợp đồng mới có thể gọi nó.
+
+2. Nâng cấp hợp đồng thông minh là một hoạt động phức tạp và đòi hỏi sự cẩn trọng cao độ để ngăn chặn việc phát sinh các lỗ hổng bảo mật.
+
+3. Giảm các giả định về sự tin cậy bằng cách phi tập trung hóa quy trình thực hiện các nâng cấp. Các chiến lược khả thi bao gồm việc sử dụng [hợp đồng ví đa chữ ký](/developers/docs/smart-contracts/#multisig) để kiểm soát các nâng cấp, hoặc yêu cầu [các thành viên của một DAO](/dao/) bỏ phiếu để phê duyệt việc nâng cấp.
+
+4. Hãy lưu ý đến các chi phí liên quan đến việc nâng cấp hợp đồng. Ví dụ, việc sao chép trạng thái (ví dụ: số dư của người dùng) từ hợp đồng cũ sang hợp đồng mới trong quá trình di chuyển hợp đồng có thể yêu cầu nhiều hơn một giao dịch, nghĩa là sẽ tốn nhiều phí gas hơn.
+
+5. Hãy cân nhắc việc triển khai **khóa thời gian** để bảo vệ người dùng. Khóa thời gian đề cập đến một sự chậm trễ được áp dụng đối với các thay đổi của một hệ thống. Khóa thời gian có thể được kết hợp với một hệ thống quản trị đa chữ ký để kiểm soát các nâng cấp: nếu một hành động được đề xuất đạt đến ngưỡng phê duyệt yêu cầu, nó sẽ không được thực thi cho đến khi khoảng thời gian trì hoãn được xác định trước trôi qua.
+
+Khóa thời gian cho người dùng một khoảng thời gian để thoát khỏi hệ thống nếu họ không đồng ý với một thay đổi được đề xuất (ví dụ: nâng cấp logic hoặc các lược đồ phí mới). Nếu không có khóa thời gian, người dùng cần phải tin tưởng các nhà phát triển sẽ không thực hiện các thay đổi tùy tiện trong một hợp đồng thông minh mà không có thông báo trước. Nhược điểm ở đây là khóa thời gian hạn chế khả năng vá nhanh các lỗ hổng bảo mật.
+
+## Tài nguyên {#resources}
+
+**Plugin Nâng cấp OpenZeppelin - _Một bộ công cụ để triển khai và bảo mật các hợp đồng thông minh có thể nâng cấp._**
+
+- [GitHub](https://github.com/OpenZeppelin/openzeppelin-upgrades)
+- [Tài liệu tham khảo](https://docs.openzeppelin.com/upgrades)
+
+## Hướng dẫn {#tutorials}
+
+- [Nâng cấp các Hợp đồng thông minh của bạn | Hướng dẫn trên YouTube](https://www.youtube.com/watch?v=bdXJmWajZRY) của Patrick Collins
+- [Hướng dẫn Di chuyển Hợp đồng thông minh Ethereum](https://medium.com/coinmonks/ethereum-smart-contract-migration-13f6f12539bd) của Austin Griffith
+- [Sử dụng mẫu proxy UUPS để nâng cấp hợp đồng thông minh](https://blog.logrocket.com/author/praneshas/) của Pranesh A.S
+- [Hướng dẫn Web3: Viết hợp đồng thông minh có thể nâng cấp (proxy) bằng OpenZeppelin](https://dev.to/yakult/tutorial-write-upgradeable-smart-contract-proxy-contract-with-openzeppelin-1916) của fangjun.eth
+
+## Đọc thêm {#further-reading}
+
+- [Thực trạng Nâng cấp Hợp đồng thông minh](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/) của Santiago Palladino
+- [Nhiều cách để nâng cấp một hợp đồng thông minh Solidity](https://cryptomarketpool.com/multiple-ways-to-upgrade-a-solidity-smart-contract/) - blog của Crypto Market Pool
+- [Tìm hiểu: Nâng cấp Hợp đồng thông minh](https://docs.openzeppelin.com/learn/upgrading-smart-contracts) - Tài liệu OpenZeppelin
+- [Các Mẫu Proxy cho Khả năng Nâng cấp của Hợp đồng Solidity: Proxy Transparent so với UUPS](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) của Naveen Sahu
+- [Cách thức hoạt động của các bản nâng cấp Diamond](https://dev.to/mudgen/how-diamond-upgrades-work-417j) của Nick Mudge
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/verifying/index.md b/public/content/translations/vi/developers/docs/smart-contracts/verifying/index.md
new file mode 100644
index 00000000000..ebb081b07ba
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/smart-contracts/verifying/index.md
@@ -0,0 +1,113 @@
+---
+title: Xác minh hợp đồng thông minh
+description: Tổng quan về xác minh mã nguồn cho hợp đồng thông minh Ethereum
+lang: vi
+---
+
+[Hợp đồng thông minh](/developers/docs/smart-contracts/) được thiết kế để "không cần tin cậy", có nghĩa là người dùng không cần phải tin tưởng các bên thứ ba (ví dụ: nhà phát triển và công ty) trước khi tương tác với một hợp đồng. Là một điều kiện tiên quyết cho việc không cần tin cậy, người dùng và các nhà phát triển khác phải có khả năng xác minh mã nguồn của một hợp đồng thông minh. Việc xác minh mã nguồn đảm bảo cho người dùng và nhà phát triển rằng mã hợp đồng đã công bố giống với mã đang chạy tại địa chỉ hợp đồng trên chuỗi khối Ethereum.
+
+Điều quan trọng là phải phân biệt giữa "xác minh mã nguồn" và "[xác minh chính thức](/developers/docs/smart-contracts/formal-verification/)". Xác minh mã nguồn, sẽ được giải thích chi tiết bên dưới, đề cập đến việc xác minh rằng mã nguồn đã cho của một hợp đồng thông minh bằng ngôn ngữ cấp cao (ví dụ: Solidity) biên dịch thành cùng một chỉ thị biên dịch để được thực thi tại địa chỉ hợp đồng. Tuy nhiên, xác minh chính thức mô tả việc xác minh tính đúng đắn của một hợp đồng thông minh, có nghĩa là hợp đồng hoạt động như mong đợi. Mặc dù phụ thuộc vào ngữ cảnh, việc xác minh hợp đồng thường đề cập đến việc xác minh mã nguồn.
+
+## Xác minh mã nguồn là gì? {#what-is-source-code-verification}
+
+Trước khi triển khai một hợp đồng thông minh trong [Máy ảo Ethereum (EVM)](/developers/docs/evm/), các nhà phát triển [biên dịch](/developers/docs/smart-contracts/compiling/) mã nguồn của hợp đồng — các hướng dẫn [được viết bằng Solidity](/developers/docs/smart-contracts/languages/) hoặc một ngôn ngữ lập trình cấp cao khác — thành chỉ thị biên dịch. Vì EVM không thể diễn giải các hướng dẫn cấp cao, việc biên dịch mã nguồn thành chỉ thị biên dịch (tức là các hướng dẫn máy cấp thấp) là cần thiết để thực thi logic hợp đồng trong EVM.
+
+Xác minh mã nguồn là so sánh mã nguồn của một hợp đồng thông minh và chỉ thị biên dịch đã biên dịch được sử dụng trong quá trình tạo hợp đồng để phát hiện bất kỳ sự khác biệt nào. Việc xác minh hợp đồng thông minh là quan trọng vì mã hợp đồng được quảng cáo có thể khác với mã chạy trên chuỗi khối.
+
+Việc xác minh hợp đồng thông minh cho phép điều tra những gì một hợp đồng thực hiện thông qua ngôn ngữ cấp cao hơn mà nó được viết, mà không cần phải đọc mã máy. Các hàm, giá trị và thường là tên biến và nhận xét vẫn giống với mã nguồn gốc được biên dịch và triển khai. Điều này làm cho việc đọc mã dễ dàng hơn nhiều. Xác minh nguồn cũng cung cấp tài liệu tham khảo mã, để người dùng cuối biết hợp đồng thông minh được thiết kế để làm gì.
+
+### Xác minh đầy đủ là gì? {#full-verification}
+
+Có một số phần của mã nguồn không ảnh hưởng đến chỉ thị biên dịch đã biên dịch, chẳng hạn như nhận xét hoặc tên biến. Điều đó có nghĩa là hai mã nguồn có tên biến khác nhau và nhận xét khác nhau đều có thể xác minh cùng một hợp đồng. Với điều đó, một tác nhân độc hại có thể thêm các nhận xét lừa đảo hoặc đặt tên biến gây hiểu lầm bên trong mã nguồn và được xác minh hợp đồng với một mã nguồn khác với mã nguồn gốc.
+
+Có thể tránh điều này bằng cách nối thêm dữ liệu bổ sung vào chỉ thị biên dịch để làm _đảm bảo mật mã_ cho tính chính xác của mã nguồn và làm _dấu vân tay_ của thông tin biên dịch. Thông tin cần thiết được tìm thấy trong [siêu dữ liệu hợp đồng của Solidity](https://docs.soliditylang.org/en/v0.8.15/metadata.html), và hàm băm của tệp này được nối vào chỉ thị biên dịch của một hợp đồng. Bạn có thể thấy nó hoạt động trong [sân chơi siêu dữ liệu](https://playground.sourcify.dev)
+
+Tệp siêu dữ liệu chứa thông tin về việc biên dịch hợp đồng bao gồm các tệp nguồn và hàm băm của chúng. Nghĩa là, nếu bất kỳ cài đặt biên dịch nào hoặc thậm chí một byte trong một trong các tệp nguồn thay đổi, tệp siêu dữ liệu sẽ thay đổi. Do đó, hàm băm của tệp siêu dữ liệu, được nối vào chỉ thị biên dịch, cũng thay đổi. Điều đó có nghĩa là nếu chỉ thị biên dịch của hợp đồng + hàm băm siêu dữ liệu được nối vào khớp với mã nguồn và cài đặt biên dịch đã cho, chúng ta có thể chắc chắn rằng đây chính xác là cùng một mã nguồn được sử dụng trong quá trình biên dịch ban đầu, không có một byte nào khác.
+
+Loại xác minh này tận dụng hàm băm siêu dữ liệu được gọi là **"[xác minh đầy đủ](https://docs.sourcify.dev/docs/full-vs-partial-match/)"** (cũng là "xác minh hoàn hảo"). Nếu các hàm băm siêu dữ liệu không khớp hoặc không được xem xét trong quá trình xác minh, đó sẽ là một "kết quả khớp một phần", hiện là cách phổ biến hơn để xác minh hợp đồng. Có thể [chèn mã độc hại](https://samczsun.com/hiding-in-plain-sight/) mà sẽ không được phản ánh trong mã nguồn đã xác minh nếu không có xác minh đầy đủ. Hầu hết các nhà phát triển không biết về xác minh đầy đủ và không giữ tệp siêu dữ liệu của quá trình biên dịch của họ, do đó xác minh một phần đã là phương pháp trên thực tế để xác minh hợp đồng cho đến nay.
+
+## Tại sao việc xác minh mã nguồn lại quan trọng? {#importance-of-source-code-verification}
+
+### Tính không cần tin cậy {#trustlessness}
+
+Tính không cần tin cậy được cho là tiền đề lớn nhất cho các hợp đồng thông minh và [các ứng dụng phi tập trung (dapps)](/developers/docs/dapps/). Các hợp đồng thông minh là "bất biến" và không thể thay đổi; một hợp đồng sẽ chỉ thực thi logic kinh doanh được xác định trong mã tại thời điểm triển khai. Điều này có nghĩa là các nhà phát triển và doanh nghiệp không thể can thiệp vào mã của hợp đồng sau khi triển khai trên Ethereum.
+
+Để một hợp đồng thông minh không cần tin cậy, mã hợp đồng phải có sẵn để xác minh độc lập. Mặc dù chỉ thị biên dịch đã biên dịch cho mọi hợp đồng thông minh đều có sẵn công khai trên chuỗi khối, nhưng ngôn ngữ cấp thấp rất khó hiểu — đối với cả nhà phát triển và người dùng.
+
+Các dự án giảm bớt các giả định về sự tin cậy bằng cách công bố mã nguồn của các hợp đồng của họ. Nhưng điều này dẫn đến một vấn đề khác: rất khó để xác minh rằng mã nguồn đã xuất bản khớp với chỉ thị biên dịch của hợp đồng. Trong trường hợp này, giá trị của tính không cần tin cậy bị mất đi vì người dùng phải tin tưởng các nhà phát triển sẽ không thay đổi logic kinh doanh của hợp đồng (tức là bằng cách thay đổi chỉ thị biên dịch) trước khi triển khai nó trên chuỗi khối.
+
+Các công cụ xác minh mã nguồn cung cấp sự đảm bảo rằng các tệp mã nguồn của hợp đồng thông minh khớp với mã hợp ngữ. Kết quả là một hệ sinh thái không cần tin cậy, nơi người dùng không tin tưởng một cách mù quáng vào các bên thứ ba mà thay vào đó xác minh mã trước khi gửi tiền vào hợp đồng.
+
+### An toàn cho Người dùng {#user-safety}
+
+Với các hợp đồng thông minh, thường có rất nhiều tiền bị đe dọa. Điều này đòi hỏi sự đảm bảo an ninh cao hơn và xác minh logic của một hợp đồng thông minh trước khi sử dụng nó. Vấn đề là các nhà phát triển vô đạo đức có thể lừa dối người dùng bằng cách chèn mã độc hại vào một hợp đồng thông minh. Nếu không có xác minh, các hợp đồng thông minh độc hại có thể có [cửa hậu](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts), các cơ chế kiểm soát truy cập gây tranh cãi, các lỗ hổng có thể bị khai thác và những thứ khác gây nguy hiểm cho sự an toàn của người dùng mà không bị phát hiện.
+
+Việc công bố các tệp mã nguồn của một hợp đồng thông minh giúp những người quan tâm, chẳng hạn như kiểm toán viên, đánh giá hợp đồng để tìm các véc-tơ tấn công tiềm ẩn dễ dàng hơn. Với nhiều bên độc lập xác minh một hợp đồng thông minh, người dùng có sự đảm bảo mạnh mẽ hơn về tính bảo mật của nó.
+
+## Cách xác minh mã nguồn cho các hợp đồng thông minh Ethereum {#source-code-verification-for-ethereum-smart-contracts}
+
+[Việc triển khai một hợp đồng thông minh trên Ethereum](/developers/docs/smart-contracts/deploying/) yêu cầu gửi một giao dịch có tải trọng dữ liệu (chỉ thị biên dịch đã biên dịch) đến một địa chỉ đặc biệt. Tải trọng dữ liệu được tạo bằng cách biên dịch mã nguồn, cộng với các [đối số hàm khởi tạo](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) của phiên bản hợp đồng được nối vào tải trọng dữ liệu trong giao dịch. Biên dịch có tính xác định, có nghĩa là nó luôn tạo ra cùng một đầu ra (tức là chỉ thị biên dịch hợp đồng) nếu cùng một tệp nguồn và cài đặt biên dịch (ví dụ: phiên bản trình biên dịch, trình tối ưu hóa) được sử dụng.
+
+
+
+Việc xác minh một hợp đồng thông minh về cơ bản bao gồm các bước sau:
+
+1. Nhập các tệp nguồn và cài đặt biên dịch vào trình biên dịch.
+
+2. Trình biên dịch xuất ra chỉ thị biên dịch của hợp đồng
+
+3. Lấy chỉ thị biên dịch của hợp đồng đã triển khai tại một địa chỉ nhất định
+
+4. So sánh chỉ thị biên dịch đã triển khai với chỉ thị biên dịch đã biên dịch lại. Nếu các mã khớp nhau, hợp đồng sẽ được xác minh với mã nguồn và cài đặt biên dịch đã cho.
+
+5. Ngoài ra, nếu các hàm băm siêu dữ liệu ở cuối chỉ thị biên dịch khớp nhau, đó sẽ là một kết quả khớp hoàn toàn.
+
+Lưu ý rằng đây là một mô tả đơn giản về xác minh và có nhiều ngoại lệ sẽ không hoạt động với điều này, chẳng hạn như có [các biến bất biến](https://docs.sourcify.dev/docs/immutables/).
+
+## Các công cụ xác minh mã nguồn {#source-code-verification-tools}
+
+Quy trình xác minh hợp đồng truyền thống có thể phức tạp. Đây là lý do tại sao chúng tôi có các công cụ để xác minh mã nguồn cho các hợp đồng thông minh được triển khai trên Ethereum. Các công cụ này tự động hóa phần lớn quá trình xác minh mã nguồn và cũng quản lý các hợp đồng đã xác minh vì lợi ích của người dùng.
+
+### Etherscan {#etherscan}
+
+Mặc dù chủ yếu được biết đến như một [trình khám phá chuỗi khối Ethereum](/developers/docs/data-and-analytics/block-explorers/), Etherscan cũng cung cấp [dịch vụ xác minh mã nguồn](https://etherscan.io/verifyContract) cho các nhà phát triển và người dùng hợp đồng thông minh.
+
+Etherscan cho phép bạn biên dịch lại chỉ thị biên dịch của hợp đồng từ tải trọng dữ liệu gốc (mã nguồn, địa chỉ thư viện, cài đặt trình biên dịch, địa chỉ hợp đồng, v.v.) Nếu chỉ thị biên dịch được biên dịch lại được liên kết với chỉ thị biên dịch (và các tham số của hàm tạo) của hợp đồng trên chuỗi, thì [hợp đồng được xác minh](https://info.etherscan.com/types-of-contract-verification/).
+
+Sau khi được xác minh, mã nguồn của hợp đồng của bạn sẽ nhận được nhãn "Đã xác minh" và được xuất bản trên Etherscan để những người khác kiểm tra. Nó cũng được thêm vào phần [Hợp đồng đã xác minh](https://etherscan.io/contractsVerified/) — một kho lưu trữ các hợp đồng thông minh có mã nguồn đã được xác minh.
+
+Etherscan là công cụ được sử dụng nhiều nhất để xác minh hợp đồng. Tuy nhiên, việc xác minh hợp đồng của Etherscan có một nhược điểm: nó không thể so sánh **hàm băm siêu dữ liệu** của chỉ thị biên dịch trên chuỗi và chỉ thị biên dịch đã được biên dịch lại. Do đó, các kết quả trùng khớp trong Etherscan là các kết quả khớp một phần.
+
+[Tìm hiểu thêm về xác minh hợp đồng trên Etherscan](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327).
+
+### Blockscout {#blockscout}
+
+[Blockscout](https://blockscout.com/) là một trình khám phá chuỗi khối mã nguồn mở cũng cung cấp [dịch vụ xác minh hợp đồng](https://eth.blockscout.com/contract-verification) cho các nhà phát triển và người dùng hợp đồng thông minh. Là một giải pháp thay thế mã nguồn mở, Blockscout cung cấp sự minh bạch trong cách thực hiện xác minh và cho phép cộng đồng đóng góp để cải thiện quy trình xác minh.
+
+Tương tự như các dịch vụ xác minh khác, Blockscout cho phép bạn xác minh mã nguồn hợp đồng của mình bằng cách biên dịch lại chỉ thị biên dịch và so sánh nó với hợp đồng đã triển khai. Sau khi được xác minh, hợp đồng của bạn sẽ nhận được trạng thái xác minh và mã nguồn sẽ được công khai để kiểm tra và tương tác. Các hợp đồng đã xác minh cũng được liệt kê trong [kho lưu trữ hợp đồng đã xác minh](https://eth.blockscout.com/verified-contracts) của Blockscout để dễ dàng duyệt và khám phá.
+
+### Sourcify {#sourcify}
+
+[Sourcify](https://sourcify.dev/#/verifier) là một công cụ khác để xác minh các hợp đồng có mã nguồn mở và phi tập trung. Nó không phải là một trình khám phá khối và chỉ xác minh các hợp đồng trên [các mạng dựa trên EVM khác nhau](https://docs.sourcify.dev/docs/chains). Nó hoạt động như một cơ sở hạ tầng công cộng để các công cụ khác xây dựng trên đó, và nhằm mục đích cho phép các tương tác hợp đồng thân thiện với con người hơn bằng cách sử dụng [ABI](/developers/docs/smart-contracts/compiling/#web-applications) và các nhận xét [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html) được tìm thấy trong tệp siêu dữ liệu.
+
+Không giống như Etherscan, Sourcify hỗ trợ các kết quả khớp hoàn toàn với hàm băm siêu dữ liệu. Các hợp đồng đã xác minh được phục vụ trong [kho lưu trữ công khai](https://docs.sourcify.dev/docs/repository/) của nó trên HTTP và [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs), đây là một bộ lưu trữ phi tập trung, [có thể định địa chỉ nội dung](https://docs.storacha.network/concepts/content-addressing/). Điều này cho phép tìm nạp tệp siêu dữ liệu của hợp đồng qua IPFS vì hàm băm siêu dữ liệu được nối vào là một hàm băm IPFS.
+
+Ngoài ra, người ta cũng có thể truy xuất các tệp mã nguồn qua IPFS, vì các hàm băm IPFS của các tệp này cũng được tìm thấy trong siêu dữ liệu. Một hợp đồng có thể được xác minh bằng cách cung cấp tệp siêu dữ liệu và các tệp nguồn qua Giao diện Lập trình Ứng dụng của nó hoặc [Giao diện Người dùng](https://sourcify.dev/#/verifier), hoặc sử dụng các plugin. Công cụ giám sát của Sourcify cũng lắng nghe việc tạo hợp đồng trên các khối mới và cố gắng xác minh các hợp đồng nếu siêu dữ liệu và tệp nguồn của chúng được xuất bản trên IPFS.
+
+[Thông tin thêm về việc xác minh hợp đồng trên Sourcify](https://soliditylang.org/blog/2020/06/25/sourcify-faq/).
+
+### Tenderly {#tenderly}
+
+[Nền tảng Tenderly](https://tenderly.co/) cho phép các nhà phát triển Web3 xây dựng, kiểm tra, giám sát và vận hành các hợp đồng thông minh. Kết hợp các công cụ gỡ lỗi với khả năng quan sát và các khối xây dựng cơ sở hạ tầng, Tenderly giúp các nhà phát triển tăng tốc phát triển hợp đồng thông minh. Để kích hoạt đầy đủ các tính năng của Tenderly, các nhà phát triển cần [thực hiện xác minh mã nguồn](https://docs.tenderly.co/monitoring/contract-verification) bằng một số phương pháp.
+
+Có thể xác minh hợp đồng một cách riêng tư hoặc công khai. Nếu được xác minh riêng tư, hợp đồng thông minh chỉ hiển thị với bạn (và các thành viên khác trong dự án của bạn). Việc xác minh một hợp đồng công khai sẽ làm cho nó hiển thị với mọi người sử dụng nền tảng Tenderly.
+
+Bạn có thể xác minh các hợp đồng của mình bằng [Bảng điều khiển](https://docs.tenderly.co/contract-verification), [plugin Tenderly Hardhat](https://docs.tenderly.co/contract-verification/hardhat), hoặc [CLI](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli).
+
+Khi xác minh hợp đồng thông qua Bảng điều khiển, bạn cần nhập tệp nguồn hoặc tệp siêu dữ liệu được tạo bởi trình biên dịch Solidity, địa chỉ/mạng và cài đặt trình biên dịch.
+
+Sử dụng plugin Tenderly Hardhat cho phép kiểm soát nhiều hơn đối với quá trình xác minh với ít nỗ lực hơn, cho phép bạn lựa chọn giữa xác minh tự động (không cần mã) và thủ công (dựa trên mã).
+
+## Đọc thêm {#further-reading}
+
+- [Xác minh mã nguồn hợp đồng](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/)
diff --git a/public/content/translations/vi/developers/docs/standards/index.md b/public/content/translations/vi/developers/docs/standards/index.md
new file mode 100644
index 00000000000..7e94c71fa5d
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/standards/index.md
@@ -0,0 +1,59 @@
+---
+title: Tiêu chuẩn phát triển Ethereum
+description: Tìm hiểu về các tiêu chuẩn Ethereum, bao gồm EIPs, các tiêu chuẩn token như ERC-20 và ERC-721, cùng với các quy ước phát triển.
+lang: vi
+incomplete: true
+---
+
+## Tổng quan về các tiêu chuẩn {#standards-overview}
+
+Cộng đồng Ethereum đã áp dụng nhiều tiêu chuẩn giúp giữ cho các dự án (chẳng hạn như [máy khách Ethereum](/developers/docs/nodes-and-clients/) và ví) có thể tương tác giữa các lần triển khai và đảm bảo các hợp đồng thông minh và các ứng dụng phi tập trung vẫn có thể kết hợp được.
+
+Thông thường, các tiêu chuẩn được giới thiệu dưới dạng [Đề xuất Cải tiến Ethereum](/eips/) (EIP), được các thành viên cộng đồng thảo luận thông qua một [quy trình tiêu chuẩn](https://eips.ethereum.org/EIPS/eip-1).
+
+- [Giới thiệu về EIP](/eips/)
+- [Danh sách các EIP](https://eips.ethereum.org/)
+- [Kho lưu trữ GitHub của EIP](https://github.com/ethereum/EIPs)
+- [Bảng thảo luận EIP](https://ethereum-magicians.org/c/eips)
+- [Giới thiệu về Quản trị Ethereum](/governance/)
+- [Tổng quan về Quản trị Ethereum](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/ethereum-governance/) _Ngày 31 tháng 3 năm 2019 - Boris Mann_
+- [Quản trị Phát triển Giao thức Ethereum và Điều phối Nâng cấp Mạng lưới](https://hudsonjameson.com/posts/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) _Ngày 23 tháng 3 năm 2020 - Hudson Jameson_
+- [Danh sách phát tất cả các cuộc họp của Nhà phát triển cốt lõi Ethereum](https://www.youtube.com/@EthereumProtocol) _(Danh sách phát trên YouTube)_
+
+## Các loại tiêu chuẩn {#types-of-standards}
+
+Có 3 loại EIPs:
+
+- Standards Track: mô tả bất kỳ thay đổi nào ảnh hưởng đến hầu hết hoặc tất cả các khai triển Ethereum
+- [Lộ trình meta](https://eips.ethereum.org/meta): mô tả một quy trình xung quanh Ethereum hoặc đề xuất thay đổi một quy trình
+- [Lộ trình thông tin](https://eips.ethereum.org/informational): mô tả một vấn đề thiết kế của Ethereum hoặc cung cấp các hướng dẫn chung hoặc thông tin cho cộng đồng Ethereum
+
+Hơn nữa, Lộ trình Chuẩn được chia thành 4 loại:
+
+- [Cốt lõi](https://eips.ethereum.org/core): các cải tiến yêu cầu phân nhánh đồng thuận
+- [Mạng lưới](https://eips.ethereum.org/networking): các cải tiến xung quanh devp2p và Giao thức phụ Ethereum nhẹ, cũng như các cải tiến được đề xuất cho các thông số kỹ thuật giao thức mạng của whisper và swarm.
+- [Giao diện](https://eips.ethereum.org/interface): các cải tiến xung quanh các tiêu chuẩn và thông số kỹ thuật API/RPC của máy khách, và các tiêu chuẩn cấp ngôn ngữ nhất định như tên phương thức và ABI hợp đồng.
+- [ERC](https://eips.ethereum.org/erc): các tiêu chuẩn và quy ước cấp ứng dụng
+
+Thông tin chi tiết hơn về các loại và danh mục khác nhau này có thể được tìm thấy trong [EIP-1](https://eips.ethereum.org/EIPS/eip-1#eip-types)
+
+### Các tiêu chuẩn token {#token-standards}
+
+- [ERC-20](/developers/docs/standards/tokens/erc-20/) - Một giao diện tiêu chuẩn cho các token có thể thay thế (có thể hoán đổi cho nhau), như token biểu quyết, token cổ phần hoặc tiền ảo.
+ - [ERC-223](/developers/docs/standards/tokens/erc-223/) - Một tiêu chuẩn token có thể thay thế giúp các token hoạt động giống hệt như ether và hỗ trợ xử lý việc chuyển token ở phía người nhận.
+ - [ERC-1363](/developers/docs/standards/tokens/erc-1363/) - Một giao diện mở rộng cho các token ERC-20 hỗ trợ thực thi lệnh gọi lại trên các hợp đồng của người nhận trong một giao dịch duy nhất.
+- [ERC-721](/developers/docs/standards/tokens/erc-721/) - Một giao diện tiêu chuẩn cho các token không thể thay thế, như một chứng từ cho một tác phẩm nghệ thuật hoặc một bài hát.
+ - [ERC-2309](https://eips.ethereum.org/EIPS/eip-2309) - Một sự kiện được tiêu chuẩn hóa được phát ra khi tạo/chuyển một hoặc nhiều token không thể thay thế sử dụng các mã định danh token liên tiếp.
+ - [ERC-4400](https://eips.ethereum.org/EIPS/eip-4400) - Phần mở rộng giao diện cho vai trò người tiêu dùng EIP-721.
+ - [ERC-4907](https://eips.ethereum.org/EIPS/eip-4907) - Thêm một vai trò có giới hạn thời gian với các quyền hạn bị hạn chế cho các token ERC-721.
+- [ERC-777](/developers/docs/standards/tokens/erc-777/) - **(KHÔNG ĐƯỢC KHUYẾN NGHỊ)** Một tiêu chuẩn token cải tiến so với ERC-20.
+- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - Một tiêu chuẩn token có thể chứa cả tài sản có thể thay thế và không thể thay thế.
+- [ERC-4626](/developers/docs/standards/tokens/erc-4626/) - Một tiêu chuẩn kho vault được token hóa được thiết kế để tối ưu hóa và thống nhất các thông số kỹ thuật của các kho vault sinh lời.
+
+Tìm hiểu thêm về [các tiêu chuẩn token](/developers/docs/standards/tokens/).
+
+## Đọc thêm {#further-reading}
+
+- [Đề xuất Cải tiến Ethereum (EIP)](/eips/)
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
diff --git a/public/content/translations/vi/developers/docs/standards/tokens/erc-1155/index.md b/public/content/translations/vi/developers/docs/standards/tokens/erc-1155/index.md
new file mode 100644
index 00000000000..dbf8da44bb8
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/standards/tokens/erc-1155/index.md
@@ -0,0 +1,146 @@
+---
+title: Tiêu chuẩn Đa Token ERC-1155
+description: Tìm hiểu về ERC-1155, một tiêu chuẩn đa token kết hợp các token có thể thay thế và không thể thay thế trong một hợp đồng duy nhất.
+lang: vi
+---
+
+## Giới thiệu {#introduction}
+
+Một giao diện tiêu chuẩn cho các hợp đồng quản lý nhiều loại token. Một hợp đồng được triển khai duy nhất có thể bao gồm bất kỳ sự kết hợp nào của token có thể thay thế, token không thể thay thế hoặc các cấu hình khác (ví dụ: token bán thay thế).
+
+**Tiêu chuẩn Đa Token có nghĩa là gì?**
+
+Ý tưởng này rất đơn giản và tìm cách tạo ra một giao diện hợp đồng thông minh có thể đại diện và kiểm soát bất kỳ số lượng loại token có thể thay thế và không thể thay thế nào. Theo cách này, token ERC-1155 có thể thực hiện các chức năng tương tự như token [ERC-20](/developers/docs/standards/tokens/erc-20/) và [ERC-721](/developers/docs/standards/tokens/erc-721/), và thậm chí cả hai cùng một lúc. Nó cải thiện chức năng của cả hai tiêu chuẩn ERC-20 và ERC-721, giúp nó hiệu quả hơn và sửa chữa các lỗi triển khai rõ ràng.
+
+Token ERC-1155 được mô tả đầy đủ trong [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155).
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [các tiêu chuẩn token](/developers/docs/standards/tokens/), [ERC-20](/developers/docs/standards/tokens/erc-20/) và [ERC-721](/developers/docs/standards/tokens/erc-721/).
+
+## Các chức năng và tính năng của ERC-1155: {#body}
+
+- [Chuyển hàng loạt](#batch_transfers): Chuyển nhiều tài sản trong một lệnh gọi duy nhất.
+- [Số dư hàng loạt](#batch_balance): Lấy số dư của nhiều tài sản trong một lệnh gọi duy nhất.
+- [Phê duyệt hàng loạt](#batch_approval): Phê duyệt tất cả các token cho một địa chỉ.
+- [Hook](#receive_hook): Hook nhận token.
+- [Hỗ trợ NFT](#nft_support): Nếu nguồn cung chỉ là 1, hãy coi nó như một NFT.
+- [Quy tắc chuyển an toàn](#safe_transfer_rule): Bộ quy tắc để chuyển an toàn.
+
+### Chuyển hàng loạt {#batch-transfers}
+
+Việc chuyển hàng loạt hoạt động rất giống với các giao dịch chuyển ERC-20 thông thường. Hãy xem hàm `transferFrom` ERC-20 thông thường:
+
+```solidity
+// ERC-20
+function transferFrom(address from, address to, uint256 value) external returns (bool);
+
+// ERC-1155
+function safeBatchTransferFrom(
+ address _from,
+ address _to,
+ uint256[] calldata _ids,
+ uint256[] calldata _values,
+ bytes calldata _data
+) external;
+```
+
+Sự khác biệt duy nhất trong ERC-1155 là chúng ta chuyển các giá trị dưới dạng một mảng và chúng ta cũng chuyển một mảng các id. Ví dụ với `ids=[3, 6, 13]` và `values=[100, 200, 5]`, các giao dịch chuyển kết quả sẽ là
+
+1. Chuyển 100 token có id 3 từ `_from` đến `_to`.
+2. Chuyển 200 token có id 6 từ `_from` đến `_to`.
+3. Chuyển 5 token có id 13 từ `_from` đến `_to`.
+
+Trong ERC-1155, chúng ta chỉ có `transferFrom`, không có `transfer`. Để sử dụng nó như một `transfer` thông thường, chỉ cần đặt địa chỉ người gửi thành địa chỉ đang gọi hàm.
+
+### Số dư hàng loạt {#batch-balance}
+
+Lệnh gọi `balanceOf` ERC-20 tương ứng cũng có hàm đối tác với sự hỗ trợ hàng loạt. Xin nhắc lại, đây là phiên bản ERC-20:
+
+```solidity
+// ERC-20
+function balanceOf(address owner) external view returns (uint256);
+
+// ERC-1155
+function balanceOfBatch(
+ address[] calldata _owners,
+ uint256[] calldata _ids
+) external view returns (uint256[] memory);
+```
+
+Thậm chí còn đơn giản hơn đối với lệnh gọi số dư, chúng ta có thể truy xuất nhiều số dư trong một lệnh gọi duy nhất. Chúng ta chuyển mảng chủ sở hữu, tiếp theo là mảng id token.
+
+Ví dụ với `_ids=[3, 6, 13]` và `_owners=[0xbeef..., 0x1337..., 0x1111...]`, giá trị trả về sẽ là
+
+```solidity
+[
+ balanceOf(0xbeef...),
+ balanceOf(0x1337...),
+ balanceOf(0x1111...)
+]
+```
+
+### Phê duyệt hàng loạt {#batch-approval}
+
+```solidity
+// ERC-1155
+function setApprovalForAll(
+ address _operator,
+ bool _approved
+) external;
+
+function isApprovedForAll(
+ address _owner,
+ address _operator
+) external view returns (bool);
+```
+
+Việc phê duyệt hơi khác so với ERC-20. Thay vì phê duyệt các số lượng cụ thể, bạn đặt một nhà điều hành thành được phê duyệt hoặc không được phê duyệt thông qua `setApprovalForAll`.
+
+Việc đọc trạng thái hiện tại có thể được thực hiện thông qua `isApprovedForAll`. Như bạn có thể thấy, đó là một hoạt động tất cả hoặc không có gì. Bạn không thể xác định số lượng token cần phê duyệt hoặc thậm chí là lớp token nào.
+
+Điều này được thiết kế có chủ ý với mục tiêu đơn giản. Bạn chỉ có thể phê duyệt mọi thứ cho một địa chỉ.
+
+### Hook nhận {#receive-hook}
+
+```solidity
+function onERC1155BatchReceived(
+ address _operator,
+ address _from,
+ uint256[] calldata _ids,
+ uint256[] calldata _values,
+ bytes calldata _data
+) external returns(bytes4);
+```
+
+Với sự hỗ trợ của [EIP-165](https://eips.ethereum.org/EIPS/eip-165), ERC-1155 hỗ trợ các hook nhận chỉ dành cho các hợp đồng thông minh. Hàm hook phải trả về một giá trị bytes4 kỳ diệu được xác định trước, được đưa ra như sau:
+
+```solidity
+bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
+```
+
+Khi hợp đồng nhận trả về giá trị này, nghĩa là hợp đồng chấp nhận việc chuyển giao và biết cách xử lý các token ERC-1155. Tuyệt vời, không còn token bị kẹt trong hợp đồng nữa!
+
+### Hỗ trợ NFT {#nft-support}
+
+Khi nguồn cung chỉ là một, token về cơ bản là một token không thể thay thế (NFT). Và theo tiêu chuẩn của ERC-721, bạn có thể xác định một URL siêu dữ liệu. URL có thể được đọc và sửa đổi bởi các ứng dụng, xem [tại đây](https://eips.ethereum.org/EIPS/eip-1155#metadata).
+
+### Quy tắc chuyển an toàn {#safe-transfer-rule}
+
+Chúng ta đã đề cập đến một vài quy tắc chuyển an toàn trong các giải thích trước đó. Nhưng hãy xem xét các quy tắc quan trọng nhất:
+
+1. Người gọi phải được phê duyệt để chi tiêu các token cho địa chỉ `_from` hoặc người gọi phải bằng `_from`.
+2. Lệnh gọi chuyển phải hoàn nguyên nếu
+ 1. địa chỉ `_to` là 0.
+ 2. độ dài của `_ids` không giống với độ dài của `_values`.
+ 3. bất kỳ số dư nào của người nắm giữ đối với các token trong `_ids` thấp hơn số lượng tương ứng trong `_values` được gửi cho người nhận.
+ 4. bất kỳ lỗi nào khác xảy ra.
+
+_Lưu ý_: Tất cả các hàm hàng loạt bao gồm cả hook cũng tồn tại dưới dạng các phiên bản không có hàng loạt. Điều này được thực hiện để tiết kiệm gas, vì việc chuyển chỉ một tài sản có thể vẫn sẽ là cách được sử dụng phổ biến nhất. Chúng tôi đã bỏ qua chúng để cho đơn giản trong các giải thích, bao gồm cả các quy tắc chuyển an toàn. Tên giống hệt nhau, chỉ cần xóa 'Batch'.
+
+## Đọc thêm {#further-reading}
+
+- [EIP-1155: Tiêu chuẩn Đa Token](https://eips.ethereum.org/EIPS/eip-1155)
+- [ERC-1155: Tài liệu Openzeppelin](https://docs.openzeppelin.com/contracts/5.x/erc1155)
+- [ERC-1155: Repo GitHub](https://github.com/enjin/erc-1155)
+- [API NFT của Alchemy](https://www.alchemy.com/docs/reference/nft-api-quickstart)
diff --git a/public/content/translations/vi/developers/docs/standards/tokens/erc-1363/index.md b/public/content/translations/vi/developers/docs/standards/tokens/erc-1363/index.md
new file mode 100644
index 00000000000..42bf43fce9e
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/standards/tokens/erc-1363/index.md
@@ -0,0 +1,213 @@
+---
+title: Tiêu chuẩn Token có thể thanh toán ERC-1363
+description: ERC-1363 là một giao diện mở rộng cho các token ERC-20, hỗ trợ thực thi logic tùy chỉnh trên hợp đồng của người nhận sau khi chuyển token hoặc trên hợp đồng của người chi tiêu sau khi phê duyệt, tất cả chỉ trong một giao dịch duy nhất.
+lang: vi
+---
+
+## Giới thiệu {#introduction}
+
+### ERC-1363 là gì? {#what-is-erc1363}
+
+ERC-1363 là một giao diện mở rộng cho các token ERC-20, hỗ trợ thực thi logic tùy chỉnh trên hợp đồng của người nhận sau khi chuyển token hoặc trên hợp đồng của người chi tiêu sau khi phê duyệt, tất cả chỉ trong một giao dịch duy nhất.
+
+### Sự khác biệt so với ERC-20 {#erc20-differences}
+
+Các hoạt động ERC-20 tiêu chuẩn như `transfer`, `transferFrom` và `approve` không cho phép thực thi mã trên hợp đồng của người nhận hoặc người chi tiêu mà không cần một giao dịch riêng biệt.
+Điều này tạo ra sự phức tạp trong quá trình phát triển giao diện người dùng và rào cản trong việc áp dụng vì người dùng phải đợi giao dịch đầu tiên được thực thi rồi mới gửi giao dịch thứ hai.
+Họ cũng phải trả GAS hai lần.
+
+ERC-1363 giúp các token có thể thay thế thực hiện các hành động dễ dàng hơn và hoạt động mà không cần sử dụng bất kỳ trình lắng nghe ngoài chuỗi nào.
+Nó cho phép thực hiện một lệnh gọi lại trên hợp đồng của người nhận hoặc người chi tiêu, sau một lần chuyển hoặc một lần phê duyệt, trong một giao dịch duy nhất.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về:
+
+- [Các tiêu chuẩn của token](/developers/docs/standards/tokens/)
+- [ERC-20](/developers/docs/standards/tokens/erc-20/)
+
+## Nội dung {#body}
+
+ERC-1363 giới thiệu một Giao diện Lập trình Ứng dụng tiêu chuẩn cho các token ERC-20 để tương tác với các hợp đồng thông minh sau khi `transfer`, `transferFrom` hoặc `approve`.
+
+Tiêu chuẩn này cung cấp chức năng cơ bản để chuyển token, cũng như cho phép token được phê duyệt để chúng có thể được chi tiêu bởi một bên thứ ba khác trên chuỗi, và sau đó thực hiện một lệnh gọi lại trên hợp đồng của người nhận hoặc người chi tiêu.
+
+Có nhiều mục đích sử dụng được đề xuất của các hợp đồng thông minh có thể chấp nhận các lệnh gọi lại ERC-20.
+
+Các ví dụ có thể là:
+
+- **Bán token huy động vốn**: token được gửi đi sẽ kích hoạt việc phân bổ phần thưởng ngay lập tức.
+- **Dịch vụ**: thanh toán kích hoạt quyền truy cập dịch vụ trong một bước.
+- **Hóa đơn**: token tự động thanh toán hóa đơn.
+- **Đăng ký**: việc phê duyệt mức phí hàng năm sẽ kích hoạt đăng ký trong khoản thanh toán của tháng đầu tiên.
+
+Vì những lý do này, nó ban đầu được đặt tên là **"Token có thể thanh toán"**.
+
+Hành vi gọi lại còn mở rộng hơn nữa tiện ích của nó, cho phép các tương tác liền mạch như:
+
+- **Góp cổ phần**: token được chuyển sẽ kích hoạt việc khóa tự động trong một hợp đồng góp cổ phần.
+- **Bỏ phiếu**: token nhận được sẽ ghi nhận phiếu bầu trong một hệ thống quản trị.
+- **Hoán đổi**: việc phê duyệt token sẽ kích hoạt logic hoán đổi trong một bước duy nhất.
+
+Các token ERC-1363 có thể được sử dụng cho các tiện ích cụ thể trong mọi trường hợp yêu cầu thực thi một lệnh gọi lại sau khi nhận được một lần chuyển hoặc một lần phê duyệt.
+ERC-1363 cũng hữu ích để tránh mất token hoặc khóa token trong các hợp đồng thông minh bằng cách xác minh khả năng xử lý token của người nhận.
+
+Không giống như các đề xuất mở rộng ERC-20 khác, ERC-1363 không ghi đè các phương thức `transfer` và `transferFrom` của ERC-20 và xác định các ID giao diện cần được triển khai để duy trì khả năng tương thích ngược với ERC-20.
+
+Từ [EIP-1363](https://eips.ethereum.org/EIPS/eip-1363):
+
+### Các phương thức {#methods}
+
+Các hợp đồng thông minh triển khai tiêu chuẩn ERC-1363 **PHẢI** triển khai tất cả các hàm trong giao diện `ERC1363`, cũng như các giao diện `ERC20` và `ERC165`.
+
+```solidity
+pragma solidity ^0.8.0;
+
+/**
+ * @title ERC1363
+ * @dev Một giao diện mở rộng cho các token ERC-20 hỗ trợ thực thi mã trên hợp đồng của người nhận
+ * sau `transfer` hoặc `transferFrom`, hoặc mã trên hợp đồng của người chi tiêu sau `approve`, trong một giao dịch duy nhất.
+ */
+interface ERC1363 is ERC20, ERC165 {
+ /*
+ * LƯU Ý: mã định danh ERC-165 cho giao diện này là 0xb0202a11.
+ * 0xb0202a11 ===
+ * bytes4(keccak256('transferAndCall(address,uint256)')) ^
+ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
+ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
+ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
+ * bytes4(keccak256('approveAndCall(address,uint256)')) ^
+ * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
+ */
+
+ /**
+ * @dev Di chuyển một lượng token `value` từ tài khoản của người gọi đến `to`
+ * và sau đó gọi `ERC1363Receiver::onTransferReceived` trên `to`.
+ * @param to Địa chỉ mà token đang được chuyển đến.
+ * @param value Số lượng token sẽ được chuyển.
+ * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
+ */
+ function transferAndCall(address to, uint256 value) external returns (bool);
+
+ /**
+ * @dev Di chuyển một lượng token `value` từ tài khoản của người gọi đến `to`
+ * và sau đó gọi `ERC1363Receiver::onTransferReceived` trên `to`.
+ * @param to Địa chỉ mà token đang được chuyển đến.
+ * @param value Số lượng token sẽ được chuyển.
+ * @param data Dữ liệu bổ sung không có định dạng cụ thể, được gửi trong lệnh gọi đến `to`.
+ * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
+ */
+ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
+
+ /**
+ * @dev Di chuyển một lượng token `value` từ `from` đến `to` bằng cơ chế cho phép
+ * và sau đó gọi `ERC1363Receiver::onTransferReceived` trên `to`.
+ * @param from Địa chỉ gửi token.
+ * @param to Địa chỉ mà token đang được chuyển đến.
+ * @param value Số lượng token sẽ được chuyển.
+ * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
+ */
+ function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
+
+ /**
+ * @dev Di chuyển một lượng token `value` từ `from` đến `to` bằng cơ chế cho phép
+ * và sau đó gọi `ERC1363Receiver::onTransferReceived` trên `to`.
+ * @param from Địa chỉ gửi token.
+ * @param to Địa chỉ mà token đang được chuyển đến.
+ * @param value Số lượng token sẽ được chuyển.
+ * @param data Dữ liệu bổ sung không có định dạng cụ thể, được gửi trong lệnh gọi đến `to`.
+ * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
+ */
+ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
+
+ /**
+ * @dev Đặt một lượng token `value` làm mức cho phép của `spender` đối với token của người gọi
+ * và sau đó gọi `ERC1363Spender::onApprovalReceived` trên `spender`.
+ * @param spender Địa chỉ sẽ chi tiêu số tiền.
+ * @param value Số lượng token sẽ được chi tiêu.
+ * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
+ */
+ function approveAndCall(address spender, uint256 value) external returns (bool);
+
+ /**
+ * @dev Đặt một lượng token `value` làm mức cho phép của `spender` đối với token của người gọi
+ * và sau đó gọi `ERC1363Spender::onApprovalReceived` trên `spender`.
+ * @param spender Địa chỉ sẽ chi tiêu số tiền.
+ * @param value Số lượng token sẽ được chi tiêu.
+ * @param data Dữ liệu bổ sung không có định dạng cụ thể, được gửi trong lệnh gọi đến `spender`.
+ * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
+ */
+ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
+}
+
+interface ERC20 {
+ event Transfer(address indexed from, address indexed to, uint256 value);
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+ function transfer(address to, uint256 value) external returns (bool);
+ function transferFrom(address from, address to, uint256 value) external returns (bool);
+ function approve(address spender, uint256 value) external returns (bool);
+ function totalSupply() external view returns (uint256);
+ function balanceOf(address account) external view returns (uint256);
+ function allowance(address owner, address spender) external view returns (uint256);
+}
+
+interface ERC165 {
+ function supportsInterface(bytes4 interfaceId) external view returns (bool);
+}
+```
+
+Một hợp đồng thông minh muốn chấp nhận token ERC-1363 thông qua `transferAndCall` hoặc `transferFromAndCall` **PHẢI** triển khai giao diện `ERC1363Receiver`:
+
+```solidity
+/**
+ * @title ERC1363Receiver
+ * @dev Giao diện cho bất kỳ hợp đồng nào muốn hỗ trợ `transferAndCall` hoặc `transferFromAndCall` từ các hợp đồng token ERC-1363.
+ */
+interface ERC1363Receiver {
+ /**
+ * @dev Bất cứ khi nào token ERC-1363 được chuyển đến hợp đồng này qua `ERC1363::transferAndCall` hoặc `ERC1363::transferFromAndCall`
+ * bởi `operator` từ `from`, hàm này sẽ được gọi.
+ *
+ * LƯU Ý: Để chấp nhận việc chuyển, hàm này phải trả về
+ * `bytes4(keccak256(\"onTransferReceived(address,address,uint256,bytes)\"))`
+ * (tức là 0x88a7ca5c, hoặc bộ chọn hàm của chính nó).
+ *
+ * @param operator Địa chỉ đã gọi hàm `transferAndCall` hoặc `transferFromAndCall`.
+ * @param from Địa chỉ mà từ đó token được chuyển đi.
+ * @param value Số lượng token được chuyển.
+ * @param data Dữ liệu bổ sung không có định dạng cụ thể.
+ * @return `bytes4(keccak256(\"onTransferReceived(address,address,uint256,bytes)\"))` nếu việc chuyển được cho phép trừ khi có lỗi.
+ */
+ function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);
+}
+```
+
+Một hợp đồng thông minh muốn chấp nhận token ERC-1363 thông qua `approveAndCall` **PHẢI** triển khai giao diện `ERC1363Spender`:
+
+```solidity
+/**
+ * @title ERC1363Spender
+ * @dev Giao diện cho bất kỳ hợp đồng nào muốn hỗ trợ `approveAndCall` từ các hợp đồng token ERC-1363.
+ */
+interface ERC1363Spender {
+ /**
+ * @dev Bất cứ khi nào một `owner` token ERC-1363 phê duyệt hợp đồng này qua `ERC1363::approveAndCall`
+ * để chi tiêu token của họ, hàm này sẽ được gọi.
+ *
+ * LƯU Ý: Để chấp nhận việc phê duyệt, hàm này phải trả về
+ * `bytes4(keccak256(\"onApprovalReceived(address,uint256,bytes)\"))`
+ * (tức là 0x7b04a2d0, hoặc bộ chọn hàm của chính nó).
+ *
+ * @param owner Địa chỉ đã gọi hàm `approveAndCall` và trước đây đã sở hữu các token.
+ * @param value Số lượng token sẽ được chi tiêu.
+ * @param data Dữ liệu bổ sung không có định dạng cụ thể.
+ * @return `bytes4(keccak256(\"onApprovalReceived(address,uint256,bytes)\"))` nếu việc phê duyệt được cho phép trừ khi có lỗi.
+ */
+ function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);
+}
+```
+
+## Đọc thêm {#further-reading}
+
+- [ERC-1363: Tiêu chuẩn Token có thể thanh toán](https://eips.ethereum.org/EIPS/eip-1363)
+- [ERC-1363: Kho lưu trữ GitHub](https://github.com/vittominacori/erc1363-payable-token)
diff --git a/public/content/translations/vi/developers/docs/standards/tokens/erc-20/index.md b/public/content/translations/vi/developers/docs/standards/tokens/erc-20/index.md
new file mode 100644
index 00000000000..692c68567f2
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/standards/tokens/erc-20/index.md
@@ -0,0 +1,187 @@
+---
+title: Tiêu chuẩn token ERC-20
+description: Tìm hiểu về ERC-20, tiêu chuẩn cho các token có thể thay thế trên Ethereum, cho phép các ứng dụng token tương thích với nhau.
+lang: vi
+---
+
+## Giới thiệu {#introduction}
+
+**Token là gì?**
+
+Token đại diện cho bất kỳ thứ gì trên Ethereum:
+
+- Điểm danh tiếng trên nền tảng online
+- Kỹ năng của nhân vật trong game
+- Tài sản tài chính như cổ phần của một công ty
+- Tiền pháp định như USD chẳng hạn
+- Một ounce vàng (khoảng 31 gram)
+- và nhiều thứ khác
+
+Một tính năng mạnh mẽ như vậy của Ethereum chắc chắn phải được quản lý bằng một tiêu chuẩn vững chắc, đúng chứ? Đó chính xác là những gì ERC-20 đang thực hiện. Tiêu chuẩn này cho phép các nhà phát triển xây dựng các ứng dụng token có khả năng tương tác với các sản phẩm và dịch vụ khác. Tiêu chuẩn ERC-20 cũng được sử dụng để cung cấp chức năng bổ sung cho [ether](/glossary/#ether).
+
+**ERC-20 là gì?**
+
+ERC-20 đặt ra một tiêu chuẩn cho các token có thể thay thế, nghĩa là mỗi token
+giống hệt nhau về loại và giá trị. Ví dụ, một Token ERC-20 hoạt động giống như ETH, có nghĩa là 1 Token luôn và sẽ luôn bằng tất cả các Token khác.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+- [Tài khoản](/developers/docs/accounts)
+- [Hợp đồng thông minh](/developers/docs/smart-contracts/)
+- [Các tiêu chuẩn của token](/developers/docs/standards/tokens/)
+
+## Nội dung {#body}
+
+ERC-20 (Ethereum Requests for Comments 20), được dự thảo bởi Fabian Vogelsteller vào tháng 11/2015, là một tiêu chuẩn token thực thi API cho token trong Hợp đồng Thông minh.
+
+Ví dụ một số chức năng ERC-20 cung cấp:
+
+- gửi các token từ một tài khoản này đến một tài khoản khác
+- lấy thông tin số lượng token của tài khoản
+- lấy tổng cung của token đang có trên mạng
+- phê duyệt xem tài khoản của bên thứ ba có thể sử dụng token từ tài khoản hay không
+
+Nếu một Hợp đồng Thông minh có thể thực thi các phương thức và sự kiện bên dưới, chúng được gọi là Hợp đồng Token ERC-20, khi triển khai, chúng sẽ có trách nhiệm duy trì các token được tạo trên Ethereum.
+
+Từ [EIP-20](https://eips.ethereum.org/EIPS/eip-20):
+
+### Các phương thức {#methods}
+
+```solidity
+function name() public view returns (string)
+function symbol() public view returns (string)
+function decimals() public view returns (uint8)
+function totalSupply() public view returns (uint256)
+function balanceOf(address _owner) public view returns (uint256 balance)
+function transfer(address _to, uint256 _value) public returns (bool success)
+function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
+function approve(address _spender, uint256 _value) public returns (bool success)
+function allowance(address _owner, address _spender) public view returns (uint256 remaining)
+```
+
+### Sự kiện {#events}
+
+```solidity
+event Transfer(address indexed _from, address indexed _to, uint256 _value)
+event Approval(address indexed _owner, address indexed _spender, uint256 _value)
+```
+
+### Ví dụ {#web3py-example}
+
+Hãy xem Tiêu chuẩn quan trọng như thế nào để giúp mọi thứ trở nên đơn giản với chúng ta khi kiểm tra Hợp đồng Token ERC-20 trên Ethereum.
+Chúng ta chỉ cần Contract Application Binary Interface (ABI), để tạo ra giao diện một token ERC-20 bất kỳ. Như bạn cũng thấy ở dưới, chúng ta sẽ dùng một ABI đơn giản, khiến nó trở thành một ví dụ có tính ma sát thấp.
+
+#### Ví dụ về Web3.py {#web3py-example}
+
+Đầu tiên, hãy đảm bảo rằng bạn đã cài đặt thư viện Python [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation):
+
+```
+pip install web3
+```
+
+```python
+from web3 import Web3
+
+
+w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
+
+dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI
+weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Ether được bọc (WETH)
+
+acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2
+
+# Đây là Giao diện nhị phân ứng dụng (ABI) hợp đồng được đơn giản hóa của một Hợp đồng Token ERC-20.
+# Nó sẽ chỉ hiển thị các phương thức: balanceOf(address), decimals(), symbol() và totalSupply()
+simplified_abi = [
+ {
+ 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],
+ 'name': 'balanceOf',
+ 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
+ 'stateMutability': 'view', 'type': 'function', 'constant': True
+ },
+ {
+ 'inputs': [],
+ 'name': 'decimals',
+ 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
+ 'stateMutability': 'view', 'type': 'function', 'constant': True
+ },
+ {
+ 'inputs': [],
+ 'name': 'symbol',
+ 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
+ 'stateMutability': 'view', 'type': 'function', 'constant': True
+ },
+ {
+ 'inputs': [],
+ 'name': 'totalSupply',
+ 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
+ 'stateMutability': 'view', 'type': 'function', 'constant': True
+ }
+]
+
+dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)
+symbol = dai_contract.functions.symbol().call()
+decimals = dai_contract.functions.decimals().call()
+totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals
+addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals
+
+# DAI
+print("===== %s =====" % symbol)
+print("Total Supply:", totalSupply)
+print("Addr Balance:", addr_balance)
+
+weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)
+symbol = weth_contract.functions.symbol().call()
+decimals = weth_contract.functions.decimals().call()
+totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals
+addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals
+
+# WETH
+print("===== %s =====" % symbol)
+print("Total Supply:", totalSupply)
+print("Addr Balance:", addr_balance)
+```
+
+## Các vấn đề đã biết {#erc20-issues}
+
+### Sự cố nhận token ERC-20 {#reception-issue}
+
+**Tính đến ngày 20/06/2024, ít nhất 83.656.418 USD giá trị token ERC-20 đã bị mất do sự cố này. Lưu ý rằng việc triển khai ERC-20 thuần túy dễ gặp phải vấn đề này trừ khi bạn triển khai một tập hợp các hạn chế bổ sung bên trên tiêu chuẩn như được liệt kê dưới đây.**
+
+Khi các token ERC-20 được gửi đến một hợp đồng thông minh không được thiết kế để xử lý các token ERC-20, những token đó có thể bị mất vĩnh viễn. Điều này xảy ra bởi vì hợp đồng nhận không có chức năng nhận diện hoặc phản hồi với các token đến, và không có cơ chế nào trong tiêu chuẩn ERC-20 để thông báo cho hợp đồng nhận về các token được gửi đến. Lý do chính mà vấn đề này thể hiện là qua:
+
+1. Cơ chế chuyển đổi token
+
+- Các token ERC-20 được chuyển đổi bằng cách sử dụng các hàm transfer hoặc transferFrom.
+ - Khi một người dùng gửi token đến địa chỉ hợp đồng bằng cách sử dụng những hàm này, token sẽ được chuyển giao bất kể hợp đồng nhận có được thiết kế để xử lý chúng hay không.
+
+2. Thất thoát thông báo
+ - Hợp đồng nhận không nhận thông báo hoặc cuộc gọi lại rằng các token đã được gửi đến nó.
+ - Nếu hợp đồng nhận thiếu cơ chế để xử lý token (ví dụ: một hàm fallback hoặc một hàm chuyên dụng để quản lý việc nhận token), các token sẽ bị mắc kẹt trong địa chỉ của hợp đồng.
+3. Không tích hợp xử lý sẵn
+ - Chuẩn ERC-20 không có một hàm bắt buộc nào cho các hợp đồng nhận tiền phải thực hiện, dẫn đến việc nhiều hợp đồng không thể quản lý các token đến một cách đúng đắn.
+
+**Các giải pháp khả thi**
+
+Mặc dù không thể ngăn chặn hoàn toàn vấn đề này với ERC-20, nhưng có vài cách cho phép giảm đáng kể khả năng mất tokens cho người dùng:
+
+- Vấn đề phổ biến nhất là khi người dùng gửi token đến chính địa chỉ hợp đồng token (ví dụ: USDT được gửi vào địa chỉ của hợp đồng token USDT). Khuyến nghị hạn chế hàm `transfer(...)` để hoàn tác các nỗ lực chuyển tiền như vậy. Cân nhắc thêm kiểm tra `require(_to != address(this));` trong quá trình triển khai hàm `transfer(...)`.
+- Nhìn chung, hàm `transfer(...)` không được thiết kế để gửi token vào các hợp đồng. `chấp thuận(..) Thay vào đó, mẫu `transferFrom(...)`được sử dụng để gửi token ERC-20 vào các hợp đồng. Có thể hạn chế hàm`transfer(...)`để không cho phép gửi token vào bất kỳ hợp đồng nào bằng hàm đó, tuy nhiên, điều này có thể phá vỡ tính tương thích với các hợp đồng giả định rằng token có thể được gửi vào các hợp đồng bằng hàm`trasnfer(...)\` (ví dụ: các bể thanh khoản Uniswap).
+- Luôn luôn giả định rằng các token ERC-20 có thể xuất hiện trong hợp đồng của bạn, ngay cả khi hợp đồng của bạn không được thiết kế để nhận bất kỳ token nào. Không thể ngăn chặn hoặc từ chối các khoản tiền gửi không mong muốn từ phía người nhận. Nên thực hiện một chức năng cho phép trích xuất các token ERC-20 được gửi nhầm.
+- Hãy xem xét việc sử dụng các chuẩn token khác.
+
+Một số tiêu chuẩn thay thế đã ra đời từ vấn đề này, chẳng hạn như [ERC-223](/developers/docs/standards/tokens/erc-223) hoặc [ERC-1363](/developers/docs/standards/tokens/erc-1363).
+
+## Đọc thêm {#further-reading}
+
+- [EIP-20: Tiêu chuẩn Token ERC-20](https://eips.ethereum.org/EIPS/eip-20)
+- [OpenZeppelin - Token](https://docs.openzeppelin.com/contracts/3.x/tokens#ERC20)
+- [OpenZeppelin - Triển khai ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)
+- [Alchemy - Hướng dẫn về Token ERC20 trong Solidity](https://www.alchemy.com/overviews/erc20-solidity)
+
+## Các tiêu chuẩn token có thể thay thế khác {#fungible-token-standards}
+
+- [ERC-223](/developers/docs/standards/tokens/erc-223)
+- [ERC-1363](/developers/docs/standards/tokens/erc-1363)
+- [ERC-777](/developers/docs/standards/tokens/erc-777)
+- [ERC-4626 - Kho tiền được token hóa](/developers/docs/standards/tokens/erc-4626)
diff --git a/public/content/translations/vi/developers/docs/standards/tokens/erc-223/index.md b/public/content/translations/vi/developers/docs/standards/tokens/erc-223/index.md
new file mode 100644
index 00000000000..1eedc2fb0a0
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/standards/tokens/erc-223/index.md
@@ -0,0 +1,198 @@
+---
+title: Tiêu chuẩn token ERC-223
+description: Tổng quan về tiêu chuẩn token có thể thay thế ERC-223, cách hoạt động của nó và so sánh với ERC-20.
+lang: vi
+---
+
+## Giới thiệu {#introduction}
+
+### ERC-223 là gì? {#what-is-erc223}
+
+ERC-223 là một tiêu chuẩn cho các token có thể thay thế, tương tự như tiêu chuẩn ERC-20. Sự khác biệt chính là ERC-223 không chỉ xác định API của token mà còn cả logic để chuyển token từ người gửi đến người nhận. Nó giới thiệu một mô hình giao tiếp cho phép các lần chuyển token được xử lý ở phía người nhận.
+
+### Sự khác biệt so với ERC-20 {#erc20-differences}
+
+ERC-223 giải quyết một số hạn chế của ERC-20 và giới thiệu một phương thức tương tác mới giữa hợp đồng token và hợp đồng có thể nhận các token. Có một vài điều có thể thực hiện với ERC-223 nhưng không thể với ERC-20:
+
+- Xử lý việc chuyển token ở phía người nhận: Người nhận có thể phát hiện rằng một token ERC-223 đang được gửi vào.
+- Từ chối các token được gửi không đúng cách: Nếu người dùng gửi token ERC-223 đến một hợp đồng không được cho là sẽ nhận token, hợp đồng có thể từ chối giao dịch, ngăn chặn việc mất token.
+- Siêu dữ liệu trong các lần chuyển: Các token ERC-223 có thể bao gồm siêu dữ liệu, cho phép đính kèm thông tin tùy ý vào các giao dịch token.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+- [Tài khoản](/developers/docs/accounts)
+- [Hợp đồng thông minh](/developers/docs/smart-contracts/)
+- [Các tiêu chuẩn của token](/developers/docs/standards/tokens/)
+- [ERC-20](/developers/docs/standards/tokens/erc-20/)
+
+## Nội dung {#body}
+
+ERC-223 là một tiêu chuẩn token triển khai một API cho các token trong các hợp đồng thông minh. Nó cũng khai báo một API cho các hợp đồng được cho là sẽ nhận token ERC-223. Các hợp đồng không hỗ trợ API Người nhận ERC-223 không thể nhận các token ERC-223, ngăn ngừa lỗi từ người dùng.
+
+Nếu một hợp đồng thông minh triển khai các phương thức và sự kiện sau đây, nó có thể được gọi là một hợp đồng token tương thích với ERC-223. Sau khi được triển khai, nó
+sẽ chịu trách nhiệm theo dõi các token được tạo trên Ethereum.
+
+Hợp đồng không bắt buộc chỉ có các hàm này và một nhà phát triển có thể thêm bất kỳ tính năng nào khác từ các tiêu chuẩn token khác vào hợp đồng này. Ví dụ: các hàm `approve` và `transferFrom` không phải là một phần của tiêu chuẩn ERC-223 nhưng các hàm này có thể được triển khai nếu cần thiết.
+
+Từ [EIP-223](https://eips.ethereum.org/EIPS/eip-223):
+
+### Các phương thức {#methods}
+
+Token ERC-223 phải triển khai các phương thức sau:
+
+```solidity
+function name() public view returns (string)
+function symbol() public view returns (string)
+function decimals() public view returns (uint8)
+function totalSupply() public view returns (uint256)
+function balanceOf(address _owner) public view returns (uint256 balance)
+function transfer(address _to, uint256 _value) public returns (bool success)
+function transfer(address _to, uint256 _value, bytes calldata _data) public returns (bool success)
+```
+
+Một hợp đồng được cho là sẽ nhận token ERC-223 phải triển khai phương thức sau:
+
+```solidity
+function tokenReceived(address _from, uint _value, bytes calldata _data)
+```
+
+Nếu các token ERC-223 được gửi đến một hợp đồng không triển khai hàm `tokenReceived(..)`, thì việc chuyển phải thất bại và các token không được di chuyển khỏi số dư của người gửi.
+
+### Sự kiện {#events}
+
+```solidity
+event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes calldata _data)
+```
+
+### Ví dụ {#examples}
+
+API của token ERC-223 tương tự như của ERC-20, vì vậy từ quan điểm phát triển giao diện người dùng (UI) thì không có sự khác biệt. Ngoại lệ duy nhất ở đây là các token ERC-223 có thể không có các hàm `approve` + `transferFrom` vì chúng là tùy chọn cho tiêu chuẩn này.
+
+#### Các ví dụ về Solidity {#solidity-example}
+
+Ví dụ sau đây minh họa cách hoạt động của một hợp đồng token ERC-223 cơ bản:
+
+```solidity
+pragma solidity ^0.8.19;
+abstract contract IERC223Recipient {
+ function tokenReceived(address _from, uint _value, bytes memory _data) public virtual;
+}
+contract VeryBasicERC223Token {
+ event Transfer(address indexed from, address indexed to, uint value, bytes data);
+ string private _name;
+ string private _symbol;
+ uint8 private _decimals;
+ uint256 private _totalSupply;
+ mapping(address => uint256) private balances;
+ function name() public view returns (string memory) { return _name; }
+ function symbol() public view returns (string memory) {return _symbol; }
+ function decimals() public view returns (uint8) { return _decimals; }
+ function totalSupply() public view returns (uint256) { return _totalSupply; }
+ function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; }
+ function isContract(address account) internal view returns (bool) {
+ uint256 size;
+ assembly { size := extcodesize(account) }
+ return size > 0;
+ }
+ function transfer(address _to, uint _value, bytes calldata _data) public returns (bool success){
+ balances[msg.sender] = balances[msg.sender] - _value;
+ balances[_to] = balances[_to] + _value;
+ if(isContract(_to)) {
+ IERC223Recipient(_to).tokenReceived(msg.sender, _value, _data);
+ }
+ emit Transfer(msg.sender, _to, _value, _data);
+ return true;
+ }
+ function transfer(address _to, uint _value) public returns (bool success){
+ bytes memory _empty = hex"00000000";
+ balances[msg.sender] = balances[msg.sender] - _value;
+ balances[_to] = balances[_to] + _value;
+ if(isContract(_to)) {
+ IERC223Recipient(_to).tokenReceived(msg.sender, _value, _empty);
+ }
+ emit Transfer(msg.sender, _to, _value, _empty);
+ return true;
+ }
+}
+```
+
+Bây giờ chúng ta muốn một hợp đồng khác chấp nhận các khoản tiền gửi `tokenA` giả sử rằng tokenA là một token ERC-223. Hợp đồng phải chỉ chấp nhận tokenA và từ chối mọi token khác. Khi hợp đồng nhận tokenA, nó phải phát ra một sự kiện `Deposit()` và tăng giá trị của biến nội bộ `deposits`.
+
+Đây là mã:
+
+```solidity
+contract RecipientContract is IERC223Recipient {
+ event Deposit(address whoSentTheTokens);
+ uint256 deposits = 0;
+ address tokenA; // Token duy nhất mà chúng ta muốn chấp nhận.
+ function tokenReceived(address _from, uint _value, bytes memory _data) public override
+ {
+ // Điều quan trọng là phải hiểu rằng trong hàm này
+ // msg.sender là địa chỉ của token đang được nhận,
+ // msg.value luôn là 0 vì hợp đồng token không sở hữu hoặc gửi ether trong hầu hết các trường hợp,
+ // _from là người gửi của lần chuyển token,
+ // _value là số lượng token đã được gửi.
+ require(msg.sender == tokenA);
+ deposits += _value;
+ emit Deposit(_from);
+ }
+}
+```
+
+## Những câu hỏi thường gặp {#faq}
+
+### Điều gì sẽ xảy ra nếu chúng ta gửi một số tokenB đến hợp đồng? {#sending-tokens}
+
+Giao dịch sẽ thất bại, và việc chuyển token sẽ không xảy ra. Các token sẽ được trả lại cho địa chỉ của người gửi.
+
+### Làm thế nào chúng ta có thể gửi tiền vào hợp đồng này? {#contract-deposits}
+
+Gọi hàm `transfer(address,uint256)` hoặc `transfer(address,uint256,bytes)` của token ERC-223, chỉ định địa chỉ của `RecipientContract`.
+
+### Điều gì sẽ xảy ra nếu chúng ta chuyển một token ERC-20 đến hợp đồng này? {#erc-20-transfers}
+
+Nếu một token ERC-20 được gửi đến `RecipientContract`, các token sẽ được chuyển, nhưng việc chuyển sẽ không được công nhận (không có sự kiện `Deposit()` nào được kích hoạt, và giá trị tiền gửi sẽ không thay đổi). Các khoản tiền gửi ERC-20 không mong muốn không thể được lọc hoặc ngăn chặn.
+
+### Điều gì sẽ xảy ra nếu chúng ta muốn thực thi một hàm nào đó sau khi việc gửi token hoàn tất? {#function-execution}
+
+Có nhiều cách để làm điều đó. Trong ví dụ này, chúng ta sẽ làm theo phương pháp khiến cho các lần chuyển ERC-223 giống hệt như các lần chuyển ether:
+
+```solidity
+contract RecipientContract is IERC223Recipient {
+ event Foo();
+ event Bar(uint256 someNumber);
+ address tokenA; // Token duy nhất mà chúng ta muốn chấp nhận.
+ function tokenReceived(address _from, uint _value, bytes memory _data) public override
+ {
+ require(msg.sender == tokenA);
+ address(this).call(_data); // Xử lý giao dịch đến và thực hiện một lệnh gọi hàm tiếp theo.
+ }
+ function foo() public
+ {
+ emit Foo();
+ }
+ function bar(uint256 _someNumber) public
+ {
+ emit Bar(_someNumber);
+ }
+}
+```
+
+Khi `RecipientContract` nhận được một token ERC-223, hợp đồng sẽ thực thi một hàm được mã hóa dưới dạng tham số `_data` của giao dịch token, giống hệt như cách các giao dịch ether mã hóa các lệnh gọi hàm dưới dạng `data` giao dịch. Đọc [trường dữ liệu](/developers/docs/transactions/#the-data-field) để biết thêm thông tin.
+
+Trong ví dụ trên, một token ERC-223 phải được chuyển đến địa chỉ của `RecipientContract` bằng hàm `transfer(address,uin256,bytes calldata _data)`. Nếu tham số dữ liệu là `0xc2985578` (chữ ký của hàm `foo()`), thì hàm foo() sẽ được gọi sau khi nhận được tiền gửi token và sự kiện Foo() sẽ được kích hoạt.
+
+Các tham số cũng có thể được mã hóa trong `data` của lần chuyển token, ví dụ: chúng ta có thể gọi hàm bar() với giá trị 12345 cho `_someNumber`. Trong trường hợp này, `data` phải là `0x0423a13200000000000000000000000000000000000000000000000000000000000004d2`, trong đó `0x0423a132` là chữ ký của hàm `bar(uint256)` và `00000000000000000000000000000000000000000000000000000000000004d2` là 12345 dưới dạng uint256.
+
+## Các hạn chế {#limitations}
+
+Mặc dù ERC-223 giải quyết một số vấn đề được tìm thấy trong tiêu chuẩn ERC-20, nó không phải là không có những hạn chế riêng:
+
+- Việc áp dụng và tính tương thích: ERC-223 vẫn chưa được áp dụng rộng rãi, điều này có thể hạn chế khả năng tương thích của nó với các công cụ và nền tảng hiện có.
+- Khả năng tương thích ngược: ERC-223 không tương thích ngược với ERC-20, nghĩa là các hợp đồng và công cụ ERC-20 hiện có sẽ không hoạt động với các token ERC-223 nếu không có sửa đổi.
+- Chi phí gas: Các kiểm tra và chức năng bổ sung trong các lần chuyển ERC-223 có thể dẫn đến chi phí gas cao hơn so với các giao dịch ERC-20.
+
+## Đọc thêm {#further-reading}
+
+- [EIP-223: Tiêu chuẩn token ERC-223](https://eips.ethereum.org/EIPS/eip-223)
+- [Đề xuất ERC-223 ban đầu](https://github.com/ethereum/eips/issues/223)
diff --git a/public/content/translations/vi/developers/docs/standards/tokens/erc-4626/index.md b/public/content/translations/vi/developers/docs/standards/tokens/erc-4626/index.md
new file mode 100644
index 00000000000..45922f7f3d1
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/standards/tokens/erc-4626/index.md
@@ -0,0 +1,227 @@
+---
+title: Tiêu chuẩn Kho lưu trữ Token hóa ERC-4626
+description: Một tiêu chuẩn cho các kho lưu trữ sinh lợi.
+lang: vi
+---
+
+## Giới thiệu {#introduction}
+
+ERC-4626 là một tiêu chuẩn để tối ưu hóa và thống nhất các thông số kỹ thuật của các kho lưu trữ sinh lợi. Nó cung cấp một API tiêu chuẩn cho các kho lưu trữ sinh lợi được token hóa, đại diện cho các phần của một token ERC-20 cơ sở duy nhất. ERC-4626 cũng nêu ra một phần mở rộng tùy chọn cho các kho lưu trữ được token hóa sử dụng ERC-20, cung cấp chức năng cơ bản để gửi, rút token và đọc số dư.
+
+**Vai trò của ERC-4626 trong các kho lưu trữ sinh lợi**
+
+Các thị trường cho vay, các công cụ tổng hợp và các token có lãi suất nội tại giúp người dùng tìm được lợi suất tốt nhất trên các token tiền mã hóa của họ bằng cách thực hiện các chiến lược khác nhau. Các chiến lược này được thực hiện với những biến thể nhỏ, có thể dễ bị lỗi hoặc lãng phí tài nguyên phát triển.
+
+ERC-4626 trong các kho lưu trữ sinh lợi sẽ giảm bớt công sức tích hợp và mở khóa quyền truy cập vào lợi suất trong các ứng dụng khác nhau với ít nỗ lực chuyên môn hóa từ các nhà phát triển bằng cách tạo ra các mẫu triển khai nhất quán và mạnh mẽ hơn.
+
+Token ERC-4626 được mô tả đầy đủ trong [EIP-4626](https://eips.ethereum.org/EIPS/eip-4626).
+
+**Phần mở rộng kho lưu trữ không đồng bộ (ERC-7540)**
+
+ERC-4626 được tối ưu hóa cho các khoản tiền gửi và quy đổi nguyên tử lên đến một giới hạn. Nếu đạt đến giới hạn, không thể gửi thêm các khoản tiền gửi hoặc quy đổi mới. Hạn chế này không hoạt động tốt đối với bất kỳ hệ thống hợp đồng thông minh nào có các hành động không đồng bộ hoặc độ trễ là điều kiện tiên quyết để giao tiếp với Kho lưu trữ (ví dụ: các giao thức tài sản trong thế giới thực, các giao thức cho vay dưới thế chấp, các giao thức cho vay chuỗi chéo, các token staking thanh khoản hoặc các mô-đun an toàn bảo hiểm).
+
+ERC-7540 mở rộng tiện ích của Kho lưu trữ ERC-4626 cho các trường hợp sử dụng không đồng bộ. Giao diện Kho lưu trữ hiện có (`deposit`/`withdraw`/`mint`/`redeem`) được tận dụng hoàn toàn để yêu cầu các Yêu cầu không đồng bộ.
+
+Phần mở rộng ERC-7540 được mô tả đầy đủ trong [ERC-7540](https://eips.ethereum.org/EIPS/eip-7540).
+
+**Phần mở rộng kho lưu trữ đa tài sản (ERC-7575)**
+
+Một trường hợp sử dụng bị thiếu không được ERC-4626 hỗ trợ là các Kho lưu trữ có nhiều tài sản hoặc điểm vào chẳng hạn như token nhà cung cấp thanh khoản (LP). Chúng thường khó sử dụng hoặc không tuân thủ do yêu cầu của ERC-4626 phải là một ERC-20.
+
+ERC-7575 bổ sung hỗ trợ cho các Kho lưu trữ có nhiều tài sản bằng cách bên ngoài hóa việc triển khai token ERC-20 từ việc triển khai ERC-4626.
+
+Phần mở rộng ERC-7575 được mô tả đầy đủ trong [ERC-7575](https://eips.ethereum.org/EIPS/eip-7575).
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [các tiêu chuẩn token](/developers/docs/standards/tokens/) và [ERC-20](/developers/docs/standards/tokens/erc-20/).
+
+## Các hàm và Tính năng của ERC-4626: {#body}
+
+### Các phương thức {#methods}
+
+#### tài sản {#asset}
+
+```solidity
+function asset() public view returns (address assetTokenAddress)
+```
+
+Hàm này trả về địa chỉ của token cơ sở được sử dụng cho kho lưu trữ để hạch toán, gửi tiền, rút tiền.
+
+#### tổng tài sản {#totalassets}
+
+```solidity
+function totalAssets() public view returns (uint256)
+```
+
+Hàm này trả về tổng số lượng tài sản cơ sở do kho lưu trữ nắm giữ.
+
+#### chuyển đổi thành cổ phần {#convertoshares}
+
+```solidity
+function convertToShares(uint256 assets) public view returns (uint256 shares)
+```
+
+Hàm này trả về số lượng `cổ phần` sẽ được kho lưu trữ trao đổi cho số lượng `tài sản` được cung cấp.
+
+#### chuyển đổi thành tài sản {#convertoassets}
+
+```solidity
+function convertToAssets(uint256 shares) public view returns (uint256 assets)
+```
+
+Hàm này trả về số lượng `tài sản` sẽ được kho lưu trữ trao đổi cho số lượng `cổ phần` được cung cấp.
+
+#### gửi tiền tối đa {#maxdeposit}
+
+```solidity
+function maxDeposit(address receiver) public view returns (uint256 maxAssets)
+```
+
+Hàm này trả về số lượng tối đa tài sản cơ sở có thể được gửi trong một lệnh gọi [`gửi tiền`](#deposit) duy nhất, với các cổ phần được đúc cho `người nhận`.
+
+#### xem trước khi gửi tiền {#previewdeposit}
+
+```solidity
+function previewDeposit(uint256 assets) public view returns (uint256 shares)
+```
+
+Hàm này cho phép người dùng mô phỏng các tác động của việc gửi tiền của họ tại khối hiện tại.
+
+#### gửi tiền {#deposit}
+
+```solidity
+function deposit(uint256 assets, address receiver) public returns (uint256 shares)
+```
+
+Hàm này gửi `tài sản` của các token cơ sở vào kho lưu trữ và cấp quyền sở hữu `cổ phần` cho `người nhận`.
+
+#### đúc tối đa {#maxmint}
+
+```solidity
+function maxMint(address receiver) public view returns (uint256 maxShares)
+```
+
+Hàm này trả về số lượng cổ phần tối đa có thể được đúc trong một lệnh gọi [`đúc`](#mint) duy nhất, với các cổ phần được đúc cho `người nhận`.
+
+#### xem trước khi đúc {#previewmint}
+
+```solidity
+function previewMint(uint256 shares) public view returns (uint256 assets)
+```
+
+Hàm này cho phép người dùng mô phỏng các tác động của việc đúc của họ tại khối hiện tại.
+
+#### đúc {#mint}
+
+```solidity
+function mint(uint256 shares, address receiver) public returns (uint256 assets)
+```
+
+Hàm này đúc chính xác `cổ phần` kho lưu trữ cho `người nhận` bằng cách gửi `tài sản` của các token cơ sở.
+
+#### rút tối đa {#maxwithdraw}
+
+```solidity
+function maxWithdraw(address owner) public view returns (uint256 maxAssets)
+```
+
+Hàm này trả về số lượng tối đa tài sản cơ sở có thể được rút từ số dư của `chủ sở hữu` bằng một lệnh gọi [`rút`](#withdraw) duy nhất.
+
+#### xem trước khi rút {#previewwithdraw}
+
+```solidity
+function previewWithdraw(uint256 assets) public view returns (uint256 shares)
+```
+
+Hàm này cho phép người dùng mô phỏng các tác động của việc rút tiền của họ tại khối hiện tại.
+
+#### rút {#withdraw}
+
+```solidity
+function withdraw(uint256 assets, address receiver, address owner) public returns (uint256 shares)
+```
+
+Hàm này đốt `cổ phần` từ `chủ sở hữu` và gửi chính xác token `tài sản` từ kho lưu trữ đến `người nhận`.
+
+#### quy đổi tối đa {#maxredeem}
+
+```solidity
+function maxRedeem(address owner) public view returns (uint256 maxShares)
+```
+
+Hàm này trả về số lượng cổ phần tối đa có thể được quy đổi từ số dư của `chủ sở hữu` thông qua một lệnh gọi [`quy đổi`](#redeem).
+
+#### xem trước khi quy đổi {#previewredeem}
+
+```solidity
+function previewRedeem(uint256 shares) public view returns (uint256 assets)
+```
+
+Hàm này cho phép người dùng mô phỏng các tác động của việc quy đổi của họ tại khối hiện tại.
+
+#### quy đổi {#redeem}
+
+```solidity
+function redeem(uint256 shares, address receiver, address owner) public returns (uint256 assets)
+```
+
+Hàm này quy đổi một số lượng `cổ phần` cụ thể từ `chủ sở hữu` và gửi `tài sản` của token cơ sở từ kho lưu trữ đến `người nhận`.
+
+#### tổng cung {#totalsupply}
+
+```solidity
+function totalSupply() public view returns (uint256)
+```
+
+Trả về tổng số lượng cổ phần kho lưu trữ chưa được quy đổi đang lưu hành.
+
+#### số dư của {#balanceof}
+
+```solidity
+function balanceOf(address owner) public view returns (uint256)
+```
+
+Trả về tổng số lượng cổ phần kho lưu trữ mà `chủ sở hữu` hiện có.
+
+### Sơ đồ giao diện {#mapOfTheInterface}
+
+
+
+### Sự kiện {#events}
+
+#### Sự kiện Gửi tiền
+
+**PHẢI** được phát ra khi các token được gửi vào kho lưu trữ thông qua các phương thức [`đúc`](#mint) và [`gửi tiền`](#deposit).
+
+```solidity
+event Deposit(
+ address indexed sender,
+ address indexed owner,
+ uint256 assets,
+ uint256 shares
+)
+```
+
+Trong đó `người gửi` là người dùng đã trao đổi `tài sản` lấy `cổ phần` và đã chuyển những `cổ phần` đó cho `chủ sở hữu`.
+
+#### Sự kiện Rút tiền
+
+**PHẢI** được phát ra khi cổ phần được rút từ kho lưu trữ bởi một người gửi tiền trong các phương thức [`quy đổi`](#redeem) hoặc [`rút`](#withdraw).
+
+```solidity
+event Withdraw(
+ address indexed sender,
+ address indexed receiver,
+ address indexed owner,
+ uint256 assets,
+ uint256 shares
+)
+```
+
+Trong đó `người gửi` là người dùng đã kích hoạt việc rút tiền và trao đổi `cổ phần` do `chủ sở hữu` sở hữu lấy `tài sản`. `người nhận` là người dùng đã nhận `tài sản` đã rút.
+
+## Đọc thêm {#further-reading}
+
+- [EIP-4626: Tiêu chuẩn kho lưu trữ được token hóa](https://eips.ethereum.org/EIPS/eip-4626)
+- [ERC-4626: Kho lưu trữ GitHub](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol)
diff --git a/public/content/translations/vi/developers/docs/standards/tokens/erc-721/index.md b/public/content/translations/vi/developers/docs/standards/tokens/erc-721/index.md
new file mode 100644
index 00000000000..333e4bec883
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/standards/tokens/erc-721/index.md
@@ -0,0 +1,254 @@
+---
+title: Tiêu chuẩn Token Không Phân tách ERC-721
+description: Tìm hiểu thêm về ERC-62, chuẩn NFT đại diện cho tài sản kỹ thuật số độc đáo trên Ethereum.
+lang: vi
+---
+
+## Giới thiệu {#introduction}
+
+**NFT (Non-Fungible Token, hay Token không thể thay thế) là gì?**
+
+Token không thể thay thế (NFT) được dùng để xác định một thứ gì đó hoặc ai đó theo một cách độc nhất. Loại Token này rất phù hợp để sử dụng trên các nền tảng cung cấp các mặt hàng sưu tầm, chìa khóa truy cập, vé xổ số, chỗ ngồi có số cho các buổi hòa nhạc và các trận thể thao, v.v. Tiểu token đặc biệt này có khả năng kinh ngạc, và để tiêu chuẩn hóa tài sản, ERC-721 sẽ giúp chúng xử lý vấn đề này.
+
+**ERC-721 là gì?**
+
+ERC-721 trình bày các tiêu chuẩn NFT, nói cách khác, kiểu token này là duy nhất và có những giá trị khác nhau mà các token khác không có, dù chúng cùng Hợp đồng Thông Minh, có thể do tuổi tác, độ hiếm, hay thậm chí là thứ gì đó về bề ngoài.
+Đợi đã, bề ngoài?
+
+Vâng! Tất cả các NFT đều có một biến `uint256` gọi là `tokenId`, vì vậy đối với bất kỳ Hợp đồng ERC-721 nào, cặp
+`địa chỉ hợp đồng, uint256 tokenId` phải là duy nhất trên toàn cầu. Dù vậy, một ứng dụng phi tập trung có thể có một "bộ chuyển đổi" sử dụng `tokenId` làm đầu vào và cho ra hình ảnh của một thứ gì đó thú vị, như thây ma, vũ khí, kỹ năng hoặc những chú mèo tuyệt vời!
+
+## Điều kiện tiên quyết {#prerequisites}
+
+- [Tài khoản](/developers/docs/accounts/)
+- [Hợp đồng thông minh](/developers/docs/smart-contracts/)
+- [Các tiêu chuẩn của token](/developers/docs/standards/tokens/)
+
+## Nội dung {#body}
+
+ERC-721 (Ethereum Request for Comments 721) được đề xuất bởi William Entriken, Dieter Shirley, Jacod Evans, Nastassia Sachs vào tháng 1 năm 2018, là một Tiêu chuẩn Token Không phân tách, thực hiện API cho các tokens trong các Hợp đồng Thông minh.
+
+Nó cung cấp các chức năng như chuyển token từ tài khoản này sang tài khoản khác, lấy số dư token hiện tại của một
+tài khoản, lấy chủ sở hữu của một token cụ thể và cả tổng cung của token có sẵn trên mạng.
+Bên cạnh đó, nó cũng có một vài tính năng như chấp thuận lượng token từ tài khoản có thể di chuyển bởi tài khoản bên thứ 3.
+
+Nếu một Hợp đồng Thông minh có thể thực thi các phương thức và sự kiện bên dưới, chúng được gọi là Hợp đồng Token Không phân tách ERC-721, khi triển khai, chúng sẽ có trách nhiệm duy trì các token được tạo trên Ethereum.
+
+Từ [EIP-721](https://eips.ethereum.org/EIPS/eip-721):
+
+### Các phương thức {#methods}
+
+```solidity
+ function balanceOf(address _owner) external view returns (uint256);
+ function ownerOf(uint256 _tokenId) external view returns (address);
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
+ function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
+ function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
+ function approve(address _approved, uint256 _tokenId) external payable;
+ function setApprovalForAll(address _operator, bool _approved) external;
+ function getApproved(uint256 _tokenId) external view returns (address);
+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
+```
+
+### Sự kiện {#events}
+
+```solidity
+ event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
+ event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
+ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
+```
+
+### Ví dụ {#web3py-example}
+
+Hãy xem Tiêu chuẩn quan trọng như thế nào để giúp mọi thứ trở nên đơn giản với chúng ta khi kiểm tra Hợp đồng Token Không phân tách ERC-721 trên Ethereum.
+Chúng ta chỉ cần Contract Application Binary Interface (ABI), để tạo ra giao diện một token ERC-721 bất kỳ. Như bạn cũng thấy ở dưới, chúng ta sẽ dùng một ABI đơn giản, khiến nó trở thành một ví dụ có tính ma sát thấp.
+
+#### Ví dụ về Web3.py {#web3py-example}
+
+Đầu tiên, hãy đảm bảo rằng bạn đã cài đặt thư viện Python [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation):
+
+```
+pip install web3
+```
+
+```python
+from web3 import Web3
+from web3._utils.events import get_event_data
+
+
+w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
+
+ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # Hợp đồng CryptoKitties
+
+acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Bán Đấu giá CryptoKitties
+
+# Đây là một Giao diện nhị phân ứng dụng (ABI) hợp đồng đơn giản hóa của một Hợp đồng NFT ERC-721.
+# Nó sẽ chỉ hiển thị các phương thức: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply()
+simplified_abi = [
+ {
+ 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}],
+ 'name': 'balanceOf',
+ 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
+ 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
+ },
+ {
+ 'inputs': [],
+ 'name': 'name',
+ 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
+ 'stateMutability': 'view', 'type': 'function', 'constant': True
+ },
+ {
+ 'inputs': [{'internalType': 'uint256', 'name': 'tokenId', 'type': 'uint256'}],
+ 'name': 'ownerOf',
+ 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}],
+ 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
+ },
+ {
+ 'inputs': [],
+ 'name': 'symbol',
+ 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
+ 'stateMutability': 'view', 'type': 'function', 'constant': True
+ },
+ {
+ 'inputs': [],
+ 'name': 'totalSupply',
+ 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
+ 'stateMutability': 'view', 'type': 'function', 'constant': True
+ },
+]
+
+ck_extra_abi = [
+ {
+ 'inputs': [],
+ 'name': 'pregnantKitties',
+ 'outputs': [{'name': '', 'type': 'uint256'}],
+ 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
+ },
+ {
+ 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],
+ 'name': 'isPregnant',
+ 'outputs': [{'name': '', 'type': 'bool'}],
+ 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
+ }
+]
+
+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()
+print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}")
+
+pregnant_kitties = ck_contract.functions.pregnantKitties().call()
+print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")
+
+# Sử dụng ABI Sự kiện Chuyển để nhận thông tin về các Kitty đã được chuyển.
+tx_event_abi = {
+ 'anonymous': False,
+ 'inputs': [
+ {'indexed': False, 'name': 'from', 'type': 'address'},
+ {'indexed': False, 'name': 'to', 'type': 'address'},
+ {'indexed': False, 'name': 'tokenId', 'type': 'uint256'}],
+ 'name': 'Transfer',
+ 'type': 'event'
+}
+
+# Chúng ta cần chữ ký của sự kiện để lọc nhật ký
+event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()
+
+logs = w3.eth.get_logs({
+ "fromBlock": w3.eth.block_number - 120,
+ "address": w3.to_checksum_address(ck_token_addr),
+ "topics": [event_signature]
+})
+
+# Lưu ý:
+# - Tăng số khối lên từ 120 nếu không có sự kiện Chuyển nào được trả về.
+# - Nếu bạn không tìm thấy bất kỳ sự kiện Chuyển nào, bạn cũng có thể thử lấy tokenId tại:
+# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events
+# Nhấp để mở rộng nhật ký của sự kiện và sao chép đối số "tokenId" của nó
+recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]
+
+if recent_tx:
+ kitty_id = recent_tx[0]['tokenId'] # Dán "tokenId" từ liên kết trên vào đây
+ is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()
+ print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}")
+```
+
+Hợp đồng CryptoKitties có vài Sự kiện thú vị hơn các hợp đồng Tiêu chuẩn
+
+Hãy kiểm tra hai trong số chúng, `Pregnant` và `Birth`.
+
+```python
+# Sử dụng ABI Sự kiện Mang thai và Sinh để nhận thông tin về các Kitty mới.
+ck_extra_events_abi = [
+ {
+ 'anonymous': False,
+ 'inputs': [
+ {'indexed': False, 'name': 'owner', 'type': 'address'},
+ {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
+ {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
+ {'indexed': False, 'name': 'cooldownEndBlock', 'type': 'uint256'}],
+ 'name': 'Pregnant',
+ 'type': 'event'
+ },
+ {
+ 'anonymous': False,
+ 'inputs': [
+ {'indexed': False, 'name': 'owner', 'type': 'address'},
+ {'indexed': False, 'name': 'kittyId', 'type': 'uint256'},
+ {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
+ {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
+ {'indexed': False, 'name': 'genes', 'type': 'uint256'}],
+ 'name': 'Birth',
+ 'type': 'event'
+ }]
+
+# Chúng ta cần chữ ký của sự kiện để lọc nhật ký
+ck_event_signatures = [
+ w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(),
+ w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),
+]
+
+# Đây là một Sự kiện Mang thai:
+# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog
+pregnant_logs = w3.eth.get_logs({
+ "fromBlock": w3.eth.block_number - 120,
+ "address": w3.to_checksum_address(ck_token_addr),
+ "topics": [ck_event_signatures[0]]
+})
+
+recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]
+
+# Đây là một Sự kiện Sinh:
+# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a
+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]
+```
+
+## Các NFT phổ biến {#popular-nfts}
+
+- [Etherscan NFT Tracker](https://etherscan.io/nft-top-contracts) liệt kê các NFT hàng đầu trên Ethereum theo khối lượng chuyển nhượng.
+- [CryptoKitties](https://www.cryptokitties.co/) là một trò chơi tập trung vào các sinh vật có thể nhân giống, sưu tầm và vô cùng đáng yêu mà chúng ta gọi là CryptoKitties.
+- [Sorare](https://sorare.com/) là một trò chơi bóng đá giả tưởng toàn cầu, nơi bạn có thể thu thập các vật phẩm sưu tầm phiên bản giới hạn,
+ quản lý đội của mình và thi đấu để giành giải thưởng.
+- [Dịch vụ Định danh Ethereum (ENS)](https://ens.domains/) cung cấp một cách an toàn và phi tập trung để định địa chỉ các tài nguyên cả
+ trong và ngoài chuỗi khối bằng cách sử dụng các tên đơn giản, con người có thể đọc được.
+- [POAP](https://poap.xyz) cung cấp NFT miễn phí cho những người tham dự sự kiện hoặc hoàn thành các hành động cụ thể. POAP có thể được tạo và phân phối miễn phí.
+- [Unstoppable Domains](https://unstoppabledomains.com/) là một công ty có trụ sở tại San Francisco chuyên xây dựng các tên miền trên
+ chuỗi khối. Các tên miền chuỗi khối thay thế các địa chỉ tiền mã hóa bằng các tên mà con người có thể đọc được và có thể được sử dụng để cho phép các
+ trang web chống kiểm duyệt.
+- [Gods Unchained Cards](https://godsunchained.com/) là một TCG (Trò chơi thẻ bài giao dịch) trên chuỗi khối Ethereum, sử dụng NFT để mang lại quyền sở hữu thực sự
+ cho các tài sản trong trò chơi.
+- [Bored Ape Yacht Club](https://boredapeyachtclub.com) là một bộ sưu tập gồm 10.000 NFT độc nhất. Đây vừa là một tác phẩm nghệ thuật hiếm có thể chứng minh được, vừa hoạt động như một token thành viên của câu lạc bộ, cung cấp các đặc quyền và lợi ích cho thành viên, những lợi ích này sẽ tăng dần theo thời gian nhờ vào nỗ lực của cộng đồng.
+
+## Đọc thêm {#further-reading}
+
+- [EIP-721: Tiêu chuẩn Token không thể thay thế ERC-721](https://eips.ethereum.org/EIPS/eip-721)
+- [OpenZeppelin - Tài liệu ERC-721](https://docs.openzeppelin.com/contracts/3.x/erc721)
+- [OpenZeppelin - Triển khai ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol)
+- [API NFT của Alchemy](https://www.alchemy.com/docs/reference/nft-api-quickstart)
diff --git a/public/content/translations/vi/developers/docs/standards/tokens/erc-777/index.md b/public/content/translations/vi/developers/docs/standards/tokens/erc-777/index.md
new file mode 100644
index 00000000000..d812382776d
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/standards/tokens/erc-777/index.md
@@ -0,0 +1,45 @@
+---
+title: Tiêu chuẩn token ERC-777
+description: Tìm hiểu về ERC-777, một tiêu chuẩn token có thể thay thế được cải tiến với các hook, mặc dù ERC-20 được khuyến nghị vì lý do bảo mật.
+lang: vi
+---
+
+## Cảnh báo {#warning}
+
+**ERC-777 khó triển khai đúng cách, do tính dễ bị tổn thương trước [các hình thức tấn công khác nhau](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2620). Bạn nên sử dụng [ERC-20](/developers/docs/standards/tokens/erc-20/) thay thế.** Trang này được lưu giữ như một tài liệu lưu trữ lịch sử.
+
+## Giới thiệu? {#introduction}
+
+ERC-777 là một tiêu chuẩn token có thể thay thế nhằm cải tiến tiêu chuẩn [ERC-20](/developers/docs/standards/tokens/erc-20/) hiện có.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về [ERC-20](/developers/docs/standards/tokens/erc-20/).
+
+## ERC-777 đề xuất những cải tiến nào so với ERC-20? {#-erc-777-vs-erc-20}
+
+ERC-777 cung cấp những cải tiến sau so với ERC-20.
+
+### Hook {#hooks}
+
+Hook là một hàm được mô tả trong mã của một hợp đồng thông minh. Các hook được gọi khi token được gửi hoặc nhận thông qua hợp đồng. Điều này cho phép một hợp đồng thông minh phản ứng với các token đến hoặc đi.
+
+Các hook được đăng ký và phát hiện bằng cách sử dụng tiêu chuẩn [ERC-1820](https://eips.ethereum.org/EIPS/eip-1820).
+
+#### Tại sao hook lại tuyệt vời? {#why-are-hooks-great}
+
+1. Hook cho phép gửi token đến một hợp đồng và thông báo cho hợp đồng đó trong một giao dịch duy nhất, không giống như [ERC-20](https://eips.ethereum.org/EIPS/eip-20), vốn yêu cầu một lệnh gọi kép (`approve`/`transferFrom`) để đạt được điều này.
+2. Các hợp đồng chưa đăng ký hook sẽ không tương thích với ERC-777. Hợp đồng gửi sẽ hủy giao dịch khi hợp đồng nhận chưa đăng ký hook. Điều này ngăn chặn việc chuyển khoản vô tình đến các hợp đồng thông minh không phải ERC-777.
+3. Hook có thể từ chối các giao dịch.
+
+### Số thập phân {#decimals}
+
+Tiêu chuẩn này cũng giải quyết sự nhầm lẫn xung quanh `decimals` gây ra trong ERC-20. Sự rõ ràng này cải thiện trải nghiệm của nhà phát triển.
+
+### Khả năng tương thích ngược với ERC-20 {#backwards-compatibility-with-erc-20}
+
+Các hợp đồng ERC-777 có thể được tương tác như thể chúng là các hợp đồng ERC-20.
+
+## Đọc thêm {#further-reading}
+
+[EIP-777: Tiêu chuẩn Token](https://eips.ethereum.org/EIPS/eip-777)
diff --git a/public/content/translations/vi/developers/docs/standards/tokens/index.md b/public/content/translations/vi/developers/docs/standards/tokens/index.md
new file mode 100644
index 00000000000..0f3f6a1ac32
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/standards/tokens/index.md
@@ -0,0 +1,41 @@
+---
+title: Tiêu chuẩn Token
+description: Khám phá các tiêu chuẩn token của Ethereum như ERC-20, ERC-721 và ERC-1155 dành cho token có thể thay thế và không thể thay thế.
+lang: vi
+incomplete: true
+---
+
+## Giới thiệu {#introduction}
+
+Nhiều tiêu chuẩn phát triển Ethereum tập trung vào giao diện của token. Các tiêu chuẩn này giúp đảm bảo các hợp đồng thông minh vẫn có thể kết hợp được, vì vậy khi một dự án mới phát hành một token, nó sẽ vẫn tương thích với các sàn giao dịch phi tập trung và ứng dụng hiện có.
+
+Các tiêu chuẩn token xác định cách các token hoạt động và tương tác trên toàn hệ sinh thái Ethereum. Chúng giúp các nhà phát triển xây dựng dễ dàng hơn mà không cần phải phát minh lại bánh xe, đảm bảo rằng các token hoạt động liền mạch với các ví, sàn giao dịch và nền tảng DeFi. Dù là trong lĩnh vực trò chơi, quản trị hay các trường hợp sử dụng khác, các tiêu chuẩn này đều mang lại sự nhất quán và giúp Ethereum kết nối với nhau nhiều hơn.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+- [Các tiêu chuẩn phát triển Ethereum](/developers/docs/standards/)
+- [Hợp đồng thông minh](/developers/docs/smart-contracts/)
+
+## Các tiêu chuẩn token {#token-standards}
+
+Đây là vài tiêu chuẩn token phổ biến nhất trên Ethereum:
+
+- [ERC-20](/developers/docs/standards/tokens/erc-20/) - Một giao diện tiêu chuẩn cho các token có thể thay thế (có thể hoán đổi cho nhau), như token biểu quyết, token cổ phần hoặc tiền ảo.
+
+### Các tiêu chuẩn NFT {#nft-standards}
+
+- [ERC-721](/developers/docs/standards/tokens/erc-721/) - Một giao diện tiêu chuẩn cho các token không thể thay thế, như một chứng từ cho một tác phẩm nghệ thuật hoặc một bài hát.
+- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - ERC-1155 cho phép giao dịch hiệu quả hơn và gộp các giao dịch lại với nhau – nhờ vậy mà tiết kiệm chi phí. Tiêu chuẩn token này cho phép tạo ra cả token tiện ích (như $BNB hay $BAT) và các NFT như CryptoPunks.
+
+Danh sách đầy đủ các đề xuất [ERC](https://eips.ethereum.org/erc).
+
+## Đọc thêm {#further-reading}
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các hướng dẫn liên quan {#related-tutorials}
+
+- [Danh sách kiểm tra tích hợp token](/developers/tutorials/token-integration-checklist/) _– Một danh sách những điều cần cân nhắc khi tương tác với các token._
+- [Tìm hiểu về hợp đồng thông minh token ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Giới thiệu về cách triển khai hợp đồng thông minh đầu tiên của bạn trên mạng thử nghiệm Ethereum._
+- [Chuyển và phê duyệt các token ERC20 từ một hợp đồng thông minh Solidity](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– Cách sử dụng một hợp đồng thông minh để tương tác với token bằng ngôn ngữ Solidity._
+- [Triển khai thị trường ERC721 [hướng dẫn cách thực hiện]](/developers/tutorials/how-to-implement-an-erc721-market/) _– Cách đưa các vật phẩm được token hóa ra bán trên một bảng rao vặt phi tập trung._
diff --git a/public/content/translations/vi/developers/docs/storage/index.md b/public/content/translations/vi/developers/docs/storage/index.md
new file mode 100644
index 00000000000..45e039a7528
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/storage/index.md
@@ -0,0 +1,216 @@
+---
+title: Lưu trữ phi tập trung
+description: Tổng quan về lưu trữ phi tập trung và các công cụ có sẵn để tích hợp vào dapp.
+lang: vi
+---
+
+Khác với một máy chủ tập trung do một công ty hay tổ chức duy nhất điều hành, các hệ thống lưu trữ phi tập trung bao gồm một mạng lưới ngang hàng của những người dùng-điều hành, mỗi người giữ một phần dữ liệu tổng thể, tạo nên một hệ thống chia sẻ lưu trữ file bền bỉ. Những điều này có thể tồn tại trong một ứng dụng dựa trên blockchain hoặc bất kỳ mạng lưới ngang hàng nào.
+
+Ethereum có thể được sử dụng như một hệ thống lưu trữ phi tập trung, và điều này đặc biệt đúng khi nói đến việc lưu trữ mã trong tất cả các hợp đồng thông minh. Tuy nhiên, khi nói đến lượng lớn dữ liệu, đó không phải là điều mà Ethereum được thiết kế cho. Chuỗi đang phát triển ổn định, nhưng tại thời điểm viết bài, chuỗi Ethereum có dung lượng khoảng 500GB - 1TB ([tùy thuộc vào client](https://etherscan.io/chartsync/chaindefault)), và mọi nút trên mạng cần có khả năng lưu trữ tất cả dữ liệu. Nếu chuỗi mở rộng đến một lượng dữ liệu lớn (chẳng hạn như 5TB) thì sẽ không khả thi cho tất cả các nút tiếp tục hoạt động. Ngoài ra, chi phí triển khai lượng dữ liệu lớn như vậy lên Mạng chính sẽ cực kỳ tốn kém do phí [gas](/developers/docs/gas).
+
+Do những hạn chế này, chúng ta cần một chuỗi hoặc phương pháp khác để lưu trữ một lượng lớn dữ liệu theo cách phi tập trung.
+
+Khi xem xét các tùy chọn lưu trữ phi tập trung (dStorage), có một vài điều mà người dùng cần lưu ý.
+
+- Cơ chế kiên trì / cấu trúc khuyến khích
+- Thực thi lưu giữ dữ liệu
+- Sự phi tập trung
+- Sự đồng thuận
+
+## Cơ chế bền vững / cấu trúc khuyến khích {#persistence-mechanism}
+
+### Dựa trên blockchain {#blockchain-based}
+
+Để một mẩu dữ liệu có thể tồn tại mãi mãi, chúng ta cần sử dụng một cơ chế lưu trữ. Ví dụ, trên Ethereum, cơ chế duy trì tính toàn vẹn là toàn bộ chuỗi cần được ghi nhận khi vận hành một nút. Những mảnh dữ liệu mới được gắn vào cuối chuỗi, và nó tiếp tục phát triển - yêu cầu mỗi nút phải sao chép toàn bộ dữ liệu được nhúng.
+
+Điều này được gọi là tính bền vững **dựa trên blockchain**.
+
+Vấn đề với tính bền vững dựa trên blockchain là chuỗi có thể trở nên quá lớn để có thể duy trì và lưu trữ tất cả dữ liệu một cách khả thi (ví dụ: [nhiều nguồn](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/) ước tính rằng Internet cần hơn 40 Zetabyte dung lượng lưu trữ).
+
+Blockchain cũng cần có một loại cấu trúc khuyến khích nào đó. Để duy trì trên blockchain, có một khoản thanh toán được gửi cho người xác thực. Khi dữ liệu được thêm vào chuỗi, các validator được trả tiền để thêm dữ liệu vào.
+
+Các nền tảng có tính bền vững dựa trên blockchain:
+
+- Ethereum
+- [Arweave](https://www.arweave.org/)
+
+### Dựa trên hợp đồng {#contract-based}
+
+Tính bền vững **dựa trên hợp đồng** có nguyên tắc là dữ liệu không thể được sao chép bởi mọi nút và được lưu trữ mãi mãi, mà thay vào đó phải được duy trì bằng các thỏa thuận hợp đồng. Đây là các thỏa thuận được thiết lập với nhiều nút đã hứa sẽ lưu giữ một phần dữ liệu trong một khoảng thời gian. Chúng phải được hoàn tiền hoặc gia hạn mỗi khi hết hạn để dữ liệu được giữ lại.
+
+Trong hầu hết các trường hợp, thay vì lưu trữ toàn bộ dữ liệu trên chuỗi, thì chỉ có hàm băm của chỗ dữ liệu nằm trên chuỗi được lưu lại. Theo cách này, toàn bộ chuỗi không cần phải mở rộng để giữ tất cả dữ liệu.
+
+Các nền tảng có tính năng lưu trữ dựa trên hợp đồng:
+
+- [Filecoin](https://docs.filecoin.io/basics/what-is-filecoin)
+- [Skynet](https://sia.tech/)
+- [Storj](https://storj.io/)
+- [Züs](https://zus.network/)
+- [Crust Network](https://crust.network)
+- [Swarm](https://www.ethswarm.org/)
+- [4EVERLAND](https://www.4everland.org/)
+
+### Những cân nhắc bổ sung {#additional-consideration}
+
+IPFS là một hệ thống phân tán để lưu trữ và truy cập các tập tin, trang web, ứng dụng và dữ liệu. Nó không có cơ chế khuyến khích tích hợp sẵn, nhưng có thể được sử dụng cùng với bất kỳ giải pháp khuyến khích dựa trên hợp đồng nào đã nêu ở trên để đảm bảo lưu trữ lâu dài. Một cách khác để dữ liệu tồn tại lâu trên IPFS là sử dụng dịch vụ ghim, dịch vụ này sẽ “ghim” dữ liệu của bạn lại. Bạn thậm chí có thể chạy nút IPFS của riêng mình và đóng góp vào mạng lưới để lưu trữ dữ liệu của bạn và/hoặc của người khác hoàn toàn miễn phí!
+
+- [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/)
+- [Pinata](https://www.pinata.cloud/) _(dịch vụ ghim IPFS)_
+- [web3.storage](https://web3.storage/) _(dịch vụ ghim IPFS/Filecoin)_
+- [Infura](https://infura.io/product/ipfs) _(dịch vụ ghim IPFS)_
+- [IPFS Scan](https://ipfs-scan.io) _(trình khám phá ghim IPFS)_
+- [4EVERLAND](https://www.4everland.org/)_(dịch vụ ghim IPFS)_
+- [Filebase](https://filebase.com) _(Dịch vụ ghim IPFS)_
+- [Spheron Network](https://spheron.network/) _(dịch vụ ghim IPFS/Filecoin)_
+
+SWARM là một công nghệ lưu trữ và phân phối dữ liệu phi tập trung, có hệ thống khuyến khích lưu trữ và một cơ sở dữ liệu xác định giá thuê lưu trữ.
+
+## Lưu giữ dữ liệu {#data-retention}
+
+Để lưu trữ dữ liệu, các hệ thống phải có một cơ chế nào đó để đảm bảo dữ liệu được giữ lại.
+
+### Cơ chế thách thức {#challenge-mechanism}
+
+Một trong những cách phổ biến nhất để đảm bảo dữ liệu được giữ lại, là sử dụng một loại thử thách mã hóa nào đó được gửi đến các nút để đảm bảo chúng vẫn còn dữ liệu. Một cách đơn giản là nhìn vào minh chứng truy cập Arweave. Họ đưa ra một thử thách cho các nút để xem liệu họ có dữ liệu ở cả khối gần nhất và một khối ngẫu nhiên trong quá khứ không. Nếu nút không đưa ra được câu trả lời, họ sẽ bị phạt.
+
+Các loại lưu trữ phân tán với cơ chế thách thức:
+
+- Züs
+- Skynet
+- Arweave
+- Filecoin
+- Mạng Crust
+- 4EVERLAND
+
+### Tính phi tập trung {#decentrality}
+
+Không có nhiều công cụ tốt để đo lường mức độ phi tập trung của các nền tảng, nhưng nhìn chung, bạn sẽ muốn sử dụng những công cụ không có hình thức KYC nào để chứng minh rằng chúng không phải là trung tâm.
+
+Công cụ phi tập trung không cần KYC:
+
+- Skynet
+- Arweave
+- Filecoin
+- IPFS
+- Ethereum
+- Mạng Crust
+- 4EVERLAND
+
+### Cơ chế đồng thuận {#consensus}
+
+Hầu hết các công cụ này có phiên bản [cơ chế đồng thuận](/developers/docs/consensus-mechanisms/) của riêng chúng nhưng nhìn chung, chúng dựa trên [**bằng chứng công việc (PoW)**](/developers/docs/consensus-mechanisms/pow/) hoặc [**bằng chứng cổ phần (PoS)**](/developers/docs/consensus-mechanisms/pos/).
+
+Dựa trên proof-of-work:
+
+- Skynet
+- Arweave
+
+Dựa trên proof-of-stake:
+
+- Ethereum
+- Filecoin
+- Züs
+- Mạng Crust
+
+## Các công cụ liên quan {#related-tools}
+
+**IPFS - _Hệ thống Tệp Liên hành tinh là một hệ thống tham chiếu tệp và lưu trữ phi tập trung cho Ethereum._**
+
+- [Ipfs.io](https://ipfs.io/)
+- [Tài liệu](https://docs.ipfs.io/)
+- [GitHub](https://github.com/ipfs/ipfs)
+
+**Storj DCS - _Lưu trữ đối tượng đám mây phi tập trung, an toàn, riêng tư và tương thích với S3 dành cho nhà phát triển._**
+
+- [Storj.io](https://storj.io/)
+- [Tài liệu](https://docs.storj.io/)
+- [GitHub](https://github.com/storj/storj)
+
+**Sia - _Khai thác mật mã học để tạo ra một thị trường lưu trữ đám mây phi tín nhiệm, cho phép người mua và người bán giao dịch trực tiếp._**
+
+- [Skynet.net](https://sia.tech/)
+- [Tài liệu](https://docs.sia.tech/)
+- [GitHub](https://github.com/SiaFoundation/)
+
+**Filecoin - _Filecoin được tạo ra bởi cùng một đội ngũ đứng sau IPFS. Đó là một lớp khuyến khích trên những ý tưởng của IPFS._**
+
+- [Filecoin.io](https://filecoin.io/)
+- [Tài liệu](https://docs.filecoin.io/)
+- [GitHub](https://github.com/filecoin-project/)
+
+**Arweave - _Arweave là một nền tảng lưu trữ phi tập trung (dStorage) để lưu trữ dữ liệu._**
+
+- [Arweave.org](https://www.arweave.org/)
+- [Tài liệu](https://docs.arweave.org/info/)
+- [Arweave](https://github.com/ArweaveTeam/arweave/)
+
+**Züs - _Züs là một nền tảng lưu trữ phi tập trung (dStorage) bằng chứng cổ phần với tính năng phân mảnh và các blobber._**
+
+- [zus.network](https://zus.network/)
+- [Tài liệu](https://docs.zus.network/zus-docs/)
+- [GitHub](https://github.com/0chain/)
+
+**Crust Network - _Crust là một nền tảng lưu trữ phi tập trung (dStorage) xây dựng trên IPFS._**
+
+- [Crust.network](https://crust.network)
+- [Tài liệu](https://wiki.crust.network)
+- [GitHub](https://github.com/crustio)
+
+**Swarm - _Một nền tảng lưu trữ phân tán và dịch vụ phân phối nội dung cho ngăn xếp web3 của Ethereum._**
+
+- [EthSwarm.org](https://www.ethswarm.org/)
+- [Tài liệu](https://docs.ethswarm.org/)
+- [GitHub](https://github.com/ethersphere/)
+
+**OrbitDB - _Một cơ sở dữ liệu ngang hàng phi tập trung được xây dựng trên IPFS._**
+
+- [OrbitDB.org](https://orbitdb.org/)
+- [Tài liệu](https://github.com/orbitdb/field-manual/)
+- [GitHub](https://github.com/orbitdb/orbit-db/)
+
+**Aleph.im - _Dự án đám mây phi tập trung (cơ sở dữ liệu, lưu trữ tệp, tính toán và DID). Một sự kết hợp độc đáo giữa công nghệ ngang hàng offchain và onchain. Khả năng tương thích với IPFS và đa chuỗi._**
+
+- [Aleph.im](https://aleph.cloud/)
+- [Tài liệu](https://docs.aleph.cloud/)
+- [GitHub](https://github.com/aleph-im/)
+
+**Ceramic - _Lưu trữ cơ sở dữ liệu IPFS do người dùng kiểm soát dành cho các ứng dụng hấp dẫn và giàu dữ liệu._**
+
+- [Ceramic.network](https://ceramic.network/)
+- [Tài liệu](https://developers.ceramic.network/)
+- [GitHub](https://github.com/ceramicnetwork/js-ceramic/)
+
+**Filebase - _Lưu trữ phi tập trung tương thích với S3 và dịch vụ ghim IPFS có sao lưu dự phòng theo địa lý. Tất cả các tệp được tải lên IPFS thông qua Filebase sẽ được tự động ghim vào cơ sở hạ tầng Filebase với 3 bản sao trên toàn cầu._**
+
+- [Filebase.com](https://filebase.com/)
+- [Tài liệu](https://docs.filebase.com/)
+- [GitHub](https://github.com/filebase)
+
+**4EVERLAND - _Một nền tảng điện toán đám mây Web 3.0 tích hợp các khả năng cốt lõi về lưu trữ, tính toán và kết nối mạng, tương thích với S3 và cung cấp khả năng lưu trữ dữ liệu đồng bộ trên các mạng lưu trữ phi tập trung như IPFS và Arweave._**
+
+- [4everland.org](https://www.4everland.org/)
+- [Tài liệu](https://docs.4everland.org/)
+- [GitHub](https://github.com/4everland)
+
+**Kaleido - _Một nền tảng blockchain dưới dạng dịch vụ với các Nút IPFS có thể triển khai chỉ bằng một cú nhấp chuột_**
+
+- [Kaleido](https://kaleido.io/)
+- [Tài liệu](https://docs.kaleido.io/kaleido-services/ipfs/)
+- [GitHub](https://github.com/kaleido-io)
+
+**Spheron Network - _Spheron là một nền tảng dưới dạng dịch vụ (PaaS) được thiết kế cho các ứng dụng phi tập trung (dApp) muốn khởi chạy ứng dụng của họ trên cơ sở hạ tầng phi tập trung với hiệu suất tốt nhất. Nền tảng này cung cấp sẵn các dịch vụ tính toán, lưu trữ phi tập trung, CDN và lưu trữ web._**
+
+- [spheron.network](https://spheron.network/)
+- [Tài liệu](https://docs.spheron.network/)
+- [GitHub](https://github.com/spheronFdn)
+
+## Đọc thêm {#further-reading}
+
+- [Lưu trữ phi tập trung là gì?](https://coinmarketcap.com/academy/article/what-is-decentralized-storage-a-deep-dive-by-filecoin) - _CoinMarketCap_
+- [Phá bỏ năm lầm tưởng phổ biến về lưu trữ phi tập trung](https://www.storj.io/blog/busting-five-common-myths-about-decentralized-storage) - _Storj_
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Các khung phát triển](/developers/docs/frameworks/)
diff --git a/public/content/translations/vi/developers/docs/transactions/index.md b/public/content/translations/vi/developers/docs/transactions/index.md
new file mode 100644
index 00000000000..e6ea923c642
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/transactions/index.md
@@ -0,0 +1,233 @@
+---
+title: Các giao dịch
+description: Tổng quan về giao dịch Ethereum - cách chúng hoạt động, cấu trúc dữ liệu của chúng và cách gửi chúng thông qua một ứng dụng.
+lang: vi
+---
+
+Giao dịch là hướng dẫn được ký bằng mật mã từ các tài khoản. Một tài khoản sẽ thực thi một giao dịch để cập nhật tình trạng của mạng lưới Ethereum. Giao dịch đơn giản nhất là chuyển ETH từ tài khoản này sang tài khoản khác.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+Để giúp bạn hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước trang [Tài khoản](/developers/docs/accounts/) và [giới thiệu về Ethereum](/developers/docs/intro-to-ethereum/) của chúng tôi.
+
+## Giao dịch là gì? {#whats-a-transaction}
+
+Một giao dịch Ethereum ám chỉ một hành động được thực hiện bởi một tài khoản sở hữu ngoại biên, nói cách khác là một tài khoản được quản lý bởi con người, không phải là một hợp đồng. Ví dụ, nếu Bob gửi cho Alice 1 ETH, tài khoản của Bob bị trừ tiền và tài khoản của Alice được cộng tiền. Hành động thay đổi trạng thái này diễn ra trong một giao dịch.
+
+
+_Sơ đồ được điều chỉnh từ [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_
+
+Các giao dịch, mà làm thay đổi trạng thái của Máy chủ ảo Ethereum, cần được phát sóng tới toàn bộ mạng lưới. Bất kỳ nút nào đều có thể phát đi một yêu cầu thực thi một giao dịch trên Máy chủ ảo Ethereum, sau khi điều này diễn ra, một trình xác thực sẽ thực thi giao dịch và truyền bá kết quả của sự thay đổi trạng thái đến phần còn lại của mạng lưới.
+
+Các giao dịch yêu cầu một khoản phí và phải được bao gồm trong một khối đã được xác thực. Để làm cho phần tổng quan này đơn giản hơn, chúng tôi sẽ tài trợ phí gas và xác thực ở nơi khác.
+
+Một giao dịch được gửi đi bao gồm các thông tin sau:
+
+- `from` – địa chỉ của người gửi, người sẽ ký giao dịch. Đây sẽ là một tài khoản sở hữu ngoại biên vì tài khoản hợp đồng không thể gửi đi các giao dịch
+- `to` – địa chỉ nhận (nếu là tài khoản do bên ngoài sở hữu, giao dịch sẽ chuyển giá trị. Nếu là tài khoản hợp đồng, giao dịch sẽ thực thi mã hợp đồng)
+- `signature` – định danh của người gửi. Chữ ký này được tạo ra khi khóa riêng tư của người gửi ký giao dịch và xác nhận rằng người gửi đã ủy quyền cho giao dịch này
+- `nonce` - một bộ đếm tăng dần cho biết số thứ tự giao dịch từ tài khoản
+- `value` – lượng ETH cần chuyển từ người gửi đến người nhận (tính bằng WEI, trong đó 1ETH bằng 1e+18wei)
+- `input data` – trường tùy chọn để chứa dữ liệu tùy ý
+- `gasLimit` – số lượng đơn vị gas tối đa mà giao dịch có thể tiêu thụ. [Máy ảo Ethereum (EVM)](/developers/docs/evm/opcodes) quy định các đơn vị gas cần thiết cho mỗi bước tính toán
+- `maxPriorityFeePerGas` - mức giá tối đa của gas đã tiêu thụ được tính vào như một khoản tiền boa cho trình xác thực
+- `maxFeePerGas` - phí tối đa cho mỗi đơn vị gas sẵn sàng trả cho giao dịch (bao gồm `baseFeePerGas` và `maxPriorityFeePerGas`)
+
+Gas là thuật ngữ chỉ việc tính toán cần thiết để xử lý giao dịch bởi một trình xác thực. Người dùng phải trả phí cho việc tính toán này. `gasLimit` và `maxPriorityFeePerGas` xác định phí giao dịch tối đa phải trả cho trình xác thực. [Thông tin thêm về Gas](/developers/docs/gas/).
+
+Đối tượng giao dịch sẽ trông gần giống như thế này:
+
+```js
+{
+ from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
+ to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
+ gasLimit: "21000",
+ maxFeePerGas: "300",
+ maxPriorityFeePerGas: "10",
+ nonce: "0",
+ value: "10000000000"
+}
+```
+
+Nhưng một đối tượng giao dịch cần được ký bằng khóa riêng tư của người gửi. Điều này chứng tỏ rằng giao dịch chỉ có thể xuất phát từ người gửi và không được gửi một cách gian lận.
+
+Một ứng dụng Ethereum như Geth sẽ xử lý phần ký này.
+
+Ví dụ lệnh gọi [JSON-RPC](/developers/docs/apis/json-rpc):
+
+```json
+{
+ "id": 2,
+ "jsonrpc": "2.0",
+ "method": "account_signTransaction",
+ "params": [
+ {
+ "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
+ "gas": "0x55555",
+ "maxFeePerGas": "0x1234",
+ "maxPriorityFeePerGas": "0x1234",
+ "input": "0xabcd",
+ "nonce": "0x0",
+ "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
+ "value": "0x1234"
+ }
+ ]
+}
+```
+
+Ví dụ phản hồi:
+
+```json
+{
+ "jsonrpc": "2.0",
+ "id": 2,
+ "result": {
+ "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
+ "tx": {
+ "nonce": "0x0",
+ "maxFeePerGas": "0x1234",
+ "maxPriorityFeePerGas": "0x1234",
+ "gas": "0x55555",
+ "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
+ "value": "0x1234",
+ "input": "0xabcd",
+ "v": "0x26",
+ "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",
+ "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
+ "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"
+ }
+ }
+}
+```
+
+- `raw` là giao dịch đã ký ở dạng mã hóa [Tiền tố độ dài đệ quy (RLP)](/developers/docs/data-structures-and-encoding/rlp)
+- `tx` là giao dịch đã ký dưới dạng JSON
+
+Với băm chữ ký, giao dịch có thể được chứng minh bằng mật mã rằng nó đến từ người gửi và đã được gửi đến mạng.
+
+### Trường dữ liệu {#the-data-field}
+
+Phần lớn các giao dịch truy cập vào một hợp đồng từ một tài khoản sở hữu ngoại biên.
+Hầu hết các hợp đồng được viết bằng Solidity và diễn giải trường dữ liệu của chúng theo [giao diện nhị phân ứng dụng (ABI)](/glossary/#abi).
+
+Bốn byte đầu tiên chỉ rõ chức năng nào sẽ được gọi, bằng cách sử dụng băm của tên và tham số của chức năng.
+Đôi khi bạn có thể xác định hàm từ bộ chọn bằng cách sử dụng [cơ sở dữ liệu này](https://www.4byte.directory/signatures/).
+
+Phần còn lại của calldata là các đối số, [được mã hóa theo quy định trong thông số kỹ thuật ABI](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding).
+
+Ví dụ, hãy xem [giao dịch này](https://etherscan.io/tx/0xd0dcbe007569fcfa1902dae0ab8b4e078efe42e231786312289b1eee5590f6a1).
+Sử dụng **Nhấn để xem thêm** để xem calldata.
+
+Bộ chọn hàm là `0xa9059cbb`. Có một vài [hàm đã biết có chữ ký này](https://www.4byte.directory/signatures/?bytes4_signature=0xa9059cbb).
+Trong trường hợp này, [mã nguồn hợp đồng](https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code) đã được tải lên Etherscan, vì vậy chúng ta biết hàm là `transfer(address,uint256)`.
+
+Phần còn lại của dữ liệu là:
+
+```
+0000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
+000000000000000000000000000000000000000000000000000000003b0559f4
+```
+
+Theo thông số giao diện nhị phân ứng dụng, các giá trị số nguyên (như địa chỉ, là các số nguyên 20 byte) xuất hiện trong giao diện nhị phân ứng dụng dưới dạng các từ 32 byte, có thêm các số 0 ở phía trước.
+Vì vậy, chúng ta biết rằng địa chỉ `to` là [`4f6742badb049791cd9a37ea913f2bac38d01279`](https://etherscan.io/address/0x4f6742badb049791cd9a37ea913f2bac38d01279).
+`value` là 0x3b0559f4 = 990206452.
+
+## Các loại giao dịch {#types-of-transactions}
+
+Trên Ethereum, có một vài điểm khác biệt về các loại giao dịch:
+
+- Các giao dịch thông thường, một giao dịch từ một tài khoản này sang một tài khoản khác.
+- Giao dịch triển khai từ hợp đồng: một giao dịch không có địa chỉ 'đến', trong đó trường dữ liệu được sử dụng cho mã hợp đồng.
+- Thực thi một hợp đồng: một giao dịch tương tác với một hợp đồng thông minh đã được triển khai. Trong trường hợp này, địa chỉ 'đến' là địa chỉ hợp đồng thông minh.
+
+### Về gas {#on-gas}
+
+Như đã đề cập, các giao dịch tốn [gas](/developers/docs/gas/) để thực thi. Các giao dịch chuyển khoản đơn giản yêu cầu 21000 đơn vị Gas.
+
+Vì vậy, để Bob gửi cho Alice 1 ETH với `baseFeePerGas` là 190 gwei và `maxPriorityFeePerGas` là 10 gwei, Bob sẽ cần trả khoản phí sau:
+
+```
+(190 + 10) * 21000 = 4,200,000 gwei
+--hoặc--
+0.0042 ETH
+```
+
+Tài khoản của Bob sẽ bị trừ **-1,0042 ETH** (1 ETH cho Alice + 0,0042 ETH tiền phí gas)
+
+Tài khoản của Alice sẽ được cộng **+1,0 ETH**
+
+Phí cơ bản sẽ bị đốt **-0,00399 ETH**
+
+Trình xác thực giữ tiền boa **+0,000210 ETH**
+
+
+_Sơ đồ được điều chỉnh từ [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_
+
+Bất kỳ gas nào không được sử dụng trong giao dịch sẽ được hoàn lại cho tài khoản người dùng.
+
+### Tương tác hợp đồng thông minh {#smart-contract-interactions}
+
+Gas là bắt buộc cho bất kỳ giao dịch nào liên quan đến hợp đồng thông minh.
+
+Các hợp đồng thông minh cũng có thể chứa các hàm được gọi là hàm [`view`](https://docs.soliditylang.org/en/latest/contracts.html#view-functions) hoặc [`pure`](https://docs.soliditylang.org/en/latest/contracts.html#pure-functions), chúng không làm thay đổi trạng thái của hợp đồng. Do đó, việc gọi các hàm này từ một tài khoản sở hữu ngoại biên sẽ không yêu cầu tiêu tốn bất kỳ gas nào. Lệnh gọi RPC cơ bản cho trường hợp này là [`eth_call`](/developers/docs/apis/json-rpc#eth_call).
+
+Không giống như khi được truy cập bằng `eth_call`, các hàm `view` hoặc `pure` này cũng thường được gọi nội bộ (tức là, từ chính hợp đồng đó hoặc từ một hợp đồng khác) và điều này có tốn gas.
+
+## Vòng đời giao dịch {#transaction-lifecycle}
+
+Một khi giao dịch đã được gửi đi, những điều sau sẽ xảy ra:
+
+1. Một hàm băm giao dịch được tạo bằng mật mã:
+ `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017`
+2. Giao dịch sau đó được phát đi đến mạng lưới và được thêm vào một bể giao dịch bao gồm tất cả các giao dịch đang chờ xử lý khác trong mạng lưới.
+3. Một trình xác thực phải chọn giao dịch của bạn và đưa nó vào một khối để xác minh giao dịch và coi như giao dịch 'thành công'.
+4. Theo thời gian, khối chứa giao dịch của bạn sẽ được nâng cấp thành "đã xác nhận" và sau đó thành "đã hoàn tất". Những nâng cấp này giúp chắc chắn hơn nhiều
+ rằng giao dịch của bạn đã thành công và sẽ không bao giờ bị thay đổi. Khi một khối được "hoàn tất", nó chỉ có thể bị thay đổi
+ bởi một cuộc tấn công cấp mạng lưới vốn sẽ tốn hàng tỷ đô la.
+
+## Bản demo trực quan {#a-visual-demo}
+
+Xem Austin hướng dẫn bạn về các giao dịch, gas và khai thác.
+
+
+
+## Bao giao dịch được định kiểu {#typed-transaction-envelope}
+
+Ethereum lúc đầu có một định dạng cho các giao dịch. Mỗi giao dịch đều có một nonce, giá gas, giới hạn gas, địa chỉ nhận, giá trị, dữ liệu, v, r, và s. Các trường này được [mã hóa RLP](/developers/docs/data-structures-and-encoding/rlp/), trông giống như sau:
+
+`RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])`
+
+Ethereum đã phát triển để hỗ trợ nhiều loại giao dịch để cho phép các tính năng mới như danh sách truy cập và [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) được triển khai mà không ảnh hưởng đến các định dạng giao dịch cũ.
+
+[EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) là thứ cho phép hành vi này. Các giao dịch được giải thích là:
+
+`TransactionType || TransactionPayload`
+
+Các trường được định nghĩa như sau:
+
+- `TransactionType` - một số từ 0 đến 0x7f, cho tổng số 128 loại giao dịch khả thi.
+- `TransactionPayload` - một mảng byte tùy ý được xác định bởi loại giao dịch.
+
+Dựa trên giá trị `TransactionType`, một giao dịch có thể được phân loại như sau:
+
+1. **Giao dịch loại 0 (Kế thừa):** Định dạng giao dịch ban đầu được sử dụng kể từ khi Ethereum ra mắt. Chúng không bao gồm các tính năng từ [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) như tính toán phí gas động hoặc danh sách truy cập cho các hợp đồng thông minh. Các giao dịch kế thừa thiếu một tiền tố cụ thể để chỉ định loại của chúng ở dạng tuần tự hóa, bắt đầu bằng byte `0xf8` khi sử dụng mã hóa [Tiền tố độ dài đệ quy (RLP)](/developers/docs/data-structures-and-encoding/rlp). Giá trị TransactionType cho các giao dịch này là `0x0`.
+
+2. **Giao dịch loại 1:** Được giới thiệu trong [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) như một phần của [Nâng cấp Berlin](/ethereum-forks/#berlin) của Ethereum, các giao dịch này bao gồm một tham số `accessList`. Danh sách này chỉ định các địa chỉ và khóa lưu trữ mà giao dịch dự kiến sẽ truy cập, giúp có khả năng giảm chi phí [gas](/developers/docs/gas/) cho các giao dịch phức tạp liên quan đến hợp đồng thông minh. Các thay đổi về thị trường phí của đề xuất EIP-1559 không được bao gồm trong giao dịch loại 1. Giao dịch loại 1 cũng bao gồm một tham số `yParity`, có thể là `0x0` hoặc `0x1`, cho biết tính chẵn lẻ của giá trị y của chữ ký secp256k1. Chúng được xác định bằng cách bắt đầu với byte `0x01`, và giá trị TransactionType của chúng là `0x1`.
+
+3. **Giao dịch loại 2**, thường được gọi là giao dịch EIP-1559, là các giao dịch được giới thiệu trong [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), trong [Nâng cấp London](/ethereum-forks/#london) của Ethereum. Chúng đã trở thành loại giao dịch tiêu chuẩn trên mạng lưới Ethereum. Các giao dịch này giới thiệu một cơ chế phí trị trường mới, giúp cải thiện khả năng dự đoán bằng cách tách phí giao dịch thành phí tối thiểu và phí ưu tiên. Chúng bắt đầu bằng byte `0x02` và bao gồm các trường như `maxPriorityFeePerGas` và `maxFeePerGas`. Các giao dịch loại 2 giờ đây đã trở thành mặc định vì tính linh hoạt và hiệu quả của chúng, đặc biệt được ưa chuộng trong những thời điểm nghẽn mạng, trợ giúp những người dùng quản lý các phí giao dịch một cách dễ dàng hơn. Giá trị TransactionType cho các giao dịch này là `0x2`.
+
+4. **Giao dịch loại 3 (Blob)** đã được giới thiệu trong [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) như một phần của [Nâng cấp Dencun](/ethereum-forks/#dencun) của Ethereum. Những giao dịch này được thiết kế để xử lý dữ liệu "blob" (Đối tượng lớn nhị phân) một cách hiệu quả hơn, đặc biệt có lợi cho các lớp 2 rollup bằng cách cung cấp một phương thức đăng tải dữ liệu lên mạng Ethereum với chi phí thấp hơn. Giao dịch blob bao gồm các trường bổ sung như `blobVersionedHashes`, `maxFeePerBlobGas`, và `blobGasPrice`. Chúng bắt đầu bằng byte `0x03`, và giá trị TransactionType của chúng là `0x3`. Giao dịch Blob đại diện cho một sự cải thiện đáng kể trong khả năng khả dụng dữ liệu và khả năng mở rộng của Ethereum.
+
+5. **Giao dịch loại 4** đã được giới thiệu trong [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) như một phần của [Nâng cấp Pectra](/roadmap/pectra/) của Ethereum. Các giao dịch này được thiết kế để tương thích về phía trước với trừu tượng hóa tài khoản. Chúng cho phép các EOA tạm thời hoạt động giống như các tài khoản hợp đồng thông minh mà không ảnh hưởng đến chức năng ban đầu của chúng. Chúng bao gồm một tham số `authorization_list`, chỉ định hợp đồng thông minh mà EOA ủy quyền. Sau giao dịch, trường mã của EOA sẽ có địa chỉ của hợp đồng thông minh được ủy quyền.
+
+## Đọc thêm {#further-reading}
+
+- [EIP-2718: Bao giao dịch được định kiểu](https://eips.ethereum.org/EIPS/eip-2718)
+
+_Biết về nguồn lực cộng đồng đã giúp đỡ bạn? Chỉnh sửa trang này và bổ sung!_
+
+## Các chủ đề liên quan {#related-topics}
+
+- [Tài khoản](/developers/docs/accounts/)
+- [Máy ảo Ethereum (EVM)](/developers/docs/evm/)
+- [Gas](/developers/docs/gas/)
diff --git a/public/content/translations/vi/developers/docs/web2-vs-web3/index.md b/public/content/translations/vi/developers/docs/web2-vs-web3/index.md
new file mode 100644
index 00000000000..557b06587e9
--- /dev/null
+++ b/public/content/translations/vi/developers/docs/web2-vs-web3/index.md
@@ -0,0 +1,62 @@
+---
+title: Web2 và Web3
+description: So sánh các dịch vụ Web2 tập trung với các ứng dụng Web3 phi tập trung được xây dựng trên công nghệ blockchain Ethereum.
+lang: vi
+---
+
+Web2 đề cập đến phiên bản của internet mà hầu hết chúng ta biết đến hôm nay. Một internet bị chi phối bởi các công ty cung cấp dịch vụ đổi lấy dữ liệu cá nhân của bạn. Web3, trong bối cảnh của Ethereum, đề cập đến các ứng dụng phi tập trung chạy trên blockchain. Đây là những ứng dụng cho phép bất kỳ ai tham gia mà không cần kiếm tiền từ dữ liệu cá nhân của họ.
+
+Bạn đang tìm kiếm một nguồn tài nguyên thân thiện hơn cho người mới bắt đầu? Xem [giới thiệu của chúng tôi về web3](/web3/).
+
+## Lợi ích của Web3 {#web3-benefits}
+
+Nhiều nhà phát triển Web3 đã chọn xây dựng ứng dụng phi tập trung vì tính phi tập trung vốn có của Ethereum:
+
+- Bất kỳ ai có mặt trên mạng đều được phép sử dụng dịch vụ – hay nói cách khác, không cần xin phép.
+- Không ai có thể chặn bạn hoặc từ chối quyền truy cập vào dịch vụ.
+- Các khoản thanh toán được tích hợp sẵn thông qua token gốc, ether (ETH).
+- Ethereum được dựa trên tính hoàn chỉnh của Turing, nghĩa là bạn có thể lập trình gần như bất cứ thứ gì.
+
+## So sánh thực tế {#practical-comparisons}
+
+| Web2 | Web3 |
+| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
+| Twitter có thể kiểm duyệt bất kỳ tài khoản hoặc tweet nào | Các tweet trên Web3 sẽ không thể bị kiểm duyệt vì quyền kiểm soát được phân tán |
+| Dịch vụ thanh toán có thể quyết định không cho phép thanh toán cho một số loại công việc nhất định | Các ứng dụng thanh toán Web3 không yêu cầu dữ liệu cá nhân và không thể ngăn chặn các khoản thanh toán |
+| Các máy chủ của ứng dụng việc làm tự do có thể bị sập và ảnh hưởng đến thu nhập của người lao động | Máy chủ Web3 không thể sập – chúng sử dụng Ethereum, một mạng lưới phi tập trung gồm hàng nghìn máy tính làm backend |
+
+Điều này không có nghĩa là tất cả dịch vụ đều cần phải được biến thành ứng dụng phi tập trung. Những ví dụ này minh họa cho sự khác biệt chính giữa các dịch vụ web2 và web3.
+
+## Hạn chế của Web3 {#web3-limitations}
+
+Hiện tại Web3 vẫn có một số hạn chế:
+
+- Khả năng mở rộng – các giao dịch trên Web3 chậm hơn vì tính phi tập trung. Các thay đổi về trạng thái, chẳng hạn như một khoản thanh toán, cần được xử lý bởi một node và truyền đi khắp mạng lưới.
+- Trải nghiệm người dùng (UX) – tương tác với các ứng dụng Web3 có thể yêu cầu thêm nhiều bước, phần mềm đặc thù và kiến thức mới. Điều này có thể là một rào cản đối với việc áp dụng rộng rãi.
+- Khả năng truy cập – việc thiếu tích hợp trong các trình duyệt web hiện đại khiến Web3 ít tiếp cận được với hầu hết người dùng hơn.
+- Chi phí – hầu hết các ứng dụng phi tập trung thành công chỉ đưa một phần rất nhỏ mã của họ lên blockchain vì chi phí cao.
+
+## Tập trung hóa so với phi tập trung hóa {#centralization-vs-decentralization}
+
+Trong bảng dưới đây, chúng tôi liệt kê một số ưu điểm và nhược điểm tổng quát của các mạng kỹ thuật số tập trung và phi tập trung.
+
+| Hệ thống tập trung | Hệ thống phi tập trung |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Giao thức truyền tải mạng thấp (tất cả người tham gia kết nối với một cơ quan trung ương); thông tin lan truyền nhanh vì việc truyền tải được xử lý bởi cơ quan trung ương có nhiều tài nguyên tính toán. | Những người tham gia gần nhất trên mạng có thể có nhiều bất lợi hơn so với những người tham gia sớm. Thông tin phát đi từ một phía của mạng có thể mất thời gian lâu để tới phía bên kia. |
+| Thông thường có hiệu suất cao hơn (thông lượng lớn hơn, tổng tài nguyên tính toán ít hơn) và dễ triển khai hơn. | Thông thường có hiệu suất thấp hơn (thông lượng nhỏ hơn, tổng tài nguyên tính toán nhiều hơn) và phức tạp hơn để triển khai. |
+| Trong trường hợp dữ liệu mâu thuẫn, việc giải quyết rõ ràng và dễ dàng: nguồn sự thật cuối cùng là cơ quan trung ương. | Cần một giao thức (thường phức tạp) để giải quyết tranh chấp, nếu các người tham gia ngang hàng đưa ra các tuyên bố mâu thuẫn về trạng thái dữ liệu mà các người tham gia cần đồng bộ. |
+| Điểm thất bại duy nhất: các tác nhân độc hại có thể làm sập mạng bằng cách nhắm vào cơ quan trung ương. | Không có một điểm lỗi: mạng vẫn có thể hoạt động ngay cả khi phần lớn người tham gia bị tấn công/bị xoá sổ. |
+| Việc phối hợp giữa những người tham gia mạng lưới dễ dàng hơn nhiều và được xử lý bởi một bên có thẩm quyền. Cơ quan quản lý trung ương có thể buộc những người tham gia mạng áp dụng các nâng cấp, cập nhật giao thức, v.v với rất ít sự cản trở. | Việc phối hợp thường khó khăn vì không có tác nhân nào có tiếng nói cuối cùng trong các quyết định ở cấp độ mạng, nâng cấp giao thức, v.v.
Trong trường hợp tệ nhất, mạng lưới có nguy cơ bị gián đoạn khi có sự bất đồng về việc thay đổi giao thức. |
+| Cơ quan trung ương có thể kiểm duyệt dữ liệu, có khả năng cắt đứt các bộ phận của mạng lưới khỏi sự tương tác với phần còn lại của mạng lưới. | Việc Kiểm duyệt khó khăn hơn nhiều, khi mà thông tin có nhiều cách để lan truyền trên mạng lưới. |
+| Sự tham gia vào mạng lưới được kiểm soát bởi cơ quan trung ương. | Bất kỳ ai cũng có thể tham gia vào mạng lưới; không có “người gác cổng ”. Lý tưởng nhất là chi phí tham gia rất thấp. |
+
+Lưu ý rằng đây là những mô hình chung có thể không đúng trong các mạng lưới khác. Hơn nữa, trong thực tế, mức độ mà một mạng lưới có tính tập trung hay phân tán nằm trên một phổ; không có mạng lưới nào hoàn toàn tập trung hay hoàn toàn phân tán.
+
+## Đọc thêm {#further-reading}
+
+- [Web3 là gì?](/web3/) - _ethereum.org_
+- [Kiến trúc của một ứng dụng Web 3.0](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_
+- [Ý nghĩa của Phi tập trung hóa](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _Ngày 6 tháng 2 năm 2017 - Vitalik Buterin_
+- [Tại sao Phi tập trung hóa lại quan trọng](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) _Ngày 18 tháng 2 năm 2018 - Chris Dixon_
+- [Web 3.0 là gì & Tại sao nó lại quan trọng](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _Ngày 31 tháng 12 năm 2019 - Max Mersch và Richard Muirhead_
+- [Tại sao chúng ta cần Web 3.0](https://gavofyork.medium.com/why-we-need-web-3-0-5da4f2bf95ab) _Ngày 12 tháng 9 năm 2018 - Gavin Wood_
diff --git a/public/content/translations/vi/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/vi/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md
new file mode 100644
index 00000000000..5f8d3370413
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md
@@ -0,0 +1,300 @@
+---
+title: Giới thiệu về Ethereum cho nhà phát triển Python, phần 1
+description: Nhập môn phát triển Ethereum, đặc biệt hữu ích cho những ai có kiến thức về lập trình ngôn ngữ Python
+author: Marc Garreau
+lang: vi
+tags: [ "python", "web3.py" ]
+skill: beginner
+published: 2020-09-08
+source: Snake charmers
+sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/
+---
+
+Vậy, bạn đã nghe nói về Ethereum và sẵn sàng cho một cuộc phiêu lưu khám phá nó? Bài đăng này sẽ nhanh chóng trình bày một số kiến thức cơ bản về chuỗi khối, sau đó giúp bạn tương tác với một nút Ethereum mô phỏng – đọc dữ liệu khối, kiểm tra số dư tài khoản và gửi giao dịch. Xuyên suốt quá trình trên, chúng tôi sẽ dần giúp bạn nhận ra sự khác biệt giữa cách xây dựng ứng dụng theo kiểu truyền thống và mô hình phi tập trung kiểu mới này.
+
+## Các điều kiện tiên quyết (không bắt buộc) {#soft-prerequisites}
+
+Bài đăng này hướng tới mục tiêu có thể tiếp cận được với nhiều đối tượng nhà phát triển. [Các công cụ Python](/developers/docs/programming-languages/python/) sẽ được sử dụng, nhưng chúng chỉ là phương tiện để truyền tải ý tưởng – sẽ không có vấn đề gì nếu bạn không phải là một nhà phát triển Python. Tuy nhiên, tôi sẽ đưa ra một vài giả định về những gì bạn đã biết, để chúng ta có thể nhanh chóng chuyển sang các phần cụ thể về Ethereum.
+
+Các giả định:
+
+- Bạn có thể sử dụng thành thạo terminal,
+- Bạn đã viết một vài dòng mã Python,
+- Python phiên bản 3.6 trở lên đã được cài đặt trên máy của bạn (việc sử dụng [môi trường ảo](https://realpython.com/effective-python-environment/#virtual-environments) được khuyến khích mạnh mẽ), và
+- bạn đã sử dụng `pip`, trình cài đặt gói của Python.
+ Một lần nữa, nếu bất kỳ điều nào trong số này không đúng, hoặc bạn không có ý định tái tạo lại mã trong bài viết này, bạn vẫn có thể theo dõi tốt.
+
+## Sơ lược về chuỗi khối {#blockchains-briefly}
+
+Có nhiều cách để mô tả Ethereum, nhưng cốt lõi của nó là một chuỗi khối. Các chuỗi khối được tạo thành từ một chuỗi các khối, vì vậy hãy bắt đầu từ đó. Nói một cách đơn giản nhất, mỗi khối trên chuỗi khối Ethereum chỉ là một số siêu dữ liệu và một danh sách các giao dịch. Ở định dạng JSON, nó trông giống như thế này:
+
+```json
+{
+ "number": 1234567,
+ "hash": "0xabc123...",
+ "parentHash": "0xdef456...",
+ ...,
+ "transactions": [...]
+}
+```
+
+Mỗi [khối](/developers/docs/blocks/) đều có một tham chiếu đến khối đứng trước nó; `parentHash` đơn giản là hàm băm của khối trước đó.
+
+Lưu ý: Ethereum thường xuyên sử dụng các hàm băm để tạo ra các giá trị có kích thước cố định (“các hàm băm”). Các hàm băm đóng một vai trò quan trọng trong Ethereum, nhưng hiện tại bạn có thể tạm coi chúng như các ID duy nhất.
+
+
+
+_Một chuỗi khối về cơ bản là một danh sách liên kết; mỗi khối có một tham chiếu đến khối trước đó._
+
+Cấu trúc dữ liệu này không có gì mới lạ, nhưng các quy tắc (tức là các giao thức ngang hàng) điều khiển mạng thì có. Không có cơ quan trung ương nào; mạng lưới các nút ngang hàng phải hợp tác để duy trì mạng và cạnh tranh để quyết định giao dịch nào sẽ được đưa vào khối tiếp theo. Vì vậy, khi bạn muốn gửi một số tiền cho bạn bè, bạn sẽ cần quảng bá giao dịch đó tới mạng, sau đó đợi nó được đưa vào một khối sắp tới.
+
+Cách duy nhất để chuỗi khối xác minh rằng tiền thực sự đã được gửi từ người dùng này sang người dùng khác là sử dụng một loại tiền tệ gốc của (tức là được tạo và quản lý bởi) chuỗi khối đó. Trong Ethereum, loại tiền tệ này được gọi là ether, và chuỗi khối Ethereum chứa bản ghi chính thức duy nhất về số dư tài khoản.
+
+## Một mô hình mới {#a-new-paradigm}
+
+Ngăn xếp công nghệ phi tập trung mới này đã tạo ra các công cụ mới cho nhà phát triển. Các công cụ như vậy tồn tại trong nhiều ngôn ngữ lập trình, nhưng chúng ta sẽ xem xét qua lăng kính của Python. Xin nhắc lại: ngay cả khi Python không phải là ngôn ngữ bạn chọn, việc theo dõi cũng sẽ không gặp nhiều khó khăn.
+
+Các nhà phát triển Python muốn tương tác với Ethereum có khả năng sẽ tìm đến [Web3.py](https://web3py.readthedocs.io/). Web3.py là một thư viện giúp đơn giản hóa rất nhiều cách bạn kết nối với một nút Ethereum, sau đó gửi và nhận dữ liệu từ nó.
+
+Lưu ý: “nút Ethereum” và “máy khách Ethereum” được sử dụng thay thế cho nhau. Trong cả hai trường hợp, nó đều đề cập đến phần mềm mà một người tham gia vào mạng Ethereum chạy. Phần mềm này có thể đọc dữ liệu khối, nhận các bản cập nhật khi các khối mới được thêm vào chuỗi, quảng bá các giao dịch mới, và nhiều hơn nữa. Về mặt kỹ thuật, máy khách là phần mềm, còn nút là máy tính chạy phần mềm đó.
+
+[Các máy khách Ethereum](/developers/docs/nodes-and-clients/) có thể được cấu hình để có thể truy cập được bằng [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP hoặc Websockets, vì vậy Web3.py sẽ cần phải phản ánh cấu hình này. Web3.py gọi các tùy chọn kết nối này là **các nhà cung cấp**. Bạn sẽ muốn chọn một trong ba nhà cung cấp để liên kết thực thể Web3.py với nút của mình.
+
+
+
+_Cấu hình nút Ethereum và Web3.py để giao tiếp qua cùng một giao thức, ví dụ: IPC trong sơ đồ này._
+
+Sau khi Web3.py được cấu hình đúng cách, bạn có thể bắt đầu tương tác với chuỗi khối. Dưới đây là một vài ví dụ sử dụng Web3.py để xem trước những gì sắp tới:
+
+```python
+# đọc dữ liệu khối:
+w3.eth.get_block('latest')
+
+# gửi một giao dịch:
+w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...})
+```
+
+## Cài đặt {#installation}
+
+Trong hướng dẫn này, chúng ta sẽ chỉ làm việc trong một trình thông dịch Python. Chúng ta sẽ không tạo bất kỳ thư mục, tệp, lớp hay hàm nào.
+
+Lưu ý: Trong các ví dụ dưới đây, các lệnh bắt đầu bằng `$` được dự định để chạy trong terminal. (Không gõ dấu `$`, nó chỉ biểu thị sự bắt đầu của dòng.)
+
+Đầu tiên, cài đặt [IPython](https://ipython.org/) để có một môi trường thân thiện với người dùng để khám phá. IPython cung cấp tính năng tự động hoàn thành bằng phím tab, cùng với các tính năng khác, giúp bạn dễ dàng xem những gì có thể làm được trong Web3.py.
+
+```bash
+pip install ipython
+```
+
+Web3.py được xuất bản dưới tên `web3`. Cài đặt nó như sau:
+
+```bash
+pip install web3
+```
+
+Thêm một điều nữa – chúng ta sẽ mô phỏng một chuỗi khối sau này, điều này đòi hỏi một vài phụ thuộc nữa. Bạn có thể cài đặt chúng qua:
+
+```bash
+pip install 'web3[tester]'
+```
+
+Bạn đã sẵn sàng để bắt đầu!
+
+Lưu ý: Gói `web3[tester]` hoạt động với Python cho đến phiên bản 3.10.xx
+
+## Khởi tạo một sandbox {#spin-up-a-sandbox}
+
+Mở một môi trường Python mới bằng cách chạy `ipython` trong terminal của bạn. Điều này tương tự như chạy `python`, nhưng đi kèm với nhiều tính năng bổ sung hơn.
+
+```bash
+ipython
+```
+
+Lệnh này sẽ in ra một số thông tin về phiên bản Python và IPython bạn đang chạy, sau đó bạn sẽ thấy một dấu nhắc chờ nhập liệu:
+
+```python
+In [1]:
+```
+
+Bây giờ bạn đang xem một shell Python tương tác. Về cơ bản, nó là một sandbox để bạn thực hành. Nếu bạn đã đến được đây, đã đến lúc nhập Web3.py:
+
+```python
+In [1]: from web3 import Web3
+```
+
+## Giới thiệu mô-đun Web3 {#introducing-the-web3-module}
+
+Ngoài việc là một cổng vào Ethereum, mô-đun [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api) còn cung cấp một vài hàm tiện ích. Hãy cùng khám phá một vài hàm.
+
+Trong một ứng dụng Ethereum, bạn sẽ thường xuyên cần chuyển đổi các mệnh giá tiền tệ. Mô-đun Web3 cung cấp một vài phương thức trợ giúp cho việc này: [from_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei) và [to_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei).
+
+
+Lưu ý: Máy tính nổi tiếng là xử lý kém các phép toán thập phân. Để giải quyết vấn đề này, các nhà phát triển thường lưu trữ số tiền đô la bằng cent. Ví dụ, một mặt hàng có giá 5,99$ có thể được lưu trữ trong cơ sở dữ liệu là 599.
+
+Một mô hình tương tự được sử dụng khi xử lý các giao dịch bằng ether. Tuy nhiên, thay vì hai chữ số thập phân, ether có tới 18! Mệnh giá nhỏ nhất của ether được gọi là wei, vì vậy đó là giá trị được chỉ định khi gửi giao dịch.
+
+1 ether = 1000000000000000000 wei
+
+1 wei = 0.000000000000000001 ether
+
+
+
+Hãy thử chuyển đổi một số giá trị sang và từ wei. Lưu ý rằng [có tên cho nhiều mệnh giá](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) ở giữa ether và wei. Một trong những mệnh giá được biết đến nhiều hơn là **gwei**, vì nó thường là cách biểu thị phí giao dịch.
+
+```python
+In [2]: Web3.to_wei(1, 'ether')
+Out[2]: 1000000000000000000
+
+In [3]: Web3.from_wei(500000000, 'gwei')
+Out[3]: Decimal('0.5')
+```
+
+Các phương thức tiện ích khác trên mô-đun Web3 bao gồm các trình chuyển đổi định dạng dữ liệu (ví dụ: [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), các hàm trợ giúp địa chỉ (ví dụ: [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)), và các hàm băm (ví dụ: [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). Nhiều phương thức trong số này sẽ được đề cập sau trong loạt bài này. Để xem tất cả các phương thức và thuộc tính có sẵn, hãy sử dụng tính năng tự động hoàn thành của IPython bằng cách gõ `Web3`. và nhấn phím tab hai lần sau dấu chấm.
+
+## Giao tiếp với chuỗi {#talk-to-the-chain}
+
+Các phương thức tiện ích rất hay, nhưng hãy chuyển sang chuỗi khối. Bước tiếp theo là cấu hình Web3.py để giao tiếp với một nút Ethereum. Ở đây chúng ta có tùy chọn sử dụng các nhà cung cấp IPC, HTTP hoặc Websocket.
+
+Chúng ta sẽ không đi theo con đường này, nhưng một ví dụ về một quy trình làm việc hoàn chỉnh sử dụng HTTP Provider có thể trông giống như sau:
+
+- Tải xuống một nút Ethereum, ví dụ: [Geth](https://geth.ethereum.org/).
+- Khởi động Geth trong một cửa sổ terminal và đợi nó đồng bộ hóa mạng. Cổng HTTP mặc định là `8545`, nhưng có thể cấu hình được.
+- Yêu cầu Web3.py kết nối với nút qua HTTP, trên `localhost:8545`.
+ `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))`
+- Sử dụng thực thể `w3` để tương tác với nút.
+
+Mặc dù đây là một cách “thực tế” để thực hiện, quá trình đồng bộ hóa mất hàng giờ và không cần thiết nếu bạn chỉ muốn có một môi trường phát triển. Web3.py cung cấp một nhà cung cấp thứ tư cho mục đích này, đó là **EthereumTesterProvider**. Nhà cung cấp thử nghiệm này liên kết đến một nút Ethereum mô phỏng với các quyền được nới lỏng và tiền tệ giả để thực hành.
+
+
+
+_EthereumTesterProvider kết nối với một nút mô phỏng và rất tiện dụng cho các môi trường phát triển nhanh._
+
+Nút mô phỏng đó được gọi là [eth-tester](https://github.com/ethereum/eth-tester) và chúng ta đã cài đặt nó như một phần của lệnh `pip install web3[tester]`. Việc cấu hình Web3.py để sử dụng nhà cung cấp thử nghiệm này rất đơn giản:
+
+```python
+In [4]: w3 = Web3(Web3.EthereumTesterProvider())
+```
+
+Bây giờ bạn đã sẵn sàng để lướt trên chuỗi! Đó không phải là một câu nói thông dụng. Tôi vừa bịa ra thôi. Hãy cùng đi một vòng tham quan nhanh.
+
+## Chuyến tham quan nhanh {#the-quick-tour}
+
+Đầu tiên, hãy kiểm tra sơ bộ:
+
+```python
+In [5]: w3.is_connected()
+Out[5]: True
+```
+
+Vì chúng ta đang sử dụng nhà cung cấp thử nghiệm, đây không phải là một bài kiểm tra có giá trị cao, nhưng nếu nó thất bại, có khả năng bạn đã gõ sai gì đó khi khởi tạo biến `w3`. Kiểm tra kỹ xem bạn đã bao gồm cặp dấu ngoặc đơn bên trong chưa, tức là `Web3.EthereumTesterProvider()`.
+
+## Điểm dừng số 1: [tài khoản](/developers/docs/accounts/) {#tour-stop-1-accounts}
+
+Để thuận tiện, nhà cung cấp thử nghiệm đã tạo một số tài khoản và nạp sẵn cho chúng ether thử nghiệm.
+
+Đầu tiên, hãy xem danh sách các tài khoản đó:
+
+```python
+In [6]: w3.eth.accounts
+Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
+ '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',
+ '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...]
+```
+
+Nếu bạn chạy lệnh này, bạn sẽ thấy một danh sách mười chuỗi ký tự bắt đầu bằng `0x`. Mỗi chuỗi là một **địa chỉ công khai** và, theo một cách nào đó, tương tự như số tài khoản của một tài khoản séc. Bạn sẽ cung cấp địa chỉ này cho người muốn gửi ether cho bạn.
+
+Như đã đề cập, nhà cung cấp thử nghiệm đã nạp sẵn cho mỗi tài khoản này một số ether thử nghiệm. Hãy tìm hiểu xem có bao nhiêu trong tài khoản đầu tiên:
+
+```python
+In [7]: w3.eth.get_balance(w3.eth.accounts[0])
+Out[7]: 1000000000000000000000000
+```
+
+Thật nhiều số không! Trước khi bạn cười sung sướng trên đường đến ngân hàng giả, hãy nhớ lại bài học về mệnh giá tiền tệ từ trước đó. Các giá trị Ether được biểu thị bằng mệnh giá nhỏ nhất, wei. Chuyển đổi nó sang ether:
+
+```python
+In [8]: w3.from_wei(1000000000000000000000000, 'ether')
+Out[8]: Decimal('1000000')
+```
+
+Một triệu ether thử nghiệm — cũng không tệ chút nào.
+
+## Điểm dừng số 2: dữ liệu khối {#tour-stop-2-block-data}
+
+Hãy xem qua trạng thái của chuỗi khối mô phỏng này:
+
+```python
+In [9]: w3.eth.get_block('latest')
+Out[9]: AttributeDict({
+ 'number': 0,
+ 'hash': HexBytes('0x9469878...'),
+ 'parentHash': HexBytes('0x0000000...'),
+ ...
+ 'transactions': []
+})
+```
+
+Rất nhiều thông tin được trả về về một khối, nhưng chỉ có một vài điều cần chỉ ra ở đây:
+
+- Số khối là không — bất kể bạn đã cấu hình nhà cung cấp thử nghiệm từ bao lâu. Không giống như mạng Ethereum thực, nơi một khối mới được thêm vào sau mỗi 12 giây, mô phỏng này sẽ đợi cho đến khi bạn giao cho nó một số công việc để thực hiện.
+- `transactions` là một danh sách trống, vì cùng một lý do: chúng ta chưa làm gì cả. Khối đầu tiên này là một **khối trống**, chỉ để khởi động chuỗi.
+- Lưu ý rằng `parentHash` chỉ là một loạt các byte trống. Điều này biểu thị rằng đây là khối đầu tiên trong chuỗi, còn được gọi là **khối khởi nguyên**.
+
+## Điểm dừng số 3: [giao dịch](/developers/docs/transactions/) {#tour-stop-3-transactions}
+
+Chúng ta bị kẹt ở khối số không cho đến khi có một giao dịch đang chờ xử lý, vì vậy hãy tạo một giao dịch. Gửi một vài ether thử nghiệm từ tài khoản này sang tài khoản khác:
+
+```python
+In [10]: tx_hash = w3.eth.send_transaction({
+ 'from': w3.eth.accounts[0],
+ 'to': w3.eth.accounts[1],
+ 'value': w3.to_wei(3, 'ether'),
+ 'gas': 21000
+})
+```
+
+Đây thường là thời điểm bạn sẽ phải đợi vài giây để giao dịch của mình được đưa vào một khối mới. Toàn bộ quá trình diễn ra như sau:
+
+1. Gửi một giao dịch và giữ lại hàm băm của giao dịch. Cho đến khi khối chứa giao dịch được tạo và quảng bá, giao dịch đó ở trạng thái “đang chờ xử lý”.
+ `tx_hash = w3.eth.send_transaction({ … `})\`
+2. Đợi giao dịch được đưa vào một khối:
+ `w3.eth.wait_for_transaction_receipt(tx_hash)`
+3. Tiếp tục logic ứng dụng. Để xem giao dịch thành công:
+ `w3.eth.get_transaction(tx_hash)`
+
+Môi trường mô phỏng của chúng ta sẽ thêm giao dịch vào một khối mới ngay lập tức, vì vậy chúng ta có thể xem giao dịch ngay lập tức:
+
+```python
+In [11]: w3.eth.get_transaction(tx_hash)
+Out[11]: AttributeDict({
+ 'hash': HexBytes('0x15e9fb95dc39...'),
+ 'blockNumber': 1,
+ 'transactionIndex': 0,
+ 'from': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
+ 'to': '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',
+ 'value': 3000000000000000000,
+ ...
+})
+```
+
+Bạn sẽ thấy một số chi tiết quen thuộc ở đây: các trường `from`, `to` và `value` phải khớp với các đầu vào của lệnh gọi `send_transaction` của chúng ta. Một điểm đáng yên tâm khác là giao dịch này đã được đưa vào với tư cách là giao dịch đầu tiên (`'transactionIndex': 0`) trong khối số 1.
+
+Chúng ta cũng có thể dễ dàng xác minh sự thành công của giao dịch này bằng cách kiểm tra số dư của hai tài khoản liên quan. Ba ether lẽ ra đã được chuyển từ tài khoản này sang tài khoản khác.
+
+```python
+In [12]: w3.eth.get_balance(w3.eth.accounts[0])
+Out[12]: 999996999979000000000000
+
+In [13]: w3.eth.get_balance(w3.eth.accounts[1])
+Out[13]: 1000003000000000000000000
+```
+
+Số dư sau có vẻ đúng! Số dư đã tăng từ 1.000.000 lên 1.000.003 ether. Nhưng chuyện gì đã xảy ra với tài khoản đầu tiên? Có vẻ như nó đã mất nhiều hơn ba ether một chút. Than ôi, không có gì trong cuộc sống là miễn phí, và việc sử dụng mạng công cộng Ethereum đòi hỏi bạn phải trả công cho các nút ngang hàng vì vai trò hỗ trợ của họ. Một khoản phí giao dịch nhỏ đã được khấu trừ từ tài khoản đã gửi giao dịch - khoản phí này là lượng gas đã đốt (21000 đơn vị gas cho một lần chuyển ETH) nhân với một khoản phí cơ bản thay đổi tùy theo hoạt động của mạng cộng với một khoản tiền boa dành cho trình xác thực đã đưa giao dịch vào một khối.
+
+Thông tin thêm về [gas](/developers/docs/gas/#post-london)
+
+Lưu ý: Trên mạng công cộng, phí giao dịch có thể thay đổi dựa trên nhu cầu của mạng và tốc độ bạn muốn giao dịch được xử lý. Nếu bạn quan tâm đến việc phân tích chi tiết cách tính phí, hãy xem bài đăng trước của tôi về cách các giao dịch được đưa vào một khối.
+
+## Và nghỉ một chút {#and-breathe}
+
+Chúng ta đã làm việc này được một lúc, vì vậy đây có vẻ là một thời điểm tốt để nghỉ ngơi. Hành trình khám phá vẫn tiếp tục, và chúng ta sẽ tiếp tục khám phá trong phần hai của loạt bài này. Một số khái niệm sắp tới: kết nối với một nút thực, hợp đồng thông minh, và token. Bạn có câu hỏi nào thêm không? Hãy cho tôi biết! Phản hồi của bạn sẽ ảnh hưởng đến hướng đi tiếp theo của chúng tôi. Chào mừng các yêu cầu qua [Twitter](https://twitter.com/wolovim).
diff --git a/public/content/translations/vi/developers/tutorials/all-you-can-cache/index.md b/public/content/translations/vi/developers/tutorials/all-you-can-cache/index.md
new file mode 100644
index 00000000000..500f2c32cb1
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/all-you-can-cache/index.md
@@ -0,0 +1,867 @@
+---
+title: "Tất cả những gì bạn có thể lưu vào bộ nhớ đệm"
+description: Tìm hiểu cách tạo và sử dụng hợp đồng bộ nhớ đệm cho các giao dịch rollup rẻ hơn
+author: Ori Pomerantz
+tags: [ "lớp 2", "bộ nhớ đệm", "lưu trữ" ]
+skill: intermediate
+published: 2022-09-15
+lang: vi
+---
+
+Khi sử dụng các rollup, chi phí của một byte trong giao dịch đắt hơn nhiều so với chi phí của một khe lưu trữ. Do đó, việc lưu vào bộ nhớ đệm càng nhiều thông tin trên chuỗi càng tốt.
+
+Trong bài viết này, bạn sẽ tìm hiểu cách tạo và sử dụng hợp đồng bộ nhớ đệm theo cách mà bất kỳ giá trị tham số nào có khả năng được sử dụng nhiều lần sẽ được lưu vào bộ nhớ đệm và có sẵn để sử dụng (sau lần đầu tiên) với số byte nhỏ hơn nhiều, và cách viết mã ngoài chuỗi sử dụng bộ nhớ đệm này.
+
+Nếu bạn muốn bỏ qua bài viết và chỉ xem mã nguồn, [nó ở đây](https://github.com/qbzzt/20220915-all-you-can-cache). Ngăn xếp phát triển là [Foundry](https://getfoundry.sh/introduction/installation/).
+
+## Thiết kế tổng thể {#overall-design}
+
+Để đơn giản, chúng ta sẽ giả định tất cả các tham số giao dịch là `uint256`, dài 32 byte. Khi chúng tôi nhận được một giao dịch, chúng tôi sẽ phân tích từng tham số như sau:
+
+1. Nếu byte đầu tiên là `0xFF`, hãy lấy 32 byte tiếp theo làm giá trị tham số và ghi nó vào bộ nhớ đệm.
+
+2. Nếu byte đầu tiên là `0xFE`, hãy lấy 32 byte tiếp theo làm giá trị tham số nhưng _không_ ghi nó vào bộ nhớ đệm.
+
+3. Đối với bất kỳ giá trị nào khác, hãy lấy bốn bit trên cùng làm số byte bổ sung và bốn bit dưới cùng làm các bit có nghĩa nhất của khóa bộ nhớ đệm. Đây là một vài ví dụ:
+
+ | Các byte trong dữ liệu lệnh gọi | Khóa bộ nhớ đệm |
+ | :------------------------------ | --------------: |
+ | 0x0F | 0x0F |
+ | 0x10,0x10 | 0x10 |
+ | 0x12,0xAC | 0x02AC |
+ | 0x2D,0xEA, 0xD6 | 0x0DEAD6 |
+
+## Thao tác bộ nhớ đệm {#cache-manipulation}
+
+Bộ nhớ đệm được triển khai trong [`Cache.sol`](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol). Hãy xem xét từng dòng một.
+
+```solidity
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+
+contract Cache {
+
+ bytes1 public constant INTO_CACHE = 0xFF;
+ bytes1 public constant DONT_CACHE = 0xFE;
+```
+
+Các hằng số này được sử dụng để diễn giải các trường hợp đặc biệt mà chúng tôi cung cấp tất cả thông tin và muốn hoặc không muốn nó được ghi vào bộ nhớ đệm. Việc ghi vào bộ nhớ đệm đòi hỏi hai thao tác [`SSTORE`](https://www.evm.codes/#55) vào các khe lưu trữ chưa được sử dụng trước đây với chi phí 22100 gas mỗi lần, vì vậy chúng tôi đặt nó làm tùy chọn.
+
+```solidity
+
+ mapping(uint => uint) public val2key;
+```
+
+[Ánh xạ](https://www.geeksforgeeks.org/solidity/solidity-mappings/) giữa các giá trị và khóa của chúng. Thông tin này là cần thiết để mã hóa các giá trị trước khi bạn gửi giao dịch.
+
+```solidity
+ // Vị trí n có giá trị cho khóa n+1, vì chúng ta cần giữ lại
+ // giá trị không là "không có trong bộ nhớ đệm".
+ uint[] public key2val;
+```
+
+Chúng ta có thể sử dụng một mảng để ánh xạ từ khóa đến giá trị vì chúng ta gán các khóa, và để đơn giản, chúng ta thực hiện tuần tự.
+
+```solidity
+ function cacheRead(uint _key) public view returns (uint) {
+ require(_key <= key2val.length, "Reading uninitialize cache entry");
+ return key2val[_key-1];
+ } // cacheRead
+```
+
+Đọc một giá trị từ bộ nhớ đệm.
+
+```solidity
+ // Ghi một giá trị vào bộ nhớ đệm nếu nó chưa có ở đó
+ // Chỉ ở chế độ công khai để cho phép kiểm thử hoạt động
+ function cacheWrite(uint _value) public returns (uint) {
+ // Nếu giá trị đã có trong bộ nhớ đệm, trả về khóa hiện tại
+ if (val2key[_value] != 0) {
+ return val2key[_value];
+ }
+```
+
+Không có ích gì khi đặt cùng một giá trị vào bộ nhớ đệm nhiều hơn một lần. Nếu giá trị đã có ở đó, chỉ cần trả về khóa hiện có.
+
+```solidity
+ // Vì 0xFE là một trường hợp đặc biệt, khóa lớn nhất mà bộ nhớ đệm có thể
+ // chứa là 0x0D theo sau là 15 lần 0xFF. Nếu độ dài bộ nhớ đệm đã là
+ // lớn như vậy, thì sẽ thất bại.
+ // 1 2 3 4 5 6 7 8 9 A B C D E F
+ require(key2val.length+1 < 0x0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
+ "tràn bộ nhớ đệm");
+```
+
+Tôi không nghĩ chúng ta sẽ có một bộ nhớ đệm lớn đến vậy (khoảng 1,8\*1037 mục, cần khoảng 1027 TB để lưu trữ). Tuy nhiên, tôi đủ già để nhớ câu ["640kB sẽ luôn đủ"](https://quoteinvestigator.com/2011/09/08/640k-enough/). Kiểm thử này rất rẻ.
+
+```solidity
+ // Ghi giá trị bằng cách sử dụng khóa tiếp theo
+ val2key[_value] = key2val.length+1;
+```
+
+Thêm tra cứu ngược (từ giá trị đến khóa).
+
+```solidity
+ key2val.push(_value);
+```
+
+Thêm tra cứu xuôi (từ khóa đến giá trị). Vì chúng ta gán các giá trị một cách tuần tự, chúng ta chỉ cần thêm nó vào sau giá trị mảng cuối cùng.
+
+```solidity
+ return key2val.length;
+ } // cacheWrite
+```
+
+Trả về độ dài mới của `key2val`, là ô chứa giá trị mới được lưu trữ.
+
+```solidity
+ function _calldataVal(uint startByte, uint length)
+ private pure returns (uint)
+```
+
+Hàm này đọc một giá trị từ dữ liệu lệnh gọi có độ dài tùy ý (lên đến 32 byte, kích thước của một từ).
+
+```solidity
+ {
+ uint _retVal;
+
+ require(length < 0x21,
+ "Giới hạn độ dài của _calldataVal là 32 byte");
+ require(length + startByte <= msg.data.length,
+ "_calldataVal đang cố đọc vượt quá kích thước dữ liệu lệnh gọi");
+```
+
+Hàm này là nội bộ, vì vậy nếu phần còn lại của mã được viết chính xác, các kiểm thử này không bắt buộc. Tuy nhiên, chúng không tốn kém nhiều nên chúng ta cũng có thể giữ chúng.
+
+```solidity
+ assembly {
+ _retVal := calldataload(startByte)
+ }
+```
+
+Mã này nằm trong [Yul](https://docs.soliditylang.org/en/v0.8.16/yul.html). Nó đọc một giá trị 32 byte từ dữ liệu lệnh gọi. Điều này hoạt động ngay cả khi dữ liệu lệnh gọi dừng trước `startByte+32` vì không gian chưa được khởi tạo trong Máy ảo Ethereum (EVM) được coi là bằng không.
+
+```solidity
+ _retVal = _retVal >> (256-length*8);
+```
+
+Chúng ta không nhất thiết muốn có một giá trị 32 byte. Điều này loại bỏ các byte dư thừa.
+
+```solidity
+ return _retVal;
+ } // _calldataVal
+
+
+ // Đọc một tham số duy nhất từ dữ liệu lệnh gọi, bắt đầu từ _fromByte
+ function _readParam(uint _fromByte) internal
+ returns (uint _nextByte, uint _parameterValue)
+ {
+```
+
+Đọc một tham số duy nhất từ dữ liệu lệnh gọi. Lưu ý rằng chúng ta cần trả về không chỉ giá trị đã đọc, mà còn cả vị trí của byte tiếp theo vì các tham số có thể có độ dài từ 1 byte đến 33 byte.
+
+```solidity
+ // Byte đầu tiên cho chúng ta biết cách diễn giải phần còn lại
+ uint8 _firstByte;
+
+ _firstByte = uint8(_calldataVal(_fromByte, 1));
+```
+
+Solidity cố gắng giảm số lượng lỗi bằng cách cấm các [chuyển đổi kiểu ngầm](https://docs.soliditylang.org/en/v0.8.16/types.html#implicit-conversions) tiềm ẩn nguy hiểm. Việc hạ cấp, ví dụ từ 256 bit xuống 8 bit, cần phải được thực hiện một cách rõ ràng.
+
+```solidity
+
+ // Đọc giá trị, nhưng không ghi vào bộ nhớ đệm
+ if (_firstByte == uint8(DONT_CACHE))
+ return(_fromByte+33, _calldataVal(_fromByte+1, 32));
+
+ // Đọc giá trị và ghi vào bộ nhớ đệm
+ if (_firstByte == uint8(INTO_CACHE)) {
+ uint _param = _calldataVal(_fromByte+1, 32);
+ cacheWrite(_param);
+ return(_fromByte+33, _param);
+ }
+
+ // Nếu chúng ta đến đây, điều đó có nghĩa là chúng ta cần đọc từ bộ nhớ đệm
+
+ // Số byte bổ sung để đọc
+ uint8 _extraBytes = _firstByte / 16;
+```
+
+Lấy [nibble](https://en.wikipedia.org/wiki/Nibble) thấp hơn và kết hợp nó với các byte khác để đọc giá trị từ bộ nhớ đệm.
+
+```solidity
+ uint _key = (uint256(_firstByte & 0x0F) << (8*_extraBytes)) +
+ _calldataVal(_fromByte+1, _extraBytes);
+
+ return (_fromByte+_extraBytes+1, cacheRead(_key));
+
+ } // _readParam
+
+
+ // Đọc n tham số (các hàm biết chúng mong đợi bao nhiêu tham số)
+ function _readParams(uint _paramNum) internal returns (uint[] memory) {
+```
+
+Chúng ta có thể lấy số lượng tham số từ chính dữ liệu lệnh gọi, nhưng các hàm gọi chúng ta biết chúng mong đợi bao nhiêu tham số. Để chúng cho chúng ta biết sẽ dễ dàng hơn.
+
+```solidity
+ // Các tham số chúng tôi đọc
+ uint[] memory params = new uint[](_paramNum);
+
+ // Các tham số bắt đầu ở byte 4, trước đó là chữ ký hàm
+ uint _atByte = 4;
+
+ for(uint i=0; i<_paramNum; i++) {
+ (_atByte, params[i]) = _readParam(_atByte);
+ }
+```
+
+Đọc các tham số cho đến khi bạn có đủ số lượng cần thiết. Nếu chúng ta vượt qua cuối dữ liệu lệnh gọi, `_readParams` sẽ hoàn nguyên lệnh gọi.
+
+```solidity
+
+ return(params);
+ } // readParams
+
+ // Để kiểm thử _readParams, hãy kiểm thử việc đọc bốn tham số
+ function fourParam() public
+ returns (uint256,uint256,uint256,uint256)
+ {
+ uint[] memory params;
+ params = _readParams(4);
+ return (params[0], params[1], params[2], params[3]);
+ } // fourParam
+```
+
+Một lợi thế lớn của Foundry là nó cho phép viết các bài kiểm thử bằng Solidity ([xem Kiểm thử bộ nhớ đệm bên dưới](#testing-the-cache)). Điều này giúp việc kiểm thử đơn vị dễ dàng hơn rất nhiều. Đây là một hàm đọc bốn tham số và trả về chúng để bài kiểm thử có thể xác minh chúng là chính xác.
+
+```solidity
+ // Lấy một giá trị, trả về các byte sẽ mã hóa nó (sử dụng bộ nhớ đệm nếu có thể)
+ function encodeVal(uint _val) public view returns(bytes memory) {
+```
+
+`encodeVal` là một hàm mà mã ngoài chuỗi gọi để giúp tạo dữ liệu lệnh gọi sử dụng bộ nhớ đệm. Nó nhận một giá trị duy nhất và trả về các byte mã hóa nó. Hàm này là một `view`, vì vậy nó không yêu cầu giao dịch và khi được gọi từ bên ngoài không tốn bất kỳ gas nào.
+
+```solidity
+ uint _key = val2key[_val];
+
+ // Giá trị chưa có trong bộ nhớ đệm, hãy thêm nó vào
+ if (_key == 0)
+ return bytes.concat(INTO_CACHE, bytes32(_val));
+```
+
+Trong [Máy ảo Ethereum (EVM)](/developers/docs/evm/), tất cả bộ nhớ chưa được khởi tạo được giả định là số không. Vì vậy, nếu chúng ta tìm khóa cho một giá trị không có ở đó, chúng ta sẽ nhận được một số không. Trong trường hợp đó, các byte mã hóa nó là `INTO_CACHE` (để nó sẽ được lưu vào bộ nhớ đệm trong lần tiếp theo), theo sau là giá trị thực tế.
+
+```solidity
+ // Nếu khóa <0x10, trả về nó dưới dạng một byte duy nhất
+ if (_key < 0x10)
+ return bytes.concat(bytes1(uint8(_key)));
+```
+
+Các byte đơn lẻ là dễ nhất. Chúng tôi chỉ sử dụng [`bytes.concat`](https://docs.soliditylang.org/en/v0.8.16/types.html#the-functions-bytes-concat-and-string-concat) để biến một loại `bytes` thành một mảng byte có thể có độ dài bất kỳ. Mặc dù có tên như vậy, nó hoạt động tốt khi được cung cấp chỉ một đối số.
+
+```solidity
+ // Giá trị hai byte, được mã hóa là 0x1vvv
+ if (_key < 0x1000)
+ return bytes.concat(bytes2(uint16(_key) | 0x1000));
+```
+
+Khi chúng ta có một khóa nhỏ hơn 163, chúng ta có thể biểu diễn nó bằng hai byte. Đầu tiên, chúng ta chuyển đổi `_key`, là một giá trị 256 bit, thành một giá trị 16 bit và sử dụng phép toán OR logic để thêm số byte bổ sung vào byte đầu tiên. Sau đó, chúng ta chỉ cần chuyển nó thành một giá trị `bytes2`, có thể được chuyển đổi thành `bytes`.
+
+```solidity
+ // Có lẽ có một cách thông minh để thực hiện các dòng sau dưới dạng một vòng lặp,
+ // nhưng đó là một hàm view nên tôi đang tối ưu hóa thời gian và
+ // sự đơn giản cho lập trình viên.
+
+ 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)));
+```
+
+Các giá trị khác (3 byte, 4 byte, v.v.) được xử lý theo cùng một cách, chỉ với các kích thước trường khác nhau.
+
+```solidity
+ // Nếu chúng ta đến đây, có điều gì đó không ổn.
+ revert("Lỗi trong encodeVal, không nên xảy ra");
+```
+
+Nếu chúng ta đến đây, điều đó có nghĩa là chúng ta đã có một khóa không nhỏ hơn 16\*25615. Nhưng `cacheWrite` giới hạn các khóa nên chúng ta thậm chí không thể đạt đến 14\*25616 (sẽ có byte đầu tiên là 0xFE, vì vậy nó sẽ trông giống như `DONT_CACHE`). Nhưng việc thêm một bài kiểm thử không tốn nhiều chi phí trong trường hợp một lập trình viên tương lai tạo ra một lỗi.
+
+```solidity
+ } // encodeVal
+
+} // Cache
+```
+
+### Kiểm thử bộ nhớ đệm {#testing-the-cache}
+
+Một trong những lợi thế của Foundry là [nó cho phép bạn viết các bài kiểm thử bằng Solidity](https://getfoundry.sh/forge/tests/overview/), giúp viết các bài kiểm thử đơn vị dễ dàng hơn. Các bài kiểm thử cho lớp `Cache` nằm ở [đây](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/Cache.t.sol). Vì mã kiểm thử có tính lặp lại, như các bài kiểm thử thường như vậy, bài viết này chỉ giải thích các phần thú vị.
+
+```solidity
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+import "forge-std/Test.sol";
+
+
+// Cần chạy `forge test -vv` cho bảng điều khiển.
+import "forge-std/console.sol";
+```
+
+Đây chỉ là bản soạn sẵn cần thiết để sử dụng gói kiểm thử và `console.log`.
+
+```solidity
+import "src/Cache.sol";
+```
+
+Chúng ta cần biết hợp đồng mà chúng ta đang kiểm thử.
+
+```solidity
+contract CacheTest is Test {
+ Cache cache;
+
+ function setUp() public {
+ cache = new Cache();
+ }
+```
+
+Hàm `setUp` được gọi trước mỗi lần kiểm thử. Trong trường hợp này, chúng ta chỉ tạo một bộ nhớ đệm mới để các bài kiểm thử của chúng ta sẽ không ảnh hưởng đến nhau.
+
+```solidity
+ function testCaching() public {
+```
+
+Các bài kiểm thử là các hàm có tên bắt đầu bằng `test`. Hàm này kiểm tra chức năng cơ bản của bộ nhớ đệm, ghi các giá trị và đọc lại chúng.
+
+```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);
+```
+
+Đây là cách bạn thực hiện kiểm thử thực tế, bằng cách sử dụng [các hàm `assert...`](https://getfoundry.sh/reference/forge-std/std-assertions/). Trong trường hợp này, chúng ta kiểm tra xem giá trị chúng ta đã viết có phải là giá trị chúng ta đã đọc không. Chúng ta có thể bỏ qua kết quả của `cache.cacheWrite` vì chúng ta biết rằng các khóa bộ nhớ đệm được gán tuyến tính.
+
+```solidity
+ }
+ } // testCaching
+
+
+ // Lưu cùng một giá trị vào bộ nhớ đệm nhiều lần, đảm bảo rằng khóa vẫn
+ // giữ nguyên
+ function testRepeatCaching() public {
+ for(uint i=1; i<100; i++) {
+ uint _key1 = cache.cacheWrite(i);
+ uint _key2 = cache.cacheWrite(i);
+ assertEq(_key1, _key2);
+ }
+```
+
+Đầu tiên, chúng ta viết mỗi giá trị hai lần vào bộ nhớ đệm và đảm bảo rằng các khóa giống nhau (có nghĩa là lần viết thứ hai không thực sự xảy ra).
+
+```solidity
+ for(uint i=1; i<100; i+=3) {
+ uint _key = cache.cacheWrite(i);
+ assertEq(_key, i);
+ }
+ } // testRepeatCaching
+```
+
+Về mặt lý thuyết, có thể có một lỗi không ảnh hưởng đến các lần ghi bộ nhớ đệm liên tiếp. Vì vậy, ở đây chúng ta thực hiện một số lần ghi không liên tiếp và thấy các giá trị vẫn không được ghi lại.
+
+```solidity
+ // Đọc một uint từ bộ đệm bộ nhớ (để đảm bảo chúng tôi nhận lại các tham số
+ // chúng tôi đã gửi đi)
+ function toUint256(bytes memory _bytes, uint256 _start) internal pure
+ returns (uint256)
+```
+
+Đọc một từ 256 bit từ bộ đệm `bytes memory`. Hàm tiện ích này cho phép chúng ta xác minh rằng chúng ta nhận được kết quả chính xác khi chạy một lệnh gọi hàm sử dụng bộ nhớ đệm.
+
+```solidity
+ {
+ require(_bytes.length >= _start + 32, "toUint256_outOfBounds");
+ uint256 tempUint;
+
+ assembly {
+ tempUint := mload(add(add(_bytes, 0x20), _start))
+ }
+```
+
+Yul không hỗ trợ các cấu trúc dữ liệu ngoài `uint256`, vì vậy khi bạn tham chiếu đến một cấu trúc dữ liệu phức tạp hơn, chẳng hạn như bộ đệm bộ nhớ `_bytes`, bạn sẽ nhận được địa chỉ của cấu trúc đó. Solidity lưu trữ các giá trị `bytes memory` dưới dạng một từ 32 byte chứa độ dài, theo sau là các byte thực tế, vì vậy để lấy byte số `_start`, chúng ta cần tính `_bytes+32+_start`.
+
+```solidity
+
+ return tempUint;
+ } // toUint256
+
+ // Chữ ký hàm cho fourParams(), được cung cấp bởi
+ // https://www.4byte.directory/signatures/?bytes4_signature=0x3edc1e6d
+ bytes4 constant FOUR_PARAMS = 0x3edc1e6d;
+
+ // Chỉ là một số giá trị hằng số để xem chúng ta có nhận lại được các giá trị chính xác không
+ uint256 constant VAL_A = 0xDEAD60A7;
+ uint256 constant VAL_B = 0xBEEF;
+ uint256 constant VAL_C = 0x600D;
+ uint256 constant VAL_D = 0x600D60A7;
+```
+
+Một số hằng số chúng ta cần để kiểm thử.
+
+```solidity
+ function testReadParam() public {
+```
+
+Gọi `fourParams()`, một hàm sử dụng `readParams`, để kiểm tra xem chúng ta có thể đọc các tham số một cách chính xác không.
+
+```solidity
+ address _cacheAddr = address(cache);
+ bool _success;
+ bytes memory _callInput;
+ bytes memory _callOutput;
+```
+
+Chúng ta không thể sử dụng cơ chế ABI thông thường để gọi một hàm bằng bộ nhớ đệm, vì vậy chúng ta cần sử dụng cơ chế cấp thấp [`.call()`](https://docs.soliditylang.org/en/v0.8.16/types.html#members-of-addresses). Cơ chế đó lấy `bytes memory` làm đầu vào và trả về điều đó (cũng như một giá trị Boolean) làm đầu ra.
+
+```solidity
+ // Lần gọi đầu tiên, bộ nhớ đệm trống
+ _callInput = bytes.concat(
+ FOUR_PARAMS,
+```
+
+Việc cùng một hợp đồng hỗ trợ cả các hàm được lưu vào bộ nhớ đệm (đối với các lệnh gọi trực tiếp từ các giao dịch) và các hàm không được lưu vào bộ nhớ đệm (đối với các lệnh gọi từ các hợp đồng thông minh khác) là hữu ích. Để làm điều đó, chúng ta cần tiếp tục dựa vào cơ chế Solidity để gọi hàm chính xác, thay vì đặt mọi thứ vào [hàm `fallback`](https://docs.soliditylang.org/en/v0.8.16/contracts.html#fallback-function). Làm điều này giúp khả năng kết hợp dễ dàng hơn rất nhiều. Một byte duy nhất sẽ đủ để xác định hàm trong hầu hết các trường hợp, vì vậy chúng ta đang lãng phí ba byte (16\*3=48 gas). Tuy nhiên, khi tôi viết bài này, 48 gas đó có giá 0,07 xu, đó là một chi phí hợp lý cho mã đơn giản hơn, ít có khả năng bị lỗi hơn.
+
+```solidity
+ // Giá trị đầu tiên, thêm nó vào bộ nhớ đệm
+ cache.INTO_CACHE(),
+ bytes32(VAL_A),
+```
+
+Giá trị đầu tiên: Một cờ cho biết đó là một giá trị đầy đủ cần được ghi vào bộ nhớ đệm, theo sau là 32 byte của giá trị. Ba giá trị khác tương tự, ngoại trừ việc `VAL_B` không được ghi vào bộ nhớ đệm và `VAL_C` vừa là tham số thứ ba vừa là tham số thứ tư.
+
+```solidity
+ .
+ .
+ .
+ );
+ (_success, _callOutput) = _cacheAddr.call(_callInput);
+```
+
+Đây là nơi chúng ta thực sự gọi hợp đồng `Cache`.
+
+```solidity
+ assertEq(_success, true);
+```
+
+Chúng tôi mong đợi cuộc gọi sẽ thành công.
+
+```solidity
+ assertEq(cache.cacheRead(1), VAL_A);
+ assertEq(cache.cacheRead(2), VAL_C);
+```
+
+Chúng tôi bắt đầu với một bộ nhớ đệm trống và sau đó thêm `VAL_A` theo sau là `VAL_C`. Chúng tôi mong đợi cái đầu tiên có khóa 1, và cái thứ hai có 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);
+```
+
+Đầu ra là bốn tham số. Ở đây chúng tôi xác minh nó là chính xác.
+
+```solidity
+ // Lần gọi thứ hai, chúng ta có thể sử dụng bộ nhớ đệm
+ _callInput = bytes.concat(
+ FOUR_PARAMS,
+
+ // Giá trị đầu tiên trong Bộ nhớ đệm
+ bytes1(0x01),
+```
+
+Các khóa bộ nhớ đệm dưới 16 chỉ là một byte.
+
+```solidity
+ // Giá trị thứ hai, không thêm nó vào bộ nhớ đệm
+ cache.DONT_CACHE(),
+ bytes32(VAL_B),
+
+ // Giá trị thứ ba và thứ tư, cùng một giá trị
+ bytes1(0x02),
+ bytes1(0x02)
+ );
+ .
+ .
+ .
+ } // testReadParam
+```
+
+Các bài kiểm thử sau cuộc gọi giống hệt như các bài kiểm thử sau cuộc gọi đầu tiên.
+
+```solidity
+ function testEncodeVal() public {
+```
+
+Hàm này tương tự như `testReadParam`, ngoại trừ việc thay vì viết các tham số một cách rõ ràng, chúng ta sử dụng `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
+```
+
+Bài kiểm thử bổ sung duy nhất trong `testEncodeVal()` là để xác minh rằng độ dài của `_callInput` là chính xác. Đối với cuộc gọi đầu tiên, nó là 4+33\*4. Đối với lần thứ hai, nơi mọi giá trị đã có trong bộ nhớ đệm, nó là 4+1\*4.
+
+```solidity
+ // Kiểm tra encodeVal khi khóa dài hơn một byte
+ // Tối đa ba byte vì việc điền vào bộ nhớ đệm đến bốn byte mất
+ // quá nhiều thời gian.
+ function testEncodeValBig() public {
+ // Đặt một số giá trị vào bộ nhớ đệm.
+ // Để giữ cho mọi thứ đơn giản, hãy sử dụng khóa n cho giá trị n.
+ for(uint i=1; i<0x1FFF; i++) {
+ cache.cacheWrite(i);
+ }
+```
+
+Hàm `testEncodeVal` ở trên chỉ ghi bốn giá trị vào bộ nhớ đệm, vì vậy [phần của hàm xử lý các giá trị nhiều byte](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol#L144-L171) không được kiểm tra. Nhưng mã đó phức tạp và dễ bị lỗi.
+
+Phần đầu tiên của hàm này là một vòng lặp ghi tất cả các giá trị từ 1 đến 0x1FFF vào bộ nhớ đệm theo thứ tự, vì vậy chúng ta sẽ có thể mã hóa các giá trị đó và biết chúng sẽ đi đâu.
+
+```solidity
+ .
+ .
+ .
+
+ _callInput = bytes.concat(
+ FOUR_PARAMS,
+ cache.encodeVal(0x000F), // Một byte 0x0F
+ cache.encodeVal(0x0010), // Hai byte 0x1010
+ cache.encodeVal(0x0100), // Hai byte 0x1100
+ cache.encodeVal(0x1000) // Ba byte 0x201000
+ );
+```
+
+Kiểm tra các giá trị một byte, hai byte và ba byte. Chúng tôi không kiểm tra xa hơn vì sẽ mất quá nhiều thời gian để viết đủ các mục nhập ngăn xếp (ít nhất là 0x10000000, xấp xỉ một phần tư tỷ).
+
+```solidity
+ .
+ .
+ .
+ .
+ } // testEncodeValBig
+
+
+ // Kiểm tra xem với một bộ đệm quá nhỏ, chúng ta có nhận được một sự hoàn nguyên không
+ function testShortCalldata() public {
+```
+
+Kiểm tra điều gì xảy ra trong trường hợp bất thường khi không có đủ tham số.
+
+```solidity
+ .
+ .
+ .
+ (_success, _callOutput) = _cacheAddr.call(_callInput);
+ assertEq(_success, false);
+ } // testShortCalldata
+```
+
+Vì nó hoàn nguyên, kết quả chúng ta nên nhận được là `false`.
+
+```
+ // Gọi với các khóa bộ nhớ đệm không có ở đó
+ function testNoCacheKey() public {
+ .
+ .
+ .
+ _callInput = bytes.concat(
+ FOUR_PARAMS,
+
+ // Giá trị đầu tiên, thêm nó vào bộ nhớ đệm
+ cache.INTO_CACHE(),
+ bytes32(VAL_A),
+
+ // Giá trị thứ hai
+ bytes1(0x0F),
+ bytes2(0x1234),
+ bytes11(0xA10102030405060708090A)
+ );
+```
+
+Hàm này nhận được bốn tham số hoàn toàn hợp lệ, ngoại trừ việc bộ nhớ đệm trống nên không có giá trị nào ở đó để đọc.
+
+```solidity
+ .
+ .
+ .
+ // Kiểm tra xem với một bộ đệm quá dài, mọi thứ đều hoạt động
+ function testLongCalldata() public {
+ address _cacheAddr = address(cache);
+ bool _success;
+ bytes memory _callInput;
+ bytes memory _callOutput;
+
+ // Lần gọi đầu tiên, bộ nhớ đệm trống
+ _callInput = bytes.concat(
+ FOUR_PARAMS,
+
+ // Giá trị đầu tiên, thêm nó vào bộ nhớ đệm
+ cache.INTO_CACHE(), bytes32(VAL_A),
+
+ // Giá trị thứ hai, thêm nó vào bộ nhớ đệm
+ cache.INTO_CACHE(), bytes32(VAL_B),
+
+ // Giá trị thứ ba, thêm nó vào bộ nhớ đệm
+ cache.INTO_CACHE(), bytes32(VAL_C),
+
+ // Giá trị thứ tư, thêm nó vào bộ nhớ đệm
+ cache.INTO_CACHE(), bytes32(VAL_D),
+
+ // Và một giá trị khác để "may mắn"
+ bytes4(0x31112233)
+ );
+```
+
+Hàm này gửi năm giá trị. Chúng tôi biết rằng giá trị thứ năm bị bỏ qua vì nó không phải là một mục nhập bộ nhớ đệm hợp lệ, điều này sẽ gây ra một sự hoàn nguyên nếu nó không được bao gồm.
+
+```solidity
+ (_success, _callOutput) = _cacheAddr.call(_callInput);
+ assertEq(_success, true);
+ .
+ .
+ .
+ } // testLongCalldata
+
+} // CacheTest
+
+```
+
+## Một ứng dụng mẫu {#a-sample-app}
+
+Việc viết các bài kiểm thử bằng Solidity là rất tốt, nhưng cuối cùng, một ứng dụng phi tập trung cần có khả năng xử lý các yêu cầu từ bên ngoài chuỗi để trở nên hữu ích. Bài viết này minh họa cách sử dụng bộ nhớ đệm trong một ứng dụng phi tập trung với `WORM`, viết tắt của "Write Once, Read Many" (Ghi một lần, Đọc nhiều lần). Nếu một khóa chưa được ghi, bạn có thể ghi một giá trị vào đó. Nếu khóa đã được ghi, bạn sẽ nhận được một sự hoàn nguyên.
+
+### Hợp đồng {#the-contract}
+
+[Đây là hợp đồng](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/WORM.sol). Nó chủ yếu lặp lại những gì chúng ta đã làm với `Cache` và `CacheTest`, vì vậy chúng ta chỉ đề cập đến những phần thú vị.
+
+```solidity
+import "./Cache.sol";
+
+contract WORM is Cache {
+```
+
+Cách dễ nhất để sử dụng `Cache` là kế thừa nó trong hợp đồng của chính chúng ta.
+
+```solidity
+ function writeEntryCached() external {
+ uint[] memory params = _readParams(2);
+ writeEntry(params[0], params[1]);
+ } // writeEntryCached
+```
+
+Hàm này tương tự như `fourParam` trong `CacheTest` ở trên. Bởi vì chúng ta không tuân theo các thông số kỹ thuật ABI, tốt nhất là không khai báo bất kỳ tham số nào vào hàm.
+
+```solidity
+ // Giúp việc gọi chúng tôi dễ dàng hơn
+ // Chữ ký hàm cho writeEntryCached(), được cung cấp bởi
+ // https://www.4byte.directory/signatures/?bytes4_signature=0xe4e4f2d3
+ bytes4 constant public WRITE_ENTRY_CACHED = 0xe4e4f2d3;
+```
+
+Mã bên ngoài gọi `writeEntryCached` sẽ cần phải xây dựng dữ liệu lệnh gọi một cách thủ công, thay vì sử dụng `worm.writeEntryCached`, vì chúng ta không tuân theo các thông số kỹ thuật ABI. Việc có giá trị hằng số này chỉ giúp việc viết nó dễ dàng hơn.
+
+Lưu ý rằng mặc dù chúng ta định nghĩa `WRITE_ENTRY_CACHED` là một biến trạng thái, để đọc nó từ bên ngoài, cần phải sử dụng hàm getter cho nó, `worm.WRITE_ENTRY_CACHED()`.
+
+```solidity
+ function readEntry(uint key) public view
+ returns (uint _value, address _writtenBy, uint _writtenAtBlock)
+```
+
+Hàm đọc là một `view`, vì vậy nó không yêu cầu giao dịch và không tốn gas. Do đó, không có lợi ích gì khi sử dụng bộ nhớ đệm cho tham số. Với các hàm view, tốt nhất là sử dụng cơ chế tiêu chuẩn đơn giản hơn.
+
+### Mã kiểm thử {#the-testing-code}
+
+[Đây là mã kiểm thử cho hợp đồng](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/WORM.t.sol). Một lần nữa, chúng ta hãy chỉ xem xét những gì thú vị.
+
+```solidity
+ function testWReadWrite() public {
+ worm.writeEntry(0xDEAD, 0x60A7);
+
+ vm.expectRevert(bytes("entry already written"));
+ worm.writeEntry(0xDEAD, 0xBEEF);
+```
+
+[Điều này (`vm.expectRevert`)](https://book.getfoundry.sh/cheatcodes/expect-revert#expectrevert) là cách chúng ta chỉ định trong một bài kiểm thử Foundry rằng lệnh gọi tiếp theo sẽ thất bại, và lý do được báo cáo cho một thất bại. Điều này áp dụng khi chúng ta sử dụng cú pháp `.()` thay vì xây dựng dữ liệu lệnh gọi và gọi hợp đồng bằng giao diện cấp thấp (`.call()`, v.v.).
+
+```solidity
+ function testReadWriteCached() public {
+ uint cacheGoat = worm.cacheWrite(0x60A7);
+```
+
+Ở đây chúng ta sử dụng thực tế là `cacheWrite` trả về khóa bộ nhớ đệm. Đây không phải là điều chúng ta mong đợi sẽ sử dụng trong sản xuất, vì `cacheWrite` thay đổi trạng thái và do đó chỉ có thể được gọi trong một giao dịch. Các giao dịch không có giá trị trả về, nếu chúng có kết quả, những kết quả đó phải được phát ra dưới dạng các sự kiện. Vì vậy, giá trị trả về của `cacheWrite` chỉ có thể truy cập được từ mã trên chuỗi, và mã trên chuỗi không cần bộ nhớ đệm tham số.
+
+```solidity
+ (_success,) = address(worm).call(_callInput);
+```
+
+Đây là cách chúng ta nói với Solidity rằng mặc dù `.call()` có hai giá trị trả về, chúng ta chỉ quan tâm đến giá trị đầu tiên.
+
+```solidity
+ (_success,) = address(worm).call(_callInput);
+ assertEq(_success, false);
+```
+
+Vì chúng ta sử dụng hàm `.call()` cấp thấp, chúng ta không thể sử dụng `vm.expectRevert()` và phải xem xét giá trị thành công boolean mà chúng ta nhận được từ lệnh gọi.
+
+```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);
+```
+
+Đây là cách chúng ta xác minh rằng mã [phát ra một sự kiện một cách chính xác](https://getfoundry.sh/reference/cheatcodes/expect-emit/) trong Foundry.
+
+### Ứng dụng khách {#the-client}
+
+Một điều bạn không nhận được với các bài kiểm thử Solidity là mã JavaScript mà bạn có thể cắt và dán vào ứng dụng của riêng mình. Để viết mã đó, tôi đã triển khai WORM lên [Optimism Goerli](https://community.optimism.io/docs/useful-tools/networks/#optimism-goerli), mạng thử nghiệm mới của [Optimism](https://www.optimism.io/). Nó ở địa chỉ [`0xd34335b1d818cee54e3323d3246bd31d94e6a78a`](https://goerli-optimism.etherscan.io/address/0xd34335b1d818cee54e3323d3246bd31d94e6a78a).
+
+[Bạn có thể xem mã JavaScript cho ứng dụng khách tại đây](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/javascript/index.js). Để sử dụng nó:
+
+1. Sao chép kho lưu trữ git:
+
+ ```sh
+ git clone https://github.com/qbzzt/20220915-all-you-can-cache.git
+ ```
+
+2. Cài đặt các gói cần thiết:
+
+ ```sh
+ cd javascript
+ yarn
+ ```
+
+3. Sao chép tệp cấu hình:
+
+ ```sh
+ cp .env.example .env
+ ```
+
+4. Chỉnh sửa `.env` cho cấu hình của bạn:
+
+ | Thông số | Giá trị |
+ | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | MNEMONIC | Cụm từ ghi nhớ cho một tài khoản có đủ ETH để thanh toán cho một giao dịch. [Bạn có thể nhận ETH miễn phí cho mạng Optimism Goerli tại đây](https://optimismfaucet.xyz/). |
+ | OPTIMISM_GOERLI_URL | URL đến Optimism Goerli. Điểm cuối công cộng, `https://goerli.optimism.io`, bị giới hạn tốc độ nhưng đủ cho những gì chúng ta cần ở đây |
+
+5. Chạy `index.js`.
+
+ ```sh
+ node index.js
+ ```
+
+ Ứng dụng mẫu này trước tiên ghi một mục vào WORM, hiển thị dữ liệu lệnh gọi và một liên kết đến giao dịch trên Etherscan. Sau đó, nó đọc lại mục đó và hiển thị khóa mà nó sử dụng và các giá trị trong mục (giá trị, số khối và tác giả).
+
+Hầu hết ứng dụng khách là JavaScript Dapp thông thường. Vì vậy, một lần nữa chúng ta sẽ chỉ đi qua các phần thú vị.
+
+```javascript
+.
+.
+.
+const main = async () => {
+ const func = await worm.WRITE_ENTRY_CACHED()
+
+ // Cần một khóa mới mỗi lần
+ const key = await worm.encodeVal(Number(new Date()))
+```
+
+Một khe cắm nhất định chỉ có thể được ghi vào một lần, vì vậy chúng tôi sử dụng dấu thời gian để đảm bảo chúng tôi không sử dụng lại các khe cắm.
+
+```javascript
+const val = await worm.encodeVal("0x600D")
+
+// Ghi một mục
+const calldata = func + key.slice(2) + val.slice(2)
+```
+
+Ethers mong đợi dữ liệu cuộc gọi là một chuỗi hex, `0x` theo sau là một số chẵn các chữ số thập lục phân. Vì cả `key` và `val` đều bắt đầu bằng `0x`, chúng ta cần loại bỏ các tiêu đề đó.
+
+```javascript
+const tx = await worm.populateTransaction.writeEntryCached()
+tx.data = calldata
+
+sentTx = await wallet.sendTransaction(tx)
+```
+
+Cũng như với mã kiểm thử Solidity, chúng ta không thể gọi một hàm được lưu vào bộ nhớ đệm một cách bình thường. Thay vào đó, chúng ta cần sử dụng một cơ chế cấp thấp hơn.
+
+```javascript
+ .
+ .
+ .
+ // Đọc mục vừa được viết
+ const realKey = '0x' + key.slice(4) // xóa cờ FF
+ const entryRead = await worm.readEntry(realKey)
+ .
+ .
+ .
+```
+
+Để đọc các mục, chúng ta có thể sử dụng cơ chế thông thường. Không cần sử dụng bộ nhớ đệm tham số với các hàm `view`.
+
+## Kết luận {#conclusion}
+
+Mã trong bài viết này là một bằng chứng về khái niệm, mục đích là để làm cho ý tưởng dễ hiểu. Đối với một hệ thống sẵn sàng cho sản xuất, bạn có thể muốn triển khai một số chức năng bổ sung:
+
+- Xử lý các giá trị không phải là `uint256`. Ví dụ, chuỗi.
+- Thay vì một bộ nhớ đệm toàn cục, có thể có một ánh xạ giữa người dùng và các bộ nhớ đệm. Những người dùng khác nhau sử dụng các giá trị khác nhau.
+- Các giá trị được sử dụng cho các địa chỉ khác với các giá trị được sử dụng cho các mục đích khác. Có thể hợp lý khi có một bộ nhớ đệm riêng chỉ dành cho các địa chỉ.
+- Hiện tại, các khóa bộ nhớ đệm theo thuật toán "đến trước, khóa nhỏ nhất". Mười sáu giá trị đầu tiên có thể được gửi dưới dạng một byte duy nhất. 4080 giá trị tiếp theo có thể được gửi dưới dạng hai byte. Khoảng một triệu giá trị tiếp theo là ba byte, v.v. Một hệ thống sản xuất nên giữ các bộ đếm sử dụng trên các mục bộ nhớ đệm và sắp xếp lại chúng để mười sáu giá trị _phổ biến nhất_ là một byte, 4080 giá trị phổ biến tiếp theo là hai byte, v.v.
+
+ Tuy nhiên, đó là một hoạt động có khả năng nguy hiểm. Hãy tưởng tượng chuỗi sự kiện sau đây:
+
+ 1. Noam Naive gọi `encodeVal` để mã hóa địa chỉ mà anh ta muốn gửi token đến. Địa chỉ đó là một trong những địa chỉ được sử dụng đầu tiên trên ứng dụng, vì vậy giá trị được mã hóa là 0x06. Đây là một hàm `view`, không phải là một giao dịch, vì vậy nó nằm giữa Noam và nút mà anh ta sử dụng, và không ai khác biết về nó
+
+ 2. Owen Owner chạy hoạt động sắp xếp lại bộ nhớ đệm. Rất ít người thực sự sử dụng địa chỉ đó, vì vậy bây giờ nó được mã hóa là 0x201122. Một giá trị khác, 1018, được gán là 0x06.
+
+ 3. Noam Naive gửi token của mình đến 0x06. Chúng được gửi đến địa chỉ `0x0000000000000000000000000de0b6b3a7640000`, và vì không ai biết khóa riêng tư cho địa chỉ đó, chúng chỉ bị kẹt ở đó. Noam _không hề vui_.
+
+ Có những cách để giải quyết vấn đề này, và vấn đề liên quan của các giao dịch đang trong mempool trong quá trình sắp xếp lại bộ nhớ đệm, nhưng bạn phải nhận thức được nó.
+
+Tôi đã minh họa việc lưu vào bộ nhớ đệm ở đây với Optimism, vì tôi là một nhân viên của Optimism và đây là rollup mà tôi biết rõ nhất. Nhưng nó sẽ hoạt động với bất kỳ rollup nào tính phí tối thiểu cho việc xử lý nội bộ, để so sánh, việc ghi dữ liệu giao dịch vào L1 là chi phí chính.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
+
diff --git a/public/content/translations/vi/developers/tutorials/app-plasma/index.md b/public/content/translations/vi/developers/tutorials/app-plasma/index.md
new file mode 100644
index 00000000000..a5c340b768b
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/app-plasma/index.md
@@ -0,0 +1,1261 @@
+---
+title: Viết một plasma dành riêng cho ứng dụng nhằm bảo vệ quyền riêng tư
+description: Trong hướng dẫn này, chúng ta sẽ xây dựng một ngân hàng bán bí mật để gửi tiền. Ngân hàng là một thành phần tập trung; nó biết số dư của mỗi người dùng. Tuy nhiên, thông tin này không được lưu trữ trên chuỗi. Thay vào đó, ngân hàng đăng một giá trị băm của trạng thái. Mỗi khi một giao dịch xảy ra, ngân hàng sẽ đăng giá trị băm mới, cùng với bằng chứng không tiết lộ thông tin rằng nó có một giao dịch đã ký giúp thay đổi trạng thái băm thành trạng thái mới. Sau khi đọc hướng dẫn này, bạn sẽ không chỉ hiểu cách sử dụng bằng chứng không tiết lộ thông tin, mà còn hiểu lý do tại sao bạn sử dụng chúng và cách thực hiện một cách an toàn.
+author: Ori Pomerantz
+tags:
+ [
+ "không tiết lộ thông tin",
+ "máy chủ",
+ "ngoài chuỗi",
+ "quyền riêng tư"
+ ]
+skill: advanced
+lang: vi
+published: 2025-10-15
+---
+
+## Giới thiệu {#introduction}
+
+Trái ngược với [rollups](/developers/docs/scaling/zk-rollups/), [plasmas](/developers/docs/scaling/plasma) sử dụng mạng chính Ethereum để đảm bảo tính toàn vẹn, nhưng không đảm bảo tính khả dụng. Trong bài viết này, chúng tôi viết một ứng dụng hoạt động giống như một plasma, với Ethereum đảm bảo tính toàn vẹn (không có thay đổi trái phép) nhưng không đảm bảo tính khả dụng (một thành phần tập trung có thể ngừng hoạt động và vô hiệu hóa toàn bộ hệ thống).
+
+Ứng dụng mà chúng tôi viết ở đây là một ngân hàng bảo vệ quyền riêng tư. Các địa chỉ khác nhau có các tài khoản với số dư, và họ có thể gửi tiền (ETH) đến các tài khoản khác. Ngân hàng đăng các giá trị băm của trạng thái (tài khoản và số dư của chúng) và các giao dịch, nhưng giữ số dư thực tế ngoài chuỗi nơi chúng có thể được giữ riêng tư.
+
+## Thiết kế {#design}
+
+Đây không phải là một hệ thống sẵn sàng cho sản xuất, mà là một công cụ giảng dạy. Vì vậy, nó được viết với một số giả định đơn giản hóa.
+
+- Nhóm tài khoản cố định. Có một số lượng tài khoản cụ thể, và mỗi tài khoản thuộc về một địa chỉ được xác định trước. Điều này tạo ra một hệ thống đơn giản hơn nhiều vì rất khó xử lý các cấu trúc dữ liệu có kích thước thay đổi trong các bằng chứng không tiết lộ thông tin. Đối với một hệ thống sẵn sàng cho sản xuất, chúng ta có thể sử dụng [gốc Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) làm giá trị băm trạng thái và cung cấp bằng chứng Merkle cho các số dư được yêu cầu.
+
+- Lưu trữ trong bộ nhớ. Trên một hệ thống sản xuất, chúng ta cần ghi tất cả số dư tài khoản vào đĩa để bảo toàn chúng trong trường hợp khởi động lại. Ở đây, không sao nếu thông tin bị mất.
+
+- Chỉ chuyển khoản. Một hệ thống sản xuất sẽ yêu cầu một cách để gửi tài sản vào ngân hàng và rút chúng ra. Nhưng mục đích ở đây chỉ là để minh họa khái niệm, vì vậy ngân hàng này chỉ giới hạn ở các giao dịch chuyển khoản.
+
+### Bằng chứng không tiết lộ thông tin {#zero-knowledge-proofs}
+
+Ở cấp độ cơ bản, một bằng chứng không tiết lộ thông tin cho thấy người chứng minh biết một số dữ liệu, _Dữ liệuriêng tư_ sao cho có một mối quan hệ _Mối quan hệ_ giữa một số dữ liệu công khai, _Dữ liệucông khai_, và _Dữ liệuriêng tư_. Người xác minh biết _Mối quan hệ_ và _Dữ liệucông khai_.
+
+Để bảo vệ quyền riêng tư, chúng ta cần các trạng thái và giao dịch phải là riêng tư. Nhưng để đảm bảo tính toàn vẹn, chúng ta cần [hàm băm mật mã](https://en.wikipedia.org/wiki/Cryptographic_hash_function) của các trạng thái phải được công khai. Để chứng minh cho những người gửi giao dịch rằng những giao dịch đó đã thực sự xảy ra, chúng ta cũng cần đăng các giá trị băm của giao dịch.
+
+Trong hầu hết các trường hợp, _Dữ liệuriêng tư_ là đầu vào của chương trình bằng chứng không tiết lộ thông tin, và _Dữ liệucông khai_ là đầu ra.
+
+Các trường này trong _Dữ liệuriêng tư_:
+
+- _Trạng tháin_, trạng thái cũ
+- _Trạng tháin+1_, trạng thái mới
+- _Giao dịch_, một giao dịch thay đổi từ trạng thái cũ sang trạng thái mới. Giao dịch này cần bao gồm các trường sau:
+ - _Địa chỉ đích_ nhận chuyển khoản
+ - _Số tiền_ được chuyển
+ - _Nonce_ để đảm bảo mỗi giao dịch chỉ có thể được xử lý một lần.
+ Địa chỉ nguồn không cần phải có trong giao dịch, vì nó có thể được phục hồi từ chữ ký.
+- _Chữ ký_, một chữ ký được ủy quyền để thực hiện giao dịch. Trong trường hợp của chúng ta, địa chỉ duy nhất được ủy quyền để thực hiện giao dịch là địa chỉ nguồn. Bởi vì hệ thống không tiết lộ thông tin của chúng ta hoạt động theo cách của nó, chúng ta cũng cần khóa công khai của tài khoản, ngoài chữ ký Ethereum.
+
+Đây là các trường trong _Dữ liệucông khai_:
+
+- _Băm(Trạng tháin)_ giá trị băm của trạng thái cũ
+- _Băm(Trạng tháin+1)_ giá trị băm của trạng thái mới
+- _Băm(Giao dịch)_ giá trị băm của giao dịch thay đổi trạng thái từ _Trạng tháin_ thành _Trạng tháin+1_.
+
+Mối quan hệ kiểm tra một số điều kiện:
+
+- Các giá trị băm công khai thực sự là các giá trị băm chính xác cho các trường riêng tư.
+- Giao dịch, khi được áp dụng cho trạng thái cũ, sẽ tạo ra trạng thái mới.
+- Chữ ký đến từ địa chỉ nguồn của giao dịch.
+
+Do các thuộc tính của hàm băm mật mã, việc chứng minh các điều kiện này là đủ để đảm bảo tính toàn vẹn.
+
+### Các cấu trúc dữ liệu {#data-structures}
+
+Cấu trúc dữ liệu chính là trạng thái được máy chủ nắm giữ. Đối với mỗi tài khoản, máy chủ theo dõi số dư tài khoản và một [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce), được sử dụng để ngăn chặn [các cuộc tấn công phát lại](https://en.wikipedia.org/wiki/Replay_attack).
+
+### Các thành phần {#components}
+
+Hệ thống này yêu cầu hai thành phần:
+
+- _Máy chủ_ nhận giao dịch, xử lý chúng và đăng các giá trị băm lên chuỗi cùng với các bằng chứng không tiết lộ thông tin.
+- Một _hợp đồng thông minh_ lưu trữ các giá trị băm và xác minh các bằng chứng không tiết lộ thông tin để đảm bảo các chuyển đổi trạng thái là hợp lệ.
+
+### Luồng dữ liệu và điều khiển {#flows}
+
+Đây là các cách mà các thành phần khác nhau giao tiếp để chuyển tiền từ một tài khoản sang tài khoản khác.
+
+1. Một trình duyệt web gửi một giao dịch đã ký yêu cầu chuyển khoản từ tài khoản của người ký đến một tài khoản khác.
+
+2. Máy chủ xác minh rằng giao dịch là hợp lệ:
+
+ - Người ký có một tài khoản trong ngân hàng với số dư đủ.
+ - Người nhận có một tài khoản trong ngân hàng.
+
+3. Máy chủ tính toán trạng thái mới bằng cách trừ số tiền đã chuyển từ số dư của người ký và cộng vào số dư của người nhận.
+
+4. Máy chủ tính toán một bằng chứng không tiết lộ thông tin rằng việc thay đổi trạng thái là hợp lệ.
+
+5. Máy chủ gửi một giao dịch đến Ethereum bao gồm:
+
+ - Giá trị băm trạng thái mới
+ - Giá trị băm giao dịch (để người gửi giao dịch có thể biết nó đã được xử lý)
+ - Bằng chứng không tiết lộ thông tin chứng minh việc chuyển đổi sang trạng thái mới là hợp lệ
+
+6. Hợp đồng thông minh xác minh bằng chứng không tiết lộ thông tin.
+
+7. Nếu bằng chứng không tiết lộ thông tin được kiểm tra thành công, hợp đồng thông minh sẽ thực hiện các hành động sau:
+ - Cập nhật giá trị băm trạng thái hiện tại thành giá trị băm trạng thái mới
+ - Phát ra một mục nhật ký với giá trị băm trạng thái mới và giá trị băm giao dịch
+
+### Công cụ {#tools}
+
+Đối với mã phía máy khách, chúng ta sẽ sử dụng [Vite](https://vite.dev/), [React](https://react.dev/), [Viem](https://viem.sh/) và [Wagmi](https://wagmi.sh/). Đây là những công cụ tiêu chuẩn ngành; nếu bạn không quen thuộc với chúng, bạn có thể sử dụng [hướng dẫn này](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/).
+
+Phần lớn máy chủ được viết bằng JavaScript sử dụng [Node](https://nodejs.org/en). Phần không tiết lộ thông tin được viết bằng [Noir](https://noir-lang.org/). Chúng ta cần phiên bản `1.0.0-beta.10`, vì vậy sau khi bạn [cài đặt Noir theo hướng dẫn](https://noir-lang.org/docs/getting_started/quick_start), hãy chạy:
+
+```
+noirup -v 1.0.0-beta.10
+```
+
+Chuỗi khối chúng ta sử dụng là `anvil`, một chuỗi khối thử nghiệm cục bộ là một phần của [Foundry](https://getfoundry.sh/introduction/installation).
+
+## Triển khai {#implementation}
+
+Vì đây là một hệ thống phức tạp, chúng tôi sẽ triển khai nó theo từng giai đoạn.
+
+### Giai đoạn 1 - Không tiết lộ thông tin thủ công {#stage-1}
+
+Đối với giai đoạn đầu tiên, chúng tôi sẽ ký một giao dịch trong trình duyệt và sau đó cung cấp thông tin theo cách thủ công cho bằng chứng không tiết lộ thông tin. Mã không tiết lộ thông tin dự kiến sẽ nhận thông tin đó trong `server/noir/Prover.toml` (được ghi lại [tại đây](https://noir-lang.org/docs/getting_started/project_breakdown#provertoml-1)).
+
+Để xem nó hoạt động:
+
+1. Đảm bảo rằng bạn đã cài đặt [Node](https://nodejs.org/en/download) và [Noir](https://noir-lang.org/install). Tốt nhất, hãy cài đặt chúng trên một hệ thống UNIX như macOS, Linux hoặc [WSL](https://learn.microsoft.com/en-us/windows/wsl/install).
+
+2. Tải xuống mã giai đoạn 1 và khởi động máy chủ web để phục vụ mã ứng dụng.
+
+ ```sh
+ git clone https://github.com/qbzzt/250911-zk-bank.git -b 01-manual-zk
+ cd 250911-zk-bank
+ cd client
+ npm install
+ npm run dev
+ ```
+
+ Lý do bạn cần một máy chủ web ở đây là để ngăn chặn một số loại gian lận, nhiều ví (chẳng hạn như MetaMask) không chấp nhận các tệp được phục vụ trực tiếp từ đĩa
+
+3. Mở một trình duyệt có ví.
+
+4. Trong ví, nhập một cụm mật khẩu mới. Lưu ý rằng điều này sẽ xóa cụm mật khẩu hiện tại của bạn, vì vậy _hãy đảm bảo bạn đã sao lưu_.
+
+ Cụm mật khẩu là `test test test test test test test test test test test junk`, cụm mật khẩu thử nghiệm mặc định cho anvil.
+
+5. Duyệt đến [mã phía máy khách](http://localhost:5173/).
+
+6. Kết nối với ví và chọn tài khoản đích và số tiền của bạn.
+
+7. Nhấp vào **Ký** và ký giao dịch.
+
+8. Dưới tiêu đề **Prover.toml**, bạn sẽ tìm thấy văn bản. Thay thế `server/noir/Prover.toml` bằng văn bản đó.
+
+9. Thực hiện bằng chứng không tiết lộ thông tin.
+
+ ```sh
+ cd ../server/noir
+ nargo execute
+ ```
+
+ Đầu ra sẽ tương tự như
+
+ ```
+ ori@CryptoDocGuy:~/noir/250911-zk-bank/server/noir$ nargo execute
+
+ [zkBank] Circuit witness successfully solved
+ [zkBank] Witness saved to target/zkBank.gz
+ [zkBank] Circuit output: (0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b, 0x0cfc0a67cb7308e4e9b254026b54204e34f6c8b041be207e64c5db77d95dd82d, 0x450cf9da6e180d6159290554ae3d8787, 0x6d8bc5a15b9037e52fb59b6b98722a85)
+ ```
+
+10. So sánh hai giá trị cuối cùng với giá trị băm bạn thấy trên trình duyệt web để xem liệu thông điệp có được băm chính xác hay không.
+
+#### `server/noir/Prover.toml` {#server-noir-prover-toml}
+
+[Tệp này](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml) hiển thị định dạng thông tin mà Noir mong đợi.
+
+```toml
+message="send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 500 finney (milliEth) 0 "
+```
+
+Thông điệp ở định dạng văn bản, giúp người dùng dễ hiểu (điều cần thiết khi ký) và giúp mã Noir phân tích cú pháp. Số tiền được trích dẫn bằng finney để một mặt cho phép chuyển khoản phân số và mặt khác có thể dễ dàng đọc được. Số cuối cùng là [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce).
+
+Chuỗi dài 100 ký tự. Bằng chứng không tiết lộ thông tin không xử lý tốt dữ liệu có kích thước thay đổi, vì vậy thường cần phải đệm dữ liệu.
+
+```toml
+pubKeyX=["0x83",...,"0x75"]
+pubKeyY=["0x35",...,"0xa5"]
+signature=["0xb1",...,"0x0d"]
+```
+
+Ba tham số này là các mảng byte có kích thước cố định.
+
+```toml
+[[accounts]]
+address="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
+balance=100_000
+nonce=0
+
+[[accounts]]
+address="0x70997970C51812dc3A010C7d01b50e0d17dc79C8"
+balance=100_000
+nonce=0
+```
+
+Đây là cách để chỉ định một mảng các cấu trúc. Đối với mỗi mục nhập, chúng tôi chỉ định địa chỉ, số dư (tính bằng milliETH hay còn gọi là). [finney](https://cryptovalleyjournal.com/glossary/finney/)), và giá trị nonce tiếp theo.
+
+#### `client/src/Transfer.tsx` {#client-src-transfer-tsx}
+
+[Tệp này](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/client/src/Transfer.tsx) triển khai xử lý phía máy khách và tạo tệp `server/noir/Prover.toml` (tệp bao gồm các tham số không tiết lộ thông tin).
+
+Dưới đây là giải thích về những phần thú vị hơn.
+
+```tsx
+export default attrs => {
+```
+
+Hàm này tạo thành phần React `Transfer`, mà các tệp khác có thể nhập.
+
+```tsx
+ const accounts = [
+ "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
+ "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
+ "0x90F79bf6EB2c4f870365E785982E1f101E93b906",
+ "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65",
+ ]
+```
+
+Đây là các địa chỉ tài khoản, các địa chỉ được tạo bởi cụm mật khẩu `test ...` test junk\` passphrase. Nếu bạn muốn sử dụng địa chỉ của riêng mình, chỉ cần sửa đổi định nghĩa này.
+
+```tsx
+ const account = useAccount()
+ const wallet = createWalletClient({
+ transport: custom(window.ethereum!)
+ })
+```
+
+[Hook Wagmi](https://wagmi.sh/react/api/hooks) này cho phép chúng ta truy cập thư viện [viem](https://viem.sh/) và ví.
+
+```tsx
+ const message = `send ${toAccount} ${ethAmount*1000} finney (milliEth) ${nonce}`.padEnd(100, " ")
+```
+
+Đây là thông điệp, được đệm bằng các khoảng trắng. Mỗi khi một trong các biến [`useState`](https://react.dev/reference/react/useState) thay đổi, thành phần sẽ được vẽ lại và `message` được cập nhật.
+
+```tsx
+ const sign = async () => {
+```
+
+Hàm này được gọi khi người dùng nhấp vào nút **Ký**. Thông điệp được cập nhật tự động, nhưng chữ ký yêu cầu sự chấp thuận của người dùng trong ví, và chúng tôi không muốn yêu cầu nó trừ khi cần thiết.
+
+```tsx
+ const signature = await wallet.signMessage({
+ account: fromAccount,
+ message,
+ })
+```
+
+Yêu cầu ví [ký thông điệp](https://viem.sh/docs/accounts/local/signMessage).
+
+```tsx
+ const hash = hashMessage(message)
+```
+
+Lấy giá trị băm của thông điệp. Việc cung cấp nó cho người dùng để gỡ lỗi (mã Noir) là rất hữu ích.
+
+```tsx
+ const pubKey = await recoverPublicKey({
+ hash,
+ signature
+ })
+```
+
+[Lấy khóa công khai](https://viem.sh/docs/utilities/recoverPublicKey). Điều này là bắt buộc đối với hàm [`ecrecover` của Noir](https://github.com/colinnielsen/ecrecover-noir).
+
+```tsx
+ setSignature(signature)
+ setHash(hash)
+ setPubKey(pubKey)
+```
+
+Đặt các biến trạng thái. Làm điều này sẽ vẽ lại thành phần (sau khi hàm `sign` thoát) và hiển thị cho người dùng các giá trị đã cập nhật.
+
+```tsx
+ let proverToml = `
+```
+
+Văn bản cho `Prover.toml`.
+
+```tsx
+message="${message}"
+
+pubKeyX=${hexToArray(pubKey.slice(4,4+2*32))}
+pubKeyY=${hexToArray(pubKey.slice(4+2*32))}
+```
+
+Viem cung cấp cho chúng tôi khóa công khai dưới dạng một chuỗi thập lục phân 65 byte. Byte đầu tiên là `0x04`, một dấu hiệu phiên bản. Tiếp theo là 32 byte cho `x` của khóa công khai và sau đó là 32 byte cho `y` của khóa công khai.
+
+Tuy nhiên, Noir dự kiến sẽ nhận thông tin này dưới dạng hai mảng byte, một cho `x` và một cho `y`. Việc phân tích cú pháp ở đây trên ứng dụng sẽ dễ dàng hơn là một phần của bằng chứng không tiết lộ thông tin.
+
+Lưu ý rằng đây là một thực hành tốt trong không tiết lộ thông tin nói chung. Mã bên trong một bằng chứng không tiết lộ thông tin rất tốn kém, vì vậy bất kỳ xử lý nào có thể được thực hiện bên ngoài bằng chứng không tiết lộ thông tin _nên_ được thực hiện bên ngoài bằng chứng không tiết lộ thông tin.
+
+```tsx
+signature=${hexToArray(signature.slice(2,-2))}
+```
+
+Chữ ký cũng được cung cấp dưới dạng một chuỗi thập lục phân 65 byte. Tuy nhiên, byte cuối cùng chỉ cần thiết để khôi phục khóa công khai. Vì khóa công khai sẽ được cung cấp cho mã Noir, chúng ta không cần nó để xác minh chữ ký, và mã Noir không yêu cầu nó.
+
+```tsx
+${accounts.map(accountInProverToml).reduce((a,b) => a+b, "")}
+`
+```
+
+Cung cấp các tài khoản.
+
+```tsx
+ setProverToml(proverToml)
+ }
+
+ return (
+ <>
+ Transfer
+```
+
+Đây là định dạng HTML (chính xác hơn là [JSX](https://react.dev/learn/writing-markup-with-jsx)) của thành phần.
+
+#### `server/noir/src/main.nr` {#server-noir-src-main-nr}
+
+[Tệp này](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/src/main.nr) là mã không tiết lộ thông tin thực tế.
+
+```
+use std::hash::pedersen_hash;
+```
+
+[Hàm băm Pedersen](https://rya-sge.github.io/access-denied/2024/05/07/pedersen-hash-function/) được cung cấp cùng với [thư viện chuẩn Noir](https://noir-lang.org/docs/noir/standard_library/cryptographic_primitives/hashes#pedersen_hash). Bằng chứng không tiết lộ thông tin thường sử dụng hàm băm này. Nó dễ tính toán hơn nhiều bên trong [các mạch số học](https://rareskills.io/post/arithmetic-circuit) so với các hàm băm tiêu chuẩn.
+
+```
+use keccak256::keccak256;
+use dep::ecrecover;
+```
+
+Hai hàm này là các thư viện bên ngoài, được định nghĩa trong [`Nargo.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Nargo.toml). Chúng chính xác như tên gọi của chúng, một hàm tính toán [hàm băm keccak256](https://emn178.github.io/online-tools/keccak_256.html) và một hàm xác minh chữ ký Ethereum và khôi phục địa chỉ Ethereum của người ký.
+
+```
+global ACCOUNT_NUMBER : u32 = 5;
+```
+
+Noir được lấy cảm hứng từ [Rust](https://www.rust-lang.org/). Các biến, theo mặc định, là các hằng số. Đây là cách chúng ta định nghĩa các hằng số cấu hình toàn cục. Cụ thể, `ACCOUNT_NUMBER` là số lượng tài khoản chúng ta lưu trữ.
+
+Các kiểu dữ liệu có tên `u` là số bit đó, không dấu. Các loại được hỗ trợ duy nhất là `u8`, `u16`, `u32`, `u64` và `u128`.
+
+```
+global FLAT_ACCOUNT_FIELDS : u32 = 2;
+```
+
+Biến này được sử dụng cho hàm băm Pedersen của các tài khoản, như được giải thích bên dưới.
+
+```
+global MESSAGE_LENGTH : u32 = 100;
+```
+
+Như đã giải thích ở trên, độ dài thông điệp là cố định. Nó được chỉ định ở đây.
+
+```
+global ASCII_MESSAGE_LENGTH : [u8; 3] = [0x31, 0x30, 0x30];
+global HASH_BUFFER_SIZE : u32 = 26+3+MESSAGE_LENGTH;
+```
+
+[Chữ ký EIP-191](https://eips.ethereum.org/EIPS/eip-191) yêu cầu một bộ đệm với tiền tố 26 byte, theo sau là độ dài thông điệp bằng ASCII, và cuối cùng là chính thông điệp.
+
+```
+struct Account {
+ balance: u128,
+ address: Field,
+ nonce: u32,
+}
+```
+
+Thông tin chúng tôi lưu trữ về một tài khoản. [`Field`](https://noir-lang.org/docs/noir/concepts/data_types/fields) là một số, thường lên đến 253 bit, có thể được sử dụng trực tiếp trong [mạch số học](https://rareskills.io/post/arithmetic-circuit) triển khai bằng chứng không tiết lộ thông tin. Ở đây chúng ta sử dụng `Field` để lưu trữ một địa chỉ Ethereum 160-bit.
+
+```
+struct TransferTxn {
+ from: Field,
+ to: Field,
+ amount: u128,
+ nonce: u32
+}
+```
+
+Thông tin chúng tôi lưu trữ cho một giao dịch chuyển khoản.
+
+```
+fn flatten_account(account: Account) -> [Field; FLAT_ACCOUNT_FIELDS] {
+```
+
+Một định nghĩa hàm. Tham số là thông tin `Account`. Kết quả là một mảng các biến `Field`, có độ dài là `FLAT_ACCOUNT_FIELDS`
+
+```
+ let flat = [
+ account.address,
+ ((account.balance << 32) + account.nonce.into()).into(),
+ ];
+```
+
+Giá trị đầu tiên trong mảng là địa chỉ tài khoản. Giá trị thứ hai bao gồm cả số dư và nonce. Các lệnh gọi `.into()` thay đổi một số thành kiểu dữ liệu mà nó cần. `account.nonce` là một giá trị `u32`, nhưng để cộng nó vào `account.balance << 32`, một giá trị `u128`, nó cần phải là một `u128`. Đó là `.into()` đầu tiên. Cái thứ hai chuyển đổi kết quả `u128` thành một `Field` để nó vừa với mảng.
+
+```
+ flat
+}
+```
+
+Trong Noir, các hàm chỉ có thể trả về một giá trị ở cuối (không có trả về sớm). Để chỉ định giá trị trả về, bạn đánh giá nó ngay trước dấu ngoặc đóng của hàm.
+
+```
+fn flatten_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] {
+```
+
+Hàm này biến mảng tài khoản thành một mảng `Field`, có thể được sử dụng làm đầu vào cho Hàm băm Petersen.
+
+```
+ let mut flat: [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] = [0; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER];
+```
+
+Đây là cách bạn chỉ định một biến có thể thay đổi, tức là _không phải_ là hằng số. Các biến trong Noir phải luôn có một giá trị, vì vậy chúng ta khởi tạo biến này thành toàn số không.
+
+```
+ for i in 0..ACCOUNT_NUMBER {
+```
+
+Đây là một vòng lặp `for`. Lưu ý rằng các ranh giới là hằng số. Các vòng lặp Noir phải có các ranh giới của chúng được biết tại thời điểm biên dịch. Lý do là các mạch số học không hỗ trợ điều khiển luồng. Khi xử lý một vòng lặp `for`, trình biên dịch chỉ đơn giản là đặt mã bên trong nó nhiều lần, một lần cho mỗi lần lặp.
+
+```
+ let fields = flatten_account(accounts[i]);
+ for j in 0..FLAT_ACCOUNT_FIELDS {
+ flat[i*FLAT_ACCOUNT_FIELDS + j] = fields[j];
+ }
+ }
+
+ flat
+}
+
+fn hash_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> Field {
+ pedersen_hash(flatten_accounts(accounts))
+}
+```
+
+Cuối cùng, chúng ta đã đến hàm băm mảng tài khoản.
+
+```
+fn find_account(accounts: [Account; ACCOUNT_NUMBER], address: Field) -> u32 {
+ let mut account : u32 = ACCOUNT_NUMBER;
+
+ for i in 0..ACCOUNT_NUMBER {
+ if accounts[i].address == address {
+ account = i;
+ }
+ }
+```
+
+Hàm này tìm tài khoản có một địa chỉ cụ thể. Hàm này sẽ cực kỳ kém hiệu quả trong mã tiêu chuẩn vì nó lặp qua tất cả các tài khoản, ngay cả sau khi đã tìm thấy địa chỉ.
+
+Tuy nhiên, trong bằng chứng không tiết lộ thông tin, không có điều khiển luồng. Nếu chúng ta cần kiểm tra một điều kiện, chúng ta phải kiểm tra nó mỗi lần.
+
+Một điều tương tự xảy ra với các câu lệnh `if`. Câu lệnh `if` trong vòng lặp trên được dịch thành các câu lệnh toán học này.
+
+_kết quảđiều kiện = tài khoản[i].địa chỉ == địa chỉ_ // một nếu chúng bằng nhau, không nếu ngược lại
+
+_tài khoảnmới = kết quảđiều kiện\*i + (1-kết quảđiều kiện)\*tài khoảncũ_
+
+```rust
+ assert (account < ACCOUNT_NUMBER, f"{address} does not have an account");
+
+ account
+}
+```
+
+Hàm [`assert`](https://noir-lang.org/docs/dev/noir/concepts/assert) làm cho bằng chứng không tiết lộ thông tin bị sập nếu khẳng định là sai. Trong trường hợp này, nếu chúng ta không thể tìm thấy một tài khoản với địa chỉ liên quan. Để báo cáo địa chỉ, chúng tôi sử dụng một [chuỗi định dạng](https://noir-lang.org/docs/noir/concepts/data_types/strings#format-strings).
+
+```rust
+fn apply_transfer_txn(accounts: [Account; ACCOUNT_NUMBER], txn: TransferTxn) -> [Account; ACCOUNT_NUMBER] {
+```
+
+Hàm này áp dụng một giao dịch chuyển khoản và trả về mảng tài khoản mới.
+
+```rust
+ let from = find_account(accounts, txn.from);
+ let to = find_account(accounts, txn.to);
+
+ let (txnFrom, txnAmount, txnNonce, accountNonce) =
+ (txn.from, txn.amount, txn.nonce, accounts[from].nonce);
+```
+
+Chúng tôi không thể truy cập các phần tử cấu trúc bên trong một chuỗi định dạng trong Noir, vì vậy chúng tôi tạo một bản sao có thể sử dụng được.
+
+```rust
+ assert (accounts[from].balance >= txn.amount,
+ f"{txnFrom} does not have {txnAmount} finney");
+
+ assert (accounts[from].nonce == txn.nonce,
+ f"Transaction has nonce {txnNonce}, but the account is expected to use {accountNonce}");
+```
+
+Đây là hai điều kiện có thể làm cho một giao dịch không hợp lệ.
+
+```rust
+ let mut newAccounts = accounts;
+
+ newAccounts[from].balance -= txn.amount;
+ newAccounts[from].nonce += 1;
+ newAccounts[to].balance += txn.amount;
+
+ newAccounts
+}
+```
+
+Tạo mảng tài khoản mới và sau đó trả về nó.
+
+```rust
+fn readAddress(messageBytes: [u8; MESSAGE_LENGTH]) -> Field
+```
+
+Hàm này đọc địa chỉ từ thông điệp.
+
+```rust
+{
+ let mut result : Field = 0;
+
+ for i in 7..47 {
+```
+
+Địa chỉ luôn dài 20 byte (hay còn gọi là 40 chữ số thập lục phân), và bắt đầu ở ký tự #7.
+
+```rust
+ result *= 0x10;
+ if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9
+ result += (messageBytes[i]-48).into();
+ }
+ if messageBytes[i] >= 65 & messageBytes[i] <= 70 { // A-F
+ result += (messageBytes[i]-65+10).into()
+ }
+ if messageBytes[i] >= 97 & messageBytes[i] <= 102 { // a-f
+ result += (messageBytes[i]-97+10).into()
+ }
+ }
+
+ result
+}
+
+fn readAmountAndNonce(messageBytes: [u8; MESSAGE_LENGTH]) -> (u128, u32)
+```
+
+Đọc số tiền và nonce từ thông điệp.
+
+```rust
+{
+ let mut amount : u128 = 0;
+ let mut nonce: u32 = 0;
+ let mut stillReadingAmount: bool = true;
+ let mut lookingForNonce: bool = false;
+ let mut stillReadingNonce: bool = false;
+```
+
+Trong thông điệp, số đầu tiên sau địa chỉ là số lượng finney (hay còn gọi là một phần nghìn của một ETH) để chuyển. Số thứ hai là nonce. Bất kỳ văn bản nào giữa chúng đều bị bỏ qua.
+
+```rust
+ for i in 48..MESSAGE_LENGTH {
+ if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9
+ let digit = (messageBytes[i]-48);
+
+ if stillReadingAmount {
+ amount = amount*10 + digit.into();
+ }
+
+ if lookingForNonce { // We just found it
+ stillReadingNonce = true;
+ lookingForNonce = false;
+ }
+
+ if stillReadingNonce {
+ nonce = nonce*10 + digit.into();
+ }
+ } else {
+ if stillReadingAmount {
+ stillReadingAmount = false;
+ lookingForNonce = true;
+ }
+ if stillReadingNonce {
+ stillReadingNonce = false;
+ }
+ }
+ }
+
+ (amount, nonce)
+}
+```
+
+Trả về một [bộ](https://noir-lang.org/docs/noir/concepts/data_types/tuples) là cách của Noir để trả về nhiều giá trị từ một hàm.
+
+```rust
+fn readTransferTxn(message: str) -> TransferTxn
+{
+ let mut txn: TransferTxn = TransferTxn { from: 0, to: 0, amount:0, nonce:0 };
+ let messageBytes = message.as_bytes();
+
+ txn.to = readAddress(messageBytes);
+ let (amount, nonce) = readAmountAndNonce(messageBytes);
+ txn.amount = amount;
+ txn.nonce = nonce;
+
+ txn
+}
+```
+
+Hàm này chuyển đổi thông điệp thành các byte, sau đó chuyển đổi số tiền thành một `TransferTxn`.
+
+```rust
+// The equivalent to Viem's hashMessage
+// https://viem.sh/docs/utilities/hashMessage#hashmessage
+fn hashMessage(message: str) -> [u8;32] {
+```
+
+Chúng tôi có thể sử dụng Hàm băm Pedersen cho các tài khoản vì chúng chỉ được băm bên trong bằng chứng không tiết lộ thông tin. Tuy nhiên, trong mã này, chúng tôi cần kiểm tra chữ ký của thông điệp, được tạo bởi trình duyệt. Để làm được điều đó, chúng ta cần tuân theo định dạng ký của Ethereum trong [EIP 191](https://eips.ethereum.org/EIPS/eip-191). Điều này có nghĩa là chúng ta cần tạo một bộ đệm kết hợp với một tiền tố tiêu chuẩn, độ dài thông điệp bằng ASCII, và chính thông điệp, và sử dụng hàm keccak256 tiêu chuẩn của Ethereum để băm nó.
+
+```rust
+ // ASCII prefix
+ let prefix_bytes = [
+ 0x19, // \x19
+ 0x45, // 'E'
+ 0x74, // 't'
+ 0x68, // 'h'
+ 0x65, // 'e'
+ 0x72, // 'r'
+ 0x65, // 'e'
+ 0x75, // 'u'
+ 0x6D, // 'm'
+ 0x20, // ' '
+ 0x53, // 'S'
+ 0x69, // 'i'
+ 0x67, // 'g'
+ 0x6E, // 'n'
+ 0x65, // 'e'
+ 0x64, // 'd'
+ 0x20, // ' '
+ 0x4D, // 'M'
+ 0x65, // 'e'
+ 0x73, // 's'
+ 0x73, // 's'
+ 0x61, // 'a'
+ 0x67, // 'g'
+ 0x65, // 'e'
+ 0x3A, // ':'
+ 0x0A // '\n'
+ ];
+```
+
+Để tránh các trường hợp một ứng dụng yêu cầu người dùng ký một thông điệp có thể được sử dụng như một giao dịch hoặc cho một mục đích khác, EIP 191 chỉ định rằng tất cả các thông điệp đã ký bắt đầu bằng ký tự 0x19 (không phải là ký tự ASCII hợp lệ) theo sau là `Ethereum Signed Message:` và một dòng mới.
+
+```rust
+ let mut buffer: [u8; HASH_BUFFER_SIZE] = [0u8; HASH_BUFFER_SIZE];
+ for i in 0..26 {
+ buffer[i] = prefix_bytes[i];
+ }
+
+ let messageBytes : [u8; MESSAGE_LENGTH] = message.as_bytes();
+
+ if MESSAGE_LENGTH <= 9 {
+ for i in 0..1 {
+ buffer[i+26] = ASCII_MESSAGE_LENGTH[i];
+ }
+
+ for i in 0..MESSAGE_LENGTH {
+ buffer[i+26+1] = messageBytes[i];
+ }
+ }
+
+ if MESSAGE_LENGTH >= 10 & MESSAGE_LENGTH <= 99 {
+ for i in 0..2 {
+ buffer[i+26] = ASCII_MESSAGE_LENGTH[i];
+ }
+
+ for i in 0..MESSAGE_LENGTH {
+ buffer[i+26+2] = messageBytes[i];
+ }
+ }
+
+ if MESSAGE_LENGTH >= 100 {
+ for i in 0..3 {
+ buffer[i+26] = ASCII_MESSAGE_LENGTH[i];
+ }
+
+ for i in 0..MESSAGE_LENGTH {
+ buffer[i+26+3] = messageBytes[i];
+ }
+ }
+
+ assert(MESSAGE_LENGTH < 1000, "Messages whose length is over three digits are not supported");
+```
+
+Xử lý độ dài thông điệp lên đến 999 và thất bại nếu lớn hơn. Tôi đã thêm mã này, mặc dù độ dài thông điệp là một hằng số, bởi vì nó giúp việc thay đổi nó dễ dàng hơn. Trên một hệ thống sản xuất, bạn có thể chỉ cần giả định `MESSAGE_LENGTH` không thay đổi để có hiệu suất tốt hơn.
+
+```rust
+ keccak256::keccak256(buffer, HASH_BUFFER_SIZE)
+}
+```
+
+Sử dụng hàm `keccak256` tiêu chuẩn của Ethereum.
+
+```rust
+fn signatureToAddressAndHash(
+ message: str,
+ pubKeyX: [u8; 32],
+ pubKeyY: [u8; 32],
+ signature: [u8; 64]
+ ) -> (Field, Field, Field) // address, first 16 bytes of hash, last 16 bytes of hash
+{
+```
+
+Hàm này xác minh chữ ký, yêu cầu giá trị băm của thông điệp. Sau đó, nó cung cấp cho chúng tôi địa chỉ đã ký nó và giá trị băm của thông điệp. Giá trị băm của thông điệp được cung cấp trong hai giá trị `Field` vì chúng dễ sử dụng hơn trong phần còn lại của chương trình so với một mảng byte.
+
+Chúng ta cần sử dụng hai giá trị `Field` vì các phép tính trường được thực hiện theo [modulo](https://en.wikipedia.org/wiki/Modulo) một số lớn, nhưng số đó thường nhỏ hơn 256 bit (nếu không sẽ khó thực hiện các phép tính đó trong EVM).
+
+```rust
+ let hash = hashMessage(message);
+
+ let mut (hash1, hash2) = (0,0);
+
+ for i in 0..16 {
+ hash1 = hash1*256 + hash[31-i].into();
+ hash2 = hash2*256 + hash[15-i].into();
+ }
+```
+
+Chỉ định `hash1` và `hash2` là các biến có thể thay đổi, và ghi giá trị băm vào chúng từng byte một.
+
+```rust
+ (
+ ecrecover::ecrecover(pubKeyX, pubKeyY, signature, hash),
+```
+
+Điều này tương tự như [`ecrecover` của Solidity](https://docs.soliditylang.org/en/v0.8.30/cheatsheet.html#mathematical-and-cryptographic-functions), với hai điểm khác biệt quan trọng:
+
+- Nếu chữ ký không hợp lệ, lệnh gọi sẽ thất bại ở `assert` và chương trình sẽ bị hủy bỏ.
+- Mặc dù khóa công khai có thể được khôi phục từ chữ ký và giá trị băm, đây là quá trình xử lý có thể được thực hiện bên ngoài và do đó, không đáng để thực hiện bên trong bằng chứng không tiết lộ thông tin. Nếu ai đó cố gắng lừa chúng ta ở đây, việc xác minh chữ ký sẽ thất bại.
+
+```rust
+ hash1,
+ hash2
+ )
+}
+
+fn main(
+ accounts: [Account; ACCOUNT_NUMBER],
+ message: str,
+ pubKeyX: [u8; 32],
+ pubKeyY: [u8; 32],
+ signature: [u8; 64],
+ ) -> pub (
+ Field, // Hash of old accounts array
+ Field, // Hash of new accounts array
+ Field, // First 16 bytes of message hash
+ Field, // Last 16 bytes of message hash
+ )
+```
+
+Cuối cùng, chúng ta đến hàm `main`. Chúng ta cần chứng minh rằng chúng ta có một giao dịch thay đổi hợp lệ giá trị băm của tài khoản từ giá trị cũ sang giá trị mới. Chúng tôi cũng cần chứng minh rằng nó có giá trị băm giao dịch cụ thể này để người gửi nó biết giao dịch của họ đã được xử lý.
+
+```rust
+{
+ let mut txn = readTransferTxn(message);
+```
+
+Chúng tôi cần `txn` có thể thay đổi vì chúng tôi không đọc địa chỉ từ thông điệp, chúng tôi đọc nó từ chữ ký.
+
+```rust
+ let (fromAddress, txnHash1, txnHash2) = signatureToAddressAndHash(
+ message,
+ pubKeyX,
+ pubKeyY,
+ signature);
+
+ txn.from = fromAddress;
+
+ let newAccounts = apply_transfer_txn(accounts, txn);
+
+ (
+ hash_accounts(accounts),
+ hash_accounts(newAccounts),
+ txnHash1,
+ txnHash2
+ )
+}
+```
+
+### Giai đoạn 2 - Thêm một máy chủ {#stage-2}
+
+Trong giai đoạn thứ hai, chúng tôi thêm một máy chủ nhận và thực hiện các giao dịch chuyển khoản từ trình duyệt.
+
+Để xem nó hoạt động:
+
+1. Dừng Vite nếu nó đang chạy.
+
+2. Tải xuống nhánh bao gồm máy chủ và đảm bảo bạn có tất cả các mô-đun cần thiết.
+
+ ```sh
+ git checkout 02-add-server
+ cd client
+ npm install
+ cd ../server
+ npm install
+ ```
+
+ Không cần biên dịch mã Noir, nó giống như mã bạn đã sử dụng cho giai đoạn 1.
+
+3. Khởi động máy chủ.
+
+ ```sh
+ npm run start
+ ```
+
+4. Trong một cửa sổ dòng lệnh riêng, chạy Vite để phục vụ mã trình duyệt.
+
+ ```sh
+ cd client
+ npm run dev
+ ```
+
+5. Duyệt đến mã ứng dụng tại [http://localhost:5173](http://localhost:5173)
+
+6. Trước khi bạn có thể phát hành một giao dịch, bạn cần biết nonce, cũng như số tiền bạn có thể gửi. Để có được thông tin này, hãy nhấp vào **Cập nhật dữ liệu tài khoản** và ký thông điệp.
+
+ Chúng ta có một tình thế tiến thoái lưỡng nan ở đây. Một mặt, chúng tôi không muốn ký một thông điệp có thể được sử dụng lại (một [cuộc tấn công phát lại](https://en.wikipedia.org/wiki/Replay_attack)), đó là lý do tại sao chúng tôi muốn có một nonce ngay từ đầu. Tuy nhiên, chúng ta chưa có nonce. Giải pháp là chọn một nonce chỉ có thể được sử dụng một lần và chúng ta đã có ở cả hai phía, chẳng hạn như thời gian hiện tại.
+
+ Vấn đề với giải pháp này là thời gian có thể không được đồng bộ hóa hoàn hảo. Vì vậy, thay vào đó, chúng tôi ký một giá trị thay đổi mỗi phút. Điều này có nghĩa là cửa sổ dễ bị tấn công phát lại của chúng ta chỉ kéo dài tối đa một phút. Xét rằng trong sản xuất, yêu cầu đã ký sẽ được bảo vệ bởi TLS, và phía bên kia của đường hầm---máy chủ---đã có thể tiết lộ số dư và nonce (nó phải biết chúng để hoạt động), đây là một rủi ro chấp nhận được.
+
+7. Sau khi trình duyệt nhận lại số dư và nonce, nó sẽ hiển thị biểu mẫu chuyển khoản. Chọn địa chỉ đích và số tiền rồi nhấp vào **Chuyển khoản**. Ký yêu cầu này.
+
+8. Để xem giao dịch chuyển khoản, hãy **Cập nhật dữ liệu tài khoản** hoặc xem trong cửa sổ nơi bạn chạy máy chủ. Máy chủ ghi lại trạng thái mỗi khi nó thay đổi.
+
+ ```
+ ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start
+
+ > server@1.0.0 start
+ > node --experimental-json-modules index.mjs
+
+ Listening on port 3000
+ Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 36000 finney (milliEth) 0 processed
+ New state:
+ 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 64000 (1)
+ 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 100000 (0)
+ 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0)
+ 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0)
+ 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0)
+ Txn send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 7200 finney (milliEth) 1 processed
+ New state:
+ 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 56800 (2)
+ 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0)
+ 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0)
+ 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0)
+ 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0)
+ Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 3000 finney (milliEth) 2 processed
+ New state:
+ 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 53800 (3)
+ 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0)
+ 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0)
+ 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 139000 (0)
+ 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0)
+ ```
+
+#### `server/index.mjs` {#server-index-mjs-1}
+
+[Tệp này](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/index.mjs) chứa quy trình máy chủ và tương tác với mã Noir tại [`main.nr`](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/noir/src/main.nr). Đây là lời giải thích về những phần thú vị.
+
+```js
+import { Noir } from '@noir-lang/noir_js'
+```
+
+Thư viện [noir.js](https://www.npmjs.com/package/@noir-lang/noir_js) giao tiếp giữa mã JavaScript và mã Noir.
+
+```js
+const circuit = JSON.parse(await fs.readFile("./noir/target/zkBank.json"))
+const noir = new Noir(circuit)
+```
+
+Tải mạch số học---chương trình Noir đã biên dịch mà chúng ta đã tạo ở giai đoạn trước---và chuẩn bị để thực thi nó.
+
+```js
+// We only provide account information in return to a signed request
+const accountInformation = async signature => {
+ const fromAddress = await recoverAddress({
+ hash: hashMessage("Lấy dữ liệu tài khoản " + Math.floor((new Date().getTime())/60000)),
+ signature
+ })
+```
+
+Để cung cấp thông tin tài khoản, chúng tôi chỉ cần chữ ký. Lý do là chúng tôi đã biết thông điệp sẽ là gì, và do đó là giá trị băm của thông điệp.
+
+```js
+const processMessage = async (message, signature) => {
+```
+
+Xử lý một thông điệp và thực hiện giao dịch mà nó mã hóa.
+
+```js
+ // Get the public key
+ const pubKey = await recoverPublicKey({
+ hash,
+ signature
+ })
+```
+
+Bây giờ chúng ta chạy JavaScript trên máy chủ, chúng ta có thể truy xuất khóa công khai ở đó thay vì trên ứng dụng.
+
+```js
+ let noirResult
+ try {
+ noirResult = await noir.execute({
+ message,
+ signature: signature.slice(2,-2).match(/.{2}/g).map(x => `0x${x}`),
+ pubKeyX,
+ pubKeyY,
+ accounts: Accounts
+ })
+```
+
+`noir.execute` chạy chương trình Noir. Các tham số tương đương với các tham số được cung cấp trong [`Prover.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml). Lưu ý rằng các giá trị dài được cung cấp dưới dạng một mảng các chuỗi thập lục phân (`["0x60", "0xA7"]`), không phải là một giá trị thập lục phân duy nhất (`0x60A7`), theo cách Viem thực hiện.
+
+```js
+ } catch (err) {
+ console.log(`Noir error: ${err}`)
+ throw Error("Invalid transaction, not processed")
+ }
+```
+
+Nếu có lỗi, hãy bắt nó và sau đó chuyển tiếp một phiên bản đơn giản hóa cho ứng dụng.
+
+```js
+ Accounts[fromAccountNumber].nonce++
+ Accounts[fromAccountNumber].balance -= amount
+ Accounts[toAccountNumber].balance += amount
+```
+
+Áp dụng giao dịch. Chúng tôi đã làm điều đó trong mã Noir, nhưng việc làm lại ở đây dễ hơn là trích xuất kết quả từ đó.
+
+```js
+let Accounts = [
+ {
+ address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ balance: 5000,
+ nonce: 0,
+ },
+```
+
+Cấu trúc `Tài khoản` ban đầu.
+
+### Giai đoạn 3 - Hợp đồng thông minh Ethereum {#stage-3}
+
+1. Dừng các quy trình máy chủ và ứng dụng.
+
+2. Tải xuống nhánh có hợp đồng thông minh và đảm bảo bạn có tất cả các mô-đun cần thiết.
+
+ ```sh
+ git checkout 03-smart-contracts
+ cd client
+ npm install
+ cd ../server
+ npm install
+ ```
+
+3. Chạy `anvil` trong một cửa sổ dòng lệnh riêng.
+
+4. Tạo khóa xác minh và trình xác minh solidity, sau đó sao chép mã trình xác minh vào dự án Solidity.
+
+ ```sh
+ cd noir
+ bb write_vk -b ./target/zkBank.json -o ./target --oracle_hash keccak
+ bb write_solidity_verifier -k ./target/vk -o ./target/Verifier.sol
+ cp target/Verifier.sol ../../smart-contracts/src
+ ```
+
+5. Đi đến các hợp đồng thông minh và đặt các biến môi trường để sử dụng chuỗi khối `anvil`.
+
+ ```sh
+ cd ../../smart-contracts
+ export ETH_RPC_URL=http://localhost:8545
+ ETH_PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
+ ```
+
+6. Triển khai `Verifier.sol` và lưu trữ địa chỉ trong một biến môi trường.
+
+ ```sh
+ VERIFIER_ADDRESS=`forge create src/Verifier.sol:HonkVerifier --private-key $ETH_PRIVATE_KEY --optimize --broadcast | awk '/Deployed to:/ {print $3}'`
+ echo $VERIFIER_ADDRESS
+ ```
+
+7. Triển khai hợp đồng `ZkBank`.
+
+ ```sh
+ ZKBANK_ADDRESS=`forge create ZkBank --private-key $ETH_PRIVATE_KEY --broadcast --constructor-args $VERIFIER_ADDRESS 0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b | awk '/Deployed to:/ {print $3}'`
+ echo $ZKBANK_ADDRESS
+ ```
+
+ Giá trị `0x199..67b` là hàm băm Pederson của trạng thái ban đầu của `Tài khoản`. Nếu bạn sửa đổi trạng thái ban đầu này trong `server/index.mjs`, bạn có thể chạy một giao dịch để xem giá trị băm ban đầu được báo cáo bởi bằng chứng không tiết lộ thông tin.
+
+8. Chạy máy chủ.
+
+ ```sh
+ cd ../server
+ npm run start
+ ```
+
+9. Chạy ứng dụng trong một cửa sổ dòng lệnh khác.
+
+ ```sh
+ cd client
+ npm run dev
+ ```
+
+10. Chạy một số giao dịch.
+
+11. Để xác minh rằng trạng thái đã thay đổi trên chuỗi, hãy khởi động lại quy trình máy chủ. Xem rằng `ZkBank` không còn chấp nhận giao dịch, vì giá trị băm ban đầu trong các giao dịch khác với giá trị băm được lưu trữ trên chuỗi.
+
+ Đây là loại lỗi dự kiến.
+
+ ```
+ ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start
+
+ > server@1.0.0 start
+ > node --experimental-json-modules index.mjs
+
+ Listening on port 3000
+ Lỗi xác minh: ContractFunctionExecutionError: Hàm hợp đồng "processTransaction" đã bị đảo ngược với lý do sau:
+ Giá trị băm trạng thái cũ sai
+
+ Contract Call:
+ address: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
+ function: processTransaction(bytes _proof, bytes32[] _publicInputs)
+ args: (0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf00000000000000000000000000000000000000000000000b75c020998797da7800000000000000000000000000000000000000000000000
+ ```
+
+#### `server/index.mjs` {#server-index-mjs-2}
+
+Những thay đổi trong tệp này chủ yếu liên quan đến việc tạo bằng chứng thực tế và gửi nó lên chuỗi.
+
+```js
+import { exec } from 'child_process'
+import util from 'util'
+
+const execPromise = util.promisify(exec)
+```
+
+Chúng tôi cần sử dụng [gói Barretenberg](https://github.com/AztecProtocol/aztec-packages/tree/next/barretenberg) để tạo bằng chứng thực tế để gửi lên chuỗi. Chúng ta có thể sử dụng gói này bằng cách chạy giao diện dòng lệnh (`bb`) hoặc bằng cách sử dụng [thư viện JavaScript, `bb.js`](https://www.npmjs.com/package/@aztec/bb.js). Thư viện JavaScript chậm hơn nhiều so với việc chạy mã gốc, vì vậy chúng tôi sử dụng [`exec`](https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback) ở đây để sử dụng dòng lệnh.
+
+Lưu ý rằng nếu bạn quyết định sử dụng `bb.js`, bạn cần sử dụng phiên bản tương thích với phiên bản Noir mà bạn đang sử dụng. Tại thời điểm viết bài, phiên bản Noir hiện tại (1.0.0-beta.11) sử dụng `bb.js` phiên bản 0.87.
+
+```js
+const zkBankAddress = process.env.ZKBANK_ADDRESS || "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512"
+```
+
+Địa chỉ ở đây là địa chỉ bạn nhận được khi bắt đầu với một `anvil` sạch và làm theo các hướng dẫn ở trên.
+
+```js
+const walletClient = createWalletClient({
+ chain: anvil,
+ transport: http(),
+ account: privateKeyToAccount("0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6")
+})
+```
+
+Khóa riêng tư này là một trong những tài khoản được cấp tiền trước mặc định trong `anvil`.
+
+```js
+const generateProof = async (witness, fileID) => {
+```
+
+Tạo một bằng chứng bằng cách sử dụng tệp thực thi `bb`.
+
+```js
+ const fname = `witness-${fileID}.gz`
+ await fs.writeFile(fname, witness)
+```
+
+Ghi nhân chứng vào một tệp.
+
+```js
+ await execPromise(`bb prove -b ./noir/target/zkBank.json -w ${fname} -o ${fileID} --oracle_hash keccak --output_format fields`)
+```
+
+Thực sự tạo ra bằng chứng. Bước này cũng tạo ra một tệp với các biến công khai, nhưng chúng tôi không cần đến nó. Chúng tôi đã có những biến đó từ `noir.execute`.
+
+```js
+ const proof = "0x" + JSON.parse(await fs.readFile(`./${fileID}/proof_fields.json`)).reduce((a,b) => a+b, "").replace(/0x/g, "")
+```
+
+Bằng chứng là một mảng JSON các giá trị `Field`, mỗi giá trị được biểu diễn dưới dạng một giá trị thập lục phân. Tuy nhiên, chúng ta cần gửi nó trong giao dịch dưới dạng một giá trị `bytes` duy nhất, mà Viem biểu diễn bằng một chuỗi thập lục phân lớn. Ở đây chúng ta thay đổi định dạng bằng cách nối tất cả các giá trị, loại bỏ tất cả các `0x`, và sau đó thêm một cái ở cuối.
+
+```js
+ await execPromise(`rm -r ${fname} ${fileID}`)
+
+ return proof
+}
+```
+
+Dọn dẹp và trả về bằng chứng.
+
+```js
+const processMessage = async (message, signature) => {
+ .
+ .
+ .
+
+ const publicFields = noirResult.returnValue.map(x=>'0x' + x.slice(2).padStart(64, "0"))
+```
+
+Các trường công khai cần phải là một mảng các giá trị 32 byte. Tuy nhiên, vì chúng tôi cần phải chia giá trị băm giao dịch giữa hai giá trị `Field`, nó xuất hiện dưới dạng một giá trị 16 byte. Ở đây chúng tôi thêm các số không để Viem hiểu rằng nó thực sự là 32 byte.
+
+```js
+ const proof = await generateProof(noirResult.witness, `${fromAddress}-${nonce}`)
+```
+
+Mỗi địa chỉ chỉ sử dụng mỗi nonce một lần để chúng ta có thể sử dụng kết hợp `fromAddress` và `nonce` làm định danh duy nhất cho tệp nhân chứng và thư mục đầu ra.
+
+```js
+ try {
+ await zkBank.write.processTransaction([
+ proof, publicFields])
+ } catch (err) {
+ console.log(`Verification error: ${err}`)
+ throw Error("Can't verify the transaction onchain")
+ }
+ .
+ .
+ .
+}
+```
+
+Gửi giao dịch lên chuỗi.
+
+#### `smart-contracts/src/ZkBank.sol` {#smart-contracts-src-zkbank-sol}
+
+Đây là mã trên chuỗi nhận giao dịch.
+
+```solidity
+// SPDX-License-Identifier: MIT
+
+pragma solidity >=0.8.21;
+
+import {HonkVerifier} from "./Verifier.sol";
+
+contract ZkBank {
+ HonkVerifier immutable myVerifier;
+ bytes32 currentStateHash;
+
+ constructor(address _verifierAddress, bytes32 _initialStateHash) {
+ currentStateHash = _initialStateHash;
+ myVerifier = HonkVerifier(_verifierAddress);
+ }
+```
+
+Mã trên chuỗi cần theo dõi hai biến: trình xác minh (một hợp đồng riêng biệt được tạo bởi `nargo`) và giá trị băm trạng thái hiện tại.
+
+```solidity
+ event TransactionProcessed(
+ bytes32 indexed transactionHash,
+ bytes32 oldStateHash,
+ bytes32 newStateHash
+ );
+```
+
+Mỗi khi trạng thái thay đổi, chúng tôi phát ra một sự kiện `TransactionProcessed`.
+
+```solidity
+ function processTransaction(
+ bytes calldata _proof,
+ bytes32[] calldata _publicFields
+ ) public {
+```
+
+Hàm này xử lý các giao dịch. Nó nhận bằng chứng (dưới dạng `bytes`) và các đầu vào công khai (dưới dạng một mảng `bytes32`), theo định dạng mà trình xác minh yêu cầu (để giảm thiểu xử lý trên chuỗi và do đó là chi phí gas).
+
+```solidity
+ require(_publicInputs[0] == currentStateHash,
+ "Wrong old state hash");
+```
+
+Bằng chứng không tiết lộ thông tin cần phải là giao dịch thay đổi từ giá trị băm hiện tại của chúng ta thành một giá trị mới.
+
+```solidity
+ myVerifier.verify(_proof, _publicFields);
+```
+
+Gọi hợp đồng xác minh để xác minh bằng chứng không tiết lộ thông tin. Bước này sẽ đảo ngược giao dịch nếu bằng chứng không tiết lộ thông tin sai.
+
+```solidity
+ currentStateHash = _publicFields[1];
+
+ emit TransactionProcessed(
+ _publicFields[2]<<128 | _publicFields[3],
+ _publicFields[0],
+ _publicFields[1]
+ );
+ }
+}
+```
+
+Nếu mọi thứ đều ổn, hãy cập nhật giá trị băm trạng thái thành giá trị mới và phát ra một sự kiện `TransactionProcessed`.
+
+## Lạm dụng bởi thành phần tập trung {#abuses}
+
+Bảo mật thông tin bao gồm ba thuộc tính:
+
+- _Tính bảo mật_, người dùng không thể đọc thông tin mà họ không được ủy quyền để đọc.
+- _Tính toàn vẹn_, thông tin không thể bị thay đổi ngoại trừ bởi người dùng được ủy quyền theo cách được ủy quyền.
+- _Tính khả dụng_, người dùng được ủy quyền có thể sử dụng hệ thống.
+
+Trên hệ thống này, tính toàn vẹn được cung cấp thông qua bằng chứng không tiết lộ thông tin. Tính khả dụng khó đảm bảo hơn nhiều, và tính bảo mật là không thể, vì ngân hàng phải biết số dư của mỗi tài khoản và tất cả các giao dịch. Không có cách nào để ngăn chặn một thực thể có thông tin chia sẻ thông tin đó.
+
+Có thể tạo ra một ngân hàng thực sự bí mật bằng cách sử dụng [địa chỉ ẩn](https://vitalik.eth.limo/general/2023/01/20/stealth.html), nhưng điều đó nằm ngoài phạm vi của bài viết này.
+
+### Thông tin sai lệch {#false-info}
+
+Một cách mà máy chủ có thể vi phạm tính toàn vẹn là cung cấp thông tin sai khi [dữ liệu được yêu cầu](https://github.com/qbzzt/250911-zk-bank/blob/03-smart-contracts/server/index.mjs#L278-L291).
+
+Để giải quyết vấn đề này, chúng ta có thể viết một chương trình Noir thứ hai nhận các tài khoản làm đầu vào riêng tư và địa chỉ mà thông tin được yêu cầu làm đầu vào công khai. Đầu ra là số dư và nonce của địa chỉ đó, và giá trị băm của các tài khoản.
+
+Tất nhiên, bằng chứng này không thể được xác minh trên chuỗi, vì chúng tôi không muốn đăng nonce và số dư trên chuỗi. Tuy nhiên, nó có thể được xác minh bởi mã ứng dụng chạy trong trình duyệt.
+
+### Giao dịch bắt buộc {#forced-txns}
+
+Cơ chế thông thường để đảm bảo tính khả dụng và ngăn chặn kiểm duyệt trên L2 là [giao dịch bắt buộc](https://docs.optimism.io/stack/transactions/forced-transaction). Nhưng các giao dịch bắt buộc không kết hợp với các bằng chứng không tiết lộ thông tin. Máy chủ là thực thể duy nhất có thể xác minh các giao dịch.
+
+Chúng tôi có thể sửa đổi `smart-contracts/src/ZkBank.sol` để chấp nhận các giao dịch bắt buộc và ngăn máy chủ thay đổi trạng thái cho đến khi chúng được xử lý. Tuy nhiên, điều này mở ra cho chúng ta một cuộc tấn công từ chối dịch vụ đơn giản. Điều gì sẽ xảy ra nếu một giao dịch bắt buộc không hợp lệ và do đó không thể xử lý được?
+
+Giải pháp là có một bằng chứng không tiết lộ thông tin rằng một giao dịch bắt buộc là không hợp lệ. Điều này cho máy chủ ba lựa chọn:
+
+- Xử lý giao dịch bắt buộc, cung cấp bằng chứng không tiết lộ thông tin rằng nó đã được xử lý và giá trị băm trạng thái mới.
+- Từ chối giao dịch bắt buộc, và cung cấp một bằng chứng không tiết lộ thông tin cho hợp đồng rằng giao dịch không hợp lệ (địa chỉ không xác định, nonce xấu, hoặc số dư không đủ).
+- Bỏ qua giao dịch bắt buộc. Không có cách nào để buộc máy chủ thực sự xử lý giao dịch, nhưng điều đó có nghĩa là toàn bộ hệ thống không khả dụng.
+
+#### Trái phiếu khả dụng {#avail-bonds}
+
+Trong một triển khai thực tế, có thể sẽ có một số loại động cơ lợi nhuận để giữ cho máy chủ hoạt động. Chúng tôi có thể củng cố động cơ này bằng cách yêu cầu máy chủ đăng một trái phiếu khả dụng mà bất kỳ ai cũng có thể đốt nếu một giao dịch bắt buộc không được xử lý trong một khoảng thời gian nhất định.
+
+### Mã Noir xấu {#bad-noir-code}
+
+Thông thường, để mọi người tin tưởng vào một hợp đồng thông minh, chúng tôi tải mã nguồn lên một [trình duyệt khối](https://eth.blockscout.com/address/0x7D16d2c4e96BCFC8f815E15b771aC847EcbDB48b?tab=contract). Tuy nhiên, trong trường hợp bằng chứng không tiết lộ thông tin, điều đó là không đủ.
+
+`Verifier.sol` chứa khóa xác minh, là một hàm của chương trình Noir. Tuy nhiên, khóa đó không cho chúng tôi biết chương trình Noir là gì. Để thực sự có một giải pháp đáng tin cậy, bạn cần tải lên chương trình Noir (và phiên bản đã tạo ra nó). Nếu không, các bằng chứng không tiết lộ thông tin có thể phản ánh một chương trình khác, một chương trình có cửa hậu.
+
+Cho đến khi các trình duyệt khối bắt đầu cho phép chúng tôi tải lên và xác minh các chương trình Noir, bạn nên tự làm điều đó (tốt nhất là với [IPFS](/developers/tutorials/ipfs-decentralized-ui/)). Sau đó, những người dùng tinh vi sẽ có thể tải xuống mã nguồn, tự biên dịch nó, tạo `Verifier.sol`, và xác minh rằng nó giống hệt với mã trên chuỗi.
+
+## Kết luận {#conclusion}
+
+Các ứng dụng loại Plasma yêu cầu một thành phần tập trung làm nơi lưu trữ thông tin. Điều này mở ra các lỗ hổng tiềm ẩn nhưng, đổi lại, cho phép chúng ta bảo vệ quyền riêng tư theo những cách không có sẵn trên chính chuỗi khối. Với bằng chứng không tiết lộ thông tin, chúng ta có thể đảm bảo tính toàn vẹn và có thể làm cho việc duy trì tính khả dụng trở nên có lợi về mặt kinh tế cho bất kỳ ai đang chạy thành phần tập trung.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
+
+## Ghi nhận {#acknowledgements}
+
+- Josh Crites đã đọc một bản nháp của bài viết này và giúp tôi giải quyết một vấn đề gai góc về Noir.
+
+Bất kỳ lỗi còn lại nào đều là trách nhiệm của tôi.
diff --git a/public/content/translations/vi/developers/tutorials/calling-a-smart-contract-from-javascript/index.md b/public/content/translations/vi/developers/tutorials/calling-a-smart-contract-from-javascript/index.md
new file mode 100644
index 00000000000..f083f96715e
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/calling-a-smart-contract-from-javascript/index.md
@@ -0,0 +1,131 @@
+---
+title: Gọi một hợp đồng thông minh từ JavaScript
+description: Cách gọi một hàm hợp đồng thông minh từ JavaScript bằng ví dụ về token Dai
+author: jdourlens
+tags: [ "các giao dịch", "frontend", "JavaScript", "web3.js" ]
+skill: beginner
+lang: vi
+published: 2020-04-19
+source: EthereumDev
+sourceUrl: https://ethereumdev.io/calling-a-smart-contract-from-javascript/
+address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
+---
+
+Trong hướng dẫn này, chúng ta sẽ xem cách gọi một hàm [hợp đồng thông minh](/developers/docs/smart-contracts/) từ JavaScript. Đầu tiên là đọc trạng thái của một hợp đồng thông minh (ví dụ: số dư của một người nắm giữ ERC20), sau đó chúng ta sẽ sửa đổi trạng thái của chuỗi khối bằng cách thực hiện một giao dịch chuyển token. Bạn nên quen thuộc với việc [thiết lập một môi trường JS để tương tác với chuỗi khối](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/).
+
+Trong ví dụ này, chúng ta sẽ sử dụng token DAI, cho mục đích thử nghiệm, chúng ta sẽ phân nhánh chuỗi khối bằng cách sử dụng ganache-cli và mở khóa một địa chỉ đã có rất nhiều DAI:
+
+```bash
+ganache-cli -f https://mainnet.infura.io/v3/[KHÓA INFURA CỦA BẠN] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81
+```
+
+Để tương tác với một hợp đồng thông minh, chúng ta sẽ cần địa chỉ và ABI của nó:
+
+```js
+const ERC20TransferABI = [
+ {
+ constant: false,
+ inputs: [
+ {
+ name: "_to",
+ type: "address",
+ },
+ {
+ name: "_value",
+ type: "uint256",
+ },
+ ],
+ name: "transfer",
+ outputs: [
+ {
+ name: "",
+ type: "bool",
+ },
+ ],
+ payable: false,
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ constant: true,
+ inputs: [
+ {
+ name: "_owner",
+ type: "address",
+ },
+ ],
+ name: "balanceOf",
+ outputs: [
+ {
+ name: "balance",
+ type: "uint256",
+ },
+ ],
+ payable: false,
+ stateMutability: "view",
+ type: "function",
+ },
+]
+
+const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"
+```
+
+Đối với dự án này, chúng tôi đã lược bỏ ABI ERC20 hoàn chỉnh để chỉ giữ lại hàm `balanceOf` và `transfer` nhưng bạn có thể tìm thấy [ABI ERC20 đầy đủ tại đây](https://ethereumdev.io/abi-for-erc20-contract-on-ethereum/).
+
+Sau đó, chúng ta cần khởi tạo hợp đồng thông minh của mình:
+
+```js
+const web3 = new Web3("http://localhost:8545")
+
+const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)
+```
+
+Chúng ta cũng sẽ thiết lập hai địa chỉ:
+
+- địa chỉ sẽ nhận tiền chuyển và
+- địa chỉ mà chúng ta đã mở khóa sẽ gửi nó đi:
+
+```js
+const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
+const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
+```
+
+Trong phần tiếp theo, chúng ta sẽ gọi hàm `balanceOf` để lấy số lượng token hiện tại mà cả hai địa chỉ đang nắm giữ.
+
+## Gọi: Đọc giá trị từ một hợp đồng thông minh {#call-reading-value-from-a-smart-contract}
+
+Ví dụ đầu tiên sẽ gọi một phương thức “hằng số” và thực thi phương thức hợp đồng thông minh của nó trong Máy ảo Ethereum (EVM) mà không cần gửi bất kỳ giao dịch nào. Để làm điều này, chúng ta sẽ đọc số dư ERC20 của một địa chỉ. [Đọc bài viết của chúng tôi về token ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/).
+
+Bạn có thể truy cập các phương thức hợp đồng thông minh đã được khởi tạo mà bạn đã cung cấp ABI như sau: `yourContract.methods.methodname`. Bằng cách sử dụng hàm `call`, bạn sẽ nhận được kết quả thực thi của hàm.
+
+```js
+daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
+ if (err) {
+ console.log("Đã xảy ra lỗi", err)
+ return
+ }
+ console.log("Số dư là: ", res)
+})
+```
+
+Hãy nhớ rằng DAI ERC20 có 18 chữ số thập phân, nghĩa là bạn cần loại bỏ 18 số 0 để có được số tiền chính xác. uint256 được trả về dưới dạng chuỗi vì JavaScript không xử lý các giá trị số lớn. Nếu bạn không chắc chắn [cách xử lý các số lớn trong JS, hãy xem hướng dẫn của chúng tôi về bignumber.js](https://ethereumdev.io/how-to-deal-with-big-numbers-in-javascript/).
+
+## Gửi: Gửi giao dịch đến một hàm của hợp đồng thông minh {#send-sending-a-transaction-to-a-smart-contract-function}
+
+Đối với ví dụ thứ hai, chúng ta sẽ gọi hàm chuyển tiền của hợp đồng thông minh DAI để gửi 10 DAI đến địa chỉ thứ hai của chúng ta. Hàm chuyển tiền chấp nhận hai tham số: địa chỉ người nhận và số lượng token cần chuyển:
+
+```js
+daiToken.methods
+ .transfer(receiverAddress, "100000000000000000000")
+ .send({ from: senderAddress }, function (err, res) {
+ if (err) {
+ console.log("Đã xảy ra lỗi", err)
+ return
+ }
+ console.log("Hàm băm của giao dịch: " + res)
+ })
+```
+
+Hàm gọi trả về hàm băm của giao dịch sẽ được khai thác vào chuỗi khối. Trên Ethereum, các hàm băm giao dịch có thể dự đoán được - đó là cách chúng ta có thể lấy hàm băm của giao dịch trước khi nó được thực thi ([tìm hiểu cách tính các hàm băm tại đây](https://ethereum.stackexchange.com/questions/45648/how-to-calculate-the-assigned-txhash-of-a-transaction)).
+
+Vì hàm chỉ gửi giao dịch lên chuỗi khối, chúng ta không thể thấy kết quả cho đến khi biết giao dịch được khai thác và đưa vào chuỗi khối. Trong hướng dẫn tiếp theo, chúng ta sẽ tìm hiểu [cách chờ một giao dịch được thực thi trên chuỗi khối bằng cách biết hàm băm của nó](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/).
diff --git a/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md b/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md
new file mode 100644
index 00000000000..9455e33c32b
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md
@@ -0,0 +1,585 @@
+---
+title: "Xây dựng giao diện người dùng cho hợp đồng của bạn"
+description: Sử dụng các thành phần hiện đại như TypeScript, React, Vite và Wagmi, chúng ta sẽ xem xét một giao diện người dùng hiện đại nhưng tối giản và tìm hiểu cách kết nối ví với giao diện người dùng, gọi hợp đồng thông minh để đọc thông tin, gửi giao dịch đến hợp đồng thông minh và giám sát các sự kiện từ hợp đồng thông minh để xác định các thay đổi.
+author: Ori Pomerantz
+tags: [ "typescript", "react", "vite", "wagmi", "frontend" ]
+skill: beginner
+published: 2023-11-01
+lang: vi
+sidebarDepth: 3
+---
+
+Bạn đã tìm thấy một tính năng mà chúng tôi cần trong hệ sinh thái Ethereum. Bạn đã viết các hợp đồng thông minh để triển khai nó và thậm chí có thể một số mã liên quan chạy ngoài chuỗi. Điều này thật tuyệt! Thật không may, nếu không có giao diện người dùng, bạn sẽ không có bất kỳ người dùng nào, và lần cuối cùng bạn viết một trang web là khi mọi người dùng modem quay số và JavaScript vẫn còn mới mẻ.
+
+Bài viết này là dành cho bạn. Tôi cho rằng bạn biết lập trình, và có thể một chút về JavaScript và HTML, nhưng kỹ năng về giao diện người dùng của bạn đã lỗi thời. Chúng ta sẽ cùng nhau xem qua một ứng dụng hiện đại đơn giản để bạn có thể thấy cách thực hiện trong thời đại ngày nay.
+
+## Tại sao điều này lại quan trọng {#why-important}
+
+Về lý thuyết, bạn có thể chỉ cần để mọi người sử dụng [Etherscan](https://holesky.etherscan.io/address/0x432d810484add7454ddb3b5311f0ac2e95cecea8#writeContract) hoặc [Blockscout](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=write_contract) để tương tác với các hợp đồng của bạn. Điều đó sẽ rất tuyệt vời đối với những người dùng Ethereum có kinh nghiệm. Nhưng chúng tôi đang cố gắng phục vụ [thêm một tỷ người nữa](https://blog.ethereum.org/2021/05/07/ethereum-for-the-next-billion). Điều này sẽ không xảy ra nếu không có trải nghiệm người dùng tuyệt vời, và giao diện người dùng thân thiện là một phần quan trọng trong đó.
+
+## Ứng dụng Greeter {#greeter-app}
+
+Có rất nhiều lý thuyết đằng sau cách hoạt động của một giao diện người dùng hiện đại và [rất nhiều trang web hay](https://react.dev/learn/thinking-in-react) [giải thích về nó](https://wagmi.sh/core/getting-started). Thay vì lặp lại những công việc tốt đẹp đã được thực hiện bởi các trang web đó, tôi sẽ cho rằng bạn thích học bằng cách thực hành và bắt đầu với một ứng dụng mà bạn có thể mày mò. Bạn vẫn cần lý thuyết để hoàn thành công việc, và chúng ta sẽ tìm hiểu về nó - chúng ta sẽ chỉ xem qua từng tệp nguồn một và thảo luận về mọi thứ khi chúng ta tiếp cận chúng.
+
+### Cài đặt {#installation}
+
+1. Nếu cần, hãy thêm [chuỗi khối Holesky](https://chainlist.org/?search=holesky&testnets=true) vào ví của bạn và [nhận ETH thử nghiệm](https://www.holeskyfaucet.io/).
+
+2. Sao chép kho lưu trữ github.
+
+ ```sh
+ git clone https://github.com/qbzzt/20230801-modern-ui.git
+ ```
+
+3. Cài đặt các gói cần thiết.
+
+ ```sh
+ cd 20230801-modern-ui
+ pnpm install
+ ```
+
+4. Khởi động ứng dụng.
+
+ ```sh
+ pnpm dev
+ ```
+
+5. Duyệt đến URL được hiển thị bởi ứng dụng. Trong hầu hết các trường hợp, đó là [http://localhost:5173/](http://localhost:5173/).
+
+6. Bạn có thể xem mã nguồn của hợp đồng, một phiên bản Greeter của Hardhat đã được sửa đổi một chút, [trên một trình khám phá chuỗi khối](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=contract).
+
+### Xem qua tệp {#file-walk-through}
+
+#### `index.html` {#index-html}
+
+Tệp này là bản mẫu HTML tiêu chuẩn ngoại trừ dòng này, dòng này nhập tệp script.
+
+```html
+
+```
+
+#### `src/main.tsx` {#main-tsx}
+
+Phần mở rộng tệp cho chúng ta biết rằng tệp này là một [thành phần React](https://www.w3schools.com/react/react_components.asp) được viết bằng [TypeScript](https://www.typescriptlang.org/), một phần mở rộng của JavaScript hỗ trợ [kiểm tra loại](https://en.wikipedia.org/wiki/Type_system#Type_checking). TypeScript được biên dịch thành JavaScript, vì vậy chúng ta có thể sử dụng nó để thực thi phía máy khách.
+
+```tsx
+import '@rainbow-me/rainbowkit/styles.css'
+import { RainbowKitProvider } from '@rainbow-me/rainbowkit'
+import * as React from 'react'
+import * as ReactDOM from 'react-dom/client'
+import { WagmiConfig } from 'wagmi'
+import { chains, config } from './wagmi'
+```
+
+Nhập mã thư viện chúng ta cần.
+
+```tsx
+import { App } from './App'
+```
+
+Nhập thành phần React triển khai ứng dụng (xem bên dưới).
+
+```tsx
+ReactDOM.createRoot(document.getElementById('root')!).render(
+```
+
+Tạo thành phần React gốc. Tham số cho `render` là [JSX](https://www.w3schools.com/react/react_jsx.asp), một ngôn ngữ mở rộng sử dụng cả HTML và JavaScript/TypeScript. Dấu chấm than ở đây báo cho thành phần TypeScript biết: "bạn không biết rằng `document.getElementById('root')` sẽ là một tham số hợp lệ cho `ReactDOM.createRoot`, nhưng đừng lo - tôi là nhà phát triển và tôi nói với bạn rằng nó sẽ có".
+
+```tsx
+
+```
+
+Ứng dụng sẽ nằm bên trong [một thành phần `React.StrictMode`](https://react.dev/reference/react/StrictMode). Thành phần này yêu cầu thư viện React chèn thêm các kiểm tra gỡ lỗi, điều này hữu ích trong quá trình phát triển.
+
+```tsx
+
+```
+
+Ứng dụng cũng nằm bên trong [một thành phần `WagmiConfig`](https://wagmi.sh/react/api/WagmiProvider). Thư viện [wagmi (we are going to make it)](https://wagmi.sh/) kết nối các định nghĩa giao diện người dùng React với [thư viện viem](https://viem.sh/) để viết một ứng dụng phi tập trung Ethereum.
+
+```tsx
+
+```
+
+Và cuối cùng là [một thành phần `RainbowKitProvider`](https://www.rainbowkit.com/). Thành phần này xử lý việc đăng nhập và giao tiếp giữa ví và ứng dụng.
+
+```tsx
+
+```
+
+Bây giờ chúng ta có thể có thành phần cho ứng dụng, thành phần này thực sự triển khai giao diện người dùng. Dấu `/>` ở cuối thành phần báo cho React biết rằng thành phần này không có bất kỳ định nghĩa nào bên trong nó, theo tiêu chuẩn XML.
+
+```tsx
+
+
+ ,
+)
+```
+
+Tất nhiên, chúng ta phải đóng các thành phần khác.
+
+#### `src/App.tsx` {#app-tsx}
+
+```tsx
+import { ConnectButton } from '@rainbow-me/rainbowkit'
+import { useAccount } from 'wagmi'
+import { Greeter } from './components/Greeter'
+
+export function App() {
+```
+
+Đây là cách tiêu chuẩn để tạo một thành phần React - xác định một hàm được gọi mỗi khi nó cần được hiển thị. Hàm này thường có một số mã TypeScript hoặc JavaScript ở trên cùng, theo sau là một câu lệnh `return` trả về mã JSX.
+
+```tsx
+ const { isConnected } = useAccount()
+```
+
+Ở đây, chúng ta sử dụng [`useAccount`](https://wagmi.sh/react/api/hooks/useAccount) để kiểm tra xem chúng ta có được kết nối với chuỗi khối thông qua ví hay không.
+
+Theo quy ước, trong React, các hàm được gọi là `use...` là các [hook](https://www.w3schools.com/react/react_hooks.asp) trả về một số loại dữ liệu. Khi bạn sử dụng các hook như vậy, thành phần của bạn không chỉ nhận được dữ liệu mà khi dữ liệu đó thay đổi, thành phần sẽ được hiển thị lại với thông tin được cập nhật.
+
+```tsx
+ return (
+ <>
+```
+
+JSX của một thành phần React _phải_ trả về một thành phần. Khi chúng ta có nhiều thành phần và không có gì bao bọc "một cách tự nhiên", chúng ta sử dụng một thành phần trống (`<> ...` >\`) để biến chúng thành một thành phần duy nhất.
+
+```tsx
+ Greeter
+
+```
+
+Chúng ta nhận được [thành phần `ConnectButton`](https://www.rainbowkit.com/docs/connect-button) từ RainbowKit. Khi chúng ta không kết nối, nó cung cấp cho chúng ta một nút `Kết nối Ví` mở ra một cửa sổ giải thích về các ví và cho phép bạn chọn ví nào bạn sử dụng. Khi chúng ta được kết nối, nó sẽ hiển thị chuỗi khối chúng ta sử dụng, địa chỉ tài khoản và số dư ETH của chúng ta. Chúng ta có thể sử dụng các màn hình này để chuyển đổi mạng hoặc ngắt kết nối.
+
+```tsx
+ {isConnected && (
+```
+
+Khi chúng ta cần chèn JavaScript thực tế (hoặc TypeScript sẽ được biên dịch thành JavaScript) vào JSX, chúng ta sử dụng dấu ngoặc (`{}`).
+
+Cú pháp `a && b` là viết tắt của [`a ?` `b : a`](https://www.w3schools.com/react/react_es6_ternary.asp). Tức là, nếu `a` là true, nó sẽ đánh giá thành `b`, ngược lại nó sẽ đánh giá thành `a` (có thể là `false`, `0`, v.v.). Đây là một cách dễ dàng để báo cho React biết rằng một thành phần chỉ nên được hiển thị nếu một điều kiện nhất định được đáp ứng.
+
+Trong trường hợp này, chúng tôi chỉ muốn hiển thị `Greeter` cho người dùng nếu người dùng được kết nối với một chuỗi khối.
+
+```tsx
+
+ )}
+ >
+ )
+}
+```
+
+#### `src/components/Greeter.tsx` {#greeter-tsx}
+
+Tệp này chứa hầu hết các chức năng của giao diện người dùng. Nó bao gồm các định nghĩa thường sẽ nằm trong nhiều tệp, nhưng vì đây là một hướng dẫn nên chương trình được tối ưu hóa để dễ hiểu trong lần đầu tiên, thay vì hiệu suất hoặc dễ bảo trì.
+
+```tsx
+import { useState, ChangeEventHandler } from 'react'
+import { useNetwork,
+ useReadContract,
+ usePrepareContractWrite,
+ useContractWrite,
+ useContractEvent
+ } from 'wagmi'
+```
+
+Chúng tôi sử dụng các hàm thư viện này. Một lần nữa, chúng được giải thích bên dưới nơi chúng được sử dụng.
+
+```tsx
+import { AddressType } from 'abitype'
+```
+
+[Thư viện `abitype`](https://abitype.dev/) cung cấp cho chúng ta các định nghĩa TypeScript cho các loại dữ liệu Ethereum khác nhau, chẳng hạn như [`AddressType`](https://abitype.dev/config#addresstype).
+
+```tsx
+let greeterABI = [
+ .
+ .
+ .
+] as const // greeterABI
+```
+
+Giao diện nhị phân ứng dụng cho hợp đồng `Greeter`.
+Nếu bạn đang phát triển các hợp đồng và giao diện người dùng cùng một lúc, bạn thường sẽ đặt chúng trong cùng một kho lưu trữ và sử dụng giao diện nhị phân ứng dụng được tạo bởi trình biên dịch Solidity làm tệp trong ứng dụng của bạn. Tuy nhiên, điều này không cần thiết ở đây vì hợp đồng đã được phát triển và sẽ không thay đổi.
+
+```tsx
+type AddressPerBlockchainType = {
+ [key: number]: AddressType
+}
+```
+
+TypeScript được định kiểu mạnh. Chúng tôi sử dụng định nghĩa này để chỉ định địa chỉ mà hợp đồng `Greeter` được triển khai trên các chuỗi khác nhau. Khóa là một số (chainId), và giá trị là một `AddressType` (một địa chỉ).
+
+```tsx
+const contractAddrs: AddressPerBlockchainType = {
+ // Holesky
+ 17000: '0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8',
+
+ // Sepolia
+ 11155111: '0x7143d5c190F048C8d19fe325b748b081903E3BF0'
+}
+```
+
+Địa chỉ của hợp đồng trên hai mạng được hỗ trợ: [Holesky](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=contact_code) và [Sepolia](https://eth-sepolia.blockscout.com/address/0x7143d5c190F048C8d19fe325b748b081903E3BF0?tab=contact_code).
+
+Lưu ý: Thực tế có một định nghĩa thứ ba, cho Redstone Holesky, nó sẽ được giải thích bên dưới.
+
+```tsx
+type ShowObjectAttrsType = {
+ name: string,
+ object: any
+}
+```
+
+Loại này được sử dụng làm tham số cho thành phần `ShowObject` (sẽ được giải thích sau). Nó bao gồm tên của đối tượng và giá trị của nó, được hiển thị cho mục đích gỡ lỗi.
+
+```tsx
+type ShowGreetingAttrsType = {
+ greeting: string | undefined
+}
+```
+
+Tại bất kỳ thời điểm nào, chúng ta có thể biết lời chào là gì (vì chúng ta đọc nó từ chuỗi khối) hoặc không biết (vì chúng ta chưa nhận được). Vì vậy, rất hữu ích khi có một loại có thể là một chuỗi hoặc không có gì.
+
+##### Thành phần `Greeter` {#greeter-component}
+
+```tsx
+const Greeter = () => {
+```
+
+Cuối cùng, chúng ta đi đến định nghĩa thành phần.
+
+```tsx
+ const { chain } = useNetwork()
+```
+
+Thông tin về chuỗi chúng ta đang sử dụng, được cung cấp bởi [wagmi](https://wagmi.sh/react/hooks/useNetwork).
+Bởi vì đây là một hook (`use...`), mỗi khi thông tin này thay đổi, thành phần sẽ được vẽ lại.
+
+```tsx
+ const greeterAddr = chain && contractAddrs[chain.id]
+```
+
+Địa chỉ của hợp đồng Greeter, thay đổi theo chuỗi (và là `undefined` nếu chúng ta không có thông tin chuỗi hoặc chúng ta đang ở trên một chuỗi không có hợp đồng đó).
+
+```tsx
+ const readResults = useReadContract({
+ address: greeterAddr,
+ abi: greeterABI,
+ functionName: "greet" , // Không có đối số
+ watch: true
+ })
+```
+
+Hook [`useReadContract`](https://wagmi.sh/react/api/hooks/useReadContract) đọc thông tin từ một hợp đồng. Bạn có thể xem chính xác thông tin mà nó trả về bằng cách mở rộng `readResults` trong giao diện người dùng. Trong trường hợp này, chúng tôi muốn nó tiếp tục tìm kiếm để chúng tôi sẽ được thông báo khi lời chào thay đổi.
+
+**Lưu ý:** Chúng ta có thể lắng nghe các sự kiện [`setGreeting`](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=logs) để biết khi nào lời chào thay đổi và cập nhật theo cách đó. Tuy nhiên, mặc dù nó có thể hiệu quả hơn, nó sẽ không áp dụng trong mọi trường hợp. Khi người dùng chuyển sang một chuỗi khác, lời chào cũng thay đổi, nhưng sự thay đổi đó không đi kèm với một sự kiện. Chúng ta có thể có một phần mã lắng nghe các sự kiện và một phần khác để xác định các thay đổi chuỗi, nhưng điều đó sẽ phức tạp hơn là chỉ cần đặt [tham số `watch`](https://wagmi.sh/react/api/hooks/useReadContract#watch-optional).
+
+```tsx
+ const [ newGreeting, setNewGreeting ] = useState("")
+```
+
+Hook [`useState`](https://www.w3schools.com/react/react_usestate.asp) của React cho phép chúng ta chỉ định một biến trạng thái, giá trị của biến này tồn tại từ lần hiển thị này sang lần hiển thị khác của thành phần. Giá trị ban đầu là tham số, trong trường hợp này là chuỗi rỗng.
+
+Hook `useState` trả về một danh sách với hai giá trị:
+
+1. Giá trị hiện tại của biến trạng thái.
+2. Một hàm để sửa đổi biến trạng thái khi cần thiết. Vì đây là một hook, mỗi lần nó được gọi, thành phần sẽ được hiển thị lại.
+
+Trong trường hợp này, chúng ta đang sử dụng một biến trạng thái cho lời chào mới mà người dùng muốn đặt.
+
+```tsx
+ const greetingChange : ChangeEventHandler = (evt) =>
+ setNewGreeting(evt.target.value)
+```
+
+Đây là trình xử lý sự kiện khi trường nhập lời chào mới thay đổi. Loại [`ChangeEventHandler`](https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/forms_and_events/), chỉ định rằng đây là trình xử lý cho một sự thay đổi giá trị của một phần tử đầu vào HTML. Phần `` được sử dụng vì đây là một [loại chung](https://www.w3schools.com/typescript/typescript_basic_generics.php).
+
+```tsx
+ const preparedTx = usePrepareContractWrite({
+ address: greeterAddr,
+ abi: greeterABI,
+ functionName: 'setGreeting',
+ args: [ newGreeting ]
+ })
+ const workingTx = useContractWrite(preparedTx.config)
+```
+
+Đây là quá trình gửi một giao dịch chuỗi khối từ góc độ máy khách:
+
+1. Gửi giao dịch đến một nút trong chuỗi khối bằng cách sử dụng [`eth_estimateGas`](https://docs.alchemy.com/reference/eth-estimategas).
+2. Chờ phản hồi từ nút.
+3. Khi nhận được phản hồi, yêu cầu người dùng ký giao dịch thông qua ví. Bước này _phải_ xảy ra sau khi nhận được phản hồi của nút vì người dùng được hiển thị chi phí gas của giao dịch trước khi ký.
+4. Chờ người dùng phê duyệt.
+5. Gửi lại giao dịch, lần này sử dụng [`eth_sendRawTransaction`](https://docs.alchemy.com/reference/eth-sendrawtransaction).
+
+Bước 2 có thể sẽ mất một khoảng thời gian đáng kể, trong đó người dùng sẽ tự hỏi liệu lệnh của họ có thực sự được giao diện người dùng nhận được không và tại sao họ chưa được yêu cầu ký giao dịch. Điều đó tạo ra trải nghiệm người dùng (UX) tồi tệ.
+
+Giải pháp là sử dụng [prepare hooks](https://wagmi.sh/react/prepare-hooks). Mỗi khi một tham số thay đổi, ngay lập tức gửi cho nút yêu cầu `eth_estimateGas`. Sau đó, khi người dùng thực sự muốn gửi giao dịch (trong trường hợp này bằng cách nhấn **Cập nhật lời chào**), chi phí gas đã được biết và người dùng có thể thấy trang ví ngay lập tức.
+
+```tsx
+ return (
+```
+
+Bây giờ chúng ta cuối cùng có thể tạo HTML thực tế để trả về.
+
+```tsx
+ <>
+ Greeter
+ {
+ !readResults.isError && !readResults.isLoading &&
+
+ }
+
+```
+
+Tạo một thành phần `ShowGreeting` (được giải thích bên dưới), nhưng chỉ khi lời chào được đọc thành công từ chuỗi khối.
+
+```tsx
+
+```
+
+Đây là trường nhập văn bản nơi người dùng có thể đặt lời chào mới. Mỗi khi người dùng nhấn một phím, chúng ta gọi `greetingChange`, hàm này gọi `setNewGreeting`. Vì `setNewGreeting` đến từ hook `useState`, nó khiến thành phần `Greeter` được hiển thị lại. Điều này có nghĩa là:
+
+- Chúng ta cần chỉ định `value` để giữ giá trị của lời chào mới, bởi vì nếu không nó sẽ trở về mặc định, chuỗi rỗng.
+- `usePrepareContractWrite` được gọi mỗi khi `newGreeting` thay đổi, có nghĩa là nó sẽ luôn có `newGreeting` mới nhất trong giao dịch đã chuẩn bị.
+
+```tsx
+
+```
+
+Nếu không có `workingTx.write`, chúng ta vẫn đang chờ thông tin cần thiết để gửi cập nhật lời chào, vì vậy nút bị vô hiệu hóa. Nếu có giá trị `workingTx.write`, đó là hàm cần gọi để gửi giao dịch.
+
+```tsx
+
+
+
+
+ >
+ )
+}
+```
+
+Cuối cùng, để giúp bạn thấy những gì chúng ta đang làm, hãy hiển thị ba đối tượng mà chúng ta sử dụng:
+
+- `readResults`
+- `preparedTx`
+- `workingTx`
+
+##### Thành phần `ShowGreeting` {#showgreeting-component}
+
+Thành phần này hiển thị
+
+```tsx
+const ShowGreeting = (attrs : ShowGreetingAttrsType) => {
+```
+
+Một hàm thành phần nhận một tham số với tất cả các thuộc tính của thành phần.
+
+```tsx
+ return {attrs.greeting}
+}
+```
+
+##### Thành phần `ShowObject` {#showobject-component}
+
+Vì mục đích thông tin, chúng ta sử dụng thành phần `ShowObject` để hiển thị các đối tượng quan trọng (`readResults` để đọc lời chào và `preparedTx` và `workingTx` cho các giao dịch chúng ta tạo).
+
+```tsx
+const ShowObject = (attrs: ShowObjectAttrsType ) => {
+ const keys = Object.keys(attrs.object)
+ const funs = keys.filter(k => typeof attrs.object[k] == "function")
+ return <>
+
+```
+
+Chúng tôi không muốn làm lộn xộn giao diện người dùng với tất cả thông tin, vì vậy để có thể xem hoặc đóng chúng, chúng tôi sử dụng thẻ [`details`](https://www.w3schools.com/tags/tag_details.asp).
+
+```tsx
+ {attrs.name}
+
+ {JSON.stringify(attrs.object, null, 2)}
+```
+
+Hầu hết các trường được hiển thị bằng [`JSON.stringify`](https://www.w3schools.com/js/js_json_stringify.asp).
+
+```tsx
+
+ { funs.length > 0 &&
+ <>
+ Hàm:
+
+```
+
+Ngoại lệ là các hàm, không phải là một phần của [tiêu chuẩn JSON](https://www.json.org/json-en.html), vì vậy chúng phải được hiển thị riêng biệt.
+
+```tsx
+ {funs.map((f, i) =>
+```
+
+Trong JSX, mã bên trong dấu ngoặc nhọn `{` `}` được hiểu là JavaScript. Sau đó, mã bên trong dấu ngoặc đơn `(` `)` lại được hiểu là JSX.
+
+```tsx
+ (- {f}
)
+ )}
+```
+
+React yêu cầu các thẻ trong [Cây DOM](https://www.w3schools.com/js/js_htmldom.asp) phải có các mã định danh riêng biệt. Điều này có nghĩa là các thẻ con của cùng một thẻ (trong trường hợp này là [danh sách không có thứ tự](https://www.w3schools.com/tags/tag_ul.asp)), cần các thuộc tính `key` khác nhau.
+
+```tsx
+
+ >
+ }
+
+ >
+}
+```
+
+Kết thúc các thẻ HTML khác nhau.
+
+##### `export` cuối cùng {#the-final-export}
+
+```tsx
+export { Greeter }
+```
+
+Thành phần `Greeter` là thành phần chúng ta cần xuất cho ứng dụng.
+
+#### `src/wagmi.ts` {#wagmi-ts}
+
+Cuối cùng, các định nghĩa khác nhau liên quan đến WAGMI nằm trong `src/wagmi.ts`. Tôi sẽ không giải thích mọi thứ ở đây, vì hầu hết chúng là bản mẫu mà bạn không có khả năng cần phải thay đổi.
+
+Mã ở đây không hoàn toàn giống như [trên github](https://github.com/qbzzt/20230801-modern-ui/blob/main/src/wagmi.ts) vì sau này trong bài viết, chúng ta sẽ thêm một chuỗi khác ([Redstone Holesky](https://redstone.xyz/docs/network-info)).
+
+```ts
+import { getDefaultWallets } from '@rainbow-me/rainbowkit'
+import { configureChains, createConfig } from 'wagmi'
+import { holesky, sepolia } from 'wagmi/chains'
+```
+
+Nhập các chuỗi khối mà ứng dụng hỗ trợ. Bạn có thể xem danh sách các chuỗi được hỗ trợ [trong viem github](https://github.com/wagmi-dev/viem/tree/main/src/chains/definitions).
+
+```ts
+import { publicProvider } from 'wagmi/providers/public'
+
+const walletConnectProjectId = 'c96e690bb92b6311e8e9b2a6a22df575'
+```
+
+Để có thể sử dụng [WalletConnect](https://walletconnect.com/), bạn cần một ID dự án cho ứng dụng của mình. Bạn có thể lấy nó [trên cloud.walletconnect.com](https://cloud.walletconnect.com/sign-in).
+
+```ts
+const { chains, publicClient, webSocketPublicClient } = configureChains(
+ [ holesky, sepolia ],
+ [
+ publicProvider(),
+ ],
+)
+
+const { connectors } = getDefaultWallets({
+ appName: 'My wagmi + RainbowKit App',
+ chains,
+ projectId: walletConnectProjectId,
+})
+
+export const config = createConfig({
+ autoConnect: true,
+ connectors,
+ publicClient,
+ webSocketPublicClient,
+})
+
+export { chains }
+```
+
+### Thêm chuỗi khối khác {#add-blockchain}
+
+Ngày nay có rất nhiều [giải pháp mở rộng L2](/layer-2/), và bạn có thể muốn hỗ trợ một số giải pháp mà viem chưa hỗ trợ. Để làm điều đó, bạn sửa đổi `src/wagmi.ts`. Những hướng dẫn này giải thích cách thêm [Redstone Holesky](https://redstone.xyz/docs/network-info).
+
+1. Nhập loại `defineChain` từ viem.
+
+ ```ts
+ import { defineChain } from 'viem'
+ ```
+
+2. Thêm định nghĩa mạng.
+
+ ```ts
+ const redstoneHolesky = defineChain({
+ id: 17_001,
+ name: 'Redstone Holesky',
+ network: 'redstone-holesky',
+ nativeCurrency: {
+ decimals: 18,
+ name: 'Ether',
+ symbol: 'ETH',
+ },
+ rpcUrls: {
+ default: {
+ http: ['https://rpc.holesky.redstone.xyz'],
+ webSocket: ['wss://rpc.holesky.redstone.xyz/ws'],
+ },
+ public: {
+ http: ['https://rpc.holesky.redstone.xyz'],
+ webSocket: ['wss://rpc.holesky.redstone.xyz/ws'],
+ },
+ },
+ blockExplorers: {
+ default: { name: 'Explorer', url: 'https://explorer.holesky.redstone.xyz' },
+ },
+ })
+ ```
+
+3. Thêm chuỗi mới vào lệnh gọi `configureChains`.
+
+ ```ts
+ const { chains, publicClient, webSocketPublicClient } = configureChains(
+ [ holesky, sepolia, redstoneHolesky ],
+ [ publicProvider(), ],
+ )
+ ```
+
+4. Đảm bảo rằng ứng dụng biết địa chỉ cho các hợp đồng của bạn trên mạng mới. Trong trường hợp này, chúng tôi sửa đổi `src/components/Greeter.tsx`:
+
+ ```ts
+ const contractAddrs : AddressPerBlockchainType = {
+ // Holesky
+ 17000: '0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8',
+
+ // Redstone Holesky
+ 17001: '0x4919517f82a1B89a32392E1BF72ec827ba9986D3',
+
+ // Sepolia
+ 11155111: '0x7143d5c190F048C8d19fe325b748b081903E3BF0'
+ }
+ ```
+
+## Kết luận {#conclusion}
+
+Tất nhiên, bạn không thực sự quan tâm đến việc cung cấp giao diện người dùng cho `Greeter`. Bạn muốn tạo giao diện người dùng cho các hợp đồng của riêng mình. Để tạo ứng dụng của riêng bạn, hãy chạy các bước sau:
+
+1. Chỉ định tạo một ứng dụng wagmi.
+
+ ```sh copy
+ pnpm create wagmi
+ ```
+
+2. Đặt tên cho ứng dụng.
+
+3. Chọn framework **React**.
+
+4. Chọn biến thể **Vite**.
+
+5. Bạn có thể [thêm bộ Rainbow](https://www.rainbowkit.com/docs/installation#manual-setup).
+
+Bây giờ hãy đi và làm cho các hợp đồng của bạn có thể sử dụng được cho cả thế giới.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
+
diff --git a/public/content/translations/vi/developers/tutorials/deploying-your-first-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/deploying-your-first-smart-contract/index.md
new file mode 100644
index 00000000000..88d3b01fd26
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/deploying-your-first-smart-contract/index.md
@@ -0,0 +1,101 @@
+---
+title: Triển khai hợp đồng thông minh đầu tiên của bạn
+description: Giới thiệu về việc triển khai hợp đồng thông minh đầu tiên của bạn trên mạng thử nghiệm Ethereum
+author: "jdourlens"
+tags:
+ [
+ "hợp đồng thông minh",
+ "remix",
+ "solidity",
+ "triển khai"
+ ]
+skill: beginner
+lang: vi
+published: 2020-04-03
+source: EthereumDev
+sourceUrl: https://ethereumdev.io/deploying-your-first-smart-contract/
+address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
+---
+
+Tôi đoán rằng bạn cũng háo hức như chúng tôi khi [triển khai](/developers/docs/smart-contracts/deploying/) và tương tác với [hợp đồng thông minh](/developers/docs/smart-contracts/) đầu tiên của bạn trên chuỗi khối Ethereum.
+
+Đừng lo, vì đây là hợp đồng thông minh đầu tiên của chúng ta, chúng ta sẽ triển khai nó trên một [mạng thử nghiệm cục bộ](/developers/docs/networks/) nên bạn sẽ không tốn bất kỳ chi phí nào để triển khai và thử nghiệm bao nhiêu tùy thích.
+
+## Viết hợp đồng của chúng ta {#writing-our-contract}
+
+Bước đầu tiên là [truy cập Remix](https://remix.ethereum.org/) và tạo một tệp mới. Ở phần trên cùng bên trái của giao diện Remix, hãy thêm một tệp mới và nhập tên tệp bạn muốn.
+
+
+
+Trong tệp mới, chúng ta sẽ dán đoạn mã sau.
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.5.17;
+
+contract Counter {
+
+ // Biến công khai của kiểu số nguyên không dấu để giữ số lượng đếm
+ uint256 public count = 0;
+
+ // Hàm tăng bộ đếm của chúng ta
+ function increment() public {
+ count += 1;
+ }
+
+ // Getter không cần thiết để lấy giá trị đếm
+ function getCount() public view returns (uint256) {
+ return count;
+ }
+
+}
+```
+
+Nếu bạn đã quen với lập trình, bạn có thể dễ dàng đoán được chương trình này làm gì. Dưới đây là giải thích từng dòng một:
+
+- Dòng 4: Chúng ta định nghĩa một hợp đồng có tên là `Counter`.
+- Dòng 7: Hợp đồng của chúng ta lưu trữ một số nguyên không dấu có tên là `count`, bắt đầu từ 0.
+- Dòng 10: Hàm đầu tiên sẽ sửa đổi trạng thái của hợp đồng và `increment()` biến `count` của chúng ta.
+- Hàm thứ hai chỉ là một getter để có thể đọc giá trị của biến `count` từ bên ngoài hợp đồng thông minh. Lưu ý rằng, vì chúng ta đã định nghĩa biến `count` của mình là công khai nên điều này không cần thiết nhưng được hiển thị như một ví dụ.
+
+Đó là tất cả cho hợp đồng thông minh đơn giản đầu tiên của chúng ta. Như bạn có thể đã biết, nó trông giống như một lớp từ các ngôn ngữ OOP (Lập trình hướng đối tượng) như Java hoặc C++. Bây giờ là lúc để thử nghiệm với hợp đồng của chúng ta.
+
+## Triển khai hợp đồng của chúng ta {#deploying-our-contract}
+
+Sau khi chúng ta đã viết hợp đồng thông minh đầu tiên, bây giờ chúng ta sẽ triển khai nó lên chuỗi khối để có thể thử nghiệm với nó.
+
+[Triển khai hợp đồng thông minh trên chuỗi khối](/developers/docs/smart-contracts/deploying/) thực chất chỉ là gửi một giao dịch chứa mã của hợp đồng thông minh đã được biên dịch mà không chỉ định bất kỳ người nhận nào.
+
+Trước tiên, chúng ta sẽ [biên dịch hợp đồng](/developers/docs/smart-contracts/compiling/) bằng cách nhấp vào biểu tượng biên dịch ở phía bên tay trái:
+
+
+
+Sau đó, nhấp vào nút biên dịch:
+
+
+
+Bạn có thể chọn tùy chọn “Tự động biên dịch” để hợp đồng sẽ luôn được biên dịch khi bạn lưu nội dung trong trình soạn thảo văn bản.
+
+Sau đó, điều hướng đến màn hình "triển khai và chạy giao dịch":
+
+
+
+Khi bạn ở trên màn hình "triển khai và chạy giao dịch", hãy kiểm tra kỹ xem tên hợp đồng của bạn có xuất hiện không và nhấp vào Triển khai. Như bạn có thể thấy ở đầu trang, môi trường hiện tại là “JavaScript VM”, điều đó có nghĩa là chúng ta sẽ triển khai và tương tác với hợp đồng thông minh của mình trên một chuỗi khối thử nghiệm cục bộ để có thể kiểm tra nhanh hơn và không mất phí.
+
+
+
+Khi bạn đã nhấp vào nút “Triển khai”, bạn sẽ thấy hợp đồng của mình xuất hiện ở dưới cùng. Nhấp vào mũi tên bên trái để mở rộng nó và chúng ta sẽ thấy nội dung của hợp đồng. Đây là biến `counter` của chúng ta, hàm `increment()` và hàm getter `getCounter()`.
+
+Nếu bạn nhấp vào nút `count` hoặc `getCount`, nó sẽ thực sự truy xuất nội dung của biến `count` của hợp đồng và hiển thị nó. Vì chúng ta chưa gọi hàm `increment` nên nó sẽ hiển thị 0.
+
+
+
+Bây giờ hãy gọi hàm `increment` bằng cách nhấp vào nút. Bạn sẽ thấy nhật ký của các giao dịch được thực hiện xuất hiện ở cuối cửa sổ. Bạn sẽ thấy rằng nhật ký sẽ khác khi bạn nhấn nút để truy xuất dữ liệu thay vì nút `increment`. Đó là vì việc đọc dữ liệu trên chuỗi khối không cần bất kỳ giao dịch (ghi) hoặc phí nào. Bởi vì chỉ việc sửa đổi trạng thái của chuỗi khối mới yêu cầu thực hiện một giao dịch:
+
+
+
+Sau khi nhấn nút `increment` tạo ra giao dịch để gọi hàm `increment()` của chúng ta, nếu chúng ta nhấp lại vào nút `count` hoặc `getCount`, chúng ta sẽ đọc được trạng thái mới được cập nhật của hợp đồng thông minh với biến `count` lớn hơn 0.
+
+
+
+Trong bài hướng dẫn tiếp theo, chúng ta sẽ tìm hiểu [cách bạn có thể thêm các sự kiện vào hợp đồng thông minh của mình](/developers/tutorials/logging-events-smart-contracts/). Ghi nhật ký các sự kiện là một cách thuận tiện để gỡ lỗi hợp đồng thông minh của bạn và hiểu những gì đang xảy ra khi gọi một hàm.
diff --git a/public/content/translations/vi/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/translations/vi/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md
new file mode 100644
index 00000000000..1125a365c6f
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md
@@ -0,0 +1,372 @@
+---
+title: Cách phát triển và thử nghiệm một dApp trên mạng thử nghiệm đa máy khách cục bộ
+description: Hướng dẫn này trước tiên sẽ chỉ cho bạn cách khởi tạo và định cấu hình mạng thử nghiệm Ethereum đa máy khách cục bộ trước khi sử dụng mạng thử nghiệm này để triển khai và kiểm tra một dApp.
+author: "Tedi Mitiku"
+tags:
+ [
+ "máy khách",
+ "nút",
+ "hợp đồng thông minh",
+ "khả năng tổng hợp",
+ "lớp đồng thuận",
+ "lớp thực thi",
+ "kiểm thử"
+ ]
+skill: intermediate
+lang: vi
+published: 2023-04-11
+---
+
+## Giới thiệu {#introduction}
+
+Hướng dẫn này sẽ chỉ cho bạn quy trình khởi tạo mạng thử nghiệm Ethereum cục bộ có thể định cấu hình, triển khai hợp đồng thông minh trên đó và sử dụng mạng thử nghiệm để chạy thử nghiệm trên dApp của bạn. Hướng dẫn này được thiết kế dành cho các nhà phát triển dApp muốn phát triển và thử nghiệm các dApp của họ cục bộ so với các cấu hình mạng khác nhau trước khi triển khai lên mạng thử nghiệm trực tiếp hoặc mạng chính.
+
+Trong hướng dẫn này, bạn sẽ:
+
+- Khởi tạo một mạng thử nghiệm Ethereum cục bộ bằng [`eth-network-package`](https://github.com/kurtosis-tech/eth-network-package) có sử dụng [Kurtosis](https://www.kurtosis.com/),
+- Kết nối môi trường phát triển dApp Hardhat của bạn với mạng thử nghiệm cục bộ để biên dịch, triển khai và thử nghiệm một dApp, và
+- Cấu hình mạng thử nghiệm cục bộ, bao gồm các tham số như số lượng nút và các cặp máy khách EL/CL cụ thể, để cho phép quy trình phát triển và thử nghiệm so với các cấu hình mạng khác nhau.
+
+### Kurtosis là gì? {#what-is-kurtosis}
+
+[Kurtosis](https://www.kurtosis.com/) là một hệ thống xây dựng có thể kết hợp được thiết kế để định cấu hình các môi trường thử nghiệm đa vùng chứa. Nó đặc biệt cho phép các nhà phát triển tạo ra các môi trường có thể tái tạo yêu cầu logic thiết lập động, chẳng hạn như mạng thử nghiệm chuỗi khối.
+
+Trong hướng dẫn này, gói mạng eth Kurtosis khởi động một mạng thử nghiệm Ethereum cục bộ có hỗ trợ cho ứng dụng lớp thực thi (EL) [`geth`](https://geth.ethereum.org/), cũng như các ứng dụng lớp đồng thuận (CL) [`teku`](https://consensys.io/teku), [`lighthouse`](https://lighthouse.sigmaprime.io/) và [`lodestar`](https://lodestar.chainsafe.io/). Gói này phục vụ như một giải pháp thay thế có thể định cấu hình và có thể kết hợp cho các mạng trong các khuôn khổ như Hardhat Network, Ganache, và Anvil. Kurtosis cung cấp cho các nhà phát triển sự kiểm soát và linh hoạt cao hơn đối với các mạng thử nghiệm mà họ sử dụng, đây là lý do chính tại sao [Ethereum Foundation đã sử dụng Kurtosis để thử nghiệm The Merge](https://www.kurtosis.com/blog/testing-the-ethereum-merge) và tiếp tục sử dụng nó để thử nghiệm các bản nâng cấp mạng.
+
+## Thiết lập Kurtosis {#setting-up-kurtosis}
+
+Trước khi tiếp tục, hãy đảm bảo bạn có:
+
+- [Đã cài đặt và khởi động công cụ Docker](https://docs.kurtosis.com/install/#i-install--start-docker) trên máy cục bộ của bạn
+- [Đã cài đặt Kurtosis CLI](https://docs.kurtosis.com/install#ii-install-the-cli) (hoặc nâng cấp nó lên bản phát hành mới nhất, nếu bạn đã cài đặt CLI)
+- Đã cài đặt [Node.js](https://nodejs.org/en), [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable), và [npx](https://www.npmjs.com/package/npx) (cho môi trường dApp của bạn)
+
+## Khởi tạo mạng thử nghiệm Ethereum cục bộ {#instantiate-testnet}
+
+Để khởi động mạng thử nghiệm Ethereum cục bộ, hãy chạy:
+
+```python
+kurtosis --enclave local-eth-testnet run github.com/kurtosis-tech/eth-network-package
+```
+
+Lưu ý: Lệnh này đặt tên cho mạng của bạn: \"local-eth-testnet\” bằng cách sử dụng cờ `--enclave`.
+
+Kurtosis sẽ in các bước mà nó đang thực hiện ngầm khi nó hoạt động để diễn giải, xác thực, và sau đó thực thi các hướng dẫn. Cuối cùng, bạn sẽ thấy một kết quả đầu ra giống như sau:
+
+```python
+INFO[2023-04-04T18:09:44-04:00] ======================================================
+INFO[2023-04-04T18:09:44-04:00] || Created enclave: local-eth-testnet ||
+INFO[2023-04-04T18:09:44-04:00] ======================================================
+Name: local-eth-testnet
+UUID: 39372d756ae8
+Status: RUNNING
+Creation Time: Tue, 04 Apr 2023 18:09:03 EDT
+
+========================================= Files Artifacts =========================================
+UUID Name
+d4085a064230 cl-genesis-data
+1c62cb792e4c el-genesis-data
+bd60489b73a7 genesis-generation-config-cl
+b2e593fe5228 genesis-generation-config-el
+d552a54acf78 geth-prefunded-keys
+5f7e661eb838 prysm-password
+054e7338bb59 validator-keystore-0
+
+========================================== User Services ==========================================
+UUID Name Ports Status
+e20f129ee0c5 cl-client-0-beacon http: 4000/tcp -> RUNNING
+ metrics: 5054/tcp ->
+ tcp-discovery: 9000/tcp -> 127.0.0.1:54263
+ udp-discovery: 9000/udp -> 127.0.0.1:60470
+a8b6c926cdb4 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:54267 RUNNING
+ metrics: 5064/tcp ->
+d7b802f623e8 el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:54253 RUNNING
+ rpc: 8545/tcp -> 127.0.0.1:54251
+ tcp-discovery: 30303/tcp -> 127.0.0.1:54254
+ udp-discovery: 30303/udp -> 127.0.0.1:53834
+ ws: 8546/tcp -> 127.0.0.1:54252
+514a829c0a84 prelaunch-data-generator-1680646157905431468 STOPPED
+62bd62d0aa7a prelaunch-data-generator-1680646157915424301 STOPPED
+05e9619e0e90 prelaunch-data-generator-1680646157922872635 STOPPED
+
+```
+
+Xin chúc mừng! Bạn đã sử dụng Kurtosis để khởi tạo một mạng thử nghiệm Ethereum cục bộ, với một ứng dụng CL (`lighthouse`) và một ứng dụng EL (`geth`), trên Docker.
+
+### Đánh giá lại {#review-instantiate-testnet}
+
+Trong phần này, bạn đã thực thi một lệnh hướng Kurtosis sử dụng [`eth-network-package` được lưu trữ từ xa trên GitHub](https://github.com/kurtosis-tech/eth-network-package) để khởi động một mạng thử nghiệm Ethereum cục bộ trong một [Enclave](https://docs.kurtosis.com/advanced-concepts/enclaves/) Kurtosis. Bên trong enclave của bạn, bạn sẽ tìm thấy cả \"tệp tạo tác\" và \"dịch vụ người dùng\".
+
+[Tệp tạo tác](https://docs.kurtosis.com/advanced-concepts/files-artifacts/) trong enclave của bạn bao gồm tất cả dữ liệu được tạo và sử dụng để khởi động các ứng dụng EL và CL. Dữ liệu được tạo bằng cách sử dụng dịch vụ `prelaunch-data-generator` được xây dựng từ [hình ảnh Docker](https://github.com/ethpandaops/ethereum-genesis-generator) này
+
+Các dịch vụ người dùng hiển thị tất cả các dịch vụ được đóng gói đang hoạt động trong enclave của bạn. Bạn sẽ nhận thấy rằng một nút duy nhất, có cả ứng dụng EL và ứng dụng CL, đã được tạo.
+
+## Kết nối môi trường phát triển dApp của bạn với mạng thử nghiệm Ethereum cục bộ {#connect-your-dapp}
+
+### Thiết lập môi trường phát triển dApp {#set-up-dapp-env}
+
+Bây giờ bạn đã có một mạng thử nghiệm cục bộ đang chạy, bạn có thể kết nối môi trường phát triển dApp của mình để sử dụng mạng thử nghiệm cục bộ. Khuôn khổ Hardhat sẽ được sử dụng trong hướng dẫn này để triển khai một dApp blackjack tới mạng thử nghiệm cục bộ của bạn.
+
+Để thiết lập môi trường phát triển dApp của bạn, hãy sao chép kho lưu trữ chứa dApp mẫu của chúng tôi và cài đặt các phần phụ thuộc của nó, hãy chạy:
+
+```python
+git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-kurtosis/smart-contract-example && yarn
+```
+
+Thư mục [smart-contract-example](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example) được sử dụng ở đây chứa thiết lập điển hình cho một nhà phát triển dApp sử dụng khuôn khổ [Hardhat](https://hardhat.org/):
+
+- [`contracts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/contracts) chứa một vài hợp đồng thông minh đơn giản cho một dApp Blackjack
+- [`scripts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/scripts) chứa một tập lệnh để triển khai hợp đồng mã thông báo cho mạng Ethereum cục bộ của bạn
+- [`test/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/test) chứa một bài kiểm tra .js đơn giản cho hợp đồng mã thông báo của bạn để xác nhận mỗi người chơi trong dApp Blackjack của chúng tôi có 1000 được đúc cho họ
+- [`hardhat.config.ts`](https://github.com/kurtosis-tech/awesome-kurtosis/blob/main/smart-contract-example/hardhat.config.ts) cấu hình thiết lập Hardhat của bạn
+
+### Cấu hình Hardhat để sử dụng mạng thử nghiệm cục bộ {#configure-hardhat}
+
+Với môi trường phát triển dApp đã được thiết lập, bây giờ bạn sẽ kết nối Hardhat để sử dụng mạng thử nghiệm Ethereum cục bộ được tạo bằng Kurtosis. Để thực hiện điều này, hãy thay thế `<$YOUR_PORT>` trong cấu trúc `localnet` trong tệp cấu hình `hardhat.config.ts` của bạn bằng cổng của đầu ra rpc uri từ bất kỳ dịch vụ `el-client-` nào. Trong trường hợp mẫu này, cổng sẽ là `64248`. Cổng của bạn sẽ khác.
+
+Ví dụ trong `hardhat.config.ts`:
+
+```js
+localnet: {
+url: 'http://127.0.0.1:<$YOUR_PORT>',// TODO: THAY THẾ $YOUR_PORT BẰNG CỔNG CỦA MỘT URI NÚT DO GÓI MẠNG KURTOSIS ETH TẠO RA
+
+// Đây là các khóa riêng được liên kết với các tài khoản thử nghiệm được cấp vốn trước do gói mạng eth tạo ra
+//
+accounts: [
+ "ef5177cd0b6b21c87db5a0bf35d4084a8a57a9d6a064f86d51ac85f2b873a4e2",
+ "48fcc39ae27a0e8bf0274021ae6ebd8fe4a0e12623d61464c498900b28feb567",
+ "7988b3a148716ff800414935b305436493e1f25237a2a03e5eebc343735e2f31",
+ "b3c409b6b0b3aa5e65ab2dc1930534608239a478106acf6f3d9178e9f9b00b35",
+ "df9bb6de5d3dc59595bcaa676397d837ff49441d211878c024eabda2cd067c9f",
+ "7da08f856b5956d40a72968f93396f6acff17193f013e8053f6fbb6c08c194d6",
+ ],
+},
+```
+
+Sau khi bạn lưu tệp của mình, môi trường phát triển dApp Hardhat của bạn hiện đã được kết nối với mạng thử nghiệm Ethereum cục bộ của bạn! Bạn có thể xác minh rằng mạng thử nghiệm của mình đang hoạt động bằng cách chạy:
+
+```python
+npx hardhat balances --network localnet
+```
+
+Kết quả đầu ra sẽ trông giống như sau:
+
+```python
+0x878705ba3f8Bc32FCf7F4CAa1A35E72AF65CF766 has balance 10000000000000000000000000
+0x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 10000000000000000000000000
+0xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 10000000000000000000000000
+0x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 10000000000000000000000000
+0x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 10000000000000000000000000
+0x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000
+```
+
+Điều này xác nhận rằng Hardhat đang sử dụng mạng thử nghiệm cục bộ của bạn và phát hiện các tài khoản được cấp vốn trước được tạo bởi `eth-network-package`.
+
+### Triển khai và thử nghiệm dApp của bạn cục bộ {#deploy-and-test-dapp}
+
+Với môi trường phát triển dApp được kết nối hoàn toàn với mạng thử nghiệm Ethereum cục bộ, giờ đây bạn có thể chạy quy trình phát triển và thử nghiệm trên dApp của mình bằng cách sử dụng mạng thử nghiệm cục bộ.
+
+Để biên dịch và triển khai hợp đồng thông minh `ChipToken.sol` để tạo mẫu và phát triển cục bộ, hãy chạy:
+
+```python
+npx hardhat compile
+npx hardhat run scripts/deploy.ts --network localnet
+```
+
+Đầu ra sẽ trông giống như:
+
+```python
+ChipToken deployed to: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487d
+```
+
+Bây giờ, hãy thử chạy thử nghiệm `simple.js` trên dApp cục bộ của bạn để xác nhận mỗi người chơi trong dApp Blackjack của chúng tôi có 1000 được đúc cho họ:
+
+Kết quả đầu ra sẽ trông giống như sau:
+
+```python
+npx hardhat test --network localnet
+```
+
+Kết quả đầu ra sẽ trông giống như sau:
+
+```python
+ChipToken
+ mint
+ ✔ nên đúc 1000 chip cho PLAYER ONE
+
+ 1 vượt qua (654ms)
+```
+
+### Đánh giá lại {#review-dapp-workflows}
+
+Tại thời điểm này, bạn đã thiết lập một môi trường phát triển dApp, kết nối nó với một mạng Ethereum cục bộ được tạo bởi Kurtosis, và đã biên dịch, triển khai và chạy một thử nghiệm đơn giản trên dApp của bạn.
+
+Bây giờ, chúng ta hãy khám phá cách bạn có thể cấu hình mạng cơ bản để thử nghiệm các dApp của chúng tôi trong các cấu hình mạng khác nhau.
+
+## Cấu hình mạng thử nghiệm Ethereum cục bộ {#configure-testnet}
+
+### Thay đổi cấu hình ứng dụng khách và số lượng nút {#configure-client-config-and-num-nodes}
+
+Mạng thử nghiệm Ethereum cục bộ của bạn có thể được cấu hình để sử dụng các cặp ứng dụng EL và CL khác nhau, cũng như một số lượng nút khác nhau, tùy thuộc vào kịch bản và cấu hình mạng cụ thể mà bạn muốn phát triển hoặc thử nghiệm. Điều này có nghĩa là, sau khi thiết lập, bạn có thể khởi động một mạng thử nghiệm cục bộ tùy chỉnh và sử dụng nó để chạy các quy trình công việc tương tự (triển khai, thử nghiệm, v.v.) trong các cấu hình mạng khác nhau để đảm bảo mọi thứ hoạt động như mong đợi. Để tìm hiểu thêm về các tham số khác mà bạn có thể sửa đổi, hãy truy cập liên kết này.
+
+Hãy thử xem! Bạn có thể chuyển các tùy chọn cấu hình khác nhau cho `eth-network-package` thông qua một tệp JSON. Tệp JSON tham số mạng này cung cấp các cấu hình cụ thể mà Kurtosis sẽ sử dụng để thiết lập mạng Ethereum cục bộ.
+
+Lấy tệp cấu hình mặc định và chỉnh sửa nó để khởi động hai nút với các cặp EL/CL khác nhau:
+
+- Nút 1 với `geth`/`lighthouse`
+- Nút 2 với `geth`/`lodestar`
+- Nút 3 với `geth`/`teku`
+
+Cấu hình này tạo ra một mạng lưới không đồng nhất gồm các triển khai nút Ethereum để thử nghiệm dApp của bạn. Tệp cấu hình của bạn bây giờ sẽ trông như sau:
+
+```yaml
+{
+ "participants":
+ [
+ {
+ "el_client_type": "geth",
+ "el_client_image": "",
+ "el_client_log_level": "",
+ "cl_client_type": "lighthouse",
+ "cl_client_image": "",
+ "cl_client_log_level": "",
+ "beacon_extra_params": [],
+ "el_extra_params": [],
+ "validator_extra_params": [],
+ "builder_network_params": null,
+ },
+ {
+ "el_client_type": "geth",
+ "el_client_image": "",
+ "el_client_log_level": "",
+ "cl_client_type": "lodestar",
+ "cl_client_image": "",
+ "cl_client_log_level": "",
+ "beacon_extra_params": [],
+ "el_extra_params": [],
+ "validator_extra_params": [],
+ "builder_network_params": null,
+ },
+ {
+ "el_client_type": "geth",
+ "el_client_image": "",
+ "el_client_log_level": "",
+ "cl_client_type": "teku",
+ "cl_client_image": "",
+ "cl_client_log_level": "",
+ "beacon_extra_params": [],
+ "el_extra_params": [],
+ "validator_extra_params": [],
+ "builder_network_params": null,
+ },
+ ],
+ "network_params":
+ {
+ "preregistered_validator_keys_mnemonic": "giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete",
+ "num_validator_keys_per_node": 64,
+ "network_id": "3151908",
+ "deposit_contract_address": "0x4242424242424242424242424242424242424242",
+ "seconds_per_slot": 12,
+ "genesis_delay": 120,
+ "capella_fork_epoch": 5,
+ },
+}
+```
+
+Mỗi cấu trúc `participants` ánh xạ tới một nút trong mạng, vì vậy 3 cấu trúc `participants` sẽ cho Kurtosis biết để khởi động 3 nút trong mạng của bạn. Mỗi cấu trúc `participants` sẽ cho phép bạn chỉ định cặp EL và CL được sử dụng cho nút cụ thể đó.
+
+Cấu trúc `network_params` cấu hình các cài đặt mạng được sử dụng để tạo các tệp genesis cho mỗi nút cũng như các cài đặt khác như số giây mỗi slot của mạng.
+
+Lưu tệp tham số đã chỉnh sửa của bạn vào bất kỳ thư mục nào bạn muốn (trong ví dụ bên dưới, nó được lưu vào màn hình nền) và sau đó sử dụng nó để chạy gói Kurtosis của bạn bằng cách chạy:
+
+```python
+kurtosis clean -a && kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package "$(cat ~/eth-network-params.json)"
+```
+
+Lưu ý: lệnh `kurtosis clean -a` được sử dụng ở đây để hướng dẫn Kurtosis hủy mạng thử nghiệm cũ và nội dung của nó trước khi khởi động một mạng mới.
+
+Một lần nữa, Kurtosis sẽ hoạt động một chút và in ra các bước riêng lẻ đang diễn ra. Cuối cùng, đầu ra sẽ trông giống như:
+
+```python
+Starlark code successfully run. No output was returned.
+INFO[2023-04-07T11:43:16-04:00] ==========================================================
+INFO[2023-04-07T11:43:16-04:00] || Created enclave: local-eth-testnet ||
+INFO[2023-04-07T11:43:16-04:00] ==========================================================
+Name: local-eth-testnet
+UUID: bef8c192008e
+Status: RUNNING
+Creation Time: Fri, 07 Apr 2023 11:41:58 EDT
+
+========================================= Files Artifacts =========================================
+UUID Name
+cc495a8e364a cl-genesis-data
+7033fcdb5471 el-genesis-data
+a3aef43fc738 genesis-generation-config-cl
+8e968005fc9d genesis-generation-config-el
+3182cca9d3cd geth-prefunded-keys
+8421166e234f prysm-password
+d9e6e8d44d99 validator-keystore-0
+23f5ba517394 validator-keystore-1
+4d28dea40b5c validator-keystore-2
+
+========================================== User Services ==========================================
+UUID Name Ports Status
+485e6fde55ae cl-client-0-beacon http: 4000/tcp -> http://127.0.0.1:65010 RUNNING
+ metrics: 5054/tcp -> http://127.0.0.1:65011
+ tcp-discovery: 9000/tcp -> 127.0.0.1:65012
+ udp-discovery: 9000/udp -> 127.0.0.1:54455
+73739bd158b2 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:65016 RUNNING
+ metrics: 5064/tcp -> http://127.0.0.1:65017
+1b0a233cd011 cl-client-1-beacon http: 4000/tcp -> 127.0.0.1:65021 RUNNING
+ metrics: 8008/tcp -> 127.0.0.1:65023
+ tcp-discovery: 9000/tcp -> 127.0.0.1:65024
+ udp-discovery: 9000/udp -> 127.0.0.1:56031
+ validator-metrics: 5064/tcp -> 127.0.0.1:65022
+949b8220cd53 cl-client-1-validator http: 4000/tcp -> 127.0.0.1:65028 RUNNING
+ metrics: 8008/tcp -> 127.0.0.1:65030
+ tcp-discovery: 9000/tcp -> 127.0.0.1:65031
+ udp-discovery: 9000/udp -> 127.0.0.1:60784
+ validator-metrics: 5064/tcp -> 127.0.0.1:65029
+c34417bea5fa cl-client-2 http: 4000/tcp -> 127.0.0.1:65037 RUNNING
+ metrics: 8008/tcp -> 127.0.0.1:65035
+ tcp-discovery: 9000/tcp -> 127.0.0.1:65036
+ udp-discovery: 9000/udp -> 127.0.0.1:63581
+e19738e6329d el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:64986 RUNNING
+ rpc: 8545/tcp -> 127.0.0.1:64988
+ tcp-discovery: 30303/tcp -> 127.0.0.1:64987
+ udp-discovery: 30303/udp -> 127.0.0.1:55706
+ ws: 8546/tcp -> 127.0.0.1:64989
+e904687449d9 el-client-1 engine-rpc: 8551/tcp -> 127.0.0.1:64993 RUNNING
+ rpc: 8545/tcp -> 127.0.0.1:64995
+ tcp-discovery: 30303/tcp -> 127.0.0.1:64994
+ udp-discovery: 30303/udp -> 127.0.0.1:58096
+ ws: 8546/tcp -> 127.0.0.1:64996
+ad6f401126fa el-client-2 engine-rpc: 8551/tcp -> 127.0.0.1:65003 RUNNING
+ rpc: 8545/tcp -> 127.0.0.1:65001
+ tcp-discovery: 30303/tcp -> 127.0.0.1:65000
+ udp-discovery: 30303/udp -> 127.0.0.1:57269
+ ws: 8546/tcp -> 127.0.0.1:65002
+12d04a9dbb69 prelaunch-data-generator-1680882122181135513 STOPPED
+5b45f9c0504b prelaunch-data-generator-1680882122192182847 STOPPED
+3d4aaa75e218 prelaunch-data-generator-1680882122201668972 STOPPED
+```
+
+Xin chúc mừng! Bạn đã cấu hình thành công mạng thử nghiệm cục bộ của mình để có 3 nút thay vì 1. Để chạy các quy trình công việc tương tự như bạn đã làm trước đây trên dApp của mình (triển khai & thử nghiệm), hãy thực hiện các thao tác tương tự như chúng tôi đã làm trước đây bằng cách thay thế `<$YOUR_PORT>` trong cấu trúc `localnet` trong tệp cấu hình `hardhat.config.ts` của bạn bằng cổng của đầu ra rpc uri từ bất kỳ dịch vụ `el-client-` nào trong mạng thử nghiệm cục bộ 3 nút mới của bạn.
+
+## Kết luận {#conclusion}
+
+Vậy là xong! Tóm lại hướng dẫn ngắn này, bạn đã:
+
+- Đã tạo một mạng thử nghiệm Ethereum cục bộ trên Docker bằng Kurtosis
+- Đã kết nối môi trường phát triển dApp cục bộ của bạn với mạng Ethereum cục bộ
+- Đã triển khai một dApp và chạy một thử nghiệm đơn giản trên nó trên mạng Ethereum cục bộ
+- Đã cấu hình mạng Ethereum cơ bản để có 3 nút
+
+Chúng tôi rất muốn nghe từ bạn về những gì đã diễn ra tốt đẹp với bạn, những gì có thể được cải thiện, hoặc để trả lời bất kỳ câu hỏi nào của bạn. Đừng ngần ngại liên hệ qua [GitHub](https://github.com/kurtosis-tech/kurtosis/issues/new/choose) hoặc [gửi email cho chúng tôi](mailto:feedback@kurtosistech.com)!
+
+### Các ví dụ và hướng dẫn khác {#other-examples-guides}
+
+Chúng tôi khuyến khích bạn xem qua [bắt đầu nhanh](https://docs.kurtosis.com/quickstart) của chúng tôi (nơi bạn sẽ xây dựng một cơ sở dữ liệu Postgres và Giao diện Lập trình Ứng dụng trên đó) và các ví dụ khác của chúng tôi trong [kho lưu trữ awesome-kurtosis](https://github.com/kurtosis-tech/awesome-kurtosis) nơi bạn sẽ tìm thấy một số ví dụ tuyệt vời, bao gồm các gói cho:
+
+- [Khởi động cùng một mạng thử nghiệm Ethereum cục bộ](https://github.com/kurtosis-tech/eth2-package), nhưng với các dịch vụ bổ sung được kết nối như trình spam giao dịch (để mô phỏng giao dịch), trình theo dõi phân nhánh và một phiên bản Grafana và Prometheus được kết nối
+- Thực hiện [thử nghiệm mạng con](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/ethereum-network-partition-test) trên cùng một mạng Ethereum cục bộ
diff --git a/public/content/translations/vi/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md b/public/content/translations/vi/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md
new file mode 100644
index 00000000000..7536f729bcf
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md
@@ -0,0 +1,144 @@
+---
+title: "Thu hẹp hợp đồng để chống lại giới hạn kích thước hợp đồng"
+description: Bạn có thể làm gì để ngăn các hợp đồng thông minh của mình trở nên quá lớn?
+author: Markus Waas
+lang: vi
+tags: [ "solidity", "hợp đồng thông minh", "lưu trữ" ]
+skill: intermediate
+published: 2020-06-26
+source: soliditydeveloper.com
+sourceUrl: https://soliditydeveloper.com/max-contract-size
+---
+
+## Tại sao lại có giới hạn? {#why-is-there-a-limit}
+
+Vào [ngày 22 tháng 11 năm 2016](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/), đợt phân nhánh cứng Spurious Dragon đã giới thiệu [EIP-170](https://eips.ethereum.org/EIPS/eip-170), bổ sung giới hạn kích thước hợp đồng thông minh là 24,576 kb. Đối với bạn với tư cách là một nhà phát triển Solidity, điều này có nghĩa là khi bạn thêm ngày càng nhiều chức năng vào hợp đồng của mình, đến một lúc nào đó, bạn sẽ đạt đến giới hạn và khi triển khai sẽ thấy lỗi:
+
+`Cảnh báo: Kích thước mã hợp đồng vượt quá 24576 byte (một giới hạn được giới thiệu trong Spurious Dragon).` Hợp đồng này có thể không triển khai được trên Mạng chính. Hãy cân nhắc việc bật trình tối ưu hóa (với giá trị "runs" thấp!), tắt các chuỗi hoàn nguyên hoặc sử dụng các thư viện.\`
+
+Giới hạn này đã được đưa ra để ngăn chặn các cuộc tấn công từ chối dịch vụ (DOS). Bất kỳ lệnh gọi nào đến một hợp đồng đều tương đối rẻ về mặt gas. Tuy nhiên, tác động của một lệnh gọi hợp đồng đối với các nút Ethereum tăng lên không tương xứng tùy thuộc vào kích thước mã của hợp đồng được gọi (đọc mã từ đĩa, tiền xử lý mã, thêm dữ liệu vào bằng chứng Merkle). Bất cứ khi nào bạn gặp phải tình huống mà kẻ tấn công yêu cầu ít tài nguyên để gây ra nhiều công việc cho người khác, bạn có nguy cơ bị tấn công DOS.
+
+Ban đầu, đây không phải là một vấn đề lớn vì một giới hạn kích thước hợp đồng tự nhiên là giới hạn gas của khối. Rõ ràng là một hợp đồng phải được triển khai trong một giao dịch chứa tất cả chỉ thị biên dịch của hợp đồng. Nếu bạn chỉ bao gồm một giao dịch đó vào một khối, bạn có thể sử dụng hết lượng gas đó, nhưng nó không phải là vô hạn. Kể từ [Nâng cấp London](/ethereum-forks/#london), giới hạn gas của khối đã có thể thay đổi trong khoảng từ 15 triệu đến 30 triệu đơn vị tùy thuộc vào nhu cầu của mạng.
+
+Trong phần tiếp theo, chúng ta sẽ xem xét một số phương pháp được sắp xếp theo tác động tiềm tàng của chúng. Hãy nghĩ về nó theo thuật ngữ giảm cân. Chiến lược tốt nhất để ai đó đạt được cân nặng mục tiêu của họ (trong trường hợp của chúng ta là 24kb) là tập trung vào các phương pháp có tác động lớn trước tiên. Trong hầu hết các trường hợp, chỉ cần điều chỉnh chế độ ăn uống sẽ giúp bạn đạt được mục tiêu, nhưng đôi khi bạn cần nhiều hơn một chút. Sau đó, bạn có thể thêm một số bài tập thể dục (tác động trung bình) hoặc thậm chí là các chất bổ sung (tác động nhỏ).
+
+## Tác động lớn {#big-impact}
+
+### Tách các hợp đồng của bạn {#separate-your-contracts}
+
+Đây phải luôn là cách tiếp cận đầu tiên của bạn. Làm thế nào bạn có thể tách hợp đồng thành nhiều hợp đồng nhỏ hơn? Nó thường buộc bạn phải đưa ra một kiến trúc tốt cho các hợp đồng của mình. Các hợp đồng nhỏ hơn luôn được ưu tiên từ góc độ dễ đọc của mã. Để tách hợp đồng, hãy tự hỏi bản thân:
+
+- Những chức năng nào thuộc về nhau? Mỗi bộ chức năng có thể là tốt nhất trong hợp đồng riêng của nó.
+- Những chức năng nào không yêu cầu đọc trạng thái hợp đồng hoặc chỉ một tập hợp con cụ thể của trạng thái?
+- Bạn có thể tách riêng phần lưu trữ và chức năng không?
+
+### Thư viện {#libraries}
+
+Một cách đơn giản để di chuyển mã chức năng ra khỏi bộ nhớ là sử dụng [thư viện](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries). Đừng khai báo các chức năng của thư viện là nội bộ vì chúng sẽ được [thêm vào hợp đồng](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking) trực tiếp trong quá trình biên dịch. Nhưng nếu bạn sử dụng các hàm công khai, thì những hàm đó trên thực tế sẽ nằm trong một hợp đồng thư viện riêng biệt. Hãy cân nhắc [sử dụng for](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for) để việc sử dụng các thư viện thuận tiện hơn.
+
+### Proxy {#proxies}
+
+Một chiến lược nâng cao hơn sẽ là một hệ thống proxy. Các thư viện sử dụng `DELEGATECALL` ở phía sau, chỉ đơn giản là thực thi chức năng của một hợp đồng khác với trạng thái của hợp đồng gọi. Hãy xem [bài đăng trên blog này](https://hackernoon.com/how-to-make-smart-contracts-upgradable-2612e771d5a2) để tìm hiểu thêm về các hệ thống proxy. Chúng cung cấp cho bạn nhiều chức năng hơn, ví dụ: chúng cho phép khả năng nâng cấp, nhưng chúng cũng làm tăng thêm rất nhiều sự phức tạp. Tôi sẽ không thêm những thứ đó chỉ để giảm kích thước hợp đồng trừ khi đó là lựa chọn duy nhất của bạn vì bất kỳ lý do gì.
+
+## Tác động trung bình {#medium-impact}
+
+### Xóa các chức năng {#remove-functions}
+
+Điều này có lẽ đã quá rõ ràng. Các chức năng làm tăng kích thước hợp đồng lên khá nhiều.
+
+- **Bên ngoài**: Nhiều khi chúng tôi thêm rất nhiều chức năng xem vì lý do tiện lợi. Điều đó hoàn toàn ổn cho đến khi bạn đạt đến giới hạn kích thước. Sau đó, bạn có thể muốn thực sự nghĩ về việc loại bỏ tất cả trừ những cái thực sự cần thiết.
+- **Nội bộ**: Bạn cũng có thể xóa các chức năng nội bộ/riêng tư và chỉ cần đưa mã vào cùng dòng miễn là chức năng đó chỉ được gọi một lần.
+
+### Tránh các biến bổ sung {#avoid-additional-variables}
+
+```solidity
+function get(uint id) returns (address,address) {
+ MyStruct memory myStruct = myStructs[id];
+ return (myStruct.addr1, myStruct.addr2);
+}
+```
+
+```solidity
+function get(uint id) returns (address,address) {
+ return (myStructs[id].addr1, myStructs[id].addr2);
+}
+```
+
+Một thay đổi đơn giản như thế này tạo ra sự khác biệt **0,28kb**. Có khả năng bạn có thể tìm thấy nhiều tình huống tương tự trong các hợp đồng của mình và những tình huống đó thực sự có thể cộng lại thành số tiền đáng kể.
+
+### Rút ngắn thông báo lỗi {#shorten-error-message}
+
+Các thông báo hoàn nguyên dài và đặc biệt là nhiều thông báo hoàn nguyên khác nhau có thể làm phình to hợp đồng. Thay vào đó, hãy sử dụng các mã lỗi ngắn và giải mã chúng trong hợp đồng của bạn. Một thông điệp dài có thể trở nên ngắn hơn nhiều:
+
+```solidity
+require(msg.sender == owner, "Chỉ chủ sở hữu của hợp đồng này mới có thể gọi chức năng này");
+```
+
+```solidity
+require(msg.sender == owner, "OW1");
+```
+
+### Sử dụng các lỗi tùy chỉnh thay vì thông báo lỗi
+
+Các lỗi tùy chỉnh đã được giới thiệu trong [Solidity 0.8.4](https://blog.soliditylang.org/2021/04/21/custom-errors/). Chúng là một cách tuyệt vời để giảm kích thước hợp đồng của bạn, bởi vì chúng được mã hóa ABI dưới dạng các bộ chọn (giống như các chức năng).
+
+```solidity
+error Unauthorized();
+
+if (msg.sender != owner) {
+ revert Unauthorized();
+}
+```
+
+### Cân nhắc giá trị chạy thấp trong trình tối ưu hóa {#consider-a-low-run-value-in-the-optimizer}
+
+Bạn cũng có thể thay đổi cài đặt trình tối ưu hóa. Giá trị mặc định là 200 có nghĩa là nó đang cố gắng tối ưu hóa chỉ thị biên dịch như thể một chức năng được gọi 200 lần. Nếu bạn đổi nó thành 1, về cơ bản bạn đang yêu cầu trình tối ưu hóa tối ưu cho trường hợp chạy mỗi chức năng chỉ một lần. Một chức năng được tối ưu hóa để chỉ chạy một lần có nghĩa là nó được tối ưu hóa cho chính việc triển khai. Lưu ý rằng **điều này làm tăng [chi phí gas](/developers/docs/gas/) để chạy các chức năng**, vì vậy bạn có thể không muốn làm điều đó.
+
+## Tác động nhỏ {#small-impact}
+
+### Tránh chuyển các cấu trúc cho các chức năng {#avoid-passing-structs-to-functions}
+
+Nếu bạn đang sử dụng [ABIEncoderV2](https://solidity.readthedocs.io/en/v0.6.10/layout-of-source-files.html#abiencoderv2), nó có thể giúp không chuyển các cấu trúc cho một chức năng. Thay vì chuyển tham số dưới dạng một cấu trúc, hãy chuyển trực tiếp các tham số bắt buộc. Trong ví dụ này, chúng tôi đã tiết kiệm được **0,1kb** nữa.
+
+```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);
+}
+```
+
+### Khai báo khả năng hiển thị chính xác cho các chức năng và biến {#declare-correct-visibility-for-functions-and-variables}
+
+- Các chức năng hoặc biến chỉ được gọi từ bên ngoài? Khai báo chúng là `external` thay vì `public`.
+- Các chức năng hoặc biến chỉ được gọi từ bên trong hợp đồng? Khai báo chúng là `private` hoặc `internal` thay vì `public`.
+
+### Xóa các bộ sửa đổi {#remove-modifiers}
+
+Các bộ sửa đổi, đặc biệt khi được sử dụng nhiều, có thể có tác động đáng kể đến kích thước hợp đồng. Cân nhắc loại bỏ chúng và thay vào đó sử dụng các chức năng.
+
+```solidity
+modifier checkStuff() {}
+
+function doSomething() checkStuff {}
+```
+
+```solidity
+function checkStuff() private {}
+
+function doSomething() { checkStuff(); }
+```
+
+Những mẹo đó sẽ giúp bạn giảm đáng kể kích thước hợp đồng. Một lần nữa, tôi không thể không nhấn mạnh rằng, hãy luôn tập trung vào việc tách các hợp đồng nếu có thể để có tác động lớn nhất.
diff --git a/public/content/translations/vi/developers/tutorials/eip-1271-smart-contract-signatures/index.md b/public/content/translations/vi/developers/tutorials/eip-1271-smart-contract-signatures/index.md
new file mode 100644
index 00000000000..8016a8cc8ed
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/eip-1271-smart-contract-signatures/index.md
@@ -0,0 +1,123 @@
+---
+title: "EIP-1271: Ký và xác minh Chữ ký Hợp đồng thông minh"
+description: Tổng quan về việc tạo và xác minh chữ ký hợp đồng thông minh với EIP-1271. Chúng tôi cũng xem xét việc triển khai EIP-1271 được sử dụng trong Safe (trước đây là Gnosis Safe) để cung cấp một ví dụ cụ thể cho các nhà phát triển hợp đồng thông minh xây dựng dựa trên đó.
+author: Nathan H. Leung
+lang: vi
+tags: [ "eip-1271", "hợp đồng thông minh", "xác minh", "ký" ]
+skill: intermediate
+published: 2023-01-12
+---
+
+Tiêu chuẩn [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) cho phép các hợp đồng thông minh xác minh chữ ký.
+
+Trong bài hướng dẫn này, chúng tôi cung cấp một cái nhìn tổng quan về chữ ký số, nền tảng của EIP-1271, và cách triển khai cụ thể của EIP-1271 được sử dụng bởi [Safe](https://safe.global/) (trước đây là Gnosis Safe). Tất cả những điều này có thể đóng vai trò là điểm khởi đầu để bạn triển khai EIP-1271 trong các hợp đồng của riêng mình.
+
+## Chữ ký là gì?
+
+Trong bối cảnh này, một chữ ký (chính xác hơn là “chữ ký số”) là một thông điệp cộng với một loại bằng chứng nào đó cho thấy thông điệp đến từ một người/người gửi/địa chỉ cụ thể.
+
+Ví dụ, một chữ ký số có thể trông như thế này:
+
+1. Thông điệp: “Tôi muốn đăng nhập vào trang web này bằng ví Ethereum của tôi.”
+2. Người ký: Địa chỉ của tôi là `0x000…`
+3. Bằng chứng: Đây là một số bằng chứng cho thấy tôi, `0x000…`, đã thực sự tạo ra toàn bộ thông điệp này (đây thường là một cái gì đó thuộc về mật mã).
+
+Điều quan trọng cần lưu ý là một chữ ký số bao gồm cả “thông điệp” và “chữ ký”.
+
+Tại sao? Ví dụ: nếu bạn đưa cho tôi một hợp đồng để ký, và sau đó tôi cắt trang chữ ký và chỉ đưa lại cho bạn chữ ký của tôi mà không có phần còn lại của hợp đồng, thì hợp đồng đó sẽ không hợp lệ.
+
+Tương tự như vậy, một chữ ký số sẽ không có ý nghĩa gì nếu không có thông điệp đi kèm!
+
+## Tại sao EIP-1271 lại tồn tại?
+
+Để tạo chữ ký số để sử dụng trên các blockchain dựa trên Ethereum, bạn thường cần một khóa riêng tư bí mật mà không ai khác biết. Đây là điều làm cho chữ ký của bạn là của bạn (không ai khác có thể tạo ra chữ ký tương tự nếu không biết khóa bí mật).
+
+Tài khoản Ethereum của bạn (tức là tài khoản sở hữu bên ngoài/EOA của bạn) có một khóa riêng tư được liên kết với nó và đây là khóa riêng tư thường được sử dụng khi một trang web hoặc ứng dụng phi tập trung yêu cầu bạn cung cấp chữ ký (ví dụ: để “Đăng nhập bằng Ethereum”).
+
+Một ứng dụng có thể [xác minh chữ ký](https://www.alchemy.com/docs/how-to-verify-a-message-signature-on-ethereum) mà bạn tạo bằng thư viện của bên thứ ba như ethers.js [mà không cần biết khóa riêng tư của bạn](https://en.wikipedia.org/wiki/Public-key_cryptography) và tin chắc rằng _chính bạn_ là người đã tạo ra chữ ký đó.
+
+> Trên thực tế, vì chữ ký số của EOA sử dụng mật mã khóa công khai nên chúng có thể được tạo và xác minh **ngoài chuỗi**! Đây là cách hoạt động của việc bỏ phiếu DAO không tốn gas — thay vì gửi phiếu bầu trên chuỗi, chữ ký số có thể được tạo và xác minh ngoài chuỗi bằng các thư viện mật mã.
+
+Mặc dù các tài khoản EOA có khóa riêng tư, các tài khoản hợp đồng thông minh không có bất kỳ loại khóa riêng tư hoặc khóa bí mật nào (vì vậy "Đăng nhập bằng Ethereum", v.v. không thể hoạt động nguyên bản với các tài khoản hợp đồng thông minh).
+
+Vấn đề mà EIP-1271 nhằm giải quyết là: làm cách nào chúng ta có thể biết được chữ ký của hợp đồng thông minh là hợp lệ nếu hợp đồng thông minh không có “bí mật” nào để có thể đưa vào chữ ký?
+
+## EIP-1271 hoạt động như thế nào?
+
+Các hợp đồng thông minh không có khóa riêng tư có thể được sử dụng để ký các thông điệp. Vậy làm thế nào chúng ta có thể biết được một chữ ký có xác thực hay không?
+
+Chà, một ý tưởng là chúng ta có thể chỉ cần _hỏi_ hợp đồng thông minh xem một chữ ký có xác thực hay không!
+
+Điều EIP-1271 làm là nó chuẩn hóa ý tưởng “hỏi” một hợp đồng thông minh xem một chữ ký đã cho có hợp lệ hay không.
+
+Một hợp đồng triển khai EIP-1271 phải có một hàm có tên là `isValidSignature` nhận vào một thông điệp và một chữ ký. Sau đó, hợp đồng có thể chạy một số logic xác thực (thông số kỹ thuật không thực thi bất kỳ điều gì cụ thể ở đây) và sau đó trả về một giá trị cho biết chữ ký có hợp lệ hay không.
+
+Nếu `isValidSignature` trả về một kết quả hợp lệ, điều đó gần như có nghĩa là hợp đồng đang nói “vâng, tôi chấp thuận chữ ký + thông điệp này!”
+
+### Giao diện
+
+Đây là giao diện chính xác trong đặc tả EIP-1271 (chúng ta sẽ nói về tham số `_hash` bên dưới, nhưng hiện tại, hãy coi nó là thông điệp đang được xác minh):
+
+```jsx
+pragma solidity ^0.5.0;
+
+contract ERC1271 {
+
+ // bytes4(keccak256("isValidSignature(bytes32,bytes)")
+ bytes4 constant internal MAGICVALUE = 0x1626ba7e;
+
+ /**
+ * @dev Nên trả về liệu chữ ký được cung cấp có hợp lệ cho giá trị băm được cung cấp hay không
+ * @param _hash Giá trị băm của dữ liệu được ký
+ * @param _signature Mảng byte chữ ký được liên kết với _hash
+ *
+ * PHẢI trả về giá trị magic bytes4 0x1626ba7e khi hàm vượt qua.
+ * KHÔNG ĐƯỢC sửa đổi trạng thái (sử dụng STATICCALL cho solc < 0.5, công cụ sửa đổi view cho solc > 0.5)
+ * PHẢI cho phép các lệnh gọi bên ngoài
+ */
+ function isValidSignature(
+ bytes32 _hash,
+ bytes memory _signature)
+ public
+ view
+ returns (bytes4 magicValue);
+}
+```
+
+## Ví dụ triển khai EIP-1271: Safe
+
+Các hợp đồng có thể triển khai `isValidSignature` theo nhiều cách — đặc tả không nói nhiều về cách triển khai chính xác.
+
+Một hợp đồng đáng chú ý triển khai EIP-1271 là Safe (trước đây là Gnosis Safe).
+
+Trong mã của Safe, `isValidSignature` [được triển khai](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol) để chữ ký có thể được tạo và xác minh theo [hai cách](https://ethereum.stackexchange.com/questions/122635/signing-messages-as-a-gnosis-safe-eip1271-support):
+
+1. Thông điệp trên chuỗi
+ 1. Tạo: một chủ sở hữu Safe tạo một giao dịch Safe mới để “ký” một thông điệp, chuyển thông điệp dưới dạng dữ liệu vào giao dịch. Khi có đủ chủ sở hữu ký vào giao dịch để đạt đến ngưỡng đa chữ ký (multisig), giao dịch sẽ được phát và chạy. Trong giao dịch, có một hàm Safe được gọi là (`signMessage(bytes calldata _data)`) để thêm thông điệp vào danh sách các thông điệp “được chấp thuận”.
+ 2. Xác minh: gọi `isValidSignature` trên hợp đồng Safe, và chuyển thông điệp cần xác minh làm tham số thông điệp và [một giá trị trống cho tham số chữ ký](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol#L32) (tức là `0x`). Safe sẽ thấy rằng tham số chữ ký trống và thay vì xác minh chữ ký bằng mật mã, nó sẽ biết để tiếp tục và kiểm tra xem thông điệp có nằm trong danh sách các thông điệp “được chấp thuận” hay không.
+2. Thông điệp ngoài chuỗi:
+ 1. Tạo: một chủ sở hữu Safe tạo một thông điệp ngoài chuỗi, sau đó yêu cầu các chủ sở hữu Safe khác ký riêng lẻ vào thông điệp cho đến khi có đủ chữ ký để vượt qua ngưỡng phê duyệt đa chữ ký (multisig).
+ 2. Xác minh: gọi `isValidSignature`. Trong tham số thông điệp, hãy chuyển vào thông điệp cần được xác minh. Trong tham số chữ ký, hãy chuyển vào chữ ký riêng lẻ của mỗi chủ sở hữu Safe được nối lại với nhau, liên tiếp. Safe sẽ kiểm tra xem có đủ chữ ký để đáp ứng ngưỡng **và** mỗi chữ ký đều hợp lệ. Nếu vậy, nó sẽ trả về một giá trị cho biết xác minh chữ ký thành công.
+
+## Tham số `_hash` chính xác là gì? Tại sao không chuyển toàn bộ thông điệp?
+
+Bạn có thể đã nhận thấy rằng hàm `isValidSignature` trong [giao diện EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) không nhận vào chính thông điệp đó, mà thay vào đó là một tham số `_hash`. Điều này có nghĩa là thay vì chuyển toàn bộ thông điệp có độ dài tùy ý cho `isValidSignature`, chúng ta thay vào đó chuyển một giá trị băm 32 byte của thông điệp (thường là keccak256).
+
+Mỗi byte calldata — tức là, dữ liệu tham số hàm được chuyển đến một hàm hợp đồng thông minh — [tốn 16 gas (4 gas nếu là byte không)](https://eips.ethereum.org/EIPS/eip-2028), vì vậy điều này có thể tiết kiệm rất nhiều gas nếu một thông điệp dài.
+
+### Các Đặc tả EIP-1271 trước đây
+
+Có những đặc tả EIP-1271 ngoài thực tế có hàm `isValidSignature` với tham số đầu tiên thuộc loại `bytes` (độ dài tùy ý, thay vì `bytes32` có độ dài cố định) và tên tham số `message`. Đây là một [phiên bản cũ hơn](https://github.com/safe-global/safe-contracts/issues/391#issuecomment-1075427206) của tiêu chuẩn EIP-1271.
+
+## EIP-1271 nên được triển khai trong các hợp đồng của riêng tôi như thế nào?
+
+Đặc tả ở đây rất mở. Việc triển khai Safe có một số ý tưởng hay:
+
+- Bạn có thể coi chữ ký EOA từ "chủ sở hữu" của hợp đồng là hợp lệ.
+- Bạn có thể lưu trữ một danh sách các thông điệp được chấp thuận và chỉ coi những thông điệp đó là hợp lệ.
+
+Cuối cùng, điều đó tùy thuộc vào bạn với tư cách là nhà phát triển hợp đồng!
+
+## Kết luận
+
+[EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) là một tiêu chuẩn linh hoạt cho phép các hợp đồng thông minh xác minh chữ ký. Nó mở ra cánh cửa cho các hợp đồng thông minh hoạt động giống EOA hơn — ví dụ như cung cấp một cách để "Đăng nhập bằng Ethereum" hoạt động với các hợp đồng thông minh — và nó có thể được triển khai theo nhiều cách (Safe có một cách triển khai không hề đơn giản và thú vị đáng để cân nhắc).
diff --git a/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
new file mode 100644
index 00000000000..d1399ce048f
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
@@ -0,0 +1,715 @@
+---
+title: "Hướng dẫn hợp đồng Vyper ERC-721"
+description: Hợp đồng ERC-721 của Ryuya Nakamura và cách hoạt động
+author: Ori Pomerantz
+lang: vi
+tags: [ "vyper", "erc-721", "python" ]
+skill: beginner
+published: 2021-04-01
+---
+
+## Giới thiệu {#introduction}
+
+Tiêu chuẩn [ERC-721](/developers/docs/standards/tokens/erc-721/) được dùng để nắm giữ quyền sở hữu các Token không thể thay thế (NFT).
+Các token [ERC-20](/developers/docs/standards/tokens/erc-20/) hoạt động như một loại hàng hóa vì không có sự khác biệt giữa các token riêng lẻ.
+Ngược lại, các token ERC-721 được thiết kế cho các tài sản tương tự nhau nhưng không giống hệt nhau, chẳng hạn như các phim hoạt hình
+mèo khác nhau
+hoặc các quyền sở hữu đối với các bất động sản khác nhau.
+
+Trong bài viết này, chúng ta sẽ phân tích [hợp đồng ERC-721 của Ryuya Nakamura](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy).
+Hợp đồng này được viết bằng [Vyper](https://vyper.readthedocs.io/en/latest/index.html), một ngôn ngữ hợp đồng giống như Python được thiết kế để gây khó khăn hơn trong việc
+viết mã không an toàn so với Solidity.
+
+## Hợp đồng {#contract}
+
+```python
+# @dev Triển khai tiêu chuẩn token không thể thay thế ERC-721.
+# @author Ryuya Nakamura (@nrryuya)
+# Được sửa đổi từ: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy
+```
+
+Các bình luận trong Vyper, cũng như trong Python, bắt đầu bằng một hàm băm (`#`) và tiếp tục cho đến cuối dòng. Các bình luận bao gồm
+`@` được [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) sử dụng để tạo ra tài liệu tham khảo
+có thể đọc được.
+
+```python
+from vyper.interfaces import ERC721
+
+implements: ERC721
+```
+
+Giao diện ERC-721 được tích hợp vào ngôn ngữ Vyper.
+[Bạn có thể xem định nghĩa mã tại đây](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py).
+Định nghĩa giao diện được viết bằng Python chứ không phải Vyper, vì giao diện không chỉ được sử dụng trong
+chuỗi khối, mà còn khi gửi giao dịch đến chuỗi khối từ một ứng dụng bên ngoài, có thể được viết bằng
+Python.
+
+Dòng đầu tiên nhập giao diện và dòng thứ hai chỉ định rằng chúng tôi đang triển khai nó ở đây.
+
+### Giao diện ERC721Receiver {#receiver-interface}
+
+```python
+# Giao diện cho hợp đồng được gọi bởi safeTransferFrom()
+interface ERC721Receiver:
+ def onERC721Received(
+```
+
+ERC-721 hỗ trợ hai loại chuyển:
+
+- `transferFrom`, cho phép người gửi chỉ định bất kỳ địa chỉ đích nào và đặt trách nhiệm
+ chuyển cho người gửi. Điều này có nghĩa là bạn có thể chuyển đến một địa chỉ không hợp lệ, trong trường hợp đó
+ NFT sẽ bị mất vĩnh viễn.
+- `safeTransferFrom`, kiểm tra xem địa chỉ đích có phải là hợp đồng hay không. Nếu vậy, hợp đồng ERC-721
+ sẽ hỏi hợp đồng nhận xem có muốn nhận NFT hay không.
+
+Để trả lời yêu cầu của `safeTransferFrom`, hợp đồng nhận phải triển khai `ERC721Receiver`.
+
+```python
+ _operator: địa chỉ,
+ _from: địa chỉ,
+```
+
+Địa chỉ `_from` là chủ sở hữu hiện tại của token. Địa chỉ `_operator` là địa chỉ đã
+yêu cầu chuyển (hai địa chỉ này có thể không giống nhau, do các khoản phụ cấp).
+
+```python
+ _tokenId: uint256,
+```
+
+ID token ERC-721 là 256 bit. Thông thường chúng được tạo ra bằng cách băm mô tả của bất cứ thứ gì mà
+token đại diện.
+
+```python
+ _data: Byte[1024]
+```
+
+Yêu cầu có thể có tối đa 1024 byte dữ liệu người dùng.
+
+```python
+ ) -> bytes32: view
+```
+
+Để ngăn chặn các trường hợp hợp đồng vô tình chấp nhận chuyển, giá trị trả về không phải là một giá trị boolean,
+mà là 256 bit với một giá trị cụ thể.
+
+Hàm này là một `chế độ xem`, có nghĩa là nó có thể đọc trạng thái của chuỗi khối, nhưng không sửa đổi nó.
+
+### Sự kiện {#events}
+
+[Các sự kiện](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e)
+được phát ra để thông báo cho người dùng và các máy chủ bên ngoài chuỗi khối về các sự kiện. Lưu ý rằng nội dung của các sự kiện
+không có sẵn cho các hợp đồng trên chuỗi khối.
+
+```python
+# @dev Phát ra khi quyền sở hữu của bất kỳ NFT nào thay đổi theo bất kỳ cơ chế nào. Sự kiện này phát ra khi các NFT được
+# tạo (`from` == 0) và bị hủy (`to` == 0). Ngoại lệ: trong quá trình tạo hợp đồng, bất kỳ
+# số lượng NFT nào cũng có thể được tạo và gán mà không phát ra Transfer. Tại thời điểm bất kỳ
+# lần chuyển nào, địa chỉ được phê duyệt cho NFT đó (nếu có) được đặt lại thành không.
+# @param _from Người gửi NFT (nếu địa chỉ là địa chỉ không thì cho biết tạo token).
+# @param _to Người nhận NFT (nếu địa chỉ là địa chỉ không thì cho biết hủy token).
+# @param _tokenId NFT đã được chuyển.
+event Transfer:
+ sender: indexed(address)
+ receiver: indexed(address)
+ tokenId: indexed(uint256)
+```
+
+Điều này tương tự như sự kiện Chuyển ERC-20, ngoại trừ việc chúng tôi báo cáo `tokenId` thay vì số lượng.
+Không ai sở hữu địa chỉ không, vì vậy theo quy ước, chúng tôi sử dụng nó để báo cáo việc tạo và hủy token.
+
+```python
+# @dev Điều này phát ra khi địa chỉ được phê duyệt cho một NFT được thay đổi hoặc xác nhận lại. Địa chỉ
+# không cho biết không có địa chỉ được phê duyệt nào. Khi một sự kiện Transfer phát ra, điều này cũng
+# cho biết rằng địa chỉ được phê duyệt cho NFT đó (nếu có) được đặt lại thành không.
+# @param _owner Chủ sở hữu của NFT.
+# @param _approved Địa chỉ mà chúng tôi đang phê duyệt.
+# @param _tokenId NFT mà chúng tôi đang phê duyệt.
+event Approval:
+ owner: indexed(address)
+ approved: indexed(address)
+ tokenId: indexed(uint256)
+```
+
+Sự chấp thuận ERC-721 tương tự như một khoản phụ cấp ERC-20. Một địa chỉ cụ thể được phép chuyển một token
+cụ thể. Điều này cung cấp một cơ chế để các hợp đồng phản hồi khi chúng chấp nhận một token. Các hợp đồng không thể
+lắng nghe các sự kiện, vì vậy nếu bạn chỉ chuyển token cho chúng, chúng sẽ không "biết" về nó. Bằng cách này, chủ sở hữu
+trước tiên gửi một sự chấp thuận và sau đó gửi một yêu cầu đến hợp đồng: "Tôi đã chấp thuận cho bạn chuyển token
+X, xin hãy làm ...".
+
+Đây là một lựa chọn thiết kế để làm cho tiêu chuẩn ERC-721 tương tự như tiêu chuẩn ERC-20. Vì các token
+ERC-721 không thể thay thế được, một hợp đồng cũng có thể xác định rằng nó đã nhận được một token cụ thể bằng cách
+nhìn vào quyền sở hữu của token.
+
+```python
+# @dev Điều này phát ra khi một người vận hành được kích hoạt hoặc vô hiệu hóa cho một chủ sở hữu. Người vận hành có thể quản lý
+# tất cả các NFT của chủ sở hữu.
+# @param _owner Chủ sở hữu của NFT.
+# @param _operator Địa chỉ mà chúng tôi đang đặt quyền của người vận hành.
+# @param _approved Trạng thái quyền của người vận hành (true nếu quyền của người vận hành được cấp và false nếu
+# bị thu hồi).
+event ApprovalForAll:
+ owner: indexed(address)
+ operator: indexed(address)
+ approved: bool
+```
+
+Đôi khi, việc có một _người vận hành_ có thể quản lý tất cả các token của một tài khoản thuộc một loại cụ thể (những token được quản lý bởi
+một hợp đồng cụ thể) là hữu ích, tương tự như giấy ủy quyền. Ví dụ: tôi có thể muốn trao quyền đó cho một hợp đồng kiểm tra xem
+tôi đã không liên lạc với nó trong sáu tháng, và nếu vậy sẽ phân phối tài sản của tôi cho những người thừa kế của tôi (nếu một trong số họ yêu cầu, các hợp đồng
+không thể làm bất cứ điều gì mà không được gọi bởi một giao dịch). Trong ERC-20, chúng tôi chỉ có thể cung cấp một khoản phụ cấp cao cho một hợp đồng thừa kế,
+nhưng điều đó không hoạt động với ERC-721 vì các token không thể thay thế được. Đây là điều tương đương.
+
+Giá trị `approved` cho chúng ta biết liệu sự kiện đó là để chấp thuận hay rút lại sự chấp thuận.
+
+### Biến trạng thái {#state-vars}
+
+Các biến này chứa trạng thái hiện tại của các token: token nào có sẵn và ai sở hữu chúng. Hầu hết trong số này
+là các đối tượng `HashMap`, [các ánh xạ một chiều tồn tại giữa hai loại](https://vyper.readthedocs.io/en/latest/types.html#mappings).
+
+```python
+# @dev Ánh xạ từ ID NFT đến địa chỉ sở hữu nó.
+idToOwner: HashMap[uint256, address]
+
+# @dev Ánh xạ từ ID NFT đến địa chỉ được phê duyệt.
+idToApprovals: HashMap[uint256, address]
+```
+
+Danh tính người dùng và hợp đồng trong Ethereum được biểu thị bằng các địa chỉ 160-bit. Hai biến này ánh xạ
+từ ID token đến chủ sở hữu của chúng và những người được chấp thuận chuyển chúng (tối đa một người cho mỗi token). Trong Ethereum,
+dữ liệu chưa được khởi tạo luôn bằng không, vì vậy nếu không có chủ sở hữu hoặc người chuyển được chấp thuận, giá trị của token đó
+là không.
+
+```python
+# @dev Ánh xạ từ địa chỉ chủ sở hữu đến số lượng token của anh ấy.
+ownerToNFTokenCount: HashMap[address, uint256]
+```
+
+Biến này chứa số lượng token cho mỗi chủ sở hữu. Không có ánh xạ từ chủ sở hữu đến token, vì vậy
+cách duy nhất để xác định các token mà một chủ sở hữu cụ thể sở hữu là xem lại lịch sử sự kiện của chuỗi khối
+và xem các sự kiện `Chuyển` thích hợp. Chúng ta có thể sử dụng biến này để biết khi nào chúng ta có tất cả các NFT và không
+cần phải tìm kiếm xa hơn nữa trong quá khứ.
+
+Lưu ý rằng thuật toán này chỉ hoạt động đối với giao diện người dùng và các máy chủ bên ngoài. Mã chạy trên chính
+chuỗi khối không thể đọc các sự kiện trong quá khứ.
+
+```python
+# @dev Ánh xạ từ địa chỉ chủ sở hữu đến ánh xạ các địa chỉ của người vận hành.
+ownerToOperators: HashMap[address, HashMap[address, bool]]
+```
+
+Một tài khoản có thể có nhiều hơn một người vận hành. Một `HashMap` đơn giản là không đủ để
+theo dõi chúng, bởi vì mỗi khóa dẫn đến một giá trị duy nhất. Thay vào đó, bạn có thể sử dụng
+`HashMap[địa chỉ, bool]` làm giá trị. Theo mặc định, giá trị cho mỗi địa chỉ là `False`, có nghĩa là nó
+không phải là một người vận hành. Bạn có thể đặt các giá trị thành `True` khi cần.
+
+```python
+# @dev Địa chỉ của người đúc, người có thể đúc một token
+minter: address
+```
+
+Các token mới phải được tạo ra bằng một cách nào đó. Trong hợp đồng này, có một thực thể duy nhất được phép làm như vậy, đó là
+`người đúc`. Ví dụ, điều này có thể là đủ cho một trò chơi. Đối với các mục đích khác, có thể cần phải
+tạo ra một logic kinh doanh phức tạp hơn.
+
+```python
+# @dev Ánh xạ của id giao diện đến bool về việc nó có được hỗ trợ hay không
+supportedInterfaces: HashMap[bytes32, bool]
+
+# @dev ID giao diện ERC165 của ERC165
+ERC165_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000001ffc9a7
+
+# @dev ID giao diện ERC165 của ERC721
+ERC721_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000080ac58cd
+```
+
+[ERC-165](https://eips.ethereum.org/EIPS/eip-165) chỉ định một cơ chế để một hợp đồng tiết lộ cách các ứng dụng
+có thể giao tiếp với nó, nó tuân thủ những ERC nào. Trong trường hợp này, hợp đồng tuân thủ ERC-165 và ERC-721.
+
+### Các hàm {#functions}
+
+Đây là các hàm thực sự triển khai ERC-721.
+
+#### Hàm khởi tạo {#constructor}
+
+```python
+@external
+def __init__():
+```
+
+Trong Vyper, cũng như trong Python, hàm khởi tạo được gọi là `__init__`.
+
+```python
+ """
+ @dev Hàm khởi tạo hợp đồng.
+ """
+```
+
+Trong Python và trong Vyper, bạn cũng có thể tạo một bình luận bằng cách chỉ định một chuỗi nhiều dòng (bắt đầu và kết thúc
+với `"""`), và không sử dụng nó theo bất kỳ cách nào. Những bình luận này cũng có thể bao gồm
+[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
+```
+
+Để truy cập các biến trạng thái, bạn sử dụng \`self.\`\` (một lần nữa, giống như trong Python).
+
+#### Xem Hàm {#views}
+
+Đây là các hàm không sửa đổi trạng thái của chuỗi khối, và do đó có thể được thực thi
+miễn phí nếu chúng được gọi từ bên ngoài. Nếu các hàm xem được gọi bởi một hợp đồng, chúng vẫn phải được thực thi trên
+mọi nút và do đó tốn gas.
+
+```python
+@view
+@external
+```
+
+Những từ khóa này trước một định nghĩa hàm bắt đầu bằng dấu a còng (`@`) được gọi là _decorations_. Chúng
+chỉ định các trường hợp trong đó một hàm có thể được gọi.
+
+- `@view` chỉ định rằng hàm này là một chế độ xem.
+- `@external` chỉ định rằng hàm cụ thể này có thể được gọi bởi các giao dịch và bởi các hợp đồng khác.
+
+```python
+def supportsInterface(_interfaceID: bytes32) -> bool:
+```
+
+Trái ngược với Python, Vyper là một [ngôn ngữ được gõ tĩnh](https://wikipedia.org/wiki/Type_system#Static_type_checking).
+Bạn không thể khai báo một biến, hoặc một tham số hàm, mà không xác định [kiểu dữ liệu](https://vyper.readthedocs.io/en/latest/types.html). Trong trường hợp này, tham số đầu vào là `bytes32`, một giá trị 256-bit
+(256 bit là kích thước từ gốc của [Máy ảo Ethereum](/developers/docs/evm/)). Đầu ra là một giá trị
+boolean. Theo quy ước, tên của các tham số hàm bắt đầu bằng dấu gạch dưới (`_`).
+
+```python
+ """
+ @dev Việc xác định giao diện được chỉ định trong ERC-165.
+ @param _interfaceID Id của giao diện
+ """
+ return self.supportedInterfaces[_interfaceID]
+```
+
+Trả về giá trị từ HashMap `self.supportedInterfaces`, được đặt trong hàm khởi tạo (`__init__`).
+
+```python
+### XEM HÀM ###
+```
+
+Đây là các hàm xem giúp cung cấp thông tin về các token cho người dùng và các hợp đồng khác.
+
+```python
+@view
+@external
+def balanceOf(_owner: address) -> uint256:
+ """
+ @dev Trả về số lượng NFT thuộc sở hữu của `_owner`.
+ Thông báo lỗi nếu `_owner` là địa chỉ không. Các NFT được gán cho địa chỉ không được coi là không hợp lệ.
+ @param _owner Địa chỉ để truy vấn số dư.
+ """
+ assert _owner != ZERO_ADDRESS
+```
+
+Dòng này [khẳng định](https://vyper.readthedocs.io/en/latest/statements.html#assert) rằng `_owner` không phải là
+không. Nếu đúng như vậy, sẽ có lỗi và hoạt động sẽ bị hoàn nguyên.
+
+```python
+ return self.ownerToNFTokenCount[_owner]
+
+@view
+@external
+def ownerOf(_tokenId: uint256) -> address:
+ """
+ @dev Trả về địa chỉ của chủ sở hữu NFT.
+ Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ.
+ @param _tokenId Mã định danh cho một NFT.
+ """
+ owner: address = self.idToOwner[_tokenId]
+ # Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ
+ assert owner != ZERO_ADDRESS
+ return owner
+```
+
+Trong Máy ảo Ethereum (EVM) bất kỳ bộ nhớ nào không có giá trị được lưu trữ trong đó đều bằng không.
+Nếu không có token nào ở `_tokenId` thì giá trị của `self.idToOwner[_tokenId]` bằng không. Trong trường hợp đó
+hàm sẽ hoàn nguyên.
+
+```python
+@view
+@external
+def getApproved(_tokenId: uint256) -> address:
+ """
+ @dev Nhận địa chỉ được phê duyệt cho một NFT duy nhất.
+ Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ.
+ @param _tokenId ID của NFT để truy vấn sự phê duyệt.
+ """
+ # Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ
+ assert self.idToOwner[_tokenId] != ZERO_ADDRESS
+ return self.idToApprovals[_tokenId]
+```
+
+Lưu ý rằng `getApproved` _có thể_ trả về không. Nếu token hợp lệ, nó sẽ trả về `self.idToApprovals[_tokenId]`.
+Nếu không có người phê duyệt, giá trị đó là không.
+
+```python
+@view
+@external
+def isApprovedForAll(_owner: address, _operator: address) -> bool:
+ """
+ @dev Kiểm tra xem `_operator` có phải là người vận hành được phê duyệt cho `_owner` không.
+ @param _owner Địa chỉ sở hữu các NFT.
+ @param _operator Địa chỉ hoạt động thay mặt cho chủ sở hữu.
+ """
+ return (self.ownerToOperators[_owner])[_operator]
+```
+
+Hàm này kiểm tra xem `_operator` có được phép quản lý tất cả các token của `_owner` trong hợp đồng này hay không.
+Bởi vì có thể có nhiều người vận hành, đây là một HashMap hai cấp.
+
+#### Chuyển các Hàm Trợ giúp {#transfer-helpers}
+
+Các hàm này thực hiện các hoạt động là một phần của việc chuyển hoặc quản lý token.
+
+```python
+
+### TRỢ GIÚP HÀM CHUYỂN ###
+
+@view
+@internal
+```
+
+Trang trí này, `@internal`, có nghĩa là hàm chỉ có thể được truy cập từ các hàm khác trong cùng một
+hợp đồng. Theo quy ước, tên các hàm này cũng bắt đầu bằng dấu gạch dưới (`_`).
+
+```python
+def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool:
+ """
+ @dev Trả về liệu người chi tiêu đã cho có thể chuyển một id token đã cho hay không
+ @param spender địa chỉ của người chi tiêu để truy vấn
+ @param tokenId uint256 ID của token sẽ được chuyển
+ @return bool liệu msg.sender có được chấp thuận cho id token đã cho hay không,
+ là một người vận hành của chủ sở hữu, hoặc là chủ sở hữu của 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
+```
+
+Có ba cách để một địa chỉ có thể được phép chuyển một token:
+
+1. Địa chỉ là chủ sở hữu của token
+2. Địa chỉ được chấp thuận để chi tiêu token đó
+3. Địa chỉ là người vận hành cho chủ sở hữu token
+
+Hàm trên có thể là một chế độ xem vì nó không thay đổi trạng thái. Để giảm chi phí vận hành, bất kỳ
+hàm nào _có thể_ là một chế độ xem _nên_ là một chế độ xem.
+
+```python
+@internal
+def _addTokenTo(_to: address, _tokenId: uint256):
+ """
+ @dev Thêm một NFT vào một địa chỉ đã cho
+ Thông báo lỗi nếu `_tokenId` được sở hữu bởi ai đó.
+ """
+ # Thông báo lỗi nếu `_tokenId` được sở hữu bởi ai đó
+ assert self.idToOwner[_tokenId] == ZERO_ADDRESS
+ # Thay đổi chủ sở hữu
+ self.idToOwner[_tokenId] = _to
+ # Thay đổi theo dõi số lượng
+ self.ownerToNFTokenCount[_to] += 1
+
+
+@internal
+def _removeTokenFrom(_from: address, _tokenId: uint256):
+ """
+ @dev Xóa một NFT khỏi một địa chỉ đã cho
+ Thông báo lỗi nếu `_from` không phải là chủ sở hữu hiện tại.
+ """
+ # Thông báo lỗi nếu `_from` không phải là chủ sở hữu hiện tại
+ assert self.idToOwner[_tokenId] == _from
+ # Thay đổi chủ sở hữu
+ self.idToOwner[_tokenId] = ZERO_ADDRESS
+ # Thay đổi theo dõi số lượng
+ self.ownerToNFTokenCount[_from] -= 1
+```
+
+Khi có vấn đề với việc chuyển, chúng tôi sẽ hoàn nguyên cuộc gọi.
+
+```python
+@internal
+def _clearApproval(_owner: address, _tokenId: uint256):
+ """
+ @dev Xóa sự phê duyệt của một địa chỉ đã cho
+ Thông báo lỗi nếu `_owner` không phải là chủ sở hữu hiện tại.
+ """
+ # Thông báo lỗi nếu `_owner` không phải là chủ sở hữu hiện tại
+ assert self.idToOwner[_tokenId] == _owner
+ if self.idToApprovals[_tokenId] != ZERO_ADDRESS:
+ # Đặt lại các phê duyệt
+ self.idToApprovals[_tokenId] = ZERO_ADDRESS
+```
+
+Chỉ thay đổi giá trị nếu cần thiết. Các biến trạng thái nằm trong bộ nhớ. Việc ghi vào bộ nhớ là
+một trong những hoạt động tốn kém nhất mà EVM (Máy ảo Ethereum) thực hiện (về mặt
+[gas](/developers/docs/gas/)). Do đó, đó là một ý tưởng tốt để giảm thiểu nó, ngay cả việc viết giá trị
+hiện có cũng có chi phí cao.
+
+```python
+@internal
+def _transferFrom(_from: address, _to: address, _tokenId: uint256, _sender: address):
+ """
+ @dev Thực hiện chuyển một NFT.
+ Thông báo lỗi trừ khi `msg.sender` là chủ sở hữu hiện tại, một người vận hành được ủy quyền, hoặc địa chỉ được phê duyệt
+ cho NFT này. (LƯU Ý: `msg.sender` không được phép trong hàm riêng tư nên truyền `_sender`.)
+ Thông báo lỗi nếu `_to` là địa chỉ không.
+ Thông báo lỗi nếu `_from` không phải là chủ sở hữu hiện tại.
+ Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ.
+ """
+```
+
+Chúng tôi có hàm nội bộ này vì có hai cách để chuyển token (thông thường và an toàn), nhưng
+chúng tôi chỉ muốn có một vị trí duy nhất trong mã nơi chúng tôi thực hiện nó để việc kiểm tra dễ dàng hơn.
+
+```python
+ # Kiểm tra các yêu cầu
+ assert self._isApprovedOrOwner(_sender, _tokenId)
+ # Thông báo lỗi nếu `_to` là địa chỉ không
+ assert _to != ZERO_ADDRESS
+ # Xóa phê duyệt. Thông báo lỗi nếu `_from` không phải là chủ sở hữu hiện tại
+ self._clearApproval(_from, _tokenId)
+ # Xóa NFT. Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ
+ self._removeTokenFrom(_from, _tokenId)
+ # Thêm NFT
+ self._addTokenTo(_to, _tokenId)
+ # Ghi lại việc chuyển
+ log Transfer(_from, _to, _tokenId)
+```
+
+Để phát ra một sự kiện trong Vyper, bạn sử dụng một câu lệnh `log` ([xem ở đây để biết thêm chi tiết](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging)).
+
+#### Hàm Chuyển {#transfer-funs}
+
+```python
+
+### HÀM CHUYỂN ###
+
+@external
+def transferFrom(_from: address, _to: address, _tokenId: uint256):
+ """
+ @dev Thông báo lỗi trừ khi `msg.sender` là chủ sở hữu hiện tại, một người vận hành được ủy quyền, hoặc địa chỉ được phê duyệt
+ cho NFT này.
+ Thông báo lỗi nếu `_from` không phải là chủ sở hữu hiện tại.
+ Thông báo lỗi nếu `_to` là địa chỉ không.
+ Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ.
+ @notice Người gọi chịu trách nhiệm xác nhận rằng `_to` có khả năng nhận NFT hoặc nếu không
+ chúng có thể bị mất vĩnh viễn.
+ @param _from Chủ sở hữu hiện tại của NFT.
+ @param _to Chủ sở hữu mới.
+ @param _tokenId NFT sẽ chuyển.
+ """
+ self._transferFrom(_from, _to, _tokenId, msg.sender)
+```
+
+Hàm này cho phép bạn chuyển đến một địa chỉ tùy ý. Trừ khi địa chỉ là người dùng, hoặc một hợp đồng
+biết cách chuyển token, bất kỳ token nào bạn chuyển sẽ bị kẹt trong địa chỉ đó và vô dụng.
+
+```python
+@external
+def safeTransferFrom(
+ _from: address,
+ _to: address,
+ _tokenId: uint256,
+ _data: Bytes[1024]=b""
+ ):
+ """
+ @dev Chuyển quyền sở hữu của một NFT từ một địa chỉ sang địa chỉ khác.
+ Thông báo lỗi trừ khi `msg.sender` là chủ sở hữu hiện tại, một người vận hành được ủy quyền, hoặc
+ địa chỉ được phê duyệt cho NFT này.
+ Thông báo lỗi nếu `_from` không phải là chủ sở hữu hiện tại.
+ Thông báo lỗi nếu `_to` là địa chỉ không.
+ Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ.
+ Nếu `_to` là một hợp đồng thông minh, nó sẽ gọi `onERC721Received` trên `_to` và thông báo lỗi nếu
+ giá trị trả về không phải là `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
+ LƯU Ý: bytes4 được biểu thị bằng bytes32 với phần đệm
+ @param _from Chủ sở hữu hiện tại của NFT.
+ @param _to Chủ sở hữu mới.
+ @param _tokenId NFT sẽ chuyển.
+ @param _data Dữ liệu bổ sung không có định dạng được chỉ định, được gửi trong cuộc gọi đến `_to`.
+ """
+ self._transferFrom(_from, _to, _tokenId, msg.sender)
+```
+
+Việc chuyển trước là ổn vì nếu có vấn đề, chúng tôi sẽ hoàn nguyên,
+do đó mọi thứ được thực hiện trong cuộc gọi sẽ bị hủy.
+
+```python
+ if _to.is_contract: # kiểm tra xem `_to` có phải là địa chỉ hợp đồng không
+```
+
+Đầu tiên, hãy kiểm tra xem địa chỉ có phải là hợp đồng không (nếu nó có mã). Nếu không, giả sử đó là một địa chỉ người dùng
+và người dùng sẽ có thể sử dụng token hoặc chuyển nó. Nhưng đừng để nó ru bạn vào
+một cảm giác an toàn giả tạo. Bạn có thể mất token, ngay cả với `safeTransferFrom`, nếu bạn chuyển
+chúng đến một địa chỉ mà không ai biết khóa riêng tư.
+
+```python
+ returnValue: bytes32 = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data)
+```
+
+Gọi hợp đồng đích để xem liệu nó có thể nhận các token ERC-721 hay không.
+
+```python
+ # Thông báo lỗi nếu đích chuyển là một hợp đồng không triển khai 'onERC721Received'
+ assert returnValue == method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes32)
+```
+
+Nếu đích là một hợp đồng, nhưng là hợp đồng không chấp nhận các token ERC-721 (hoặc đã quyết định không chấp nhận
+việc chuyển cụ thể này), hãy hoàn nguyên.
+
+```python
+@external
+def approve(_approved: address, _tokenId: uint256):
+ """
+ @dev Đặt hoặc xác nhận lại địa chỉ được phê duyệt cho một NFT. Địa chỉ không cho biết không có địa chỉ được phê duyệt nào.
+ Thông báo lỗi trừ khi `msg.sender` là chủ sở hữu NFT hiện tại, hoặc một người vận hành được ủy quyền của chủ sở hữu hiện tại.
+ Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ. (LƯU Ý: Điều này không được viết trong EIP)
+ Thông báo lỗi nếu `_approved` là chủ sở hữu hiện tại. (LƯU Ý: Điều này không được viết trong EIP)
+ @param _approved Địa chỉ sẽ được phê duyệt cho ID NFT đã cho.
+ @param _tokenId ID của token sẽ được phê duyệt.
+ """
+ owner: address = self.idToOwner[_tokenId]
+ # Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ
+ assert owner != ZERO_ADDRESS
+ # Thông báo lỗi nếu `_approved` là chủ sở hữu hiện tại
+ assert _approved != owner
+```
+
+Theo quy ước, nếu bạn không muốn có người phê duyệt, bạn hãy chỉ định địa chỉ không, không phải chính bạn.
+
+```python
+ # Kiểm tra các yêu cầu
+ senderIsOwner: bool = self.idToOwner[_tokenId] == msg.sender
+ senderIsApprovedForAll: bool = (self.ownerToOperators[owner])[msg.sender]
+ assert (senderIsOwner or senderIsApprovedForAll)
+```
+
+Để đặt một sự chấp thuận, bạn có thể là chủ sở hữu, hoặc một người vận hành được chủ sở hữu ủy quyền.
+
+```python
+ # Đặt sự phê duyệt
+ self.idToApprovals[_tokenId] = _approved
+ log Approval(owner, _approved, _tokenId)
+
+
+@external
+def setApprovalForAll(_operator: address, _approved: bool):
+ """
+ @dev Kích hoạt hoặc vô hiệu hóa sự phê duyệt cho một bên thứ ba ("người vận hành") để quản lý tất cả
+ tài sản của `msg.sender`. Nó cũng phát ra sự kiện ApprovalForAll.
+ Thông báo lỗi nếu `_operator` là `msg.sender`. (LƯU Ý: Điều này không được viết trong EIP)
+ @notice Điều này hoạt động ngay cả khi người gửi không sở hữu bất kỳ token nào vào thời điểm đó.
+ @param _operator Địa chỉ để thêm vào tập hợp các người vận hành được ủy quyền.
+ @param _approved True nếu người vận hành được phê duyệt, false để thu hồi phê duyệt.
+ """
+ # Thông báo lỗi nếu `_operator` là `msg.sender`
+ assert _operator != msg.sender
+ self.ownerToOperators[msg.sender][_operator] = _approved
+ log ApprovalForAll(msg.sender, _operator, _approved)
+```
+
+#### Đúc Token mới và Hủy Token hiện có {#mint-burn}
+
+Tài khoản tạo hợp đồng là `người đúc`, người dùng cấp cao được ủy quyền để đúc
+các NFT mới. Tuy nhiên, ngay cả nó cũng không được phép đốt các token hiện có. Chỉ chủ sở hữu, hoặc một thực thể
+được chủ sở hữu ủy quyền, mới có thể làm điều đó.
+
+```python
+### CÁC HÀM ĐÚC & ĐỐT ###
+
+@external
+def mint(_to: address, _tokenId: uint256) -> bool:
+```
+
+Hàm này luôn trả về `True`, vì nếu hoạt động thất bại, nó sẽ được hoàn nguyên.
+
+```python
+ """
+ @dev Hàm để đúc token
+ Thông báo lỗi nếu `msg.sender` không phải là người đúc.
+ Thông báo lỗi nếu `_to` là địa chỉ không.
+ Thông báo lỗi nếu `_tokenId` được sở hữu bởi ai đó.
+ @param _to Địa chỉ sẽ nhận được các token được đúc.
+ @param _tokenId ID token để đúc.
+ @return Một giá trị boolean cho biết hoạt động có thành công hay không.
+ """
+ # Thông báo lỗi nếu `msg.sender` không phải là người đúc
+ assert msg.sender == self.minter
+```
+
+Chỉ người đúc (tài khoản đã tạo hợp đồng ERC-721) mới có thể đúc các token mới. Điều này có thể là một vấn đề
+trong tương lai nếu chúng ta muốn thay đổi danh tính của người đúc. Trong
+một hợp đồng sản xuất, bạn có thể muốn có một hàm cho phép người đúc chuyển
+đặc quyền đúc cho người khác.
+
+```python
+ # Thông báo lỗi nếu `_to` là địa chỉ không
+ assert _to != ZERO_ADDRESS
+ # Thêm NFT. Thông báo lỗi nếu `_tokenId` được sở hữu bởi ai đó
+ self._addTokenTo(_to, _tokenId)
+ log Transfer(ZERO_ADDRESS, _to, _tokenId)
+ return True
+```
+
+Theo quy ước, việc đúc các token mới được tính là một lần chuyển từ địa chỉ không.
+
+```python
+
+@external
+def burn(_tokenId: uint256):
+ """
+ @dev Đốt một token ERC721 cụ thể.
+ Thông báo lỗi trừ khi `msg.sender` là chủ sở hữu hiện tại, một người vận hành được ủy quyền, hoặc địa chỉ được phê duyệt
+ cho NFT này.
+ Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ.
+ @param _tokenId uint256 id của token ERC721 sẽ được đốt.
+ """
+ # Kiểm tra các yêu cầu
+ assert self._isApprovedOrOwner(msg.sender, _tokenId)
+ owner: address = self.idToOwner[_tokenId]
+ # Thông báo lỗi nếu `_tokenId` không phải là một NFT hợp lệ
+ assert owner != ZERO_ADDRESS
+ self._clearApproval(owner, _tokenId)
+ self._removeTokenFrom(owner, _tokenId)
+ log Transfer(owner, ZERO_ADDRESS, _tokenId)
+```
+
+Bất kỳ ai được phép chuyển một token đều được phép đốt nó. Mặc dù việc đốt có vẻ tương đương với
+việc chuyển đến địa chỉ không, địa chỉ không thực sự nhận được token. Điều này cho phép chúng ta
+giải phóng tất cả bộ nhớ đã được sử dụng cho token, điều này có thể làm giảm chi phí gas của giao dịch.
+
+## Sử dụng Hợp đồng này {#using-contract}
+
+Trái ngược với Solidity, Vyper không có tính kế thừa. Đây là một lựa chọn thiết kế có chủ ý để làm cho mã
+rõ ràng hơn và do đó dễ bảo mật hơn. Vì vậy, để tạo hợp đồng Vyper ERC-721 của riêng bạn, bạn hãy lấy hợp đồng
+này và sửa đổi nó
+để triển khai logic kinh doanh mà bạn muốn.
+
+## Kết luận {#conclusion}
+
+Để xem lại, đây là một số ý tưởng quan trọng nhất trong hợp đồng này:
+
+- Để nhận các token ERC-721 bằng một lần chuyển an toàn, các hợp đồng phải triển khai giao diện `ERC721Receiver`.
+- Ngay cả khi bạn sử dụng chuyển an toàn, các token vẫn có thể bị kẹt nếu bạn gửi chúng đến một địa chỉ có khóa riêng tư
+ không xác định.
+- Khi có vấn đề với một hoạt động, tốt hơn hết là `hoàn nguyên` cuộc gọi, thay vì chỉ trả về
+ một giá trị thất bại.
+- Các token ERC-721 tồn tại khi chúng có chủ sở hữu.
+- Có ba cách để được ủy quyền chuyển một NFT. Bạn có thể là chủ sở hữu, được chấp thuận cho một token cụ thể,
+ hoặc là người vận hành cho tất cả các token của chủ sở hữu.
+- Các sự kiện trong quá khứ chỉ hiển thị bên ngoài chuỗi khối. Mã chạy bên trong chuỗi khối không thể xem chúng.
+
+Bây giờ hãy đi và triển khai các hợp đồng Vyper an toàn.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
+
diff --git a/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md
new file mode 100644
index 00000000000..bdf5d9c7eb2
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md
@@ -0,0 +1,932 @@
+---
+title: "Hướng dẫn về Hợp đồng ERC-20"
+description: Hợp đồng ERC-20 của OpenZeppelin chứa những gì và tại sao chúng lại ở đó?
+author: Ori Pomerantz
+lang: vi
+tags: [ "solidity", "erc-20" ]
+skill: beginner
+published: 2021-03-09
+---
+
+## Giới thiệu {#introduction}
+
+Một trong những ứng dụng cho Ethereum đó là cho một nhóm tạo ra Token có thể giao dịch, nói đơn giản là tiền tệ của riêng họ. Các token này thường tuân theo một tiêu chuẩn,
+[ERC-20](/developers/docs/standards/tokens/erc-20/). Tiêu chuẩn này giúp có thể viết các công cụ, chẳng hạn như các bể thanh khoản và ví, hoạt động với tất cả các token
+ERC-20. Trong bài viết này, chúng tôi sẽ phân tích
+[việc triển khai Solidity ERC20 của OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol), cũng như
+[định nghĩa giao diện](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol).
+
+Đây là mã nguồn có chú thích. Nếu bạn muốn triển khai ERC-20,
+[hãy đọc hướng dẫn này](https://docs.openzeppelin.com/contracts/2.x/erc20-supply).
+
+## Giao diện {#the-interface}
+
+Mục đích của một tiêu chuẩn như ERC-20 là cho phép nhiều triển khai token có thể tương tác trên các ứng dụng, như ví và sàn giao dịch phi tập trung. Để đạt được điều đó, chúng tôi tạo một
+[giao diện](https://www.geeksforgeeks.org/solidity/solidity-basics-of-interface/). Bất kỳ mã nào cần sử dụng hợp đồng token
+đều có thể sử dụng các định nghĩa giống nhau trong giao diện và tương thích với tất cả các hợp đồng token sử dụng nó, cho dù đó là ví như
+MetaMask, một ứng dụng phi tập trung như etherscan.io, hoặc một hợp đồng khác như bể thanh khoản.
+
+
+
+Nếu bạn là một lập trình viên có kinh nghiệm, bạn có thể nhớ đã thấy các cấu trúc tương tự trong [Java](https://www.w3schools.com/java/java_interface.asp)
+hoặc ngay cả trong [các tệp tiêu đề C](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html).
+
+Đây là định nghĩa của [Giao diện ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)
+từ OpenZeppelin. Đó là một bản dịch của [tiêu chuẩn mà con người có thể đọc được](https://eips.ethereum.org/EIPS/eip-20) thành mã Solidity. Tất nhiên,
+bản thân giao diện không định nghĩa _cách_ làm bất cứ điều gì. Điều đó được giải thích trong mã nguồn hợp đồng bên dưới.
+
+
+
+```solidity
+// SPDX-License-Identifier: MIT
+```
+
+Các tệp Solidity phải bao gồm một mã định danh giấy phép. [Bạn có thể xem danh sách các giấy phép tại đây](https://spdx.org/licenses/). Nếu bạn cần một giấy phép
+khác, chỉ cần giải thích nó trong các bình luận.
+
+
+
+```solidity
+pragma solidity >=0.6.0 <0.8.0;
+```
+
+Ngôn ngữ Solidity vẫn đang phát triển nhanh chóng, và các phiên bản mới có thể không tương thích với mã cũ
+([xem tại đây](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html)). Do đó, bạn nên chỉ định không chỉ phiên bản tối thiểu
+của ngôn ngữ, mà còn cả phiên bản tối đa, phiên bản mới nhất mà bạn đã kiểm tra mã.
+
+
+
+```solidity
+/**
+ * @dev Giao diện của tiêu chuẩn ERC20 như được định nghĩa trong EIP.
+ */
+```
+
+`@dev` trong bình luận là một phần của [định dạng NatSpec](https://docs.soliditylang.org/en/develop/natspec-format.html), được sử dụng để tạo
+tài liệu từ mã nguồn.
+
+
+
+```solidity
+interface IERC20 {
+```
+
+Theo quy ước, tên giao diện bắt đầu bằng `I`.
+
+
+
+```solidity
+ /**
+ * @dev Trả về số lượng token đang tồn tại.
+ */
+ function totalSupply() external view returns (uint256);
+```
+
+Hàm này là `external`, có nghĩa là [nó chỉ có thể được gọi từ bên ngoài hợp đồng](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2).
+Nó trả về tổng cung token trong hợp đồng. Giá trị này được trả về bằng cách sử dụng loại phổ biến nhất trong Ethereum, số nguyên không dấu 256 bit (256 bit là
+kích thước từ gốc của EVM). Hàm này cũng là một `view`, có nghĩa là nó không thay đổi trạng thái, vì vậy nó có thể được thực thi trên một nút duy nhất thay vì
+mọi nút trong chuỗi khối đều phải chạy nó. Loại hàm này không tạo ra một giao dịch và không tốn [gas](/developers/docs/gas/).
+
+**Lưu ý:** Về lý thuyết, có vẻ như người tạo hợp đồng có thể gian lận bằng cách trả về tổng cung nhỏ hơn giá trị thực, khiến mỗi token có vẻ
+giá trị hơn so với thực tế. Tuy nhiên, nỗi sợ đó đã bỏ qua bản chất thực sự của chuỗi khối. Mọi thứ xảy ra trên chuỗi khối đều có thể được xác minh bởi
+mọi nút. Để đạt được điều này, mã ngôn ngữ máy và bộ nhớ của mọi hợp đồng đều có sẵn trên mọi nút. Mặc dù bạn không bắt buộc phải xuất bản mã
+Solidity cho hợp đồng của mình, nhưng sẽ không ai coi trọng bạn trừ khi bạn xuất bản mã nguồn và phiên bản Solidity mà nó được biên dịch, để nó có thể
+được xác minh với mã ngôn ngữ máy mà bạn đã cung cấp.
+Ví dụ: xem [hợp đồng này](https://eth.blockscout.com/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD?tab=contract).
+
+
+
+```solidity
+ /**
+ * @dev Trả về số lượng token thuộc sở hữu của `account`.
+ */
+ function balanceOf(address account) external view returns (uint256);
+```
+
+Đúng như tên gọi, `balanceOf` trả về số dư của một tài khoản. Các tài khoản Ethereum được xác định trong Solidity bằng loại `address`, chứa 160 bit.
+Nó cũng là `external` và `view`.
+
+
+
+```solidity
+ /**
+ * @dev Di chuyển `amount` token từ tài khoản của người gọi đến `recipient`.
+ *
+ * Trả về một giá trị boolean cho biết liệu hoạt động có thành công hay không.
+ *
+ * Phát ra một sự kiện {Transfer}.
+ */
+ function transfer(address recipient, uint256 amount) external returns (bool);
+```
+
+Hàm `transfer` chuyển token từ người gọi đến một địa chỉ khác. Điều này liên quan đến việc thay đổi trạng thái, vì vậy nó không phải là `view`.
+Khi người dùng gọi hàm này, nó sẽ tạo ra một giao dịch và tốn gas. Nó cũng phát ra một sự kiện, `Transfer`, để thông báo cho mọi người trên
+chuỗi khối về sự kiện này.
+
+Hàm có hai loại đầu ra cho hai loại người gọi khác nhau:
+
+- Người dùng gọi hàm trực tiếp từ giao diện người dùng. Thông thường người dùng gửi một giao dịch
+ và không đợi phản hồi, việc này có thể mất một khoảng thời gian không xác định. Người dùng có thể xem những gì đã xảy ra
+ bằng cách tìm biên lai giao dịch (được xác định bởi hàm băm giao dịch) hoặc bằng cách tìm
+ sự kiện `Transfer`.
+- Các hợp đồng khác, gọi hàm như một phần của một giao dịch tổng thể. Các hợp đồng đó nhận được kết quả ngay lập tức,
+ vì chúng chạy trong cùng một giao dịch, vì vậy chúng có thể sử dụng giá trị trả về của hàm.
+
+Loại đầu ra tương tự được tạo bởi các hàm khác làm thay đổi trạng thái của hợp đồng.
+
+
+
+Hạn mức cho phép một tài khoản chi tiêu một số token thuộc về một chủ sở hữu khác.
+Điều này hữu ích, ví dụ, đối với các hợp đồng hoạt động như người bán. Các hợp đồng không thể
+giám sát các sự kiện, vì vậy nếu người mua chuyển token trực tiếp đến hợp đồng của người bán
+thì hợp đồng đó sẽ không biết nó đã được thanh toán. Thay vào đó, người mua cho phép
+hợp đồng người bán chi tiêu một số tiền nhất định và người bán chuyển số tiền đó.
+Điều này được thực hiện thông qua một hàm mà hợp đồng người bán gọi, do đó hợp đồng người bán
+có thể biết liệu nó có thành công hay không.
+
+```solidity
+ /**
+ * @dev Trả về số lượng token còn lại mà `spender` sẽ được
+ * phép chi tiêu thay mặt cho `owner` thông qua {transferFrom}. Con số này
+ * mặc định là không.
+ *
+ * Giá trị này thay đổi khi {approve} hoặc {transferFrom} được gọi.
+ */
+ function allowance(address owner, address spender) external view returns (uint256);
+```
+
+Hàm `allowance` cho phép bất kỳ ai truy vấn để xem hạn mức mà một
+địa chỉ (`owner`) cho phép một địa chỉ khác (`spender`) chi tiêu.
+
+
+
+```solidity
+ /**
+ * @dev Đặt `amount` làm hạn mức của `spender` trên các token của người gọi.
+ *
+ * Trả về một giá trị boolean cho biết liệu hoạt động có thành công hay không.
+ *
+ * QUAN TRỌNG: Cẩn thận rằng việc thay đổi hạn mức bằng phương pháp này có nguy cơ
+ * ai đó có thể sử dụng cả hạn mức cũ và mới do thứ tự
+ * giao dịch không may mắn. Một giải pháp khả thi để giảm thiểu tình trạng
+ * chạy đua này là trước tiên giảm hạn mức của người chi tiêu xuống 0 và đặt
+ * giá trị mong muốn sau đó:
+ * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
+ *
+ * Phát ra một sự kiện {Approval}.
+ */
+ function approve(address spender, uint256 amount) external returns (bool);
+```
+
+Hàm `approve` tạo ra một hạn mức. Hãy chắc chắn đọc thông điệp về
+cách nó có thể bị lạm dụng. Trong Ethereum, bạn kiểm soát thứ tự các giao dịch của chính mình,
+nhưng bạn không thể kiểm soát thứ tự các giao dịch của người khác sẽ
+được thực hiện, trừ khi bạn không gửi giao dịch của mình cho đến khi bạn thấy
+giao dịch của phía bên kia đã xảy ra.
+
+
+
+```solidity
+ /**
+ * @dev Di chuyển `amount` token từ `sender` đến `recipient` bằng cách sử dụng
+ * cơ chế hạn mức. `amount` sau đó được khấu trừ từ hạn mức của người gọi
+ *
+ *
+ * Trả về một giá trị boolean cho biết liệu hoạt động có thành công hay không.
+ *
+ * Phát ra một sự kiện {Transfer}.
+ */
+ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
+```
+
+Cuối cùng, `transferFrom` được người chi tiêu sử dụng để thực sự chi tiêu hạn mức.
+
+
+
+```solidity
+
+ /**
+ * @dev Được phát ra khi token `value` được chuyển từ một tài khoản (`from`) sang
+ * một tài khoản khác (`to`).
+ *
+ * Lưu ý rằng `value` có thể bằng không.
+ */
+ event Transfer(address indexed from, address indexed to, uint256 value);
+
+ /**
+ * @dev Được phát ra khi hạn mức của `spender` cho một `owner` được đặt bởi
+ * một cuộc gọi đến {approve}. `value` là hạn mức mới.
+ */
+ event Approval(address indexed owner, address indexed spender, uint256 value);
+}
+```
+
+Những sự kiện này được phát ra khi trạng thái của hợp đồng ERC-20 thay đổi.
+
+## Hợp đồng thực tế {#the-actual-contract}
+
+Đây là hợp đồng thực tế triển khai tiêu chuẩn ERC-20,
+[lấy từ đây](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol).
+Nó không có nghĩa là để được sử dụng nguyên trạng, nhưng bạn có thể
+[kế thừa](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm) từ nó để mở rộng nó thành một cái gì đó có thể sử dụng được.
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity >=0.6.0 <0.8.0;
+```
+
+
+
+### Các câu lệnh nhập {#import-statements}
+
+Ngoài các định nghĩa giao diện ở trên, định nghĩa hợp đồng nhập hai tệp khác:
+
+```solidity
+
+import "../../GSN/Context.sol";
+import "./IERC20.sol";
+import "../../math/SafeMath.sol";
+```
+
+- `GSN/Context.sol` là các định nghĩa cần thiết để sử dụng [OpenGSN](https://www.opengsn.org/), một hệ thống cho phép người dùng không có ether
+ sử dụng chuỗi khối. Lưu ý rằng đây là một phiên bản cũ, nếu bạn muốn tích hợp với OpenGSN
+ [hãy sử dụng hướng dẫn này](https://docs.opengsn.org/javascript-client/tutorial.html).
+- [Thư viện SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/), ngăn chặn
+ tràn số/tràn số dưới cho các phiên bản Solidity **<0.8.0**. Trong Solidity ≥0.8.0, các phép toán số học tự động
+ hoàn nguyên khi tràn số/tràn số dưới, khiến SafeMath không cần thiết. Hợp đồng này sử dụng SafeMath để tương thích ngược với
+ các phiên bản trình biên dịch cũ hơn.
+
+
+
+Bình luận này giải thích mục đích của hợp đồng.
+
+```solidity
+/**
+ * @dev Việc triển khai giao diện {IERC20}.
+ *
+ * Việc triển khai này không phụ thuộc vào cách token được tạo ra. Điều này có nghĩa là
+ * một cơ chế cung cấp phải được thêm vào trong một hợp đồng phái sinh bằng cách sử dụng {_mint}.
+ * Để biết cơ chế chung, hãy xem {ERC20PresetMinterPauser}.
+ *
+ * MẸO: Để xem bài viết chi tiết, hãy xem hướng dẫn của chúng tôi
+ * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[Cách
+ * triển khai cơ chế cung cấp].
+ *
+ * Chúng tôi đã tuân theo các nguyên tắc chung của OpenZeppelin: các hàm sẽ hoàn nguyên thay
+ * vì trả về `false` khi thất bại. Hành vi này tuy nhiên là thông thường
+ * và không mâu thuẫn với các kỳ vọng của ứng dụng ERC20.
+ *
+ * Ngoài ra, một sự kiện {Approval} được phát ra khi gọi hàm {transferFrom}.
+ * Điều này cho phép các ứng dụng tái tạo khoản cấp phép cho tất cả các tài khoản chỉ
+ * bằng cách lắng nghe các sự kiện đã nói. Các triển khai khác của EIP có thể không phát ra
+ * các sự kiện này, vì nó không được yêu cầu bởi đặc tả.
+ *
+ * Cuối cùng, các hàm không chuẩn {decreaseAllowance} và {increaseAllowance}
+ * đã được thêm vào để giảm thiểu các vấn đề đã biết xung quanh việc đặt
+ * khoản cấp phép. Xem {IERC20-approve}.
+ */
+```
+
+### Định nghĩa Hợp đồng {#contract-definition}
+
+```solidity
+contract ERC20 is Context, IERC20 {
+```
+
+Dòng này chỉ định sự kế thừa, trong trường hợp này là từ `IERC20` ở trên và `Context`, cho OpenGSN.
+
+
+
+```solidity
+
+ using SafeMath for uint256;
+
+```
+
+Dòng này gắn thư viện `SafeMath` vào loại `uint256`. Bạn có thể tìm thấy thư viện này
+[tại đây](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol).
+
+### Định nghĩa Biến {#variable-definitions}
+
+Các định nghĩa này chỉ định các biến trạng thái của hợp đồng. Các biến này được khai báo là `private`, nhưng
+điều đó chỉ có nghĩa là các hợp đồng khác trên chuỗi khối không thể đọc chúng. _Không có bí mật nào
+trên chuỗi khối_, phần mềm trên mọi nút có trạng thái của mọi hợp đồng
+tại mỗi khối. Theo quy ước, các biến trạng thái được đặt tên là `_`.
+
+Hai biến đầu tiên là [ánh xạ](https://www.tutorialspoint.com/solidity/solidity_mappings.htm),
+có nghĩa là chúng hoạt động gần giống như [mảng liên kết](https://wikipedia.org/wiki/Associative_array),
+ngoại trừ việc các khóa là các giá trị số. Lưu trữ chỉ được cấp phát cho các mục có giá trị khác
+với giá trị mặc định (không).
+
+```solidity
+ mapping (address => uint256) private _balances;
+```
+
+Ánh xạ đầu tiên, `_balances`, là các địa chỉ và số dư tương ứng của token này. Để truy cập
+số dư, hãy sử dụng cú pháp này: `_balances[]`.
+
+
+
+```solidity
+ mapping (address => mapping (address => uint256)) private _allowances;
+```
+
+Biến này, `_allowances`, lưu trữ các khoản cấp phép đã được giải thích trước đó. Chỉ số đầu tiên là chủ sở hữu
+của các token, và chỉ số thứ hai là hợp đồng có khoản cấp phép. Để truy cập số tiền mà địa chỉ A có thể
+tiêu từ tài khoản của địa chỉ B, hãy sử dụng `_allowances[B][A]`.
+
+
+
+```solidity
+ uint256 private _totalSupply;
+```
+
+Đúng như tên gọi, biến này theo dõi tổng nguồn cung token.
+
+
+
+```solidity
+ string private _name;
+ string private _symbol;
+ uint8 private _decimals;
+```
+
+Ba biến này được sử dụng để cải thiện khả năng đọc. Hai biến đầu tiên tự giải thích, nhưng `_decimals`
+thì không.
+
+Một mặt, Ethereum không có các biến dấu phẩy động hoặc biến phân số. Mặt khác,
+con người thích có thể chia nhỏ các token. Một lý do mọi người chọn vàng làm tiền tệ là vì
+rất khó để thối tiền khi ai đó muốn mua một con vịt bằng giá trị của một con bò.
+
+Giải pháp là theo dõi các số nguyên, nhưng thay vì đếm token thực, chúng ta đếm một token phân số gần như
+vô giá trị. Trong trường hợp của ether, token phân số được gọi là wei, và 10^18 wei bằng một
+ETH. Tại thời điểm viết bài, 10.000.000.000.000 wei xấp xỉ một cent Mỹ hoặc Euro.
+
+Các ứng dụng cần biết cách hiển thị số dư token. Nếu một người dùng có 3.141.000.000.000.000.000 wei, đó có phải là
+3.14 ETH không? 31.41 ETH? 3.141 ETH? Trong trường hợp của ether, nó được định nghĩa là 10^18 wei cho một ETH, nhưng đối với
+token của bạn, bạn có thể chọn một giá trị khác. Nếu việc chia token không có ý nghĩa, bạn có thể sử dụng một
+giá trị `_decimals` bằng không. Nếu bạn muốn sử dụng cùng một tiêu chuẩn như ETH, hãy sử dụng giá trị **18**.
+
+### Hàm dựng {#the-constructor}
+
+```solidity
+ /**
+ * @dev Đặt các giá trị cho {name} và {symbol}, khởi tạo {decimals} với
+ * giá trị mặc định là 18.
+ *
+ * Để chọn một giá trị khác cho {decimals}, hãy sử dụng {_setupDecimals}.
+ *
+ * Cả ba giá trị này đều là bất biến: chúng chỉ có thể được đặt một lần trong
+ * quá trình khởi tạo.
+ */
+ constructor (string memory name_, string memory symbol_) public {
+ // Trong Solidity ≥0.7.0, 'public' là ngầm định và có thể được bỏ qua.
+
+ _name = name_;
+ _symbol = symbol_;
+ _decimals = 18;
+ }
+```
+
+Hàm dựng được gọi khi hợp đồng được tạo lần đầu tiên. Theo quy ước, các tham số hàm được đặt tên là `_`.
+
+### Các Hàm Giao diện Người dùng {#user-interface-functions}
+
+```solidity
+ /**
+ * @dev Trả về tên của token.
+ */
+ function name() public view returns (string memory) {
+ return _name;
+ }
+
+ /**
+ * @dev Trả về ký hiệu của token, thường là một phiên bản ngắn hơn của
+ * tên.
+ */
+ function symbol() public view returns (string memory) {
+ return _symbol;
+ }
+
+ /**
+ * @dev Trả về số lượng số thập phân được sử dụng để lấy biểu diễn người dùng của nó.
+ * Ví dụ, nếu `decimals` bằng `2`, số dư là `505` token sẽ
+ * được hiển thị cho người dùng là `5,05` (`505 / 10 ** 2`).
+ *
+ * Các token thường chọn giá trị là 18, bắt chước mối quan hệ giữa
+ * ether và wei. Đây là giá trị mà {ERC20} sử dụng, trừ khi {_setupDecimals}
+ * được gọi.
+ *
+ * LƯU Ý: Thông tin này chỉ được sử dụng cho mục đích _hiển thị_: nó
+ * không ảnh hưởng đến bất kỳ phép tính số học nào của hợp đồng, bao gồm
+ * {IERC20-balanceOf} và {IERC20-transfer}.
+ */
+ function decimals() public view returns (uint8) {
+ return _decimals;
+ }
+```
+
+Các hàm này, `name`, `symbol`, và `decimals` giúp các giao diện người dùng biết về hợp đồng của bạn để chúng có thể hiển thị nó một cách chính xác.
+
+Loại trả về là `string memory`, có nghĩa là trả về một chuỗi được lưu trữ trong bộ nhớ. Các biến, chẳng hạn như
+chuỗi, có thể được lưu trữ ở ba vị trí:
+
+| | Vòng đời | Truy cập Hợp đồng | Chi phí Gas |
+| -------- | ------------------------- | ----------------- | ---------------------------------------------------------------------------- |
+| Bộ nhớ | Lệnh gọi hàm | Đọc/Ghi | Hàng chục hoặc hàng trăm (cao hơn cho các vị trí cao hơn) |
+| Calldata | Lệnh gọi hàm | Chỉ đọc | Không thể được sử dụng làm loại trả về, chỉ là loại tham số hàm |
+| Lưu trữ | Cho đến khi được thay đổi | Đọc/Ghi | Cao (800 cho đọc, 20k cho ghi) |
+
+Trong trường hợp này, `memory` là lựa chọn tốt nhất.
+
+### Đọc thông tin Token {#read-token-information}
+
+Đây là các hàm cung cấp thông tin về token, hoặc là tổng nguồn cung hoặc là
+số dư của một tài khoản.
+
+```solidity
+ /**
+ * @dev Xem {IERC20-totalSupply}.
+ */
+ function totalSupply() public view override returns (uint256) {
+ return _totalSupply;
+ }
+```
+
+Hàm `totalSupply` trả về tổng nguồn cung token.
+
+
+
+```solidity
+ /**
+ * @dev Xem {IERC20-balanceOf}.
+ */
+ function balanceOf(address account) public view override returns (uint256) {
+ return _balances[account];
+ }
+```
+
+Đọc số dư của một tài khoản. Lưu ý rằng bất kỳ ai cũng được phép lấy số dư tài khoản
+của bất kỳ ai khác. Không có lý do gì để cố gắng che giấu thông tin này, vì nó có sẵn trên mọi
+nút. _Không có bí mật nào trên chuỗi khối._
+
+### Chuyển Token {#transfer-tokens}
+
+```solidity
+ /**
+ * @dev Xem {IERC20-transfer}.
+ *
+ * Các yêu cầu:
+ *
+ * - `recipient` không được là địa chỉ không.
+ * - người gọi phải có số dư ít nhất là `amount`.
+ */
+ function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
+```
+
+Hàm `transfer` được gọi để chuyển token từ tài khoản của người gửi sang một tài khoản khác. Lưu ý
+rằng mặc dù nó trả về một giá trị boolean, giá trị đó luôn là **true**. Nếu việc chuyển khoản
+thất bại, hợp đồng sẽ hoàn nguyên lệnh gọi.
+
+
+
+```solidity
+ _transfer(_msgSender(), recipient, amount);
+ return true;
+ }
+```
+
+Hàm `_transfer` thực hiện công việc thực tế. Nó là một hàm riêng tư chỉ có thể được gọi bởi
+các hàm khác của hợp đồng. Theo quy ước, các hàm riêng tư được đặt tên là `_`, giống như các biến
+trạng thái.
+
+Thông thường trong Solidity, chúng ta sử dụng `msg.sender` cho người gửi thông điệp. Tuy nhiên, điều đó làm hỏng
+[OpenGSN](http://opengsn.org/). Nếu chúng ta muốn cho phép các giao dịch không cần ether với token của mình, chúng ta
+cần sử dụng `_msgSender()`. Nó trả về `msg.sender` cho các giao dịch bình thường, nhưng đối với các giao dịch không cần ether
+thì trả về người ký ban đầu chứ không phải hợp đồng đã chuyển tiếp thông điệp.
+
+### Các Hàm Cấp phép {#allowance-functions}
+
+Đây là các hàm triển khai chức năng cấp phép: `allowance`, `approve`, `transferFrom`,
+và `_approve`. Ngoài ra, việc triển khai OpenZeppelin vượt ra ngoài tiêu chuẩn cơ bản để bao gồm một số tính năng cải thiện
+bảo mật: `increaseAllowance`, và `decreaseAllowance`.
+
+#### Hàm cấp phép {#allowance}
+
+```solidity
+ /**
+ * @dev Xem {IERC20-allowance}.
+ */
+ function allowance(address owner, address spender) public view virtual override returns (uint256) {
+ return _allowances[owner][spender];
+ }
+```
+
+Hàm `allowance` cho phép mọi người kiểm tra bất kỳ khoản cấp phép nào.
+
+#### Hàm phê duyệt {#approve}
+
+```solidity
+ /**
+ * @dev Xem {IERC20-approve}.
+ *
+ * Các yêu cầu:
+ *
+ * - `spender` không được là địa chỉ không.
+ */
+ function approve(address spender, uint256 amount) public virtual override returns (bool) {
+```
+
+Hàm này được gọi để tạo một khoản cấp phép. Nó tương tự như hàm `transfer` ở trên:
+
+- Hàm chỉ gọi một hàm nội bộ (trong trường hợp này là `_approve`) để thực hiện công việc thực tế.
+- Hàm sẽ trả về `true` (nếu thành công) hoặc hoàn nguyên (nếu không).
+
+
+
+```solidity
+ _approve(_msgSender(), spender, amount);
+ return true;
+ }
+```
+
+Chúng tôi sử dụng các hàm nội bộ để giảm thiểu số lượng nơi xảy ra thay đổi trạng thái. _Bất kỳ_ hàm nào thay đổi
+trạng thái đều là một rủi ro bảo mật tiềm tàng cần được kiểm tra về mặt bảo mật. Bằng cách này, chúng ta có ít cơ hội làm sai hơn.
+
+#### Hàm transferFrom {#transferFrom}
+
+Đây là hàm mà một người chi tiêu gọi để sử dụng một khoản cấp phép. Điều này đòi hỏi hai hoạt động: chuyển số tiền
+đang được chi tiêu và giảm khoản cấp phép đi số tiền đó.
+
+```solidity
+ /**
+ * @dev Xem {IERC20-transferFrom}.
+ *
+ * Phát ra một sự kiện {Approval} cho biết khoản cấp phép đã được cập nhật. Điều này không
+ * được EIP yêu cầu. Xem ghi chú ở đầu {ERC20}.
+ *
+ * Các yêu cầu:
+ *
+ * - `sender` và `recipient` không được là địa chỉ không.
+ * - `sender` phải có số dư ít nhất là `amount`.
+ * - người gọi phải có khoản cấp phép cho các token của ``sender`` ít nhất là
+ * `amount`.
+ */
+ function transferFrom(address sender, address recipient, uint256 amount) public virtual
+ override returns (bool) {
+ _transfer(sender, recipient, amount);
+```
+
+
+
+Lệnh gọi hàm `a.sub(b, "message")` thực hiện hai việc. Đầu tiên, nó tính toán `a-b`, là khoản cấp phép mới.
+Thứ hai, nó kiểm tra xem kết quả này có phải là số âm hay không. Nếu nó là số âm, lệnh gọi sẽ hoàn nguyên với thông điệp được cung cấp. Lưu ý rằng khi một lệnh gọi hoàn nguyên, bất kỳ quá trình xử lý nào đã được thực hiện trước đó trong lệnh gọi đó đều bị bỏ qua, vì vậy chúng ta không cần phải
+hoàn tác `_transfer`.
+
+```solidity
+ _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount,
+ "ERC20: số tiền chuyển vượt quá khoản cấp phép"));
+ return true;
+ }
+```
+
+#### Các bổ sung an toàn của OpenZeppelin {#openzeppelin-safety-additions}
+
+Việc đặt một khoản cấp phép khác không thành một giá trị khác không khác là rất nguy hiểm,
+bởi vì bạn chỉ kiểm soát thứ tự các giao dịch của riêng mình, chứ không phải của bất kỳ ai khác. Hãy tưởng tượng bạn
+có hai người dùng, Alice là người ngây thơ và Bill là người không trung thực. Alice muốn một số dịch vụ từ
+Bill, mà cô ấy nghĩ rằng có giá năm token - vì vậy cô ấy cấp cho Bill một khoản cấp phép là năm token.
+
+Sau đó, có điều gì đó thay đổi và giá của Bill tăng lên mười token. Alice, người vẫn muốn dịch vụ,
+gửi một giao dịch đặt khoản cấp phép của Bill thành mười. Ngay khi Bill nhìn thấy giao dịch mới này
+trong bể giao dịch, anh ta gửi một giao dịch chi tiêu năm token của Alice và có giá gas cao hơn
+nhiều để nó sẽ được khai thác nhanh hơn. Bằng cách đó, Bill có thể chi tiêu năm token đầu tiên và sau đó,
+khi khoản cấp phép mới của Alice được khai thác, chi tiêu thêm mười token nữa với tổng giá là mười lăm token, nhiều hơn
+số tiền Alice dự định ủy quyền. Kỹ thuật này được gọi là
+[chạy trước](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/#front-running)
+
+| Giao dịch của Alice | Nonce của Alice | Giao dịch của Bill | Nonce của Bill | Khoản cấp phép của Bill | Tổng thu nhập của Bill từ 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 |
+
+Để tránh vấn đề này, hai hàm này (`increaseAllowance` và `decreaseAllowance`) cho phép bạn
+sửa đổi hạn mức theo một số lượng cụ thể. Vì vậy, nếu Bill đã chi tiêu năm token, anh ta sẽ chỉ
+có thể chi tiêu thêm năm token nữa. Tùy thuộc vào thời gian, có hai cách điều này có thể hoạt động, cả hai
+đều kết thúc với việc Bill chỉ nhận được mười token:
+
+A:
+
+| Giao dịch của Alice | Nonce của Alice | Giao dịch của Bill | Nonce của Bill | Khoản cấp phép của Bill | Tổng thu nhập của Bill từ 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:
+
+| Giao dịch của Alice | Nonce của Alice | Giao dịch của Bill | Nonce của Bill | Khoản cấp phép của Bill | Tổng thu nhập của Bill từ 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 Tăng một cách nguyên tử hạn mức được cấp cho `spender` bởi người gọi.
+ *
+ * Đây là một giải pháp thay thế cho {approve} có thể được sử dụng như một biện pháp giảm thiểu cho
+ * các vấn đề được mô tả trong {IERC20-approve}.
+ *
+ * Phát ra một sự kiện {Approval} cho biết hạn mức đã được cập nhật.
+ *
+ * Các yêu cầu:
+ *
+ * - `spender` không thể là địa chỉ không.
+ */
+ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
+ _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
+ return true;
+ }
+```
+
+Hàm `a.add(b)` là một hàm cộng an toàn. Trong trường hợp không thể xảy ra là `a`+`b`>=`2^256`, nó không quay vòng
+theo cách cộng thông thường.
+
+```solidity
+
+ /**
+ * @dev Giảm một cách nguyên tử hạn mức được cấp cho `spender` bởi người gọi.
+ *
+ * Đây là một giải pháp thay thế cho {approve} có thể được sử dụng như một biện pháp giảm thiểu cho
+ * các vấn đề được mô tả trong {IERC20-approve}.
+ *
+ * Phát ra một sự kiện {Approval} cho biết hạn mức đã được cập nhật.
+ *
+ * Các yêu cầu:
+ *
+ * - `spender` không thể là địa chỉ không.
+ * - `spender` phải có hạn mức cho người gọi ít nhất
+ * `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;
+ }
+```
+
+### Các hàm sửa đổi thông tin Token {#functions-that-modify-token-information}
+
+Đây là bốn hàm thực hiện công việc thực tế: `_transfer`, `_mint`, `_burn`, và `_approve`.
+
+#### Hàm _transfer {#_transfer}
+
+```solidity
+ /**
+ * @dev Di chuyển `amount` token từ `sender` sang `recipient`.
+ *
+ * Hàm nội bộ này tương đương với {transfer}, và có thể được sử dụng để
+ * ví dụ, triển khai phí token tự động, cơ chế phạt, v.v.
+ *
+ * Phát ra một sự kiện {Transfer}.
+ *
+ * Các yêu cầu:
+ *
+ * - `sender` không thể là địa chỉ không.
+ * - `recipient` không thể là địa chỉ không.
+ * - `sender` phải có số dư ít nhất `amount`.
+ */
+ function _transfer(address sender, address recipient, uint256 amount) internal virtual {
+```
+
+Hàm này, `_transfer`, chuyển token từ một tài khoản sang một tài khoản khác. Nó được gọi bởi cả
+`transfer` (đối với các lần chuyển từ tài khoản của chính người gửi) và `transferFrom` (đối với việc sử dụng hạn mức
+để chuyển từ tài khoản của người khác).
+
+
+
+```solidity
+ require(sender != address(0), "ERC20: transfer from the zero address");
+ require(recipient != address(0), "ERC20: transfer to the zero address");
+```
+
+Không ai thực sự sở hữu địa chỉ không trong Ethereum (tức là, không ai biết một khóa riêng tư mà khóa công khai phù hợp của nó
+được chuyển đổi thành địa chỉ không). Khi mọi người sử dụng địa chỉ đó, thường là một lỗi phần mềm - vì vậy chúng tôi
+báo lỗi nếu địa chỉ không được sử dụng làm người gửi hoặc người nhận.
+
+
+
+```solidity
+ _beforeTokenTransfer(sender, recipient, amount);
+
+```
+
+Có hai cách để sử dụng hợp đồng này:
+
+1. Sử dụng nó như một mẫu cho mã của riêng bạn
+2. [Kế thừa từ nó](https://www.bitdegree.org/learn/solidity-inheritance), và chỉ ghi đè những hàm mà bạn cần sửa đổi
+
+Phương pháp thứ hai tốt hơn nhiều vì mã ERC-20 của OpenZeppelin đã được kiểm toán và cho thấy là an toàn. Khi bạn sử dụng kế thừa,
+nó sẽ rõ ràng những hàm nào bạn sửa đổi, và để tin tưởng vào hợp đồng của bạn, mọi người chỉ cần kiểm toán những hàm cụ thể đó.
+
+Thường rất hữu ích khi thực hiện một hàm mỗi khi token được trao tay. Tuy nhiên, `_transfer` là một hàm rất quan trọng và có
+thể viết nó một cách không an toàn (xem bên dưới), vì vậy tốt nhất là không nên ghi đè nó. Giải pháp là `_beforeTokenTransfer`, một
+[hàm móc](https://wikipedia.org/wiki/Hooking). Bạn có thể ghi đè hàm này, và nó sẽ được gọi trên mỗi lần chuyển khoản.
+
+
+
+```solidity
+ _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
+ _balances[recipient] = _balances[recipient].add(amount);
+```
+
+Đây là những dòng thực sự thực hiện việc chuyển khoản. Lưu ý rằng **không có gì** ở giữa chúng, và chúng tôi trừ
+số tiền được chuyển từ người gửi trước khi cộng nó vào người nhận. Điều này quan trọng vì nếu có một
+cuộc gọi đến một hợp đồng khác ở giữa, nó có thể đã được sử dụng để gian lận hợp đồng này. Bằng cách này, việc chuyển khoản
+là nguyên tử, không có gì có thể xảy ra ở giữa nó.
+
+
+
+```solidity
+ emit Transfer(sender, recipient, amount);
+ }
+```
+
+Cuối cùng, phát ra một sự kiện `Transfer`. Các sự kiện không thể truy cập được đối với các hợp đồng thông minh, nhưng mã chạy bên ngoài chuỗi khối
+có thể lắng nghe các sự kiện và phản ứng với chúng. Ví dụ, một chiếc ví có thể theo dõi khi chủ sở hữu nhận được nhiều token hơn.
+
+#### Các hàm _mint và _burn {#_mint-and-_burn}
+
+Hai hàm này (`_mint` và `_burn`) sửa đổi tổng cung token.
+Chúng là nội bộ và không có hàm nào gọi chúng trong hợp đồng này,
+vì vậy chúng chỉ hữu ích nếu bạn kế thừa từ hợp đồng và thêm logic của riêng bạn
+để quyết định trong điều kiện nào để đúc token mới hoặc đốt token hiện có.
+
+**LƯU Ý:** Mỗi token ERC-20 đều có logic kinh doanh riêng để quyết định việc quản lý token.
+Ví dụ, một hợp đồng cung cấp cố định có thể chỉ gọi `_mint`
+trong hàm khởi tạo và không bao giờ gọi `_burn`. Một hợp đồng bán token
+sẽ gọi `_mint` khi được thanh toán, và có lẽ sẽ gọi `_burn` tại một thời điểm nào đó
+để tránh lạm phát phi mã.
+
+```solidity
+ /** @dev Tạo `amount` token và gán chúng cho `account`, tăng
+ * tổng cung.
+ *
+ * Phát ra một sự kiện {Transfer} với `from` được đặt thành địa chỉ không.
+ *
+ * Các yêu cầu:
+ *
+ * - `to` không thể là địa chỉ không.
+ */
+ 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);
+ }
+```
+
+Đảm bảo cập nhật `_totalSupply` khi tổng số token thay đổi.
+
+
+
+```solidity
+ /**
+ * @dev Hủy `amount` token từ `account`, giảm
+ * tổng cung.
+ *
+ * Phát ra một sự kiện {Transfer} với `to` được đặt thành địa chỉ không.
+ *
+ * Các yêu cầu:
+ *
+ * - `account` không thể là địa chỉ không.
+ * - `account` phải có ít nhất `amount` token.
+ */
+ 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);
+ }
+```
+
+Hàm `_burn` gần như giống hệt `_mint`, ngoại trừ nó đi theo hướng ngược lại.
+
+#### Hàm _approve {#_approve}
+
+Đây là hàm thực sự chỉ định các hạn mức. Lưu ý rằng nó cho phép chủ sở hữu chỉ định
+một hạn mức cao hơn số dư hiện tại của chủ sở hữu. Điều này là OK vì số dư được
+kiểm tra tại thời điểm chuyển khoản, khi nó có thể khác với số dư khi hạn mức được
+tạo ra.
+
+```solidity
+ /**
+ * @dev Đặt `amount` làm hạn mức của `spender` trên các token của `owner`.
+ *
+ * Hàm nội bộ này tương đương với `approve`, và có thể được sử dụng để
+ * ví dụ, đặt các hạn mức tự động cho một số hệ thống con, v.v.
+ *
+ * Phát ra một sự kiện {Approval}.
+ *
+ * Các yêu cầu:
+ *
+ * - `owner` không thể là địa chỉ không.
+ * - `spender` không thể là địa chỉ không.
+ */
+ 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;
+```
+
+
+
+Phát ra một sự kiện `Approval`. Tùy thuộc vào cách ứng dụng được viết, hợp đồng người chi tiêu có thể được thông báo về
+việc phê duyệt bởi chủ sở hữu hoặc bởi một máy chủ lắng nghe những sự kiện này.
+
+```solidity
+ emit Approval(owner, spender, amount);
+ }
+
+```
+
+### Sửa đổi biến Decimals {#modify-the-decimals-variable}
+
+```solidity
+
+
+ /**
+ * @dev Đặt {decimals} thành một giá trị khác với giá trị mặc định là 18.
+ *
+ * CẢNH BÁO: Hàm này chỉ nên được gọi từ hàm khởi tạo. Hầu hết
+ * các ứng dụng tương tác với các hợp đồng token sẽ không mong đợi
+ * {decimals} thay đổi, và có thể hoạt động không chính xác nếu nó thay đổi.
+ */
+ function _setupDecimals(uint8 decimals_) internal {
+ _decimals = decimals_;
+ }
+```
+
+Hàm này sửa đổi biến `_decimals` được sử dụng để cho giao diện người dùng biết cách diễn giải số lượng.
+Bạn nên gọi nó từ hàm khởi tạo. Sẽ là không trung thực nếu gọi nó tại bất kỳ thời điểm nào sau đó, và các ứng dụng
+không được thiết kế để xử lý nó.
+
+### Hook {#hooks}
+
+```solidity
+
+ /**
+ * @dev Móc được gọi trước bất kỳ lần chuyển token nào. Điều này bao gồm
+ * việc đúc và đốt.
+ *
+ * Điều kiện gọi:
+ *
+ * - khi `from` và `to` đều khác không, `amount` token của ``from``
+ * sẽ được chuyển đến `to`.
+ * - khi `from` bằng không, `amount` token sẽ được đúc cho `to`.
+ * - khi `to` bằng không, `amount` token của ``from`` sẽ bị đốt.
+ * - `from` và `to` không bao giờ cùng bằng không.
+ *
+ * Để tìm hiểu thêm về các móc, hãy truy cập xref:ROOT:extending-contracts.adoc#using-hooks[Sử dụng các Móc].
+ */
+ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
+}
+```
+
+Đây là hàm móc sẽ được gọi trong các lần chuyển khoản. Nó trống ở đây, nhưng nếu bạn cần
+nó làm gì đó, bạn chỉ cần ghi đè nó.
+
+## Kết luận {#conclusion}
+
+Để xem lại, đây là một số ý tưởng quan trọng nhất trong hợp đồng này (theo ý kiến của tôi, ý kiến của bạn có thể khác):
+
+- _Không có bí mật nào trên chuỗi khối_. Bất kỳ thông tin nào mà một hợp đồng thông minh có thể truy cập
+ đều có sẵn cho cả thế giới.
+- Bạn có thể kiểm soát thứ tự các giao dịch của mình, nhưng không thể kiểm soát khi nào giao dịch của người khác
+ xảy ra. Đây là lý do tại sao việc thay đổi hạn mức có thể nguy hiểm, vì nó cho phép
+ người chi tiêu chi tiêu tổng của cả hai hạn mức.
+- Các giá trị của loại `uint256` sẽ quay vòng. Nói cách khác, _0-1=2^256-1_. Nếu đó không phải là hành vi
+ mong muốn, bạn phải kiểm tra nó (hoặc sử dụng thư viện SafeMath làm điều đó cho bạn). Lưu ý rằng điều này đã thay đổi trong
+ [Solidity 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html).
+- Thực hiện tất cả các thay đổi trạng thái của một loại cụ thể ở một nơi cụ thể, vì nó giúp việc kiểm toán dễ dàng hơn.
+ Đây là lý do tại sao chúng ta có, ví dụ, `_approve`, được gọi bởi `approve`, `transferFrom`,
+ `increaseAllowance`, và `decreaseAllowance`
+- Các thay đổi trạng thái phải là nguyên tử, không có bất kỳ hành động nào khác ở giữa chúng (như bạn có thể thấy
+ trong `_transfer`). Điều này là do trong quá trình thay đổi trạng thái, bạn có một trạng thái không nhất quán. Ví dụ,
+ giữa thời điểm bạn khấu trừ từ số dư của người gửi và thời điểm bạn cộng vào số dư của
+ người nhận, có ít token tồn tại hơn so với thực tế. Điều này có thể bị lạm dụng nếu có
+ các hoạt động giữa chúng, đặc biệt là các cuộc gọi đến một hợp đồng khác.
+
+Bây giờ bạn đã thấy cách hợp đồng ERC-20 của OpenZeppelin được viết, và đặc biệt là cách nó được
+làm an toàn hơn, hãy đi và viết các hợp đồng và ứng dụng an toàn của riêng bạn.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
diff --git a/public/content/translations/vi/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/vi/developers/tutorials/erc20-with-safety-rails/index.md
new file mode 100644
index 00000000000..f3c5cf14756
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/erc20-with-safety-rails/index.md
@@ -0,0 +1,217 @@
+---
+title: ERC-20 với các Thanh chắn An toàn
+description: Cách giúp mọi người tránh những sai lầm ngớ ngẩn
+author: Ori Pomerantz
+lang: vi
+tags: [ "erc-20" ]
+skill: beginner
+published: 2022-08-15
+---
+
+## Giới thiệu {#introduction}
+
+Một trong những điều tuyệt vời về Ethereum là không có cơ quan trung ương nào có thể sửa đổi hoặc hoàn tác các giao dịch của bạn. Một trong những vấn đề lớn với Ethereum là không có cơ quan trung ương nào có quyền hoàn tác các sai lầm của người dùng hoặc các giao dịch bất hợp pháp. Trong bài viết này, bạn sẽ tìm hiểu về một số lỗi phổ biến mà người dùng mắc phải với các token [ERC-20](/developers/docs/standards/tokens/erc-20/), cũng như cách tạo hợp đồng ERC-20 giúp người dùng tránh những lỗi đó, hoặc trao cho cơ quan trung ương một số quyền (ví dụ: đóng băng tài khoản).
+
+Lưu ý rằng mặc dù chúng tôi sẽ sử dụng [hợp đồng token ERC-20 của OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20), bài viết này không giải thích chi tiết về nó. Bạn có thể tìm thấy thông tin này [tại đây](/developers/tutorials/erc20-annotated-code).
+
+Nếu bạn muốn xem mã nguồn hoàn chỉnh:
+
+1. Mở [Remix IDE](https://remix.ethereum.org/).
+2. Nhấp vào biểu tượng sao chép github ().
+3. Sao chép kho lưu trữ github `https://github.com/qbzzt/20220815-erc20-safety-rails`.
+4. Mở **contracts > erc20-safety-rails.sol**.
+
+## Tạo hợp đồng ERC-20 {#creating-an-erc-20-contract}
+
+Trước khi có thể thêm chức năng thanh chắn an toàn, chúng ta cần một hợp đồng ERC-20. Trong bài viết này, chúng ta sẽ sử dụng [Trình hướng dẫn Hợp đồng OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/wizard). Mở nó trong một trình duyệt khác và làm theo các hướng dẫn sau:
+
+1. Chọn **ERC20**.
+
+2. Nhập các cài đặt này:
+
+ | Thông số | Giá trị |
+ | ------------------ | ---------------- |
+ | Họ tên | SafetyRailsToken |
+ | Ký hiệu | SAFE |
+ | Đúc sẵn | 1000 |
+ | Tính năng | Không |
+ | Kiểm soát truy cập | Có thể sở hữu |
+ | Khả năng nâng cấp | Không |
+
+3. Cuộn lên và nhấp vào **Mở trong Remix** (đối với Remix) hoặc **Tải xuống** để sử dụng một môi trường khác. Tôi sẽ giả định bạn đang sử dụng Remix, nếu bạn sử dụng thứ khác, chỉ cần thực hiện các thay đổi phù hợp.
+
+4. Bây giờ chúng ta đã có một hợp đồng ERC-20 đầy đủ chức năng. Bạn có thể mở rộng `.deps` > `npm` để xem mã được nhập.
+
+5. Biên dịch, triển khai và thử nghiệm hợp đồng để xem nó hoạt động như một hợp đồng ERC-20. Nếu bạn cần học cách sử dụng Remix, [hãy sử dụng hướng dẫn này](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth).
+
+## Các lỗi thường gặp {#common-mistakes}
+
+### Các sai lầm {#the-mistakes}
+
+Người dùng đôi khi gửi token đến sai địa chỉ. Mặc dù chúng ta không thể đọc được suy nghĩ của họ để biết họ định làm gì, có hai loại lỗi thường xảy ra và dễ phát hiện:
+
+1. Gửi các token đến địa chỉ của chính hợp đồng. Ví dụ, [token OP của Optimism](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) đã tích lũy được [hơn 120.000](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000042) token OP trong vòng chưa đầy hai tháng. Điều này đại diện cho một lượng tài sản đáng kể mà có lẽ mọi người đã mất đi.
+
+2. Gửi các token đến một địa chỉ trống, một địa chỉ không tương ứng với một [tài khoản sở hữu bên ngoài](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) hoặc một [hợp đồng thông minh](/developers/docs/smart-contracts). Mặc dù tôi không có số liệu thống kê về tần suất xảy ra điều này, [một sự cố có thể đã gây thiệt hại 20.000.000 token](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595).
+
+### Ngăn chặn các giao dịch chuyển tiền {#preventing-transfers}
+
+Hợp đồng ERC-20 của OpenZeppelin bao gồm [một hook, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), được gọi trước khi một token được chuyển đi. Theo mặc định, hook này không làm gì cả, nhưng chúng ta có thể gắn chức năng của riêng mình vào nó, chẳng hạn như các kiểm tra sẽ hoàn tác nếu có sự cố.
+
+Để sử dụng hook, hãy thêm hàm này sau hàm khởi tạo:
+
+```solidity
+ function _beforeTokenTransfer(address from, address to, uint256 amount)
+ internal virtual
+ override(ERC20)
+ {
+ super._beforeTokenTransfer(from, to, amount);
+ }
+```
+
+Một số phần của hàm này có thể mới nếu bạn không quen thuộc với Solidity:
+
+```solidity
+ internal virtual
+```
+
+Từ khóa `virtual` có nghĩa là giống như chúng ta đã kế thừa chức năng từ `ERC20` và ghi đè hàm này, các hợp đồng khác có thể kế thừa từ chúng ta và ghi đè hàm này.
+
+```solidity
+ override(ERC20)
+```
+
+Chúng ta phải chỉ định rõ ràng rằng chúng ta đang [ghi đè](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding) định nghĩa token ERC20 của `_beforeTokenTransfer`. Nói chung, từ quan điểm bảo mật, các định nghĩa rõ ràng tốt hơn nhiều so với các định nghĩa ngầm - bạn không thể quên rằng mình đã làm điều gì đó nếu nó ở ngay trước mắt bạn. Đó cũng là lý do chúng ta cần chỉ định `_beforeTokenTransfer` của lớp cha nào mà chúng ta đang ghi đè.
+
+```solidity
+ super._beforeTokenTransfer(from, to, amount);
+```
+
+Dòng này gọi hàm `_beforeTokenTransfer` của hợp đồng hoặc các hợp đồng mà chúng ta đã kế thừa có nó. Trong trường hợp này, đó chỉ là `ERC20`, `Ownable` không có hook này. Mặc dù hiện tại `ERC20._beforeTokenTransfer` không làm gì cả, chúng ta vẫn gọi nó phòng trường hợp chức năng được thêm vào trong tương lai (và sau đó chúng ta quyết định triển khai lại hợp đồng, vì các hợp đồng không thay đổi sau khi triển khai).
+
+### Lập trình các yêu cầu {#coding-the-requirements}
+
+Chúng ta muốn thêm các yêu cầu này vào hàm:
+
+- Địa chỉ `to` không thể bằng `address(this)`, địa chỉ của chính hợp đồng ERC-20.
+- Địa chỉ `to` không được để trống, nó phải là:
+ - Một tài khoản sở hữu bên ngoài (EOA). Chúng ta không thể kiểm tra trực tiếp xem một địa chỉ có phải là EOA hay không, nhưng chúng ta có thể kiểm tra số dư ETH của một địa chỉ. Các EOA hầu như luôn có số dư, ngay cả khi chúng không còn được sử dụng - rất khó để xóa chúng đến wei cuối cùng.
+ - Một hợp đồng thông minh. Việc kiểm tra xem một địa chỉ có phải là hợp đồng thông minh hay không thì khó hơn một chút. Có một opcode kiểm tra độ dài mã bên ngoài, được gọi là [`EXTCODESIZE`](https://www.evm.codes/#3b), nhưng nó không có sẵn trực tiếp trong Solidity. Chúng ta phải sử dụng [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html), là hợp ngữ EVM, cho nó. Có những giá trị khác mà chúng ta có thể sử dụng từ Solidity ([`.code` và `.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), nhưng chúng tốn kém hơn.
+
+Hãy xem qua từng dòng mã mới:
+
+```solidity
+ require(to != address(this), "Không thể gửi token đến địa chỉ hợp đồng");
+```
+
+Đây là yêu cầu đầu tiên, kiểm tra xem `to` và `this(address)` có giống nhau không.
+
+```solidity
+ bool isToContract;
+ assembly {
+ isToContract := gt(extcodesize(to), 0)
+ }
+```
+
+Đây là cách chúng ta kiểm tra xem một địa chỉ có phải là hợp đồng hay không. Chúng ta không thể nhận đầu ra trực tiếp từ Yul, vì vậy thay vào đó, chúng ta xác định một biến để giữ kết quả (`isToContract` trong trường hợp này). Cách Yul hoạt động là mỗi opcode được coi là một hàm. Vì vậy, trước tiên chúng ta gọi [`EXTCODESIZE`](https://www.evm.codes/#3b) để lấy kích thước hợp đồng, sau đó sử dụng [`GT`](https://www.evm.codes/#11) để kiểm tra xem nó có khác không (chúng ta đang xử lý các số nguyên không dấu, vì vậy tất nhiên nó không thể âm). Sau đó, chúng ta ghi kết quả vào `isToContract`.
+
+```solidity
+ require(to.balance != 0 || isToContract, "Không thể gửi token đến một địa chỉ trống");
+```
+
+Và cuối cùng, chúng ta có kiểm tra thực tế cho các địa chỉ trống.
+
+## Quyền truy cập quản trị {#admin-access}
+
+Đôi khi có một quản trị viên có thể hoàn tác các sai lầm là rất hữu ích. Để giảm khả năng lạm dụng, quản trị viên này có thể là một [multisig](https://blog.logrocket.com/security-choices-multi-signature-wallets/) để nhiều người phải đồng ý về một hành động. Trong bài viết này, chúng ta sẽ có hai tính năng quản trị:
+
+1. Đóng băng và gỡ đóng băng các tài khoản. Điều này có thể hữu ích, ví dụ, khi một tài khoản có thể bị xâm phạm.
+2. Dọn dẹp tài sản.
+
+ Đôi khi những kẻ lừa đảo gửi các token gian lận đến hợp đồng của token thật để có được tính hợp pháp. Ví dụ, [xem tại đây](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe?tab=holders). Hợp đồng ERC-20 hợp pháp là [0x4200....0042](https://optimism.blockscout.com/token/0x4200000000000000000000000000000000000042). Trò lừa đảo giả mạo nó là [0x234....bbe](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe).
+
+ Cũng có khả năng mọi người gửi nhầm các token ERC-20 hợp pháp vào hợp đồng của chúng ta, đây là một lý do khác để muốn có cách lấy chúng ra.
+
+OpenZeppelin cung cấp hai cơ chế để cho phép truy cập quản trị:
+
+- Các hợp đồng `Ownable` có một chủ sở hữu duy nhất. Các hàm có [bổ từ](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `onlyOwner` chỉ có thể được gọi bởi chủ sở hữu đó. Chủ sở hữu có thể chuyển quyền sở hữu cho người khác hoặc từ bỏ hoàn toàn. Quyền của tất cả các tài khoản khác thường giống hệt nhau.
+- Các hợp đồng `AccessControl` có [kiểm soát truy cập dựa trên vai trò (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control).
+
+Để đơn giản, trong bài viết này, chúng tôi sử dụng `Ownable`.
+
+### Đóng băng và gỡ đóng băng các hợp đồng {#freezing-and-thawing-contracts}
+
+Việc đóng băng và gỡ đóng băng hợp đồng đòi hỏi một vài thay đổi:
+
+- Một [ánh xạ](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) từ các địa chỉ đến các [giá trị boolean](https://en.wikipedia.org/wiki/Boolean_data_type) để theo dõi các địa chỉ nào bị đóng băng. Tất cả các giá trị ban đầu đều bằng không, đối với các giá trị boolean được hiểu là false. Đây là điều chúng ta muốn vì theo mặc định, các tài khoản không bị đóng băng.
+
+ ```solidity
+ mapping(address => bool) public frozenAccounts;
+ ```
+
+- [Sự kiện](https://www.tutorialspoint.com/solidity/solidity_events.htm) để thông báo cho bất kỳ ai quan tâm khi một tài khoản bị đóng băng hoặc gỡ đóng băng. Về mặt kỹ thuật, các sự kiện không bắt buộc đối với các hành động này, nhưng nó giúp mã ngoài chuỗi có thể lắng nghe các sự kiện này và biết điều gì đang xảy ra. Việc một hợp đồng thông minh phát ra chúng khi có điều gì đó có thể liên quan đến người khác xảy ra được coi là một hành vi lịch sự.
+
+ Các sự kiện được lập chỉ mục để có thể tìm kiếm tất cả các lần một tài khoản đã bị đóng băng hoặc gỡ đóng băng.
+
+ ```solidity
+ // Khi các tài khoản bị đóng băng hoặc gỡ đóng băng
+ event AccountFrozen(address indexed _addr);
+ event AccountThawed(address indexed _addr);
+ ```
+
+- Các hàm để đóng băng và gỡ đóng băng tài khoản. Hai hàm này gần như giống hệt nhau, vì vậy chúng ta sẽ chỉ xem xét hàm đóng băng.
+
+ ```solidity
+ function freezeAccount(address addr)
+ public
+ onlyOwner
+ ```
+
+ Các hàm được đánh dấu [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm) có thể được gọi từ các hợp đồng thông minh khác hoặc trực tiếp bằng một giao dịch.
+
+ ```solidity
+ {
+ require(!frozenAccounts[addr], "Tài khoản đã bị đóng băng");
+ frozenAccounts[addr] = true;
+ emit AccountFrozen(addr);
+ } // freezeAccount
+ ```
+
+ Nếu tài khoản đã bị đóng băng, hãy hoàn tác. Nếu không, hãy đóng băng nó và `emit` một sự kiện.
+
+- Thay đổi `_beforeTokenTransfer` để ngăn tiền được chuyển từ một tài khoản bị đóng băng. Lưu ý rằng tiền vẫn có thể được chuyển vào tài khoản bị đóng băng.
+
+ ```solidity
+ require(!frozenAccounts[from], "Tài khoản bị đóng băng");
+ ```
+
+### Dọn dẹp tài sản {#asset-cleanup}
+
+Để giải phóng các token ERC-20 do hợp đồng này nắm giữ, chúng ta cần gọi một hàm trên hợp đồng token mà chúng thuộc về, hoặc là [`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer) hoặc [`approve`](https://eips.ethereum.org/EIPS/eip-20#approve). Không có lý do gì để lãng phí gas trong trường hợp này cho các khoản được phép chi tiêu, chúng ta cũng có thể chuyển trực tiếp.
+
+```solidity
+ function cleanupERC20(
+ address erc20,
+ address dest
+ )
+ public
+ onlyOwner
+ {
+ IERC20 token = IERC20(erc20);
+```
+
+Đây là cú pháp để tạo một đối tượng cho một hợp đồng khi chúng ta nhận được địa chỉ. Chúng ta có thể làm điều này bởi vì chúng ta có định nghĩa cho các token ERC20 như một phần của mã nguồn (xem dòng 4), và tệp đó bao gồm [định nghĩa cho IERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol), giao diện cho một hợp đồng ERC-20 của OpenZeppelin.
+
+```solidity
+ uint balance = token.balanceOf(address(this));
+ token.transfer(dest, balance);
+ }
+```
+
+Đây là một hàm dọn dẹp, vì vậy có lẽ chúng ta không muốn để lại bất kỳ token nào. Thay vì lấy số dư từ người dùng theo cách thủ công, chúng ta cũng có thể tự động hóa quy trình.
+
+## Kết luận {#conclusion}
+
+Đây không phải là một giải pháp hoàn hảo - không có giải pháp hoàn hảo nào cho vấn đề "người dùng đã mắc lỗi". Tuy nhiên, việc sử dụng các loại kiểm tra này ít nhất có thể ngăn ngừa một số sai lầm. Khả năng đóng băng tài khoản, mặc dù nguy hiểm, có thể được sử dụng để hạn chế thiệt hại của một số vụ tấn công bằng cách từ chối cho hacker số tiền bị đánh cắp.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
diff --git a/public/content/translations/vi/developers/tutorials/ethereum-for-web2-auth/index.md b/public/content/translations/vi/developers/tutorials/ethereum-for-web2-auth/index.md
new file mode 100644
index 00000000000..8b809e3e338
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/ethereum-for-web2-auth/index.md
@@ -0,0 +1,886 @@
+---
+title: Sử dụng Ethereum để xác thực web2
+description: Sau khi đọc hướng dẫn này, nhà phát triển sẽ có thể tích hợp đăng nhập Ethereum (web3) với đăng nhập SAML, một tiêu chuẩn được sử dụng trong web2 để cung cấp đăng nhập một lần và các dịch vụ liên quan khác. Điều này cho phép quyền truy cập vào các tài nguyên web2 được xác thực thông qua chữ ký Ethereum, với các thuộc tính người dùng đến từ các sự chứng thực.
+author: Ori Pomerantz
+tags: [ "web2", "xác thực", "eas" ]
+skill: beginner
+lang: vi
+published: 2025-04-30
+---
+
+## Giới thiệu
+
+[SAML](https://www.onelogin.com/learn/saml) là một tiêu chuẩn được sử dụng trên web2 để cho phép một [nhà cung cấp danh tính (IdP)](https://en.wikipedia.org/wiki/Identity_provider#SAML_identity_provider) cung cấp thông tin người dùng cho [nhà cung cấp dịch vụ (SP)](https://en.wikipedia.org/wiki/Service_provider_\(SAML\)).
+
+Trong hướng dẫn này, bạn sẽ học cách tích hợp chữ ký Ethereum với SAML để cho phép người dùng sử dụng ví Ethereum của họ để tự xác thực với các dịch vụ web2 chưa hỗ trợ Ethereum nguyên bản.
+
+Lưu ý rằng hướng dẫn này được viết cho hai đối tượng riêng biệt:
+
+- Những người Ethereum hiểu về Ethereum và cần học SAML
+- Những người Web2 hiểu về SAML và xác thực web2 và cần học Ethereum
+
+Do đó, nó sẽ chứa rất nhiều tài liệu giới thiệu mà bạn đã biết. Hãy thoải mái bỏ qua nó.
+
+### SAML cho những người Ethereum
+
+SAML là một giao thức tập trung. Một nhà cung cấp dịch vụ (SP) chỉ chấp nhận các xác nhận (chẳng hạn như "đây là người dùng John của tôi, anh ta nên có quyền thực hiện A, B và C") từ một nhà cung cấp danh tính (IdP) nếu nó có mối quan hệ tin cậy từ trước với nó, hoặc với [cơ quan cấp chứng chỉ](https://www.ssl.com/article/what-is-a-certificate-authority-ca/) đã ký chứng chỉ của IdP đó.
+
+Ví dụ, SP có thể là một công ty du lịch cung cấp dịch vụ du lịch cho các công ty, và IdP có thể là một trang web nội bộ của công ty. Khi nhân viên cần đặt chuyến đi công tác, công ty du lịch sẽ gửi họ đến công ty để xác thực trước khi cho phép họ thực sự đặt chuyến đi.
+
+
+
+Đây là cách ba thực thể, trình duyệt, SP và IdP, đàm phán để truy cập. SP không cần biết trước bất cứ điều gì về người dùng đang sử dụng trình duyệt, chỉ cần tin tưởng vào IdP.
+
+### Ethereum cho những người SAML
+
+Ethereum là một hệ thống phi tập trung.
+
+
+
+Người dùng có một khóa riêng tư (thường được giữ trong một tiện ích mở rộng của trình duyệt). Từ khóa riêng tư, bạn có thể lấy ra một khóa công khai, và từ đó ra một địa chỉ 20-byte. Khi người dùng cần đăng nhập vào một hệ thống, họ được yêu cầu ký một thông điệp với một nonce (một giá trị sử dụng một lần). Máy chủ có thể xác minh chữ ký đã được tạo bởi địa chỉ đó.
+
+
+
+Chữ ký chỉ xác minh địa chỉ Ethereum. Để có được các thuộc tính người dùng khác, bạn thường sử dụng [sự chứng thực](https://attest.org/). Một sự chứng thực thường có các trường sau:
+
+- **Người chứng thực**, địa chỉ đã thực hiện sự chứng thực
+- **Người nhận**, địa chỉ mà sự chứng thực áp dụng cho
+- **Dữ liệu**, dữ liệu đang được chứng thực, chẳng hạn như tên, quyền, v.v.
+- **Lược đồ**, ID của lược đồ được sử dụng để diễn giải dữ liệu.
+
+Do bản chất phi tập trung của Ethereum, bất kỳ người dùng nào cũng có thể thực hiện sự chứng thực. Danh tính của người chứng thực rất quan trọng để xác định sự chứng thực nào chúng ta coi là đáng tin cậy.
+
+## Cài đặt
+
+Bước đầu tiên là có một SAML SP và một SAML IdP giao tiếp với nhau.
+
+1. Tải xuống phần mềm. Phần mềm mẫu cho bài viết này có [trên github](https://github.com/qbzzt/250420-saml-ethereum). Các giai đoạn khác nhau được lưu trữ trong các nhánh khác nhau, đối với giai đoạn này bạn muốn `saml-only`
+
+ ```sh
+ git clone https://github.com/qbzzt/250420-saml-ethereum -b saml-only
+ cd 250420-saml-ethereum
+ pnpm install
+ ```
+
+2. Tạo khóa với chứng chỉ tự ký. Điều này có nghĩa là khóa là cơ quan cấp chứng chỉ của chính nó, và cần được nhập thủ công vào nhà cung cấp dịch vụ. Xem [tài liệu OpenSSL](https://docs.openssl.org/master/man1/openssl-req/) để biết thêm thông tin.
+
+ ```sh
+ mkdir keys
+ cd keys
+ openssl req -new -x509 -days 365 -nodes -sha256 -out saml-sp.crt -keyout saml-sp.pem -subj /CN=sp/
+ openssl req -new -x509 -days 365 -nodes -sha256 -out saml-idp.crt -keyout saml-idp.pem -subj /CN=idp/
+ cd ..
+ ```
+
+3. Khởi động các máy chủ (cả SP và IdP)
+
+ ```sh
+ pnpm start
+ ```
+
+4. Duyệt đến SP tại URL [http://localhost:3000/](http://localhost:3000/) và nhấp vào nút để được chuyển hướng đến IdP (cổng 3001).
+
+5. Cung cấp cho IdP địa chỉ email của bạn và nhấp vào **Đăng nhập vào nhà cung cấp dịch vụ**. Xem rằng bạn được chuyển hướng trở lại nhà cung cấp dịch vụ (cổng 3000) và nó biết bạn qua địa chỉ email của bạn.
+
+### Giải thích chi tiết
+
+Đây là những gì xảy ra, từng bước một:
+
+
+
+#### src/config.mts
+
+Tệp này chứa cấu hình cho cả Nhà cung cấp danh tính và Nhà cung cấp dịch vụ. Thông thường hai thực thể này sẽ khác nhau, nhưng ở đây chúng ta có thể chia sẻ mã cho đơn giản.
+
+```typescript
+const fs = await import("fs")
+
+const protocol="http"
+```
+
+Hiện tại chúng ta chỉ đang thử nghiệm, vì vậy sử dụng HTTP là được.
+
+```typescript
+export const spCert = fs.readFileSync("keys/saml-sp.crt").toString()
+export const idpCert = fs.readFileSync("keys/saml-idp.crt").toString()
+```
+
+Đọc các khóa công khai, thường có sẵn cho cả hai thành phần (và hoặc được tin cậy trực tiếp, hoặc được ký bởi một cơ quan cấp chứng chỉ đáng tin cậy).
+
+```typescript
+export const spPort = 3000
+export const spHostname = "localhost"
+export const spDir = "sp"
+
+export const idpPort = 3001
+export const idpHostname = "localhost"
+export const idpDir = "idp"
+
+export const spUrl = `${protocol}://${spHostname}:${spPort}/${spDir}`
+export const idpUrl = `${protocol}://${idpHostname}:${idpPort}/${idpDir}`
+```
+
+Các URL cho cả hai thành phần.
+
+```typescript
+export const spPublicData = {
+```
+
+Dữ liệu công khai cho nhà cung cấp dịch vụ.
+
+```typescript
+ entityID: `${spUrl}/metadata`,
+```
+
+Theo quy ước, trong SAML, `entityID` là URL nơi siêu dữ liệu của thực thể có sẵn. Siêu dữ liệu này tương ứng với dữ liệu công khai ở đây, ngoại trừ nó ở dạng XML.
+
+```typescript
+ wantAssertionsSigned: true,
+ authnRequestsSigned: false,
+ signingCert: spCert,
+ allowCreate: true,
+ assertionConsumerService: [{
+ Binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
+ Location: `${spUrl}/assertion`,
+ }]
+ }
+```
+
+Định nghĩa quan trọng nhất cho mục đích của chúng ta là `assertionConsumerServer`. Nó có nghĩa là để xác nhận một điều gì đó (ví dụ, "người dùng gửi cho bạn thông tin này là somebody@example.com") cho nhà cung cấp dịch vụ, chúng ta cần sử dụng [HTTP POST](https://www.w3schools.com/tags/ref_httpmethods.asp) đến URL `http://localhost:3000/sp/assertion`.
+
+```typescript
+export const idpPublicData = {
+ entityID: `${idpUrl}/metadata`,
+ signingCert: idpCert,
+ wantAuthnRequestsSigned: false,
+ singleSignOnService: [{
+ Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
+ Location: `${idpUrl}/login`
+ }],
+ singleLogoutService: [{
+ Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
+ Location: `${idpUrl}/logout`
+ }],
+ }
+```
+
+Dữ liệu công khai cho nhà cung cấp danh tính là tương tự. Nó chỉ định rằng để đăng nhập một người dùng, bạn POST đến `http://localhost:3001/idp/login` và để đăng xuất một người dùng, bạn POST đến `http://localhost:3001/idp/logout`.
+
+#### src/sp.mts
+
+Đây là mã triển khai một nhà cung cấp dịch vụ.
+
+```typescript
+import * as config from "./config.mts"
+const fs = await import("fs")
+const saml = await import("samlify")
+```
+
+Chúng tôi sử dụng thư viện [`samlify`](https://www.npmjs.com/package/samlify) để triển khai SAML.
+
+```typescript
+import * as validator from "@authenio/samlify-node-xmllint"
+saml.setSchemaValidator(validator)
+```
+
+Thư viện `samlify` mong đợi có một gói xác thực rằng XML là chính xác, được ký bằng khóa công khai dự kiến, v.v. Chúng tôi sử dụng [`@authenio/samlify-node-xmllint`](https://www.npmjs.com/package/@authenio/samlify-node-xmllint) cho mục đích này.
+
+```typescript
+const express = (await import("express")).default
+const spRouter = express.Router()
+const app = express()
+```
+
+Một [`express`](https://expressjs.com/) [`Router`](https://expressjs.com/en/5x/api.html#router) là một "trang web nhỏ" có thể được gắn bên trong một trang web. Trong trường hợp này, chúng tôi sử dụng nó để nhóm tất cả các định nghĩa nhà cung cấp dịch vụ lại với nhau.
+
+```typescript
+const spPrivateKey = fs.readFileSync("keys/saml-sp.pem").toString()
+
+const sp = saml.ServiceProvider({
+ privateKey: spPrivateKey,
+ ...config.spPublicData
+})
+```
+
+Đại diện của chính nhà cung cấp dịch vụ là tất cả dữ liệu công khai, và khóa riêng tư mà nó sử dụng để ký thông tin.
+
+```typescript
+const idp = saml.IdentityProvider(config.idpPublicData);
+```
+
+Dữ liệu công khai chứa mọi thứ mà nhà cung cấp dịch vụ cần biết về nhà cung cấp danh tính.
+
+```typescript
+spRouter.get(`/metadata`,
+ (req, res) => res.header("Content-Type", "text/xml").send(sp.getMetadata())
+)
+```
+
+Để cho phép khả năng tương tác với các thành phần SAML khác, các nhà cung cấp dịch vụ và danh tính nên có dữ liệu công khai của họ (được gọi là siêu dữ liệu) có sẵn ở định dạng XML trong `/metadata`.
+
+```typescript
+spRouter.post(`/assertion`,
+```
+
+Đây là trang được trình duyệt truy cập để tự nhận dạng. Xác nhận bao gồm mã định danh người dùng (ở đây chúng tôi sử dụng địa chỉ email), và có thể bao gồm các thuộc tính bổ sung. Đây là trình xử lý cho bước 7 trong sơ đồ tuần tự ở trên.
+
+```typescript
+ async (req, res) => {
+ // console.log(`SAML response:\n${Buffer.from(req.body.SAMLResponse, 'base64').toString('utf-8')}`)
+```
+
+Bạn có thể sử dụng lệnh đã được chú thích để xem dữ liệu XML được cung cấp trong xác nhận. Nó được [mã hóa base64](https://en.wikipedia.org/wiki/Base64).
+
+```typescript
+ try {
+ const loginResponse = await sp.parseLoginResponse(idp, 'post', req);
+```
+
+Phân tích cú pháp yêu cầu đăng nhập từ máy chủ danh tính.
+
+```typescript
+ res.send(`
+
+
+ Hello ${loginResponse.extract.nameID}
+
+
+ `)
+ res.send();
+```
+
+Gửi một phản hồi HTML, chỉ để cho người dùng thấy chúng ta đã nhận được đăng nhập.
+
+```typescript
+ } catch (err) {
+ console.error('Error processing SAML response:', err);
+ res.status(400).send('SAML authentication failed');
+ }
+ }
+)
+```
+
+Thông báo cho người dùng trong trường hợp thất bại.
+
+```typescript
+spRouter.get('/login',
+```
+
+Tạo một yêu cầu đăng nhập khi trình duyệt cố gắng lấy trang này. Đây là trình xử lý cho bước 1 trong sơ đồ tuần tự ở trên.
+
+```typescript
+ async (req, res) => {
+ const loginRequest = await sp.createLoginRequest(idp, "post")
+```
+
+Lấy thông tin để đăng một yêu cầu đăng nhập.
+
+```typescript
+ res.send(`
+
+
+
+```
+
+Trang này tự động gửi biểu mẫu (xem bên dưới). Bằng cách này, người dùng không phải làm gì để được chuyển hướng. Đây là bước 2 trong sơ đồ tuần tự ở trên.
+
+```typescript
+
+
+
+ `)
+ }
+)
+
+app.use(express.urlencoded({extended: true}))
+```
+
+[Phần mềm trung gian này](https://expressjs.com/en/5x/api.html#express.urlencoded) đọc phần thân của [yêu cầu HTTP](https://www.tutorialspoint.com/http/http_requests.htm). Theo mặc định, express bỏ qua nó, vì hầu hết các yêu cầu không cần nó. Chúng ta cần nó vì POST có sử dụng phần thân.
+
+```typescript
+app.use(`/${config.spDir}`, spRouter)
+```
+
+Gắn bộ định tuyến trong thư mục nhà cung cấp dịch vụ (`/sp`).
+
+```typescript
+app.get("/", (req, res) => {
+ res.send(`
+
+
+
+
+
+ `)
+})
+```
+
+Nếu một trình duyệt cố gắng lấy thư mục gốc, hãy cung cấp cho nó một liên kết đến trang đăng nhập.
+
+```typescript
+app.listen(config.spPort, () => {
+ console.log(`service provider is running on http://${config.spHostname}:${config.spPort}`)
+})
+```
+
+Lắng nghe `spPort` với ứng dụng express này.
+
+#### src/idp.mts
+
+Đây là nhà cung cấp danh tính. Nó rất tương tự với nhà cung cấp dịch vụ, các giải thích dưới đây dành cho các phần khác nhau.
+
+```typescript
+const xmlParser = new (await import("fast-xml-parser")).XMLParser(
+ {
+ ignoreAttributes: false, // Preserve attributes
+ attributeNamePrefix: "@_", // Prefix for attributes
+ }
+)
+```
+
+Chúng ta cần đọc và hiểu yêu cầu XML mà chúng ta nhận được từ nhà cung cấp dịch vụ.
+
+```typescript
+const getLoginPage = requestId => `
+```
+
+Hàm này tạo ra trang với biểu mẫu tự động gửi được trả về trong bước 4 của sơ đồ tuần tự ở trên.
+
+```typescript
+
+
+ Trang đăng nhập
+
+
+ Trang đăng nhập
+
+
+
+
+const idpRouter = express.Router()
+
+idpRouter.post("/loginSubmitted", async (req, res) => {
+ const loginResponse = await idp.createLoginResponse(
+```
+
+Đây là trình xử lý cho bước 5 trong sơ đồ tuần tự ở trên. [`idp.createLoginResponse`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L73-L125) tạo phản hồi đăng nhập.
+
+```typescript
+ sp,
+ {
+ authnContextClassRef: 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport',
+ audience: sp.entityID,
+```
+
+Đối tượng là nhà cung cấp dịch vụ.
+
+```typescript
+ extract: {
+ request: {
+ id: req.body.requestId
+ }
+ },
+```
+
+Thông tin được trích xuất từ yêu cầu. Tham số duy nhất mà chúng ta quan tâm trong yêu cầu là requestId, cho phép nhà cung cấp dịch vụ khớp các yêu cầu và phản hồi của chúng.
+
+```typescript
+ signingKey: { privateKey: idpPrivateKey, publicKey: config.idpCert } // Ensure signing
+```
+
+Chúng ta cần `signingKey` để có dữ liệu ký phản hồi. Nhà cung cấp dịch vụ không tin tưởng các yêu cầu không được ký.
+
+```typescript
+ },
+ "post",
+ {
+ email: req.body.email
+```
+
+Đây là trường chứa thông tin người dùng mà chúng tôi gửi lại cho nhà cung cấp dịch vụ.
+
+```typescript
+ }
+ );
+
+ res.send(`
+
+
+
+
+
+
+
+ `)
+})
+```
+
+Một lần nữa, sử dụng một biểu mẫu tự động gửi. Đây là bước 6 trong sơ đồ tuần tự ở trên.
+
+```typescript
+
+// IdP endpoint for login requests
+idpRouter.post(`/login`,
+```
+
+Đây là điểm cuối nhận yêu cầu đăng nhập từ nhà cung cấp dịch vụ. Đây là trình xử lý cho bước 3 của sơ đồ tuần tự ở trên.
+
+```typescript
+ async (req, res) => {
+ try {
+ // Workaround because I couldn't get parseLoginRequest to work.
+ // const loginRequest = await idp.parseLoginRequest(sp, 'post', req)
+ const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8'))
+ res.send(getLoginPage(samlRequest["samlp:AuthnRequest"]["@_ID"]))
+```
+
+Chúng ta nên có thể sử dụng [`idp.parseLoginRequest`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L127-L144) để đọc ID của yêu cầu xác thực. Tuy nhiên, tôi không thể làm cho nó hoạt động và không đáng để dành nhiều thời gian cho nó nên tôi chỉ sử dụng một [trình phân tích cú pháp XML đa năng](https://www.npmjs.com/package/fast-xml-parser). Thông tin chúng ta cần là thuộc tính `ID` bên trong thẻ ``, nằm ở cấp cao nhất của XML.
+
+## Sử dụng chữ ký Ethereum
+
+Bây giờ chúng ta có thể gửi danh tính người dùng đến nhà cung cấp dịch vụ, bước tiếp theo là lấy danh tính người dùng một cách đáng tin cậy. Viem cho phép chúng ta chỉ cần yêu cầu ví cung cấp địa chỉ người dùng, nhưng điều này có nghĩa là yêu cầu trình duyệt cung cấp thông tin. Chúng ta không kiểm soát trình duyệt, vì vậy chúng ta không thể tự động tin tưởng vào phản hồi mà chúng ta nhận được từ nó.
+
+Thay vào đó, IdP sẽ gửi cho trình duyệt một chuỗi để ký. Nếu ví trong trình duyệt ký chuỗi này, điều đó có nghĩa là nó thực sự là địa chỉ đó (tức là, nó biết khóa riêng tư tương ứng với địa chỉ đó).
+
+Để thấy điều này hoạt động, hãy dừng IdP và SP hiện có và chạy các lệnh sau:
+
+```sh
+git checkout eth-signatures
+pnpm install
+pnpm start
+```
+
+Sau đó duyệt đến [SP](http://localhost:3000) và làm theo hướng dẫn.
+
+Lưu ý rằng tại thời điểm này, chúng tôi không biết cách lấy địa chỉ email từ địa chỉ Ethereum, vì vậy thay vào đó, chúng tôi báo cáo `<địa chỉ ethereum>@bad.email.address` cho SP.
+
+### Giải thích chi tiết
+
+Những thay đổi nằm ở bước 4-5 trong sơ đồ trước.
+
+
+
+Tệp duy nhất chúng tôi đã thay đổi là `idp.mts`. Đây là các phần đã thay đổi.
+
+```typescript
+import { v4 as uuidv4 } from 'uuid'
+import { verifyMessage } from 'viem'
+```
+
+Chúng ta cần hai thư viện bổ sung này. Chúng tôi sử dụng [`uuid`](https://www.npmjs.com/package/uuid) để tạo giá trị [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce). Giá trị của chính nó không quan trọng, chỉ có điều nó chỉ được sử dụng một lần.
+
+Thư viện [`viem`](https://viem.sh/) cho phép chúng tôi sử dụng các định nghĩa Ethereum. Ở đây chúng tôi cần nó để xác minh rằng chữ ký thực sự hợp lệ.
+
+```typescript
+const loginPrompt = "To access the service provider, sign this nonce: "
+```
+
+Ví yêu cầu người dùng cho phép ký thông điệp. Một thông điệp chỉ là một nonce có thể gây nhầm lẫn cho người dùng, vì vậy chúng tôi bao gồm lời nhắc này.
+
+```typescript
+// Keep requestIDs here
+let nonces = {}
+```
+
+Chúng tôi cần thông tin yêu cầu để có thể phản hồi nó. Chúng tôi có thể gửi nó cùng với yêu cầu (bước 4), và nhận lại nó (bước 5). Tuy nhiên, chúng tôi không thể tin tưởng thông tin chúng tôi nhận được từ trình duyệt, vốn nằm dưới sự kiểm soát của một người dùng có thể có ý đồ xấu. Vì vậy, tốt hơn là lưu trữ nó ở đây, với nonce làm khóa.
+
+Lưu ý rằng chúng tôi đang thực hiện ở đây như một biến để đơn giản. Tuy nhiên, điều này có một số nhược điểm:
+
+- Chúng ta dễ bị tấn công từ chối dịch vụ. Một người dùng độc hại có thể cố gắng đăng nhập nhiều lần, làm đầy bộ nhớ của chúng ta.
+- Nếu quy trình IdP cần được khởi động lại, chúng ta sẽ mất các giá trị hiện có.
+- Chúng tôi không thể cân bằng tải trên nhiều quy trình, bởi vì mỗi quy trình sẽ có biến riêng.
+
+Trên một hệ thống sản xuất, chúng tôi sẽ sử dụng cơ sở dữ liệu và triển khai một loại cơ chế hết hạn nào đó.
+
+```typescript
+const getSignaturePage = requestId => {
+ const nonce = uuidv4()
+ nonces[nonce] = requestId
+```
+
+Tạo một nonce, và lưu trữ `requestId` để sử dụng trong tương lai.
+
+```typescript
+ return `
+
+
+
+
+
+ Please sign
+
+
+
+
+
+`
+}
+```
+
+Phần còn lại chỉ là HTML tiêu chuẩn.
+
+```typescript
+idpRouter.get("/signature/:nonce/:account/:signature", async (req, res) => {
+```
+
+Đây là trình xử lý cho bước 5 trong sơ đồ tuần tự.
+
+```typescript
+ const requestId = nonces[req.params.nonce]
+ if (requestId === undefined) {
+ res.send("Bad nonce")
+ return ;
+ }
+
+ nonces[req.params.nonce] = undefined
+```
+
+Lấy ID yêu cầu và xóa nonce khỏi `nonces` để đảm bảo nó không thể được sử dụng lại.
+
+```typescript
+ try {
+```
+
+Bởi vì có rất nhiều cách mà chữ ký có thể không hợp lệ, chúng tôi bao bọc điều này trong một `try ... khối `catch\` để bắt bất kỳ lỗi nào được ném ra.
+
+```typescript
+ const validSignature = await verifyMessage({
+ address: req.params.account,
+ message: `${loginPrompt}${req.params.nonce}`,
+ signature: req.params.signature
+ })
+```
+
+Sử dụng [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage#verifymessage) để triển khai bước 5.5 trong sơ đồ tuần tự.
+
+```typescript
+ if (!validSignature)
+ throw("Bad signature")
+ } catch (err) {
+ res.send("Error:" + err)
+ return ;
+ }
+```
+
+Phần còn lại của trình xử lý tương đương với những gì chúng ta đã làm trong trình xử lý `/loginSubmitted` trước đó, ngoại trừ một thay đổi nhỏ.
+
+```typescript
+ const loginResponse = await idp.createLoginResponse(
+ .
+ .
+ .
+ {
+ email: req.params.account + "@bad.email.address"
+ }
+ );
+```
+
+Chúng tôi không có địa chỉ email thực tế (chúng tôi sẽ lấy nó trong phần tiếp theo), vì vậy hiện tại chúng tôi trả về địa chỉ Ethereum và đánh dấu rõ ràng nó không phải là địa chỉ email.
+
+```typescript
+// IdP endpoint for login requests
+idpRouter.post(`/login`,
+ async (req, res) => {
+ try {
+ // Workaround because I couldn't get parseLoginRequest to work.
+ // const loginRequest = await idp.parseLoginRequest(sp, 'post', req)
+ const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8'))
+ res.send(getSignaturePage(samlRequest["samlp:AuthnRequest"]["@_ID"]))
+ } catch (err) {
+ console.error('Error processing SAML response:', err);
+ res.status(400).send('SAML authentication failed');
+ }
+ }
+)
+```
+
+Thay vì `getLoginPage`, bây giờ sử dụng `getSignaturePage` trong trình xử lý bước 3.
+
+## Lấy địa chỉ email
+
+Bước tiếp theo là lấy địa chỉ email, mã định danh được yêu cầu bởi nhà cung cấp dịch vụ. Để làm điều đó, chúng tôi sử dụng [Dịch vụ Chứng thực Ethereum (EAS)](https://attest.org/).
+
+Cách dễ nhất để có được sự chứng thực là sử dụng [API GraphQL](https://docs.attest.org/docs/developer-tools/api). Chúng tôi sử dụng truy vấn này:
+
+```
+query GetAttestationsByRecipient {
+ attestations(
+ where: {
+ recipient: { equals: "${getAddress(ethAddr)}" }
+ schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" }
+ }
+ take: 1
+ ) {
+ data
+ id
+ attester
+ }
+}
+```
+
+[`schemaId`](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977) này chỉ bao gồm một địa chỉ e-mail. Truy vấn này yêu cầu các sự chứng thực của lược đồ này. Chủ thể của sự chứng thực được gọi là `recipient`. Nó luôn là một địa chỉ Ethereum.
+
+Cảnh báo: Cách chúng tôi lấy sự chứng thực ở đây có hai vấn đề bảo mật.
+
+- Chúng tôi đang đi đến điểm cuối API, `https://optimism.easscan.org/graphql`, là một thành phần tập trung. Chúng ta có thể lấy thuộc tính `id` và sau đó thực hiện một tra cứu trên chuỗi để xác minh rằng một sự chứng thực là thật, nhưng điểm cuối API vẫn có thể kiểm duyệt các sự chứng thực bằng cách không cho chúng ta biết về chúng.
+
+ Vấn đề này không phải là không thể giải quyết, chúng tôi có thể chạy điểm cuối GraphQL của riêng mình và lấy sự chứng thực từ nhật ký chuỗi, nhưng điều đó là quá mức cần thiết cho mục đích của chúng tôi.
+
+- Chúng tôi không xem xét danh tính của người chứng thực. Bất cứ ai cũng có thể cung cấp cho chúng tôi thông tin sai lệch. Trong một triển khai thực tế, chúng tôi sẽ có một tập hợp các người chứng thực đáng tin cậy và chỉ xem xét sự chứng thực của họ.
+
+Để thấy điều này hoạt động, hãy dừng IdP và SP hiện có và chạy các lệnh sau:
+
+```sh
+git checkout email-address
+pnpm install
+pnpm start
+```
+
+Sau đó, cung cấp địa chỉ e-mail của bạn. Bạn có hai cách để làm điều đó:
+
+- Nhập một ví bằng cách sử dụng một khóa riêng tư, và sử dụng khóa riêng tư thử nghiệm `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80`.
+
+- Thêm một sự chứng thực cho địa chỉ e-mail của riêng bạn:
+
+ 1. Duyệt đến [lược đồ trong trình khám phá sự chứng thực](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977).
+
+ 2. Nhấp vào **Chứng thực với Lược đồ**.
+
+ 3. Nhập địa chỉ Ethereum của bạn làm người nhận, địa chỉ e-mail của bạn làm địa chỉ email và chọn **Trên chuỗi**. Sau đó nhấp vào **Thực hiện Chứng thực**.
+
+ 4. Phê duyệt giao dịch trong ví của bạn. Bạn sẽ cần một ít ETH trên [Chuỗi khối Optimism](https://app.optimism.io/bridge/deposit) để trả gas.
+
+Dù bằng cách nào, sau khi bạn làm điều này, hãy duyệt đến [http://localhost:3000](http://localhost:3000) và làm theo hướng dẫn. Nếu bạn đã nhập khóa riêng tư thử nghiệm, e-mail bạn nhận được là `test_addr_0@example.com`. Nếu bạn đã sử dụng địa chỉ của riêng mình, nó phải là bất cứ điều gì bạn đã chứng thực.
+
+### Giải thích chi tiết
+
+
+
+Các bước mới là giao tiếp GraphQL, bước 5.6 và 5.7.
+
+Một lần nữa, đây là các phần đã thay đổi của `idp.mts`.
+
+```typescript
+import { GraphQLClient } from 'graphql-request'
+import { SchemaEncoder } from '@ethereum-attestation-service/eas-sdk'
+```
+
+Nhập các thư viện chúng ta cần.
+
+```typescript
+const graphqlEndpointUrl = "https://optimism.easscan.org/graphql"
+```
+
+Có [một điểm cuối riêng cho mỗi chuỗi khối](https://docs.attest.org/docs/developer-tools/api).
+
+```typescript
+const graphqlClient = new GraphQLClient(graphqlEndpointUrl, { fetch })
+```
+
+Tạo một ứng dụng `GraphQLClient` mới mà chúng ta có thể sử dụng để truy vấn điểm cuối.
+
+```typescript
+const graphqlSchema = 'string emailAddress'
+const graphqlEncoder = new SchemaEncoder(graphqlSchema)
+```
+
+GraphQL chỉ cung cấp cho chúng ta một đối tượng dữ liệu mờ với các byte. Để hiểu nó, chúng ta cần lược đồ.
+
+```typescript
+const ethereumAddressToEmail = async ethAddr => {
+```
+
+Một hàm để lấy từ địa chỉ Ethereum sang địa chỉ e-mail.
+
+```typescript
+ const query = `
+ query GetAttestationsByRecipient {
+```
+
+Đây là một truy vấn GraphQL.
+
+```typescript
+ attestations(
+```
+
+Chúng tôi đang tìm kiếm các sự chứng thực.
+
+```typescript
+ where: {
+ recipient: { equals: "${getAddress(ethAddr)}" }
+ schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" }
+ }
+```
+
+Các sự chứng thực chúng tôi muốn là những sự chứng thực trong lược đồ của chúng tôi, nơi người nhận là `getAddress(ethAddr)`. Hàm [`getAddress`](https://viem.sh/docs/utilities/getAddress#getaddress) đảm bảo địa chỉ của chúng tôi có [tổng kiểm tra](https://github.com/ethereum/ercs/blob/master/ERCS/erc-55.md) chính xác. Điều này là cần thiết về GraphQL là phân biệt chữ hoa chữ thường. "0xBAD060A7", "0xBad060A7", và "0xbad060a7" là các giá trị khác nhau.
+
+```typescript
+ take: 1
+```
+
+Bất kể chúng tôi tìm thấy bao nhiêu sự chứng thực, chúng tôi chỉ muốn cái đầu tiên.
+
+```typescript
+ ) {
+ data
+ id
+ attester
+ }
+ }`
+```
+
+Các trường chúng tôi muốn nhận.
+
+- `attester`: Địa chỉ đã gửi sự chứng thực. Thông thường, điều này được sử dụng để quyết định có tin tưởng sự chứng thực hay không.
+- `id`: ID sự chứng thực. Bạn có thể sử dụng giá trị này để [đọc sự chứng thực trên chuỗi](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000021?tab=read_proxy&source_address=0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088#0xa3112a64) để xác minh rằng thông tin từ truy vấn GraphQL là chính xác.
+- `data`: Dữ liệu lược đồ (trong trường hợp này là địa chỉ e-mail).
+
+```typescript
+ const queryResult = await graphqlClient.request(query)
+
+ if (queryResult.attestations.length == 0)
+ return "no_address@available.is"
+```
+
+Nếu không có sự chứng thực nào, hãy trả về một giá trị rõ ràng là không chính xác, nhưng sẽ có vẻ hợp lệ đối với nhà cung cấp dịch vụ.
+
+```typescript
+ const attestationDataFields = graphqlEncoder.decodeData(queryResult.attestations[0].data)
+ return attestationDataFields[0].value.value
+}
+```
+
+Nếu có giá trị, hãy sử dụng `decodeData` để giải mã dữ liệu. Chúng tôi không cần siêu dữ liệu mà nó cung cấp, chỉ cần chính giá trị.
+
+```typescript
+ const loginResponse = await idp.createLoginResponse(
+ sp,
+ {
+ .
+ .
+ .
+ },
+ "post",
+ {
+ email: await ethereumAddressToEmail(req.params.account)
+ }
+ );
+```
+
+Sử dụng hàm mới để lấy địa chỉ e-mail.
+
+## Thế còn tính phi tập trung thì sao?
+
+Trong cấu hình này, người dùng không thể giả vờ là người mà họ không phải, miễn là chúng tôi dựa vào những người chứng thực đáng tin cậy cho việc ánh xạ địa chỉ Ethereum sang địa chỉ e-mail. Tuy nhiên, nhà cung cấp danh tính của chúng tôi vẫn là một thành phần tập trung. Bất cứ ai có khóa riêng tư của nhà cung cấp danh tính đều có thể gửi thông tin sai lệch cho nhà cung cấp dịch vụ.
+
+Có thể có một giải pháp sử dụng [tính toán đa bên (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation). Tôi hy vọng sẽ viết về nó trong một hướng dẫn trong tương lai.
+
+## Kết luận
+
+Việc áp dụng một tiêu chuẩn đăng nhập, chẳng hạn như chữ ký Ethereum, phải đối mặt với vấn đề con gà và quả trứng. Các nhà cung cấp dịch vụ muốn thu hút thị trường rộng lớn nhất có thể. Người dùng muốn có thể truy cập các dịch vụ mà không cần phải lo lắng về việc hỗ trợ tiêu chuẩn đăng nhập của họ.
+Việc tạo các bộ điều hợp, chẳng hạn như một IdP Ethereum, có thể giúp chúng ta vượt qua trở ngại này.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
diff --git a/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
new file mode 100644
index 00000000000..2180bd1f758
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
@@ -0,0 +1,156 @@
+---
+title: Bắt đầu phát triển Ethereum
+description: "Đây là hướng dẫn cho người mới bắt đầu phát triển Ethereum. Chúng tôi sẽ hướng dẫn bạn từ việc tạo điểm cuối Giao diện Lập trình Ứng dụng, đến việc thực hiện yêu cầu dòng lệnh, đến việc viết tập lệnh web3 đầu tiên của bạn! Không yêu cầu kinh nghiệm phát triển chuỗi khối!"
+author: "Elan Halpern"
+tags:
+ [
+ "javascript",
+ "ethers.js",
+ "nút",
+ "truy vấn",
+ "từ Alchemy"
+ ]
+skill: beginner
+lang: vi
+published: 2020-10-30
+source: Trung bình
+sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f
+---
+
+
+
+Đây là hướng dẫn cho người mới bắt đầu phát triển Ethereum. Trong hướng dẫn này, chúng tôi sẽ sử dụng [Alchemy](https://alchemyapi.io/), nền tảng phát triển chuỗi khối hàng đầu cung cấp năng lượng cho hàng triệu người dùng từ 70% các ứng dụng chuỗi khối hàng đầu, bao gồm Maker, 0x, MyEtherWallet, Dharma và Kyber. Alchemy sẽ cấp cho chúng tôi quyền truy cập vào điểm cuối Giao diện Lập trình Ứng dụng trên chuỗi Ethereum để chúng tôi có thể đọc và ghi giao dịch.
+
+Chúng tôi sẽ hướng dẫn bạn từ việc đăng ký với Alchemy đến việc viết tập lệnh web3 đầu tiên của bạn! Không yêu cầu kinh nghiệm phát triển chuỗi khối!
+
+## 1. Đăng ký Tài khoản Alchemy Miễn phí {#sign-up-for-a-free-alchemy-account}
+
+Việc tạo một tài khoản với Alchemy rất dễ dàng, [đăng ký miễn phí tại đây](https://auth.alchemy.com/).
+
+## 2. Tạo một Ứng dụng Alchemy {#create-an-alchemy-app}
+
+Để giao tiếp với chuỗi Ethereum và sử dụng các sản phẩm của Alchemy, bạn cần có khóa Giao diện Lập trình Ứng dụng để xác thực các yêu cầu của mình.
+
+Bạn có thể [tạo khóa Giao diện Lập trình Ứng dụng từ bảng điều khiển](https://dashboard.alchemy.com/). Để tạo một khóa mới, hãy điều hướng đến “Tạo ứng dụng” như được hiển thị bên dưới:
+
+Đặc biệt cảm ơn [_ShapeShift_](https://shapeshift.com/) _vì đã cho chúng tôi hiển thị bảng điều khiển của họ!_
+
+
+
+Điền vào các chi tiết bên dưới “Tạo ứng dụng” để nhận khóa mới của bạn. Bạn cũng có thể xem các ứng dụng bạn đã tạo trước đây và những ứng dụng do nhóm của bạn tạo ở đây. Lấy các khóa hiện có bằng cách nhấp vào “Xem khóa” cho bất kỳ ứng dụng nào.
+
+
+
+Bạn cũng có thể lấy các khóa Giao diện Lập trình Ứng dụng hiện có bằng cách di chuột qua “Ứng dụng” và chọn một khóa. Bạn có thể “Xem khóa” ở đây, cũng như “Chỉnh sửa ứng dụng” để đưa vào danh sách trắng các miền cụ thể, xem một số công cụ dành cho nhà phát triển và xem các phân tích.
+
+
+
+## 3. Thực hiện yêu cầu từ dòng lệnh {#make-a-request-from-the-command-line}
+
+Tương tác với chuỗi khối Ethereum thông qua Alchemy bằng JSON-RPC và curl.
+
+Đối với các yêu cầu thủ công, chúng tôi khuyên bạn nên tương tác với `JSON-RPC` thông qua các yêu cầu `POST`. Chỉ cần chuyển vào tiêu đề `Content-Type: application/json` và truy vấn của bạn dưới dạng nội dung `POST` với các trường sau:
+
+- `jsonrpc`: Phiên bản JSON-RPC—hiện tại, chỉ `2.0` được hỗ trợ.
+- `method`: Phương thức Giao diện Lập trình Ứng dụng ETH. [Xem tham chiếu Giao diện Lập trình Ứng dụng.](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc)
+- `params`: Một danh sách các tham số để chuyển đến phương thức.
+- `id`: ID của yêu cầu của bạn. Sẽ được trả về bởi phản hồi để bạn có thể theo dõi xem phản hồi thuộc về yêu cầu nào.
+
+Đây là một ví dụ bạn có thể chạy từ dòng lệnh để lấy giá gas hiện tại:
+
+```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}'
+```
+
+_**LƯU Ý:** Thay thế [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo) bằng khóa Giao diện Lập trình Ứng dụng của riêng bạn `https://eth-mainnet.alchemyapi.io/v2/**your-api-key`._
+
+**Kết quả:**
+
+```json
+{ "id": 73,"jsonrpc": "2.0","result": "0x09184e72a000" // 10000000000000 }
+```
+
+## 4. Thiết lập ứng dụng khách Web3 của bạn {#set-up-your-web3-client}
+
+**Nếu bạn có một ứng dụng khách hiện có,** hãy thay đổi URL nhà cung cấp nút hiện tại của bạn thành URL của Alchemy với khóa Giao diện Lập trình Ứng dụng của bạn: `“https://eth-mainnet.alchemyapi.io/v2/your-api-key\"`
+
+**_LƯU Ý:_** Các tập lệnh bên dưới cần được chạy trong **ngữ cảnh nút** hoặc **được lưu trong một tệp**, không phải chạy từ dòng lệnh. Nếu bạn chưa cài đặt Node hoặc npm, hãy xem [hướng dẫn thiết lập nhanh cho máy Mac] này(https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs).
+
+Có rất nhiều [thư viện Web3](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) mà bạn có thể tích hợp với Alchemy, tuy nhiên, chúng tôi khuyên bạn nên sử dụng [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), một trình thay thế cho web3.js, được xây dựng và định cấu hình để hoạt động liền mạch với Alchemy. Điều này cung cấp nhiều lợi thế như tự động thử lại và hỗ trợ WebSocket mạnh mẽ.
+
+Để cài đặt AlchemyWeb3.js, **điều hướng đến thư mục dự án của bạn** và chạy:
+
+**Với Yarn:**
+
+```
+yarn add @alch/alchemy-web3
+```
+
+**Với NPM:**
+
+```
+npm install @alch/alchemy-web3
+```
+
+Để tương tác với cơ sở hạ tầng nút của Alchemy, hãy chạy trong NodeJS hoặc thêm phần này vào tệp JavaScript:
+
+```js
+const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
+const web3 = createAlchemyWeb3(
+ "https://eth-mainnet.alchemyapi.io/v2/your-api-key"
+)
+```
+
+## 5. Viết tập lệnh Web3 đầu tiên của bạn! {#write-your-first-web3-script}
+
+Bây giờ để thực hành với một chút lập trình web3, chúng ta sẽ viết một tập lệnh đơn giản in ra số khối mới nhất từ Mạng chính Ethereum.
+
+**1. Nếu bạn chưa có, trong thiết bị đầu cuối của bạn, hãy tạo một thư mục dự án mới và cd vào đó:**
+
+```
+mkdir web3-example
+cd web3-example
+```
+
+**2. Cài đặt phần phụ thuộc Alchemy web3 (hoặc bất kỳ web3 nào) vào dự án của bạn nếu bạn chưa cài đặt:**
+
+```
+npm install @alch/alchemy-web3
+```
+
+**3. Tạo một tệp có tên `index.js` và thêm nội dung sau:**
+
+> Cuối cùng, bạn nên thay thế `demo` bằng khóa Giao diện Lập trình Ứng dụng HTTP Alchemy của mình.
+
+```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("Số khối mới nhất là " + blockNumber)
+}
+main()
+```
+
+Bạn không quen thuộc với async? Hãy xem [bài đăng trên Medium] này(https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c).
+
+**4. Chạy nó trong thiết bị đầu cuối của bạn bằng cách sử dụng node**
+
+```
+node index.js
+```
+
+**5. Bây giờ bạn sẽ thấy số khối mới nhất được xuất ra trong bảng điều khiển của mình!**
+
+```
+Số khối mới nhất là 11043912
+```
+
+**Tuyệt vời!** Xin chúc mừng! Bạn vừa viết tập lệnh web3 đầu tiên của mình bằng Alchemy 🎉\*\*
+
+Bạn không chắc phải làm gì tiếp theo? Hãy thử triển khai hợp đồng thông minh đầu tiên của bạn và thực hành với một số lập trình solidity trong [Hướng dẫn Hợp đồng thông minh Hello World] của chúng tôi(https://www.alchemy.com/docs/hello-world-smart-contract), hoặc kiểm tra kiến thức về bảng điều khiển của bạn với [Ứng dụng demo bảng điều khiển](https://docs.alchemyapi.io/tutorials/demo-app)!
+
+_[Đăng ký với Alchemy miễn phí](https://auth.alchemy.com/), xem [tài liệu tham khảo] của chúng tôi(https://www.alchemy.com/docs/), và để biết tin tức mới nhất, hãy theo dõi chúng tôi trên [Twitter](https://twitter.com/AlchemyPlatform)_.
diff --git a/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md
new file mode 100644
index 00000000000..4cfb16375f3
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md
@@ -0,0 +1,102 @@
+---
+title: Hướng dẫn về các công cụ bảo mật hợp đồng thông minh
+description: Tổng quan về ba kỹ thuật kiểm thử và phân tích chương trình khác nhau
+author: "Trailofbits"
+lang: vi
+tags: [ "solidity", "hợp đồng thông minh", "tính bảo mật" ]
+skill: intermediate
+published: 2020-09-07
+source: Xây dựng những hợp đồng an toàn
+sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis
+---
+
+Chúng ta sẽ sử dụng ba kỹ thuật kiểm thử và phân tích chương trình đặc biệt:
+
+- **Phân tích tĩnh bằng [Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/).** Tất cả các đường dẫn của chương trình đều được ước tính và phân tích cùng lúc, thông qua các bản trình bày chương trình khác nhau (ví dụ: biểu đồ luồng điều khiển)
+- **Thử nghiệm mờ bằng [Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/).** Mã được thực thi với việc tạo các giao dịch giả ngẫu nhiên. Trình thử nghiệm mờ sẽ cố gắng tìm một chuỗi các giao dịch để vi phạm một thuộc tính nhất định.
+- **Thực thi tượng trưng bằng [Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/).** Một kỹ thuật xác minh chính thức, giúp dịch từng đường dẫn thực thi sang một công thức toán học, trên đó các ràng buộc có thể được kiểm tra.
+
+Mỗi kỹ thuật đều có ưu và nhược điểm, và sẽ hữu ích trong [các trường hợp cụ thể](#determining-security-properties):
+
+| Kỹ thuật | Công cụ | Sử dụng | Tốc độ | Bỏ sót lỗi | Cảnh báo sai |
+| -------------------- | --------- | ---------------------------------------------------------- | ------ | ---------- | ------------ |
+| Phân tích tĩnh | Slither | CLI & tập lệnh | giây | vừa phải | thấp |
+| Thử nghiệm mờ | Echidna | Các thuộc tính của Solidity | phút | thấp | không |
+| Thực thi tượng trưng | Manticore | Các thuộc tính & tập lệnh của Solidity | giờ | không\* | không |
+
+\* nếu tất cả các đường dẫn được khám phá mà không hết thời gian
+
+**Slither** phân tích các hợp đồng trong vòng vài giây, tuy nhiên, phân tích tĩnh có thể dẫn đến các cảnh báo sai và sẽ kém phù hợp hơn cho các kiểm tra phức tạp (ví dụ: kiểm tra số học). Chạy Slither thông qua Giao diện Lập trình Ứng dụng (API) để truy cập bằng một nút nhấn vào các trình phát hiện được tích hợp sẵn hoặc thông qua Giao diện Lập trình Ứng dụng (API) để kiểm tra do người dùng xác định.
+
+**Echidna** cần chạy trong vài phút và sẽ chỉ tạo ra các kết quả dương tính thực. Echidna kiểm tra các thuộc tính bảo mật do người dùng cung cấp, được viết bằng Solidity. Nó có thể bỏ sót lỗi vì nó dựa trên thăm dò ngẫu nhiên.
+
+**Manticore** thực hiện phân tích \ Giống như Echidna, Manticore xác minh các thuộc tính do người dùng cung cấp. Nó sẽ cần nhiều thời gian hơn để chạy, nhưng nó có thể chứng minh tính hợp lệ của một thuộc tính và sẽ không báo cáo các cảnh báo sai.
+
+## Quy trình làm việc được đề xuất {#suggested-workflow}
+
+Bắt đầu với các trình phát hiện tích hợp sẵn của Slither để đảm bảo không có lỗi đơn giản nào hiện có hoặc sẽ được đưa vào sau này. Sử dụng Slither để kiểm tra các thuộc tính liên quan đến tính kế thừa, sự phụ thuộc của biến và các vấn đề về cấu trúc. Khi cơ sở mã phát triển, hãy sử dụng Echidna để kiểm tra các thuộc tính phức tạp hơn của máy trạng thái. Xem lại Slither để phát triển các kiểm tra tùy chỉnh cho các biện pháp bảo vệ không có sẵn từ Solidity, chẳng hạn như bảo vệ chống lại một hàm bị ghi đè. Cuối cùng, sử dụng Manticore để thực hiện xác minh có mục tiêu các thuộc tính bảo mật quan trọng, ví dụ như các phép toán số học.
+
+- Sử dụng CLI của Slither để phát hiện các sự cố thường gặp
+- Sử dụng Echidna để kiểm tra các thuộc tính bảo mật cấp cao của hợp đồng của bạn
+- Sử dụng Slither để viết các kiểm tra tĩnh tùy chỉnh
+- Sử dụng Manticore khi bạn muốn đảm bảo chuyên sâu về các thuộc tính bảo mật quan trọng
+
+**Lưu ý về kiểm thử đơn vị**. Kiểm thử đơn vị là cần thiết để xây dựng phần mềm chất lượng cao. Tuy nhiên, những kỹ thuật này không phải là phù hợp nhất để tìm ra các lỗ hổng bảo mật. Chúng thường được sử dụng để kiểm tra các hành vi tích cực của mã (tức là mã hoạt động như mong đợi trong bối cảnh bình thường), trong khi các lỗ hổng bảo mật có xu hướng nằm ở các trường hợp cạnh mà các nhà phát triển không xem xét. Trong nghiên cứu của chúng tôi về hàng chục bài đánh giá bảo mật hợp đồng thông minh, [phạm vi kiểm thử đơn vị không ảnh hưởng đến số lượng hoặc mức độ nghiêm trọng của các lỗ hổng bảo mật](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/) mà chúng tôi tìm thấy trong mã của khách hàng.
+
+## Xác định các thuộc tính bảo mật {#determining-security-properties}
+
+Để kiểm tra và xác minh mã của bạn một cách hiệu quả, bạn phải xác định các khu vực cần chú ý. Vì tài nguyên dành cho bảo mật của bạn có hạn, việc xác định phạm vi các phần yếu hoặc có giá trị cao trong cơ sở mã của bạn là rất quan trọng để tối ưu hóa nỗ lực của bạn. Lập mô hình mối đe dọa có thể giúp ích. Hãy cân nhắc xem xét:
+
+- [Đánh giá rủi ro nhanh](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html) (phương pháp ưa thích của chúng tôi khi thời gian eo hẹp)
+- [Hướng dẫn về Lập mô hình mối đe dọa hệ thống tập trung vào dữ liệu](https://csrc.nist.gov/pubs/sp/800/154/ipd) (còn gọi là NIST 800-154)
+- [Lập mô hình mối đe dọa 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.)
+- [Sử dụng các khẳng định](https://blog.regehr.org/archives/1091)
+
+### Các thành phần {#components}
+
+Biết những gì bạn muốn kiểm tra cũng sẽ giúp bạn chọn đúng công cụ.
+
+Các lĩnh vực rộng thường liên quan đến hợp đồng thông minh bao gồm:
+
+- **Máy trạng thái.** Hầu hết các hợp đồng có thể được biểu diễn dưới dạng một máy trạng thái. Hãy cân nhắc kiểm tra rằng (1) Không thể đạt được trạng thái không hợp lệ, (2) nếu một trạng thái hợp lệ thì nó có thể đạt được, và (3) không có trạng thái nào bẫy hợp đồng.
+
+ - Echidna và Manticore là những công cụ được ưu tiên để kiểm tra các đặc tả máy trạng thái.
+
+- **Kiểm soát truy cập.** Nếu hệ thống của bạn có người dùng đặc quyền (ví dụ: chủ sở hữu, người điều khiển, ...) bạn phải đảm bảo rằng (1) mỗi người dùng chỉ có thể thực hiện các hành động được ủy quyền và (2) không người dùng nào có thể chặn các hành động của người dùng có đặc quyền cao hơn.
+
+ - Slither, Echidna và Manticore có thể kiểm tra các kiểm soát truy cập chính xác. Ví dụ: Slither có thể kiểm tra rằng chỉ các hàm trong danh sách trắng mới thiếu công cụ sửa đổi onlyOwner. Echidna và Manticore rất hữu ích cho việc kiểm soát truy cập phức tạp hơn, chẳng hạn như quyền chỉ được cấp nếu hợp đồng đạt đến một trạng thái nhất định.
+
+- **Các phép toán số học.** Việc kiểm tra tính hợp lý của các phép toán số học là rất quan trọng. Sử dụng `SafeMath` ở mọi nơi là một bước tốt để ngăn chặn tràn số/tràn số dưới, tuy nhiên, bạn vẫn phải xem xét các sai sót số học khác, bao gồm các vấn đề làm tròn và các sai sót bẫy hợp đồng.
+
+ - Manticore là lựa chọn tốt nhất ở đây. Echidna có thể được sử dụng nếu phép toán số học nằm ngoài phạm vi của trình giải SMT.
+
+- **Tính đúng đắn của kế thừa.** Các hợp đồng Solidity phụ thuộc nhiều vào đa kế thừa. Các lỗi như hàm che bóng thiếu lệnh gọi `super` và thứ tự tuyến tính hóa c3 bị diễn giải sai có thể dễ dàng được đưa vào.
+
+ - Slither là công cụ để đảm bảo phát hiện các vấn đề này.
+
+- **Tương tác bên ngoài.** Các hợp đồng tương tác với nhau và không nên tin cậy một số hợp đồng bên ngoài. Ví dụ: nếu hợp đồng của bạn dựa vào các oracle bên ngoài, nó có còn bảo mật không nếu một nửa số oracle có sẵn bị xâm phạm?
+
+ - Manticore và Echidna là lựa chọn tốt nhất để kiểm tra các tương tác bên ngoài với hợp đồng của bạn. Manticore có một cơ chế tích hợp để sơ khai các hợp đồng bên ngoài.
+
+- **Tuân thủ tiêu chuẩn.** Các tiêu chuẩn Ethereum (ví dụ: ERC20) có lịch sử về các sai sót trong thiết kế của chúng. Hãy nhận thức được những hạn chế của tiêu chuẩn mà bạn đang xây dựng.
+ - Slither, Echidna và Manticore sẽ giúp bạn phát hiện các sai lệch so với một tiêu chuẩn nhất định.
+
+### Bảng tra cứu nhanh lựa chọn công cụ {#tool-selection-cheatsheet}
+
+| Thành phần | Công cụ | Ví dụ |
+| ------------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Máy trạng thái | Echidna, Manticore | |
+| Kiểm soát truy cập | Slither, Echidna, Manticore | [Bài tập Slither 2](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise2.md), [Bài tập Echidna 2](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-2.md) |
+| Các phép toán số học | Manticore, Echidna | [Bài tập Echidna 1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-1.md), [Bài tập Manticore 1 - 3](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) |
+| Tính đúng đắn của kế thừa | Slither | [Bài tập Slither 1](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise1.md) |
+| Tương tác bên ngoài | Manticore, Echidna | |
+| Tuân thủ tiêu chuẩn | Slither, Echidna, Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) |
+
+Các lĩnh vực khác sẽ cần được kiểm tra tùy thuộc vào mục tiêu của bạn, nhưng những lĩnh vực tập trung bao quát này là một khởi đầu tốt cho bất kỳ hệ thống hợp đồng thông minh nào.
+
+Các cuộc kiểm tra công khai của chúng tôi chứa các ví dụ về các thuộc tính đã được xác minh hoặc thử nghiệm. Hãy cân nhắc đọc các phần `Kiểm thử và xác minh tự động` của các báo cáo sau để xem xét các thuộc tính bảo mật trong thế giới thực:
+
+- [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/vi/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/vi/developers/tutorials/hello-world-smart-contract-fullstack/index.md
new file mode 100644
index 00000000000..d2d3af0bb57
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/hello-world-smart-contract-fullstack/index.md
@@ -0,0 +1,1541 @@
+---
+title: Hợp đồng thông minh Hello World dành cho người mới bắt đầu - Fullstack
+description: Hướng dẫn giới thiệu về cách viết và triển khai một hợp đồng thông minh đơn giản trên Ethereum.
+author: "nstrike2"
+tags:
+ [
+ "solidity",
+ "hardhat",
+ "từ Alchemy",
+ "hợp đồng thông minh",
+ "triển khai",
+ "trình duyệt khối",
+ "frontend",
+ "các giao dịch"
+ ]
+skill: beginner
+lang: vi
+published: 2021-10-25
+---
+
+Hướng dẫn này dành cho bạn nếu bạn là người mới tìm hiểu về phát triển chuỗi khối và không biết bắt đầu từ đâu hoặc cách triển khai và tương tác với các hợp đồng thông minh. Chúng tôi sẽ hướng dẫn cách tạo và triển khai một hợp đồng thông minh đơn giản trên mạng thử nghiệm Goerli bằng cách sử dụng [MetaMask](https://metamask.io), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org) và [Alchemy](https://alchemy.com/eth).
+
+Bạn sẽ cần một tài khoản Alchemy để hoàn thành hướng dẫn này. [Đăng ký tài khoản miễn phí](https://www.alchemy.com/).
+
+Nếu bạn có bất kỳ câu hỏi nào, vui lòng liên hệ trong [Alchemy Discord](https://discord.gg/gWuC7zB)!
+
+## Phần 1 - Tạo và triển khai hợp đồng thông minh của bạn bằng Hardhat {#part-1}
+
+### Kết nối với mạng Ethereum {#connect-to-the-ethereum-network}
+
+Có nhiều cách để thực hiện yêu cầu đến chuỗi Ethereum. Để đơn giản, chúng tôi sẽ sử dụng tài khoản miễn phí trên Alchemy, một nền tảng và Giao diện Lập trình Ứng dụng dành cho nhà phát triển chuỗi khối, cho phép chúng tôi giao tiếp với chuỗi Ethereum mà không cần tự chạy một nút. Alchemy cũng có các công cụ dành cho nhà phát triển để theo dõi và phân tích; chúng tôi sẽ tận dụng những công cụ này trong hướng dẫn này để hiểu những gì đang diễn ra trong quá trình triển khai hợp đồng thông minh của chúng tôi.
+
+### Tạo ứng dụng và khóa Giao diện Lập trình Ứng dụng của bạn {#create-your-app-and-api-key}
+
+Sau khi tạo tài khoản Alchemy, bạn có thể tạo một khóa Giao diện Lập trình Ứng dụng bằng cách tạo một ứng dụng. Điều này sẽ cho phép bạn thực hiện các yêu cầu đến mạng thử nghiệm Goerli. Nếu bạn không quen thuộc với các mạng thử nghiệm, bạn có thể [đọc hướng dẫn của Alchemy về cách chọn mạng](https://www.alchemy.com/docs/choosing-a-web3-network).
+
+Trên bảng điều khiển Alchemy, tìm menu thả xuống **Apps** trong thanh điều hướng và nhấp vào **Create App**.
+
+
+
+Đặt tên cho ứng dụng của bạn là '_Hello World_' và viết một mô tả ngắn. Chọn **Staging** làm môi trường và **Goerli** làm mạng của bạn.
+
+
+
+_Lưu ý: hãy chắc chắn chọn **Goerli**, nếu không hướng dẫn này sẽ không hoạt động._
+
+Nhấp vào **Create app**. Ứng dụng của bạn sẽ xuất hiện trong bảng dưới đây.
+
+### Tạo tài khoản Ethereum {#create-an-ethereum-account}
+
+Bạn cần có tài khoản Ethereum để gửi và nhận các giao dịch. Chúng tôi sẽ sử dụng MetaMask, một ví ảo trong trình duyệt cho phép người dùng quản lý địa chỉ tài khoản Ethereum của họ.
+
+Bạn có thể tải xuống và tạo tài khoản MetaMask miễn phí [tại đây](https://metamask.io/download). Khi bạn tạo tài khoản, hoặc nếu bạn đã có tài khoản, hãy đảm bảo chuyển sang “Mạng thử nghiệm Goerli” ở phía trên bên phải (để chúng ta không phải giao dịch bằng tiền thật).
+
+### Bước 4: Thêm ether từ Faucet {#step-4-add-ether-from-a-faucet}
+
+Để triển khai hợp đồng thông minh của bạn trên mạng thử nghiệm, bạn sẽ cần một ít ETH giả. Để nhận ETH trên mạng Goerli, hãy truy cập vào một vòi Goerli và nhập địa chỉ tài khoản Goerli của bạn. Lưu ý rằng các vòi Goerli gần đây có thể hơi không đáng tin cậy - xem [trang các mạng thử nghiệm](/developers/docs/networks/#goerli) để biết danh sách các tùy chọn để thử:
+
+_Lưu ý: do tắc nghẽn mạng, việc này có thể mất một lúc._
+\`\`
+
+### Bước 5: Kiểm tra số dư của bạn {#step-5-check-your-balance}
+
+Để kiểm tra lại xem ETH đã có trong ví của bạn chưa, chúng ta hãy thực hiện một yêu cầu [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) bằng cách sử dụng [công cụ soạn thảo của 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). Thao tác này sẽ trả về lượng ETH có trong ví của chúng ta. Để tìm hiểu thêm, hãy xem [hướng dẫn ngắn của Alchemy về cách sử dụng công cụ soạn thảo](https://youtu.be/r6sjRxBZJuU).
+
+Nhập địa chỉ tài khoản MetaMask của bạn và nhấp vào **Send Request**. Bạn sẽ thấy một phản hồi trông giống như đoạn mã dưới đây.
+
+```json
+{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }
+```
+
+> _Lưu ý: Kết quả này tính bằng wei, không phải ETH. Wei được sử dụng làm mệnh giá nhỏ nhất của ether._
+
+Phù! Tiền giả của chúng ta đã có đủ.
+
+### Bước 6: Khởi tạo dự án của chúng ta {#step-6-initialize-our-project}
+
+Đầu tiên, chúng ta sẽ cần tạo một thư mục cho dự án của mình. Điều hướng đến dòng lệnh của bạn và nhập nội dung sau.
+
+```
+mkdir hello-world
+cd hello-world
+```
+
+Bây giờ chúng ta đang ở trong thư mục dự án của mình, chúng ta sẽ sử dụng `npm init` để khởi tạo dự án.
+
+> Nếu bạn chưa cài đặt npm, hãy làm theo [các hướng dẫn sau để cài đặt Node.js và npm](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm).
+
+Đối với mục đích của hướng dẫn này, việc bạn trả lời các câu hỏi khởi tạo như thế nào không quan trọng. Đây là cách chúng tôi đã làm để bạn tham khảo:
+
+```
+tên gói: (hello-world)
+phiên bản: (1.0.0)
+mô tả: hợp đồng thông minh hello world
+điểm vào: (index.js)
+lệnh kiểm tra:
+kho lưu trữ git:
+từ khóa:
+tác giả:
+giấy phép: (ISC)
+
+Sắp ghi vào /Users/.../.../.../hello-world/package.json:
+
+{
+ "name": "hello-world",
+ "version": "1.0.0",
+ "description": "hợp đồng thông minh hello world",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Lỗi: không có bài kiểm tra nào được chỉ định\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
+```
+
+Phê duyệt package.json và chúng ta đã sẵn sàng!
+
+### Bước 7: Tải xuống Hardhat {#step-7-download-hardhat}
+
+Hardhat là một môi trường phát triển để biên dịch, triển khai, kiểm thử và gỡ lỗi phần mềm Ethereum của bạn. Nó giúp các nhà phát triển khi xây dựng hợp đồng thông minh và các ứng dụng phi tập trung cục bộ trước khi triển khai lên chuỗi chính.
+
+Bên trong dự án `hello-world` của chúng ta, chạy:
+
+```
+npm install --save-dev hardhat
+```
+
+Hãy xem trang này để biết thêm chi tiết về [hướng dẫn cài đặt](https://hardhat.org/getting-started/#overview).
+
+### Bước 8: Tạo dự án Hardhat {#step-8-create-hardhat-project}
+
+Bên trong thư mục dự án `hello-world` của chúng ta, chạy:
+
+```
+npx hardhat
+```
+
+Sau đó, bạn sẽ thấy một thông báo chào mừng và tùy chọn để chọn những gì bạn muốn làm. Chọn “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
+
+👷 Chào mừng đến với Hardhat v2.0.11 👷
+
+Bạn muốn làm gì? …
+Tạo một dự án mẫu
+❯ Tạo một tệp hardhat.config.js trống
+Thoát
+```
+
+Thao tác này sẽ tạo một tệp `hardhat.config.js` trong dự án. Chúng ta sẽ sử dụng tệp này sau trong hướng dẫn để chỉ định thiết lập cho dự án của mình.
+
+### Bước 9: Thêm thư mục dự án {#step-9-add-project-folders}
+
+Để giữ cho dự án được tổ chức, chúng ta hãy tạo hai thư mục mới. Trong dòng lệnh, điều hướng đến thư mục gốc của dự án `hello-world` của bạn và nhập:
+
+```
+mkdir contracts
+mkdir scripts
+```
+
+- `contracts/` là nơi chúng ta sẽ lưu tệp mã hợp đồng thông minh hello world
+- `scripts/` là nơi chúng ta sẽ lưu giữ các tập lệnh để triển khai và tương tác với hợp đồng của mình
+
+### Bước 10: Viết hợp đồng của chúng ta {#step-10-write-our-contract}
+
+Bạn có thể đang tự hỏi, khi nào chúng ta sẽ viết mã? Đã đến lúc!
+
+Mở dự án hello-world trong trình chỉnh sửa yêu thích của bạn. Các hợp đồng thông minh thường được viết bằng Solidity, ngôn ngữ mà chúng ta sẽ sử dụng để viết hợp đồng thông minh của mình.
+
+1. Điều hướng đến thư mục `contracts` và tạo một tệp mới có tên `HelloWorld.sol`
+2. Dưới đây là một hợp đồng thông minh Hello World mẫu mà chúng ta sẽ sử dụng cho hướng dẫn này. Sao chép nội dung bên dưới vào tệp `HelloWorld.sol`.
+
+_Lưu ý: Hãy chắc chắn đọc các bình luận để hiểu hợp đồng này làm gì._
+
+```
+// Chỉ định phiên bản của Solidity, sử dụng lập phiên bản ngữ nghĩa.
+// Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+pragma solidity >=0.7.3;
+
+// Định nghĩa một hợp đồng có tên là `HelloWorld`.
+// Một hợp đồng là một tập hợp các hàm và dữ liệu (trạng thái của nó). Sau khi được triển khai, một hợp đồng nằm ở một địa chỉ cụ thể trên chuỗi khối Ethereum. Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+contract HelloWorld {
+
+ //Phát ra khi hàm cập nhật được gọi
+ //Các sự kiện hợp đồng thông minh là một cách để hợp đồng của bạn giao tiếp rằng điều gì đó đã xảy ra trên chuỗi khối với giao diện người dùng ứng dụng của bạn, giao diện này có thể 'lắng nghe' các sự kiện nhất định và thực hiện hành động khi chúng xảy ra.
+ event UpdatedMessages(string oldStr, string newStr);
+
+ // Khai báo một biến trạng thái `message` thuộc loại `string`.
+ // Các biến trạng thái là các biến có giá trị được lưu trữ vĩnh viễn trong bộ lưu trữ hợp đồng. Từ khóa `public` giúp các biến có thể truy cập được từ bên ngoài hợp đồng và tạo ra một hàm mà các hợp đồng hoặc ứng dụng khách khác có thể gọi để truy cập giá trị.
+ string public message;
+
+ // Tương tự như nhiều ngôn ngữ lập trình hướng đối tượng dựa trên lớp, một hàm tạo là một hàm đặc biệt chỉ được thực thi khi tạo hợp đồng.
+ // Hàm tạo được sử dụng để khởi tạo dữ liệu của hợp đồng. Tìm hiểu thêm:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ constructor(string memory initMessage) {
+
+ // Chấp nhận một đối số chuỗi `initMessage` và đặt giá trị vào biến lưu trữ `message` của hợp đồng).
+ message = initMessage;
+ }
+
+ // Một hàm công khai chấp nhận một đối số chuỗi và cập nhật biến lưu trữ `message`.
+ function update(string memory newMessage) public {
+ string memory oldMsg = message;
+ message = newMessage;
+ emit UpdatedMessages(oldMsg, newMessage);
+ }
+}
+```
+
+Đây là một hợp đồng thông minh cơ bản lưu trữ một thông điệp khi được tạo. Nó có thể được cập nhật bằng cách gọi hàm `update`.
+
+### Bước 11: Kết nối MetaMask & Alchemy với dự án của bạn {#step-11-connect-metamask-alchemy-to-your-project}
+
+Chúng ta đã tạo một ví MetaMask, tài khoản Alchemy và viết hợp đồng thông minh của mình, giờ là lúc kết nối cả ba.
+
+Mỗi giao dịch được gửi từ ví của bạn đều yêu cầu một chữ ký sử dụng khóa riêng tư duy nhất của bạn. Để cung cấp cho chương trình của chúng tôi quyền này, chúng tôi có thể lưu trữ khóa riêng tư của mình một cách an toàn trong một tệp môi trường. Chúng tôi cũng sẽ lưu trữ một khóa Giao diện Lập trình Ứng dụng cho Alchemy tại đây.
+
+> Để tìm hiểu thêm về việc gửi giao dịch, hãy xem [hướng dẫn này](https://www.alchemy.com/docs/hello-world-smart-contract#step-11-connect-metamask--alchemy-to-your-project) về việc gửi giao dịch bằng web3.
+
+Đầu tiên, cài đặt gói dotenv trong thư mục dự án của bạn:
+
+```
+npm install dotenv --save
+```
+
+Sau đó, tạo một tệp `.env` trong thư mục gốc của dự án. Thêm khóa riêng tư MetaMask và URL Giao diện Lập trình Ứng dụng HTTP của Alchemy vào đó.
+
+Tệp môi trường của bạn phải được đặt tên là `.env` nếu không nó sẽ không được nhận dạng là tệp môi trường.
+
+Không đặt tên là `process.env` hoặc `.env-custom` hoặc bất kỳ tên nào khác.
+
+- Làm theo [các hướng dẫn sau](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) để xuất khóa riêng tư của bạn
+- Xem bên dưới để lấy URL API HTTP của Alchemy
+
+
+
+Tệp `.env` của bạn sẽ trông như thế này:
+
+```
+API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key"
+PRIVATE_KEY = "your-metamask-private-key"
+```
+
+Để thực sự kết nối những thứ này với mã của chúng ta, chúng ta sẽ tham chiếu các biến này trong tệp `hardhat.config.js` của mình ở bước 13.
+
+### Bước 12: Cài đặt Ethers.js {#step-12-install-ethersjs}
+
+Ethers.js là một thư viện giúp tương tác và thực hiện các yêu cầu đến Ethereum dễ dàng hơn bằng cách gói [các phương thức JSON-RPC tiêu chuẩn](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc) bằng các phương thức thân thiện với người dùng hơn.
+
+Hardhat cho phép chúng ta tích hợp các [plugin](https://hardhat.org/plugins/) để có thêm bộ công cụ và chức năng mở rộng. Chúng ta sẽ tận dụng [plugin Ethers](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) để triển khai hợp đồng.
+
+Trong thư mục dự án của bạn, hãy gõ:
+
+```bash
+npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"
+```
+
+### Bước 13: Cập nhật hardhat.config.js {#step-13-update-hardhat-configjs}
+
+Cho đến nay, chúng ta đã thêm một số phần phụ thuộc và plugin, bây giờ chúng ta cần cập nhật `hardhat.config.js` để dự án của chúng ta biết về tất cả chúng.
+
+Cập nhật tệp `hardhat.config.js` của bạn để trông như thế này:
+
+```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}`],
+ },
+ },
+}
+```
+
+### Bước 14: Biên dịch hợp đồng của chúng ta {#step-14-compile-our-contract}
+
+Để đảm bảo mọi thứ đều hoạt động cho đến nay, hãy biên dịch hợp đồng của chúng ta. Tác vụ `compile` là một trong những tác vụ có sẵn của hardhat.
+
+Từ dòng lệnh, hãy chạy:
+
+```bash
+npx hardhat compile
+```
+
+Bạn có thể nhận được cảnh báo về `SPDX license identifier not provided in source file`, nhưng không cần phải lo lắng về điều đó — hy vọng mọi thứ khác đều ổn! Nếu không, bạn luôn có thể nhắn tin trong [Alchemy discord](https://discord.gg/u72VCg3).
+
+### Bước 15: Viết tập lệnh triển khai của chúng ta {#step-15-write-our-deploy-script}
+
+Bây giờ hợp đồng của chúng ta đã được viết và tệp cấu hình đã sẵn sàng, đã đến lúc viết tập lệnh triển khai hợp đồng của chúng ta.
+
+Điều hướng đến thư mục `scripts/` và tạo một tệp mới có tên `deploy.js`, thêm nội dung sau vào đó:
+
+```javascript
+async function main() {
+ const HelloWorld = await ethers.getContractFactory("HelloWorld")
+
+ // Bắt đầu triển khai, trả về một promise phân giải thành một đối tượng hợp đồng
+ const hello_world = await HelloWorld.deploy("Hello World!")
+ console.log("Hợp đồng đã được triển khai đến địa chỉ:", hello_world.address)
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error)
+ process.exit(1)
+ })
+```
+
+Hardhat đã làm rất tốt việc giải thích mỗi dòng mã này làm gì trong [Bài hướng dẫn về Hợp đồng](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) của họ, chúng tôi đã áp dụng các giải thích của họ ở đây.
+
+```javascript
+const HelloWorld = await ethers.getContractFactory("HelloWorld")
+```
+
+`ContractFactory` trong ethers.js là một lớp trừu tượng được sử dụng để triển khai các hợp đồng thông minh mới, vì vậy `HelloWorld` ở đây là một [nhà máy](https://en.wikipedia.org/wiki/Factory_\(object-oriented_programming\)) cho các phiên bản của hợp đồng hello world của chúng ta. Khi sử dụng plugin `hardhat-ethers`, các phiên bản `ContractFactory` và `Contract` được kết nối với người ký đầu tiên (chủ sở hữu) theo mặc định.
+
+```javascript
+const hello_world = await HelloWorld.deploy()
+```
+
+Việc gọi `deploy()` trên `ContractFactory` sẽ bắt đầu việc triển khai và trả về một `Promise` phân giải thành một đối tượng `Contract`. Đây là đối tượng có một phương thức cho mỗi chức năng hợp đồng thông minh của chúng ta.
+
+### Bước 16: Triển khai hợp đồng của chúng ta {#step-16-deploy-our-contract}
+
+Cuối cùng, chúng ta đã sẵn sàng để triển khai hợp đồng thông minh của mình! Điều hướng đến dòng lệnh và chạy:
+
+```bash
+npx hardhat run scripts/deploy.js --network goerli
+```
+
+Sau đó, bạn sẽ thấy một cái gì đó như thế này:
+
+```bash
+Hợp đồng được triển khai đến địa chỉ: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
+```
+
+**Vui lòng lưu địa chỉ này**. Chúng tôi sẽ sử dụng nó sau trong hướng dẫn.
+
+Nếu chúng ta truy cập [Goerli etherscan](https://goerli.etherscan.io) và tìm kiếm địa chỉ hợp đồng của mình, chúng ta sẽ có thể thấy rằng nó đã được triển khai thành công. Giao dịch sẽ trông giống như thế này:
+
+
+
+Địa chỉ `From` phải khớp với địa chỉ tài khoản MetaMask của bạn và địa chỉ `To` sẽ ghi là **Contract Creation**. Nếu chúng ta nhấp vào giao dịch, chúng ta sẽ thấy địa chỉ hợp đồng của mình trong trường `To`.
+
+
+
+Xin chúc mừng! Bạn vừa triển khai một hợp đồng thông minh đến một mạng thử nghiệm Ethereum.
+
+Để hiểu những gì đang diễn ra bên trong, hãy điều hướng đến tab Explorer trong [bảng điều khiển Alchemy](https://dashboard.alchemy.com/explorer) của chúng ta. Nếu bạn có nhiều ứng dụng Alchemy, hãy đảm bảo lọc theo ứng dụng và chọn **Hello World**.
+
+
+
+Ở đây, bạn sẽ thấy một số phương thức JSON-RPC mà Hardhat/Ethers đã thực hiện cho chúng ta khi chúng ta gọi hàm `.deploy()`. Hai phương thức quan trọng ở đây là [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), là yêu cầu ghi hợp đồng của chúng ta lên chuỗi Goerli, và [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), là yêu cầu đọc thông tin về giao dịch của chúng ta với hàm băm đã cho. Để tìm hiểu thêm về việc gửi giao dịch, hãy xem [hướng dẫn của chúng tôi về việc gửi giao dịch bằng Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/).
+
+## Phần 2: Tương tác với hợp đồng thông minh của bạn {#part-2-interact-with-your-smart-contract}
+
+Bây giờ chúng ta đã triển khai thành công một hợp đồng thông minh trên mạng Goerli, hãy cùng tìm hiểu cách tương tác với nó.
+
+### Tạo một tệp interact.js {#create-a-interactjs-file}
+
+Đây là tệp mà chúng ta sẽ viết tập lệnh tương tác của mình. Chúng tôi sẽ sử dụng thư viện Ethers.js mà bạn đã cài đặt trước đó trong Phần 1.
+
+Bên trong thư mục `scripts/`, tạo một tệp mới có tên `interact.js` và thêm mã sau:
+
+```javascript
+// interact.js
+
+const API_KEY = process.env.API_KEY
+const PRIVATE_KEY = process.env.PRIVATE_KEY
+const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS
+```
+
+### Cập nhật tệp .env của bạn {#update-your-env-file}
+
+Chúng tôi sẽ sử dụng các biến môi trường mới, vì vậy chúng tôi cần định nghĩa chúng trong tệp `.env` mà [chúng tôi đã tạo trước đó](#step-11-connect-metamask-&-alchemy-to-your-project).
+
+Chúng ta sẽ cần thêm một định nghĩa cho `API_KEY` của Alchemy và `CONTRACT_ADDRESS` nơi hợp đồng thông minh của bạn được triển khai.
+
+Tệp `.env` của bạn sẽ trông giống như sau:
+
+```bash
+# .env
+
+API_URL = "https://eth-goerli.alchemyapi.io/v2/"
+API_KEY = ""
+PRIVATE_KEY = ""
+CONTRACT_ADDRESS = "0x"
+```
+
+### Lấy Giao diện nhị phân ứng dụng hợp đồng của bạn {#grab-your-contract-ABI}
+
+[Giao diện nhị phân ứng dụng (ABI)](/glossary/#abi) của hợp đồng của chúng tôi là giao diện để tương tác với hợp đồng thông minh của chúng tôi. Hardhat tự động tạo Giao diện nhị phân ứng dụng (ABI) và lưu nó trong `HelloWorld.json`. Để sử dụng Giao diện nhị phân ứng dụng, chúng ta sẽ cần phân tích cú pháp nội dung bằng cách thêm các dòng mã sau vào tệp `interact.js` của mình:
+
+```javascript
+// interact.js
+const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json")
+```
+
+Nếu bạn muốn xem ABI, bạn có thể in nó ra bảng điều khiển của mình:
+
+```javascript
+console.log(JSON.stringify(contract.abi))
+```
+
+Để xem Giao diện nhị phân ứng dụng (ABI) của bạn được in ra bảng điều khiển, hãy điều hướng đến thiết bị đầu cuối của bạn và chạy:
+
+```bash
+npx hardhat run scripts/interact.js
+```
+
+### Tạo một phiên bản của hợp đồng của bạn {#create-an-instance-of-your-contract}
+
+Để tương tác với hợp đồng của mình, chúng ta cần tạo một phiên bản hợp đồng trong mã của mình. Để làm như vậy với Ethers.js, chúng ta sẽ cần làm việc với ba khái niệm:
+
+1. Nhà cung cấp - một nhà cung cấp nút cung cấp cho bạn quyền truy cập đọc và ghi vào chuỗi khối
+2. Người ký - đại diện cho một tài khoản Ethereum có thể ký các giao dịch
+3. Hợp đồng - một đối tượng Ethers.js đại diện cho một hợp đồng cụ thể được triển khai trên chuỗi
+
+Chúng ta sẽ sử dụng Giao diện nhị phân ứng dụng (ABI) của hợp đồng từ bước trước để tạo phiên bản hợp đồng của mình:
+
+```javascript
+// interact.js
+
+// Nhà cung cấp
+const alchemyProvider = new ethers.providers.AlchemyProvider(
+ (network = "goerli"),
+ API_KEY
+)
+
+// Người ký
+const signer = new ethers.Wallet(PRIVATE_KEY, alchemyProvider)
+
+// Hợp đồng
+const helloWorldContract = new ethers.Contract(
+ CONTRACT_ADDRESS,
+ contract.abi,
+ signer
+)
+```
+
+Tìm hiểu thêm về Nhà cung cấp, Người ký và Hợp đồng trong [tài liệu tham khảo của ethers.js](https://docs.ethers.io/v5/).
+
+### Đọc thông điệp khởi tạo {#read-the-init-message}
+
+Bạn có nhớ khi chúng ta triển khai hợp đồng của mình với `initMessage = "Hello world!"` không? Bây giờ chúng ta sẽ đọc thông điệp đó được lưu trữ trong hợp đồng thông minh của mình và in nó ra bảng điều khiển.
+
+Trong JavaScript, các hàm bất đồng bộ được sử dụng khi tương tác với các mạng. Để tìm hiểu thêm về các hàm không đồng bộ, [hãy đọc bài viết này trên medium](https://blog.bitsrc.io/understanding-asynchronous-javascript-the-event-loop-74cd408419ff).
+
+Sử dụng mã bên dưới để gọi hàm `message` trong hợp đồng thông minh của chúng ta và đọc thông điệp khởi tạo:
+
+```javascript
+// interact.js
+
+// ...
+
+async function main() {
+ const message = await helloWorldContract.message()
+ console.log("Thông điệp là: " + message)
+}
+main()
+```
+
+Sau khi chạy tệp bằng `npx hardhat run scripts/interact.js` trong thiết bị đầu cuối, chúng ta sẽ thấy phản hồi này:
+
+```
+Thông điệp là: Hello world!
+```
+
+Xin chúc mừng! Bạn vừa đọc thành công dữ liệu hợp đồng thông minh từ chuỗi khối Ethereum, làm tốt lắm!
+
+### Cập nhật thông điệp {#update-the-message}
+
+Thay vì chỉ đọc thông điệp, chúng ta cũng có thể cập nhật thông điệp được lưu trong hợp đồng thông minh của mình bằng hàm `update`! Tuyệt vời, phải không?
+
+Để cập nhật thông điệp, chúng ta có thể gọi trực tiếp hàm `update` trên đối tượng Hợp đồng được khởi tạo của mình:
+
+```javascript
+// interact.js
+
+// ...
+
+async function main() {
+ const message = await helloWorldContract.message()
+ console.log("Thông điệp là: " + message)
+
+ console.log("Đang cập nhật thông điệp...")
+ const tx = await helloWorldContract.update("Đây là thông điệp mới.")
+ await tx.wait()
+}
+main()
+```
+
+Lưu ý rằng ở dòng 11, chúng ta thực hiện một lệnh gọi đến `.wait()` trên đối tượng giao dịch được trả về. Điều này đảm bảo rằng tập lệnh của chúng ta đợi giao dịch được khai thác trên chuỗi khối trước khi thoát khỏi hàm. Nếu lệnh gọi `.wait()` không được bao gồm, tập lệnh có thể không thấy giá trị `message` được cập nhật trong hợp đồng.
+
+### Đọc thông điệp mới {#read-the-new-message}
+
+Bạn có thể lặp lại [bước trước đó](#read-the-init-message) để đọc giá trị `message` đã được cập nhật. Hãy dành một chút thời gian và xem liệu bạn có thể thực hiện những thay đổi cần thiết để in ra giá trị mới đó không!
+
+Nếu bạn cần gợi ý, đây là tệp `interact.js` của bạn sẽ trông như thế nào vào thời điểm này:
+
+```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("Thông điệp là: " + message)
+
+ console.log("Đang cập nhật thông điệp...")
+ const tx = await helloWorldContract.update("đây là thông điệp mới")
+ await tx.wait()
+
+ const newMessage = await helloWorldContract.message()
+ console.log("Thông điệp mới là: " + newMessage)
+}
+
+main()
+```
+
+Bây giờ chỉ cần chạy tập lệnh và bạn sẽ có thể thấy thông điệp cũ, trạng thái cập nhật và thông điệp mới được in ra thiết bị đầu cuối của bạn!
+
+`npx hardhat run scripts/interact.js --network goerli`
+
+```
+Thông điệp là: Hello World!
+Đang cập nhật thông điệp...
+Thông điệp mới là: Đây là thông điệp mới.
+```
+
+Trong khi chạy tập lệnh đó, bạn có thể nhận thấy rằng bước `Updating the message...` mất một lúc để tải trước khi thông điệp mới tải. Đó là do quá trình khai thác; nếu bạn tò mò về việc theo dõi các giao dịch trong khi chúng đang được khai thác, hãy truy cập [bể ghi nhớ của Alchemy](https://dashboard.alchemyapi.io/mempool) để xem trạng thái của một giao dịch. Nếu giao dịch bị hủy, bạn cũng nên kiểm tra [Goerli Etherscan](https://goerli.etherscan.io) và tìm kiếm hàm băm giao dịch của mình.
+
+## Phần 3: Xuất bản hợp đồng thông minh của bạn lên Etherscan {#part-3-publish-your-smart-contract-to-etherscan}
+
+Bạn đã làm tất cả công việc khó khăn để đưa hợp đồng thông minh của mình vào cuộc sống; bây giờ là lúc chia sẻ nó với thế giới!
+
+Bằng cách xác minh hợp đồng thông minh của bạn trên Etherscan, bất kỳ ai cũng có thể xem mã nguồn của bạn và tương tác với hợp đồng thông minh của bạn. Bắt đầu ngay!
+
+### Bước 1: Tạo khóa Giao diện Lập trình Ứng dụng trên tài khoản Etherscan của bạn {#step-1-generate-an-api-key-on-your-etherscan-account}
+
+Cần có khóa Giao diện Lập trình Ứng dụng Etherscan để xác minh rằng bạn sở hữu hợp đồng thông minh mà bạn đang cố gắng xuất bản.
+
+Nếu bạn chưa có tài khoản Etherscan, [hãy đăng ký một tài khoản](https://etherscan.io/register).
+
+Sau khi đăng nhập, tìm tên người dùng của bạn trong thanh điều hướng, di chuột qua nó và chọn nút **Hồ sơ của tôi**.
+
+Trên trang hồ sơ của bạn, bạn sẽ thấy một thanh điều hướng bên cạnh. Từ thanh điều hướng bên cạnh, chọn **Khóa Giao diện Lập trình Ứng dụng**. Tiếp theo, nhấn nút "Thêm" để tạo một khóa Giao diện Lập trình Ứng dụng mới, đặt tên cho ứng dụng của bạn là **hello-world** và nhấn nút **Tạo Khóa Giao diện Lập trình Ứng dụng Mới**.
+
+Khóa Giao diện Lập trình Ứng dụng mới của bạn sẽ xuất hiện trong bảng khóa Giao diện Lập trình Ứng dụng. Sao chép khóa Giao diện Lập trình Ứng dụng vào khay nhớ tạm của bạn.
+
+Tiếp theo, chúng ta cần thêm khóa Giao diện Lập trình Ứng dụng Etherscan vào tệp `.env` của mình.
+
+Sau khi thêm nó, tệp `.env` của bạn sẽ trông như thế này:
+
+```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"
+```
+
+### Các hợp đồng thông minh được triển khai bởi Hardhat {#hardhat-deployed-smart-contracts}
+
+#### Cài đặt hardhat-etherscan {#install-hardhat-etherscan}
+
+Việc xuất bản hợp đồng của bạn lên Etherscan bằng Hardhat rất đơn giản. Trước tiên, bạn sẽ cần cài đặt plugin `hardhat-etherscan` để bắt đầu. `hardhat-etherscan` sẽ tự động xác minh mã nguồn và Giao diện nhị phân ứng dụng (ABI) của hợp đồng thông minh trên Etherscan. Để thêm điều này, trong thư mục `hello-world`, hãy chạy:
+
+```text
+npm install --save-dev @nomiclabs/hardhat-etherscan
+```
+
+Sau khi cài đặt, bao gồm câu lệnh sau ở đầu `hardhat.config.js` của bạn và thêm các tùy chọn cấu hình 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: {
+ // Khóa Giao diện Lập trình Ứng dụng của bạn cho Etherscan
+ // Lấy một khóa tại https://etherscan.io/
+ apiKey: ETHERSCAN_API_KEY,
+ },
+}
+```
+
+#### Xác minh hợp đồng thông minh của bạn trên Etherscan {#verify-your-smart-contract-on-etherscan}
+
+Đảm bảo tất cả các tệp được lưu và tất cả các biến `.env` được cấu hình chính xác.
+
+Chạy tác vụ `verify`, truyền địa chỉ hợp đồng và mạng nơi nó được triển khai:
+
+```text
+npx hardhat verify --network goerli DEPLOYED_CONTRACT_ADDRESS 'Hello World!'
+```
+
+Đảm bảo rằng `DEPLOYED_CONTRACT_ADDRESS` là địa chỉ của hợp đồng thông minh đã được triển khai của bạn trên mạng thử nghiệm Goerli. Ngoài ra, đối số cuối cùng (`'Hello World!'`) phải có cùng giá trị chuỗi được sử dụng [trong bước triển khai ở phần 1](#write-our-deploy-script).
+
+Nếu mọi việc suôn sẻ, bạn sẽ thấy thông điệp sau trong thiết bị đầu cuối của mình:
+
+```text
+Đã gửi thành công mã nguồn cho hợp đồng
+contracts/HelloWorld.sol:HelloWorld tại 0xdeployed-contract-address
+để xác minh trên Etherscan. Đang chờ kết quả xác minh...
+
+
+Đã xác minh thành công hợp đồng HelloWorld trên Etherscan.
+https://goerli.etherscan.io/address/#contracts
+```
+
+Xin chúc mừng! Mã hợp đồng thông minh của bạn đã có trên Etherscan!
+
+### Kiểm tra hợp đồng thông minh của bạn trên Etherscan! {#check-out-your-smart-contract-on-etherscan}
+
+Khi bạn điều hướng đến liên kết được cung cấp trong thiết bị đầu cuối của mình, bạn sẽ có thể thấy mã hợp đồng thông minh và Giao diện nhị phân ứng dụng (ABI) của mình được xuất bản trên Etherscan!
+
+**Wahooo - bạn đã làm được rồi, nhà vô địch! Bây giờ bất kỳ ai cũng có thể gọi hoặc ghi vào hợp đồng thông minh của bạn! Chúng tôi rất mong được xem bạn sẽ xây dựng gì tiếp theo!**
+
+## Phần 4 - Tích hợp hợp đồng thông minh của bạn với giao diện người dùng {#part-4-integrating-your-smart-contract-with-the-frontend}
+
+Vào cuối hướng dẫn này, bạn sẽ biết cách:
+
+- Kết nối ví MetaMask với dự án ứng dụng phi tập trung của bạn
+- Đọc dữ liệu từ hợp đồng thông minh của bạn bằng cách sử dụng Giao diện Lập trình Ứng dụng [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3)
+- Ký các giao dịch Ethereum bằng MetaMask
+
+Đối với ứng dụng phi tập trung này, chúng tôi sẽ sử dụng [React](https://react.dev/) làm khuôn khổ giao diện người dùng của mình; tuy nhiên, điều quan trọng cần lưu ý là chúng tôi sẽ không dành nhiều thời gian để phân tích các nguyên tắc cơ bản của nó, vì chúng tôi sẽ chủ yếu tập trung vào việc đưa chức năng Web3 vào dự án của mình.
+
+Như một điều kiện tiên quyết, bạn nên có một sự hiểu biết ở mức độ sơ cấp về React. Nếu không, chúng tôi khuyên bạn nên hoàn thành [hướng dẫn Giới thiệu về React](https://react.dev/learn) chính thức.
+
+### Sao chép các tệp khởi đầu {#clone-the-starter-files}
+
+Đầu tiên, hãy truy cập [kho lưu trữ GitHub hello-world-part-four](https://github.com/alchemyplatform/hello-world-part-four-tutorial) để lấy các tệp khởi đầu cho dự án này và sao chép kho lưu trữ này vào máy cục bộ của bạn.
+
+Mở kho lưu trữ đã sao chép cục bộ. Lưu ý rằng nó chứa hai thư mục: `starter-files` và `completed`.
+
+- `starter-files`- **chúng ta sẽ làm việc trong thư mục này**, chúng ta sẽ kết nối giao diện người dùng với ví Ethereum của bạn và hợp đồng thông minh mà chúng ta đã xuất bản lên Etherscan trong [Phần 3](#part-3).
+- `completed` chứa toàn bộ hướng dẫn đã hoàn thành và chỉ nên được sử dụng làm tài liệu tham khảo nếu bạn gặp khó khăn.
+
+Tiếp theo, mở bản sao `starter-files` của bạn vào trình soạn thảo mã yêu thích của bạn, sau đó điều hướng vào thư mục `src`.
+
+Tất cả mã chúng ta sẽ viết sẽ nằm trong thư mục `src`. Chúng ta sẽ chỉnh sửa thành phần `HelloWorld.js` và các tệp JavaScript `util/interact.js` để cung cấp cho dự án của chúng ta chức năng Web3.
+
+### Kiểm tra các tệp khởi đầu {#check-out-the-starter-files}
+
+Trước khi bắt đầu viết mã, hãy cùng khám phá những gì được cung cấp cho chúng ta trong các tệp khởi đầu.
+
+#### Chạy dự án react của bạn {#get-your-react-project-running}
+
+Hãy bắt đầu bằng cách chạy dự án React trong trình duyệt của chúng ta. Vẻ đẹp của React là một khi chúng ta có dự án đang chạy trong trình duyệt, bất kỳ thay đổi nào chúng ta lưu sẽ được cập nhật trực tiếp trong trình duyệt của chúng ta.
+
+Để chạy dự án, hãy điều hướng đến thư mục gốc của thư mục `starter-files` và chạy `npm install` trong thiết bị đầu cuối của bạn để cài đặt các phụ thuộc của dự án:
+
+```bash
+cd starter-files
+npm install
+```
+
+Sau khi chúng đã cài đặt xong, hãy chạy `npm start` trong terminal của bạn:
+
+```bash
+npm start
+```
+
+Làm như vậy sẽ mở [http://localhost:3000/](http://localhost:3000/) trong trình duyệt của bạn, nơi bạn sẽ thấy giao diện người dùng cho dự án của chúng ta. Nó sẽ bao gồm một trường (một nơi để cập nhật thông điệp được lưu trữ trong hợp đồng thông minh của bạn), một nút "Kết nối Ví" và một nút "Cập nhật".
+
+Nếu bạn thử nhấp vào một trong hai nút, bạn sẽ nhận thấy rằng chúng không hoạt động—đó là vì chúng ta vẫn cần lập trình chức năng của chúng.
+
+#### Thành phần `HelloWorld.js` {#the-helloworld-js-component}
+
+Hãy quay lại thư mục `src` trong trình chỉnh sửa của chúng ta và mở tệp `HelloWorld.js`. Việc hiểu mọi thứ trong tệp này là cực kỳ quan trọng, vì đây là thành phần React chính mà chúng ta sẽ làm việc.
+
+Ở đầu tệp này, bạn sẽ nhận thấy chúng ta có một số câu lệnh nhập cần thiết để chạy dự án của mình, bao gồm thư viện React, các hook useEffect và useState, một số mục từ `./util/interact.js` (chúng ta sẽ mô tả chúng chi tiết hơn ngay sau đây!), và 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"
+```
+
+Tiếp theo, chúng ta có các biến trạng thái mà chúng ta sẽ cập nhật sau các sự kiện cụ thể.
+
+```javascript
+// HelloWorld.js
+
+//Các biến trạng thái
+const [walletAddress, setWallet] = useState("")
+const [status, setStatus] = useState("")
+const [message, setMessage] = useState("Không có kết nối với mạng.")
+const [newMessage, setNewMessage] = useState("")
+```
+
+Đây là những gì mỗi biến đại diện:
+
+- `walletAddress` - một chuỗi lưu trữ địa chỉ ví của người dùng
+- `status`- một chuỗi lưu trữ một thông điệp hữu ích hướng dẫn người dùng cách tương tác với ứng dụng phi tập trung
+- `message` - một chuỗi lưu trữ thông điệp hiện tại trong hợp đồng thông minh
+- `newMessage` - một chuỗi lưu trữ thông điệp mới sẽ được ghi vào hợp đồng thông minh
+
+Sau các biến trạng thái, bạn sẽ thấy năm hàm chưa được triển khai: `useEffect` ,`addSmartContractListener`, `addWalletListener` , `connectWalletPressed`, và `onUpdatePressed`. Chúng tôi sẽ giải thích những gì chúng làm dưới đây:
+
+```javascript
+// HelloWorld.js
+
+//chỉ được gọi một lần
+useEffect(async () => {
+ //TODO: thực hiện
+}, [])
+
+function addSmartContractListener() {
+ //TODO: thực hiện
+}
+
+function addWalletListener() {
+ //TODO: thực hiện
+}
+
+const connectWalletPressed = async () => {
+ //TODO: thực hiện
+}
+
+const onUpdatePressed = async () => {
+ //TODO: thực hiện
+}
+```
+
+- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html)- đây là một hook của React được gọi sau khi thành phần của bạn được kết xuất. Bởi vì nó có một mảng trống `[]` được truyền vào (xem dòng 4), nó sẽ chỉ được gọi trong lần kết xuất _đầu tiên_ của thành phần. Ở đây chúng ta sẽ tải thông điệp hiện tại được lưu trữ trong hợp đồng thông minh của mình, gọi các trình lắng nghe hợp đồng thông minh và ví của chúng ta, và cập nhật giao diện người dùng của chúng ta để phản ánh liệu một ví đã được kết nối hay chưa.
+- `addSmartContractListener`- hàm này thiết lập một trình lắng nghe sẽ theo dõi sự kiện `UpdatedMessages` của hợp đồng HelloWorld của chúng ta và cập nhật giao diện người dùng của chúng ta khi thông điệp được thay đổi trong hợp đồng thông minh của chúng ta.
+- `addWalletListener`- hàm này thiết lập một trình lắng nghe phát hiện các thay đổi trong trạng thái ví MetaMask của người dùng, chẳng hạn như khi người dùng ngắt kết nối ví của họ hoặc chuyển đổi địa chỉ.
+- `connectWalletPressed`- hàm này sẽ được gọi để kết nối ví MetaMask của người dùng với ứng dụng phi tập trung của chúng tôi.
+- `onUpdatePressed` - hàm này sẽ được gọi khi người dùng muốn cập nhật thông điệp được lưu trữ trong hợp đồng thông minh.
+
+Gần cuối tệp này, chúng ta có UI của thành phần của mình.
+
+```javascript
+// HelloWorld.js
+
+//giao diện người dùng của thành phần của chúng ta
+return (
+
+
+
+
+ Thông điệp Hiện tại:
+ {message}
+
+ Thông điệp Mới:
+
+
+ setNewMessage(e.target.value)}
+ value={newMessage}
+ />
+ {status}
+
+
+
+
+)
+```
+
+Nếu bạn quét mã này một cách cẩn thận, bạn sẽ nhận thấy nơi chúng ta sử dụng các biến trạng thái khác nhau trong giao diện người dùng của mình:
+
+- Ở các dòng 6-12, nếu ví của người dùng được kết nối (tức là `walletAddress.length > 0`), chúng ta sẽ hiển thị một phiên bản rút gọn của `walletAddress` của người dùng trong nút có ID "walletButton;" nếu không, nó chỉ đơn giản là "Kết nối Ví."
+- Trên dòng 17, chúng ta hiển thị thông điệp hiện tại được lưu trữ trong hợp đồng thông minh, được ghi lại trong chuỗi `message`.
+- Trên các dòng 23-26, chúng tôi sử dụng một [thành phần được kiểm soát](https://legacy.reactjs.org/docs/forms.html#controlled-components) để cập nhật biến trạng thái `newMessage` của mình khi đầu vào trong trường văn bản thay đổi.
+
+Ngoài các biến trạng thái của chúng ta, bạn cũng sẽ thấy rằng các hàm `connectWalletPressed` và `onUpdatePressed` được gọi khi các nút có ID `publishButton` và `walletButton` được nhấp tương ứng.
+
+Cuối cùng, hãy giải quyết vấn đề thành phần `HelloWorld.js` này được thêm vào đâu.
+
+Nếu bạn vào tệp `App.js`, là thành phần chính trong React hoạt động như một vùng chứa cho tất cả các thành phần khác, bạn sẽ thấy rằng thành phần `HelloWorld.js` của chúng ta được chèn vào dòng 7.
+
+Cuối cùng nhưng không kém phần quan trọng, hãy kiểm tra thêm một tệp nữa được cung cấp cho bạn, tệp `interact.js`.
+
+#### Tệp `interact.js` {#the-interact-js-file}
+
+Bởi vì chúng tôi muốn tuân theo mô hình [M-V-C](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller), chúng tôi sẽ muốn có một tệp riêng chứa tất cả các hàm của mình để quản lý logic, dữ liệu và quy tắc của ứng dụng phi tập trung của mình, và sau đó có thể xuất các hàm đó sang giao diện người dùng của chúng tôi (thành phần `HelloWorld.js` của chúng tôi).
+
+👆🏽Đây chính là mục đích của tệp `interact.js` của chúng ta!
+
+Điều hướng đến thư mục `util` trong thư mục `src` của bạn, và bạn sẽ nhận thấy chúng tôi đã bao gồm một tệp có tên `interact.js` sẽ chứa tất cả các hàm và biến tương tác hợp đồng thông minh và ví của chúng tôi.
+
+```javascript
+// interact.js
+
+//export const helloWorldContract;
+
+export const loadCurrentMessage = async () => {}
+
+export const connectWallet = async () => {}
+
+const getCurrentWalletConnected = async () => {}
+
+export const updateMessage = async (message) => {}
+```
+
+Bạn sẽ nhận thấy ở đầu tệp rằng chúng tôi đã chú thích đối tượng `helloWorldContract`. Sau này trong hướng dẫn này, chúng tôi sẽ bỏ chú thích đối tượng này và khởi tạo hợp đồng thông minh của mình trong biến này, sau đó chúng tôi sẽ xuất nó vào thành phần `HelloWorld.js` của mình.
+
+Bốn hàm chưa được triển khai sau đối tượng `helloWorldContract` của chúng ta thực hiện những việc sau:
+
+- `loadCurrentMessage` - hàm này xử lý logic tải thông điệp hiện tại được lưu trữ trong hợp đồng thông minh. Nó sẽ thực hiện một lệnh gọi _đọc_ đến hợp đồng thông minh Hello World bằng cách sử dụng [Giao diện Lập trình Ứng dụng Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3).
+- `connectWallet` - hàm này sẽ kết nối MetaMask của người dùng với ứng dụng phi tập trung của chúng tôi.
+- `getCurrentWalletConnected` - hàm này sẽ kiểm tra xem một tài khoản Ethereum đã được kết nối với ứng dụng phi tập trung của chúng ta khi tải trang hay chưa và cập nhật giao diện người dùng của chúng ta cho phù hợp.
+- `updateMessage` - hàm này sẽ cập nhật thông điệp được lưu trữ trong hợp đồng thông minh. Nó sẽ thực hiện một lệnh gọi _ghi_ đến hợp đồng thông minh Hello World, vì vậy ví MetaMask của người dùng sẽ phải ký một giao dịch Ethereum để cập nhật thông điệp.
+
+Bây giờ chúng ta đã hiểu những gì chúng ta đang làm việc, hãy cùng tìm hiểu cách đọc từ hợp đồng thông minh của chúng ta!
+
+### Bước 3: Đọc từ hợp đồng thông minh của bạn {#step-3-read-from-your-smart-contract}
+
+Để đọc từ hợp đồng thông minh của bạn, bạn sẽ cần thiết lập thành công:
+
+- Kết nối Giao diện Lập trình Ứng dụng với chuỗi Ethereum
+- Một phiên bản đã tải của hợp đồng thông minh của bạn
+- Một hàm để gọi đến hàm hợp đồng thông minh của bạn
+- Một trình lắng nghe để theo dõi các cập nhật khi dữ liệu bạn đang đọc từ hợp đồng thông minh thay đổi
+
+Điều này nghe có vẻ như rất nhiều bước, nhưng đừng lo lắng! Chúng tôi sẽ hướng dẫn bạn cách thực hiện từng bước một! :\)
+
+#### Thiết lập kết nối Giao diện Lập trình Ứng dụng với chuỗi Ethereum {#establish-an-api-connection-to-the-ethereum-chain}
+
+Vậy bạn có nhớ trong Phần 2 của hướng dẫn này, chúng ta đã sử dụng khóa Alchemy Web3 để đọc từ hợp đồng thông minh của mình không ([https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library))? Bạn cũng sẽ cần một khóa Alchemy Web3 trong ứng dụng phi tập trung của mình để đọc từ chuỗi.
+
+Nếu bạn chưa có, trước tiên hãy cài đặt [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) bằng cách điều hướng đến thư mục gốc của `starter-files` và chạy lệnh sau trong thiết bị đầu cuối của bạn:
+
+```text
+npm install @alch/alchemy-web3
+```
+
+[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) là một trình bao bọc xung quanh [Web3.js](https://docs.web3js.org/), cung cấp các phương thức Giao diện Lập trình Ứng dụng nâng cao và các lợi ích quan trọng khác để giúp cuộc sống của bạn với tư cách là một nhà phát triển web3 dễ dàng hơn. Nó được thiết kế để yêu cầu cấu hình tối thiểu để bạn có thể bắt đầu sử dụng nó trong ứng dụng của mình ngay lập tức!
+
+Sau đó, cài đặt gói [dotenv](https://www.npmjs.com/package/dotenv) trong thư mục dự án của bạn, để chúng ta có một nơi bảo mật để lưu trữ khóa Giao diện Lập trình Ứng dụng của mình sau khi chúng ta lấy nó.
+
+```text
+npm install dotenv --save
+```
+
+Đối với ứng dụng phi tập trung của chúng ta, **chúng ta sẽ sử dụng khóa Giao diện Lập trình Ứng dụng Websockets** thay vì khóa Giao diện Lập trình Ứng dụng HTTP của mình, vì nó sẽ cho phép chúng ta thiết lập một trình lắng nghe phát hiện khi thông điệp được lưu trữ trong hợp đồng thông minh thay đổi.
+
+Sau khi có khóa Giao diện Lập trình Ứng dụng, hãy tạo tệp `.env` trong thư mục gốc của bạn và thêm url Alchemy Websockets của bạn vào đó. Sau đó, tệp `.env` của bạn sẽ trông như sau:
+
+```javascript
+REACT_APP_ALCHEMY_KEY = wss://eth-goerli.ws.alchemyapi.io/v2/
+```
+
+Bây giờ, chúng ta đã sẵn sàng để thiết lập điểm cuối Alchemy Web3 trong ứng dụng phi tập trung của mình! Hãy quay lại `interact.js` của chúng ta, nằm trong thư mục `util` của chúng ta và thêm mã sau vào đầu tệp:
+
+```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;
+```
+
+Ở trên, chúng tôi đã nhập khóa Alchemy từ tệp `.env` của mình và sau đó truyền `alchemyKey` của mình cho `createAlchemyWeb3` để thiết lập điểm cuối Alchemy Web3 của mình.
+
+Với điểm cuối này đã sẵn sàng, đã đến lúc tải hợp đồng thông minh của chúng ta!
+
+#### Tải hợp đồng thông minh Hello World của bạn {#loading-your-hello-world-smart-contract}
+
+Để tải hợp đồng thông minh Hello World của bạn, bạn sẽ cần địa chỉ hợp đồng và Giao diện nhị phân ứng dụng (ABI) của nó, cả hai đều có thể được tìm thấy trên Etherscan nếu bạn đã hoàn thành [Phần 3 của hướng dẫn này.](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan)
+
+#### Cách lấy Giao diện nhị phân ứng dụng (ABI) của hợp đồng của bạn từ Etherscan {#how-to-get-your-contract-abi-from-etherscan}
+
+Nếu bạn bỏ qua Phần 3 của hướng dẫn này, bạn có thể sử dụng hợp đồng HelloWorld với địa chỉ [0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code). Giao diện nhị phân ứng dụng (ABI) của nó có thể được tìm thấy [tại đây](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code).
+
+Giao diện nhị phân ứng dụng (ABI) của hợp đồng là cần thiết để chỉ định hàm mà hợp đồng sẽ gọi cũng như đảm bảo rằng hàm sẽ trả về dữ liệu ở định dạng bạn mong đợi. Sau khi chúng ta đã sao chép Giao diện nhị phân ứng dụng (ABI) của hợp đồng, hãy lưu nó dưới dạng tệp JSON có tên `contract-abi.json` trong thư mục `src` của bạn.
+
+contract-abi.json của bạn nên được lưu trữ trong thư mục src của bạn.
+
+Với địa chỉ hợp đồng, Giao diện nhị phân ứng dụng (ABI) và điểm cuối Alchemy Web3, chúng ta có thể sử dụng [phương thức hợp đồng](https://docs.web3js.org/api/web3-eth-contract/class/Contract) để tải một phiên bản của hợp đồng thông minh của mình. Nhập Giao diện nhị phân ứng dụng (ABI) của hợp đồng vào tệp `interact.js` và thêm địa chỉ hợp đồng của bạn.
+
+```javascript
+// interact.js
+
+const contractABI = require("../contract-abi.json")
+const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A"
+```
+
+Bây giờ chúng ta có thể cuối cùng bỏ chú thích biến `helloWorldContract` của mình và tải hợp đồng thông minh bằng điểm cuối AlchemyWeb3 của chúng ta:
+
+```javascript
+// interact.js
+export const helloWorldContract = new web3.eth.Contract(
+ contractABI,
+ contractAddress
+)
+```
+
+Để tóm tắt, 12 dòng đầu tiên của `interact.js` của bạn bây giờ sẽ trông như thế này:
+
+```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
+)
+```
+
+Bây giờ chúng ta đã tải hợp đồng của mình, chúng ta có thể triển khai hàm `loadCurrentMessage` của mình!
+
+#### Triển khai `loadCurrentMessage` trong tệp `interact.js` của bạn {#implementing-loadCurrentMessage-in-your-interact-js-file}
+
+Hàm này cực kỳ đơn giản. Chúng ta sẽ thực hiện một lệnh gọi web3 không đồng bộ đơn giản để đọc từ hợp đồng của mình. Hàm của chúng ta sẽ trả về thông điệp được lưu trữ trong hợp đồng thông minh:
+
+Cập nhật `loadCurrentMessage` trong tệp `interact.js` của bạn thành như sau:
+
+```javascript
+// interact.js
+
+export const loadCurrentMessage = async () => {
+ const message = await helloWorldContract.methods.message().call()
+ return message
+}
+```
+
+Vì chúng tôi muốn hiển thị hợp đồng thông minh này trong giao diện người dùng của mình, hãy cập nhật hàm `useEffect` trong thành phần `HelloWorld.js` của chúng tôi thành như sau:
+
+```javascript
+// HelloWorld.js
+
+//chỉ được gọi một lần
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+}, [])
+```
+
+Lưu ý, chúng ta chỉ muốn `loadCurrentMessage` được gọi một lần trong lần kết xuất đầu tiên của thành phần. Chúng tôi sẽ sớm triển khai `addSmartContractListener` để tự động cập nhật giao diện người dùng sau khi thông điệp trong hợp đồng thông minh thay đổi.
+
+Trước khi đi sâu vào trình lắng nghe của chúng ta, hãy kiểm tra những gì chúng ta đã có cho đến nay! Lưu các tệp `HelloWorld.js` và `interact.js` của bạn, sau đó truy cập [http://localhost:3000/](http://localhost:3000/)
+
+Bạn sẽ nhận thấy rằng thông điệp hiện tại không còn ghi "Không có kết nối với mạng." Thay vào đó, nó phản ánh thông điệp được lưu trữ trong hợp đồng thông minh. Tuyệt!
+
+#### Giao diện người dùng của bạn bây giờ sẽ phản ánh thông điệp được lưu trữ trong hợp đồng thông minh {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract}
+
+Bây giờ nói về trình lắng nghe đó...
+
+#### Triển khai `addSmartContractListener` {#implement-addsmartcontractlistener}
+
+Nếu bạn nghĩ lại về tệp `HelloWorld.sol` mà chúng ta đã viết trong [Phần 1 của loạt hướng dẫn này](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract), bạn sẽ nhớ lại rằng có một sự kiện hợp đồng thông minh được gọi là `UpdatedMessages` được phát ra sau khi hàm `update` của hợp đồng thông minh của chúng ta được gọi (xem các dòng 9 và 27):
+
+```javascript
+// HelloWorld.sol
+
+// Chỉ định phiên bản của Solidity, sử dụng lập phiên bản ngữ nghĩa.
+// Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+pragma solidity ^0.7.3;
+
+// Định nghĩa một hợp đồng có tên là `HelloWorld`.
+// Một hợp đồng là một tập hợp các hàm và dữ liệu (trạng thái của nó). Sau khi được triển khai, một hợp đồng nằm ở một địa chỉ cụ thể trên chuỗi khối Ethereum. Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+contract HelloWorld {
+
+ //Phát ra khi hàm cập nhật được gọi
+ //Các sự kiện hợp đồng thông minh là một cách để hợp đồng của bạn giao tiếp rằng điều gì đó đã xảy ra trên chuỗi khối với giao diện người dùng ứng dụng của bạn, giao diện này có thể 'lắng nghe' các sự kiện nhất định và thực hiện hành động khi chúng xảy ra.
+ event UpdatedMessages(string oldStr, string newStr);
+
+ // Khai báo một biến trạng thái `message` thuộc loại `string`.
+ // Các biến trạng thái là các biến có giá trị được lưu trữ vĩnh viễn trong bộ lưu trữ hợp đồng. Từ khóa `public` giúp các biến có thể truy cập được từ bên ngoài hợp đồng và tạo ra một hàm mà các hợp đồng hoặc ứng dụng khách khác có thể gọi để truy cập giá trị.
+ string public message;
+
+ // Tương tự như nhiều ngôn ngữ lập trình hướng đối tượng dựa trên lớp, một hàm tạo là một hàm đặc biệt chỉ được thực thi khi tạo hợp đồng.
+ // Hàm tạo được sử dụng để khởi tạo dữ liệu của hợp đồng. Tìm hiểu thêm:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ constructor(string memory initMessage) {
+
+ // Chấp nhận một đối số chuỗi `initMessage` và đặt giá trị vào biến lưu trữ `message` của hợp đồng).
+ message = initMessage;
+ }
+
+ // Một hàm công khai chấp nhận một đối số chuỗi và cập nhật biến lưu trữ `message`.
+ function update(string memory newMessage) public {
+ string memory oldMsg = message;
+ message = newMessage;
+ emit UpdatedMessages(oldMsg, newMessage);
+ }
+}
+```
+
+Các sự kiện hợp đồng thông minh là một cách để hợp đồng của bạn giao tiếp rằng điều gì đó đã xảy ra (tức là có một _sự kiện_) trên chuỗi khối với ứng dụng giao diện người dùng của bạn, ứng dụng này có thể 'lắng nghe' các sự kiện cụ thể và thực hiện hành động khi chúng xảy ra.
+
+Hàm `addSmartContractListener` sẽ lắng nghe cụ thể sự kiện `UpdatedMessages` của hợp đồng thông minh Hello World của chúng ta và cập nhật giao diện người dùng của chúng ta để hiển thị thông điệp mới.
+
+Sửa đổi `addSmartContractListener` thành như sau:
+
+```javascript
+// HelloWorld.js
+
+function addSmartContractListener() {
+ helloWorldContract.events.UpdatedMessages({}, (error, data) => {
+ if (error) {
+ setStatus("😥 " + error.message)
+ } else {
+ setMessage(data.returnValues[1])
+ setNewMessage("")
+ setStatus("🎉 Thông điệp của bạn đã được cập nhật!")
+ }
+ })
+}
+```
+
+Hãy cùng phân tích những gì xảy ra khi trình lắng nghe phát hiện một sự kiện:
+
+- Nếu có lỗi xảy ra khi sự kiện được phát ra, nó sẽ được phản ánh trong giao diện người dùng thông qua biến trạng thái `status` của chúng ta.
+- Nếu không, chúng ta sẽ sử dụng đối tượng `data` được trả về. `data.returnValues` là một mảng được lập chỉ mục tại 0, trong đó phần tử đầu tiên trong mảng lưu trữ thông điệp trước đó và phần tử thứ hai lưu trữ thông điệp đã cập nhật. Nói chung, trong một sự kiện thành công, chúng ta sẽ đặt chuỗi `message` của mình thành thông điệp đã cập nhật, xóa chuỗi `newMessage`, và cập nhật biến trạng thái `status` của mình để phản ánh rằng một thông điệp mới đã được xuất bản trên hợp đồng thông minh của chúng ta.
+
+Cuối cùng, hãy gọi trình lắng nghe của chúng ta trong hàm `useEffect` để nó được khởi tạo trong lần kết xuất đầu tiên của thành phần `HelloWorld.js`. Nói chung, hàm `useEffect` của bạn sẽ trông như thế này:
+
+```javascript
+// HelloWorld.js
+
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+ addSmartContractListener()
+}, [])
+```
+
+Bây giờ chúng ta đã có thể đọc từ hợp đồng thông minh của mình, sẽ rất tuyệt nếu tìm ra cách viết vào nó nữa! Tuy nhiên, để ghi vào ứng dụng phi tập trung của mình, trước tiên chúng ta phải có một ví Ethereum được kết nối với nó.
+
+Vì vậy, tiếp theo chúng ta sẽ giải quyết việc thiết lập ví Ethereum của mình (MetaMask) và sau đó kết nối nó với ứng dụng phi tập trung của mình!
+
+### Bước 4: Thiết lập ví Ethereum của bạn {#step-4-set-up-your-ethereum-wallet}
+
+Để viết bất cứ điều gì lên chuỗi Ethereum, người dùng phải ký các giao dịch bằng khóa riêng tư của ví ảo của họ. Đối với hướng dẫn này, chúng tôi sẽ sử dụng [MetaMask](https://metamask.io/), một ví ảo trong trình duyệt được sử dụng để quản lý địa chỉ tài khoản Ethereum của bạn, vì nó giúp việc ký giao dịch này trở nên siêu dễ dàng cho người dùng cuối.
+
+Nếu bạn muốn tìm hiểu thêm về cách thức hoạt động của các giao dịch trên Ethereum, hãy xem [trang này](/developers/docs/transactions/) từ Ethereum Foundation.
+
+#### Tải xuống MetaMask {#download-metamask}
+
+Bạn có thể tải xuống và tạo tài khoản MetaMask miễn phí [tại đây](https://metamask.io/download). Khi bạn tạo tài khoản, hoặc nếu bạn đã có tài khoản, hãy đảm bảo chuyển sang “Mạng thử nghiệm Goerli” ở phía trên bên phải (để chúng ta không phải giao dịch bằng tiền thật).
+
+#### Thêm ether từ một Faucet {#add-ether-from-a-faucet}
+
+Để ký một giao dịch trên chuỗi khối Ethereum, chúng ta sẽ cần một ít Eth giả. Để nhận Eth, bạn có thể vào [FaucETH](https://fauceth.komputing.org) và nhập địa chỉ tài khoản Goerli của bạn, nhấp vào “Request funds”, sau đó chọn “Ethereum Testnet Goerli” trong menu thả xuống và cuối cùng nhấp lại vào nút “Request funds”. Bạn sẽ sớm thấy Eth trong tài khoản MetaMask của mình!
+
+#### Kiểm tra số dư của bạn {#check-your-balance}
+
+Để kiểm tra lại số dư của chúng ta, hãy thực hiện một yêu cầu [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) bằng cách sử dụng [công cụ soạn thảo của 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). Thao tác này sẽ trả về số lượng Eth trong ví của chúng ta. Sau khi bạn nhập địa chỉ tài khoản MetaMask của mình và nhấp vào “Send Request”, bạn sẽ thấy một phản hồi như sau:
+
+```text
+{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}
+```
+
+**LƯU Ý:** Kết quả này tính bằng wei chứ không phải eth. Wei được sử dụng làm mệnh giá nhỏ nhất của ether. Việc chuyển đổi từ wei sang eth là: 1 eth = 10¹⁸ wei. Vì vậy, nếu chúng ta chuyển đổi 0xde0b6b3a7640000 sang hệ thập phân, chúng ta sẽ nhận được 1\*10¹⁸, tương đương với 1 eth.
+
+Phù! Tiền giả của chúng ta đã có đủ! 🤑
+
+### Bước 5: Kết nối MetaMask với giao diện người dùng của bạn {#step-5-connect-metamask-to-your-UI}
+
+Bây giờ ví MetaMask của chúng ta đã được thiết lập, hãy kết nối ứng dụng phi tập trung của chúng ta với nó!
+
+#### Hàm `connectWallet` {#the-connectWallet-function}
+
+Trong tệp `interact.js` của chúng ta, hãy triển khai hàm `connectWallet`, sau đó chúng ta có thể gọi nó trong thành phần `HelloWorld.js` của mình.
+
+Hãy sửa đổi `connectWallet` thành như sau:
+
+```javascript
+// interact.js
+
+export const connectWallet = async () => {
+ if (window.ethereum) {
+ try {
+ const addressArray = await window.ethereum.request({
+ method: "eth_requestAccounts",
+ })
+ const obj = {
+ status: "👆🏽 Viết một thông điệp vào trường văn bản ở trên.",
+ address: addressArray[0],
+ }
+ return obj
+ } catch (err) {
+ return {
+ address: "",
+ status: "😥 " + err.message,
+ }
+ }
+ } else {
+ return {
+ address: "",
+ status: (
+
+
+ {" "}
+ 🦊
+ Bạn phải cài đặt MetaMask, một ví Ethereum ảo, trong trình duyệt của bạn.
+
+
+
+ ),
+ }
+ }
+}
+```
+
+Vậy khối mã khổng lồ này chính xác làm gì?
+
+Chà, đầu tiên, nó kiểm tra xem `window.ethereum` có được bật trong trình duyệt của bạn hay không.
+
+`window.ethereum` là một API toàn cầu được chèn bởi MetaMask và các nhà cung cấp ví khác cho phép các trang web yêu cầu tài khoản Ethereum của người dùng. Nếu được chấp thuận, nó có thể đọc dữ liệu từ các chuỗi khối mà người dùng được kết nối và đề nghị người dùng ký các thông điệp và giao dịch. Hãy xem [tài liệu MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) để biết thêm thông tin!
+
+Nếu `window.ethereum` _không_ có mặt, điều đó có nghĩa là MetaMask chưa được cài đặt. Điều này dẫn đến một đối tượng JSON được trả về, trong đó `address` được trả về là một chuỗi rỗng và đối tượng `status` JSX chuyển tiếp rằng người dùng phải cài đặt MetaMask.
+
+Bây giờ nếu `window.ethereum` _có_ mặt, thì đó là lúc mọi thứ trở nên thú vị.
+
+Sử dụng vòng lặp try/catch, chúng ta sẽ cố gắng kết nối với MetaMask bằng cách gọi [`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts). Việc gọi hàm này sẽ mở MetaMask trong trình duyệt, qua đó người dùng sẽ được nhắc kết nối ví của họ với ứng dụng phi tập trung của bạn.
+
+- Nếu người dùng chọn kết nối, `method: "eth_requestAccounts"` sẽ trả về một mảng chứa tất cả các địa chỉ tài khoản của người dùng đã kết nối với ứng dụng phi tập trung. Nói chung, hàm `connectWallet` của chúng ta sẽ trả về một đối tượng JSON chứa `address` _đầu tiên_ trong mảng này (xem dòng 9) và một thông báo `status` nhắc người dùng viết một tin nhắn cho hợp đồng thông minh.
+- Nếu người dùng từ chối kết nối, thì đối tượng JSON sẽ chứa một chuỗi rỗng cho `address` được trả về và một thông báo `status` phản ánh rằng người dùng đã từ chối kết nối.
+
+Bây giờ chúng ta đã viết hàm `connectWallet` này, bước tiếp theo là gọi nó đến thành phần `HelloWorld.js` của chúng ta.
+
+#### Thêm hàm `connectWallet` vào Thành phần giao diện người dùng `HelloWorld.js` của bạn {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component}
+
+Điều hướng đến hàm `connectWalletPressed` trong `HelloWorld.js` và cập nhật nó thành như sau:
+
+```javascript
+// HelloWorld.js
+
+const connectWalletPressed = async () => {
+ const walletResponse = await connectWallet()
+ setStatus(walletResponse.status)
+ setWallet(walletResponse.address)
+}
+```
+
+Lưu ý cách hầu hết các chức năng của chúng ta được trừu tượng hóa khỏi thành phần `HelloWorld.js` từ tệp `interact.js`? Điều này là để chúng ta tuân thủ mô hình M-V-C!
+
+Trong `connectWalletPressed`, chúng ta chỉ cần thực hiện một lệnh gọi await đến hàm `connectWallet` đã nhập của mình, và sử dụng phản hồi của nó, chúng ta cập nhật các biến `status` và `walletAddress` của mình thông qua các hook trạng thái của chúng.
+
+Bây giờ, hãy lưu cả hai tệp (`HelloWorld.js` và `interact.js`) và kiểm tra giao diện người dùng của chúng ta cho đến nay.
+
+Mở trình duyệt của bạn trên trang [http://localhost:3000/](http://localhost:3000/) và nhấn nút "Kết nối Ví" ở trên cùng bên phải của trang.
+
+Nếu bạn đã cài đặt MetaMask, bạn sẽ được nhắc kết nối ví của mình với ứng dụng phi tập trung của bạn. Chấp nhận lời mời kết nối.
+
+Bạn sẽ thấy rằng nút ví bây giờ phản ánh rằng địa chỉ của bạn đã được kết nối! Tuyệt vời 🔥
+
+Tiếp theo, hãy thử làm mới trang... Điều này thật lạ. Nút ví của chúng ta đang nhắc chúng ta kết nối MetaMask, mặc dù nó đã được kết nối...
+
+Tuy nhiên, đừng sợ! Chúng ta có thể dễ dàng giải quyết vấn đề đó (bạn hiểu chứ?) bằng cách triển khai `getCurrentWalletConnected`, sẽ kiểm tra xem một địa chỉ đã được kết nối với ứng dụng phi tập trung của chúng ta hay chưa và cập nhật giao diện người dùng của chúng ta cho phù hợp!
+
+#### Hàm `getCurrentWalletConnected` {#the-getcurrentwalletconnected-function}
+
+Cập nhật hàm `getCurrentWalletConnected` của bạn trong tệp `interact.js` thành như sau:
+
+```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: "👆🏽 Viết một thông điệp vào trường văn bản ở trên.",
+ }
+ } else {
+ return {
+ address: "",
+ status: "🦊 Kết nối với MetaMask bằng nút trên cùng bên phải.",
+ }
+ }
+ } catch (err) {
+ return {
+ address: "",
+ status: "😥 " + err.message,
+ }
+ }
+ } else {
+ return {
+ address: "",
+ status: (
+
+
+ {" "}
+ 🦊
+ Bạn phải cài đặt MetaMask, một ví Ethereum ảo, trong trình duyệt của bạn.
+
+
+
+ ),
+ }
+ }
+}
+```
+
+Mã này _rất_ tương tự như hàm `connectWallet` mà chúng ta vừa viết ở bước trước.
+
+Sự khác biệt chính là thay vì gọi phương thức `eth_requestAccounts`, phương thức này sẽ mở MetaMask để người dùng kết nối ví của họ, ở đây chúng ta gọi phương thức `eth_accounts`, phương thức này chỉ đơn giản trả về một mảng chứa các địa chỉ MetaMask hiện đang được kết nối với ứng dụng phi tập trung của chúng ta.
+
+Để xem hàm này hoạt động, hãy gọi nó trong hàm `useEffect` của thành phần `HelloWorld.js` của chúng ta:
+
+```javascript
+// HelloWorld.js
+
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+ addSmartContractListener()
+
+ const { address, status } = await getCurrentWalletConnected()
+ setWallet(address)
+ setStatus(status)
+}, [])
+```
+
+Lưu ý, chúng ta sử dụng phản hồi của lệnh gọi đến `getCurrentWalletConnected` để cập nhật các biến trạng thái `walletAddress` và `status` của mình.
+
+Bây giờ bạn đã thêm mã này, hãy thử làm mới cửa sổ trình duyệt của chúng ta.
+
+Tuyệt vời! Nút sẽ hiển thị rằng bạn đã kết nối và hiển thị bản xem trước địa chỉ ví đã kết nối của bạn - ngay cả sau khi bạn làm mới!
+
+#### Triển khai `addWalletListener` {#implement-addwalletlistener}
+
+Bước cuối cùng trong quá trình thiết lập ví ứng dụng phi tập trung của chúng ta là triển khai trình nghe ví để UI của chúng ta cập nhật khi trạng thái ví thay đổi, chẳng hạn như khi người dùng ngắt kết nối hoặc chuyển đổi tài khoản.
+
+Trong tệp `HelloWorld.js` của bạn, sửa đổi hàm `addWalletListener` của bạn như sau:
+
+```javascript
+// HelloWorld.js
+
+function addWalletListener() {
+ if (window.ethereum) {
+ window.ethereum.on("accountsChanged", (accounts) => {
+ if (accounts.length > 0) {
+ setWallet(accounts[0])
+ setStatus("👆🏽 Viết một thông điệp vào trường văn bản ở trên.")
+ } else {
+ setWallet("")
+ setStatus("🦊 Kết nối với MetaMask bằng nút trên cùng bên phải.")
+ }
+ })
+ } else {
+ setStatus(
+
+ {" "}
+ 🦊
+ Bạn phải cài đặt MetaMask, một ví Ethereum ảo, trong trình duyệt của bạn.
+
+
+ )
+ }
+}
+```
+
+Tôi cá là bạn thậm chí không cần sự trợ giúp của chúng tôi để hiểu những gì đang diễn ra ở đây vào thời điểm này, nhưng vì mục đích kỹ lưỡng, hãy nhanh chóng phân tích nó:
+
+- Đầu tiên, hàm của chúng ta kiểm tra xem `window.ethereum` có được bật hay không (tức là MetaMask đã được cài đặt).
+ - Nếu không, chúng ta chỉ cần thiết lập biến trạng thái `status` của mình thành một chuỗi JSX nhắc người dùng cài đặt MetaMask.
+ - Nếu nó được bật, chúng ta sẽ thiết lập trình nghe `window.ethereum.on("accountsChanged")` trên dòng 3 để lắng nghe các thay đổi trạng thái trong ví MetaMask, bao gồm khi người dùng kết nối thêm một tài khoản vào ứng dụng phi tập trung, chuyển đổi tài khoản hoặc ngắt kết nối một tài khoản. Nếu có ít nhất một tài khoản được kết nối, biến trạng thái `walletAddress` sẽ được cập nhật thành tài khoản đầu tiên trong mảng `accounts` được trả về bởi trình nghe. Ngược lại, `walletAddress` được đặt thành một chuỗi rỗng.
+
+Cuối cùng nhưng không kém phần quan trọng, chúng ta phải gọi nó trong hàm `useEffect` của mình:
+
+```javascript
+// HelloWorld.js
+
+useEffect(async () => {
+ const message = await loadCurrentMessage()
+ setMessage(message)
+ addSmartContractListener()
+
+ const { address, status } = await getCurrentWalletConnected()
+ setWallet(address)
+ setStatus(status)
+
+ addWalletListener()
+}, [])
+```
+
+Vậy là xong! Chúng ta đã hoàn thành thành công việc lập trình tất cả các chức năng ví của mình! Bây giờ đến nhiệm vụ cuối cùng của chúng ta: cập nhật thông điệp được lưu trữ trong hợp đồng thông minh của chúng ta!
+
+### Bước 6: Triển khai hàm `updateMessage` {#step-6-implement-the-updateMessage-function}
+
+Được rồi các bạn, chúng ta đã đến chặng cuối cùng! Trong `updateMessage` của tệp `interact.js` của bạn, chúng ta sẽ làm những việc sau:
+
+1. Đảm bảo thông điệp chúng ta muốn xuất bản trong liên hệ thông minh của mình là hợp lệ
+2. Ký giao dịch của chúng ta bằng MetaMask
+3. Gọi hàm này từ thành phần giao diện người dùng `HelloWorld.js` của chúng ta
+
+Điều này sẽ không mất nhiều thời gian; hãy hoàn thành ứng dụng phi tập trung này!
+
+#### Xử lý lỗi đầu vào {#input-error-handling}
+
+Đương nhiên, việc có một số loại xử lý lỗi đầu vào ở đầu hàm là hợp lý.
+
+Chúng ta sẽ muốn hàm của mình trả về sớm nếu không có tiện ích mở rộng MetaMask nào được cài đặt, không có ví nào được kết nối (tức là `address` được truyền vào là một chuỗi trống), hoặc `message` là một chuỗi trống. Hãy thêm xử lý lỗi sau vào `updateMessage`:
+
+```javascript
+// interact.js
+
+export const updateMessage = async (address, message) => {
+ if (!window.ethereum || address === null) {
+ return {
+ status:
+ "💡 Kết nối ví MetaMask của bạn để cập nhật thông điệp trên chuỗi khối.",
+ }
+ }
+
+ if (message.trim() === "") {
+ return {
+ status: "❌ Thông điệp của bạn không thể là một chuỗi trống.",
+ }
+ }
+}
+```
+
+Bây giờ nó đã có xử lý lỗi đầu vào phù hợp, đã đến lúc ký giao dịch qua MetaMask!
+
+#### Ký giao dịch của chúng ta {#signing-our-transaction}
+
+Nếu bạn đã quen thuộc với các giao dịch Ethereum web3 truyền thống, mã chúng ta viết tiếp theo sẽ rất quen thuộc. Bên dưới mã xử lý lỗi đầu vào của bạn, thêm nội dung sau vào `updateMessage`:
+
+```javascript
+// interact.js
+
+//thiết lập các tham số giao dịch
+const transactionParameters = {
+ to: contractAddress, // Bắt buộc trừ khi xuất bản hợp đồng.
+ from: address, // phải khớp với địa chỉ đang hoạt động của người dùng.
+ data: helloWorldContract.methods.update(message).encodeABI(),
+}
+
+//ký giao dịch
+try {
+ const txHash = await window.ethereum.request({
+ method: "eth_sendTransaction",
+ params: [transactionParameters],
+ })
+ return {
+ status: (
+
+ ✅{" "}
+
+ Xem trạng thái giao dịch của bạn trên Etherscan!
+
+
+ ℹ️ Sau khi giao dịch được mạng xác minh, thông điệp sẽ được
+ cập nhật tự động.
+
+ ),
+ }
+} catch (error) {
+ return {
+ status: "😥 " + error.message,
+ }
+}
+```
+
+Hãy cùng phân tích xem điều gì đang xảy ra. Đầu tiên, chúng ta thiết lập các tham số giao dịch của mình, trong đó:
+
+- `to` chỉ định địa chỉ người nhận (hợp đồng thông minh của chúng ta)
+- `from` chỉ định người ký giao dịch, biến `address` mà chúng ta đã truyền vào hàm của mình
+- `data` chứa lệnh gọi đến phương thức `update` của hợp đồng thông minh Hello World của chúng ta, nhận biến chuỗi `message` của chúng ta làm đầu vào
+
+Sau đó, chúng tôi thực hiện một lệnh gọi await, `window.ethereum.request`, trong đó chúng tôi yêu cầu MetaMask ký giao dịch. Lưu ý, ở dòng 11 và 12, chúng ta đang chỉ định phương thức eth của mình, `eth_sendTransaction` và truyền vào `transactionParameters` của chúng ta.
+
+Tại thời điểm này, MetaMask sẽ mở ra trong trình duyệt và nhắc người dùng ký hoặc từ chối giao dịch.
+
+- Nếu giao dịch thành công, hàm sẽ trả về một đối tượng JSON trong đó chuỗi JSX `status` nhắc người dùng kiểm tra Etherscan để biết thêm thông tin về giao dịch của họ.
+- Nếu giao dịch thất bại, hàm sẽ trả về một đối tượng JSON trong đó chuỗi `status` chuyển tiếp thông điệp lỗi.
+
+Nói chung, hàm `updateMessage` của chúng ta sẽ trông như thế này:
+
+```javascript
+// interact.js
+
+export const updateMessage = async (address, message) => {
+ //xử lý lỗi đầu vào
+ if (!window.ethereum || address === null) {
+ return {
+ status:
+ "💡 Kết nối ví MetaMask của bạn để cập nhật thông điệp trên chuỗi khối.",
+ }
+ }
+
+ if (message.trim() === "") {
+ return {
+ status: "❌ Thông điệp của bạn không thể là một chuỗi trống.",
+ }
+ }
+
+ //thiết lập các tham số giao dịch
+ const transactionParameters = {
+ to: contractAddress, // Bắt buộc trừ khi xuất bản hợp đồng.
+ from: address, // phải khớp với địa chỉ đang hoạt động của người dùng.
+ data: helloWorldContract.methods.update(message).encodeABI(),
+ }
+
+ //ký giao dịch
+ try {
+ const txHash = await window.ethereum.request({
+ method: "eth_sendTransaction",
+ params: [transactionParameters],
+ })
+ return {
+ status: (
+
+ ✅{" "}
+
+ Xem trạng thái giao dịch của bạn trên Etherscan!
+
+
+ ℹ️ Sau khi giao dịch được mạng xác minh, thông điệp sẽ được
+ cập nhật tự động.
+
+ ),
+ }
+ } catch (error) {
+ return {
+ status: "😥 " + error.message,
+ }
+ }
+}
+```
+
+Cuối cùng nhưng không kém phần quan trọng, chúng ta cần kết nối hàm `updateMessage` của mình với thành phần `HelloWorld.js`.
+
+#### Kết nối `updateMessage` với giao diện người dùng `HelloWorld.js` {#connect-updatemessage-to-the-helloworld-js-frontend}
+
+Hàm `onUpdatePressed` của chúng ta sẽ thực hiện một lệnh gọi await đến hàm `updateMessage` được nhập và sửa đổi biến trạng thái `status` để phản ánh xem giao dịch của chúng ta đã thành công hay thất bại:
+
+```javascript
+// HelloWorld.js
+
+const onUpdatePressed = async () => {
+ const { status } = await updateMessage(walletAddress, newMessage)
+ setStatus(status)
+}
+```
+
+Nó siêu gọn gàng và đơn giản. Và đoán xem... ỨNG DỤNG PHI TẬP TRUNG CỦA BẠN ĐÃ HOÀN THÀNH!!!
+
+Hãy tiếp tục và kiểm tra nút **Cập nhật**!
+
+### Tạo ứng dụng phi tập trung tùy chỉnh của riêng bạn {#make-your-own-custom-dapp}
+
+Wooooo, bạn đã đi đến cuối hướng dẫn! Để tóm tắt, bạn đã học cách:
+
+- Kết nối ví MetaMask với dự án ứng dụng phi tập trung của bạn
+- Đọc dữ liệu từ hợp đồng thông minh của bạn bằng cách sử dụng Giao diện Lập trình Ứng dụng [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3)
+- Ký các giao dịch Ethereum bằng MetaMask
+
+Bây giờ bạn đã được trang bị đầy đủ để áp dụng các kỹ năng từ hướng dẫn này để xây dựng dự án ứng dụng phi tập trung tùy chỉnh của riêng bạn! Như mọi khi, nếu bạn có bất kỳ câu hỏi nào, đừng ngần ngại liên hệ với chúng tôi để được trợ giúp trong [Alchemy Discord](https://discord.gg/gWuC7zB). 🧙♂️
+
+Sau khi hoàn thành hướng dẫn này, hãy cho chúng tôi biết trải nghiệm của bạn như thế nào hoặc nếu bạn có bất kỳ phản hồi nào bằng cách gắn thẻ chúng tôi trên Twitter [@alchemyplatform](https://twitter.com/AlchemyPlatform)!
diff --git a/public/content/translations/vi/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/hello-world-smart-contract/index.md
new file mode 100644
index 00000000000..4664d82424f
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/hello-world-smart-contract/index.md
@@ -0,0 +1,367 @@
+---
+title: Hợp đồng thông minh Hello World dành cho người mới bắt đầu
+description: Hướng dẫn giới thiệu về cách viết và triển khai một hợp đồng thông minh đơn giản trên Ethereum.
+author: "elanh"
+tags:
+ [
+ "solidity",
+ "hardhat",
+ "từ Alchemy",
+ "hợp đồng thông minh",
+ "triển khai"
+ ]
+skill: beginner
+lang: vi
+published: 2021-03-31
+---
+
+Nếu bạn mới bắt đầu phát triển chuỗi khối và không biết bắt đầu từ đâu, hoặc nếu bạn chỉ muốn hiểu cách triển khai và tương tác với các hợp đồng thông minh, thì hướng dẫn này là dành cho bạn. Chúng tôi sẽ hướng dẫn từng bước tạo và triển khai một hợp đồng thông minh đơn giản trên mạng thử nghiệm Sepolia bằng ví ảo [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) và [Alchemy](https://www.alchemy.com/eth) (đừng lo lắng nếu bạn chưa hiểu bất kỳ điều gì trong số này, chúng tôi sẽ giải thích).
+
+Trong [phần 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) của hướng dẫn này, chúng tôi sẽ trình bày cách chúng tôi có thể tương tác với hợp đồng thông minh của mình sau khi nó được triển khai tại đây và trong [phần 3](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan), chúng tôi sẽ đề cập đến cách xuất bản nó trên Etherscan.
+
+Nếu bạn có bất kỳ câu hỏi nào, vui lòng liên hệ trong [Alchemy Discord](https://discord.gg/gWuC7zB)!
+
+## Bước 1: Kết nối với mạng Ethereum {#step-1}
+
+Có nhiều cách để thực hiện yêu cầu đến chuỗi Ethereum. Để đơn giản, chúng tôi sẽ sử dụng một tài khoản miễn phí trên Alchemy, một nền tảng và API dành cho nhà phát triển chuỗi khối cho phép chúng tôi giao tiếp với chuỗi Ethereum mà không cần phải chạy các nút của riêng mình. Nền tảng này cũng có các công cụ dành cho nhà phát triển để giám sát và phân tích mà chúng tôi sẽ tận dụng trong hướng dẫn này để hiểu cơ chế hoạt động bên trong việc triển khai hợp đồng thông minh của chúng tôi. Nếu bạn chưa có tài khoản Alchemy, [bạn có thể đăng ký miễn phí tại đây](https://dashboard.alchemy.com/signup).
+
+## Bước 2: Tạo ứng dụng của bạn (và khóa API) {#step-2}
+
+Khi bạn đã tạo tài khoản Alchemy, bạn có thể tạo một khoá API bằng cách tạo một ứng dụng. Điều này sẽ cho phép chúng ta gửi yêu cầu đến mạng thử nghiệm Sepolia. Nếu bạn không quen thuộc với các mạng thử nghiệm, hãy xem [trang này](/developers/docs/networks/).
+
+1. Điều hướng đến trang "Tạo ứng dụng mới" trong Trang tổng quan Alchemy của bạn bằng cách chọn "Chọn một ứng dụng" trong thanh điều hướng và nhấp vào "Tạo ứng dụng mới"
+
+
+
+2. Đặt tên cho ứng dụng của bạn là “Hello World”, cung cấp một mô tả ngắn và chọn một trường hợp sử dụng, ví dụ: "Cơ sở hạ tầng & Công cụ." Tiếp theo, tìm kiếm "Ethereum" và chọn mạng.
+
+
+
+3. Nhấp vào "Tiếp theo" để tiếp tục, sau đó nhấp vào “Tạo ứng dụng” và thế là xong! Ứng dụng của bạn sẽ xuất hiện trong menu thả xuống của thanh điều hướng, với Khóa API có sẵn để sao chép.
+
+## Bước 3: Tạo một tài khoản Ethereum (địa chỉ) {#step-3}
+
+Chúng ta cần một tài khoản Ethereum để gửi và nhận giao dịch. Trong bài hướng dẫn này, chúng ta sẽ sử dụng MetaMask, một ví ảo trong trình duyệt dùng để quản lý địa chỉ tài khoản Ethereum của bạn. Thông tin thêm về [giao dịch](/developers/docs/transactions/).
+
+Bạn có thể tải xuống MetaMask và tạo một tài khoản Ethereum miễn phí [tại đây](https://metamask.io/download). Khi bạn đang tạo một tài khoản, hoặc nếu bạn đã có tài khoản, hãy đảm bảo chuyển sang mạng thử nghiệm "Sepolia" bằng menu thả xuống của mạng (để chúng ta không phải xử lý tiền thật).
+
+Nếu bạn không thấy Sepolia được liệt kê, hãy vào menu, sau đó chọn Nâng cao và cuộn xuống để bật "Hiển thị các mạng thử nghiệm". Trong menu lựa chọn mạng, chọn tab "Tùy chỉnh" để tìm danh sách các mạng thử nghiệm và chọn "Sepolia."
+
+
+
+## Bước 4: Thêm ether từ một vòi {#step-4}
+
+Để triển khai hợp đồng thông minh của chúng ta trên mạng thử nghiệm, chúng ta sẽ cần một ít Eth giả. Để nhận Sepolia ETH, bạn có thể truy cập [chi tiết mạng Sepolia](/developers/docs/networks/#sepolia) để xem danh sách các vòi khác nhau. Nếu một vòi không hoạt động, hãy thử một vòi khác vì đôi khi chúng có thể cạn kiệt. Có thể mất một chút thời gian để nhận được ETH giả của bạn do lưu lượng mạng. Bạn sẽ sớm thấy ETH trong tài khoản Metamask của mình!
+
+## Bước 5: Kiểm tra Số dư của bạn {#step-5}
+
+Để kiểm tra lại số dư của chúng ta, hãy thực hiện một yêu cầu [eth_getBalance](/developers/docs/apis/json-rpc/#eth_getbalance) bằng cách sử dụng [công cụ soạn thảo của Alchemy](https://sandbox.alchemy.com/?network=ETH_SEPOLIA&method=eth_getBalance&body.id=1&body.jsonrpc=2.0&body.method=eth_getBalance&body.params%5B0%5D=&body.params%5B1%5D=latest). Thao tác này sẽ trả về lượng ETH có trong ví của chúng ta. Sau khi bạn nhập địa chỉ tài khoản MetaMask của mình và nhấp vào “Send Request”, bạn sẽ thấy một phản hồi như sau:
+
+```json
+{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }
+```
+
+> **LƯU Ý:** Kết quả này tính bằng wei chứ không phải ETH. Wei được sử dụng làm mệnh giá nhỏ nhất của ether. Việc chuyển đổi từ wei sang ETH là: 1 eth = 1018 wei. Vì vậy, nếu chúng ta chuyển 0x2B5E3AF16B1880000 sang hệ thập phân, chúng ta sẽ nhận được 5\*10¹⁸ tương đương với 5 ETH.
+>
+> Phù! Tiền giả của chúng ta đã có đủ .
+
+## Bước 6: Khởi tạo dự án của chúng ta {#step-6}
+
+Đầu tiên, chúng ta sẽ cần tạo một thư mục cho dự án của mình. Điều hướng đến dòng lệnh của bạn và gõ:
+
+```
+mkdir hello-world
+cd hello-world
+```
+
+Bây giờ chúng ta đang ở trong thư mục dự án của mình, chúng ta sẽ sử dụng `npm init` để khởi tạo dự án. Nếu bạn chưa cài đặt npm, hãy làm theo [các hướng dẫn sau](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (chúng ta cũng sẽ cần Node.js vì vậy hãy tải nó xuống luôn nhé!).
+
+```
+npm init
+```
+
+Việc bạn trả lời các câu hỏi cài đặt như thế nào không thực sự quan trọng, sau đây là cách chúng tôi đã làm để bạn tham khảo:
+
+```
+tên gói: (hello-world)
+phiên bản: (1.0.0)
+mô tả: hợp đồng thông minh hello world
+điểm vào: (index.js)
+lệnh kiểm tra:
+kho lưu trữ git:
+từ khóa:
+tác giả:
+giấy phép: (ISC)
+Sắp ghi vào /Users/.../.../.../hello-world/package.json:
+
+{
+ "name": "hello-world",
+ "version": "1.0.0",
+ "description": "hợp đồng thông minh hello world",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \\"Error: no test specified\\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
+```
+
+Phê duyệt package.json và chúng ta đã sẵn sàng!
+
+## Bước 7: Tải xuống [Hardhat](https://hardhat.org/getting-started/#overview) {#step-7}
+
+Hardhat là một môi trường phát triển để biên dịch, triển khai, kiểm thử và gỡ lỗi phần mềm Ethereum của bạn. Nó giúp các nhà phát triển khi xây dựng hợp đồng thông minh và các ứng dụng phi tập trung cục bộ trước khi triển khai lên chuỗi chính.
+
+Bên trong dự án `hello-world` của chúng ta, chạy:
+
+```
+npm install --save-dev hardhat
+```
+
+Hãy xem trang này để biết thêm chi tiết về [hướng dẫn cài đặt](https://hardhat.org/getting-started/#overview).
+
+## Bước 8: Tạo dự án Hardhat {#step-8}
+
+Bên trong thư mục dự án của chúng ta, hãy chạy:
+
+```
+npx hardhat
+```
+
+Sau đó, bạn sẽ thấy một thông báo chào mừng và tùy chọn để chọn những gì bạn muốn làm. Chọn “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
+
+👷 Chào mừng đến với Hardhat v2.0.11 👷?
+
+Bạn muốn làm gì? …
+Tạo một dự án mẫu
+❯ Tạo một tệp hardhat.config.js trống
+Thoát
+```
+
+Thao tác này sẽ tạo một tệp `hardhat.config.js` cho chúng ta, đây là nơi chúng ta sẽ chỉ định tất cả các thiết lập cho dự án của mình (ở bước 13).
+
+## Bước 9: Thêm thư mục dự án {#step-9}
+
+Để giữ cho dự án của chúng ta được sắp xếp có tổ chức, chúng ta sẽ tạo hai thư mục mới. Điều hướng đến thư mục gốc của dự án của bạn trong dòng lệnh và gõ:
+
+```
+mkdir contracts
+mkdir scripts
+```
+
+- `contracts/` là nơi chúng ta sẽ lưu tệp mã hợp đồng thông minh hello world
+- `scripts/` là nơi chúng ta sẽ lưu giữ các tập lệnh để triển khai và tương tác với hợp đồng của mình
+
+## Bước 10: Viết hợp đồng của chúng ta {#step-10}
+
+Bạn có thể đang tự hỏi, khi nào chúng ta mới bắt đầu viết mã đây?? Vâng, chúng ta đây rồi, ở bước 10.
+
+Mở dự án hello-world trong trình chỉnh sửa yêu thích của bạn (chúng tôi thích [VSCode](https://code.visualstudio.com/)). Các hợp đồng thông minh được viết bằng một ngôn ngữ gọi là Solidity, đây là ngôn ngữ chúng tôi sẽ sử dụng để viết hợp đồng thông minh HelloWorld.sol của mình.
+
+1. Điều hướng đến thư mục “contracts” và tạo một tệp mới có tên HelloWorld.sol
+2. Dưới đây là một hợp đồng thông minh Hello World mẫu từ Ethereum Foundation mà chúng tôi sẽ sử dụng cho hướng dẫn này. Sao chép và dán nội dung bên dưới vào tệp HelloWorld.sol của bạn, và hãy nhớ đọc các nhận xét để hiểu hợp đồng này làm gì:
+
+```solidity
+// Chỉ định phiên bản Solidity, sử dụng phiên bản ngữ nghĩa.
+// Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+pragma solidity ^0.7.0;
+
+// Định nghĩa một hợp đồng có tên là `HelloWorld`.
+// Hợp đồng là một tập hợp các hàm và dữ liệu (trạng thái của nó). Sau khi được triển khai, một hợp đồng sẽ nằm ở một địa chỉ cụ thể trên chuỗi khối Ethereum. Tìm hiểu thêm: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+contract HelloWorld {
+
+ // Khai báo một biến trạng thái `message` kiểu `string`.
+ // Các biến trạng thái là các biến có giá trị được lưu trữ vĩnh viễn trong bộ nhớ hợp đồng. Từ khóa `public` làm cho các biến có thể truy cập được từ bên ngoài hợp đồng và tạo ra một hàm mà các hợp đồng hoặc ứng dụng khách khác có thể gọi để truy cập giá trị.
+ string public message;
+
+ // Tương tự như nhiều ngôn ngữ lập trình hướng đối tượng dựa trên lớp, hàm khởi tạo là một hàm đặc biệt chỉ được thực thi khi tạo hợp đồng.
+ // Các hàm khởi tạo được sử dụng để khởi tạo dữ liệu của hợp đồng. Tìm hiểu thêm:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ constructor(string memory initMessage) {
+
+ // Chấp nhận một đối số chuỗi `initMessage` và đặt giá trị vào biến lưu trữ `message` của hợp đồng).
+ message = initMessage;
+ }
+
+ // Một hàm công khai chấp nhận một đối số chuỗi và cập nhật biến lưu trữ `message`.
+ function update(string memory newMessage) public {
+ message = newMessage;
+ }
+}
+```
+
+Đây là một hợp đồng thông minh siêu đơn giản, lưu trữ một thông điệp khi được tạo và có thể được cập nhật bằng cách gọi hàm `update`.
+
+## Bước 11: Kết nối MetaMask & Alchemy với dự án của bạn {#step-11}
+
+Chúng ta đã tạo một ví MetaMask, tài khoản Alchemy và viết hợp đồng thông minh của mình, giờ là lúc kết nối cả ba.
+
+Mọi giao dịch được gửi từ ví ảo của bạn đều yêu cầu chữ ký bằng khóa riêng tư duy nhất của bạn. Để cấp quyền này cho chương trình của chúng ta, chúng ta có thể lưu trữ khóa riêng tư (và khóa API Alchemy) một cách an toàn trong một tệp môi trường.
+
+> Để tìm hiểu thêm về việc gửi giao dịch, hãy xem [bài hướng dẫn này](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) về việc gửi giao dịch bằng web3.
+
+Đầu tiên, cài đặt gói dotenv trong thư mục dự án của bạn:
+
+```
+npm install dotenv --save
+```
+
+Sau đó, tạo một tệp `.env` trong thư mục gốc của dự án và thêm khóa riêng tư MetaMask và URL API HTTP Alchemy của bạn vào đó.
+
+- Làm theo [các hướng dẫn này](https://support.metamask.io/configure/accounts/how-to-export-an-accounts-private-key/) để xuất khóa riêng tư của bạn
+- Xem bên dưới để lấy URL API HTTP của Alchemy
+
+
+
+Sao chép URL API của Alchemy
+
+Tệp `.env` của bạn sẽ trông như thế này:
+
+```
+API_URL = "https://eth-sepolia.g.alchemy.com/v2/khoa-api-cua-ban"
+PRIVATE_KEY = "khoa-rieng-tu-metamask-cua-ban"
+```
+
+Để thực sự kết nối những thứ này với mã của chúng ta, chúng ta sẽ tham chiếu các biến này trong tệp `hardhat.config.js` của mình ở bước 13.
+
+
+
+
+Đừng commit tệp .env! Vui lòng đảm bảo không bao giờ chia sẻ hoặc tiết lộ tệp .env của bạn với bất kỳ ai, vì làm như vậy bạn đang làm lộ bí mật của mình. Nếu bạn đang sử dụng kiểm soát phiên bản, hãy thêm tệp .env của bạn vào tệp gitignore.
+
+
+
+
+## Bước 12: Cài đặt Ethers.js {#step-12-install-ethersjs}
+
+Ethers.js là một thư viện giúp tương tác và gửi yêu cầu đến Ethereum dễ dàng hơn bằng cách gói [các phương thức JSON-RPC tiêu chuẩn](/developers/docs/apis/json-rpc/) với các phương thức thân thiện hơn với người dùng.
+
+Hardhat giúp tích hợp [Plugin](https://hardhat.org/plugins/) cho các công cụ bổ sung và chức năng mở rộng trở nên siêu dễ dàng. Chúng tôi sẽ tận dụng [plugin Ethers](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) để triển khai hợp đồng ([Ethers.js](https://github.com/ethers-io/ethers.js/) có một số phương pháp triển khai hợp đồng siêu gọn gàng).
+
+Trong thư mục dự án của bạn, hãy gõ:
+
+```
+npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"
+```
+
+Chúng ta cũng sẽ nhúng ethers vào tệp `hardhat.config.js` của mình trong bước tiếp theo.
+
+## Bước 13: Cập nhật hardhat.config.js {#step-13-update-hardhatconfigjs}
+
+Cho đến nay, chúng ta đã thêm một số phần phụ thuộc và plugin, bây giờ chúng ta cần cập nhật `hardhat.config.js` để dự án của chúng ta biết về tất cả chúng.
+
+Cập nhật tệp `hardhat.config.js` của bạn để trông như thế này:
+
+```
+require('dotenv').config();
+
+require("@nomiclabs/hardhat-ethers");
+const { API_URL, PRIVATE_KEY } = process.env;
+
+/**
+* @type import('hardhat/config').HardhatUserConfig
+*/
+module.exports = {
+ solidity: "0.7.3",
+ defaultNetwork: "sepolia",
+ networks: {
+ hardhat: {},
+ sepolia: {
+ url: API_URL,
+ accounts: [`0x${PRIVATE_KEY}`]
+ }
+ },
+}
+```
+
+## Bước 14: Biên dịch hợp đồng của chúng ta {#step-14-compile-our-contracts}
+
+Để đảm bảo mọi thứ đều hoạt động cho đến nay, hãy biên dịch hợp đồng của chúng ta. Tác vụ `compile` là một trong những tác vụ có sẵn của hardhat.
+
+Từ dòng lệnh, hãy chạy:
+
+```
+npx hardhat compile
+```
+
+Bạn có thể nhận được cảnh báo về `SPDX license identifier not provided in source file` , nhưng không cần phải lo lắng về điều đó — hy vọng mọi thứ khác đều ổn! Nếu không, bạn luôn có thể nhắn tin trong [Alchemy discord](https://discord.gg/u72VCg3).
+
+## Bước 15: Viết tập lệnh triển khai của chúng ta {#step-15-write-our-deploy-scripts}
+
+Bây giờ hợp đồng của chúng ta đã được viết và tệp cấu hình đã sẵn sàng, đã đến lúc viết tập lệnh triển khai hợp đồng của chúng ta.
+
+Điều hướng đến thư mục `scripts/` và tạo một tệp mới có tên `deploy.js`, thêm nội dung sau vào đó:
+
+```
+async function main() {
+ const HelloWorld = await ethers.getContractFactory("HelloWorld");
+
+ // Bắt đầu triển khai, trả về một promise phân giải thành một đối tượng hợp đồng
+ const hello_world = await HelloWorld.deploy("Hello World!");
+ console.log("Hợp đồng được triển khai đến địa chỉ:", hello_world.address);}
+
+main()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error);
+ process.exit(1);
+ });
+```
+
+Hardhat đã làm rất tốt việc giải thích mỗi dòng mã này làm gì trong [Bài hướng dẫn về Hợp đồng](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) của họ, chúng tôi đã áp dụng các giải thích của họ ở đây.
+
+```
+const HelloWorld = await ethers.getContractFactory("HelloWorld");
+```
+
+`ContractFactory` trong ethers.js là một sự trừu tượng hóa được sử dụng để triển khai các hợp đồng thông minh mới, vì vậy `HelloWorld` ở đây là một nhà máy cho các phiên bản của hợp đồng hello world của chúng ta. Khi sử dụng plugin `hardhat-ethers`, các phiên bản `ContractFactory` và `Contract` được kết nối với người ký đầu tiên theo mặc định.
+
+```
+const hello_world = await HelloWorld.deploy();
+```
+
+Việc gọi `deploy()` trên một `ContractFactory` sẽ bắt đầu việc triển khai và trả về một `Promise` phân giải thành một `Contract`. Đây là đối tượng có một phương thức cho mỗi chức năng hợp đồng thông minh của chúng ta.
+
+## Bước 16: Triển khai hợp đồng của chúng ta {#step-16-deploy-our-contract}
+
+Cuối cùng, chúng ta đã sẵn sàng để triển khai hợp đồng thông minh của mình! Điều hướng đến dòng lệnh và chạy:
+
+```
+npx hardhat run scripts/deploy.js --network sepolia
+```
+
+Sau đó, bạn sẽ thấy một cái gì đó như thế này:
+
+```
+Hợp đồng được triển khai đến địa chỉ: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
+```
+
+Nếu chúng ta truy cập [Etherscan của Sepolia](https://sepolia.etherscan.io/) và tìm kiếm địa chỉ hợp đồng của mình, chúng ta sẽ có thể thấy rằng nó đã được triển khai thành công. Giao dịch sẽ trông giống như thế này:
+
+
+
+Địa chỉ `From` phải khớp với địa chỉ tài khoản MetaMask của bạn và địa chỉ To sẽ ghi là “Tạo Hợp đồng” nhưng nếu chúng ta nhấp vào giao dịch, chúng ta sẽ thấy địa chỉ hợp đồng của mình trong trường `To`:
+
+
+
+Xin chúc mừng! Bạn vừa triển khai một hợp đồng thông minh trên chuỗi Ethereum 🎉
+
+Để hiểu những gì đang diễn ra ở hậu trường, hãy điều hướng đến tab Explorer trong [bảng điều khiển Alchemy](https://dashboard.alchemyapi.io/explorer) của chúng ta. Nếu bạn có nhiều ứng dụng Alchemy, hãy đảm bảo lọc theo ứng dụng và chọn “Hello World”.
+
+
+Tại đây, bạn sẽ thấy một vài lệnh gọi JSON-RPC mà Hardhat/Ethers đã thực hiện ngầm cho chúng ta khi chúng ta gọi hàm `.deploy()`. Hai lệnh gọi quan trọng cần đề cập ở đây là [`eth_sendRawTransaction`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-send-raw-transaction), là yêu cầu để thực sự ghi hợp đồng của chúng ta lên chuỗi Sepolia, và [`eth_getTransactionByHash`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-get-transaction-by-hash), là yêu cầu để đọc thông tin về giao dịch của chúng ta với hàm băm đã cho (một mẫu điển hình khi có
+các giao dịch). Để tìm hiểu thêm về việc gửi giao dịch, hãy xem hướng dẫn này về [gửi giao dịch bằng Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)
+
+Đó là tất cả cho phần 1 của hướng dẫn này, trong phần 2, chúng ta sẽ thực sự [tương tác với hợp đồng thông minh của mình](https://www.alchemy.com/docs/interacting-with-a-smart-contract) bằng cách cập nhật thông điệp ban đầu của chúng ta và trong phần 3, chúng ta sẽ [xuất bản hợp đồng thông minh của mình lên Etherscan](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) để mọi người sẽ biết cách tương tác với nó.
+
+**Bạn muốn tìm hiểu thêm về Alchemy?** Hãy xem [trang web](https://www.alchemy.com/eth) của chúng tôi. Bạn không muốn bỏ lỡ bất kỳ bản cập nhật nào? Đăng ký nhận bản tin của chúng tôi [tại đây](https://www.alchemy.com/newsletter)! Hãy chắc chắn cũng tham gia [Discord](https://discord.gg/u72VCg3) của chúng tôi.\*\*.
diff --git a/public/content/translations/vi/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/vi/developers/tutorials/how-to-implement-an-erc721-market/index.md
new file mode 100644
index 00000000000..a2f431a4143
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/how-to-implement-an-erc721-market/index.md
@@ -0,0 +1,151 @@
+---
+title: Cách triển khai thị trường ERC-721
+description: Cách đưa các mặt hàng được mã hóa rao bán trên bảng rao vặt phi tập trung
+author: "Alberto Cuesta Cañada"
+tags:
+ [
+ "hợp đồng thông minh",
+ "erc-721",
+ "solidity",
+ "tokens"
+ ]
+skill: intermediate
+lang: vi
+published: 2020-03-19
+source: Hackernoon
+sourceUrl: https://hackernoon.com/how-to-implement-an-erc721-market-1e1a32j9
+---
+
+Trong bài viết này, tôi sẽ hướng dẫn bạn cách viết mã Craigslist cho chuỗi khối Ethereum.
+
+Trước khi có Gumtree, Ebay và Craigslist, các bảng rao vặt chủ yếu được làm bằng nút chai hoặc giấy. Có các bảng rao vặt trong hành lang trường học, trên báo, cột đèn đường, và mặt tiền cửa hàng.
+
+Tất cả đã thay đổi với sự ra đời của internet. Số lượng người có thể xem một bảng rao vặt cụ thể đã tăng lên gấp nhiều lần. Cùng với đó, các thị trường mà chúng đại diện đã trở nên hiệu quả hơn nhiều và mở rộng quy mô ra toàn cầu. Ebay là một doanh nghiệp khổng lồ có nguồn gốc từ những bảng rao vặt vật lý này.
+
+Với chuỗi khối, các thị trường này sẽ một lần nữa thay đổi, hãy để tôi chỉ cho bạn cách thức hoạt động.
+
+## Kiếm tiền {#monetization}
+
+Mô hình kinh doanh của một bảng rao vặt chuỗi khối công khai sẽ cần phải khác với mô hình của Ebay và các công ty tương tự.
+
+Đầu tiên, có [khía cạnh phi tập trung hóa](/developers/docs/web2-vs-web3/). Các nền tảng hiện có cần phải duy trì máy chủ của riêng họ. Một nền tảng phi tập trung được duy trì bởi người dùng của nó, vì vậy chi phí vận hành nền tảng cốt lõi giảm xuống bằng không đối với chủ sở hữu nền tảng.
+
+Sau đó là giao diện người dùng, trang web hoặc giao diện cung cấp quyền truy cập vào nền tảng. Ở đây có nhiều lựa chọn. Chủ sở hữu nền tảng có thể hạn chế quyền truy cập và buộc mọi người sử dụng giao diện của họ, đồng thời tính phí. Chủ sở hữu nền tảng cũng có thể quyết định mở quyền truy cập (Quyền lực về tay nhân dân!) và cho phép bất kỳ ai xây dựng giao diện cho nền tảng. Hoặc chủ sở hữu có thể quyết định bất kỳ cách tiếp cận nào nằm giữa hai thái cực đó.
+
+_Các nhà lãnh đạo doanh nghiệp có tầm nhìn xa hơn tôi sẽ biết cách kiếm tiền từ việc này. Tất cả những gì tôi thấy là điều này khác với hiện trạng và có thể có lãi._
+
+Hơn nữa, có khía cạnh tự động hóa và thanh toán. Một số thứ có thể được [mã hóa rất hiệu quả](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) và được giao dịch trên một bảng rao vặt. Tài sản được mã hóa dễ dàng được chuyển giao trên chuỗi khối. Các phương thức thanh toán rất phức tạp có thể được triển khai dễ dàng trên chuỗi khối.
+
+Tôi chỉ đang ngửi thấy một cơ hội kinh doanh ở đây. Một bảng rao vặt không có chi phí vận hành có thể dễ dàng được triển khai, với các đường thanh toán phức tạp được bao gồm trong mỗi giao dịch. Tôi chắc chắn ai đó sẽ nảy ra ý tưởng về việc sử dụng nó để làm gì.
+
+Tôi chỉ vui vì đã xây dựng nó. Hãy xem qua mã.
+
+## Triển khai {#implementation}
+
+Cách đây một thời gian, chúng tôi đã bắt đầu một [kho lưu trữ mã nguồn mở](https://github.com/HQ20/contracts?ref=hackernoon.com) với các ví dụ triển khai trường hợp kinh doanh và những thứ hay ho khác, mời bạn xem qua.
+
+Mã cho [Bảng rao vặt Ethereum](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) này có ở đó, hãy thoải mái sử dụng. Chỉ cần lưu ý rằng mã chưa được kiểm toán và bạn cần phải tự mình thẩm định trước khi rót tiền vào đó.
+
+Những điều cơ bản của bảng không phức tạp. Tất cả các quảng cáo trong bảng sẽ chỉ là một cấu trúc (struct) với một vài trường:
+
+```solidity
+struct Trade {
+ address poster;
+ uint256 item;
+ uint256 price;
+ bytes32 status; // Mở, Đã thực thi, Đã hủy
+}
+```
+
+Vậy là có người đăng quảng cáo. Một mặt hàng để bán. Giá cho mặt hàng đó. Trạng thái của giao dịch có thể là đang mở, đã thực thi hoặc đã hủy.
+
+Tất cả các giao dịch này sẽ được lưu giữ trong một ánh xạ (mapping). Bởi vì mọi thứ trong Solidity dường như đều là một ánh xạ. Cũng bởi vì nó tiện lợi.
+
+```solidity
+mapping(uint256 => Trade) public trades;
+```
+
+Việc sử dụng ánh xạ chỉ có nghĩa là chúng ta phải tạo một id cho mỗi quảng cáo trước khi đăng nó, và chúng ta sẽ cần biết id của một quảng cáo trước khi có thể thao tác trên đó. Có nhiều cách để giải quyết vấn đề này trong hợp đồng thông minh hoặc trong giao diện người dùng. Vui lòng hỏi nếu bạn cần một vài gợi ý.
+
+Tiếp theo là câu hỏi về các mặt hàng mà chúng ta xử lý là gì, và loại tiền tệ nào được sử dụng để thanh toán cho giao dịch.
+
+Đối với các mặt hàng, chúng ta sẽ chỉ yêu cầu chúng triển khai giao diện [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com), đây thực sự chỉ là một cách để đại diện cho các mặt hàng trong thế giới thực trên chuỗi khối, mặc dù nó [hoạt động tốt nhất với các tài sản kỹ thuật số](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com). Chúng ta sẽ chỉ định hợp đồng ERC721 của riêng mình trong hàm khởi tạo, nghĩa là bất kỳ tài sản nào trong bảng rao vặt của chúng ta đều cần được mã hóa từ trước.
+
+Đối với các khoản thanh toán, chúng ta sẽ làm điều gì đó tương tự. Hầu hết các dự án chuỗi khối đều định nghĩa tiền mã hóa [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com) của riêng họ. Một số khác lại thích sử dụng một loại tiền chính thống như DAI. Trong bảng rao vặt này, bạn chỉ cần quyết định loại tiền tệ của mình sẽ là gì khi xây dựng. Dễ dàng.
+
+```solidity
+constructor (
+ address _currencyTokenAddress, address _itemTokenAddress
+) public {
+ currencyToken = IERC20(_currencyTokenAddress);
+ itemToken = IERC721(_itemTokenAddress);
+ tradeCounter = 0;
+}
+```
+
+Chúng ta sắp hoàn thành rồi. Chúng ta đã có quảng cáo, các mặt hàng để giao dịch và một loại tiền tệ để thanh toán. Tạo một quảng cáo có nghĩa là đặt một mặt hàng vào ký quỹ để cho thấy rằng bạn có nó và bạn chưa đăng nó hai lần, có thể là trên một bảng khác.
+
+Đoạn mã dưới đây thực hiện chính xác điều đó. Đặt vật phẩm vào ký quỹ, tạo quảng cáo, thực hiện một số công việc dọn dẹp.
+
+```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");
+}
+```
+
+Chấp nhận giao dịch có nghĩa là chọn một quảng cáo (giao dịch), trả giá và nhận vật phẩm. Đoạn mã dưới đây truy xuất một giao dịch. Kiểm tra xem nó có sẵn không. Thanh toán cho vật phẩm. Truy xuất vật phẩm. Cập nhật quảng cáo.
+
+```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");
+}
+```
+
+Cuối cùng, chúng ta có một tùy chọn cho người bán để rút lui khỏi một giao dịch trước khi người mua chấp nhận nó. Trong một số mô hình, quảng cáo sẽ hoạt động trong một khoảng thời gian trước khi hết hạn. Lựa chọn là của bạn, tùy thuộc vào thiết kế thị trường của bạn.
+
+Mã này rất giống với mã được sử dụng để thực hiện một giao dịch, chỉ khác là không có tiền tệ nào được trao đổi và vật phẩm sẽ quay trở lại người đăng quảng cáo.
+
+```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");
+}
+```
+
+Vậy là xong. Bạn đã hoàn thành phần triển khai. Thật đáng ngạc nhiên khi một số khái niệm kinh doanh lại trở nên cô đọng khi được thể hiện bằng mã, và đây là một trong những trường hợp như vậy. Kiểm tra hợp đồng hoàn chỉnh [trong kho lưu trữ của chúng tôi](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol).
+
+## Kết luận {#conclusion}
+
+Các bảng rao vặt là một cấu hình thị trường phổ biến đã mở rộng quy mô lớn với sự ra đời của internet, trở thành một mô hình kinh doanh cực kỳ phổ biến với một vài người chiến thắng độc quyền.
+
+Các bảng rao vặt cũng là một công cụ dễ sao chép trong môi trường chuỗi khối, với các tính năng rất cụ thể sẽ có thể thách thức những gã khổng lồ hiện có.
+
+Trong bài viết này, tôi đã cố gắng kết nối thực tế kinh doanh của một doanh nghiệp bảng rao vặt với việc triển khai công nghệ. Kiến thức này sẽ giúp bạn tạo ra một tầm nhìn và một lộ trình để triển khai nếu bạn có những kỹ năng phù hợp.
+
+Như mọi khi, nếu bạn đang xây dựng bất cứ điều gì thú vị và muốn nhận một vài lời khuyên, vui lòng [liên hệ với tôi](https://albertocuesta.es/)! Tôi luôn sẵn lòng giúp đỡ.
diff --git a/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
new file mode 100644
index 00000000000..3bdf2b11cd2
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
@@ -0,0 +1,335 @@
+---
+title: Cách Đúc một NFT (Phần 2/3 của Chuỗi Hướng dẫn NFT)
+description: Hướng dẫn này mô tả cách đúc một NFT trên chuỗi khối Ethereum bằng cách sử dụng hợp đồng thông minh của chúng tôi và Web3.
+author: "Sumi Mudgil"
+tags:
+ [
+ "ERC-721",
+ "từ Alchemy",
+ "solidity",
+ "hợp đồng thông minh"
+ ]
+skill: beginner
+lang: vi
+published: 2021-04-22
+---
+
+[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): 69 triệu đô la
+[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 triệu đô la
+[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 triệu đô la
+
+Tất cả họ đã đúc các NFT của mình bằng cách sử dụng Giao diện Lập trình Ứng dụng mạnh mẽ của Alchemy. Trong hướng dẫn này, chúng tôi sẽ dạy bạn cách làm điều tương tự trong vòng \<10 phút.
+
+“Đúc một NFT” là hành động xuất bản một phiên bản duy nhất của token ERC-721 của bạn trên chuỗi khối. Sử dụng hợp đồng thông minh của chúng tôi từ [Phần 1 của chuỗi hướng dẫn NFT này](/developers/tutorials/how-to-write-and-deploy-an-nft/), hãy vận dụng các kỹ năng Web3 của chúng ta và đúc một NFT. Khi kết thúc hướng dẫn này, bạn sẽ có thể đúc bao nhiêu NFT tùy thích (và ví của bạn cho phép)!
+
+Bắt đầu ngay!
+
+## Bước 1: Cài đặt Web3 {#install-web3}
+
+Nếu bạn đã làm theo hướng dẫn đầu tiên về việc tạo hợp đồng thông minh NFT của mình, bạn đã có kinh nghiệm sử dụng Ethers.js. Web3 tương tự như Ethers, vì đây là một thư viện được sử dụng để giúp việc tạo các yêu cầu tới chuỗi khối Ethereum dễ dàng hơn. Trong hướng dẫn này, chúng ta sẽ sử dụng [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3), một thư viện Web3 nâng cao cung cấp tính năng tự động thử lại và hỗ trợ WebSocket mạnh mẽ.
+
+Trong thư mục chính của dự án của bạn, hãy chạy:
+
+```
+npm install @alch/alchemy-web3
+```
+
+## Bước 2: Tạo tệp `mint-nft.js` {#create-mintnftjs}
+
+Bên trong thư mục tập lệnh của bạn, hãy tạo một tệp `mint-nft.js` và thêm các dòng mã sau:
+
+```js
+require("dotenv").config()
+const API_URL = process.env.API_URL
+const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
+const web3 = createAlchemyWeb3(API_URL)
+```
+
+## Bước 3: Lấy ABI hợp đồng của bạn {#contract-abi}
+
+ABI (Giao diện nhị phân ứng dụng) hợp đồng của chúng tôi là giao diện để tương tác với hợp đồng thông minh của chúng tôi. Bạn có thể tìm hiểu thêm về ABI của Hợp đồng [tại đây](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is). Hardhat tự động tạo ABI cho chúng tôi và lưu nó trong tệp `MyNFT.json`. Để sử dụng, chúng ta sẽ cần phân tích cú pháp nội dung bằng cách thêm các dòng mã sau vào tệp `mint-nft.js` của mình:
+
+```js
+const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
+```
+
+Nếu bạn muốn xem ABI, bạn có thể in nó ra bảng điều khiển của mình:
+
+```js
+console.log(JSON.stringify(contract.abi))
+```
+
+Để chạy `mint-nft.js` và xem ABI của bạn được in ra bảng điều khiển, hãy điều hướng đến thiết bị đầu cuối của bạn và chạy:
+
+```js
+node scripts/mint-nft.js
+```
+
+## Bước 4: Định cấu hình siêu dữ liệu cho NFT của bạn bằng IPFS {#config-meta}
+
+Nếu bạn còn nhớ từ hướng dẫn của chúng tôi trong Phần 1, hàm hợp đồng thông minh `mintNFT` của chúng tôi có một tham số tokenURI sẽ phân giải thành một tài liệu JSON mô tả siêu dữ liệu của NFT—đó thực sự là thứ mang lại sức sống cho NFT, cho phép nó có các thuộc tính có thể định cấu hình, chẳng hạn như tên, mô tả, hình ảnh và các thuộc tính khác.
+
+> _Hệ thống Tệp Liên hành tinh (IPFS) là một giao thức phi tập trung và mạng ngang hàng để lưu trữ và chia sẻ dữ liệu trong một hệ thống tệp phân tán._
+
+Chúng tôi sẽ sử dụng Pinata, một Giao diện Lập trình Ứng dụng và bộ công cụ IPFS tiện lợi, để lưu trữ tài sản NFT và siêu dữ liệu của chúng tôi nhằm đảm bảo NFT của chúng tôi thực sự phi tập trung. Nếu bạn chưa có tài khoản Pinata, hãy đăng ký một tài khoản miễn phí [tại đây](https://app.pinata.cloud) và hoàn thành các bước để xác minh email của bạn.
+
+Sau khi bạn đã tạo tài khoản:
+
+- Điều hướng đến trang “Tệp” và nhấp vào nút "Tải lên" màu xanh lam ở trên cùng bên trái của trang.
+
+- Tải hình ảnh lên Pinata — đây sẽ là tài sản hình ảnh cho NFT của bạn. Bạn có thể đặt tên cho tài sản bất cứ điều gì bạn muốn
+
+- Sau khi bạn tải lên, bạn sẽ thấy thông tin tệp trong bảng trên trang "Tệp". Bạn cũng sẽ thấy một cột CID. Bạn có thể sao chép CID bằng cách nhấp vào nút sao chép bên cạnh nó. Bạn có thể xem nội dung tải lên của mình tại: `https://gateway.pinata.cloud/ipfs/`. Ví dụ: bạn có thể tìm thấy hình ảnh chúng tôi đã sử dụng trên IPFS [tại đây](https://gateway.pinata.cloud/ipfs/QmZdd5KYdCFApWn7eTZJ1qgJu18urJrP9Yh1TZcZrZxxB5).
+
+Đối với những người học trực quan hơn, các bước trên được tóm tắt ở đây:
+
+
+
+Bây giờ, chúng ta sẽ muốn tải một tài liệu nữa lên Pinata. Nhưng trước khi làm điều đó, chúng ta cần tạo ra nó!
+
+Trong thư mục gốc của bạn, hãy tạo một tệp mới có tên `nft-metadata.json` và thêm mã json sau:
+
+```json
+{
+ "attributes": [
+ {
+ "trait_type": "Giống",
+ "value": "Maltipoo"
+ },
+ {
+ "trait_type": "Màu mắt",
+ "value": "Mocha"
+ }
+ ],
+ "description": "Chú cún đáng yêu và nhạy cảm nhất thế giới.",
+ "image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",
+ "name": "Ramses"
+}
+```
+
+Vui lòng thay đổi dữ liệu trong json. Bạn có thể xóa hoặc thêm vào phần thuộc tính. Quan trọng nhất, hãy đảm bảo trường hình ảnh trỏ đến vị trí hình ảnh IPFS của bạn — nếu không, NFT của bạn sẽ bao gồm ảnh của một chú chó (rất dễ thương!) chó.
+
+Sau khi bạn chỉnh sửa xong tệp JSON, hãy lưu và tải nó lên Pinata, theo các bước tương tự như chúng ta đã làm để tải lên hình ảnh.
+
+
+
+## Bước 5: Tạo một phiên bản hợp đồng của bạn {#instance-contract}
+
+Bây giờ, để tương tác với hợp đồng của chúng tôi, chúng ta cần tạo một phiên bản của nó trong mã của mình. Để làm như vậy, chúng ta sẽ cần địa chỉ hợp đồng của mình mà chúng ta có thể lấy từ việc triển khai hoặc [Blockscout](https://eth-sepolia.blockscout.com/) bằng cách tra cứu địa chỉ bạn đã sử dụng để triển khai hợp đồng.
+
+
+
+Trong ví dụ trên, địa chỉ hợp đồng của chúng tôi là 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778.
+
+Tiếp theo, chúng ta sẽ sử dụng [phương thức hợp đồng](https://docs.web3js.org/api/web3-eth-contract/class/Contract) Web3 để tạo hợp đồng bằng ABI và địa chỉ. Trong tệp `mint-nft.js` của bạn, hãy thêm những dòng sau:
+
+```js
+const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
+
+const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
+```
+
+## Bước 6: Cập nhật tệp `.env` {#update-env}
+
+Bây giờ, để tạo và gửi giao dịch đến chuỗi Ethereum, chúng ta sẽ sử dụng địa chỉ tài khoản Ethereum công khai của bạn để lấy nonce của tài khoản (sẽ giải thích bên dưới).
+
+Thêm khóa công khai của bạn vào tệp `.env` — nếu bạn đã hoàn thành phần 1 của hướng dẫn, tệp `.env` của chúng ta bây giờ sẽ trông như thế này:
+
+```js
+API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
+PRIVATE_KEY = "your-private-account-address"
+PUBLIC_KEY = "your-public-account-address"
+```
+
+## Bước 7: Tạo giao dịch của bạn {#create-txn}
+
+Đầu tiên, hãy xác định một hàm có tên `mintNFT(tokenData)` và tạo giao dịch của chúng ta bằng cách thực hiện như sau:
+
+1. Lấy _PRIVATE_KEY_ và _PUBLIC_KEY_ của bạn từ tệp `.env`.
+
+2. Tiếp theo, chúng ta sẽ cần tìm ra nonce của tài khoản. Thông số kỹ thuật nonce được sử dụng để theo dõi số lượng giao dịch được gửi từ địa chỉ của bạn — điều mà chúng ta cần cho các mục đích bảo mật và để ngăn chặn [các cuộc tấn công phát lại](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce). Để lấy số lượng giao dịch được gửi từ địa chỉ của bạn, chúng ta sử dụng [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount).
+
+3. Cuối cùng, chúng ta sẽ thiết lập giao dịch của mình với các thông tin sau:
+
+- `'from': PUBLIC_KEY` — Nguồn gốc giao dịch của chúng ta là địa chỉ công khai của chúng ta
+
+- `'to': contractAddress` — Hợp đồng mà chúng ta muốn tương tác và gửi giao dịch đến
+
+- `'nonce': nonce` — Nonce của tài khoản với số lượng giao dịch được gửi từ địa chỉ của chúng ta
+
+- `'gas': estimatedGas` — Lượng gas ước tính cần thiết để hoàn thành giao dịch
+
+- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` — Phép tính mà chúng ta muốn thực hiện trong giao dịch này — trong trường hợp này là đúc một NFT
+
+Tệp `mint-nft.js` của bạn bây giờ sẽ trông như thế này:
+
+```js
+ require('dotenv').config();
+ const API_URL = process.env.API_URL;
+ const PUBLIC_KEY = process.env.PUBLIC_KEY;
+ const PRIVATE_KEY = process.env.PRIVATE_KEY;
+
+ const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
+ const web3 = createAlchemyWeb3(API_URL);
+
+ const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");
+ const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778";
+ const nftContract = new web3.eth.Contract(contract.abi, contractAddress);
+
+ async function mintNFT(tokenURI) {
+ const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //lấy nonce mới nhất
+
+ //giao dịch
+ const tx = {
+ 'from': PUBLIC_KEY,
+ 'to': contractAddress,
+ 'nonce': nonce,
+ 'gas': 500000,
+ 'data': nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI()
+ };
+ }
+```
+
+## Bước 8: Ký giao dịch {#sign-txn}
+
+Bây giờ chúng ta đã tạo giao dịch của mình, chúng ta cần ký nó để gửi đi. Đây là nơi chúng ta sẽ sử dụng khóa riêng tư của mình.
+
+`web3.eth.sendSignedTransaction` sẽ cung cấp cho chúng ta hàm băm giao dịch, mà chúng ta có thể sử dụng để đảm bảo giao dịch của mình đã được khai thác và không bị mạng loại bỏ. Bạn sẽ nhận thấy trong phần ký giao dịch, chúng tôi đã thêm một số kiểm tra lỗi để chúng tôi biết liệu giao dịch của mình có thành công hay không.
+
+```js
+require("dotenv").config()
+const API_URL = process.env.API_URL
+const PUBLIC_KEY = process.env.PUBLIC_KEY
+const PRIVATE_KEY = process.env.PRIVATE_KEY
+
+const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
+const web3 = createAlchemyWeb3(API_URL)
+
+const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
+const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
+const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
+
+async function mintNFT(tokenURI) {
+ const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //lấy nonce mới nhất
+
+ //giao dịch
+ const tx = {
+ from: PUBLIC_KEY,
+ to: contractAddress,
+ nonce: nonce,
+ gas: 500000,
+ data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
+ }
+
+ const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
+ signPromise
+ .then((signedTx) => {
+ web3.eth.sendSignedTransaction(
+ signedTx.rawTransaction,
+ function (err, hash) {
+ if (!err) {
+ console.log(
+ "Hàm băm của giao dịch của bạn là: ",
+ hash,
+ "\nHãy kiểm tra Mempool của Alchemy để xem trạng thái giao dịch của bạn!"
+ )
+ } else {
+ console.log(
+ "Đã xảy ra lỗi khi gửi giao dịch của bạn:",
+ err
+ )
+ }
+ }
+ )
+ })
+ .catch((err) => {
+ console.log(" Lời hứa không thành công:", err)
+ })
+}
+```
+
+## Bước 9: Gọi `mintNFT` và chạy node `mint-nft.js` {#call-mintnft-fn}
+
+Bạn có nhớ tệp `metadata.json` bạn đã tải lên Pinata không? Lấy mã băm của nó từ Pinata và chuyển nội dung sau làm tham số cho hàm `mintNFT` `https://gateway.pinata.cloud/ipfs/`
+
+Đây là cách để lấy mã băm:
+
+_Cách lấy mã băm siêu dữ liệu nft của bạn trên Pinata_
+
+> Kiểm tra kỹ rằng mã băm bạn đã sao chép liên kết đến tệp **metadata.json** của bạn bằng cách tải `https://gateway.pinata.cloud/ipfs/` trong một cửa sổ riêng. Trang sẽ trông tương tự như ảnh chụp màn hình bên dưới:
+
+_Trang của bạn sẽ hiển thị siêu dữ liệu json_
+
+Nói chung, mã của bạn sẽ trông giống như sau:
+
+```js
+require("dotenv").config()
+const API_URL = process.env.API_URL
+const PUBLIC_KEY = process.env.PUBLIC_KEY
+const PRIVATE_KEY = process.env.PRIVATE_KEY
+
+const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
+const web3 = createAlchemyWeb3(API_URL)
+
+const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
+const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
+const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
+
+async function mintNFT(tokenURI) {
+ const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //lấy nonce mới nhất
+
+ //giao dịch
+ const tx = {
+ from: PUBLIC_KEY,
+ to: contractAddress,
+ nonce: nonce,
+ gas: 500000,
+ data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
+ }
+
+ const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
+ signPromise
+ .then((signedTx) => {
+ web3.eth.sendSignedTransaction(
+ signedTx.rawTransaction,
+ function (err, hash) {
+ if (!err) {
+ console.log(
+ "Hàm băm của giao dịch của bạn là: ",
+ hash,
+ "\nHãy kiểm tra Mempool của Alchemy để xem trạng thái giao dịch của bạn!"
+ )
+ } else {
+ console.log(
+ "Đã xảy ra lỗi khi gửi giao dịch của bạn:",
+ err
+ )
+ }
+ }
+ )
+ })
+ .catch((err) => {
+ console.log("Lời hứa không thành công:", err)
+ })
+}
+
+mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")
+```
+
+Bây giờ, hãy chạy `node scripts/mint-nft.js` để triển khai NFT của bạn. Sau vài giây, bạn sẽ thấy một phản hồi như thế này trong thiết bị đầu cuối của mình:
+
+ ```
+ Hàm băm của giao dịch của bạn là: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8
+
+ Hãy kiểm tra Mempool của Alchemy để xem trạng thái giao dịch của bạn!
+ ```
+
+Tiếp theo, hãy truy cập [mempool của Alchemy](https://dashboard.alchemyapi.io/mempool) để xem trạng thái giao dịch của bạn (cho dù nó đang chờ xử lý, đã được khai thác hay đã bị mạng loại bỏ). Nếu giao dịch của bạn bị loại bỏ, sẽ rất hữu ích nếu bạn kiểm tra [Blockscout](https://eth-sepolia.blockscout.com/) và tìm kiếm hàm băm giao dịch của mình.
+
+_Xem hàm băm giao dịch NFT của bạn trên Etherscan_
+
+Vậy là xong! Bây giờ bạn đã triển khai VÀ đúc một NFT trên chuỗi khối Ethereum
+
+Sử dụng `mint-nft.js`, bạn có thể đúc bao nhiêu NFT tùy thích (và ví của bạn cho phép)! Chỉ cần đảm bảo chuyển một tokenURI mới mô tả siêu dữ liệu của NFT (nếu không, bạn sẽ chỉ tạo ra một loạt các NFT giống hệt nhau với các ID khác nhau).
+
+Có lẽ, bạn muốn có thể khoe NFT của mình trong ví — vì vậy, hãy nhớ xem [Phần 3: Cách xem NFT trong Ví của bạn](/developers/tutorials/how-to-view-nft-in-metamask/)!
diff --git a/public/content/translations/vi/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/vi/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md
new file mode 100644
index 00000000000..ede60396bd0
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md
@@ -0,0 +1,108 @@
+---
+title: Làm thế nào để tạo bản sao hợp đồng thông minh Solidity để kiểm thử
+description: Tại sao bạn nên chế nhạo các hợp đồng của mình khi thử nghiệm
+author: Markus Waas
+lang: vi
+tags:
+ [
+ "solidity",
+ "hợp đồng thông minh",
+ "kiểm thử",
+ "mocking"
+ ]
+skill: intermediate
+published: 2020-05-02
+source: soliditydeveloper.com
+sourceUrl: https://soliditydeveloper.com/mocking-contracts
+---
+
+[Đối tượng mock](https://wikipedia.org/wiki/Mock_object) là một mẫu thiết kế phổ biến trong lập trình hướng đối tượng. Xuất phát từ từ tiếng Pháp cổ 'mocquer' với ý nghĩa 'chế nhạo', nó đã phát triển thành 'bắt chước một thứ gì đó có thật', đó thực sự là những gì chúng ta đang làm trong lập trình. Vui lòng chỉ chế nhạo các hợp đồng thông minh của bạn nếu bạn muốn, nhưng hãy giả lập chúng bất cứ khi nào bạn có thể. Nó làm cho cuộc sống của bạn dễ dàng hơn.
+
+## Kiểm thử đơn vị các hợp đồng với các đối tượng giả lập {#unit-testing-contracts-with-mocks}
+
+Việc giả lập một hợp đồng về cơ bản có nghĩa là tạo ra một phiên bản thứ hai của hợp đồng đó, hoạt động rất tương tự như phiên bản gốc, nhưng theo cách có thể dễ dàng được kiểm soát bởi nhà phát triển. Bạn thường gặp phải các hợp đồng phức tạp, trong đó bạn chỉ muốn [kiểm thử đơn vị các phần nhỏ của hợp đồng](/developers/docs/smart-contracts/testing/). Vấn đề là sẽ ra sao nếu việc kiểm thử phần nhỏ này đòi hỏi một trạng thái hợp đồng rất cụ thể mà khó có thể đạt được?
+
+Bạn có thể viết logic thiết lập kiểm thử phức tạp mỗi lần để đưa hợp đồng vào trạng thái được yêu cầu hoặc bạn có thể viết một đối tượng giả lập. Giả lập một hợp đồng rất dễ dàng với tính kế thừa. Chỉ cần tạo một hợp đồng giả lập thứ hai kế thừa từ hợp đồng gốc. Bây giờ bạn có thể ghi đè các hàm cho đối tượng giả lập của bạn. Hãy cùng xem một ví dụ.
+
+## Ví dụ: ERC20 riêng tư {#example-private-erc20}
+
+Chúng tôi sử dụng một hợp đồng ERC-20 mẫu có thời gian riêng tư ban đầu. Chủ sở hữu có thể quản lý những người dùng riêng tư và chỉ những người đó mới được phép nhận token khi bắt đầu. Khi một khoảng thời gian nhất định đã trôi qua, mọi người sẽ được phép sử dụng token. Nếu bạn tò mò, chúng tôi đang sử dụng hook [`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/5.x/extending-contracts#using-hooks) từ các hợp đồng OpenZeppelin v3 mới.
+
+```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];
+ }
+}
+```
+
+Và bây giờ hãy giả lập nó.
+
+```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;
+ }
+}
+```
+
+Bạn sẽ nhận được một trong những thông báo lỗi sau:
+
+- `PrivateERC20Mock.sol: TypeError: Overriding function is missing \"override\" specifier.`
+- `PrivateERC20.sol: TypeError: Trying to override non-virtual function. Did you forget to add \"virtual\"?.`
+
+Vì chúng tôi đang sử dụng phiên bản Solidity 0.6 mới, chúng tôi phải thêm từ khóa `virtual` cho các hàm có thể được ghi đè và `override` cho hàm ghi đè. Vì vậy, hãy thêm chúng vào cả hai hàm `isPublic`.
+
+Bây giờ trong các bài kiểm thử đơn vị, bạn có thể sử dụng `PrivateERC20Mock` thay thế. Khi bạn muốn kiểm thử hành vi trong thời gian sử dụng riêng tư, hãy sử dụng `setIsPublic(false)` và tương tự, sử dụng `setIsPublic(true)` để kiểm thử thời gian sử dụng công khai. Tất nhiên trong ví dụ của chúng tôi, chúng tôi cũng có thể chỉ cần sử dụng [các trình trợ giúp thời gian](https://docs.openzeppelin.com/test-helpers/0.5/api#increase) để thay đổi thời gian cho phù hợp. Nhưng ý tưởng về việc giả lập bây giờ hẳn đã rõ ràng và bạn có thể tưởng tượng các tình huống mà nó không dễ dàng như việc chỉ đơn giản là tua nhanh thời gian.
+
+## Giả lập nhiều hợp đồng {#mocking-many-contracts}
+
+Mọi việc có thể trở nên lộn xộn nếu bạn phải tạo một hợp đồng khác cho mỗi đối tượng giả lập. Nếu điều này làm phiền bạn, bạn có thể xem qua thư viện [MockContract](https://github.com/gnosis/mock-contract). Nó cho phép bạn ghi đè và thay đổi hành vi của các hợp đồng ngay lập tức. Tuy nhiên, nó chỉ hoạt động để giả lập các lệnh gọi đến một hợp đồng khác, vì vậy nó sẽ không hoạt động trong ví dụ của chúng ta.
+
+## Việc giả lập thậm chí có thể mạnh mẽ hơn {#mocking-can-be-even-more-powerful}
+
+Sức mạnh của việc giả lập không dừng lại ở đó.
+
+- Thêm các hàm: Không chỉ việc ghi đè một hàm cụ thể là hữu ích, mà việc chỉ thêm các hàm bổ sung cũng vậy. Một ví dụ điển hình cho token là chỉ cần có thêm một hàm `mint` để cho phép bất kỳ người dùng nào nhận token mới miễn phí.
+- Sử dụng trong các mạng thử nghiệm: Khi bạn triển khai và kiểm thử các hợp đồng của mình trên các mạng thử nghiệm cùng với dapp của bạn, hãy cân nhắc sử dụng phiên bản giả lập. Tránh việc ghi đè các hàm trừ khi bạn thực sự phải làm vậy. Sau cùng thì bạn muốn kiểm thử logic thực. Nhưng việc thêm, ví dụ như một hàm đặt lại có thể hữu ích để chỉ cần đặt lại trạng thái hợp đồng về ban đầu, không cần triển khai mới. Rõ ràng là bạn sẽ không muốn có điều đó trong một hợp đồng Mạng chính.
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
new file mode 100644
index 00000000000..632dab07e41
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
@@ -0,0 +1,710 @@
+---
+title: Cách sử dụng Echidna để kiểm thử hợp đồng thông minh
+description: Cách sử dụng Echidna để tự động kiểm thử hợp đồng thông minh
+author: "Trailofbits"
+lang: vi
+tags:
+ [
+ "solidity",
+ "hợp đồng thông minh",
+ "tính bảo mật",
+ "kiểm thử",
+ "fuzzing"
+ ]
+skill: advanced
+published: 2020-04-10
+source: Xây dựng những hợp đồng an toàn
+sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna
+---
+
+## Cài đặt {#installation}
+
+Echidna có thể được cài đặt thông qua docker hoặc sử dụng tệp nhị phân đã biên dịch trước.
+
+### Echidna thông qua docker {#echidna-through-docker}
+
+```bash
+docker pull trailofbits/eth-security-toolbox
+docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox
+```
+
+_Lệnh cuối cùng chạy eth-security-toolbox trong một docker có quyền truy cập vào thư mục hiện tại của bạn. Bạn có thể thay đổi tệp từ máy chủ lưu trữ của mình và chạy các công cụ trên tệp từ docker_
+
+Bên trong docker, chạy :
+
+```bash
+solc-select 0.5.11
+cd /home/training
+```
+
+### Nhị phân {#binary}
+
+[https://github.com/crytic/echidna/releases/tag/v1.4.0.0](https://github.com/crytic/echidna/releases/tag/v1.4.0.0)
+
+## Giới thiệu về fuzzing dựa trên thuộc tính {#introduction-to-property-based-fuzzing}
+
+Echidna là một fuzzer dựa trên thuộc tính, chúng tôi đã mô tả trong các bài đăng blog trước đây của chúng tôi ([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) là một kỹ thuật nổi tiếng trong cộng đồng bảo mật. Nó bao gồm việc tạo ra các đầu vào ít nhiều ngẫu nhiên để tìm lỗi trong chương trình. Các fuzzer cho phần mềm truyền thống (chẳng hạn như [AFL](http://lcamtuf.coredump.cx/afl/) hoặc [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)) được biết đến là những công cụ hiệu quả để tìm lỗi.
+
+Ngoài việc tạo ra các đầu vào hoàn toàn ngẫu nhiên, có nhiều kỹ thuật và chiến lược để tạo ra các đầu vào tốt, bao gồm:
+
+- Nhận phản hồi từ mỗi lần thực thi và sử dụng nó để định hướng cho việc tạo. Ví dụ, nếu một đầu vào mới được tạo dẫn đến việc phát hiện ra một đường dẫn mới, việc tạo ra các đầu vào mới gần với nó có thể là hợp lý.
+- Tạo đầu vào tôn trọng một ràng buộc cấu trúc. Ví dụ, nếu đầu vào của bạn chứa một tiêu đề có tổng kiểm, sẽ hợp lý nếu để fuzzer tạo ra đầu vào xác thực tổng kiểm.
+- Sử dụng các đầu vào đã biết để tạo các đầu vào mới: nếu bạn có quyền truy cập vào một bộ dữ liệu lớn gồm các đầu vào hợp lệ, fuzzer của bạn có thể tạo các đầu vào mới từ chúng, thay vì bắt đầu tạo từ đầu. Chúng thường được gọi là _seeds_.
+
+### Fuzzing dựa trên thuộc tính {#property-based-fuzzing}
+
+Echidna thuộc về một họ fuzzer cụ thể: fuzzing dựa trên thuộc tính lấy cảm hứng nhiều từ [QuickCheck](https://wikipedia.org/wiki/QuickCheck). Trái ngược với fuzzer cổ điển sẽ cố gắng tìm các sự cố, Echidna sẽ cố gắng phá vỡ các bất biến do người dùng định nghĩa.
+
+Trong các hợp đồng thông minh, các bất biến là các hàm Solidity, có thể đại diện cho bất kỳ trạng thái không chính xác hoặc không hợp lệ nào mà hợp đồng có thể đạt tới, bao gồm:
+
+- Kiểm soát truy cập không chính xác: kẻ tấn công đã trở thành chủ sở hữu của hợp đồng.
+- Máy trạng thái không chính xác: các token có thể được chuyển trong khi hợp đồng bị tạm dừng.
+- Số học không chính xác: người dùng có thể làm tràn dưới số dư của họ và nhận được token miễn phí không giới hạn.
+
+### Kiểm thử một thuộc tính với Echidna {#testing-a-property-with-echidna}
+
+Chúng ta sẽ xem cách kiểm thử một hợp đồng thông minh với Echidna. Mục tiêu là hợp đồng thông minh sau [`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;
+ }
+}
+```
+
+Chúng ta sẽ giả định rằng token này phải có các thuộc tính sau:
+
+- Bất kỳ ai cũng có thể có tối đa 1000 token
+- Token không thể được chuyển (nó không phải là một token ERC20)
+
+### Viết một thuộc tính {#write-a-property}
+
+Các thuộc tính của Echidna là các hàm Solidity. Một thuộc tính phải:
+
+- Không có đối số
+- Trả về `true` nếu nó thành công
+- Có tên bắt đầu bằng `echidna`
+
+Echidna sẽ:
+
+- Tự động tạo các giao dịch tùy ý để kiểm thử thuộc tính.
+- Báo cáo bất kỳ giao dịch nào dẫn đến việc một thuộc tính trả về `false` hoặc phát sinh lỗi.
+- Loại bỏ tác dụng phụ khi gọi một thuộc tính (tức là, nếu thuộc tính thay đổi một biến trạng thái, nó sẽ bị loại bỏ sau khi kiểm thử)
+
+Thuộc tính sau đây kiểm tra rằng người gọi không có nhiều hơn 1000 token:
+
+```solidity
+function echidna_balance_under_1000() public view returns(bool){
+ return balances[msg.sender] <= 1000;
+}
+```
+
+Sử dụng tính kế thừa để tách hợp đồng của bạn ra khỏi các thuộc tính của bạn:
+
+```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) triển khai thuộc tính và kế thừa từ token.
+
+### Khởi tạo một hợp đồng {#initiate-a-contract}
+
+Echidna cần một [hàm khởi tạo](/developers/docs/smart-contracts/anatomy/#constructor-functions) không có đối số. Nếu hợp đồng của bạn cần một khởi tạo cụ thể, bạn cần thực hiện nó trong hàm khởi tạo.
+
+Có một số địa chỉ cụ thể trong Echidna:
+
+- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72` gọi hàm khởi tạo.
+- `0x10000`, `0x20000`, và `0x00a329C0648769a73afAC7F9381e08fb43DBEA70` gọi ngẫu nhiên các hàm khác.
+
+Chúng ta không cần bất kỳ khởi tạo cụ thể nào trong ví dụ hiện tại của mình, do đó hàm khởi tạo của chúng ta trống.
+
+### Chạy Echidna {#run-echidna}
+
+Echidna được khởi chạy với:
+
+```bash
+echidna-test contract.sol
+```
+
+Nếu contract.sol chứa nhiều hợp đồng, bạn có thể chỉ định mục tiêu:
+
+```bash
+echidna-test contract.sol --contract MyContract
+```
+
+### Tóm tắt: Kiểm thử một thuộc tính {#summary-testing-a-property}
+
+Phần sau đây tóm tắt việc chạy echidna trên ví dụ của chúng ta:
+
+```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 đã phát hiện ra rằng thuộc tính bị vi phạm nếu `backdoor` được gọi.
+
+## Lọc các hàm để gọi trong một chiến dịch fuzzing {#filtering-functions-to-call-during-a-fuzzing-campaign}
+
+Chúng ta sẽ xem cách lọc các hàm sẽ được fuzz.
+Mục tiêu là hợp đồng thông minh sau:
+
+```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);
+ }
+}
+```
+
+Ví dụ nhỏ này buộc Echidna phải tìm một chuỗi giao dịch nhất định để thay đổi một biến trạng thái.
+Điều này khó đối với một fuzzer (khuyến nghị sử dụng một công cụ thực thi tượng trưng như [Manticore](https://github.com/trailofbits/manticore)).
+Chúng ta có thể chạy Echidna để xác minh điều này:
+
+```bash
+echidna-test multi.sol
+...
+echidna_state4: passed! 🎉
+Seed: -3684648582249875403
+```
+
+### Lọc hàm {#filtering-functions}
+
+Echidna gặp khó khăn trong việc tìm ra trình tự chính xác để kiểm thử hợp đồng này bởi vì hai hàm đặt lại (`reset1` và `reset2`) sẽ đặt tất cả các biến trạng thái thành `false`.
+Tuy nhiên, chúng ta có thể sử dụng một tính năng đặc biệt của Echidna để đưa hàm đặt lại vào danh sách đen hoặc chỉ đưa các hàm `f`, `g`,
+`h` và `i` vào danh sách trắng.
+
+Để đưa các hàm vào danh sách đen, chúng ta có thể sử dụng tệp cấu hình này:
+
+```yaml
+filterBlacklist: true
+filterFunctions: ["reset1", "reset2"]
+```
+
+Một cách tiếp cận khác để lọc các hàm là liệt kê các hàm trong danh sách trắng. Để làm điều đó, chúng ta có thể sử dụng tệp cấu hình này:
+
+```yaml
+filterBlacklist: false
+filterFunctions: ["f", "g", "h", "i"]
+```
+
+- `filterBlacklist` là `true` theo mặc định.
+- Việc lọc sẽ chỉ được thực hiện theo tên (không có tham số). Nếu bạn có `f()` và `f(uint256)`, bộ lọc `"f"` sẽ khớp với cả hai hàm.
+
+### Chạy Echidna {#run-echidna-1}
+
+Để chạy Echidna với một tệp cấu hình `blacklist.yaml`:
+
+```bash
+echidna-test multi.sol --config blacklist.yaml
+...
+echidna_state4: failed!💥
+ Call sequence:
+ f(12)
+ g(8)
+ h(42)
+ i()
+```
+
+Echidna sẽ tìm thấy chuỗi giao dịch để làm sai thuộc tính gần như ngay lập tức.
+
+### Tóm tắt: Lọc hàm {#summary-filtering-functions}
+
+Echidna có thể đưa các hàm vào danh sách đen hoặc danh sách trắng để gọi trong một chiến dịch fuzzing bằng cách sử dụng:
+
+```yaml
+filterBlacklist: true
+filterFunctions: ["f1", "f2", "f3"]
+```
+
+```bash
+echidna-test contract.sol --config config.yaml
+...
+```
+
+Echidna bắt đầu một chiến dịch fuzzing hoặc bằng cách đưa `f1`, `f2` và `f3` vào danh sách đen hoặc chỉ gọi chúng, tùy thuộc
+vào giá trị của boolean `filterBlacklist`.
+
+## Cách kiểm thử khẳng định của Solidity với Echidna {#how-to-test-soliditys-assert-with-echidna}
+
+Trong hướng dẫn ngắn này, chúng ta sẽ chỉ ra cách sử dụng Echidna để kiểm thử việc kiểm tra khẳng định trong các hợp đồng. Giả sử chúng ta có một hợp đồng như thế này:
+
+```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);
+ }
+}
+```
+
+### Viết một khẳng định {#write-an-assertion}
+
+Chúng ta muốn đảm bảo rằng `tmp` nhỏ hơn hoặc bằng `counter` sau khi trả về hiệu của chúng. Chúng ta có thể viết một
+thuộc tính Echidna, nhưng chúng ta sẽ cần lưu trữ giá trị `tmp` ở đâu đó. Thay vào đó, chúng ta có thể sử dụng một khẳng định như thế này:
+
+```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);
+ }
+}
+```
+
+### Chạy Echidna {#run-echidna-2}
+
+Để bật kiểm thử lỗi khẳng định, tạo một [tệp cấu hình Echidna](https://github.com/crytic/echidna/wiki/Config) `config.yaml`:
+
+```yaml
+checkAsserts: true
+```
+
+Khi chúng ta chạy hợp đồng này trong Echidna, chúng ta nhận được kết quả mong đợi:
+
+```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
+```
+
+Như bạn có thể thấy, Echidna báo cáo một số lỗi khẳng định trong hàm `inc`. Có thể thêm nhiều hơn một khẳng định cho mỗi hàm, nhưng Echidna không thể cho biết khẳng định nào đã thất bại.
+
+### Khi nào và cách sử dụng các khẳng định {#when-and-how-use-assertions}
+
+Các khẳng định có thể được sử dụng như là các phương án thay thế cho các thuộc tính rõ ràng, đặc biệt là nếu các điều kiện cần kiểm tra có liên quan trực tiếp đến việc sử dụng đúng một số hoạt động `f`. Việc thêm các khẳng định sau một đoạn mã sẽ buộc việc kiểm tra phải diễn ra ngay sau khi nó được thực thi:
+
+```solidity
+function f(..) public {
+ // một số mã phức tạp
+ ...
+ assert (condition);
+ ...
+}
+
+```
+
+Ngược lại, việc sử dụng một thuộc tính echidna rõ ràng sẽ thực thi các giao dịch một cách ngẫu nhiên và không có cách nào dễ dàng để buộc chính xác khi nào nó sẽ được kiểm tra. Vẫn có thể thực hiện giải pháp này:
+
+```solidity
+function echidna_assert_after_f() public returns (bool) {
+ f(..);
+ return(condition);
+}
+```
+
+Tuy nhiên, có một số vấn đề:
+
+- Nó sẽ thất bại nếu `f` được khai báo là `internal` hoặc `external`.
+- Không rõ nên sử dụng đối số nào để gọi `f`.
+- Nếu `f` hoàn lại, thuộc tính sẽ thất bại.
+
+Nhìn chung, chúng tôi khuyên bạn nên làm theo [khuyến nghị của John Regehr](https://blog.regehr.org/archives/1091) về cách sử dụng các khẳng định:
+
+- Không ép buộc bất kỳ tác dụng phụ nào trong quá trình kiểm tra khẳng định. Ví dụ: `assert(ChangeStateAndReturn() == 1)`
+- Đừng khẳng định những câu lệnh hiển nhiên. Ví dụ `assert(var >= 0)` trong đó `var` được khai báo là `uint`.
+
+Cuối cùng, vui lòng **không sử dụng** `require` thay vì `assert`, vì Echidna sẽ không thể phát hiện ra nó (nhưng hợp đồng dù sao cũng sẽ hoàn lại).
+
+### Tóm tắt: Kiểm tra Khẳng định {#summary-assertion-checking}
+
+Phần sau đây tóm tắt việc chạy echidna trên ví dụ của chúng ta:
+
+```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 đã phát hiện ra rằng khẳng định trong `inc` có thể thất bại nếu hàm này được gọi nhiều lần với các đối số lớn.
+
+## Thu thập và sửa đổi một kho văn bản Echidna {#collecting-and-modifying-an-echidna-corpus}
+
+Chúng ta sẽ xem cách thu thập và sử dụng một kho văn bản giao dịch với Echidna. Mục tiêu là hợp đồng thông minh sau [`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;
+ }
+
+}
+```
+
+Ví dụ nhỏ này buộc Echidna phải tìm các giá trị nhất định để thay đổi một biến trạng thái. Điều này khó đối với một fuzzer
+(khuyến nghị sử dụng một công cụ thực thi tượng trưng như [Manticore](https://github.com/trailofbits/manticore)).
+Chúng ta có thể chạy Echidna để xác minh điều này:
+
+```bash
+echidna-test magic.sol
+...
+
+echidna_magic_values: passed! 🎉
+
+Seed: 2221503356319272685
+```
+
+Tuy nhiên, chúng ta vẫn có thể sử dụng Echidna để thu thập kho văn bản khi chạy chiến dịch fuzzing này.
+
+### Thu thập một kho văn bản {#collecting-a-corpus}
+
+Để bật thu thập kho văn bản, tạo một thư mục kho văn bản:
+
+```bash
+mkdir corpus-magic
+```
+
+Và một [tệp cấu hình Echidna](https://github.com/crytic/echidna/wiki/Config) `config.yaml`:
+
+```yaml
+coverage: true
+corpusDir: "corpus-magic"
+```
+
+Bây giờ chúng ta có thể chạy công cụ của mình và kiểm tra kho văn bản đã thu thập:
+
+```bash
+echidna-test magic.sol --config config.yaml
+```
+
+Echidna vẫn không thể tìm thấy các giá trị magic chính xác, nhưng chúng ta có thể xem kho văn bản mà nó đã thu thập.
+Ví dụ, một trong những tệp này là:
+
+```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"
+ }
+]
+```
+
+Rõ ràng, đầu vào này sẽ không kích hoạt sự thất bại trong thuộc tính của chúng ta. Tuy nhiên, trong bước tiếp theo, chúng ta sẽ xem cách sửa đổi nó cho mục đích đó.
+
+### Gieo mầm một kho văn bản {#seeding-a-corpus}
+
+Echidna cần một số trợ giúp để xử lý hàm `magic`. Chúng ta sẽ sao chép và sửa đổi đầu vào để sử dụng các tham số phù hợp
+cho nó:
+
+```bash
+cp corpus/2712688662897926208.txt corpus/new.txt
+```
+
+Chúng ta sẽ sửa đổi `new.txt` để gọi `magic(42,129,333,0)`. Bây giờ, chúng ta có thể chạy lại 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
+
+```
+
+Lần này, nó đã phát hiện ra rằng thuộc tính bị vi phạm ngay lập tức.
+
+## Tìm các giao dịch có mức tiêu thụ gas cao {#finding-transactions-with-high-gas-consumption}
+
+Chúng ta sẽ xem cách tìm các giao dịch có mức tiêu thụ gas cao với Echidna. Mục tiêu là hợp đồng thông minh sau:
+
+```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;
+ }
+
+}
+```
+
+Ở đây `expensive` có thể có mức tiêu thụ gas lớn.
+
+Hiện tại, Echidna luôn cần một thuộc tính để kiểm thử: ở đây `echidna_test` luôn trả về `true`.
+Chúng ta có thể chạy Echidna để xác minh điều này:
+
+```
+echidna-test gas.sol
+...
+echidna_test: passed! 🎉
+
+Seed: 2320549945714142710
+```
+
+### Đo lường mức tiêu thụ gas {#measuring-gas-consumption}
+
+Để bật tính năng đo lường mức tiêu thụ gas với Echidna, tạo một tệp cấu hình `config.yaml`:
+
+```yaml
+estimateGas: true
+```
+
+Trong ví dụ này, chúng ta cũng sẽ giảm kích thước của chuỗi giao dịch để làm cho kết quả dễ hiểu hơn:
+
+```yaml
+seqLen: 2
+estimateGas: true
+```
+
+### Chạy Echidna {#run-echidna-3}
+
+Sau khi chúng ta đã tạo tệp cấu hình, chúng ta có thể chạy Echidna như thế này:
+
+```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
+
+```
+
+- Lượng gas được hiển thị là một ước tính được cung cấp bởi [HEVM](https://github.com/dapphub/dapptools/tree/master/src/hevm#hevm-).
+
+### Lọc ra các lệnh gọi giảm gas {#filtering-out-gas-reducing-calls}
+
+Hướng dẫn về **lọc các hàm để gọi trong một chiến dịch fuzzing** ở trên chỉ ra cách
+loại bỏ một số hàm khỏi quá trình kiểm thử của bạn.
+Điều này có thể rất quan trọng để có được ước tính gas chính xác.
+Hãy xem xét ví dụ sau:
+
+```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;
+ }
+}
+```
+
+Nếu Echidna có thể gọi tất cả các hàm, nó sẽ không dễ dàng tìm thấy các giao dịch có chi phí gas cao:
+
+```
+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
+```
+
+Đó là bởi vì chi phí phụ thuộc vào kích thước của `addrs` và các lệnh gọi ngẫu nhiên có xu hướng để lại mảng gần như trống rỗng.
+Tuy nhiên, việc đưa `pop` và `clear` vào danh sách đen cho chúng ta kết quả tốt hơn nhiều:
+
+```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
+```
+
+### Tóm tắt: Tìm các giao dịch có mức tiêu thụ gas cao {#summary-finding-transactions-with-high-gas-consumption}
+
+Echidna có thể tìm thấy các giao dịch có mức tiêu thụ gas cao bằng cách sử dụng tùy chọn cấu hình `estimateGas`:
+
+```yaml
+estimateGas: true
+```
+
+```bash
+echidna-test contract.sol --config config.yaml
+...
+```
+
+Echidna sẽ báo cáo một chuỗi có mức tiêu thụ gas tối đa cho mọi hàm, sau khi chiến dịch fuzzing kết thúc.
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
new file mode 100644
index 00000000000..9d18322a847
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
@@ -0,0 +1,522 @@
+---
+title: Cách sử dụng Manticore để phát hiện lỗi trong hợp đồng thông minh
+description: Cách sử dụng Manticore để tự động tìm lỗi trong hợp đồng thông minh
+author: Trailofbits
+lang: vi
+tags:
+ [
+ "solidity",
+ "hợp đồng thông minh",
+ "tính bảo mật",
+ "kiểm thử",
+ "xác minh chính thức"
+ ]
+skill: advanced
+published: 2020-01-13
+source: Xây dựng những hợp đồng an toàn
+sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore
+---
+
+Mục đích của hướng dẫn này là chỉ ra cách sử dụng Manticore để tự động tìm lỗi trong hợp đồng thông minh.
+
+## Cài đặt {#installation}
+
+Manticore yêu cầu python >= 3.6. Nó có thể được cài đặt thông qua pip hoặc sử dụng docker.
+
+### Manticore qua docker {#manticore-through-docker}
+
+```bash
+docker pull trailofbits/eth-security-toolbox
+docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox
+```
+
+_Lệnh cuối cùng chạy eth-security-toolbox trong một docker có quyền truy cập vào thư mục hiện tại của bạn. Bạn có thể thay đổi tệp từ máy chủ lưu trữ của mình và chạy các công cụ trên tệp từ docker_
+
+Bên trong docker, chạy:
+
+```bash
+solc-select 0.5.11
+cd /home/trufflecon/
+```
+
+### Manticore qua pip {#manticore-through-pip}
+
+```bash
+pip3 install --user manticore
+```
+
+Nên dùng solc 0.5.11.
+
+### Chạy một tập lệnh {#running-a-script}
+
+Để chạy một tập lệnh python bằng python 3:
+
+```bash
+python3 script.py
+```
+
+## Giới thiệu về thực thi ký hiệu động {#introduction-to-dynamic-symbolic-execution}
+
+### Thực thi ký hiệu động một cách ngắn gọn {#dynamic-symbolic-execution-in-a-nutshell}
+
+Thực thi ký hiệu động (DSE) là một kỹ thuật phân tích chương trình khám phá không gian trạng thái với mức độ nhận thức ngữ nghĩa cao. Kỹ thuật này dựa trên việc khám phá các "đường dẫn chương trình", được biểu diễn dưới dạng các công thức toán học gọi là `vị từ đường dẫn`. Về mặt khái niệm, kỹ thuật này hoạt động trên các vị từ đường dẫn theo hai bước:
+
+1. Chúng được xây dựng bằng cách sử dụng các ràng buộc trên đầu vào của chương trình.
+2. Chúng được sử dụng để tạo ra các đầu vào của chương trình sẽ khiến các đường dẫn liên quan thực thi.
+
+Phương pháp này không tạo ra kết quả dương tính giả theo nghĩa là tất cả các trạng thái chương trình được xác định đều có thể được kích hoạt trong quá trình thực thi cụ thể. Ví dụ: nếu phân tích tìm thấy một lỗi tràn số nguyên, nó được đảm bảo có thể tái tạo được.
+
+### Ví dụ về vị từ đường dẫn {#path-predicate-example}
+
+Để hiểu rõ hơn về cách DSE hoạt động, hãy xem xét ví dụ sau:
+
+```solidity
+function f(uint a){
+
+ if (a == 65) {
+ // Có một lỗi
+ }
+
+}
+```
+
+Vì `f()` chứa hai đường dẫn, một DSE sẽ xây dựng hai vị từ đường dẫn khác nhau:
+
+- Đường dẫn 1: `a == 65`
+- Đường dẫn 2: `Not (a == 65)`
+
+Mỗi vị từ đường dẫn là một công thức toán học có thể được đưa cho một cái gọi là [bộ giải SMT](https://wikipedia.org/wiki/Satisfiability_modulo_theories), nó sẽ cố gắng giải phương trình. Đối với `Đường dẫn 1`, bộ giải sẽ cho biết rằng đường dẫn có thể được khám phá với `a = 65`. Đối với `Đường dẫn 2`, bộ giải có thể gán cho `a` bất kỳ giá trị nào khác ngoài 65, ví dụ `a = 0`.
+
+### Xác minh các thuộc tính {#verifying-properties}
+
+Manticore cho phép toàn quyền kiểm soát tất cả việc thực thi của mỗi đường dẫn. Do đó, nó cho phép bạn thêm các ràng buộc tùy ý vào hầu hết mọi thứ. Kiểm soát này cho phép tạo ra các thuộc tính trên hợp đồng.
+
+Hãy xem xét ví dụ sau:
+
+```solidity
+function unsafe_add(uint a, uint b) returns(uint c){
+ c = a + b; // không có bảo vệ chống tràn
+ return c;
+}
+```
+
+Ở đây chỉ có một đường dẫn để khám phá trong hàm:
+
+- Đường dẫn 1: `c = a + b`
+
+Sử dụng Manticore, bạn có thể kiểm tra lỗi tràn số và thêm các ràng buộc vào vị từ đường dẫn:
+
+- `c = a + b AND (c < a OR c < b)`
+
+Nếu có thể tìm thấy một định giá của `a` và `b` mà vị từ đường dẫn ở trên là khả thi, điều đó có nghĩa là bạn đã tìm thấy một lỗi tràn số. Ví dụ: bộ giải có thể tạo ra đầu vào `a = 10 , b = MAXUINT256`.
+
+Nếu bạn xem xét một phiên bản đã sửa lỗi:
+
+```solidity
+function safe_add(uint a, uint b) returns(uint c){
+ c = a + b;
+ require(c>=a);
+ require(c>=b);
+ return c;
+}
+```
+
+Công thức liên quan với kiểm tra lỗi tràn số sẽ là:
+
+- `c = a + b AND (c >= a) AND (c=>b) AND (c < a OR c < b)`
+
+Công thức này không thể giải được; nói cách khác, đây là một **bằng chứng** cho thấy trong `safe_add`, `c` sẽ luôn tăng.
+
+Do đó, DSE là một công cụ mạnh mẽ, có thể xác minh các ràng buộc tùy ý trên mã của bạn.
+
+## Chạy dưới Manticore {#running-under-manticore}
+
+Chúng ta sẽ xem cách khám phá một hợp đồng thông minh với Giao diện Lập trình Ứng dụng Manticore. Mục tiêu là hợp đồng thông minh sau đây [`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();
+ }
+ }
+}
+```
+
+### Chạy một khám phá độc lập {#run-a-standalone-exploration}
+
+Bạn có thể chạy Manticore trực tiếp trên hợp đồng thông minh bằng lệnh sau (`project` có thể là Tệp Solidity hoặc một thư mục dự án):
+
+```bash
+$ manticore project
+```
+
+Bạn sẽ nhận được đầu ra của các trường hợp kiểm thử như sau (thứ tự có thể thay đổi):
+
+```
+...
+... 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
+...
+```
+
+Nếu không có thông tin bổ sung, Manticore sẽ khám phá hợp đồng với các giao dịch ký hiệu mới cho đến khi nó không khám phá được các đường dẫn mới trên hợp đồng. Manticore không chạy các giao dịch mới sau một giao dịch không thành công (ví dụ: sau một lệnh revert).
+
+Manticore sẽ xuất thông tin trong một thư mục `mcore_*`. Trong số những thứ khác, bạn sẽ tìm thấy trong thư mục này:
+
+- `global.summary`: độ bao phủ và cảnh báo của trình biên dịch
+- `test_XXXXX.summary`: độ bao phủ, lệnh cuối cùng, số dư tài khoản cho mỗi trường hợp kiểm thử
+- `test_XXXXX.tx`: danh sách chi tiết các giao dịch cho mỗi trường hợp kiểm thử
+
+Ở đây Manticore tìm thấy 7 trường hợp kiểm thử, tương ứng với (thứ tự tên tệp có thể thay đổi):
+
+| | Giao dịch 0 | Giao dịch 1 | Giao dịch 2 | Kết quả |
+| :-------------------------------------------------------: | :----------: | :------------------------: | -------------------------- | :-----: |
+| **test_00000000.tx** | Tạo hợp đồng | f(!=65) | f(!=65) | STOP |
+| **test_00000001.tx** | Tạo hợp đồng | hàm dự phòng | | REVERT |
+| **test_00000002.tx** | Tạo hợp đồng | | | RETURN |
+| **test_00000003.tx** | Tạo hợp đồng | f(65) | | REVERT |
+| **test_00000004.tx** | Tạo hợp đồng | f(!=65) | | STOP |
+| **test_00000005.tx** | Tạo hợp đồng | f(!=65) | f(65) | REVERT |
+| **test_00000006.tx** | Tạo hợp đồng | f(!=65) | hàm dự phòng | REVERT |
+
+_Tóm tắt khám phá f(!=65) biểu thị f được gọi với bất kỳ giá trị nào khác 65._
+
+Như bạn có thể nhận thấy, Manticore tạo ra một trường hợp kiểm thử duy nhất cho mỗi giao dịch thành công hoặc bị hoàn lại.
+
+Sử dụng cờ `--quick-mode` nếu bạn muốn khám phá mã nhanh (nó vô hiệu hóa các bộ phát hiện lỗi, tính toán gas, ...)
+
+### Thao tác một hợp đồng thông minh thông qua Giao diện Lập trình Ứng dụng {#manipulate-a-smart-contract-through-the-api}
+
+Phần này mô tả chi tiết cách thao tác một hợp đồng thông minh thông qua Giao diện Lập trình Ứng dụng Python của Manticore. Bạn có thể tạo tệp mới với phần mở rộng python `*.py` và viết mã cần thiết bằng cách thêm các lệnh Giao diện Lập trình Ứng dụng (những lệnh cơ bản sẽ được mô tả bên dưới) vào tệp này và sau đó chạy nó bằng lệnh `$ python3 *.py`. Ngoài ra, bạn có thể thực thi các lệnh bên dưới trực tiếp vào bảng điều khiển python, để chạy bảng điều khiển, hãy sử dụng lệnh `$ python3`.
+
+### Tạo Tài khoản {#creating-accounts}
+
+Việc đầu tiên bạn nên làm là khởi tạo một chuỗi khối mới bằng các lệnh sau:
+
+```python
+from manticore.ethereum import ManticoreEVM
+
+m = ManticoreEVM()
+```
+
+Một tài khoản không phải hợp đồng được tạo bằng [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)
+```
+
+Một hợp đồng Solidity có thể được triển khai bằng cách sử dụng [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();
+ }
+ }
+}
+'''
+# Khởi tạo hợp đồng
+contract_account = m.solidity_create_contract(source_code, owner=user_account)
+```
+
+#### Tóm tắt {#summary}
+
+- Bạn có thể tạo tài khoản người dùng và tài khoản hợp đồng với [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) và [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract).
+
+### Thực thi giao dịch {#executing-transactions}
+
+Manticore hỗ trợ hai loại giao dịch:
+
+- Giao dịch thô: tất cả các hàm được khám phá
+- Giao dịch được đặt tên: chỉ có một hàm được khám phá
+
+#### Giao dịch thô {#raw-transaction}
+
+Một giao dịch thô được thực hiện bằng cách sử dụng [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)
+```
+
+Người gọi, địa chỉ, dữ liệu hoặc giá trị của giao dịch có thể là cụ thể hoặc ký hiệu:
+
+- [m.make_symbolic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_value#manticore.ethereum.ManticoreEVM.make_symbolic_value) tạo ra một giá trị ký hiệu.
+- [m.make_symbolic_buffer(size)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer) tạo một mảng byte ký hiệu.
+
+Ví dụ:
+
+```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)
+```
+
+Nếu dữ liệu là ký hiệu, Manticore sẽ khám phá tất cả các hàm của hợp đồng trong quá trình thực thi giao dịch. Sẽ hữu ích khi xem giải thích về Hàm dự phòng trong bài viết [Thực hành Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/) để hiểu cách hoạt động của việc lựa chọn hàm.
+
+#### Giao dịch được đặt tên {#named-transaction}
+
+Các hàm có thể được thực thi thông qua tên của chúng.
+Để thực thi `f(uint var)` với một giá trị ký hiệu, từ user_account và với 0 ether, hãy sử dụng:
+
+```python
+symbolic_var = m.make_symbolic_value()
+contract_account.f(symbolic_var, caller=user_account, value=0)
+```
+
+Nếu `value` của giao dịch không được chỉ định, nó là 0 theo mặc định.
+
+#### Tóm tắt {#summary-1}
+
+- Các đối số của một giao dịch có thể là cụ thể hoặc ký hiệu
+- Một giao dịch thô sẽ khám phá tất cả các hàm
+- Hàm có thể được gọi bằng tên của chúng
+
+### Không gian làm việc {#workspace}
+
+`m.workspace` là thư mục được sử dụng làm thư mục đầu ra cho tất cả các tệp được tạo:
+
+```python
+print("Results are in {}".format(m.workspace))
+```
+
+### Chấm dứt việc khám phá {#terminate-the-exploration}
+
+Để dừng việc khám phá, hãy sử dụng [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize). Không nên gửi thêm giao dịch nào sau khi phương thức này được gọi và Manticore tạo các trường hợp kiểm thử cho mỗi đường dẫn được khám phá.
+
+### Tóm tắt: Chạy dưới Manticore {#summary-running-under-manticore}
+
+Tổng hợp tất cả các bước trước đó, chúng ta có:
+
+```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() # dừng việc khám phá
+```
+
+Tất cả mã ở trên, bạn có thể tìm thấy trong [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py)
+
+## Lấy các đường dẫn gây lỗi {#getting-throwing-paths}
+
+Bây giờ chúng ta sẽ tạo các đầu vào cụ thể cho các đường dẫn gây ra ngoại lệ trong `f()`. Mục tiêu vẫn là hợp đồng thông minh sau đây [`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();
+ }
+ }
+}
+```
+
+### Sử dụng thông tin trạng thái {#using-state-information}
+
+Mỗi đường dẫn được thực thi đều có trạng thái riêng của chuỗi khối. Một trạng thái có thể ở trạng thái sẵn sàng hoặc bị hủy, nghĩa là nó đạt đến một lệnh THROW hoặc REVERT:
+
+- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): danh sách các trạng thái đã sẵn sàng (chúng không thực thi REVERT/INVALID)
+- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): danh sách các trạng thái bị hủy
+- [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): tất cả các trạng thái
+
+```python
+for state in m.all_states:
+ # làm gì đó với trạng thái
+```
+
+Bạn có thể truy cập thông tin trạng thái. Ví dụ:
+
+- `state.platform.get_balance(account.address)`: số dư của tài khoản
+- `state.platform.transactions`: danh sách các giao dịch
+- `state.platform.transactions[-1].return_data`: dữ liệu được trả về bởi giao dịch cuối cùng
+
+Dữ liệu được trả về bởi giao dịch cuối cùng là một mảng, có thể được chuyển đổi thành một giá trị bằng ABI.deserialize, ví dụ:
+
+```python
+data = state.platform.transactions[0].return_data
+data = ABI.deserialize("uint", data)
+```
+
+### Cách tạo trường hợp kiểm thử {#how-to-generate-testcase}
+
+Sử dụng [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase) để tạo trường hợp kiểm thử:
+
+```python
+m.generate_testcase(state, 'BugFound')
+```
+
+### Tóm tắt {#summary-2}
+
+- Bạn có thể lặp qua trạng thái với m.all_states
+- `state.platform.get_balance(account.address)` trả về số dư của tài khoản
+- `state.platform.transactions` trả về danh sách các giao dịch
+- `transaction.return_data` là dữ liệu được trả về
+- `m.generate_testcase(state, name)` tạo đầu vào cho trạng thái
+
+### Tóm tắt: Lấy đường dẫn gây lỗi {#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)
+
+## Kiểm tra xem một lần thực thi có kết thúc bằng REVERT hoặc INVALID không
+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')
+```
+
+Tất cả mã ở trên, bạn có thể tìm thấy trong [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py)
+
+_Lưu ý rằng chúng ta có thể đã tạo một tập lệnh đơn giản hơn nhiều, vì tất cả các trạng thái được trả về bởi terminated_state đều có REVERT hoặc INVALID trong kết quả của chúng: ví dụ này chỉ nhằm mục đích minh họa cách thao tác Giao diện Lập trình Ứng dụng._
+
+## Thêm ràng buộc {#adding-constraints}
+
+Chúng ta sẽ xem cách ràng buộc việc khám phá. Chúng ta sẽ giả định rằng tài liệu tham khảo của `f()` nói rằng hàm không bao giờ được gọi với `a == 65`, do đó, bất kỳ lỗi nào với `a == 65` không phải là một lỗi thực sự. Mục tiêu vẫn là hợp đồng thông minh sau đây [`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();
+ }
+ }
+}
+```
+
+### Toán tử {#operators}
+
+Mô-đun [Toán tử](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py) tạo điều kiện cho việc thao tác các ràng buộc, trong số những thứ khác, nó cung cấp:
+
+- Operators.AND,
+- Operators.OR,
+- Operators.UGT (lớn hơn không dấu),
+- Operators.UGE (lớn hơn hoặc bằng không dấu),
+- Operators.ULT (nhỏ hơn không dấu),
+- Operators.ULE (nhỏ hơn hoặc bằng không dấu).
+
+Để nhập mô-đun, hãy sử dụng dòng lệnh sau:
+
+```python
+from manticore.core.smtlib import Operators
+```
+
+`Operators.CONCAT` được sử dụng để nối một mảng với một giá trị. Ví dụ: return_data của một giao dịch cần được thay đổi thành một giá trị để được kiểm tra so với một giá trị khác:
+
+```python
+last_return = Operators.CONCAT(256, *last_return)
+```
+
+### Ràng buộc {#state-constraint}
+
+Bạn có thể sử dụng các ràng buộc trên toàn cục hoặc cho một trạng thái cụ thể.
+
+#### Ràng buộc toàn cục {#state-constraint}
+
+Sử dụng `m.constrain(constraint)` để thêm một ràng buộc toàn cục.
+Ví dụ: bạn có thể gọi một hợp đồng từ một địa chỉ ký hiệu và giới hạn địa chỉ này ở các giá trị cụ thể:
+
+```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)
+```
+
+#### Ràng buộc trạng thái {#state-constraint}
+
+Sử dụng [state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain) để thêm một ràng buộc vào một trạng thái cụ thể.
+Nó có thể được sử dụng để ràng buộc trạng thái sau khi khám phá để kiểm tra một số thuộc tính trên đó.
+
+### Kiểm tra ràng buộc {#checking-constraint}
+
+Sử dụng `solver.check(state.constraints)` để biết liệu một ràng buộc có còn khả thi hay không.
+Ví dụ: đoạn mã sau sẽ ràng buộc symbolic_value khác với 65 và kiểm tra xem trạng thái có còn khả thi không:
+
+```python
+state.constrain(symbolic_var != 65)
+if solver.check(state.constraints):
+ # trạng thái là khả thi
+```
+
+### Tóm tắt: Thêm ràng buộc {#summary-adding-constraints}
+
+Thêm ràng buộc vào mã trước đó, chúng ta có được:
+
+```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
+
+## Kiểm tra xem một lần thực thi có kết thúc bằng REVERT hoặc INVALID không
+for state in m.terminated_states:
+ last_tx = state.platform.transactions[-1]
+ if last_tx.result in ['REVERT', 'INVALID']:
+ # chúng ta không xem xét đường dẫn có a == 65
+ condition = symbolic_var != 65
+ if m.generate_testcase(state, name="BugFound", only_if=condition):
+ print(f'Đã tìm thấy lỗi, kết quả nằm trong {m.workspace}')
+ no_bug_found = False
+
+if no_bug_found:
+ print(f'Không tìm thấy lỗi nào')
+```
+
+Tất cả mã ở trên, bạn có thể tìm thấy trong [`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/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
new file mode 100644
index 00000000000..c81653286d0
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
@@ -0,0 +1,239 @@
+---
+title: Cách sử dụng Slither để tìm lỗi của hợp đồng thông minh
+description: Cách sử dụng Slither để tự động tìm lỗi trong hợp đồng thông minh
+author: Trailofbits
+lang: vi
+tags:
+ [
+ "solidity",
+ "hợp đồng thông minh",
+ "tính bảo mật",
+ "kiểm thử"
+ ]
+skill: advanced
+published: 2020-06-09
+source: Xây dựng những hợp đồng an toàn
+sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither
+---
+
+## Cách sử dụng Slither {#how-to-use-slither}
+
+Mục đích của hướng dẫn này là chỉ ra cách sử dụng Slither để tự động tìm lỗi trong hợp đồng thông minh.
+
+- [Cài đặt](#installation)
+- [Sử dụng dòng lệnh](#command-line)
+- [Giới thiệu về phân tích tĩnh](#static-analysis): Giới thiệu ngắn gọn về phân tích tĩnh
+- [API](#api-basics): Mô tả API Python
+
+## Cài đặt {#installation}
+
+Slither yêu cầu Python >= 3.6. Nó có thể được cài đặt thông qua pip hoặc sử dụng docker.
+
+Slither qua pip:
+
+```bash
+pip3 install --user slither-analyzer
+```
+
+Slither qua docker:
+
+```bash
+docker pull trailofbits/eth-security-toolbox
+docker run -it -v "$PWD":/home/trufflecon trailofbits/eth-security-toolbox
+```
+
+_Lệnh cuối cùng chạy eth-security-toolbox trong một docker có quyền truy cập vào thư mục hiện tại của bạn. Bạn có thể thay đổi tệp từ máy chủ lưu trữ của mình và chạy các công cụ trên tệp từ docker_
+
+Bên trong docker, chạy:
+
+```bash
+solc-select 0.5.11
+cd /home/trufflecon/
+```
+
+### Chạy một tập lệnh {#running-a-script}
+
+Để chạy một tập lệnh python bằng python 3:
+
+```bash
+python3 script.py
+```
+
+### Dòng lệnh {#command-line}
+
+**Dòng lệnh so với các tập lệnh do người dùng xác định.** Slither đi kèm với một bộ các công cụ dò tìm được xác định trước để tìm nhiều lỗi phổ biến. Việc gọi Slither từ dòng lệnh sẽ chạy tất cả các công cụ dò tìm, không cần kiến thức chi tiết về phân tích tĩnh:
+
+```bash
+slither project_paths
+```
+
+Ngoài các công cụ dò tìm, Slither còn có các khả năng xem xét mã thông qua các [printers](https://github.com/crytic/slither#printers) và [công cụ](https://github.com/crytic/slither#tools) của nó.
+
+Sử dụng [crytic.io](https://github.com/crytic) để có quyền truy cập vào các công cụ dò tìm riêng tư và tích hợp GitHub.
+
+## Phân tích tĩnh {#static-analysis}
+
+Các khả năng và thiết kế của khung phân tích tĩnh Slither đã được mô tả trong các bài đăng trên 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/)) và một [bài báo học thuật](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf).
+
+Phân tích tĩnh tồn tại ở nhiều dạng khác nhau. Bạn có thể nhận ra rằng các trình biên dịch như [clang](https://clang-analyzer.llvm.org/) và [gcc](https://lwn.net/Articles/806099/) phụ thuộc vào các kỹ thuật nghiên cứu này, nhưng nó cũng làm nền tảng cho ([Infer](https://fbinfer.com/), [CodeClimate](https://codeclimate.com/), [FindBugs](http://findbugs.sourceforge.net/) và các công cụ dựa trên các phương pháp chính thức như [Frama-C](https://frama-c.com/) và [Polyspace](https://www.mathworks.com/products/polyspace.html).
+
+Chúng tôi sẽ không xem xét một cách toàn diện các kỹ thuật phân tích tĩnh và nhà nghiên cứu ở đây. Thay vào đó, chúng tôi sẽ tập trung vào những gì cần thiết để hiểu cách Slither hoạt động để bạn có thể sử dụng nó hiệu quả hơn để tìm lỗi và hiểu mã.
+
+- [Biểu diễn mã](#code-representation)
+- [Phân tích mã](#analysis)
+- [Biểu diễn trung gian](#intermediate-representation)
+
+### Biểu diễn mã {#code-representation}
+
+Trái ngược với phân tích động, vốn chỉ lý giải về một đường dẫn thực thi duy nhất, phân tích tĩnh lý giải về tất cả các đường dẫn cùng một lúc. Để làm được điều đó, nó dựa vào một biểu diễn mã khác. Hai loại phổ biến nhất là cây cú pháp trừu tượng (AST) và đồ thị luồng điều khiển (CFG).
+
+### Cây cú pháp trừu tượng (AST) {#abstract-syntax-trees-ast}
+
+AST được sử dụng mỗi khi trình biên dịch phân tích cú pháp mã. Đây có lẽ là cấu trúc cơ bản nhất mà trên đó có thể thực hiện phân tích tĩnh.
+
+Tóm lại, AST là một cây có cấu trúc, trong đó, mỗi lá thường chứa một biến hoặc một hằng số và các nút bên trong là toán hạng hoặc các toán tử luồng điều khiển. Hãy xem xét mã sau:
+
+```solidity
+function safeAdd(uint a, uint b) pure internal returns(uint){
+ if(a + b <= a){
+ revert();
+ }
+ return a + b;
+}
+```
+
+AST tương ứng được hiển thị trong:
+
+
+
+Slither sử dụng AST được xuất bởi solc.
+
+Mặc dù dễ xây dựng, AST là một cấu trúc lồng nhau. Đôi khi, đây không phải là cách phân tích đơn giản nhất. Ví dụ: để xác định các toán tử được sử dụng bởi biểu thức `a + b <= a`, trước tiên bạn phải phân tích `<=` rồi đến `+`. Một cách tiếp cận phổ biến là sử dụng cái gọi là mẫu visitor (visitor pattern), điều hướng qua cây một cách đệ quy. Slither chứa một visitor chung trong [`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py).
+
+Mã sau sử dụng `ExpressionVisitor` để phát hiện xem biểu thức có chứa phép cộng hay không:
+
+```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 là biểu thức cần được kiểm tra
+print(f'Biểu thức {expression} có một phép cộng: {visitor.result()}')
+```
+
+### Đồ thị luồng điều khiển (CFG) {#control-flow-graph-cfg}
+
+Biểu diễn mã phổ biến thứ hai là đồ thị luồng điều khiển (CFG). Đúng như tên gọi của nó, đây là một biểu diễn dựa trên đồ thị, thể hiện tất cả các đường dẫn thực thi. Mỗi nút chứa một hoặc nhiều lệnh. Các cạnh trong đồ thị biểu thị các toán tử luồng điều khiển (if/then/else, vòng lặp, v.v.). CFG của ví dụ trước của chúng tôi là:
+
+
+
+CFG là biểu diễn mà hầu hết các phân tích được xây dựng trên đó.
+
+Nhiều biểu diễn mã khác tồn tại. Mỗi biểu diễn đều có ưu và nhược điểm tùy theo phân tích bạn muốn thực hiện.
+
+### Phân tích {#analysis}
+
+Loại phân tích đơn giản nhất bạn có thể thực hiện với Slither là phân tích cú pháp.
+
+### Phân tích cú pháp {#syntax-analysis}
+
+Slither có thể điều hướng qua các thành phần khác nhau của mã và biểu diễn của chúng để tìm ra những điểm không nhất quán và thiếu sót bằng cách sử dụng phương pháp tiếp cận giống như so khớp mẫu.
+
+Ví dụ: các công cụ dò tìm sau đây tìm kiếm các vấn đề liên quan đến cú pháp:
+
+- [Che biến trạng thái](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): lặp qua tất cả các biến trạng thái và kiểm tra xem có bất kỳ biến nào che một biến từ một hợp đồng được kế thừa hay không ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62))
+
+- [Giao diện ERC20 không chính xác](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): tìm kiếm các chữ ký hàm ERC20 không chính xác ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55))
+
+### Phân tích ngữ nghĩa {#semantic-analysis}
+
+Trái ngược với phân tích cú pháp, phân tích ngữ nghĩa sẽ đi sâu hơn và phân tích “ý nghĩa” của mã. Họ này bao gồm một số loại phân tích rộng. Chúng dẫn đến kết quả mạnh mẽ và hữu ích hơn, nhưng cũng phức tạp hơn để viết.
+
+Các phân tích ngữ nghĩa được sử dụng để phát hiện các lỗ hổng bảo mật tiên tiến nhất.
+
+#### Phân tích phụ thuộc dữ liệu {#fixed-point-computation}
+
+Một biến `variable_a` được cho là phụ thuộc dữ liệu vào `variable_b` nếu có một đường dẫn mà giá trị của `variable_a` bị ảnh hưởng bởi `variable_b`.
+
+Trong mã sau đây, `variable_a` phụ thuộc vào `variable_b`:
+
+```solidity
+// ...
+variable_a = variable_b + 1;
+```
+
+Slither đi kèm với các khả năng [phụ thuộc dữ liệu](https://github.com/crytic/slither/wiki/data-dependency) tích hợp sẵn, nhờ vào biểu diễn trung gian của nó (sẽ được thảo luận trong phần sau).
+
+Một ví dụ về việc sử dụng phụ thuộc dữ liệu có thể được tìm thấy trong [công cụ dò tìm đẳng thức nghiêm ngặt nguy hiểm](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities). Ở đây Slither sẽ tìm kiếm so sánh đẳng thức nghiêm ngặt với một giá trị nguy hiểm ([incorrect_strict_equality.py#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87)) và sẽ thông báo cho người dùng rằng nên sử dụng `>=` hoặc `<=` thay vì `==`, để ngăn kẻ tấn công bẫy hợp đồng. Trong số những thứ khác, công cụ dò tìm sẽ coi giá trị trả về của một lệnh gọi đến `balanceOf(address)` là nguy hiểm ([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64)) và sẽ sử dụng công cụ phụ thuộc dữ liệu để theo dõi việc sử dụng nó.
+
+#### Tính toán điểm cố định {#fixed-point-computation}
+
+Nếu phân tích của bạn điều hướng qua CFG và đi theo các cạnh, bạn có thể sẽ thấy các nút đã được truy cập. Ví dụ: nếu một vòng lặp được trình bày như hình dưới đây:
+
+```solidity
+for(uint i; i < range; ++){
+ variable_a += 1
+}
+```
+
+Phân tích của bạn sẽ cần biết khi nào nên dừng lại. Có hai chiến lược chính ở đây: (1) lặp lại trên mỗi nút một số lần hữu hạn, (2) tính toán một cái gọi là _điểm cố định_. Một điểm cố định về cơ bản có nghĩa là việc phân tích nút này không cung cấp bất kỳ thông tin có ý nghĩa nào.
+
+Một ví dụ về điểm cố định được sử dụng có thể được tìm thấy trong các công cụ dò tìm tái nhập: Slither khám phá các nút và tìm kiếm các lệnh gọi bên ngoài, ghi và đọc vào bộ nhớ lưu trữ. Khi đã đạt đến điểm cố định ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131)), nó sẽ dừng việc khám phá và phân tích kết quả để xem liệu có tồn tại tình trạng tái nhập hay không, thông qua các mẫu tái nhập khác nhau ([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)).
+
+Việc viết các phân tích sử dụng tính toán điểm cố định hiệu quả đòi hỏi sự hiểu biết tốt về cách phân tích truyền bá thông tin của nó.
+
+### Biểu diễn trung gian {#intermediate-representation}
+
+Biểu diễn trung gian (IR) là một ngôn ngữ được thiết kế để dễ dàng phân tích tĩnh hơn so với ngôn ngữ gốc. Slither dịch Solidity sang IR của riêng nó: [SlithIR](https://github.com/crytic/slither/wiki/SlithIR).
+
+Việc hiểu SlithIR là không cần thiết nếu bạn chỉ muốn viết các kiểm tra cơ bản. Tuy nhiên, nó sẽ hữu ích nếu bạn có kế hoạch viết các phân tích ngữ nghĩa nâng cao. Các printers [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir) và [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa) sẽ giúp bạn hiểu cách mã được dịch.
+
+## Kiến thức cơ bản về API {#api-basics}
+
+Slither có một API cho phép bạn khám phá các thuộc tính cơ bản của hợp đồng và các hàm của nó.
+
+Để tải một codebase:
+
+```python
+from slither import Slither
+slither = Slither('/path/to/project')
+
+```
+
+### Khám phá các hợp đồng và hàm {#exploring-contracts-and-functions}
+
+Một đối tượng `Slither` có:
+
+- `contracts (list(Contract)`: danh sách các hợp đồng
+- `contracts_derived (list(Contract)`: danh sách các hợp đồng không được kế thừa bởi một hợp đồng khác (tập hợp con của các hợp đồng)
+- `get_contract_from_name (str)`: Trả về một hợp đồng từ tên của nó
+
+Một đối tượng `Contract` có:
+
+- `name (str)`: Tên của hợp đồng
+- `functions (list(Function))`: Danh sách các hàm
+- `modifiers (list(Modifier))`: Danh sách các bộ sửa đổi
+- `all_functions_called (list(Function/Modifier))`: Danh sách tất cả các hàm nội bộ mà hợp đồng có thể truy cập được
+- `inheritance (list(Contract))`: Danh sách các hợp đồng được kế thừa
+- `get_function_from_signature (str)`: Trả về một hàm từ chữ ký của nó
+- `get_modifier_from_signature (str)`: Trả về một bộ sửa đổi từ chữ ký của nó
+- `get_state_variable_from_name (str)`: Trả về một biến trạng thái từ tên của nó
+
+Một đối tượng `Function` hoặc `Modifier` có:
+
+- `name (str)`: Tên của hàm
+- `contract (contract)`: hợp đồng nơi hàm được khai báo
+- `nodes (list(Node))`: Danh sách các nút cấu thành CFG của hàm/bộ sửa đổi
+- `entry_point (Node)`: Điểm vào của CFG
+- `variables_read (list(Variable))`: Danh sách các biến đã đọc
+- `variables_written (list(Variable))`: Danh sách các biến đã ghi
+- `state_variables_read (list(StateVariable))`: Danh sách các biến trạng thái đã đọc (tập hợp con của các biến đã đọc)
+- `state_variables_written (list(StateVariable))`: Danh sách các biến trạng thái đã ghi (tập hợp con của các biến đã ghi)
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
new file mode 100644
index 00000000000..839ef90a034
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
@@ -0,0 +1,81 @@
+---
+title: Cách thiết lập Tellor làm Oracle của bạn
+description: Hướng dẫn bắt đầu tích hợp oracle Tellor vào giao thức của bạn
+author: "Tellor"
+lang: vi
+tags: [ "solidity", "hợp đồng thông minh", "oracles" ]
+skill: beginner
+published: 2021-06-29
+source: Tài liệu Tellor
+sourceUrl: https://docs.tellor.io/tellor/
+---
+
+Câu đố nhanh: Giao thức của bạn sắp hoàn thành nhưng lại cần một oracle để truy cập vào dữ liệu ngoài chuỗi... Bạn sẽ làm gì?
+
+## Điều kiện tiên quyết (không bắt buộc) {#soft-prerequisites}
+
+Bài đăng này nhằm mục đích giúp việc truy cập nguồn cấp dữ liệu oracle trở nên đơn giản và dễ hiểu nhất có thể. Tuy nhiên, chúng tôi giả định những điều sau đây về trình độ kỹ năng lập trình của bạn để tập trung vào khía cạnh oracle.
+
+Các giả định:
+
+- bạn có thể điều hướng một terminal
+- bạn đã cài đặt npm
+- bạn biết cách sử dụng npm để quản lý các phần phụ thuộc
+
+Tellor là một oracle mã nguồn mở và đang hoạt động, sẵn sàng để triển khai. Hướng dẫn dành cho người mới bắt đầu này nhằm mục đích giới thiệu sự dễ dàng mà một người có thể bắt đầu và chạy với Tellor, cung cấp cho dự án của bạn một oracle hoàn toàn phi tập trung và chống kiểm duyệt.
+
+## Tổng quan {#overview}
+
+Tellor là một hệ thống oracle nơi các bên có thể yêu cầu giá trị của một điểm dữ liệu ngoài chuỗi (ví dụ: BTC/USD) và những người báo cáo cạnh tranh để thêm giá trị này vào ngân hàng dữ liệu trên chuỗi, có thể truy cập bởi tất cả các hợp đồng thông minh Ethereum. Các dữ liệu đầu vào cho ngân hàng dữ liệu này được bảo mật bởi một mạng lưới những người báo cáo đã đặt cược. Tellor sử dụng các cơ chế khuyến khích kinh tế-tiền mã hóa, thưởng cho các lần gửi dữ liệu trung thực của người báo cáo và trừng phạt các tác nhân xấu thông qua việc phát hành token của Tellor, Tributes (TRB) và một cơ chế tranh chấp.
+
+Trong hướng dẫn này, chúng ta sẽ xem xét:
+
+- Thiết lập bộ công cụ ban đầu bạn sẽ cần để bắt đầu.
+- Xem qua một ví dụ đơn giản.
+- Liệt kê các địa chỉ mạng thử nghiệm của các mạng mà bạn hiện có thể thử nghiệm Tellor.
+
+## Sử dụng Tellor {#usingtellor}
+
+Điều đầu tiên bạn sẽ muốn làm là cài đặt các công cụ cơ bản cần thiết để sử dụng Tellor làm oracle của bạn. Sử dụng [gói này](https://github.com/tellor-io/usingtellor) để cài đặt các Hợp đồng Người dùng Tellor:
+
+`npm install usingtellor`
+
+Sau khi cài đặt, điều này sẽ cho phép các hợp đồng của bạn kế thừa các hàm từ hợp đồng 'UsingTellor'.
+
+Tuyệt vời! Bây giờ bạn đã sẵn sàng các công cụ, chúng ta hãy cùng thực hiện một bài tập đơn giản để truy xuất giá bitcoin:
+
+### Ví dụ về BTC/USD {#btcusd-example}
+
+Kế thừa hợp đồng UsingTellor, chuyển địa chỉ Tellor làm đối số hàm khởi tạo:
+
+Dưới đây là ví dụ:
+
+```solidity
+import "usingtellor/contracts/UsingTellor.sol";
+
+contract PriceContract is UsingTellor {
+ uint256 public btcPrice;
+
+ //Hợp đồng này hiện có quyền truy cập vào tất cả các hàm trong 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));
+ }
+}
+```
+
+Để có danh sách đầy đủ các địa chỉ hợp đồng, hãy tham khảo [tại đây](https://docs.tellor.io/tellor/the-basics/contracts-reference).
+
+Để dễ sử dụng, repo UsingTellor đi kèm với một phiên bản của hợp đồng [Tellor Playground](https://github.com/tellor-io/TellorPlayground) để tích hợp dễ dàng hơn. Xem [tại đây](https://github.com/tellor-io/sampleUsingTellor#tellor-playground) để biết danh sách các hàm hữu ích.
+
+Để triển khai oracle Tellor một cách mạnh mẽ hơn, hãy xem danh sách đầy đủ các hàm có sẵn [tại đây](https://github.com/tellor-io/usingtellor/blob/master/README.md).
diff --git a/public/content/translations/vi/developers/tutorials/how-to-view-nft-in-metamask/index.md b/public/content/translations/vi/developers/tutorials/how-to-view-nft-in-metamask/index.md
new file mode 100644
index 00000000000..3b98e5e06a7
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/how-to-view-nft-in-metamask/index.md
@@ -0,0 +1,33 @@
+---
+title: Cách xem NFT của bạn trong Ví (Phần 3/3 của Chuỗi hướng dẫn NFT)
+description: Hướng dẫn này mô tả cách xem một NFT hiện có trên MetaMask!
+author: "Sumi Mudgil"
+tags: [ "ERC-721", "Từ Alchemy", "Solidity" ]
+skill: beginner
+lang: vi
+published: 2021-04-22
+---
+
+Hướng dẫn này là Phần 3/3 trong chuỗi Hướng dẫn NFT, nơi chúng ta sẽ xem NFT mới được đúc của mình. Tuy nhiên, bạn có thể sử dụng hướng dẫn chung cho bất kỳ token ERC-721 nào bằng MetaMask, bao gồm cả trên Mạng chính hoặc bất kỳ mạng thử nghiệm nào. Nếu bạn muốn tìm hiểu cách tự đúc NFT của riêng mình trên Ethereum, bạn nên xem [Phần 1 về Cách viết và triển khai hợp đồng thông minh NFT](/developers/tutorials/how-to-write-and-deploy-an-nft)!
+
+Xin chúc mừng! Bạn đã đến phần ngắn nhất và đơn giản nhất trong chuỗi hướng dẫn NFT của chúng tôi — cách xem NFT mới được đúc của bạn trên ví ảo. Chúng tôi sẽ sử dụng MetaMask cho ví dụ này vì đó là những gì chúng tôi đã sử dụng trong hai phần trước.
+
+Yêu cầu tiên quyết là bạn phải cài đặt sẵn MetaMask trên di động và ví đó phải bao gồm tài khoản mà bạn đã đúc NFT của mình — bạn có thể tải ứng dụng miễn phí trên [iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) hoặc [Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US).
+
+## Bước 1: Đặt mạng của bạn thành Sepolia {#set-network-to-sepolia}
+
+Ở đầu ứng dụng, nhấn nút "Ví", sau đó bạn sẽ được nhắc chọn một mạng. Vì NFT của chúng tôi được đúc trên mạng Sepolia, bạn sẽ muốn chọn Sepolia làm mạng của mình.
+
+
+
+## Bước 2: Thêm vật phẩm sưu tầm của bạn vào MetaMask {#add-nft-to-metamask}
+
+Khi bạn đang ở trên mạng Sepolia, hãy chọn tab "Vật phẩm Sưu tầm" ở bên phải và thêm địa chỉ hợp đồng thông minh NFT cũng như ID token ERC-721 của NFT của bạn — bạn có thể tìm thấy thông tin này trên Etherscan dựa trên băm giao dịch từ NFT của bạn đã được triển khai trong Phần II của hướng dẫn của chúng tôi.
+
+
+
+Bạn có thể cần phải làm mới một vài lần để xem NFT của mình — nhưng nó sẽ ở đó !
+
+
+
+Xin chúc mừng! Bạn đã đúc thành công một NFT, và bây giờ bạn có thể xem nó! Chúng tôi rất nóng lòng được xem bạn sẽ khuấy đảo thế giới NFT như thế nào!
diff --git a/public/content/translations/vi/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/vi/developers/tutorials/how-to-write-and-deploy-an-nft/index.md
new file mode 100644
index 00000000000..c889c9b984f
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/how-to-write-and-deploy-an-nft/index.md
@@ -0,0 +1,386 @@
+---
+title: Cách viết và triển khai một NFT (Phần 1/3 trong Loạt bài hướng dẫn về NFT)
+description: Hướng dẫn này là phần 1 của chuỗi hướng dẫn về NFT mà sẽ đưa bạn từng bước viết và triển khai một hợp đồng thông minh cho mã thông báo không thể thay thế (mã ERC-721) sử dụng Ethereum và Hệ thống tệp liên hành tinh (IPFS).
+author: "Sumi Mudgil"
+tags:
+ [
+ "ERC-721",
+ "Từ Alchemy",
+ "Solidity",
+ "hợp đồng thông minh"
+ ]
+skill: beginner
+lang: vi
+published: 2021-04-22
+---
+
+Với việc NFT đưa blockchain ra mắt công chúng, đây là một cơ hội tuyệt vời để tự mình tìm hiểu về cơn sốt này bằng cách xuất bản hợp đồng NFT (Mã thông báo ERC-721) của riêng bạn trên blockchain Ethereum!
+
+Alchemy vô cùng tự hào khi cung cấp sức mạnh cho những tên tuổi lớn nhất trong không gian NFT, bao gồm Makersplace (gần đây đã lập kỷ lục bán tác phẩm nghệ thuật kỹ thuật số tại Christie's với giá 69 triệu đô la), Dapper Labs (những người tạo ra NBA Top Shot & Crypto Kitties), OpenSea (thị trường NFT lớn nhất thế giới), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable, và nhiều hơn nữa.
+
+Trong bài hướng dẫn này, chúng ta sẽ thực hiện từng bước tạo và triển khai hợp đồng thông minh ERC-721 trên mạng thử nghiệm Sepolia bằng [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) và [Alchemy](https://alchemy.com/signup/eth) (đừng lo lắng nếu bạn chưa hiểu bất kỳ điều gì trong số này — chúng tôi sẽ giải thích!).
+
+Trong Phần 2 của hướng dẫn này, chúng ta sẽ xem xét cách chúng ta có thể sử dụng hợp đồng thông minh của mình để tạo NFT và trong Phần 3, chúng ta sẽ giải thích cách xem NFT của bạn trên MetaMask.
+
+Và tất nhiên, nếu bạn có bất kỳ câu hỏi nào, đừng ngần ngại liên hệ trong [Alchemy Discord](https://discord.gg/gWuC7zB) hoặc truy cập [tài liệu API NFT của Alchemy](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api)!
+
+## Bước 1: Kết nối với mạng Ethereum {#connect-to-ethereum}
+
+Có nhiều cách để gửi yêu cầu đến blockchain Ethereum, nhưng để mọi thứ dễ dàng hơn, chúng ta sẽ sử dụng một tài khoản miễn phí trên [Alchemy](https://alchemy.com/signup/eth), một nền tảng nhà phát triển blockchain và API cho phép chúng ta giao tiếp với chuỗi Ethereum mà không cần phải chạy các nút của riêng mình.
+
+Trong hướng dẫn này, chúng ta cũng sẽ tận dụng các công cụ dành cho nhà phát triển của Alchemy để theo dõi và phân tích để hiểu những gì đang diễn ra trong quá trình triển khai hợp đồng thông minh của chúng ta. Nếu bạn chưa có tài khoản Alchemy, bạn có thể đăng ký miễn phí [tại đây](https://alchemy.com/signup/eth).
+
+## Bước 2: Tạo ứng dụng của bạn (và khóa API) {#make-api-key}
+
+Khi bạn đã tạo tài khoản Alchemy, bạn có thể tạo một khoá API bằng cách tạo một ứng dụng. Điều này sẽ cho phép chúng ta gửi yêu cầu đến mạng thử nghiệm Sepolia. Hãy xem [hướng dẫn này](https://docs.alchemyapi.io/guides/choosing-a-network) nếu bạn muốn tìm hiểu thêm về các mạng thử nghiệm.
+
+1. Đi đến trang "Tạo ứng dụng" trong bảng điều khiển Alchemy của bạn bằng cách di chuột qua "Các ứng dụng" trong thanh điều hướng và bấm vàp "Tạo ứng dụng"
+
+
+
+2. Đặt tên cho ứng dụng của bạn (chúng tôi đã chọn “My First NFT!”), cung cấp mô tả ngắn, chọn “Ethereum” cho Chuỗi và chọn “Sepolia” cho mạng của bạn. Kể từ The Merge, các mạng thử nghiệm khác đã không còn được dùng nữa.
+
+
+
+3. Nhấp vào "Create app" và thế là xong! Ứng dụng của bạn sẽ xuất hiện trong bảng dưới đây.
+
+## Bước 3: Tạo một tài khoản Ethereum (địa chỉ) {#create-eth-address}
+
+Chúng ta cần một tài khoản Ethereum để gửi và nhận giao dịch. Trong bài hướng dẫn này, chúng ta sẽ sử dụng MetaMask, một ví ảo trong trình duyệt dùng để quản lý địa chỉ tài khoản Ethereum của bạn. Nếu bạn muốn tìm hiểu thêm về cách thức hoạt động của các giao dịch trên Ethereum, hãy xem [trang này](/developers/docs/transactions/) từ Ethereum Foundation.
+
+Bạn có thể tải xuống và tạo tài khoản MetaMask miễn phí [tại đây](https://metamask.io/download). Khi bạn tạo tài khoản, hoặc nếu bạn đã có tài khoản, hãy đảm bảo chuyển sang “Sepolia Test Network” ở góc trên bên phải (để chúng ta không giao dịch bằng tiền thật).
+
+
+
+## Bước 4: Thêm ether từ Faucet {#step-4-add-ether-from-a-faucet}
+
+Để triển khai hợp đồng thông minh của chúng ta lên mạng thử nghiệm, chúng ta sẽ cần một ít ETH giả. Để nhận ETH, bạn có thể truy cập [Sepolia Faucet](https://sepoliafaucet.com/) do Alchemy cung cấp, đăng nhập và nhập địa chỉ tài khoản của bạn, rồi nhấp vào “Send Me ETH”. Bạn sẽ sớm thấy ETH trong tài khoản MetaMask của mình ngay sau đó!
+
+## Bước 5: Kiểm tra số dư {#check-balance}
+
+Để kiểm tra lại số dư, chúng ta hãy tạo một yêu cầu [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) bằng cách sử dụng [công cụ soạn thảo của 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). Thao tác này sẽ trả về lượng ETH có trong ví của chúng ta. Sau khi bạn nhập địa chỉ tài khoản MetaMask của mình và nhấp vào “Send Request”, bạn sẽ thấy một phản hồi như sau:
+
+ ```
+ `{\"jsonrpc\": \"2.0\", \"id\": 0, \"result\": \"0xde0b6b3a7640000\"}`
+ ```
+
+> **Lưu ý** Kết quả này được tính bằng wei, không phải ETH. Wei được sử dụng làm mệnh giá nhỏ nhất của ether. Tỷ lệ chuyển đổi từ wei sang ETH là 1 eth = 1018 wei. Vì vậy, nếu chúng ta chuyển đổi 0xde0b6b3a7640000 sang hệ thập phân, chúng ta sẽ nhận được 1\*1018 wei, tương đương 1 ETH.
+
+Phù! Tiền giả của chúng ta đã có đủ.
+
+## Bước 6: Khởi tạo dự án của chúng ta {#initialize-project}
+
+Đầu tiên, chúng ta sẽ cần tạo một thư mục cho dự án của mình. Điều hướng đến dòng lệnh của bạn và gõ:
+
+ ```
+ mkdir my-nft
+ cd my-nft
+ ```
+
+Bây giờ chúng ta đang ở trong thư mục dự án của mình, chúng ta sẽ sử dụng npm init để khởi tạo dự án. Nếu bạn chưa cài đặt npm, hãy làm theo [các hướng dẫn này](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (chúng ta cũng sẽ cần [Node.js](https://nodejs.org/en/download/), vì vậy hãy tải xuống luôn nhé!).
+
+ ```
+ npm init
+ ```
+
+Việc bạn trả lời các câu hỏi cài đặt như thế nào không thực sự quan trọng; đây là cách chúng tôi đã làm để bạn tham khảo:
+
+```json
+ tên gói: (my-nft)
+ phiên bản: (1.0.0)
+ mô tả: NFT đầu tiên của tôi!
+ điểm vào: (index.js)
+ lệnh kiểm tra:
+ kho lưu trữ git:
+ từ khóa:
+ tác giả:
+ giấy phép: (ISC)
+ Sắp ghi vào /Users/thesuperb1/Desktop/my-nft/package.json:
+
+ {
+ "name": "my-nft",
+ "version": "1.0.0",
+ "description": "NFT đầu tiên của tôi!",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Lỗi: không có bài kiểm tra nào được chỉ định\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+ }
+```
+
+Phê duyệt package.json và chúng ta đã sẵn sàng!
+
+## Bước 7: Cài đặt [Hardhat](https://hardhat.org/getting-started/#overview) {#install-hardhat}
+
+Hardhat là một môi trường phát triển để biên dịch, triển khai, kiểm thử và gỡ lỗi phần mềm Ethereum của bạn. Nó giúp các nhà phát triển khi xây dựng hợp đồng thông minh và các ứng dụng phi tập trung cục bộ trước khi triển khai lên chuỗi chính.
+
+Bên trong dự án my-nft của chúng ta, hãy chạy:
+
+ ```
+ npm install --save-dev hardhat
+ ```
+
+Hãy xem trang này để biết thêm chi tiết về [hướng dẫn cài đặt](https://hardhat.org/getting-started/#overview).
+
+## Bước 8: Tạo dự án Hardhat {#create-hardhat-project}
+
+Bên trong thư mục dự án của chúng ta, hãy chạy:
+
+ ```
+ npx hardhat
+ ```
+
+Sau đó, bạn sẽ thấy một thông báo chào mừng và tùy chọn để chọn những gì bạn muốn làm. Chọn “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
+ 👷 Chào mừng đến với Hardhat v2.0.11 👷
+ ? Bạn muốn làm gì? …
+ Tạo một dự án mẫu
+ ❯ Tạo một tệp hardhat.config.js trống
+ Thoát
+ ```
+
+Thao tác này sẽ tạo ra một tệp hardhat.config.js cho chúng ta, đây là nơi chúng ta sẽ chỉ định tất cả các thiết lập cho dự án của mình (ở bước 13).
+
+## Bước 9: Thêm các thư mục dự án {#add-project-folders}
+
+Để giữ cho dự án của chúng ta được ngăn nắp, chúng ta sẽ tạo hai thư mục mới. Điều hướng đến thư mục gốc của dự án của bạn trong dòng lệnh và gõ:
+
+ ```
+ mkdir contracts
+ mkdir scripts
+ ```
+
+- contracts/ là nơi chúng ta sẽ lưu giữ mã hợp đồng thông minh NFT của mình
+
+- scripts/ là nơi chúng ta sẽ lưu giữ các tập lệnh để triển khai và tương tác với hợp đồng thông minh của mình
+
+## Bước 10: Viết hợp đồng của chúng ta {#write-contract}
+
+Bây giờ môi trường của chúng ta đã được thiết lập, hãy đến với những thứ thú vị hơn: _viết mã hợp đồng thông minh của chúng ta!_
+
+Mở dự án my-nft trong trình chỉnh sửa yêu thích của bạn (chúng tôi thích [VSCode](https://code.visualstudio.com/)). Các hợp đồng thông minh được viết bằng một ngôn ngữ gọi là Solidity và đây là ngôn ngữ chúng ta sẽ sử dụng để viết hợp đồng thông minh MyNFT.sol của mình.
+
+1. Điều hướng đến thư mục `contracts` và tạo một tệp mới có tên là MyNFT.sol
+
+2. Dưới đây là mã hợp đồng thông minh NFT của chúng tôi, dựa trên việc triển khai ERC-721 của thư viện [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721). Sao chép và dán nội dung bên dưới vào tệp MyNFT.sol của bạn.
+
+ ```solidity
+ //Hợp đồng dựa trên [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
+ // SPDX-License-Identifier: MIT
+ pragma solidity ^0.8.0;
+
+ import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
+ import "@openzeppelin/contracts/utils/Counters.sol";
+ import "@openzeppelin/contracts/access/Ownable.sol";
+ import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
+
+ contract MyNFT is ERC721URIStorage, Ownable {
+ using Counters for Counters.Counter;
+ Counters.Counter private _tokenIds;
+
+ constructor() ERC721("MyNFT", "NFT") {}
+
+ function mintNFT(address recipient, string memory tokenURI)
+ public onlyOwner
+ returns (uint256)
+ {
+ _tokenIds.increment();
+
+ uint256 newItemId = _tokenIds.current();
+ _mint(recipient, newItemId);
+ _setTokenURI(newItemId, tokenURI);
+
+ return newItemId;
+ }
+ }
+ ```
+
+3. Bởi vì chúng ta đang kế thừa các lớp từ thư viện hợp đồng OpenZeppelin, hãy chạy `npm install @openzeppelin/contracts^4.0.0` trong dòng lệnh của bạn để cài đặt thư viện vào thư mục của chúng ta.
+
+Vậy, chính xác thì đoạn mã này _làm_ gì? Hãy cùng phân tích nó, từng dòng một.
+
+Ở đầu hợp đồng thông minh của chúng ta, chúng ta nhập ba lớp hợp đồng thông minh [OpenZeppelin](https://openzeppelin.com/):
+
+- @openzeppelin/contracts/token/ERC721/ERC721.sol chứa phần triển khai của tiêu chuẩn ERC-721, mà hợp đồng thông minh NFT của chúng ta sẽ kế thừa. (Để là một NFT hợp lệ, hợp đồng thông minh của bạn phải triển khai tất cả các phương thức của tiêu chuẩn ERC-721.) Để tìm hiểu thêm về các hàm ERC-721 được kế thừa, hãy xem định nghĩa giao diện [tại đây](https://eips.ethereum.org/EIPS/eip-721).
+
+- @openzeppelin/contracts/utils/Counters.sol cung cấp các bộ đếm chỉ có thể tăng hoặc giảm một đơn vị. Hợp đồng thông minh của chúng ta sử dụng một bộ đếm để theo dõi tổng số NFT được đúc và đặt ID duy nhất trên NFT mới của chúng ta. (Mỗi NFT được đúc bằng hợp đồng thông minh phải được gán một ID duy nhất — ở đây, ID duy nhất của chúng ta chỉ được xác định bằng tổng số NFT đang tồn tại. Ví dụ: NFT đầu tiên chúng ta đúc bằng hợp đồng thông minh của mình có ID là "1," NFT thứ hai của chúng ta có ID là "2," v.v.)
+
+- @openzeppelin/contracts/access/Ownable.sol thiết lập [kiểm soát truy cập](https://docs.openzeppelin.com/contracts/3.x/access-control) trên hợp đồng thông minh của chúng ta, vì vậy chỉ chủ sở hữu của hợp đồng thông minh (bạn) mới có thể đúc NFT. (Lưu ý, việc bao gồm kiểm soát truy cập hoàn toàn là một tùy chọn. Nếu bạn muốn bất kỳ ai cũng có thể đúc một NFT bằng hợp đồng thông minh của mình, hãy xóa từ Ownable ở dòng 10 và onlyOwner ở dòng 17.)
+
+Sau các câu lệnh nhập của chúng ta, chúng ta có hợp đồng thông minh NFT tùy chỉnh, ngắn một cách đáng ngạc nhiên — nó chỉ chứa một bộ đếm, một hàm khởi tạo và một hàm duy nhất! Điều này là nhờ các hợp đồng OpenZeppelin được kế thừa của chúng ta, vốn triển khai hầu hết các phương thức chúng ta cần để tạo một NFT, chẳng hạn như `ownerOf` trả về chủ sở hữu của NFT, và `transferFrom` chuyển quyền sở hữu NFT từ tài khoản này sang tài khoản khác.
+
+Trong hàm khởi tạo ERC-721, bạn sẽ nhận thấy chúng ta truyền 2 chuỗi, “MyNFT” và “NFT.” Biến đầu tiên là tên của hợp đồng thông minh và biến thứ hai là ký hiệu của nó. Bạn có thể đặt tên cho mỗi biến này theo bất cứ điều gì bạn muốn!
+
+Cuối cùng, chúng ta có hàm `mintNFT(address recipient, string memory tokenURI)` cho phép chúng ta đúc một NFT! Bạn sẽ nhận thấy hàm này có hai biến:
+
+- `address recipient` chỉ định địa chỉ sẽ nhận NFT mới được đúc của bạn
+
+- `string memory tokenURI` là một chuỗi sẽ phân giải thành một tài liệu JSON mô tả siêu dữ liệu của NFT. Siêu dữ liệu của NFT thực sự là thứ mang lại sự sống cho nó, cho phép nó có các thuộc tính có thể định cấu hình, chẳng hạn như tên, mô tả, hình ảnh và các thuộc tính khác. Trong phần 2 của bài hướng dẫn này, chúng tôi sẽ mô tả cách định cấu hình siêu dữ liệu này.
+
+`mintNFT` gọi một số phương thức từ thư viện ERC-721 được kế thừa, và cuối cùng trả về một số đại diện cho ID của NFT mới được đúc.
+
+## Bước 11: Kết nối MetaMask & Alchemy với dự án của bạn {#connect-metamask-and-alchemy}
+
+Bây giờ chúng ta đã tạo ví MetaMask, tài khoản Alchemy và viết hợp đồng thông minh của mình, đã đến lúc kết nối cả ba.
+
+Mọi giao dịch được gửi từ ví ảo của bạn đều yêu cầu chữ ký bằng khóa riêng tư duy nhất của bạn. Để cấp quyền này cho chương trình của chúng ta, chúng ta có thể lưu trữ khóa riêng tư (và khóa API Alchemy) một cách an toàn trong một tệp môi trường.
+
+Để tìm hiểu thêm về việc gửi giao dịch, hãy xem [bài hướng dẫn này](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) về việc gửi giao dịch bằng web3.
+
+Đầu tiên, cài đặt gói dotenv trong thư mục dự án của bạn:
+
+ ```
+ npm install dotenv --save
+ ```
+
+Sau đó, tạo một tệp `.env` trong thư mục gốc của dự án và thêm khóa riêng tư MetaMask và URL API HTTP Alchemy của bạn vào đó.
+
+- Làm theo [các hướng dẫn này](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) để xuất khóa riêng tư của bạn từ MetaMask
+
+- Xem bên dưới để lấy URL API HTTP Alchemy và sao chép nó vào clipboard của bạn
+
+
+
+Tệp `.env` của bạn bây giờ sẽ trông như thế này:
+
+ ```
+ API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
+ PRIVATE_KEY="your-metamask-private-key"
+ ```
+
+Để thực sự kết nối chúng với mã của chúng ta, chúng ta sẽ tham chiếu các biến này trong tệp hardhat.config.js ở bước 13.
+
+
+
+## Bước 12: Cài đặt Ethers.js {#install-ethers}
+
+Ethers.js là một thư viện giúp tương tác và gửi yêu cầu đến Ethereum dễ dàng hơn bằng cách gói [các phương thức JSON-RPC tiêu chuẩn](/developers/docs/apis/json-rpc/) với các phương thức thân thiện hơn với người dùng.
+
+Hardhat giúp tích hợp [Plugin](https://hardhat.org/plugins/) cho các công cụ bổ sung và chức năng mở rộng trở nên siêu dễ dàng. Chúng tôi sẽ tận dụng [plugin Ethers](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) để triển khai hợp đồng ([Ethers.js](https://github.com/ethers-io/ethers.js/) có một số phương pháp triển khai hợp đồng siêu gọn gàng).
+
+Trong thư mục dự án của bạn, hãy gõ:
+
+ ```
+ npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0
+ ```
+
+Chúng ta cũng sẽ cần ethers trong tệp hardhat.config.js ở bước tiếp theo.
+
+## Bước 13: Cập nhật hardhat.config.js {#update-hardhat-config}
+
+Chúng ta đã thêm một số phụ thuộc và plugin cho đến nay, bây giờ chúng ta cần cập nhật hardhat.config.js để dự án của chúng ta biết về tất cả chúng.
+
+Cập nhật tệp hardhat.config.js của bạn để trông như thế này:
+
+```js
+ /**
+ * @type import('hardhat/config').HardhatUserConfig
+ */
+ require('dotenv').config();
+ require("@nomiclabs/hardhat-ethers");
+ const { API_URL, PRIVATE_KEY } = process.env;
+ module.exports = {
+ solidity: "0.8.1",
+ defaultNetwork: "sepolia",
+ networks: {
+ hardhat: {},
+ sepolia: {
+ url: API_URL,
+ accounts: [`0x${PRIVATE_KEY}`]
+ }
+ },
+ }
+```
+
+## Bước 14: Biên dịch hợp đồng của chúng ta {#compile-contract}
+
+Để đảm bảo mọi thứ đều hoạt động cho đến nay, hãy biên dịch hợp đồng của chúng ta. Tác vụ biên dịch là một trong những tác vụ có sẵn của hardhat.
+
+Từ dòng lệnh, hãy chạy:
+
+ ```
+ npx hardhat compile
+ ```
+
+Bạn có thể nhận được cảnh báo về mã định danh giấy phép SPDX không được cung cấp trong tệp nguồn, nhưng không cần phải lo lắng về điều đó — hy vọng mọi thứ khác đều ổn! Nếu không, bạn luôn có thể nhắn tin trong [Alchemy discord](https://discord.gg/u72VCg3).
+
+## Bước 15: Viết tập lệnh triển khai của chúng ta {#write-deploy}
+
+Bây giờ hợp đồng của chúng ta đã được viết và tệp cấu hình đã sẵn sàng, đã đến lúc viết tập lệnh triển khai hợp đồng của chúng ta.
+
+Điều hướng đến thư mục `scripts/` và tạo một tệp mới có tên `deploy.js`, thêm nội dung sau vào đó:
+
+```js
+async function main() {
+ const MyNFT = await ethers.getContractFactory("MyNFT")
+
+ // Bắt đầu triển khai, trả về một promise phân giải thành một đối tượng hợp đồng
+ const myNFT = await MyNFT.deploy()
+ await myNFT.deployed()
+ console.log("Hợp đồng được triển khai đến địa chỉ:", myNFT.address)
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error)
+ process.exit(1)
+ })
+```
+
+Hardhat đã làm rất tốt việc giải thích mỗi dòng mã này làm gì trong [Bài hướng dẫn về Hợp đồng](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) của họ, chúng tôi đã áp dụng các giải thích của họ ở đây.
+
+ ```
+ const MyNFT = await ethers.getContractFactory("MyNFT");
+ ```
+
+Một ContractFactory trong ethers.js là một sự trừu tượng được sử dụng để triển khai các hợp đồng thông minh mới, vì vậy MyNFT ở đây là một nhà máy cho các phiên bản của hợp đồng NFT của chúng ta. Khi sử dụng plugin hardhat-ethers, các phiên bản ContractFactory và Contract được kết nối với người ký đầu tiên theo mặc định.
+
+ ```
+ const myNFT = await MyNFT.deploy();
+ ```
+
+Việc gọi deploy() trên một ContractFactory sẽ bắt đầu quá trình triển khai và trả về một Promise phân giải thành một Hợp đồng. Đây là đối tượng có một phương thức cho mỗi chức năng hợp đồng thông minh của chúng ta.
+
+## Bước 16: Triển khai hợp đồng của chúng ta {#deploy-contract}
+
+Cuối cùng, chúng ta đã sẵn sàng để triển khai hợp đồng thông minh của mình! Điều hướng trở lại thư mục gốc của dự án của bạn và trong dòng lệnh, hãy chạy:
+
+ ```
+ npx hardhat --network sepolia run scripts/deploy.js
+ ```
+
+Sau đó, bạn sẽ thấy một cái gì đó như thế này:
+
+ ```
+ Hợp đồng được triển khai đến địa chỉ: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650
+ ```
+
+Nếu chúng ta truy cập [Sepolia etherscan](https://sepolia.etherscan.io/) và tìm kiếm địa chỉ hợp đồng của mình, chúng ta sẽ có thể thấy rằng nó đã được triển khai thành công. Nếu bạn không thể nhìn thấy nó ngay lập tức, vui lòng đợi một lát vì có thể mất một chút thời gian. Giao dịch sẽ trông giống như thế này:
+
+
+
+Địa chỉ Từ sẽ khớp với địa chỉ tài khoản MetaMask của bạn và địa chỉ Đến sẽ hiển thị “Tạo Hợp đồng”. Nếu chúng ta nhấp vào giao dịch, chúng ta sẽ thấy địa chỉ hợp đồng của mình trong trường Đến:
+
+
+
+Tuyệt vời! Bạn vừa triển khai hợp đồng thông minh NFT của mình lên chuỗi Ethereum (mạng thử nghiệm)!
+
+Để hiểu những gì đang diễn ra ở hậu trường, hãy điều hướng đến tab Explorer trong [bảng điều khiển Alchemy](https://dashboard.alchemyapi.io/explorer) của chúng ta. Nếu bạn có nhiều ứng dụng Alchemy, hãy đảm bảo lọc theo ứng dụng và chọn “MyNFT”.
+
+
+
+Ở đây, bạn sẽ thấy một số lệnh gọi JSON-RPC mà Hardhat/Ethers đã thực hiện ở hậu trường cho chúng ta khi chúng ta gọi hàm .deploy(). Hai điều quan trọng cần đề cập ở đây là [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), là yêu cầu thực sự ghi hợp đồng thông minh của chúng ta vào chuỗi Sepolia, và [eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash), là yêu cầu đọc thông tin về giao dịch của chúng ta dựa trên hàm băm (một mẫu điển hình khi gửi giao dịch). Để tìm hiểu thêm về việc gửi giao dịch, hãy xem bài hướng dẫn này về [việc gửi giao dịch bằng Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/).
+
+Đó là tất cả cho Phần 1 của bài hướng dẫn này. Trong [Phần 2, chúng ta sẽ thực sự tương tác với hợp đồng thông minh của mình bằng cách đúc một NFT](/developers/tutorials/how-to-mint-an-nft/), và trong [Phần 3, chúng tôi sẽ chỉ cho bạn cách xem NFT của mình trong ví Ethereum của bạn](/developers/tutorials/how-to-view-nft-in-metamask/)!
diff --git a/public/content/translations/vi/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/vi/developers/tutorials/interact-with-other-contracts-from-solidity/index.md
new file mode 100644
index 00000000000..9a1f4eb2ca3
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/interact-with-other-contracts-from-solidity/index.md
@@ -0,0 +1,179 @@
+---
+title: Tương tác với các hợp đồng khác từ Solidity
+description: Cách triển khai một hợp đồng thông minh từ một hợp đồng hiện có và tương tác với nó
+author: "jdourlens"
+tags:
+ [
+ "hợp đồng thông minh",
+ "solidity",
+ "remix",
+ "triển khai",
+ "khả năng tổng hợp"
+ ]
+skill: advanced
+lang: vi
+published: 2020-04-05
+source: EthereumDev
+sourceUrl: https://ethereumdev.io/interact-with-other-contracts-from-solidity/
+address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
+---
+
+Trong các hướng dẫn trước, chúng ta đã học được rất nhiều về [cách triển khai hợp đồng thông minh đầu tiên của bạn](/developers/tutorials/deploying-your-first-smart-contract/) và thêm một số tính năng cho nó như [kiểm soát quyền truy cập bằng các bộ sửa đổi](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/) hoặc [xử lý lỗi trong Solidity](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/). Trong hướng dẫn này, chúng ta sẽ học cách triển khai một hợp đồng thông minh từ một hợp đồng hiện có và tương tác với nó.
+
+Chúng ta sẽ tạo một hợp đồng cho phép bất kỳ ai có hợp đồng thông minh `Counter` của riêng họ bằng cách tạo một factory cho nó, tên của nó sẽ là `CounterFactory`. Đầu tiên đây là mã của hợp đồng thông minh `Counter` ban đầu của chúng ta:
+
+```solidity
+pragma solidity 0.5.17;
+
+contract Counter {
+
+ uint256 private _count;
+ address private _owner;
+ address private _factory;
+
+
+ modifier onlyOwner(address caller) {
+ require(caller == _owner, "Bạn không phải là chủ sở hữu của hợp đồng");
+ _;
+ }
+
+ modifier onlyFactory() {
+ require(msg.sender == _factory, "Bạn cần sử dụng 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++;
+ }
+
+}
+```
+
+Lưu ý rằng chúng tôi đã sửa đổi một chút mã hợp đồng để theo dõi địa chỉ của factory và địa chỉ của chủ sở hữu hợp đồng. Khi bạn gọi mã hợp đồng từ một hợp đồng khác, msg.sender sẽ tham chiếu đến địa chỉ của factory hợp đồng của chúng ta. Đây là **một điểm thực sự quan trọng cần hiểu** vì việc sử dụng một hợp đồng để tương tác với các hợp đồng khác là một thông lệ phổ biến. Do đó, bạn nên cẩn thận về việc ai là người gửi trong các trường hợp phức tạp.
+
+Vì vậy, chúng tôi cũng đã thêm một bộ sửa đổi `onlyFactory` để đảm bảo rằng hàm thay đổi trạng thái chỉ có thể được gọi bởi factory, nơi sẽ chuyển người gọi ban đầu dưới dạng một tham số.
+
+Bên trong `CounterFactory` mới của chúng ta, sẽ quản lý tất cả các Counter khác, chúng ta sẽ thêm một ánh xạ sẽ liên kết một chủ sở hữu với địa chỉ của hợp đồng counter của họ:
+
+```solidity
+mapping(address => Counter) _counters;
+```
+
+Trong Ethereum, ánh xạ tương đương với các đối tượng trong javascript, chúng cho phép ánh xạ một khóa loại A tới một giá trị loại B. Trong trường hợp này, chúng ta ánh xạ địa chỉ của một chủ sở hữu với phiên bản Counter của nó.
+
+Việc khởi tạo một Counter mới cho ai đó sẽ trông như thế này:
+
+```solidity
+ function createCounter() public {
+ require (_counters[msg.sender] == Counter(0));
+ _counters[msg.sender] = new Counter(msg.sender);
+ }
+```
+
+Đầu tiên chúng ta kiểm tra xem người đó đã sở hữu một counter hay chưa. Nếu họ chưa sở hữu một counter, chúng ta sẽ khởi tạo một counter mới bằng cách chuyển địa chỉ của họ cho hàm khởi tạo `Counter` và gán phiên bản mới được tạo cho ánh xạ.
+
+Để lấy số đếm của một Counter cụ thể, nó sẽ trông như thế này:
+
+```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));
+}
+```
+
+Hàm đầu tiên kiểm tra xem hợp đồng Counter có tồn tại cho một địa chỉ nhất định hay không và sau đó gọi phương thức `getCount` từ phiên bản đó. Hàm thứ hai: `getMyCount` chỉ là một lối tắt để chuyển trực tiếp msg.sender đến hàm `getCount`.
+
+Hàm `increment` khá tương tự nhưng chuyển người gửi giao dịch ban đầu đến hợp đồng `Counter`:
+
+```solidity
+function increment() public {
+ require (_counters[msg.sender] != Counter(0));
+ Counter(_counters[msg.sender]).increment(msg.sender);
+ }
+```
+
+Lưu ý rằng nếu được gọi quá nhiều lần, bộ đếm của chúng ta có thể bị lỗi tràn số. Bạn nên sử dụng [thư viện SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/) càng nhiều càng tốt để bảo vệ khỏi trường hợp có thể xảy ra này.
+
+Để triển khai hợp đồng của chúng ta, bạn sẽ cần cung cấp cả mã của `CounterFactory` và `Counter`. Ví dụ: khi triển khai trong Remix, bạn sẽ cần phải chọn CounterFactory.
+
+Đây là mã đầy đủ:
+
+```solidity
+pragma solidity 0.5.17;
+
+contract Counter {
+
+ uint256 private _count;
+ address private _owner;
+ address private _factory;
+
+
+ modifier onlyOwner(address caller) {
+ require(caller == _owner, "Bạn không phải là chủ sở hữu của hợp đồng");
+ _;
+ }
+
+ modifier onlyFactory() {
+ require(msg.sender == _factory, "Bạn cần sử dụng 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));
+ }
+
+}
+```
+
+Sau khi biên dịch, trong phần triển khai của Remix, bạn sẽ chọn factory để triển khai:
+
+
+
+Sau đó, bạn có thể thử nghiệm với factory hợp đồng của mình và kiểm tra sự thay đổi giá trị. Nếu bạn muốn gọi hợp đồng thông minh từ một địa chỉ khác, bạn sẽ cần thay đổi địa chỉ trong phần chọn Tài khoản của Remix.
diff --git a/public/content/translations/vi/developers/tutorials/ipfs-decentralized-ui/index.md b/public/content/translations/vi/developers/tutorials/ipfs-decentralized-ui/index.md
new file mode 100644
index 00000000000..b05ec5a6549
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/ipfs-decentralized-ui/index.md
@@ -0,0 +1,73 @@
+---
+title: IPFS cho giao diện người dùng phi tập trung
+description: Hướng dẫn này dạy người đọc cách sử dụng IPFS để lưu trữ giao diện người dùng cho một ứng dụng phi tập trung. Mặc dù dữ liệu và logic nghiệp vụ của ứng dụng được phân cấp, nhưng nếu không có giao diện người dùng chống kiểm duyệt, người dùng vẫn có thể mất quyền truy cập vào ứng dụng đó.
+author: Ori Pomerantz
+tags: [ "ipfs" ]
+skill: beginner
+lang: vi
+published: 2024-06-29
+---
+
+Bạn đã viết một ứng dụng phi tập trung mới lạ đáng kinh ngạc. Bạn thậm chí đã viết một [giao diện người dùng](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) cho nó. Nhưng bây giờ bạn sợ rằng ai đó sẽ cố gắng kiểm duyệt nó bằng cách đánh sập giao diện người dùng của bạn, vốn chỉ là một máy chủ trên đám mây. Trong hướng dẫn này, bạn sẽ học cách tránh kiểm duyệt bằng cách đưa giao diện người dùng của bạn lên **[hệ thống tệp liên hành tinh (IPFS)](https://ipfs.tech/developers/)** để bất kỳ ai quan tâm đều có thể ghim nó trên máy chủ để truy cập trong tương lai.
+
+Bạn có thể sử dụng một dịch vụ của bên thứ ba như [Fleek](https://resources.fleek.xyz/docs/) để thực hiện tất cả công việc. Hướng dẫn này dành cho những người muốn tự mình thực hiện đủ để hiểu những gì họ đang làm ngay cả khi nó tốn nhiều công sức hơn.
+
+## Bắt đầu tại máy {#getting-started-locally}
+
+Có nhiều [nhà cung cấp IPFS bên thứ ba](https://docs.ipfs.tech/how-to/work-with-pinning-services/#use-a-third-party-pinning-service), nhưng tốt nhất là nên bắt đầu chạy IPFS tại máy để thử nghiệm.
+
+1. Cài đặt [giao diện người dùng IPFS](https://docs.ipfs.tech/install/ipfs-desktop/#install-instructions).
+
+2. Tạo một thư mục với trang web của bạn. Nếu bạn đang dùng [Vite](https://vite.dev/), hãy dùng lệnh này:
+
+ ```sh
+ pnpm vite build
+ ```
+
+3. Trong IPFS Desktop, hãy nhấp vào **Nhập > Thư mục** và chọn thư mục bạn đã tạo ở bước trước.
+
+4. Chọn thư mục bạn vừa tải lên và nhấp vào **Đổi tên**. Đặt cho nó một cái tên có ý nghĩa hơn.
+
+5. Chọn lại nó và nhấp vào **Chia sẻ liên kết**. Sao chép URL vào bảng nhớ tạm. Liên kết sẽ tương tự như `https://ipfs.io/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`.
+
+6. Nhấp vào **Trạng thái**. Mở rộng tab **Nâng cao** để xem địa chỉ cổng. Ví dụ, trên hệ thống của tôi, địa chỉ là `http://127.0.0.1:8080`.
+
+7. Kết hợp đường dẫn từ bước liên kết với địa chỉ cổng để tìm địa chỉ của bạn. Ví dụ: đối với ví dụ trên, URL là `http://127.0.0.1:8080/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`. Mở URL đó trong trình duyệt để xem trang của bạn.
+
+## Tải lên {#uploading}
+
+Vậy bây giờ bạn có thể sử dụng IPFS để phân phát các tệp tại máy, điều này không thú vị lắm. Bước tiếp theo là làm cho chúng có thể truy cập được cho cả thế giới khi bạn ngoại tuyến.
+
+Có một số [dịch vụ ghim](https://docs.ipfs.tech/concepts/persistence/#pinning-services) nổi tiếng. Chọn một trong số chúng. Bất kể bạn sử dụng dịch vụ nào, bạn cần tạo một tài khoản và cung cấp cho nó **mã định danh nội dung (CID)** trong IPFS desktop của bạn.
+
+Cá nhân tôi thấy [4EVERLAND](https://docs.4everland.org/storage/4ever-pin/guides) là dễ sử dụng nhất. Đây là hướng dẫn cho nó:
+
+1. Truy cập vào [bảng điều khiển](https://dashboard.4everland.org/overview) và đăng nhập bằng ví của bạn.
+
+2. Trong thanh bên trái, hãy nhấp vào **Lưu trữ > 4EVER Pin**.
+
+3. Nhấp vào **Tải lên > CID đã chọn**. Đặt tên cho nội dung của bạn và cung cấp CID từ IPFS desktop. Hiện tại, CID là một chuỗi bắt đầu bằng `Qm`, theo sau là 44 chữ cái và chữ số đại diện cho một [hàm băm được mã hóa theo base-58](https://medium.com/bootdotdev/base64-vs-base58-encoding-c25553ff4524), chẳng hạn như `QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`, nhưng [điều đó có thể sẽ thay đổi](https://docs.ipfs.tech/concepts/content-addressing/#version-1-v1).
+
+4. Trạng thái ban đầu là **Đang chờ xử lý**. Tải lại cho đến khi nó chuyển thành **Đã ghim**.
+
+5. Nhấp vào CID của bạn để lấy liên kết. Bạn có thể xem ứng dụng của tôi [tại đây](https://bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im/).
+
+6. Bạn có thể cần phải kích hoạt tài khoản của mình để được ghim trong hơn một tháng. Việc kích hoạt tài khoản tốn khoảng 1$. Nếu bạn đã đóng nó, hãy đăng xuất và đăng nhập lại để được yêu cầu kích hoạt lần nữa.
+
+## Sử dụng từ IPFS {#using-from-ipfs}
+
+Tại thời điểm này, bạn có một liên kết đến một cổng tập trung phục vụ nội dung IPFS của bạn. Nói tóm lại, giao diện người dùng của bạn có thể an toàn hơn một chút nhưng nó vẫn chưa có khả năng chống kiểm duyệt. Để có khả năng chống kiểm duyệt thực sự, người dùng cần sử dụng IPFS [trực tiếp từ trình duyệt](https://docs.ipfs.tech/install/ipfs-companion/#prerequisites).
+
+Sau khi bạn đã cài đặt nó (và IPFS desktop đang hoạt động), bạn có thể truy cập [/ipfs/``](https://any.site/ipfs/bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im) trên bất kỳ trang nào và bạn sẽ nhận được nội dung đó, được phân phát theo cách phi tập trung.
+
+## Nhược điểm {#drawbacks}
+
+Bạn không thể xóa các tệp IPFS một cách đáng tin cậy, vì vậy miễn là bạn đang sửa đổi giao diện người dùng của mình, có lẽ tốt nhất là để nó ở dạng tập trung hoặc sử dụng [hệ thống tên liên hành tinh (IPNS)](https://docs.ipfs.tech/concepts/ipns/#mutability-in-ipfs), một hệ thống cung cấp khả năng thay đổi trên IPFS. Tất nhiên, bất cứ thứ gì có thể thay đổi đều có thể bị kiểm duyệt, trong trường hợp của IPNS là bằng cách gây áp lực cho người có khoá riêng tư tương ứng với nó.
+
+Ngoài ra, một số gói gặp sự cố với IPFS, vì vậy nếu trang web của bạn rất phức tạp thì đó có thể không phải là một giải pháp tốt. Và tất nhiên, bất cứ thứ gì phụ thuộc vào tích hợp máy chủ đều không thể phi tập trung hóa chỉ bằng cách đặt phía client trên IPFS.
+
+## Kết luận {#conclusion}
+
+Giống như Ethereum cho phép bạn phi tập trung hóa các khía cạnh cơ sở dữ liệu và logic nghiệp vụ của ứng dụng phi tập trung của bạn, IPFS cho phép bạn phi tập trung hóa giao diện người dùng. Điều này cho phép bạn loại bỏ thêm một vectơ tấn công khác chống lại ứng dụng phi tập trung của mình.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
diff --git a/public/content/translations/vi/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/vi/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md
new file mode 100644
index 00000000000..915f4350bc2
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md
@@ -0,0 +1,111 @@
+---
+title: Bắt đầu phát triển giao diện người dùng cho ứng dụng phi tập trung của bạn với create-eth-app
+description: Tổng quan về cách sử dụng create-eth-app và các tính năng của nó
+author: "Markus Waas"
+tags:
+ [
+ "frontend",
+ "javascript",
+ "ethers.js",
+ "the graph",
+ "tài chính phi tập trung"
+ ]
+skill: beginner
+lang: vi
+published: 2020-04-27
+source: soliditydeveloper.com
+sourceUrl: https://soliditydeveloper.com/create-eth-app
+---
+
+Lần trước chúng ta đã xem xét [bức tranh toàn cảnh về Solidity](https://soliditydeveloper.com/solidity-overview-2020) và đã đề cập đến [create-eth-app](https://github.com/PaulRBerg/create-eth-app). Bây giờ bạn sẽ tìm hiểu cách sử dụng nó, những tính năng được tích hợp và các ý tưởng bổ sung về cách mở rộng nó. Được khởi tạo bởi Paul Razvan Berg, người sáng lập [Sablier](http://sablier.com/), ứng dụng này sẽ giúp bạn bắt đầu phát triển giao diện người dùng và đi kèm với một số tích hợp tùy chọn để bạn lựa chọn.
+
+## Cài đặt {#installation}
+
+Việc cài đặt yêu cầu Yarn 0.25 trở lên (`npm install yarn --global`). Chỉ đơn giản là chạy:
+
+```bash
+yarn create eth-app my-eth-app
+cd my-eth-app
+yarn react-app:start
+```
+
+Nó đang sử dụng [create-react-app](https://github.com/facebook/create-react-app) bên dưới. Để xem ứng dụng của bạn, hãy mở `http://localhost:3000/`. Khi bạn đã sẵn sàng triển khai cho sản phẩm, hãy tạo một gói rút gọn bằng lệnh yarn build. Một cách dễ dàng để lưu trữ là sử dụng [Netlify](https://www.netlify.com/). Bạn có thể tạo một kho lưu trữ GitHub, thêm nó vào Netlify, thiết lập lệnh xây dựng và thế là xong! Ứng dụng của bạn sẽ được lưu trữ và mọi người đều có thể sử dụng. Và tất cả đều miễn phí.
+
+## Các tính năng {#features}
+
+### React & create-react-app {#react--create-react-app}
+
+Trước hết là trung tâm của ứng dụng: React và tất cả các tính năng bổ sung đi kèm với _create-react-app_. Chỉ sử dụng cái này là một lựa chọn tuyệt vời nếu bạn không muốn tích hợp Ethereum. Bản thân [React](https://react.dev/) giúp việc xây dựng giao diện người dùng tương tác trở nên thực sự dễ dàng. Nó có thể không thân thiện với người mới bắt đầu như [Vue](https://vuejs.org/), nhưng nó vẫn được sử dụng chủ yếu, có nhiều tính năng hơn và quan trọng nhất là có hàng nghìn thư viện bổ sung để lựa chọn. _create-react-app_ cũng giúp bạn bắt đầu với nó rất dễ dàng và bao gồm:
+
+- Hỗ trợ cú pháp React, JSX, ES6, TypeScript, Flow.
+- Các tính năng ngôn ngữ bổ sung ngoài ES6 như toán tử trải đối tượng (object spread operator).
+- CSS được tự động thêm tiền tố, vì vậy bạn không cần `-webkit-` hoặc các tiền tố khác.
+- Một trình chạy kiểm thử đơn vị tương tác nhanh với hỗ trợ tích hợp cho báo cáo phạm vi bao phủ.
+- Một máy chủ phát triển trực tiếp cảnh báo về các lỗi phổ biến.
+- Một tập lệnh xây dựng để đóng gói JS, CSS và hình ảnh cho sản phẩm, với các hàm băm và sơ đồ nguồn.
+
+Cụ thể, _create-eth-app_ đang sử dụng [hiệu ứng hook](https://legacy.reactjs.org/docs/hooks-effect.html) mới. Một phương pháp để viết các thành phần chức năng mạnh mẽ nhưng rất nhỏ. Xem phần bên dưới về Apollo để biết cách chúng được sử dụng trong _create-eth-app_.
+
+### Yarn Workspaces {#yarn-workspaces}
+
+[Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) cho phép bạn có nhiều gói, nhưng có thể quản lý tất cả chúng từ thư mục gốc và cài đặt các phụ thuộc cho tất cả cùng một lúc bằng `yarn install`. Điều này đặc biệt có ý nghĩa đối với các gói bổ sung nhỏ hơn như quản lý địa chỉ/Giao diện nhị phân ứng dụng của hợp đồng thông minh (thông tin về nơi bạn đã triển khai hợp đồng thông minh nào và cách giao tiếp với chúng) hoặc tích hợp a graph, cả hai đều là một phần của `create-eth-app`.
+
+### ethers.js {#ethersjs}
+
+Mặc dù [Web3](https://docs.web3js.org/) vẫn được sử dụng chủ yếu, [ethers.js](https://docs.ethers.io/) đã nhận được nhiều sự chú ý hơn như một giải pháp thay thế trong năm qua và là cái được tích hợp vào _create-eth-app_. Bạn có thể làm việc với cái này, thay đổi nó thành Web3 hoặc cân nhắc nâng cấp lên [ethers.js v5](https://docs.ethers.org/v5/) sắp ra khỏi phiên bản beta.
+
+### The Graph {#the-graph}
+
+[GraphQL](https://graphql.org/) là một cách xử lý dữ liệu thay thế so với [API Restful](https://restfulapi.net/). Chúng có một số lợi thế so với các API Restful, đặc biệt là đối với dữ liệu chuỗi khối phi tập trung. Nếu bạn quan tâm đến lý do đằng sau điều này, hãy xem [GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a).
+
+Thông thường, bạn sẽ lấy dữ liệu trực tiếp từ hợp đồng thông minh của mình. Bạn muốn đọc thời gian của giao dịch gần đây nhất? Chỉ cần gọi `MyContract.methods.latestTradeTime().call()` để lấy dữ liệu từ một nút Ethereum vào ứng dụng phi tập trung của bạn. Nhưng điều gì sẽ xảy ra nếu bạn cần hàng trăm điểm dữ liệu khác nhau? Điều đó sẽ dẫn đến hàng trăm lần tìm nạp dữ liệu đến nút, mỗi lần yêu cầu một [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) khiến ứng dụng phi tập trung của bạn chạy chậm và không hiệu quả. Một giải pháp có thể là một hàm gọi trình tìm nạp bên trong hợp đồng của bạn để trả về nhiều dữ liệu cùng một lúc. Tuy nhiên, điều này không phải lúc nào cũng lý tưởng.
+
+Và sau đó bạn cũng có thể quan tâm đến dữ liệu lịch sử. Bạn không chỉ muốn biết thời gian giao dịch cuối cùng, mà còn cả thời gian của tất cả các giao dịch mà bạn đã từng tự thực hiện. Sử dụng gói đồ thị con _create-eth-app_, đọc [tài liệu tham khảo](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) và điều chỉnh nó cho các hợp đồng của riêng bạn. Nếu bạn đang tìm kiếm các hợp đồng thông minh phổ biến, thậm chí có thể đã có một đồ thị con. Hãy xem [trình khám phá đồ thị con](https://thegraph.com/explorer/).
+
+Khi bạn đã có một đồ thị con, nó cho phép bạn viết một truy vấn đơn giản trong ứng dụng phi tập trung của mình để truy xuất tất cả dữ liệu chuỗi khối quan trọng bao gồm cả dữ liệu lịch sử mà bạn cần, chỉ cần một lần tìm nạp.
+
+### Apollo {#apollo}
+
+Nhờ tích hợp [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), bạn có thể dễ dàng tích hợp a graph vào ứng dụng phi tập trung React của mình. Đặc biệt khi sử dụng [React hooks và Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), việc tìm nạp dữ liệu đơn giản như viết một truy vấn GraphQl duy nhất trong thành phần của bạn:
+
+```js
+const { loading, error, data } = useQuery(myGraphQlQuery)
+
+React.useEffect(() => {
+ if (!loading && !error && data) {
+ console.log({ data })
+ }
+}, [loading, error, data])
+```
+
+## Mẫu {#templates}
+
+Trên hết, bạn có thể chọn từ một số mẫu khác nhau. Cho đến nay, bạn có thể sử dụng tích hợp Aave, Compound, UniSwap hoặc sablier. Tất cả chúng đều thêm các địa chỉ hợp đồng thông minh dịch vụ quan trọng cùng với các tích hợp đồ thị con được tạo sẵn. Chỉ cần thêm mẫu vào lệnh tạo như `yarn create eth-app my-eth-app --with-template aave`.
+
+### Aave {#aave}
+
+[Aave](https://aave.com/) là một thị trường cho vay tiền phi tập trung. Người gửi tiền cung cấp thanh khoản cho thị trường để kiếm thu nhập thụ động, trong khi người đi vay có thể vay mượn bằng tài sản thế chấp. Một tính năng độc đáo của Aave là [khoản vay nhanh](https://aave.com/docs/developers/flash-loans) cho phép bạn vay mượn tiền mà không cần bất kỳ tài sản thế chấp nào, miễn là bạn trả lại khoản vay trong một giao dịch. Điều này có thể hữu ích, ví dụ như để cung cấp cho bạn thêm tiền mặt khi giao dịch chênh lệch giá.
+
+Các token được giao dịch mang lại cho bạn tiền lãi được gọi là _aTokens_.
+
+Khi bạn chọn tích hợp Aave với _create-eth-app_, bạn sẽ nhận được một [tích hợp đồ thị con](https://docs.aave.com/developers/getting-started/using-graphql). Aave sử dụng The Graph và đã cung cấp cho bạn một số đồ thị con sẵn sàng sử dụng trên [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) và [Mạng chính](https://thegraph.com/explorer/subgraph/aave/protocol) ở dạng [thô](https://thegraph.com/explorer/subgraph/aave/protocol-raw) hoặc [đã định dạng](https://thegraph.com/explorer/subgraph/aave/protocol).
+
+
+
+### Compound {#compound}
+
+[Compound](https://compound.finance/) tương tự như Aave. Tích hợp này đã bao gồm [Đồ thị con Compound v2](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195) mới. Các token kiếm lãi ở đây được gọi một cách đáng ngạc nhiên là _cTokens_.
+
+### Uniswap {#uniswap}
+
+[Uniswap](https://uniswap.exchange/) là một Sàn phi tập trung (DEX). Các nhà cung cấp thanh khoản có thể kiếm được phí bằng cách cung cấp các token hoặc ether cần thiết cho cả hai bên của một giao dịch. Nó được sử dụng rộng rãi và do đó có một trong những mức thanh khoản cao nhất cho một loạt các token. Bạn có thể dễ dàng tích hợp nó vào ứng dụng phi tập trung của mình để, ví dụ, cho phép người dùng hoán đổi ETH của họ lấy DAI.
+
+Thật không may, tại thời điểm viết bài này, tích hợp chỉ dành cho Uniswap v1 chứ không phải [phiên bản v2 vừa được phát hành](https://uniswap.org/blog/uniswap-v2/).
+
+### Sablier {#sablier}
+
+[Sablier](https://sablier.com/) cho phép người dùng phát trực tuyến các khoản thanh toán tiền. Thay vì một ngày trả lương duy nhất, bạn thực sự nhận được tiền của mình liên tục mà không cần quản lý thêm sau khi thiết lập ban đầu. Tích hợp này bao gồm [đồ thị con riêng](https://thegraph.com/explorer/subgraph/sablierhq/sablier).
+
+## Tiếp theo là gì? {#whats-next}
+
+Nếu bạn có câu hỏi về _create-eth-app_, hãy truy cập [máy chủ cộng đồng Sablier](https://discord.gg/bsS8T47), nơi bạn có thể liên hệ với các tác giả của _create-eth-app_. Một vài bước tiếp theo đầu tiên, bạn có thể muốn tích hợp một khung giao diện người dùng như [Material UI](https://mui.com/material-ui/), viết các truy vấn GraphQL cho dữ liệu bạn thực sự cần và thiết lập triển khai.
diff --git a/public/content/translations/vi/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/vi/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md
new file mode 100644
index 00000000000..7bf5a99fda6
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md
@@ -0,0 +1,269 @@
+---
+title: Tìm hiểu các chủ đề cơ bản về Ethereum bằng SQL
+description: Hướng dẫn này giúp người đọc hiểu các khái niệm cơ bản về Ethereum bao gồm giao dịch, khối và gas bằng cách truy vấn dữ liệu trên chuỗi bằng Ngôn ngữ truy vấn có cấu trúc (SQL).
+author: "Paul Apivat"
+tags: [ "SQL", "Truy vấn", "Các giao dịch" ]
+skill: beginner
+lang: vi
+published: 2021-05-11
+source: paulapivat.com
+sourceUrl: https://paulapivat.com/post/query_ethereum/
+---
+
+Nhiều hướng dẫn về Ethereum nhắm đến các nhà phát triển, nhưng lại thiếu tài nguyên giáo dục cho các nhà phân tích dữ liệu hoặc cho những người muốn xem dữ liệu trên chuỗi mà không cần chạy một ứng dụng hoặc nút.
+
+Hướng dẫn này giúp người đọc hiểu các khái niệm cơ bản về Ethereum bao gồm giao dịch, khối và gas bằng cách truy vấn dữ liệu trên chuỗi bằng ngôn ngữ truy vấn có cấu trúc (SQL) thông qua giao diện do [Dune Analytics](https://dune.com/) cung cấp.
+
+Dữ liệu trên chuỗi có thể giúp chúng ta hiểu về Ethereum, mạng lưới, và như một nền kinh tế cho sức mạnh tính toán và sẽ đóng vai trò là cơ sở để hiểu các thách thức mà Ethereum đang đối mặt hiện nay (ví dụ: giá gas tăng) và quan trọng hơn là các cuộc thảo luận xung quanh các giải pháp thay đổi quy mô.
+
+### Các giao dịch {#transactions}
+
+Hành trình của người dùng trên Ethereum bắt đầu bằng việc khởi tạo một tài khoản do người dùng kiểm soát hoặc một thực thể có số dư ETH. Có hai loại tài khoản - do người dùng kiểm soát hoặc một hợp đồng thông minh (xem [ethereum.org](/developers/docs/accounts/)).
+
+Bất kỳ tài khoản nào cũng có thể được xem trên một trình duyệt khối như [Etherscan](https://etherscan.io/) hoặc [Blockscout](https://eth.blockscout.com/). Trình duyệt khối là một cổng thông tin đến dữ liệu của Ethereum. Chúng hiển thị dữ liệu theo thời gian thực về các khối, giao dịch, thợ đào, tài khoản và các hoạt động trên chuỗi khác (xem [tại đây](/developers/docs/data-and-analytics/block-explorers/)).
+
+Tuy nhiên, người dùng có thể muốn truy vấn trực tiếp dữ liệu để đối chiếu thông tin được cung cấp bởi các trình duyệt khối bên ngoài. [Dune Analytics](https://dune.com/) cung cấp khả năng này cho bất kỳ ai có một số kiến thức về SQL.
+
+Để tham khảo, tài khoản hợp đồng thông minh của Ethereum Foundation (EF) có thể được xem trên [Blockscout](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe).
+
+Một điều cần lưu ý là tất cả các tài khoản, bao gồm cả tài khoản của EF, đều có một địa chỉ công khai có thể được sử dụng để gửi và nhận giao dịch.
+
+Số dư tài khoản trên Etherscan bao gồm các giao dịch thông thường và các giao dịch nội bộ. Giao dịch nội bộ, mặc dù tên gọi là vậy, không phải là các giao dịch _thực tế_ làm thay đổi trạng thái của chuỗi. Chúng là các lần chuyển giao giá trị được khởi tạo bằng cách thực thi một hợp đồng ([nguồn](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions)). Vì các giao dịch nội bộ không có chữ ký, chúng **không** được bao gồm trên chuỗi khối và không thể được truy vấn bằng Dune Analytics.
+
+Do đó, hướng dẫn này sẽ tập trung vào các giao dịch thông thường. Điều này có thể được truy vấn như sau:
+
+```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
+```
+
+Thao tác này sẽ mang lại thông tin tương tự như thông tin được cung cấp trên trang giao dịch của Etherscan. Để so sánh, đây là hai nguồn:
+
+#### Etherscan {#etherscan}
+
+
+
+[Trang hợp đồng của EF trên Blockscout.](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe)
+
+#### Dune Analytics {#dune-analytics}
+
+
+
+Bạn có thể tìm thấy bảng điều khiển [tại đây](https://dune.com/paulapivat/Learn-Ethereum). Nhấp vào bảng để xem truy vấn (cũng xem ở trên).
+
+### Phân tích các giao dịch {#breaking_down_transactions}
+
+Một giao dịch đã gửi bao gồm một số thông tin bao gồm ([nguồn](/developers/docs/transactions/)):
+
+- **Người nhận**: Địa chỉ nhận (được truy vấn là "to")
+- **Chữ ký**: Trong khi khóa riêng tư của người gửi ký một giao dịch, điều chúng ta có thể truy vấn bằng SQL là địa chỉ công khai của người gửi ("from").
+- **Giá trị**: Đây là số lượng ETH được chuyển (xem cột `ether`).
+- **Dữ liệu**: Đây là dữ liệu tùy ý đã được băm (xem cột `data`)
+- **giới hạn gas** – số lượng đơn vị gas tối đa mà giao dịch có thể tiêu thụ. Các đơn vị gas đại diện cho các bước tính toán
+- **maxPriorityFeePerGas** - lượng gas tối đa được bao gồm dưới dạng tiền boa cho thợ đào
+- **maxFeePerGas** - lượng gas tối đa sẵn sàng trả cho giao dịch (bao gồm baseFeePerGas và maxPriorityFeePerGas)
+
+Chúng ta có thể truy vấn các thông tin cụ thể này cho các giao dịch đến địa chỉ công khai của Ethereum Foundation:
+
+```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
+```
+
+### Các khối {#blocks}
+
+Mỗi giao dịch sẽ thay đổi trạng thái của máy ảo Ethereum ([EVM](/developers/docs/evm/)) ([nguồn](/developers/docs/transactions/)). Các giao dịch được quảng bá đến mạng để được xác minh và đưa vào một khối. Mỗi giao dịch được liên kết với một số khối. Để xem dữ liệu, chúng ta có thể truy vấn một số khối cụ thể: 12396854 (khối gần đây nhất trong số các giao dịch của Ethereum Foundation tại thời điểm viết bài này, 11/5/21).
+
+Hơn nữa, khi chúng ta truy vấn hai khối tiếp theo, chúng ta có thể thấy rằng mỗi khối chứa hàm băm của khối trước đó (tức là hàm băm của khối cha), minh họa cách chuỗi khối được hình thành.
+
+Mỗi khối chứa một tham chiếu đến khối cha của nó. Điều này được hiển thị bên dưới giữa các cột `hash` và `parent_hash` ([nguồn](/developers/docs/blocks/)):
+
+
+
+Đây là [truy vấn](https://dune.com/queries/44856/88292) trên Dune Analytics:
+
+```sql
+SELECT
+ time,
+ number,
+ hash,
+ parent_hash,
+ nonce
+FROM ethereum."blocks"
+WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856
+LIMIT 10
+```
+
+Chúng ta có thể kiểm tra một khối bằng cách truy vấn thời gian, số khối, độ khó, hàm băm, hàm băm của khối cha và nonce.
+
+Điều duy nhất mà truy vấn này không bao gồm là _danh sách giao dịch_ yêu cầu một truy vấn riêng bên dưới và _gốc trạng thái_. Một nút đầy đủ hoặc nút lưu trữ sẽ lưu trữ tất cả các giao dịch và chuyển đổi trạng thái, cho phép các ứng dụng truy vấn trạng thái của chuỗi bất kỳ lúc nào. Bởi vì điều này đòi hỏi không gian lưu trữ lớn, chúng ta có thể tách dữ liệu chuỗi khỏi dữ liệu trạng thái:
+
+- Dữ liệu chuỗi (danh sách các khối, giao dịch)
+- Dữ liệu trạng thái (kết quả của mỗi lần chuyển đổi trạng thái của giao dịch)
+
+Gốc trạng thái thuộc loại thứ hai và là dữ liệu _ngầm_ (không được lưu trữ trên chuỗi), trong khi dữ liệu chuỗi là dữ liệu tường minh và được lưu trữ trên chính chuỗi đó ([nguồn](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored)).
+
+Đối với hướng dẫn này, chúng ta sẽ tập trung vào dữ liệu trên chuỗi _có thể_ được truy vấn bằng SQL thông qua Dune Analytics.
+
+Như đã nêu ở trên, mỗi khối chứa một danh sách các giao dịch, chúng ta có thể truy vấn điều này bằng cách lọc một khối cụ thể. Chúng ta sẽ thử với khối gần đây nhất, 12396854:
+
+```sql
+SELECT * FROM ethereum."transactions"
+WHERE block_number = 12396854
+ORDER BY block_time DESC`
+```
+
+Đây là đầu ra SQL trên Dune:
+
+
+
+Một khối duy nhất này được thêm vào chuỗi sẽ làm thay đổi trạng thái của máy ảo Ethereum ([EVM](/developers/docs/evm/)). Đôi khi hàng chục, hàng trăm giao dịch được xác minh cùng một lúc. Trong trường hợp cụ thể này, 222 giao dịch đã được bao gồm.
+
+Để xem có bao nhiêu giao dịch thực sự thành công, chúng ta sẽ thêm một bộ lọc khác để đếm các giao dịch thành công:
+
+```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
+```
+
+Đối với khối 12396854, trong tổng số 222 giao dịch, 204 giao dịch đã được xác minh thành công:
+
+
+
+Các yêu cầu giao dịch xảy ra hàng chục lần mỗi giây, nhưng các khối được cam kết khoảng 15 giây một lần ([nguồn](/developers/docs/blocks/)).
+
+Để thấy rằng có một khối được tạo ra khoảng 15 giây một lần, chúng ta có thể lấy số giây trong một ngày (86400) chia cho 15 để có được số khối trung bình ước tính mỗi ngày (~ 5760).
+
+Biểu đồ cho các khối Ethereum được tạo ra mỗi ngày (2016 - nay) là:
+
+
+
+Số khối trung bình được tạo ra hàng ngày trong khoảng thời gian này là ~5.874:
+
+
+
+Các truy vấn là:
+
+```sql
+# truy vấn để trực quan hóa số lượng khối được tạo ra hàng ngày kể từ năm 2016
+
+SELECT
+ DATE_TRUNC('day', time) AS dt,
+ COUNT(*) AS block_count
+FROM ethereum."blocks"
+GROUP BY dt
+OFFSET 1
+
+# số lượng khối trung bình được tạo ra mỗi ngày
+
+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
+```
+
+Số khối trung bình được tạo ra mỗi ngày kể từ năm 2016 cao hơn một chút so với con số đó, ở mức 5.874. Ngoài ra, chia 86400 giây cho 5874 khối trung bình sẽ ra 14,7 giây hoặc khoảng một khối mỗi 15 giây.
+
+### Gas {#gas}
+
+Các khối bị giới hạn về kích thước. Kích thước khối tối đa là động và thay đổi theo nhu cầu của mạng từ 12.500.000 đến 25.000.000 đơn vị. Cần có giới hạn để ngăn các khối có kích thước lớn tùy ý gây căng thẳng cho các nút đầy đủ về không gian đĩa và yêu cầu tốc độ ([nguồn](/developers/docs/blocks/)).
+
+Một cách để hình dung giới hạn gas của khối là coi nó như **nguồn cung** không gian khối có sẵn để xử lý các giao dịch theo lô. Giới hạn gas của khối có thể được truy vấn và trực quan hóa từ năm 2016 đến nay:
+
+
+
+```sql
+SELECT
+ DATE_TRUNC('day', time) AS dt,
+ AVG(gas_limit) AS avg_block_gas_limit
+FROM ethereum."blocks"
+GROUP BY dt
+OFFSET 1
+```
+
+Sau đó là lượng gas thực tế được sử dụng hàng ngày để trả cho việc tính toán được thực hiện trên chuỗi Ethereum (tức là gửi giao dịch, gọi một hợp đồng thông minh, đúc một NFT). Đây là **nhu cầu** về không gian khối Ethereum có sẵn:
+
+
+
+```sql
+SELECT
+ DATE_TRUNC('day', time) AS dt,
+ AVG(gas_used) AS avg_block_gas_used
+FROM ethereum."blocks"
+GROUP BY dt
+OFFSET 1
+```
+
+Chúng ta cũng có thể đặt hai biểu đồ này cạnh nhau để xem **cung và cầu** phù hợp với nhau như thế nào:
+
+
+
+Do đó, chúng ta có thể hiểu giá gas là một hàm của nhu cầu về không gian khối Ethereum, với nguồn cung có sẵn.
+
+Cuối cùng, chúng ta có thể muốn truy vấn giá gas trung bình hàng ngày cho chuỗi Ethereum, tuy nhiên, làm như vậy sẽ dẫn đến thời gian truy vấn đặc biệt dài, vì vậy chúng ta sẽ lọc truy vấn của mình đến lượng gas trung bình được trả cho mỗi giao dịch bởi Ethereum Foundation.
+
+
+
+Chúng ta có thể thấy giá gas đã trả cho tất cả các giao dịch được thực hiện đến địa chỉ Ethereum Foundation trong những năm qua. Đây là truy vấn:
+
+```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
+```
+
+### Tóm tắt {#summary}
+
+Với hướng dẫn này, chúng ta hiểu các khái niệm cơ bản về Ethereum và cách hoạt động của chuỗi khối Ethereum bằng cách truy vấn và làm quen với dữ liệu trên chuỗi.
+
+Bảng điều khiển chứa tất cả mã được sử dụng trong hướng dẫn này có thể được tìm thấy [tại đây](https://dune.com/paulapivat/Learn-Ethereum).
+
+Để biết thêm cách sử dụng dữ liệu để khám phá web3 [hãy tìm tôi trên Twitter](https://twitter.com/paulapivat).
diff --git a/public/content/translations/vi/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/vi/developers/tutorials/logging-events-smart-contracts/index.md
new file mode 100644
index 00000000000..4f755cf69c3
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/logging-events-smart-contracts/index.md
@@ -0,0 +1,62 @@
+---
+title: Ghi nhật ký dữ liệu từ hợp đồng thông minh bằng các sự kiện
+description: Giới thiệu về các sự kiện của hợp đồng thông minh và cách bạn có thể sử dụng chúng để ghi nhật ký dữ liệu
+author: "jdourlens"
+tags: [ "hợp đồng thông minh", "remix", "solidity", "sự kiện" ]
+skill: intermediate
+lang: vi
+published: 2020-04-03
+source: EthereumDev
+sourceUrl: https://ethereumdev.io/logging-data-with-events/
+address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
+---
+
+Trong Solidity, [sự kiện](/developers/docs/smart-contracts/anatomy/#events-and-logs) là các tín hiệu được gửi đi mà hợp đồng thông minh có thể kích hoạt. Các ứng dụng phi tập trung, hoặc bất cứ thứ gì được kết nối với API JSON-RPC của Ethereum, có thể lắng nghe những sự kiện này và hành động tương ứng. Một sự kiện cũng có thể được lập chỉ mục để lịch sử sự kiện có thể được tìm kiếm sau này.
+
+## Sự kiện {#events}
+
+Sự kiện phổ biến nhất trên chuỗi khối Ethereum tại thời điểm viết bài này là sự kiện Transfer được phát ra bởi các token ERC20 khi ai đó chuyển token.
+
+```solidity
+event Transfer(address indexed from, address indexed to, uint256 value);
+```
+
+Chữ ký sự kiện được khai báo bên trong mã hợp đồng và có thể được phát ra bằng từ khóa emit. Ví dụ: sự kiện transfer ghi nhật ký ai đã gửi giao dịch chuyển tiền (_from_), đến ai (_to_) và bao nhiêu token đã được chuyển (_value_).
+
+Nếu chúng ta quay lại hợp đồng thông minh Counter của mình và quyết định ghi nhật ký mỗi khi giá trị được thay đổi. Vì hợp đồng này không nhằm mục đích triển khai mà đóng vai trò là cơ sở để xây dựng một hợp đồng khác bằng cách mở rộng nó: nó được gọi là hợp đồng trừu tượng. Trong trường hợp ví dụ về bộ đếm của chúng ta, nó sẽ trông như sau:
+
+```solidity
+pragma solidity 0.5.17;
+
+contract Counter {
+
+ event ValueChanged(uint oldValue, uint256 newValue);
+
+ // Biến riêng tư thuộc loại số nguyên không dấu để lưu số lần đếm
+ uint256 private count = 0;
+
+ // Hàm tăng bộ đếm của chúng ta
+ function increment() public {
+ count += 1;
+ emit ValueChanged(count - 1, count);
+ }
+
+ // Getter để lấy giá trị đếm
+ function getCount() public view returns (uint256) {
+ return count;
+ }
+
+}
+```
+
+Lưu ý rằng:
+
+- **Dòng 5**: chúng ta khai báo sự kiện của mình và những gì nó chứa, giá trị cũ và giá trị mới.
+
+- **Dòng 13**: Khi chúng ta tăng biến đếm của mình, chúng ta phát ra sự kiện.
+
+Nếu bây giờ chúng ta triển khai hợp đồng và gọi hàm increment, chúng ta sẽ thấy rằng Remix sẽ tự động hiển thị nó nếu bạn nhấp vào giao dịch mới bên trong một mảng có tên là logs.
+
+
+
+Nhật ký thực sự hữu ích để gỡ lỗi các hợp đồng thông minh của bạn. Chúng cũng quan trọng nếu bạn xây dựng các ứng dụng được sử dụng bởi nhiều người khác nhau và giúp việc phân tích để theo dõi cũng như hiểu cách hợp đồng thông minh của bạn được sử dụng trở nên dễ dàng hơn. Các nhật ký được tạo bởi các giao dịch sẽ được hiển thị trong các trình duyệt khối phổ biến và bạn cũng có thể sử dụng chúng để, ví dụ, tạo các tập lệnh ngoài chuỗi để lắng nghe các sự kiện cụ thể và thực hiện hành động khi chúng xảy ra.
diff --git a/public/content/translations/vi/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/vi/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md
new file mode 100644
index 00000000000..a219fc90f02
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md
@@ -0,0 +1,251 @@
+---
+title: Bằng chứng Merkle cho tính toàn vẹn dữ liệu ngoại tuyến
+description: Đảm bảo tính toàn vẹn dữ liệu trên chuỗi cho dữ liệu được lưu trữ, chủ yếu là ngoài chuỗi
+author: Ori Pomerantz
+tags: [ "lưu trữ" ]
+skill: advanced
+lang: vi
+published: 2021-12-30
+---
+
+## Giới thiệu {#introduction}
+
+Lý tưởng nhất là chúng ta muốn lưu trữ mọi thứ trong bộ nhớ lưu trữ của Ethereum, được lưu trữ trên hàng nghìn máy tính và có
+tính khả dụng cực cao (dữ liệu không thể bị kiểm duyệt) và tính toàn vẹn (dữ liệu không thể bị sửa đổi một cách
+trái phép), nhưng việc lưu trữ một từ 32 byte thường tốn 20.000 gas. Tại thời điểm tôi viết bài này, chi phí đó tương đương
+6,60 USD. Với 21 xu cho mỗi byte, chi phí này là quá đắt cho nhiều mục đích sử dụng.
+
+Để giải quyết vấn đề này, hệ sinh thái Ethereum đã phát triển [nhiều cách thay thế để lưu trữ dữ liệu theo cách phi tập trung](/developers/docs/storage/). Thông thường, chúng bao gồm sự đánh đổi giữa tính khả dụng
+và giá cả. Tuy nhiên, tính toàn vẹn thường được đảm bảo.
+
+Trong bài viết này, bạn sẽ học **cách** đảm bảo tính toàn vẹn của dữ liệu mà không cần lưu trữ dữ liệu trên chuỗi khối, bằng cách sử dụng
+[bằng chứng Merkle](https://computersciencewiki.org/index.php/Merkle_proof).
+
+## Nó hoạt động như thế nào? {#how-does-it-work}
+
+Về lý thuyết, chúng ta có thể chỉ cần lưu trữ hàm băm của dữ liệu trên chuỗi và gửi tất cả dữ liệu trong các giao dịch yêu cầu nó. Tuy nhiên, cách này vẫn quá tốn kém. Một byte dữ liệu cho một giao dịch tốn khoảng 16 gas, hiện tại khoảng nửa xu, hoặc khoảng 5 USD cho mỗi kilobyte. Với 5000 USD cho mỗi megabyte, chi phí này vẫn quá đắt cho nhiều mục đích sử dụng, ngay cả khi không tính thêm chi phí băm dữ liệu.
+
+Giải pháp là băm liên tục các tập hợp con khác nhau của dữ liệu, vì vậy đối với dữ liệu bạn không cần gửi, bạn có thể chỉ cần gửi một hàm băm. Bạn làm điều này bằng cách sử dụng cây Merkle, một cấu trúc dữ liệu cây trong đó mỗi nút là một hàm băm của các nút bên dưới nó:
+
+
+
+Hàm băm gốc là phần duy nhất cần được lưu trữ trên chuỗi. Để chứng minh một giá trị nhất định, bạn cung cấp tất cả các hàm băm cần được kết hợp với nó để có được gốc. Ví dụ: để chứng minh `C`, bạn cung cấp `D`, `H(A-B)`, và `H(E-H)`.
+
+
+
+## Triển khai {#implementation}
+
+[Mã mẫu được cung cấp tại đây](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity).
+
+### Mã ngoài chuỗi {#offchain-code}
+
+Trong bài viết này, chúng tôi sử dụng JavaScript cho các tính toán ngoài chuỗi. Hầu hết các ứng dụng phi tập trung có thành phần ngoài chuỗi bằng JavaScript.
+
+#### Tạo gốc Merkle {#creating-the-merkle-root}
+
+Đầu tiên, chúng ta cần cung cấp gốc Merkle cho chuỗi.
+
+```javascript
+const ethers = require("ethers")
+```
+
+[Chúng tôi sử dụng hàm băm từ gói ethers](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256).
+
+```javascript
+// Dữ liệu thô mà chúng ta phải xác minh tính toàn vẹn. Hai byte đầu tiên
+// là mã định danh người dùng và hai byte cuối cùng là số lượng token mà
+// người dùng sở hữu tại thời điểm hiện tại.
+const dataArray = [
+ 0x0bad0010, 0x60a70020, 0xbeef0030, 0xdead0040, 0xca110050, 0x0e660060,
+ 0xface0070, 0xbad00080, 0x060d0091,
+]
+```
+
+Việc mã hóa mỗi mục nhập thành một số nguyên 256-bit duy nhất sẽ tạo ra mã khó đọc hơn so với việc sử dụng JSON, ví dụ vậy. Tuy nhiên, điều này có nghĩa là xử lý ít hơn đáng kể để truy xuất dữ liệu trong hợp đồng, do đó chi phí gas thấp hơn nhiều. [Bạn có thể đọc JSON trên chuỗi](https://github.com/chrisdotn/jsmnSol), nhưng đó là một ý tưởng tồi nếu có thể tránh được.
+
+```javascript
+// Mảng các giá trị hàm băm, dưới dạng BigInts
+const hashArray = dataArray
+```
+
+Trong trường hợp này, dữ liệu của chúng ta ban đầu là các giá trị 256-bit, do đó không cần xử lý. Nếu chúng ta sử dụng một cấu trúc dữ liệu phức tạp hơn, chẳng hạn như chuỗi, chúng ta cần đảm bảo rằng chúng ta băm dữ liệu trước để có được một mảng các hàm băm. Lưu ý rằng điều này cũng là do chúng tôi không quan tâm liệu người dùng có biết thông tin của những người dùng khác hay không. Nếu không, chúng ta sẽ phải băm để người dùng 1 không biết giá trị của người dùng 0, người dùng 2 không biết giá trị của người dùng 3, v.v.
+
+```javascript
+// Chuyển đổi giữa chuỗi mà hàm băm mong đợi và
+// BigInt mà chúng ta sử dụng ở mọi nơi khác.
+const hash = (x) =>
+ BigInt(ethers.utils.keccak256("0x" + x.toString(16).padStart(64, 0)))
+```
+
+Hàm băm ethers mong đợi nhận được một chuỗi JavaScript với một số thập lục phân, chẳng hạn như `0x60A7`, và trả về một chuỗi khác có cùng cấu trúc. Tuy nhiên, đối với phần còn lại của mã, việc sử dụng `BigInt` sẽ dễ dàng hơn, vì vậy chúng ta chuyển đổi sang chuỗi thập lục phân và ngược lại.
+
+```javascript
+// Băm đối xứng của một cặp để chúng ta không quan tâm nếu thứ tự bị đảo ngược.
+const pairHash = (a, b) => hash(hash(a) ^ hash(b))
+```
+
+Hàm này là đối xứng (hàm băm của a [xor](https://en.wikipedia.org/wiki/Exclusive_or) b). Điều này có nghĩa là khi chúng ta kiểm tra bằng chứng Merkle, chúng ta không cần lo lắng về việc đặt giá trị từ bằng chứng trước hay sau giá trị được tính toán. Việc kiểm tra bằng chứng Merkle được thực hiện trên chuỗi, vì vậy chúng ta càng cần làm ít việc ở đó càng tốt.
+
+Cảnh báo:
+Mật mã học khó hơn vẻ ngoài của nó.
+Phiên bản ban đầu của bài viết này có hàm băm `hash(a^b)`.
+Đó là một ý tưởng **tồi** vì nó có nghĩa là nếu bạn biết các giá trị hợp pháp của `a` và `b`, bạn có thể sử dụng `b' = a^b^a'` để chứng minh bất kỳ giá trị `a'` mong muốn nào.
+Với hàm này, bạn sẽ phải tính toán `b'` sao cho `hash(a') ^ hash(b')` bằng một giá trị đã biết (nhánh tiếp theo trên đường đến gốc), điều này khó hơn rất nhiều.
+
+```javascript
+// Giá trị để biểu thị rằng một nhánh nào đó trống, không
+// có giá trị
+const empty = 0n
+```
+
+Khi số lượng giá trị không phải là lũy thừa nguyên của hai, chúng ta cần xử lý các nhánh trống. Cách chương trình này thực hiện là đặt số không làm trình giữ chỗ.
+
+
+
+```javascript
+// Tính toán một cấp trên cây của một mảng băm bằng cách lấy hàm băm của
+// mỗi cặp theo trình tự
+const oneLevelUp = (inputArray) => {
+ var result = []
+ var inp = [...inputArray] // Để tránh ghi đè lên đầu vào // Thêm một giá trị trống nếu cần (chúng ta cần tất cả các lá phải được // ghép cặp)
+
+ 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
+```
+
+Hàm này "leo" lên một cấp trong cây Merkle bằng cách băm các cặp giá trị ở lớp hiện tại. Lưu ý rằng đây không phải là cách triển khai hiệu quả nhất, chúng ta có thể đã tránh sao chép đầu vào và chỉ cần thêm `hashEmpty` khi thích hợp trong vòng lặp, nhưng mã này được tối ưu hóa để dễ đọc.
+
+```javascript
+const getMerkleRoot = (inputArray) => {
+ var result
+
+ result = [...inputArray] // Leo lên cây cho đến khi chỉ còn một giá trị, đó là // gốc. // // Nếu một lớp có số lượng mục nhập lẻ, // mã trong oneLevelUp sẽ thêm một giá trị trống, vì vậy nếu chúng ta có, ví dụ, // 10 lá, chúng ta sẽ có 5 nhánh ở lớp thứ hai, 3 // nhánh ở lớp thứ ba, 2 ở lớp thứ tư và gốc là lớp thứ năm
+
+ while (result.length > 1) result = oneLevelUp(result)
+
+ return result[0]
+}
+```
+
+Để có được gốc, hãy leo lên cho đến khi chỉ còn lại một giá trị.
+
+#### Tạo bằng chứng Merkle {#creating-a-merkle-proof}
+
+Bằng chứng Merkle là các giá trị cần băm cùng với giá trị đang được chứng minh để lấy lại gốc Merkle. Giá trị cần chứng minh thường có sẵn từ dữ liệu khác, vì vậy tôi thích cung cấp nó một cách riêng biệt thay vì là một phần của mã.
+
+```javascript
+// Bằng chứng Merkle bao gồm giá trị của danh sách các mục nhập để
+// băm cùng. Bởi vì chúng ta sử dụng một hàm băm đối xứng, chúng ta không
+// cần vị trí của mục để xác minh bằng chứng, chỉ cần để tạo ra nó
+const getMerkleProof = (inputArray, n) => {
+ var result = [], currentLayer = [...inputArray], currentN = n
+
+ // Cho đến khi chúng ta lên đến đỉnh
+ while (currentLayer.length > 1) {
+ // Không có lớp nào có độ dài lẻ
+ if (currentLayer.length % 2)
+ currentLayer.push(empty)
+
+ result.push(currentN % 2
+ // Nếu currentN là số lẻ, hãy thêm giá trị trước nó vào bằng chứng
+ ? currentLayer[currentN-1]
+ // Nếu nó là số chẵn, hãy thêm giá trị sau nó
+ : currentLayer[currentN+1])
+
+```
+
+Chúng ta băm `(v[0],v[1])`, `(v[2],v[3])`, v.v. Vì vậy, đối với các giá trị chẵn, chúng ta cần giá trị tiếp theo, đối với các giá trị lẻ, chúng ta cần giá trị trước đó.
+
+```javascript
+ // Di chuyển lên lớp tiếp theo
+ currentN = Math.floor(currentN/2)
+ currentLayer = oneLevelUp(currentLayer)
+ } // while currentLayer.length > 1
+
+ return result
+} // getMerkleProof
+```
+
+### Mã trên chuỗi {#onchain-code}
+
+Cuối cùng, chúng ta có mã kiểm tra bằng chứng. Mã trên chuỗi được viết bằng [Solidity](https://docs.soliditylang.org/en/v0.8.11/). Tối ưu hóa quan trọng hơn nhiều ở đây vì gas tương đối đắt.
+
+```solidity
+//SPDX-License-Identifier: Public Domain
+pragma solidity ^0.8.0;
+
+import "hardhat/console.sol";
+```
+
+Tôi đã viết mã này bằng cách sử dụng [môi trường phát triển Hardhat](https://hardhat.org/), cho phép chúng tôi có [đầu ra bảng điều khiển từ Solidity](https://hardhat.org/docs/cookbook/debug-logs) trong khi phát triển.
+
+```solidity
+
+contract MerkleProof {
+ uint merkleRoot;
+
+ function getRoot() public view returns (uint) {
+ return merkleRoot;
+ }
+
+ // Cực kỳ không an toàn, trong mã sản xuất, quyền truy cập vào
+ // hàm này PHẢI được giới hạn nghiêm ngặt, có thể là đối với một
+ // chủ sở hữu
+ function setRoot(uint _merkleRoot) external {
+ merkleRoot = _merkleRoot;
+ } // setRoot
+```
+
+Các hàm Set và get cho gốc Merkle. Việc cho phép mọi người cập nhật gốc Merkle là một _ý tưởng cực kỳ tồi_ trong một hệ thống sản xuất. Tôi làm điều đó ở đây vì sự đơn giản cho mã mẫu. **Đừng làm điều đó trên một hệ thống mà tính toàn vẹn của dữ liệu thực sự quan trọng**.
+
+```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));
+ }
+```
+
+Hàm này tạo ra một hàm băm cặp. Nó chỉ là bản dịch Solidity của mã JavaScript cho `hash` và `pairHash`.
+
+**Lưu ý:** Đây là một trường hợp khác của việc tối ưu hóa để dễ đọc. Dựa trên [định nghĩa hàm](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm), có thể lưu trữ dữ liệu dưới dạng giá trị [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays) và tránh các chuyển đổi.
+
+```solidity
+ // Xác minh bằng chứng Merkle
+ 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;
+ }
+
+} // MerkleProof
+```
+
+Trong ký hiệu toán học, việc xác minh bằng chứng Merkle trông như thế này: `H(proof_n, H(proof_n-1, H(proof_n-2, ...` H(proof_1, H(proof_0, value))...)))\`. Mã này thực hiện nó.
+
+## Bằng chứng Merkle và các rollup không kết hợp được với nhau {#merkle-proofs-and-rollups}
+
+Bằng chứng Merkle không hoạt động tốt với [các rollup](/developers/docs/scaling/#rollups). Lý do là các rollup ghi tất cả dữ liệu giao dịch trên L1, nhưng xử lý trên L2. Chi phí để gửi một bằng chứng Merkle với một giao dịch trung bình là 638 gas cho mỗi lớp (hiện tại một byte trong dữ liệu cuộc gọi tốn 16 gas nếu nó không phải là số không, và 4 nếu nó là số không). Nếu chúng ta có 1024 từ dữ liệu, một bằng chứng Merkle yêu cầu mười lớp, hoặc tổng cộng 6380 gas.
+
+Ví dụ, khi xem xét [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m), chi phí gas ghi L1 khoảng 100 gwei và chi phí gas L2 là 0,001 gwei (đó là giá thông thường, nó có thể tăng lên khi có tắc nghẽn). Vì vậy, với chi phí của một gas L1, chúng ta có thể chi tiêu một trăm nghìn gas cho việc xử lý L2. Giả sử chúng ta không ghi đè lên bộ nhớ, điều này có nghĩa là chúng ta có thể ghi khoảng năm từ vào bộ nhớ trên L2 với giá của một gas L1. Đối với một bằng chứng Merkle duy nhất, chúng ta có thể ghi toàn bộ 1024 từ vào bộ nhớ (giả sử chúng có thể được tính toán trên chuỗi ngay từ đầu, thay vì được cung cấp trong một giao dịch) và vẫn còn thừa hầu hết gas.
+
+## Kết luận {#conclusion}
+
+Trong thực tế, bạn có thể không bao giờ tự mình triển khai cây Merkle. Có những thư viện nổi tiếng và đã được kiểm toán mà bạn có thể sử dụng và nói chung, tốt nhất là không nên tự mình triển khai các nguyên hàm mật mã. Nhưng tôi hy vọng rằng bây giờ bạn đã hiểu rõ hơn về bằng chứng Merkle và có thể quyết định khi nào chúng đáng được sử dụng.
+
+Lưu ý rằng trong khi bằng chứng Merkle bảo toàn _tính toàn vẹn_, chúng không bảo toàn _tính khả dụng_. Việc biết rằng không ai khác có thể lấy tài sản của bạn chỉ là sự an ủi nhỏ nhoi nếu bộ nhớ dữ liệu quyết định không cho phép truy cập và bạn cũng không thể xây dựng một cây Merkle để truy cập chúng. Vì vậy, cây Merkle được sử dụng tốt nhất với một số loại lưu trữ phi tập trung, chẳng hạn như IPFS.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
diff --git a/public/content/translations/vi/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md b/public/content/translations/vi/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md
new file mode 100644
index 00000000000..1c80ba9d1fd
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md
@@ -0,0 +1,151 @@
+---
+title: Giám sát Geth bằng InfluxDB và Grafana
+description: Thiết lập giám sát cho nút Geth của bạn bằng InfluxDB và Grafana để theo dõi hiệu suất và xác định các vấn đề.
+author: "Mario Havel"
+tags: [ "máy khách", "nút" ]
+skill: intermediate
+lang: vi
+published: 2021-01-13
+---
+
+Hướng dẫn này sẽ giúp bạn thiết lập giám sát cho nút Geth của mình để bạn có thể hiểu rõ hơn về hiệu suất của nó và xác định các vấn đề tiềm ẩn.
+
+## Điều kiện tiên quyết {#prerequisites}
+
+- Bạn nên đang chạy một phiên bản Geth.
+- Hầu hết các bước và ví dụ dành cho môi trường linux, kiến thức cơ bản về thiết bị đầu cuối sẽ hữu ích.
+- Hãy xem tổng quan bằng video này về bộ chỉ số của Geth: [Giám sát cơ sở hạ tầng Ethereum của Péter Szilágyi](https://www.youtube.com/watch?v=cOBab8IJMYI).
+
+## Ngăn xếp giám sát {#monitoring-stack}
+
+Một máy khách Ethereum thu thập rất nhiều dữ liệu có thể được đọc dưới dạng cơ sở dữ liệu theo trình tự thời gian. Để giám sát dễ dàng hơn, bạn có thể cung cấp dữ liệu này vào phần mềm trực quan hóa dữ liệu. Có nhiều tùy chọn có sẵn:
+
+- [Prometheus](https://prometheus.io/) (mô hình kéo)
+- [InfluxDB](https://www.influxdata.com/get-influxdb/) (mô hình đẩy)
+- [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/)
+
+Ngoài ra còn có [Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter), một tùy chọn được định cấu hình sẵn với InfluxDB và Grafana.
+
+Trong hướng dẫn này, chúng ta sẽ thiết lập máy khách Geth của bạn để đẩy dữ liệu vào InfluxDB nhằm tạo cơ sở dữ liệu và Grafana để tạo hình ảnh trực quan hóa dữ liệu dưới dạng biểu đồ. Thực hiện theo cách thủ công sẽ giúp bạn hiểu rõ hơn về quy trình, thay đổi nó và triển khai trong các môi trường khác nhau.
+
+## Thiết lập InfluxDB {#setting-up-influxdb}
+
+Đầu tiên, hãy tải xuống và cài đặt InfluxDB. Có thể tìm thấy các tùy chọn tải xuống khác nhau tại [trang phát hành Influxdata](https://portal.influxdata.com/downloads/). Chọn cái phù hợp với môi trường của bạn.
+Bạn cũng có thể cài đặt nó từ một [kho lưu trữ](https://repos.influxdata.com/). Ví dụ trong bản phân phối dựa trên 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
+```
+
+Sau khi cài đặt thành công InfluxDB, hãy đảm bảo rằng nó đang chạy ngầm. Theo mặc định, có thể truy cập tại `localhost:8086`.
+Trước khi sử dụng máy khách `influx`, bạn phải tạo người dùng mới có đặc quyền quản trị. Người dùng này sẽ phục vụ cho việc quản lý cấp cao, tạo cơ sở dữ liệu và người dùng.
+
+```
+curl -XPOST "http://localhost:8086/query" --data-urlencode "q=CREATE USER username WITH PASSWORD 'password' WITH ALL PRIVILEGES"
+```
+
+Bây giờ bạn có thể sử dụng máy khách influx để vào [InfluxDB shell](https://docs.influxdata.com/influxdb/v1.8/tools/shell/) với người dùng này.
+
+```
+influx -username 'username' -password 'password'
+```
+
+Giao tiếp trực tiếp với InfluxDB trong shell của nó, bạn có thể tạo cơ sở dữ liệu và người dùng cho các chỉ số của Geth.
+
+```
+create database geth
+create user geth with password choosepassword
+```
+
+Xác minh các mục đã tạo bằng:
+
+```
+show databases
+show users
+```
+
+Thoát khỏi InfluxDB shell.
+
+```
+exit
+```
+
+InfluxDB đang chạy và được định cấu hình để lưu trữ các chỉ số từ Geth.
+
+## Chuẩn bị Geth {#preparing-geth}
+
+Sau khi thiết lập cơ sở dữ liệu, chúng ta cần bật tính năng thu thập chỉ số trong Geth. Hãy chú ý đến `METRICS AND STATS OPTIONS` trong `geth --help`. Có thể tìm thấy nhiều tùy chọn ở đó, trong trường hợp này, chúng tôi muốn Geth đẩy dữ liệu vào InfluxDB.
+Thiết lập cơ bản chỉ định điểm cuối nơi InfluxDB có thể truy cập được và xác thực cho cơ sở dữ liệu.
+
+```
+geth --metrics --metrics.influxdb --metrics.influxdb.endpoint "http://0.0.0.0:8086" --metrics.influxdb.username "geth" --metrics.influxdb.password "chosenpassword"
+```
+
+Cờ này có thể được nối vào một lệnh khởi động máy khách hoặc được lưu vào tệp cấu hình.
+
+Bạn có thể xác minh rằng Geth đang đẩy dữ liệu thành công, ví dụ bằng cách liệt kê các chỉ số trong cơ sở dữ liệu. Trong InfluxDB shell:
+
+```
+use geth
+show measurements
+```
+
+## Thiết lập Grafana {#setting-up-grafana}
+
+Bước tiếp theo là cài đặt Grafana, phần mềm sẽ diễn giải dữ liệu một cách trực quan. Làm theo quy trình cài đặt cho môi trường của bạn trong tài liệu tham khảo của Grafana. Hãy đảm bảo cài đặt phiên bản OSS trừ khi bạn muốn khác đi.
+Các bước cài đặt mẫu cho các bản phân phối Debian sử dụng kho lưu trữ:
+
+```
+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
+```
+
+Khi bạn đã chạy Grafana, nó sẽ có thể truy cập được tại `localhost:3000`.
+Sử dụng trình duyệt ưa thích của bạn để truy cập đường dẫn này, sau đó đăng nhập bằng thông tin đăng nhập mặc định (người dùng: `admin` và mật khẩu: `admin`). Khi được nhắc, hãy thay đổi mật khẩu mặc định và lưu.
+
+
+
+Bạn sẽ được chuyển hướng đến trang chủ Grafana. Đầu tiên, hãy thiết lập dữ liệu nguồn của bạn. Nhấp vào biểu tượng cấu hình trong thanh bên trái và chọn "Nguồn dữ liệu".
+
+
+
+Chưa có nguồn dữ liệu nào được tạo, hãy nhấp vào "Thêm nguồn dữ liệu" để xác định một nguồn.
+
+
+
+Đối với thiết lập này, hãy chọn "InfluxDB" và tiếp tục.
+
+
+
+Cấu hình nguồn dữ liệu khá đơn giản nếu bạn đang chạy các công cụ trên cùng một máy. Bạn cần đặt địa chỉ InfluxDB và các chi tiết để truy cập cơ sở dữ liệu. Tham khảo hình bên dưới.
+
+
+
+Nếu mọi thứ đã hoàn tất và InfluxDB có thể truy cập được, hãy nhấp vào "Lưu và kiểm tra" và đợi xác nhận bật lên.
+
+
+
+Grafana hiện đã được thiết lập để đọc dữ liệu từ InfluxDB. Bây giờ bạn cần tạo một bảng điều khiển để diễn giải và hiển thị nó. Thuộc tính của bảng điều khiển được mã hóa trong các tệp JSON mà bất kỳ ai cũng có thể tạo và dễ dàng nhập. Trên thanh bên trái, nhấp vào "Tạo và Nhập".
+
+
+
+Đối với bảng điều khiển giám sát Geth, hãy sao chép ID của [bảng điều khiển này](https://grafana.com/grafana/dashboards/13877/) và dán vào "Trang nhập" trong Grafana. Sau khi lưu bảng điều khiển, nó sẽ trông như thế này:
+
+
+
+Bạn có thể sửa đổi bảng điều khiển của mình. Mỗi bảng có thể được chỉnh sửa, di chuyển, xóa hoặc thêm. Bạn có thể thay đổi cấu hình của mình. Tùy thuộc vào bạn! Để tìm hiểu thêm về cách hoạt động của bảng điều khiển, hãy tham khảo [tài liệu tham khảo của Grafana](https://grafana.com/docs/grafana/latest/dashboards/).
+Bạn cũng có thể quan tâm đến [Cảnh báo](https://grafana.com/docs/grafana/latest/alerting/). Điều này cho phép bạn thiết lập thông báo cảnh báo khi các chỉ số đạt đến các giá trị nhất định. Nhiều kênh liên lạc được hỗ trợ.
diff --git a/public/content/translations/vi/developers/tutorials/nft-minter/index.md b/public/content/translations/vi/developers/tutorials/nft-minter/index.md
new file mode 100644
index 00000000000..51916c9ab8f
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/nft-minter/index.md
@@ -0,0 +1,876 @@
+---
+title: Hướng dẫn về NFT Minter
+description: Trong hướng dẫn này, bạn sẽ xây dựng một NFT minter và tìm hiểu cách tạo một ứng dụng phi tập trung full stack bằng cách kết nối hợp đồng thông minh của bạn với một frontend React bằng các công cụ MetaMask và Web3.
+author: "smudgil"
+tags:
+ [
+ "solidity",
+ "Token không phân tách (NFT)",
+ "từ Alchemy",
+ "hợp đồng thông minh",
+ "frontend",
+ "Pinata"
+ ]
+skill: intermediate
+lang: vi
+published: 2021-10-06
+---
+
+Một trong những thách thức lớn nhất đối với các nhà phát triển đến từ nền tảng Web2 là tìm ra cách kết nối hợp đồng thông minh của bạn với một dự án frontend và tương tác với nó.
+
+Bằng cách xây dựng một NFT minter — một UI đơn giản nơi bạn có thể nhập liên kết đến tài sản kỹ thuật số, một tiêu đề và một mô tả — bạn sẽ học được cách:
+
+- Kết nối với MetaMask thông qua dự án frontend của bạn
+- Gọi các phương thức hợp đồng thông minh từ frontend của bạn
+- Ký các giao dịch bằng MetaMask
+
+Trong hướng dẫn này, chúng tôi sẽ sử dụng [React](https://react.dev/) làm framework frontend. Bởi vì hướng dẫn này chủ yếu tập trung vào phát triển Web3, chúng tôi sẽ không dành nhiều thời gian để phân tích các kiến thức cơ bản về React. Thay vào đó, chúng tôi sẽ tập trung vào việc mang lại chức năng cho dự án của mình.
+
+Là một điều kiện tiên quyết, bạn nên có một sự hiểu biết ở cấp độ người mới bắt đầu về React—biết cách các thành phần, props, useState/useEffect và cách gọi hàm cơ bản hoạt động. Nếu bạn chưa bao giờ nghe về bất kỳ thuật ngữ nào trước đây, bạn có thể muốn xem [hướng dẫn Giới thiệu về React] này(https://react.dev/learn/tutorial-tic-tac-toe). Đối với những người học bằng hình ảnh, chúng tôi đặc biệt đề xuất chuỗi video tuyệt vời này [Hướng dẫn React hiện đại đầy đủ](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d) của Net Ninja.
+
+Và nếu bạn chưa có, bạn chắc chắn sẽ cần một tài khoản Alchemy để hoàn thành hướng dẫn này cũng như xây dựng bất cứ thứ gì trên chuỗi khối. Đăng ký một tài khoản miễn phí [tại đây](https://alchemy.com/).
+
+Không chần chừ gì nữa, hãy bắt đầu nào!
+
+## Kiến thức cơ bản về tạo NFT {#making-nfts-101}
+
+Trước khi chúng ta bắt đầu xem xét bất kỳ mã nào, điều quan trọng là phải hiểu cách tạo NFT hoạt động. Nó bao gồm hai bước:
+
+### Công bố một hợp đồng thông minh NFT trên chuỗi khối Ethereum {#publish-nft}
+
+Sự khác biệt lớn nhất giữa hai tiêu chuẩn hợp đồng thông minh NFT là ERC-1155 là một tiêu chuẩn đa token và bao gồm chức năng hàng loạt, trong khi ERC-721 là một tiêu chuẩn token đơn và do đó chỉ hỗ trợ chuyển một token tại một thời điểm.
+
+### Gọi hàm đúc {#minting-function}
+
+Thông thường, hàm đúc này yêu cầu bạn chuyển vào hai biến làm tham số, đầu tiên là `recipient`, chỉ định địa chỉ sẽ nhận NFT mới đúc của bạn, và thứ hai là `tokenURI` của NFT, một chuỗi phân giải thành một tài liệu JSON mô tả siêu dữ liệu của NFT.
+
+Siêu dữ liệu của NFT thực sự là thứ mang lại sức sống cho nó, cho phép nó có các thuộc tính, chẳng hạn như tên, mô tả, hình ảnh (hoặc tài sản kỹ thuật số khác) và các thuộc tính khác. Đây là [một ví dụ về tokenURI](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2), chứa siêu dữ liệu của một NFT.
+
+Trong hướng dẫn này, chúng ta sẽ tập trung vào phần 2, gọi hàm đúc hợp đồng thông minh của một NFT hiện có bằng cách sử dụng UI React của chúng ta.
+
+[Đây là liên kết](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) đến hợp đồng thông minh NFT ERC-721 mà chúng ta sẽ gọi trong hướng dẫn này. Nếu bạn muốn tìm hiểu cách chúng tôi đã tạo ra nó, chúng tôi thực sự khuyên bạn nên xem hướng dẫn khác của chúng tôi, ["Cách tạo một NFT"](https://www.alchemy.com/docs/how-to-create-an-nft).
+
+Tuyệt vời, bây giờ chúng ta đã hiểu cách tạo NFT hoạt động, hãy sao chép các tệp khởi đầu của chúng ta!
+
+## Sao chép các tệp khởi đầu {#clone-the-starter-files}
+
+Đầu tiên, hãy truy cập [kho lưu trữ GitHub của nft-minter-tutorial](https://github.com/alchemyplatform/nft-minter-tutorial) để lấy các tệp khởi đầu cho dự án này. Sao chép kho lưu trữ này vào môi trường cục bộ của bạn.
+
+Khi bạn mở kho lưu trữ `nft-minter-tutorial` đã sao chép này, bạn sẽ nhận thấy rằng nó chứa hai thư mục: `minter-starter-files` và `nft-minter`.
+
+- `minter-starter-files` chứa các tệp khởi đầu (chủ yếu là UI React) cho dự án này. Trong hướng dẫn này, **chúng ta sẽ làm việc trong thư mục này**, khi bạn tìm hiểu cách làm cho UI này trở nên sống động bằng cách kết nối nó với ví Ethereum của bạn và một hợp đồng thông minh NFT.
+- `nft-minter` chứa toàn bộ hướng dẫn đã hoàn thành và có sẵn cho bạn như một tài liệu **tham khảo** **nếu bạn gặp khó khăn.**
+
+Tiếp theo, mở bản sao của `minter-starter-files` trong trình chỉnh sửa mã của bạn, và sau đó điều hướng vào thư mục `src` của bạn.
+
+Tất cả mã chúng ta sẽ viết sẽ nằm trong thư mục `src`. Chúng ta sẽ chỉnh sửa thành phần `Minter.js` và viết các tệp javascript bổ sung để cung cấp cho dự án của chúng ta chức năng Web3.
+
+## Bước 2: Kiểm tra các tệp khởi đầu của chúng ta {#step-2-check-out-our-starter-files}
+
+Trước khi bắt đầu viết mã, điều quan trọng là phải kiểm tra những gì đã được cung cấp cho chúng ta trong các tệp khởi đầu.
+
+### Chạy dự án react của bạn {#get-your-react-project-running}
+
+Hãy bắt đầu bằng cách chạy dự án React trong trình duyệt của chúng ta. Vẻ đẹp của React là một khi chúng ta có dự án đang chạy trong trình duyệt, bất kỳ thay đổi nào chúng ta lưu sẽ được cập nhật trực tiếp trong trình duyệt của chúng ta.
+
+Để chạy dự án, điều hướng đến thư mục gốc của thư mục `minter-starter-files`, và chạy `npm install` trong terminal của bạn để cài đặt các phụ thuộc của dự án:
+
+```bash
+cd minter-starter-files
+npm install
+```
+
+Sau khi chúng đã cài đặt xong, hãy chạy `npm start` trong terminal của bạn:
+
+```bash
+npm start
+```
+
+Làm như vậy sẽ mở http://localhost:3000/ trong trình duyệt của bạn, nơi bạn sẽ thấy frontend cho dự án của chúng ta. Nó sẽ bao gồm 3 trường: một nơi để nhập liên kết đến tài sản NFT của bạn, nhập tên NFT của bạn và cung cấp một mô tả.
+
+Nếu bạn thử nhấp vào các nút "Kết nối Ví" hoặc "Đúc NFT", bạn sẽ nhận thấy chúng không hoạt động—đó là vì chúng ta vẫn cần lập trình chức năng của chúng! :\)
+
+### Thành phần Minter.js {#minter-js}
+
+**LƯU Ý:** Hãy chắc chắn rằng bạn đang ở trong thư mục `minter-starter-files` chứ không phải thư mục `nft-minter`!
+
+Hãy quay lại thư mục `src` trong trình chỉnh sửa của chúng ta và mở tệp `Minter.js`. Việc hiểu mọi thứ trong tệp này là cực kỳ quan trọng, vì đây là thành phần React chính mà chúng ta sẽ làm việc.
+
+Ở đầu tệp này, chúng ta có các biến trạng thái mà chúng ta sẽ cập nhật sau các sự kiện cụ thể.
+
+```javascript
+//Biến trạng thái
+const [walletAddress, setWallet] = useState("")
+const [status, setStatus] = useState("")
+const [name, setName] = useState("")
+const [description, setDescription] = useState("")
+const [url, setURL] = useState("")
+```
+
+Chưa bao giờ nghe về biến trạng thái hoặc hook trạng thái của React? Hãy xem các tài liệu [này](https://legacy.reactjs.org/docs/hooks-state.html).
+
+Đây là ý nghĩa của từng biến:
+
+- `walletAddress` - một chuỗi lưu trữ địa chỉ ví của người dùng
+- `status` - một chuỗi chứa thông báo để hiển thị ở cuối UI
+- `name` - một chuỗi lưu trữ tên của NFT
+- `description` - một chuỗi lưu trữ mô tả của NFT
+- `url` - một chuỗi là liên kết đến tài sản kỹ thuật số của NFT
+
+Sau các biến trạng thái, bạn sẽ thấy ba hàm chưa được triển khai: `useEffect`, `connectWalletPressed` và `onMintPressed`. Bạn sẽ nhận thấy rằng tất cả các hàm này đều là `async`, đó là bởi vì chúng ta sẽ thực hiện các lệnh gọi API bất đồng bộ trong chúng! Tên của chúng đồng nghĩa với chức năng của chúng:
+
+```javascript
+useEffect(async () => {
+ //TODO: triển khai
+}, [])
+
+const connectWalletPressed = async () => {
+ //TODO: triển khai
+}
+
+const onMintPressed = async () => {
+ //TODO: triển khai
+}
+```
+
+- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) - đây là một hook của React được gọi sau khi thành phần của bạn được hiển thị. Bởi vì nó có một prop mảng rỗng `[]` được truyền vào (xem dòng 3), nó sẽ chỉ được gọi trong lần hiển thị _đầu tiên_ của thành phần. Ở đây, chúng ta sẽ gọi trình nghe ví của mình và một hàm ví khác để cập nhật UI của chúng ta để phản ánh xem một ví đã được kết nối hay chưa.
+- `connectWalletPressed` - hàm này sẽ được gọi để kết nối ví MetaMask của người dùng với ứng dụng phi tập trung của chúng ta.
+- `onMintPressed` - hàm này sẽ được gọi để đúc NFT của người dùng.
+
+Gần cuối tệp này, chúng ta có UI của thành phần của mình. Nếu bạn xem xét kỹ mã này, bạn sẽ nhận thấy rằng chúng ta cập nhật các biến trạng thái `url`, `name`, và `description` của mình khi đầu vào trong các trường văn bản tương ứng của chúng thay đổi.
+
+Bạn cũng sẽ thấy rằng `connectWalletPressed` và `onMintPressed` được gọi khi các nút có ID `mintButton` và `walletButton` được nhấp tương ứng.
+
+```javascript
+//UI của thành phần của chúng ta
+return (
+
+
+
+
+ 🧙♂️ Alchemy NFT Minter
+
+ Chỉ cần thêm liên kết, tên và mô tả tài sản của bạn, sau đó nhấn "Đúc".
+
+
+
+ {status}
+
+)
+```
+
+Cuối cùng, hãy xem xét nơi thành phần Minter này được thêm vào.
+
+Nếu bạn vào tệp `App.js`, là thành phần chính trong React hoạt động như một vùng chứa cho tất cả các thành phần khác, bạn sẽ thấy thành phần Minter của chúng ta được chèn vào dòng 7.
+
+**Trong hướng dẫn này, chúng ta sẽ chỉ chỉnh sửa tệp `Minter.js` và thêm các tệp vào thư mục `src` của chúng ta.**
+
+Bây giờ chúng ta đã hiểu những gì chúng ta đang làm việc, hãy thiết lập ví Ethereum của chúng ta!
+
+## Thiết lập ví Ethereum của bạn {#set-up-your-ethereum-wallet}
+
+Để người dùng có thể tương tác với hợp đồng thông minh của bạn, họ sẽ cần kết nối ví Ethereum của họ với ứng dụng phi tập trung của bạn.
+
+### Tải xuống MetaMask {#download-metamask}
+
+Trong bài hướng dẫn này, chúng ta sẽ sử dụng MetaMask, một ví ảo trong trình duyệt dùng để quản lý địa chỉ tài khoản Ethereum của bạn. Nếu bạn muốn hiểu thêm về cách thức hoạt động của các giao dịch trên Ethereum, hãy xem [trang này](/developers/docs/transactions/).
+
+Bạn có thể tải xuống và tạo tài khoản MetaMask miễn phí [tại đây](https://metamask.io/download). Khi bạn đang tạo tài khoản, hoặc nếu bạn đã có tài khoản, hãy đảm bảo chuyển sang “Mạng thử nghiệm Ropsten” ở phía trên bên phải (để chúng ta không phải giao dịch bằng tiền thật).
+
+### Thêm ether từ một Vòi {#add-ether-from-faucet}
+
+Để đúc NFT của chúng ta (hoặc ký bất kỳ giao dịch nào trên chuỗi khối Ethereum), chúng ta sẽ cần một ít Eth giả. Để nhận Eth, bạn có thể truy cập [vòi Ropsten](https://faucet.ropsten.be/) và nhập địa chỉ tài khoản Ropsten của bạn, sau đó nhấp vào “Gửi Ropsten Eth”. Bạn sẽ sớm thấy Eth trong tài khoản MetaMask của mình!
+
+### Kiểm tra số dư của bạn {#check-your-balance}
+
+Để kiểm tra lại số dư của chúng ta, hãy thực hiện một yêu cầu [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) bằng cách sử dụng [công cụ soạn thảo của 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). Thao tác này sẽ trả về số lượng Eth trong ví của chúng ta. Sau khi bạn nhập địa chỉ tài khoản MetaMask của mình và nhấp vào “Send Request”, bạn sẽ thấy một phản hồi như sau:
+
+```text
+{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}
+```
+
+**LƯU Ý:** Kết quả này tính bằng wei chứ không phải eth. Wei được sử dụng làm mệnh giá nhỏ nhất của ether. Việc chuyển đổi từ wei sang eth là: 1 eth = 10¹⁸ wei. Vì vậy, nếu chúng ta chuyển đổi 0xde0b6b3a7640000 sang hệ thập phân, chúng ta sẽ nhận được 1\*10¹⁸, tương đương với 1 eth.
+
+Phù! Tiền giả của chúng ta đã có đủ!
+
+## Kết nối MetaMask với UI của bạn {#connect-metamask-to-your-UI}
+
+Bây giờ ví MetaMask của chúng ta đã được thiết lập, hãy kết nối ứng dụng phi tập trung của chúng ta với nó!
+
+Bởi vì chúng ta muốn tuân theo mô hình [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller), chúng ta sẽ tạo một tệp riêng chứa các hàm của mình để quản lý logic, dữ liệu và các quy tắc của ứng dụng phi tập trung của chúng ta, và sau đó chuyển các hàm đó đến frontend của chúng ta (thành phần Minter.js của chúng ta).
+
+### Hàm `connectWallet` {#connect-wallet-function}
+
+Để làm điều đó, hãy tạo một thư mục mới có tên `utils` trong thư mục `src` của bạn và thêm một tệp có tên `interact.js` vào bên trong, tệp này sẽ chứa tất cả các hàm tương tác với ví và hợp đồng thông minh của chúng ta.
+
+Trong tệp `interact.js` của chúng ta, chúng ta sẽ viết một hàm `connectWallet`, sau đó chúng ta sẽ nhập và gọi trong thành phần `Minter.js` của mình.
+
+Trong tệp `interact.js` của bạn, hãy thêm những nội dung sau
+
+```javascript
+export const connectWallet = async () => {
+ if (window.ethereum) {
+ try {
+ const addressArray = await window.ethereum.request({
+ method: "eth_requestAccounts",
+ })
+ const obj = {
+ status: "👆🏽 Viết một tin nhắn vào trường văn bản ở trên.",
+ address: addressArray[0],
+ }
+ return obj
+ } catch (err) {
+ return {
+ address: "",
+ status: "😥 " + err.message,
+ }
+ }
+ } else {
+ return {
+ address: "",
+ status: (
+
+
+ {" "}
+ 🦊
+ Bạn phải cài đặt MetaMask, một ví Ethereum ảo, trong trình duyệt
+ của bạn.
+
+
+
+ ),
+ }
+ }
+}
+```
+
+Hãy cùng phân tích mã này làm gì:
+
+Đầu tiên, hàm của chúng ta kiểm tra xem `window.ethereum` có được bật trong trình duyệt của bạn không.
+
+`window.ethereum` là một API toàn cầu được chèn bởi MetaMask và các nhà cung cấp ví khác cho phép các trang web yêu cầu tài khoản Ethereum của người dùng. Nếu được chấp thuận, nó có thể đọc dữ liệu từ các chuỗi khối mà người dùng đang kết nối và đề xuất người dùng ký các tin nhắn và giao dịch. Hãy xem [tài liệu MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) để biết thêm thông tin!
+
+Nếu `window.ethereum` _không_ có mặt, điều đó có nghĩa là MetaMask chưa được cài đặt. Điều này dẫn đến một đối tượng JSON được trả về, trong đó `address` được trả về là một chuỗi rỗng và đối tượng `status` JSX chuyển tiếp rằng người dùng phải cài đặt MetaMask.
+
+**Hầu hết các hàm chúng ta viết sẽ trả về các đối tượng JSON mà chúng ta có thể sử dụng để cập nhật các biến trạng thái và UI của mình.**
+
+Bây giờ nếu `window.ethereum` _có_ mặt, thì đó là lúc mọi thứ trở nên thú vị.
+
+Sử dụng vòng lặp try/catch, chúng ta sẽ cố gắng kết nối với MetaMask bằng cách gọi [`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts). Việc gọi hàm này sẽ mở MetaMask trong trình duyệt, qua đó người dùng sẽ được nhắc kết nối ví của họ với ứng dụng phi tập trung của bạn.
+
+- Nếu người dùng chọn kết nối, `method: "eth_requestAccounts"` sẽ trả về một mảng chứa tất cả các địa chỉ tài khoản của người dùng đã được kết nối với ứng dụng phi tập trung. Nói chung, hàm `connectWallet` của chúng ta sẽ trả về một đối tượng JSON chứa `address` _đầu tiên_ trong mảng này (xem dòng 9) và một thông báo `status` nhắc người dùng viết một tin nhắn cho hợp đồng thông minh.
+- Nếu người dùng từ chối kết nối, thì đối tượng JSON sẽ chứa một chuỗi rỗng cho `address` được trả về và một thông báo `status` phản ánh rằng người dùng đã từ chối kết nối.
+
+### Thêm hàm connectWallet vào thành phần UI Minter.js của bạn {#add-connect-wallet}
+
+Bây giờ chúng ta đã viết hàm `connectWallet` này, hãy kết nối nó với thành phần `Minter.js` của chúng ta.
+
+Đầu tiên, chúng ta sẽ phải nhập hàm của mình vào tệp `Minter.js` bằng cách thêm `import { connectWallet } from "./utils/interact.js";` vào đầu tệp `Minter.js`. 11 dòng đầu tiên của `Minter.js` của bạn bây giờ sẽ trông như thế này:
+
+```javascript
+import { useEffect, useState } from "react";
+import { connectWallet } from "./utils/interact.js";
+
+const Minter = (props) => {
+
+ //Biến trạng thái
+ const [walletAddress, setWallet] = useState("");
+ const [status, setStatus] = useState("");
+ const [name, setName] = useState("");
+ const [description, setDescription] = useState("");
+ const [url, setURL] = useState("");
+```
+
+Sau đó, bên trong hàm `connectWalletPressed` của chúng ta, chúng ta sẽ gọi hàm `connectWallet` đã nhập, như sau:
+
+```javascript
+const connectWalletPressed = async () => {
+ const walletResponse = await connectWallet()
+ setStatus(walletResponse.status)
+ setWallet(walletResponse.address)
+}
+```
+
+Bạn có nhận thấy hầu hết các chức năng của chúng ta được trừu tượng hóa khỏi thành phần `Minter.js` của chúng ta từ tệp `interact.js` không? Điều này là để chúng ta tuân thủ mô hình M-V-C!
+
+Trong `connectWalletPressed`, chúng ta chỉ cần thực hiện một lệnh gọi await đến hàm `connectWallet` đã nhập của mình, và sử dụng phản hồi của nó, chúng ta cập nhật các biến `status` và `walletAddress` của mình thông qua các hook trạng thái của chúng.
+
+Bây giờ, hãy lưu cả hai tệp `Minter.js` và `interact.js` và thử nghiệm UI của chúng ta cho đến nay.
+
+Mở trình duyệt của bạn trên localhost:3000 và nhấn nút "Kết nối Ví" ở góc trên cùng bên phải của trang.
+
+Nếu bạn đã cài đặt MetaMask, bạn sẽ được nhắc kết nối ví của mình với ứng dụng phi tập trung của bạn. Chấp nhận lời mời kết nối.
+
+Bạn sẽ thấy rằng nút ví bây giờ phản ánh rằng địa chỉ của bạn đã được kết nối.
+
+Tiếp theo, hãy thử làm mới trang... Điều này thật lạ. Nút ví của chúng ta đang nhắc chúng ta kết nối MetaMask, mặc dù nó đã được kết nối...
+
+Tuy nhiên, đừng lo lắng! Chúng ta có thể dễ dàng khắc phục điều đó bằng cách triển khai một hàm có tên `getCurrentWalletConnected`, hàm này sẽ kiểm tra xem một địa chỉ đã được kết nối với ứng dụng phi tập trung của chúng ta hay chưa và cập nhật UI của chúng ta cho phù hợp!
+
+### Hàm getCurrentWalletConnected {#get-current-wallet}
+
+Trong tệp `interact.js` của bạn, hãy thêm hàm `getCurrentWalletConnected` sau:
+
+```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: "👆🏽 Viết một tin nhắn vào trường văn bản ở trên.",
+ }
+ } else {
+ return {
+ address: "",
+ status: "🦊 Kết nối với MetaMask bằng nút trên cùng bên phải.",
+ }
+ }
+ } catch (err) {
+ return {
+ address: "",
+ status: "😥 " + err.message,
+ }
+ }
+ } else {
+ return {
+ address: "",
+ status: (
+
+
+ {" "}
+ 🦊
+ Bạn phải cài đặt MetaMask, một ví Ethereum ảo, trong trình duyệt
+ của bạn.
+
+
+
+ ),
+ }
+ }
+}
+```
+
+Mã này _rất_ tương tự với hàm `connectWallet` mà chúng ta vừa viết trước đó.
+
+Sự khác biệt chính là thay vì gọi phương thức `eth_requestAccounts`, phương thức này sẽ mở MetaMask để người dùng kết nối ví của họ, ở đây chúng ta gọi phương thức `eth_accounts`, phương thức này chỉ đơn giản trả về một mảng chứa các địa chỉ MetaMask hiện đang được kết nối với ứng dụng phi tập trung của chúng ta.
+
+Để xem hàm này hoạt động, hãy gọi nó trong hàm `useEffect` của thành phần `Minter.js` của chúng ta.
+
+Giống như chúng ta đã làm với `connectWallet`, chúng ta phải nhập hàm này từ tệp `interact.js` vào tệp `Minter.js` của mình như sau:
+
+```javascript
+import { useEffect, useState } from "react"
+import {
+ connectWallet,
+ getCurrentWalletConnected, //nhập tại đây
+} from "./utils/interact.js"
+```
+
+Bây giờ, chúng ta chỉ cần gọi nó trong hàm `useEffect` của mình:
+
+```javascript
+useEffect(async () => {
+ const { address, status } = await getCurrentWalletConnected()
+ setWallet(address)
+ setStatus(status)
+}, [])
+```
+
+Lưu ý, chúng ta sử dụng phản hồi của lệnh gọi đến `getCurrentWalletConnected` để cập nhật các biến trạng thái `walletAddress` và `status` của mình.
+
+Sau khi bạn đã thêm mã này, hãy thử làm mới cửa sổ trình duyệt của chúng ta. Nút sẽ hiển thị rằng bạn đã kết nối và hiển thị bản xem trước địa chỉ ví đã kết nối của bạn - ngay cả sau khi bạn làm mới!
+
+### Triển khai addWalletListener {#implement-add-wallet-listener}
+
+Bước cuối cùng trong quá trình thiết lập ví ứng dụng phi tập trung của chúng ta là triển khai trình nghe ví để UI của chúng ta cập nhật khi trạng thái ví thay đổi, chẳng hạn như khi người dùng ngắt kết nối hoặc chuyển đổi tài khoản.
+
+Trong tệp `Minter.js` của bạn, hãy thêm một hàm `addWalletListener` trông như sau:
+
+```javascript
+function addWalletListener() {
+ if (window.ethereum) {
+ window.ethereum.on("accountsChanged", (accounts) => {
+ if (accounts.length > 0) {
+ setWallet(accounts[0])
+ setStatus("👆🏽 Viết một tin nhắn vào trường văn bản ở trên.")
+ } else {
+ setWallet("")
+ setStatus("🦊 Kết nối với MetaMask bằng nút trên cùng bên phải.")
+ }
+ })
+ } else {
+ setStatus(
+
+ {" "}
+ 🦊
+ Bạn phải cài đặt MetaMask, một ví Ethereum ảo, trong trình duyệt của bạn.
+
+
+ )
+ }
+}
+```
+
+Hãy nhanh chóng phân tích những gì đang xảy ra ở đây:
+
+- Đầu tiên, hàm của chúng ta kiểm tra xem `window.ethereum` có được bật hay không (tức là MetaMask đã được cài đặt).
+ - Nếu không, chúng ta chỉ cần thiết lập biến trạng thái `status` của mình thành một chuỗi JSX nhắc người dùng cài đặt MetaMask.
+ - Nếu nó được bật, chúng ta sẽ thiết lập trình nghe `window.ethereum.on("accountsChanged")` trên dòng 3 để lắng nghe các thay đổi trạng thái trong ví MetaMask, bao gồm khi người dùng kết nối thêm một tài khoản vào ứng dụng phi tập trung, chuyển đổi tài khoản hoặc ngắt kết nối một tài khoản. Nếu có ít nhất một tài khoản được kết nối, biến trạng thái `walletAddress` sẽ được cập nhật thành tài khoản đầu tiên trong mảng `accounts` được trả về bởi trình nghe. Ngược lại, `walletAddress` được đặt thành một chuỗi rỗng.
+
+Cuối cùng, chúng ta phải gọi nó trong hàm `useEffect` của mình:
+
+```javascript
+useEffect(async () => {
+ const { address, status } = await getCurrentWalletConnected()
+ setWallet(address)
+ setStatus(status)
+
+ addWalletListener()
+}, [])
+```
+
+Và thế là xong! Chúng ta đã hoàn thành việc lập trình tất cả các chức năng ví của mình! Bây giờ ví của chúng ta đã được thiết lập, hãy cùng tìm hiểu cách đúc NFT của chúng ta!
+
+## Kiến thức cơ bản về siêu dữ liệu NFT {#nft-metadata-101}
+
+Vì vậy, hãy nhớ lại siêu dữ liệu NFT mà chúng ta vừa nói đến trong Bước 0 của hướng dẫn này—nó mang lại sức sống cho NFT, cho phép nó có các thuộc tính, chẳng hạn như tài sản kỹ thuật số, tên, mô tả và các thuộc tính khác.
+
+Chúng ta sẽ cần phải cấu hình siêu dữ liệu này dưới dạng một đối tượng JSON và lưu trữ nó, để chúng ta có thể chuyển nó vào làm tham số `tokenURI` khi gọi hàm `mintNFT` của hợp đồng thông minh của chúng ta.
+
+Văn bản trong các trường "Liên kết đến tài sản", "Tên", "Mô tả" sẽ bao gồm các thuộc tính khác nhau của siêu dữ liệu NFT của chúng ta. Chúng ta sẽ định dạng siêu dữ liệu này dưới dạng một đối tượng JSON, nhưng có một vài tùy chọn về nơi chúng ta có thể lưu trữ đối tượng JSON này:
+
+- Chúng ta có thể lưu trữ nó trên chuỗi khối Ethereum; tuy nhiên, làm như vậy sẽ rất tốn kém.
+- Chúng ta có thể lưu trữ nó trên một máy chủ tập trung, như AWS hoặc Firebase. Nhưng điều đó sẽ đi ngược lại với đặc tính phi tập trung của chúng ta.
+- Chúng ta có thể sử dụng IPFS, một giao thức phi tập trung và mạng ngang hàng để lưu trữ và chia sẻ dữ liệu trong một hệ thống tệp phân tán. Vì giao thức này là phi tập trung và miễn phí, nó là lựa chọn tốt nhất của chúng ta!
+
+Để lưu trữ siêu dữ liệu của chúng ta trên IPFS, chúng ta sẽ sử dụng [Pinata](https://pinata.cloud/), một API và bộ công cụ IPFS tiện lợi. Trong bước tiếp theo, chúng ta sẽ giải thích chính xác cách thực hiện điều này!
+
+## Sử dụng Pinata để ghim siêu dữ liệu của bạn vào IPFS {#use-pinata-to-pin-your-metadata-to-IPFS}
+
+Nếu bạn chưa có tài khoản [Pinata](https://pinata.cloud/), hãy đăng ký một tài khoản miễn phí [tại đây](https://app.pinata.cloud/auth/signup) và hoàn thành các bước để xác minh email và tài khoản của bạn.
+
+### Tạo khóa API Pinata của bạn {#create-pinata-api-key}
+
+Điều hướng đến trang [https://pinata.cloud/keys](https://pinata.cloud/keys), sau đó chọn nút "New Key" ở trên cùng, đặt widget Admin thành bật và đặt tên cho khóa của bạn.
+
+Sau đó, bạn sẽ thấy một cửa sổ bật lên với thông tin API của mình. Hãy chắc chắn rằng bạn đặt nó ở một nơi an toàn.
+
+Bây giờ khóa của chúng ta đã được thiết lập, hãy thêm nó vào dự án của chúng ta để có thể sử dụng.
+
+### Tạo tệp .env {#create-a-env}
+
+Chúng ta có thể lưu trữ khóa và mã bí mật Pinata của mình một cách an toàn trong một tệp môi trường. Hãy cài đặt [gói dotenv](https://www.npmjs.com/package/dotenv) trong thư mục dự án của bạn.
+
+Mở một tab mới trong terminal của bạn (riêng biệt với tab đang chạy local host) và đảm bảo bạn đang ở trong thư mục `minter-starter-files`, sau đó chạy lệnh sau trong terminal của bạn:
+
+```text
+npm install dotenv --save
+```
+
+Tiếp theo, tạo tệp `.env` trong thư mục gốc của `minter-starter-files` bằng cách nhập nội dung sau vào dòng lệnh của bạn:
+
+```javascript
+vim.env
+```
+
+Thao tác này sẽ mở tệp `.env` của bạn trong vim (một trình soạn thảo văn bản). Để lưu nó, hãy nhấn "esc" + ":" + "q" trên bàn phím của bạn theo thứ tự đó.
+
+Tiếp theo, trong VSCode, điều hướng đến tệp `.env` của bạn và thêm khóa API và mã bí mật API Pinata của bạn vào đó, như sau:
+
+```text
+REACT_APP_PINATA_KEY =
+REACT_APP_PINATA_SECRET =
+```
+
+Lưu tệp, và sau đó bạn đã sẵn sàng để bắt đầu viết hàm để tải siêu dữ liệu JSON của mình lên IPFS!
+
+### Triển khai pinJSONToIPFS {#pin-json-to-ipfs}
+
+May mắn cho chúng ta, Pinata có một [API dành riêng cho việc tải dữ liệu JSON lên IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) và một ví dụ JavaScript tiện lợi với axios mà chúng ta có thể sử dụng, với một số sửa đổi nhỏ.
+
+Trong thư mục `utils` của bạn, hãy tạo một tệp khác có tên `pinata.js` và sau đó nhập mã bí mật và khóa Pinata của chúng ta từ tệp .env như sau:
+
+```javascript
+require("dotenv").config()
+const key = process.env.REACT_APP_PINATA_KEY
+const secret = process.env.REACT_APP_PINATA_SECRET
+```
+
+Tiếp theo, dán mã bổ sung từ bên dưới vào tệp `pinata.js` của bạn. Đừng lo lắng, chúng ta sẽ phân tích ý nghĩa của mọi thứ!
+
+```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,
+ }
+ })
+}
+```
+
+Vậy mã này làm gì chính xác?
+
+Đầu tiên, nó nhập [axios](https://www.npmjs.com/package/axios), một ứng dụng HTTP dựa trên promise cho trình duyệt và node.js, mà chúng ta sẽ sử dụng để thực hiện một yêu cầu đến Pinata.
+
+Sau đó, chúng ta có hàm bất đồng bộ `pinJSONToIPFS`, nhận `JSONBody` làm đầu vào và khóa và mã bí mật api Pinata trong tiêu đề của nó, tất cả để thực hiện một yêu cầu POST đến API `pinJSONToIPFS` của họ.
+
+- Nếu yêu cầu POST này thành công, thì hàm của chúng ta sẽ trả về một đối tượng JSON với boolean `success` là true và `pinataUrl` nơi siêu dữ liệu của chúng ta được ghim. Chúng ta sẽ sử dụng `pinataUrl` được trả về này làm đầu vào `tokenURI` cho hàm đúc của hợp đồng thông minh của chúng ta.
+- Nếu yêu cầu post này không thành công, thì hàm của chúng ta sẽ trả về một đối tượng JSON với boolean `success` là false và một chuỗi `message` chuyển tiếp lỗi của chúng ta.
+
+Như với các loại trả về của hàm `connectWallet` của chúng ta, chúng ta đang trả về các đối tượng JSON để có thể sử dụng các tham số của chúng để cập nhật các biến trạng thái và UI của mình.
+
+## Tải hợp đồng thông minh của bạn {#load-your-smart-contract}
+
+Bây giờ chúng ta đã có cách để tải siêu dữ liệu NFT của mình lên IPFS thông qua hàm `pinJSONToIPFS`, chúng ta sẽ cần một cách để tải một phiên bản của hợp đồng thông minh của mình để có thể gọi hàm `mintNFT` của nó.
+
+Như chúng ta đã đề cập trước đó, trong hướng dẫn này, chúng ta sẽ sử dụng [hợp đồng thông minh NFT hiện có này](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE); tuy nhiên, nếu bạn muốn tìm hiểu cách chúng tôi đã tạo ra nó, hoặc tự tạo một cái, chúng tôi thực sự khuyên bạn nên xem hướng dẫn khác của chúng tôi, ["Cách tạo một NFT."](https://www.alchemy.com/docs/how-to-create-an-nft).
+
+### Giao diện nhị phân ứng dụng hợp đồng {#contract-abi}
+
+Nếu bạn đã kiểm tra kỹ các tệp của chúng ta, bạn sẽ nhận thấy rằng trong thư mục `src` của mình, có một tệp `contract-abi.json`. Một Giao diện nhị phân ứng dụng là cần thiết để chỉ định hàm nào mà một hợp đồng sẽ gọi cũng như đảm bảo rằng hàm sẽ trả về dữ liệu ở định dạng bạn đang mong đợi.
+
+Chúng ta cũng sẽ cần một khóa Giao diện Lập trình Ứng dụng Alchemy và Giao diện Lập trình Ứng dụng Alchemy Web3 để kết nối với chuỗi khối Ethereum và tải hợp đồng thông minh của mình.
+
+### Tạo khóa Giao diện Lập trình Ứng dụng Alchemy của bạn {#create-alchemy-api}
+
+Nếu bạn chưa có tài khoản Alchemy, [hãy đăng ký miễn phí tại đây.](https://alchemy.com/?a=eth-org-nft-minter)
+
+Khi bạn đã tạo tài khoản Alchemy, bạn có thể tạo một khoá API bằng cách tạo một ứng dụng. Điều này sẽ cho phép chúng ta tạo các yêu cầu gửi đến mạng thử nghiệm Ropsten.
+
+Điều hướng đến trang “Create App” trong bảng điều khiển Alchemy của bạn bằng cách di chuột qua “Apps” trong thanh điều hướng và nhấp vào “Create App”.
+
+Đặt tên cho ứng dụng của bạn, chúng tôi đã chọn "My First NFT!", cung cấp một mô tả ngắn, chọn “Staging” cho Môi trường được sử dụng để lưu trữ ứng dụng của bạn và chọn “Ropsten” cho mạng của bạn.
+
+Nhấp vào "Create app" và thế là xong! Ứng dụng của bạn sẽ xuất hiện trong bảng dưới đây.
+
+Tuyệt vời, bây giờ chúng ta đã tạo URL API HTTP Alchemy của mình, hãy sao chép nó vào clipboard của bạn...
+
+…và sau đó hãy thêm nó vào tệp `.env` của chúng ta. Nói chung, tệp .env của bạn sẽ trông như thế này:
+
+```text
+REACT_APP_PINATA_KEY =
+REACT_APP_PINATA_SECRET =
+REACT_APP_ALCHEMY_KEY = https://eth-ropsten.alchemyapi.io/v2/
+```
+
+Bây giờ chúng ta đã có Giao diện nhị phân ứng dụng hợp đồng và khóa Giao diện Lập trình Ứng dụng Alchemy của mình, chúng ta đã sẵn sàng để tải hợp đồng thông minh của mình bằng [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3).
+
+### Thiết lập điểm cuối và hợp đồng Alchemy Web3 của bạn {#setup-alchemy-endpoint}
+
+Đầu tiên, nếu bạn chưa có, bạn sẽ cần cài đặt [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) bằng cách điều hướng đến thư mục Trang chủ: `nft-minter-tutorial` trong terminal:
+
+```text
+cd ..
+npm install @alch/alchemy-web3
+```
+
+Tiếp theo, hãy quay lại tệp `interact.js` của chúng ta. Ở đầu tệp, hãy thêm mã sau để nhập khóa Alchemy của bạn từ tệp .env và thiết lập điểm cuối Alchemy Web3 của bạn:
+
+```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) là một trình bao bọc xung quanh [Web3.js](https://docs.web3js.org/), cung cấp các phương thức Giao diện Lập trình Ứng dụng nâng cao và các lợi ích quan trọng khác để giúp cuộc sống của bạn với tư cách là một nhà phát triển web3 dễ dàng hơn. Nó được thiết kế để yêu cầu cấu hình tối thiểu để bạn có thể bắt đầu sử dụng nó trong ứng dụng của mình ngay lập tức!
+
+Tiếp theo, hãy thêm Giao diện nhị phân ứng dụng hợp đồng và địa chỉ hợp đồng của chúng ta vào tệp.
+
+```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"
+```
+
+Một khi chúng ta có cả hai, chúng ta đã sẵn sàng để bắt đầu viết mã hàm đúc của mình!
+
+## Triển khai hàm mintNFT {#implement-the-mintnft-function}
+
+Bên trong tệp `interact.js` của bạn, hãy xác định hàm `mintNFT`, hàm này sẽ đúc NFT của chúng ta.
+
+Bởi vì chúng ta sẽ thực hiện nhiều lệnh gọi bất đồng bộ (đến Pinata để ghim siêu dữ liệu của chúng ta vào IPFS, Alchemy Web3 để tải hợp đồng thông minh của chúng ta, và MetaMask để ký các giao dịch của chúng ta), hàm của chúng ta cũng sẽ là bất đồng bộ.
+
+Ba đầu vào cho hàm của chúng ta sẽ là `url` của tài sản kỹ thuật số, `name`, và `description`. Thêm chữ ký hàm sau bên dưới hàm `connectWallet`:
+
+```javascript
+export const mintNFT = async (url, name, description) => {}
+```
+
+### Xử lý lỗi đầu vào {#input-error-handling}
+
+Đương nhiên, việc có một số loại xử lý lỗi đầu vào ở đầu hàm là hợp lý, để chúng ta thoát khỏi hàm này nếu các tham số đầu vào của chúng ta không chính xác. Bên trong hàm của chúng ta, hãy thêm mã sau:
+
+```javascript
+export const mintNFT = async (url, name, description) => {
+ //xử lý lỗi
+ if (url.trim() == "" || name.trim() == "" || description.trim() == "") {
+ return {
+ success: false,
+ status: "❗Vui lòng đảm bảo tất cả các trường đã được hoàn thành trước khi đúc.",
+ }
+ }
+}
+```
+
+Về cơ bản, nếu bất kỳ tham số đầu vào nào là một chuỗi rỗng, thì chúng ta sẽ trả về một đối tượng JSON trong đó boolean `success` là false, và chuỗi `status` chuyển tiếp rằng tất cả các trường trong UI của chúng ta phải được hoàn thành.
+
+### Tải siêu dữ liệu lên IPFS {#upload-metadata-to-ipfs}
+
+Một khi chúng ta biết siêu dữ liệu của mình đã được định dạng đúng cách, bước tiếp theo là gói nó vào một đối tượng JSON và tải nó lên IPFS thông qua `pinJSONToIPFS` mà chúng ta đã viết!
+
+Để làm điều đó, trước tiên chúng ta cần nhập hàm `pinJSONToIPFS` vào tệp `interact.js` của mình. Ở đầu tệp `interact.js`, hãy thêm:
+
+```javascript
+import { pinJSONToIPFS } from "./pinata.js"
+```
+
+Hãy nhớ lại rằng `pinJSONToIPFS` nhận vào một thân JSON. Vì vậy, trước khi chúng ta gọi nó, chúng ta sẽ cần định dạng các tham số `url`, `name`, và `description` của mình thành một đối tượng JSON.
+
+Hãy cập nhật mã của chúng ta để tạo một đối tượng JSON có tên `metadata` và sau đó thực hiện một lệnh gọi đến `pinJSONToIPFS` với tham số `metadata` này:
+
+```javascript
+export const mintNFT = async (url, name, description) => {
+ //xử lý lỗi
+ if (url.trim() == "" || name.trim() == "" || description.trim() == "") {
+ return {
+ success: false,
+ status: "❗Vui lòng đảm bảo tất cả các trường đã được hoàn thành trước khi đúc.",
+ }
+ }
+
+ //tạo siêu dữ liệu
+ const metadata = new Object()
+ metadata.name = name
+ metadata.image = url
+ metadata.description = description
+
+ //thực hiện lệnh gọi pinata
+ const pinataResponse = await pinJSONToIPFS(metadata)
+ if (!pinataResponse.success) {
+ return {
+ success: false,
+ status: "😢 Đã xảy ra lỗi khi tải lên tokenURI của bạn.",
+ }
+ }
+ const tokenURI = pinataResponse.pinataUrl
+}
+```
+
+Lưu ý, chúng ta lưu trữ phản hồi của lệnh gọi đến `pinJSONToIPFS(metadata)` trong đối tượng `pinataResponse`. Sau đó, chúng ta phân tích đối tượng này để tìm bất kỳ lỗi nào.
+
+Nếu có lỗi, chúng ta sẽ trả về một đối tượng JSON trong đó boolean `success` là false và chuỗi `status` của chúng ta chuyển tiếp rằng lệnh gọi của chúng ta đã thất bại. Ngược lại, chúng ta trích xuất `pinataURL` từ `pinataResponse` và lưu trữ nó làm biến `tokenURI` của mình.
+
+Bây giờ là lúc tải hợp đồng thông minh của chúng ta bằng Giao diện Lập trình Ứng dụng Alchemy Web3 mà chúng ta đã khởi tạo ở đầu tệp của mình. Thêm dòng mã sau vào cuối hàm `mintNFT` để thiết lập hợp đồng tại biến toàn cục `window.contract`:
+
+```javascript
+window.contract = await new web3.eth.Contract(contractABI, contractAddress)
+```
+
+Điều cuối cùng cần thêm vào hàm `mintNFT` của chúng ta là giao dịch Ethereum của chúng ta:
+
+```javascript
+//thiết lập giao dịch Ethereum của bạn
+const transactionParameters = {
+ to: contractAddress, // Bắt buộc ngoại trừ trong quá trình xuất bản hợp đồng.
+ from: window.ethereum.selectedAddress, // phải khớp với địa chỉ đang hoạt động của người dùng.
+ data: window.contract.methods
+ .mintNFT(window.ethereum.selectedAddress, tokenURI)
+ .encodeABI(), //thực hiện lệnh gọi đến hợp đồng thông minh NFT
+}
+
+//ký giao dịch qua MetaMask
+try {
+ const txHash = await window.ethereum.request({
+ method: "eth_sendTransaction",
+ params: [transactionParameters],
+ })
+ return {
+ success: true,
+ status:
+ "✅ Kiểm tra giao dịch của bạn trên Etherscan: https://ropsten.etherscan.io/tx/" +
+ txHash,
+ }
+} catch (error) {
+ return {
+ success: false,
+ status: "😥 Đã xảy ra lỗi: " + error.message,
+ }
+}
+```
+
+Nếu bạn đã quen thuộc với các giao dịch Ethereum, bạn sẽ nhận thấy rằng cấu trúc khá tương tự với những gì bạn đã thấy.
+
+- Đầu tiên, chúng ta thiết lập các tham số giao dịch của mình.
+ - `to` chỉ định địa chỉ người nhận (hợp đồng thông minh của chúng ta)
+ - `from` chỉ định người ký giao dịch (địa chỉ được kết nối của người dùng với MetaMask: `window.ethereum.selectedAddress`)
+ - `data` chứa lệnh gọi đến phương thức `mintNFT` của hợp đồng thông minh của chúng ta, phương thức này nhận `tokenURI` và địa chỉ ví của người dùng, `window.ethereum.selectedAddress`, làm đầu vào
+- Sau đó, chúng ta thực hiện một lệnh gọi await, `window.ethereum.request,` trong đó chúng ta yêu cầu MetaMask ký giao dịch. Lưu ý, trong yêu cầu này, chúng ta đang chỉ định phương thức eth của mình (eth_SentTransaction) và chuyển vào các `transactionParameters` của chúng ta. Tại thời điểm này, MetaMask sẽ mở ra trong trình duyệt và nhắc người dùng ký hoặc từ chối giao dịch.
+ - Nếu giao dịch thành công, hàm sẽ trả về một đối tượng JSON trong đó boolean `success` được thiết lập là true và chuỗi `status` nhắc người dùng kiểm tra Etherscan để biết thêm thông tin về giao dịch của họ.
+ - Nếu giao dịch không thành công, hàm sẽ trả về một đối tượng JSON trong đó boolean `success` được thiết lập là false và chuỗi `status` chuyển tiếp thông điệp lỗi.
+
+Nói chung, hàm `mintNFT` của chúng ta sẽ trông như thế này:
+
+```javascript
+export const mintNFT = async (url, name, description) => {
+ //xử lý lỗi
+ if (url.trim() == "" || name.trim() == "" || description.trim() == "") {
+ return {
+ success: false,
+ status: "❗Vui lòng đảm bảo tất cả các trường đã được hoàn thành trước khi đúc.",
+ }
+ }
+
+ //tạo siêu dữ liệu
+ const metadata = new Object()
+ metadata.name = name
+ metadata.image = url
+ metadata.description = description
+
+ //yêu cầu ghim pinata
+ const pinataResponse = await pinJSONToIPFS(metadata)
+ if (!pinataResponse.success) {
+ return {
+ success: false,
+ status: "😢 Đã xảy ra lỗi khi tải lên tokenURI của bạn.",
+ }
+ }
+ const tokenURI = pinataResponse.pinataUrl
+
+ //tải hợp đồng thông minh
+ window.contract = await new web3.eth.Contract(contractABI, contractAddress) //loadContract();
+
+ //thiết lập giao dịch Ethereum của bạn
+ const transactionParameters = {
+ to: contractAddress, // Bắt buộc ngoại trừ trong quá trình xuất bản hợp đồng.
+ from: window.ethereum.selectedAddress, // phải khớp với địa chỉ đang hoạt động của người dùng.
+ data: window.contract.methods
+ .mintNFT(window.ethereum.selectedAddress, tokenURI)
+ .encodeABI(), //thực hiện lệnh gọi đến hợp đồng thông minh NFT
+ }
+
+ //ký giao dịch qua MetaMask
+ try {
+ const txHash = await window.ethereum.request({
+ method: "eth_sendTransaction",
+ params: [transactionParameters],
+ })
+ return {
+ success: true,
+ status:
+ "✅ Kiểm tra giao dịch của bạn trên Etherscan: https://ropsten.etherscan.io/tx/" +
+ txHash,
+ }
+ } catch (error) {
+ return {
+ success: false,
+ status: "😥 Đã xảy ra lỗi: " + error.message,
+ }
+ }
+}
+```
+
+Đó là một hàm khổng lồ! Bây giờ, chúng ta chỉ cần kết nối hàm `mintNFT` của mình với thành phần `Minter.js`...
+
+## Kết nối mintNFT với frontend Minter.js của chúng ta {#connect-our-frontend}
+
+Mở tệp `Minter.js` của bạn và cập nhật dòng `import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";` ở trên cùng thành:
+
+```javascript
+import {
+ connectWallet,
+ getCurrentWalletConnected,
+ mintNFT,
+} from "./utils/interact.js"
+```
+
+Cuối cùng, triển khai hàm `onMintPressed` để thực hiện lệnh gọi await đến hàm `mintNFT` đã nhập của bạn và cập nhật biến trạng thái `status` để phản ánh xem giao dịch của chúng ta có thành công hay không:
+
+```javascript
+const onMintPressed = async () => {
+ const { status } = await mintNFT(url, name, description)
+ setStatus(status)
+}
+```
+
+## Triển khai NFT của bạn lên một trang web trực tiếp {#deploy-your-NFT}
+
+Sẵn sàng đưa dự án của bạn lên mạng để người dùng tương tác chưa? Hãy xem [hướng dẫn này](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online) để triển khai Minter của bạn lên một trang web trực tiếp.
+
+Một bước cuối cùng...
+
+## Khuấy đảo thế giới blockchain {#take-the-blockchain-world-by-storm}
+
+Chỉ đùa thôi, bạn đã hoàn thành hướng dẫn rồi!
+
+Tóm lại, bằng cách xây dựng một NFT minter, bạn đã học thành công cách:
+
+- Kết nối với MetaMask thông qua dự án frontend của bạn
+- Gọi các phương thức hợp đồng thông minh từ frontend của bạn
+- Ký các giao dịch bằng MetaMask
+
+Có lẽ, bạn muốn có thể khoe các NFT được đúc thông qua ứng dụng phi tập trung của mình trong ví của bạn — vì vậy hãy chắc chắn xem hướng dẫn nhanh của chúng tôi [Cách xem NFT của bạn trong Ví](https://www.alchemy.com/docs/how-to-view-your-nft-in-your-mobile-wallet)!
+
+Và, như mọi khi, nếu bạn có bất kỳ câu hỏi nào, chúng tôi ở đây để Trợ giúp trong [Alchemy Discord](https://discord.gg/gWuC7zB). Chúng tôi rất nóng lòng được xem bạn áp dụng các khái niệm từ hướng dẫn này vào các dự án trong tương lai của mình như thế nào!
diff --git a/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md
new file mode 100644
index 00000000000..e31fed20fdc
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md
@@ -0,0 +1,1357 @@
+---
+title: "Hướng dẫn hợp đồng cầu nối tiêu chuẩn Optimism"
+description: Cầu nối tiêu chuẩn cho Optimism hoạt động như thế nào? Tại sao nó lại hoạt động theo cách này?
+author: Ori Pomerantz
+tags: [ "solidity", "cầu nối", "lớp 2" ]
+skill: intermediate
+published: 2022-03-30
+lang: vi
+---
+
+[Optimism](https://www.optimism.io/) là một [gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups/).
+Các gộp giao dịch lạc quan có thể xử lý các giao dịch với mức giá thấp hơn nhiều so với Ethereum Mainnet (còn được gọi là lớp 1 hoặc L1) vì các giao dịch chỉ được xử lý bởi một vài nút, thay vì mọi nút trên mạng.
+Đồng thời, tất cả dữ liệu được ghi vào L1 để mọi thứ có thể được chứng minh và tái tạo lại với tất cả sự đảm bảo về tính toàn vẹn và tính khả dụng của Mainnet.
+
+Để sử dụng tài sản L1 trên Optimism (hoặc bất kỳ L2 nào khác), tài sản cần được [bắc cầu](/bridges/#prerequisites).
+Một cách để thực hiện điều này là người dùng khóa tài sản (ETH và [token ERC-20](/developers/docs/standards/tokens/erc-20/) là những tài sản phổ biến nhất) trên L1, và nhận tài sản tương đương để sử dụng trên L2.
+Cuối cùng, bất cứ ai sở hữu chúng đều có thể muốn bắc cầu chúng trở lại L1.
+Khi làm điều này, các tài sản sẽ bị đốt trên L2 và sau đó được trả lại cho người dùng trên L1.
+
+Đây là cách mà [cầu nối tiêu chuẩn của Optimism](https://docs.optimism.io/app-developers/bridging/standard-bridge) hoạt động.
+Trong bài viết này, chúng ta sẽ xem qua mã nguồn của cầu nối đó để xem nó hoạt động như thế nào và nghiên cứu nó như một ví dụ về mã Solidity được viết tốt.
+
+## Luồng điều khiển {#control-flows}
+
+Cầu nối có hai luồng chính:
+
+- Gửi tiền (từ L1 đến L2)
+- Rút tiền (từ L2 đến L1)
+
+### Luồng gửi tiền {#deposit-flow}
+
+#### Lớp 1 {#deposit-flow-layer-1}
+
+1. Nếu gửi một ERC-20, người gửi cấp cho cầu nối một khoản phụ cấp để chi tiêu số tiền đang được gửi
+2. Người gửi gọi cầu nối L1 (`depositERC20`, `depositERC20To`, `depositETH`, hoặc `depositETHTo`)
+3. Cầu nối L1 nắm giữ tài sản được bắc cầu
+ - ETH: Tài sản được người gửi chuyển như một phần của lệnh gọi
+ - ERC-20: Tài sản được cầu nối tự chuyển cho chính nó bằng cách sử dụng khoản phụ cấp do người gửi cung cấp
+4. Cầu nối L1 sử dụng cơ chế thông điệp liên miền để gọi `finalizeDeposit` trên cầu nối L2
+
+#### Lớp 2 {#deposit-flow-layer-2}
+
+5. Cầu nối L2 xác minh lệnh gọi đến `finalizeDeposit` là hợp lệ:
+ - Đến từ hợp đồng thông điệp liên miền
+ - Ban đầu đến từ cầu nối trên L1
+6. Cầu nối L2 kiểm tra xem hợp đồng token ERC-20 trên L2 có phải là hợp đồng chính xác không:
+ - Hợp đồng L2 báo cáo rằng đối tác L1 của nó giống với hợp đồng mà các token đến từ đó trên L1
+ - Hợp đồng L2 báo cáo rằng nó hỗ trợ giao diện chính xác ([sử dụng ERC-165](https://eips.ethereum.org/EIPS/eip-165)).
+7. Nếu hợp đồng L2 là hợp đồng chính xác, hãy gọi nó để đúc số lượng token thích hợp vào địa chỉ thích hợp. Nếu không, hãy bắt đầu quy trình rút tiền để cho phép người dùng nhận lại các token trên L1.
+
+### Luồng rút tiền {#withdrawal-flow}
+
+#### Lớp 2 {#withdrawal-flow-layer-2}
+
+1. Người rút gọi cầu nối L2 (`withdraw` hoặc `withdrawTo`)
+2. Cầu nối L2 đốt số lượng token thích hợp thuộc về `msg.sender`
+3. Cầu nối L2 sử dụng cơ chế thông điệp liên miền để gọi `finalizeETHWithdrawal` hoặc `finalizeERC20Withdrawal` trên cầu nối L1
+
+#### Lớp 1 {#withdrawal-flow-layer-1}
+
+4. Cầu nối L1 xác minh lệnh gọi đến `finalizeETHWithdrawal` hoặc `finalizeERC20Withdrawal` là hợp lệ:
+ - Đến từ cơ chế thông điệp liên miền
+ - Ban đầu đến từ cầu nối trên L2
+5. Cầu nối L1 chuyển tài sản thích hợp (ETH hoặc ERC-20) đến địa chỉ thích hợp
+
+## Mã lớp 1 {#layer-1-code}
+
+Đây là mã chạy trên L1, Ethereum Mainnet.
+
+### IL1ERC20Bridge {#IL1ERC20Bridge}
+
+[Giao diện này được định nghĩa ở đây](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol).
+Nó bao gồm các hàm và định nghĩa cần thiết để bắc cầu các token ERC-20.
+
+```solidity
+// SPDX-License-Identifier: MIT
+```
+
+[Hầu hết mã của Optimism được phát hành theo giấy phép 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;
+```
+
+Tại thời điểm viết bài, phiên bản mới nhất của Solidity là 0.8.12.
+Cho đến khi phiên bản 0.9.0 được phát hành, chúng tôi không biết liệu mã này có tương thích với nó hay không.
+
+```solidity
+/**
+ * @title IL1ERC20Bridge
+ */
+interface IL1ERC20Bridge {
+ /**********
+ * Các sự kiện *
+ **********/
+
+ event ERC20DepositInitiated(
+```
+
+Trong thuật ngữ cầu nối Optimism _deposit_ (gửi tiền) có nghĩa là chuyển từ L1 sang L2, và _withdrawal_ (rút tiền) có nghĩa là chuyển từ L2 sang L1.
+
+```solidity
+ address indexed _l1Token,
+ address indexed _l2Token,
+```
+
+Trong hầu hết các trường hợp, địa chỉ của một ERC-20 trên L1 không giống với địa chỉ của ERC-20 tương đương trên L2.
+[Bạn có thể xem danh sách các địa chỉ token ở đây](https://static.optimism.io/optimism.tokenlist.json).
+Địa chỉ có `chainId` 1 là trên L1 (Mainnet) và địa chỉ có `chainId` 10 là trên L2 (Optimism).
+Hai giá trị `chainId` còn lại dành cho mạng thử nghiệm Kovan (42) và mạng thử nghiệm Optimistic Kovan (69).
+
+```solidity
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+```
+
+Có thể thêm ghi chú vào các giao dịch chuyển tiền, trong trường hợp đó chúng sẽ được thêm vào các sự kiện báo cáo chúng.
+
+```solidity
+ event ERC20WithdrawalFinalized(
+ address indexed _l1Token,
+ address indexed _l2Token,
+ address indexed _from,
+ address _to,
+ uint256 _amount,
+ bytes _data
+ );
+```
+
+Cùng một hợp đồng cầu nối xử lý các giao dịch chuyển tiền theo cả hai hướng.
+Trong trường hợp của cầu nối L1, điều này có nghĩa là khởi tạo gửi tiền và hoàn tất rút tiền.
+
+```solidity
+
+ /********************
+ * Các hàm công khai *
+ ********************/
+
+ /**
+ * @dev lấy địa chỉ của hợp đồng cầu nối L2 tương ứng.
+ * @return Địa chỉ của hợp đồng cầu nối L2 tương ứng.
+ */
+ function l2TokenBridge() external returns (address);
+```
+
+Hàm này không thực sự cần thiết, vì trên L2 nó là một hợp đồng được triển khai trước, vì vậy nó luôn ở địa chỉ `0x4200000000000000000000000000000000000010`.
+Nó ở đây để đối xứng với cầu nối L2, vì địa chỉ của cầu nối L1 _không_ dễ dàng để biết.
+
+```solidity
+ /**
+ * @dev gửi một lượng ERC20 vào số dư của người gọi trên L2.
+ * @param _l1Token Địa chỉ của L1 ERC20 mà chúng ta đang gửi
+ * @param _l2Token Địa chỉ của ERC20 L2 tương ứng của L1
+ * @param _amount Lượng ERC20 cần gửi
+ * @param _l2Gas Giới hạn gas cần thiết để hoàn tất việc gửi tiền trên L2.
+ * @param _data Dữ liệu tùy chọn để chuyển tiếp đến L2. Dữ liệu này được cung cấp
+ * chỉ để thuận tiện cho các hợp đồng bên ngoài. Ngoài việc thực thi một
+ * độ dài tối đa, các hợp đồng này không cung cấp bất kỳ đảm bảo nào về nội dung của nó.
+ */
+ function depositERC20(
+ address _l1Token,
+ address _l2Token,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ ) external;
+```
+
+Tham số `_l2Gas` là lượng gas L2 mà giao dịch được phép chi tiêu.
+[Lên đến một giới hạn nhất định (cao), điều này là miễn phí](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2), vì vậy trừ khi hợp đồng ERC-20 làm điều gì đó thực sự kỳ lạ khi đúc, nó sẽ không phải là một vấn đề.
+Hàm này xử lý kịch bản phổ biến, trong đó người dùng bắc cầu tài sản đến cùng một địa chỉ trên một chuỗi khối khác.
+
+```solidity
+ /**
+ * @dev gửi một lượng ERC20 vào số dư của người nhận trên L2.
+ * @param _l1Token Địa chỉ của L1 ERC20 mà chúng ta đang gửi
+ * @param _l2Token Địa chỉ của ERC20 L2 tương ứng của L1
+ * @param _to Địa chỉ L2 để ghi có khoản rút tiền.
+ * @param _amount Số lượng ERC20 cần gửi.
+ * @param _l2Gas Giới hạn gas cần thiết để hoàn tất việc gửi tiền trên L2.
+ * @param _data Dữ liệu tùy chọn để chuyển tiếp đến L2. Dữ liệu này được cung cấp
+ * chỉ để thuận tiện cho các hợp đồng bên ngoài. Ngoài việc thực thi một
+ * độ dài tối đa, các hợp đồng này không cung cấp bất kỳ đảm bảo nào về nội dung của nó.
+ */
+ function depositERC20To(
+ address _l1Token,
+ address _l2Token,
+ address _to,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ ) external;
+```
+
+Hàm này gần như giống hệt với `depositERC20`, nhưng nó cho phép bạn gửi ERC-20 đến một địa chỉ khác.
+
+```solidity
+ /*************************
+ * Các hàm liên chuỗi *
+ *************************/
+
+ /**
+ * @dev Hoàn tất việc rút tiền từ L2 sang L1 và ghi có tiền vào số dư của người nhận
+ * token ERC20 L1.
+ * Lệnh gọi này sẽ thất bại nếu việc rút tiền đã được khởi tạo từ L2 chưa được hoàn tất.
+ *
+ * @param _l1Token Địa chỉ của token L1 để finalizeWithdrawal.
+ * @param _l2Token Địa chỉ của token L2 nơi việc rút tiền được khởi tạo.
+ * @param _from Địa chỉ L2 khởi tạo giao dịch chuyển tiền.
+ * @param _to Địa chỉ L1 để ghi có khoản rút tiền.
+ * @param _amount Số lượng ERC20 cần gửi.
+ * @param _data Dữ liệu do người gửi cung cấp trên L2. Dữ liệu này được cung cấp
+ * chỉ để thuận tiện cho các hợp đồng bên ngoài. Ngoài việc thực thi một
+ * độ dài tối đa, các hợp đồng này không cung cấp bất kỳ đảm bảo nào về nội dung của nó.
+ */
+ function finalizeERC20Withdrawal(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ ) external;
+}
+```
+
+Việc rút tiền (và các thông điệp khác từ L2 sang L1) trong Optimism là một quy trình hai bước:
+
+1. Một giao dịch khởi tạo trên L2.
+2. Một giao dịch hoàn tất hoặc yêu cầu trên L1.
+ Giao dịch này cần phải xảy ra sau khi [thời gian thử thách lỗi](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) cho giao dịch L2 kết thúc.
+
+### IL1StandardBridge {#il1standardbridge}
+
+[Giao diện này được định nghĩa ở đây](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol).
+Tệp này chứa các định nghĩa sự kiện và hàm cho ETH.
+Các định nghĩa này rất tương tự với những định nghĩa trong `IL1ERC20Bridge` ở trên cho ERC-20.
+
+Giao diện cầu nối được chia thành hai tệp vì một số token ERC-20 yêu cầu xử lý tùy chỉnh và không thể được xử lý bởi cầu nối tiêu chuẩn.
+Bằng cách này, cầu nối tùy chỉnh xử lý một token như vậy có thể triển khai `IL1ERC20Bridge` và không phải bắc cầu cả ETH.
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.9.0;
+
+import "./IL1ERC20Bridge.sol";
+
+/**
+ * @title IL1StandardBridge
+ */
+interface IL1StandardBridge is IL1ERC20Bridge {
+ /**********
+ * Các sự kiện *
+ **********/
+ event ETHDepositInitiated(
+ address indexed _from,
+ address indexed _to,
+ uint256 _amount,
+ bytes _data
+ );
+```
+
+Sự kiện này gần như giống hệt phiên bản ERC-20 (`ERC20DepositInitiated`), ngoại trừ không có địa chỉ token L1 và L2.
+Điều tương tự cũng đúng với các sự kiện và hàm khác.
+
+```solidity
+ event ETHWithdrawalFinalized(
+ .
+ .
+ .
+ );
+
+ /********************
+ * Các hàm công khai *
+ ********************/
+
+ /**
+ * @dev Gửi một lượng ETH vào số dư của người gọi trên L2.
+ .
+ .
+ .
+ */
+ function depositETH(uint32 _l2Gas, bytes calldata _data) external payable;
+
+ /**
+ * @dev Gửi một lượng ETH vào số dư của người nhận trên L2.
+ .
+ .
+ .
+ */
+ function depositETHTo(
+ address _to,
+ uint32 _l2Gas,
+ bytes calldata _data
+ ) external payable;
+
+ /*************************
+ * Các hàm liên chuỗi *
+ *************************/
+
+ /**
+ * @dev Hoàn tất việc rút tiền từ L2 sang L1 và ghi có tiền vào số dư của người nhận
+ * token L1 ETH. Vì chỉ có xDomainMessenger mới có thể gọi hàm này, nên nó sẽ không bao giờ được gọi
+ * trước khi việc rút tiền được hoàn tất.
+ .
+ .
+ .
+ */
+ function finalizeETHWithdrawal(
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ ) external;
+}
+```
+
+### CrossDomainEnabled {#crossdomainenabled}
+
+[Hợp đồng này](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol) được kế thừa bởi cả hai cầu nối ([L1](#the-l1-bridge-contract) và [L2](#the-l2-bridge-contract)) để gửi thông điệp đến lớp kia.
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity >0.5.0 <0.9.0;
+
+/* Interface Imports */
+import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol";
+```
+
+[Giao diện này](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol) cho hợp đồng biết cách gửi thông điệp đến lớp kia, sử dụng trình nhắn tin liên miền.
+Trình nhắn tin liên miền này là một hệ thống hoàn toàn khác, và xứng đáng có một bài viết riêng, mà tôi hy vọng sẽ viết trong tương lai.
+
+```solidity
+/**
+ * @title CrossDomainEnabled
+ * @dev Hợp đồng trợ giúp cho các hợp đồng thực hiện giao tiếp liên miền
+ *
+ * Trình biên dịch được sử dụng: được định nghĩa bởi hợp đồng kế thừa
+ */
+contract CrossDomainEnabled {
+ /*************
+ * Biến *
+ *************/
+
+ // Hợp đồng Messenger được sử dụng để gửi và nhận thông điệp từ miền khác.
+ address public messenger;
+
+ /***************
+ * Hàm dựng *
+ ***************/
+
+ /**
+ * @param _messenger Địa chỉ của CrossDomainMessenger trên lớp hiện tại.
+ */
+ constructor(address _messenger) {
+ messenger = _messenger;
+ }
+```
+
+Tham số duy nhất mà hợp đồng cần biết, địa chỉ của trình nhắn tin liên miền trên lớp này.
+Tham số này được thiết lập một lần trong hàm dựng và không bao giờ thay đổi.
+
+```solidity
+
+ /**********************
+ * Bổ ngữ hàm *
+ **********************/
+
+ /**
+ * @dev Chỉ cho phép hàm được sửa đổi được gọi bởi một tài khoản liên miền cụ thể.
+ * @param _sourceDomainAccount Tài khoản duy nhất trên miền gốc được
+ * xác thực để gọi hàm này.
+ */
+ modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {
+```
+
+Cơ chế nhắn tin liên miền có thể được truy cập bởi bất kỳ hợp đồng nào trên chuỗi khối nơi nó đang chạy (hoặc mainnet Ethereum hoặc Optimism).
+Nhưng chúng ta cần cầu nối ở mỗi bên _chỉ_ tin cậy một số thông điệp nhất định nếu chúng đến từ cầu nối ở bên kia.
+
+```solidity
+ require(
+ msg.sender == address(getCrossDomainMessenger()),
+ "OVM_XCHAIN: messenger contract unauthenticated"
+ );
+```
+
+Chỉ các thông điệp từ trình nhắn tin liên miền thích hợp (`messenger`, như bạn thấy bên dưới) mới có thể được tin cậy.
+
+```solidity
+
+ require(
+ getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount,
+ "OVM_XCHAIN: wrong sender of cross-domain message"
+ );
+```
+
+Cách mà trình nhắn tin liên miền cung cấp địa chỉ đã gửi một thông điệp với lớp kia là [hàm `.xDomainMessageSender()`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128).
+Miễn là nó được gọi trong giao dịch được khởi tạo bởi thông điệp, nó có thể cung cấp thông tin này.
+
+Chúng ta cần đảm bảo rằng thông điệp chúng ta nhận được đến từ cầu nối kia.
+
+```solidity
+
+ _;
+ }
+
+ /**********************
+ * Các hàm nội bộ *
+ **********************/
+
+ /**
+ * @dev Lấy trình nhắn tin, thường từ bộ nhớ lưu trữ. Hàm này được hiển thị trong trường hợp một hợp đồng con
+ * cần ghi đè.
+ * @return Địa chỉ của hợp đồng trình nhắn tin liên miền nên được sử dụng.
+ */
+ function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {
+ return ICrossDomainMessenger(messenger);
+ }
+```
+
+Hàm này trả về trình nhắn tin liên miền.
+Chúng tôi sử dụng một hàm thay vì biến `messenger` để cho phép các hợp đồng kế thừa từ hợp đồng này sử dụng một thuật toán để chỉ định trình nhắn tin liên miền nào sẽ sử dụng.
+
+```solidity
+
+ /**
+ * Gửi một thông điệp đến một tài khoản trên một miền khác
+ * @param _crossDomainTarget Người nhận dự định trên miền đích
+ * @param _message Dữ liệu để gửi đến mục tiêu (thường là calldata cho một hàm với
+ * `onlyFromCrossDomainAccount()`)
+ * @param _gasLimit gasLimit cho việc nhận thông điệp trên miền đích.
+ */
+ function sendCrossDomainMessage(
+ address _crossDomainTarget,
+ uint32 _gasLimit,
+ bytes memory _message
+```
+
+Cuối cùng là hàm gửi thông điệp đến lớp kia.
+
+```solidity
+ ) internal {
+ // slither-disable-next-line reentrancy-events, reentrancy-benign
+```
+
+[Slither](https://github.com/crytic/slither) là một trình phân tích tĩnh mà Optimism chạy trên mọi hợp đồng để tìm kiếm các lỗ hổng và các vấn đề tiềm ẩn khác.
+Trong trường hợp này, dòng sau đây kích hoạt hai lỗ hổng:
+
+1. [Sự kiện tái nhập](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3)
+2. [Tái nhập lành tính](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2)
+
+```solidity
+ getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);
+ }
+}
+```
+
+Trong trường hợp này, chúng tôi không lo lắng về việc tái nhập, chúng tôi biết `getCrossDomainMessenger()` trả về một địa chỉ đáng tin cậy, ngay cả khi Slither không có cách nào để biết điều đó.
+
+### Hợp đồng cầu nối L1 {#the-l1-bridge-contract}
+
+[Mã nguồn của hợp đồng này ở đây](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;
+```
+
+Các giao diện có thể là một phần của các hợp đồng khác, vì vậy chúng phải hỗ trợ một loạt các phiên bản Solidity.
+Nhưng bản thân cầu nối là hợp đồng của chúng tôi, và chúng tôi có thể nghiêm ngặt về phiên bản Solidity mà nó sử dụng.
+
+```solidity
+/* Interface Imports */
+import { IL1StandardBridge } from "./IL1StandardBridge.sol";
+import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol";
+```
+
+[IL1ERC20Bridge](#IL1ERC20Bridge) và [IL1StandardBridge](#IL1StandardBridge) được giải thích ở trên.
+
+```solidity
+import { IL2ERC20Bridge } from "../../L2/messaging/IL2ERC20Bridge.sol";
+```
+
+[Giao diện này](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) cho phép chúng ta tạo thông điệp để điều khiển cầu nối tiêu chuẩn trên L2.
+
+```solidity
+import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+```
+
+[Giao diện này](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) cho phép chúng ta điều khiển các hợp đồng ERC-20.
+[Bạn có thể đọc thêm về nó ở đây](/developers/tutorials/erc20-annotated-code/#the-interface).
+
+```solidity
+/* Library Imports */
+import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol";
+```
+
+[Như đã giải thích ở trên](#crossdomainenabled), hợp đồng này được sử dụng để nhắn tin giữa các lớp.
+
+```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) có các địa chỉ cho các hợp đồng L2 luôn có cùng một địa chỉ. Điều này bao gồm cầu nối tiêu chuẩn trên L2.
+
+```solidity
+import { Address } from "@openzeppelin/contracts/utils/Address.sol";
+```
+
+[Các tiện ích Địa chỉ của OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol). Nó được sử dụng để phân biệt giữa các địa chỉ hợp đồng và những địa chỉ thuộc về tài khoản sở hữu bên ngoài (EOA).
+
+Lưu ý rằng đây không phải là một giải pháp hoàn hảo, vì không có cách nào để phân biệt giữa các lệnh gọi trực tiếp và các lệnh gọi được thực hiện từ hàm dựng của hợp đồng, nhưng ít nhất điều này cho phép chúng tôi xác định và ngăn chặn một số lỗi người dùng phổ biến.
+
+```solidity
+import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
+```
+
+[Tiêu chuẩn ERC-20](https://eips.ethereum.org/EIPS/eip-20) hỗ trợ hai cách để một hợp đồng báo cáo lỗi:
+
+1. Hoàn nguyên
+2. Trả về `false`
+
+Xử lý cả hai trường hợp sẽ làm cho mã của chúng ta phức tạp hơn, vì vậy thay vào đó chúng ta sử dụng [`SafeERC20` của OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol), đảm bảo [tất cả các lỗi đều dẫn đến việc hoàn nguyên](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96).
+
+```solidity
+/**
+ * @title L1StandardBridge
+ * @dev Cầu nối L1 ETH và ERC20 là một hợp đồng lưu trữ các khoản tiền L1 đã gửi và các token tiêu chuẩn
+ * đang được sử dụng trên L2. Nó đồng bộ hóa một Cầu nối L2 tương ứng, thông báo cho nó về các khoản tiền gửi
+ * và lắng nghe nó về các khoản rút tiền mới được hoàn tất.
+ *
+ */
+contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {
+ using SafeERC20 for IERC20;
+```
+
+Dòng này là cách chúng ta chỉ định sử dụng trình bao bọc `SafeERC20` mỗi khi chúng ta sử dụng giao diện `IERC20`.
+
+```solidity
+
+ /********************************
+ * Tham chiếu Hợp đồng Bên ngoài *
+ ********************************/
+
+ address public l2TokenBridge;
+```
+
+Địa chỉ của [L2StandardBridge](#the-l2-bridge-contract).
+
+```solidity
+
+ // Ánh xạ token L1 đến token L2 đến số dư của token L1 đã gửi
+ mapping(address => mapping(address => uint256)) public deposits;
+```
+
+Một [ánh xạ](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) kép như thế này là cách bạn định nghĩa một [mảng thưa hai chiều](https://en.wikipedia.org/wiki/Sparse_matrix).
+Các giá trị trong cấu trúc dữ liệu này được xác định là `deposit[địa chỉ token L1][địa chỉ token L2]`.
+Giá trị mặc định là không.
+Chỉ các ô được thiết lập thành một giá trị khác mới được ghi vào bộ nhớ lưu trữ.
+
+```solidity
+
+ /***************
+ * Hàm dựng *
+ ***************/
+
+ // Hợp đồng này hoạt động đằng sau một proxy, vì vậy các tham số của hàm dựng sẽ không được sử dụng.
+ constructor() CrossDomainEnabled(address(0)) {}
+```
+
+Để có thể nâng cấp hợp đồng này mà không cần phải sao chép tất cả các biến trong bộ nhớ lưu trữ.
+Để làm điều đó, chúng tôi sử dụng một [`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy), một hợp đồng sử dụng [`delegatecall`](https://solidity-by-example.org/delegatecall/) để chuyển các lệnh gọi đến một hợp đồng riêng biệt có địa chỉ được lưu trữ bởi hợp đồng proxy (khi bạn nâng cấp, bạn yêu cầu proxy thay đổi địa chỉ đó).
+Khi bạn sử dụng `delegatecall`, bộ nhớ lưu trữ vẫn là bộ nhớ lưu trữ của hợp đồng _gọi_, vì vậy giá trị của tất cả các biến trạng thái hợp đồng không bị ảnh hưởng.
+
+Một ảnh hưởng của mô hình này là bộ nhớ lưu trữ của hợp đồng được _gọi_ của `delegatecall` không được sử dụng và do đó các giá trị hàm dựng được truyền cho nó không quan trọng.
+Đây là lý do chúng ta có thể cung cấp một giá trị vô nghĩa cho hàm dựng `CrossDomainEnabled`.
+Đó cũng là lý do tại sao việc khởi tạo bên dưới được tách biệt khỏi hàm dựng.
+
+```solidity
+ /******************
+ * Khởi tạo *
+ ******************/
+
+ /**
+ * @param _l1messenger Địa chỉ L1 Messenger đang được sử dụng để giao tiếp liên chuỗi.
+ * @param _l2TokenBridge Địa chỉ cầu nối tiêu chuẩn L2.
+ */
+ // slither-disable-next-line external-function
+```
+
+[Thử nghiệm Slither này](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) xác định các hàm không được gọi từ mã hợp đồng và do đó có thể được khai báo `external` thay vì `public`.
+Chi phí gas của các hàm `external` có thể thấp hơn, vì chúng có thể được cung cấp các tham số trong calldata.
+Các hàm được khai báo là `public` phải có thể truy cập được từ bên trong hợp đồng.
+Các hợp đồng không thể sửa đổi calldata của chính chúng, vì vậy các tham số phải ở trong bộ nhớ.
+Khi một hàm như vậy được gọi từ bên ngoài, cần phải sao chép calldata vào bộ nhớ, điều này tốn gas.
+Trong trường hợp này, hàm chỉ được gọi một lần, vì vậy sự thiếu hiệu quả không quan trọng đối với chúng tôi.
+
+```solidity
+ function initialize(address _l1messenger, address _l2TokenBridge) public {
+ require(messenger == address(0), "Contract has already been initialized.");
+```
+
+Hàm `initialize` chỉ nên được gọi một lần.
+Nếu địa chỉ của trình nhắn tin liên miền L1 hoặc cầu nối token L2 thay đổi, chúng tôi tạo một proxy mới và một cầu nối mới gọi nó.
+Điều này không có khả năng xảy ra ngoại trừ khi toàn bộ hệ thống được nâng cấp, một sự kiện rất hiếm.
+
+Lưu ý rằng hàm này không có bất kỳ cơ chế nào hạn chế _ai_ có thể gọi nó.
+Điều này có nghĩa là về mặt lý thuyết, một kẻ tấn công có thể đợi cho đến khi chúng tôi triển khai proxy và phiên bản đầu tiên của cầu nối, sau đó [chạy trước](https://solidity-by-example.org/hacks/front-running/) để đến hàm `initialize` trước người dùng hợp pháp. Nhưng có hai phương pháp để ngăn chặn điều này:
+
+1. Nếu các hợp đồng không được triển khai trực tiếp bởi một EOA mà [trong một giao dịch có một hợp đồng khác tạo ra chúng](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595), toàn bộ quá trình có thể là nguyên tử, và kết thúc trước khi bất kỳ giao dịch nào khác được thực hiện.
+2. Nếu lệnh gọi hợp pháp đến `initialize` thất bại, luôn có thể bỏ qua proxy và cầu nối mới được tạo và tạo ra những cái mới.
+
+```solidity
+ messenger = _l1messenger;
+ l2TokenBridge = _l2TokenBridge;
+ }
+```
+
+Đây là hai tham số mà cầu nối cần biết.
+
+```solidity
+
+ /**************
+ * Gửi tiền *
+ **************/
+
+ /** @dev Bổ ngữ yêu cầu người gửi phải là EOA. Kiểm tra này có thể bị bỏ qua bởi một hợp đồng
+ * độc hại thông qua initcode, nhưng nó xử lý lỗi người dùng mà chúng tôi muốn tránh.
+ */
+ modifier onlyEOA() {
+ // Được sử dụng để ngăn chặn việc gửi tiền từ các hợp đồng (tránh mất token do nhầm lẫn)
+ require(!Address.isContract(msg.sender), "Account not EOA");
+ _;
+ }
+```
+
+Đây là lý do chúng ta cần các tiện ích `Address` của OpenZeppelin.
+
+```solidity
+ /**
+ * @dev Hàm này có thể được gọi mà không có dữ liệu
+ * để gửi một lượng ETH vào số dư của người gọi trên L2.
+ * Vì hàm nhận không lấy dữ liệu, một lượng
+ * mặc định thận trọng được chuyển tiếp đến L2.
+ */
+ receive() external payable onlyEOA {
+ _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes(""));
+ }
+```
+
+Hàm này tồn tại cho mục đích thử nghiệm.
+Lưu ý rằng nó không xuất hiện trong các định nghĩa giao diện - nó không dành cho việc sử dụng thông thường.
+
+```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);
+ }
+```
+
+Hai hàm này là các trình bao bọc xung quanh `_initiateETHDeposit`, hàm xử lý việc gửi ETH thực tế.
+
+```solidity
+ /**
+ * @dev Thực hiện logic gửi tiền bằng cách lưu trữ ETH và thông báo cho Cổng ETH L2
+ * về việc gửi tiền.
+ * @param _from Tài khoản để lấy tiền gửi từ L1.
+ * @param _to Tài khoản để cấp tiền gửi trên L2.
+ * @param _l2Gas Giới hạn gas cần thiết để hoàn tất việc gửi tiền trên L2.
+ * @param _data Dữ liệu tùy chọn để chuyển tiếp đến L2. Dữ liệu này được cung cấp
+ * chỉ để thuận tiện cho các hợp đồng bên ngoài. Ngoài việc thực thi một
+ * độ dài tối đa, các hợp đồng này không cung cấp bất kỳ đảm bảo nào về nội dung của nó.
+ */
+ function _initiateETHDeposit(
+ address _from,
+ address _to,
+ uint32 _l2Gas,
+ bytes memory _data
+ ) internal {
+ // Xây dựng calldata cho lệnh gọi finalizeDeposit
+ bytes memory message = abi.encodeWithSelector(
+```
+
+Cách thức hoạt động của các thông điệp liên miền là hợp đồng đích được gọi với thông điệp làm calldata của nó.
+Các hợp đồng Solidity luôn diễn giải calldata của chúng theo
+[các thông số kỹ thuật ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html).
+Hàm Solidity [`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions) tạo ra calldata đó.
+
+```solidity
+ IL2ERC20Bridge.finalizeDeposit.selector,
+ address(0),
+ Lib_PredeployAddresses.OVM_ETH,
+ _from,
+ _to,
+ msg.value,
+ _data
+ );
+```
+
+Thông điệp ở đây là để gọi [hàm `finalizeDeposit`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) với các tham số này:
+
+| Thông số | Giá trị | Ý nghĩa |
+| ------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| \_l1Token | address(0) | Giá trị đặc biệt để đại diện cho ETH (không phải là một token ERC-20) trên L1 |
+| \_l2Token | Lib_PredeployAddresses.OVM_ETH | Hợp đồng L2 quản lý ETH trên Optimism, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (hợp đồng này chỉ dành cho mục đích sử dụng nội bộ của Optimism) |
+| \_from | \_from | Địa chỉ trên L1 gửi ETH |
+| \_to | \_to | Địa chỉ trên L2 nhận ETH |
+| số lượng | msg.value | Số lượng wei đã gửi (đã được gửi đến cầu nối) |
+| \_data | \_data | Dữ liệu bổ sung để đính kèm vào khoản tiền gửi |
+
+```solidity
+ // Gửi calldata vào L2
+ // slither-disable-next-line reentrancy-events
+ sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);
+```
+
+Gửi thông điệp thông qua trình nhắn tin liên miền.
+
+```solidity
+ // slither-disable-next-line reentrancy-events
+ emit ETHDepositInitiated(_from, _to, msg.value, _data);
+ }
+```
+
+Phát ra một sự kiện để thông báo cho bất kỳ ứng dụng phi tập trung nào đang lắng nghe về giao dịch chuyển tiền này.
+
+```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);
+ }
+```
+
+Hai hàm này là các trình bao bọc xung quanh `_initiateERC20Deposit`, hàm xử lý việc gửi ERC-20 thực tế.
+
+```solidity
+ /**
+ * @dev Thực hiện logic gửi tiền bằng cách thông báo cho Token đã gửi L2
+ * hợp đồng về việc gửi tiền và gọi một trình xử lý để khóa các khoản tiền L1. (ví dụ, transferFrom)
+ *
+ * @param _l1Token Địa chỉ của L1 ERC20 chúng ta đang gửi
+ * @param _l2Token Địa chỉ của ERC20 L2 tương ứng của L1
+ * @param _from Tài khoản để lấy tiền gửi từ L1
+ * @param _to Tài khoản để cấp tiền gửi trên L2
+ * @param _amount Số lượng ERC20 cần gửi.
+ * @param _l2Gas Giới hạn gas cần thiết để hoàn tất việc gửi tiền trên L2.
+ * @param _data Dữ liệu tùy chọn để chuyển tiếp đến L2. Dữ liệu này được cung cấp
+ * chỉ để thuận tiện cho các hợp đồng bên ngoài. Ngoài việc thực thi một
+ * độ dài tối đa, các hợp đồng này không cung cấp bất kỳ đảm bảo nào về nội dung của nó.
+ */
+ function _initiateERC20Deposit(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ uint32 _l2Gas,
+ bytes calldata _data
+ ) internal {
+```
+
+Hàm này tương tự như `_initiateETHDeposit` ở trên, với một vài khác biệt quan trọng.
+Sự khác biệt đầu tiên là hàm này nhận các địa chỉ token và số lượng cần chuyển làm tham số.
+Trong trường hợp ETH, lệnh gọi đến cầu nối đã bao gồm việc chuyển tài sản đến tài khoản cầu nối (`msg.value`).
+
+```solidity
+ // Khi một khoản tiền gửi được khởi tạo trên L1, Cầu nối L1 sẽ chuyển tiền vào chính nó cho các khoản
+ // rút tiền trong tương lai. safeTransferFrom cũng kiểm tra xem hợp đồng có mã hay không, vì vậy điều này sẽ thất bại nếu
+ // _from là một EOA hoặc address(0).
+ // slither-disable-next-line reentrancy-events, reentrancy-benign
+ IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);
+```
+
+Việc chuyển token ERC-20 theo một quy trình khác với ETH:
+
+1. Người dùng (`_from`) cấp cho cầu nối một khoản phụ cấp để chuyển các token thích hợp.
+2. Người dùng gọi cầu nối với địa chỉ của hợp đồng token, số lượng, v.v.
+3. Cầu nối chuyển các token (cho chính nó) như một phần của quá trình gửi tiền.
+
+Bước đầu tiên có thể xảy ra trong một giao dịch riêng biệt so với hai bước cuối cùng.
+Tuy nhiên, chạy trước không phải là một vấn đề vì hai hàm gọi `_initiateERC20Deposit` (`depositERC20` và `depositERC20To`) chỉ gọi hàm này với `msg.sender` làm tham số `_from`.
+
+```solidity
+ // Xây dựng calldata cho _l2Token.finalizeDeposit(_to, _amount)
+ bytes memory message = abi.encodeWithSelector(
+ IL2ERC20Bridge.finalizeDeposit.selector,
+ _l1Token,
+ _l2Token,
+ _from,
+ _to,
+ _amount,
+ _data
+ );
+
+ // Gửi calldata vào 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;
+```
+
+Thêm số lượng token đã gửi vào cấu trúc dữ liệu `deposits`.
+Có thể có nhiều địa chỉ trên L2 tương ứng với cùng một token L1 ERC-20, vì vậy không đủ để sử dụng số dư của token L1 ERC-20 của cầu nối để theo dõi các khoản tiền gửi.
+
+```solidity
+
+ // slither-disable-next-line reentrancy-events
+ emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+
+ /*************************
+ * Các hàm liên chuỗi *
+ *************************/
+
+ /**
+ * @inheritdoc IL1StandardBridge
+ */
+ function finalizeETHWithdrawal(
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+```
+
+Cầu nối L2 gửi một thông điệp đến trình nhắn tin liên miền L2, điều này khiến trình nhắn tin liên miền L1 gọi hàm này (tất nhiên, một khi [giao dịch hoàn tất thông điệp](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions) được gửi trên L1).
+
+```solidity
+ ) external onlyFromCrossDomainAccount(l2TokenBridge) {
+```
+
+Đảm bảo rằng đây là một thông điệp _hợp lệ_, đến từ trình nhắn tin liên miền và bắt nguồn từ cầu nối token L2.
+Hàm này được sử dụng để rút ETH từ cầu nối, vì vậy chúng ta phải đảm bảo nó chỉ được gọi bởi người gọi được ủy quyền.
+
+```solidity
+ // slither-disable-next-line reentrancy-events
+ (bool success, ) = _to.call{ value: _amount }(new bytes(0));
+```
+
+Cách để chuyển ETH là gọi người nhận với số lượng wei trong `msg.value`.
+
+```solidity
+ require(success, "TransferHelper::safeTransferETH: ETH transfer failed");
+
+ // slither-disable-next-line reentrancy-events
+ emit ETHWithdrawalFinalized(_from, _to, _amount, _data);
+```
+
+Phát ra một sự kiện về việc rút tiền.
+
+```solidity
+ }
+
+ /**
+ * @inheritdoc IL1ERC20Bridge
+ */
+ function finalizeERC20Withdrawal(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+ ) external onlyFromCrossDomainAccount(l2TokenBridge) {
+```
+
+Hàm này tương tự như `finalizeETHWithdrawal` ở trên, với những thay đổi cần thiết cho các token ERC-20.
+
+```solidity
+ deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;
+```
+
+Cập nhật cấu trúc dữ liệu `deposits`.
+
+```solidity
+
+ // Khi một khoản rút tiền được hoàn tất trên L1, Cầu nối L1 sẽ chuyển tiền cho người rút
+ // 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);
+ }
+
+
+ /*****************************
+ * Tạm thời - Di chuyển ETH *
+ *****************************/
+
+ /**
+ * @dev Thêm số dư ETH vào tài khoản. Điều này nhằm cho phép ETH
+ * được di chuyển từ một cổng cũ sang một cổng mới.
+ * LƯU Ý: Điều này được để lại cho một lần nâng cấp duy nhất để chúng tôi có thể nhận được ETH đã di chuyển từ
+ * hợp đồng cũ
+ */
+ function donateETH() external payable {}
+}
+```
+
+Có một triển khai trước đó của cầu nối.
+Khi chúng tôi chuyển từ triển khai đó sang triển khai này, chúng tôi đã phải di chuyển tất cả các tài sản.
+Các token ERC-20 chỉ cần được di chuyển.
+Tuy nhiên, để chuyển ETH đến một hợp đồng, bạn cần sự chấp thuận của hợp đồng đó, đó là điều mà `donateETH` cung cấp cho chúng tôi.
+
+## Các token ERC-20 trên L2 {#erc-20-tokens-on-l2}
+
+Để một token ERC-20 phù hợp với cầu nối tiêu chuẩn, nó cần cho phép cầu nối tiêu chuẩn, và _chỉ_ cầu nối tiêu chuẩn, đúc token.
+Điều này là cần thiết vì các cầu nối cần đảm bảo rằng số lượng token lưu hành trên Optimism bằng với số lượng token bị khóa bên trong hợp đồng cầu nối L1.
+Nếu có quá nhiều token trên L2, một số người dùng sẽ không thể bắc cầu tài sản của họ trở lại L1.
+Thay vì một cầu nối đáng tin cậy, chúng ta về cơ bản sẽ tái tạo lại [hệ thống ngân hàng dự trữ một phần](https://www.investopedia.com/terms/f/fractionalreservebanking.asp).
+Nếu có quá nhiều token trên L1, một số token đó sẽ bị khóa bên trong hợp đồng cầu nối mãi mãi vì không có cách nào để giải phóng chúng mà không đốt các token L2.
+
+### IL2StandardERC20 {#il2standarderc20}
+
+Mọi token ERC-20 trên L2 sử dụng cầu nối tiêu chuẩn cần cung cấp [giao diện này](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol), có các hàm và sự kiện mà cầu nối tiêu chuẩn cần.
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.9;
+
+import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+```
+
+[Giao diện ERC-20 tiêu chuẩn](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) không bao gồm các hàm `mint` và `burn`.
+Các phương thức đó không được yêu cầu bởi [tiêu chuẩn ERC-20](https://eips.ethereum.org/EIPS/eip-20), tiêu chuẩn này không chỉ định các cơ chế để tạo và hủy token.
+
+```solidity
+import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+```
+
+[Giao diện ERC-165](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol) được sử dụng để chỉ định các hàm mà một hợp đồng cung cấp.
+[Bạn có thể đọc tiêu chuẩn ở đây](https://eips.ethereum.org/EIPS/eip-165).
+
+```solidity
+interface IL2StandardERC20 is IERC20, IERC165 {
+ function l1Token() external returns (address);
+```
+
+Hàm này cung cấp địa chỉ của token L1 được bắc cầu đến hợp đồng này.
+Lưu ý rằng chúng ta không có một hàm tương tự theo hướng ngược lại.
+Chúng ta cần có thể bắc cầu bất kỳ token L1 nào, bất kể hỗ trợ L2 có được lên kế hoạch khi nó được triển khai hay không.
+
+```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);
+}
+```
+
+Các hàm và sự kiện để đúc (tạo) và đốt (hủy) token.
+Cầu nối nên là thực thể duy nhất có thể chạy các hàm này để đảm bảo số lượng token là chính xác (bằng với số lượng token bị khóa trên L1).
+
+### L2StandardERC20 {#L2StandardERC20}
+
+[Đây là triển khai của chúng tôi về giao diện `IL2StandardERC20`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol).
+Trừ khi bạn cần một loại logic tùy chỉnh nào đó, bạn nên sử dụng cái này.
+
+```solidity
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.9;
+
+import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+```
+
+[Hợp đồng ERC-20 của OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol).
+Optimism không tin vào việc phát minh lại bánh xe, đặc biệt là khi bánh xe được kiểm toán kỹ lưỡng và cần phải đủ đáng tin cậy để giữ tài sản.
+
+```solidity
+import "./IL2StandardERC20.sol";
+
+contract L2StandardERC20 is IL2StandardERC20, ERC20 {
+ address public l1Token;
+ address public l2Bridge;
+```
+
+Đây là hai tham số cấu hình bổ sung mà chúng tôi yêu cầu và ERC-20 thường không có.
+
+```solidity
+
+ /**
+ * @param _l2Bridge Địa chỉ của cầu nối tiêu chuẩn L2.
+ * @param _l1Token Địa chỉ của token L1 tương ứng.
+ * @param _name Tên ERC20.
+ * @param _symbol Ký hiệu ERC20.
+ */
+ constructor(
+ address _l2Bridge,
+ address _l1Token,
+ string memory _name,
+ string memory _symbol
+ ) ERC20(_name, _symbol) {
+ l1Token = _l1Token;
+ l2Bridge = _l2Bridge;
+ }
+```
+
+Đầu tiên gọi hàm dựng cho hợp đồng mà chúng ta kế thừa từ đó (`ERC20(_name, _symbol)`) và sau đó thiết lập các biến của riêng chúng ta.
+
+```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;
+ }
+```
+
+Đây là cách [ERC-165](https://eips.ethereum.org/EIPS/eip-165) hoạt động.
+Mỗi giao diện là một tập hợp các hàm được hỗ trợ và được xác định là kết quả của phép toán [OR độc quyền](https://en.wikipedia.org/wiki/Exclusive_or) của các [bộ chọn hàm ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector) của các hàm đó.
+
+Cầu nối L2 sử dụng ERC-165 như một kiểm tra hợp lý để đảm bảo rằng hợp đồng ERC-20 mà nó gửi tài sản đến là một `IL2StandardERC20`.
+
+**Lưu ý:** Không có gì ngăn cản hợp đồng giả mạo cung cấp câu trả lời sai cho `supportsInterface`, vì vậy đây là một cơ chế kiểm tra hợp lý, _không_ phải là một cơ chế bảo mật.
+
+```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);
+ }
+}
+```
+
+Chỉ có cầu nối L2 mới được phép đúc và đốt tài sản.
+
+`_mint` và `_burn` thực sự được định nghĩa trong [hợp đồng OpenZeppelin ERC-20](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn).
+Hợp đồng đó chỉ không hiển thị chúng ra bên ngoài, vì các điều kiện để đúc và đốt token rất đa dạng như số cách sử dụng ERC-20.
+
+## Mã cầu nối L2 {#l2-bridge-code}
+
+Đây là mã chạy cầu nối trên Optimism.
+[Nguồn của hợp đồng này ở đây](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";
+```
+
+Giao diện [IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) rất tương tự với [tương đương L1](#IL1ERC20Bridge) mà chúng ta đã thấy ở trên.
+Có hai sự khác biệt đáng kể:
+
+1. Trên L1, bạn khởi tạo gửi tiền và hoàn tất rút tiền.
+ Ở đây bạn khởi tạo rút tiền và hoàn tất gửi tiền.
+2. Trên L1, cần phải phân biệt giữa ETH và các token ERC-20.
+ Trên L2, chúng ta có thể sử dụng cùng các hàm cho cả hai vì nội bộ số dư ETH trên Optimism được xử lý như một token ERC-20 với địa chỉ [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://explorer.optimism.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 Cầu nối Tiêu chuẩn L2 là một hợp đồng hoạt động cùng với cầu nối Tiêu chuẩn L1 để
+ * cho phép chuyển đổi ETH và ERC20 giữa L1 và L2.
+ * Hợp đồng này hoạt động như một trình đúc các token mới khi nó nghe về các khoản tiền gửi vào cầu nối Tiêu chuẩn
+ * L1.
+ * Hợp đồng này cũng hoạt động như một trình đốt các token dự định rút, thông báo cho cầu nối L1
+ * để giải phóng các khoản tiền L1.
+ */
+contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {
+ /********************************
+ * Tham chiếu Hợp đồng Bên ngoài *
+ ********************************/
+
+ address public l1TokenBridge;
+```
+
+Theo dõi địa chỉ của cầu nối L1.
+Lưu ý rằng ngược lại với tương đương L1, ở đây chúng ta _cần_ biến này.
+Địa chỉ của cầu nối L1 không được biết trước.
+
+```solidity
+
+ /***************
+ * Hàm dựng *
+ ***************/
+
+ /**
+ * @param _l2CrossDomainMessenger Trình nhắn tin liên miền được sử dụng bởi hợp đồng này.
+ * @param _l1TokenBridge Địa chỉ của cầu nối L1 được triển khai trên chuỗi chính.
+ */
+ constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)
+ CrossDomainEnabled(_l2CrossDomainMessenger)
+ {
+ l1TokenBridge = _l1TokenBridge;
+ }
+
+ /***************
+ * Rút tiền *
+ ***************/
+
+ /**
+ * @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);
+ }
+```
+
+Hai hàm này khởi tạo việc rút tiền.
+Lưu ý rằng không cần phải chỉ định địa chỉ token L1.
+Các token L2 được mong đợi sẽ cho chúng tôi biết địa chỉ tương đương của L1.
+
+```solidity
+
+ /**
+ * @dev Thực hiện logic rút tiền bằng cách đốt token và thông báo
+ * cho Cổng token L1 về việc rút tiền.
+ * @param _l2Token Địa chỉ của token L2 nơi việc rút tiền được khởi tạo.
+ * @param _from Tài khoản để lấy tiền rút từ L2.
+ * @param _to Tài khoản để cấp tiền rút trên L1.
+ * @param _amount Số lượng token cần rút.
+ * @param _l1Gas Không sử dụng, nhưng được bao gồm cho các cân nhắc tương thích về phía trước tiềm năng.
+ * @param _data Dữ liệu tùy chọn để chuyển tiếp đến L1. Dữ liệu này được cung cấp
+ * chỉ để thuận tiện cho các hợp đồng bên ngoài. Ngoài việc thực thi một
+ * độ dài tối đa, các hợp đồng này không cung cấp bất kỳ đảm bảo nào về nội dung của nó.
+ */
+ function _initiateWithdrawal(
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ uint32 _l1Gas,
+ bytes calldata _data
+ ) internal {
+ // Khi một khoản rút tiền được khởi tạo, chúng tôi đốt tiền của người rút để ngăn chặn việc sử dụng L2
+ // sau đó
+ // slither-disable-next-line reentrancy-events
+ IL2StandardERC20(_l2Token).burn(msg.sender, _amount);
+```
+
+Lưu ý rằng chúng tôi _không_ dựa vào tham số `_from` mà vào `msg.sender` khó giả mạo hơn nhiều (không thể, theo như tôi biết).
+
+```solidity
+
+ // Xây dựng calldata cho l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)
+ // slither-disable-next-line reentrancy-events
+ address l1Token = IL2StandardERC20(_l2Token).l1Token();
+ bytes memory message;
+
+ if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {
+```
+
+Trên L1, cần phải phân biệt giữa ETH và 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
+ );
+ }
+
+ // Gửi thông điệp lên cầu nối L1
+ // 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);
+ }
+
+ /************************************
+ * Hàm liên chuỗi: Gửi tiền *
+ ************************************/
+
+ /**
+ * @inheritdoc IL2ERC20Bridge
+ */
+ function finalizeDeposit(
+ address _l1Token,
+ address _l2Token,
+ address _from,
+ address _to,
+ uint256 _amount,
+ bytes calldata _data
+```
+
+Hàm này được gọi bởi `L1StandardBridge`.
+
+```solidity
+ ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {
+```
+
+Đảm bảo nguồn của thông điệp là hợp lệ.
+Điều này quan trọng vì hàm này gọi `_mint` và có thể được sử dụng để cấp các token không được bảo đảm bởi các token mà cầu nối sở hữu trên L1.
+
+```solidity
+ // Kiểm tra token mục tiêu có tuân thủ và
+ // xác minh token đã gửi trên L1 khớp với biểu diễn token đã gửi L2 ở đây
+ if (
+ // slither-disable-next-line reentrancy-events
+ ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&
+ _l1Token == IL2StandardERC20(_l2Token).l1Token()
+```
+
+Các kiểm tra hợp lý:
+
+1. Giao diện chính xác được hỗ trợ
+2. Địa chỉ L1 của hợp đồng ERC-20 L2 khớp với nguồn L1 của các token
+
+```solidity
+ ) {
+ // Khi một khoản tiền gửi được hoàn tất, chúng tôi ghi có vào tài khoản trên L2 với cùng một số lượng
+ // token.
+ // 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);
+```
+
+Nếu các kiểm tra hợp lý vượt qua, hoàn tất việc gửi tiền:
+
+1. Đúc các token
+2. Phát ra sự kiện thích hợp
+
+```solidity
+ } else {
+ // Hoặc token L2 đang được gửi vào không đồng ý về địa chỉ chính xác
+ // của token L1 của nó, hoặc không hỗ trợ giao diện chính xác.
+ // Điều này chỉ nên xảy ra nếu có một token L2 độc hại, hoặc nếu người dùng bằng cách nào đó
+ // chỉ định sai địa chỉ token L2 để gửi vào.
+ // Trong cả hai trường hợp, chúng tôi dừng quá trình ở đây và xây dựng một thông điệp
+ // rút tiền để người dùng có thể lấy lại tiền của họ trong một số trường hợp.
+ // Không có cách nào để ngăn chặn hoàn toàn các hợp đồng token độc hại, nhưng điều này giới hạn
+ // lỗi người dùng và giảm thiểu một số hình thức hành vi hợp đồng độc hại.
+```
+
+Nếu người dùng mắc lỗi có thể phát hiện bằng cách sử dụng sai địa chỉ token L2, chúng tôi muốn hủy bỏ việc gửi tiền và trả lại các token trên L1.
+Cách duy nhất chúng ta có thể làm điều này từ L2 là gửi một thông điệp sẽ phải đợi hết thời gian thử thách lỗi, nhưng điều đó tốt hơn nhiều cho người dùng so với việc mất các token vĩnh viễn.
+
+```solidity
+ bytes memory message = abi.encodeWithSelector(
+ IL1ERC20Bridge.finalizeERC20Withdrawal.selector,
+ _l1Token,
+ _l2Token,
+ _to, // đã hoán đổi _to và _from ở đây để trả lại khoản tiền gửi cho người gửi
+ _from,
+ _amount,
+ _data
+ );
+
+ // Gửi thông điệp lên cầu nối L1
+ // slither-disable-next-line reentrancy-events
+ sendCrossDomainMessage(l1TokenBridge, 0, message);
+ // slither-disable-next-line reentrancy-events
+ emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data);
+ }
+ }
+}
+```
+
+## Kết luận {#conclusion}
+
+Cầu nối tiêu chuẩn là cơ chế linh hoạt nhất cho việc chuyển tài sản.
+Tuy nhiên, vì nó rất chung chung nên không phải lúc nào cũng là cơ chế dễ sử dụng nhất.
+Đặc biệt đối với việc rút tiền, hầu hết người dùng thích sử dụng [các cầu nối của bên thứ ba](https://optimism.io/apps#bridge) không phải chờ đợi hết thời gian thử thách và không yêu cầu bằng chứng Merkle để hoàn tất việc rút tiền.
+
+Các cầu nối này thường hoạt động bằng cách có tài sản trên L1, mà họ cung cấp ngay lập tức với một khoản phí nhỏ (thường ít hơn chi phí gas cho một lần rút tiền qua cầu nối tiêu chuẩn).
+Khi cầu nối (hoặc những người điều hành nó) dự đoán sẽ thiếu tài sản L1, nó sẽ chuyển đủ tài sản từ L2. Vì đây là những khoản rút tiền rất lớn, chi phí rút tiền được phân bổ trên một số lượng lớn và là một tỷ lệ phần trăm nhỏ hơn nhiều.
+
+Hy vọng bài viết này đã giúp bạn hiểu thêm về cách lớp 2 hoạt động, và cách viết mã Solidity rõ ràng và bảo mật.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
diff --git a/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
new file mode 100644
index 00000000000..5d349477c41
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
@@ -0,0 +1,744 @@
+---
+title: "Thiết kế ngược một hợp đồng"
+description: Cách hiểu một hợp đồng khi bạn không có mã nguồn
+author: Ori Pomerantz
+lang: vi
+tags: [ "evm", "mã vận hành" ]
+skill: advanced
+published: 2021-12-30
+---
+
+## Giới thiệu {#introduction}
+
+_Không có bí mật nào trên chuỗi khối_, mọi thứ xảy ra đều nhất quán, có thể kiểm chứng và có sẵn công khai. Lý tưởng nhất là [các hợp đồng nên được công bố và xác minh mã nguồn trên Etherscan](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code). Tuy nhiên, [không phải lúc nào cũng vậy](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code). Trong bài viết này, bạn sẽ học cách thiết kế ngược các hợp đồng bằng cách xem một hợp đồng không có mã nguồn, [`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f).
+
+Có các trình biên dịch ngược, nhưng chúng không phải lúc nào cũng tạo ra [kết quả có thể sử dụng được](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f). Trong bài viết này, bạn sẽ học cách thiết kế ngược thủ công và hiểu một hợp đồng từ [các mã vận hành](https://github.com/wolflo/evm-opcodes), cũng như cách diễn giải kết quả của một trình biên dịch ngược.
+
+Để có thể hiểu bài viết này, bạn nên biết những điều cơ bản về EVM và ít nhất đã phần nào quen thuộc với trình hợp dịch EVM. [Bạn có thể đọc về các chủ đề này ở đây](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e).
+
+## Chuẩn bị mã thực thi {#prepare-the-executable-code}
+
+Bạn có thể lấy mã vận hành bằng cách truy cập Etherscan cho hợp đồng, nhấp vào tab **Hợp đồng** rồi **Chuyển sang Chế độ xem Mã vận hành**. Bạn sẽ có được chế độ xem là một mã vận hành trên mỗi dòng.
+
+
+
+Tuy nhiên, để có thể hiểu các bước nhảy, bạn cần biết mỗi mã vận hành nằm ở đâu trong mã. Để làm điều đó, một cách là mở Google Spreadsheet và dán các mã vận hành vào cột C. [Bạn có thể bỏ qua các bước sau bằng cách tạo một bản sao của bảng tính đã được chuẩn bị sẵn này](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing).
+
+Bước tiếp theo là lấy đúng vị trí mã để chúng ta có thể hiểu được các bước nhảy. Chúng ta sẽ đặt kích thước mã vận hành vào cột B và vị trí (theo hệ thập lục phân) vào cột A. Nhập hàm này vào ô `B1` rồi sao chép và dán vào phần còn lại của cột B, cho đến cuối mã. Sau khi thực hiện xong, bạn có thể ẩn cột B.
+
+```
+=1+IF(REGEXMATCH(C1,"PUSH"),REGEXEXTRACT(C1,"PUSH(\d+)"),0)
+```
+
+Đầu tiên, hàm này thêm một byte cho chính mã vận hành, sau đó tìm kiếm `PUSH`. Mã vận hành đẩy là đặc biệt vì chúng cần có thêm các byte cho giá trị được đẩy. Nếu mã vận hành là `PUSH`, chúng ta sẽ trích xuất số lượng byte và cộng vào đó.
+
+Trong ô `A1`, hãy đặt độ lệch đầu tiên là 0. Sau đó, trong ô `A2`, hãy đặt hàm này và một lần nữa sao chép và dán nó cho phần còn lại của cột A:
+
+```
+=dec2hex(hex2dec(A1)+B1)
+```
+
+Chúng ta cần hàm này để cung cấp giá trị thập lục phân vì các giá trị được đẩy trước các bước nhảy (`JUMP` và `JUMPI`) được cung cấp cho chúng ta dưới dạng thập lục phân.
+
+## Điểm vào (0x00) {#the-entry-point-0x00}
+
+Các hợp đồng luôn được thực thi từ byte đầu tiên. Đây là phần đầu của mã:
+
+| Độ lệch | Mã vận hành | Ngăn xếp (sau mã vận hành) |
+| ------: | ------------ | ---------------------------------------------- |
+| 0 | PUSH1 0x80 | 0x80 |
+| 2 | PUSH1 0x40 | 0x40, 0x80 |
+| 4 | MSTORE | Trống |
+| 5 | PUSH1 0x04 | 0x04 |
+| 7 | CALLDATASIZE | CALLDATASIZE 0x04 |
+| 8 | LT | CALLDATASIZE\<4 |
+| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 |
+| C | JUMPI | Trống |
+
+Mã này thực hiện hai việc:
+
+1. Ghi 0x80 dưới dạng giá trị 32 byte vào các vị trí bộ nhớ 0x40-0x5F (0x80 được lưu trữ trong 0x5F, và 0x40-0x5E đều bằng 0).
+2. Đọc kích thước calldata. Thông thường, dữ liệu cuộc gọi cho hợp đồng Ethereum tuân theo [ABI (giao diện nhị phân ứng dụng)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html), yêu cầu tối thiểu bốn byte cho bộ chọn hàm. Nếu kích thước dữ liệu cuộc gọi nhỏ hơn bốn, hãy nhảy đến 0x5E.
+
+
+
+### Trình xử lý tại 0x5E (cho dữ liệu cuộc gọi không phải ABI) {#the-handler-at-0x5e-for-non-abi-call-data}
+
+| Độ lệch | Mã vận hành |
+| ------: | ------------ |
+| 5E | JUMPDEST |
+| 5F | CALLDATASIZE |
+| 60 | PUSH2 0x007c |
+| 63 | JUMPI |
+
+Đoạn mã này bắt đầu bằng `JUMPDEST`. Các chương trình EVM (máy ảo ethereum) sẽ đưa ra một ngoại lệ nếu bạn nhảy đến một mã vận hành không phải là `JUMPDEST`. Sau đó, nó xem xét CALLDATASIZE, và nếu nó là "true" (nghĩa là không bằng không) thì sẽ nhảy đến 0x7C. Chúng ta sẽ nói về điều đó ở bên dưới.
+
+| Độ lệch | Mã vận hành | Ngăn xếp (sau mã vận hành) |
+| ------: | ----------- | -------------------------------------------------------------------------------------------------------- |
+| 64 | CALLVALUE | [Wei](/glossary/#wei) được cung cấp bởi lệnh gọi. Được gọi là `msg.value` trong 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 | Lưu trữ[6] CALLVALUE 0 6 CALLVALUE |
+
+Vì vậy, khi không có dữ liệu cuộc gọi, chúng ta sẽ đọc giá trị của Lưu trữ[6]. Chúng ta chưa biết giá trị này là gì, nhưng chúng ta có thể tìm kiếm các giao dịch mà hợp đồng đã nhận được mà không có dữ liệu cuộc gọi. Các giao dịch chỉ chuyển ETH mà không có bất kỳ dữ liệu cuộc gọi nào (và do đó không có phương thức nào) có trong Etherscan phương thức `Chuyển`. Trên thực tế, [giao dịch đầu tiên mà hợp đồng nhận được](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7) là một giao dịch chuyển.
+
+Nếu chúng ta xem xét giao dịch đó và nhấp vào **Nhấp để xem thêm**, chúng ta sẽ thấy rằng dữ liệu cuộc gọi, được gọi là dữ liệu đầu vào, thực sự trống (`0x`). Cũng lưu ý rằng giá trị là 1,559 ETH, điều này sẽ có liên quan sau.
+
+
+
+Tiếp theo, nhấp vào tab **Trạng thái** và mở rộng hợp đồng mà chúng ta đang thiết kế ngược (0x2510...). Bạn có thể thấy rằng `Lưu trữ[6]` đã thay đổi trong giao dịch, và nếu bạn đổi Hex thành **Số**, bạn sẽ thấy nó trở thành 1.559.000.000.000.000.000, giá trị được chuyển bằng wei (tôi đã thêm dấu phẩy cho rõ ràng), tương ứng với giá trị hợp đồng tiếp theo.
+
+![Thay đổi trong Lưu trữ[6]](storage6.png)
+
+Nếu chúng ta xem xét các thay đổi trạng thái gây ra bởi [các giao dịch `Chuyển` khác từ cùng thời kỳ](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange), chúng ta thấy rằng `Lưu trữ[6]` đã theo dõi giá trị của hợp đồng trong một thời gian. Hiện tại, chúng ta sẽ gọi nó là `Giá trị*`. Dấu hoa thị (`*`) nhắc nhở chúng ta rằng chúng ta chưa _biết_ biến này làm gì, nhưng nó không thể chỉ để theo dõi giá trị hợp đồng vì không cần sử dụng bộ nhớ, vốn rất tốn kém, khi bạn có thể nhận được số dư tài khoản của mình bằng cách sử dụng `ĐỊA CHỈ SỐ DƯ`. Mã vận hành đầu tiên đẩy địa chỉ riêng của hợp đồng. Mã thứ hai đọc địa chỉ ở đầu ngăn xếp và thay thế nó bằng số dư của địa chỉ đó.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | --------------------------------------------- |
+| 6C | PUSH2 0x0075 | 0x75 Giá trị\* CALLVALUE 0 6 CALLVALUE |
+| 6F | SWAP2 | CALLVALUE Giá trị\* 0x75 0 6 CALLVALUE |
+| 70 | SWAP1 | Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 71 | PUSH2 0x01a7 | 0x01A7 Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 74 | JUMP | |
+
+Chúng ta sẽ tiếp tục theo dõi mã này tại đích nhảy.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | ------------------------------------------------------------- |
+| 1A7 | JUMPDEST | Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1A8 | PUSH1 0x00 | 0x00 Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1AA | DUP3 | CALLVALUE 0x00 Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1AB | NOT | 2^256-CALLVALUE-1 0x00 Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+
+`NOT` là theo bit, vì vậy nó đảo ngược giá trị của mọi bit trong giá trị cuộc gọi.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | ---------------------------------------------------------------------------------------------------------- |
+| 1AC | DUP3 | Giá trị\* 2^256-CALLVALUE-1 0x00 Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1AD | GT | Giá trị\*>2^256-CALLVALUE-1 0x00 Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1AE | ISZERO | Giá trị\*\<=2^256-CALLVALUE-1 0x00 Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1AF | PUSH2 0x01df | 0x01DF Giá trị\*\<=2^256-CALLVALUE-1 0x00 Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1B2 | JUMPI | |
+
+Chúng ta sẽ nhảy nếu `Giá trị*` nhỏ hơn hoặc bằng 2^256-CALLVALUE-1. Điều này có vẻ giống như logic để ngăn chặn tràn số. Và thực vậy, chúng ta thấy rằng sau một vài hoạt động vô nghĩa (ví dụ: ghi vào bộ nhớ sắp bị xóa) ở độ lệch 0x01DE, hợp đồng sẽ hoàn nguyên nếu phát hiện tràn số, đây là hành vi bình thường.
+
+Lưu ý rằng một sự tràn số như vậy là cực kỳ khó xảy ra, bởi vì nó sẽ yêu cầu giá trị cuộc gọi cộng với `Giá trị*` phải tương đương với 2^256 wei, khoảng 10^59 ETH. [Tổng cung ETH, tại thời điểm viết bài, là dưới hai trăm triệu](https://etherscan.io/stat/supply).
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | ------------------------------------------- |
+| 1DF | JUMPDEST | 0x00 Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1E0 | POP | Giá trị\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1E1 | ADD | Giá trị\*+CALLVALUE 0x75 0 6 CALLVALUE |
+| 1E2 | SWAP1 | 0x75 Giá trị\*+CALLVALUE 0 6 CALLVALUE |
+| 1E3 | JUMP | |
+
+Nếu chúng ta đến đây, hãy lấy `Giá trị* + CALLVALUE` và nhảy đến độ lệch 0x75.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | --------------------------------- |
+| 75 | JUMPDEST | Giá trị\*+CALLVALUE 0 6 CALLVALUE |
+| 76 | SWAP1 | 0 Giá trị\*+CALLVALUE 6 CALLVALUE |
+| 77 | SWAP2 | 6 Giá trị\*+CALLVALUE 0 CALLVALUE |
+| 78 | SSTORE | 0 CALLVALUE |
+
+Nếu chúng ta đến đây (yêu cầu dữ liệu cuộc gọi phải trống), chúng ta sẽ cộng giá trị cuộc gọi vào `Giá trị*`. Điều này phù hợp với những gì chúng ta nói về giao dịch `Chuyển`.
+
+| Độ lệch | Mã vận hành |
+| ------: | ----------- |
+| 79 | POP |
+| 7A | POP |
+| 7B | STOP |
+
+Cuối cùng, xóa ngăn xếp (điều này không cần thiết) và báo hiệu kết thúc thành công giao dịch.
+
+Tóm lại, đây là lưu đồ cho mã ban đầu.
+
+
+
+## Trình xử lý tại 0x7C {#the-handler-at-0x7c}
+
+Tôi đã cố tình không đưa vào tiêu đề những gì trình xử lý này thực hiện. Vấn đề không phải là dạy bạn cách hoạt động của hợp đồng cụ thể này, mà là cách để thiết kế ngược các hợp đồng. Bạn sẽ học được những gì nó làm theo cách tương tự như tôi đã làm, bằng cách theo dõi mã.
+
+Chúng ta đến đây từ một số nơi:
+
+- Nếu có dữ liệu cuộc gọi 1, 2 hoặc 3 byte (từ độ lệch 0x63)
+- Nếu chữ ký phương thức không xác định (từ độ lệch 0x42 và 0x5D)
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | ------------------------------------------------------------------------ |
+| 7C | JUMPDEST | |
+| 7D | PUSH1 0x00 | 0x00 |
+| 7F | PUSH2 0x009d | 0x9D 0x00 |
+| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 |
+| 84 | SLOAD | Lưu trữ[3] 0x9D 0x00 |
+
+Đây là một ô lưu trữ khác, một ô mà tôi không thể tìm thấy trong bất kỳ giao dịch nào nên khó biết ý nghĩa của nó hơn. Mã dưới đây sẽ làm cho nó rõ ràng hơn.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Lưu trữ[3] 0x9D 0x00 |
+| 9A | AND | Lưu trữ[3]-dưới dạng-địa chỉ 0x9D 0x00 |
+
+Các mã vận hành này cắt bớt giá trị chúng ta đọc từ Lưu trữ[3] thành 160 bit, độ dài của một địa chỉ Ethereum.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | ------------------------------------------------------------------------------------------ |
+| 9B | SWAP1 | 0x9D Lưu trữ[3]-dưới dạng-địa chỉ 0x00 |
+| 9C | JUMP | Lưu trữ[3]-dưới dạng-địa chỉ 0x00 |
+
+Bước nhảy này là thừa, vì chúng ta sẽ đi đến mã vận hành tiếp theo. Mã này không hiệu quả về gas như nó có thể.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
+| 9D | JUMPDEST | Lưu trữ[3]-dưới dạng-địa chỉ 0x00 |
+| 9E | SWAP1 | 0x00 Lưu trữ[3]-dưới dạng-địa chỉ |
+| 9F | POP | Lưu trữ[3]-dưới dạng-địa chỉ |
+| A0 | PUSH1 0x40 | 0x40 Lưu trữ[3]-dưới dạng-địa chỉ |
+| A2 | MLOAD | Mem[0x40] Lưu trữ[3]-dưới dạng-địa chỉ |
+
+Ngay từ đầu mã, chúng ta đã đặt Mem[0x40] thành 0x80. Nếu chúng ta tìm 0x40 sau đó, chúng ta thấy rằng chúng ta không thay đổi nó - vì vậy chúng ta có thể giả định nó là 0x80.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | ------------------------------------------------------------------------------------------------------------ |
+| A3 | CALLDATASIZE | CALLDATASIZE 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| A7 | CALLDATACOPY | 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+
+Sao chép tất cả dữ liệu cuộc gọi vào bộ nhớ, bắt đầu từ 0x80.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| A8 | PUSH1 0x00 | 0x00 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| AA | DUP1 | 0x00 0x00 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| AD | DUP6 | Lưu trữ[3]-dưới dạng-địa chỉ 0x80 CALLDATASIZE 0x00 0x00 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| AE | GAS | GAS Lưu trữ[3]-dưới dạng-địa chỉ 0x80 CALLDATASIZE 0x00 0x00 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| AF | DELEGATE_CALL | |
+
+Bây giờ mọi thứ đã rõ ràng hơn rất nhiều. Hợp đồng này có thể hoạt động như một [proxy](https://blog.openzeppelin.com/proxy-patterns/), gọi địa chỉ trong Lưu trữ[3] để thực hiện công việc thực sự. `DELEGATE_CALL` gọi một hợp đồng riêng biệt, nhưng vẫn ở trong cùng một bộ lưu trữ. Điều này có nghĩa là hợp đồng được ủy quyền, hợp đồng mà chúng ta là proxy, truy cập vào cùng một không gian lưu trữ. Các thông số cho cuộc gọi là:
+
+- _Gas_: Tất cả gas còn lại
+- _Địa chỉ được gọi_: Lưu trữ[3]-dưới dạng-địa chỉ
+- _Dữ liệu cuộc gọi_: Các byte CALLDATASIZE bắt đầu từ 0x80, là nơi chúng ta đặt dữ liệu cuộc gọi gốc
+- _Dữ liệu trả về_: Không có (0x00 - 0x00) Chúng ta sẽ nhận được dữ liệu trả về bằng các phương tiện khác (xem bên dưới)
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| B0 | RETURNDATASIZE | RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| B4 | DUP5 | 0x80 0x00 RETURNDATASIZE RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| B5 | RETURNDATACOPY | RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+
+Tại đây, chúng tôi sao chép tất cả dữ liệu trả về vào bộ đệm bộ nhớ bắt đầu từ 0x80.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| B6 | DUP2 | (((gọi thành công/thất bại))) RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| B7 | DUP1 | (((gọi thành công/thất bại))) (((gọi thành công/thất bại))) RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| B8 | ISZERO | (((cuộc gọi có thất bại không))) (((cuộc gọi thành công/thất bại))) RETURNDATASIZE (((cuộc gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| B9 | PUSH2 0x00c0 | 0xC0 (((cuộc gọi có thất bại không))) (((cuộc gọi thành công/thất bại))) RETURNDATASIZE (((cuộc gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| BC | JUMPI | (((gọi thành công/thất bại))) RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| BD | DUP2 | RETURNDATASIZE (((gọi thành công/thất bại))) RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| BE | DUP5 | 0x80 RETURNDATASIZE (((gọi thành công/thất bại))) RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| BF | RETURN | |
+
+Vì vậy, sau cuộc gọi, chúng tôi sao chép dữ liệu trả về vào bộ đệm 0x80 - 0x80+RETURNDATASIZE và nếu cuộc gọi thành công, chúng tôi sẽ `TRẢ VỀ` chính xác bộ đệm đó.
+
+### DELEGATECALL thất bại {#delegatecall-failed}
+
+Nếu chúng ta đến đây, đến 0xC0, điều đó có nghĩa là hợp đồng mà chúng ta đã gọi đã hoàn nguyên. Vì chúng ta chỉ là một proxy cho hợp đồng đó, chúng ta muốn trả về cùng một dữ liệu và cũng hoàn nguyên.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| C0 | JUMPDEST | (((gọi thành công/thất bại))) RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| C1 | DUP2 | RETURNDATASIZE (((gọi thành công/thất bại))) RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| C2 | DUP5 | 0x80 RETURNDATASIZE (((gọi thành công/thất bại))) RETURNDATASIZE (((gọi thành công/thất bại))) 0x80 Lưu trữ[3]-dưới dạng-địa chỉ |
+| C3 | REVERT | |
+
+Vì vậy, chúng ta `HOÀN NGUYÊN` với cùng một bộ đệm mà chúng ta đã sử dụng cho `TRẢ VỀ` trước đó: 0x80 - 0x80+RETURNDATASIZE
+
+
+
+## Các lệnh gọi ABI {#abi-calls}
+
+Nếu kích thước dữ liệu cuộc gọi là bốn byte trở lên, đây có thể là một cuộc gọi ABI hợp lệ.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | --------------------------------------------------------------------------------------------------------------------------------- |
+| D | PUSH1 0x00 | 0x00 |
+| F | CALLDATALOAD | (((Từ đầu tiên (256 bit) của dữ liệu cuộc gọi))) |
+| 10 | PUSH1 0xe0 | 0xE0 (((Từ đầu tiên (256 bit) của dữ liệu cuộc gọi))) |
+| 12 | SHR | (((32 bit đầu tiên (4 byte) của dữ liệu cuộc gọi))) |
+
+Etherscan cho chúng ta biết rằng `1C` là một mã vận hành không xác định, bởi vì [nó đã được thêm vào sau khi Etherscan viết tính năng này](https://eips.ethereum.org/EIPS/eip-145) và họ chưa cập nhật nó. Một [bảng mã vận hành cập nhật](https://github.com/wolflo/evm-opcodes) cho chúng ta thấy đây là dịch phải
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 13 | DUP1 | (((32 bit đầu tiên (4 byte) của dữ liệu cuộc gọi))) (((32 bit đầu tiên (4 byte) của dữ liệu cuộc gọi))) |
+| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((32 bit đầu tiên (4 byte) của dữ liệu cuộc gọi))) (((32 bit đầu tiên (4 byte) của dữ liệu cuộc gọi))) |
+| 19 | GT | 0x3CD8045E>dữ liệu-cuộc-gọi-32-bit-đầu tiên (((32 bit đầu tiên (4 byte) của dữ liệu cuộc gọi))) |
+| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>dữ liệu-cuộc-gọi-32-bit-đầu tiên (((32 bit đầu tiên (4 byte) của dữ liệu cuộc gọi))) |
+| 1D | JUMPI | (((32 bit đầu tiên (4 byte) của dữ liệu cuộc gọi))) |
+
+Bằng cách chia các bài kiểm tra khớp chữ ký phương thức thành hai như thế này, trung bình sẽ tiết kiệm được một nửa số bài kiểm tra. Mã ngay sau mã này và mã trong 0x43 tuân theo cùng một mẫu: `DUP1` 32 bit đầu tiên của dữ liệu cuộc gọi, `PUSH4 (((chữ ký phương thức)`, chạy `EQ` để kiểm tra sự bằng nhau, và sau đó là `JUMPI` nếu chữ ký phương thức khớp. Dưới đây là các chữ ký phương thức, địa chỉ của chúng và nếu biết [định nghĩa phương thức tương ứng](https://www.4byte.directory/):
+
+| Phương pháp | Chữ ký phương thức | Độ lệch để nhảy vào |
+| --------------------------------------------------------------------------------------------------------- | ------------------ | ------------------- |
+| [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 |
+
+Nếu không tìm thấy kết quả phù hợp, mã sẽ chuyển đến [trình xử lý proxy tại 0x7C](#the-handler-at-0x7c), với hy vọng rằng hợp đồng mà chúng tôi là proxy có kết quả phù hợp.
+
+
+
+## splitter() {#splitter}
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | ----------------------------- |
+| 103 | JUMPDEST | |
+| 104 | CALLVALUE | CALLVALUE |
+| 105 | DUP1 | CALLVALUE CALLVALUE |
+| 106 | ISZERO | CALLVALUE==0 CALLVALUE |
+| 107 | PUSH2 0x010f | 0x010F CALLVALUE==0 CALLVALUE |
+| 10A | JUMPI | CALLVALUE |
+| 10B | PUSH1 0x00 | 0x00 CALLVALUE |
+| 10D | DUP1 | 0x00 0x00 CALLVALUE |
+| 10E | REVERT | |
+
+Điều đầu tiên mà hàm này thực hiện là kiểm tra xem lệnh gọi có gửi bất kỳ ETH nào không. Hàm này không phải là [`payable`](https://solidity-by-example.org/payable/). Nếu ai đó gửi ETH cho chúng tôi, đó phải là một sai lầm và chúng tôi muốn `HOÀN NGUYÊN` để tránh việc ETH đó ở nơi họ không thể lấy lại được.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 10F | JUMPDEST | |
+| 110 | POP | |
+| 111 | PUSH1 0x03 | 0x03 |
+| 113 | SLOAD | (((Lưu trữ[3] hay còn gọi là hợp đồng mà chúng tôi làm proxy))) |
+| 114 | PUSH1 0x40 | 0x40 (((Lưu trữ[3] hay còn gọi là hợp đồng mà chúng tôi làm proxy))) |
+| 116 | MLOAD | 0x80 (((Lưu trữ[3] hay còn gọi là hợp đồng mà chúng tôi làm proxy))) |
+| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Lưu trữ[3] hay còn gọi là hợp đồng mà chúng tôi làm proxy))) |
+| 12C | SWAP1 | 0x80 0xFF...FF (((Lưu trữ[3] hay còn gọi là hợp đồng mà chúng tôi làm proxy))) |
+| 12D | SWAP2 | (((Lưu trữ[3] hay còn gọi là hợp đồng mà chúng tôi làm proxy))) 0xFF...FF 0x80 |
+| 12E | AND | Địa chỉ proxy 0x80 |
+| 12F | DUP2 | 0x80 Địa chỉ proxy 0x80 |
+| 130 | MSTORE | 0x80 |
+
+Và 0x80 bây giờ chứa địa chỉ proxy
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | --------- |
+| 131 | PUSH1 0x20 | 0x20 0x80 |
+| 133 | ADD | 0xA0 |
+| 134 | PUSH2 0x00e4 | 0xE4 0xA0 |
+| 137 | JUMP | 0xA0 |
+
+### Mã E4 {#the-e4-code}
+
+Đây là lần đầu tiên chúng tôi thấy những dòng này, nhưng chúng được chia sẻ với các phương thức khác (xem bên dưới). Vì vậy, chúng ta sẽ gọi giá trị trong ngăn xếp là X và chỉ cần nhớ rằng trong `splitter()`, giá trị của X này là 0xA0.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | ----------- |
+| E4 | JUMPDEST | X |
+| E5 | PUSH1 0x40 | 0x40 X |
+| E7 | MLOAD | 0x80 X |
+| E8 | DUP1 | 0x80 0x80 X |
+| E9 | SWAP2 | X 0x80 0x80 |
+| EA | SUB | X-0x80 0x80 |
+| EB | SWAP1 | 0x80 X-0x80 |
+| EC | RETURN | |
+
+Vì vậy, mã này nhận một con trỏ bộ nhớ trong ngăn xếp (X), và làm cho hợp đồng `TRẢ VỀ` với một bộ đệm là 0x80 - X.
+
+Trong trường hợp của `splitter()`, điều này trả về địa chỉ mà chúng tôi là một proxy. `RETURN` trả về bộ đệm trong 0x80-0x9F, đây là nơi chúng tôi đã viết dữ liệu này (độ lệch 0x130 ở trên).
+
+## currentWindow() {#currentwindow}
+
+Mã ở độ lệch 0x158-0x163 giống hệt với những gì chúng ta đã thấy ở 0x103-0x10E trong `splitter()` (ngoài đích `JUMPI`), vì vậy chúng ta biết `currentWindow()` cũng không phải là `payable`.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | ------------------------------------------------------------------------ |
+| 164 | JUMPDEST | |
+| 165 | POP | |
+| 166 | PUSH2 0x00da | 0xDA |
+| 169 | PUSH1 0x01 | 0x01 0xDA |
+| 16B | SLOAD | Lưu trữ[1] 0xDA |
+| 16C | DUP2 | 0xDA Lưu trữ[1] 0xDA |
+| 16D | JUMP | Lưu trữ[1] 0xDA |
+
+### Mã DA {#the-da-code}
+
+Mã này cũng được chia sẻ với các phương pháp khác. Vì vậy, chúng ta sẽ gọi giá trị trong ngăn xếp là Y và chỉ cần nhớ rằng trong `currentWindow()`, giá trị của Y này là Lưu trữ[1].
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | ---------------- |
+| DA | JUMPDEST | Y 0xDA |
+| DB | PUSH1 0x40 | 0x40 Y 0xDA |
+| DD | MLOAD | 0x80 Y 0xDA |
+| DE | SWAP1 | Y 0x80 0xDA |
+| DF | DUP2 | 0x80 Y 0x80 0xDA |
+| E0 | MSTORE | 0x80 0xDA |
+
+Viết Y vào 0x80-0x9F.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | -------------- |
+| E1 | PUSH1 0x20 | 0x20 0x80 0xDA |
+| E3 | ADD | 0xA0 0xDA |
+
+Và phần còn lại đã được giải thích [ở trên](#the-e4-code). Vì vậy, các bước nhảy đến 0xDA sẽ ghi giá trị trên cùng của ngăn xếp (Y) vào 0x80-0x9F và trả về giá trị đó. Trong trường hợp của `currentWindow()`, nó trả về Lưu trữ[1].
+
+## merkleRoot() {#merkleroot}
+
+Mã ở độ lệch 0xED-0xF8 giống hệt với những gì chúng ta đã thấy ở 0x103-0x10E trong `splitter()` (ngoài đích `JUMPI`), vì vậy chúng ta biết `merkleRoot()` cũng không phải là `payable`.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | ------------------------------------------------------------------------ |
+| F9 | JUMPDEST | |
+| FA | POP | |
+| FB | PUSH2 0x00da | 0xDA |
+| FE | PUSH1 0x00 | 0x00 0xDA |
+| 100 | SLOAD | Lưu trữ[0] 0xDA |
+| 101 | DUP2 | 0xDA Lưu trữ[0] 0xDA |
+| 102 | JUMP | Lưu trữ[0] 0xDA |
+
+Điều gì xảy ra sau khi nhảy [chúng ta đã tìm ra](#the-da-code). Vì vậy, `merkleRoot()` trả về Lưu trữ[0].
+
+## 0x81e580d3 {#0x81e580d3}
+
+Mã ở độ lệch 0x138-0x143 giống hệt với những gì chúng ta đã thấy ở 0x103-0x10E trong `splitter()` (ngoài đích `JUMPI`), vì vậy chúng ta biết hàm này cũng không phải là `payable`.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | ------------------------------------------------------------------------------- |
+| 144 | JUMPDEST | |
+| 145 | POP | |
+| 146 | PUSH2 0x00da | 0xDA |
+| 149 | PUSH2 0x0153 | 0x0153 0xDA |
+| 14C | CALLDATASIZE | CALLDATASIZE 0x0153 0xDA |
+| 14D | PUSH1 0x04 | 0x04 CALLDATASIZE 0x0153 0xDA |
+| 14F | PUSH2 0x018f | 0x018F 0x04 CALLDATASIZE 0x0153 0xDA |
+| 152 | JUMP | 0x04 CALLDATASIZE 0x0153 0xDA |
+| 18F | JUMPDEST | 0x04 CALLDATASIZE 0x0153 0xDA |
+| 190 | PUSH1 0x00 | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 192 | PUSH1 0x20 | 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 194 | DUP3 | 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 195 | DUP5 | CALLDATASIZE 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 196 | SUB | CALLDATASIZE-4 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 197 | SLT | CALLDATASIZE-4\<32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 198 | ISZERO | CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 199 | PUSH2 0x01a0 | 0x01A0 CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 19C | JUMPI | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+
+Có vẻ như hàm này nhận ít nhất 32 byte (một từ) dữ liệu cuộc gọi.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ----------- | -------------------------------------------- |
+| 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 19F | REVERT | |
+
+Nếu không nhận được dữ liệu cuộc gọi, giao dịch sẽ được hoàn nguyên mà không có dữ liệu trả về.
+
+Hãy xem điều gì sẽ xảy ra nếu hàm _có_ nhận được dữ liệu cuộc gọi mà nó cần.
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | ----------------------------------------------------------- |
+| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA |
+| 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA |
+
+`calldataload(4)` là từ đầu tiên của dữ liệu cuộc gọi _sau_ chữ ký phương thức
+
+| Độ lệch | Mã vận hành | Stack |
+| ------: | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 1A3 | SWAP2 | 0x0153 CALLDATASIZE calldataload(4) 0xDA |
+| 1A4 | SWAP1 | CALLDATASIZE 0x0153 calldataload(4) 0xDA |
+| 1A5 | POP | 0x0153 calldataload(4) 0xDA |
+| 1A6 | JUMP | calldataload(4) 0xDA |
+| 153 | JUMPDEST | calldataload(4) 0xDA |
+| 154 | PUSH2 0x016e | 0x016E calldataload(4) 0xDA |
+| 157 | JUMP | calldataload(4) 0xDA |
+| 16E | JUMPDEST | calldataload(4) 0xDA |
+| 16F | PUSH1 0x04 | 0x04 calldataload(4) 0xDA |
+| 171 | DUP2 | calldataload(4) 0x04 calldataload(4) 0xDA |
+| 172 | DUP2 | 0x04 calldataload(4) 0x04 calldataload(4) 0xDA |
+| 173 | SLOAD | Lưu trữ[4] calldataload(4) 0x04 calldataload(4) 0xDA |
+| 174 | DUP2 | calldataload(4) Lưu trữ[4] calldataload(4) 0x04 calldataload(4) 0xDA |
+| 175 | LT | calldataload(4)\)`, và một phương thức khác là `isClaimed()`, vì vậy nó trông giống như một hợp đồng airdrop. Thay vì đi qua phần còn lại từng mã vận hành một, chúng ta có thể [thử trình biên dịch ngược](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761), trình biên dịch này tạo ra kết quả có thể sử dụng được cho ba hàm từ hợp đồng này. Việc thiết kế ngược các phần còn lại được để lại như một bài tập cho người đọc.
+
+### scaleAmountByPercentage {#scaleamountbypercentage}
+
+Đây là những gì trình biên dịch ngược cung cấp cho chúng ta cho hàm này:
+
+```python
+def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable:
+ yêu cầu calldata.size - 4 >=′ 64
+ nếu _param1 và _param2 > -1 / _param1:
+ hoàn nguyên với 0, 17
+ return (_param1 * _param2 / 100 * 10^6)
+```
+
+Yêu cầu `require` đầu tiên kiểm tra xem dữ liệu cuộc gọi có, ngoài bốn byte của chữ ký hàm, ít nhất 64 byte, đủ cho hai tham số. Nếu không, rõ ràng có điều gì đó không ổn.
+
+Câu lệnh `if` dường như kiểm tra rằng `_param1` không phải là không, và `_param1 * _param2` không phải là số âm. Nó có lẽ để ngăn chặn các trường hợp tràn số.
+
+Cuối cùng, hàm trả về một giá trị đã được thay đổi quy mô.
+
+### claim {#claim}
+
+Mã mà trình biên dịch ngược tạo ra rất phức tạp, và không phải tất cả đều liên quan đến chúng ta. Tôi sẽ bỏ qua một số dòng để tập trung vào những dòng mà tôi tin là cung cấp thông tin hữu ích
+
+```python
+def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _param4) payable:
+ ...
+ yêu cầu _param2 == addr(_param2)
+ ...
+ nếu currentWindow <= _param1:
+ hoàn nguyên với 0, 'không thể yêu cầu cho một cửa sổ trong tương lai'
+```
+
+Chúng ta thấy ở đây hai điều quan trọng:
+
+- `_param2`, mặc dù nó được khai báo là `uint256`, thực ra là một địa chỉ
+- `_param1` là cửa sổ đang được yêu cầu, phải là `currentWindow` hoặc sớm hơn.
+
+```python
+ ...
+ if stor5[_claimWindow][addr(_claimFor)]:
+ revert with 0, 'Tài khoản đã yêu cầu cửa sổ đã cho'
+```
+
+Vì vậy, bây giờ chúng ta biết rằng Lưu trữ[5] là một mảng các cửa sổ và địa chỉ, và liệu địa chỉ đó đã yêu cầu phần thưởng cho cửa sổ đó hay chưa.
+
+```python
+ ...
+ idx = 0
+ s = 0
+ trong khi idx < _param4.length:
+ ...
+ nếu 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]])
+ tiếp tục
+ ...
+ s = sha3(mem[_66 + 32 len mem[_66]])
+ tiếp tục
+ nếu unknown2eb4a7ab != s:
+ hoàn nguyên với 0, 'Bằng chứng không hợp lệ'
+```
+
+Chúng ta biết rằng `unknown2eb4a7ab` thực ra là hàm `merkleRoot()`, vì vậy mã này trông giống như đang xác minh một [bằng chứng merkle](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5). Điều này có nghĩa là `_param4` là một bằng chứng merkle.
+
+```python
+ gọi addr(_param2) với:
+ giá trị không xác định81e580d3[_param1] * _param3 / 100 * 10^6 wei
+ gas 30000 wei
+```
+
+Đây là cách một hợp đồng chuyển ETH của chính nó đến một địa chỉ khác (hợp đồng hoặc sở hữu bên ngoài). Nó gọi nó với một giá trị là số tiền cần chuyển. Vì vậy, có vẻ như đây là một airdrop của ETH.
+
+```python
+ nếu không return_data.size:
+ if not ext_call.success:
+ require ext_code.size(stor2)
+ call stor2.deposit() với:
+ value không xác định81e580d3[_param1] * _param3 / 100 * 10^6 wei
+```
+
+Hai dòng dưới cùng cho chúng ta biết rằng Lưu trữ[2] cũng là một hợp đồng mà chúng ta gọi. Nếu chúng ta [xem xét giao dịch hàm tạo](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange), chúng ta thấy rằng hợp đồng này là [0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2), một hợp đồng Wrapped Ether [có mã nguồn đã được tải lên Etherscan](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code).
+
+Vì vậy, có vẻ như các hợp đồng cố gắng gửi ETH đến `_param2`. Nếu nó có thể làm được, tuyệt vời. Nếu không, nó cố gắng gửi [WETH](https://weth.tkn.eth.limo/). Nếu `_param2` là một tài khoản sở hữu bên ngoài (EOA) thì nó luôn có thể nhận ETH, nhưng các hợp đồng có thể từ chối nhận ETH. Tuy nhiên, WETH là ERC-20 và các hợp đồng không thể từ chối chấp nhận điều đó.
+
+```python
+ ...
+ log 0xdbd5389f: addr(_param2), không xác định81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success)
+```
+
+Ở cuối hàm, chúng ta thấy một mục nhập nhật ký đang được tạo. [Xem các mục nhập nhật ký đã tạo](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events) và lọc theo chủ đề bắt đầu bằng `0xdbd5...`. Nếu chúng ta [nhấp vào một trong các giao dịch đã tạo ra một mục nhập như vậy](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274), chúng ta thấy rằng thực sự nó trông giống như một yêu cầu - tài khoản đã gửi một thông điệp đến hợp đồng mà chúng ta đang thiết kế ngược, và đổi lại nhận được ETH.
+
+
+
+### 1e7df9d3 {#1e7df9d3}
+
+Hàm này rất giống với [`claim`](#claim) ở trên. Nó cũng kiểm tra một bằng chứng merkle, cố gắng chuyển ETH cho người đầu tiên, và tạo ra cùng một loại mục nhập nhật ký.
+
+```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]])
+ tiếp tục
+ mem[mem[64] + 32] = s + sha3(mem[(32 * _param3.length) + 160 len mem[(32 * _param3.length) + 128]])
+ ...
+ if unknown2eb4a7ab != s:
+ revert with 0, 'Bằng chứng không hợp lệ'
+ ...
+ call addr(_param1) với:
+ value s wei
+ gas 30000 wei
+ if not return_data.size:
+ if not ext_call.success:
+ require ext_code.size(stor2)
+ call stor2.deposit() với:
+ value s wei
+ gas gas_remaining wei
+ ...
+ log 0xdbd5389f: addr(_param1), s, bool(ext_call.success)
+```
+
+Sự khác biệt chính là tham số đầu tiên, cửa sổ để rút, không có ở đó. Thay vào đó, có một vòng lặp qua tất cả các cửa sổ có thể được yêu cầu.
+
+```python
+ idx = 0
+ s = 0
+ trong khi idx < currentWindow:
+ ...
+ if stor5[mem[0]]:
+ nếu idx == -1:
+ hoàn nguyên với 0, 17
+ idx = idx + 1
+ s = s
+ tiếp tục
+ ...
+ 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)
+ tiếp tục
+```
+
+Vì vậy, nó trông giống như một biến thể của `claim` yêu cầu tất cả các cửa sổ.
+
+## Kết luận {#conclusion}
+
+Đến bây giờ bạn sẽ biết cách hiểu các hợp đồng không có sẵn mã nguồn, sử dụng mã vận hành hoặc (khi nó hoạt động) trình biên dịch ngược. Như đã thấy rõ từ độ dài của bài viết này, việc thiết kế ngược một hợp đồng không phải là chuyện nhỏ, nhưng trong một hệ thống mà bảo mật là điều cần thiết, đó là một kỹ năng quan trọng để có thể xác minh các hợp đồng hoạt động như đã hứa.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
diff --git a/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md
new file mode 100644
index 00000000000..90e4df9e9c0
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md
@@ -0,0 +1,184 @@
+---
+title: Chạy nút Ethereum trên Raspberry Pi 4
+description: Flash chiếc Raspberry Pi 4 của bạn, cắm cáp ethernet, kết nối đĩa SSD và cấp nguồn cho thiết bị để biến Raspberry Pi 4 thành một nút Ethereum đầy đủ + trình xác thực
+author: "EthereumOnArm"
+tags: [ "máy khách", "lớp thực thi", "lớp đồng thuận", "nút" ]
+lang: vi
+skill: intermediate
+published: 2022-06-10
+source: Ethereum trên ARM
+sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/
+---
+
+**Ethereum on Arm là một ảnh Linux tùy chỉnh có thể biến Raspberry Pi thành một nút Ethereum.**
+
+Để sử dụng Ethereum trên Arm để biến Raspberry Pi thành một nút Ethereum, phần cứng sau đây được đề xuất:
+
+- Bo mạch Raspberry 4 (model B 8GB), Odroid M1 hoặc Rock 5B (RAM 8GB/16GB)
+- Thẻ MicroSD (tối thiểu 16 GB Class 10)
+- Đĩa SSD USB 3.0 tối thiểu 2 TB hoặc một SSD với vỏ chuyển đổi USB sang SATA.
+- Nguồn cấp điện
+- Cáp Ethernet
+- Chuyển tiếp cổng (xem máy khách để biết thêm thông tin)
+- Vỏ có tản nhiệt và quạt
+- Bàn phím USB, Màn hình và cáp HDMI (micro-HDMI) (Tùy chọn)
+
+## Tại sao nên chạy Ethereum trên ARM? {#why-run-ethereum-on-arm}
+
+Các bo mạch ARM là những máy tính nhỏ, linh hoạt và có giá cả rất phải chăng. Chúng là những lựa chọn tốt để chạy các nút Ethereum vì có thể mua chúng với giá rẻ, được cấu hình để tất cả tài nguyên của chúng chỉ tập trung vào nút, giúp chúng hoạt động hiệu quả, tiêu thụ ít điện năng và có kích thước vật lý nhỏ để có thể đặt trong bất kỳ ngôi nhà nào một cách kín đáo. Việc khởi tạo các nút cũng rất dễ dàng vì thẻ MicroSD của Raspberry Pi có thể được nạp một ảnh dựng sẵn, không cần tải xuống hoặc xây dựng phần mềm.
+
+## Nó hoạt động như thế nào? {#how-does-it-work}
+
+Thẻ nhớ của Raspberry Pi được nạp một ảnh dựng sẵn. Ảnh này chứa mọi thứ cần thiết để chạy một nút Ethereum. Với thẻ đã được nạp, tất cả những gì người dùng cần làm là bật nguồn Raspberry Pi. Tất cả các quy trình cần thiết để chạy nút sẽ được tự động khởi động. Điều này hoạt động vì thẻ nhớ chứa một hệ điều hành (OS) dựa trên Linux, trên đó các quy trình cấp hệ thống được chạy tự động để biến thiết bị thành một nút Ethereum.
+
+Không thể chạy Ethereum bằng hệ điều hành Linux phổ biến của Raspberry Pi là \"Raspbian\" vì Raspbian vẫn sử dụng kiến trúc 32-bit, điều này khiến người dùng Ethereum gặp phải các vấn đề về bộ nhớ và các máy khách đồng thuận không hỗ trợ các tệp nhị phân 32-bit. Để khắc phục điều này, nhóm Ethereum on Arm đã chuyển sang một hệ điều hành 64-bit gốc có tên là \"Armbian\".
+
+**Các ảnh sẽ lo tất cả các bước cần thiết**, từ việc thiết lập môi trường và định dạng đĩa SSD đến việc cài đặt và chạy phần mềm Ethereum cũng như bắt đầu đồng bộ hóa chuỗi khối.
+
+## Lưu ý về máy khách thực thi và máy khách đồng thuận {#note-on-execution-and-consensus-clients}
+
+Ảnh Ethereum on Arm bao gồm các máy khách thực thi và đồng thuận dựng sẵn dưới dạng các dịch vụ. Một nút Ethereum yêu cầu cả hai máy khách phải được đồng bộ hóa và đang chạy. Bạn chỉ cần tải xuống và nạp ảnh rồi khởi động các dịch vụ. Ảnh này được tải sẵn các máy khách thực thi sau:
+
+- Geth
+- Nethermind
+- Besu
+
+và các máy khách đồng thuận sau:
+
+- Lighthouse
+- Nimbus
+- Prysm
+- Teku
+
+Bạn nên chọn một trong mỗi loại để chạy - tất cả các máy khách thực thi đều tương thích với tất cả các máy khách đồng thuận. Nếu bạn không chọn một máy khách một cách rõ ràng, nút sẽ quay lại sử dụng các mặc định của nó - Geth và Lighthouse - và tự động chạy chúng khi bo mạch được cấp nguồn. Bạn phải mở cổng 30303 trên bộ định tuyến của mình để Geth có thể tìm và kết nối với các máy ngang hàng.
+
+## Tải xuống ảnh {#downloading-the-image}
+
+Ảnh Ethereum cho Raspberry Pi 4 là ảnh \"cắm và chạy\" giúp tự động cài đặt và thiết lập cả máy khách thực thi và máy khách đồng thuận, cấu hình chúng để giao tiếp với nhau và kết nối với mạng Ethereum. Tất cả những gì người dùng cần làm là khởi động các quy trình của họ bằng một lệnh đơn giản.
+
+Tải xuống ảnh Raspberry Pi từ [Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1) và xác minh hàm băm SHA256:
+
+```sh
+# Từ thư mục chứa ảnh đã tải xuống
+shasum -a 256 ethonarm_22.04.00.img.zip
+# Hàm băm sẽ xuất ra: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f
+```
+
+Lưu ý rằng các ảnh cho bo mạch Rock 5B và Odroid M1 có sẵn tại [trang tải xuống](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/quick-guide/download-and-install.html) của Ethereum-on-Arm.
+
+## Nạp thẻ MicroSD {#flashing-the-microsd}
+
+Thẻ MicroSD sẽ được sử dụng cho Raspberry Pi trước tiên nên được cắm vào máy tính để bàn hoặc máy tính xách tay để có thể nạp. Sau đó, các lệnh terminal sau sẽ nạp ảnh đã tải xuống vào thẻ SD:
+
+```shell
+# kiểm tra tên thẻ MicroSD
+sudo fdisk -l
+
+>> sdxxx
+```
+
+Việc lấy đúng tên là rất quan trọng vì lệnh tiếp theo bao gồm `dd` sẽ xóa hoàn toàn nội dung hiện có của thẻ trước khi đẩy ảnh vào đó. Để tiếp tục, hãy điều hướng đến thư mục chứa ảnh đã nén:
+
+```shell
+# giải nén và nạp ảnh
+unzip ethonarm_22.04.00.img.zip
+sudo dd bs=1M if=ethonarm_22.04.00.img of=/dev/ conv=fdatasync status=progress
+```
+
+Thẻ hiện đã được nạp, vì vậy có thể cắm nó vào Raspberry Pi.
+
+## Khởi động nút {#start-the-node}
+
+Sau khi đã cắm thẻ SD vào Raspberry Pi, hãy kết nối cáp ethernet và SSD rồi bật nguồn. Hệ điều hành sẽ khởi động và tự động bắt đầu thực hiện các tác vụ được cấu hình sẵn để biến Raspberry Pi thành một nút Ethereum, bao gồm cài đặt và xây dựng phần mềm máy khách. Quá trình này có thể sẽ mất 10-15 phút.
+
+Sau khi mọi thứ được cài đặt và cấu hình, hãy đăng nhập vào thiết bị qua kết nối ssh hoặc sử dụng trực tiếp terminal nếu có màn hình và bàn phím được gắn vào bo mạch. Sử dụng tài khoản `ethereum` để đăng nhập, vì tài khoản này có các quyền cần thiết để khởi động nút.
+
+```shell
+Người dùng: ethereum
+Mật khẩu: ethereum
+```
+
+Máy khách thực thi mặc định, Geth, sẽ tự động khởi động. Bạn có thể xác nhận điều này bằng cách kiểm tra nhật ký bằng lệnh terminal sau:
+
+```sh
+sudo journalctl -u geth -f
+```
+
+Máy khách đồng thuận cần được khởi động một cách rõ ràng. Để làm điều này, trước tiên hãy mở cổng 9000 trên bộ định tuyến của bạn để Lighthouse có thể tìm và kết nối với các máy ngang hàng. Sau đó, bật và khởi động dịch vụ lighthouse:
+
+```sh
+sudo systemctl enable lighthouse-beacon
+sudo systemctl start lighthouse-beacon
+```
+
+Kiểm tra máy khách bằng nhật ký:
+
+```sh
+sudo journalctl -u lighthouse-beacon
+```
+
+Lưu ý rằng máy khách đồng thuận sẽ đồng bộ hóa trong vài phút vì nó sử dụng đồng bộ hóa điểm kiểm tra. Máy khách thực thi sẽ mất nhiều thời gian hơn - có thể là vài giờ, và nó sẽ không khởi động cho đến khi máy khách đồng thuận đã đồng bộ hóa xong (điều này là do máy khách thực thi cần một mục tiêu để đồng bộ hóa tới, mà máy khách đồng thuận đã được đồng bộ hóa cung cấp).
+
+Với các dịch vụ Geth và Lighthouse đang chạy và đã đồng bộ hóa, Raspberry Pi của bạn giờ đây đã là một nút Ethereum! Cách phổ biến nhất để tương tác với mạng Ethereum là sử dụng bảng điều khiển Javascript của Geth, có thể được gắn vào máy khách Geth trên cổng 8545. Cũng có thể gửi các lệnh được định dạng dưới dạng đối tượng JSON bằng công cụ yêu cầu như Curl. Xem thêm trong [tài liệu Geth](https://geth.ethereum.org/).
+
+Geth được cấu hình sẵn để báo cáo các chỉ số đến một bảng điều khiển Grafana có thể được xem trong trình duyệt. Người dùng nâng cao hơn có thể muốn sử dụng tính năng này để theo dõi tình trạng nút của họ bằng cách điều hướng đến `ipaddress:3000`, truyền `user: admin` và `passwd: ethereum`.
+
+## Người xác thực {#validators}
+
+Một trình xác thực cũng có thể được thêm vào máy khách đồng thuận một cách tùy chọn. Phần mềm trình xác thực cho phép nút của bạn tham gia tích cực vào sự đồng thuận và cung cấp cho mạng lưới bảo mật kinh tế mã hóa. Bạn sẽ được thưởng bằng ETH cho công việc này. Để chạy một trình xác thực, trước tiên bạn phải có 32 ETH, số ETH này phải được gửi vào hợp đồng gửi tiền. Việc gửi tiền có thể được thực hiện bằng cách làm theo hướng dẫn từng bước trên [Launchpad](https://launchpad.ethereum.org/). Thực hiện việc này trên máy tính để bàn/máy tính xách tay, nhưng không tạo khóa — việc này có thể được thực hiện trực tiếp trên Raspberry Pi.
+
+Mở một terminal trên Raspberry Pi và chạy lệnh sau để tạo các khóa gửi tiền:
+
+```
+sudo apt-get update
+sudo apt-get install staking-deposit-cli
+cd && deposit new-mnemonic --num_validators 1
+```
+
+(Hoặc tải xuống [staking-deposit-cli](https://github.com/ethereum/staking-deposit-cli) để chạy trên một máy tính cách ly mạng, và chạy lệnh `deposit new-mnemnonic`)
+
+Hãy giữ an toàn cụm từ ghi nhớ! Lệnh trên đã tạo ra hai tệp trong kho khóa của nút: các khóa của trình xác thực và một tệp dữ liệu gửi tiền. Dữ liệu gửi tiền cần được tải lên launchpad, vì vậy nó phải được sao chép từ Raspberry Pi sang máy tính để bàn/máy tính xách tay. Điều này có thể được thực hiện bằng kết nối ssh hoặc bất kỳ phương pháp sao chép/dán nào khác.
+
+Khi tệp dữ liệu gửi tiền có sẵn trên máy tính đang chạy launchpad, bạn có thể kéo và thả tệp đó vào dấu `+` trên màn hình launchpad. Làm theo hướng dẫn trên màn hình để gửi một giao dịch đến hợp đồng gửi tiền.
+
+Quay lại Raspberry Pi, một trình xác thực có thể được khởi động. Điều này yêu cầu nhập các khóa của trình xác thực, đặt địa chỉ để thu thập phần thưởng, và sau đó khởi động quy trình xác thực đã được cấu hình sẵn. Ví dụ dưới đây là dành cho Lighthouse—hướng dẫn cho các máy khách đồng thuận khác có sẵn trên [tài liệu Ethereum on Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/):
+
+```shell
+# nhập các khóa của trình xác thực
+lighthouse account validator import --directory=/home/ethereum/validator_keys
+
+# đặt địa chỉ nhận phần thưởng
+sudo sed -i 's/' /etc/ethereum/lighthouse-validator.conf
+
+# khởi động trình xác thực
+sudo systemctl start lighthouse-validator
+```
+
+Xin chúc mừng, bạn hiện đã có một nút Ethereum và trình xác thực đầy đủ đang chạy trên Raspberry Pi!
+
+## Chi tiết hơn {#more-details}
+
+Trang này đã cung cấp một cái nhìn tổng quan về cách thiết lập một nút và trình xác thực Geth-Lighthouse bằng Raspberry Pi. Các hướng dẫn chi tiết hơn có sẵn trên [trang web Ethereum-on-Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html).
+
+## Chúng tôi đánh giá cao phản hồi {#feedback-appreciated}
+
+Chúng tôi biết Raspberry Pi có một lượng người dùng khổng lồ có thể có tác động rất tích cực đến sức khỏe của mạng Ethereum.
+Vui lòng tìm hiểu chi tiết trong hướng dẫn này, thử chạy trên các mạng thử nghiệm, xem GitHub của Ethereum on Arm, đưa ra phản hồi, nêu các vấn đề và yêu cầu kéo, và giúp cải tiến công nghệ và tài liệu!
+
+## Tài liệu tham khảo {#references}
+
+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/vi/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md
new file mode 100644
index 00000000000..9d667a67b89
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md
@@ -0,0 +1,470 @@
+---
+title: "Một số thủ thuật được token lừa đảo sử dụng và cách phát hiện chúng"
+description: Trong hướng dẫn này, chúng tôi phân tích một token lừa đảo để xem một số thủ thuật mà những kẻ lừa đảo sử dụng, cách chúng triển khai và cách chúng ta có thể phát hiện ra chúng.
+author: Ori Pomerantz
+tags:
+ [
+ "lừa đảo",
+ "solidity",
+ "erc-20",
+ "javascript",
+ "typescript"
+ ]
+skill: intermediate
+published: 15/09/2023
+lang: vi
+---
+
+Trong hướng dẫn này, chúng tôi phân tích [một token lừa đảo](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code) để xem một số thủ thuật mà những kẻ lừa đảo sử dụng và cách chúng triển khai. Khi kết thúc hướng dẫn, bạn sẽ có cái nhìn toàn diện hơn về các hợp đồng token ERC-20, khả năng của chúng và lý do tại sao sự hoài nghi là cần thiết. Sau đó, chúng tôi xem xét các sự kiện do token lừa đảo đó đưa ra và xem cách chúng ta có thể tự động xác định rằng token đó không hợp pháp.
+
+## Token lừa đảo - chúng là gì, tại sao mọi người tạo ra chúng và làm thế nào để tránh chúng {#scam-tokens}
+
+Một trong những ứng dụng cho Ethereum đó là cho một nhóm tạo ra Token có thể giao dịch, nói đơn giản là tiền tệ của riêng họ. Tuy nhiên, bất kỳ nơi nào có các trường hợp sử dụng hợp pháp mang lại giá trị, cũng có những tên tội phạm cố gắng đánh cắp giá trị đó cho riêng họ.
+
+Bạn có thể đọc thêm về chủ đề này [ở nơi khác trên ethereum.org](/guides/how-to-id-scam-tokens/) từ góc độ người dùng. Hướng dẫn này tập trung vào việc phân tích một token lừa đảo để xem nó được thực hiện như thế nào và cách phát hiện nó.
+
+### Làm cách nào để tôi biết wARB là một trò lừa đảo? {#warb-scam}
+
+Token mà chúng tôi phân tích là [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code), nó giả vờ tương đương với [token ARB](https://etherscan.io/token/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1) hợp pháp.
+
+Cách dễ nhất để biết đâu là token hợp pháp là xem xét tổ chức ban đầu, [Arbitrum](https://arbitrum.foundation/). Các địa chỉ hợp pháp được chỉ định [trong tài liệu của họ](https://docs.arbitrum.foundation/deployment-addresses#token).
+
+### Tại sao mã nguồn lại có sẵn? {#why-source}
+
+Thông thường, chúng tôi mong đợi những người cố gắng lừa đảo người khác sẽ giữ bí mật, và thực tế là nhiều token lừa đảo không có sẵn mã của chúng (ví dụ: [token này](https://optimistic.etherscan.io/token/0x15992f382d8c46d667b10dc8456dc36651af1452#code) và [token này](https://optimistic.etherscan.io/token/0x026b623eb4aada7de37ef25256854f9235207178#code)).
+
+Tuy nhiên, các token hợp pháp thường công bố mã nguồn của chúng, vì vậy để có vẻ hợp pháp, tác giả của các token lừa đảo đôi khi cũng làm như vậy. [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code) là một trong những token có mã nguồn sẵn có, giúp việc tìm hiểu dễ dàng hơn.
+
+Mặc dù người triển khai hợp đồng có thể chọn có công bố mã nguồn hay không, nhưng họ _không thể_ công bố mã nguồn sai. Trình duyệt khối biên dịch mã nguồn được cung cấp một cách độc lập và nếu không nhận được chính xác cùng một chỉ thị biên dịch, nó sẽ từ chối mã nguồn đó. [Bạn có thể đọc thêm về điều này trên trang Etherscan](https://etherscan.io/verifyContract).
+
+## So sánh với các token ERC-20 hợp pháp {#compare-legit-erc20}
+
+Chúng tôi sẽ so sánh token này với các token ERC-20 hợp pháp. Nếu bạn không quen với cách các token ERC-20 hợp pháp thường được viết, [xem hướng dẫn này](/developers/tutorials/erc20-annotated-code/).
+
+### Hằng số cho các địa chỉ đặc quyền {#constants-for-privileged-addresses}
+
+Các hợp đồng đôi khi cần các địa chỉ đặc quyền. Các hợp đồng được thiết kế để sử dụng lâu dài cho phép một số địa chỉ đặc quyền thay đổi các địa chỉ đó, ví dụ như để cho phép sử dụng một hợp đồng multisig mới. Có một số cách để làm điều này.
+
+Hợp đồng token [`HOP`](https://etherscan.io/address/0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc#code) sử dụng mẫu [`Ownable`](https://docs.openzeppelin.com/contracts/2.x/access-control#ownership-and-ownable). Địa chỉ đặc quyền được giữ trong bộ nhớ, trong một trường có tên là `_owner` (xem tệp thứ ba, `Ownable.sol`).
+
+```solidity
+abstract contract Ownable is Context {
+ address private _owner;
+ .
+ .
+ .
+}
+```
+
+Hợp đồng token [`ARB`](https://etherscan.io/address/0xad0c361ef902a7d9851ca7dcc85535da2d3c6fc7#code) không có địa chỉ đặc quyền trực tiếp. Tuy nhiên, nó không cần. Nó nằm sau một [`proxy`](https://docs.openzeppelin.com/contracts/5.x/api/proxy) tại [địa chỉ `0xb50721bcf8d664c30412cfbc6cf7a15145234ad1`](https://etherscan.io/address/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1#code). Hợp đồng đó có một địa chỉ đặc quyền (xem tệp thứ tư, `ERC1967Upgrade.sol`) có thể được sử dụng để nâng cấp.
+
+```solidity
+ /**
+ * @dev Lưu trữ một địa chỉ mới trong slot quản trị EIP1967.
+ */
+ function _setAdmin(address newAdmin) private {
+ require(newAdmin != address(0), "ERC1967: new admin is the zero address");
+ StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
+ }
+```
+
+Ngược lại, hợp đồng `wARB` có một `contract_owner` được mã hóa cứng.
+
+```solidity
+contract WrappedArbitrum is Context, IERC20 {
+ .
+ .
+ .
+ address deployer = 0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1;
+ address public contract_owner = 0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33;
+ .
+ .
+ .
+}
+```
+
+[Chủ sở hữu hợp đồng này](https://etherscan.io/address/0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33) không phải là một hợp đồng có thể được kiểm soát bởi các tài khoản khác nhau vào những thời điểm khác nhau, mà là một [tài khoản sở hữu ngoại biên](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs). Điều này có nghĩa là nó có thể được thiết kế để một cá nhân sử dụng trong thời gian ngắn, thay vì là một giải pháp lâu dài để kiểm soát một ERC-20 vẫn còn giá trị.
+
+Và thực vậy, nếu chúng ta xem trên Etherscan, chúng ta sẽ thấy rằng kẻ lừa đảo chỉ sử dụng hợp đồng này trong 12 giờ ([giao dịch đầu tiên](https://etherscan.io/tx/0xf49136198c3f925fcb401870a669d43cecb537bde36eb8b41df77f06d5f6fbc2) đến [giao dịch cuối cùng](https://etherscan.io/tx/0xdfd6e717157354e64bbd5d6adf16761e5a5b3f914b1948d3545d39633244d47b)) trong ngày 19 tháng 5 năm 2023.
+
+### Hàm `_transfer` giả mạo {#the-fake-transfer-function}
+
+Thông thường, các giao dịch chuyển tiền thực tế sẽ xảy ra bằng cách sử dụng [một hàm `_transfer` nội bộ](/developers/tutorials/erc20-annotated-code/#the-_transfer-function-_transfer).
+
+Trong `wARB`, hàm này trông gần như hợp pháp:
+
+```solidity
+ function _transfer(address sender, address recipient, uint256 amount) internal virtual{
+ require(sender != address(0), "ERC20: transfer from the zero address");
+ require(recipient != address(0), "ERC20: transfer to the zero address");
+
+ _beforeTokenTransfer(sender, recipient, amount);
+
+ _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
+ _balances[recipient] = _balances[recipient].add(amount);
+ if (sender == contract_owner){
+ sender = deployer;
+ }
+ emit Transfer(sender, recipient, amount);
+ }
+```
+
+Phần đáng ngờ là:
+
+```solidity
+ if (sender == contract_owner){
+ sender = deployer;
+ }
+ emit Transfer(sender, recipient, amount);
+```
+
+Nếu chủ sở hữu hợp đồng gửi token, tại sao sự kiện `Transfer` lại cho thấy chúng đến từ `deployer`?
+
+Tuy nhiên, có một vấn đề quan trọng hơn. Ai gọi hàm `_transfer` này? Nó không thể được gọi từ bên ngoài, nó được đánh dấu là `internal`. Và mã chúng tôi có không bao gồm bất kỳ lệnh gọi nào đến `_transfer`. Rõ ràng, nó ở đây như một mồi nhử.
+
+```solidity
+ function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
+ _f_(_msgSender(), recipient, amount);
+ return true;
+ }
+
+ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
+ _f_(sender, recipient, amount);
+ _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
+ return true;
+ }
+```
+
+Khi chúng ta xem các hàm được gọi để chuyển token, `transfer` và `transferFrom`, chúng ta thấy rằng chúng gọi một hàm hoàn toàn khác, `_f_`.
+
+### Hàm `_f_` thực sự {#the-real-f-function}
+
+```solidity
+ function _f_(address sender, address recipient, uint256 amount) internal _mod_(sender,recipient,amount) virtual {
+ require(sender != address(0), "ERC20: transfer from the zero address");
+ require(recipient != address(0), "ERC20: transfer to the zero address");
+
+ _beforeTokenTransfer(sender, recipient, amount);
+
+ _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
+ _balances[recipient] = _balances[recipient].add(amount);
+ if (sender == contract_owner){
+
+ sender = deployer;
+ }
+ emit Transfer(sender, recipient, amount);
+ }
+```
+
+Có hai dấu hiệu đáng báo động tiềm ẩn trong hàm này.
+
+- Việc sử dụng [bộ sửa đổi hàm](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `_mod_`. Tuy nhiên, khi xem xét mã nguồn, chúng tôi thấy rằng `_mod_` thực sự vô hại.
+
+ ```solidity
+ modifier _mod_(address sender, address recipient, uint256 amount){
+ _;
+ }
+ ```
+
+- Vấn đề tương tự mà chúng tôi đã thấy trong `_transfer`, đó là khi `contract_owner` gửi token, chúng dường như đến từ `deployer`.
+
+### Hàm sự kiện giả mạo `dropNewTokens` {#the-fake-events-function-dropNewTokens}
+
+Bây giờ chúng ta đến với một cái gì đó trông giống như một trò lừa đảo thực sự. Tôi đã chỉnh sửa hàm một chút để dễ đọc hơn, nhưng về mặt chức năng thì nó tương đương.
+
+```solidity
+function dropNewTokens(address uPool,
+ address[] memory eReceiver,
+ uint256[] memory eAmounts) public auth()
+```
+
+Hàm này có công cụ sửa đổi `auth()`, có nghĩa là nó chỉ có thể được gọi bởi chủ sở hữu hợp đồng.
+
+```solidity
+modifier auth() {
+ require(msg.sender == contract_owner, "Not allowed to interact");
+ _;
+}
+```
+
+Hạn chế này hoàn toàn hợp lý, vì chúng tôi không muốn các tài khoản ngẫu nhiên phân phối token. Tuy nhiên, phần còn lại của hàm rất đáng ngờ.
+
+```solidity
+{
+ for (uint256 i = 0; i < eReceiver.length; i++) {
+ emit Transfer(uPool, eReceiver[i], eAmounts[i]);
+ }
+}
+```
+
+Một hàm để chuyển từ một tài khoản pool đến một mảng người nhận một mảng số tiền là hoàn toàn hợp lý. Có nhiều trường hợp sử dụng trong đó bạn sẽ muốn phân phối token từ một nguồn duy nhất đến nhiều điểm đến, chẳng hạn như trả lương, airdrop, v.v. Sẽ rẻ hơn (về gas) nếu thực hiện trong một giao dịch duy nhất thay vì phát hành nhiều giao dịch hoặc thậm chí gọi ERC-20 nhiều lần từ một hợp đồng khác như một phần của cùng một giao dịch.
+
+Tuy nhiên, `dropNewTokens` không làm điều đó. Nó phát ra các [sự kiện `Transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer-1), nhưng thực sự không chuyển bất kỳ token nào. Không có lý do chính đáng nào để gây nhầm lẫn cho các ứng dụng ngoài chuỗi bằng cách cho chúng biết về một giao dịch chuyển tiền không thực sự xảy ra.
+
+### Hàm `Approve` đốt token {#the-burning-approve-function}
+
+Các hợp đồng ERC-20 được cho là có [hàm `approve`](/developers/tutorials/erc20-annotated-code/#approve) cho các khoản phụ cấp và thực tế token lừa đảo của chúng tôi có một hàm như vậy, và nó thậm chí còn đúng. Tuy nhiên, vì Solidity có nguồn gốc từ C nên nó phân biệt chữ hoa chữ thường. "Approve" và "approve" là các chuỗi khác nhau.
+
+Ngoài ra, chức năng này không liên quan đến `approve`.
+
+```solidity
+ function Approve(
+ address[] memory holders)
+```
+
+Hàm này được gọi với một mảng địa chỉ cho những người nắm giữ token.
+
+```solidity
+ public approver() {
+```
+
+Công cụ sửa đổi `approver()` đảm bảo chỉ `contract_owner` mới được phép gọi hàm này (xem bên dưới).
+
+```solidity
+ for (uint256 i = 0; i < holders.length; i++) {
+ uint256 amount = _balances[holders[i]];
+ _beforeTokenTransfer(holders[i], 0x0000000000000000000000000000000000000001, amount);
+ _balances[holders[i]] = _balances[holders[i]].sub(amount,
+ "ERC20: burn amount exceeds balance");
+ _balances[0x0000000000000000000000000000000000000001] =
+ _balances[0x0000000000000000000000000000000000000001].add(amount);
+ }
+ }
+
+```
+
+Đối với mỗi địa chỉ người nắm giữ, hàm sẽ chuyển toàn bộ số dư của người nắm giữ đến địa chỉ `0x00...01`, đốt nó một cách hiệu quả (hàm `burn` thực tế trong tiêu chuẩn cũng thay đổi tổng cung và chuyển token đến `0x00...00`). Điều này có nghĩa là `contract_owner` có thể xóa tài sản của bất kỳ người dùng nào. Đó không phải là một tính năng mà bạn muốn có trong một token quản trị.
+
+### Các vấn đề về chất lượng mã {#code-quality-issues}
+
+Những vấn đề về chất lượng mã này không _chứng minh_ rằng mã này là một trò lừa đảo, nhưng chúng khiến nó có vẻ đáng ngờ. Các công ty có tổ chức như Arbitrum thường không phát hành mã tệ như vậy.
+
+#### Hàm `mount` {#the-mount-function}
+
+Mặc dù nó không được chỉ định trong [tiêu chuẩn](https://eips.ethereum.org/EIPS/eip-20), nhưng nói chung, hàm tạo ra các token mới được gọi là [`mint`](https://ethereum.org/el/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn).
+
+Nếu chúng ta nhìn vào hàm khởi tạo `wARB`, chúng ta sẽ thấy hàm mint đã được đổi tên thành `mount` vì một lý do nào đó và được gọi năm lần với một phần năm nguồn cung ban đầu, thay vì một lần cho toàn bộ số lượng để đạt hiệu quả.
+
+```solidity
+ constructor () public {
+
+ _name = "Wrapped Arbitrum";
+ _symbol = "wARB";
+ _decimals = 18;
+ uint256 initialSupply = 1000000000000;
+
+ mount(deployer, initialSupply*(10**18)/5);
+ mount(deployer, initialSupply*(10**18)/5);
+ mount(deployer, initialSupply*(10**18)/5);
+ mount(deployer, initialSupply*(10**18)/5);
+ mount(deployer, initialSupply*(10**18)/5);
+ }
+```
+
+Bản thân hàm `mount` cũng đáng ngờ.
+
+```solidity
+ function mount(address account, uint256 amount) public {
+ require(msg.sender == contract_owner, "ERC20: mint to the zero address");
+```
+
+Nhìn vào `require`, chúng ta thấy rằng chỉ chủ sở hữu hợp đồng mới được phép mint. Điều đó là hợp pháp. Nhưng thông báo lỗi phải là _chỉ chủ sở hữu mới được phép mint_ hoặc một cái gì đó tương tự. Thay vào đó, nó là một thông báo không liên quan _ERC20: mint vào địa chỉ không_. Thử nghiệm chính xác cho việc mint vào địa chỉ không là `require(account != address(0), "")`, mà hợp đồng không bao giờ bận tâm kiểm tra.
+
+```solidity
+ _totalSupply = _totalSupply.add(amount);
+ _balances[contract_owner] = _balances[contract_owner].add(amount);
+ emit Transfer(address(0), account, amount);
+ }
+```
+
+Có hai sự kiện đáng ngờ khác, liên quan trực tiếp đến việc mint:
+
+- Có một tham số `account`, có lẽ là tài khoản sẽ nhận số tiền được mint. Nhưng số dư tăng lên thực sự là của `contract_owner`.
+
+- Trong khi số dư tăng thuộc về `contract_owner`, sự kiện được phát ra cho thấy một giao dịch chuyển tiền đến `account`.
+
+### Tại sao lại có cả `auth` và `approver`? Tại sao lại có `mod` không làm gì cả? {#why-both-autho-and-approver-why-the-mod-that-does-nothing}
+
+Hợp đồng này chứa ba công cụ sửa đổi: `_mod_`, `auth` và `approver`.
+
+```solidity
+ modifier _mod_(address sender, address recipient, uint256 amount){
+ _;
+ }
+```
+
+`_mod_` nhận ba tham số và không làm gì với chúng. Tại sao lại có nó?
+
+```solidity
+ modifier auth() {
+ require(msg.sender == contract_owner, "Not allowed to interact");
+ _;
+ }
+
+ modifier approver() {
+ require(msg.sender == contract_owner, "Not allowed to interact");
+ _;
+ }
+```
+
+`auth` và `approver` có ý nghĩa hơn, vì chúng kiểm tra xem hợp đồng có được gọi bởi `contract_owner` hay không. Chúng tôi mong đợi một số hành động đặc quyền nhất định, chẳng hạn như mint, sẽ bị giới hạn trong tài khoản đó. Tuy nhiên, mục đích của việc có hai hàm riêng biệt thực hiện _chính xác cùng một việc_ là gì?
+
+## Chúng ta có thể tự động phát hiện những gì? {#what-can-we-detect-automatically}
+
+Chúng ta có thể thấy `wARB` là một token lừa đảo bằng cách xem Etherscan. Tuy nhiên, đó là một giải pháp tập trung. Về lý thuyết, Etherscan có thể bị lật đổ hoặc bị tấn công. Tốt hơn là có thể tự mình tìm ra một token có hợp pháp hay không.
+
+Có một số thủ thuật chúng ta có thể sử dụng để xác định rằng một token ERC-20 là đáng ngờ (lừa đảo hoặc được viết rất tệ), bằng cách xem các sự kiện mà chúng phát ra.
+
+## Các sự kiện `Approval` đáng ngờ {#suspicious-approval-events}
+
+Các [sự kiện `Approval`](https://eips.ethereum.org/EIPS/eip-20#approval) chỉ nên xảy ra với một yêu cầu trực tiếp (trái ngược với các [sự kiện `Transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer-1) có thể xảy ra do phụ cấp). [Xem tài liệu Solidity](https://docs.soliditylang.org/en/v0.8.20/security-considerations.html#tx-origin) để được giải thích chi tiết về vấn đề này và tại sao các yêu cầu cần phải trực tiếp, thay vì thông qua một hợp đồng.
+
+Điều này có nghĩa là các sự kiện `Approval` phê duyệt chi tiêu từ một [tài khoản sở hữu ngoại biên](/developers/docs/accounts/#types-of-account) phải đến từ các giao dịch bắt nguồn từ tài khoản đó và có đích đến là hợp đồng ERC-20. Bất kỳ loại phê duyệt nào khác từ một tài khoản sở hữu ngoại biên đều đáng ngờ.
+
+Đây là [một chương trình xác định loại sự kiện này](https://github.com/qbzzt/20230915-scam-token-detection), sử dụng [viem](https://viem.sh/) và [TypeScript](https://www.typescriptlang.org/docs/), một biến thể JavaScript với an toàn kiểu. Để chạy nó:
+
+1. Sao chép `.env.example` vào `.env`.
+2. Chỉnh sửa `.env` để cung cấp URL cho một nút mạng chính Ethereum.
+3. Chạy `pnpm install` để cài đặt các gói cần thiết.
+4. Chạy `pnpm susApproval` để tìm kiếm các phê duyệt đáng ngờ.
+
+Đây là giải thích từng dòng:
+
+```typescript
+import {
+ Address,
+ TransactionReceipt,
+ createPublicClient,
+ http,
+ parseAbiItem,
+} from "viem"
+import { mainnet } from "viem/chains"
+```
+
+Nhập định nghĩa kiểu, hàm và định nghĩa chuỗi từ `viem`.
+
+```typescript
+import { config } from "dotenv"
+config()
+```
+
+Đọc `.env` để lấy URL.
+
+```typescript
+const client = createPublicClient({
+ chain: mainnet,
+ transport: http(process.env.URL),
+})
+```
+
+Tạo một ứng dụng Viem. Chúng ta chỉ cần đọc từ chuỗi khối, vì vậy ứng dụng này không cần khoá riêng tư.
+
+```typescript
+const testedAddress = "0xb047c8032b99841713b8e3872f06cf32beb27b82"
+const fromBlock = 16859812n
+const toBlock = 16873372n
+```
+
+Địa chỉ của hợp đồng ERC-20 đáng ngờ và các khối mà chúng tôi sẽ tìm kiếm sự kiện. Các nhà cung cấp nút thường giới hạn khả năng đọc các sự kiện của chúng tôi vì băng thông có thể tốn kém. May mắn là `wARB` không được sử dụng trong khoảng thời gian mười tám giờ, vì vậy chúng ta có thể tìm kiếm tất cả các sự kiện (chỉ có tổng cộng 13 sự kiện).
+
+```typescript
+const approvalEvents = await client.getLogs({
+ address: testedAddress,
+ fromBlock,
+ toBlock,
+ event: parseAbiItem(
+ "event Approval(address indexed _owner, address indexed _spender, uint256 _value)"
+ ),
+})
+```
+
+Đây là cách để yêu cầu Viem cung cấp thông tin sự kiện. Khi chúng tôi cung cấp cho nó chữ ký sự kiện chính xác, bao gồm cả tên trường, nó sẽ phân tích cú pháp sự kiện cho chúng tôi.
+
+```typescript
+const isContract = async (addr: Address): boolean =>
+ await client.getBytecode({ address: addr })
+```
+
+Thuật toán của chúng tôi chỉ áp dụng cho các tài khoản sở hữu ngoại biên. Nếu có bất kỳ chỉ thị biên dịch nào được trả về bởi `client.getBytecode`, điều đó có nghĩa đây là một hợp đồng và chúng ta nên bỏ qua nó.
+
+Nếu bạn chưa từng sử dụng TypeScript trước đây, định nghĩa hàm có thể trông hơi lạ. Chúng tôi không chỉ cho nó biết tham số đầu tiên (và duy nhất) được gọi là `addr`, mà còn cho biết nó thuộc loại `Address`. Tương tự, phần `: boolean` cho TypeScript biết rằng giá trị trả về của hàm là một giá trị boolean.
+
+```typescript
+const getEventTxn = async (ev: Event): TransactionReceipt =>
+ await client.getTransactionReceipt({ hash: ev.transactionHash })
+```
+
+Hàm này lấy biên lai giao dịch từ một sự kiện. Chúng tôi cần biên lai để đảm bảo chúng tôi biết đích đến của giao dịch là gì.
+
+```typescript
+const suspiciousApprovalEvent = async (ev : Event) : (Event | null) => {
+```
+
+Đây là hàm quan trọng nhất, hàm thực sự quyết định một sự kiện có đáng ngờ hay không. Kiểu trả về, `(Event | null)`, cho TypeScript biết rằng hàm này có thể trả về một `Event` hoặc `null`. Chúng tôi trả về `null` nếu sự kiện không đáng ngờ.
+
+```typescript
+const owner = ev.args._owner
+```
+
+Viem có tên trường, vì vậy nó đã phân tích cú pháp sự kiện cho chúng tôi. `_owner` là chủ sở hữu của các token sẽ được chi tiêu.
+
+```typescript
+// Phê duyệt bởi các hợp đồng không đáng ngờ
+if (await isContract(owner)) return null
+```
+
+Nếu chủ sở hữu là một hợp đồng, hãy cho rằng sự chấp thuận này không đáng ngờ. Để kiểm tra xem sự chấp thuận của một hợp đồng có đáng ngờ hay không, chúng ta sẽ cần phải theo dõi toàn bộ quá trình thực hiện của giao dịch để xem liệu nó có bao giờ đến được hợp đồng của chủ sở hữu hay không, và liệu hợp đồng đó có gọi trực tiếp hợp đồng ERC-20 hay không. Điều đó tốn nhiều tài nguyên hơn chúng ta muốn làm.
+
+```typescript
+const txn = await getEventTxn(ev)
+```
+
+Nếu sự chấp thuận đến từ một tài khoản sở hữu ngoại biên, hãy lấy giao dịch đã gây ra nó.
+
+```typescript
+// Phê duyệt là đáng ngờ nếu nó đến từ một chủ sở hữu EOA không phải là `from` của giao dịch
+if (owner.toLowerCase() != txn.from.toLowerCase()) return ev
+```
+
+Chúng ta không thể chỉ kiểm tra sự bằng nhau của chuỗi vì địa chỉ là hệ thập lục phân, vì vậy chúng chứa các chữ cái. Đôi khi, ví dụ như trong `txn.from`, tất cả các chữ cái đó đều là chữ thường. Trong các trường hợp khác, chẳng hạn như `ev.args._owner`, địa chỉ ở dạng [chữ hoa chữ thường hỗn hợp để xác định lỗi](https://eips.ethereum.org/EIPS/eip-55).
+
+Nhưng nếu giao dịch không phải từ chủ sở hữu và chủ sở hữu đó là sở hữu ngoại biên, thì chúng ta có một giao dịch đáng ngờ.
+
+```typescript
+// Nó cũng đáng ngờ nếu đích đến của giao dịch không phải là hợp đồng ERC-20 mà chúng ta đang
+// điều tra
+if (txn.to.toLowerCase() != testedAddress) return ev
+```
+
+Tương tự, nếu địa chỉ `to` của giao dịch, hợp đồng đầu tiên được gọi, không phải là hợp đồng ERC-20 đang được điều tra thì nó đáng ngờ.
+
+```typescript
+ // Nếu không có lý do gì để nghi ngờ, hãy trả về null.
+ return null
+}
+```
+
+Nếu không có điều kiện nào là đúng thì sự kiện `Approval` không đáng ngờ.
+
+```typescript
+const testPromises = approvalEvents.map((ev) => suspiciousApprovalEvent(ev))
+const testResults = (await Promise.all(testPromises)).filter((x) => x != null)
+
+console.log(testResults)
+```
+
+[Một hàm `async`](https://www.w3schools.com/js/js_async.asp) trả về một đối tượng `Promise`. Với cú pháp phổ biến, `await x()`, chúng ta chờ cho `Promise` đó được thực hiện trước khi tiếp tục xử lý. Điều này đơn giản để lập trình và làm theo, nhưng nó cũng không hiệu quả. Trong khi chúng ta đang chờ `Promise` cho một sự kiện cụ thể được thực hiện, chúng ta đã có thể bắt đầu xử lý sự kiện tiếp theo.
+
+Ở đây chúng tôi sử dụng [`map`](https://www.w3schools.com/jsref/jsref_map.asp) để tạo một mảng các đối tượng `Promise`. Sau đó, chúng tôi sử dụng [`Promise.all`](https://www.javascripttutorial.net/es6/javascript-promise-all/) để chờ tất cả các promise đó được giải quyết. Sau đó, chúng tôi [`filter`](https://www.w3schools.com/jsref/jsref_filter.asp) các kết quả đó để loại bỏ các sự kiện không đáng ngờ.
+
+### Các sự kiện `Transfer` đáng ngờ {#suspicious-transfer-events}
+
+Một cách khả thi khác để xác định các token lừa đảo là xem chúng có bất kỳ giao dịch chuyển tiền đáng ngờ nào không. Ví dụ: chuyển tiền từ các tài khoản không có nhiều token. Bạn có thể xem [cách triển khai thử nghiệm này](https://github.com/qbzzt/20230915-scam-token-detection/blob/main/susTransfer.ts), nhưng `wARB` không gặp phải vấn đề này.
+
+## Kết luận {#conclusion}
+
+Việc phát hiện tự động các trò lừa đảo ERC-20 bị ảnh hưởng bởi [kết quả âm tính giả](https://en.wikipedia.org/wiki/False_positives_and_false_negatives#False_negative_error), bởi vì một trò lừa đảo có thể sử dụng một hợp đồng token ERC-20 hoàn toàn bình thường mà không đại diện cho bất cứ thứ gì thực. Vì vậy, bạn nên luôn cố gắng _lấy địa chỉ token từ một nguồn đáng tin cậy_.
+
+Phát hiện tự động có thể giúp ích trong một số trường hợp nhất định, chẳng hạn như các phần DeFi, nơi có nhiều token và chúng cần được xử lý tự động. Nhưng như mọi khi [caveat emptor](https://www.investopedia.com/terms/c/caveatemptor.asp), hãy tự nghiên cứu và khuyến khích người dùng của bạn làm tương tự.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
diff --git a/public/content/translations/vi/developers/tutorials/secret-state/index.md b/public/content/translations/vi/developers/tutorials/secret-state/index.md
new file mode 100644
index 00000000000..25903d5cf67
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/secret-state/index.md
@@ -0,0 +1,741 @@
+---
+title: Sử dụng không kiến thức cho một trạng thái bí mật
+description: các trò chơi trên chuỗi bị giới hạn vì chúng không thể giữ bất kỳ thông tin ẩn nào. Sau khi đọc hướng dẫn này, người đọc sẽ có thể kết hợp các bằng chứng không kiến thức và các thành phần máy chủ để tạo ra các trò chơi có thể xác minh với một trạng thái bí mật, thành phần ngoài chuỗi. Kỹ thuật để làm điều này sẽ được minh họa bằng cách tạo ra một trò chơi dò mìn.
+author: Ori Pomerantz
+tags:
+ [
+ "máy chủ",
+ "ngoài chuỗi",
+ "tập trung",
+ "không tiết lộ thông tin",
+ "zokrates",
+ "mud"
+ ]
+skill: advanced
+lang: vi
+published: 2025-03-15
+---
+
+_Không có bí mật nào trên chuỗi khối_. Mọi thứ được đăng trên chuỗi khối đều công khai cho mọi người đọc. Điều này là cần thiết, bởi vì chuỗi khối dựa trên việc bất kỳ ai cũng có thể xác minh nó. Tuy nhiên, các trò chơi thường dựa vào trạng thái bí mật. Ví dụ, trò chơi [dò mìn](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\)) hoàn toàn vô nghĩa nếu bạn chỉ có thể vào một trình duyệt khối và xem bản đồ.
+
+Giải pháp đơn giản nhất là sử dụng một [thành phần máy chủ](/developers/tutorials/server-components/) để giữ trạng thái bí mật. Tuy nhiên, lý do chúng ta sử dụng chuỗi khối là để ngăn chặn việc gian lận bởi nhà phát triển trò chơi. Chúng ta cần đảm bảo tính trung thực của thành phần máy chủ. Máy chủ có thể cung cấp một hàm băm của trạng thái, và sử dụng [bằng chứng không kiến thức](/zero-knowledge-proofs/#why-zero-knowledge-proofs-are-important) để chứng minh rằng trạng thái được sử dụng để tính toán kết quả của một nước đi là đúng.
+
+Sau khi đọc bài viết này, bạn sẽ biết cách tạo ra loại máy chủ giữ trạng thái bí mật này, một ứng dụng để hiển thị trạng thái và một thành phần trên chuỗi để giao tiếp giữa hai bên. Các công cụ chính chúng tôi sẽ sử dụng là:
+
+| Công cụ | Mục đích | Đã xác minh trên phiên bản |
+| --------------------------------------------- | ------------------------------------------------- | --------------------------------------: |
+| [Zokrates](https://zokrates.github.io/) | Bằng chứng không kiến thức và việc xác minh chúng | 1.1.9 |
+| [Typescript](https://www.typescriptlang.org/) | Ngôn ngữ lập trình cho cả máy chủ và ứng dụng | 5.4.2 |
+| [Node](https://nodejs.org/en) | Chạy máy chủ | 20.18.2 |
+| [Viem](https://viem.sh/) | Giao tiếp với Chuỗi khối | 2.9.20 |
+| [MUD](https://mud.dev/) | Quản lý dữ liệu trên chuỗi | 2.0.12 |
+| [React](https://react.dev/) | Giao diện người dùng ứng dụng | 18.2.0 |
+| [Vite](https://vitejs.dev/) | Phục vụ mã ứng dụng | 4.2.1 |
+
+## Ví dụ về Dò mìn {#minesweeper}
+
+[Dò mìn](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\)) là một trò chơi có bản đồ bí mật với một bãi mìn. Người chơi chọn đào ở một vị trí cụ thể. Nếu vị trí đó có mìn, trò chơi kết thúc. Nếu không, người chơi sẽ nhận được số lượng mìn trong tám ô xung quanh vị trí đó.
+
+Ứng dụng này được viết bằng [MUD](https://mud.dev/), một framework cho phép chúng ta lưu trữ dữ liệu trên chuỗi bằng cách sử dụng [cơ sở dữ liệu khóa-giá trị](https://aws.amazon.com/nosql/key-value/) và tự động đồng bộ hóa dữ liệu đó với các thành phần ngoài chuỗi. Ngoài việc đồng bộ hóa, MUD giúp dễ dàng cung cấp kiểm soát truy cập và cho phép những người dùng khác [mở rộng](https://mud.dev/guides/extending-a-world) ứng dụng của chúng tôi một cách không cần cấp phép.
+
+### Chạy ví dụ dò mìn {#running-minesweeper-example}
+
+Để chạy ví dụ dò mìn:
+
+1. Hãy chắc chắn rằng bạn đã [cài đặt các điều kiện tiên quyết](https://mud.dev/quickstart#prerequisites): [Node](https://mud.dev/quickstart#prerequisites), [Foundry](https://book.getfoundry.sh/getting-started/installation), [`git`](https://git-scm.com/downloads), [`pnpm`](https://git-scm.com/downloads), và [`mprocs`](https://github.com/pvolok/mprocs).
+
+2. Sao chép kho lưu trữ.
+
+ ```sh copy
+ git clone https://github.com/qbzzt/20240901-secret-state.git
+ ```
+
+3. Cài đặt các gói.
+
+ ```sh copy
+ cd 20240901-secret-state/
+ pnpm install
+ npm install -g mprocs
+ ```
+
+ Nếu Foundry được cài đặt như một phần của `pnpm install`, bạn cần khởi động lại shell dòng lệnh.
+
+4. Biên dịch các hợp đồng
+
+ ```sh copy
+ cd packages/contracts
+ forge build
+ cd ../..
+ ```
+
+5. Khởi động chương trình (bao gồm một chuỗi khối [anvil](https://book.getfoundry.sh/anvil/)) và chờ đợi.
+
+ ```sh copy
+ mprocs
+ ```
+
+ Lưu ý rằng quá trình khởi động mất nhiều thời gian. Để xem tiến trình, trước tiên hãy sử dụng phím mũi tên xuống để cuộn đến tab _contracts_ để xem các hợp đồng MUD đang được triển khai. Khi bạn nhận được thông báo _Waiting for file changes…_, các hợp đồng đã được triển khai và tiến trình tiếp theo sẽ diễn ra trong tab _server_. Ở đó, bạn đợi cho đến khi nhận được thông báo _Verifier address: 0x...._.
+
+ Nếu bước này thành công, bạn sẽ thấy màn hình `mprocs`, với các quy trình khác nhau ở bên trái và đầu ra của bảng điều khiển cho quy trình hiện được chọn ở bên phải.
+
+ 
+
+ Nếu có vấn đề với `mprocs`, bạn có thể chạy bốn quy trình theo cách thủ công, mỗi quy trình trong cửa sổ dòng lệnh riêng của nó:
+
+ - **Anvil**
+
+ ```sh
+ cd packages/contracts
+ anvil --base-fee 0 --block-time 2
+ ```
+
+ - **Các hợp đồng**
+
+ ```sh
+ cd packages/contracts
+ pnpm mud dev-contracts --rpc http://127.0.0.1:8545
+ ```
+
+ - **Máy chủ**
+
+ ```sh
+ cd packages/server
+ pnpm start
+ ```
+
+ - **Ứng dụng**
+
+ ```sh
+ cd packages/client
+ pnpm run dev
+ ```
+
+6. Bây giờ bạn có thể duyệt đến [ứng dụng](http://localhost:3000), nhấp vào **New Game**, và bắt đầu chơi.
+
+### Bảng {#tables}
+
+Chúng ta cần [một vài bảng](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts) trên chuỗi.
+
+- `Configuration`: Bảng này là một singleton, nó không có khóa và chỉ có một bản ghi duy nhất. Nó được dùng để chứa thông tin cấu hình trò chơi:
+ - `height`: Chiều cao của một bãi mìn
+ - `width`: Chiều rộng của một bãi mìn
+ - `numberOfBombs`: Số lượng bom trong mỗi bãi mìn
+
+- `VerifierAddress`: Bảng này cũng là một singleton. Nó được sử dụng để giữ một phần của cấu hình, địa chỉ của hợp đồng xác minh (`verifier`). Chúng ta có thể đã đặt thông tin này trong bảng `Configuration`, nhưng nó được thiết lập bởi một thành phần khác, máy chủ, vì vậy việc đặt nó trong một bảng riêng sẽ dễ dàng hơn.
+
+- `PlayerGame`: Khóa là địa chỉ của người chơi. Dữ liệu là:
+
+ - `gameId`: giá trị 32 byte là hàm băm của bản đồ mà người chơi đang chơi (định danh trò chơi).
+ - `win`: một giá trị boolean cho biết liệu người chơi đã thắng trò chơi hay chưa.
+ - `lose`: một giá trị boolean cho biết liệu người chơi đã thua trò chơi hay chưa.
+ - `digNumber`: số lần đào thành công trong trò chơi.
+
+- `GamePlayer`: Bảng này giữ ánh xạ ngược, từ `gameId` đến địa chỉ người chơi.
+
+- `Map`: Khóa là một bộ ba giá trị:
+
+ - `gameId`: giá trị 32 byte là hàm băm của bản đồ mà người chơi đang chơi (định danh trò chơi).
+ - tọa độ `x`
+ - tọa độ `y`
+
+ Giá trị là một số duy nhất. Nó là 255 nếu một quả bom được phát hiện. Nếu không, nó là số lượng bom xung quanh vị trí đó cộng một. Chúng tôi không thể chỉ sử dụng số lượng bom, bởi vì theo mặc định, tất cả bộ nhớ trong máy ảo Ethereum và tất cả các giá trị hàng trong MUD đều bằng không. Chúng ta cần phân biệt giữa "người chơi chưa đào ở đây" và "người chơi đã đào ở đây, và thấy có không có quả bom nào xung quanh".
+
+Ngoài ra, việc giao tiếp giữa ứng dụng và máy chủ diễn ra thông qua thành phần trên chuỗi. Điều này cũng được thực hiện bằng cách sử dụng các bảng.
+
+- `PendingGame`: Các yêu cầu chưa được phục vụ để bắt đầu một trò chơi mới.
+- `PendingDig`: Các yêu cầu chưa được phục vụ để đào tại một vị trí cụ thể trong một trò chơi cụ thể. Đây là một [bảng ngoài chuỗi](https://mud.dev/store/tables#types-of-tables), có nghĩa là nó không được ghi vào bộ nhớ máy ảo Ethereum, nó chỉ có thể được đọc ngoài chuỗi bằng các sự kiện.
+
+### Luồng thực thi và dữ liệu {#execution-data-flows}
+
+Các luồng này điều phối việc thực thi giữa ứng dụng, thành phần trên chuỗi và máy chủ.
+
+#### Khởi tạo {#initialization-flow}
+
+Khi bạn chạy `mprocs`, các bước sau sẽ xảy ra:
+
+1. [`mprocs`](https://github.com/pvolok/mprocs) chạy bốn thành phần:
+
+ - [Anvil](https://book.getfoundry.sh/anvil/), chạy một chuỗi khối cục bộ
+ - [Contracts](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/contracts), biên dịch (nếu cần) và triển khai các hợp đồng cho MUD
+ - [Ứng dụng](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/client), chạy [Vite](https://vitejs.dev/) để phục vụ giao diện người dùng và mã ứng dụng cho các trình duyệt web.
+ - [Máy chủ](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/server), thực hiện các hành động của máy chủ
+
+2. Gói `contracts` triển khai các hợp đồng MUD và sau đó chạy [tập lệnh `PostDeploy.s.sol`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol). Tập lệnh này thiết lập cấu hình. Mã từ github chỉ định [một bãi mìn 10x5 với tám quả mìn trong đó](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol#L23).
+
+3. [Máy chủ](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts) bắt đầu bằng cách [thiết lập MUD](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L6). Trong số những thứ khác, điều này kích hoạt đồng bộ hóa dữ liệu, để một bản sao của các bảng liên quan tồn tại trong bộ nhớ của máy chủ.
+
+4. Máy chủ đăng ký một hàm để được thực thi [khi bảng `Configuration` thay đổi](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L23). [Hàm này](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L24-L168) được gọi sau khi `PostDeploy.s.sol` thực thi và sửa đổi bảng.
+
+5. Khi hàm khởi tạo máy chủ có cấu hình, [nó gọi `zkFunctions`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L34-L35) để khởi tạo [phần không kiến thức của máy chủ](#using-zokrates-from-typescript). Điều này không thể xảy ra cho đến khi chúng ta nhận được cấu hình vì các hàm không kiến thức phải có chiều rộng và chiều cao của bãi mìn làm hằng số.
+
+6. Sau khi phần không kiến thức của máy chủ được khởi tạo, bước tiếp theo là [triển khai hợp đồng xác minh không kiến thức lên chuỗi khối](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L42-L53) và đặt địa chỉ của người được xác minh trong MUD.
+
+7. Cuối cùng, chúng tôi đăng ký các bản cập nhật để chúng tôi sẽ thấy khi người chơi yêu cầu [bắt đầu một trò chơi mới](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71) hoặc [đào trong một trò chơi hiện có](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73-L108).
+
+#### Trò chơi mới {#new-game-flow}
+
+Đây là những gì xảy ra khi người chơi yêu cầu một trò chơi mới.
+
+1. Nếu không có trò chơi nào đang diễn ra cho người chơi này, hoặc có một trò chơi nhưng với gameId bằng không, ứng dụng sẽ hiển thị một [nút trò chơi mới](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175). Khi người dùng nhấn nút này, [React sẽ chạy hàm `newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L96).
+
+2. [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L43-L46) là một lệnh gọi `System`. Trong MUD, tất cả các lệnh gọi đều được định tuyến thông qua hợp đồng `World`, và trong hầu hết các trường hợp, bạn gọi `__`. Trong trường hợp này, lệnh gọi là `app__newGame`, mà MUD sau đó sẽ định tuyến đến [`newGame` trong `GameSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L16-L22).
+
+3. Hàm trên chuỗi kiểm tra xem người chơi có đang trong một trò chơi hay không, và nếu không có, nó sẽ [thêm yêu cầu vào bảng `PendingGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L21).
+
+4. Máy chủ phát hiện thay đổi trong `PendingGame` và [chạy hàm đã đăng ký](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71). Hàm này gọi [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L110-L114), và hàm này lại gọi [`createGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L116-L144).
+
+5. Điều đầu tiên `createGame` làm là [tạo một bản đồ ngẫu nhiên với số lượng mìn phù hợp](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L120-L135). Sau đó, nó gọi [`makeMapBorders`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L147-L166) để tạo một bản đồ với các đường viền trống, điều này là cần thiết cho Zokrates. Cuối cùng, `createGame` gọi [`calculateMapHash`](#calculateMapHash), để lấy hàm băm của bản đồ, được sử dụng làm ID trò chơi.
+
+6. Hàm `newGame` thêm trò chơi mới vào `gamesInProgress`.
+
+7. Điều cuối cùng máy chủ làm là gọi [`app__newGameResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L38-L43), một hàm trên chuỗi. Hàm này nằm trong một `System` khác, [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol), để cho phép kiểm soát truy cập. Kiểm soát truy cập được định nghĩa trong [tệp cấu hình MUD](https://mud.dev/config), [`mud.config.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts#L67-L72).
+
+ Danh sách truy cập chỉ cho phép một địa chỉ duy nhất gọi `System`. Điều này hạn chế quyền truy cập vào các chức năng của máy chủ cho một địa chỉ duy nhất, vì vậy không ai có thể mạo danh máy chủ.
+
+8. Thành phần trên chuỗi cập nhật các bảng liên quan:
+
+ - Tạo trò chơi trong `PlayerGame`.
+ - Thiết lập ánh xạ ngược trong `GamePlayer`.
+ - Xóa yêu cầu khỏi `PendingGame`.
+
+9. Máy chủ xác định sự thay đổi trong `PendingGame`, nhưng không làm gì vì [`wantsGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L58-L60) là false.
+
+10. Trên ứng dụng [`gameRecord`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L143-L148) được đặt thành mục `PlayerGame` cho địa chỉ của người chơi. Khi `PlayerGame` thay đổi, `gameRecord` cũng thay đổi.
+
+11. Nếu có giá trị trong `gameRecord`, và trò chơi chưa thắng hay thua, ứng dụng sẽ [hiển thị bản đồ](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190).
+
+#### Đào {#dig-flow}
+
+1. Người chơi [nhấp vào nút của ô trên bản đồ](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L188), hành động này sẽ gọi [hàm `dig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L33-L36). Hàm này gọi [`dig` trên chuỗi](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L24-L32).
+
+2. Thành phần trên chuỗi [thực hiện một số kiểm tra tính hợp lệ](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L25-L30), và nếu thành công, nó sẽ thêm yêu cầu đào vào [`PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L31).
+
+3. Máy chủ [phát hiện sự thay đổi trong `PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73). [Nếu nó hợp lệ](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L75-L84), nó sẽ [gọi mã không kiến thức](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L86-L95) (được giải thích bên dưới) để tạo ra cả kết quả và một bằng chứng rằng nó hợp lệ.
+
+4. [Máy chủ](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L97-L107) gọi [`digResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L45-L64) trên chuỗi.
+
+5. `digResponse` thực hiện hai việc. Đầu tiên, nó kiểm tra [bằng chứng không kiến thức](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L47-L61). Sau đó, nếu bằng chứng được xác minh, nó sẽ gọi [`processDigResult`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L67-L86) để thực sự xử lý kết quả.
+
+6. `processDigResult` kiểm tra xem trò chơi đã [thua](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L76-L78) hay [thắng](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L83-L86), và [cập nhật `Map`, bản đồ trên chuỗi](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L80).
+
+7. Ứng dụng tự động nhận các bản cập nhật và [cập nhật bản đồ hiển thị cho người chơi](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190), và nếu có thể, thông báo cho người chơi biết họ thắng hay thua.
+
+## Sử dụng Zokrates {#using-zokrates}
+
+Trong các luồng đã giải thích ở trên, chúng ta đã bỏ qua các phần không kiến thức, coi chúng như một hộp đen. Bây giờ hãy mở nó ra và xem mã đó được viết như thế nào.
+
+### Băm bản đồ {#hashing-map}
+
+Chúng ta có thể sử dụng [mã JavaScript này](https://github.com/ZK-Plus/ICBC24_Tutorial_Compute-Offchain-Verify-onchain/tree/solutions/exercise) để triển khai [Poseidon](https://www.poseidon-hash.info), hàm băm Zokrates mà chúng ta sử dụng. Tuy nhiên, mặc dù cách này sẽ nhanh hơn, nhưng nó cũng sẽ phức tạp hơn so với việc chỉ sử dụng hàm băm Zokrates để thực hiện. Đây là một hướng dẫn, vì vậy mã được tối ưu hóa cho sự đơn giản, không phải cho hiệu suất. Do đó, chúng ta cần hai chương trình Zokrates khác nhau, một chương trình chỉ để tính toán hàm băm của một bản đồ (`hash`) và một chương trình khác để thực sự tạo ra một bằng chứng không kiến thức về kết quả của việc đào tại một vị trí trên bản đồ (`dig`).
+
+### Hàm băm {#hash-function}
+
+Đây là hàm tính toán hàm băm của một bản đồ. Chúng ta sẽ xem qua từng dòng mã này.
+
+```
+import "hashes/poseidon/poseidon.zok" as poseidon;
+import "utils/pack/bool/pack128.zok" as pack128;
+```
+
+Hai dòng này nhập hai hàm từ [thư viện chuẩn Zokrates](https://zokrates.github.io/toolbox/stdlib.html). [Hàm đầu tiên](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/hashes/poseidon/poseidon.zok) là một [hàm băm Poseidon](https://www.poseidon-hash.info/). Nó nhận một mảng các phần tử [`field`](https://zokrates.github.io/language/types.html#field) và trả về một `field`.
+
+Phần tử trường trong Zokrates thường nhỏ hơn 256 bit, nhưng không nhiều. Để đơn giản hóa mã, chúng tôi giới hạn bản đồ ở mức tối đa 512 bit và băm một mảng gồm bốn trường, và trong mỗi trường, chúng tôi chỉ sử dụng 128 bit. [Hàm `pack128`](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/utils/pack/bool/pack128.zok) thay đổi một mảng 128 bit thành một `field` cho mục đích này.
+
+```
+ def hashMap(bool[${width+2}][${height+2}] map) -> field {
+```
+
+Dòng này bắt đầu định nghĩa một hàm. `hashMap` nhận một tham số duy nhất có tên là `map`, một mảng `bool`(ean) hai chiều. Kích thước của bản đồ là `width+2` nhân `height+2` vì những lý do được [giải thích bên dưới](#why-map-border).
+
+Chúng ta có thể sử dụng `${width+2}` và `${height+2}` vì các chương trình Zokrates được lưu trữ trong ứng dụng này dưới dạng [chuỗi mẫu](https://www.w3schools.com/js/js_string_templates.asp). Mã giữa `${` và `}` được đánh giá bởi JavaScript, và bằng cách này, chương trình có thể được sử dụng cho các kích thước bản đồ khác nhau. Tham số bản đồ có một đường viền rộng một vị trí bao quanh nó mà không có quả bom nào, đó là lý do chúng ta cần thêm hai vào chiều rộng và chiều cao.
+
+Giá trị trả về là một `field` chứa hàm băm.
+
+```
+ bool[512] mut map1d = [false; 512];
+```
+
+Bản đồ là hai chiều. Tuy nhiên, hàm `pack128` không hoạt động với mảng hai chiều. Vì vậy, trước tiên chúng ta làm phẳng bản đồ thành một mảng 512 byte, sử dụng `map1d`. Theo mặc định, các biến Zokrates là hằng số, nhưng chúng ta cần gán giá trị cho mảng này trong một vòng lặp, vì vậy chúng ta định nghĩa nó là [`mut`](https://zokrates.github.io/language/variables.html#mutability).
+
+Chúng ta cần khởi tạo mảng vì Zokrates không có `undefined`. Biểu thức `[false; 512]` có nghĩa là [một mảng gồm 512 giá trị `false`](https://zokrates.github.io/language/types.html#declaration-and-initialization).
+
+```
+ u32 mut counter = 0;
+```
+
+Chúng ta cũng cần một bộ đếm để phân biệt giữa các bit chúng ta đã điền vào `map1d` và những bit chưa điền.
+
+```
+ for u32 x in 0..${width+2} {
+```
+
+Đây là cách bạn khai báo một [vòng lặp `for`](https://zokrates.github.io/language/control_flow.html#for-loops) trong Zokrates. Một vòng lặp `for` của Zokrates phải có giới hạn cố định, bởi vì mặc dù nó có vẻ là một vòng lặp, trình biên dịch thực sự "mở rộng" nó. Biểu thức `${width+2}` là một hằng số tại thời điểm biên dịch vì `width` được thiết lập bởi mã TypeScript trước khi nó gọi trình biên dịch.
+
+```
+ for u32 y in 0..${height+2} {
+ map1d[counter] = map[x][y];
+ counter = counter+1;
+ }
+ }
+```
+
+Đối với mỗi vị trí trong bản đồ, đặt giá trị đó vào mảng `map1d` và tăng bộ đếm.
+
+```
+ field[4] hashMe = [
+ pack128(map1d[0..128]),
+ pack128(map1d[128..256]),
+ pack128(map1d[256..384]),
+ pack128(map1d[384..512])
+ ];
+```
+
+`pack128` để tạo một mảng gồm bốn giá trị `field` từ `map1d`. Trong Zokrates, `array[a..b]` có nghĩa là lát cắt của mảng bắt đầu tại `a` và kết thúc tại `b-1`.
+
+```
+ return poseidon(hashMe);
+}
+```
+
+Sử dụng `poseidon` để chuyển đổi mảng này thành một hàm băm.
+
+### Chương trình băm {#hash-program}
+
+Máy chủ cần gọi `hashMap` trực tiếp để tạo định danh trò chơi. Tuy nhiên, Zokrates chỉ có thể gọi hàm `main` trên một chương trình để bắt đầu, vì vậy chúng tôi tạo một chương trình với một `main` gọi hàm băm.
+
+```
+${hashFragment}
+
+def main(bool[${width+2}][${height+2}] map) -> field {
+ return hashMap(map);
+}
+```
+
+### Chương trình đào {#dig-program}
+
+Đây là trung tâm của phần không kiến thức của ứng dụng, nơi chúng tôi tạo ra các bằng chứng được sử dụng để xác minh kết quả đào.
+
+```
+${hashFragment}
+
+// Số lượng mìn tại vị trí (x,y)
+def map2mineCount(bool[${width+2}][${height+2}] map, u32 x, u32 y) -> u8 {
+ return if map[x+1][y+1] { 1 } else { 0 };
+}
+```
+
+#### Tại sao lại có đường viền bản đồ {#why-map-border}
+
+Bằng chứng không kiến thức sử dụng [mạch số học](https://medium.com/web3studio/simple-explanations-of-arithmetic-circuits-and-zero-knowledge-proofs-806e59a79785), không có cách tương đương dễ dàng với một câu lệnh `if`. Thay vào đó, chúng sử dụng tương đương của [toán tử điều kiện](https://en.wikipedia.org/wiki/Ternary_conditional_operator). Nếu `a` có thể là không hoặc một, bạn có thể tính `if a { b } else { c }` là `ab+(1-a)c`.
+
+Vì điều này, một câu lệnh `if` của Zokrates luôn đánh giá cả hai nhánh. Ví dụ, nếu bạn có mã này:
+
+```
+bool[5] arr = [false; 5];
+u32 index=10;
+return if index>4 { 0 } else { arr[index] }
+```
+
+Nó sẽ báo lỗi, bởi vì nó cần tính toán `arr[10]`, mặc dù giá trị đó sau đó sẽ được nhân với không.
+
+Đây là lý do chúng ta cần một đường viền rộng một vị trí bao quanh bản đồ. Chúng ta cần tính tổng số mìn xung quanh một vị trí, và điều đó có nghĩa là chúng ta cần xem vị trí ở hàng trên và dưới, bên trái và bên phải của vị trí chúng ta đang đào. Điều đó có nghĩa là những vị trí đó phải tồn tại trong mảng bản đồ mà Zokrates được cung cấp.
+
+```
+def main(private bool[${width+2}][${height+2}] map, u32 x, u32 y) -> (field, u8) {
+```
+
+Theo mặc định, các bằng chứng Zokrates bao gồm các đầu vào của chúng. Sẽ không có ích gì khi biết có năm quả mìn xung quanh một điểm trừ khi bạn thực sự biết đó là điểm nào (và bạn không thể chỉ khớp nó với yêu cầu của mình, bởi vì khi đó người chứng minh có thể sử dụng các giá trị khác nhau và không cho bạn biết về điều đó). Tuy nhiên, chúng ta cần giữ bí mật bản đồ, trong khi cung cấp nó cho Zokrates. Giải pháp là sử dụng một tham số `private`, một tham số _không_ được tiết lộ bởi bằng chứng.
+
+Điều này mở ra một con đường khác để lạm dụng. Người chứng minh có thể sử dụng các tọa độ chính xác, nhưng tạo ra một bản đồ với bất kỳ số lượng mìn nào xung quanh vị trí đó, và có thể cả tại chính vị trí đó. Để ngăn chặn sự lạm dụng này, chúng tôi làm cho bằng chứng không kiến thức bao gồm cả hàm băm của bản đồ, đó là định danh trò chơi.
+
+```
+ return (hashMap(map),
+```
+
+Giá trị trả về ở đây là một tuple bao gồm mảng băm bản đồ cũng như kết quả đào.
+
+```
+ if map2mineCount(map, x, y) > 0 { 0xFF } else {
+```
+
+Chúng tôi sử dụng 255 làm giá trị đặc biệt trong trường hợp chính vị trí đó có bom.
+
+```
+ map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) +
+ map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) +
+ map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1)
+ }
+ );
+}
+```
+
+Nếu người chơi không trúng mìn, hãy cộng số lượng mìn cho khu vực xung quanh vị trí đó và trả về kết quả đó.
+
+### Sử dụng Zokrates từ TypeScript {#using-zokrates-from-typescript}
+
+Zokrates có một giao diện dòng lệnh, nhưng trong chương trình này chúng ta sử dụng nó trong [mã TypeScript](https://zokrates.github.io/toolbox/zokrates_js.html).
+
+Thư viện chứa các định nghĩa Zokrates được gọi là [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts).
+
+```typescript
+import { initialize as zokratesInitialize } from "zokrates-js"
+```
+
+Nhập [các ràng buộc JavaScript của Zokrates](https://zokrates.github.io/toolbox/zokrates_js.html). Chúng ta chỉ cần hàm [`initialize`](https://zokrates.github.io/toolbox/zokrates_js.html#initialize) vì nó trả về một promise giải quyết thành tất cả các định nghĩa của Zokrates.
+
+```typescript
+export const zkFunctions = async (width: number, height: number) : Promise => {
+```
+
+Tương tự như chính Zokrates, chúng tôi cũng chỉ xuất một hàm, cũng là [bất đồng bộ](https://www.w3schools.com/js/js_async.asp). Khi cuối cùng nó trả về, nó cung cấp một số hàm như chúng ta sẽ thấy bên dưới.
+
+```typescript
+const zokrates = await zokratesInitialize()
+```
+
+Khởi tạo Zokrates, nhận mọi thứ chúng ta cần từ thư viện.
+
+```typescript
+const hashFragment = `
+ import "utils/pack/bool/pack128.zok" as pack128;
+ import "hashes/poseidon/poseidon.zok" as poseidon;
+ .
+ .
+ .
+ }
+ `
+
+const hashProgram = `
+ ${hashFragment}
+ .
+ .
+ .
+ `
+
+const digProgram = `
+ ${hashFragment}
+ .
+ .
+ .
+ `
+```
+
+Tiếp theo, chúng ta có hàm băm và hai chương trình Zokrates mà chúng ta đã thấy ở trên.
+
+```typescript
+const digCompiled = zokrates.compile(digProgram)
+const hashCompiled = zokrates.compile(hashProgram)
+```
+
+Ở đây chúng ta biên dịch các chương trình đó.
+
+```typescript
+// Tạo các khóa để xác minh không kiến thức.
+// Trên một hệ thống sản xuất, bạn sẽ muốn sử dụng một nghi lễ thiết lập.
+// (https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony).
+const keySetupResults = zokrates.setup(digCompiled.program, "")
+const verifierKey = keySetupResults.vk
+const proverKey = keySetupResults.pk
+```
+
+Trên một hệ thống sản xuất, chúng ta có thể sử dụng một [nghi lễ thiết lập](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) phức tạp hơn, nhưng điều này đủ tốt cho một bản demo. Không thành vấn đề khi người dùng có thể biết khóa của người chứng minh - họ vẫn không thể sử dụng nó để chứng minh những điều không đúng sự thật. Bởi vì chúng ta chỉ định entropy (tham số thứ hai, `""`), kết quả sẽ luôn giống nhau.
+
+**Lưu ý:** Việc biên dịch các chương trình Zokrates và tạo khóa là những quá trình chậm. Không cần phải lặp lại chúng mỗi lần, chỉ khi kích thước bản đồ thay đổi. Trên một hệ thống sản xuất, bạn sẽ thực hiện chúng một lần, và sau đó lưu trữ đầu ra. Lý do duy nhất tôi không làm điều đó ở đây là vì sự đơn giản.
+
+#### `calculateMapHash` {#calculateMapHash}
+
+```typescript
+const calculateMapHash = function (hashMe: boolean[][]): string {
+ return (
+ "0x" +
+ BigInt(zokrates.computeWitness(hashCompiled, [hashMe]).output.slice(1, -1))
+ .toString(16)
+ .padStart(64, "0")
+ )
+}
+```
+
+Hàm [`computeWitness`](https://zokrates.github.io/toolbox/zokrates_js.html#computewitnessartifacts-args-options) thực sự chạy chương trình Zokrates. Nó trả về một cấu trúc với hai trường: `output`, là đầu ra của chương trình dưới dạng chuỗi JSON, và `witness`, là thông tin cần thiết để tạo ra một bằng chứng không kiến thức của kết quả. Ở đây chúng ta chỉ cần đầu ra.
+
+Đầu ra là một chuỗi có dạng `"31337"`, một số thập phân được đặt trong dấu ngoặc kép. Nhưng đầu ra chúng ta cần cho `viem` là một số thập lục phân có dạng `0x60A7`. Vì vậy, chúng ta sử dụng `.slice(1,-1)` để loại bỏ dấu ngoặc kép và sau đó `BigInt` để chạy chuỗi còn lại, là một số thập phân, thành một [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt). `.toString(16)` chuyển đổi `BigInt` này thành một chuỗi thập lục phân, và `"0x"+` thêm dấu hiệu cho các số thập lục phân.
+
+```typescript
+// Đào và trả về một bằng chứng không kiến thức của kết quả
+// (mã phía máy chủ)
+```
+
+Bằng chứng không kiến thức bao gồm các đầu vào công khai (`x` và `y`) và kết quả (hàm băm của bản đồ và số lượng bom).
+
+```typescript
+ const zkDig = function(map: boolean[][], x: number, y: number) : any {
+ if (x<0 || x>=width || y<0 || y>=height)
+ throw new Error("Trying to dig outside the map")
+```
+
+Kiểm tra xem một chỉ số có nằm ngoài giới hạn trong Zokrates hay không là một vấn đề, vì vậy chúng ta thực hiện nó ở đây.
+
+```typescript
+const runResults = zokrates.computeWitness(digCompiled, [map, `${x}`, `${y}`])
+```
+
+Thực thi chương trình đào.
+
+```typescript
+ const proof = zokrates.generateProof(
+ digCompiled.program,
+ runResults.witness,
+ proverKey)
+
+ return proof
+ }
+```
+
+Sử dụng [`generateProof`](https://zokrates.github.io/toolbox/zokrates_js.html#generateproofprogram-witness-provingkey-entropy) và trả về bằng chứng.
+
+```typescript
+const solidityVerifier = `
+ // Kích thước bản đồ: ${width} x ${height}
+ \n${zokrates.exportSolidityVerifier(verifierKey)}
+ `
+```
+
+Một trình xác minh Solidity, một hợp đồng thông minh mà chúng ta có thể triển khai lên chuỗi khối và sử dụng để xác minh các bằng chứng được tạo ra bởi `digCompiled.program`.
+
+```typescript
+ return {
+ zkDig,
+ calculateMapHash,
+ solidityVerifier,
+ }
+}
+```
+
+Cuối cùng, trả về mọi thứ mà mã khác có thể cần.
+
+## Kiểm tra bảo mật {#security-tests}
+
+Kiểm tra bảo mật là quan trọng vì một lỗi chức năng cuối cùng sẽ tự lộ ra. Nhưng nếu ứng dụng không an toàn, điều đó có khả năng sẽ bị che giấu trong một thời gian dài trước khi nó bị tiết lộ bởi một người gian lận và lấy đi các tài nguyên thuộc về người khác.
+
+### Quyền {#permissions}
+
+Có một thực thể có đặc quyền trong trò chơi này, đó là máy chủ. Đó là người dùng duy nhất được phép gọi các hàm trong [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol). Chúng ta có thể sử dụng [`cast`](https://book.getfoundry.sh/cast/) để xác minh rằng các lệnh gọi đến các hàm có quyền chỉ được phép khi là tài khoản máy chủ.
+
+[Khóa riêng tư của máy chủ nằm trong `setupNetwork.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/mud/setupNetwork.ts#L52).
+
+1. Trên máy tính chạy `anvil` (chuỗi khối), hãy đặt các biến môi trường này.
+
+ ```sh copy
+ WORLD_ADDRESS=0x8d8b6b8414e1e3dcfd4168561b9be6bd3bf6ec4b
+ UNAUTHORIZED_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a
+ AUTHORIZED_KEY=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
+ ```
+
+2. Sử dụng `cast` để cố gắng đặt địa chỉ trình xác minh là một địa chỉ không được ủy quyền.
+
+ ```sh copy
+ cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $UNAUTHORIZED_KEY
+ ```
+
+ Không chỉ `cast` báo cáo lỗi, mà bạn có thể mở **MUD Dev Tools** trong trò chơi trên trình duyệt, nhấp vào **Tables**, và chọn **app\_\_VerifierAddress**. Xem rằng địa chỉ không phải là không.
+
+3. Đặt địa chỉ trình xác minh là địa chỉ của máy chủ.
+
+ ```sh copy
+ cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $AUTHORIZED_KEY
+ ```
+
+ Địa chỉ trong **app\_\_VerifiedAddress** bây giờ phải là không.
+
+Tất cả các hàm MUD trong cùng một `System` đều đi qua cùng một kiểm soát truy cập, vì vậy tôi cho rằng thử nghiệm này là đủ. Nếu bạn không nghĩ vậy, bạn có thể kiểm tra các hàm khác trong [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol).
+
+### Các hành vi lạm dụng không kiến thức {#zero-knowledge-abuses}
+
+Phần toán học để xác minh Zokrates nằm ngoài phạm vi của hướng dẫn này (và khả năng của tôi). Tuy nhiên, chúng ta có thể chạy các kiểm tra khác nhau trên mã không kiến thức để xác minh rằng nếu nó không được thực hiện đúng cách, nó sẽ thất bại. Tất cả các bài kiểm tra này sẽ yêu cầu chúng ta thay đổi [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts) và khởi động lại toàn bộ ứng dụng. Việc khởi động lại quy trình máy chủ là không đủ, bởi vì nó đặt ứng dụng vào một trạng thái không thể thực hiện (người chơi có một trò chơi đang diễn ra, nhưng trò chơi đó không còn khả dụng cho máy chủ).
+
+#### Câu trả lời sai {#wrong-answer}
+
+Khả năng đơn giản nhất là cung cấp câu trả lời sai trong bằng chứng không kiến thức. Để làm điều đó, chúng ta vào bên trong `zkDig` và [sửa đổi dòng 91](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L91):
+
+```ts
+proof.inputs[3] = "0x" + "1".padStart(64, "0")
+```
+
+Điều này có nghĩa là chúng ta sẽ luôn tuyên bố có một quả bom, bất kể câu trả lời đúng là gì. Hãy thử chơi với phiên bản này, và bạn sẽ thấy trong tab **server** của màn hình `pnpm dev` có lỗi này:
+
+```
+ cause: {
+ code: 3,
+ message: 'execution reverted: revert: Zero knowledge verification fail',
+ data: '0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000
+000000000000000000000000000000000000000000000000205a65726f206b6e6f776c6564676520766572696669636174696f6
+e206661696c'
+ },
+```
+
+Vì vậy, loại gian lận này thất bại.
+
+#### Bằng chứng sai {#wrong-proof}
+
+Điều gì sẽ xảy ra nếu chúng ta cung cấp thông tin chính xác, nhưng chỉ có dữ liệu bằng chứng sai? Bây giờ, hãy thay thế dòng 91 bằng:
+
+```ts
+proof.proof = {
+ a: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")],
+ b: [
+ ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")],
+ ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")],
+ ],
+ c: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")],
+}
+```
+
+Nó vẫn thất bại, nhưng bây giờ nó thất bại mà không có lý do vì nó xảy ra trong quá trình gọi trình xác minh.
+
+### Làm thế nào một người dùng có thể xác minh mã tin cậy không kiến thức? {#user-verify-zero-trust}
+
+Các hợp đồng thông minh tương đối dễ xác minh. Thông thường, nhà phát triển xuất bản mã nguồn lên một trình duyệt khối, và trình duyệt khối xác minh rằng mã nguồn đó thực sự biên dịch thành mã trong [giao dịch triển khai hợp đồng](/developers/docs/smart-contracts/deploying/). Trong trường hợp của các `System` MUD, điều này [phức tạp hơn một chút](https://mud.dev/cli/verify), nhưng không nhiều.
+
+Điều này khó hơn với không kiến thức. Trình xác minh bao gồm một số hằng số và chạy một số tính toán trên chúng. Điều này không cho bạn biết điều gì đang được chứng minh.
+
+```solidity
+ function verifyingKey() pure internal returns (VerifyingKey memory vk) {
+ vk.alpha = Pairing.G1Point(uint256(0x0f43f4fe7b5c2326fed4ac6ed2f4003ab9ab4ea6f667c2bdd77afb068617ee16), uint256(0x25a77832283f9726935219b5f4678842cda465631e72dbb24708a97ba5d0ce6f));
+ vk.beta = Pairing.G2Point([uint256(0x2cebd0fbd21aca01910581537b21ae4fed46bc0e524c055059aa164ba0a6b62b), uint256(0x18fd4a7bc386cf03a95af7163d5359165acc4e7961cb46519e6d9ee4a1e2b7e9)], [uint256(0x11449dee0199ef6d8eebfe43b548e875c69e7ce37705ee9a00c81fe52f11a009), uint256(0x066d0c83b32800d3f335bb9e8ed5e2924cf00e77e6ec28178592eac9898e1a00)]);
+```
+
+Giải pháp, ít nhất cho đến khi các trình duyệt khối thêm xác minh Zokrates vào giao diện người dùng của họ, là các nhà phát triển ứng dụng cung cấp các chương trình Zokrates, và ít nhất một số người dùng tự biên dịch chúng với khóa xác minh thích hợp.
+
+Để làm như vậy:
+
+1. [Cài đặt Zokrates](https://zokrates.github.io/gettingstarted.html).
+
+2. Tạo một tệp, `dig.zok`, với chương trình Zokrates. Mã dưới đây giả định bạn giữ nguyên kích thước bản đồ ban đầu, 10x5.
+
+ ```zokrates
+ import "utils/pack/bool/pack128.zok" as pack128;
+ import "hashes/poseidon/poseidon.zok" as poseidon;
+
+ def hashMap(bool[12][7] map) -> field {
+ bool[512] mut map1d = [false; 512];
+ u32 mut counter = 0;
+
+ for u32 x in 0..12 {
+ for u32 y in 0..7 {
+ map1d[counter] = map[x][y];
+ counter = counter+1;
+ }
+ }
+
+ field[4] hashMe = [
+ pack128(map1d[0..128]),
+ pack128(map1d[128..256]),
+ pack128(map1d[256..384]),
+ pack128(map1d[384..512])
+ ];
+
+ return poseidon(hashMe);
+ }
+
+
+ // Số lượng mìn tại vị trí (x,y)
+ def map2mineCount(bool[12][7] map, u32 x, u32 y) -> u8 {
+ return if map[x+1][y+1] { 1 } else { 0 };
+ }
+
+ def main(private bool[12][7] map, u32 x, u32 y) -> (field, u8) {
+ return (hashMap(map) ,
+ if map2mineCount(map, x, y) > 0 { 0xFF } else {
+ map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) +
+ map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) +
+ map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1)
+ }
+ );
+ }
+ ```
+
+3. Biên dịch mã Zokrates và tạo khóa xác minh. Khóa xác minh phải được tạo với cùng một entropy được sử dụng trong máy chủ ban đầu, [trong trường hợp này là một chuỗi rỗng](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L67).
+
+ ```sh copy
+ zokrates compile --input dig.zok
+ zokrates setup -e ""
+ ```
+
+4. Tự tạo trình xác minh Solidity và xác minh rằng nó giống hệt về mặt chức năng với trình xác minh trên chuỗi khối (máy chủ thêm một nhận xét, nhưng điều đó không quan trọng).
+
+ ```sh copy
+ zokrates export-verifier
+ diff verifier.sol ~/20240901-secret-state/packages/contracts/src/verifier.sol
+ ```
+
+## Các quyết định thiết kế {#design}
+
+Trong bất kỳ ứng dụng đủ phức tạp nào, đều có những mục tiêu thiết kế cạnh tranh đòi hỏi sự đánh đổi. Hãy xem xét một số đánh đổi và tại sao giải pháp hiện tại lại được ưu tiên hơn các tùy chọn khác.
+
+### Tại sao lại là không kiến thức {#why-zero-knowledge}
+
+Đối với trò chơi dò mìn, bạn không thực sự cần không kiến thức. Máy chủ luôn có thể giữ bản đồ, và sau đó chỉ cần tiết lộ toàn bộ nó khi trò chơi kết thúc. Sau đó, vào cuối trò chơi, hợp đồng thông minh có thể tính toán hàm băm của bản đồ, xác minh rằng nó khớp, và nếu không khớp sẽ phạt máy chủ hoặc bỏ qua hoàn toàn trò chơi.
+
+Tôi không sử dụng giải pháp đơn giản này vì nó chỉ hoạt động cho các trò chơi ngắn với trạng thái kết thúc được xác định rõ ràng. Khi một trò chơi có khả năng vô hạn (chẳng hạn như trường hợp của [các thế giới tự trị](https://0xparc.org/blog/autonomous-worlds)), bạn cần một giải pháp chứng minh trạng thái _mà không_ tiết lộ nó.
+
+Là một hướng dẫn, bài viết này cần một trò chơi ngắn dễ hiểu, nhưng kỹ thuật này hữu ích nhất cho các trò chơi dài hơn.
+
+### Tại sao lại là Zokrates? {#why-zokrates}
+
+[Zokrates](https://zokrates.github.io/) không phải là thư viện không kiến thức duy nhất có sẵn, nhưng nó tương tự như một ngôn ngữ lập trình thông thường, [mệnh lệnh](https://en.wikipedia.org/wiki/Imperative_programming) và hỗ trợ các biến boolean.
+
+Đối với ứng dụng của bạn, với các yêu cầu khác nhau, bạn có thể thích sử dụng [Circum](https://docs.circom.io/getting-started/installation/) hoặc [Cairo](https://www.cairo-lang.org/tutorials/getting-started-with-cairo/).
+
+### Khi nào biên dịch Zokrates {#when-compile-zokrates}
+
+Trong chương trình này, chúng tôi biên dịch các chương trình Zokrates [mỗi khi máy chủ khởi động](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L60-L61). Điều này rõ ràng là lãng phí tài nguyên, nhưng đây là một hướng dẫn, được tối ưu hóa cho sự đơn giản.
+
+Nếu tôi đang viết một ứng dụng ở cấp độ sản xuất, tôi sẽ kiểm tra xem tôi có một tệp với các chương trình Zokrates đã biên dịch ở kích thước bãi mìn này không, và nếu có thì sử dụng nó. Điều tương tự cũng đúng đối với việc triển khai một hợp đồng xác minh trên chuỗi.
+
+### Tạo khóa xác minh và khóa chứng minh {#key-creation}
+
+[Tạo khóa](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L63-L69) là một tính toán thuần túy khác không cần phải thực hiện nhiều hơn một lần cho một kích thước bãi mìn nhất định. Một lần nữa, nó chỉ được thực hiện một lần vì mục đích đơn giản.
+
+Ngoài ra, chúng ta có thể sử dụng [một nghi lễ thiết lập](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony). Ưu điểm của một nghi lễ thiết lập là bạn cần hoặc entropy hoặc một số kết quả trung gian từ mỗi người tham gia để gian lận trong bằng chứng không kiến thức. Nếu ít nhất một người tham gia nghi lễ trung thực và xóa thông tin đó, các bằng chứng không kiến thức sẽ an toàn trước một số cuộc tấn công nhất định. Tuy nhiên, _không có cơ chế_ nào để xác minh rằng thông tin đã được xóa khỏi mọi nơi. Nếu bằng chứng không kiến thức là cực kỳ quan trọng, bạn muốn tham gia vào nghi lễ thiết lập.
+
+Ở đây chúng ta dựa vào [perpetual powers of tau](https://github.com/privacy-scaling-explorations/perpetualpowersoftau), đã có hàng chục người tham gia. Nó có lẽ đủ an toàn, và đơn giản hơn nhiều. Chúng tôi cũng không thêm entropy trong quá trình tạo khóa, điều này giúp người dùng [xác minh cấu hình không kiến thức](#user-verify-zero-trust) dễ dàng hơn.
+
+### Xác minh ở đâu {#where-verification}
+
+Chúng ta có thể xác minh các bằng chứng không kiến thức trên chuỗi (tốn gas) hoặc trong ứng dụng (sử dụng [`verify`](https://zokrates.github.io/toolbox/zokrates_js.html#verifyverificationkey-proof)). Tôi đã chọn cách đầu tiên, vì điều này cho phép bạn [xác minh người xác minh](#user-verify-zero-trust) một lần và sau đó tin tưởng rằng nó không thay đổi miễn là địa chỉ hợp đồng của nó vẫn giữ nguyên. Nếu việc xác minh được thực hiện trên ứng dụng, bạn sẽ phải xác minh mã bạn nhận được mỗi khi tải xuống ứng dụng.
+
+Ngoài ra, trong khi trò chơi này là một người chơi, rất nhiều trò chơi chuỗi khối là nhiều người chơi. xác minh trên chuỗi có nghĩa là bạn chỉ xác minh bằng chứng không kiến thức một lần. Thực hiện nó trong ứng dụng sẽ yêu cầu mỗi ứng dụng phải xác minh độc lập.
+
+### Làm phẳng bản đồ trong TypeScript hay Zokrates? {#where-flatten}
+
+Nói chung, khi quá trình xử lý có thể được thực hiện trong TypeScript hoặc Zokrates, tốt hơn là nên thực hiện trong TypeScript, nhanh hơn nhiều và không yêu cầu bằng chứng không kiến thức. Đây là lý do, ví dụ, chúng ta không cung cấp cho Zokrates hàm băm và yêu cầu nó xác minh rằng nó là chính xác. Việc băm phải được thực hiện bên trong Zokrates, nhưng sự khớp nối giữa hàm băm được trả về và hàm băm trên chuỗi có thể xảy ra bên ngoài nó.
+
+Tuy nhiên, chúng ta vẫn [làm phẳng bản đồ trong Zokrates](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L15-L20), trong khi chúng ta có thể đã làm điều đó trong TypeScript. Lý do là các lựa chọn khác, theo tôi, tệ hơn.
+
+- Cung cấp một mảng boolean một chiều cho mã Zokrates, và sử dụng một biểu thức như `x*(height+2)
+ +y` để lấy bản đồ hai chiều. Điều này sẽ làm cho [mã](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L44-L47) phức tạp hơn một chút, vì vậy tôi đã quyết định rằng việc tăng hiệu suất không đáng để làm trong một hướng dẫn.
+
+- Gửi cho Zokrates cả mảng một chiều và mảng hai chiều. Tuy nhiên, giải pháp này không mang lại cho chúng ta bất cứ điều gì. Mã Zokrates sẽ phải xác minh rằng mảng một chiều mà nó được cung cấp thực sự là biểu diễn chính xác của mảng hai chiều. Vì vậy, sẽ không có bất kỳ sự tăng hiệu suất nào.
+
+- Làm phẳng mảng hai chiều trong Zokrates. Đây là lựa chọn đơn giản nhất, vì vậy tôi đã chọn nó.
+
+### Lưu trữ bản đồ ở đâu {#where-store-maps}
+
+Trong ứng dụng này, [`gamesInProgress`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L20) chỉ đơn giản là một biến trong bộ nhớ. Điều này có nghĩa là nếu máy chủ của bạn bị lỗi và cần phải khởi động lại, tất cả thông tin nó lưu trữ sẽ bị mất. Người chơi không chỉ không thể tiếp tục trò chơi của mình, họ thậm chí không thể bắt đầu một trò chơi mới vì thành phần trên chuỗi nghĩ rằng họ vẫn đang trong một trò chơi.
+
+Đây rõ ràng là một thiết kế tồi cho một hệ thống sản xuất, trong đó bạn sẽ lưu trữ thông tin này trong một cơ sở dữ liệu. Lý do duy nhất tôi sử dụng một biến ở đây là vì đây là một hướng dẫn và sự đơn giản là yếu tố chính cần xem xét.
+
+## Kết luận: Kỹ thuật này phù hợp trong những điều kiện nào? {#conclusion}
+
+Vì vậy, bây giờ bạn đã biết cách viết một trò chơi với một máy chủ lưu trữ trạng thái bí mật không thuộc về trên chuỗi. Nhưng trong những trường hợp nào bạn nên làm điều đó? Có hai yếu tố chính cần xem xét.
+
+- _Trò chơi kéo dài_: [Như đã đề cập ở trên](#why-zero-knowledge), trong một trò chơi ngắn, bạn có thể chỉ cần công bố trạng thái khi trò chơi kết thúc và có mọi thứ được xác minh sau đó. Nhưng đó không phải là một lựa chọn khi trò chơi kéo dài hoặc vô thời hạn, và trạng thái cần phải được giữ bí mật.
+
+- _Một số sự tập trung có thể chấp nhận được_: Bằng chứng không kiến thức có thể xác minh tính toàn vẹn, rằng một thực thể không giả mạo kết quả. Điều mà chúng không thể làm là đảm bảo rằng thực thể đó sẽ vẫn có sẵn và trả lời các thông điệp. Trong các tình huống mà tính khả dụng cũng cần được phi tập trung, bằng chứng không kiến thức không phải là một giải pháp đủ, và bạn cần [tính toán đa bên](https://en.wikipedia.org/wiki/Secure_multi-party_computation).
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
+
+### Ghi nhận {#acknowledgements}
+
+- Alvaro Alonso đã đọc bản nháp của bài viết này và làm sáng tỏ một số hiểu lầm của tôi về Zokrates.
+
+Bất kỳ lỗi còn lại nào đều là trách nhiệm của tôi.
diff --git a/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
new file mode 100644
index 00000000000..95e5dbb8bc4
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
@@ -0,0 +1,52 @@
+---
+title: Danh sách kiểm tra bảo mật hợp đồng thông minh
+description: Quy trình làm việc được đề xuất để viết các hợp đồng thông minh bảo mật
+author: "Trailofbits"
+tags: [ "hợp đồng thông minh", "tính bảo mật", "solidity" ]
+skill: intermediate
+lang: vi
+published: 2020-09-07
+source: Xây dựng những hợp đồng an toàn
+sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md
+---
+
+## Danh sách kiểm tra phát triển hợp đồng thông minh {#smart-contract-development-checklist}
+
+Đây là một quy trình cấp cao mà chúng tôi khuyên bạn nên tuân theo khi viết các hợp đồng thông minh của mình.
+
+Kiểm tra các vấn đề bảo mật đã biết:
+
+- Xem lại hợp đồng của bạn với [Slither](https://github.com/crytic/slither). Nó có hơn 40 trình phát hiện tích hợp cho các lỗ hổng phổ biến. Chạy nó trên mỗi lần kiểm tra với mã mới và đảm bảo nó nhận được một báo cáo sạch (hoặc sử dụng chế độ phân loại để tắt tiếng các vấn đề nhất định).
+- Xem lại hợp đồng của bạn với [Crytic](https://crytic.io/). Nó kiểm tra 50 vấn đề mà Slither không kiểm tra. Crytic cũng có thể giúp nhóm của bạn nắm bắt công việc của nhau, bằng cách dễ dàng hiển thị các vấn đề bảo mật trong các Yêu cầu Phản hồi trên GitHub.
+
+Xem xét các tính năng đặc biệt của hợp đồng của bạn:
+
+- Hợp đồng của bạn có thể nâng cấp được không? Xem lại mã nâng cấp của bạn để tìm lỗi bằng [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) hoặc [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Chúng tôi đã ghi lại 17 cách việc nâng cấp có thể gặp sự cố.
+- Hợp đồng của bạn có tuân thủ các ERC không? Kiểm tra chúng bằng [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance). Công cụ này xác định ngay lập tức các sai lệch so với sáu thông số kỹ thuật phổ biến.
+- Bạn có tích hợp với các token của bên thứ ba không? Xem lại [danh sách kiểm tra tích hợp token](/developers/tutorials/token-integration-checklist/) của chúng tôi trước khi dựa vào các hợp đồng bên ngoài.
+
+Kiểm tra trực quan các tính năng bảo mật quan trọng của mã của bạn:
+
+- Xem lại trình in [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) của Slither. Tránh các vấn đề về che khuất ngoài ý muốn và tuyến tính hóa C3.
+- Xem lại trình in [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) của Slither. Nó báo cáo khả năng hiển thị của hàm và các kiểm soát truy cập.
+- Xem lại trình in [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization) của Slither. Nó báo cáo các kiểm soát truy cập trên các biến trạng thái.
+
+Ghi lại các thuộc tính bảo mật quan trọng và sử dụng các trình tạo thử nghiệm tự động để đánh giá chúng:
+
+- Tìm hiểu cách [ghi lại các thuộc tính bảo mật cho mã của bạn](/developers/tutorials/guide-to-smart-contract-security-tools/). Lúc đầu sẽ rất khó khăn, nhưng đây là hoạt động quan trọng nhất để đạt được kết quả tốt. Đây cũng là điều kiện tiên quyết để sử dụng bất kỳ kỹ thuật nâng cao nào trong hướng dẫn này.
+- Xác định các thuộc tính bảo mật trong Solidity, để sử dụng với [Echidna](https://github.com/crytic/echidna) và [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Tập trung vào máy trạng thái, kiểm soát truy cập, các phép toán số học, tương tác bên ngoài và sự phù hợp với các tiêu chuẩn.
+- Xác định các thuộc tính bảo mật bằng [Giao diện Lập trình Ứng dụng Python của Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/). Tập trung vào tính kế thừa, các phụ thuộc biến, kiểm soát truy cập và các vấn đề cấu trúc khác.
+- Chạy các bài kiểm tra thuộc tính của bạn trên mỗi lần commit với [Crytic](https://crytic.io). Crytic có thể sử dụng và đánh giá các bài kiểm tra thuộc tính bảo mật để mọi người trong nhóm của bạn có thể dễ dàng thấy rằng chúng đã vượt qua trên GitHub. Các bài kiểm tra không thành công có thể chặn các lần commit.
+
+Cuối cùng, hãy lưu ý đến các vấn đề mà các công cụ tự động không thể dễ dàng tìm thấy:
+
+- Thiếu sự riêng tư: mọi người khác có thể thấy các giao dịch của bạn khi chúng đang được xếp hàng trong pool
+- Chạy trước các giao dịch
+- Các hoạt động mật mã
+- Các tương tác rủi ro với các thành phần DeFi bên ngoài
+
+## Yêu cầu trợ giúp {#ask-for-help}
+
+[Giờ hành chính của Ethereum](https://calendly.com/dan-trailofbits/office-hours) diễn ra vào mỗi chiều thứ Ba. Các phiên 1-1, kéo dài 1 giờ này là cơ hội để bạn hỏi chúng tôi bất kỳ câu hỏi nào về bảo mật, khắc phục sự cố khi sử dụng các công cụ của chúng tôi và nhận phản hồi từ các chuyên gia về phương pháp tiếp cận hiện tại của bạn. Chúng tôi sẽ giúp bạn làm theo hướng dẫn này.
+
+Tham gia Slack của chúng tôi: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Chúng tôi luôn sẵn sàng trong các kênh #crytic và #ethereum nếu bạn có bất kỳ câu hỏi nào.
diff --git a/public/content/translations/vi/developers/tutorials/send-token-ethersjs/index.md b/public/content/translations/vi/developers/tutorials/send-token-ethersjs/index.md
new file mode 100644
index 00000000000..1ec28b2703e
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/send-token-ethersjs/index.md
@@ -0,0 +1,210 @@
+---
+title: Gửi Token bằng ethers.js
+description: Hướng dẫn thân thiện với người mới bắt đầu về việc gửi token bằng ethers.js.
+author: Kim YongJun
+tags: [ "ETHERS.JS", "ERC-20", "TOKEN" ]
+skill: beginner
+lang: vi
+published: 2021-04-06
+---
+
+## Gửi Token bằng ethers.js(5.0) {#send-token}
+
+### Trong Hướng dẫn này, bạn sẽ học cách {#you-learn-about}
+
+- Nhập ethers.js
+- Chuyển token
+- Đặt giá gas theo tình hình lưu lượng truy cập của mạng
+
+### Để Bắt đầu {#to-get-started}
+
+Để bắt đầu, trước tiên chúng ta phải nhập thư viện ethers.js vào javascript của mình
+Bao gồm ethers.js(5.0)
+
+### Cài đặt {#install-ethersjs}
+
+```shell
+/home/ricmoo> npm install --save ethers
+```
+
+ES6 trong trình duyệt
+
+```html
+
+```
+
+ES3(UMD) trong trình duyệt
+
+```html
+
+```
+
+### Các tham số {#param}
+
+1. **`contract_address`**: Địa chỉ hợp đồng token (cần địa chỉ hợp đồng khi token bạn muốn chuyển không phải là ether)
+2. **`send_token_amount`**: Số tiền bạn muốn gửi cho người nhận
+3. **`to_address`**: Địa chỉ của người nhận
+4. **`send_account`**: Địa chỉ của người gửi
+5. **`private_key`**: Khóa riêng tư của người gửi để ký giao dịch và thực sự chuyển token
+
+## Lưu ý {#notice}
+
+`signTransaction(tx)` bị xóa vì `sendTransaction()` thực hiện điều đó trong nội bộ.
+
+## Thủ tục gửi {#procedure}
+
+### 1. Kết nối với mạng (mạng thử nghiệm) {#connect-to-network}
+
+#### Thiết lập nhà cung cấp (Infura) {#set-provider}
+
+Kết nối với mạng thử nghiệm Ropsten
+
+```javascript
+window.ethersProvider = new ethers.providers.InfuraProvider("ropsten")
+```
+
+### 2. Tạo ví {#create-wallet}
+
+```javascript
+let wallet = new ethers.Wallet(private_key)
+```
+
+### 3. Kết nối Ví với mạng {#connect-wallet-to-net}
+
+```javascript
+let walletSigner = wallet.connect(window.ethersProvider)
+```
+
+### 4. Lấy giá gas hiện tại {#get-gas}
+
+```javascript
+window.ethersProvider.getGasPrice() // gasPrice
+```
+
+### 5. Xác định Giao dịch {#define-transaction}
+
+Các biến được định nghĩa dưới đây phụ thuộc vào `send_token()`
+
+### Các tham số giao dịch {#transaction-params}
+
+1. **`send_account`**: địa chỉ của người gửi token
+2. **`to_address`**: địa chỉ của người nhận token
+3. **`send_token_amount`**: số lượng token cần gửi
+4. **`gas_limit`**: giới hạn gas
+5. **`gas_price`**: giá gas
+
+[Xem bên dưới để biết cách sử dụng](#how-to-use)
+
+```javascript
+const tx = {
+ from: send_account,
+ to: to_address,
+ value: ethers.utils.parseEther(send_token_amount),
+ nonce: window.ethersProvider.getTransactionCount(send_account, "latest"),
+ gasLimit: ethers.utils.hexlify(gas_limit), // 100000
+ gasPrice: gas_price,
+}
+```
+
+### 6. Chuyển {#transfer}
+
+```javascript
+walletSigner.sendTransaction(tx).then((transaction) => {
+ console.dir(transaction)
+ alert("Gửi xong!")
+})
+```
+
+## Cách sử dụng {#how-to-use}
+
+```javascript
+let private_key =
+ "41559d28e936dc92104ff30691519693fc753ffbee6251a611b9aa1878f12a4d"
+let send_token_amount = "1"
+let to_address = "0x4c10D2734Fb76D3236E522509181CC3Ba8DE0e80"
+let send_address = "0xda27a282B5B6c5229699891CfA6b900A716539E6"
+let gas_limit = "0x100000"
+let wallet = new ethers.Wallet(private_key)
+let walletSigner = wallet.connect(window.ethersProvider)
+let contract_address = ""
+window.ethersProvider = new ethers.providers.InfuraProvider("ropsten")
+
+send_token(
+ contract_address,
+ send_token_amount,
+ to_address,
+ send_address,
+ private_key
+)
+```
+
+### Thành công! {#success}
+
+
+
+## send_token() {#send-token-method}
+
+```javascript
+function send_token(
+ contract_address,
+ send_token_amount,
+ to_address,
+ send_account,
+ private_key
+) {
+ let wallet = new ethers.Wallet(private_key)
+ let walletSigner = wallet.connect(window.ethersProvider)
+
+ window.ethersProvider.getGasPrice().then((currentGasPrice) => {
+ let gas_price = ethers.utils.hexlify(parseInt(currentGasPrice))
+ console.log(`gas_price: ${gas_price}`)
+
+ if (contract_address) {
+ // gửi token chung
+ let contract = new ethers.Contract(
+ contract_address,
+ send_abi,
+ walletSigner
+ )
+
+ // Bao nhiêu token?
+ let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18)
+ console.log(`numberOfTokens: ${numberOfTokens}`)
+
+ // Gửi token
+ contract.transfer(to_address, numberOfTokens).then((transferResult) => {
+ console.dir(transferResult)
+ alert("đã gửi token")
+ })
+ } // gửi ether
+ else {
+ const tx = {
+ from: send_account,
+ to: to_address,
+ value: ethers.utils.parseEther(send_token_amount),
+ nonce: window.ethersProvider.getTransactionCount(
+ send_account,
+ "latest"
+ ),
+ gasLimit: ethers.utils.hexlify(gas_limit), // 100000
+ gasPrice: gas_price,
+ }
+ console.dir(tx)
+ try {
+ walletSigner.sendTransaction(tx).then((transaction) => {
+ console.dir(transaction)
+ alert("Gửi xong!")
+ })
+ } catch (error) {
+ alert("gửi thất bại!!")
+ }
+ }
+ })
+}
+```
diff --git a/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
new file mode 100644
index 00000000000..0db38dd08e3
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
@@ -0,0 +1,208 @@
+---
+title: Gửi Giao dịch bằng Web3
+description: "Đây là hướng dẫn thân thiện với người mới bắt đầu về cách gửi giao dịch Ethereum bằng Web3. Có ba bước chính để gửi một giao dịch đến chuỗi khối Ethereum: tạo, ký và quảng bá. Chúng ta sẽ đi qua cả ba bước."
+author: "Elan Halpern"
+tags: [ "các giao dịch", "web3.js", "từ Alchemy" ]
+skill: beginner
+lang: vi
+published: 2020-11-04
+source: Tài liệu Alchemy
+sourceUrl: https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum
+---
+
+Đây là hướng dẫn thân thiện với người mới bắt đầu về cách gửi giao dịch Ethereum bằng Web3. Có ba bước chính để gửi một giao dịch đến chuỗi khối Ethereum: tạo, ký và quảng bá. Chúng ta sẽ đi qua cả ba bước và hy vọng sẽ trả lời được bất kỳ câu hỏi nào bạn có thể có! Trong hướng dẫn này, chúng ta sẽ sử dụng [Alchemy](https://www.alchemy.com/) để gửi các giao dịch của mình đến chuỗi Ethereum. Bạn có thể [tạo tài khoản Alchemy miễn phí tại đây](https://auth.alchemyapi.io/signup).
+
+**LƯU Ý:** Hướng dẫn này dành cho việc ký các giao dịch của bạn trên _backend_ cho ứng dụng của bạn. Nếu bạn muốn tích hợp việc ký các giao dịch của mình trên frontend, hãy xem cách tích hợp [Web3 với một nhà cung cấp trình duyệt](https://docs.alchemy.com/reference/api-overview#with-a-browser-provider).
+
+## Những điều cơ bản {#the-basics}
+
+Giống như hầu hết các nhà phát triển chuỗi khối khi họ mới bắt đầu, bạn có thể đã thực hiện một số nghiên cứu về cách gửi một giao dịch (một việc đáng lẽ phải khá đơn giản) và đã gặp phải vô số hướng dẫn, mỗi hướng dẫn lại nói những điều khác nhau và khiến bạn hơi choáng ngợp và bối rối. Nếu bạn đang ở trong tình huống đó, đừng lo lắng; tất cả chúng ta đều đã từng ở một thời điểm nào đó! Vì vậy, trước khi chúng ta bắt đầu, hãy làm rõ một vài điều:
+
+### 1. Alchemy không lưu trữ các khóa riêng tư của bạn {#alchemy-does-not-store-your-private-keys}
+
+- Điều này có nghĩa là Alchemy không thể ký và gửi giao dịch thay cho bạn. Lý do cho điều này là vì mục đích bảo mật. Alchemy sẽ không bao giờ yêu cầu bạn chia sẻ khóa riêng tư của mình, và bạn không bao giờ nên chia sẻ khóa riêng tư của mình với một nút được lưu trữ (hoặc bất kỳ ai khác).
+- Bạn có thể đọc từ chuỗi khối bằng API lõi của Alchemy, nhưng để ghi vào đó, bạn sẽ cần sử dụng một thứ khác để ký các giao dịch của mình trước khi gửi chúng qua Alchemy (điều này cũng tương tự đối với bất kỳ [dịch vụ nút](/developers/docs/nodes-and-clients/nodes-as-a-service/) nào khác).
+
+### 2. “Người ký” là gì? {#what-is-a-signer}
+
+- Người ký sẽ ký các giao dịch cho bạn bằng khóa riêng tư của bạn. Trong hướng dẫn này, chúng tôi sẽ sử dụng [Alchemy web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3) để ký giao dịch của mình, nhưng bạn cũng có thể sử dụng bất kỳ thư viện web3 nào khác.
+- Trên frontend, một ví dụ điển hình về người ký là [MetaMask](https://metamask.io/), nó sẽ ký và gửi các giao dịch thay cho bạn.
+
+### 3. Tại sao tôi cần ký các giao dịch của mình? {#why-do-i-need-to-sign-my-transactions}
+
+- Mọi người dùng muốn gửi một giao dịch trên mạng Ethereum đều phải ký giao dịch đó (bằng khóa riêng tư của họ), để xác thực rằng người khởi tạo giao dịch chính là người mà họ tuyên bố.
+- Việc bảo vệ khóa riêng tư này là cực kỳ quan trọng, vì việc có quyền truy cập vào nó sẽ cấp toàn quyền kiểm soát tài khoản Ethereum của bạn, cho phép bạn (hoặc bất kỳ ai có quyền truy cập) thực hiện các giao dịch thay cho bạn.
+
+### 4. Làm cách nào để bảo vệ khóa riêng tư của tôi? {#how-do-i-protect-my-private-key}
+
+- Có nhiều cách để bảo vệ khóa riêng tư của bạn và sử dụng nó để gửi đi các giao dịch. Trong hướng dẫn này, chúng tôi sẽ sử dụng tệp `.env`. Tuy nhiên, bạn cũng có thể sử dụng một nhà cung cấp riêng biệt lưu trữ khóa riêng tư, sử dụng tệp keystore hoặc các tùy chọn khác.
+
+### 5. Sự khác biệt giữa `eth_sendTransaction` và `eth_sendRawTransaction` là gì? {#difference-between-send-and-send-raw}
+
+`eth_sendTransaction` và `eth_sendRawTransaction` đều là các hàm API của Ethereum có chức năng quảng bá một giao dịch đến mạng Ethereum để nó sẽ được thêm vào một khối trong tương lai. Chúng khác nhau ở cách chúng xử lý việc ký các giao dịch.
+
+- [`eth_sendTransaction`](https://docs.web3js.org/api/web3-eth/function/sendTransaction) được sử dụng để gửi các giao dịch _chưa được ký_, điều đó có nghĩa là nút mà bạn đang gửi đến phải quản lý khóa riêng tư của bạn để nó có thể ký giao dịch trước khi quảng bá nó lên chuỗi. Vì Alchemy không giữ khóa riêng tư của người dùng, nên họ không hỗ trợ phương thức này.
+- [`eth_sendRawTransaction`](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction) được sử dụng để quảng bá các giao dịch đã được ký. Điều này có nghĩa là trước tiên bạn phải sử dụng [`signTransaction(tx, private_key)`](https://docs.web3js.org/api/web3-eth-accounts/function/signTransaction), sau đó chuyển kết quả vào `eth_sendRawTransaction`.
+
+Khi sử dụng web3, `eth_sendRawTransaction` được truy cập bằng cách gọi hàm [web3.eth.sendSignedTransaction](https://docs.web3js.org/api/web3-eth/function/sendSignedTransaction).
+
+Đây là những gì chúng ta sẽ sử dụng trong hướng dẫn này.
+
+### 6. Thư viện web3 là gì? {#what-is-the-web3-library}
+
+- Web3.js là một thư viện bao bọc các lệnh gọi JSON-RPC tiêu chuẩn khá phổ biến để sử dụng trong quá trình phát triển Ethereum.
+- Có nhiều thư viện web3 cho các ngôn ngữ khác nhau. Trong hướng dẫn này, chúng ta sẽ sử dụng [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) được viết bằng JavaScript. Bạn có thể xem các tùy chọn khác [tại đây](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) như [ethers.js](https://docs.ethers.org/v5/).
+
+Được rồi, bây giờ chúng ta đã giải quyết xong một vài câu hỏi này, hãy chuyển sang phần hướng dẫn. Vui lòng đặt câu hỏi bất cứ lúc nào trong [discord](https://discord.gg/gWuC7zB) của Alchemy!
+
+### 7. Làm thế nào để gửi các giao dịch bảo mật, tối ưu hóa gas và riêng tư? {#how-to-send-secure-gas-optimized-and-private-transactions}
+
+- [Alchemy có một bộ API Giao dịch](https://docs.alchemy.com/reference/transact-api-quickstart). Bạn có thể sử dụng những API này để gửi các giao dịch được củng cố, mô phỏng các giao dịch trước khi chúng xảy ra, gửi các giao dịch riêng tư và gửi các giao dịch được tối ưu hóa gas
+- Bạn cũng có thể sử dụng [API Thông báo](https://docs.alchemy.com/docs/alchemy-notify) để được cảnh báo khi giao dịch của bạn được lấy từ mempool và thêm vào chuỗi
+
+**LƯU Ý:** Hướng dẫn này yêu cầu có tài khoản Alchemy, địa chỉ Ethereum hoặc ví MetaMask, đã cài đặt NodeJs và npm. Nếu chưa, hãy làm theo các bước sau:
+
+1. [Tạo một tài khoản Alchemy miễn phí](https://auth.alchemyapi.io/signup)
+2. [Tạo tài khoản MetaMask](https://metamask.io/) (hoặc lấy địa chỉ Ethereum)
+3. [Làm theo các bước sau để cài đặt NodeJs và NPM](https://docs.alchemy.com/alchemy/guides/alchemy-for-macs)
+
+## Các bước để gửi giao dịch của bạn {#steps-to-sending-your-transaction}
+
+### 1. Tạo một ứng dụng Alchemy trên mạng thử nghiệm Sepolia {#create-an-alchemy-app-on-the-sepolia-testnet}
+
+Điều hướng đến [Bảng điều khiển Alchemy](https://dashboard.alchemyapi.io/) của bạn và tạo một ứng dụng mới, chọn Sepolia (hoặc bất kỳ mạng thử nghiệm nào khác) cho mạng của bạn.
+
+### 2. Yêu cầu ETH từ faucet Sepolia {#request-eth-from-sepolia-faucet}
+
+Làm theo hướng dẫn trên [faucet Sepolia của Alchemy](https://www.sepoliafaucet.com/) để nhận ETH. Hãy chắc chắn bao gồm địa chỉ Ethereum **Sepolia** của bạn (từ MetaMask) chứ không phải mạng khác. Sau khi làm theo hướng dẫn, hãy kiểm tra lại để chắc chắn rằng bạn đã nhận được ETH trong ví của mình.
+
+### 3. Tạo một thư mục dự án mới và `cd` vào đó {#create-a-new-project-direction}
+
+Tạo một thư mục dự án mới từ dòng lệnh (terminal cho mac) và điều hướng vào đó:
+
+```
+mkdir sendtx-example
+cd sendtx-example
+```
+
+### 4. Cài đặt Alchemy Web3 (hoặc bất kỳ thư viện web3 nào) {#install-alchemy-web3}
+
+Chạy lệnh sau trong thư mục dự án của bạn để cài đặt [Alchemy Web3](https://docs.alchemy.com/reference/api-overview):
+
+Lưu ý, nếu bạn muốn sử dụng thư viện ethers.js, [hãy làm theo hướng dẫn tại đây](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum).
+
+```
+npm install @alch/alchemy-web3
+```
+
+### 5. Cài đặt dotenv {#install-dotenv}
+
+Chúng ta sẽ sử dụng tệp `.env` để lưu trữ an toàn khóa API và khóa riêng tư của mình.
+
+```
+npm install dotenv --save
+```
+
+### 6. Tạo tệp `.env` {#create-the-dotenv-file}
+
+Tạo tệp `.env` trong thư mục dự án của bạn và thêm nội dung sau (thay thế “`your-api-url`" và "`your-private-key`")
+
+- Để tìm URL API Alchemy của bạn, hãy điều hướng đến trang chi tiết ứng dụng của ứng dụng bạn vừa tạo trên bảng điều khiển của mình, nhấp vào “Xem khóa” ở góc trên cùng bên phải và lấy URL HTTP.
+- Để tìm khóa riêng tư của bạn bằng MetaMask, hãy xem [hướng dẫn](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) này.
+
+```
+API_URL = "your-api-url"
+PRIVATE_KEY = "your-private-key"
+```
+
+
+
+
+Đừng commit tệp .env! Vui lòng đảm bảo không bao giờ chia sẻ hoặc tiết lộ tệp .env của bạn với bất kỳ ai, vì làm như vậy bạn đang làm lộ bí mật của mình. Nếu bạn đang sử dụng kiểm soát phiên bản, hãy thêm tệp .env của bạn vào tệp gitignore.
+
+
+
+
+### 7. Tạo tệp `sendTx.js` {#create-sendtx-js}
+
+Tuyệt vời, bây giờ chúng ta đã bảo vệ dữ liệu nhạy cảm của mình trong tệp `.env`, hãy bắt đầu lập trình. Đối với ví dụ gửi giao dịch của chúng ta, chúng ta sẽ gửi ETH trở lại faucet Sepolia.
+
+Tạo tệp `sendTx.js`, đây là nơi chúng ta sẽ định cấu hình và gửi giao dịch ví dụ của mình, và thêm các dòng mã sau vào đó:
+
+```
+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: thay thế địa chỉ này bằng địa chỉ công khai của riêng bạn
+
+ const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // nonce bắt đầu đếm từ 0
+
+ const transaction = {
+ 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // địa chỉ faucet để trả lại eth
+ 'value': 1000000000000000000, // 1 ETH
+ 'gas': 30000,
+ 'nonce': nonce,
+ // trường dữ liệu tùy chọn để gửi tin nhắn hoặc thực thi hợp đồng thông minh
+ };
+
+ const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
+
+ web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {
+ if (!error) {
+ console.log("🎉 Hàm băm của giao dịch của bạn là: ", hash, "\n Kiểm tra Mempool của Alchemy để xem trạng thái giao dịch của bạn!");
+ } else {
+ console.log("❗Đã xảy ra lỗi khi gửi giao dịch của bạn:", error)
+ }
+ });
+}
+
+main();
+```
+
+Hãy chắc chắn thay thế địa chỉ ở **dòng 6** bằng địa chỉ công khai của riêng bạn.
+
+Bây giờ, trước khi chúng ta bắt đầu chạy mã này, hãy nói về một số thành phần ở đây.
+
+- `nonce` : Đặc tả nonce được sử dụng để theo dõi số lượng giao dịch được gửi từ địa chỉ của bạn. Chúng ta cần điều này vì mục đích bảo mật và để ngăn chặn [các cuộc tấn công phát lại](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce). Để lấy số lượng giao dịch được gửi từ địa chỉ của bạn, chúng tôi sử dụng [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount).
+- `transaction`: Đối tượng giao dịch có một vài khía cạnh chúng ta cần chỉ định
+ - `to`: Đây là địa chỉ chúng tôi muốn gửi ETH đến. Trong trường hợp này, chúng tôi đang gửi ETH trở lại [faucet Sepolia](https://sepoliafaucet.com/) mà chúng tôi đã yêu cầu ban đầu.
+ - `value`: Đây là số tiền chúng tôi muốn gửi, được chỉ định bằng Wei trong đó 10^18 Wei = 1 ETH
+ - `gas`: Có nhiều cách để xác định lượng gas phù hợp để đưa vào giao dịch của bạn. Alchemy thậm chí còn có một [webhook giá gas](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1) để thông báo cho bạn khi giá gas giảm xuống trong một ngưỡng nhất định. Đối với các giao dịch trên Mạng chính, bạn nên kiểm tra một công cụ ước tính gas như [ETH Gas Station](https://ethgasstation.info/) để xác định lượng gas phù hợp cần đưa vào. 21000 là lượng gas tối thiểu mà một hoạt động trên Ethereum sẽ sử dụng, vì vậy để đảm bảo giao dịch của chúng ta sẽ được thực thi, chúng ta đặt 30000 ở đây.
+ - `nonce`: xem định nghĩa nonce ở trên. Nonce bắt đầu đếm từ 0.
+ - [TÙY CHỌN] dữ liệu: Được sử dụng để gửi thêm thông tin cùng với việc chuyển khoản của bạn, hoặc gọi một hợp đồng thông minh, không bắt buộc đối với việc chuyển số dư, hãy xem ghi chú bên dưới.
+- `signedTx`: Để ký đối tượng giao dịch của chúng ta, chúng ta sẽ sử dụng phương thức `signTransaction` với `PRIVATE_KEY` của mình
+- `sendSignedTransaction`: Khi chúng ta có một giao dịch đã ký, chúng ta có thể gửi nó đi để được đưa vào một khối tiếp theo bằng cách sử dụng `sendSignedTransaction`
+
+**Lưu ý về dữ liệu**
+Có hai loại giao dịch chính có thể được gửi trong Ethereum.
+
+- Chuyển số dư: Gửi ETH từ địa chỉ này sang địa chỉ khác. Không yêu cầu trường dữ liệu, tuy nhiên, nếu bạn muốn gửi thêm thông tin cùng với giao dịch của mình, bạn có thể bao gồm thông tin đó ở định dạng HEX trong trường này.
+ - Ví dụ, giả sử chúng ta muốn ghi hàm băm của một tài liệu IPFS vào chuỗi Ethereum để cung cấp cho nó một dấu thời gian bất biến. Trường dữ liệu của chúng ta sau đó sẽ trông giống như dữ liệu: `web3.utils.toHex(‘hàm băm IPFS‘)`. Và bây giờ bất kỳ ai cũng có thể truy vấn chuỗi và xem tài liệu đó được thêm vào khi nào.
+- Giao dịch hợp đồng thông minh: Thực thi một số mã hợp đồng thông minh trên chuỗi. Trong trường hợp này, trường dữ liệu phải chứa hàm thông minh bạn muốn thực thi, cùng với bất kỳ tham số nào.
+ - Để có một ví dụ thực tế, hãy xem Bước 8 trong [Hướng dẫn Hello World](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#step-8-create-the-transaction) này.
+
+### 8. Chạy mã bằng `node sendTx.js` {#run-the-code-using-node-sendtx-js}
+
+Điều hướng trở lại terminal hoặc dòng lệnh của bạn và chạy:
+
+```
+node sendTx.js
+```
+
+### 9. Xem giao dịch của bạn trong Mempool {#see-your-transaction-in-the-mempool}
+
+Mở [trang Mempool](https://dashboard.alchemyapi.io/mempool) trong bảng điều khiển Alchemy của bạn và lọc theo ứng dụng bạn đã tạo để tìm giao dịch của mình. Đây là nơi chúng ta có thể xem quá trình chuyển đổi giao dịch của mình từ trạng thái chờ xử lý sang trạng thái đã khai thác (nếu thành công) hoặc trạng thái đã bị hủy bỏ nếu không thành công. Hãy chắc chắn giữ nó ở chế độ “Tất cả” để bạn có thể nắm bắt được các giao dịch “đã khai thác”, “đang chờ xử lý” và “đã bị hủy bỏ”. Bạn cũng có thể tìm kiếm giao dịch của mình bằng cách tìm các giao dịch được gửi đến địa chỉ `0x31b98d14007bdee637298086988a0bbd31184523`.
+
+Để xem chi tiết giao dịch của bạn sau khi tìm thấy, hãy chọn hàm băm tx, thao tác này sẽ đưa bạn đến một giao diện trông như thế này:
+
+
+
+Từ đó, bạn có thể xem giao dịch của mình trên Etherscan bằng cách nhấp vào biểu tượng được khoanh tròn màu đỏ!
+
+**Yippieeee! Bạn vừa gửi giao dịch Ethereum đầu tiên của mình bằng Alchemy 🎉**
+
+_Để có phản hồi và đề xuất về hướng dẫn này, vui lòng nhắn tin cho Elan trên [Discord](https://discord.gg/A39JVCM) của Alchemy!_
+
+_Được xuất bản lần đầu tại [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/vi/developers/tutorials/server-components/index.md b/public/content/translations/vi/developers/tutorials/server-components/index.md
new file mode 100644
index 00000000000..4b8a7781801
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/server-components/index.md
@@ -0,0 +1,295 @@
+---
+title: "Các thành phần máy chủ và tác nhân cho ứng dụng web3"
+description: Sau khi đọc hướng dẫn này, bạn sẽ có thể viết các máy chủ TypeScript lắng nghe các sự kiện trên một chuỗi khối và phản hồi tương ứng bằng các giao dịch của riêng chúng. Điều này sẽ cho phép bạn viết các ứng dụng tập trung (vì máy chủ là một điểm lỗi duy nhất), nhưng có thể tương tác với các thực thể web3. Các kỹ thuật tương tự cũng có thể được sử dụng để viết một tác nhân phản hồi các sự kiện trên chuỗi mà không cần sự can thiệp của con người.
+
+author: Ori Pomerantz
+lang: vi
+tags: [ "tác nhân", "máy chủ", "ngoài chuỗi" ]
+skill: beginner
+published: 2024-07-15
+---
+
+## Giới thiệu {#introduction}
+
+Trong hầu hết các trường hợp, một ứng dụng phi tập trung sử dụng một máy chủ để phân phối phần mềm, nhưng tất cả các tương tác thực tế xảy ra giữa máy khách (thường là trình duyệt web) và chuỗi khối.
+
+
+
+Tuy nhiên, có một số trường hợp một ứng dụng sẽ được hưởng lợi từ việc có một thành phần máy chủ chạy độc lập. Một máy chủ như vậy sẽ có thể phản hồi các sự kiện và các yêu cầu đến từ các nguồn khác, chẳng hạn như API, bằng cách phát hành các giao dịch.
+
+
+
+Có một số nhiệm vụ khả thi mà một máy chủ như vậy có thể thực hiện.
+
+- Người nắm giữ trạng thái bí mật. Trong trò chơi, việc không cung cấp tất cả thông tin mà trò chơi biết cho người chơi thường rất hữu ích. Tuy nhiên, _không có bí mật nào trên chuỗi khối_, bất kỳ thông tin nào trên chuỗi khối đều dễ dàng cho bất kỳ ai tìm ra. Do đó, nếu một phần trạng thái của trò chơi cần được giữ bí mật, nó phải được lưu trữ ở nơi khác (và có thể có các tác động của trạng thái đó được xác minh bằng cách sử dụng [bằng chứng không kiến thức](/zero-knowledge-proofs)).
+
+- Oracle tập trung. Nếu rủi ro đủ thấp, một máy chủ bên ngoài đọc một số thông tin trực tuyến và sau đó đăng nó lên chuỗi có thể đủ tốt để sử dụng như một [oracle](/developers/docs/oracles/).
+
+- Tác nhân. Không có gì xảy ra trên chuỗi khối nếu không có giao dịch để kích hoạt nó. Một máy chủ có thể thay mặt người dùng thực hiện các hành động như [kinh doanh chênh lệch giá](/developers/docs/mev/#mev-examples-dex-arbitrage) khi có cơ hội.
+
+## Chương trình mẫu {#sample-program}
+
+Bạn có thể xem một máy chủ mẫu [trên github](https://github.com/qbzzt/20240715-server-component). Máy chủ này lắng nghe các sự kiện đến từ [hợp đồng này](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=contract_code), một phiên bản sửa đổi của Greeter của Hardhat. Khi lời chào được thay đổi, nó sẽ thay đổi lại.
+
+Để chạy nó:
+
+1. Sao chép kho lưu trữ.
+
+ ```sh copy
+ git clone https://github.com/qbzzt/20240715-server-component.git
+ cd 20240715-server-component
+ ```
+
+2. Cài đặt các gói cần thiết. Nếu bạn chưa có, hãy [cài đặt Node trước](https://nodejs.org/en/download/package-manager).
+
+ ```sh copy
+ npm install
+ ```
+
+3. Chỉnh sửa `.env` để chỉ định khóa riêng tư của một tài khoản có ETH trên mạng thử nghiệm Holesky. Nếu bạn không có ETH trên Holesky, bạn có thể [sử dụng vòi này](https://holesky-faucet.pk910.de/).
+
+ ```sh filename=".env" copy
+ PRIVATE_KEY=0x
+ ```
+
+4. Khởi động máy chủ.
+
+ ```sh copy
+ npm start
+ ```
+
+5. Đi tới [một trình khám phá khối](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract), và sử dụng một địa chỉ khác với địa chỉ có khóa riêng tư để sửa đổi lời chào. Xem lời chào được tự động sửa đổi lại.
+
+### Nó hoạt động như thế nào? {#how-it-works}
+
+Cách dễ nhất để hiểu cách viết một thành phần máy chủ là xem qua mẫu từng dòng một.
+
+#### `src/app.ts` {#src-app-ts}
+
+Phần lớn chương trình được chứa trong [`src/app.ts`](https://github.com/qbzzt/20240715-server-component/blob/main/src/app.ts).
+
+##### Tạo các đối tượng tiên quyết
+
+```typescript
+import {
+ createPublicClient,
+ createWalletClient,
+ getContract,
+ http,
+ Address,
+} from "viem"
+```
+
+Đây là các thực thể [Viem](https://viem.sh/) mà chúng ta cần, các hàm và [kiểu `Address`](https://viem.sh/docs/glossary/types#address). Máy chủ này được viết bằng [TypeScript](https://www.typescriptlang.org/), là một phần mở rộng của JavaScript giúp nó [định kiểu mạnh](https://en.wikipedia.org/wiki/Strong_and_weak_typing).
+
+```typescript
+import { privateKeyToAccount } from "viem/accounts"
+```
+
+[Hàm này](https://viem.sh/docs/accounts/privateKey) cho phép chúng ta tạo thông tin ví, bao gồm địa chỉ, tương ứng với một khóa riêng tư.
+
+```typescript
+import { holesky } from "viem/chains"
+```
+
+Để sử dụng chuỗi khối trong Viem, bạn cần nhập định nghĩa của nó. Trong trường hợp này, chúng ta muốn kết nối với chuỗi khối thử nghiệm [Holesky](https://github.com/eth-clients/holesky).
+
+```typescript
+// Đây là cách chúng tôi thêm các định nghĩa trong .env vào process.env.
+import * as dotenv from "dotenv"
+dotenv.config()
+```
+
+Đây là cách chúng ta đọc `.env` vào môi trường. Chúng ta cần nó cho khóa riêng tư (xem phần sau).
+
+```typescript
+const greeterAddress : Address = "0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6"
+const greeterABI = [
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "_greeting",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ .
+ .
+ .
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "_greeting",
+ "type": "string"
+ }
+ ],
+ "name": "setGreeting",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+] as const
+```
+
+Để sử dụng một hợp đồng, chúng ta cần địa chỉ và [ABI](/glossary/#abi) của nó. Chúng tôi cung cấp cả hai ở đây.
+
+Trong JavaScript (và do đó là TypeScript), bạn không thể gán một giá trị mới cho một hằng số, nhưng bạn _có thể_ sửa đổi đối tượng được lưu trữ trong đó. Bằng cách sử dụng hậu tố `as const`, chúng ta đang nói với TypeScript rằng chính danh sách đó là hằng số và không thể thay đổi.
+
+```typescript
+const publicClient = createPublicClient({
+ chain: holesky,
+ transport: http(),
+})
+```
+
+Tạo một [máy khách công khai](https://viem.sh/docs/clients/public.html) của Viem. Các máy khách công khai không có khóa riêng tư đính kèm, và do đó không thể gửi các giao dịch. Chúng có thể gọi [các hàm `view`](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm), đọc số dư tài khoản, v.v.
+
+```typescript
+const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
+```
+
+Các biến môi trường có sẵn trong [`process.env`](https://www.totaltypescript.com/how-to-strongly-type-process-env). Tuy nhiên, TypeScript được định kiểu mạnh. Một biến môi trường có thể là bất kỳ chuỗi nào, hoặc trống, vì vậy kiểu của một biến môi trường là `string | undefined`. Tuy nhiên, một khóa được định nghĩa trong Viem là `0x${string}` (`0x` theo sau là một chuỗi). Ở đây chúng ta nói với TypeScript rằng biến môi trường `PRIVATE_KEY` sẽ thuộc loại đó. Nếu không, chúng ta sẽ nhận được một lỗi thời gian chạy.
+
+Hàm [`privateKeyToAccount`](https://viem.sh/docs/accounts/privateKey) sau đó sử dụng khóa riêng tư này để tạo một đối tượng tài khoản đầy đủ.
+
+```typescript
+const walletClient = createWalletClient({
+ account,
+ chain: holesky,
+ transport: http(),
+})
+```
+
+Tiếp theo, chúng ta sử dụng đối tượng tài khoản để tạo một [máy khách ví](https://viem.sh/docs/clients/wallet). Máy khách này có một khóa riêng tư và một địa chỉ, vì vậy nó có thể được sử dụng để gửi các giao dịch.
+
+```typescript
+const greeter = getContract({
+ address: greeterAddress,
+ abi: greeterABI,
+ client: { public: publicClient, wallet: walletClient },
+})
+```
+
+Bây giờ chúng ta đã có tất cả các điều kiện tiên quyết, cuối cùng chúng ta có thể tạo một [thể hiện hợp đồng](https://viem.sh/docs/contract/getContract). Chúng ta sẽ sử dụng thể hiện hợp đồng này để giao tiếp với hợp đồng trên chuỗi.
+
+##### Đọc từ chuỗi khối
+
+```typescript
+console.log(`Current greeting:`, await greeter.read.greet())
+```
+
+Các hàm hợp đồng chỉ đọc ([`view`](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm) và [`pure`](https://www.tutorialspoint.com/solidity/solidity_pure_functions.htm)) có sẵn trong `read`. Trong trường hợp này, chúng ta sử dụng nó để truy cập hàm [`greet`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=read_contract#cfae3217), hàm này trả về lời chào.
+
+JavaScript là đơn luồng, vì vậy khi chúng ta khởi động một tiến trình chạy dài, chúng ta cần [chỉ định rằng chúng ta thực hiện nó một cách bất đồng bộ](https://eloquentjavascript.net/11_async.html#h-XvLsfAhtsE). Việc gọi chuỗi khối, ngay cả đối với một hoạt động chỉ đọc, đòi hỏi một tương tác hai chiều giữa máy tính và một nút chuỗi khối. Đó là lý do tại sao ở đây chúng ta chỉ định mã cần `await` kết quả.
+
+Nếu bạn quan tâm đến cách hoạt động của nó, bạn có thể [đọc về nó ở đây](https://www.w3schools.com/js/js_promise.asp), nhưng về mặt thực tế, tất cả những gì bạn cần biết là bạn `await` kết quả nếu bạn bắt đầu một hoạt động mất nhiều thời gian, và bất kỳ hàm nào làm điều này đều phải được khai báo là `async`.
+
+##### Phát hành giao dịch
+
+```typescript
+const setGreeting = async (greeting: string): Promise => {
+```
+
+Đây là hàm bạn gọi để phát hành một giao dịch thay đổi lời chào. Vì đây là một hoạt động dài, hàm được khai báo là `async`. Do cách triển khai nội bộ, bất kỳ hàm `async` nào cũng cần trả về một đối tượng `Promise`. Trong trường hợp này, `Promise` có nghĩa là chúng ta không chỉ định chính xác những gì sẽ được trả về trong `Promise`.
+
+```typescript
+const txHash = await greeter.write.setGreeting([greeting])
+```
+
+Trường `write` của thể hiện hợp đồng có tất cả các hàm ghi vào trạng thái chuỗi khối (những hàm yêu cầu gửi một giao dịch), chẳng hạn như [`setGreeting`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract#a4136862). Các tham số, nếu có, được cung cấp dưới dạng một danh sách, và hàm trả về hàm băm của giao dịch.
+
+```typescript
+ console.log(`Working on a fix, see https://eth-holesky.blockscout.com/tx/${txHash}`)
+
+ return txHash
+}
+```
+
+Báo cáo hàm băm của giao dịch (như một phần của URL đến trình khám phá khối để xem nó) và trả về nó.
+
+##### Phản hồi sự kiện
+
+```typescript
+greeter.watchEvent.SetGreeting({
+```
+
+[Hàm `watchEvent`](https://viem.sh/docs/actions/public/watchEvent) cho phép bạn chỉ định một hàm sẽ chạy khi một sự kiện được phát ra. Nếu bạn chỉ quan tâm đến một loại sự kiện (trong trường hợp này là `SetGreeting`), bạn có thể sử dụng cú pháp này để giới hạn mình trong loại sự kiện đó.
+
+```typescript
+ onLogs: logs => {
+```
+
+Hàm `onLogs` được gọi khi có các mục nhật ký. Trong Ethereum, "nhật ký" và "sự kiện" thường có thể thay thế cho nhau.
+
+```typescript
+console.log(
+ `Address ${logs[0].args.sender} changed the greeting to ${logs[0].args.greeting}`
+)
+```
+
+Có thể có nhiều sự kiện, nhưng để đơn giản, chúng ta chỉ quan tâm đến sự kiện đầu tiên. `logs[0].args` là các đối số của sự kiện, trong trường hợp này là `sender` và `greeting`.
+
+```typescript
+ if (logs[0].args.sender != account.address)
+ setGreeting(`${account.address} insists on it being Hello!`)
+ }
+})
+```
+
+Nếu người gửi _không phải_ là máy chủ này, hãy sử dụng `setGreeting` để thay đổi lời chào.
+
+#### `package.json` {#package-json}
+
+[Tệp này](https://github.com/qbzzt/20240715-server-component/blob/main/package.json) kiểm soát cấu hình [Node.js](https://nodejs.org/en). Bài viết này chỉ giải thích các định nghĩa quan trọng.
+
+```json
+{
+ "main": "dist/index.js",
+```
+
+Định nghĩa này chỉ định tệp JavaScript nào sẽ chạy.
+
+```json
+ "scripts": {
+ "start": "tsc && node dist/app.js",
+ },
+```
+
+Các tập lệnh là các hành động ứng dụng khác nhau. Trong trường hợp này, cái duy nhất chúng ta có là `start`, nó biên dịch và sau đó chạy máy chủ. Lệnh `tsc` là một phần của gói `typescript` và biên dịch TypeScript thành JavaScript. Nếu bạn muốn chạy nó theo cách thủ công, nó nằm trong `node_modules/.bin`. Lệnh thứ hai chạy máy chủ.
+
+```json
+ "type": "module",
+```
+
+Có nhiều loại ứng dụng node JavaScript. Loại `module` cho phép chúng ta có `await` trong mã cấp cao nhất, điều này quan trọng khi bạn thực hiện các hoạt động chậm (và do đó là bất đồng bộ).
+
+```json
+ "devDependencies": {
+ "@types/node": "^20.14.2",
+ "typescript": "^5.4.5"
+ },
+```
+
+Đây là những gói chỉ cần thiết cho việc phát triển. Ở đây chúng ta cần `typescript` và vì chúng ta đang sử dụng nó với Node.js, chúng ta cũng đang nhận được các kiểu cho các biến và đối tượng của node, chẳng hạn như `process`. [Ký hiệu `^`](https://github.com/npm/node-semver?tab=readme-ov-file#caret-ranges-123-025-004) có nghĩa là phiên bản đó hoặc một phiên bản cao hơn không có các thay đổi đột phá. Xem [ở đây](https://semver.org) để biết thêm thông tin về ý nghĩa của các số phiên bản.
+
+```json
+ "dependencies": {
+ "dotenv": "^16.4.5",
+ "viem": "2.14.1"
+ }
+}
+```
+
+Đây là những gói được yêu cầu tại thời gian chạy, khi chạy `dist/app.js`.
+
+## Kết luận {#conclusion}
+
+Máy chủ tập trung mà chúng tôi đã tạo ở đây thực hiện công việc của nó, đó là hoạt động như một tác nhân cho một người dùng. Bất kỳ ai khác muốn dapp tiếp tục hoạt động và sẵn sàng chi trả gas đều có thể chạy một phiên bản mới của máy chủ với địa chỉ của riêng họ.
+
+Tuy nhiên, điều này chỉ hoạt động khi các hành động của máy chủ tập trung có thể được xác minh dễ dàng. Nếu máy chủ tập trung có bất kỳ thông tin trạng thái bí mật nào, hoặc chạy các phép tính khó, nó là một thực thể tập trung mà bạn cần tin tưởng để sử dụng ứng dụng, điều mà các chuỗi khối cố gắng tránh. Trong một bài viết trong tương lai, tôi dự định sẽ chỉ ra cách sử dụng [bằng chứng không kiến thức](/zero-knowledge-proofs) để giải quyết vấn đề này.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
diff --git a/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
new file mode 100644
index 00000000000..6dc12c13002
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
@@ -0,0 +1,92 @@
+---
+title: Thiết lập web3.js để sử dụng chuỗi khối Ethereum trong JavaScript
+description: Tìm hiểu cách thiết lập và cấu hình thư viện web3.js để tương tác với chuỗi khối Ethereum từ các ứng dụng JavaScript.
+author: "jdourlens"
+tags: [ "web3.js", "javascript" ]
+skill: beginner
+lang: vi
+published: 2020-04-11
+source: EthereumDev
+sourceUrl: https://ethereumdev.io/setup-web3js-to-use-the-ethereum-blockchain-in-javascript/
+address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
+---
+
+Trong hướng dẫn này, chúng ta sẽ xem cách bắt đầu với [web3.js](https://web3js.readthedocs.io/) để tương tác với chuỗi khối Ethereum. Web3.js có thể được sử dụng trong cả frontend và backend để đọc dữ liệu từ chuỗi khối hoặc thực hiện giao dịch và thậm chí triển khai các hợp đồng thông minh.
+
+Bước đầu tiên là thêm web3.js vào dự án của bạn. Để sử dụng trong một trang web, bạn có thể nhập thư viện trực tiếp bằng cách sử dụng một CDN như JSDeliver.
+
+```html
+
+```
+
+Nếu bạn muốn cài đặt thư viện để sử dụng trong backend hoặc một dự án frontend có sử dụng bản dựng, bạn có thể cài đặt nó bằng npm:
+
+```bash
+npm install web3 --save
+```
+
+Sau đó, để nhập Web3.js vào một kịch bản Node.js hoặc một dự án frontend Browserify, bạn có thể sử dụng dòng JavaScript sau:
+
+```js
+const Web3 = require("web3")
+```
+
+Bây giờ chúng ta đã thêm thư viện vào dự án, chúng ta cần khởi tạo nó. Dự án của bạn cần có khả năng giao tiếp với chuỗi khối. Hầu hết các thư viện Ethereum giao tiếp với một [nút](/developers/docs/nodes-and-clients/) thông qua các lệnh gọi RPC. Để khởi tạo nhà cung cấp Web3 của chúng ta, chúng ta sẽ khởi tạo một thực thể Web3 bằng cách chuyển URL của nhà cung cấp làm hàm tạo. Nếu bạn có một nút hoặc [một thực thể ganache đang chạy trên máy tính của bạn](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/), nó sẽ trông như thế này:
+
+```js
+const web3 = new Web3("http://localhost:8545")
+```
+
+Nếu bạn muốn truy cập trực tiếp vào một nút được lưu trữ, bạn có thể tìm các tùy chọn trên [các nút dưới dạng dịch vụ](/developers/docs/nodes-and-clients/nodes-as-a-service).
+
+```js
+const web3 = new Web3("https://cloudflare-eth.com")
+```
+
+Để kiểm tra xem chúng ta đã cấu hình chính xác thực thể Web3 của mình chưa, chúng ta sẽ cố gắng truy xuất số khối mới nhất bằng cách sử dụng hàm `getBlockNumber`. Hàm này chấp nhận một lệnh gọi lại làm tham số và trả về số khối dưới dạng một số nguyên.
+
+```js
+var Web3 = require("web3")
+const web3 = new Web3("https://cloudflare-eth.com")
+
+web3.eth.getBlockNumber(function (error, result) {
+ console.log(result)
+})
+```
+
+Nếu bạn thực thi chương trình này, nó sẽ chỉ in ra số khối mới nhất: đỉnh của chuỗi khối. Bạn cũng có thể sử dụng các lệnh gọi hàm `await/async` để tránh lồng các lệnh gọi lại trong mã của bạn:
+
+```js
+async function getBlockNumber() {
+ const latestBlockNumber = await web3.eth.getBlockNumber()
+ console.log(latestBlockNumber)
+ return latestBlockNumber
+}
+
+getBlockNumber()
+```
+
+Bạn có thể xem tất cả các hàm có sẵn trên thực thể Web3 trong [tài liệu tham khảo chính thức của web3.js](https://docs.web3js.org/).
+
+Hầu hết các thư viện Web3 đều không đồng bộ vì trong nền, thư viện thực hiện các lệnh gọi JSON-RPC đến nút, nơi sẽ gửi lại kết quả.
+
+
+
+Nếu bạn đang làm việc trong trình duyệt, một số ví trực tiếp chèn một thực thể Web3 và bạn nên cố gắng sử dụng nó bất cứ khi nào có thể, đặc biệt nếu bạn có kế hoạch tương tác với địa chỉ Ethereum của người dùng để thực hiện giao dịch.
+
+Đây là đoạn mã để phát hiện xem có ví MetaMask hay không và cố gắng kích hoạt nó nếu có. Sau đó, nó sẽ cho phép bạn đọc số dư của người dùng và cho phép họ xác thực các giao dịch bạn muốn họ thực hiện trên chuỗi khối Ethereum:
+
+```js
+if (window.ethereum != null) {
+ state.web3 = new Web3(window.ethereum)
+ try {
+ // Yêu cầu quyền truy cập tài khoản nếu cần
+ await window.ethereum.enable()
+ // Tài khoản hiện đã được hiển thị
+ } catch (error) {
+ // Người dùng từ chối quyền truy cập tài khoản...
+ }
+}
+```
+
+Các lựa chọn thay thế cho web3.js như [Ethers.js](https://docs.ethers.io/) có tồn tại và cũng được sử dụng phổ biến. Trong hướng dẫn tiếp theo, chúng ta sẽ xem [cách dễ dàng lắng nghe các khối mới đến trên chuỗi khối và xem chúng chứa gì](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/).
diff --git a/public/content/translations/vi/developers/tutorials/short-abi/index.md b/public/content/translations/vi/developers/tutorials/short-abi/index.md
new file mode 100644
index 00000000000..16dcc15545f
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/short-abi/index.md
@@ -0,0 +1,585 @@
+---
+title: "Các ABI ngắn để tối ưu hóa Calldata"
+description: Tối ưu hóa hợp đồng thông minh cho các gộp giao dịch lạc quan
+author: Ori Pomerantz
+lang: vi
+tags: [ "lớp 2" ]
+skill: intermediate
+published: 2022-04-01
+---
+
+## Giới thiệu {#introduction}
+
+Trong bài viết này, bạn sẽ tìm hiểu về [các gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups), chi phí giao dịch trên chúng và cách cấu trúc chi phí khác biệt đó đòi hỏi chúng ta phải tối ưu hóa cho những thứ khác so với trên Mạng chính Ethereum.
+Bạn cũng sẽ học cách thực hiện tối ưu hóa này.
+
+### Tiết lộ đầy đủ {#full-disclosure}
+
+Tôi là nhân viên toàn thời gian của [Optimism](https://www.optimism.io/), vì vậy các ví dụ trong bài viết này sẽ chạy trên Optimism.
+Tuy nhiên, kỹ thuật được giải thích ở đây cũng sẽ hoạt động tốt cho các rollup khác.
+
+### Thuật ngữ {#terminology}
+
+Khi thảo luận về các rollup, thuật ngữ 'lớp 1' (L1) được sử dụng cho Mạng chính, mạng Ethereum sản phẩm.
+Thuật ngữ 'lớp 2' (L2) được sử dụng cho rollup hoặc bất kỳ hệ thống nào khác dựa vào L1 để bảo mật nhưng thực hiện hầu hết quá trình xử lý của nó ngoài chuỗi.
+
+## Làm cách nào chúng ta có thể giảm thêm chi phí giao dịch L2? {#how-can-we-further-reduce-the-cost-of-L2-transactions}
+
+[Các gộp giao dịch lạc quan](/developers/docs/scaling/optimistic-rollups) phải lưu giữ bản ghi của mọi giao dịch trong lịch sử để bất kỳ ai cũng có thể xem qua chúng và xác minh rằng trạng thái hiện tại là chính xác.
+Cách rẻ nhất để đưa dữ liệu vào Mạng chính Ethereum là ghi dữ liệu đó dưới dạng calldata.
+Giải pháp này đã được cả [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) và [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups) lựa chọn.
+
+### Chi phí giao dịch L2 {#cost-of-l2-transactions}
+
+Chi phí giao dịch L2 bao gồm hai thành phần:
+
+1. Xử lý L2, thường cực kỳ rẻ
+2. Lưu trữ L1, gắn liền với chi phí gas của Mạng chính
+
+Khi tôi đang viết bài này, trên Optimism, chi phí gas L2 là 0,001 [Gwei](/developers/docs/gas/#pre-london).
+Mặt khác, chi phí gas L1 là khoảng 40 gwei.
+[Bạn có thể xem giá hiện tại tại đây](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m).
+
+Một byte calldata có giá 4 gas (nếu là số không) hoặc 16 gas (nếu là bất kỳ giá trị nào khác).
+Một trong những hoạt động tốn kém nhất trên máy ảo ethereum (EVM) là ghi vào bộ nhớ lưu trữ.
+Chi phí tối đa để ghi một từ 32 byte vào bộ nhớ lưu trữ trên L2 là 22100 gas. Hiện tại, chi phí này là 22,1 gwei.
+Vì vậy, nếu chúng ta có thể tiết kiệm một byte calldata bằng không, chúng ta sẽ có thể ghi khoảng 200 byte vào bộ nhớ lưu trữ mà vẫn có lợi.
+
+### Giao diện nhị phân ứng dụng (ABI) {#the-abi}
+
+Phần lớn các giao dịch truy cập vào một hợp đồng từ một tài khoản sở hữu ngoại biên.
+Hầu hết các hợp đồng được viết bằng Solidity và diễn giải trường dữ liệu của chúng theo [giao diện nhị phân ứng dụng (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding).
+
+Tuy nhiên, ABI được thiết kế cho L1, nơi một byte calldata có giá xấp xỉ bốn phép toán số học, chứ không phải L2, nơi một byte calldata có giá hơn một nghìn phép toán số học.
+Calldata được chia như sau:
+
+| Phần | Độ dài | Byte | Byte lãng phí | Gas lãng phí | Byte cần thiết | Gas cần thiết |
+| ------------ | -----: | ----: | ------------: | -----------: | -------------: | ------------: |
+| Bộ chọn hàm | 4 | 0-3 | 3 | 48 | 1 | 16 |
+| Các số không | 12 | 4-15 | 12 | 48 | 0 | 0 |
+| Địa chỉ đích | 20 | 16-35 | 0 | 0 | 20 | 320 |
+| Số lượng | 32 | 36-67 | 17 | 64 | 15 | 240 |
+| Tổng | 68 | | | 160 | | 576 |
+
+Giải thích:
+
+- **Bộ chọn hàm**: Hợp đồng có ít hơn 256 hàm, vì vậy chúng ta có thể phân biệt chúng bằng một byte duy nhất.
+ Các byte này thường khác không và do đó [có giá mười sáu gas](https://eips.ethereum.org/EIPS/eip-2028).
+- **Các số không**: Các byte này luôn bằng không vì một địa chỉ hai mươi byte không yêu cầu một từ ba mươi hai byte để chứa nó.
+ Các byte chứa giá trị không có giá bốn gas ([xem sách vàng](https://ethereum.github.io/yellowpaper/paper.pdf), Phụ lục G,
+ tr. 27, giá trị cho `G``txdatazero`).
+- **Số lượng**: Nếu chúng ta giả định rằng trong hợp đồng này, `decimals` là mười tám (giá trị bình thường) và số lượng token tối đa chúng ta chuyển sẽ là 1018, chúng ta sẽ có số lượng tối đa là 1036.
+ 25615 > 1036, vì vậy mười lăm byte là đủ.
+
+Lãng phí 160 gas trên L1 thường không đáng kể. Một giao dịch có giá ít nhất [21.000 gas](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), vì vậy thêm 0,8% không thành vấn đề.
+Tuy nhiên, trên L2, mọi thứ lại khác. Hầu như toàn bộ chi phí của giao dịch là ghi nó vào L1.
+Ngoài calldata giao dịch, có 109 byte tiêu đề giao dịch (địa chỉ đích, chữ ký, v.v.).
+Do đó, tổng chi phí là `109*16+576+160=2480`, và chúng ta đang lãng phí khoảng 6,5% trong số đó.
+
+## Giảm chi phí khi bạn không kiểm soát đích đến {#reducing-costs-when-you-dont-control-the-destination}
+
+Giả sử rằng bạn không có quyền kiểm soát hợp đồng đích, bạn vẫn có thể sử dụng một giải pháp tương tự như [giải pháp này](https://github.com/qbzzt/ethereum.org-20220330-shortABI).
+Hãy xem qua các tệp có liên quan.
+
+### Token.sol {#token-sol}
+
+[Đây là hợp đồng đích](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol).
+Đó là một hợp đồng ERC-20 tiêu chuẩn, với một tính năng bổ sung.
+Hàm `faucet` này cho phép bất kỳ người dùng nào nhận được một số token để sử dụng.
+Điều này sẽ làm cho một hợp đồng ERC-20 sản phẩm trở nên vô dụng, nhưng nó giúp cuộc sống dễ dàng hơn khi một ERC-20 chỉ tồn tại để tạo điều kiện thử nghiệm.
+
+```solidity
+ /**
+ * @dev Cung cấp cho người gọi 1000 token để sử dụng
+ */
+ function faucet() external {
+ _mint(msg.sender, 1000);
+ } // function faucet
+```
+
+### CalldataInterpreter.sol {#calldatainterpreter-sol}
+
+[Đây là hợp đồng mà các giao dịch sẽ gọi với calldata ngắn hơn](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol).
+Hãy xem xét từng dòng một.
+
+```solidity
+//SPDX-License-Identifier: Unlicense
+pragma solidity ^0.8.0;
+
+
+import { OrisUselessToken } from "./Token.sol";
+```
+
+Chúng ta cần hàm token để biết cách gọi nó.
+
+```solidity
+contract CalldataInterpreter {
+
+ OrisUselessToken public immutable token;
+```
+
+Địa chỉ của token mà chúng tôi là một proxy.
+
+```solidity
+
+ /**
+ * @dev Chỉ định địa chỉ token
+ * @param tokenAddr_ địa chỉ hợp đồng ERC-20
+ */
+ constructor(
+ address tokenAddr_
+ ) {
+ token = OrisUselessToken(tokenAddr_);
+ } // constructor
+```
+
+Địa chỉ token là tham số duy nhất chúng ta cần chỉ định.
+
+```solidity
+ function calldataVal(uint startByte, uint length)
+ private pure returns (uint) {
+```
+
+Đọc một giá trị từ 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");
+```
+
+Chúng ta sẽ tải một từ 32 byte (256-bit) vào bộ nhớ và loại bỏ các byte không phải là một phần của trường chúng ta muốn.
+Thuật toán này không hoạt động đối với các giá trị dài hơn 32 byte, và tất nhiên chúng ta không thể đọc vượt quá cuối calldata.
+Trên L1, có thể cần bỏ qua các bài kiểm tra này để tiết kiệm gas, nhưng trên L2, gas cực kỳ rẻ, cho phép chúng ta thực hiện bất kỳ kiểm tra tính hợp lệ nào có thể nghĩ đến.
+
+```solidity
+ assembly {
+ _retVal := calldataload(startByte)
+ }
+```
+
+Chúng ta có thể sao chép dữ liệu từ lệnh gọi đến `fallback()` (xem bên dưới), nhưng việc sử dụng [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), ngôn ngữ hợp ngữ của máy ảo ethereum (EVM), sẽ dễ dàng hơn.
+
+Ở đây chúng ta sử dụng [opcode CALLDATALOAD](https://www.evm.codes/#35) để đọc các byte từ `startByte` đến `startByte+31` vào ngăn xếp.
+Nói chung, cú pháp của một opcode trong Yul là \`(,...).
+
+```solidity
+
+ _retVal = _retVal >> (256-length*8);
+```
+
+Chỉ các byte `length` quan trọng nhất là một phần của trường, vì vậy chúng ta [dịch phải](https://en.wikipedia.org/wiki/Logical_shift) để loại bỏ các giá trị khác.
+Điều này có thêm lợi thế là di chuyển giá trị sang bên phải của trường, vì vậy nó là chính giá trị đó thay vì giá trị nhân với 256lần nào đó.
+
+```solidity
+
+ return _retVal;
+ }
+
+
+ fallback() external {
+```
+
+Khi một lệnh gọi đến hợp đồng Solidity không khớp với bất kỳ chữ ký hàm nào, nó sẽ gọi [hàm `fallback()`](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) (giả sử có một hàm).
+Trong trường hợp của `CalldataInterpreter`, _bất kỳ_ lệnh gọi nào cũng sẽ đến đây vì không có hàm `external` hoặc `public` nào khác.
+
+```solidity
+ uint _func;
+
+ _func = calldataVal(0, 1);
+```
+
+Đọc byte đầu tiên của calldata, cho chúng ta biết hàm.
+Có hai lý do tại sao một hàm sẽ không có sẵn ở đây:
+
+1. Các hàm `pure` hoặc `view` không thay đổi trạng thái và không tốn gas (khi được gọi ngoài chuỗi).
+ Không có ý nghĩa gì khi cố gắng giảm chi phí gas của chúng.
+2. Các hàm dựa trên [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties).
+ Giá trị của `msg.sender` sẽ là địa chỉ của `CalldataInterpreter`, không phải là người gọi.
+
+Thật không may, [nhìn vào các thông số kỹ thuật ERC-20](https://eips.ethereum.org/EIPS/eip-20), điều này chỉ còn lại một hàm, `transfer`.
+Điều này chỉ còn lại hai hàm: `transfer` (bởi vì chúng ta có thể gọi `transferFrom`) và `faucet` (bởi vì chúng ta có thể chuyển token trở lại cho bất kỳ ai đã gọi chúng ta).
+
+```solidity
+
+ // Gọi các phương thức thay đổi trạng thái của token bằng
+ // thông tin từ calldata
+
+ // faucet
+ if (_func == 1) {
+```
+
+Một lệnh gọi đến `faucet()`, không có tham số.
+
+```solidity
+ token.faucet();
+ token.transfer(msg.sender,
+ token.balanceOf(address(this)));
+ }
+```
+
+Sau khi chúng ta gọi `token.faucet()`, chúng ta nhận được token. Tuy nhiên, với tư cách là hợp đồng proxy, chúng tôi không **cần** token.
+EOA (tài khoản sở hữu bên ngoài) hoặc hợp đồng đã gọi chúng tôi thì cần.
+Vì vậy, chúng tôi chuyển tất cả token của mình cho bất kỳ ai đã gọi chúng tôi.
+
+```solidity
+ // chuyển khoản (giả sử chúng ta có khoản cho phép cho nó)
+ if (_func == 2) {
+```
+
+Chuyển token yêu cầu hai tham số: địa chỉ đích và số lượng.
+
+```solidity
+ token.transferFrom(
+ msg.sender,
+```
+
+Chúng tôi chỉ cho phép người gọi chuyển token mà họ sở hữu
+
+```solidity
+ address(uint160(calldataVal(1, 20))),
+```
+
+Địa chỉ đích bắt đầu ở byte #1 (byte #0 là hàm).
+Là một địa chỉ, nó dài 20 byte.
+
+```solidity
+ calldataVal(21, 2)
+```
+
+Đối với hợp đồng cụ thể này, chúng tôi giả định rằng số lượng token tối đa mà bất kỳ ai muốn chuyển sẽ vừa trong hai byte (ít hơn 65536).
+
+```solidity
+ );
+ }
+```
+
+Nhìn chung, một lần chuyển khoản mất 35 byte calldata:
+
+| Phần | Độ dài | Byte |
+| ------------ | -----: | ----: |
+| Bộ chọn hàm | 1 | 0 |
+| Địa chỉ đích | 32 | 1-32 |
+| Số lượng | 2 | 33-34 |
+
+```solidity
+ } // fallback
+
+} // contract CalldataInterpreter
+```
+
+### test.js {#test-js}
+
+[Thử nghiệm đơn vị JavaScript này](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) cho chúng ta thấy cách sử dụng cơ chế này (và cách xác minh nó hoạt động chính xác).
+Tôi sẽ giả định bạn hiểu [chai](https://www.chaijs.com/) và [ethers](https://docs.ethers.io/v5/) và chỉ giải thích các phần áp dụng cụ thể cho hợp đồng.
+
+```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()
+```
+
+Chúng tôi bắt đầu bằng cách triển khai cả hai hợp đồng.
+
+```javascript
+ // Nhận token để sử dụng
+ const faucetTx = {
+```
+
+Chúng ta không thể sử dụng các hàm cấp cao mà chúng ta thường sử dụng (chẳng hạn như `token.faucet()`) để tạo giao dịch, vì chúng ta không tuân theo ABI.
+Thay vào đó, chúng ta phải tự xây dựng giao dịch và sau đó gửi nó.
+
+```javascript
+ to: cdi.address,
+ data: "0x01"
+```
+
+Có hai tham số chúng ta cần cung cấp cho giao dịch:
+
+1. `to`, địa chỉ đích.
+ Đây là hợp đồng thông dịch calldata.
+2. `data`, calldata cần gửi.
+ Trong trường hợp gọi faucet, dữ liệu là một byte duy nhất, `0x01`.
+
+```javascript
+
+ }
+ await (await signer.sendTransaction(faucetTx)).wait()
+```
+
+Chúng tôi gọi [phương thức `sendTransaction` của người ký](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) vì chúng tôi đã chỉ định đích (`faucetTx.to`) và chúng tôi cần giao dịch được ký.
+
+```javascript
+// Kiểm tra faucet cung cấp token chính xác
+expect(await token.balanceOf(signer.address)).to.equal(1000)
+```
+
+Ở đây chúng tôi xác minh số dư.
+Không cần tiết kiệm gas cho các hàm `view`, vì vậy chúng tôi chỉ chạy chúng bình thường.
+
+```javascript
+// Cấp cho CDI một khoản cho phép (không thể ủy quyền phê duyệt)
+const approveTX = await token.approve(cdi.address, 10000)
+await approveTX.wait()
+expect(await token.allowance(signer.address, cdi.address)).to.equal(10000)
+```
+
+Cấp cho trình thông dịch calldata một khoản trợ cấp để có thể thực hiện chuyển khoản.
+
+```javascript
+// Chuyển token
+const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d"
+const transferTx = {
+ to: cdi.address,
+ data: "0x02" + destAddr.slice(2, 42) + "0100",
+}
+```
+
+Tạo một giao dịch chuyển khoản. Byte đầu tiên là "0x02", theo sau là địa chỉ đích và cuối cùng là số tiền (0x0100, tức là 256 trong hệ thập phân).
+
+```javascript
+ await (await signer.sendTransaction(transferTx)).wait()
+
+ // Kiểm tra xem chúng ta có ít hơn 256 token
+ expect (await token.balanceOf(signer.address)).to.equal(1000-256)
+
+ // Và đích đến của chúng ta đã nhận được chúng
+ expect (await token.balanceOf(destAddr)).to.equal(256)
+ }) // it
+}) // describe
+```
+
+## Giảm chi phí khi bạn kiểm soát hợp đồng đích {#reducing-the-cost-when-you-do-control-the-destination-contract}
+
+Nếu bạn có quyền kiểm soát hợp đồng đích, bạn có thể tạo các hàm bỏ qua kiểm tra `msg.sender` vì chúng tin tưởng vào trình thông dịch calldata.
+[Bạn có thể xem một ví dụ về cách hoạt động của nó tại đây, trong nhánh `control-contract`](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract).
+
+Nếu hợp đồng chỉ phản hồi các giao dịch bên ngoài, chúng ta có thể chỉ cần một hợp đồng duy nhất.
+Tuy nhiên, điều đó sẽ phá vỡ [tính kết hợp](/developers/docs/smart-contracts/composability/).
+Tốt hơn nhiều là có một hợp đồng phản hồi các lệnh gọi ERC-20 bình thường và một hợp đồng khác phản hồi các giao dịch với dữ liệu cuộc gọi ngắn.
+
+### Token.sol {#token-sol-2}
+
+Trong ví dụ này, chúng ta có thể sửa đổi `Token.sol`.
+Điều này cho phép chúng ta có một số hàm mà chỉ proxy mới có thể gọi.
+Dưới đây là các phần mới:
+
+```solidity
+ // Địa chỉ duy nhất được phép chỉ định địa chỉ CalldataInterpreter
+ address owner;
+
+ // Địa chỉ CalldataInterpreter
+ address proxy = address(0);
+```
+
+Hợp đồng ERC-20 cần biết danh tính của proxy được ủy quyền.
+Tuy nhiên, chúng ta không thể đặt biến này trong hàm khởi tạo, vì chúng ta chưa biết giá trị của nó.
+Hợp đồng này được khởi tạo trước vì proxy mong đợi địa chỉ của token trong hàm tạo của nó.
+
+```solidity
+ /**
+ * @dev Gọi hàm khởi tạo ERC20.
+ */
+ constructor(
+ ) ERC20("Oris useless token-2", "OUT-2") {
+ owner = msg.sender;
+ }
+```
+
+Địa chỉ của người tạo (được gọi là `owner`) được lưu trữ ở đây vì đó là địa chỉ duy nhất được phép đặt proxy.
+
+```solidity
+ /**
+ * @dev đặt địa chỉ cho proxy (CalldataInterpreter).
+ * Chỉ có thể được gọi một lần bởi chủ sở hữu
+ */
+ 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
+```
+
+Proxy có quyền truy cập đặc quyền, vì nó có thể bỏ qua các kiểm tra bảo mật.
+Để đảm bảo rằng chúng ta có thể tin tưởng vào proxy, chúng tôi chỉ cho phép `owner` gọi hàm này và chỉ một lần.
+Khi `proxy` có giá trị thực (khác không), giá trị đó không thể thay đổi, vì vậy ngay cả khi chủ sở hữu quyết định trở thành kẻ xấu, hoặc cụm từ ghi nhớ của nó bị tiết lộ, chúng ta vẫn an toàn.
+
+```solidity
+ /**
+ * @dev Một số hàm chỉ có thể được gọi bởi proxy.
+ */
+ modifier onlyProxy {
+```
+
+Đây là một [`hàm modifier`](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), nó sửa đổi cách hoạt động của các hàm khác.
+
+```solidity
+ require(msg.sender == proxy);
+```
+
+Đầu tiên, xác minh chúng tôi được gọi bởi proxy chứ không phải ai khác.
+Nếu không, hãy `revert`.
+
+```solidity
+ _;
+ }
+```
+
+Nếu vậy, hãy chạy hàm mà chúng tôi sửa đổi.
+
+```solidity
+ /* Các hàm cho phép proxy thực sự làm proxy cho các tài khoản */
+
+ 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;
+ }
+```
+
+Đây là ba hoạt động thường yêu cầu thông điệp phải đến trực tiếp từ thực thể chuyển token hoặc phê duyệt một khoản trợ cấp.
+Ở đây chúng tôi có một phiên bản proxy của các hoạt động này:
+
+1. Được sửa đổi bởi `onlyProxy()` để không ai khác được phép kiểm soát chúng.
+2. Nhận địa chỉ thường là `msg.sender` làm tham số bổ sung.
+
+### CalldataInterpreter.sol {#calldatainterpreter-sol-2}
+
+Trình thông dịch calldata gần như giống hệt với trình thông dịch ở trên, ngoại trừ việc các hàm được ủy quyền nhận tham số `msg.sender` và không cần có khoản cho phép `transfer`.
+
+```solidity
+ // chuyển khoản (không cần khoản cho phép)
+ if (_func == 2) {
+ token.transferProxy(
+ msg.sender,
+ address(uint160(calldataVal(1, 20))),
+ calldataVal(21, 2)
+ );
+ }
+
+ // phê duyệt
+ 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}
+
+Có một vài thay đổi giữa mã kiểm tra trước đó và mã này.
+
+```js
+const Cdi = await ethers.getContractFactory("CalldataInterpreter")
+const cdi = await Cdi.deploy(token.address)
+await cdi.deployed()
+await token.setProxy(cdi.address)
+```
+
+Chúng ta cần cho hợp đồng ERC-20 biết proxy nào cần tin tưởng
+
+```js
+console.log("CalldataInterpreter addr:", cdi.address)
+
+// Cần hai người ký để xác minh các khoản cho phép
+const signers = await ethers.getSigners()
+const signer = signers[0]
+const poorSigner = signers[1]
+```
+
+Để kiểm tra `approve()` và `transferFrom()`, chúng ta cần một người ký thứ hai.
+Chúng tôi gọi nó là `poorSigner` vì nó không nhận được bất kỳ token nào của chúng tôi (tất nhiên nó cần phải có ETH).
+
+```js
+// Chuyển token
+const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d"
+const transferTx = {
+ to: cdi.address,
+ data: "0x02" + destAddr.slice(2, 42) + "0100",
+}
+await (await signer.sendTransaction(transferTx)).wait()
+```
+
+Bởi vì hợp đồng ERC-20 tin tưởng vào proxy (`cdi`), chúng ta không cần một khoản trợ cấp để chuyển tiếp các giao dịch chuyển khoản.
+
+```js
+// phê duyệt và 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)
+```
+
+Kiểm tra hai chức năng mới.
+Lưu ý rằng `transferFromTx` yêu cầu hai tham số địa chỉ: người cấp khoản cho phép và người nhận.
+
+## Kết luận {#conclusion}
+
+Cả [Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) và [Arbitrum](https://developer.offchainlabs.com/docs/special_features) đều đang tìm cách giảm kích thước của calldata được ghi vào L1 và do đó giảm chi phí giao dịch.
+Tuy nhiên, với tư cách là các nhà cung cấp cơ sở hạ tầng đang tìm kiếm các giải pháp chung, khả năng của chúng tôi bị hạn chế.
+Với tư cách là nhà phát triển ứng dụng phi tập trung, bạn có kiến thức cụ thể về ứng dụng, cho phép bạn tối ưu hóa calldata của mình tốt hơn nhiều so với chúng tôi trong một giải pháp chung.
+Hy vọng rằng, bài viết này sẽ giúp bạn tìm ra giải pháp lý tưởng cho nhu cầu của mình.
+
+[Xem thêm công việc của tôi tại đây](https://cryptodocguy.pro/).
+
diff --git a/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
new file mode 100644
index 00000000000..b236b77229e
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
@@ -0,0 +1,91 @@
+---
+title: Các nguyên tắc bảo mật hợp đồng thông minh
+description: Danh sách kiểm tra các nguyên tắc bảo mật cần xem xét khi xây dựng ứng dụng phi tập trung của bạn
+author: "Trailofbits"
+tags: [ "solidity", "hợp đồng thông minh", "tính bảo mật" ]
+skill: intermediate
+lang: vi
+published: 2020-09-06
+source: Xây dựng những hợp đồng an toàn
+sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md
+---
+
+Làm theo các khuyến nghị cấp cao này để xây dựng các hợp đồng thông minh bảo mật hơn.
+
+## Nguyên tắc thiết kế {#design-guidelines}
+
+Thiết kế của hợp đồng nên được thảo luận trước, trước khi viết bất kỳ dòng mã nào.
+
+### Tài liệu và thông số kỹ thuật {#documentation-and-specifications}
+
+Tài liệu có thể được viết ở các cấp độ khác nhau và nên được cập nhật trong khi triển khai các hợp đồng:
+
+- **Mô tả hệ thống bằng tiếng Anh đơn giản**, mô tả những gì hợp đồng thực hiện và bất kỳ giả định nào về cơ sở mã.
+- **Sơ đồ và biểu đồ kiến trúc**, bao gồm các tương tác hợp đồng và máy trạng thái của hệ thống. [Các trình in của Slither](https://github.com/crytic/slither/wiki/Printer-documentation) có thể giúp tạo ra các sơ đồ này.
+- **Tài liệu mã kỹ lưỡng**, [định dạng Natspec](https://docs.soliditylang.org/en/develop/natspec-format.html) có thể được sử dụng cho Solidity.
+
+### Tính toán trên chuỗi và ngoài chuỗi {#onchain-vs-offchain-computation}
+
+- **Giữ càng nhiều mã ngoài chuỗi càng tốt.** Giữ cho lớp trên chuỗi nhỏ. Xử lý trước dữ liệu bằng mã ngoài chuỗi sao cho việc xác minh trên chuỗi trở nên đơn giản. Bạn có cần một danh sách có thứ tự không? Sắp xếp danh sách ngoài chuỗi, sau đó chỉ kiểm tra thứ tự của nó trên chuỗi.
+
+### Khả năng nâng cấp {#upgradeability}
+
+Chúng tôi đã thảo luận về các giải pháp khả năng nâng cấp khác nhau trong [bài đăng trên blog của chúng tôi](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Hãy đưa ra lựa chọn có chủ ý về việc có hỗ trợ khả năng nâng cấp hay không trước khi viết bất kỳ mã nào. Quyết định này sẽ ảnh hưởng đến cách bạn cấu trúc mã của mình. Nói chung, chúng tôi khuyên bạn nên:
+
+- **Ưu tiên [di chuyển hợp đồng](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) hơn khả năng nâng cấp.** Các hệ thống di chuyển có nhiều ưu điểm tương tự như các hệ thống có thể nâng cấp, mà không có nhược điểm của chúng.
+- **Sử dụng mẫu tách dữ liệu thay vì mẫu delegatecallproxy.** Nếu dự án của bạn có sự tách biệt trừu tượng rõ ràng, khả năng nâng cấp bằng cách tách dữ liệu sẽ chỉ cần một vài điều chỉnh. Delegatecallproxy đòi hỏi chuyên môn về Máy chủ ảo Ethereum và rất dễ xảy ra lỗi.
+- **Ghi lại quy trình di chuyển/nâng cấp trước khi triển khai.** Nếu bạn phải phản ứng trong tình trạng căng thẳng mà không có bất kỳ hướng dẫn nào, bạn sẽ mắc sai lầm. Viết trước quy trình cần tuân theo. Nó nên bao gồm:
+ - Các lệnh gọi khởi tạo các hợp đồng mới
+ - Nơi lưu trữ các khóa và cách truy cập chúng
+ - Cách kiểm tra việc triển khai! Phát triển và kiểm tra một tập lệnh sau triển khai.
+
+## Nguyên tắc triển khai {#implementation-guidelines}
+
+**Phấn đấu cho sự đơn giản.** Luôn sử dụng giải pháp đơn giản nhất phù hợp với mục đích của bạn. Bất kỳ thành viên nào trong nhóm của bạn cũng có thể hiểu được giải pháp của bạn.
+
+### Thành phần hàm {#function-composition}
+
+Kiến trúc của cơ sở mã nên giúp mã của bạn dễ dàng xem xét. Tránh các lựa chọn kiến trúc làm giảm khả năng suy luận về tính đúng đắn của nó.
+
+- **Phân chia logic của hệ thống**, thông qua nhiều hợp đồng hoặc bằng cách nhóm các hàm tương tự lại với nhau (ví dụ: xác thực, số học, ...).
+- **Viết các hàm nhỏ, có mục đích rõ ràng.** Điều này sẽ tạo điều kiện thuận lợi cho việc xem xét dễ dàng hơn và cho phép thử nghiệm các thành phần riêng lẻ.
+
+### Kế thừa {#inheritance}
+
+- **Giữ cho việc kế thừa có thể quản lý được.** Kế thừa nên được sử dụng để phân chia logic, tuy nhiên, dự án của bạn nên hướng tới việc giảm thiểu độ sâu và độ rộng của cây kế thừa.
+- **Sử dụng [trình in kế thừa] của Slither(https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) để kiểm tra hệ thống phân cấp của hợp đồng.** Trình in kế thừa sẽ giúp bạn xem lại kích thước của hệ thống phân cấp.
+
+### Sự kiện {#events}
+
+- **Ghi nhật ký tất cả các hoạt động quan trọng.** Các sự kiện sẽ giúp gỡ lỗi hợp đồng trong quá trình phát triển, và giám sát nó sau khi triển khai.
+
+### Tránh các cạm bẫy đã biết {#avoid-known-pitfalls}
+
+- **Hãy nhận biết các vấn đề bảo mật phổ biến nhất.** Có nhiều tài nguyên trực tuyến để tìm hiểu về các vấn đề phổ biến, chẳng hạn như [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/), hoặc [Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/).
+- **Hãy chú ý đến các phần cảnh báo trong [tài liệu tham khảo của Solidity](https://docs.soliditylang.org/en/latest/).** Các phần cảnh báo sẽ thông báo cho bạn về hành vi không rõ ràng của ngôn ngữ.
+
+### Các phần phụ thuộc {#dependencies}
+
+- **Sử dụng các thư viện đã được kiểm tra kỹ lưỡng.** Nhập mã từ các thư viện đã được kiểm tra kỹ lưỡng sẽ làm giảm khả năng bạn viết mã có lỗi. Nếu bạn muốn viết một hợp đồng ERC20, hãy sử dụng [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20).
+- **Sử dụng trình quản lý phụ thuộc; tránh sao chép-dán mã.** Nếu bạn dựa vào một nguồn bên ngoài, thì bạn phải giữ cho nó được cập nhật với nguồn gốc.
+
+### Kiểm tra và xác minh {#testing-and-verification}
+
+- **Viết các bài kiểm tra đơn vị kỹ lưỡng.** Một bộ thử nghiệm sâu rộng là rất quan trọng để xây dựng phần mềm chất lượng cao.
+- **Viết các kiểm tra và thuộc tính tùy chỉnh cho [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) và [Manticore](https://github.com/trailofbits/manticore).** Các công cụ tự động sẽ giúp đảm bảo hợp đồng của bạn được bảo mật. Xem lại phần còn lại của hướng dẫn này để tìm hiểu cách viết các kiểm tra và thuộc tính hiệu quả.
+- **Sử dụng [crytic.io](https://crytic.io/).** Crytic tích hợp với GitHub, cung cấp quyền truy cập vào các trình phát hiện Slither riêng tư, và chạy các kiểm tra thuộc tính tùy chỉnh từ Echidna.
+
+### Solidity {#solidity}
+
+- **Ưu tiên Solidity 0.5 hơn 0.4 và 0.6.** Theo chúng tôi, Solidity 0.5 bảo mật hơn và có các phương pháp thực hành tích hợp sẵn tốt hơn so với 0.4. Solidity 0.6 đã tỏ ra quá không ổn định để sản xuất và cần thời gian để hoàn thiện.
+- **Sử dụng một bản phát hành ổn định để biên dịch; sử dụng bản phát hành mới nhất để kiểm tra cảnh báo.** Kiểm tra xem mã của bạn không có vấn đề nào được báo cáo với phiên bản trình biên dịch mới nhất. Tuy nhiên, Solidity có chu kỳ phát hành nhanh và có tiền sử về lỗi trình biên dịch, vì vậy chúng tôi không khuyến nghị phiên bản mới nhất để triển khai (xem [khuyến nghị về phiên bản solc của Slither](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33)).
+- **Không sử dụng hợp ngữ nội tuyến.** Hợp ngữ đòi hỏi chuyên môn về Máy chủ ảo Ethereum. Đừng viết mã EVM nếu bạn chưa _nắm vững_ sách vàng.
+
+## Nguyên tắc triển khai {#deployment-guidelines}
+
+Sau khi hợp đồng đã được phát triển và triển khai:
+
+- **Giám sát hợp đồng của bạn.** Theo dõi nhật ký, và sẵn sàng phản ứng trong trường hợp hợp đồng hoặc ví bị xâm phạm.
+- **Thêm thông tin liên hệ của bạn vào [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).** Danh sách này giúp các bên thứ ba liên hệ với bạn nếu một lỗ hổng bảo mật được phát hiện.
+- **Bảo mật ví của người dùng có đặc quyền.** Làm theo các [phương pháp hay nhất của chúng tôi](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) nếu bạn lưu trữ khóa trong ví phần cứng.
+- **Có một kế hoạch ứng phó sự cố.** Hãy cân nhắc rằng các hợp đồng thông minh của bạn có thể bị xâm phạm. Ngay cả khi hợp đồng của bạn không có lỗi, kẻ tấn công có thể kiểm soát các khóa của chủ sở hữu hợp đồng.
diff --git a/public/content/translations/vi/developers/tutorials/stealth-addr/index.md b/public/content/translations/vi/developers/tutorials/stealth-addr/index.md
new file mode 100644
index 00000000000..ed51a28587b
--- /dev/null
+++ b/public/content/translations/vi/developers/tutorials/stealth-addr/index.md
@@ -0,0 +1,443 @@
+---
+title: "Sử dụng Địa chỉ ẩn"
+description: "Địa chỉ ẩn cho phép người dùng chuyển tài sản một cách ẩn danh. Sau khi đọc bài viết này, bạn sẽ có thể: Giải thích địa chỉ ẩn là gì và cách chúng hoạt động, hiểu cách sử dụng địa chỉ ẩn để bảo toàn tính ẩn danh và viết một ứng dụng dựa trên web sử dụng địa chỉ ẩn."
+author: Ori Pomerantz
+tags:
+ [
+ "Địa chỉ ẩn",
+ "quyền riêng tư",
+ "mật mã học",
+ "rust",
+ "wasm"
+ ]
+skill: intermediate
+published: 2025-11-30
+lang: vi
+sidebarDepth: 3
+---
+
+Bạn là Bill. Vì những lý do chúng tôi sẽ không đi sâu vào, bạn muốn quyên góp cho chiến dịch "Alice cho Nữ hoàng Thế giới" và để Alice biết bạn đã quyên góp để cô ấy sẽ thưởng cho bạn nếu cô ấy thắng. Thật không may, chiến thắng của cô ấy không được đảm bảo. Có một chiến dịch cạnh tranh, "Carol cho Nữ hoàng Hệ mặt trời". Nếu Carol thắng và cô ấy phát hiện ra bạn đã quyên góp cho Alice, bạn sẽ gặp rắc rối. Vì vậy, bạn không thể chỉ chuyển 200 ETH từ tài khoản của bạn sang tài khoản của Alice.
+
+[ERC-5564](https://eips.ethereum.org/EIPS/eip-5564) có giải pháp. ERC này giải thích cách sử dụng [địa chỉ ẩn](https://nerolation.github.io/stealth-utils) để chuyển tiền ẩn danh.
+
+**Cảnh báo**: Kỹ thuật mật mã học đằng sau các địa chỉ ẩn, theo những gì chúng tôi biết, là hợp lý. Tuy nhiên, có những cuộc tấn công kênh bên tiềm ẩn. [Bên dưới](#go-wrong), bạn sẽ thấy những gì bạn có thể làm để giảm rủi ro này.
+
+## Cách hoạt động của địa chỉ ẩn {#how}
+
+Bài viết này sẽ cố gắng giải thích địa chỉ ẩn theo hai cách. Đầu tiên là [cách sử dụng chúng](#how-use). Phần này là đủ để hiểu phần còn lại của bài viết. Sau đó, có [lời giải thích về toán học đằng sau nó](#how-math). Nếu bạn quan tâm đến mật mã học, hãy đọc cả phần này.
+
+### Phiên bản đơn giản (cách sử dụng địa chỉ ẩn) {#how-use}
+
+Alice tạo hai khóa riêng tư và xuất bản các khóa công khai tương ứng (có thể được kết hợp thành một siêu địa chỉ có độ dài gấp đôi). Bill cũng tạo một khóa riêng tư và xuất bản khóa công khai tương ứng.
+
+Sử dụng khóa công khai của một bên và khóa riêng tư của bên kia, bạn có thể suy ra một bí mật chung mà chỉ Alice và Bill biết (nó không thể được suy ra chỉ từ các khóa công khai). Sử dụng bí mật chung này, Bill có được địa chỉ ẩn và có thể gửi tài sản đến đó.
+
+Alice cũng nhận được địa chỉ từ bí mật chung, nhưng vì cô ấy biết các khóa riêng tư cho các khóa công khai mà cô ấy đã xuất bản, cô ấy cũng có thể nhận được khóa riêng tư cho phép cô ấy rút tiền từ địa chỉ đó.
+
+### Toán học (tại sao địa chỉ ẩn hoạt động như thế này) {#how-math}
+
+Các địa chỉ ẩn tiêu chuẩn sử dụng [mật mã học đường cong elip (ECC)](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/#elliptic-curves-building-blocks-of-a-better-trapdoor) để có được hiệu suất tốt hơn với ít bit khóa hơn, trong khi vẫn giữ nguyên mức độ bảo mật. Nhưng phần lớn chúng ta có thể bỏ qua điều đó và giả vờ rằng chúng ta đang sử dụng số học thông thường.
+
+Có một con số mà mọi người đều biết, _G_. Bạn có thể nhân với _G_. Nhưng do bản chất của ECC, thực tế không thể chia cho _G_. Cách thức hoạt động chung của mật mã học khóa công khai trong Ethereum là bạn có thể sử dụng khóa riêng tư, _Ppriv_, để ký các giao dịch sau đó được xác minh bằng khóa công khai, _Ppub = GPpriv_.
+
+Alice tạo hai khóa riêng tư, _Kpriv_ và _Vpriv_. _Kpriv_ sẽ được sử dụng để chi tiêu tiền từ địa chỉ ẩn, và _Vpriv_ để xem các địa chỉ thuộc về Alice. Alice sau đó xuất bản các khóa công khai: _Kpub = GKpriv_ và _Vpub = GVpriv_
+
+Bill tạo khóa riêng tư thứ ba, _Rpriv_, và xuất bản _Rpub = GRpriv_ lên một sổ đăng ký trung tâm (Bill cũng có thể đã gửi nó cho Alice, nhưng chúng ta giả định rằng Carol đang nghe lén).
+
+Bill tính toán _RprivVpub = GRprivVpriv_, mà anh ta mong đợi Alice cũng biết (được giải thích bên dưới). Giá trị này được gọi là _S_, bí mật chung. Điều này cho Bill một khóa công khai, _Ppub = Kpub+G\*hàm băm(S)_. Từ khóa công khai này, anh ta có thể tính toán một địa chỉ và gửi bất kỳ tài nguyên nào anh ta muốn đến đó. Trong tương lai, nếu Alice thắng, Bill có thể nói cho cô ấy biết _Rpriv_ để chứng minh các tài nguyên đến từ anh ta.
+
+Alice tính toán _RpubVpriv = GRprivVpriv_. Điều này cho cô ấy cùng một bí mật chung, _S_. Bởi vì cô ấy biết khóa riêng tư, _Kpriv_, cô ấy có thể tính toán _Ppriv = Kpriv+hàm băm(S)_. Khóa này cho phép cô ấy truy cập tài sản trong địa chỉ kết quả từ _Ppub = GPpriv = GKpriv+G\*hàm băm(S) = Kpub+G\*hàm băm(S)_.
+
+Chúng tôi có một khóa xem riêng để cho phép Alice ký hợp đồng phụ với Dịch vụ Chiến dịch Thống trị Thế giới của Dave. Alice sẵn sàng cho Dave biết các địa chỉ công khai và thông báo cho cô ấy khi có thêm tiền, nhưng cô ấy không muốn anh ta tiêu tiền chiến dịch của mình.
+
+Bởi vì việc xem và chi tiêu sử dụng các khóa riêng biệt, Alice có thể cung cấp cho Dave _Vpriv_. Sau đó, Dave có thể tính toán _S = RpubVpriv = GRprivVpriv_ và bằng cách đó nhận được các khóa công khai (_Ppub = Kpub+G\*hàm băm(S)_). Nhưng không có _Kpriv_ Dave không thể nhận được khóa riêng tư.
+
+Tóm lại, đây là những giá trị mà những người tham gia khác nhau biết.
+
+| Alice | Đã xuất bản | Bill | Dave | |
+| ------------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------- |
+| G | G | G | G | |
+| _Kpriv_ | – | – | – | |
+| _Vpriv_ | – | – | _Vpriv_ | |
+| _Kpub = GKpriv_ | _Kpub_ | _Kpub_ | _Kpub_ | |
+| _Vpub = GVpriv_ | _Vpub_ | _Vpub_ | _Vpub_ | |
+| – | – | _Rpriv_ | – | |
+| _Rpub_ | _Rpub_ | _Rpub = GRpriv_ | _Rpub_ | |
+| _S = RpubVpriv = GRprivVpriv_ | – | _S = RprivVpub = GRprivVpriv_ | _S = _RpubVpriv_ = GRprivVpriv_ | |
+| _Ppub = Kpub+G\*hàm băm(S)_ | – | _Ppub = Kpub+G\*hàm băm(S)_ | _Ppub = Kpub+G\*hàm băm(S)_ | |
+| _Địa chỉ=f(Ppub)_ | – | _Địa chỉ=f(Ppub)_ | _Địa chỉ=f(Ppub)_ | _Địa chỉ=f(Ppub)_ |
+| _Ppriv = Kpriv+hàm băm(S)_ | – | – | – | |
+
+## Khi địa chỉ ẩn gặp sự cố {#go-wrong}
+
+_Không có bí mật nào trên chuỗi khối_. Mặc dù địa chỉ ẩn có thể cung cấp cho bạn quyền riêng tư, nhưng quyền riêng tư đó dễ bị phân tích lưu lượng. Để lấy một ví dụ nhỏ, hãy tưởng tượng rằng Bill cấp tiền cho một địa chỉ và ngay lập tức gửi một giao dịch để xuất bản giá trị _Rpub_. Nếu không có _Vpriv_ của Alice, chúng tôi không thể chắc chắn rằng đây là một địa chỉ ẩn, nhưng đó là cách để đặt cược. Sau đó, chúng ta thấy một giao dịch khác chuyển toàn bộ ETH từ địa chỉ đó đến địa chỉ quỹ chiến dịch của Alice. Chúng ta có thể không chứng minh được điều đó, nhưng có khả năng Bill vừa quyên góp cho chiến dịch của Alice. Carol chắc chắn sẽ nghĩ như vậy.
+
+Bill có thể dễ dàng tách việc xuất bản _Rpub_ khỏi việc cấp vốn cho địa chỉ ẩn (thực hiện chúng vào các thời điểm khác nhau, từ các địa chỉ khác nhau). Tuy nhiên, điều đó là không đủ. Mô hình mà Carol tìm kiếm là Bill cấp vốn cho một địa chỉ, và sau đó quỹ chiến dịch của Alice rút tiền từ đó.
+
+Một giải pháp là chiến dịch của Alice không rút tiền trực tiếp mà dùng nó để trả cho bên thứ ba. Nếu chiến dịch của Alice gửi 10 ETH đến Dịch vụ Chiến dịch Thống trị Thế giới của Dave, Carol chỉ biết rằng Bill đã quyên góp cho một trong những khách hàng của Dave. Nếu Dave có đủ khách hàng, Carol sẽ không thể biết liệu Bill đã quyên góp cho Alice, người cạnh tranh với cô ấy, hay cho Adam, Albert hoặc Abigail mà Carol không quan tâm. Alice có thể bao gồm một giá trị đã được băm trong khoản thanh toán, và sau đó cung cấp cho Dave tiền ảnh để chứng minh rằng đó là khoản quyên góp của cô ấy. Ngoài ra, như đã lưu ý ở trên, nếu Alice đưa cho Dave _Vpriv_ của mình, anh ta đã biết khoản thanh toán đến từ ai.
+
+Vấn đề chính với giải pháp này là nó yêu cầu Alice phải quan tâm đến bí mật khi bí mật đó mang lại lợi ích cho Bill. Alice có thể muốn duy trì danh tiếng của mình để bạn của Bill là Bob cũng sẽ quyên góp cho cô ấy. Nhưng cũng có khả năng cô ấy sẽ không ngại vạch trần Bill, bởi vì khi đó anh ta sẽ sợ những gì sẽ xảy ra nếu Carol thắng. Bill có thể cuối cùng sẽ hỗ trợ Alice nhiều hơn nữa.
+
+### Sử dụng nhiều lớp ẩn {#multi-layer}
+
+Thay vì dựa vào Alice để bảo vệ quyền riêng tư của Bill, Bill có thể tự làm điều đó. Anh ta có thể tạo nhiều siêu địa chỉ cho những người hư cấu, Bob và Bella. Bill sau đó gửi ETH cho Bob, và "Bob" (thực chất là Bill) gửi nó cho Bella. "Bella" (cũng là Bill) gửi nó cho Alice.
+
+Carol vẫn có thể phân tích lưu lượng và thấy đường ống Bill-đến-Bob-đến-Bella-đến-Alice. Tuy nhiên, nếu "Bob" và "Bella" cũng sử dụng ETH cho các mục đích khác, sẽ không có vẻ như Bill đã chuyển bất cứ thứ gì cho Alice, ngay cả khi Alice ngay lập tức rút tiền từ địa chỉ ẩn đến địa chỉ chiến dịch đã biết của cô ấy.
+
+## Viết một ứng dụng địa chỉ ẩn {#write-app}
+
+Bài viết này giải thích một ứng dụng địa chỉ ẩn [có sẵn trên GitHub](https://github.com/qbzzt/251022-stealth-addresses.git).
+
+### Công cụ {#tools}
+
+Có [một thư viện địa chỉ ẩn typescript](https://github.com/ScopeLift/stealth-address-sdk) mà chúng ta có thể sử dụng. Tuy nhiên, các hoạt động mật mã có thể tốn nhiều CPU. Tôi thích triển khai chúng bằng một ngôn ngữ biên dịch, chẳng hạn như [Rust](https://rust-lang.org/) và sử dụng [WASM](https://webassembly.org/) để chạy mã trong trình duyệt.
+
+Chúng tôi sẽ sử dụng [Vite](https://vite.dev/) và [React](https://react.dev/). Đây là những công cụ tiêu chuẩn ngành; nếu bạn không quen thuộc với chúng, bạn có thể sử dụng [hướng dẫn này](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). Để sử dụng Vite, chúng ta cần Node.
+
+### Xem địa chỉ ẩn hoạt động {#in-action}
+
+1. Cài đặt các công cụ cần thiết: [Rust](https://rust-lang.org/tools/install/) và [Node](https://nodejs.org/en/download).
+
+2. Nhân bản kho lưu trữ GitHub.
+
+ ```sh
+ git clone https://github.com/qbzzt/251022-stealth-addresses.git
+ cd 251022-stealth-addresses
+ ```
+
+3. Cài đặt các điều kiện tiên quyết và biên dịch mã Rust.
+
+ ```sh
+ cd src/rust-wasm
+ rustup target add wasm32-unknown-unknown
+ cargo install wasm-pack
+ wasm-pack build --target web
+ ```
+
+4. Khởi động máy chủ web.
+
+ ```sh
+ cd ../..
+ npm install
+ npm run dev
+ ```
+
+5. Duyệt đến [ứng dụng](http://localhost:5173/). Trang ứng dụng này có hai khung: một cho giao diện người dùng của Alice và một cho giao diện của Bill. Hai khung không giao tiếp với nhau; chúng chỉ ở trên cùng một trang để thuận tiện.
+
+6. Với vai trò là Alice, nhấp vào **Tạo một Siêu địa chỉ ẩn**. Thao tác này sẽ hiển thị địa chỉ ẩn mới và các khóa riêng tư tương ứng. Sao chép siêu địa chỉ ẩn vào bảng nhớ tạm.
+
+7. Với vai trò là Bill, dán siêu địa chỉ ẩn mới và nhấp vào **Tạo một địa chỉ**. Thao tác này cung cấp cho bạn địa chỉ để cấp vốn cho Alice.
+
+8. Sao chép địa chỉ và khóa công khai của Bill và dán chúng vào khu vực "Khóa riêng tư cho địa chỉ do Bill tạo" của giao diện người dùng của Alice. Sau khi các trường đó được điền, bạn sẽ thấy khóa riêng tư để truy cập tài sản tại địa chỉ đó.
+
+9. Bạn có thể sử dụng [máy tính trực tuyến](https://iancoleman.net/ethereum-private-key-to-address/) để đảm bảo khóa riêng tư tương ứng với địa chỉ.
+
+### Cách chương trình hoạt động {#how-the-program-works}
+
+#### Thành phần WASM {#wasm}
+
+Mã nguồn biên dịch thành WASM được viết bằng [Rust](https://rust-lang.org/). Bạn có thể xem nó trong [`src/rust_wasm/src/lib.rs`](https://github.com/qbzzt/251022-stealth-addresses/blob/main/src/rust-wasm/src/lib.rs). Mã này chủ yếu là một giao diện giữa mã JavaScript và [thư viện `eth-stealth-addresses`](https://github.com/kassandraoftroy/eth-stealth-addresses).
+
+**`Cargo.toml`**
+
+[`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html) trong Rust tương tự như [`package.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json) trong JavaScript. Nó chứa thông tin gói, khai báo phụ thuộc, v.v.
+
+```toml
+[package]
+name = "rust-wasm"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+eth-stealth-addresses = "0.1.0"
+hex = "0.4.3"
+wasm-bindgen = "0.2.104"
+getrandom = { version = "0.2", features = ["js"] }
+```
+
+Gói [`getrandom`](https://docs.rs/getrandom/latest/getrandom/) cần tạo ra các giá trị ngẫu nhiên. Điều đó không thể được thực hiện bằng các phương tiện thuật toán thuần túy; nó đòi hỏi quyền truy cập vào một quy trình vật lý như một nguồn entropy. Định nghĩa này chỉ định rằng chúng ta sẽ nhận được entropy đó bằng cách yêu cầu trình duyệt mà chúng ta đang chạy.
+
+```toml
+console_error_panic_hook = "0.1.7"
+```
+
+[Thư viện này](https://docs.rs/console_error_panic_hook/latest/console_error_panic_hook/) cung cấp cho chúng tôi các thông báo lỗi có ý nghĩa hơn khi mã WASM bị panic và không thể tiếp tục.
+
+```toml
+[lib]
+crate-type = ["cdylib", "rlib"]
+```
+
+Loại đầu ra cần thiết để tạo mã WASM.
+
+**`lib.rs`**
+
+Đây là mã Rust thực tế.
+
+```rust
+use wasm_bindgen::prelude::*;
+```
+
+Các định nghĩa để tạo một gói WASM từ Rust. Chúng được ghi lại [tại đây](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/index.html).
+
+```rust
+use eth_stealth_addresses::{
+ generate_stealth_meta_address,
+ generate_stealth_address,
+ compute_stealth_key
+};
+```
+
+Các hàm chúng tôi cần từ [thư viện `eth-stealth-addresses`](https://github.com/kassandraoftroy/eth-stealth-addresses).
+
+```rust
+use hex::{decode,encode};
+```
+
+Rust thường sử dụng các [mảng](https://doc.rust-lang.org/std/primitive.array.html) byte (`[u8; ]`) cho các giá trị. Nhưng trong JavaScript, chúng ta thường sử dụng các chuỗi thập lục phân. [Thư viện `hex`](https://docs.rs/hex/latest/hex/) dịch cho chúng ta từ dạng biểu diễn này sang dạng khác.
+
+```rust
+#[wasm_bindgen]
+```
+
+Tạo các ràng buộc WASM để có thể gọi hàm này từ JavaScript.
+
+```rust
+pub fn wasm_generate_stealth_meta_address() -> String {
+```
+
+Cách dễ nhất để trả về một đối tượng có nhiều trường là trả về một chuỗi JSON.
+
+```rust
+ let (address, spend_private_key, view_private_key) =
+ generate_stealth_meta_address();
+```
+
+Hàm [`generate_stealth_meta_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_meta_address.html) trả về ba trường:
+
+- Siêu địa chỉ (_Kpub_ và _Vpub_)
+- Khóa xem riêng tư (_Vpriv_)
+- Khóa chi tiêu riêng tư (_Kpriv_)
+
+Cú pháp [tuple](https://doc.rust-lang.org/std/primitive.tuple.html) cho phép chúng ta tách các giá trị đó ra một lần nữa.
+
+```rust
+ format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}",
+ encode(address),
+ encode(view_private_key),
+ encode(spend_private_key)
+ )
+}
+```
+
+Sử dụng macro [`format!`](https://doc.rust-lang.org/std/fmt/index.html) để tạo chuỗi được mã hóa JSON. Sử dụng [`hex::encode`](https://docs.rs/hex/latest/hex/fn.encode.html) để thay đổi các mảng thành chuỗi hex.
+
+```rust
+fn str_to_array(s: &str) -> Option<[u8; N]> {
+```
+
+Hàm này biến một chuỗi hex (do JavaScript cung cấp) thành một mảng byte. Chúng tôi sử dụng nó để phân tích cú pháp các giá trị được cung cấp bởi mã JavaScript. Hàm này phức tạp vì cách Rust xử lý các mảng và vectơ.
+
+Biểu thức `` được gọi là một [generic](https://doc.rust-lang.org/book/ch10-01-syntax.html). `N` là một tham số điều khiển độ dài của mảng được trả về. Hàm này thực sự được gọi là `str_to_array::`, trong đó `n` là độ dài mảng.
+
+Giá trị trả về là `Option<[u8; N]>`, có nghĩa là mảng được trả về là [tùy chọn](https://doc.rust-lang.org/std/option/). Đây là một mẫu điển hình trong Rust cho các hàm có thể thất bại.
+
+Ví dụ: nếu chúng ta gọi `str_to_array::10("bad060a7")`, hàm được cho là sẽ trả về một mảng mười giá trị, nhưng đầu vào chỉ có bốn byte. Hàm cần phải thất bại và nó làm như vậy bằng cách trả về `None`. Giá trị trả về cho `str_to_array::4("bad060a7")` sẽ là `Some<[0xba, 0xd0, 0x60, 0xa7]>`.
+
+```rust
+ // decode returns Result, _>
+ let vec = decode(s).ok()?;
+```
+
+Hàm [`hex::decode`](https://docs.rs/hex/latest/hex/fn.decode.html) trả về một `Result, FromHexError>`. Loại [`Result`](https://doc.rust-lang.org/std/result/) có thể chứa kết quả thành công (`Ok(value)`) hoặc lỗi (`Err(error)`).
+
+Phương thức `.ok()` biến `Result` thành một `Option`, có giá trị là giá trị `Ok()` nếu thành công hoặc `None` nếu không. Cuối cùng, [toán tử dấu hỏi](https://doc.rust-lang.org/std/option/#the-question-mark-operator-) sẽ hủy bỏ các hàm hiện tại và trả về `None` nếu `Option` trống. Nếu không, nó sẽ mở gói giá trị và trả về giá trị đó (trong trường hợp này, để gán một giá trị cho `vec`).
+
+Đây có vẻ là một phương pháp xử lý lỗi phức tạp một cách kỳ lạ, nhưng `Result` và `Option` đảm bảo rằng tất cả các lỗi đều được xử lý, bằng cách này hay cách khác.
+
+```rust
+ if vec.len() != N { return None; }
+```
+
+Nếu số lượng byte không chính xác, đó là một lỗi và chúng tôi trả về `None`.
+
+```rust
+ // try_into consumes vec and attempts to make [u8; N]
+ let array: [u8; N] = vec.try_into().ok()?;
+```
+
+Rust có hai loại mảng. [Mảng](https://doc.rust-lang.org/std/primitive.array.html) có kích thước cố định. [Vectơ](https://doc.rust-lang.org/std/vec/index.html) có thể phát triển và thu nhỏ. `hex::decode` trả về một vectơ, nhưng thư viện `eth_stealth_addresses` muốn nhận các mảng. [`.try_into()`](https://doc.rust-lang.org/std/convert/trait.TryInto.html#required-methods) chuyển đổi một giá trị thành một loại khác, ví dụ, một vectơ thành một mảng.
+
+```rust
+ Some(array)
+}
+```
+
+Rust không yêu cầu bạn sử dụng từ khóa [`return`](https://doc.rust-lang.org/std/keyword.return.html) khi trả về một giá trị ở cuối hàm.
+
+```rust
+#[wasm_bindgen]
+pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option {
+```
+
+Hàm này nhận một siêu địa chỉ công khai, bao gồm cả _Vpub_ và _Kpub_. Nó trả về địa chỉ ẩn, khóa công khai để xuất bản (_Rpub_) và giá trị quét một byte giúp tăng tốc độ xác định địa chỉ đã xuất bản nào có thể thuộc về Alice.
+
+Giá trị quét là một phần của bí mật chung (_S = GRprivVpriv_). Giá trị này có sẵn cho Alice, và việc kiểm tra nó nhanh hơn nhiều so với việc kiểm tra xem _f(Kpub+G\*hàm băm(S))_ có bằng địa chỉ đã xuất bản hay không.
+
+```rust
+ let (address, r_pub, scan) =
+ generate_stealth_address(&str_to_array::<66>(stealth_address)?);
+```
+
+Chúng tôi sử dụng hàm [`generate_stealth_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_address.html) của thư viện.
+
+```rust
+ format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}",
+ encode(address),
+ encode(r_pub),
+ encode(&[scan])
+ ).into()
+}
+```
+
+Chuẩn bị chuỗi đầu ra được mã hóa JSON.
+
+```rust
+#[wasm_bindgen]
+pub fn wasm_compute_stealth_key(
+ address: &str,
+ bill_pub_key: &str,
+ view_private_key: &str,
+ spend_private_key: &str
+) -> Option {
+ .
+ .
+ .
+}
+```
+
+Hàm này sử dụng [`compute_stealth_key`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.compute_stealth_key.html) của thư viện để tính toán khóa riêng tư để rút khỏi địa chỉ (_Rpriv_). Phép tính này yêu cầu các giá trị sau:
+
+- Địa chỉ (_Địa chỉ=f(Ppub)_)
+- Khóa công khai do Bill tạo (_Rpub_)
+- Khóa xem riêng tư (_Vpriv_)
+- Khóa chi tiêu riêng tư (_Kpriv_)
+
+```rust
+#[wasm_bindgen(start)]
+```
+
+[`#[wasm_bindgen(start)]`](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-rust-exports/start.html) chỉ định rằng hàm được thực thi khi mã WASM được khởi tạo.
+
+```rust
+pub fn main() {
+ console_error_panic_hook::set_once();
+}
+```
+
+Mã này chỉ định rằng đầu ra panic được gửi đến bảng điều khiển JavaScript. Để xem nó hoạt động, hãy sử dụng ứng dụng và cung cấp cho Bill một siêu địa chỉ không hợp lệ (chỉ cần thay đổi một chữ số thập lục phân). Bạn sẽ thấy lỗi này trong bảng điều khiển JavaScript:
+
+```
+rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/subtle-2.6.1/src/lib.rs:701:9:
+assertion `left == right` failed
+ left: 0
+ right: 1
+```
+
+Theo sau là một dấu vết ngăn xếp. Sau đó, cung cấp cho Bill siêu địa chỉ hợp lệ và cung cấp cho Alice một địa chỉ không hợp lệ hoặc một khóa công khai không hợp lệ. Bạn sẽ thấy lỗi này:
+
+```
+rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/eth-stealth-addresses-0.1.0/src/lib.rs:78:9:
+keys do not generate stealth address
+```
+
+Một lần nữa, theo sau là một dấu vết ngăn xếp.
+
+#### Giao diện người dùng {#ui}
+
+Giao diện người dùng được viết bằng [React](https://react.dev/) và được phục vụ bởi [Vite](https://vite.dev/). Bạn có thể tìm hiểu về chúng bằng cách sử dụng [hướng dẫn này](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). Không cần [WAGMI](https://wagmi.sh/) ở đây vì chúng tôi không tương tác trực tiếp với chuỗi khối hoặc ví.
+
+Phần duy nhất không rõ ràng của giao diện người dùng là kết nối WASM. Đây là cách nó hoạt động.
+
+**`vite.config.js`**
+
+Tệp này chứa [cấu hình Vite](https://vite.dev/config/).
+
+```js
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+import wasm from "vite-plugin-wasm";
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react(), wasm()],
+})
+```
+
+Chúng ta cần hai plugin Vite: [react](https://www.npmjs.com/package/@vitejs/plugin-react) và [wasm](https://github.com/Menci/vite-plugin-wasm#readme).
+
+**`App.jsx`**
+
+Tệp này là thành phần chính của ứng dụng. Nó là một bộ chứa bao gồm hai thành phần: `Alice` và `Bill`, giao diện người dùng cho những người dùng đó. Phần liên quan cho WASM là mã khởi tạo.
+
+```jsx
+import init from './rust-wasm/pkg/rust_wasm.js'
+```
+
+Khi chúng tôi sử dụng [`wasm-pack`](https://rustwasm.github.io/docs/wasm-pack/), nó tạo ra hai tệp chúng tôi sử dụng ở đây: một tệp wasm với mã thực tế (ở đây là `src/rust-wasm/pkg/rust_wasm_bg.wasm`) và một tệp JavaScript với các định nghĩa để sử dụng nó (ở đây là `src/rust_wasm/pkg/rust_wasm.js`). Xuất mặc định của tệp JavaScript đó là mã cần chạy để khởi tạo WASM.
+
+```jsx
+function App() {
+ .
+ .
+ .
+ useEffect(() => {
+ const loadWasm = async () => {
+ try {
+ await init();
+ setWasmReady(true)
+ } catch (err) {
+ console.error('Lỗi khi tải wasm:', err)
+ alert("Lỗi Wasm: " + err)
+ }
+ }
+
+ loadWasm()
+ }, []
+ )
+```
+
+[Hook `useEffect`](https://react.dev/reference/react/useEffect) cho phép bạn chỉ định một hàm được thực thi khi các biến trạng thái thay đổi. Ở đây, danh sách các biến trạng thái trống (`[]`), vì vậy hàm này chỉ được thực thi một lần khi trang tải.
+
+Hàm hiệu ứng phải trả về ngay lập tức. Để sử dụng mã không đồng bộ, chẳng hạn như `init` của WASM (phải tải tệp `.wasm` và do đó mất thời gian), chúng tôi xác định một hàm [`async`](https://en.wikipedia.org/wiki/Async/await) nội bộ và chạy nó mà không có `await`.
+
+**`Bill.jsx`**
+
+Đây là giao diện người dùng cho Bill. Nó có một hành động duy nhất, tạo một địa chỉ dựa trên siêu địa chỉ ẩn do Alice cung cấp.
+
+```jsx
+import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js'
+```
+
+Ngoài việc xuất mặc định, mã JavaScript được tạo bởi `wasm-pack` còn xuất một hàm cho mọi hàm trong mã WASM.
+
+```jsx
+
{status}
-
+
)
```
diff --git a/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md
index e31fed20fdc..1983e2df81e 100644
--- a/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md
+++ b/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md
@@ -1,6 +1,6 @@
---
title: "Hướng dẫn hợp đồng cầu nối tiêu chuẩn Optimism"
-description: Cầu nối tiêu chuẩn cho Optimism hoạt động như thế nào? Tại sao nó lại hoạt động theo cách này?
+description: "Cầu nối tiêu chuẩn cho Optimism hoạt động như thế nào? Tại sao nó lại hoạt động theo cách này?"
author: Ori Pomerantz
tags: [ "solidity", "cầu nối", "lớp 2" ]
skill: intermediate
diff --git a/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
index 5d349477c41..f84104a1717 100644
--- a/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
@@ -1,6 +1,6 @@
---
title: "Thiết kế ngược một hợp đồng"
-description: Cách hiểu một hợp đồng khi bạn không có mã nguồn
+description: "Cách hiểu một hợp đồng khi bạn không có mã nguồn"
author: Ori Pomerantz
lang: vi
tags: [ "evm", "mã vận hành" ]
diff --git a/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md
index 90e4df9e9c0..735e82491de 100644
--- a/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md
+++ b/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md
@@ -1,12 +1,12 @@
---
-title: Chạy nút Ethereum trên Raspberry Pi 4
-description: Flash chiếc Raspberry Pi 4 của bạn, cắm cáp ethernet, kết nối đĩa SSD và cấp nguồn cho thiết bị để biến Raspberry Pi 4 thành một nút Ethereum đầy đủ + trình xác thực
+title: "Chạy nút Ethereum trên Raspberry Pi 4"
+description: "Flash chiếc Raspberry Pi 4 của bạn, cắm cáp ethernet, kết nối đĩa SSD và cấp nguồn cho thiết bị để biến Raspberry Pi 4 thành một nút Ethereum đầy đủ + trình xác thực"
author: "EthereumOnArm"
tags: [ "máy khách", "lớp thực thi", "lớp đồng thuận", "nút" ]
lang: vi
skill: intermediate
published: 2022-06-10
-source: Ethereum trên ARM
+source: "Ethereum trên ARM"
sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/
---
diff --git a/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md
index 9d667a67b89..831f90d6e04 100644
--- a/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md
+++ b/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md
@@ -1,6 +1,6 @@
---
title: "Một số thủ thuật được token lừa đảo sử dụng và cách phát hiện chúng"
-description: Trong hướng dẫn này, chúng tôi phân tích một token lừa đảo để xem một số thủ thuật mà những kẻ lừa đảo sử dụng, cách chúng triển khai và cách chúng ta có thể phát hiện ra chúng.
+description: "Trong hướng dẫn này, chúng tôi phân tích một token lừa đảo để xem một số thủ thuật mà những kẻ lừa đảo sử dụng, cách chúng triển khai và cách chúng ta có thể phát hiện ra chúng."
author: Ori Pomerantz
tags:
[
@@ -11,7 +11,7 @@ tags:
"typescript"
]
skill: intermediate
-published: 15/09/2023
+published: 2023-09-15
lang: vi
---
diff --git a/public/content/translations/vi/developers/tutorials/secret-state/index.md b/public/content/translations/vi/developers/tutorials/secret-state/index.md
index 25903d5cf67..3c1a0bbdd85 100644
--- a/public/content/translations/vi/developers/tutorials/secret-state/index.md
+++ b/public/content/translations/vi/developers/tutorials/secret-state/index.md
@@ -1,6 +1,6 @@
---
-title: Sử dụng không kiến thức cho một trạng thái bí mật
-description: các trò chơi trên chuỗi bị giới hạn vì chúng không thể giữ bất kỳ thông tin ẩn nào. Sau khi đọc hướng dẫn này, người đọc sẽ có thể kết hợp các bằng chứng không kiến thức và các thành phần máy chủ để tạo ra các trò chơi có thể xác minh với một trạng thái bí mật, thành phần ngoài chuỗi. Kỹ thuật để làm điều này sẽ được minh họa bằng cách tạo ra một trò chơi dò mìn.
+title: "Sử dụng không kiến thức cho một trạng thái bí mật"
+description: "các trò chơi trên chuỗi bị giới hạn vì chúng không thể giữ bất kỳ thông tin ẩn nào. Sau khi đọc hướng dẫn này, người đọc sẽ có thể kết hợp các bằng chứng không kiến thức và các thành phần máy chủ để tạo ra các trò chơi có thể xác minh với một trạng thái bí mật, thành phần ngoài chuỗi. Kỹ thuật để làm điều này sẽ được minh họa bằng cách tạo ra một trò chơi dò mìn."
author: Ori Pomerantz
tags:
[
diff --git a/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
index 95e5dbb8bc4..1fe9218b338 100644
--- a/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
+++ b/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
@@ -1,12 +1,12 @@
---
-title: Danh sách kiểm tra bảo mật hợp đồng thông minh
-description: Quy trình làm việc được đề xuất để viết các hợp đồng thông minh bảo mật
+title: "Danh sách kiểm tra bảo mật hợp đồng thông minh"
+description: "Quy trình làm việc được đề xuất để viết các hợp đồng thông minh bảo mật"
author: "Trailofbits"
tags: [ "hợp đồng thông minh", "tính bảo mật", "solidity" ]
skill: intermediate
lang: vi
published: 2020-09-07
-source: Xây dựng những hợp đồng an toàn
+source: "Xây dựng những hợp đồng an toàn"
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md
---
diff --git a/public/content/translations/vi/developers/tutorials/send-token-ethersjs/index.md b/public/content/translations/vi/developers/tutorials/send-token-ethersjs/index.md
index 1ec28b2703e..83f94bf03a0 100644
--- a/public/content/translations/vi/developers/tutorials/send-token-ethersjs/index.md
+++ b/public/content/translations/vi/developers/tutorials/send-token-ethersjs/index.md
@@ -1,6 +1,6 @@
---
-title: Gửi Token bằng ethers.js
-description: Hướng dẫn thân thiện với người mới bắt đầu về việc gửi token bằng ethers.js.
+title: "Gửi Token bằng ethers.js"
+description: "Hướng dẫn thân thiện với người mới bắt đầu về việc gửi token bằng ethers.js."
author: Kim YongJun
tags: [ "ETHERS.JS", "ERC-20", "TOKEN" ]
skill: beginner
diff --git a/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
index 0db38dd08e3..2e2b99458e3 100644
--- a/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
+++ b/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
@@ -1,12 +1,12 @@
---
-title: Gửi Giao dịch bằng Web3
+title: "Gửi Giao dịch bằng Web3"
description: "Đây là hướng dẫn thân thiện với người mới bắt đầu về cách gửi giao dịch Ethereum bằng Web3. Có ba bước chính để gửi một giao dịch đến chuỗi khối Ethereum: tạo, ký và quảng bá. Chúng ta sẽ đi qua cả ba bước."
author: "Elan Halpern"
tags: [ "các giao dịch", "web3.js", "từ Alchemy" ]
skill: beginner
lang: vi
published: 2020-11-04
-source: Tài liệu Alchemy
+source: "Tài liệu Alchemy"
sourceUrl: https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum
---
diff --git a/public/content/translations/vi/developers/tutorials/server-components/index.md b/public/content/translations/vi/developers/tutorials/server-components/index.md
index 4b8a7781801..66251b8e201 100644
--- a/public/content/translations/vi/developers/tutorials/server-components/index.md
+++ b/public/content/translations/vi/developers/tutorials/server-components/index.md
@@ -1,6 +1,6 @@
---
title: "Các thành phần máy chủ và tác nhân cho ứng dụng web3"
-description: Sau khi đọc hướng dẫn này, bạn sẽ có thể viết các máy chủ TypeScript lắng nghe các sự kiện trên một chuỗi khối và phản hồi tương ứng bằng các giao dịch của riêng chúng. Điều này sẽ cho phép bạn viết các ứng dụng tập trung (vì máy chủ là một điểm lỗi duy nhất), nhưng có thể tương tác với các thực thể web3. Các kỹ thuật tương tự cũng có thể được sử dụng để viết một tác nhân phản hồi các sự kiện trên chuỗi mà không cần sự can thiệp của con người.
+description: "Sau khi đọc hướng dẫn này, bạn sẽ có thể viết các máy chủ TypeScript lắng nghe các sự kiện trên một chuỗi khối và phản hồi tương ứng bằng các giao dịch của riêng chúng. Điều này sẽ cho phép bạn viết các ứng dụng tập trung (vì máy chủ là một điểm lỗi duy nhất), nhưng có thể tương tác với các thực thể web3. Các kỹ thuật tương tự cũng có thể được sử dụng để viết một tác nhân phản hồi các sự kiện trên chuỗi mà không cần sự can thiệp của con người."
author: Ori Pomerantz
lang: vi
diff --git a/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
index 6dc12c13002..a54be4e1957 100644
--- a/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
+++ b/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
@@ -1,6 +1,6 @@
---
-title: Thiết lập web3.js để sử dụng chuỗi khối Ethereum trong JavaScript
-description: Tìm hiểu cách thiết lập và cấu hình thư viện web3.js để tương tác với chuỗi khối Ethereum từ các ứng dụng JavaScript.
+title: "Thiết lập web3.js để sử dụng chuỗi khối Ethereum trong JavaScript"
+description: "Tìm hiểu cách thiết lập và cấu hình thư viện web3.js để tương tác với chuỗi khối Ethereum từ các ứng dụng JavaScript."
author: "jdourlens"
tags: [ "web3.js", "javascript" ]
skill: beginner
diff --git a/public/content/translations/vi/developers/tutorials/short-abi/index.md b/public/content/translations/vi/developers/tutorials/short-abi/index.md
index 16dcc15545f..5c906e08f97 100644
--- a/public/content/translations/vi/developers/tutorials/short-abi/index.md
+++ b/public/content/translations/vi/developers/tutorials/short-abi/index.md
@@ -1,6 +1,6 @@
---
title: "Các ABI ngắn để tối ưu hóa Calldata"
-description: Tối ưu hóa hợp đồng thông minh cho các gộp giao dịch lạc quan
+description: "Tối ưu hóa hợp đồng thông minh cho các gộp giao dịch lạc quan"
author: Ori Pomerantz
lang: vi
tags: [ "lớp 2" ]
@@ -165,7 +165,7 @@ Trên L1, có thể cần bỏ qua các bài kiểm tra này để tiết kiệm
Chúng ta có thể sao chép dữ liệu từ lệnh gọi đến `fallback()` (xem bên dưới), nhưng việc sử dụng [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), ngôn ngữ hợp ngữ của máy ảo ethereum (EVM), sẽ dễ dàng hơn.
Ở đây chúng ta sử dụng [opcode CALLDATALOAD](https://www.evm.codes/#35) để đọc các byte từ `startByte` đến `startByte+31` vào ngăn xếp.
-Nói chung, cú pháp của một opcode trong Yul là \`(,...).
+Nói chung, cú pháp của một opcode trong Yul là `(,...).
```solidity
diff --git a/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
index b236b77229e..1e7778f6f79 100644
--- a/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
+++ b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
@@ -1,12 +1,12 @@
---
-title: Các nguyên tắc bảo mật hợp đồng thông minh
-description: Danh sách kiểm tra các nguyên tắc bảo mật cần xem xét khi xây dựng ứng dụng phi tập trung của bạn
+title: "Các nguyên tắc bảo mật hợp đồng thông minh"
+description: "Danh sách kiểm tra các nguyên tắc bảo mật cần xem xét khi xây dựng ứng dụng phi tập trung của bạn"
author: "Trailofbits"
tags: [ "solidity", "hợp đồng thông minh", "tính bảo mật" ]
skill: intermediate
lang: vi
published: 2020-09-06
-source: Xây dựng những hợp đồng an toàn
+source: "Xây dựng những hợp đồng an toàn"
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md
---
diff --git a/public/content/translations/vi/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/vi/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
index 0b6844db9d4..702ed9c32d9 100644
--- a/public/content/translations/vi/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
+++ b/public/content/translations/vi/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
@@ -1,6 +1,6 @@
---
title: "The Graph: Sửa lỗi truy vấn dữ liệu Web3"
-description: Chuỗi khối giống như một cơ sở dữ liệu nhưng không có SQL. Tất cả dữ liệu đều ở đó, nhưng không có cách nào để truy cập. Hãy để tôi chỉ cho bạn cách khắc phục sự cố này bằng The Graph và GraphQL.
+description: "Chuỗi khối giống như một cơ sở dữ liệu nhưng không có SQL. Tất cả dữ liệu đều ở đó, nhưng không có cách nào để truy cập. Hãy để tôi chỉ cho bạn cách khắc phục sự cố này bằng The Graph và GraphQL."
author: Markus Waas
lang: vi
tags:
diff --git a/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md b/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
index 689af015399..e6fb4b2fad2 100644
--- a/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
+++ b/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
@@ -1,6 +1,6 @@
---
-title: Danh sách kiểm tra tích hợp token
-description: Danh sách kiểm tra các mục cần xem xét khi tương tác với token
+title: "Danh sách kiểm tra tích hợp token"
+description: "Danh sách kiểm tra các mục cần xem xét khi tương tác với token"
author: "Trailofbits"
lang: vi
tags:
@@ -12,7 +12,7 @@ tags:
]
skill: intermediate
published: 2020-08-13
-source: Xây dựng những hợp đồng an toàn
+source: "Xây dựng những hợp đồng an toàn"
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/token_integration.md
---
diff --git a/public/content/translations/vi/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
index b9615606a70..dcc476c5424 100644
--- a/public/content/translations/vi/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
@@ -1,6 +1,6 @@
---
-title: Chuyển khoản và phê duyệt token ERC-20 từ một hợp đồng thông minh Solidity
-description: Xây dựng một hợp đồng thông minh của sàn giao dịch phi tập trung (DEX) xử lý việc chuyển khoản và phê duyệt token ERC-20 bằng Solidity.
+title: "Chuyển khoản và phê duyệt token ERC-20 từ một hợp đồng thông minh Solidity"
+description: "Xây dựng một hợp đồng thông minh của sàn giao dịch phi tập trung (DEX) xử lý việc chuyển khoản và phê duyệt token ERC-20 bằng Solidity."
author: "jdourlens"
tags: [ "hợp đồng thông minh", "tokens", "solidity", "erc-20" ]
skill: intermediate
diff --git a/public/content/translations/vi/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
index f95cb562d07..18a2483a79a 100644
--- a/public/content/translations/vi/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
@@ -1,6 +1,6 @@
---
-title: Hiểu hợp đồng thông minh mã thông báo ERC-20
-description: Tìm hiểu cách triển khai tiêu chuẩn mã thông báo ERC-20 thông qua ví dụ và giải thích đầy đủ về hợp đồng thông minh Solidity.
+title: "Hiểu hợp đồng thông minh mã thông báo ERC-20"
+description: "Tìm hiểu cách triển khai tiêu chuẩn mã thông báo ERC-20 thông qua ví dụ và giải thích đầy đủ về hợp đồng thông minh Solidity."
author: "jdourlens"
tags: [ "hợp đồng thông minh", "tokens", "solidity", "erc-20" ]
skill: beginner
diff --git a/public/content/translations/vi/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/uniswap-v2-annotated-code/index.md
index 6c9f6ec8a9c..dcc82776196 100644
--- a/public/content/translations/vi/developers/tutorials/uniswap-v2-annotated-code/index.md
+++ b/public/content/translations/vi/developers/tutorials/uniswap-v2-annotated-code/index.md
@@ -1,6 +1,6 @@
---
title: "Hướng dẫn chi tiết Hợp đồng Uniswap-v2"
-description: Hợp đồng Uniswap-v2 hoạt động như thế nào? Tại sao nó lại được viết theo cách đó?
+description: "Hợp đồng Uniswap-v2 hoạt động như thế nào? Tại sao nó lại được viết theo cách đó?"
author: Ori Pomerantz
tags: [ "solidity" ]
skill: intermediate
diff --git a/public/content/translations/vi/developers/tutorials/using-websockets/index.md b/public/content/translations/vi/developers/tutorials/using-websockets/index.md
index d84aa630422..264886af939 100644
--- a/public/content/translations/vi/developers/tutorials/using-websockets/index.md
+++ b/public/content/translations/vi/developers/tutorials/using-websockets/index.md
@@ -1,11 +1,11 @@
---
-title: Sử dụng WebSocket
-description: Hướng dẫn sử dụng WebSocket và Alchemy để thực hiện các yêu cầu JSON-RPC và đăng ký các sự kiện.
+title: "Sử dụng WebSocket"
+description: "Hướng dẫn sử dụng WebSocket và Alchemy để thực hiện các yêu cầu JSON-RPC và đăng ký các sự kiện."
author: "Elan Halpern"
lang: vi
tags: [ "từ Alchemy", "websockets", "truy vấn", "javascript" ]
skill: beginner
-source: Tài liệu Alchemy
+source: "Tài liệu Alchemy"
sourceUrl: https://www.alchemy.com/docs/reference/best-practices-for-using-websockets-in-web3
published: 2020-12-01
---
diff --git a/public/content/translations/vi/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/vi/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
index d94dca2ecbd..bf00efb65d6 100644
--- a/public/content/translations/vi/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
+++ b/public/content/translations/vi/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
@@ -1,6 +1,6 @@
---
title: "Waffle: Giả lập động và kiểm thử các lệnh gọi hợp đồng"
-description: Hướng dẫn Waffle nâng cao về cách sử dụng tính năng giả lập động và kiểm thử các lệnh gọi hợp đồng
+description: "Hướng dẫn Waffle nâng cao về cách sử dụng tính năng giả lập động và kiểm thử các lệnh gọi hợp đồng"
author: "Daniel Izdebski"
tags:
[
diff --git a/public/content/translations/vi/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md b/public/content/translations/vi/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
index 8381fc44a1c..c39cc0af85f 100644
--- a/public/content/translations/vi/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
+++ b/public/content/translations/vi/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
@@ -1,6 +1,6 @@
---
title: "Hướng dẫn Waffle hello world với hardhat và ethers"
-description: Tạo dự án Waffle đầu tiên của bạn với hardhat và ethers.js
+description: "Tạo dự án Waffle đầu tiên của bạn với hardhat và ethers.js"
author: "MiZiet"
tags:
[
diff --git a/public/content/translations/vi/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/waffle-test-simple-smart-contract/index.md
index 23a86222eb4..0d4e69f0345 100644
--- a/public/content/translations/vi/developers/tutorials/waffle-test-simple-smart-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/waffle-test-simple-smart-contract/index.md
@@ -1,6 +1,6 @@
---
-title: Kiểm thử hợp đồng thông minh đơn giản với thư viện Waffle
-description: Hướng dẫn cho người mới bắt đầu
+title: "Kiểm thử hợp đồng thông minh đơn giản với thư viện Waffle"
+description: "Hướng dẫn cho người mới bắt đầu"
author: Ewa Kowalska
tags:
[
diff --git a/public/content/translations/vi/developers/tutorials/yellow-paper-evm/index.md b/public/content/translations/vi/developers/tutorials/yellow-paper-evm/index.md
index 47f1fb74e12..4d1d9dcad86 100644
--- a/public/content/translations/vi/developers/tutorials/yellow-paper-evm/index.md
+++ b/public/content/translations/vi/developers/tutorials/yellow-paper-evm/index.md
@@ -1,6 +1,6 @@
---
-title: Tìm hiểu các đặc tả kỹ thuật EVM của Sách Vàng
-description: Tìm hiểu một phần của Sách Vàng, đặc tả kỹ thuật chính thức cho Ethereum, giải thích về máy ảo Ethereum (EVM).
+title: "Tìm hiểu các đặc tả kỹ thuật EVM của Sách Vàng"
+description: "Tìm hiểu một phần của Sách Vàng, đặc tả kỹ thuật chính thức cho Ethereum, giải thích về máy ảo Ethereum (EVM)."
author: "qbzzt"
tags: [ "evm" ]
skill: intermediate
diff --git a/public/content/translations/vi/eips/index.md b/public/content/translations/vi/eips/index.md
index cb744834d70..0e97b1c897a 100644
--- a/public/content/translations/vi/eips/index.md
+++ b/public/content/translations/vi/eips/index.md
@@ -1,6 +1,6 @@
---
-title: Đề xuất Cải tiến Ethereum (EIPs)
-description: Thông tin cơ bản bạn cần phải hiểu về EIPs
+title: "Đề xuất Cải tiến Ethereum (EIPs)"
+description: "Thông tin cơ bản bạn cần phải hiểu về EIPs"
lang: vi
---
diff --git a/public/content/translations/vi/energy-consumption/index.md b/public/content/translations/vi/energy-consumption/index.md
index d6529940ebd..3eb38f39e5b 100644
--- a/public/content/translations/vi/energy-consumption/index.md
+++ b/public/content/translations/vi/energy-consumption/index.md
@@ -1,6 +1,6 @@
---
-title: Năng lượng tiêu thu của Ethereum
-description: Các thông tin cơ bản cần hiểu về năng lượng tiêu thụ của Ethereum.
+title: "Năng lượng tiêu thu của Ethereum"
+description: "Các thông tin cơ bản cần hiểu về năng lượng tiêu thụ của Ethereum."
lang: vi
---
diff --git a/public/content/translations/vi/eth/supply/index.md b/public/content/translations/vi/eth/supply/index.md
index 1ec6abe74fa..6deb008e582 100644
--- a/public/content/translations/vi/eth/supply/index.md
+++ b/public/content/translations/vi/eth/supply/index.md
@@ -1,6 +1,6 @@
---
-title: Hiểu về nguồn cung và cơ chế phát hành của ETH
-description: Một bài viết thân thiện về nguồn cung và cơ chế phát hành của ETH, bao gồm khái niệm khóa như EIPs, PoS, và EIP-1559.
+title: "Hiểu về nguồn cung và cơ chế phát hành của ETH"
+description: "Một bài viết thân thiện về nguồn cung và cơ chế phát hành của ETH, bao gồm khái niệm khóa như EIPs, PoS, và EIP-1559."
lang: vi
---
diff --git a/public/content/translations/vi/ethereum-forks/index.md b/public/content/translations/vi/ethereum-forks/index.md
index 0ac0aacc8a1..f29d340c8ce 100644
--- a/public/content/translations/vi/ethereum-forks/index.md
+++ b/public/content/translations/vi/ethereum-forks/index.md
@@ -1,6 +1,6 @@
---
-title: Dòng thời gian của tất cả các phân nhánh Ethereum (từ 2014 đến nay)
-description: Lịch sử của chuỗi khối Ethereum, bao gồm các cột mốc quan trọng, các cập nhật, và các nhánh.
+title: "Dòng thời gian của tất cả các phân nhánh Ethereum (từ 2014 đến nay)"
+description: "Lịch sử của chuỗi khối Ethereum, bao gồm các cột mốc quan trọng, các cập nhật, và các nhánh."
lang: vi
sidebarDepth: 1
---
@@ -11,12 +11,11 @@ Tóm lược các cột mốc quan trọng, các nhánh - forks, và các cập
-Sự tách nhánh - forks - xảy ra khi những nâng cấp hoặc thay đổi kỹ thuật lớn cần được thực hiện đối với mạng Ethereum. Chúng thường được xuất phát từ những [Đề xuất cải tiến Ethereum (EIP)] (/ eips /) và làm thay đổi các "quy tắc" của giao thức.
+Sự tách nhánh - forks - xảy ra khi những nâng cấp hoặc thay đổi kỹ thuật lớn cần được thực hiện đối với mạng Ethereum. Chúng thường được xuất phát từ những [Đề xuất cải tiến Ethereum (EIP)](/ eips /) và làm thay đổi các "quy tắc" của giao thức.
Đối với những phần mềm truyền thống được quản lý tập trung, khi những nâng cấp mới được thực hiện, các công ty phần mềm chỉ việc phát hành chúng tới người dùng cuối. Các Chuỗi khối - blockchains - không áp dụng hình thức này vì không có sự sở hữu tập trung. [Ethereum clients](/developers/docs/nodes-and-clients/) phải tự cập nhật phần mềm của mình để áp dụng những quy tắc mới. Ngoài ra, những người tạo khối (thợ đào đối với bằng chứng công việc, người xác thực đối với bằng chứng cổ phần) và các node trong mạng phải tạo khối và xác thực dựa trên các quy tắc mới. [Tìm hiểu thêm về cơ chế đồng thuận](/developers/docs/consensus-mechanisms/)
Những thay đổi quy tắc này có thể tạo ra sự chia tách tạm thời trong mạng lưới. Những khối mới có thể được tạo ra dựa trên quy tắc mới, hoặc quỹ tắc cũ. Nhánh - forks - thường được thảo luận và đồng thuận trước để các client chấp nhận và áp dụng đồng loạt. Khi đó nhánh mới với các nâng cấp trở thành chuỗi chính. Tuy nhiên, trong một số trường hợp hiếm gặp, sự không đồng thuận tách nhánh có thể làm mạng lưới bị tách rời vĩnh viễn - điển hình nhất là sự hình thành Ethereum Classic với tách nhánh DAO.
-
@@ -62,7 +61,6 @@ Các bản nâng cấp lớp thực thi và lớp đồng thuận ban đầu đ
| Cancun | Deneb | "Dencun" |
| Prague | Electra | "Pectra" |
| Osaka | Fulu | "Fusaka" |
-
Chuyển thẳng đến thông tin về một số bản nâng cấp quan trọng trong quá khứ: [Chuỗi Hải Đăng](/roadmap/beacon-chain/); [The Merge](/roadmap/merge/); và [EIP-1559](#london)
@@ -116,7 +114,6 @@ Cải thiện hiệu quả và bảo mật giao thức:
EIP-2935 - Lưu lịch sử khối băm trong trạng thái
EIP-7549 - Chuyển chỉ số uỷ ban ra ngoài sự chứng thực
-
- [Pectra.wtf](https://pectra.wtf)
@@ -148,7 +145,6 @@ Bản nâng cấp Cancun chứa một bộ cải tiến cho _quá trình thực
EIP-6780 - SELFDESTRUCT chỉ xảy ra trong cùng một giao dịch
Cóe
-
- [Các rollup lớp 2](/layer-2/)
@@ -173,7 +169,6 @@ EIP-7514 khiến việc phát hành ETH trở nên chặt chẽ hơn bằng các
EIP-7045 - Tăng số khe bao gồm xác nhận tối đa
EIP-7514 - Thêm giới hạn xoay vòng tối đa của kỳ
-
- [Đọc thông số kỹ thuật nâng cấp Deneb](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/)
@@ -200,7 +195,6 @@ Nâng cấp Thượng Hải đã mang số tiền đặt cọc tới lớp vận
Đề xuất cải thiện Ethereum-3860 - Giới hạn và initcode
Đề xuất cải thiện Ethereum-4895 - Beacon chain đẩy rút tiền hoạt động
-
- [Đọc thông số kỹ thuật nâng cấp Shanghai](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md)
@@ -236,7 +230,6 @@ Bản nâng cấp Paris được kích hoạt khi chuỗi khối bằng chứng
Đề xuất nâng cấp Ethereum-3675 - Đồng thuận nâng cấp tới Bằng chứng cổ phần
EIP-4399 – Thay thế opcode KHÓ KHĂN bằng PREVRANDAO
-
---
@@ -268,7 +261,6 @@ Bản nâng cấp mạng lưới Gray Glacier đã lùi thời điểm kích ho
- Đề xuất cải thiện Ethereum - trì hoãn độ khó bom cho đến tháng 9 2022
-
@@ -291,7 +283,6 @@ Bản nâng cấp mạng lưới Arrow Glacier đã lùi thời điểm kích ho
- Đề xuất cải thiện Ethereum - 4345 - trì hoãn độ khó bom tới tháng 6 2020
-
---
@@ -349,7 +340,6 @@ Video này giải thích về EIP-1559 và những lợi ích mà nó mang lại
Đề xuất cải thiện Ethereum-3541-phòng triển khai hợp đồng thông minh bắt đầu với 0xEF
EIP-3554 – hoãn Kỉ Băng Hà cho đến tháng 12 năm 2021
-
---
@@ -373,7 +363,6 @@ Bản nâng cấp Berlin tối ưu hóa phí gas cho một số hoạt động t
EIP-2929 – tăng chi phí gas cho các mã lệnh truy cập trạng thái
EIP-2930 – thêm danh sách truy cập tùy chọn
-
@@ -428,7 +417,6 @@ Phân nhánh Muir Glacier đã trì hoãn [bom độ khó](/glossary/#difficulty
- Đề xuất cải thiện Ethereum-2384 - trì hoãn độ khó bom cho các khối 4,000,000 khác hoặc xấp xỉ 611 ngày.
-
@@ -461,7 +449,6 @@ Phân nhánh Istanbul:
EIP-2028 – làm giảm chi phí CallData để cho phép nhiều dữ liệu hơn trong các khối – điều này có lợi cho [Layer 2 scaling](/developers/docs/scaling/#layer-2-scaling).
Đề xuất cải thiện Ethereum-2200 - thay đổi giá gas mã lệnh khác.
-
---
@@ -489,7 +476,6 @@ Phân nhánh Constantinople:
EIP-1052 – giới thiệu lệnh EXTCODEHASH để truy xuất băm của mã nguồn một hợp đồng khác.
EIP-1234 – makes sure the blockchain doesn't freeze before proof-of-stake and reduces block reward from 3 to 2 ETH.
-
@@ -524,7 +510,6 @@ Phân nhánh Byzantium:
Đề xuất cải thiện Ethereum-100 - thay đổi công thức chỉnh sửa độ khó.
EIP-649 – trì hoãn [dificulty bomb](/glossary/#difficulty-bomb) thêm 1 năm và giảm phần thưởng khối từ 5 xuống 3 ETH.
-
@@ -553,7 +538,6 @@ Phân nhánh Spurious Dragon là câu trả lời thứ hai cho các cuộc tấ
Đề xuất cải thiện Ethereum-161 - cho phép loại bỏ các tài khoản rỗng được thêm vào trong cuộc Tấn công Từ chối Dịch Vụ.
Đề xuất cải thiện Ethereum-170 - thay đổi độ dài mã tối đa mà một hợp đồng trên chuỗi khối có thể có - tới 24576 byte.
-
---
@@ -576,7 +560,6 @@ Phân nhánh Tangerine Whistle là câu trả lời đầu tiên cho các cuộc
Đề xuất cải thiện Ethereum-150 - tăng phí gas của các mã lệnh vận hành được sử dụng trong tấn công thư rác.
Đề xuất cải thiện Ethereum-158 - giảm kích thước hiện tại bằng việc loại bỏ số lượng lớn các tài khoản rỗng được đặt trong trạng thái phí thấp do sai sót của các phiên bản giao thức Ethereum trước đó.
-
---
@@ -614,7 +597,6 @@ Phân nhánh Homestead dọn đường cho các cập nhật tương lai. Bản
Đề xuất cải thiện Ethereum-7 - thêm mã lệnh vận hành mới:DELEGATECALL
Đề xuất cải thiện Ethereum-8 - giới thiệu các yêu cầu về khả năng tương thích chuyển tiếp lập trình ngang hàng
-
diff --git a/public/content/translations/vi/foundation/index.md b/public/content/translations/vi/foundation/index.md
index 75bb2a8d7f2..2e90c2de067 100644
--- a/public/content/translations/vi/foundation/index.md
+++ b/public/content/translations/vi/foundation/index.md
@@ -1,6 +1,6 @@
---
-title: Nền tảng Ethereum
-description: Tìm hiểu về tổ chức sáng lập Ethereum (EF), một tổ chức phi lợi nhuận chuyên hỗ trợ Ethereum và các nền tảng công nghệ liên quan.
+title: "Nền tảng Ethereum"
+description: "Tìm hiểu về tổ chức sáng lập Ethereum (EF), một tổ chức phi lợi nhuận chuyên hỗ trợ Ethereum và các nền tảng công nghệ liên quan."
hideEditButton: true
lang: vi
---
diff --git a/public/content/translations/vi/gaming/index.md b/public/content/translations/vi/gaming/index.md
index 8bf865a83fb..dcabbfb2bbb 100644
--- a/public/content/translations/vi/gaming/index.md
+++ b/public/content/translations/vi/gaming/index.md
@@ -1,12 +1,12 @@
---
-title: Chơi game trên chuỗi
+title: "Chơi game trên chuỗi"
lang: vi
template: use-cases
image: /images/robot-help-bar.png
sidebarDepth: 2
-summaryPoint1: Luật chơi và trạng thái của trò chơi có thể được thực thi bằng chuỗi khối, chứ không phải máy chủ của studio
-summaryPoint2: Bất kỳ ai cũng có thể xây dựng các bản mod, bot hoặc các trò chơi hoàn toàn mới kết nối với cùng một dữ liệu trên chuỗi
-summaryPoint3: Các L2 được xây dựng chuyên dụng, như Redstone và các khung công tác, như MUD, cắt giảm chi phí đủ để hỗ trợ lối chơi trong thời gian thực
+summaryPoint1: "Luật chơi và trạng thái của trò chơi có thể được thực thi bằng chuỗi khối, chứ không phải máy chủ của studio"
+summaryPoint2: "Bất kỳ ai cũng có thể xây dựng các bản mod, bot hoặc các trò chơi hoàn toàn mới kết nối với cùng một dữ liệu trên chuỗi"
+summaryPoint3: "Các L2 được xây dựng chuyên dụng, như Redstone và các khung công tác, như MUD, cắt giảm chi phí đủ để hỗ trợ lối chơi trong thời gian thực"
buttons:
- content: Tìm hiểu thêm
toId: how-gaming-on-ethereum-works
diff --git a/public/content/translations/vi/glossary/index.md b/public/content/translations/vi/glossary/index.md
index 27ff5c19d7a..e8888e702fb 100644
--- a/public/content/translations/vi/glossary/index.md
+++ b/public/content/translations/vi/glossary/index.md
@@ -1,6 +1,6 @@
---
-title: Thuật ngữ về Ethereum
-description: Một danh sách chủ giải về những thuật ngữ chuyên ngành và không chuyên ngành liên quan đển Ethereum
+title: "Thuật ngữ về Ethereum"
+description: "Một danh sách chủ giải về những thuật ngữ chuyên ngành và không chuyên ngành liên quan đển Ethereum"
lang: vi
---
diff --git a/public/content/translations/vi/governance/index.md b/public/content/translations/vi/governance/index.md
index 5970490b562..b4d95a4903f 100644
--- a/public/content/translations/vi/governance/index.md
+++ b/public/content/translations/vi/governance/index.md
@@ -1,6 +1,6 @@
---
-title: Quản trị Ethereum
-description: Lời giới thiệu về cách các quyết định về Ethereum được thông qua.
+title: "Quản trị Ethereum"
+description: "Lời giới thiệu về cách các quyết định về Ethereum được thông qua."
lang: vi
---
diff --git a/public/content/translations/vi/guides/how-to-create-an-ethereum-account/index.md b/public/content/translations/vi/guides/how-to-create-an-ethereum-account/index.md
index 4663be7dd54..4857bbafa6c 100644
--- a/public/content/translations/vi/guides/how-to-create-an-ethereum-account/index.md
+++ b/public/content/translations/vi/guides/how-to-create-an-ethereum-account/index.md
@@ -1,6 +1,6 @@
---
-title: Cách "tạo" một tài khoản Ethereum
-description: Từng bước tạo tài khoản Ethereum bằng cách sử dụng ví.
+title: "Cách \"tạo\" một tài khoản Ethereum"
+description: "Từng bước tạo tài khoản Ethereum bằng cách sử dụng ví."
lang: vi
---
@@ -42,7 +42,8 @@ Một số ứng dụng sẽ yêu cầu bạn lưu một "cụm từ khôi phụ
- Đã cài đặt ví chưa?
Tìm hiểu cách sử dụng ví.
+ Đã cài đặt ví chưa?
Tìm hiểu cách sử dụng ví.
+
Cách sử dụng ví
diff --git a/public/content/translations/vi/guides/how-to-id-scam-tokens/index.md b/public/content/translations/vi/guides/how-to-id-scam-tokens/index.md
index bffbe5f43f6..c3172fb4906 100644
--- a/public/content/translations/vi/guides/how-to-id-scam-tokens/index.md
+++ b/public/content/translations/vi/guides/how-to-id-scam-tokens/index.md
@@ -1,6 +1,6 @@
---
-title: Cách để nhận biết những token lừa đảo
-description: Tìm hiểu về những token lừa đảo, cách làm cho chúng trở nên hợp pháp hóa, và cách để phòng tránh chúng.
+title: "Cách để nhận biết những token lừa đảo"
+description: "Tìm hiểu về những token lừa đảo, cách làm cho chúng trở nên hợp pháp hóa, và cách để phòng tránh chúng."
lang: vi
---
@@ -20,7 +20,6 @@ title="ARB là gì?"
contentPreview=''>
Arbitrum là một tổ chức phát triển và quản lý [optimistic rollups](/developers/docs/scaling/optimistic-rollups/). Ban đầu, Arbitrum được tổ chức như một công ty vì lợi nhuận, nhưng sau đó đã thực hiện các bước phân cấp. Cũng như một phần của quá trình đó, họ giới thiệu về một [Token quản trị](/dao/#token-based-membership).
-
Có một quy ước trong Ethereum là khi một nội dung không tuân thủ ERC-20, chúng tôi sẽ tạo một phiên bản "được bao bọc" của nội dung đó với tên bắt đầu bằng "w". Vì vậy, ví dụ: chúng ta có wBTC cho bitcoin và wETH cho ether.
Không có ý nghĩa gì khi tạo ra một phiên bản được gói của mã thông báo ERC-20 đã có trên Ethereum, nhưng những kẻ lừa đảo dựa vào sự xuất hiện của tính hợp pháp hơn là thực tế cơ bản.
-
## Làm thế nào để các mã thông báo lừa đảo hoạt động? {#how-do-scam-tokens-work}
@@ -42,7 +40,6 @@ title="Hợp đồng thông minh là gì?"
contentPreview=''>
[Hợp đồng thông minh](/developers/docs/smart-contracts/) là các chương trình chạy trên chuỗi khối Ethereum. Mọi ERC-20 token, ví dụ, đều được triển khải như một hợp đồng thông minh.
-
Cụ thể, Arbitrum đã triển khai một hợp đồng sử dụng ký hiệu `ARB`. Nhưng điều đó không có ngan cản mọi người phát triển một hợp đồng sử dụng giống ký hiệu hoặc tương tự. Bất kỳ ai viết hợp đồng sẽ được quyết đinh hợp đồng đó sẽ làm gì.
diff --git a/public/content/translations/vi/guides/how-to-revoke-token-access/index.md b/public/content/translations/vi/guides/how-to-revoke-token-access/index.md
index 6b7b02cfdc1..a164604a719 100644
--- a/public/content/translations/vi/guides/how-to-revoke-token-access/index.md
+++ b/public/content/translations/vi/guides/how-to-revoke-token-access/index.md
@@ -1,6 +1,6 @@
---
-title: Cách thu hồi quyền truy cập hợp đồng thông minh vào tài sản tiền mã hóa của bạn
-description: Hướng dẫn thu hồi quyền truy cập mã thông báo hợp đồng thông minh khai thác
+title: "Cách thu hồi quyền truy cập hợp đồng thông minh vào tài sản tiền mã hóa của bạn"
+description: "Hướng dẫn thu hồi quyền truy cập mã thông báo hợp đồng thông minh khai thác"
lang: vi
---
@@ -49,7 +49,8 @@ Chúng tôi khuyên bạn nên làm mới công cụ thu hồi sau vài phút v
- Bạn muốn tìm hiểu thêm?
+ Bạn muốn tìm hiểu thêm?
+
Xem các hướng dẫn khác của chúng tôi
diff --git a/public/content/translations/vi/guides/how-to-swap-tokens/index.md b/public/content/translations/vi/guides/how-to-swap-tokens/index.md
index 175cd409d92..b3c0300b604 100644
--- a/public/content/translations/vi/guides/how-to-swap-tokens/index.md
+++ b/public/content/translations/vi/guides/how-to-swap-tokens/index.md
@@ -1,6 +1,6 @@
---
-title: Cách để hoán đổi token
-description: Những cách đơn giản nhất để hoán đổi tài sản trên nền tảng Ethereum.
+title: "Cách để hoán đổi token"
+description: "Những cách đơn giản nhất để hoán đổi tài sản trên nền tảng Ethereum."
lang: vi
---
@@ -52,7 +52,8 @@ Khi giao dịch hoàn thành, bạn sẽ nhận được tài sản mà bạn đ
- Bạn muốn tìm hiểu thêm?
+ Bạn muốn tìm hiểu thêm?
+
Xem các hướng dẫn khác của chúng tôi
diff --git a/public/content/translations/vi/guides/how-to-use-a-bridge/index.md b/public/content/translations/vi/guides/how-to-use-a-bridge/index.md
index 7f07f8616d0..46447a8beef 100644
--- a/public/content/translations/vi/guides/how-to-use-a-bridge/index.md
+++ b/public/content/translations/vi/guides/how-to-use-a-bridge/index.md
@@ -1,6 +1,6 @@
---
-title: Cách chuyển token sang lớp 2
-description: Một hướng dẫn giải thích cách do chuyển mã thông báo từ Ethereum sang lớp thứ 2 bằng cầu nối.
+title: "Cách chuyển token sang lớp 2"
+description: "Một hướng dẫn giải thích cách do chuyển mã thông báo từ Ethereum sang lớp thứ 2 bằng cầu nối."
lang: vi
---
@@ -54,7 +54,8 @@ Bạn có thể sử dụng [chainlist.org](http://chainlist.org) để tìm chi
- Bạn muốn tìm hiểu thêm?
+ Bạn muốn tìm hiểu thêm?
+
Xem các hướng dẫn khác của chúng tôi
diff --git a/public/content/translations/vi/guides/how-to-use-a-wallet/index.md b/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
index 1f11d114d1f..f209e860634 100644
--- a/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
+++ b/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
@@ -1,7 +1,7 @@
---
-title: Cách để sử dụng ví
-metaTitle: Hướng dẫn từng bước cách sử dụng ví Ethereum
-description: Hướng dẫn giải thích cách gửi, nhận mã thông báo và kết nối với các dự án web3.
+title: "Cách để sử dụng ví"
+metaTitle: "Hướng dẫn từng bước cách sử dụng ví Ethereum"
+description: "Hướng dẫn giải thích cách gửi, nhận mã thông báo và kết nối với các dự án web3."
lang: vi
---
@@ -65,7 +65,8 @@ Bạn có muốn gửi ETH sang một ví khác?
- Bạn muốn tìm hiểu thêm?
+ Bạn muốn tìm hiểu thêm?
+
Xem các hướng dẫn khác của chúng tôi
diff --git a/public/content/translations/vi/guides/index.md b/public/content/translations/vi/guides/index.md
index 977ca7afd1f..de0849aa5ea 100644
--- a/public/content/translations/vi/guides/index.md
+++ b/public/content/translations/vi/guides/index.md
@@ -1,6 +1,6 @@
---
-title: Cẩm nang Ethereum
-description: Một cẩm nang tổng hợp giải thích căn bản về việc sử dụng Ethereum cho người mới.
+title: "Cẩm nang Ethereum"
+description: "Một cẩm nang tổng hợp giải thích căn bản về việc sử dụng Ethereum cho người mới."
lang: vi
---
diff --git a/public/content/translations/vi/nft/index.md b/public/content/translations/vi/nft/index.md
index 938a01d4b7d..57b24eff681 100644
--- a/public/content/translations/vi/nft/index.md
+++ b/public/content/translations/vi/nft/index.md
@@ -1,16 +1,16 @@
---
-title: Mã thông báo không thể thay thế (NFT)
-metaTitle: NFT là gì? | Lợi ích và cách sử dụng
-description: Tổng quan về NFT trên Ethereum
+title: "Mã thông báo không thể thay thế (NFT)"
+metaTitle: "NFT là gì? | Lợi ích và cách sử dụng"
+description: "Tổng quan về NFT trên Ethereum"
lang: vi
template: use-cases
emoji: ":frame_with_picture:"
sidebarDepth: 2
image: /images/infrastructure_transparent.png
-alt: Logo của Eth hiển thị qua ảnh ba chiều.
-summaryPoint1: 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.
-summaryPoint2: NFT đang mang lại nhiều quyền lực hơn cho người tạo nội dung hơn bao giờ hết.
-summaryPoint3: Được hỗ trợ bởi các hợp đồng thông minh trên chuỗi khối Ethereum.
+alt: "Logo của Eth hiển thị qua ảnh ba chiều."
+summaryPoint1: "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."
+summaryPoint2: "NFT đang mang lại nhiều quyền lực hơn cho người tạo nội dung hơn bao giờ hết."
+summaryPoint3: "Được hỗ trợ bởi các hợp đồng thông minh trên chuỗi khối Ethereum."
---
## NFT là gì? {#what-are-nfts}
@@ -58,7 +58,8 @@ Có thể bạn là một nghệ sĩ muốn chia sẻ tác phẩm của mình b
- Khám phá, mua hay tạo ra các tác phẩm nghệ thuật/bộ sưu tập NFT của riêng bạn...
+ Khám phá, mua hay tạo ra các tác phẩm nghệ thuật/bộ sưu tập NFT của riêng bạn...
+
Khám phá nghệ thuật NFT
diff --git a/public/content/translations/vi/payments/index.md b/public/content/translations/vi/payments/index.md
index 1bd84ad7d1a..0a46c8cc445 100644
--- a/public/content/translations/vi/payments/index.md
+++ b/public/content/translations/vi/payments/index.md
@@ -1,16 +1,16 @@
---
-title: Thanh toán Ethereum
-metaTitle: Thanh toán trên Ethereum
-description: Tổng quan về thanh toán trên Ethereum
+title: "Thanh toán Ethereum"
+metaTitle: "Thanh toán trên Ethereum"
+description: "Tổng quan về thanh toán trên Ethereum"
lang: vi
template: use-cases
emoji: ":frame_with_picture:"
sidebarDepth: 2
image: /images/impact_transparent.png
-alt: Biểu tượng của ETH được hiển thị cùng hình ảnh những bàn tay đang trao đi.
-summaryPoint1: Một thế giới nơi mà tiền di chuyển tự do như thông tin
-summaryPoint2: Tự do và toàn cầu, cho phép giao dịch xuyên biên giới cho mọi người
-summaryPoint3: Giao dịch hoàn tất trong vòng một phút
+alt: "Biểu tượng của ETH được hiển thị cùng hình ảnh những bàn tay đang trao đi."
+summaryPoint1: "Một thế giới nơi mà tiền di chuyển tự do như thông tin"
+summaryPoint2: "Tự do và toàn cầu, cho phép giao dịch xuyên biên giới cho mọi người"
+summaryPoint3: "Giao dịch hoàn tất trong vòng một phút"
---
Mỗi ngày, hàng triệu người gặp cùng một thử thách: di chuyển tiền xuyên biên giới rất chậm, chi phí đắt, và thường rất khó chịu. Một người có công việc tự do tại Bali chờ đợi cả ngày để nhận được tiền thanh toán từ khách hàng ở New York. Điều này đặc biệt ảnh hưởng đến những người sống ở các khu vực có hạ tầng ngân hàng hạn chế, khiến họ khó tham gia vào nền kinh tế toàn cầu.
@@ -20,7 +20,6 @@ Mỗi ngày, hàng triệu người gặp cùng một thử thách: di chuyển

-
## Chuyển tiền quốc tế: chi phí rẻ hơn {#remittances}
@@ -61,7 +60,8 @@ Quốc gia như El Salvador và Cộng hòa Trung Phi thậm chí đã chấp nh
- Tạo tài khoản Ethereum với ứng dụng ví ngay hôm nay.
+ Tạo tài khoản Ethereum với ứng dụng ví ngay hôm nay.
+
Bắt đầu
@@ -142,7 +142,6 @@ Cũng có những phản ứng tương tự với thảm kích xảy ra tại

-
## Ethereum và tiền pháp định {#ethereum-vs-fiat}
@@ -189,7 +188,6 @@ Với Ethereum, mọi người đều có thể thấy tiền di chuyển như t

-
Trong khi tiền pháp định có ưu điểm là được chấp nhận rộng rãi và ổn định, Ethereum mang lại những lợi ích độc đáo khiến nó trở thành lựa chọn hấp dẫn cho một số loại giao dịch nhất định.
@@ -199,7 +197,8 @@ Từ việc hỗ trợ cứu trợ thiên tai nhanh chóng đến trao quyền c
- Đây là lúc để tạo tài khoản Ethereum cho bạn.
+ Đây là lúc để tạo tài khoản Ethereum cho bạn.
+
Bắt đầu nào!
diff --git a/public/content/translations/vi/prediction-markets/index.md b/public/content/translations/vi/prediction-markets/index.md
index b85efcfa761..12c751abd97 100644
--- a/public/content/translations/vi/prediction-markets/index.md
+++ b/public/content/translations/vi/prediction-markets/index.md
@@ -1,16 +1,16 @@
---
-title: Thị trường dự đoán
+title: "Thị trường dự đoán"
lang: vi
template: use-cases
image: /images/use-cases/prediction-markets.png
sidebarDepth: 2
-summaryPoint1: Nhận động lực tài chính để tạo ra các dự báo chính xác
-summaryPoint2: Dự đoán chất lượng về các sự kiện tương lai
+summaryPoint1: "Nhận động lực tài chính để tạo ra các dự báo chính xác"
+summaryPoint2: "Dự đoán chất lượng về các sự kiện tương lai"
buttons:
- content: Tìm hiểu thêm
- toId: cách-thị-trường-dự-đoán-hoạt-động
+ toId: "cách-thị-trường-dự-đoán-hoạt-động"
- content: Khám phá các ứng dụng
- toId: tìm-một-thị-trường-dự-đoán
+ toId: "tìm-một-thị-trường-dự-đoán"
isSecondary: false
---
@@ -73,7 +73,7 @@ Thị trường dự đoán trên chuỗi khối có nhiều thách thức ảnh
Thị trường dự đoán đang định hình việc ra quyết định trong kỉ nguyên số. Bằng cách tận dụng Ethereum, chúng giúp **công bằng, mở và có phần thưởng để dự đoán tương lai.**
-Có nhiều cách để sử dụng công cụ dự đoán ngoài lợi ích tài chính. Ví dụ, trong một [Đề xuất cải thiện DevCon] (https://forum.devcon.org/t/futarchy-decision-markets-for-deciding-next-devcon/5305) (DIP) có đề xuất rằng các người tổ chức sự kiện Devcon sử dụng thị trường dự đoán để ước lượng số người tham dự sự kiện trương tương lai.
+Có nhiều cách để sử dụng công cụ dự đoán ngoài lợi ích tài chính. Ví dụ, trong một [Đề xuất cải thiện DevCon](https://forum.devcon.org/t/futarchy-decision-markets-for-deciding-next-devcon/5305) (DIP) có đề xuất rằng các người tổ chức sự kiện Devcon sử dụng thị trường dự đoán để ước lượng số người tham dự sự kiện trương tương lai.
Điều này sẽ giúp ban tổ chức xác định địa điểm nào sẽ dẫn đến sự kiện có quy mô lớn nhất, so với địa điểm nào sẽ mang lại khả năng tiếp cận quốc tế tốt nhất. Lợi ích của điều này là ban tổ chức DevCon có thể rút ngắn thời gian cần thiết để rà soát nhiều chính sách thị thực, khả năng tiếp cận sân bay và chi phí sinh hoạt tại khu vực, đồng thời thu thập dữ liệu về những nơi mà những người tham dự tiềm năng mong muốn đến.
diff --git a/public/content/translations/vi/privacy/index.md b/public/content/translations/vi/privacy/index.md
index d62480ad970..0ae52427291 100644
--- a/public/content/translations/vi/privacy/index.md
+++ b/public/content/translations/vi/privacy/index.md
@@ -1,6 +1,6 @@
---
-title: Quyền riêng tư trên Ethereum
-description: Công cụ và các kỹ thuật để bảo vệ quyền riêng tư của bạn trên Ethereum
+title: "Quyền riêng tư trên Ethereum"
+description: "Công cụ và các kỹ thuật để bảo vệ quyền riêng tư của bạn trên Ethereum"
lang: vi
---
diff --git a/public/content/translations/vi/real-world-assets/index.md b/public/content/translations/vi/real-world-assets/index.md
index 3a49a86af89..dd7a4df307f 100644
--- a/public/content/translations/vi/real-world-assets/index.md
+++ b/public/content/translations/vi/real-world-assets/index.md
@@ -1,16 +1,16 @@
---
-title: Tài sản thực (RWAs)
-metaTitle: RWAs là gì? | Lợi ích và công dụng của tài sản thực (RWAs)
-description: Tổng quan về tài sản thực (RWAs) trên Ethereum
+title: "Tài sản thực (RWAs)"
+metaTitle: "RWAs là gì? | Lợi ích và công dụng của tài sản thực (RWAs)"
+description: "Tổng quan về tài sản thực (RWAs) trên Ethereum"
lang: vi
template: use-cases
emoji: ":house_buildings:"
image: /images/man-and-dog-playing.png
-alt: Người đàn ông và con chó đang vui đùa.
+alt: "Người đàn ông và con chó đang vui đùa."
sidebarDepth: 2
-summaryPoint1: Một phương pháp biến đổi những hàng hoá có giá trị trở thành token tài sản số.
-summaryPoint2: Giờ đây bạn có thể sở hữu một phần của tài sản hoặc vật thể thực, thay vì phải mua trọn bất động sản hay món đồ đó.
-summaryPoint3: Kết nối tài chính truyền thống với hệ sinh thái chuỗi khối.
+summaryPoint1: "Một phương pháp biến đổi những hàng hoá có giá trị trở thành token tài sản số."
+summaryPoint2: "Giờ đây bạn có thể sở hữu một phần của tài sản hoặc vật thể thực, thay vì phải mua trọn bất động sản hay món đồ đó."
+summaryPoint3: "Kết nối tài chính truyền thống với hệ sinh thái chuỗi khối."
---
Tài sản thực (RWAs) là những Tokens đại diện cho những dạng tài sản, như bất động sản, vàng, chứng khoán, tác phẩm nghệ thuật, máy móc hoặc đồ sưu tầm. Token hóa những đồ vật này giúp chuyển chúng sang dạng số, cho phép chúng có thể đồng sở hữu bởi nhiều người và dễ dàng giao dịch chúng.
@@ -89,5 +89,5 @@ Một số quốc gia đi đầu trong việc xây dựng khung pháp lý đặc
- [Những nhà đầu tư Crypto cần biết gì về Token hóa tài sản thực](https://www.forbes.com/sites/irinaheaver/2024/03/14/what-crypto-investors-need-to-know-about-tokenizing-real-world-assets/) trên Forbes
- [Hợp đồng thông minh hoạt động trên chuỗi khối như thế nào](https://www.britannica.com/money/how-smart-contracts-work) trên Britannica
- [Token hóa tài sản số thay đổi DeFi như thế nào](https://medium.com/coinmonks/how-tokenized-real-world-assets-are-transforming-defi-4e040f28732a) trên Medium
-- [RWA là gì trong Crypto? Giải thích vai trò của chúng trong chuỗi khối] (https://www.bitdegree.org/crypto/tutorials/what-is-rwa-in-crypto) trên BitDegree
+- [RWA là gì trong Crypto? Giải thích vai trò của chúng trong chuỗi khối](https://www.bitdegree.org/crypto/tutorials/what-is-rwa-in-crypto) trên BitDegree
- [Các đồng RWA có vốn hóa cao nhất hôm nay](https://www.forbes.com/digital-assets/categories/real-world-assets-rwa/) trên Forbes
diff --git a/public/content/translations/vi/refi/index.md b/public/content/translations/vi/refi/index.md
index 9b0ffb28b7a..f8b8f20c81f 100644
--- a/public/content/translations/vi/refi/index.md
+++ b/public/content/translations/vi/refi/index.md
@@ -1,15 +1,15 @@
---
-title: Tài chính tái tạo (ReFi)
-description: Tổng quan về ReFi.
+title: "Tài chính tái tạo (ReFi)"
+description: "Tổng quan về ReFi."
lang: vi
template: use-cases
emoji: ":recycle:"
sidebarDepth: 2
image: /images/future_transparent.png
alt: ""
-summaryPoint1: 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
-summaryPoint2: Nỗ lực khai thác Ethereum để giải quyết các cuộc khủng hoảng phối hợp ở cấp độ toàn cầu như biến đổi khí hậu
-summaryPoint3: Một công cụ để mở rộng đáng kể các tài sản mang lại lợi ích sinh thái như tín dụng carbon đã được xác minh
+summaryPoint1: "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"
+summaryPoint2: "Nỗ lực khai thác Ethereum để giải quyết các cuộc khủng hoảng phối hợp ở cấp độ toàn cầu như biến đổi khí hậu"
+summaryPoint3: "Một công cụ để mở rộng đáng kể các tài sản mang lại lợi ích sinh thái như tín dụng carbon đã được xác minh"
---
## ReFi là gì? {#what-is-refi}
diff --git a/public/content/translations/vi/restaking/index.md b/public/content/translations/vi/restaking/index.md
index 24d15c62c11..4aa8708355f 100644
--- a/public/content/translations/vi/restaking/index.md
+++ b/public/content/translations/vi/restaking/index.md
@@ -1,14 +1,14 @@
---
-title: Tái cổ phần
-metaTitle: Tái cổ phần là gì? | Lợi ích và cách sử dụng tái cổ phần
-description: Sử dụng ETH đã được góp cổ phần để bảo mật các dịch vụ phi tập trung khác và kiếm thêm phần thưởng.
+title: "Tái cổ phần"
+metaTitle: "Tái cổ phần là gì? | Lợi ích và cách sử dụng tái cổ phần"
+description: "Sử dụng ETH đã được góp cổ phần để bảo mật các dịch vụ phi tập trung khác và kiếm thêm phần thưởng."
lang: vi
template: use-cases
emoji: ":recycle:"
image: /images/use-cases/restaking.png
-alt: Mô tả trực quan về tái cổ phần trên Ethereum.
+alt: "Mô tả trực quan về tái cổ phần trên Ethereum."
sidebarDepth: 2
-summaryPoint1: Sử dụng ETH đã được góp cổ phần để bảo mật các dịch vụ phi tập trung khác và kiếm thêm phần thưởng.
+summaryPoint1: "Sử dụng ETH đã được góp cổ phần để bảo mật các dịch vụ phi tập trung khác và kiếm thêm phần thưởng."
buttons:
- content: Tái cổ phần là gì?
toId: what-is-restaking
diff --git a/public/content/translations/vi/roadmap/account-abstraction/index.md b/public/content/translations/vi/roadmap/account-abstraction/index.md
index 82218215e55..d1a73c6e7ba 100644
--- a/public/content/translations/vi/roadmap/account-abstraction/index.md
+++ b/public/content/translations/vi/roadmap/account-abstraction/index.md
@@ -1,6 +1,6 @@
---
-title: Trừu tượng hóa tài khoản
-description: Tổng quan về kế hoạch của Ethereum giúp tài khoản người dùng đơn giản và an toàn hơn
+title: "Trừu tượng hóa tài khoản"
+description: "Tổng quan về kế hoạch của Ethereum giúp tài khoản người dùng đơn giản và an toàn hơn"
lang: vi
summaryPoints:
- Trừu tượng hóa tài khoản giúp việc xây dựng ví hợp đồng thông minh trở nên dễ dàng hơn
diff --git a/public/content/translations/vi/roadmap/beacon-chain/index.md b/public/content/translations/vi/roadmap/beacon-chain/index.md
index 238af202b39..5a39fa54822 100644
--- a/public/content/translations/vi/roadmap/beacon-chain/index.md
+++ b/public/content/translations/vi/roadmap/beacon-chain/index.md
@@ -1,13 +1,13 @@
---
-title: Chuỗi Hải Đăng
-description: Tìm hiểu thêm về chuỗi Beacon - Nâng cấp đã giới thiệu bằng chứng cổ phần trên Ethereum.
+title: "Chuỗi Hải Đăng"
+description: "Tìm hiểu thêm về chuỗi Beacon - Nâng cấp đã giới thiệu bằng chứng cổ phần trên Ethereum."
lang: vi
template: upgrade
image: /images/upgrades/core.png
alt:
-summaryPoint1: Chuỗi Beacon đã giới thiệu bằng chứng cổ phần trên hệ sinh thái Ethereum.
-summaryPoint2: Nó được hợp nhất với cơ chế bằng chứng công việc gốc trên chuỗi Ethereum vào tháng 9 năm 2022.
-summaryPoint3: Chuỗi Beacon đã giới thiệu Logic đồng thuận và giao thức lan truyền khối (block gossip protocol), hiện đang bảo mật cho Ethereum.
+summaryPoint1: "Chuỗi Beacon đã giới thiệu bằng chứng cổ phần trên hệ sinh thái Ethereum."
+summaryPoint2: "Nó được hợp nhất với cơ chế bằng chứng công việc gốc trên chuỗi Ethereum vào tháng 9 năm 2022."
+summaryPoint3: "Chuỗi Beacon đã giới thiệu Logic đồng thuận và giao thức lan truyền khối (block gossip protocol), hiện đang bảo mật cho Ethereum."
---
diff --git a/public/content/translations/vi/roadmap/danksharding/index.md b/public/content/translations/vi/roadmap/danksharding/index.md
index 5a6112f6fef..3fded5b56d9 100644
--- a/public/content/translations/vi/roadmap/danksharding/index.md
+++ b/public/content/translations/vi/roadmap/danksharding/index.md
@@ -1,6 +1,6 @@
---
title: Danksharding
-description: Tìm hiểu về Proto-Danksharding và Danksharding - hai bản nâng cấp tuần tự để mở rộng quy mô Ethereum.
+description: "Tìm hiểu về Proto-Danksharding và Danksharding - hai bản nâng cấp tuần tự để mở rộng quy mô Ethereum."
lang: vi
summaryPoints:
- Phân đoạn thế hệ mới (Danksharding) là nâng cấp nhiều giai đoạn nhằm cải thiện khả năng mở rộng và dung tích.
@@ -22,13 +22,11 @@ Việc này rất đắt đỏ vì quá trình này được thực hiện bởi
Rollups là công nghệ giúp mở rộng Ethereum bằng cách gộp cách giao dịch ngoài chuỗi và ghi lại kết quả lên Ethereum. Một Rollups cần hai thành phần: dữ liệu và kiểm tra thực thi. Dữ liệu là tất cả giao dịch được xử lí bằng cách gộp trạng thái sau lại và ghi lên Ethereum. Kiểm tra thực thi là thực thi lại những giao dịch nó bằng một bên trung thực (người chứng minh) để đảm bảo rằng trạng thái sau thay đổi là đúng. Để kiểm tra thực thi, dữ liệu phải tồn tại đủ lâu để mọi người có thể tải và kiểm tra. Điều này có nghĩa những hành vi gian lận bởi người vận hành Rollups có thể bị phát hiện và thử thách bởi người chứng minh. Tuy nhiên, nó không có nghĩa rằng dữ liệu cần tồn tại mãi mãi.
-
Rollups đăng tải cam kết rằng giao dịch trên chuỗi và dữ liệu thực tế có thể truy cập ở trên dữ liệu Blob. Điều này có nghĩa người chứng minh có thể kiểm tra xem các cam kết này có hợp lệ hay đặt thử thách dữ liệu vì họ nghĩ rằng nó sai. Đây là ở mức độ nút xác thực, dữ liệu Blob được giữ trong Client đồng thuận. Clinet đồng thuận chứng thực rằng họ đã thấy dữ liệu và lan khuyền khắp mạng lưới. Nếu dữ liệu được giữ vĩnh viễn, các client này sẽ đầy bộ nhớ và dẫn đến yêu cầu phần cứng lớn khi vận hành nút. Thay vào đó, dữ liệu sẽ tự động bị cắt bỏ khỏi nút sau mỗi 18 ngày. Các chứng thực từ client đồng thuận cho thấy đã có đủ cơ hội để những người chứng minh xác minh dữ liệu. Đây là dữ liệu thực tế được lưu trữ ngoài chuỗi của người vận hành Rollups, người dùng và những bên khác.
-
### Dữ liệu Blob được xác minh như thế nào? {#how-are-blobs-verified}
@@ -48,13 +46,11 @@ Nghi thức KZG cho EIP-4844 được mở công khai và hàng chục nghìn ng
Rollups ghi lên dữ liệu Bloc, chúng cung cấp "cam kết" rằng họ đã ghi lên chuỗi. Cam kết này là kết quả của việc khớp dữ liệu với một đa thức và đánh giá nó tại một số điểm nhất định. Các điểm này được xác định bởi các số ngẫu nhiên được tạo ra trong nghi thức KZG. Những người chứng minh sau đó có thể đánh giá đa thức tại cùng các điểm đó để xác minh dữ liệu – nếu họ thu được cùng một giá trị thì dữ liệu là chính xác.
-
Nếu ai đó biết các vị trí ngẫu nhiên được dùng cho cam kết, họ có thể dễ dàng tạo ra một đa thức mới khớp tại chính những điểm đó (tức là một "xung đột"). Điều này có nghĩa là họ có thể thêm hoặc xóa dữ liệu khỏi Blob mà vẫn cung cấp được một bằng chứng hợp lệ. Để ngăn điều đó, thay vì đưa cho người chứng minh những vị trí bí mật thực sự, họ nhận được các vị trí được bọc bằng một “hộp đen” mật mã học sử dụng đường cong Elliptic. Điều này làm xáo trộn các giá trị theo cách mà giá trị gốc không thể bị giải ngược, nhưng nhờ một số phép đại số tinh vi, người chứng minh và người xác thực vẫn có thể đánh giá đa thức tại các điểm mà chúng biểu diễn.
-
@@ -70,13 +66,11 @@ Cách mà điều này hoạt động là mở rộng số lượng Blob gắn v
Phân tách người đề xuất khối nhằm để tránh người vận hành nút xác thực phải tạo một cam kết đắt đỏ và chứng minh tân 32MB dữ liệu Blob. Điều này sẽ tạo quá nhiều gánh nặng cho những người Stake tại nhà và buộc họ phải đầu tư vào phần cứng mạnh hơn, từ đó làm tổn hại đến tính phi tập trung. Thay vào đó, các người xây khối chuyên biệt sẽ chịu trách nhiệm cho công việc tính toán tốn kém này. Sau đó, họ cung cấp các khối mà họ xây dựng cho những người đề xuất khối để phát đi. Người đề xuất khối chỉ đơn giản chọn khối nào mang lại lợi nhuận cao nhất. Bất kỳ ai cũng có thể xác minh Blob một cách nhanh chóng và rẻ, nghĩa là bất kỳ nút xác thực bình thường nào cũng có thể kiểm tra được người xây khối có hành xử trung thực hay không. Điều này cho phép xử lý các Blob lớn mà không phải hy sinh tính phi tập trung. Những người xây khối gian lận có thể bị loại khỏi mạng và bị phạt cắt quỹ (Slashed) – sẽ có những người khác thay thế họ vì việc xây dựng khối là một hoạt động sinh lợi.
-
Mẫu dữ liệu khả dụng cần thiết cho các nút xác thực xác minh dữ liệu nhanh và hiệu quả cho dữ liệu Blob. Bằng cách sử dụng lấy mẫu khả dụng dữ liệu, các nút xác thực có thể rất chắc chắn rằng dữ liệu trong Blob đã khả dụng và được cam kết chính xác. Mỗi nút xác thực chỉ cần ngẫu nhiên lấy mẫu một vài điểm dữ liệu và tạo bằng chứng, có nghĩa là không nút xác thực nào phải kiểm tra toàn bộ Blob. Nếu như dữ liệu bị thiếu, sẽ bị phát hiện nhanh chóng và từ chối Blob.
-
### Tiến độ hiện tại {#current-progress}
diff --git a/public/content/translations/vi/roadmap/dencun/index.md b/public/content/translations/vi/roadmap/dencun/index.md
index ece09fe07e4..8756e183856 100644
--- a/public/content/translations/vi/roadmap/dencun/index.md
+++ b/public/content/translations/vi/roadmap/dencun/index.md
@@ -1,6 +1,6 @@
---
-title: Các câu hỏi thường gặp về Cancun-Deneb (Dencun)
-description: Các câu hỏi thường gặp về bản nâng cấp mạng Cancun-Deneb (Dencun)
+title: "Các câu hỏi thường gặp về Cancun-Deneb (Dencun)"
+description: "Các câu hỏi thường gặp về bản nâng cấp mạng Cancun-Deneb (Dencun)"
lang: vi
---
diff --git a/public/content/translations/vi/roadmap/fusaka/index.md b/public/content/translations/vi/roadmap/fusaka/index.md
index d3ff542c675..472f1cb9062 100644
--- a/public/content/translations/vi/roadmap/fusaka/index.md
+++ b/public/content/translations/vi/roadmap/fusaka/index.md
@@ -1,6 +1,6 @@
---
title: Fulu-Osaka (Fusaka)
-description: Tìm hiểu về nâng cấp giao thức Fusaka
+description: "Tìm hiểu về nâng cấp giao thức Fusaka"
lang: vi
---
diff --git a/public/content/translations/vi/roadmap/fusaka/peerdas/index.md b/public/content/translations/vi/roadmap/fusaka/peerdas/index.md
index 14fecf7b64a..661b48a286a 100644
--- a/public/content/translations/vi/roadmap/fusaka/peerdas/index.md
+++ b/public/content/translations/vi/roadmap/fusaka/peerdas/index.md
@@ -1,6 +1,6 @@
---
title: PeerDAS
-description: Tìm hiểu về PeerDAS, một phần của bản nâng cấp giao thức Fusaka Ethereum
+description: "Tìm hiểu về PeerDAS, một phần của bản nâng cấp giao thức Fusaka Ethereum"
lang: vi
---
diff --git a/public/content/translations/vi/roadmap/future-proofing/index.md b/public/content/translations/vi/roadmap/future-proofing/index.md
index 83b985bad1e..a40d557d421 100644
--- a/public/content/translations/vi/roadmap/future-proofing/index.md
+++ b/public/content/translations/vi/roadmap/future-proofing/index.md
@@ -1,6 +1,6 @@
---
-title: Ethereum minh chứng tương lai
-description: Những nâng cấp này củng cố Ethereum như một lớp nền tảng phi tập trung, linh hoạt cho tương lai, bất kể tương lai đó có ra sao.
+title: "Ethereum minh chứng tương lai"
+description: "Những nâng cấp này củng cố Ethereum như một lớp nền tảng phi tập trung, linh hoạt cho tương lai, bất kể tương lai đó có ra sao."
lang: vi
image: /images/roadmap/roadmap-future.png
alt: "Lộ trình Ethereum"
diff --git a/public/content/translations/vi/roadmap/merge/index.md b/public/content/translations/vi/roadmap/merge/index.md
index e9c541db280..e2dbb761eb8 100644
--- a/public/content/translations/vi/roadmap/merge/index.md
+++ b/public/content/translations/vi/roadmap/merge/index.md
@@ -1,14 +1,14 @@
---
title: The Merge
-description: Tìm hiểu thêm về sự kiện hợp nhất - Khi mạng chính Ethereum tiếp nhận bằng chứng cổ phần.
+description: "Tìm hiểu thêm về sự kiện hợp nhất - Khi mạng chính Ethereum tiếp nhận bằng chứng cổ phần."
lang: vi
template: upgrade
image: /images/upgrades/merge.png
alt:
-summaryPoint1: Mạng chính Ethereum sử dụng bằng chứng cổ phần, nhưng trước đây thì không như vậy.
-summaryPoint2: Nâng cấp từ cơ chế bằng chứng công việc sang bằng chứng cổ phần được gọi à sự kiện hợp nhất.
-summaryPoint3: Sự kiện hợp nhất là sự kiện mạng chính Ethereum bắt đầu hợp nhất với chuỗi bằng chứng cổ phần riêng gọi là chuỗi Beacon, bây giờ là một chuỗi thống nhất.
-summaryPoint4: Sự kiện sự kiện hợp nhất giảm ~95,95% năng lượng tiêu thụ của Ethereum.
+summaryPoint1: "Mạng chính Ethereum sử dụng bằng chứng cổ phần, nhưng trước đây thì không như vậy."
+summaryPoint2: "Nâng cấp từ cơ chế bằng chứng công việc sang bằng chứng cổ phần được gọi à sự kiện hợp nhất."
+summaryPoint3: "Sự kiện hợp nhất là sự kiện mạng chính Ethereum bắt đầu hợp nhất với chuỗi bằng chứng cổ phần riêng gọi là chuỗi Beacon, bây giờ là một chuỗi thống nhất."
+summaryPoint4: "Sự kiện sự kiện hợp nhất giảm ~95,95% năng lượng tiêu thụ của Ethereum."
---
@@ -70,7 +70,8 @@ Các hành động quan trọng gồm:
Nếu không hoàn thành hai mục đầu tiên ở trên, nút của bạn sẽ bị xem là “ngoại tuyến” cho đến khi cả hai lớp được đồng bộ và xác thực.
-Nếu không thiết lập `nhận phí`, nút xác thực của bạn vẫn hoạt động bình thường, nhưng bạn sẽ bỏ lỡ phần phí ưu tiên chưa bị đốt và bất kỳ MEV nào mà nút xác thực của bạn có thể kiếm được từ các khối mà nó đề xuất.
+Nếu không thiết lập `nhận phí`, nút xác thực của bạn vẫn hoạt động bình thường, nhưng bạn sẽ bỏ lỡ phần phí ưu tiên chưa bị đốt và bất kỳ MEV nào mà nút xác thực của bạn có thể kiếm được từ các khối mà nó đề xuất.
+
Đây là một số thông tin thêm, hãy xem thêm bài viết của Tim Beiko về Các mà sự kiện hợp nhất tác động lên lớp ứng dụng của Ethereum.
-
## The Merge và mức tiêu thụ năng lượng {#merge-and-energy}
@@ -134,7 +133,6 @@ Việc vận hành một nút không đề xuất là khả thi cho mọi ngư
Khả năng để bất kì ai chạy node của họ là thực sự cần thiết để duy trì tính tập trung mạng Ethereum.
[Thông tin thêm về việc chạy nút của riêng bạn](/run-a-node/)
-
lộ trình tập trung vào rollup, các nỗ lực đang được tập trung vào việc mở rộng hoạt động của người dùng ở [lớp 2](/layer-2/), đồng thời cho phép Mạng chính lớp 1 hoạt động như một lớp thanh toán phi tập trung an toàn được tối ưu hóa để lưu trữ dữ liệu rollup nhằm giúp các giao dịch rollup rẻ hơn theo cấp số nhân. Sự chuyển đổi sang cơ chế bằng chứng cổ phần là một bước tiền đề quan trọng để thực hiện hóa điều này. [Thông tin thêm về gas và phí.](/developers/docs/gas/)
-
- Lượng phát hành từ việc stake chính xác sẽ dao động dựa trên tổng số lượng ETH được stake
- **Kể từ The Merge, chỉ còn lại ~1.700 ETH/ngày, làm giảm tổng lượng phát hành ETH mới khoảng ~88%**
- Đốt: Con số này dao động theo nhu cầu của mạng lưới. _Nếu_ giá gas trung bình đạt ít nhất 16 gwei trong một ngày nhất định, điều này sẽ bù đắp cho khoảng 1.700 ETH được phát hành cho các nút xác thực và đưa mức lạm phát ròng của ETH về không hoặc thấp hơn trong ngày đó.
-
## Trước The Merge (lịch sử) {#pre-merge}
@@ -61,7 +60,10 @@ Tổng cung ETH: **~120.520.000 ETH** (tại thời điểm The Merge vào thán
**~88,7%** lượng phát hành đã thuộc về các thợ đào trên lớp thực thi (4,09 / 4,61 \* 100)
-**~11,3%** đã được phát hành cho những người stake trên lớp đồng thuận (0,52 / 4,61 \* 100)
+**~11,3%** đã được phát hành cho những người stake trên lớp đồng thuận (0,52 / 4,61 \* 100)
+
+
+
## Sau The Merge (hiện tại) {#post-merge}
@@ -92,7 +94,10 @@ Khi có nhiều trình xác thực rút tiền hơn, số lượng trình xác t
Tổng tỷ lệ phát hành hàng năm: **~0,52%**
-Giảm ròng trong việc phát hành ETH hàng năm: **~88,7%** ((4,61% - 0,52%) / 4,61% \* 100)
+Giảm ròng trong việc phát hành ETH hàng năm: **~88,7%** ((4,61% - 0,52%) / 4,61% \* 100)
+
+
+
## Đốt {#the-burn}
@@ -102,7 +107,10 @@ Giảm ròng trong việc phát hành ETH hàng năm: **~88,7%** ((4,61% - 0,52%
-Việc đốt phí đã được triển khai với [bản nâng cấp London](/ethereum-forks/#london) vào tháng 8 năm 2021 và vẫn không thay đổi kể từ The Merge.
+Việc đốt phí đã được triển khai với [bản nâng cấp London](/ethereum-forks/#london) vào tháng 8 năm 2021 và vẫn không thay đổi kể từ The Merge.
+
+
+
Ngoài việc đốt phí được áp dụng bởi bản nâng cấp London, các nút xác thực cũng có thể bị phạt nếu ngoại tuyến, hoặc tệ hơn, họ có thể bị Slashing nếu vi phạm các quy tắc nhất định đe dọa đến an ninh mạng lưới. Các hình phạt này dẫn đến việc giảm ETH trong số dư của nút xác thực, và số ETH đó không được thưởng trực tiếp cho bất kỳ tài khoản nào khác, mà trên thực tế là bị đốt/loại bỏ khỏi lưu thông.
diff --git a/public/content/translations/vi/roadmap/pbs/index.md b/public/content/translations/vi/roadmap/pbs/index.md
index 6fbff574833..8a9326e5a7b 100644
--- a/public/content/translations/vi/roadmap/pbs/index.md
+++ b/public/content/translations/vi/roadmap/pbs/index.md
@@ -1,6 +1,6 @@
---
-title: Phân tách Bên xây dựng-đề xuất
-description: Tìm hiểu làm thế nào và tại sao nút xác thực Ethereum sẽ chia trách nhiệm xây khối và phân tán nó.
+title: "Phân tách Bên xây dựng-đề xuất"
+description: "Tìm hiểu làm thế nào và tại sao nút xác thực Ethereum sẽ chia trách nhiệm xây khối và phân tán nó."
lang: vi
---
@@ -21,7 +21,6 @@ Ví dụ, có thể đưa vào danh sách bắt buộc để khi nút xác thự
Các tổ chức quyền lực có thể gây áp lực buộc nút kiểm duyệt các giao dịch đến hoặc đi từ một số địa chỉ nhất định. Các nút xác thực làm theo bằng cách phát hiện các địa chỉ danh sách đen trong dữ liệu giao dịch và loại bỏ chúng khỏi các khối mà họ đề xuất. Sau khi có PBS, điều này sẽ không còn khả thi nữa vì người đề xuất sẽ không biết những giao dịch nào họ đang phát tán trong khối của mình. Việc kiểm duyệt có thể quan trọng đối với một số cá nhân hoặc ứng dụng, ví dụ khi điều đó trở thành luật pháp ở khu vực của họ. Trong những trường hợp này, sự tuân thủ diễn ra ở cấp độ ứng dụng, trong khi giao thức vẫn giữ tính không cần xin phép và không bị kiểm duyệt.
-
## PBS và MEV {#pbs-and-mev}
@@ -32,7 +31,8 @@ PBS giúp giải quyết các phần đề này bằng cách tái cấu trúc l
-Những cá nhân được khuyến khích Stake thông qua nhóm chung (Pool) thay vì một mình để có thể đạt được phần thưởng cao hơn mà các chiến lược MEV tinh vi mang lại. Việc tách rời quá trình xây dựng khối khỏi việc đề xuất khối đồng nghĩa với việc MEV được khai thác sẽ được phân phối cho nhiều nút xác thực hơn, thay vì tập trung vào những người khai thác MEV hiệu quả nhất. Đồng thời, cho phép người xây khối chuyên biệt tồn tại sẽ giúp gỡ bỏ gánh nặng xây dựng khối khỏi các cá nhân, đồng thời ngăn các cá nhân lấy cắp MEV, trong khi vẫn tối đa hóa số lượng nút cá nhân và độc lập có thể kiểm tra tính trung thực của các khối. Khái niệm quan trọng ở đây là “bất đối xứng giữa người chứng minh và kiểm chứng ("Prover-Verifier Asymmetry"), chỉ rằng việc sản xuất khối tập trung là chấp nhận được miễn là có một mạng lưới người kiểm chứng mạnh mẽ và phi tập trung tối đa để kiểm chứng rằng các khối là trung thực. Phi tập trung là phương tiện, không phải là mục tiêu cuối - những gì chúng ta cần là một khối trung thực.
+Những cá nhân được khuyến khích Stake thông qua nhóm chung (Pool) thay vì một mình để có thể đạt được phần thưởng cao hơn mà các chiến lược MEV tinh vi mang lại. Việc tách rời quá trình xây dựng khối khỏi việc đề xuất khối đồng nghĩa với việc MEV được khai thác sẽ được phân phối cho nhiều nút xác thực hơn, thay vì tập trung vào những người khai thác MEV hiệu quả nhất. Đồng thời, cho phép người xây khối chuyên biệt tồn tại sẽ giúp gỡ bỏ gánh nặng xây dựng khối khỏi các cá nhân, đồng thời ngăn các cá nhân lấy cắp MEV, trong khi vẫn tối đa hóa số lượng nút cá nhân và độc lập có thể kiểm tra tính trung thực của các khối. Khái niệm quan trọng ở đây là “bất đối xứng giữa người chứng minh và kiểm chứng ("Prover-Verifier Asymmetry"), chỉ rằng việc sản xuất khối tập trung là chấp nhận được miễn là có một mạng lưới người kiểm chứng mạnh mẽ và phi tập trung tối đa để kiểm chứng rằng các khối là trung thực. Phi tập trung là phương tiện, không phải là mục tiêu cuối - những gì chúng ta cần là một khối trung thực.
+
## PBS và Danksharding {#pbs-and-danksharding}
diff --git a/public/content/translations/vi/roadmap/pectra/7702/index.md b/public/content/translations/vi/roadmap/pectra/7702/index.md
index 4124f3b8d70..96a607f40c1 100644
--- a/public/content/translations/vi/roadmap/pectra/7702/index.md
+++ b/public/content/translations/vi/roadmap/pectra/7702/index.md
@@ -1,6 +1,6 @@
---
-title: Chỉ dẫn Pectra 7702
-description: Tìm hiểu thêm về 7702 trong bản phát hành Pectra
+title: "Chỉ dẫn Pectra 7702"
+description: "Tìm hiểu thêm về 7702 trong bản phát hành Pectra"
lang: vi
---
@@ -50,10 +50,8 @@ Bằng cách sử dụng các giao diện này, dApp có thể truy cập các c
Để biết thêm thông tin:
-- [Đặc tả ERC-5792]
- (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-5792.md)
-- [Đặc tả ERC-6900]
- (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-6900.md)
+- [Đặc tả ERC-5792](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-5792.md)
+- [Đặc tả ERC-6900](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-6900.md)
**Tránh phụ thuộc vào nhà cung cấp**: theo như đề cập ở trên,một cách triển khai tốt cần trung lập với nhà cung cấp và có khả năng tương tác. Điều này thường có nghĩa là tuân thủ các tiêu chuẩn mới nổi dành cho các tài khoản thông minh Ví dụ,[Tài khoản Modular của Alchemy](https://github.com/alchemyplatform/modular-account) sử dụng tiêu chuẩn ERC-6900 cho các tài khoản thông minh dạng mô-đun và được thiết kế với mục tiêu “sử dụng có khả năng tương tác một cách phi tập trung”.
diff --git a/public/content/translations/vi/roadmap/pectra/index.md b/public/content/translations/vi/roadmap/pectra/index.md
index f63fac8a714..318ba887e00 100644
--- a/public/content/translations/vi/roadmap/pectra/index.md
+++ b/public/content/translations/vi/roadmap/pectra/index.md
@@ -1,6 +1,6 @@
---
title: Prague-Electra (Pectra)
-description: Tìm hiểu về bản nâng cấp giao thức Pectra
+description: "Tìm hiểu về bản nâng cấp giao thức Pectra"
lang: vi
---
diff --git a/public/content/translations/vi/roadmap/pectra/maxeb/index.md b/public/content/translations/vi/roadmap/pectra/maxeb/index.md
index 2f86efbd1a4..b7481d0603c 100644
--- a/public/content/translations/vi/roadmap/pectra/maxeb/index.md
+++ b/public/content/translations/vi/roadmap/pectra/maxeb/index.md
@@ -1,6 +1,6 @@
---
title: Pectra MaxEB
-description: Tìm hiểu thêm về MaxEB trong bản phát hành Pectra
+description: "Tìm hiểu thêm về MaxEB trong bản phát hành Pectra"
lang: vi
---
diff --git a/public/content/translations/vi/roadmap/scaling/index.md b/public/content/translations/vi/roadmap/scaling/index.md
index 4ca609f8125..ff0cb7da537 100644
--- a/public/content/translations/vi/roadmap/scaling/index.md
+++ b/public/content/translations/vi/roadmap/scaling/index.md
@@ -1,6 +1,6 @@
---
-title: Mở rộng Ethereum
-description: Rollups đợt giao dịch với nhau ngoài chuỗi, giảm phí giao dịch cho người dùng. Tuy nhiên, cách Rollups hiện tại sử dụng dữ liệu quả đắt, giới hạn độ rẻ mà giao dịch có thể đạt được. Proto-Danksharding là giải pháp.
+title: "Mở rộng Ethereum"
+description: "Rollups đợt giao dịch với nhau ngoài chuỗi, giảm phí giao dịch cho người dùng. Tuy nhiên, cách Rollups hiện tại sử dụng dữ liệu quả đắt, giới hạn độ rẻ mà giao dịch có thể đạt được. Proto-Danksharding là giải pháp."
lang: vi
image: /images/roadmap/roadmap-transactions.png
alt: "Lộ trình Ethereum"
diff --git a/public/content/translations/vi/roadmap/secret-leader-election/index.md b/public/content/translations/vi/roadmap/secret-leader-election/index.md
index 58a76ac9e55..86b4f861465 100644
--- a/public/content/translations/vi/roadmap/secret-leader-election/index.md
+++ b/public/content/translations/vi/roadmap/secret-leader-election/index.md
@@ -1,6 +1,6 @@
---
-title: Bầu chọn thủ lĩnh bí mật
-description: Giải thích về cách bầu cử lãnh đạo bí mật có thể giúp bảo vệ các trình xác thực khỏi các cuộc tấn công
+title: "Bầu chọn thủ lĩnh bí mật"
+description: "Giải thích về cách bầu cử lãnh đạo bí mật có thể giúp bảo vệ các trình xác thực khỏi các cuộc tấn công"
lang: vi
summaryPoints:
- Địa chỉ IP của những người đề xuất khối có thể được biết trước, khiến họ dễ bị tấn công
diff --git a/public/content/translations/vi/roadmap/security/index.md b/public/content/translations/vi/roadmap/security/index.md
index 20bc2e0f7cb..df4e9c33267 100644
--- a/public/content/translations/vi/roadmap/security/index.md
+++ b/public/content/translations/vi/roadmap/security/index.md
@@ -1,6 +1,6 @@
---
-title: Một Ethereum bảo mật hơn
-description: Ethereum là nền tảng hợp đồng thông minh an toàn và phi tập trung nhất hiện nay. Tuy nhiên, vẫn còn những cải tiến có thể được thực hiện để Ethereum duy trì khả năng chống chịu trước mọi cấp độ tấn công trong tương lai xa.
+title: "Một Ethereum bảo mật hơn"
+description: "Ethereum là nền tảng hợp đồng thông minh an toàn và phi tập trung nhất hiện nay. Tuy nhiên, vẫn còn những cải tiến có thể được thực hiện để Ethereum duy trì khả năng chống chịu trước mọi cấp độ tấn công trong tương lai xa."
lang: vi
image: /images/roadmap/roadmap-security.png
alt: "Lộ trình Ethereum"
diff --git a/public/content/translations/vi/roadmap/single-slot-finality/index.md b/public/content/translations/vi/roadmap/single-slot-finality/index.md
index 948b1e64b1d..9e20d67933f 100644
--- a/public/content/translations/vi/roadmap/single-slot-finality/index.md
+++ b/public/content/translations/vi/roadmap/single-slot-finality/index.md
@@ -1,6 +1,6 @@
---
-title: Chốt chuỗi trong vòng 1 Slot (Single Slot Finality)
-description: Giải thích về chốt chuỗi trong vòng 1 Slot (Single Slot Finality)
+title: "Chốt chuỗi trong vòng 1 Slot (Single Slot Finality)"
+description: "Giải thích về chốt chuỗi trong vòng 1 Slot (Single Slot Finality)"
lang: vi
---
@@ -39,7 +39,8 @@ Cơ chế đồng thuận hiện tại kết hợp các chứng thực từ nhi
Quy trình này cung cấp đủ khả năng để mọi nút xác thực có thể bỏ phiếu trong mỗi chu kỳ, bởi vì `32 Slot * 64 ủy ban * 256 nút xác thực mỗi ủy ban = 524.288 nút xác thực mỗi chu kỳ.`. Tại thời điểm viết bài này (Tháng 2 năm 2023) có ~513.000 nút xác thực hoạt động.
-Trong sơ đồ này, mọi nút xác thực chỉ có thể bỏ phiếu cho khối bằng các phân bổ sự chứng thực của họ trên toàn bộ chu kỳ. Tuy nhiên, có những cách tiềm năng để cải thiện cơ chế để cho phép _mọi nút xác thực có cơ hội chứng thực mỗi Slot_.
+Trong sơ đồ này, mọi nút xác thực chỉ có thể bỏ phiếu cho khối bằng các phân bổ sự chứng thực của họ trên toàn bộ chu kỳ. Tuy nhiên, có những cách tiềm năng để cải thiện cơ chế để cho phép _mọi nút xác thực có cơ hội chứng thực mỗi Slot_.
+
Từ lúc cơ chế đồng thuận Ethereum được thiết kế, sơ đồ tổng hợp chữ ký (BLS) đã được chứng minh là có khả năng mở rộng tốt hơn so với dự đoán ban đầu, đồng thời khả năng xử lý và xác minh chữ ký của các Client đã được cải thiện. Hóa ra việc xử lí sự xác thực từ một lượng nút khổng lồ thực sự có thể làm được trong một Slot. Ví dụ, trong một triệu nút xác thực mỗi người bỏ phiếu 2 lần mỗi Slot, thời gian Slot được điều chỉnh lên 16 giây, nút có nghĩa vụ xác minh chữ ký với tốc độ tối thiểu 125.000 chứng thực mỗi giây để có thể xử lý tất cả 1 triệu chứng thực trong Slot đó. Trên thực tế, một máy tính thông thường tốn 500 nano giây để thực hiện một lần xác minh chữ ký, nghĩa là có thể xử lí 125.000 chữ kí trung ~62.5 mili-giây - thấp hơn nhiều so với ngưỡng một giây.
diff --git a/public/content/translations/vi/roadmap/statelessness/index.md b/public/content/translations/vi/roadmap/statelessness/index.md
index e8e46a1a1ed..ef60d074641 100644
--- a/public/content/translations/vi/roadmap/statelessness/index.md
+++ b/public/content/translations/vi/roadmap/statelessness/index.md
@@ -1,6 +1,6 @@
---
-title: Statelessness, state expiry và history expiry
-description: Giải thích về history expiry và stateless Ethereum
+title: "Statelessness, state expiry và history expiry"
+description: "Giải thích về history expiry và stateless Ethereum"
lang: vi
---
@@ -72,7 +72,8 @@ Mặc dù "weak statelessness" làm thay đổi cách các node Ethereum xác th
"Statelessness" phụ thuộc vào người xây dựng khối duy trì một bản sao của dữ liệu trạng thái đầy đủ để họ có thể tạo ra các "nhân chứng" được sử dụng nhằm xác thực khối. Các node khác không cần truy cập vào dữ liệu trạng thái, vì tất cả thông tin cần thiết để xác thực khối đã có sẵn trong "nhân chứng". Điều này tạo ra tình huống là việc đề xuất một khối rất tốn kém (về tài nguyên), nhưng xác minh khối lại ít tốn kém hơn, ngụ ý rằng sẽ có ít nhà vận hành một node đề xuất khối hơn. Tuy nhiên, việc phân quyền cho các trình đề xuất khối không quá quan trọng, miễn là càng nhiều người tham gia càng tốt, họ đều có thể xác minh một cách độc lập rằng các khối được đề xuất là hợp lệ.
-Đọc thêm trong ghi chú của Dankrad
+Đọc thêm trong ghi chú của Dankrad
+
Các trình đề xuất khối sử dụng dữ liệu trạng thái để tạo ra các "nhân chứng" - tập dữ liệu tối thiểu chứng minh giá trị của các trạng thái đang bị thay đổi bởi các giao dịch trong một khối. Các validator khác không lưu trữ trạng thái, chúng chỉ lưu trữ gốc trạng thái (state root - một mã hash của toàn bộ trạng thái). Các validator nhận được một khối và một "nhân chứng", sau đó sử dụng chúng để cập nhật gốc trạng thái của mình. Điều này làm cho một node xác thực trở nên cực kỳ gọn nhẹ.
diff --git a/public/content/translations/vi/roadmap/user-experience/index.md b/public/content/translations/vi/roadmap/user-experience/index.md
index 67c5b31b9a1..b9f575af7ed 100644
--- a/public/content/translations/vi/roadmap/user-experience/index.md
+++ b/public/content/translations/vi/roadmap/user-experience/index.md
@@ -1,6 +1,6 @@
---
-title: Cải thiện trải nghiệm người dùng
-description: Vẫn là quá phức tạp để phần lớn mọi người sử dụng Ethereum. Để thúc đẩy việc phổ cập, Ethereum cần phải giảm đáng kể những rào cản để tiếp cận - người dùng phải đạt được lợi ích của phi tập trung, không cần cấp quyền và truy cập không kiểm duyệt đến mạng Ethereum nhưng cũng cần dễ sử dụng như dùng một trang web truyền thống.
+title: "Cải thiện trải nghiệm người dùng"
+description: "Vẫn là quá phức tạp để phần lớn mọi người sử dụng Ethereum. Để thúc đẩy việc phổ cập, Ethereum cần phải giảm đáng kể những rào cản để tiếp cận - người dùng phải đạt được lợi ích của phi tập trung, không cần cấp quyền và truy cập không kiểm duyệt đến mạng Ethereum nhưng cũng cần dễ sử dụng như dùng một trang web truyền thống."
lang: vi
image: /images/roadmap/roadmap-ux.png
alt: "Lộ trình Ethereum"
diff --git a/public/content/translations/vi/roadmap/verkle-trees/index.md b/public/content/translations/vi/roadmap/verkle-trees/index.md
index 45cd6962996..a0afae0673f 100644
--- a/public/content/translations/vi/roadmap/verkle-trees/index.md
+++ b/public/content/translations/vi/roadmap/verkle-trees/index.md
@@ -1,6 +1,6 @@
---
-title: Cây Verkle
-description: Bài viết chi tiết miêu tả cây Verkle và cách chúng được dùng để nâng cấp Ethereum
+title: "Cây Verkle"
+description: "Bài viết chi tiết miêu tả cây Verkle và cách chúng được dùng để nâng cấp Ethereum"
lang: vi
summaryPoints:
- Khám phá cây Verkle là gì
@@ -18,7 +18,6 @@ Cây Verkle là một bước quan trọng trên con đường Client Ethereum k
Client Ethereum hiện tại sử dụng cấu trúc dữ liệu được biết đến là cây Merkle-Patricia để chứa dữ liệu trạng thái của nó. Thông tin về mỗi tài khoản được lưu trữ như một lá của một nhánh và một đôi lá được băm liên tục cho đến khi còn một hàm băm thôi. Kết quả băm cuối cùng này được gọi là "Rễ" (Root). Để xác thực một khối, Client Ethereum thực thi tất cả giao dịch trong một khối và nâng cấp trạng thái của nhánh cục bộ. Khối được xem là hợp lệ nếu như rễ của cây cục bộ đồng với kết quả cung cấp bởi người đề xuất khối, bởi vì nếu có bất kì những thay đổi trong tính toán bởi người đề xuất khối và xác thực khối sẽ khiến cho hàm băm rễ khác nhau hoàn toàn. Vấn đề là việc xác thực chuỗi khối này cần mỗi Client lưu trữ toàn bộ trạng thái nhánh của đầu khói và một và khối trước đó (mặc định trong Geth là giữ trạng thái của 128 khối trước đầu chuỗi). Điều này đòi hỏi Client phải có truy cập vào một lượng ổ cứng lớn, là một rào cản cho việc chạy nút toàn bộ rẻ, với phần cứng yếu. Một giải pháp cho vấn đề này là cập nhật cây trạng thái sang một cấu trúc hiệu quả hơn (cây Verkle) có thể được tóm gọn bằng một “tập dữ liệu chứng minh” nhỏ để chia sẻ thay cho toàn bộ dữ liệu trạng thái. Việc định dạng lại dữ liệu trạng thái thành một cây Verkle là bước đệm để tiến tới các Client không trạng thái.
-
## Tập dữ liệu chứng minh là gì tại sao chúng ta cần chúng? {#what-is-a-witness}
@@ -34,7 +33,6 @@ Dưới cơ chế cam kết bằng đa thức, tệp dữ liệu chứng minh c
Dung lượng của tệp dữ liệu chứng minh dựa vào số lượng lá trong đó. Giả sử tệp dữ liệu chứng minh bao gồm 1000 lá, thì một tệp dữ liệu chứng minh cho cây Merkle sẽ có dung lượng khoảng 3,5 Mb (giả sử cây có 7 tầng). Một tệp dữ liệu chứng minh cho cùng dữ liệu đó trong cây Verkle (giả sử cây có 4 tầng) sẽ vào khoảng 150 kB – **nhỏ hơn khoảng 23 lần**. Việc giảm tệp dữ liệu chứng minh cho phép Client không trạng thái có thể rất nhẹ về dung lượng. Đa thức tệp dữ liệu chứng minh có kích thước từ 0,128 - 1 kB, tùy thuộc vào loại cam kết đa thức được sử dụng.
-
## Cấu trúc của cây Verkle là gì? {#what-is-the-structure-of-a-verkle-tree}
diff --git a/public/content/translations/vi/security/index.md b/public/content/translations/vi/security/index.md
index fd21f6bf49d..64ae918fd45 100644
--- a/public/content/translations/vi/security/index.md
+++ b/public/content/translations/vi/security/index.md
@@ -1,6 +1,6 @@
---
-title: Bảo mật Ethereum và chống lừa đảo
-description: Hãy giữ an toàn cho bản thân khi sử dụng Ethereum
+title: "Bảo mật Ethereum và chống lừa đảo"
+description: "Hãy giữ an toàn cho bản thân khi sử dụng Ethereum"
lang: vi
---
diff --git a/public/content/translations/vi/smart-contracts/index.md b/public/content/translations/vi/smart-contracts/index.md
index 692096e5794..3ca58d00fe1 100644
--- a/public/content/translations/vi/smart-contracts/index.md
+++ b/public/content/translations/vi/smart-contracts/index.md
@@ -1,7 +1,7 @@
---
-title: Hợp đồng thông minh
+title: "Hợp đồng thông minh"
metaTitle: "Hợp đồng thông minh: Chúng là gì và lợi ích của chúng"
-description: Giới thiệu phi kỹ thuật về hợp đồng thông minh
+description: "Giới thiệu phi kỹ thuật về hợp đồng thông minh"
lang: vi
---
diff --git a/public/content/translations/vi/social-networks/index.md b/public/content/translations/vi/social-networks/index.md
index ec900d5b0de..0615eb1d2e2 100644
--- a/public/content/translations/vi/social-networks/index.md
+++ b/public/content/translations/vi/social-networks/index.md
@@ -1,14 +1,14 @@
---
-title: Mạng xã hội phi tập trung
-description: Tổng quan về mạng xã hội phi tập trung trên nền tảng Ethereum
+title: "Mạng xã hội phi tập trung"
+description: "Tổng quan về mạng xã hội phi tập trung trên nền tảng Ethereum"
lang: vi
template: use-cases
emoji: ":mega:"
sidebarDepth: 2
image: /images/ethereum-learn.png
-summaryPoint1: Các nền tảng trên blockchain cho việc tương tác xã hội, sáng tạo và phân phối nội dung.
-summaryPoint2: Các mạng xã hội phi tập trung bảo vệ quyền riêng tư của người dùng và nâng cao bảo mật dữ liệu.
-summaryPoint3: Token và NFT tạo ra nhiều cách mới để kiếm tiền từ việc sáng tạo nội dung.
+summaryPoint1: "Các nền tảng trên blockchain cho việc tương tác xã hội, sáng tạo và phân phối nội dung."
+summaryPoint2: "Các mạng xã hội phi tập trung bảo vệ quyền riêng tư của người dùng và nâng cao bảo mật dữ liệu."
+summaryPoint3: "Token và NFT tạo ra nhiều cách mới để kiếm tiền từ việc sáng tạo nội dung."
---
Mạng xã hội đóng một vai trò quan trọng trong viêc liên lạc và giao tiếp thường ngày. Tuy nhiên, sự kiểm soát tập trung của các nền tảng này đã tạo ra nhiều vấn đề: rò rỉ dữ liệu, quá tải server, chặn tài khoản, kiểm duyệt nội dung, và vi phạm riêng tư là một vài trong số nhiều đánh đổi mà mạng xã hội thường làm. Để đấu tranh những vấn đề này, các nhà phát triển đang xây dựng nhiều mạng xã hội trên Ethereum. Mạng xã hội phi tập trung có thể sửa chữa nhiều vấn đề của các nền tảng mạng xã hội truyền thống và cải thiện trải nghiệm chung của người dùng.
diff --git a/public/content/translations/vi/staking/dvt/index.md b/public/content/translations/vi/staking/dvt/index.md
index ad1b8b31ed7..48664c29320 100644
--- a/public/content/translations/vi/staking/dvt/index.md
+++ b/public/content/translations/vi/staking/dvt/index.md
@@ -1,6 +1,6 @@
---
-title: Công nghệ xác thực phân tán
-description: Công nghệ xác thực phân tán cho phép nhiều bên tham gia hoạt động phân tán một nút xác thực Ethereum.
+title: "Công nghệ xác thực phân tán"
+description: "Công nghệ xác thực phân tán cho phép nhiều bên tham gia hoạt động phân tán một nút xác thực Ethereum."
lang: vi
---
diff --git a/public/content/translations/vi/staking/pools/index.md b/public/content/translations/vi/staking/pools/index.md
index 68f8a1978e7..7cf9dc205ea 100644
--- a/public/content/translations/vi/staking/pools/index.md
+++ b/public/content/translations/vi/staking/pools/index.md
@@ -1,11 +1,11 @@
---
title: Staking chung
-description: Tìm hiểu thêm về bể cổ phần
+description: "Tìm hiểu thêm về bể cổ phần"
lang: vi
template: staking
emoji: ":money_with_wings:"
image: /images/staking/leslie-pool.png
-alt: Chú tê giác Leslie đang bơi trong bể.
+alt: "Chú tê giác Leslie đang bơi trong bể."
sidebarDepth: 2
summaryPoints:
- Đặc 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
@@ -68,14 +68,16 @@ Ngay bây giờ! Nâng cấp mạng lưới Shanghai/Capella diễn ra vào thá
Ngoài ra, các nhóm đặt cọc sử dụng token đặt cọc ERC-20 cho phép người dùng giao dịch token này trên thị trường mở, giúp bạn bán vị thế đặt cọc, qua đó "rút" một cách hiệu quả mà không cần thực sự rút ETH khỏi hợp đồng đặt cọc.
-Tìm hiểu thêm về rút tiền đặt cọc
+Tìm hiểu thêm về rút tiền đặt cọc
+
Có nhiều điểm tương đồng giữa các tùy chọn đặt cọc theo nhóm này và các sàn giao dịch tập trung, chẳng hạn như khả năng đặt cọc một lượng nhỏ ETH và chúng được gộp lại với nhau để kích hoạt nút xác thực.
Không giống như các sàn giao dịch tập trung, nhiều hình thức đặt cọc theo nhóm khác tận dụng hợp đồng thông minh và/hoặc token đặt cọc. Đây thường là các token ERC-20, bạn có thể tự lưu trữ trong ví cá nhân và mua bán chúng dễ dàng trên thị trường, giống như mọi token khác. Điều này cung cấp một lớp chủ quyền và bảo mật bằng cách cho phép bạn kiểm soát các token của mình, nhưng vẫn không cung cấp cho bạn quyền kiểm soát trực tiếp đối với máy khách xác thực chứng thực thay mặt bạn trong nền.
-Một số tùy chọn góp theo nhóm phi tập trung hơn những tùy chọn khác khi nói đến các nút hỗ trợ chúng. Nhằm gia tăng tính bảo mật và phi tập trung cho mạng lưới, người đặt cọc nên ưu tiên chọn dịch vụ theo nhóm cho phép nhiều người vận hành nút phi tập trung tham gia mà không cần quyền.
+Một số tùy chọn góp theo nhóm phi tập trung hơn những tùy chọn khác khi nói đến các nút hỗ trợ chúng. Nhằm gia tăng tính bảo mật và phi tập trung cho mạng lưới, người đặt cọc nên ưu tiên chọn dịch vụ theo nhóm cho phép nhiều người vận hành nút phi tập trung tham gia mà không cần quyền.
+
## Đọc thêm {#further-reading}
diff --git a/public/content/translations/vi/staking/saas/index.md b/public/content/translations/vi/staking/saas/index.md
index 48c07af6626..e2da92bc6a0 100644
--- a/public/content/translations/vi/staking/saas/index.md
+++ b/public/content/translations/vi/staking/saas/index.md
@@ -1,11 +1,11 @@
---
-title: Đặt cọc như là một dịch vụ
-description: Tìm hiểu thêm về dịch vụ đặt cọc
+title: "Đặt cọc như là một dịch vụ"
+description: "Tìm hiểu thêm về dịch vụ đặt cọc"
lang: vi
template: staking
emoji: ":money_with_wings:"
image: /images/staking/leslie-saas.png
-alt: Tê giác Leslie lơ lửng giữa những đám mây.
+alt: "Tê giác Leslie lơ lửng giữa những đám mây."
sidebarDepth: 2
summaryPoints:
- Người vận hành nút bên thứ ba xử lý hoạt động của ứng dụng khách xác thực của bạn
@@ -70,21 +70,24 @@ Cập nhật thông tin xác thực rút tiền là bước bắt buộc để k
Hãy chắc chắn rằng bạn sao lưu cụm từ khởi tạo này một cách an toàn, nếu không bạn sẽ không thể tạo khóa rút tiền của mình khi cần.
-\*Những người đặt cọc đã cung cấp địa chỉ rút tiền khi gửi tiền lần đầu không cần phải thiết lập mục này. Hãy kiểm tra với nhà cung cấp dịch vụ SaaS của bạn để biết hướng dẫn về cách thức chuẩn bị validator của bạn.
+\*Những người đặt cọc đã cung cấp địa chỉ rút tiền khi gửi tiền lần đầu không cần phải thiết lập mục này. Hãy kiểm tra với nhà cung cấp dịch vụ SaaS của bạn để biết hướng dẫn về cách thức chuẩn bị validator của bạn.
+
Những người đặt cọc cần phải cung cấp địa chỉ rút tiền (nếu chưa cung cấp khi gửi tiền ban đầu), và phần thưởng sẽ bắt đầu được phân phối tự động theo định kỳ vài ngày một lần.
Nút xác thực cũng có thể hoàn toàn rời khỏi vai trò nút xác thực, dẫn đến số dư ETH còn lại được mở khóa để rút. Tài khoản đã cung cấp địa chỉ rút tiền trên lớp thực thi và hoàn thành quy trình thoát sẽ nhận được toàn bộ số dư vào địa chỉ rút đã cung cấp trong lần quét nút xác thực tiếp theo.
-Tìm hiểu thêm về rút tiền đặt cọc
+Tìm hiểu thêm về rút tiền đặt cọc
+
Bằng cách sử dụng nhà cung cấp SaaS, bạn đang ủy thác việc vận hành nút của mình cho người khác. Điều này đi kèm với nguy cơ hiệu suất nút kém, không nằm trong tầm kiểm soát của bạn. Trong trường hợp nút xác thực của bạn bị cắt giảm, số dư nút xác thực của bạn sẽ bị phạt và buộc bị gỡ khỏi nhóm nút xác thực.
Sau khi hoàn thành quá trình cắt giảm/thoát, số tiền này sẽ được chuyển đến địa chỉ rút tiền được gán cho nút xác thực. Để kích hoạt tính năng này, bạn cần cung cấp địa chỉ rút tiền. Bạn có thể đã cung cấp địa chỉ này khi đặt cọc ban đầu. Nếu chưa, bạn cần sử dụng khóa rút tiền nút xác thực để ký một tin nhắn xác định địa chỉ rút tiền. Nếu không cung cấp địa chỉ rút tiền, số tiền sẽ vẫn bị khóa cho đến khi bạn thực hiện thao tác này.
-Vui lòng liên hệ với nhà cung cấp dịch vụ SaaS để biết thêm chi tiết về chính sách bảo lãnh hoặc tùy chọn bảo hiểm, cũng như cách thức cung cấp địa chỉ rút tiền. Nếu bạn muốn hoàn toàn kiểm soát việc thiết lập trình xác thực của mình, [hãy tìm hiểu thêm về cách tự staking ETH của bạn](/staking/solo/).
+Vui lòng liên hệ với nhà cung cấp dịch vụ SaaS để biết thêm chi tiết về chính sách bảo lãnh hoặc tùy chọn bảo hiểm, cũng như cách thức cung cấp địa chỉ rút tiền. Nếu bạn muốn hoàn toàn kiểm soát việc thiết lập trình xác thực của mình, [hãy tìm hiểu thêm về cách tự staking ETH của bạn](/staking/solo/).
+
## Đọc thêm {#further-reading}
diff --git a/public/content/translations/vi/staking/solo/index.md b/public/content/translations/vi/staking/solo/index.md
index f711c6d8fc9..8f220ffbb84 100644
--- a/public/content/translations/vi/staking/solo/index.md
+++ b/public/content/translations/vi/staking/solo/index.md
@@ -1,11 +1,11 @@
---
-title: Tự Stake ETH
-description: Đây là khái quát về việc làm sao để bắt đầu Stake ETH tại nhà
+title: "Tự Stake ETH"
+description: "Đây là khái quát về việc làm sao để bắt đầu Stake ETH tại nhà"
lang: vi
template: staking
emoji: ":money_with_wings:"
image: /images/staking/leslie-solo.png
-alt: Tê giác Leslie trên chip máy tính riêng.
+alt: "Tê giác Leslie trên chip máy tính riêng."
sidebarDepth: 2
summaryPoints:
- Tận hưởng phần thưởng tối đa trực tiếp từ giao thức khi bạn duy trì nút xác thực hoạt động đúng cách và trực tuyến
@@ -43,17 +43,20 @@ Dù chúng tôi rất mong muốn việc đặt cược tại nhà có thể d
Khi vận hành nút của riêng mình, bạn nên dành thời gian để tìm hiểu cách sử dụng phần mềm mình đã chọn. Điều này bao gồm việc đọc các tài liệu liên quan và theo dõi các kênh liên lạc của các nhóm phát triển đó.
-Bạn càng hiểu rõ về phần mềm mình đang chạy và cách thức hoạt động của bằng chứng cổ phần, thì rủi ro với tư cách là người đặt cược sẽ càng thấp, và việc khắc phục bất kỳ sự cố nào có thể phát sinh trong quá trình vận hành nút sẽ càng dễ dàng hơn.
+Bạn càng hiểu rõ về phần mềm mình đang chạy và cách thức hoạt động của bằng chứng cổ phần, thì rủi ro với tư cách là người đặt cược sẽ càng thấp, và việc khắc phục bất kỳ sự cố nào có thể phát sinh trong quá trình vận hành nút sẽ càng dễ dàng hơn.
+
Việc thiết lập nút đòi hỏi một mức độ thoải mái hợp lý khi làm việc với máy tính, mặc dù các công cụ mới đang giúp việc này trở nên dễ dàng hơn theo thời gian. Hiểu biết về giao diện dòng lệnh là một lợi thế, nhưng không còn là yêu cầu bắt buộc.
-Nó cũng đòi hỏi thiết lập phần cứng rất cơ bản và một số hiểu biết về các thông số kỹ thuật tối thiểu được đề xuất.
+Nó cũng đòi hỏi thiết lập phần cứng rất cơ bản và một số hiểu biết về các thông số kỹ thuật tối thiểu được đề xuất.
+
Cũng giống như cách khóa riêng tư bảo mật địa chỉ Ethereum của bạn, bạn sẽ cần tạo các khóa dành riêng cho trình xác thực của mình. Bạn phải hiểu cách giữ an toàn và bảo mật mọi cụm từ hạt giống hoặc khóa riêng tư.{' '}
-[Bảo mật Ethereum và phòng chống lừa đảo](/security/)
+[Bảo mật Ethereum và phòng chống lừa đảo](/security/)
+
Phần cứng đôi khi bị lỗi, kết nối mạng bị ngắt và phần mềm máy khách đôi khi cần nâng cấp. Việc bảo trì nút là không thể tránh khỏi và đôi khi sẽ cần đến sự chú ý của bạn. Bạn sẽ muốn đảm bảo rằng mình nhận biết được mọi bản nâng cấp mạng dự kiến hoặc các bản nâng cấp máy khách quan trọng khác.
@@ -66,7 +69,9 @@ Phần thưởng của bạn tỷ lệ thuận với thời gian trình xác th
Khác với các hình phạt do không hoạt động khi ngoại tuyến, cắt giảm là một hình phạt nghiêm trọng hơn nhiều dành cho các hành vi độc hại. Bằng cách chạy một máy khách thiểu số với các khóa của bạn được tải trên một máy duy nhất tại một thời điểm, rủi ro bị cắt giảm của bạn sẽ được giảm thiểu. Điều đó nói lên rằng, tất cả những người đặt cược phải nhận thức được những rủi ro của việc bị cắt giảm.
-Thông tin thêm về việc cắt giảm và vòng đời của trình xác thực
+Thông tin thêm về việc cắt giảm và vòng đời của trình xác thực
+
+
@@ -125,7 +130,6 @@ Bạn có đề xuất về một công cụ đặt cọc mà chúng tôi còn t
Một trình xác thực là một thực thể ảo tồn tại trên Ethereum và tham gia vào sự đồng thuận của giao thức Ethereum. Các trình xác thực được đại diện bởi một số dư, khóa công khai và các thuộc tính khác. Một máy khách trình xác thực là phần mềm hoạt động thay mặt cho trình xác thực bằng cách giữ và sử dụng khóa riêng tư của nó. Một máy khách trình xác thực duy nhất có thể giữ nhiều cặp khóa, kiểm soát nhiều trình xác thực.
-
@@ -137,14 +141,16 @@ Mức đệm này cũng ngăn không cho số dư hiệu quả bị giảm xuố
Mỗi cặp khóa được liên kết với một trình xác thực yêu cầu ít nhất 32 ETH để được kích hoạt. Bất kỳ số dư nào trên mức này đều có thể được rút về địa chỉ rút tiền được liên kết bất kỳ lúc nào thông qua một giao dịch được ký bởi địa chỉ này. Bất kỳ khoản tiền nào vượt quá số dư hiệu dụng tối đa sẽ tự động được rút theo định kỳ.
-Nếu việc đặt cược tại nhà có vẻ quá đòi hỏi đối với bạn, hãy cân nhắc sử dụng nhà cung cấp [đặt cược dưới dạng dịch vụ](/staking/saas/), hoặc nếu bạn đang làm việc với ít hơn 32 ETH, hãy xem các [bể đặt cược](/staking/pools/).
+Nếu việc đặt cược tại nhà có vẻ quá đòi hỏi đối với bạn, hãy cân nhắc sử dụng nhà cung cấp [đặt cược dưới dạng dịch vụ](/staking/saas/), hoặc nếu bạn đang làm việc với ít hơn 32 ETH, hãy xem các [bể đặt cược](/staking/pools/).
+
Việc ngoại tuyến khi mạng lưới đang hoàn tất đúng cách sẽ KHÔNG dẫn đến việc bị cắt giảm. Các hình phạt nhỏ do không hoạt động sẽ được áp dụng nếu trình xác thực của bạn không có mặt để chứng thực cho một kỷ nguyên nhất định (mỗi kỷ nguyên dài 6,4 phút), nhưng điều này rất khác với cắt giảm. Các hình phạt này ít hơn một chút so với phần thưởng bạn có thể kiếm được nếu trình xác thực có mặt để chứng thực, và các khoản lỗ có thể được bù lại với khoảng thời gian trực tuyến trở lại tương đương.
Lưu ý rằng hình phạt vì không hoạt động sẽ phụ thuộc vào số lượng trình xác thực ngoại tuyến cùng lúc. Trong trường hợp phần lớn mạng lưới ngoại tuyến cùng một lúc, hình phạt cho mỗi trình xác thực sẽ nặng hơn so với trường hợp chỉ có một trình xác thực không hoạt động.
-Trong các trường hợp cực đoan, nếu mạng lưới ngừng hoàn tất do có hơn một phần ba số trình xác thực ngoại tuyến, những người dùng này sẽ phải chịu cái được gọi là rò rỉ do không hoạt động theo cấp số nhân, đây là một sự hao hụt ETH theo cấp số nhân từ các tài khoản trình xác thực ngoại tuyến. Điều này cho phép mạng lưới tự phục hồi bằng cách đốt ETH của các trình xác thực không hoạt động cho đến khi số dư của chúng đạt 16 ETH, lúc đó chúng sẽ tự động bị loại khỏi nhóm trình xác thực. Cuối cùng, các trình xác thực trực tuyến còn lại sẽ chiếm hơn 2/3 mạng lưới một lần nữa, đáp ứng được số phiếu siêu đa số cần thiết để một lần nữa hoàn tất chuỗi.
+Trong các trường hợp cực đoan, nếu mạng lưới ngừng hoàn tất do có hơn một phần ba số trình xác thực ngoại tuyến, những người dùng này sẽ phải chịu cái được gọi là rò rỉ do không hoạt động theo cấp số nhân, đây là một sự hao hụt ETH theo cấp số nhân từ các tài khoản trình xác thực ngoại tuyến. Điều này cho phép mạng lưới tự phục hồi bằng cách đốt ETH của các trình xác thực không hoạt động cho đến khi số dư của chúng đạt 16 ETH, lúc đó chúng sẽ tự động bị loại khỏi nhóm trình xác thực. Cuối cùng, các trình xác thực trực tuyến còn lại sẽ chiếm hơn 2/3 mạng lưới một lần nữa, đáp ứng được số phiếu siêu đa số cần thiết để một lần nữa hoàn tất chuỗi.
+
Tóm lại, điều này không bao giờ có thể được đảm bảo hoàn toàn, nhưng nếu bạn hành động một cách thiện chí, chạy một máy khách thiểu số và chỉ giữ các khóa ký của mình trên một máy tại một thời điểm, nguy cơ bị cắt giảm là gần như bằng không.
@@ -166,14 +172,16 @@ Các máy khách riêng lẻ có thể khác nhau một chút về hiệu suất
Vì tất cả các máy khách sản xuất đều cung cấp chức năng cơ bản giống nhau, điều thực sự quan trọng là bạn phải chọn một máy khách thiểu số, nghĩa là bất kỳ máy khách nào KHÔNG được đa số các trình xác thực trên mạng lưới sử dụng. Điều này nghe có vẻ phản trực giác, nhưng việc chạy một máy khách đa số hoặc siêu đa số sẽ khiến bạn có nguy cơ bị cắt giảm cao hơn trong trường hợp có lỗi trong máy khách đó. Chạy một máy khách thiểu số giúp giảm đáng kể những rủi ro này.
-Tìm hiểu thêm về lý do tại sao sự đa dạng của máy khách lại quan trọng
+Tìm hiểu thêm về lý do tại sao sự đa dạng của máy khách lại quan trọng
+
Mặc dù một máy chủ riêng ảo (VPS) có thể được sử dụng để thay thế cho phần cứng tại nhà, nhưng quyền truy cập vật lý và vị trí của máy khách trình xác thực của bạn thực sự quan trọng. Các giải pháp đám mây tập trung như Amazon Web Services hoặc Digital Ocean cho phép sự tiện lợi của việc không phải mua và vận hành phần cứng, với cái giá là tập trung hóa mạng lưới.
Càng nhiều máy khách trình xác thực chạy trên một giải pháp lưu trữ đám mây tập trung duy nhất, thì càng trở nên nguy hiểm hơn cho những người dùng này. Bất kỳ sự kiện nào khiến các nhà cung cấp này ngoại tuyến, cho dù là do một cuộc tấn công, yêu cầu pháp lý, hoặc chỉ là mất điện/internet, sẽ dẫn đến việc mọi máy khách trình xác thực phụ thuộc vào máy chủ này đều ngoại tuyến cùng một lúc.
-Hình phạt vì ngoại tuyến phụ thuộc vào số lượng nút xác thực khác đang ngoại tuyến cùng một lúc. Sử dụng VPS làm tăng đáng kể nguy cơ làm cho hình phạt vì ngoại tuyến trở nên nghiêm trọng hơn, đồng thời tăng nguy cơ rò rỉ theo cấp số nhân hoặc cắt giảm nếu sự cố ngừng chạy đủ lớn. Để giảm thiểu rủi ro cho chính bạn và cho cả mạng lưới, người dùng được khuyến khích mạnh mẽ để mua và vận hành phần cứng của riêng mình.
+Hình phạt vì ngoại tuyến phụ thuộc vào số lượng nút xác thực khác đang ngoại tuyến cùng một lúc. Sử dụng VPS làm tăng đáng kể nguy cơ làm cho hình phạt vì ngoại tuyến trở nên nghiêm trọng hơn, đồng thời tăng nguy cơ rò rỉ theo cấp số nhân hoặc cắt giảm nếu sự cố ngừng chạy đủ lớn. Để giảm thiểu rủi ro cho chính bạn và cho cả mạng lưới, người dùng được khuyến khích mạnh mẽ để mua và vận hành phần cứng của riêng mình.
+
@@ -185,7 +193,8 @@ Sau khi thiết lập thông tin xác thực rút tiền, các khoản thanh to
Để mở khóa và nhận lại toàn bộ số tiền của bạn, bạn cũng phải hoàn tất quá trình thoát nút xác thực.
-Tìm hiểu thêm về rút tiền đặt cọc
+Tìm hiểu thêm về rút tiền đặt cọc
+
## Đọc thêm {#further-reading}
diff --git a/public/content/translations/vi/staking/withdrawals/index.md b/public/content/translations/vi/staking/withdrawals/index.md
index 006eecb0cd7..96515086a6e 100644
--- a/public/content/translations/vi/staking/withdrawals/index.md
+++ b/public/content/translations/vi/staking/withdrawals/index.md
@@ -1,10 +1,10 @@
---
-title: Rút tài sản đặt cược
-description: Trang tóm tắt về rút tiền đẩy đặt cược là gì, cách chúng hoạt động và những gì người góp cổ phần cần làm để nhận được phần thưởng
+title: "Rút tài sản đặt cược"
+description: "Trang tóm tắt về rút tiền đẩy đặt cược là gì, cách chúng hoạt động và những gì người góp cổ phần cần làm để nhận được phần thưởng"
lang: vi
template: staking
image: /images/staking/leslie-withdrawal.png
-alt: Tê giác Leslie và phần thưởng đặt cọc
+alt: "Tê giác Leslie và phần thưởng đặt cọc"
sidebarDepth: 2
summaryPoints:
- Bản nâng cấp Shanghai/Capella cho phép rút đặt cọc trên Ethereum
@@ -42,7 +42,8 @@ Cung cấp địa chỉ rút tiền là bước bắt buộc đối với tất
-Mỗi tài khoản nút xác thực chỉ có thể được gán một địa chỉ rút tiền duy nhất, một lần. Sau khi một địa chỉ được chọn và gửi lên lớp đồng thuận, địa chỉ này không thể được hoàn tác hoặc thay đổi lại. Hãy kiểm tra kỹ quyền sở hữu và độ chính xác của địa chỉ được cung cấp trước khi gửi.
+
+Mỗi tài khoản nút xác thực chỉ có thể được gán một địa chỉ rút tiền duy nhất, một lần. Sau khi một địa chỉ được chọn và gửi lên lớp đồng thuận, địa chỉ này không thể được hoàn tác hoặc thay đổi lại. Hãy kiểm tra kỹ quyền sở hữu và độ chính xác của địa chỉ được cung cấp trước khi gửi.
@@ -137,7 +138,8 @@ title="Sau khi tôi đã cung cấp địa chỉ rút tiền, tôi có thể đ
eventCategory="FAQ"
eventAction="Once I have provided a withdrawal address, can I change it to an alternative withdrawal address?"
eventName="read more">
-Không, quy trình cung cấp thông tin xác thực rút tiền là một quy trình một lần và không thể thay đổi sau khi đã gửi.
+Không, quy trình cung cấp thông tin xác thực rút tiền là một quy trình một lần và không thể thay đổi sau khi đã gửi.
+
+Thay vì thay đổi địa chỉ rút tiền cho từng nút xác thực, người dùng có thể thiết lập hợp đồng thông minh làm địa chỉ rút tiền. Loại hợp đồng này có khả năng xử lý xoay vòng khóa, ví dụ như Safe. Đối với những người dùng thiết lập rút tiền về EOA riêng, họ có thể thực hiện thoát hoàn toàn để rút tất cả tiền đã góp và sau đó đặt cọc lại bằng thông tin xác thực mới.
+
Nếu bạn tham gia [nhóm đặt cọc](/staking/pools/) hoặc nắm giữ token đặt cọc, bạn nên kiểm tra với nhà cung cấp của mình để biết thêm chi tiết về cách xử lý việc rút tiền đặt cọc, vì mỗi dịch vụ hoạt động khác nhau.
Nhìn chung, người dùng cần được đảm bảo quyền rút lại ETH gốc đã góp hoặc thay đổi nhà cung cấp góp cổ phần mà họ sử dụng. Ví dụ, nếu một nhóm góp cổ phần nào đó trở nên quá lớn, bạn có thể thoát, đổi thưởng và đặt cọc lại với một nhà cung cấp nhỏ hơn. Hoặc, nếu bạn đã tích lũy đủ ETH, bạn có thể [đặt cọc tại nhà](/staking/solo/).
-
-Có, miễn là nút xác thực của bạn đã cung cấp một địa chỉ rút tiền. Địa chỉ này phải được cung cấp một lần để thực hiện bất kỳ lệnh rút tiền ban đầu nào, sau đó các khoản thanh toán phần thưởng sẽ được tự động kích hoạt vài ngày một lần với mỗi đợt quét nút xác thực.
+Có, miễn là nút xác thực của bạn đã cung cấp một địa chỉ rút tiền. Địa chỉ này phải được cung cấp một lần để thực hiện bất kỳ lệnh rút tiền ban đầu nào, sau đó các khoản thanh toán phần thưởng sẽ được tự động kích hoạt vài ngày một lần với mỗi đợt quét nút xác thực.
+
Không, nếu nút xác thực của bạn vẫn hoạt động trên mạng lưới, thì sẽ không tự động rút toàn bộ tiền. Thao tác này yêu cầu khởi chạy thủ công bằng lệnh thoát tự nguyện.
Sau khi nút xác thực hoàn tất quá trình thoát và tài khoản có thông tin xác thực rút tiền, số dư còn lại sau đó sẽ được tự động rút trong lần quét nút xác thực kế tiếp.
-
Việc rút tiền được thiết kế để được đẩy tự động, chuyển bất kỳ ETH nào không đóng góp tích cực vào việc đặt cọc. Lệnh rút tự động này sẽ bao gồm toàn bộ số dư của các tài khoản đã hoàn thành quá trình thoát.
-Người dùng không thể yêu cầu rút thủ công một số tiền ETH cụ thể.
+Người dùng không thể yêu cầu rút thủ công một số tiền ETH cụ thể.
+
Các nhà điều hành nút xác thực được khuyến nghị truy cập trang Rút tiền trên Staking Launchpad để biết thêm chi tiết về cách chuẩn bị nút xác thực để rút tiền, thời gian diễn ra sự kiện và nhiều thông tin hơn về cách thức hoạt động của chức năng rút tiền.
Để thử thiết lập của bạn trên một mạng thử nghiệm trước, hãy truy cập Staking Launchpad của Mạng thử nghiệm Hoodi để bắt đầu.
-
-Không. Sau khi nút xác thực đã thoát và rút toàn bộ số dư, bất kỳ khoản tiền nào gửi thêm vào nút xác thực đó sẽ tự động được chuyển đến địa chỉ rút tiền trong lần quét nút xác thực tiếp theo. Để góp lại ETH, cần phải kích hoạt một nút xác thực mới.
+Không. Sau khi nút xác thực đã thoát và rút toàn bộ số dư, bất kỳ khoản tiền nào gửi thêm vào nút xác thực đó sẽ tự động được chuyển đến địa chỉ rút tiền trong lần quét nút xác thực tiếp theo. Để góp lại ETH, cần phải kích hoạt một nút xác thực mới.
+
## Đọc thêm {#further-reading}
diff --git a/public/content/translations/vi/web3/index.md b/public/content/translations/vi/web3/index.md
index c36857364db..6cc8f6e0e23 100644
--- a/public/content/translations/vi/web3/index.md
+++ b/public/content/translations/vi/web3/index.md
@@ -1,6 +1,6 @@
---
-title: Web3 là gì và tại sao nó quan trọng?
-description: Giới thiệu về Web3 — sự phát triển tiếp theo của World Wide Web — và tại sao nó lại quan trọng.
+title: "Web3 là gì và tại sao nó quan trọng?"
+description: "Giới thiệu về Web3 — sự phát triển tiếp theo của World Wide Web — và tại sao nó lại quan trọng."
lang: vi
---
@@ -69,7 +69,8 @@ Web3 cho phép quyền sở hữu trực tiếp thông qua [token không thể t
- Tìm hiểu thêm về NFT
+ Tìm hiểu thêm về NFT
+
Tìm hiểu thêm về NFT
@@ -97,7 +98,8 @@ Tuy nhiên, mọi người định nghĩa nhiều cộng đồng Web3 là DAO. C
- Tìm hiểu thêm về DAOs
+ Tìm hiểu thêm về DAOs
+
Tìm hiểu thêm về DAO
diff --git a/public/content/translations/vi/what-are-apps/index.md b/public/content/translations/vi/what-are-apps/index.md
index 57e28720539..9870cba8de6 100644
--- a/public/content/translations/vi/what-are-apps/index.md
+++ b/public/content/translations/vi/what-are-apps/index.md
@@ -1,14 +1,14 @@
---
-title: Ứng dụng của Ethereum
-metaTitle: Ứng dụng trên Ethereum | Các ứng dụng phi tập trung trên Ethereum
-description: Các ứng dụng trên Ethereum là miễn phí, mang tính toàn cầu và sử dụng mạng chuỗi khối thay vì những máy chủ bảo mật được đặt tại các công ty. Điều ấy có nghĩa là bạn có thể sử dụng cùng một tài khoản ở mọi dự án mà vẫn bảo toàn được danh tính.
+title: "Ứng dụng của Ethereum"
+metaTitle: "Ứng dụng trên Ethereum | Các ứng dụng phi tập trung trên Ethereum"
+description: "Các ứng dụng trên Ethereum là miễn phí, mang tính toàn cầu và sử dụng mạng chuỗi khối thay vì những máy chủ bảo mật được đặt tại các công ty. Điều ấy có nghĩa là bạn có thể sử dụng cùng một tài khoản ở mọi dự án mà vẫn bảo toàn được danh tính."
lang: vi
template: use-cases
emoji: ":handshake:"
sidebarDepth: 2
showDropdown: false
image: /images/doge-computer.png
-summary: Các ứng dụng trên Ethereum là miễn phí, mang tính toàn cầu và sử dụng mạng chuỗi khối thay vì những máy chủ bảo mật được đặt tại các công ty. Điều ấy có nghĩa là bạn có thể sử dụng cùng một tài khoản ở mọi dự án mà vẫn bảo toàn được danh tính.
+summary: "Các ứng dụng trên Ethereum là miễn phí, mang tính toàn cầu và sử dụng mạng chuỗi khối thay vì những máy chủ bảo mật được đặt tại các công ty. Điều ấy có nghĩa là bạn có thể sử dụng cùng một tài khoản ở mọi dự án mà vẫn bảo toàn được danh tính."
---
## Những ứng dụng có năng lực vượt trội {#apps-with-superpowers}
@@ -51,7 +51,6 @@ Các ứng dụng được vận hành bởi hợp đồng thông minh - đoạn

-
## Ứng dụng chạy trên Ethereum như là những miếng xếp hình vậy {#ethereum-apps-are-like-legos}
diff --git a/public/content/translations/vi/whitepaper/index.md b/public/content/translations/vi/whitepaper/index.md
index 82102dc1880..2284e022b72 100644
--- a/public/content/translations/vi/whitepaper/index.md
+++ b/public/content/translations/vi/whitepaper/index.md
@@ -1,6 +1,6 @@
---
-title: Sách trắng Ethereum
-description: Bản giới thiệu về Ethereum, xuất bản vào năm 2013 trước khi dự án được ra mắt.
+title: "Sách trắng Ethereum"
+description: "Bản giới thiệu về Ethereum, xuất bản vào năm 2013 trước khi dự án được ra mắt."
lang: vi
sidebarDepth: 2
hideEditButton: true
diff --git a/public/content/translations/vi/wrapped-eth/index.md b/public/content/translations/vi/wrapped-eth/index.md
index b8d4f714df8..b75f54ee0c0 100644
--- a/public/content/translations/vi/wrapped-eth/index.md
+++ b/public/content/translations/vi/wrapped-eth/index.md
@@ -1,6 +1,6 @@
---
-title: Ether được bọc (WETH) là gì
-description: Một giới thiệu về Ether được bọc (WETH) - Một dạng "bọc" Ether (ETH) chuẩn ERC20.
+title: "Ether được bọc (WETH) là gì"
+description: "Một giới thiệu về Ether được bọc (WETH) - Một dạng \"bọc\" Ether (ETH) chuẩn ERC20."
lang: vi
---
@@ -8,7 +8,8 @@ lang: vi
-Kết nối ví của bạn tới một ETH được bọc hoặc không bọc trên mọi chuỗi tại [WarpETH.com](https://www.wrapeth.com/)
+Kết nối ví của bạn tới một ETH được bọc hoặc không bọc trên mọi chuỗi tại [WarpETH.com](https://www.wrapeth.com/)
+
Ether (ETH) là tiền tệ chính của Ethereum. Nó được sử dụng cho nhiều mục đích như Staking, làm tiền tệ, và trả phí Gas cho việc tính toán. **WETH là một dạng ETH được nâng cấp, có thêm một số chức năng bổ sung mà cần thiết bởi nhiều ứng dụng và [Token ERC-20](/glossary/#erc-20)**, vốn là các loại tài sản số khác trên Ethereum. Để có thể tương tác với các Token này, ETH phải tuân theo cùng một bộ quy tắc như chúng, được gọi là chuẩn ERC-20.
@@ -40,19 +41,16 @@ Bạn có thể tháo bọc cho WETH thành ETH bằng cách sử dụng hợp
Bạn trả phí Gas cho việc bọc hoặc tháo bọc ETH sử dụng hợp đồng WETH.
-
WETH nhìn chung vẫn bảo mật bởi vì nó rất đơn giản, hợp đồng thông minh đã trải qua nhiều kiểm chứng thực tế. Hợp đồng WETH cũng được kiểm chứng chính thức, đây là tiêu chuẩn bảo mật cao nhất dành cho các hợp đồng thông minh trên Ethereum.
-
Ngoài [bản triển khai chuẩn của WETH](https://etherscan.io/token/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2) được mô tả trên trang này, còn có nhiều biến thể khác đang tồn tại ngoài thực tế. Chúng có thể là Token tùy chỉnh do các nhà phát triển ứng dụng tạo ra, hoặc các phiên bản phát hành trên chuỗi khối khác, và có thể hoạt động khác nhau hoặc có sự bảo mật khác biệt. **Luôn kiểm tra kỹ thông tin Token để biết chính xác bạn đang tương tác với bản triển khai WETH nào**
-
@@ -60,7 +58,6 @@ Ngoài [bản triển khai chuẩn của WETH](https://etherscan.io/token/0xc02a
- [Mạng chính Ethereum](https://etherscan.io/token/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)
- [Arbitrum](https://arbiscan.io/token/0x82af49447d8a07e3bd95bd0d56f35241523fbab1)
- [Optimism](https://optimistic.etherscan.io/token/0x4200000000000000000000000000000000000006)
-
## Đọc thêm {#further-reading}
diff --git a/public/content/translations/vi/zero-knowledge-proofs/index.md b/public/content/translations/vi/zero-knowledge-proofs/index.md
index 0002f1ecc57..de1f922e2be 100644
--- a/public/content/translations/vi/zero-knowledge-proofs/index.md
+++ b/public/content/translations/vi/zero-knowledge-proofs/index.md
@@ -1,6 +1,6 @@
---
-title: Bằng chứng không tiết lộ thông tin
-description: Lời giới thiệu không mang tính kỹ thuật về phương thức chứng thực ẩn danh dành cho người mới bắt đầu.
+title: "Bằng chứng không tiết lộ thông tin"
+description: "Lời giới thiệu không mang tính kỹ thuật về phương thức chứng thực ẩn danh dành cho người mới bắt đầu."
lang: vi
---
@@ -49,14 +49,15 @@ Bằng chứng không kiến thức đặc biệt hữu ích trong bối cảnh
- ZKP + Danh tính trong thực tế: ID kỹ thuật số quốc gia (NDI) của Bhutan trên Ethereum
+
+ZKP + Danh tính trong thực tế: ID kỹ thuật số quốc gia (NDI) của Bhutan trên Ethereum
Một ví dụ trong thế giới thực về việc sử dụng ZKP cho các hệ thống quản lý danh tính là hệ thống ID kỹ thuật số quốc gia (NDI) của Vương quốc Bhutan, được xây dựng trên Ethereum. NDI của Bhutan sử dụng ZKP để cho phép công dân chứng minh một cách mã hóa các sự thật về bản thân họ, như "Tôi là một công dân" hoặc "Tôi trên 18 tuổi", mà không tiết lộ dữ liệu cá nhân nhạy cảm trên ID của họ.
Tìm hiểu thêm về NDI của Bhutan trong nghiên cứu tình huống về Danh tính phi tập trung.
-
-
+
+
### Bằng chứng về tư cách con người {#proof-of-humanity}
From 106049083806efc41402d370804f004b7714e260 Mon Sep 17 00:00:00 2001
From: Joshua <62268199+minimalsm@users.noreply.github.com>
Date: Fri, 13 Feb 2026 12:39:45 +0000
Subject: [PATCH 04/31] fix(i18n): run sanitizer on vi translations
---
.../translations/vi/ai-agents/index.md | 1 +
.../translations/vi/community/grants/index.md | 3 +--
.../translations/vi/community/online/index.md | 25 ++++++++++++++++---
.../vi/community/research/index.md | 2 +-
.../translatathon/details/index.md | 2 +-
.../translatathon/index.md | 2 +-
public/content/translations/vi/dao/index.md | 4 +--
public/content/translations/vi/defi/index.md | 3 +--
.../docs/intro-to-ethereum/index.md | 1 +
.../developers/docs/smart-contracts/index.md | 1 +
.../docs/smart-contracts/languages/index.md | 18 +++++++++++++
.../docs/smart-contracts/naming/index.md | 2 +-
.../docs/smart-contracts/testing/index.md | 1 +
.../erc-721-vyper-annotated-code/index.md | 1 +
.../index.md | 2 +-
.../index.md | 2 +-
.../index.md | 2 +-
.../index.md | 4 ++-
.../index.md | 2 +-
.../how-to-use-tellor-as-your-oracle/index.md | 2 +-
.../tutorials/run-node-raspberry-pi/index.md | 2 +-
.../secure-development-workflow/index.md | 2 +-
.../index.md | 2 +-
.../index.md | 2 +-
.../token-integration-checklist/index.md | 2 +-
.../uniswap-v2-annotated-code/index.md | 3 +--
.../tutorials/using-websockets/index.md | 2 +-
.../translations/vi/ethereum-forks/index.md | 4 +--
.../index.md | 3 +--
.../how-to-revoke-token-access/index.md | 3 +--
.../vi/guides/how-to-swap-tokens/index.md | 3 +--
.../vi/guides/how-to-use-a-bridge/index.md | 3 +--
.../vi/guides/how-to-use-a-wallet/index.md | 3 +--
public/content/translations/vi/nft/index.md | 3 +--
.../content/translations/vi/payments/index.md | 11 ++++----
.../vi/prediction-markets/index.md | 2 ++
.../vi/roadmap/merge/issuance/index.md | 6 +++++
.../vi/roadmap/pectra/7702/index.md | 2 +-
.../translations/vi/staking/solo/index.md | 1 +
public/content/translations/vi/web3/index.md | 6 ++---
.../translations/vi/wrapped-eth/index.md | 3 +--
41 files changed, 94 insertions(+), 54 deletions(-)
diff --git a/public/content/translations/vi/ai-agents/index.md b/public/content/translations/vi/ai-agents/index.md
index 192766ce275..77ac1b41859 100644
--- a/public/content/translations/vi/ai-agents/index.md
+++ b/public/content/translations/vi/ai-agents/index.md
@@ -111,6 +111,7 @@ Trong chiến dịch trên mạng xã hội X #LunaMuralChallenge của Luna, Lu
Tốt để biết
Tác nhân AI và các công cụ liên quan vẫn đang trong giai đoạn phát triển ban đầu và còn đang trong giai đoạn thử nghiệm—hãy thận trọng khi sử dụng.
+
## Kiểm soát ví của bạn bằng câu lệnh trò chuyện {#control-your-wallet-using-chat-commands}
diff --git a/public/content/translations/vi/community/grants/index.md b/public/content/translations/vi/community/grants/index.md
index 229850abae6..5be9a9c46db 100644
--- a/public/content/translations/vi/community/grants/index.md
+++ b/public/content/translations/vi/community/grants/index.md
@@ -12,8 +12,7 @@ Danh sách này được chọn lọc bởi cộng đồng của chúng tôi. N
-Các nhà sáng lập, bạn có cần trợ giúp để thúc đẩy doanh nghiệp của mình không? [Truy cập Hỗ trợ các nhà sáng lập](/founders/)
-
+Các nhà sáng lập, bạn có cần trợ giúp để thúc đẩy doanh nghiệp của mình không? [Truy cập Hỗ trợ các nhà sáng lập](/founders/)
## Hệ sinh thái Ethereum rộng lớn {#broad-ethereum-ecosystem}
diff --git a/public/content/translations/vi/community/online/index.md b/public/content/translations/vi/community/online/index.md
index 6e5fede52e1..7378626cc1f 100644
--- a/public/content/translations/vi/community/online/index.md
+++ b/public/content/translations/vi/community/online/index.md
@@ -34,15 +34,34 @@ Nếu bạn tin rằng một cộng đồng nên được thêm hoặc xóa dự
## Diễn đàn {#forums}
-r/ethereum - tất cả mọi thứ về Ethereum r/ethfinance - khía cạnh tài chính của Ethereum, bao gồm cả DeFi r/ethdev - tập trung vào phát triển Ethereum r/ethtrader - xu hướng và phân tích thị trường r/ethstaker - chào đón tất cả những ai quan tâm đến việc staking trên Ethereum Fellowship of Ethereum Magicians - cộng đồng tập trung vào các tiêu chuẩn kỹ thuật trong Ethereum Ethereum Stackexchange - thảo luận và trợ giúp cho các nhà phát triển Ethereum Ethereum Research - diễn đàn có ảnh hưởng nhất cho nghiên cứu kinh tế học tiền mã hóa
+r/ethereum - tất cả mọi thứ về Ethereum
+r/ethfinance - khía cạnh tài chính của Ethereum, bao gồm cả DeFi
+r/ethdev - tập trung vào phát triển Ethereum
+r/ethtrader - xu hướng và phân tích thị trường
+r/ethstaker - chào đón tất cả những ai quan tâm đến việc staking trên Ethereum
+Fellowship of Ethereum Magicians - cộng đồng tập trung vào các tiêu chuẩn kỹ thuật trong Ethereum
+Ethereum Stackexchange - thảo luận và trợ giúp cho các nhà phát triển Ethereum
+Ethereum Research - diễn đàn có ảnh hưởng nhất cho nghiên cứu kinh tế học tiền mã hóa
## Phòng trò chuyện {#chat-rooms}
-Ethereum Cat Herders - cộng đồng định hướng cung cấp hỗ trợ quản lý dự án cho việc phát triển Ethereum Ethereum Hackers - trò chuyện Discord do ETHGlobal điều hành: một cộng đồng trực tuyến cho các hacker Ethereum trên toàn thế giới CryptoDevs - Cộng đồng Discord tập trung vào phát triển Ethereum EthStaker Discord - hướng dẫn, giáo dục, hỗ trợ và tài nguyên do cộng đồng điều hành cho những người tham gia staking hiện tại và tiềm năng Ethereum.org website team - ghé qua và trò chuyện về phát triển và thiết kế web ethereum.org với nhóm và mọi người từ cộng đồng Matos Discord - cộng đồng những nhà sáng tạo web3 nơi các nhà xây dựng, những người đứng đầu ngành và những người đam mê Ethereum tụ tập. Chúng tôi đam mê phát triển, thiết kế và văn hóa web3. Hãy cùng xây dựng với chúng tôi. Solidity Gitter - trò chuyện về phát triển Solidity (Gitter) Solidity Matrix - trò chuyện về phát triển Solidity (Matrix) Ethereum Stack Exchange - diễn đàn hỏi và đáp Peera Community Forum - diễn đàn hỏi đáp phi tập trung
+Ethereum Cat Herders - cộng đồng định hướng cung cấp hỗ trợ quản lý dự án cho việc phát triển Ethereum
+Ethereum Hackers - trò chuyện Discord do ETHGlobal điều hành: một cộng đồng trực tuyến cho các hacker Ethereum trên toàn thế giới
+CryptoDevs - Cộng đồng Discord tập trung vào phát triển Ethereum
+EthStaker Discord - hướng dẫn, giáo dục, hỗ trợ và tài nguyên do cộng đồng điều hành cho những người tham gia staking hiện tại và tiềm năng
+Ethereum.org website team - ghé qua và trò chuyện về phát triển và thiết kế web ethereum.org với nhóm và mọi người từ cộng đồng
+Matos Discord - cộng đồng những nhà sáng tạo web3 nơi các nhà xây dựng, những người đứng đầu ngành và những người đam mê Ethereum tụ tập. Chúng tôi đam mê phát triển, thiết kế và văn hóa web3. Hãy cùng xây dựng với chúng tôi.
+Solidity Gitter - trò chuyện về phát triển Solidity (Gitter)
+Solidity Matrix - trò chuyện về phát triển Solidity (Matrix)
+Ethereum Stack Exchange - diễn đàn hỏi và đáp
+Peera Community Forum - diễn đàn hỏi đáp phi tập trung
## YouTube và X (trước đây là Twitter) {#youtube-and-twitter}
-Ethereum Foundation - Luôn cập nhật những thông tin mới nhất từ Ethereum Foundation @ethereum - Tài khoản Ethereum chính cho cộng đồng @ethereumfndn - Tài khoản chính thức của Ethereum Foundation @ethdotorg - Cổng thông tin đến Ethereum, được xây dựng cho cộng đồng toàn cầu đang phát triển của chúng tôi
+Ethereum Foundation - Luôn cập nhật những thông tin mới nhất từ Ethereum Foundation
+@ethereum - Tài khoản Ethereum chính cho cộng đồng
+@ethereumfndn - Tài khoản chính thức của Ethereum Foundation
+@ethdotorg - Cổng thông tin đến Ethereum, được xây dựng cho cộng đồng toàn cầu đang phát triển của chúng tôi
diff --git a/public/content/translations/vi/community/research/index.md b/public/content/translations/vi/community/research/index.md
index c3852c0a6ef..fcca95fcaf0 100644
--- a/public/content/translations/vi/community/research/index.md
+++ b/public/content/translations/vi/community/research/index.md
@@ -8,7 +8,7 @@ lang: vi
Một trong những thế mạnh cốt lõi của Ethereum là việc có một cộng đồng tập hợp những nghiên cứu sinh và kĩ sư liên tục tham gia cải thiện, phát triển hệ sinh thái. Nhiều cá nhân với kĩ năng và đam mê rất sẵn sàng tham gia vào giải quyết những vấn đề tồn đọng trong hệ sinh thái Ethereum, nhưng lại gặp khó khăn trong việc tiếp cận những vấn đề đó. Trang thông tin này giúp trình bày những đề tài nghiên cứu trọng yếu mà Ethereum đang hướng tới.
-## Hoạt động tham gia nghiên cứu Ethereum được triển khai như thế nào?{#how-ethereum-research-works}
+## Hoạt động tham gia nghiên cứu Ethereum được triển khai như thế nào? {#how-ethereum-research-works}
Tham gia nghiên cứu Ethereum là một hoạt động công khai, thừa kế những quy tắc của [Khoa học phi tập trung (DeSci)](https://hackernoon.com/desci-decentralized-science-as-our-chance-to-recover-the-real-science). Mục tiêu là hướng tới việc biến các công cụ và kết quả nghiên cứu trở nên thân thiện nhất có thể, ví dụ, thông qua các sổ tay thực thi. Hoạt động nghiên cứu Ethereum diễn ra với tốc độ rất nhanh, với việc các sáng kiến, thông tin mới sẽ liên tục được đăng và thảo luận trên các trang thông tin như [ethresear.ch](https://ethresear.ch/) thay vì thông qua các hình thức đăng tải truyền thống yêu cầu quy trình đánh giá phức tạp.
diff --git a/public/content/translations/vi/contributing/translation-program/translatathon/details/index.md b/public/content/translations/vi/contributing/translation-program/translatathon/details/index.md
index 728e21a8a79..8cbc98dc8d4 100644
--- a/public/content/translations/vi/contributing/translation-program/translatathon/details/index.md
+++ b/public/content/translations/vi/contributing/translation-program/translatathon/details/index.md
@@ -1,7 +1,7 @@
---
title: "Chi tiết và quy tắc"
lang: vi
-template: "Marathon dịch thuật"
+template: translatathon
---

diff --git a/public/content/translations/vi/contributing/translation-program/translatathon/index.md b/public/content/translations/vi/contributing/translation-program/translatathon/index.md
index a4d275d4887..c640ed54569 100644
--- a/public/content/translations/vi/contributing/translation-program/translatathon/index.md
+++ b/public/content/translations/vi/contributing/translation-program/translatathon/index.md
@@ -1,7 +1,7 @@
---
title: "Cuộc thi Dịch thuật ethereum.org 2025"
lang: vi
-template: "Ngày hội dịch thuật"
+template: translatathon
---
diff --git a/public/content/translations/vi/dao/index.md b/public/content/translations/vi/dao/index.md
index d9ef8780903..ac158e80b31 100644
--- a/public/content/translations/vi/dao/index.md
+++ b/public/content/translations/vi/dao/index.md
@@ -70,9 +70,7 @@ Có rất nhiều yếu tố cần xem xét khi điều hành một DAO, chẳng
Sự ủy quyền giống như phiên bản DAO của nền dân chủ đại diện. Các chủ sở hữu Token ủy quyền phiếu bầu cho những người dùng tự đề cử và cam kết đảm bảo quản trị giao thức và luôn cập nhật thông tin.
-#### Một ví dụ nổi tiếng {#governance-example}
-
-[ENS](https://claim.ens.domains/delegate-ranking) – những người nắm giữ ENS có thể ủy quyền phiếu bầu của họ cho các thành viên cộng đồng tích cực để đại diện cho họ.
+#### Một ví dụ nổi tiếng {#governance-example}[ENS](https://claim.ens.domains/delegate-ranking) – những người nắm giữ ENS có thể ủy quyền phiếu bầu của họ cho các thành viên cộng đồng tích cực để đại diện cho họ.
### Quản trị giao dịch tự động {#governance-example}
diff --git a/public/content/translations/vi/defi/index.md b/public/content/translations/vi/defi/index.md
index f9f342af521..0b6ecb67fb5 100644
--- a/public/content/translations/vi/defi/index.md
+++ b/public/content/translations/vi/defi/index.md
@@ -67,8 +67,7 @@ Ethereum kế thừa và tiếp tục phát triển từ triết lý của Bitco
- Khám phá những ứng dụng tài chính phi tập trung mà chúng tôi gợi ý nếu bạn là một người dùng mới của Ethereum.
-
+ Khám phá những ứng dụng tài chính phi tập trung mà chúng tôi gợi ý nếu bạn là một người dùng mới của Ethereum.
Khám phá các ứng dụng DeFi
diff --git a/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
index 4e727e09c95..721d99a35cb 100644
--- a/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
+++ b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
@@ -43,6 +43,7 @@ Lượng ETH được trả phụ thuộc và tài nguyên cần để tính to
Eth cũng sử dụng cơ chế "mật mã học-kinh tế" để đảm bảo an toàn mạn lưới trong 3 phương pháp chính: 1) nó được sử dụng để thưởng cho nút xác thực người đề xuất khối hoặc răn đe những trường hợp gian lận bởi những nút xác thực khác; 2) nó được sử dụng để Stake bởi các nút xác thực, đóng vai trò là tài sản thế chấp chống lại hành vi gian lận - nếu như nút xác thực cố gian lận thì ETH của họ bị hủy đi; 3) nó là một công cụ để làm trọng số phiếu bầu cho việc đề xuất khối mới, cho phép đưa vào phần quy tắc chọn nhánh (Fork-Choice) của cơ chế đồng thuận.
## Hợp đồng thông minh là gì? {#what-are-smart-contracts}
+
Trong thực tế, người tham gia không viết mã mới mỗi khi họ muốn yêu cầu một phép tính toán trên EVM. Thay vào đó, người lập trình ứng dụng tải các chương trình (các đoạn mã có thể tái sử dụng) lên trạng thái của EVM, và người dùng gửi yêu cầu để thực thi các đoạn mã này với những tham số khác nhau. Chúng tôi gọi các chương trình được tải lên và thực thi bởi mạng là "hợp đồng thông minh".
Có thể nghĩ đơn giản là hợp đồng thông minh giống như một máy bán hàng tự động: một kịch bản khi mà ở một giới hạn nhất định, thực hiện hành động hoặc tính toán nếu như đúng điều kiện. Ví dụ, một hợp đồng thông minh bán hàng đơn giản có thể tạo ra và gán quyền sở hữu của một tài sản số nếu người gọi gửi ETH đến một người nhận cụ thể.
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/index.md b/public/content/translations/vi/developers/docs/smart-contracts/index.md
index e8ef844d486..9279749f175 100644
--- a/public/content/translations/vi/developers/docs/smart-contracts/index.md
+++ b/public/content/translations/vi/developers/docs/smart-contracts/index.md
@@ -5,6 +5,7 @@ lang: vi
---
## Hợp đồng thông minh là gì? {#what-is-a-smart-contract}
+
Một "hợp đồng thông minh" đơn giản chỉ là một chương trình hoạt động trên chuỗi khối Ethereum. Đó là một bộ mã (các hàm của nó) và dữ liệu (trạng thái của nó) tồn tại tại một địa chỉ cụ thể trên chuỗi khối Ethereum.
Hợp đồng thông minh là một loại [tài khoản Ethereum](/developers/docs/accounts/). Điều này có nghĩa là họ có một số dư và có thể trở thành đối tượng của các giao dịch. Tuy nhiên, chúng không được điều khiển bởi người dùng, mà được triển khai vào mạng và hoạt động theo chương trình đã được lập. Các tài khoản người dùng sau đó có thể tương tác với một hợp đồng thông minh bằng cách gửi các giao dịch thực thi một chức năng được xác định trong hợp đồng thông minh. Hợp đồng thông minh có thể xác định các quy tắc, giống như một hợp đồng thông thường, và tự động thực thi chúng qua mã. Hợp đồng thông minh không thể bị xóa theo mặc định, và các tương tác với chúng là không thể đảo ngược.
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md b/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md
index 29656d97062..372a5401f71 100644
--- a/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md
+++ b/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md
@@ -123,24 +123,32 @@ Ví dụ trên sẽ cho bạn biết cú phát của hợp đồng được vi
# Đấu giá mở
# Tham số đấu giá
+
# Người thụ hưởng nhận tiền từ người trả giá cao nhất
+
beneficiary: public(address)
auctionStart: public(uint256)
auctionEnd: public(uint256)
# Trạng thái hiện tại của phiên đấu giá
+
highestBidder: public(address)
highestBid: public(uint256)
# Đặt thành true ở cuối, không cho phép bất kỳ thay đổi nào
+
ended: public(bool)
# Theo dõi các giá thầu được hoàn lại để chúng ta có thể tuân theo mẫu rút tiền
+
pendingReturns: public(HashMap[address, uint256])
# Tạo một phiên đấu giá đơn giản với `_bidding_time`
+
# giây thời gian đấu giá thay mặt cho
+
# địa chỉ người thụ hưởng `_beneficiary`.
+
@external
def __init__(_beneficiary: address, _bidding_time: uint256):
self.beneficiary = _beneficiary
@@ -148,9 +156,13 @@ def __init__(_beneficiary: address, _bidding_time: uint256):
self.auctionEnd = self.auctionStart + _bidding_time
# Đặt giá cho phiên đấu giá với giá trị được gửi
+
# cùng với giao dịch này.
+
# Giá trị sẽ chỉ được hoàn lại nếu
+
# không thắng phiên đấu giá.
+
@external
@payable
def bid():
@@ -165,9 +177,13 @@ def bid():
self.highestBid = msg.value
# Rút lại một giá thầu đã được hoàn lại trước đó. Mẫu rút tiền được
+
# sử dụng ở đây để tránh một vấn đề bảo mật. Nếu các khoản hoàn trả được gửi trực tiếp
+
# như một phần của bid(), một hợp đồng đặt giá độc hại có thể chặn
+
# các khoản hoàn trả đó và do đó chặn các giá thầu cao hơn mới được đưa vào.
+
@external
def withdraw():
pending_amount: uint256 = self.pendingReturns[msg.sender]
@@ -175,7 +191,9 @@ def withdraw():
send(msg.sender, pending_amount)
# Kết thúc phiên đấu giá và gửi giá thầu cao nhất
+
# cho người thụ hưởng.
+
@external
def endAuction():
# Một nguyên tắc hay là cấu trúc các hàm tương tác
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/naming/index.md b/public/content/translations/vi/developers/docs/smart-contracts/naming/index.md
index 12a130addf6..f93a2f68a73 100644
--- a/public/content/translations/vi/developers/docs/smart-contracts/naming/index.md
+++ b/public/content/translations/vi/developers/docs/smart-contracts/naming/index.md
@@ -73,7 +73,7 @@ Enscribe hỗ trợ các tên ENS do người dùng cung cấp hoặc các tên
Bạn có thể truy cập [Ứng dụng Enscribe](https://app.enscribe.xyz) để bắt đầu đặt tên và xem các hợp đồng thông minh.
-## Các phương pháp tốt nhất{#best-practices}
+## Các phương pháp tốt nhất {#best-practices}
- **Sử dụng các tên rõ ràng, có phiên bản** như `v1.myapp.eth` để làm cho việc nâng cấp hợp đồng trở nên minh bạch
- **Thiết lập bản ghi ngược** để liên kết hợp đồng với tên ENS nhằm đảm bảo khả năng hiển thị trong các ứng dụng như ví và trình khám phá chuỗi khối.
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/testing/index.md b/public/content/translations/vi/developers/docs/smart-contracts/testing/index.md
index c948fbac8c1..c99a3692465 100644
--- a/public/content/translations/vi/developers/docs/smart-contracts/testing/index.md
+++ b/public/content/translations/vi/developers/docs/smart-contracts/testing/index.md
@@ -13,6 +13,7 @@ Vì những lý do này, việc kiểm tra các hợp đồng thông minh trư
Trang này giải thích cách kiểm tra hợp đồng thông minh trước khi triển khai trên mạng Ethereum. Điều này giả định rằng bạn đã quen thuộc với [các hợp đồng thông minh](/developers/docs/smart-contracts/).
## Kiểm tra hợp đồng thông minh là gì? {#what-is-smart-contract-testing}
+
Kiểm tra hợp đồng thông minh là quá trình xác nhận rằng mã của hợp đồng thông minh hoạt động như mong đợi. Việc kiểm tra là cần thiết để xác minh liệu một hợp đồng thông minh cụ thể có đáp ứng các yêu cầu về độ tin cậy, tính hữu dụng và an ninh hay không.
Mặc dù có nhiều cách tiếp cận khác nhau, nhưng hầu hết các phương pháp kiểm tra đều cần thực hiện một hợp đồng thông minh với một mẫu nhỏ dữ liệu mà nó dự kiến sẽ xử lý. Nếu hợp đồng tạo ra kết quả đúng cho dữ liệu mẫu, nó được cho là hoạt động chính xác. Hầu hết các công cụ kiểm tra cung cấp tài nguyên để viết và thực thi các [trường hợp kiểm tra](https://en.m.wikipedia.org/wiki/Test_case) để kiểm tra xem việc thực thi hợp đồng có khớp với kết quả mong đợi hay không.
diff --git a/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
index 28e6303cf03..dc975a993f5 100644
--- a/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
+++ b/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
@@ -294,6 +294,7 @@ Trả về giá trị từ HashMap `self.supportedInterfaces`, được đặt t
```python
### XEM HÀM ###
+
```
Đây là các hàm xem giúp cung cấp thông tin về các token cho người dùng và các hợp đồng khác.
diff --git a/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
index e2f81811d56..58cbf9269e5 100644
--- a/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
+++ b/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
@@ -13,7 +13,7 @@ tags:
skill: beginner
lang: vi
published: 2020-10-30
-source: "Trung bình"
+source: Medium
sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f
---
diff --git a/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md
index b40966e7af2..271aaf64cf0 100644
--- a/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md
+++ b/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md
@@ -6,7 +6,7 @@ lang: vi
tags: [ "solidity", "hợp đồng thông minh", "tính bảo mật" ]
skill: intermediate
published: 2020-09-07
-source: "Xây dựng những hợp đồng an toàn"
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis
---
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
index 2c8a233ea18..dcc6fc5cfbc 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
@@ -13,7 +13,7 @@ tags:
]
skill: advanced
published: 2020-04-10
-source: "Xây dựng những hợp đồng an toàn"
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna
---
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
index 47cba869af0..0fdd0588862 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
@@ -13,7 +13,7 @@ tags:
]
skill: advanced
published: 2020-01-13
-source: "Xây dựng những hợp đồng an toàn"
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore
---
@@ -399,6 +399,7 @@ symbolic_var = m.make_symbolic_value()
contract_account.f(symbolic_var)
## Kiểm tra xem một lần thực thi có kết thúc bằng REVERT hoặc INVALID không
+
for state in m.terminated_states:
last_tx = state.platform.transactions[-1]
if last_tx.result in ['REVERT', 'INVALID']:
@@ -506,6 +507,7 @@ contract_account.f(symbolic_var)
no_bug_found = True
## Kiểm tra xem một lần thực thi có kết thúc bằng REVERT hoặc INVALID không
+
for state in m.terminated_states:
last_tx = state.platform.transactions[-1]
if last_tx.result in ['REVERT', 'INVALID']:
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
index 4a6453f214f..26e45ee74a2 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
@@ -12,7 +12,7 @@ tags:
]
skill: advanced
published: 2020-06-09
-source: "Xây dựng những hợp đồng an toàn"
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither
---
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
index cac9b14452e..0219e464807 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
@@ -6,7 +6,7 @@ lang: vi
tags: [ "solidity", "hợp đồng thông minh", "oracles" ]
skill: beginner
published: 2021-06-29
-source: "Tài liệu Tellor"
+source: Tellor Docs
sourceUrl: https://docs.tellor.io/tellor/
---
diff --git a/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md
index 735e82491de..772ecad5a8c 100644
--- a/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md
+++ b/public/content/translations/vi/developers/tutorials/run-node-raspberry-pi/index.md
@@ -6,7 +6,7 @@ tags: [ "máy khách", "lớp thực thi", "lớp đồng thuận", "nút" ]
lang: vi
skill: intermediate
published: 2022-06-10
-source: "Ethereum trên ARM"
+source: Ethereum on ARM
sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/
---
diff --git a/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
index 1fe9218b338..0343fbd1e93 100644
--- a/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
+++ b/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
@@ -6,7 +6,7 @@ tags: [ "hợp đồng thông minh", "tính bảo mật", "solidity" ]
skill: intermediate
lang: vi
published: 2020-09-07
-source: "Xây dựng những hợp đồng an toàn"
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md
---
diff --git a/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
index 2e2b99458e3..c4bae2cf5c6 100644
--- a/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
+++ b/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
@@ -6,7 +6,7 @@ tags: [ "các giao dịch", "web3.js", "từ Alchemy" ]
skill: beginner
lang: vi
published: 2020-11-04
-source: "Tài liệu Alchemy"
+source: Alchemy docs
sourceUrl: https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum
---
diff --git a/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
index 1e7778f6f79..db6c8a4c466 100644
--- a/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
+++ b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
@@ -6,7 +6,7 @@ tags: [ "solidity", "hợp đồng thông minh", "tính bảo mật" ]
skill: intermediate
lang: vi
published: 2020-09-06
-source: "Xây dựng những hợp đồng an toàn"
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md
---
diff --git a/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md b/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
index e6fb4b2fad2..e0d09d68df5 100644
--- a/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
+++ b/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
@@ -12,7 +12,7 @@ tags:
]
skill: intermediate
published: 2020-08-13
-source: "Xây dựng những hợp đồng an toàn"
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/token_integration.md
---
diff --git a/public/content/translations/vi/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/uniswap-v2-annotated-code/index.md
index dcc82776196..7dee706c3ac 100644
--- a/public/content/translations/vi/developers/tutorials/uniswap-v2-annotated-code/index.md
+++ b/public/content/translations/vi/developers/tutorials/uniswap-v2-annotated-code/index.md
@@ -56,9 +56,8 @@ Uniswap v2 được chia thành hai thành phần, lõi và ngoại vi. Sự ph
4. Lặp lại trên đường dẫn. Đối với mỗi sàn giao dịch trên đường đi, nó sẽ gửi token đầu vào và sau đó gọi hàm `swap` của sàn giao dịch.
Trong hầu hết các trường hợp, địa chỉ đích cho các token là sàn giao dịch cặp tiếp theo trong đường dẫn. Trong sàn giao dịch cuối cùng, đó là địa chỉ do nhà giao dịch cung cấp.
-#### Trong hợp đồng lõi (UniswapV2Pair.sol) {#in-the-core-contract-uniswapv2pairsol-2}
+#### Trong hợp đồng lõi (UniswapV2Pair.sol) {#in-the-core-contract-uniswapv2pairsol-2}5. Xác minh rằng hợp đồng lõi không bị gian lận và có thể duy trì đủ thanh khoản sau khi hoán đổi.
-5. Xác minh rằng hợp đồng lõi không bị gian lận và có thể duy trì đủ thanh khoản sau khi hoán đổi.
6. Xem chúng ta có bao nhiêu token bổ sung ngoài các khoản dự trữ đã biết. Số tiền đó là số lượng token đầu vào mà chúng tôi đã nhận được để trao đổi.
7. Gửi các token đầu ra đến đích.
8. Gọi `_update` để cập nhật số lượng dự trữ
diff --git a/public/content/translations/vi/developers/tutorials/using-websockets/index.md b/public/content/translations/vi/developers/tutorials/using-websockets/index.md
index 264886af939..edcfe4271cc 100644
--- a/public/content/translations/vi/developers/tutorials/using-websockets/index.md
+++ b/public/content/translations/vi/developers/tutorials/using-websockets/index.md
@@ -5,7 +5,7 @@ author: "Elan Halpern"
lang: vi
tags: [ "từ Alchemy", "websockets", "truy vấn", "javascript" ]
skill: beginner
-source: "Tài liệu Alchemy"
+source: Alchemy docs
sourceUrl: https://www.alchemy.com/docs/reference/best-practices-for-using-websockets-in-web3
published: 2020-12-01
---
diff --git a/public/content/translations/vi/ethereum-forks/index.md b/public/content/translations/vi/ethereum-forks/index.md
index f29d340c8ce..283c6b4915b 100644
--- a/public/content/translations/vi/ethereum-forks/index.md
+++ b/public/content/translations/vi/ethereum-forks/index.md
@@ -11,7 +11,7 @@ Tóm lược các cột mốc quan trọng, các nhánh - forks, và các cập
-Sự tách nhánh - forks - xảy ra khi những nâng cấp hoặc thay đổi kỹ thuật lớn cần được thực hiện đối với mạng Ethereum. Chúng thường được xuất phát từ những [Đề xuất cải tiến Ethereum (EIP)](/ eips /) và làm thay đổi các "quy tắc" của giao thức.
+Sự tách nhánh - forks - xảy ra khi những nâng cấp hoặc thay đổi kỹ thuật lớn cần được thực hiện đối với mạng Ethereum. Chúng thường được xuất phát từ những [Đề xuất cải tiến Ethereum (EIP)](/eips/) và làm thay đổi các "quy tắc" của giao thức.
Đối với những phần mềm truyền thống được quản lý tập trung, khi những nâng cấp mới được thực hiện, các công ty phần mềm chỉ việc phát hành chúng tới người dùng cuối. Các Chuỗi khối - blockchains - không áp dụng hình thức này vì không có sự sở hữu tập trung. [Ethereum clients](/developers/docs/nodes-and-clients/) phải tự cập nhật phần mềm của mình để áp dụng những quy tắc mới. Ngoài ra, những người tạo khối (thợ đào đối với bằng chứng công việc, người xác thực đối với bằng chứng cổ phần) và các node trong mạng phải tạo khối và xác thực dựa trên các quy tắc mới. [Tìm hiểu thêm về cơ chế đồng thuận](/developers/docs/consensus-mechanisms/)
@@ -313,7 +313,7 @@ Alair từng là bản nâng cấp mạng chính đầu tiên có số lần t
Bản nâng cấp London đã giới thiệu [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), cải cách thị trường phí giao dịch, cùng với những thay đổi về cách xử lý hoàn trả gas và lịch trình [Kỷ Băng Hà](/glossary/#ice-age).
-#### London Upgrade / EIP-1559 là gì? {#eip-1559}
+#### London Upgrade / EIP-1559 là gì? {#eip-1559}
Trước khi London được nâng cấp, Ethereum đã chỉnh lại cỡ cái khối. Trong những thời điểm có nhu cầu mạng cao, các khối này hoạt động ở công suất tối đa. Kết quả là, người dùng thường phải chờ đợi sự giảm bớt nhu cầu để được đưa vào một khối, điều này đã dẫn đến trải nghiệm người dùng kém. London nâng cấp giới thiệu vài khối tới Ethereum.
diff --git a/public/content/translations/vi/guides/how-to-create-an-ethereum-account/index.md b/public/content/translations/vi/guides/how-to-create-an-ethereum-account/index.md
index 4857bbafa6c..625beb42bd0 100644
--- a/public/content/translations/vi/guides/how-to-create-an-ethereum-account/index.md
+++ b/public/content/translations/vi/guides/how-to-create-an-ethereum-account/index.md
@@ -42,8 +42,7 @@ Một số ứng dụng sẽ yêu cầu bạn lưu một "cụm từ khôi phụ
- Đã cài đặt ví chưa?
Tìm hiểu cách sử dụng ví.
-
+ Đã cài đặt ví chưa?
Tìm hiểu cách sử dụng ví.
Cách sử dụng ví
diff --git a/public/content/translations/vi/guides/how-to-revoke-token-access/index.md b/public/content/translations/vi/guides/how-to-revoke-token-access/index.md
index a164604a719..4a0b0eb4e61 100644
--- a/public/content/translations/vi/guides/how-to-revoke-token-access/index.md
+++ b/public/content/translations/vi/guides/how-to-revoke-token-access/index.md
@@ -49,8 +49,7 @@ Chúng tôi khuyên bạn nên làm mới công cụ thu hồi sau vài phút v
- Bạn muốn tìm hiểu thêm?
-
+ Bạn muốn tìm hiểu thêm?
Xem các hướng dẫn khác của chúng tôi
diff --git a/public/content/translations/vi/guides/how-to-swap-tokens/index.md b/public/content/translations/vi/guides/how-to-swap-tokens/index.md
index b3c0300b604..926ec4261a3 100644
--- a/public/content/translations/vi/guides/how-to-swap-tokens/index.md
+++ b/public/content/translations/vi/guides/how-to-swap-tokens/index.md
@@ -52,8 +52,7 @@ Khi giao dịch hoàn thành, bạn sẽ nhận được tài sản mà bạn đ
- Bạn muốn tìm hiểu thêm?
-
+ Bạn muốn tìm hiểu thêm?
Xem các hướng dẫn khác của chúng tôi
diff --git a/public/content/translations/vi/guides/how-to-use-a-bridge/index.md b/public/content/translations/vi/guides/how-to-use-a-bridge/index.md
index 46447a8beef..c23ea635f41 100644
--- a/public/content/translations/vi/guides/how-to-use-a-bridge/index.md
+++ b/public/content/translations/vi/guides/how-to-use-a-bridge/index.md
@@ -54,8 +54,7 @@ Bạn có thể sử dụng [chainlist.org](http://chainlist.org) để tìm chi
- Bạn muốn tìm hiểu thêm?
-
+ Bạn muốn tìm hiểu thêm?
Xem các hướng dẫn khác của chúng tôi
diff --git a/public/content/translations/vi/guides/how-to-use-a-wallet/index.md b/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
index f209e860634..40e97d5c796 100644
--- a/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
+++ b/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
@@ -65,8 +65,7 @@ Bạn có muốn gửi ETH sang một ví khác?
- Bạn muốn tìm hiểu thêm?
-
+ Bạn muốn tìm hiểu thêm?
Xem các hướng dẫn khác của chúng tôi
diff --git a/public/content/translations/vi/nft/index.md b/public/content/translations/vi/nft/index.md
index 57b24eff681..64d9c3e0d82 100644
--- a/public/content/translations/vi/nft/index.md
+++ b/public/content/translations/vi/nft/index.md
@@ -58,8 +58,7 @@ Có thể bạn là một nghệ sĩ muốn chia sẻ tác phẩm của mình b
- Khám phá, mua hay tạo ra các tác phẩm nghệ thuật/bộ sưu tập NFT của riêng bạn...
-
+ Khám phá, mua hay tạo ra các tác phẩm nghệ thuật/bộ sưu tập NFT của riêng bạn...
Khám phá nghệ thuật NFT
diff --git a/public/content/translations/vi/payments/index.md b/public/content/translations/vi/payments/index.md
index 0a46c8cc445..aa7b3764903 100644
--- a/public/content/translations/vi/payments/index.md
+++ b/public/content/translations/vi/payments/index.md
@@ -60,11 +60,12 @@ Quốc gia như El Salvador và Cộng hòa Trung Phi thậm chí đã chấp nh
- Tạo tài khoản Ethereum với ứng dụng ví ngay hôm nay.
-
+ Tạo tài khoản Ethereum với ứng dụng ví ngay hôm nay.
-Bắt đầu
+Bắt đầu
+
+
## Thanh toán bằng thẻ tiền mã hóa tự lưu ký {#pay-with-self-custodial-crypto-cards}
@@ -197,10 +198,10 @@ Từ việc hỗ trợ cứu trợ thiên tai nhanh chóng đến trao quyền c
- Đây là lúc để tạo tài khoản Ethereum cho bạn.
-
+ Đây là lúc để tạo tài khoản Ethereum cho bạn.
Bắt đầu nào!
+
diff --git a/public/content/translations/vi/prediction-markets/index.md b/public/content/translations/vi/prediction-markets/index.md
index 12c751abd97..de5f0dd0a82 100644
--- a/public/content/translations/vi/prediction-markets/index.md
+++ b/public/content/translations/vi/prediction-markets/index.md
@@ -56,7 +56,9 @@ Có một số thị trường dự đoán hoạt động ở trên Ethereum. Đ
Hãy lưu ý tới rủi ro
Chỉ đặt cược những gì mà bạn có khả năng chi trả và biết rằng việc này có thể gây nghiện.
+
+
## Thách thức và Rủi ro {#challenges-and-risks}
diff --git a/public/content/translations/vi/roadmap/merge/issuance/index.md b/public/content/translations/vi/roadmap/merge/issuance/index.md
index f889f0d887a..7d4ccb68216 100644
--- a/public/content/translations/vi/roadmap/merge/issuance/index.md
+++ b/public/content/translations/vi/roadmap/merge/issuance/index.md
@@ -62,7 +62,9 @@ Tổng cung ETH: **~120.520.000 ETH** (tại thời điểm The Merge vào thán
**~11,3%** đã được phát hành cho những người stake trên lớp đồng thuận (0,52 / 4,61 \* 100)
+
+
## Sau The Merge (hiện tại) {#post-merge}
@@ -96,7 +98,9 @@ Tổng tỷ lệ phát hành hàng năm: **~0,52%**
Giảm ròng trong việc phát hành ETH hàng năm: **~88,7%** ((4,61% - 0,52%) / 4,61% \* 100)
+
+
## Đốt {#the-burn}
@@ -109,7 +113,9 @@ Giảm ròng trong việc phát hành ETH hàng năm: **~88,7%** ((4,61% - 0,52%
Việc đốt phí đã được triển khai với [bản nâng cấp London](/ethereum-forks/#london) vào tháng 8 năm 2021 và vẫn không thay đổi kể từ The Merge.
+
+
Ngoài việc đốt phí được áp dụng bởi bản nâng cấp London, các nút xác thực cũng có thể bị phạt nếu ngoại tuyến, hoặc tệ hơn, họ có thể bị Slashing nếu vi phạm các quy tắc nhất định đe dọa đến an ninh mạng lưới. Các hình phạt này dẫn đến việc giảm ETH trong số dư của nút xác thực, và số ETH đó không được thưởng trực tiếp cho bất kỳ tài khoản nào khác, mà trên thực tế là bị đốt/loại bỏ khỏi lưu thông.
diff --git a/public/content/translations/vi/roadmap/pectra/7702/index.md b/public/content/translations/vi/roadmap/pectra/7702/index.md
index 96a607f40c1..9f0f2c733bc 100644
--- a/public/content/translations/vi/roadmap/pectra/7702/index.md
+++ b/public/content/translations/vi/roadmap/pectra/7702/index.md
@@ -22,7 +22,7 @@ Một đại diện có thể được thiết lập lại bằng cách ủy quy
Khóa riêng của EOA giữ quyền kiểm soát hoàn toàn đối với tài khoản sau khi ủy quyền. Chẳng hạn, việc ủy quyền cho một Safe không làm cho tài khoản trở thành một multisig vì vẫn có một khóa đơn lẻ có thể vượt qua bất kỳ chính sách ký nào. Trong thời gian tới, các nhà phát triển nên thiết kế với giả định rằng bất kỳ người tham gia nào trong hệ thống cũng có thể là một hợp đồng thông minh. Đối với các nhà phát triển hợp đồng thông minh, giờ đây không còn an toàn khi giả định rằng `tx.origin` đề cập đến một EOA.
-## Các phương pháp tốt nhất{#best-practices}
+## Các phương pháp tốt nhất {#best-practices}
**Trừu tượng hóa Tài khoản**: Một hợp đồng ủy quyền cần phải tuân thủ các tiêu chuẩn trừu tượng hóa tài khoản (Account Abstraction) rộng rãi của Ethereum để tối đa hóa khả năng tương thích. Cụ thể, lý tưởng nhất là việc nó nên tuân thủ hoặc tương thích với tiêu chuẩn ERC-4337.
diff --git a/public/content/translations/vi/staking/solo/index.md b/public/content/translations/vi/staking/solo/index.md
index 8f220ffbb84..3009950bb18 100644
--- a/public/content/translations/vi/staking/solo/index.md
+++ b/public/content/translations/vi/staking/solo/index.md
@@ -71,6 +71,7 @@ Khác với các hình phạt do không hoạt động khi ngoại tuyến,
Thông tin thêm về việc cắt giảm và vòng đời của trình xác thực
+
diff --git a/public/content/translations/vi/web3/index.md b/public/content/translations/vi/web3/index.md
index 6cc8f6e0e23..53a02f48bea 100644
--- a/public/content/translations/vi/web3/index.md
+++ b/public/content/translations/vi/web3/index.md
@@ -69,8 +69,7 @@ Web3 cho phép quyền sở hữu trực tiếp thông qua [token không thể t
- Tìm hiểu thêm về NFT
-
+ Tìm hiểu thêm về NFT
Tìm hiểu thêm về NFT
@@ -98,8 +97,7 @@ Tuy nhiên, mọi người định nghĩa nhiều cộng đồng Web3 là DAO. C
- Tìm hiểu thêm về DAOs
-
+ Tìm hiểu thêm về DAOs
Tìm hiểu thêm về DAO
diff --git a/public/content/translations/vi/wrapped-eth/index.md b/public/content/translations/vi/wrapped-eth/index.md
index b75f54ee0c0..a2fdb12ff37 100644
--- a/public/content/translations/vi/wrapped-eth/index.md
+++ b/public/content/translations/vi/wrapped-eth/index.md
@@ -8,8 +8,7 @@ lang: vi
-Kết nối ví của bạn tới một ETH được bọc hoặc không bọc trên mọi chuỗi tại [WarpETH.com](https://www.wrapeth.com/)
-
+Kết nối ví của bạn tới một ETH được bọc hoặc không bọc trên mọi chuỗi tại [WarpETH.com](https://www.wrapeth.com/)
Ether (ETH) là tiền tệ chính của Ethereum. Nó được sử dụng cho nhiều mục đích như Staking, làm tiền tệ, và trả phí Gas cho việc tính toán. **WETH là một dạng ETH được nâng cấp, có thêm một số chức năng bổ sung mà cần thiết bởi nhiều ứng dụng và [Token ERC-20](/glossary/#erc-20)**, vốn là các loại tài sản số khác trên Ethereum. Để có thể tương tác với các Token này, ETH phải tuân theo cùng một bộ quy tắc như chúng, được gọi là chuẩn ERC-20.
From 0ce78b25359da20b01ddabcc22465a3545d8c76d Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Tue, 17 Feb 2026 13:24:24 -0700
Subject: [PATCH 05/31] fix(i18n): correct critical Vietnamese translation
errors
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fix 60 translation issues across 26 Vietnamese (vi) files including:
- EVM terminology: "Máy chủ ảo" → "Máy ảo" (virtual machine, not virtual server) across 14 files
- DAO term: "ẩn danh" → "tự trị" (autonomous, not anonymous)
- Ethereum genesis date: July 3 → July 30, 2015
- Semantic inversion: "tập trung hơn" → "phi tập trung hơn"
- Energy reduction stat: ~95.95% → ~99.95%
- Brand name typos: "Etherum", "Etherem" → "Ethereum"
- Technical typos: "Skating" → "Staking", "shardign" → "sharding", "tollups" → "rollups"
- Glossary consistency: "nốt" → "nút" (node), per vi-glossary-terms.json
- Broken HTML, stray escape characters, key-value misalignments
Co-Authored-By: Claude Opus 4.6
---
public/content/translations/vi/ai-agents/index.md | 2 +-
public/content/translations/vi/dao/index.md | 2 +-
public/content/translations/vi/defi/index.md | 2 +-
.../vi/developers/docs/apis/json-rpc/index.md | 10 +++++-----
.../docs/consensus-mechanisms/pow/mining/index.md | 14 +++++++-------
.../translations/vi/developers/docs/evm/index.md | 6 +++---
.../vi/developers/docs/evm/opcodes/index.md | 2 +-
.../translations/vi/developers/docs/gas/index.md | 2 +-
.../vi/developers/docs/intro-to-ethereum/index.md | 4 ++--
.../docs/smart-contracts/languages/index.md | 8 ++++----
.../vi/developers/docs/transactions/index.md | 2 +-
.../smart-contract-security-guidelines/index.md | 4 ++--
.../vi/guides/how-to-use-a-wallet/index.md | 2 +-
.../translations/vi/roadmap/beacon-chain/index.md | 2 +-
.../translations/vi/roadmap/danksharding/index.md | 2 +-
.../content/translations/vi/roadmap/merge/index.md | 4 ++--
src/intl/vi/glossary.json | 4 ++--
src/intl/vi/page-10-year-anniversary.json | 10 +++++-----
src/intl/vi/page-developers-docs.json | 12 ++++++------
src/intl/vi/page-founders.json | 2 +-
src/intl/vi/page-learn.json | 2 +-
src/intl/vi/page-roadmap-vision.json | 4 ++--
src/intl/vi/page-roadmap.json | 6 +++---
src/intl/vi/page-trillion-dollar-security.json | 4 ++--
src/intl/vi/page-upgrades-get-involved.json | 6 +++---
src/intl/vi/page-what-is-ethereum.json | 2 +-
26 files changed, 60 insertions(+), 60 deletions(-)
diff --git a/public/content/translations/vi/ai-agents/index.md b/public/content/translations/vi/ai-agents/index.md
index 77ac1b41859..e49e13ea3ab 100644
--- a/public/content/translations/vi/ai-agents/index.md
+++ b/public/content/translations/vi/ai-agents/index.md
@@ -15,7 +15,7 @@ buttons:
- content: Tác nhân AI là gì?
toId: ai-agents-on-ethereum
- content: Khám phá tác nhân Ai
- toId: "tác nhân ai trên ethereum"
+ toId: ai-agents-on-ethereum
isSecondary: false
---
diff --git a/public/content/translations/vi/dao/index.md b/public/content/translations/vi/dao/index.md
index ac158e80b31..10f6700c59b 100644
--- a/public/content/translations/vi/dao/index.md
+++ b/public/content/translations/vi/dao/index.md
@@ -1,6 +1,6 @@
---
title: "DAO là gì?"
-metaTitle: "DAO là gì? | Tổ chức ẩn danh phi tập trung"
+metaTitle: "DAO là gì? | Tổ chức tự trị phi tập trung"
description: "Tổng quan về DAO trên Ethereum"
lang: vi
template: use-cases
diff --git a/public/content/translations/vi/defi/index.md b/public/content/translations/vi/defi/index.md
index 0b6ecb67fb5..8737a15291f 100644
--- a/public/content/translations/vi/defi/index.md
+++ b/public/content/translations/vi/defi/index.md
@@ -1,7 +1,7 @@
---
title: "Tài chính phi tập trung (DeFi)"
metaTitle: "DeFi là gì? | Sử dụng Tài chính Phi tập trung và lợi ích"
-description: "EthereumTổng quan về tài chính phi tập trung trên Ethereum"
+description: "Tổng quan về tài chính phi tập trung trên Ethereum"
lang: vi
template: use-cases
emoji: ":money_with_wings:"
diff --git a/public/content/translations/vi/developers/docs/apis/json-rpc/index.md b/public/content/translations/vi/developers/docs/apis/json-rpc/index.md
index 7c1c7666301..aff7c1c7276 100644
--- a/public/content/translations/vi/developers/docs/apis/json-rpc/index.md
+++ b/public/content/translations/vi/developers/docs/apis/json-rpc/index.md
@@ -1094,7 +1094,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}]
### eth_estimateGas {#eth_estimategas}
-Tạo và trả về một ước tính về lượng gas cần thiết để cho phép giao dịch hoàn tất. Giao dịch sẽ không được thêm vào chuỗi khối. Lưu ý rằng ước tính có thể lớn hơn đáng kể so với lượng gas thực sự được sử dụng bởi giao dịch, vì nhiều lý do bao gồm cơ chế Máy chủ ảo Ethereum và hiệu suất nút.
+Tạo và trả về một ước tính về lượng gas cần thiết để cho phép giao dịch hoàn tất. Giao dịch sẽ không được thêm vào chuỗi khối. Lưu ý rằng ước tính có thể lớn hơn đáng kể so với lượng gas thực sự được sử dụng bởi giao dịch, vì nhiều lý do bao gồm cơ chế Máy ảo Ethereum và hiệu suất nút.
Thử điểm cuối trong sân chơi
@@ -1794,7 +1794,7 @@ web3.fromWei("0x1639e49bba16280000", "ether")
Bây giờ có một số ether trên chuỗi phát triển riêng của chúng tôi, chúng tôi có thể triển khai hợp đồng. Bước đầu tiên là biên dịch hợp đồng Multiply7 thành mã byte có thể được gửi đến EVM. Để cài đặt solc, trình biên dịch Solidity, hãy làm theo [tài liệu tham khảo Solidity](https://docs.soliditylang.org/en/latest/installing-solidity.html). (Bạn có thể muốn sử dụng bản phát hành `solc` cũ hơn để khớp với [phiên bản trình biên dịch được sử dụng cho ví dụ của chúng tôi](https://github.com/ethereum/solidity/releases/tag/v0.4.20).)
-Bước tiếp theo là biên dịch hợp đồng Multiply7 thành mã byte có thể được gửi đến Máy chủ ảo Ethereum.
+Bước tiếp theo là biên dịch hợp đồng Multiply7 thành mã byte có thể được gửi đến Máy ảo Ethereum.
```bash
echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin
@@ -1818,7 +1818,7 @@ curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from
{"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"}
```
-Giao dịch được chấp nhận bởi nút và một hàm băm giao dịch được trả về. Hàm băm này có thể được sử dụng để theo dõi giao dịch. Bước tiếp theo là xác định địa chỉ nơi hợp đồng của chúng ta được triển khai. Mỗi giao dịch được thực thi sẽ tạo ra một biên nhận. Biên nhận này chứa nhiều thông tin khác nhau về giao dịch, chẳng hạn như giao dịch được bao gồm trong khối nào và Máy chủ ảo Ethereum đã sử dụng bao nhiêu gas. Nếu một giao dịch
+Giao dịch được chấp nhận bởi nút và một hàm băm giao dịch được trả về. Hàm băm này có thể được sử dụng để theo dõi giao dịch. Bước tiếp theo là xác định địa chỉ nơi hợp đồng của chúng ta được triển khai. Mỗi giao dịch được thực thi sẽ tạo ra một biên nhận. Biên nhận này chứa nhiều thông tin khác nhau về giao dịch, chẳng hạn như giao dịch được bao gồm trong khối nào và Máy ảo Ethereum đã sử dụng bao nhiêu gas. Nếu một giao dịch
tạo ra một hợp đồng, nó cũng sẽ chứa địa chỉ hợp đồng. Chúng ta có thể truy xuất biên nhận bằng phương thức RPC `eth_getTransactionReceipt`.
```bash
@@ -1832,7 +1832,7 @@ Hợp đồng của chúng ta được tạo trên `0x4d03d617d700cf81935d7f797f
Trong ví dụ này, chúng ta sẽ gửi một giao dịch bằng cách sử dụng `eth_sendTransaction` đến phương thức `multiply` của hợp đồng.
-`eth_sendTransaction` yêu cầu một số đối số, cụ thể là `from`, `to` và `data`. `From` là địa chỉ công khai của tài khoản của chúng ta và `to` là địa chỉ hợp đồng. Đối số `data` chứa một tải trọng xác định phương thức nào phải được gọi và với đối số nào. Đây là lúc [ABI (giao diện nhị phân ứng dụng)](https://docs.soliditylang.org/en/latest/abi-spec.html) phát huy tác dụng. ABI là một tệp JSON xác định cách định nghĩa và mã hóa dữ liệu cho Máy chủ ảo Ethereum.
+`eth_sendTransaction` yêu cầu một số đối số, cụ thể là `from`, `to` và `data`. `From` là địa chỉ công khai của tài khoản của chúng ta và `to` là địa chỉ hợp đồng. Đối số `data` chứa một tải trọng xác định phương thức nào phải được gọi và với đối số nào. Đây là lúc [ABI (giao diện nhị phân ứng dụng)](https://docs.soliditylang.org/en/latest/abi-spec.html) phát huy tác dụng. ABI là một tệp JSON xác định cách định nghĩa và mã hóa dữ liệu cho Máy ảo Ethereum.
Các byte của tải trọng xác định phương thức nào trong hợp đồng được gọi. Đây là 4 byte đầu tiên từ hàm băm Keccak trên tên hàm và các loại đối số của nó, được mã hóa dưới dạng hex. Hàm nhân chấp nhận một uint là bí danh cho uint256. Điều này cho chúng ta:
@@ -1880,7 +1880,7 @@ Vì một giao dịch đã được gửi, một hàm băm giao dịch đã đư
}
```
-Biên nhận có chứa một nhật ký. Nhật ký này được tạo bởi Máy chủ ảo Ethereum khi thực thi giao dịch và được bao gồm trong biên nhận. Hàm `multiply` cho thấy sự kiện `Print` đã được đưa ra với đầu vào nhân với 7. Vì đối số cho sự kiện `Print` là một uint256, chúng ta có thể giải mã nó theo các quy tắc ABI, điều này sẽ cho chúng ta kết quả thập phân 42 như mong đợi. Ngoài dữ liệu, cần lưu ý rằng các chủ đề có thể được sử dụng để xác định sự kiện nào đã tạo ra nhật ký:
+Biên nhận có chứa một nhật ký. Nhật ký này được tạo bởi Máy ảo Ethereum khi thực thi giao dịch và được bao gồm trong biên nhận. Hàm `multiply` cho thấy sự kiện `Print` đã được đưa ra với đầu vào nhân với 7. Vì đối số cho sự kiện `Print` là một uint256, chúng ta có thể giải mã nó theo các quy tắc ABI, điều này sẽ cho chúng ta kết quả thập phân 42 như mong đợi. Ngoài dữ liệu, cần lưu ý rằng các chủ đề có thể được sử dụng để xác định sự kiện nào đã tạo ra nhật ký:
```javascript
web3.sha3("Print(uint256)")
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/index.md
index fbb58f48618..ffa7a333834 100644
--- a/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/index.md
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pow/mining/index.md
@@ -52,14 +52,14 @@ Phần sau đây cung cấp tổng quan về cách các giao dịch được kha
2. Người dùng phát tán yêu cầu giao dịch đến toàn bộ mạng Ethereum từ một [nút](/developers/docs/nodes-and-clients/) nào đó.
3. Khi nhận được thông tin về yêu cầu giao dịch mới, mỗi nút trong mạng Ethereum sẽ thêm yêu cầu đó vào bộ nhớ tạm cục bộ, là danh sách tất cả các yêu cầu giao dịch mà chúng biết nhưng chưa được ghi vào chuỗi khối dưới dạng một khối.
4. Tại một thời điểm nào đó, một nút khai thác tổng hợp vài chục hoặc hàng trăm yêu cầu giao dịch thành một [khối](/developers/docs/blocks/) tiềm năng, theo cách tối đa hóa [phí giao dịch](/developers/docs/gas/) mà họ kiếm được trong khi vẫn ở dưới giới hạn gas của khối. Nút khai thác sau đó sẽ là:
- 1. Xác minh tính hợp lệ của từng yêu cầu giao dịch (tức là không ai đang cố gắng chuyển ether ra khỏi một tài khoản mà họ chưa ký, yêu cầu không bị sai định dạng, v.v.), sau đó thực thi mã của yêu cầu, làm thay đổi trạng thái bản sao cục bộ của Máy chủ ảo Ethereum của họ. Thợ đào sẽ nhận phí giao dịch của mỗi yêu cầu giao dịch đó vào tài khoản của chính họ.
- 2. Bắt đầu quá trình tạo chứng chỉ hợp lệ cho khối tiềm năng, sau khi tất cả các yêu cầu giao dịch trong khối đã được xác minh và thực thi trên bản sao Máy chủ ảo Ethereum cục bộ.
-5. Cuối cùng, một thợ đào sẽ hoàn tất việc tạo chứng chỉ cho một khối, trong đó bao gồm yêu cầu giao dịch cụ thể của chúng ta. Sau đó, thợ khai thác phát tán khối đã hoàn tất, trong đó bao gồm chứng chỉ và một giá trị kiểm tra của trạng thái Máy chủ ảo Ethereum mới được khai báo.
-6. Các nút khác nhận được thông tin về khối mới. Họ xác minh chứng chỉ, tự thực thi tất cả các giao dịch trong khối (bao gồm cả giao dịch ban đầu do người dùng của chúng ta phát tán), và kiểm tra xem giá trị kiểm tra của trạng thái Máy chủ ảo Ethereum mới sau khi thực thi tất cả giao dịch có khớp với giá trị kiểm tra của trạng thái do khối của Thợ đào khai báo hay không. Chỉ sau đó, các nút này mới thêm khối này vào cuối chuỗi blockchain của họ và chấp nhận trạng thái Máy chủ ảo Ethereum mới là trạng thái chính thức.
+ 1. Xác minh tính hợp lệ của từng yêu cầu giao dịch (tức là không ai đang cố gắng chuyển ether ra khỏi một tài khoản mà họ chưa ký, yêu cầu không bị sai định dạng, v.v.), sau đó thực thi mã của yêu cầu, làm thay đổi trạng thái bản sao cục bộ của Máy ảo Ethereum của họ. Thợ đào sẽ nhận phí giao dịch của mỗi yêu cầu giao dịch đó vào tài khoản của chính họ.
+ 2. Bắt đầu quá trình tạo chứng chỉ hợp lệ cho khối tiềm năng, sau khi tất cả các yêu cầu giao dịch trong khối đã được xác minh và thực thi trên bản sao Máy ảo Ethereum cục bộ.
+5. Cuối cùng, một thợ đào sẽ hoàn tất việc tạo chứng chỉ cho một khối, trong đó bao gồm yêu cầu giao dịch cụ thể của chúng ta. Sau đó, thợ khai thác phát tán khối đã hoàn tất, trong đó bao gồm chứng chỉ và một giá trị kiểm tra của trạng thái Máy ảo Ethereum mới được khai báo.
+6. Các nút khác nhận được thông tin về khối mới. Họ xác minh chứng chỉ, tự thực thi tất cả các giao dịch trong khối (bao gồm cả giao dịch ban đầu do người dùng của chúng ta phát tán), và kiểm tra xem giá trị kiểm tra của trạng thái Máy ảo Ethereum mới sau khi thực thi tất cả giao dịch có khớp với giá trị kiểm tra của trạng thái do khối của Thợ đào khai báo hay không. Chỉ sau đó, các nút này mới thêm khối này vào cuối chuỗi blockchain của họ và chấp nhận trạng thái Máy ảo Ethereum mới là trạng thái chính thức.
7. Mỗi nút sẽ xóa tất cả các giao dịch trong khối mới khỏi bộ nhớ tạm cục bộ của mình, nơi lưu trữ các yêu cầu giao dịch chưa được thực hiện.
-8. Các nút mới tham gia mạng sẽ tải xuống tất cả các khối theo thứ tự, bao gồm cả khối chứa giao dịch mà chúng ta quan tâm. Chúng khởi tạo một bản sao Máy chủ ảo Ethereum cục bộ (bắt đầu từ trạng thái trống), sau đó thực hiện quá trình thực thi mọi giao dịch trong từng khối trên bản sao Máy chủ ảo Ethereum cục bộ của mình, đồng thời kiểm tra giá trị kiểm tra trạng thái ở mỗi khối trong quá trình này.
+8. Các nút mới tham gia mạng sẽ tải xuống tất cả các khối theo thứ tự, bao gồm cả khối chứa giao dịch mà chúng ta quan tâm. Chúng khởi tạo một bản sao Máy ảo Ethereum cục bộ (bắt đầu từ trạng thái trống), sau đó thực hiện quá trình thực thi mọi giao dịch trong từng khối trên bản sao Máy ảo Ethereum cục bộ của mình, đồng thời kiểm tra giá trị kiểm tra trạng thái ở mỗi khối trong quá trình này.
-Mỗi giao dịch chỉ được khai thác một lần (được đưa vào khối mới và truyền đi lần đầu), nhưng lại được thực thi và xác minh bởi mọi người tham gia trong quá trình cập nhật trạng thái Máy chủ ảo Ethereum chính thức. Điều này nhấn mạnh một trong những phương châm cốt lõi của chuỗi khối: **Đừng tin, hãy xác minh**.
+Mỗi giao dịch chỉ được khai thác một lần (được đưa vào khối mới và truyền đi lần đầu), nhưng lại được thực thi và xác minh bởi mọi người tham gia trong quá trình cập nhật trạng thái Máy ảo Ethereum chính thức. Điều này nhấn mạnh một trong những phương châm cốt lõi của chuỗi khối: **Đừng tin, hãy xác minh**.
## Các khối Ommer (chú) {#ommer-blocks}
@@ -82,5 +82,5 @@ Mạng chính Ethereum chỉ từng sử dụng một thuật toán khai thác -
## Các chủ đề liên quan {#related-topics}
- [Gas](/developers/docs/gas/)
-- [Máy chủ ảo Ethereum](/developers/docs/evm/)
+- [Máy ảo Ethereum](/developers/docs/evm/)
- [Bằng chứng công việc](/developers/docs/consensus-mechanisms/pow/)
diff --git a/public/content/translations/vi/developers/docs/evm/index.md b/public/content/translations/vi/developers/docs/evm/index.md
index 5ab19188eda..f62b45e4eb3 100644
--- a/public/content/translations/vi/developers/docs/evm/index.md
+++ b/public/content/translations/vi/developers/docs/evm/index.md
@@ -1,10 +1,10 @@
---
-title: "Máy chủ Ảo Ethereum"
-description: "Một bài giới thiệu về máy chủ ảo Ethereum và cách nó liên quan đến trạng thái, giao dịch và hợp đồng thông minh."
+title: "Máy Ảo Ethereum"
+description: "Một bài giới thiệu về máy ảo Ethereum và cách nó liên quan đến trạng thái, giao dịch và hợp đồng thông minh."
lang: vi
---
-Máy chủ ảo Ethereum là một môi trường ảo phi tập trung, thực thi mã một cách nhất quán và an toàn trên tất cả các nút của Ethereum. Các nút chạy EVM để thực thi các hợp đồng thông minh, sử dụng "[gas](/developers/docs/gas/)" để đo lường nỗ lực tính toán cần thiết cho các [thao tác](/developers/docs/evm/opcodes/), đảm bảo phân bổ tài nguyên hiệu quả và an ninh mạng.
+Máy ảo Ethereum là một môi trường ảo phi tập trung, thực thi mã một cách nhất quán và an toàn trên tất cả các nút của Ethereum. Các nút chạy EVM để thực thi các hợp đồng thông minh, sử dụng "[gas](/developers/docs/gas/)" để đo lường nỗ lực tính toán cần thiết cho các [thao tác](/developers/docs/evm/opcodes/), đảm bảo phân bổ tài nguyên hiệu quả và an ninh mạng.
## Điều kiện tiên quyết {#prerequisites}
diff --git a/public/content/translations/vi/developers/docs/evm/opcodes/index.md b/public/content/translations/vi/developers/docs/evm/opcodes/index.md
index 5bfd83f9c4e..3f4b11ca4dc 100644
--- a/public/content/translations/vi/developers/docs/evm/opcodes/index.md
+++ b/public/content/translations/vi/developers/docs/evm/opcodes/index.md
@@ -1,6 +1,6 @@
---
title: "Mã lệnh cho EVM"
-description: "Một danh sách cho những mã lệnh cho máy chủ ảo Ethereum."
+description: "Một danh sách cho những mã lệnh cho máy ảo Ethereum."
lang: vi
---
diff --git a/public/content/translations/vi/developers/docs/gas/index.md b/public/content/translations/vi/developers/docs/gas/index.md
index bf086e8cc12..f8214c82179 100644
--- a/public/content/translations/vi/developers/docs/gas/index.md
+++ b/public/content/translations/vi/developers/docs/gas/index.md
@@ -112,7 +112,7 @@ _Sơ đồ được phỏng theo [Ethereum EVM illustrated](https://takenobu-hs.
Giới hạn gas là lượng gas tối đa bạn sẵn sàng trả cho một giao dịch. Các giao dịch phức tạp hơn liên quan đến [hợp đồng thông minh](/developers/docs/smart-contracts/) đòi hỏi nhiều công việc tính toán hơn, vì vậy chúng yêu cầu giới hạn gas cao hơn so với một thanh toán đơn giản. Một giao dịch chuyển ETH tiêu chuẩn yêu cầu giới hạn là 21.000 đơn vị gas.
-Ví dụ, nếu bạn đặt giới hạn Gas là 50.000 cho một giao dịch chuyển ETH đơn giản, EVM sẽ tiêu thụ 21.000 và bạn sẽ nhận lại 29.000 còn dư. Tuy nhiên, nếu bạn đặt quá ít gas, chẳng hạn giới hạn Gas là 20.000 cho một giao dịch chuyển ETH đơn giản, thì giao dịch sẽ thất bại trong giai đoạn xác thực. Nó sẽ bị từ chối trước khi được ghi vào một khối, và gas sẽ không bị tiêu thụ. Ngoài ra, nếu một giao dịch hết Gas trong quá trình thực thi (ví dụ: một hợp đồng thông minh sử dụng hết toàn bộ Gas khi mới chạy được nửa chừng), máy chủ ảo Ethereum sẽ hoàn tác tất cả các thay đổi, nhưng toàn bộ lượng Gas đã cung cấp vẫn sẽ bị tiêu thụ cho phần công việc đã thực hiện.
+Ví dụ, nếu bạn đặt giới hạn Gas là 50.000 cho một giao dịch chuyển ETH đơn giản, EVM sẽ tiêu thụ 21.000 và bạn sẽ nhận lại 29.000 còn dư. Tuy nhiên, nếu bạn đặt quá ít gas, chẳng hạn giới hạn Gas là 20.000 cho một giao dịch chuyển ETH đơn giản, thì giao dịch sẽ thất bại trong giai đoạn xác thực. Nó sẽ bị từ chối trước khi được ghi vào một khối, và gas sẽ không bị tiêu thụ. Ngoài ra, nếu một giao dịch hết Gas trong quá trình thực thi (ví dụ: một hợp đồng thông minh sử dụng hết toàn bộ Gas khi mới chạy được nửa chừng), máy ảo Ethereum sẽ hoàn tác tất cả các thay đổi, nhưng toàn bộ lượng Gas đã cung cấp vẫn sẽ bị tiêu thụ cho phần công việc đã thực hiện.
## Tại sao phí gas có thể lên cao đến vậy? {#why-can-gas-fees-get-so-high}
diff --git a/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
index 721d99a35cb..5afde306be1 100644
--- a/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
+++ b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
@@ -26,7 +26,7 @@ Xem Ander giải thích hàm băm trong chuỗi khối:
Ethereum là một chuỗi khối với một máy tính nhúng vào nó. Nó là nền tảng để xây dựng ứng dụng và tổ chức trong một môi trường phi tập trung, không cần xin phép và chống kiểm duyệt.
-Nếu như trong vũ trụ Ethereum, sẽ chỉ có một, máy tính chuẩn tắc duy nhất (được gọi là máy chủ ảo Ethereum) mà toàn bộ mạng lưới Ethereum đều đồng thuận về trạng thái của nó. Những ai tham gia vào mạng lưới Ethereum (mỗi nút Ethereum) giữ một phiên bản trạng thái của máy tính này. Thêm vào đó, những người tham gia có thể phát tán những yêu cầu từ máy chủ để thực hiện phép tính tùy thích. Khi nào những yêu cầu đó được phát tán đi, những người tham gia mạng lưới sẽ tham gia xác thực, hợp thuwcss hóa, và xử lí tính toán. Sự thực thi này làm một thay đổi trên trạng thái máy chủ ảo Ethereum (EVM), được ghi nhận và phát tán ra khắp mạng lưới.
+Nếu như trong vũ trụ Ethereum, sẽ chỉ có một, máy tính chuẩn tắc duy nhất (được gọi là máy ảo Ethereum) mà toàn bộ mạng lưới Ethereum đều đồng thuận về trạng thái của nó. Những ai tham gia vào mạng lưới Ethereum (mỗi nút Ethereum) giữ một phiên bản trạng thái của máy tính này. Thêm vào đó, những người tham gia có thể phát tán những yêu cầu từ máy chủ để thực hiện phép tính tùy thích. Khi nào những yêu cầu đó được phát tán đi, những người tham gia mạng lưới sẽ tham gia xác thực, hợp thuwcss hóa, và xử lí tính toán. Sự thực thi này làm một thay đổi trên trạng thái máy ảo Ethereum (EVM), được ghi nhận và phát tán ra khắp mạng lưới.
Những yêu cầu tính toán này được gọi là yêu cầu giao dịch; những ghi chép của tất cả giao dịch và trạng thái EVM hiện tại được lưu trữ trên chuỗi khối, sau đó được lưu trữ và đồng tình ở trên tất cả các nút.
@@ -66,7 +66,7 @@ Thứ tự của những khối được ghi vĩnh viễn lên mạng lưới Et
### Máy ảo Ethereum {#evm}
-Máy chủ ảo Ethereum là một máy chủ ảo toàn cầu mà trạng thái của mỗi người tham gia mạng lưới của Ethereum được lưu trữ và đồng thuận. Bất kì người tham gia có thể yêu câu một thực thi mã nguồn tùy thích trên EVM; mã nguồn được thực thi sẽ thay đổi trạng thái của EVM.
+Máy ảo Ethereum là một máy ảo toàn cầu mà trạng thái của mỗi người tham gia mạng lưới của Ethereum được lưu trữ và đồng thuận. Bất kì người tham gia có thể yêu câu một thực thi mã nguồn tùy thích trên EVM; mã nguồn được thực thi sẽ thay đổi trạng thái của EVM.
[Tìm hiểu thêm về EVM](/developers/docs/evm/)
diff --git a/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md b/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md
index 372a5401f71..c73d9c2375a 100644
--- a/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md
+++ b/public/content/translations/vi/developers/docs/smart-contracts/languages/index.md
@@ -226,13 +226,13 @@ Ví dụ trên sẽ cho bạn biết cú phát của hợp đồng được vi
## Yul và Yul+ {#yul}
-Nếu bạn mới tiếp cận Ethereum và chưa thực hiện bất kỳ đoạn mã nào với các ngôn ngữ lập trình hợp đồng thông minh, chúng tôi khuyên bạn nên bắt đầu với Solidity hoặc Vyper. Bạn chỉ nên tìm hiểu Yul hoặc Yu+ khi bạn đã quen thuộc với các kĩ thuật tốt nhất về bảo mật hợp đồng thông minh và các chi tiết công việc với Máy chủ ảo Ethereum.
+Nếu bạn mới tiếp cận Ethereum và chưa thực hiện bất kỳ đoạn mã nào với các ngôn ngữ lập trình hợp đồng thông minh, chúng tôi khuyên bạn nên bắt đầu với Solidity hoặc Vyper. Bạn chỉ nên tìm hiểu Yul hoặc Yu+ khi bạn đã quen thuộc với các kĩ thuật tốt nhất về bảo mật hợp đồng thông minh và các chi tiết công việc với Máy ảo Ethereum.
**Yul**
- Là ngôn ngữ trung gian cho Ethereum.
-- Hỗ trợ [Máy chủ ảo Ethereum (EVM)](/developers/docs/evm) và [Ewasm](https://github.com/ewasm), một WebAssembly đặc trưng của Ethereum, và được thiết kế để trở thành một mẫu số chung có thể sử dụng được của cả hai nền tảng.
-- Mục tiêu tốt cho các giai đoạn tối ưu hóa cấp cao, có thể mang lại lợi ích ngang nhau cho cả hai nền tảng Máy chủ ảo Ethereum và Ewasm.
+- Hỗ trợ [Máy ảo Ethereum (EVM)](/developers/docs/evm) và [Ewasm](https://github.com/ewasm), một WebAssembly đặc trưng của Ethereum, và được thiết kế để trở thành một mẫu số chung có thể sử dụng được của cả hai nền tảng.
+- Mục tiêu tốt cho các giai đoạn tối ưu hóa cấp cao, có thể mang lại lợi ích ngang nhau cho cả hai nền tảng Máy ảo Ethereum và Ewasm.
**Yul+**
@@ -330,7 +330,7 @@ Dưới đây là một vài gợi ý mà bạn có thể cân nhắc nếu bạ
### Thế mạnh của Yul và Yul+? {#yul-advantages}
- Ngôn ngữ cấp thấp đơn giản.
-- Cho phép tiếp cận gần hơn đến phần gốc máy chủ ảo Ethereum, giúp tối ưu hóa việc sử dụng gas trong các hợp động của bạn.
+- Cho phép tiếp cận gần hơn đến phần gốc máy ảo Ethereum, giúp tối ưu hóa việc sử dụng gas trong các hợp động của bạn.
## So sánh các ngôn ngữ {#language-comparisons}
diff --git a/public/content/translations/vi/developers/docs/transactions/index.md b/public/content/translations/vi/developers/docs/transactions/index.md
index e68df091f8e..a65714aeb47 100644
--- a/public/content/translations/vi/developers/docs/transactions/index.md
+++ b/public/content/translations/vi/developers/docs/transactions/index.md
@@ -17,7 +17,7 @@ Một giao dịch Ethereum ám chỉ một hành động được thực hiện

_Sơ đồ được điều chỉnh từ [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_
-Các giao dịch, mà làm thay đổi trạng thái của Máy chủ ảo Ethereum, cần được phát sóng tới toàn bộ mạng lưới. Bất kỳ nút nào đều có thể phát đi một yêu cầu thực thi một giao dịch trên Máy chủ ảo Ethereum, sau khi điều này diễn ra, một trình xác thực sẽ thực thi giao dịch và truyền bá kết quả của sự thay đổi trạng thái đến phần còn lại của mạng lưới.
+Các giao dịch, mà làm thay đổi trạng thái của Máy ảo Ethereum, cần được phát sóng tới toàn bộ mạng lưới. Bất kỳ nút nào đều có thể phát đi một yêu cầu thực thi một giao dịch trên Máy ảo Ethereum, sau khi điều này diễn ra, một trình xác thực sẽ thực thi giao dịch và truyền bá kết quả của sự thay đổi trạng thái đến phần còn lại của mạng lưới.
Các giao dịch yêu cầu một khoản phí và phải được bao gồm trong một khối đã được xác thực. Để làm cho phần tổng quan này đơn giản hơn, chúng tôi sẽ tài trợ phí gas và xác thực ở nơi khác.
diff --git a/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
index db6c8a4c466..38ec652f1d1 100644
--- a/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
+++ b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
@@ -33,7 +33,7 @@ Tài liệu có thể được viết ở các cấp độ khác nhau và nên
Chúng tôi đã thảo luận về các giải pháp khả năng nâng cấp khác nhau trong [bài đăng trên blog của chúng tôi](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Hãy đưa ra lựa chọn có chủ ý về việc có hỗ trợ khả năng nâng cấp hay không trước khi viết bất kỳ mã nào. Quyết định này sẽ ảnh hưởng đến cách bạn cấu trúc mã của mình. Nói chung, chúng tôi khuyên bạn nên:
- **Ưu tiên [di chuyển hợp đồng](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) hơn khả năng nâng cấp.** Các hệ thống di chuyển có nhiều ưu điểm tương tự như các hệ thống có thể nâng cấp, mà không có nhược điểm của chúng.
-- **Sử dụng mẫu tách dữ liệu thay vì mẫu delegatecallproxy.** Nếu dự án của bạn có sự tách biệt trừu tượng rõ ràng, khả năng nâng cấp bằng cách tách dữ liệu sẽ chỉ cần một vài điều chỉnh. Delegatecallproxy đòi hỏi chuyên môn về Máy chủ ảo Ethereum và rất dễ xảy ra lỗi.
+- **Sử dụng mẫu tách dữ liệu thay vì mẫu delegatecallproxy.** Nếu dự án của bạn có sự tách biệt trừu tượng rõ ràng, khả năng nâng cấp bằng cách tách dữ liệu sẽ chỉ cần một vài điều chỉnh. Delegatecallproxy đòi hỏi chuyên môn về Máy ảo Ethereum và rất dễ xảy ra lỗi.
- **Ghi lại quy trình di chuyển/nâng cấp trước khi triển khai.** Nếu bạn phải phản ứng trong tình trạng căng thẳng mà không có bất kỳ hướng dẫn nào, bạn sẽ mắc sai lầm. Viết trước quy trình cần tuân theo. Nó nên bao gồm:
- Các lệnh gọi khởi tạo các hợp đồng mới
- Nơi lưu trữ các khóa và cách truy cập chúng
@@ -79,7 +79,7 @@ Kiến trúc của cơ sở mã nên giúp mã của bạn dễ dàng xem xét.
- **Ưu tiên Solidity 0.5 hơn 0.4 và 0.6.** Theo chúng tôi, Solidity 0.5 bảo mật hơn và có các phương pháp thực hành tích hợp sẵn tốt hơn so với 0.4. Solidity 0.6 đã tỏ ra quá không ổn định để sản xuất và cần thời gian để hoàn thiện.
- **Sử dụng một bản phát hành ổn định để biên dịch; sử dụng bản phát hành mới nhất để kiểm tra cảnh báo.** Kiểm tra xem mã của bạn không có vấn đề nào được báo cáo với phiên bản trình biên dịch mới nhất. Tuy nhiên, Solidity có chu kỳ phát hành nhanh và có tiền sử về lỗi trình biên dịch, vì vậy chúng tôi không khuyến nghị phiên bản mới nhất để triển khai (xem [khuyến nghị về phiên bản solc của Slither](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33)).
-- **Không sử dụng hợp ngữ nội tuyến.** Hợp ngữ đòi hỏi chuyên môn về Máy chủ ảo Ethereum. Đừng viết mã EVM nếu bạn chưa _nắm vững_ sách vàng.
+- **Không sử dụng hợp ngữ nội tuyến.** Hợp ngữ đòi hỏi chuyên môn về Máy ảo Ethereum. Đừng viết mã EVM nếu bạn chưa _nắm vững_ sách vàng.
## Nguyên tắc triển khai {#deployment-guidelines}
diff --git a/public/content/translations/vi/guides/how-to-use-a-wallet/index.md b/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
index 40e97d5c796..93dd4b60a85 100644
--- a/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
+++ b/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
@@ -76,7 +76,7 @@ Bạn có muốn gửi ETH sang một ví khác?
### Nếu tôi sở hữu một địa chỉ ETH, tôi có sở hữu cùng một địa chỉ trên các chuỗi khối khác không?
-Bạn có thể sử dụng địa chỉ trên mọi chuỗi khối tương thích với máy chủ ảo Ethereum (nếu như bạn sử dụng ví có cụm từ khôi phục). [Danh sách](https://chainlist.org/) này sẽ cho bạn biết bạn có thể sử dụng những chuỗi khối nào với cùng một địa chỉ. Một số mạng lưới, như Bitcoin, triển khai một bộ quy tắc mạng hoàn toàn riêng biệt và bạn sẽ cần một địa chỉ khác có định dạng khác. Nếu bạn có ví hợp đồng thông minh, bạn nên kiểm tra trang web sản phẩm của nó để biết thêm thông tin xem nó hỗ trợ những blockchain nào.
+Bạn có thể sử dụng địa chỉ trên mọi chuỗi khối tương thích với máy ảo Ethereum (nếu như bạn sử dụng ví có cụm từ khôi phục). [Danh sách](https://chainlist.org/) này sẽ cho bạn biết bạn có thể sử dụng những chuỗi khối nào với cùng một địa chỉ. Một số mạng lưới, như Bitcoin, triển khai một bộ quy tắc mạng hoàn toàn riêng biệt và bạn sẽ cần một địa chỉ khác có định dạng khác. Nếu bạn có ví hợp đồng thông minh, bạn nên kiểm tra trang web sản phẩm của nó để biết thêm thông tin xem nó hỗ trợ những blockchain nào.
### Tôi có thể sử dụng cùng địa chỉ ví trên nhiều thiết bị?
diff --git a/public/content/translations/vi/roadmap/beacon-chain/index.md b/public/content/translations/vi/roadmap/beacon-chain/index.md
index 5a39fa54822..f73a10145c9 100644
--- a/public/content/translations/vi/roadmap/beacon-chain/index.md
+++ b/public/content/translations/vi/roadmap/beacon-chain/index.md
@@ -67,7 +67,7 @@ Các bản nâng cấp Ethereum đều có liên hệ với nhau. Vậy hãy cù
### Các shard và Chuỗi Hải Đăng {#shards-and-beacon-chain}
-Sharding chỉ có thể triển khai một cách an toàn trong hệ sinh thái Ethereum khi cơ chế đồng thuận bằng chứng cổ phần được áp dụng. Chuỗi Beacon giới thiệu Skating, được hợp nhất với mạng chính, giúp mở đường cho shardign và giúp mở rộng mạng lưới Ethereum.
+Sharding chỉ có thể triển khai một cách an toàn trong hệ sinh thái Ethereum khi cơ chế đồng thuận bằng chứng cổ phần được áp dụng. Chuỗi Beacon giới thiệu Staking, được hợp nhất với mạng chính, giúp mở đường cho sharding và giúp mở rộng mạng lưới Ethereum.
Các chuỗi phân đoạn
diff --git a/public/content/translations/vi/roadmap/danksharding/index.md b/public/content/translations/vi/roadmap/danksharding/index.md
index 3fded5b56d9..1da3290d29d 100644
--- a/public/content/translations/vi/roadmap/danksharding/index.md
+++ b/public/content/translations/vi/roadmap/danksharding/index.md
@@ -17,7 +17,7 @@ summaryPoints:
Tiền phân đoạn thế hệ mới (Proto-Danksharding), còn được gọi là [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), là một cách để các [rollup](/layer-2/#rollups) thêm dữ liệu rẻ hơn vào các khối. Cái tên (Proto-Danksharding) đến từ người đề xuất ý tưởng: Protolambda và Dankrad Feist. Trong lịch sử, các rollup bị giới hạn về mức độ có thể làm cho các giao dịch của người dùng rẻ hơn bởi thực tế là chúng đăng các giao dịch của mình trong `CALLDATA`.
-Việc này rất đắt đỏ vì quá trình này được thực hiện bởi tất cả nút xác thực Ethereum và trực tiếp nằm trên chuỗi vĩnh viễn, mặc dù Rollups chỉ cần dữ liệu một cách tạm thời. Tiền phân đoạn thế hệ mới giới thiệu dữ liệu Blob có thể gửi và nối với khối. Những dữ liệu Blob này không thể truy cập từ máy chủ ảo Ethereum và được tự động xóa đi sau một quãng thời gian (Đặt khoảng 4096 chu kỳ ở thời điểm bài viết này, khoảng 18 ngày). Điều này có nghĩa rằng Rollups có thể gửi dữ liệu một cách rẻ hơn và giúp người dùng cuối tiết kiệm nhờ phí giao dịch rẻ hơn.
+Việc này rất đắt đỏ vì quá trình này được thực hiện bởi tất cả nút xác thực Ethereum và trực tiếp nằm trên chuỗi vĩnh viễn, mặc dù Rollups chỉ cần dữ liệu một cách tạm thời. Tiền phân đoạn thế hệ mới giới thiệu dữ liệu Blob có thể gửi và nối với khối. Những dữ liệu Blob này không thể truy cập từ máy ảo Ethereum và được tự động xóa đi sau một quãng thời gian (Đặt khoảng 4096 chu kỳ ở thời điểm bài viết này, khoảng 18 ngày). Điều này có nghĩa rằng Rollups có thể gửi dữ liệu một cách rẻ hơn và giúp người dùng cuối tiết kiệm nhờ phí giao dịch rẻ hơn.
diff --git a/public/content/translations/vi/roadmap/merge/index.md b/public/content/translations/vi/roadmap/merge/index.md
index e2dbb761eb8..17b8a95d48b 100644
--- a/public/content/translations/vi/roadmap/merge/index.md
+++ b/public/content/translations/vi/roadmap/merge/index.md
@@ -6,9 +6,9 @@ template: upgrade
image: /images/upgrades/merge.png
alt:
summaryPoint1: "Mạng chính Ethereum sử dụng bằng chứng cổ phần, nhưng trước đây thì không như vậy."
-summaryPoint2: "Nâng cấp từ cơ chế bằng chứng công việc sang bằng chứng cổ phần được gọi à sự kiện hợp nhất."
+summaryPoint2: "Nâng cấp từ cơ chế bằng chứng công việc sang bằng chứng cổ phần được gọi là sự kiện hợp nhất."
summaryPoint3: "Sự kiện hợp nhất là sự kiện mạng chính Ethereum bắt đầu hợp nhất với chuỗi bằng chứng cổ phần riêng gọi là chuỗi Beacon, bây giờ là một chuỗi thống nhất."
-summaryPoint4: "Sự kiện sự kiện hợp nhất giảm ~95,95% năng lượng tiêu thụ của Ethereum."
+summaryPoint4: "Sự kiện hợp nhất giảm ~99,95% năng lượng tiêu thụ của Ethereum."
---
diff --git a/src/intl/vi/glossary.json b/src/intl/vi/glossary.json
index 5b90e4b7540..8d8a790201c 100644
--- a/src/intl/vi/glossary.json
+++ b/src/intl/vi/glossary.json
@@ -153,9 +153,9 @@
"ether-definition": "Tiền mã hóa gốc của Ethereum, thường được gọi là “ETH”. Nó được sử dụng để trang trải phí giao dịch khi sử dụng hệ sinh thái và ứng dụng Ethereum. Tìm hiểu thêm về ether.",
"events-term": "Sự kiện",
"events-definition": "Cho phép sử dụng các cơ sở ghi nhật ký EVM. Các ứng dụng phi tập trung có thể lắng nghe các sự kiện và sử dụng chúng để kích hoạt các lệnh gọi lại JavaScript trong giao diện người dùng. Tìm hiểu thêm về các sự kiện và nhật ký",
- "evm-term": "Máy chủ Ảo Ethereum",
+ "evm-term": "Máy Ảo Ethereum",
"evm-definition": "Một máy ảo dựa trên ngăn xếp thực thi bytecode. Trong Ethereum, mô hình thực thi chỉ định cách trạng thái hệ thống bị thay đổi với một loạt các hướng dẫn bytecode và một bộ dữ liệu môi trường nhỏ. Điều này được chỉ định thông qua một mô hình chính thức của một máy trạng thái ảo. Tìm hiểu thêm về Máy ảo Ethereum.",
- "evm-assembly-language-term": "Ngôn ngữ Mãy chủ Ảo Ethereum tổ hợp",
+ "evm-assembly-language-term": "Ngôn ngữ Máy Ảo Ethereum tổ hợp",
"evm-assembly-language-definition": "Một dạng đọc được bằng mắt của Chỉ thị biên dịch EVM.",
"fallback-function-term": "Hàm dự phòng",
"fallback-function-definition": "Một hàm mặc định được gọi trong trường hợp không có dữ liệu hoặc không có tên hàm được khai báo.",
diff --git a/src/intl/vi/page-10-year-anniversary.json b/src/intl/vi/page-10-year-anniversary.json
index 441c76be99e..0901240db56 100644
--- a/src/intl/vi/page-10-year-anniversary.json
+++ b/src/intl/vi/page-10-year-anniversary.json
@@ -1,13 +1,13 @@
{
"page-10-year-anniversary-meta-title": "Kỷ niệm 10 năm ",
- "page-10-year-anniversary-meta-description": "Kỷ niệm 10 năm chống lại kiểm duyệt, 100% hoạt động liên tục, phi tập trung, xây dựng cộng đồng, phát triển lập trình viên, hợp tác quốc tế, giá trị cyperpunk, hackathon, tài chính công cộng, khả năng trung hoà phi thường, khu vườn bất tận, giao diện khách đa dạng và hơn thế nữa.",
+ "page-10-year-anniversary-meta-description": "Kỷ niệm 10 năm chống lại kiểm duyệt, 100% hoạt động liên tục, phi tập trung, xây dựng cộng đồng, phát triển lập trình viên, hợp tác quốc tế, giá trị cypherpunk, hackathon, tài chính công cộng, khả năng trung hoà phi thường, khu vườn bất tận, giao diện khách đa dạng và hơn thế nữa.",
"page-10-year-censorship-resistance": "không bên thứ ba kiểm duyệt",
"page-10-year-uptime": "100% hoạt động liên tục",
"page-10-year-decentralization": "phi tập trung",
"page-10-year-community-building": "xây dựng cộng đồng",
"page-10-year-developer-growth": "phát triển lập trình viên",
"page-10-year-global-collaboration": "hợp tác toàn cầu",
- "page-10-year-cypherpunk-values": "giá trị cyperpunk",
+ "page-10-year-cypherpunk-values": "giá trị cypherpunk",
"page-10-year-hackathons": "hackathon",
"page-10-year-permissionless-finance": "tài chính công cộng",
"page-10-year-credible-neutrality": "khả năng trung hoà phi thường",
@@ -36,7 +36,7 @@
"page-10-year-stories-title": "10 năm của",
"page-10-year-stories-subtitle": "Câu Chuyện",
"page-10-year-stories-description-1": "Tổng quan cách sử dụng Ethereum trong cuộc sống hàng ngày",
- "page-10-year-stories-description-2": "Từ hàng triệu ví tới mọi ngóc ngách trong cuộc sống, người ta sử dụng Etherem theo những phương thức đầy cảm hứng. Những câu chuyện có thật này cho thấy rõ sự sáng tạo, tự do, và sự kết nối được hỗ trợ bởi Ethereum.",
+ "page-10-year-stories-description-2": "Từ hàng triệu ví tới mọi ngóc ngách trong cuộc sống, người ta sử dụng Ethereum theo những phương thức đầy cảm hứng. Những câu chuyện có thật này cho thấy rõ sự sáng tạo, tự do, và sự kết nối được hỗ trợ bởi Ethereum.",
"page-10-year-stories-cta": "Chia sẻ câu chuyện của bạn",
"page-10-year-ideas-title": "Bạn có ý tưởng nào đó để cộng đồng có thể kỷ niệm?",
"page-10-year-ideas-description": "Kỷ vật onchain, một trò chơi hỏi đáp toàn cầu về Ethereum, giới hạn duy nhất là bầu trời! Liên hệ để chia sẻ ý tưởng bên dưới.",
@@ -52,7 +52,7 @@
"page-10-year-countdown-second": "giây",
"page-10-year-countdown-seconds": "giây",
"page-10-year-banner-header": "Kỉ niệm 10 năm Ethereum",
- "page-10-year-banner-launch-text": "Vào ngày 3 tháng 7 2015, lúc 3;44 chiều UTC, block đầu tiên của Ethereum đã được khởi sinh.",
+ "page-10-year-banner-launch-text": "Vào ngày 30 tháng 7 2015, lúc 3:44 chiều UTC, block đầu tiên của Ethereum đã được khởi sinh.",
"page-10-year-banner-tagline": "Mười năm qua, vĩnh cửu trường tồn! 🚀",
"page-10-year-banner-cta": "Tham dự buổi tiệc",
"page-10-year-stories-read-more": "Đọc thêm",
@@ -69,7 +69,7 @@
"page-10-year-innovation-card-2-title": "DAI: Đồng stablecoin tiên phong",
"page-10-year-innovation-card-2-date": "Tháng 12, 2015",
"page-10-year-innovation-card-2-description-1": "Stablecoin phi tập trung đầu tiên ra mắt. DAI duy trì neo mềm với đô la nhờ thế chấp tài sản bằng tiền mã hóa được khóa trong các hợp đồng thông minh.",
- "page-10-year-innovation-card-2-description-2": "Không giống như Stablecoin tập trung quản lý bởi công ty, DAI tự quản lý bằng tổ chức ẩn danh phi tập trung (DAO), làm cho nó phi tín nhiệm và phụ thuộc cộng đồng.",
+ "page-10-year-innovation-card-2-description-2": "Không giống như Stablecoin tập trung quản lý bởi công ty, DAI tự quản lý bằng tổ chức tự trị phi tập trung (DAO), làm cho nó phi tín nhiệm và phụ thuộc cộng đồng.",
"page-10-year-innovation-card-3-title": "CryptoKitties là NFT thuộc mạng \"Frontier\"",
"page-10-year-innovation-card-3-date": "Tháng 11, 2017",
"page-10-year-innovation-card-3-description-1": "CryptoKitties mang đến việc sở hữu số vào ứng dụng. Trò chơi NFT này cho thấy chuỗi khối có thể ở ra những hình thức biểu đạt, sưu tầm và văn hóa mới trên không gian trực tuyến.",
diff --git a/src/intl/vi/page-developers-docs.json b/src/intl/vi/page-developers-docs.json
index 0386ea6a3a6..d31cca3d497 100644
--- a/src/intl/vi/page-developers-docs.json
+++ b/src/intl/vi/page-developers-docs.json
@@ -11,7 +11,7 @@
"docs-nav-compiling-smart-contracts": "Biên soạn hợp đồng thông minh",
"docs-nav-composability": "Khả năng tổng hợp",
"docs-nav-consensus-mechanisms": "Cơ chế đồng thuận",
- "docs-nav-consensus-mechanisms-description": "Các nốt đơn lẻ trên mạng lưới phi tập trung đồng thuận theo trạng thái hiện hành của hệ thống như thế nào",
+ "docs-nav-consensus-mechanisms-description": "Các nút đơn lẻ trên mạng lưới phi tập trung đồng thuận theo trạng thái hiện hành của hệ thống như thế nào",
"docs-nav-gasper": "Gasper",
"docs-nav-weak-subjectivity": "Chủ quan yếu kém",
"docs-nav-attestations": "Các chứng thực",
@@ -77,9 +77,9 @@
"docs-nav-opcodes": "Mã vận hành",
"docs-nav-run-a-node": "Vận hành một nút",
"docs-nav-client-diversity": "Đa máy khách",
- "docs-nav-bootnodes": "Nốt khởi động",
+ "docs-nav-bootnodes": "Nút khởi động",
"docs-nav-light-clients": "Các ứng dụng nhẹ",
- "docs-nav-nodes-as-a-service": "Nốt như một dịch vụ",
+ "docs-nav-nodes-as-a-service": "Nút như một dịch vụ",
"docs-nav-oracles": "Oracles",
"docs-nav-oracles-description": "Thông tin bị được đưa vào blockchain Ethereum như thế nào",
"docs-nav-programming-languages": "Ngôn ngữ lập trình",
@@ -131,9 +131,9 @@
"docs-nav-data-structures-and-encoding-patricia-merkle-trie": "Cây Merkle Patricia",
"docs-nav-data-structures-and-encoding-ssz": "Xếp theo thứ tự đơn giản (SSZ)",
"docs-nav-data-structures-and-encoding-web3-secret-storage": "Định nghĩa lưu trữ bí mật Web3",
- "docs-nav-rewards-and-penalties": "Hình phạt và phần thưởng của Bằng chứng ủy quyền (Pos)",
- "docs-nav-node-architecture": "Kiến trúc nốt",
- "docs-nav-archive-nodes": "Các nốt lưu trữ",
+ "docs-nav-rewards-and-penalties": "Hình phạt và phần thưởng của Bằng chứng cổ phần (PoS)",
+ "docs-nav-node-architecture": "Kiến trúc nút",
+ "docs-nav-archive-nodes": "Các nút lưu trữ",
"docs-nav-attack-and-defense": "Phòng thủ và tấn công Bằng chứng cổ phần (PoS)",
"docs-nav-pos-vs-pow": "Bằng chứng cổ phần và bằng chứng công việc",
"docs-nav-pos-faqs": "Câu hỏi thường gặp về bằng chứng cổ phần",
diff --git a/src/intl/vi/page-founders.json b/src/intl/vi/page-founders.json
index 1530255789e..166952d926e 100644
--- a/src/intl/vi/page-founders.json
+++ b/src/intl/vi/page-founders.json
@@ -44,7 +44,7 @@
"page-founders-partnerships-protocol-guild-highlight-1": "28 triệu đô la đã được huy động cho các nhà phát triển cốt lõi",
"page-founders-partnerships-unichain-description": "Một loạt các chương trình và tài nguyên được thiết kế để hỗ trợ cộng đồng nhà phát triển mới nổi của Unichain",
"page-founders-partnerships-unichain-highlight-1": "Các cơ chế DeFi mới lạ",
- "page-founders-story-dith-p1": "Hỗ trợ Nhà sáng lập của EF rất tuyệt vời, họ là một đối tác tư tưởng và cố vấn khách quan tuyệt vời cho chúng tôi khi chúng tôi hoàn thành vòng huy động vốn đầu tiên. Tôi không ngần ngại giới thiệu các nhà sáng lập Máy chủ ảo Ethereum khác liên hệ với họ.",
+ "page-founders-story-dith-p1": "Hỗ trợ Nhà sáng lập của EF rất tuyệt vời, họ là một đối tác tư tưởng và cố vấn khách quan tuyệt vời cho chúng tôi khi chúng tôi hoàn thành vòng huy động vốn đầu tiên. Tôi không ngần ngại giới thiệu các nhà sáng lập Máy ảo Ethereum khác liên hệ với họ.",
"page-founders-story-fahim-p1": "Đội ngũ Thành công cho Nhà sáng lập là một tài sản lớn đối với hệ sinh thái Ethereum. Họ thực sự quan tâm đến việc giúp các đội ngũ giành chiến thắng, và sự hỗ trợ thực tế cũng như cam kết chân thành của họ trong việc giúp đỡ các đội ngũ như Optimism là điều có thể thấy rõ. Tôi rất vui được tiếp tục hợp tác với họ và cùng nhau củng cố hệ sinh thái của chúng ta.",
"page-founders-story-kedian-p1": "Người liên hệ của chúng tôi tại EF đã đóng vai trò quan trọng trong việc hướng dẫn chúng tôi, không chỉ bằng cách chia sẻ những hiểu biết quý giá về tính năng sắp tới của chúng tôi mà còn bằng cách giới thiệu chúng tôi với các L2 quan trọng trong hệ sinh thái Ethereum.",
"page-founders-story-kedian-p2": "Nhờ phản hồi của họ về chiến lược GTM của chúng tôi, chúng tôi đã đẩy nhanh việc ra quyết định, giảm thời gian dành cho nghiên cứu và tập trung trực tiếp vào việc thực thi.",
diff --git a/src/intl/vi/page-learn.json b/src/intl/vi/page-learn.json
index 05303ad5429..5c6066a0096 100644
--- a/src/intl/vi/page-learn.json
+++ b/src/intl/vi/page-learn.json
@@ -88,7 +88,7 @@
"more-on-ethereum-protocol-title": "Thông tin thêm về giao thức Ethereum",
"more-on-ethereum-protocol-ethereum-for-developers": "Ethereum dành cho các nhà phát triển",
"more-on-ethereum-protocol-consensus": "Cơ chế đồng thuận bằng chứng cổ phần của Ethereum",
- "more-on-ethereum-protocol-evm": "Máy chủ ảo Ethereum (EVM)",
+ "more-on-ethereum-protocol-evm": "Máy ảo Ethereum (EVM)",
"more-on-ethereum-protocol-nodes-and-clients": "Các nút và ứng dụng của Ethereum",
"ethereum-community-description": "Thành công của Ethereum có được là nhờ vào cộng đồng những người nhiệt huyết và tận tâm. Hàng ngàn cá nhân tài năng và năng động đang chung tay thúc đẩy tầm nhìn của Ethereum, đồng thời thúc đẩy bảo mật mạng lưới thông qua staking và tham gia quản trị. Hãy tham gia cùng chúng tôi!",
"community-hub-card-title": "Diễn đàn cộng đồng",
diff --git a/src/intl/vi/page-roadmap-vision.json b/src/intl/vi/page-roadmap-vision.json
index d7647faed10..e46b458c33e 100644
--- a/src/intl/vi/page-roadmap-vision.json
+++ b/src/intl/vi/page-roadmap-vision.json
@@ -36,14 +36,14 @@
"page-roadmap-vision-title-1": "Mạng lưới bị nghẽn",
"page-roadmap-vision-title-2": "Dung lượng đĩa",
"page-roadmap-vision-title-3": "Quá hao tổn năng lượng",
- "page-roadmap-vision-trilemma-cardtext-1": "Ethereum khi nâng cấp sẽ khiến Ethereum mở rộng, bảo mật và phi tập trung. Tham gia bằng đóng góp cổ phần (staking) đã giảm thiểu rào cản tham gia và hạn chế kinh tế quy mô, tạo ra một mạng lưới lớn hơn, tập trung hơn.",
+ "page-roadmap-vision-trilemma-cardtext-1": "Ethereum khi nâng cấp sẽ khiến Ethereum mở rộng, bảo mật và phi tập trung. Tham gia bằng đóng góp cổ phần (staking) đã giảm thiểu rào cản tham gia và hạn chế kinh tế quy mô, tạo ra một mạng lưới lớn hơn, phi tập trung hơn.",
"page-roadmap-vision-trilemma-cardtext-2": "Những mạng lưới chuỗi khối an toàn và phi tập trung bắt buộc mỗi nút (node) trong mạng lưới phải xác minh từng giao dịch được xử lý bởi chuỗi. Khối lượng công việc đồ sộ này giới hạn số lượng giao dịch có thể được thực hiện ở tại một thời điểm bất kì. Phi tập trung và an toàn là những tính chất cơ bản của chuỗi khối Ethereum hôm nay.",
"page-roadmap-vision-trilemma-cardtext-3": "Các mạng phi tập trung hoạt động bằng cách gửi thông tin về các giao dịch qua các nút - toàn bộ mạng cần biết về bất kỳ thay đổi trạng thái nào. Việc mở rộng quy mô giao dịch mỗi giây trên một mạng phi tập trung gây ra rủi ro bảo mật vì càng nhiều giao dịch, độ trễ càng lâu, xác suất bị tấn công càng cao khi thông tin đang lưu chuyển.",
"page-roadmap-vision-trilemma-cardtext-4": "Tăng kích thước và sức mạnh của các nút Ethereum có thể tăng giao dịch mỗi giây một cách an toàn, nhưng yêu cầu phần cứng sẽ hạn chế ai có thể làm điều đó - điều này đe dọa đến sự phân cấp. Hy vọng rằng sharding và bằng chứng cổ phần sẽ cho phép Ethereum mở rộng quy mô bằng cách tăng số lượng nút chứ không phải kích thước nút.",
"page-roadmap-vision-trilemma-h2": "Thách thức của việc mở rộng quy mô một cách phi tập trung",
"page-roadmap-vision-trilemma-modal-tip": "Bấm vào những vòng tròn bên dưới để hiểu rõ hơn về những khó khăn trong việc mở rộng quy mô một cách phi tập trung",
"page-roadmap-vision-trilemma-p": "Một cách đơn giản để giải quyết các vấn đề của Ethereum là làm cho nó trở nên tập trung hơn. Nhưng phân cấp là quá quan trọng. Đó là sự phân cấp mang lại cho Ethereum tính trung lập, khả năng chống kiểm duyệt, tính mở, quyền sở hữu dữ liệu và bảo mật gần như không thể phá vỡ.",
- "page-roadmap-vision-trilemma-p-1": "Tầm nhìn của Ethereum là trở nên an toàn và có khả năng mở rộng cao hơn nhưng đồng thời cũng duy trì tính phi tập trung. Đạt được cả 3 yếu tố này là một vấn đề nan giải, giống như \bbộ ba bất khả thi về tính năng mở rộng.",
+ "page-roadmap-vision-trilemma-p-1": "Tầm nhìn của Ethereum là trở nên an toàn và có khả năng mở rộng cao hơn nhưng đồng thời cũng duy trì tính phi tập trung. Đạt được cả 3 yếu tố này là một vấn đề nan giải, giống như bộ ba bất khả thi về tính năng mở rộng.",
"page-roadmap-vision-trilemma-p-2": "Ethereum nâng cấp nhằm giải quyết câu đố có 3 vế này. Tuy nhiên, thử thách là không nhỏ.",
"page-roadmap-vision-trilemma-press-button": "Bấm vào các nút trên hình tam giác để hiểu thêm về những thách thức của việc mở rộng quy mô một cách phi tập trung.",
"page-roadmap-vision-trilemma-text-1": "Phi tập trung",
diff --git a/src/intl/vi/page-roadmap.json b/src/intl/vi/page-roadmap.json
index c80d50d7339..422494b8ecd 100644
--- a/src/intl/vi/page-roadmap.json
+++ b/src/intl/vi/page-roadmap.json
@@ -3,7 +3,7 @@
"page-roadmap-meta-title": "Lộ trình Ethereum | ethereum.org",
"page-roadmap-meta-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.",
"page-roadmap-banner-notification": "Sự phát triển của Ethereum được thúc đẩy bởi cộng đồng và có thể thay đổi.",
- "page-roadmap-changes-coming-title": "Có những nâng cấp nào sẽ đến với Etherum?",
+ "page-roadmap-changes-coming-title": "Có những nâng cấp nào sẽ đến với Ethereum?",
"page-roadmap-changes-coming-description": "Ethereum đã là một nền tảng mạnh mẽ, nhưng vẫn đang được cải thiện thêm. Một loạt những cải tiến đầy tham vọng sẽ nâng cấp Ethereum từ hiện tại thành một nền tảng hoàn chỉnh, bền bỉ nhất.",
"page-roadmap-cheaper-transactions-title": "Giao dịch rẻ hơn",
"page-roadmap-cheaper-transactions-description": "Rollups thì đắt đỏ quá và phải dựa vào các thành phần tập trung, khiến người dùng phải đặt quá nhiều niềm tin vào những vận hành viên. Kế hoạch đã có các giải pháp cho cả hai vấn đề này.",
@@ -17,7 +17,7 @@
"page-roadmap-future-proofing-title": "Đáp ứng nhu cầu trong tương lai",
"page-roadmap-future-proofing-description": "Các nhà nghiên cứu và phát triển Ethereum đang giải quyết các vấn đề của ngày mai ngay từ hôm nay, chuẩn bị mạng lưới cho các thế hệ tương lai.",
"page-roadmap-future-proofing-button": "Thêm về cơ chế future-proofing",
- "page-roadmap-why-need-title": "Tại sao Etherum cần một lộ trình?",
+ "page-roadmap-why-need-title": "Tại sao Ethereum cần một lộ trình?",
"page-roadmap-why-need-description": "Ethereum thường xuyên được nâng cấp để cải thiện khả năng mở rộng, bảo mật, hoặc tính bền vững. Một trong những điểm mạnh cốt lõi của Ethereum là khả năng thích ứng khi có những ý tưởng mới từ nghiên cứu và phát triển. Sự linh hoạt này giúp Ethereum có thể đối phó với những thách thức mới và theo kịp các đột phá công nghệ tiên tiến nhất.",
"page-roadmap-how-defined-title": "Cách lộ trình được xác định",
"page-roadmap-how-defined-p1": "Lộ trình này đa phần là kết quả nhiều năm làm việc của các nhà nghiên cứu và các nhà phát triển - vì giao thức rất mang tính kỹ thuật - nhưng bất kỳ người nào có động lực đều có thể tham gia.",
@@ -37,7 +37,7 @@
"page-roadmap-learn-more": "Tìm hiểu thêm",
"page-roadmap-timeline-title": "Timeline cho những bản nâng cấp này là gì?",
"page-roadmap-blocks-alt": "Khối Ethereum",
- "page-roadmap-faq-1-title": "Lộ trình của Etherum có thay đổi theo thời gian không?",
+ "page-roadmap-faq-1-title": "Lộ trình của Ethereum có thay đổi theo thời gian không?",
"page-roadmap-faq-1-p1": "Vâng—gần như chắc chắn.",
"page-roadmap-faq-1-p1-continued": "Lộ trình là kế hoạch hiện tại để nâng cấp Ethereum, bao gồm cả các kế hoạch ngắn hạn và dài hạn. Chúng tôi mong rằng lộ trình sẽ thay đổi khi có thông tin và công nghệ mới.",
"page-roadmap-faq-1-p2": "Hãy coi lộ trình của Ethereum như một khoản các mục tiêu nhằm nâng cấp Ethereum; đó là cốt lõi của giả thuyết tốt nhất của các nhà nghiên cứu và phát triển về con đường tối ưu nhất để Ethereum tiến lên phía trước.",
diff --git a/src/intl/vi/page-trillion-dollar-security.json b/src/intl/vi/page-trillion-dollar-security.json
index 4487cd9456c..5988d84ace1 100644
--- a/src/intl/vi/page-trillion-dollar-security.json
+++ b/src/intl/vi/page-trillion-dollar-security.json
@@ -17,8 +17,8 @@
"page-trillion-dollar-security-user-experience-title": "Trải nghiệm người dùng (UX)",
"page-trillion-dollar-security-user-experience-description": "Các vấn đề ảnh hưởng đến khả năng của người dùng trong việc quản lý khóa riêng một cách an toàn, tương tác với các ứng dụng trên chuỗi, và ký các giao dịch.",
"page-trillion-dollar-security-smart-contract-title": "Bảo mật hợp đồng thông minh",
- "page-trillion-dollar-security-smart-contract-description": "The security of the smart contract components of Ethereum applications, and the lifecycle of software production that shapes them.",
- "page-trillion-dollar-security-infrastructure-title": "An toàn của các thành phần hợp đồng thông minh trong các ứng dụng Ethereum, và vòng đời sản xuất phần mềm hình thành chúng.",
+ "page-trillion-dollar-security-smart-contract-description": "An toàn của các thành phần hợp đồng thông minh trong các ứng dụng Ethereum, và vòng đời sản xuất phần mềm hình thành chúng.",
+ "page-trillion-dollar-security-infrastructure-title": "An ninh hạ tầng và đám mây",
"page-trillion-dollar-security-infrastructure-description": "Vấn đề với hạ tầng (cả hạ tầng đặc thù cho tiền điện tử và hạ tầng truyền thống) mà các ứng dụng Ethereum phụ thuộc vào, như các chuỗi L2, RPC, dịch vụ lưu trữ đám mây và nhiều hơn nữa.",
"page-trillion-dollar-security-consensus-title": "Giao thức đồng thuận",
"page-trillion-dollar-security-consensus-description": "Các thuộc tính bảo mật của giao thức cốt lõi, nhằm bảo vệ blockchain Ethereum khỏi các cuộc tấn công hoặc thao túng.",
diff --git a/src/intl/vi/page-upgrades-get-involved.json b/src/intl/vi/page-upgrades-get-involved.json
index fef3e904569..12797777fc0 100644
--- a/src/intl/vi/page-upgrades-get-involved.json
+++ b/src/intl/vi/page-upgrades-get-involved.json
@@ -11,7 +11,7 @@
"page-upgrades-get-involved-bug-li-4": "và nhiều thứ khác",
"page-upgrades-get-involved-desc-1": "Chạy một ứng dụng giúp bạn gia nhập cộng đồng Ethereum. Ứng dụng của bạn sẽ giúp kiểm soát các giao dịch và các blocks mới.",
"page-upgrades-get-involved-desc-2": "Nếu bạn có ETH, bạn có thể góp vốn (stake) để trở thành thợ phê chuẩn (vai trò như thợ đào trong bằng chứng công việc) và giúp bảo đảm tính bảo mật của hệ thống. Bạn sẽ nhận ETH với tư cách một thợ phê chuẩn.",
- "page-upgrades-get-involved-desc-3": "Tham gia vào cộng đồng thử nghiệm! Thử kiểm tra Ethereum nâng cấp trước khi chúng chuyển đổi, tìm ra lỗi và \bnhận phần thưởng.",
+ "page-upgrades-get-involved-desc-3": "Tham gia vào cộng đồng thử nghiệm! Thử kiểm tra Ethereum nâng cấp trước khi chúng chuyển đổi, tìm ra lỗi và nhận phần thưởng.",
"page-upgrades-get-involved-ethresearch-1": "Sharding",
"page-upgrades-get-involved-ethresearch-2": "The Merge",
"page-upgrades-get-involved-ethresearch-3": "Thực thi phân mảnh",
@@ -19,10 +19,10 @@
"page-upgrades-get-involved-how": "Bạn muốn tham gia bằng cách nào?",
"page-upgrades-get-involved-how-desc": "Cộng đồng Ethereum sẽ luôn được hưởng lợi từ các lần folks mạng lưới bởi việc chạy clients, kí gửi và săn lỗi bảo mật.",
"page-upgrades-get-involved-join": "Tham gia nghiên cứu",
- "page-upgrades-get-involved-join-desc": "Hầu như mọi thứ với Ethereum - bao gồm các nghiên cứu được công khai rõ ràng. Nó tương tự việc bạn có thể tham gia vào các cuộc thảo luận hoặc chỉ cần đọc qua những đề tài các nhà nghiên cứu Ethereum bàn tán. Trang ethresear.ch chứa các chủ đề bao gồm nâng cấp đồng thuận, tollups và nhiều thứ khác nữa.",
+ "page-upgrades-get-involved-join-desc": "Hầu như mọi thứ với Ethereum - bao gồm các nghiên cứu được công khai rõ ràng. Nó tương tự việc bạn có thể tham gia vào các cuộc thảo luận hoặc chỉ cần đọc qua những đề tài các nhà nghiên cứu Ethereum bàn tán. Trang ethresear.ch chứa các chủ đề bao gồm nâng cấp đồng thuận, rollups và nhiều thứ khác nữa.",
"page-upgrades-get-involved-meta-description": "Các cách để tham gia vào nâng cấp của Ethereum: chạy nodes, ký gửi tài sản, săn lỗi bảo mật và nhiều thứ khác.",
"page-upgrades-get-involved-run-clients": "Chạy một cặp ứng dụng",
- "page-upgrades-get-involved-run-clients-desc": "Ứng dụng là phần mềm chạy trên blockchain, và trong trường hợp của Ethereum, một nốt đầy đủ cần có 2 ứng dụng: một tầng ứng dụng vận hành và một tầng ứng dụng đồng thuận. Một nốt đầy đủ có thể kiểm tra các giao dịch và đặt cọc ETH, cũng như tạo khối. Mỗi ứng dụng có tính năng riêng nhưng nhìn chung có chức năng giống nhau, vì vậy chúng tôi khuyến khích bạn lựa chọn ứng dụng ít người dùng bất cứ khi nào có thể để giúp nhóm ứng dụng đa dạng và bảo mật.",
+ "page-upgrades-get-involved-run-clients-desc": "Ứng dụng là phần mềm chạy trên blockchain, và trong trường hợp của Ethereum, một nút đầy đủ cần có 2 ứng dụng: một tầng ứng dụng vận hành và một tầng ứng dụng đồng thuận. Một nút đầy đủ có thể kiểm tra các giao dịch và đặt cọc ETH, cũng như tạo khối. Mỗi ứng dụng có tính năng riêng nhưng nhìn chung có chức năng giống nhau, vì vậy chúng tôi khuyến khích bạn lựa chọn ứng dụng ít người dùng bất cứ khi nào có thể để giúp nhóm ứng dụng đa dạng và bảo mật.",
"page-upgrades-get-involved-run-clients-desc-link": "Tìm hiểu thêm về sự đa dạng ứng dụng.",
"page-upgrades-get-involved-run-clients-execution": "Ứng dụng tầng vận hành",
"page-upgrades-get-involved-run-clients-execution-desc": "Những ứng dụng này được hình thành giống như ứng dụng 'Eth1' nhưng thuật ngữ này được tán thành như ứng dụng 'tầng vận hành'.",
diff --git a/src/intl/vi/page-what-is-ethereum.json b/src/intl/vi/page-what-is-ethereum.json
index da1258dd057..4551eee8541 100644
--- a/src/intl/vi/page-what-is-ethereum.json
+++ b/src/intl/vi/page-what-is-ethereum.json
@@ -8,7 +8,7 @@
"page-what-is-ethereum-ethereum-intro-2": "Ý tưởng đằng sau Ethereum rất đơn giản. Trong khi Bitcoin cho phép bạn gửi và nhận tiền mặt kỹ thuật số, Ethereum sẽ xây dựng dựa trên điều này với các chương trình mã nguồn mở được gọi là hợp đồng thông minh.",
"page-what-is-ethereum-ethereum-intro-3": "Hợp đồng thông minh cho phép bất kỳ ai tạo ra tài sản kỹ thuật số và ứng dụng phi tập trung (dapps) của riêng mình, hoạt động 24/7 trên toàn cầu. Và khác với các ngân hàng, tập đoàn hay tổ chức khác, hợp đồng thông minh có sẵn cho bất kỳ ai có kết nối internet.",
"page-what-is-ethereum-ethereum-intro-4": "Kể từ năm 2015, Ethereum đã phát triển thành một hệ sinh thái phát triển mạnh mẽ gồm các tài sản kỹ thuật số như stablecoins, token không thể thay thế (NFTs) và token quản trị, cũng như một thế giới rộng lớn của các dapp cho tài chính phi tập trung (DeFi), nghệ thuật và đồ sưu tập, trò chơi và mạng xã hội phi tập trung.",
- "page-what-is-ethereum-ethereum-intro-5": "Tổng thể, hệ sinh thái này được gọi là \"web3<\", đại diện cho giai đoạn thứ ba của internet tập trung vào quyền sở hữu.",
+ "page-what-is-ethereum-ethereum-intro-5": "Tổng thể, hệ sinh thái này được gọi là \"web3\", đại diện cho giai đoạn thứ ba của internet tập trung vào quyền sở hữu.",
"page-what-is-ethereum-ethereum-intro-6": "Hiện nay, Ethereum được sử dụng bởi hàng triệu người trên toàn thế giới sở hữu hàng tỷ đô la tài sản, những người gửi và nhận hàng triệu tỷ đô la mỗi năm—tất cả đều không cần đến ngân hàng.",
"page-what-is-ethereum-ethereum-intro-7": "Ở trung tâm của tất cả những điều này là đồng tiền mã hóa của Ethereum, ether (ETH), một loại tiền kỹ thuật số mới được dùng để vận hành toàn bộ mạng lưới.",
"page-what-is-ethereum-network-title": "Mạng lưới Ethereum là gì?",
From 9964d6ff0a6ae6e534abe645992820192cef1082 Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Tue, 17 Feb 2026 13:40:54 -0700
Subject: [PATCH 06/31] fix(i18n): resolve MDX syntax errors in Vietnamese
translation files
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fix MDX compilation errors that broke the build for vi locale:
- creating-a-wagmi-ui-for-your-contract: misplaced backtick in JSX fragment example
- erc-721-vyper-annotated-code: double backtick causing to parse as JSX
- erc20-annotated-code: raw < in **<0.8.0** → **<0.8.0** to match English source
- short-abi: missing closing backtick on opcode syntax line
- ethereum-forks: bare → CHAINID, added missing tags on 4 list items
- restaking: removed duplicate closing tag
- zero-knowledge-proofs: fixed content indentation structure
Co-Authored-By: Claude Opus 4.6
---
.../creating-a-wagmi-ui-for-your-contract/index.md | 2 +-
.../tutorials/erc-721-vyper-annotated-code/index.md | 2 +-
.../developers/tutorials/erc20-annotated-code/index.md | 2 +-
.../vi/developers/tutorials/short-abi/index.md | 2 +-
public/content/translations/vi/ethereum-forks/index.md | 10 +++++-----
public/content/translations/vi/restaking/index.md | 2 +-
.../translations/vi/zero-knowledge-proofs/index.md | 3 ++-
7 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md b/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md
index a6fcaaf90ab..7fd4e12e436 100644
--- a/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md
@@ -143,7 +143,7 @@ Theo quy ước, trong React, các hàm được gọi là `use...` là các [ho
<>
```
-JSX của một thành phần React _phải_ trả về một thành phần. Khi chúng ta có nhiều thành phần và không có gì bao bọc "một cách tự nhiên", chúng ta sử dụng một thành phần trống (`<> ...` >`) để biến chúng thành một thành phần duy nhất.
+JSX của một thành phần React _phải_ trả về một thành phần. Khi chúng ta có nhiều thành phần và không có gì bao bọc "một cách tự nhiên", chúng ta sử dụng một thành phần trống (`<> ... >`) để biến chúng thành một thành phần duy nhất.
```tsx
Greeter
diff --git a/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
index dc975a993f5..2fba50691fe 100644
--- a/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
+++ b/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
@@ -254,7 +254,7 @@ với `"""`), và không sử dụng nó theo bất kỳ cách nào. Những bì
self.minter = msg.sender
```
-Để truy cập các biến trạng thái, bạn sử dụng `self.`` (một lần nữa, giống như trong Python).
+Để truy cập các biến trạng thái, bạn sử dụng `self.` (một lần nữa, giống như trong Python).
#### Xem Hàm {#views}
diff --git a/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md
index b04031c1963..89fd94962bd 100644
--- a/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md
+++ b/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md
@@ -252,7 +252,7 @@ import "../../math/SafeMath.sol";
sử dụng chuỗi khối. Lưu ý rằng đây là một phiên bản cũ, nếu bạn muốn tích hợp với OpenGSN
[hãy sử dụng hướng dẫn này](https://docs.opengsn.org/javascript-client/tutorial.html).
- [Thư viện SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/), ngăn chặn
- tràn số/tràn số dưới cho các phiên bản Solidity **<0.8.0**. Trong Solidity ≥0.8.0, các phép toán số học tự động
+ tràn số/tràn số dưới cho các phiên bản Solidity **<0.8.0**. Trong Solidity ≥0.8.0, các phép toán số học tự động
hoàn nguyên khi tràn số/tràn số dưới, khiến SafeMath không cần thiết. Hợp đồng này sử dụng SafeMath để tương thích ngược với
các phiên bản trình biên dịch cũ hơn.
diff --git a/public/content/translations/vi/developers/tutorials/short-abi/index.md b/public/content/translations/vi/developers/tutorials/short-abi/index.md
index 5c906e08f97..6047f22ad07 100644
--- a/public/content/translations/vi/developers/tutorials/short-abi/index.md
+++ b/public/content/translations/vi/developers/tutorials/short-abi/index.md
@@ -165,7 +165,7 @@ Trên L1, có thể cần bỏ qua các bài kiểm tra này để tiết kiệm
Chúng ta có thể sao chép dữ liệu từ lệnh gọi đến `fallback()` (xem bên dưới), nhưng việc sử dụng [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), ngôn ngữ hợp ngữ của máy ảo ethereum (EVM), sẽ dễ dàng hơn.
Ở đây chúng ta sử dụng [opcode CALLDATALOAD](https://www.evm.codes/#35) để đọc các byte từ `startByte` đến `startByte+31` vào ngăn xếp.
-Nói chung, cú pháp của một opcode trong Yul là `(,...).
+Nói chung, cú pháp của một opcode trong Yul là `(,...)`.
```solidity
diff --git a/public/content/translations/vi/ethereum-forks/index.md b/public/content/translations/vi/ethereum-forks/index.md
index 283c6b4915b..d48534463bf 100644
--- a/public/content/translations/vi/ethereum-forks/index.md
+++ b/public/content/translations/vi/ethereum-forks/index.md
@@ -444,9 +444,9 @@ Phân nhánh Istanbul:
- Đề xuất cải thiện Ethereum-152 - cho phép Ethereum làm việc với đồng tiền bảo vệ quyền riêng tư như Zcash.
- EIP-1108 – mật mã học rẻ hơn nhằm cải thiện chi phí [gas]
- - EIP-1344 – bảo vệ Ethereum khỏi các cuộc tấn công lặp lại bằng cách thêm
[opcode](/developers/docs/ethereum-stack/#ethereum-virtual-machine)..
+ EIP-1344 – bảo vệ Ethereum khỏi các cuộc tấn công lặp lại bằng cách thêm CHAINID opcode.
Đề xuất cải thiện Ethereum-1884 - tối ưu hóa mã lệnh chi phí gas dựa trên tiêu thụ.
- EIP-2028 – làm giảm chi phí CallData để cho phép nhiều dữ liệu hơn trong các khối – điều này có lợi cho [Layer 2 scaling](/developers/docs/scaling/#layer-2-scaling).
+ EIP-2028 – làm giảm chi phí CallData để cho phép nhiều dữ liệu hơn trong các khối – điều này có lợi cho [Layer 2 scaling](/developers/docs/scaling/#layer-2-scaling).
Đề xuất cải thiện Ethereum-2200 - thay đổi giá gas mã lệnh khác.
@@ -502,13 +502,13 @@ Phân nhánh Byzantium:
- EIP-140 – thêm opcode
REVERT.
- Đề xuất cải thiện Ethereum-658 - trường trạng thái được thêm vào danh sách giao dịch để chỉ ra trạng thái giao dịch thành công hay thất bại.
- - EIP-196 – bổ sung phép nhân trên đường cong ellip và phép nhân vô hướng để cho phép [ZK-Snarks](/developers/docs/scaling/zk-rollups/).
- - EIP-197 – bổ sung phép nhân trên đường cong ellip và phép nhân vô hướng để cho phép [ZK-Snarks](/developers/docs/scaling/zk-rollups/).
+ - EIP-196 – bổ sung phép nhân trên đường cong ellip và phép nhân vô hướng để cho phép [ZK-Snarks](/developers/docs/scaling/zk-rollups/).
+ - EIP-197 – bổ sung phép nhân trên đường cong ellip và phép nhân vô hướng để cho phép [ZK-Snarks](/developers/docs/scaling/zk-rollups/).
- Đề xuất cải thiện Ethereum-198 - cho phép xác minh chữ ký thuật toán mã hóa công khai.
- Đề xuất cải thiện Ethereum-211 - bổ sung hỗ trợ cho các giá trị lợi nhuận có độ dài khác nhau.
- Đề xuất cải thiện Etherem-214 - thêm vào mã lệnh
STATICCALL, cho phép các cuộc gọi không thay đổi trạng thái tới các hợp đồng khác.
- Đề xuất cải thiện Ethereum-100 - thay đổi công thức chỉnh sửa độ khó.
- - EIP-649 – trì hoãn [dificulty bomb](/glossary/#difficulty-bomb) thêm 1 năm và giảm phần thưởng khối từ 5 xuống 3 ETH.
+ - EIP-649 – trì hoãn [dificulty bomb](/glossary/#difficulty-bomb) thêm 1 năm và giảm phần thưởng khối từ 5 xuống 3 ETH.
diff --git a/public/content/translations/vi/restaking/index.md b/public/content/translations/vi/restaking/index.md
index 4aa8708355f..8f4e991ba7b 100644
--- a/public/content/translations/vi/restaking/index.md
+++ b/public/content/translations/vi/restaking/index.md
@@ -144,7 +144,7 @@ Mặc dù AVS cung cấp các tỷ lệ khác nhau, các Token Tái cổ phần
Đồng sáng lập Ethereum đang gõ…
- Vitalik, đồng sáng lập Ethereum, đã cảnh báo về những rủi ro tiềm tàng của việc tái cổ phần trong một bài đăng blog năm 2021 có tên Don't Overload Consensus.
+ Vitalik, đồng sáng lập Ethereum, đã cảnh báo về những rủi ro tiềm tàng của việc tái cổ phần trong một bài đăng blog năm 2021 có tên Don't Overload Consensus.
diff --git a/public/content/translations/vi/zero-knowledge-proofs/index.md b/public/content/translations/vi/zero-knowledge-proofs/index.md
index de1f922e2be..6b30e08aa6f 100644
--- a/public/content/translations/vi/zero-knowledge-proofs/index.md
+++ b/public/content/translations/vi/zero-knowledge-proofs/index.md
@@ -50,7 +50,8 @@ Bằng chứng không kiến thức đặc biệt hữu ích trong bối cảnh
-ZKP + Danh tính trong thực tế: ID kỹ thuật số quốc gia (NDI) của Bhutan trên Ethereum
+ ZKP + Danh tính trong thực tế: ID kỹ thuật số quốc gia (NDI) của Bhutan trên Ethereum
+
Một ví dụ trong thế giới thực về việc sử dụng ZKP cho các hệ thống quản lý danh tính là hệ thống ID kỹ thuật số quốc gia (NDI) của Vương quốc Bhutan, được xây dựng trên Ethereum. NDI của Bhutan sử dụng ZKP để cho phép công dân chứng minh một cách mã hóa các sự thật về bản thân họ, như "Tôi là một công dân" hoặc "Tôi trên 18 tuổi", mà không tiết lộ dữ liệu cá nhân nhạy cảm trên ID của họ.
From 852d711fa667b1dc0423680abbb680f22a9dbcaf Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Tue, 17 Feb 2026 15:20:05 -0700
Subject: [PATCH 07/31] docs: add translation review documentation for
Vietnamese
Document the full review and fix process for Crowdin Vietnamese import (PR #17176):
- Review methodology (5 parallel agents, quality scoring)
- 37 critical issues found and resolved (EVM terminology, DAO, semantic inversions)
- 7 MDX syntax errors diagnosed and fixed
- Key pitfalls (cascading MDX errors, VPS/EVM ambiguity, context limits)
- Prevention recommendations for future imports
- Community glossary reference table
Co-Authored-By: Claude Opus 4.6
---
...owdin-import-review-vietnamese-pr-17176.md | 187 ++++++++++++++++++
1 file changed, 187 insertions(+)
create mode 100644 docs/solutions/translation-review/crowdin-import-review-vietnamese-pr-17176.md
diff --git a/docs/solutions/translation-review/crowdin-import-review-vietnamese-pr-17176.md b/docs/solutions/translation-review/crowdin-import-review-vietnamese-pr-17176.md
new file mode 100644
index 00000000000..ead34e01f60
--- /dev/null
+++ b/docs/solutions/translation-review/crowdin-import-review-vietnamese-pr-17176.md
@@ -0,0 +1,187 @@
+---
+title: "Crowdin Import Review: Vietnamese (vi) - PR #17176"
+category: translation-review
+language: vi
+pr: 17176
+severity: critical
+date: 2026-02-17
+tags: [crowdin, i18n, vietnamese, mdx, translation-quality]
+quality_score: 7.2
+files_reviewed: 277
+files_fixed: 33
+---
+
+# Crowdin Import Translation Review: Vietnamese (vi) - PR #17176
+
+## Problem Summary
+
+Automated Crowdin translation import for Vietnamese introduced critical translation errors, terminology inconsistencies, and MDX syntax breakage across 277 files. The import required multi-phase review, fix application, and iterative build verification before the PR could pass Netlify deployment.
+
+## Import Metadata
+
+| Field | Value |
+|-------|-------|
+| **PR** | [#17176](https://github.com/ethereum/ethereum-org-website/pull/17176) |
+| **Branch** | `i18n/import/2026-01-27T15-06-08-vi` |
+| **Language** | Vietnamese (vi) |
+| **Import Date** | 2026-01-27 |
+| **Review Date** | 2026-02-17 |
+| **Total Files** | 277 (markdown + JSON) |
+| **Quality Score** | 7.2/10 |
+| **Critical Issues** | 37 |
+| **Warnings** | 124 |
+
+## Review Architecture
+
+Five parallel review agents were deployed, each assigned to a distinct file group:
+
+| Agent | Scope | Files | Score |
+|-------|-------|-------|-------|
+| Core Pages | Roadmap, staking, bridges, wallets, community | ~40 | ~7.5/10 |
+| Dev Docs | developers/docs/* | ~60 | ~7.8/10 |
+| Tutorials | developers/tutorials/* + remaining | ~80 | ~6.5/10 |
+| JSON Batch A | First half of src/intl/vi/*.json | ~23 | ~7.0/10 |
+| JSON Batch B | Second half of src/intl/vi/*.json | ~23 | ~7.0/10 |
+
+**Pitfall encountered**: JSON review agents hit Opus context limits. Solution: split JSON files into two batches of ~23 files each, and use Sonnet model for large batches if needed.
+
+## Critical Issues Found
+
+### 1. EVM Terminology Error (32 occurrences across 15 files)
+
+**The Issue**: "Ethereum Virtual Machine" was translated as "Máy chủ ảo Ethereum" (Ethereum Virtual Server) instead of "Máy ảo Ethereum" (Ethereum Virtual Machine). The term "máy chủ ảo" literally means "virtual server" (VPS), fundamentally misrepresenting what the EVM is.
+
+**Context-Dependent Ambiguity**: The `run-a-node/index.md` file legitimately uses "máy chủ ảo" to refer to actual Virtual Private Servers (VPS) for node hosting. This file was intentionally **skipped** during the fix to preserve correct VPS references.
+
+**Files affected**: 14 files fixed (26 changes total), including:
+- `developers/docs/evm/index.md` — Title, description, and body (3 case variants)
+- `developers/docs/apis/json-rpc/index.md` — 5 occurrences
+- `developers/docs/consensus-mechanisms/pow/mining/index.md` — 7 occurrences
+- `developers/docs/smart-contracts/languages/index.md` — 4 occurrences
+- `src/intl/vi/glossary.json` — Also fixed a typo variant "Mãy chủ Ảo"
+
+**Fix applied**: Three case variants replaced across all files:
+- "Máy chủ ảo" -> "Máy ảo"
+- "máy chủ ảo" -> "máy ảo"
+- "Máy chủ Ảo" -> "Máy Ảo"
+
+### 2. DAO Terminology Error
+
+"Decentralized Autonomous Organization" had "autonomous" translated as "ẩn danh" (anonymous) instead of "tự trị" (autonomous). This changes the fundamental meaning of DAOs.
+
+### 3. Historical Fact Error
+
+Ethereum genesis date rendered as "July 3, 2015" instead of the correct "July 30, 2015" in `page-10-year-anniversary.json`.
+
+### 4. Semantic Inversion
+
+"more decentralized" translated as "tập trung hơn" (more centralized) — the exact opposite meaning. Critical for blockchain messaging.
+
+### 5. Energy Reduction Statistic
+
+The Merge energy savings stated as "~95.95%" instead of "~99.95%" — a significant understatement.
+
+### 6. Node Terminology
+
+"nốt" (musical note) used instead of "nút" (node) in glossary and multiple markdown files. Corrected to match community glossary (`vi-glossary-terms.json`).
+
+### 7. Brand Name Typos
+
+"Etherum" and "Etherem" variants found — corrected to "Ethereum".
+
+## MDX Syntax Errors (7 files)
+
+After applying translation fixes, the Netlify build failed on 7 pages. Each was diagnosed by comparing against English source files.
+
+### Error 1: `creating-a-wagmi-ui-for-your-contract/index.md`
+- **Symptom**: "Unexpected closing slash `/` in tag"
+- **Cause**: Misplaced backtick in JSX fragment example
+- **Broken**: `` (`<> ...` >`) ``
+- **Fixed**: `` (`<> ... >`) ``
+
+### Error 2: `erc-721-vyper-annotated-code/index.md`
+- **Symptom**: "`` tag" parsed as JSX
+- **Cause**: Double backtick leaving Vietnamese word exposed
+- **Broken**: `` `self.`` ``
+- **Fixed**: `` `self.` ``
+
+### Error 3: `erc20-annotated-code/index.md`
+- **Symptom**: "Unexpected character `0`"
+- **Cause**: Raw `<` before version number
+- **Broken**: `**<0.8.0**`
+- **Fixed**: `**<0.8.0**`
+
+### Error 4: `short-abi/index.md`
+- **Symptom**: "Unexpected character `,`"
+- **Cause**: Missing closing backtick on opcode syntax line
+- **Fixed**: Added closing backtick
+
+### Error 5: `ethereum-forks/index.md`
+- **Symptom**: "`` tag" + orphaned `` tags
+- **Cause**: Multiple issues — bare angle brackets and missing opening `` tags
+- **Fixes**:
+ - `` -> `CHAINID`
+ - Added missing `` opening tags on 4 list items (lines 449, 505, 506, 511)
+- **Pitfall**: First error (``) terminated MDX parsing, hiding the ` ` errors. Required a second build cycle to reveal them.
+
+### Error 6: `restaking/index.md`
+- **Symptom**: "Extra ``"
+- **Cause**: Duplicate closing anchor tag from sentence restructuring
+- **Broken**: `Consensus. `
+- **Fixed**: `Consensus.`
+
+### Error 7: `zero-knowledge-proofs/index.md`
+- **Symptom**: AlertTitle rendering failure
+- **Cause**: Content indentation mismatch in MDX component
+- **Fixed**: Realigned AlertTitle content to match English source structure
+
+## Key Pitfalls & Lessons Learned
+
+### 1. Cascading MDX Errors
+MDX parser terminates on the first error per file, hiding subsequent errors. The `ethereum-forks/index.md` file had 5 errors but only the first was visible until fixed. **Budget 2-4 rebuild cycles per file with MDX errors.**
+
+### 2. Context-Dependent Terminology (VPS vs EVM)
+Vietnamese "máy chủ ảo" legitimately means "virtual server" in node-hosting contexts but was incorrectly used for "virtual machine" (EVM) elsewhere. **Always check surrounding context before bulk-replacing terminology.**
+
+### 3. Community Glossary Authority
+The `vi-glossary-terms.json` file in the main repo root contains community-approved translations. When AI judgment conflicts with the glossary, **always defer to the glossary** — it represents native-speaker consensus.
+
+### 4. JSON Agent Context Overflow
+Large JSON translation files (46+ files at once) exceeded Opus model context limits. **Split JSON reviews into batches of ~20-25 files**, or use Sonnet model for JSON-heavy batches.
+
+## Fix Progression Timeline
+
+1. **2026-02-13**: Automated sanitizer run on vi translations (41 files)
+2. **2026-02-17 13:24**: Critical translation errors fixed (26 files, 60 insertions/60 deletions)
+3. **2026-02-17 13:40**: MDX syntax errors resolved (7 files, 12 insertions/11 deletions)
+4. **2026-02-17**: Build verification passed
+
+## Community Glossary Reference
+
+Key terms from `vi-glossary-terms.json` used during review:
+
+| English | Vietnamese (Glossary) |
+|---------|-----------------------|
+| dapps | các ứng dụng phi tập trung |
+| proof-of-stake | bằng chứng cổ phần |
+| validator | trình xác thực |
+| node | nút |
+| staking | đặt cọc |
+| rollup | cuộn |
+| smart contract | hợp đồng thông minh |
+| blockchain | chuỗi khối |
+
+## Prevention Recommendations
+
+1. **Enhance `post_import_sanitize.ts`** to detect EVM terminology variants per language
+2. **Add MDX pre-validation** to the import pipeline before PR creation
+3. **Enforce brand name protection** in Crowdin glossary settings
+4. **Run character-set validation** to catch cross-script contamination early
+5. **Document VPS/EVM ambiguity** in Vietnamese translation guidelines for future translators
+
+## Related Files
+
+- **Sanitizer**: `src/scripts/i18n/post_import_sanitize.ts`
+- **Review Command**: `.claude/commands/review-translations.md`
+- **Community Glossary**: `vi-glossary-terms.json` (repo root)
+- **CI Workflow**: `.github/workflows/claude-review-translations.yml`
From 9db5cf9329a3bf586c2951c04592c5c6c3fb31fc Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Tue, 17 Feb 2026 18:38:58 -0700
Subject: [PATCH 08/31] fix(i18n): restore missing and malformed hrefs in
Vietnamese translations
Fix 13 link issues across 4 JSON translation files where hrefs were
either replaced with Crowdin numbered placeholders, pointed to wrong
glossary targets, completely removed, or had malformed nested anchor tags.
Co-Authored-By: Claude Opus 4.6
---
src/intl/vi/glossary-tooltip.json | 2 +-
src/intl/vi/glossary.json | 2 +-
src/intl/vi/page-roadmap.json | 8 ++++----
src/intl/vi/page-staking.json | 12 ++++++------
4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/intl/vi/glossary-tooltip.json b/src/intl/vi/glossary-tooltip.json
index 62ab3ce458f..b84e7f61e97 100644
--- a/src/intl/vi/glossary-tooltip.json
+++ b/src/intl/vi/glossary-tooltip.json
@@ -100,7 +100,7 @@
"node-term": "Nút",
"node-definition": "Một máy khách phần mềm tham gia vào mạng. Tìm hiểu thêm về các nút và máy khách.",
"ommer-term": "Khối Ommer (chú)",
- "ommer-definition": "Khi một thợ đào bằng chứng công việc tìm thấy một khối hợp lệ, một thợ đào khác có thể đã xuất bản một khối cạnh tranh được thêm vào đầu chuỗi khối trước. Khối hợp lệ nhưng đã lỗi thời này có thể được các khối mới hơn đưa vào dưới dạng ommers và nhận một phần phần thưởng khối. Thuật ngữ \"ommer\" là thuật ngữ trung lập về giới tính được ưu tiên cho anh chị em của một khối cha, nhưng điều này đôi khi cũng được gọi là \"chú\". Điều này là phổ biến đối với Ethereum khi nó là một mạng bằng chứng công việc. Bây giờ Ethereum sử dụng bằng chứng cổ phần, chỉ có một người đề xuất khối được chọn cho mỗi slot.",
+ "ommer-definition": "Khi một thợ đào bằng chứng công việc tìm thấy một khối hợp lệ, một thợ đào khác có thể đã xuất bản một khối cạnh tranh được thêm vào đầu chuỗi khối trước. Khối hợp lệ nhưng đã lỗi thời này có thể được các khối mới hơn đưa vào dưới dạng ommers và nhận một phần phần thưởng khối. Thuật ngữ \"ommer\" là thuật ngữ trung lập về giới tính được ưu tiên cho anh chị em của một khối cha, nhưng điều này đôi khi cũng được gọi là \"chú\". Điều này là phổ biến đối với Ethereum khi nó là một mạng bằng chứng công việc. Bây giờ Ethereum sử dụng bằng chứng cổ phần, chỉ có một người đề xuất khối được chọn cho mỗi slot.",
"onchain-term": "Trên chuỗi",
"onchain-definition": "Đề cập đến các hành động hoặc giao dịch diễn ra trên chuỗi khóa và công khai cho mọi người xem.",
"optimistic-rollup-term": "Rollup tích cực",
diff --git a/src/intl/vi/glossary.json b/src/intl/vi/glossary.json
index 8d8a790201c..803b08cdce2 100644
--- a/src/intl/vi/glossary.json
+++ b/src/intl/vi/glossary.json
@@ -264,7 +264,7 @@
"offchain-term": "Ngoài chuỗi",
"offchain-definition": "Ngoại chuỗi có nghĩa là bất kỳ giao dịch hoặc dữ liệu nào tồn tại bên ngoài chuỗi khối. Vì việc cam kết mọi giao dịch trên chuỗi có thể tốn kém và không hiệu quả, các công cụ của bên thứ ba như các nhà tiên tri xử lý dữ liệu định giá, hoặc các giải pháp lớp 2 thực hiện thông lượng giao dịch cao hơn, xử lý một phần lớn công việc xử lý ngoại chuỗi, và sẽ gửi thông tin trên chuỗi theo các khoảng thời gian ít thường xuyên hơn.",
"ommer-term": "Khối Ommer (chú)",
- "ommer-definition": "Khi một thợ đào bằng chứng công việc tìm thấy một khối hợp lệ, một thợ đào khác có thể đã xuất bản một khối cạnh tranh được thêm vào đầu chuỗi khối trước. Khối hợp lệ nhưng đã lỗi thời này có thể được các khối mới hơn đưa vào dưới dạng ommers và nhận một phần phần thưởng khối. Thuật ngữ \"ommer\" là thuật ngữ trung lập về giới tính được ưu tiên cho anh chị em của một khối cha, nhưng điều này đôi khi cũng được gọi là \"chú\". Điều này là phổ biến đối với Ethereum khi nó là một mạng bằng chứng công việc. Bây giờ Ethereum sử dụng bằng chứng cổ phần, chỉ có một người đề xuất khối được chọn cho mỗi slot.",
+ "ommer-definition": "Khi một thợ đào bằng chứng công việc tìm thấy một khối hợp lệ, một thợ đào khác có thể đã xuất bản một khối cạnh tranh được thêm vào đầu chuỗi khối trước. Khối hợp lệ nhưng đã lỗi thời này có thể được các khối mới hơn đưa vào dưới dạng ommers và nhận một phần phần thưởng khối. Thuật ngữ \"ommer\" là thuật ngữ trung lập về giới tính được ưu tiên cho anh chị em của một khối cha, nhưng điều này đôi khi cũng được gọi là \"chú\". Điều này là phổ biến đối với Ethereum khi nó là một mạng bằng chứng công việc. Bây giờ Ethereum sử dụng bằng chứng cổ phần, chỉ có một người đề xuất khối được chọn cho mỗi slot.",
"onchain-term": "Trên chuỗi",
"onchain-definition": "Đề cập đến các hành động hoặc giao dịch xảy ra trên chuỗi khối và có sẵn công khai.
Hãy coi nó như việc viết một cái gì đó vào một cuốn sổ tay lớn, được chia sẻ mà mọi người đều có thể xem và kiểm tra, đảm bảo rằng bất cứ điều gì được viết (như gửi tiền kỹ thuật số hoặc lập hợp đồng) là vĩnh viễn và không thể thay đổi hoặc xóa bỏ.",
"optimistic-rollup-term": "Rollup tích cực",
diff --git a/src/intl/vi/page-roadmap.json b/src/intl/vi/page-roadmap.json
index 422494b8ecd..ebc05cfdd1d 100644
--- a/src/intl/vi/page-roadmap.json
+++ b/src/intl/vi/page-roadmap.json
@@ -21,8 +21,8 @@
"page-roadmap-why-need-description": "Ethereum thường xuyên được nâng cấp để cải thiện khả năng mở rộng, bảo mật, hoặc tính bền vững. Một trong những điểm mạnh cốt lõi của Ethereum là khả năng thích ứng khi có những ý tưởng mới từ nghiên cứu và phát triển. Sự linh hoạt này giúp Ethereum có thể đối phó với những thách thức mới và theo kịp các đột phá công nghệ tiên tiến nhất.",
"page-roadmap-how-defined-title": "Cách lộ trình được xác định",
"page-roadmap-how-defined-p1": "Lộ trình này đa phần là kết quả nhiều năm làm việc của các nhà nghiên cứu và các nhà phát triển - vì giao thức rất mang tính kỹ thuật - nhưng bất kỳ người nào có động lực đều có thể tham gia.",
- "page-roadmap-how-defined-p2": "Ý tưởng thường bắt đầu từ các cuộc thảo luận trên các diễn đàn như ethresear.ch, <1>Ethereum Magicians1> hoặc server Discord Eth R&D. Chúng có thể là phản hồi cho những lỗ hổng mới được phát hiện, các gợi ý từ các tổ chức đang làm các ứng dụng layer (như dapps và sàn giao dịch) hoặc từ những vấn đề mà người dùng gặp phải (như chi phí hoặc tốc độ giao dịch).",
- "page-roadmap-how-defined-p3": "Khi những ý tưởng này chín muồi, chúng có thể được đề xuất dưới dạng <0>Đề xuất Cải tiến Ethereum0>. Tất cả điều này được thực hiện công khai để bất kỳ ai trong cộng đồng cũng có thể tham gia ý kiến bất cứ lúc nào.",
+ "page-roadmap-how-defined-p2": "Ý tưởng thường bắt đầu từ các cuộc thảo luận trên các diễn đàn như ethresear.ch, Ethereum Magicians hoặc server Discord Eth R&D. Chúng có thể là phản hồi cho những lỗ hổng mới được phát hiện, các gợi ý từ các tổ chức đang làm các ứng dụng layer (như dapps và sàn giao dịch) hoặc từ những vấn đề mà người dùng gặp phải (như chi phí hoặc tốc độ giao dịch).",
+ "page-roadmap-how-defined-p3": "Khi những ý tưởng này chín muồi, chúng có thể được đề xuất dưới dạng Đề xuất Cải tiến Ethereum. Tất cả điều này được thực hiện công khai để bất kỳ ai trong cộng đồng cũng có thể tham gia ý kiến bất cứ lúc nào.",
"page-roadmap-governance-button": "Xem thêm về Quản trị trong Ethereum",
"page-roadmap-hero-alt": "Lộ trình Ethereum",
"page-roadmap-technical-upgrades-title": "Những bản nâng cấp công nghệ nào cho Ethereum sắp tới?",
@@ -47,9 +47,9 @@
"page-roadmap-faq-2-p1-continued": "để dự đoán càng nhiều mục trên lộ trình sẽ được thực hiện song song và phát triển với tốc độ khác nhau. Tính cấp bách của một bản nâng cấp cũng có thể thay đổi theo thời gian tùy thuộc vào các yếu tố bên ngoài (ví dụ: một bước nhảy đột ngột trong hiệu suất và khả năng sử dụng của máy tính lượng tử có thể làm cho việc lượng tử kháng trở nên cấp bách hơn).",
"page-roadmap-faq-2-p2": "Một cách để nghĩ về việc phát triển Ethereum là so sánh với sự tiến hóa sinh học. Một mạng lưới có khả năng thích ứng với những thách thức mới và duy trì sự phù hợp thì có khả năng thành công hơn so với một mạng lưới kháng cự lại sự thay đổi. Tuy nhiên, khi mạng lưới ngày càng hoạt động hiệu quả, mở rộng và an toàn hơn, thì sẽ cần ít thay đổi hơn cho giao thức.",
"page-roadmap-faq-3-title": "Tôi có cần làm gì để chuẩn bị cho những nâng cấp này không?",
- "page-roadmap-faq-3-p1": "Các bản nâng cấp thường không ảnh hưởng đến người dùng cuối, ngoại trừ việc cung cấp trải nghiệm người dùng tốt hơn và một giao thức an toàn hơn, và có thể là nhiều tuỳ chọn hơn cho cách tương tác với Ethereum. Người dùng bình thường không yêu cầu tham gia tích cực vào một bản nâng cấp, cũng như không cần phải làm gì để bảo vệ tài sản của họ. Các nhà điều hành <2>nút2> sẽ cần cập nhật khách hàng của họ để chuẩn bị cho một bản nâng cấp. Một số bản nâng cấp có thể dẫn đến sự thay đổi cho các nhà phát triển ứng dụng. Ví dụ, các bản nâng cấp về hết hạn trong quá khứ có thể khiến các nhà phát triển ứng dụng lấy dữ liệu lịch sử từ các nguồn mới.",
+ "page-roadmap-faq-3-p1": "Các bản nâng cấp thường không ảnh hưởng đến người dùng cuối, ngoại trừ việc cung cấp trải nghiệm người dùng tốt hơn và một giao thức an toàn hơn, và có thể là nhiều tuỳ chọn hơn cho cách tương tác với Ethereum. Người dùng bình thường không yêu cầu tham gia tích cực vào một bản nâng cấp, cũng như không cần phải làm gì để bảo vệ tài sản của họ. Các nhà điều hành nút sẽ cần cập nhật khách hàng của họ để chuẩn bị cho một bản nâng cấp. Một số bản nâng cấp có thể dẫn đến sự thay đổi cho các nhà phát triển ứng dụng. Ví dụ, các bản nâng cấp về hết hạn trong quá khứ có thể khiến các nhà phát triển ứng dụng lấy dữ liệu lịch sử từ các nguồn mới.",
"page-roadmap-faq-4-title": "Còn về Sharding thì sao?",
- "page-roadmap-faq-4-p1": "Sharding là việc tách nhỏ blockchain Ethereum ra, để một nhóm <0>validator0> chỉ cần chịu trách nhiệm cho một phần dữ liệu thôi. Ban đầu, đây là cách mà Ethereum dự định mở rộng quy mô. Tuy nhiên, <1>layer 21> rollups đã phát triển nhanh hơn mong đợi và đã cung cấp nhiều khả năng mở rộng rồi, và sẽ còn nhiều hơn nữa khi Proto-Danksharding được triển khai. Điều này có nghĩa là \"shard chains\" giờ không còn cần thiết và đã bị loại bỏ khỏi lộ trình.",
+ "page-roadmap-faq-4-p1": "Sharding là việc tách nhỏ blockchain Ethereum ra, để một nhóm validator chỉ cần chịu trách nhiệm cho một phần dữ liệu thôi. Ban đầu, đây là cách mà Ethereum dự định mở rộng quy mô. Tuy nhiên, layer 2 rollups đã phát triển nhanh hơn mong đợi và đã cung cấp nhiều khả năng mở rộng rồi, và sẽ còn nhiều hơn nữa khi Proto-Danksharding được triển khai. Điều này có nghĩa là \"shard chains\" giờ không còn cần thiết và đã bị loại bỏ khỏi lộ trình.",
"page-roadmap-release-status-prod": "Trong quá trình sản xuất",
"page-roadmap-release-status-soon": "Sắp ra mắt",
"page-roadmap-release-status-dev": "Đang phát triển",
diff --git a/src/intl/vi/page-staking.json b/src/intl/vi/page-staking.json
index 0268e0e61ff..9a0b3c6c0eb 100644
--- a/src/intl/vi/page-staking.json
+++ b/src/intl/vi/page-staking.json
@@ -24,7 +24,7 @@
"page-staking-benefits-3-title": "Bền vững hơn",
"page-staking-benefits-3-description": "Ký gửi viên không cần tốn nhiều năng lượng như chất xám, điện năng để chạy node theo cơ chế đồng thuận bằng chứng công việc cũ nữa, nghĩa là các node được úy quyền ký gửi có thể chạy trên phần cứng sử dụng rất ít điện năng.",
"page-staking-benefits-3-link": "Thông tin thêm về mức tiêu thụ năng lượng của Ethereum",
- "page-staking-description": "Đặt cọc là hành động gửi 32ETH để kích hoạt phần mềm validatorphần mềm.Với tư cách là người xác thực, bạn sẽ chịu trách nhiệm lưu trữ dữ liệu, xử lý dữ liệu và thêm mới khối mới vào chuỗi khối. Điều này sẽ giúp Ethereum được an toàn cho mọi người và giúp bạn kiếm được ETH mới trong quá trình.",
+ "page-staking-description": "Đặt cọc là hành động gửi 32 ETH để kích hoạt phần mềm validator. Với tư cách là người xác thực, bạn sẽ chịu trách nhiệm lưu trữ dữ liệu, xử lý giao dịch và thêm khối mới vào chuỗi khối. Điều này sẽ giúp Ethereum được an toàn cho mọi người và giúp bạn kiếm được ETH mới trong quá trình.",
"page-staking-hero-title": "Đặt cọc ETH như thế nào",
"page-staking-hero-header": "Kiếm phần thưởng khi bảo mật Ethereum",
"page-staking-hero-subtitle": "Bất kỳ người dùng nào có số lượng ETH bất kỳ đều có thể giúp bảo mật mạng và kiếm được phần thưởng trong quá trình.",
@@ -80,7 +80,7 @@
"page-staking-hierarchy-cex-pill-2": "Giả thiết tin cậy nhất",
"page-staking-hierarchy-cex-p1": "Nhiều sàn tập trung cung cấp dịch vụ góp cổ phần nếu như bạn vẫn không thoải mái khi giữ ETH trong ví của mình. Họ sẽ giữ ETH cho bạn, trong khi đó bạn có thể hưởng được lợi tức từ đó mà không mất quá nhiều công sức hoặc chỉ phải giám sát rất ít.",
"page-staking-hierarchy-cex-p2": "Nhưng cái giá phải trả ở đây là những nhà cung cấp dịch vụ phi tập trung thường tổng hợp số lượng ETH lớn để chạy một số lượng lớn các nốt xác thực. Điều này có thể gây nguy hiểm cho mạng lưới và người dùng vì nó sẽ tạo ra các mục tiêu tập trung lớn và điểm tới hạn, làm cho mạng lưới dễ bị tấn công hơn hoặc xảy ra lỗi.",
- "page-staking-hierarchy-cex-p3": "Nếu bạn không cảm thấy thoải mái khi giữ khóa của mình thì cũng không sao. Bạn có những lựa chọn sau. Lúc này, cân nhắc kiểm tra trang ví, nơi bạn có thể bắt đầu học làm thế nào để nắm giữ quyền sở hữu hoàn toàn với tiền của mình. Khi bạn sẵn sàng, quay lại và góp cổ phần cao hơn bằng cách thử lại một trong những dịch vụ góp cổ phần theo nhóm bạn tự kiếm soát đã có.",
+ "page-staking-hierarchy-cex-p3": "Nếu bạn không cảm thấy thoải mái khi giữ khóa của mình thì cũng không sao. Bạn có những lựa chọn sau. Lúc này, cân nhắc kiểm tra trang ví, nơi bạn có thể bắt đầu học làm thế nào để nắm giữ quyền sở hữu hoàn toàn với tiền của mình. Khi bạn sẵn sàng, quay lại và góp cổ phần cao hơn bằng cách thử lại một trong những dịch vụ góp cổ phần theo nhóm bạn tự kiếm soát đã có.",
"page-staking-hierarchy-subtext": "Bạn có thể thấy rằng, có nhiều cách để đặt cọc Ethereum. Những cách này hướng tới nhiều loại người dùng và mỗi cách lại khác biệt và có rủi ro, phần thưởng, mức độ tin cậy giả định khác nhau. Một số thì phi tập trung, thử nghiệm triệt để và mạo hiểm hơn cái khác. Chúng tôi cung cấp cho bạn một số thông tin về các dự án phổ biến trong bối cảnh này, nhưng hãy luôn tự nghiên cứu kỹ trước khi gửi ETH của bạn đi bất kỳ đâu.",
"page-staking-comparison-solo-saas": "Với nhà cung cấp SaaS, bạn vẫn cần phải gửi vào 32 ETH, nhưng không phải chạy phần cứng. Bạn thường vẫn có quyền truy cập khóa xác thực của bạn, nhưng cũng cần phải chia sẻ khóa chữ ký để những người vận hành có thể hành động thay cho nốt xác thực của bạn. Điều này đưa ra một lớp tin tưởng nhưng không hiển thị khi bạn chạy phần cứng riêng, cũng không giống như bạn góp cổ phần một mình, dịch vụ SaaS không giúp bạn nhiều về việc phân phối các nốt theo địa lý. Nếu bạn không thoải mái khi vận hành phần cứng nhưng vẫn muốn góp cổ phần 32 ETH, dịch vụ SaaS có thể là một sự lựa chọn tốt cho bạn.",
"page-staking-comparison-solo-pools": "Góp cổ phần một mình yêu cầu tham gia nhiều hơn đáng kể so với góp cổ phần bằng dịch vụ chun, nhưng cung cấp toàn quyền truy cập vào phần thưởng ETH cũng như toàn quyền kiểm soát việc thiết lập và bảo mật nốt xác thực của bạn. Góp cổ phần theo nhóm có rào cản gia nhập thấp hơn đáng kể. Người dùng có thể góp một lượng nhỏ ETH, không bắt buộc phải tạo khóa xác thực và không có yêu cầu về phần cứng ngoài kết nối internet tiêu chuẩn. Mã thông báo thanh khoản cho phép khả năng thoát quy trình góp cổ phần trước khi tính năng này được bật ở cấp giao thức. Nếu bạn quan tâm đến các tính năng này, góp cổ phần theo nhóm có thể phù hợp.",
@@ -176,8 +176,8 @@
"page-staking-section-comparison-saas-rewards-li1": "Thường bao gồm các phần thưởng giao thức đầy đủ trừ đi phí hàng tháng để vận hành nốt",
"page-staking-section-comparison-saas-rewards-li2": "Luôn sẵn sàng dễ dàng kiểm tra ứng dụng xác thực của bạn trên màn hình",
"page-staking-section-comparison-pools-rewards-li1": "Phần thưởng góp cổ phần theo nhóm khác nhau, phụ thuộc vào phương pháp góp cổ phần theo nhóm bạn lựa chọn",
- "page-staking-section-comparison-pools-rewards-li2": "Nhiều dịch vụ đặt cọc theo nhóm đưa ra một hoặc nhiều token thanh khoản đại diện cho số ETH bạn đặt cọc và cổ phần của phần thưởng xác thực",
- "page-staking-section-comparison-pools-rewards-li3": "Token thanh khoản được lưu trữ trong ví riêng của bạn, được sử dụng trong DeFi và bán đi nếu bạn quyết định rút ra",
+ "page-staking-section-comparison-pools-rewards-li2": "Nhiều dịch vụ đặt cọc theo nhóm đưa ra một hoặc nhiều token thanh khoản đại diện cho số ETH bạn đặt cọc và cổ phần của phần thưởng xác thực",
+ "page-staking-section-comparison-pools-rewards-li3": "Token thanh khoản được lưu trữ trong ví riêng của bạn, được sử dụng trong DeFi và bán đi nếu bạn quyết định rút ra",
"page-staking-section-comparison-risks-title": "Các rủi ro",
"page-staking-section-comparison-solo-risks-li1": "ETH nắm giữ",
"page-staking-section-comparison-solo-risks-li2": "Mạng ngắt kết nối sẽ bị phạt tiền bằng ETH",
@@ -186,10 +186,10 @@
"page-staking-section-comparison-saas-risks-li1": "Rủi ro tương tự như tự đặt cọc kèm thêm rủi ro từ bên thứ ba là nhà cung cấp dịch vụ",
"page-staking-section-comparison-saas-risks-li2": "Người được bạn ủy thác mã khóa có thể hành động gian lận",
"page-staking-section-comparison-pools-risks-li1": "Tùy theo phương pháp được sử dụng mà có rủi ro khác nhau",
- "page-staking-section-comparison-pools-risks-li2": "Nhìn chung, các rủi ro bao gồm rủi ro từ bên thứ ba, hợp đồng thông minh và rủi ro vận hành",
+ "page-staking-section-comparison-pools-risks-li2": "Nhìn chung, các rủi ro bao gồm rủi ro từ bên thứ ba, hợp đồng thông minh và rủi ro vận hành",
"page-staking-section-comparison-requirements-title": "Các yêu cầu",
"page-staking-section-comparison-solo-requirements-li1": "Bạn phải gửi vào 32 ETH",
- "page-staking-section-comparison-solo-requirements-li2": "Duy trì phần cứng để vận hành ứng dụng Ethereum và ứng dụng đồng thuận đồng thời kết nối với mạng",
+ "page-staking-section-comparison-solo-requirements-li2": "Duy trì phần cứng để vận hành ứng dụng thực thi Ethereum và ứng dụng đồng thuận đồng thời kết nối với mạng",
"page-staking-section-comparison-solo-requirements-li3": "Staking Launchpad sẽ hướng dẫn bạn về quy trình và các yêu cầu phần cứng.",
"page-staking-section-comparison-saas-requirements-li1": "Nạp 32 ETH và tạo mã khóa cùng với sự hỗ trợ",
"page-staking-section-comparison-saas-requirements-li2": "Lưu khóa của bạn an toàn",
From e4fb77e7c6ff2ee8b3cdf9ee807355ff759e678a Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Tue, 17 Feb 2026 18:46:30 -0700
Subject: [PATCH 09/31] docs: add solution doc for translation href sync issues
Document the investigation methodology, root cause analysis, and
prevention strategies for Crowdin translation href corruption.
Co-Authored-By: Claude Opus 4.6
---
.../translation-href-sync-issues.md | 157 ++++++++++++++++++
1 file changed, 157 insertions(+)
create mode 100644 docs/solutions/integration-issues/translation-href-sync-issues.md
diff --git a/docs/solutions/integration-issues/translation-href-sync-issues.md b/docs/solutions/integration-issues/translation-href-sync-issues.md
new file mode 100644
index 00000000000..20aed5c624e
--- /dev/null
+++ b/docs/solutions/integration-issues/translation-href-sync-issues.md
@@ -0,0 +1,157 @@
+---
+title: "Translation href Sync Issues - Links Corrupted During Crowdin Translation"
+date: "2026-02-17"
+category: "integration-issues"
+tags:
+ - translation
+ - i18n
+ - crowdin
+ - link-integrity
+ - glossary
+ - html-structure
+ - json-translations
+component: "src/intl/ translation JSON files"
+severity: "high"
+symptoms:
+ - "Glossary links rendering as plain text instead of clickable anchors"
+ - "Crowdin numbered placeholders (<0>, <1>) appearing in rendered content"
+ - "Links pointing to wrong glossary entries"
+ - "Duplicate nested tags causing malformed HTML"
+ - "Extra links present in translations that don't exist in English"
+---
+
+# Translation href Sync Issues
+
+## Problem
+
+Translation PRs imported from Crowdin frequently contain corrupted `` tags in JSON translation files (`src/intl/{locale}/*.json`). The canonical English JSON files embed HTML links inside translation string values (e.g., `validator`). Translators on Crowdin introduce five categories of errors:
+
+1. **Placeholder substitution**: `DeFi` becomes `<0>DeFi0>` (Crowdin numbered placeholder)
+2. **Link removal**: `keys` becomes plain text `khoa`
+3. **Wrong targets**: `Node` becomes `tuy chon`
+4. **Nested/duplicate tags**: `text`
+5. **Extra links added**: Links present in translation but absent in English canonical
+
+## First Occurrence
+
+PR #17176 (Vietnamese translations) - 13 href issues across 4 files:
+- `src/intl/vi/page-roadmap.json` (6 issues)
+- `src/intl/vi/page-staking.json` (6 issues)
+- `src/intl/vi/glossary-tooltip.json` (1 issue)
+- `src/intl/vi/glossary.json` (1 issue)
+
+## Investigation
+
+### Step 1: Identify changed files
+```bash
+git diff dev --name-only -- 'src/intl/vi/**/*.json'
+```
+
+### Step 2: Automated comparison script
+For each changed JSON file, flatten the JSON, extract all `href="..."` values from both the English (`src/intl/en/`) and translated versions, and compare using symmetric set difference:
+
+```python
+import json, re, os
+
+def extract_urls(value):
+ return re.findall(r'href="([^"]*)"', value)
+
+def flatten(data, prefix=''):
+ items = {}
+ if isinstance(data, dict):
+ for k, v in data.items():
+ nk = f'{prefix}.{k}' if prefix else k
+ if isinstance(v, (dict, list)):
+ items.update(flatten(v, nk))
+ elif isinstance(v, str):
+ items[nk] = v
+ elif isinstance(data, list):
+ for i, v in enumerate(data):
+ nk = f'{prefix}[{i}]'
+ if isinstance(v, (dict, list)):
+ items.update(flatten(v, nk))
+ elif isinstance(v, str):
+ items[nk] = v
+ return items
+
+# For each file, compare EN vs translated href sets per key
+# Also check for: nested tags, Crowdin placeholders (<0>, <1>)
+```
+
+### Step 3: Cross-check patterns
+- Nested anchors: `re.search(r']*>]*>', value)`
+- Crowdin placeholders where EN has real links: `re.search(r'<\d+>', vi_value)` when `re.search(r'` structure from English while keeping translated display text
+4. Remove any extra links not present in English
+5. Fix nested `` tags by removing duplicates
+
+### Example fix
+
+**English** (`page-staking.json`):
+```json
+"page-staking-section-comparison-pools-rewards-li3": "Liquidity tokens can be held in your own wallet, used in DeFi and sold..."
+```
+
+**Vietnamese BEFORE** (link removed):
+```json
+"page-staking-section-comparison-pools-rewards-li3": "Token thanh khoản được lưu trữ trong ví riêng của bạn, được sử dụng trong DeFi và bán đi..."
+```
+
+**Vietnamese AFTER** (link restored):
+```json
+"page-staking-section-comparison-pools-rewards-li3": "Token thanh khoản được lưu trữ trong ví riêng của bạn, được sử dụng trong DeFi và bán đi..."
+```
+
+## Prevention
+
+### Priority 1: Extend the sanitizer for JSON href validation
+
+The post-import sanitizer at `src/scripts/i18n/post_import_sanitize.ts` already has robust href validation for Markdown (`fixTranslatedHrefs`, lines 232-401). The `processJsonFile` function (lines 1273-1306) only does BOM normalization, smart quote replacement, and JSON parse validation. It performs zero href checking.
+
+Add a `validateJsonHrefs` step to `processJsonFile` that:
+- Loads the corresponding English JSON file
+- Extracts `href="..."` values from both EN and translated strings per key
+- Flags missing, extra, wrong, nested, or placeholder hrefs
+- Auto-fixes unambiguous cases (single mismatch per key)
+
+### Priority 2: CI validation gate
+
+Add a GitHub Actions check on PRs touching `src/intl/` that fails when href count mismatches, Crowdin placeholders, or nested anchors are detected. This should be a required status check on `dev` branch protection.
+
+### Priority 3: Crowdin configuration
+
+- Set JSON files to treat `` as protected tag pairs
+- Enable built-in "Tags mismatch" and "Broken URLs" QA checks
+- Add custom placeholder patterns for `href="[^"]*"` as non-editable tokens
+
+### Priority 4: Reviewer checklist
+
+When reviewing any PR touching `src/intl/`:
+- [ ] Anchor tag count parity per JSON key (EN vs translated)
+- [ ] No Crowdin numbered placeholders in output
+- [ ] No nested `` tags
+- [ ] All `href="..."` values unchanged from English
+- [ ] No extra or missing links vs English
+
+## Related Files
+
+- `src/scripts/i18n/post_import_sanitize.ts` - Post-import sanitizer (needs JSON href support)
+- `src/scripts/i18n/lib/workflows/sanitization.ts` - Sanitization workflow runner
+- `.claude/commands/review-translations.md` - Translation review slash command
+- `.github/workflows/claude-review-translations.yml` - CI translation review workflow
+- `docs/header-ids.md` - Related: header IDs must also not be translated
+- `docs/solutions/translation-review/crowdin-import-review-vietnamese-pr-17176.md` - Full PR #17176 review post-mortem
From 3cca730d7345821283b07f373f4d3647350396c7 Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Thu, 19 Feb 2026 16:34:09 -0700
Subject: [PATCH 10/31] fix(i18n): missing vi string translations
Co-authored-by: Gemini
---
src/intl/vi/common.json | 2 +-
src/intl/vi/page-collectibles.json | 2 +-
src/intl/vi/page-learn.json | 2 +-
src/intl/vi/page-staking.json | 2 +-
src/intl/vi/page-upgrades-index.json | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/intl/vi/common.json b/src/intl/vi/common.json
index aa158a7909b..df1a5c82bb1 100644
--- a/src/intl/vi/common.json
+++ b/src/intl/vi/common.json
@@ -490,7 +490,7 @@
"what-is-ethereum": "Ethereum là gì?",
"what-is-the-ethereum-network": "Mạng lưới Ethereum là gì?",
"withdrawals": "Rút tài sản đặt cược",
- "wrapped-ether": "Wrapped Ether",
+ "wrapped-ether": "Ether được bọc",
"yes": "Có",
"zero-knowledge-proofs": "Bằng chứng không tiết lộ thông tin",
"region-crimea": "Vùng Crimea",
diff --git a/src/intl/vi/page-collectibles.json b/src/intl/vi/page-collectibles.json
index 6f132a78f7d..cd6f73b3eea 100644
--- a/src/intl/vi/page-collectibles.json
+++ b/src/intl/vi/page-collectibles.json
@@ -43,7 +43,7 @@
"page-collectibles-index-frequency": "Kết quả được cập nhật 1 lần mỗi ngày vào 15:15 UTC",
"page-collectibles-instructions-label": "Hướng dẫn",
"page-collectibles-previous-years-badge-count": "{count, plural, =0 {không có huy hiệu nào} =1 {1 huy hiệu} other {# huy hiệu}}",
- "page-collectibles-previous-years-collectors-count": "{count, plural, =0 {no collectors} =1 {1 collector} other {# collectors}}",
+ "page-collectibles-previous-years-collectors-count": "{count, plural, =0 {không có người sưu tầm} =1 {1 người sưu tầm} other {# người sưu tầm}}",
"page-collectibles-previous-years-no-badges": "Không huy hiệu nào được đúc",
"page-collectibles-previous-years": "Năm trước",
"page-collectibles-social-desc": "Tham gia vào cuộc họp Discord để có thể tìm lỗi trang Web trước khi hoạt động hoặc cập nhật tin tức về ethereum.org trong cuộc họp cộng đồng hằng tháng.",
diff --git a/src/intl/vi/page-learn.json b/src/intl/vi/page-learn.json
index 5c6066a0096..96929f24cd2 100644
--- a/src/intl/vi/page-learn.json
+++ b/src/intl/vi/page-learn.json
@@ -70,7 +70,7 @@
"more-on-ethereum-use-cases": "Thông tin thêm về các trường hợp sử dụng Ethereum",
"more-on-ethereum-use-cases-link": "Blockchain ở những nước đang phát triển",
"strengthening-the-ethereum-network-description": "Bạn có thể tham gia staking ETH để giúp bảo mật mạng lưới Ethereum và đồng thời kiếm được phần thưởng. Quy trình staking có nhiều lựa chọn khác nhau, phụ thuộc vào mức độ hiểu biết về kỹ thuật và số lượng ETH mà bạn nắm giữ.",
- "staking-ethereum-card-title": "Staking Ethereum",
+ "staking-ethereum-card-title": "Ký gửi Ethereum",
"staking-ethereum-card-description": "Học cách bắt đầu staking ETH của bạn.",
"staking-ethereum-card-button": "Bắt đầu staking",
"run-a-node-card-title": "Vận hành một nút",
diff --git a/src/intl/vi/page-staking.json b/src/intl/vi/page-staking.json
index 9a0b3c6c0eb..e124d5f63d2 100644
--- a/src/intl/vi/page-staking.json
+++ b/src/intl/vi/page-staking.json
@@ -18,7 +18,7 @@
"page-staking-withdrawals-when": "Hoàn tất và ra mắt!",
"page-staking-image-alt": "Hình ảnh linh vật Tê giác cho cổ phần launchpad.",
"page-staking-benefits-1-title": "Kiếm phần thưởng",
- "page-staking-benefits-1-description": "Rewards are given for actions that help the network reach consensus. You'll get rewards for running software that properly batches transactions into new blocks and checks the work of other validators because that's what keeps the chain running securely.",
+ "page-staking-benefits-1-description": "Nhiều bể đặt cọc cung cấp một token ký gửi thanh khoản đại diện cho quyền sở hữu đối với lượng ETH đã ký gửi của bạn và phần thưởng mà nó tạo ra. Điều này cho phép bạn sử dụng ETH đã ký gửi của mình, ví dụ như làm tài sản thế chấp trong các ứng dụng DeFi.",
"page-staking-benefits-2-title": "Bảo mật hơn",
"page-staking-benefits-2-description": "Mạng lưới trở nên mạnh hơn trước các cuộc tấn công khi có nhiều ETH được góp cổ phần hơn, vì sau đó mạng lưới cần số ETH đó để kiểm soát phần lớn mạng lưới. Để trở thành mối đe dọa cho mạng lưới, bạn cần phải nắm được phần lớn nốt xác thực, cũng đồng nghĩa là bạn cần nắm giữ rất nhiều ETH trong mạng lưới–một con số khá lớn!",
"page-staking-benefits-3-title": "Bền vững hơn",
diff --git a/src/intl/vi/page-upgrades-index.json b/src/intl/vi/page-upgrades-index.json
index 8b9592df23d..7bc637b4863 100644
--- a/src/intl/vi/page-upgrades-index.json
+++ b/src/intl/vi/page-upgrades-index.json
@@ -51,7 +51,7 @@
"page-upgrades-merge-desc": "Mạng chính Ethereum hợp nhất với cơ chế bằng chứng cổ phần của Chuỗi Hải Đăng, đánh dấu hồi kết cho sự tiêu hao năng lượng và chi phí để đào.",
"page-upgrades-merge-estimate": "Sự kiện The Merge đã triển khai",
"page-upgrades-merge-mainnet": "Mạng chính là gì?",
- "page-upgrades-eth-blog": "ethereum.org blog",
+ "page-upgrades-eth-blog": "blog ethereum.org",
"page-upgrades-explore-btn": "Khám phá các nâng cấp",
"page-upgrades-get-involved": "Tham gia vào việc nâng cấp Ethereum",
"page-upgrades-get-involved-2": "Tham gia",
From 6477abc0e68e55d1ac66384b9ddca8a3f569af35 Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Thu, 19 Feb 2026 21:11:18 -0700
Subject: [PATCH 11/31] i18n: attempt to patch strings
Co-authored-by: Gemini Pro
---
public/content/translations/vi/about/index.md | 6 +-
public/content/translations/vi/defi/index.md | 14 +-
.../docs/intro-to-ethereum/index.md | 17 +-
public/content/translations/vi/nft/index.md | 2 +-
.../content/translations/vi/security/index.md | 6 +-
public/content/translations/vi/web3/index.md | 4 +-
.../translations/vi/whitepaper/index.md | 2 +-
src/intl/vi/common.json | 6 +-
src/intl/vi/page-apps.json | 6 +-
src/intl/vi/page-developers-docs.json | 2 +-
src/intl/vi/page-roadmap.json | 4 +-
src/intl/vi/page-staking.json | 150 +++++++++---------
src/intl/vi/page-upgrades-index.json | 2 +-
src/intl/vi/template-usecase.json | 2 +-
14 files changed, 116 insertions(+), 107 deletions(-)
diff --git a/public/content/translations/vi/about/index.md b/public/content/translations/vi/about/index.md
index 4315aa3a45b..d748631cb63 100644
--- a/public/content/translations/vi/about/index.md
+++ b/public/content/translations/vi/about/index.md
@@ -69,7 +69,7 @@ Chúng tôi nỗ lực xây dựng một kho tài liệu giáo dục về tất
- Tăng tổng số cộng tác viên tham gia trang web
- Nâng cao tỷ lệ quay lại của cộng tác viên thông qua các hoạt động gắn kết, ghi nhận và trao thưởng
- Trao quyền cho các thành viên trong cộng đồng để họ phát huy đóng góp những vai trò quan trọng hơn
-- Thức đẩy sự đa dạng trong đóng góp: viết code, làm nội dung, thiết kế, dịch thuật, điều phối
+- Thúc đẩy sự đa dạng trong đóng góp: viết code, làm nội dung, thiết kế, dịch thuật, điều phối
- Duy trì cơ sở mã nguồn hiện đại, sạch rõ và được ghi chép đầy đủ
## Các nguyên tắc cốt lõi {#core-principles}
@@ -78,13 +78,13 @@ Chúng tôi có một số nguyên tắc cốt lõi là kim chỉ nam giúp chú
### 1. ethereum.org là một cổng thông tin đến Ethereum 🌏 {#core-principles-1}
-Chúng tôi muốn thu hút sự quan tâm của người dùng và giải đáp những vướng mắt của họ. Vì vậy, cổng thông tin của chúng tôi cần kết hợp và phổ biến thông tin, nhu cầu, liên kết với các tài nguyên cộng đồng có sẵn. Mục đích chính của những nội dung này là giúp những người mới tiếp xúc, làm quen và nắm rõ thông tin mạng lưới. Chúng tôi mong muốn hỗ trợ và làm việc tích hợp với các tài nguyên do cộng đồng xây dựng, giúp họ hiểu biết hơn và dễ khám phá hơn.
+Chúng tôi muốn thu hút sự quan tâm của người dùng và giải đáp những vướng mắc của họ. Vì vậy, cổng thông tin của chúng tôi cần kết hợp và phổ biến thông tin, nhu cầu, liên kết với các tài nguyên cộng đồng có sẵn. Mục đích chính của những nội dung này là giúp những người mới tiếp xúc, làm quen và nắm rõ thông tin mạng lưới. Chúng tôi mong muốn hỗ trợ và làm việc tích hợp với các tài nguyên do cộng đồng xây dựng, giúp họ hiểu biết hơn và dễ khám phá hơn.
[Cộng đồng của Ethereum](/community/) là trọng tâm của việc này: chúng tôi không chỉ cần phục vụ cộng đồng, mà còn cần làm việc với họ và ghi nhận phản hồi của họ. Trang web không chỉ đơn thuần dành cho cộng đồng mà nó còn là niềm hi vọng của chúng tôi đối với sự phát triển lớn mạnh. Chúng ta phải nhớ rằng cộng đồng này được phổ biến toàn cầu, bao gồm những con người không cùng ngôn ngữ, khu vực và văn hóa.
### 2. ethereum.org luôn luôn phát triển 🛠 {#core-principles-2}
Ethereum và cộng đồng sẽ luôn luôn không ngừng phát triển, ethereum.org cũng thế. Đó là lý do tại sao trang web có một hệ thống thiết kế đơn giản và cấu trúc mô-đun. Chúng tôi sẽ luôn thay đổi khi chúng tôi hiểu được cách mà mọi người sử dụng trang web và cộng đồng muốn gì từ những trang web đó.
-Chúng tôi là chiếc mã nguồn mở, với một cộng đồng xây dựng bởi những người đóng góp, vì vậy sẽ không tránh khỏi những sai sót có thể xảy ra. Chúng tôi rất mong bạn có thể đề xuất các thay đổi hoặc trợ giúp chúng tôi.
+Chúng tôi là mã nguồn mở, với một cộng đồng xây dựng bởi những người đóng góp, vì vậy sẽ không tránh khỏi những sai sót có thể xảy ra. Chúng tôi rất mong bạn có thể đề xuất các thay đổi hoặc trợ giúp chúng tôi.
[Tìm hiểu về việc đóng góp](/contributing/)
### 3. ethereum.org không phải là một trang web sản phẩm thông thường 🦄 {#core-principles-3}
diff --git a/public/content/translations/vi/defi/index.md b/public/content/translations/vi/defi/index.md
index 8737a15291f..a92dad5dd97 100644
--- a/public/content/translations/vi/defi/index.md
+++ b/public/content/translations/vi/defi/index.md
@@ -112,7 +112,7 @@ Và nếu bạn không muốn gửi hoặc truyền [ETH](/glossary/#ether) vì
Sự biến động của tiền mã hóa là một vấn đề đối với các sản phẩm tài chính và việc tiêu dùng nói chung. Cộng đồng tài chính phi tập trung đã giải quyết vấn đề này bằng những đồng tiền ổn định (stablecoins). Giá trị của chúng được neo vào một tài sản khác, thường là một loại tiền tệ phổ biến như đồng đô la Mỹ.
-Các đồng tiền như Dai hay USDC có giá trị chênh lệch chỉ vài cents so với một đô la. Điều này khiến cho chúng trở nên hoàn hảo cho thu nhập hay hoạt động bán lẻ. Nhiều người ở châu Mỹ La-tinh dùng các đồng tiền ổn định như là một cách để bảo vệ những khoản tiết kiệm của họ trong một giai đoạn bầy bất trắc với những đồng tiền do chính phủ của họ phát hành.
+Các đồng tiền như Dai hay USDC có giá trị chênh lệch chỉ vài cents so với một đô la. Điều này khiến cho chúng trở nên hoàn hảo cho thu nhập hay hoạt động bán lẻ. Nhiều người ở châu Mỹ La-tinh dùng các đồng tiền ổn định như là một cách để bảo vệ những khoản tiết kiệm của họ trong một giai đoạn đầy bất trắc với những đồng tiền do chính phủ của họ phát hành.
Thêm về Stablecoins
@@ -323,7 +323,7 @@ Ethereum là nền tảng hoàn hảo cho tài chính phi tập trung vì một
Bạn có thể nghĩ về DeFi theo từng lớp:
-1. Chuỗi khốiChuỗi khối – Ethereum chứa đựng lịch sử giao dịch và tình trạng hiện thời của các tài khoản.
+1. Chuỗi khối – Ethereum chứa đựng lịch sử giao dịch và tình trạng hiện thời của các tài khoản.
2. Các tài sản – [ETH](/what-is-ether/) và các token (tiền tệ) khác.
3. Các giao thức – [hợp đồng thông minh](/glossary/#smart-contract) cung cấp chức năng, ví dụ, một dịch vụ cho phép cho vay tài sản phi tập trung.
4. [Các ứng dụng](/apps/) – các sản phẩm chúng tôi sử dụng để quản lý và truy cập các giao thức.
@@ -359,8 +359,16 @@ Tài chính phi tập trung là một phong trào nguồn mở. Các giao thức
### Cộng đồng {#communities}
- [Máy chủ Discord của DeFi Llama](https://discord.defillama.com/)
-- [Máy chủ Discord của DeFi Pulse](https://discord.gg/Gx4TCTk)
+
+## Ngoài DeFi truyền thống {#beyond-traditional-defi}
+
+Hệ sinh thái DeFi tiếp tục mở rộng sang các lĩnh vực mới:
+
+- **[Thị trường dự đoán](/prediction-markets/)** – Các nền tảng phi tập trung nơi bạn có thể đặt cược vào kết quả của các sự kiện trong tương lai, từ bầu cử đến các sự kiện thể thao, mà không cần trung gian.
+- **[Tài sản trong thế giới thực (RWA)](/real-world-assets/)** – Token hóa các tài sản vật chất như bất động sản, hàng hóa và trái phiếu trên Ethereum, mang lại hàng nghìn tỷ đô la giá trị trên chuỗi.
+- **[Thanh toán](/payments/)** – Sử dụng Ethereum và stablecoin để thanh toán toàn cầu nhanh chóng, chi phí thấp mà không cần cơ sở hạ tầng ngân hàng truyền thống.
+- **[Tác nhân AI](/ai-agents/)** – Các tác nhân phần mềm tự trị có thể giao dịch trên Ethereum, cho phép các hình thức giao dịch tự động, quản lý danh mục đầu tư và tương tác trên chuỗi mới.
diff --git a/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
index 5afde306be1..258ba3cefae 100644
--- a/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
+++ b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
@@ -14,7 +14,7 @@ Một chuỗi khối là một cơ sở dữ liệu công khai được cập nh
Mọi máy tính trong mạng lưới cần phải đồng ý về mỗi khối mới và toàn phần chuỗi. Những máy tính được biết đến là các "nút". Các nút đảm bảo tất cả mọi người tiếp xúc với mạng chuỗi khối có cùng dữ liệu. Để đạt được sự đồng thuận phân tán này, chuỗi khối cần một cơ chế đồng thuận.
-Ethereum sử dụng một [cơ chế đồng thuận dựa trên bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/). Bất cư ai muốn thêm khối vào chuỗi phải ký gửi ETH - đồng tiền bản địa của Ethereum - làm thế chấp và chạy phần mềm nút xác thực. Những "nút xác thực" này sẽ được chọn ngẫu nhiên để đề nghị thêm khối và được kiểm tra bởi các nút xác thực khác và ghi vào chuỗi khối. Có một hệ thống thưởng và phạt được sử dụng để khuyến khích những người tham gia trung thực và có mặt trực tuyến nhiều nhất có thể.
+Ethereum sử dụng một [cơ chế đồng thuận dựa trên bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos/). Bất cứ ai muốn thêm khối vào chuỗi phải ký gửi ETH - đồng tiền bản địa của Ethereum - làm thế chấp và chạy phần mềm nút xác thực. Những "nút xác thực" này sẽ được chọn ngẫu nhiên để đề nghị thêm khối và được kiểm tra bởi các nút xác thực khác và ghi vào chuỗi khối. Có một hệ thống thưởng và phạt được sử dụng để khuyến khích những người tham gia trung thực và có mặt trực tuyến nhiều nhất có thể.
Nếu bạn muốn xem cách dữ liệu chuỗi khối được băm và sau đó được thêm vào lịch sử tham chiếu khối, hãy chắc chắn xem [bản demo này](https://andersbrownworth.com/blockchain/blockchain) của Anders Brownworth và xem video đi kèm bên dưới.
@@ -26,21 +26,21 @@ Xem Ander giải thích hàm băm trong chuỗi khối:
Ethereum là một chuỗi khối với một máy tính nhúng vào nó. Nó là nền tảng để xây dựng ứng dụng và tổ chức trong một môi trường phi tập trung, không cần xin phép và chống kiểm duyệt.
-Nếu như trong vũ trụ Ethereum, sẽ chỉ có một, máy tính chuẩn tắc duy nhất (được gọi là máy ảo Ethereum) mà toàn bộ mạng lưới Ethereum đều đồng thuận về trạng thái của nó. Những ai tham gia vào mạng lưới Ethereum (mỗi nút Ethereum) giữ một phiên bản trạng thái của máy tính này. Thêm vào đó, những người tham gia có thể phát tán những yêu cầu từ máy chủ để thực hiện phép tính tùy thích. Khi nào những yêu cầu đó được phát tán đi, những người tham gia mạng lưới sẽ tham gia xác thực, hợp thuwcss hóa, và xử lí tính toán. Sự thực thi này làm một thay đổi trên trạng thái máy ảo Ethereum (EVM), được ghi nhận và phát tán ra khắp mạng lưới.
+Nếu như trong vũ trụ Ethereum, sẽ chỉ có một, máy tính chuẩn tắc duy nhất (được gọi là máy ảo Ethereum) mà toàn bộ mạng lưới Ethereum đều đồng thuận về trạng thái của nó. Những ai tham gia vào mạng lưới Ethereum (mỗi nút Ethereum) giữ một phiên bản trạng thái của máy tính này. Thêm vào đó, những người tham gia có thể phát tán những yêu cầu từ máy chủ để thực hiện phép tính tùy thích. Khi nào những yêu cầu đó được phát tán đi, những người tham gia mạng lưới sẽ tham gia xác thực, hợp thức hóa, và xử lí tính toán. Sự thực thi này làm một thay đổi trên trạng thái máy ảo Ethereum (EVM), được ghi nhận và phát tán ra khắp mạng lưới.
Những yêu cầu tính toán này được gọi là yêu cầu giao dịch; những ghi chép của tất cả giao dịch và trạng thái EVM hiện tại được lưu trữ trên chuỗi khối, sau đó được lưu trữ và đồng tình ở trên tất cả các nút.
-Các cơ chế mật mã học đảm bảo rằng một khi giao dịch được xác minh là hợp lệ và thêm vào mạng lưới, thì sau không thể bị giả mạo hoặc chỉnh sửa. Các cơ chế tương từ cũng đảm bảo rằng mọi giao dịch đều đưcọ ký và thực thi với quyền hạn phù hợp (không ai có thể gửi tài sản số từ tài khoản của Alice ngoại trừ chính Alice).
+Các cơ chế mật mã học đảm bảo rằng một khi giao dịch được xác minh là hợp lệ và thêm vào mạng lưới, thì sau không thể bị giả mạo hoặc chỉnh sửa. Các cơ chế tương tự cũng đảm bảo rằng mọi giao dịch đều được ký và thực thi với quyền hạn phù hợp (không ai có thể gửi tài sản số từ tài khoản của Alice ngoại trừ chính Alice).
## Ether là gì? {#what-is-ether}
-**Ether (ETH)** là đồng tiền mã hóa gốc của Ethereum. Mục đích của ETH là để cho phép một thị trường tính tồn tại. Một thị trường như vậy cung cấp động lực kinh tế cho những người tham gia để họ xác minh và thực thi các yêu cầu giao dịch, đồng thời cung cấp tài nguyên tính toán cho mạng lưới.
+**Ether (ETH)** là đồng tiền mã hóa gốc của Ethereum. Mục đích của ETH là để cho phép một thị trường cho việc tính toán. Một thị trường như vậy cung cấp động lực kinh tế cho những người tham gia để họ xác minh và thực thi các yêu cầu giao dịch, đồng thời cung cấp tài nguyên tính toán cho mạng lưới.
Bất kỳ người tham gia nào phát sóng một yêu cầu giao dịch cũng phải cung cấp cho mạng lưới một lượng ETH nhất định như một khoản thưởng. Mạng lưới sẽ đốt một phần của chi phí này và trao phần còn lại cho bất kỳ ai cuối cùng thực hiện công việc xác minh giao dịch, thực thi nó, ghi nhận nó lên chuỗi khối và phát sóng nó đến toàn bộ mạng lưới.
Lượng ETH được trả phụ thuộc và tài nguyên cần để tính toán. Những phần thưởng này cũng chặn những kẻ tham gia mạng lưới với mục đích xấu làm tắc nghẽn mạng lưới bằng cách thực hiện một vòng lặp tính toán vô tận hoặc một phép tính siêu tiêu tốn tài nguyên, bởi vì họ sẽ phải trả phí cho tài nguyên tính toán.
-Eth cũng sử dụng cơ chế "mật mã học-kinh tế" để đảm bảo an toàn mạn lưới trong 3 phương pháp chính: 1) nó được sử dụng để thưởng cho nút xác thực người đề xuất khối hoặc răn đe những trường hợp gian lận bởi những nút xác thực khác; 2) nó được sử dụng để Stake bởi các nút xác thực, đóng vai trò là tài sản thế chấp chống lại hành vi gian lận - nếu như nút xác thực cố gian lận thì ETH của họ bị hủy đi; 3) nó là một công cụ để làm trọng số phiếu bầu cho việc đề xuất khối mới, cho phép đưa vào phần quy tắc chọn nhánh (Fork-Choice) của cơ chế đồng thuận.
+Eth cũng sử dụng cơ chế "mật mã học-kinh tế" để đảm bảo an toàn mạng lưới trong 3 phương pháp chính: 1) nó được sử dụng để thưởng cho nút xác thực người đề xuất khối hoặc răn đe những trường hợp gian lận bởi những nút xác thực khác; 2) nó được sử dụng để Stake bởi các nút xác thực, đóng vai trò là tài sản thế chấp chống lại hành vi gian lận - nếu như nút xác thực cố gian lận thì ETH của họ bị hủy đi; 3) nó là một công cụ để làm trọng số phiếu bầu cho việc đề xuất khối mới, cho phép đưa vào phần quy tắc chọn nhánh (Fork-Choice) của cơ chế đồng thuận.
## Hợp đồng thông minh là gì? {#what-are-smart-contracts}
@@ -88,7 +88,7 @@ Một "yêu cầu giao dịch" là thuật ngữ chính thức cho một yêu c
- Gửi X ETH từ tài khoản của tôi tới tài khoản của Alice.
- Công khai một mã nguồn hợp đồng thông minh lên máy chủ EVM.
-- Thực thi một mã nguồn của hợp đồng thông minh tại địa chỉ X trên EVM, với đồng ý Y.
+- Thực thi một mã nguồn của hợp đồng thông minh tại địa chỉ X trên EVM, với các đối số Y.
[Tìm hiểu thêm về các giao dịch](/developers/docs/transactions/)
@@ -100,7 +100,7 @@ Khối lượng giao dịch rất cao, nên các giao dịch được "cam kết
### Hợp đồng thông minh {#smart-contracts}
-Một mẫu mã nguồn tái sử dụng (một chương trình) mà lập trình viên công khai trên trạng thái EVM. Bất kì ai cũng có thể yêu câu cầu một mã nguồn hợp đồng thông minh thực thi bằng cách gửi yêu cầu giao dịch. Bởi vì các nhà phát triển có thể viết các ứng dụng thực thi tùy ý vào EVM (trò chơi, thị trường, công cụ tài chính, v.v.) bằng cách xuất bản các hợp đồng thông minh, chúng cũng thường được gọi là [dapps, hay Các ứng dụng phi tập trung](/developers/docs/dapps/).
+Một mẫu mã nguồn tái sử dụng (một chương trình) mà lập trình viên công khai trên trạng thái EVM. Bất kì ai cũng có thể yêu cầu một mã nguồn hợp đồng thông minh thực thi bằng cách gửi yêu cầu giao dịch. Bởi vì các nhà phát triển có thể viết các ứng dụng thực thi tùy ý vào EVM (trò chơi, thị trường, công cụ tài chính, v.v.) bằng cách xuất bản các hợp đồng thông minh, chúng cũng thường được gọi là [dapps, hay Các ứng dụng phi tập trung](/developers/docs/dapps/).
[Tìm hiểu thêm về hợp đồng thông minh](/developers/docs/smart-contracts/)
@@ -109,7 +109,8 @@ Một mẫu mã nguồn tái sử dụng (một chương trình) mà lập trìn
- [Sách trắng Ethereum](/whitepaper/)
- [Rốt cuộc thì Ethereum hoạt động như thế nào?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) - _Preethi Kasireddy_ (**Lưu ý:** tài liệu này vẫn có giá trị nhưng xin lưu ý rằng nó được viết trước [The Merge](/roadmap/merge) và do đó vẫn đề cập đến cơ chế bằng chứng công việc của Ethereum - Ethereum hiện được bảo mật bằng [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos))
-### Tìm hiểu thêm từ video trực quan? Người học qua hình ảnh {#visual-learner}
+### Tìm hiểu thêm từ video trực quan?
+### Người học qua hình ảnh {#visual-learner}
Chuỗi video này cho phép khám phá các chủ đề nền tảng:
diff --git a/public/content/translations/vi/nft/index.md b/public/content/translations/vi/nft/index.md
index 64d9c3e0d82..2034112f245 100644
--- a/public/content/translations/vi/nft/index.md
+++ b/public/content/translations/vi/nft/index.md
@@ -1,5 +1,5 @@
---
-title: "Mã thông báo không thể thay thế (NFT)"
+title: "Token không thể thay thế (NFT)"
metaTitle: "NFT là gì? | Lợi ích và cách sử dụng"
description: "Tổng quan về NFT trên Ethereum"
lang: vi
diff --git a/public/content/translations/vi/security/index.md b/public/content/translations/vi/security/index.md
index 64ae918fd45..16b3bec9495 100644
--- a/public/content/translations/vi/security/index.md
+++ b/public/content/translations/vi/security/index.md
@@ -16,7 +16,7 @@ Sự quan tâm ngày càng tăng đối với tiền điện tử kéo theo rủ
### Nâng cao kiến thức của bạn {#level-up-your-knowledge}
-Những hiểu lầm về cách thức hoạt động của tiền điện tử có thể dẫn đến những sai lầm tổn thất tới kinh tế. Ví dụ, nếu ai đó giả mạo làm 1 chăm sóc khách hàng của 1 sàn giao dịch, họ sẽ nói rằng họ có thể trả lại ETH bạn làm mấtmất nếu bạn đưa mã 12 ký tự cho họ. Chính những tin tặc đang săn lùng những người không hiểu rằng Ethereum là một mạng phi tập trung và không ai có thể can thiệp theo phương thức đó. Tự giáo dục bản thân về cách mà Ethereum hoạt động là một khoản đầu tư đáng giá.
+Những hiểu lầm về cách thức hoạt động của tiền điện tử có thể dẫn đến những sai lầm tổn thất tới kinh tế. Ví dụ, nếu ai đó giả mạo làm 1 chăm sóc khách hàng của 1 sàn giao dịch, họ sẽ nói rằng họ có thể trả lại ETH bạn làm mất nếu bạn đưa mã 12 ký tự cho họ. Chính những tin tặc đang săn lùng những người không hiểu rằng Ethereum là một mạng phi tập trung và không ai có thể can thiệp theo phương thức đó. Tự giáo dục bản thân về cách mà Ethereum hoạt động là một khoản đầu tư đáng giá.
Ethereum là gì?
@@ -160,7 +160,7 @@ Nếu bạn nhận được email từ một người gửi không xác định,
Những kẻ lừa đảo sẽ giả vờ làm các nhà môi giới giao dịch tiền điện tử, chúng sẽ tự nhận là nhà môi giới chuyên nghiệp. Từ đây, chúng sẽ đề nghị bạn gửi tiền để chúng đầu tư giúp bạn. Sau khi kẻ lừa đảo nhận được tiền của bạn, họ có thể dẫn bạn đến, yêu cầu bạn gửi thêm tiền, để bạn không bỏ lỡ thêm lợi nhuận đầu tư, hoặc chúng có thể biến mất hoàn toàn.
-Những kẻ môi giới lừa đảo này tìm mục tiêu của họ bằng cách sử dụng các tài khoản giả mạo trên YouTube và bình luận 1 cách tự nhiên về 1 chủ đề nào đó. Các cuộc trò chuyện này thường nhận được lượt tương tác cao (thích, bình luận đồng tính) để tăng tính tin cậy, nhưng tất cả các bình luận tán thành đều từ các tài khoản bot.
+Những kẻ môi giới lừa đảo này tìm mục tiêu của họ bằng cách sử dụng các tài khoản giả mạo trên YouTube và bình luận 1 cách tự nhiên về 1 chủ đề nào đó. Các cuộc trò chuyện này thường nhận được lượt tương tác cao (thích, bình luận được tán thành) để tăng tính tin cậy, nhưng tất cả các bình luận tán thành đều từ các tài khoản bot.
**Đừng tin tưởng những người lạ trên internet để đầu tư thay mặt bạn. Bạn sẽ mất tiền điện tử của mình.**
@@ -202,7 +202,7 @@ Ví dụ về mật khẩu yếu: CuteFluffyKittens!
Ví dụ về mật khẩu mạnh: ymv\*azu.EAC8eyp8umf
```
-Một sai lầm phổ biến khác là sử dụng mật khẩu có thể dễ dàng bị đoán hoặc bị phát hiện thông qua [tấn công phi kỹ thuật](https://wikipedia.org/wiki/Social_engineering_\(security\)). Việc đưa biệt danh thời thiếu nữ của mẹ, tên của con cái, vật nuôi hoặc ngày sinh vào mật khẩu của bạn sẽ làm tăng nguy cơ bị hack.
+Một sai lầm phổ biến khác là sử dụng mật khẩu có thể dễ dàng bị đoán hoặc bị phát hiện thông qua [tấn công phi kỹ thuật](https://wikipedia.org/wiki/Social_engineering_\(security\)). Việc đưa tên thời con gái của mẹ, tên của con cái, vật nuôi hoặc ngày sinh vào mật khẩu của bạn sẽ làm tăng nguy cơ bị hack.
#### Các phương pháp tạo mật khẩu tốt: {#good-password-practices}
diff --git a/public/content/translations/vi/web3/index.md b/public/content/translations/vi/web3/index.md
index 53a02f48bea..81f162c7bf5 100644
--- a/public/content/translations/vi/web3/index.md
+++ b/public/content/translations/vi/web3/index.md
@@ -10,7 +10,7 @@ lang: vi
-Centralized đã giúp hàng tỷ người tiếp cận với Www ( World Wide Web) và tạo ra cơ sở hạ tầng ổn đinh, mạnh mẽ. Đồng thời, một số ít có tầm ảnh hưởng lớn trên không gian của World Wide Web đơn phương quyết định điều gì nên và không nên.
+Tập trung đã giúp hàng tỷ người tiếp cận với Www ( World Wide Web) và tạo ra cơ sở hạ tầng ổn đinh, mạnh mẽ. Đồng thời, một số ít có tầm ảnh hưởng lớn trên không gian của World Wide Web đơn phương quyết định điều gì nên và không nên.
Web3 là câu trả lời cho tình huống khó xử này. Thay vì một trang web được quản lí độc quyền bởi các công ty công nghệ lớn thì Web3 bao gồm sự phân quyền và được người dùng xây dựng, vận hành cũng như sở hữu. Web3 đặt quyền hạn vào tay các cá nhân hơn là các tập đoàn.
Trước khi bàn luận về Web3, hãy cùng nhau phân tích xem chúng có mặt ở đây như thế nào.
@@ -106,7 +106,7 @@ Tuy nhiên, mọi người định nghĩa nhiều cộng đồng Web3 là DAO. C
### Danh tính {#identity}
-Theo truyền thống, bạn sẽ tạo một tài khoản cho mọi nền tảng bạn sử dụng. Ví dụ bạn có thể có tài khoản Twitter, Facebook, Youtube và Reddit. Bạn muốn thay đổi thông tin hiển thị hoặc ảnh trang cá nhân? Bạn phải thao thác điều đó trên mọi tài khoản. Bạn có thể sử dụng đăng nhập mạng xã hội trong một số trường hợp, nhưng điều này gây ra một vấn đề quen thuộc — kiểm duyệt. Chỉ với một cú nhấp chuột, các nền tảng này có thể khóa bạn khỏi toàn bộ cuộc sống trực tuyến của mình. Thậm chí tệ hơn, nhiều nền tảng yêu cầu bạn phải cung cấp cho họ thông tin nhận dạng cá nhân để tạo tài khoản.
+Theo truyền thống, bạn sẽ tạo một tài khoản cho mọi nền tảng bạn sử dụng. Ví dụ bạn có thể có tài khoản Twitter, Facebook, Youtube và Reddit. Bạn muốn thay đổi thông tin hiển thị hoặc ảnh trang cá nhân? Bạn phải thao tác điều đó trên mọi tài khoản. Bạn có thể sử dụng đăng nhập mạng xã hội trong một số trường hợp, nhưng điều này gây ra một vấn đề quen thuộc — kiểm duyệt. Chỉ với một cú nhấp chuột, các nền tảng này có thể khóa bạn khỏi toàn bộ cuộc sống trực tuyến của mình. Thậm chí tệ hơn, nhiều nền tảng yêu cầu bạn phải cung cấp cho họ thông tin nhận dạng cá nhân để tạo tài khoản.
Web3 giải quyết các vấn đề này bằng cách cho phép bạn kiểm soát danh tính kỹ thuật số của mình bằng một địa chỉ Ethereum và hồ sơ [Dịch vụ Định danh Ethereum (ENS)](/glossary/#ens). Sử dụng địa chỉ Ethereum cung cấp một thông tin đăng nhập duy nhất trên các nền tảng an toàn, chống kiểm duyệt và ẩn danh.
diff --git a/public/content/translations/vi/whitepaper/index.md b/public/content/translations/vi/whitepaper/index.md
index 2284e022b72..83323f3e89a 100644
--- a/public/content/translations/vi/whitepaper/index.md
+++ b/public/content/translations/vi/whitepaper/index.md
@@ -6,7 +6,7 @@ sidebarDepth: 2
hideEditButton: true
---
-# Giấy trắng Ethereum {#ethereum-whitepaper}
+# Sách trắng Ethereum {#ethereum-whitepaper}
_Bài viết giới thiệu này được xuất bản lần đầu vào năm 2014 bởi Vitalik Buterin, người sáng lập [Ethereum](/what-is-ethereum/), trước khi dự án ra mắt vào năm 2015. Nên biết rằng, tương tự như nhiều dự án phần mềm mã nguồn mở và được phát triển bởi cộng đồng khác, Ethereum đã tiến hoá nhiều lần từ khi nó được tạo ra._
diff --git a/src/intl/vi/common.json b/src/intl/vi/common.json
index df1a5c82bb1..53b472af558 100644
--- a/src/intl/vi/common.json
+++ b/src/intl/vi/common.json
@@ -51,7 +51,7 @@
"description": "Mô tả mục điều hướng",
"design": "Thiết kế",
"design-principles": "Nguyên tắc thiết kế",
- "devcon": "Hội nghị các nhà phát triển",
+ "devcon": "Devcon",
"developers": "Nhà phát triển",
"developers-home": "Trang chủ dành cho nhà phát triển",
"docs": "Tài liệu",
@@ -94,8 +94,8 @@
"ethereum-brand-assets": "Tài sản thương hiệu Ethereum",
"ethereum-bug-bounty": "Chương trình nhận thưởng khi tìm ra lỗi trên Ethereum",
"ethereum-events": "Những sự kiện của Ethereum",
- "ethereum-foundation": "Nền tảng Ethereum",
- "ethereum-foundation-logo": "Logo của Nền tảng Ethereum",
+ "ethereum-foundation": "Ethereum Foundation",
+ "ethereum-foundation-logo": "Logo của Ethereum Foundation",
"ethereum-glossary": "Thuật ngữ về Ethereum",
"ethereum-governance": "Quản trị Ethereum",
"ethereum-history-founder-and-ownership": "Lịch sử, nhà sáng lập và quyền sở hữu của Ethereum",
diff --git a/src/intl/vi/page-apps.json b/src/intl/vi/page-apps.json
index 5f40130a240..f83ed157c01 100644
--- a/src/intl/vi/page-apps.json
+++ b/src/intl/vi/page-apps.json
@@ -15,7 +15,7 @@
"page-apps-highlights-title": "Nổi bật",
"page-apps-discover-title": "Khám phá",
"page-apps-applications-title": "Các ứng dụng",
- "page-apps-categories-title": "Phân lợi ứng dụng",
+ "page-apps-categories-title": "Phân loại",
"page-apps-community-picks-title": "Lựa chọn cộng đồng",
"page-apps-meta-title": "Ứng dụng crypto hàng đầu trên Ethereum",
"page-apps-meta-description": "Khám phá các ứng dụng crypto trên Ethereum: DeFi, NFTs, Social, Gaming, Bridges, Privacy, Productivity & DAO dApps. Tìm ứng dụng trong chuỗi đáng tin cậy để tương tác,giao dịch và kiếm lời. ",
@@ -26,13 +26,13 @@
"page-apps-category-collectibles-name": "Các món đồ sưu tập kĩ thuật số",
"page-apps-category-collectibles-description": "Đồ Sưu Tập là những vật phẩm kỹ thuật số độc nhất và không thể nhân bản.",
"page-apps-category-collectibles-meta-title": "Danh sách những ứng dụng NFT tốt nhất trên Ethereum",
- "page-apps-category-collectibles-meta-description": "Khám phá những ứng dụng NFT dành cho việc mua đồ suu tập, giao dịch skin trong game, và khám phá hững tài sản kỹ thuật số mới trong các chợ giao dịch hàng đầu trên Ethereum.",
+ "page-apps-category-collectibles-meta-description": "Khám phá các ứng dụng sưu tập được xây dựng trên Ethereum. Tìm các ứng dụng phổ biến nhất để mua, bán và giao dịch các bộ sưu tập kỹ thuật số độc đáo và những vật phẩm quý hiếm.",,
"page-apps-category-social-name": "Xã hội",
"page-apps-category-social-description": "Xã Hội là một danh mục các ứng dụng phi tập trung cho phép người dùng kết nối với những người khác và chia sẻ nội dung.",
"page-apps-category-social-meta-title": "Các ứng dụng xã hội trên Ethereum: Farcaster, Zora và hơn thế nữa",
"page-apps-category-social-meta-description": "Khám phá các ứng dụng nhắn tin và mạng xã hội tốt nhất trên nền tảng Ethereum.",
"page-apps-category-gaming-name": "Trò chơi",
- "page-apps-category-gaming-description": "Gaming là một danh mục các ứng dụng phi tập trung cho phép ngươi chơi chơi game và kiếm thưởng.",
+ "page-apps-category-gaming-description": "Trò chơi mà bạn sở hữu tài sản trong trò chơi và có thể kiếm tiền khi chơi. Người chơi có thể giao dịch tài sản của họ bên ngoài trò chơi.",,
"page-apps-category-gaming-meta-title": "Danh sách các trò chơi crypto và NFT trên Ethereum",
"page-apps-category-gaming-meta-description": "Khám phá những game blockchain chơi vui nhất. MMORPG, game thẻ bài, game AI, RPG, game phổ thông",
"page-apps-category-bridge-name": "Cầu nối",
diff --git a/src/intl/vi/page-developers-docs.json b/src/intl/vi/page-developers-docs.json
index d31cca3d497..9ea85b53b5f 100644
--- a/src/intl/vi/page-developers-docs.json
+++ b/src/intl/vi/page-developers-docs.json
@@ -143,7 +143,7 @@
"page-calltocontribute-desc-4": "Có câu hỏi? Hãy hỏi chúng tôi trong kênh #content trên của chúng tôi",
"page-calltocontribute-link": "mẫu văn bản",
"page-calltocontribute-link-2": "Discord server",
- "page-calltocontribute-span": "Trang chỉnh sữa",
+ "page-calltocontribute-span": "Chỉnh sửa trang này",,
"page-calltocontribute-title": "Giúp đỡ chúng tôi tại trang này",
"layer-2-arbitrum-note": "Bằng chứng gian lận chỉ dành cho những người dùng trong danh sách trắng, hiện danh sách trắng vẫn chưa mở",
"layer-2-boba-note": "Kiểm duyệt trạng thái trong quá trình phát triển",
diff --git a/src/intl/vi/page-roadmap.json b/src/intl/vi/page-roadmap.json
index ebc05cfdd1d..37772f4609b 100644
--- a/src/intl/vi/page-roadmap.json
+++ b/src/intl/vi/page-roadmap.json
@@ -68,11 +68,11 @@
"page-roadmap-shapella-withdrawals-title": "Rút tài sản đặt cược",
"page-roadmap-shapella-withdrawals-item-1": "Cho phép các validator rút ETH đã stake và phần thưởng của họ",
"page-roadmap-shapella-withdrawals-item-2": "Giới thiệu khả năng rút tiền một phần và toàn bộ",
- "page-roadmap-shapella-eip4895-title": "EIP-4895: EIP-4895: Đề xuất rút tiền từ Beacon Chain",
+ "page-roadmap-shapella-eip4895-title": "EIP-4895: Đề xuất rút tiền từ Beacon Chain",
"page-roadmap-shapella-eip4895-item-1": "Thêm một nâng cấp nữa cho việc rút tiền",
"page-roadmap-shapella-eip4895-item-2": "Đảm bảo việc xử lý yêu cầu rút tiền được an toàn và hiệu quả",
"page-roadmap-shapella-eip3651-title": "EIP-3651: COINBASE khởi động",
- "page-roadmap-shapella-eip3651-item-1": "Giảm chi phí khí đốt để truy cập địa chỉ COINBASE",
+ "page-roadmap-shapella-eip3651-item-1": "Giảm chi phí ga để truy cập địa chỉ COINBASE",
"page-roadmap-shapella-eip3651-item-2": "Cải thiện hiệu suất của một số hoạt động hợp đồng thông minh",
"page-roadmap-dencun-danksharding-title": "Giao thức Proto-Danksharding (EIP-4844)",
"page-roadmap-dencun-danksharding-item-1": "Đã giới thiệu giao dịch blob để giảm đáng kể chi phí giao dịch rollup",
diff --git a/src/intl/vi/page-staking.json b/src/intl/vi/page-staking.json
index e124d5f63d2..49f6e609e68 100644
--- a/src/intl/vi/page-staking.json
+++ b/src/intl/vi/page-staking.json
@@ -18,32 +18,32 @@
"page-staking-withdrawals-when": "Hoàn tất và ra mắt!",
"page-staking-image-alt": "Hình ảnh linh vật Tê giác cho cổ phần launchpad.",
"page-staking-benefits-1-title": "Kiếm phần thưởng",
- "page-staking-benefits-1-description": "Nhiều bể đặt cọc cung cấp một token ký gửi thanh khoản đại diện cho quyền sở hữu đối với lượng ETH đã ký gửi của bạn và phần thưởng mà nó tạo ra. Điều này cho phép bạn sử dụng ETH đã ký gửi của mình, ví dụ như làm tài sản thế chấp trong các ứng dụng DeFi.",
+ "page-staking-benefits-1-description": "Phần thưởng được trao cho các hành động giúp mạng đạt được sự đồng thuận. Bạn sẽ nhận được phần thưởng khi chạy phần mềm gộp các giao dịch vào các khối mới một cách hợp lý và kiểm tra công việc của các trình xác thực khác vì đó là điều giúp chuỗi hoạt động an toàn.",
"page-staking-benefits-2-title": "Bảo mật hơn",
- "page-staking-benefits-2-description": "Mạng lưới trở nên mạnh hơn trước các cuộc tấn công khi có nhiều ETH được góp cổ phần hơn, vì sau đó mạng lưới cần số ETH đó để kiểm soát phần lớn mạng lưới. Để trở thành mối đe dọa cho mạng lưới, bạn cần phải nắm được phần lớn nốt xác thực, cũng đồng nghĩa là bạn cần nắm giữ rất nhiều ETH trong mạng lưới–một con số khá lớn!",
+ "page-staking-benefits-2-description": "Mạng lưới trở nên mạnh hơn trước các cuộc tấn công khi có nhiều ETH được ký gửi hơn, vì sau đó mạng lưới cần số ETH đó để kiểm soát phần lớn mạng lưới. Để trở thành mối đe dọa cho mạng lưới, bạn cần phải nắm được phần lớn nốt xác thực, cũng đồng nghĩa là bạn cần nắm giữ rất nhiều ETH trong mạng lưới–một con số khá lớn!",
"page-staking-benefits-3-title": "Bền vững hơn",
- "page-staking-benefits-3-description": "Ký gửi viên không cần tốn nhiều năng lượng như chất xám, điện năng để chạy node theo cơ chế đồng thuận bằng chứng công việc cũ nữa, nghĩa là các node được úy quyền ký gửi có thể chạy trên phần cứng sử dụng rất ít điện năng.",
+ "page-staking-benefits-3-description": "Những người ký gửi không cần tốn nhiều năng lượng như chất xám, điện năng để chạy node theo cơ chế đồng thuận bằng chứng công việc cũ nữa, nghĩa là các node được úy quyền ký gửi có thể chạy trên phần cứng sử dụng rất ít điện năng.",
"page-staking-benefits-3-link": "Thông tin thêm về mức tiêu thụ năng lượng của Ethereum",
- "page-staking-description": "Đặt cọc là hành động gửi 32 ETH để kích hoạt phần mềm validator. Với tư cách là người xác thực, bạn sẽ chịu trách nhiệm lưu trữ dữ liệu, xử lý giao dịch và thêm khối mới vào chuỗi khối. Điều này sẽ giúp Ethereum được an toàn cho mọi người và giúp bạn kiếm được ETH mới trong quá trình.",
- "page-staking-hero-title": "Đặt cọc ETH như thế nào",
+ "page-staking-description": "Ký gửi là hành động gửi 32 ETH để kích hoạt phần mềm validator. Với tư cách là người xác thực, bạn sẽ chịu trách nhiệm lưu trữ dữ liệu, xử lý giao dịch và thêm khối mới vào chuỗi khối. Điều này sẽ giúp Ethereum được an toàn cho mọi người và giúp bạn kiếm được ETH mới trong quá trình.",
+ "page-staking-hero-title": "Ký gửi ETH như thế nào",
"page-staking-hero-header": "Kiếm phần thưởng khi bảo mật Ethereum",
"page-staking-hero-subtitle": "Bất kỳ người dùng nào có số lượng ETH bất kỳ đều có thể giúp bảo mật mạng và kiếm được phần thưởng trong quá trình.",
- "page-staking-dropdown-home": "Trang chủ Staking",
- "page-staking-dropdown-solo": "Trang chủ stacking",
- "page-staking-more-on-solo": "Thêm về trang chủ stacking",
- "page-staking-learn-more-solo": "Tìm hiểu thêm về góp cổ phần một mình",
- "page-staking-dropdown-saas": "Đặt cọc như là một dịch vụ",
- "page-staking-saas-with-abbrev": "Cổ phần như một dịch vụ (SaaS)",
- "page-staking-more-on-saas": "Thông tin thêm về góp cổ phần dưới dạng dịch vụ",
- "page-staking-learn-more-saas": "Thông tin thêm về góp cổ phần dưới dạng một dịch vụ",
- "page-staking-dropdown-pools": "Staking chung",
+ "page-staking-dropdown-home": "Trang chủ ký gửi",
+ "page-staking-dropdown-solo": "Ký gửi một mình",
+ "page-staking-more-on-solo": "Thêm về ký gửi một mình",
+ "page-staking-learn-more-solo": "Tìm hiểu thêm về ký gửi một mình",
+ "page-staking-dropdown-saas": "Ký gửi như là một dịch vụ",
+ "page-staking-saas-with-abbrev": "Ký gửi như một dịch vụ (SaaS)",
+ "page-staking-more-on-saas": "Thông tin thêm về ký gửi dưới dạng dịch vụ",
+ "page-staking-learn-more-saas": "Thông tin thêm về ký gửi dưới dạng một dịch vụ",
+ "page-staking-dropdown-pools": "Ký gửi chung",
"page-staking-dropdown-withdrawals": "Về rút tiền",
"page-staking-dropdown-dvt": "Công nghệ xác thực phi tập trung",
- "page-staking-more-on-pools": "Thông tin thêm về góp cổ phần theo nhóm",
- "page-staking-learn-more-pools": "Tìm hiểu thêm về đóng góp chung cổ phần",
- "page-staking-section-what-title": "Đóng góp cổ phần là gì?",
- "page-staking-section-why-title": "Tại sao đặt cọc ETH của bạn?",
- "page-staking-section-why-p1": "Nó hoàn toàn phụ thuộc vào việc bạn sẵn sàng góp cổ phần bao nhiêu. Bạn sẽ cần 32 ETH để kích hoạt trình xác thực, tuy nhiên bạn cũng có thể đặt cọc ít hơn.",
+ "page-staking-more-on-pools": "Thông tin thêm về ký gửi theo nhóm",
+ "page-staking-learn-more-pools": "Tìm hiểu thêm về ký gửi chung",
+ "page-staking-section-what-title": "Ký gửi là gì?",
+ "page-staking-section-why-title": "Tại sao ký gửi ETH của bạn?",
+ "page-staking-section-why-p1": "Nó hoàn toàn phụ thuộc vào việc bạn sẵn sàng ký gửi bao nhiêu. Bạn sẽ cần 32 ETH để kích hoạt trình xác thực, tuy nhiên bạn cũng có thể ký gửi ít hơn.",
"page-staking-section-why-p2": "Kiểm tra các lựa chọn bên dưới và đi đến lựa chọn tốt nhất cho bạn, cũng như mạng lưới.",
"page-staking-guide-title-coincashew-ethereum": "Hướng dẫn Ethereum 2.0 của CoinCashew",
"page-staking-guide-title-somer-esat": "Somer Esat",
@@ -53,43 +53,43 @@
"page-staking-guide-description-linux": "Linux (CLI)",
"page-staking-guide-description-mac-linux": "Linux, macOS (CLI)",
"page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)",
- "page-staking-hierarchy-solo-h2": "Trang chủ stacking",
+ "page-staking-hierarchy-solo-h2": "Ký gửi một mình",
"page-staking-hierarchy-solo-pill-1": "Tác động mạnh mẽ nhất",
"page-staking-hierarchy-solo-pill-2": "Toàn quyển kiểm soát",
"page-staking-hierarchy-solo-pill-3": "Nhận thưởng hoàn toàn",
"page-staking-hierarchy-solo-pill-4": "Không tin tưởng",
- "page-staking-hierarchy-solo-p1": "Trang chủ staking trên Ethereum là tiêu chuẩn vàng cho việc staking. Nó mang lại phần thưởng đầy đủ khi tham gia, cải thiện sự phi tập trung của mạng lưới và không bao giờ yêu cầu bạn phải tin tưởng người khác với tài sản của mình.",
- "page-staking-hierarchy-solo-p2": "Những người xem xét việc staking từ trang chủ nên có một lượng ETH nhất định và một máy tính chuyên dụng được kết nối với internet 24/7. Một chút kiến thức kỹ thuật sẽ hữu ích, nhưng hiện nay đã có những công cụ dễ sử dụng giúp đơn giản hóa quy trình này.",
- "page-staking-hierarchy-solo-p3": "Những stakers có thể góp quỹ của họ với người khác hoặc có thể tự mình với ít nhất 32 ETH. Giải pháp Token Staking thanh khoản được dùng để duy trì truy cập vào DeFi.",
+ "page-staking-hierarchy-solo-p1": "Ký gửi tại nhà trên Ethereum là tiêu chuẩn vàng cho việc ký gửi. Nó mang lại phần thưởng đầy đủ khi tham gia, cải thiện sự phi tập trung của mạng lưới và không bao giờ yêu cầu bạn phải tin tưởng người khác với tài sản của mình.",
+ "page-staking-hierarchy-solo-p2": "Những người xem xét việc ký gửi từ trang chủ nên có một lượng ETH nhất định và một máy tính chuyên dụng được kết nối với internet 24/7. Một chút kiến thức kỹ thuật sẽ hữu ích, nhưng hiện nay đã có những công cụ dễ sử dụng giúp đơn giản hóa quy trình này.",
+ "page-staking-hierarchy-solo-p3": "Những người ký gửi có thể góp quỹ của họ với người khác hoặc có thể tự mình với ít nhất 32 ETH. Giải pháp Token ký gửi thanh khoản được dùng để duy trì truy cập vào DeFi.",
"page-staking-hierarchy-saas-pill-1": "32 ETH của bạn",
"page-staking-hierarchy-saas-pill-2": "Khóa xác thực của bạn",
"page-staking-hierarchy-saas-pill-3": "Vận hành nốt được giao",
- "page-staking-hierarchy-saas-p1": "Nếu bạn không muốn hoặc không cảm thấy thoải mái khi phải đối phó với phần cứng nhưng vẫn muốn đóng góp 32 ETH, lựa chọn dịch vụ staking cho phép bạn ủy thác phần cứng trong khi bạn kiếm phần thưởng khối vốn có.",
+ "page-staking-hierarchy-saas-p1": "Nếu bạn không muốn hoặc không cảm thấy thoải mái khi phải đối phó với phần cứng nhưng vẫn muốn ký gửi 32 ETH, lựa chọn dịch vụ ký gửi cho phép bạn ủy thác phần cứng trong khi bạn kiếm phần thưởng khối vốn có.",
"page-staking-hierarchy-saas-p2": "Những lựa chọn này thường yêu cầu bạn tạo định danh xác thực, cập nhật khóa chữ ký cho chúng và gửi vào 32 ETH. Điều này sẽ cho phép dịch vụ xác thực thay cho bạn.",
- "page-staking-hierarchy-saas-p3": "Phương pháp góp cổ phần yêu cầu sự tin tưởng nhất định vào nhà cung cấp. Để hạn chế rủi ro giữa các bên, bạn phải luôn giữ khóa để rút ETH.",
- "page-staking-hierarchy-pools-pill-1": "Đặt cọc bao nhiêu cũng được",
+ "page-staking-hierarchy-saas-p3": "Phương pháp ký gửi yêu cầu sự tin tưởng nhất định vào nhà cung cấp. Để hạn chế rủi ro giữa các bên, bạn phải luôn giữ khóa để rút ETH.",
+ "page-staking-hierarchy-pools-pill-1": "Ký gửi bao nhiêu cũng được",
"page-staking-hierarchy-pools-pill-2": "Kiếm phần thưởng",
"page-staking-hierarchy-pools-pill-3": "Giữ nó một cách đơn giản",
"page-staking-hierarchy-pools-pill-4": "Phổ biến",
"page-staking-hierarchy-pools-p1": "Có nhiều giải pháp huy động vốn tồn tại để hỗ trợ những người dùng không có hoặc không cảm thấy thoải mái khi đầu tư 32 ETH.",
- "page-staking-hierarchy-pools-p2": "Nhiều tùy chọn trong số này bao gồm cái được gọi là 'đặt cược thanh khoản' bao gồm mã thông báo thanh khoản ERC-20 đại diện cho ETH mà bạn đã đặt cược.",
- "page-staking-hierarchy-pools-p3": "Staking thanh khoản khiến việc staking và unstaking trở nên đơn giản như một giao dịch token và cho phép sử dụng vốn đã staking trong DeFi. Tùy chọn này cũng cho phép người dùng giữ quyền kiểm soát tài sản của họ trong ví Ethereum của riêng mình.",
- "page-staking-hierarchy-pools-p4": "Đặt cọc theo nhóm chung vốn không có trên mạng lưới Ethereum. Các bên thứ ba tạo nên giải pháp này, và họ tự chịu trách nhiệm cho những rủi ro.",
+ "page-staking-hierarchy-pools-p2": "Nhiều tùy chọn trong số này bao gồm cái được gọi là 'ký gửi thanh khoản' bao gồm mã thông báo thanh khoản ERC-20 đại diện cho ETH mà bạn đã ký gửi.",
+ "page-staking-hierarchy-pools-p3": "Ký gửi thanh khoản khiến việc ký gửi và hủy ký gửi trở nên đơn giản như một giao dịch token và cho phép sử dụng vốn đã ký gửi trong DeFi. Tùy chọn này cũng cho phép người dùng giữ quyền kiểm soát tài sản của họ trong ví Ethereum của riêng mình.",
+ "page-staking-hierarchy-pools-p4": "Ký gửi theo nhóm chung vốn không có trên mạng lưới Ethereum. Các bên thứ ba tạo nên giải pháp này, và họ tự chịu trách nhiệm cho những rủi ro.",
"page-staking-hierarchy-cex-h2": "Các sàn giao dịch tập trung",
"page-staking-hierarchy-cex-pill-1": "Ít tác động nhất",
"page-staking-hierarchy-cex-pill-2": "Giả thiết tin cậy nhất",
- "page-staking-hierarchy-cex-p1": "Nhiều sàn tập trung cung cấp dịch vụ góp cổ phần nếu như bạn vẫn không thoải mái khi giữ ETH trong ví của mình. Họ sẽ giữ ETH cho bạn, trong khi đó bạn có thể hưởng được lợi tức từ đó mà không mất quá nhiều công sức hoặc chỉ phải giám sát rất ít.",
+ "page-staking-hierarchy-cex-p1": "Nhiều sàn tập trung cung cấp dịch vụ ký gửi nếu như bạn vẫn không thoải mái khi giữ ETH trong ví của mình. Họ sẽ giữ ETH cho bạn, trong khi đó bạn có thể hưởng được lợi tức từ đó mà không mất quá nhiều công sức hoặc chỉ phải giám sát rất ít.",
"page-staking-hierarchy-cex-p2": "Nhưng cái giá phải trả ở đây là những nhà cung cấp dịch vụ phi tập trung thường tổng hợp số lượng ETH lớn để chạy một số lượng lớn các nốt xác thực. Điều này có thể gây nguy hiểm cho mạng lưới và người dùng vì nó sẽ tạo ra các mục tiêu tập trung lớn và điểm tới hạn, làm cho mạng lưới dễ bị tấn công hơn hoặc xảy ra lỗi.",
- "page-staking-hierarchy-cex-p3": "Nếu bạn không cảm thấy thoải mái khi giữ khóa của mình thì cũng không sao. Bạn có những lựa chọn sau. Lúc này, cân nhắc kiểm tra trang ví, nơi bạn có thể bắt đầu học làm thế nào để nắm giữ quyền sở hữu hoàn toàn với tiền của mình. Khi bạn sẵn sàng, quay lại và góp cổ phần cao hơn bằng cách thử lại một trong những dịch vụ góp cổ phần theo nhóm bạn tự kiếm soát đã có.",
- "page-staking-hierarchy-subtext": "Bạn có thể thấy rằng, có nhiều cách để đặt cọc Ethereum. Những cách này hướng tới nhiều loại người dùng và mỗi cách lại khác biệt và có rủi ro, phần thưởng, mức độ tin cậy giả định khác nhau. Một số thì phi tập trung, thử nghiệm triệt để và mạo hiểm hơn cái khác. Chúng tôi cung cấp cho bạn một số thông tin về các dự án phổ biến trong bối cảnh này, nhưng hãy luôn tự nghiên cứu kỹ trước khi gửi ETH của bạn đi bất kỳ đâu.",
- "page-staking-comparison-solo-saas": "Với nhà cung cấp SaaS, bạn vẫn cần phải gửi vào 32 ETH, nhưng không phải chạy phần cứng. Bạn thường vẫn có quyền truy cập khóa xác thực của bạn, nhưng cũng cần phải chia sẻ khóa chữ ký để những người vận hành có thể hành động thay cho nốt xác thực của bạn. Điều này đưa ra một lớp tin tưởng nhưng không hiển thị khi bạn chạy phần cứng riêng, cũng không giống như bạn góp cổ phần một mình, dịch vụ SaaS không giúp bạn nhiều về việc phân phối các nốt theo địa lý. Nếu bạn không thoải mái khi vận hành phần cứng nhưng vẫn muốn góp cổ phần 32 ETH, dịch vụ SaaS có thể là một sự lựa chọn tốt cho bạn.",
- "page-staking-comparison-solo-pools": "Góp cổ phần một mình yêu cầu tham gia nhiều hơn đáng kể so với góp cổ phần bằng dịch vụ chun, nhưng cung cấp toàn quyền truy cập vào phần thưởng ETH cũng như toàn quyền kiểm soát việc thiết lập và bảo mật nốt xác thực của bạn. Góp cổ phần theo nhóm có rào cản gia nhập thấp hơn đáng kể. Người dùng có thể góp một lượng nhỏ ETH, không bắt buộc phải tạo khóa xác thực và không có yêu cầu về phần cứng ngoài kết nối internet tiêu chuẩn. Mã thông báo thanh khoản cho phép khả năng thoát quy trình góp cổ phần trước khi tính năng này được bật ở cấp giao thức. Nếu bạn quan tâm đến các tính năng này, góp cổ phần theo nhóm có thể phù hợp.",
- "page-staking-comparison-saas-solo": "Điểm giống nhau ở đây là bạn sở hữu khóa xác thực của mình mà không cần gộp tiền, nhưng với SaaS bạn cần phải tin tưởng một bên thứ ba có thể hành động ác ý hoặc trở thành đối tượng bị tấn công hoặc điều chỉnh. Nếu những giả thiết về sự tin tưởng hay rủi ro về sự tập trung khiến bạn băn khoăn, tiêu chuẩn vàng của góp cổ phần tự quản là tự góp cổ phần một mình.",
- "page-staking-comparison-saas-pools": "Điểm giống nhau ở đây đó là bạn phải tin tưởng vào SaaS, nhưng góp cổ phần theo nhóm cho phép bạn gửi vào ít ETH hơn. Nếu bạn đang muốn góp cổ phần ít hơn 32 ETH, có thể xem kỹ thêm dưới đây.",
- "page-staking-comparison-pools-solo": "Staking theo quỹ đòi hỏi thấp hơn đáng kể so với tự staking, nhưng đi kèm với rủi ro do ủy quyền toàn bộ hoạt động của nút xác thực cho bên thứ ba, và có phí đi kèm. Tự Staking mang lại toàn quyền tự chủ và kiểm soát đối với các lựa chọn trong việc thiết lập Staking. Người Stake không bao giờ phải trao chìa khóa của mình và họ nhận toàn bộ phần thưởng mà không có bất kỳ trung gian nào cắt xén.",
- "page-staking-comparison-pools-saas": "Điểm giống nhau nữa là những người góp cổ phần không cần phải tự chạy phần mềm xác thực, nhưng không giống góp cổ phần theo nhóm, dịch vụ SaaS yêu cầu gửi vào đủ 32 ETH để kích hoạt nốt xác thực. Phần thưởng được trao cho người góp cổ phần, bao gồm cả phí hàng tháng hoặc tiền góp cổ phần khác để sử dụng dịch vụ. Nếu bạn muốn tự giữ khóa xác thực và muốn góp cổ phần ít hơn 32 ETH, sử dụng nhà cung cấp dịch vụ SaaS sẽ là lựa chọn tốt cho bạn.",
- "page-staking-considerations-dropdown-text": "Cân nhắc Staking",
- "page-staking-considerations-dropdown-aria-label": "Danh sách dưới đây cho các yếu tố xem xét khi staking",
+ "page-staking-hierarchy-cex-p3": "Nếu bạn không cảm thấy thoải mái khi giữ khóa của mình thì cũng không sao. Bạn có những lựa chọn sau. Lúc này, cân nhắc kiểm tra trang ví, nơi bạn có thể bắt đầu học làm thế nào để nắm giữ quyền sở hữu hoàn toàn với tiền của mình. Khi bạn sẵn sàng, quay lại và ký gửi cao hơn bằng cách thử lại một trong những dịch vụ ký gửi theo nhóm bạn tự kiếm soát đã có.",
+ "page-staking-hierarchy-subtext": "Bạn có thể thấy rằng, có nhiều cách để ký gửi Ethereum. Những cách này hướng tới nhiều loại người dùng và mỗi cách lại khác biệt và có rủi ro, phần thưởng, mức độ tin cậy giả định khác nhau. Một số thì phi tập trung, thử nghiệm triệt để và mạo hiểm hơn cái khác. Chúng tôi cung cấp cho bạn một số thông tin về các dự án phổ biến trong bối cảnh này, nhưng hãy luôn tự nghiên cứu kỹ trước khi gửi ETH của bạn đi bất kỳ đâu.",
+ "page-staking-comparison-solo-saas": "Với nhà cung cấp SaaS, bạn vẫn cần phải gửi vào 32 ETH, nhưng không phải chạy phần cứng. Bạn thường vẫn có quyền truy cập khóa xác thực của bạn, nhưng cũng cần phải chia sẻ khóa chữ ký để những người vận hành có thể hành động thay cho nốt xác thực của bạn. Điều này đưa ra một lớp tin tưởng nhưng không hiển thị khi bạn chạy phần cứng riêng, cũng không giống như bạn ký gửi một mình, dịch vụ SaaS không giúp bạn nhiều về việc phân phối các nốt theo địa lý. Nếu bạn không thoải mái khi vận hành phần cứng nhưng vẫn muốn ký gửi 32 ETH, dịch vụ SaaS có thể là một sự lựa chọn tốt cho bạn.",
+ "page-staking-comparison-solo-pools": "Ký gửi một mình yêu cầu tham gia nhiều hơn đáng kể so với ký gửi bằng dịch vụ chung, nhưng cung cấp toàn quyền truy cập vào phần thưởng ETH cũng như toàn quyền kiểm soát việc thiết lập và bảo mật nốt xác thực của bạn. Ký gửi theo nhóm có rào cản gia nhập thấp hơn đáng kể. Người dùng có thể ký gửi một lượng nhỏ ETH, không bắt buộc phải tạo khóa xác thực và không có yêu cầu về phần cứng ngoài kết nối internet tiêu chuẩn. Mã thông báo thanh khoản cho phép khả năng thoát quy trình ký gửi trước khi tính năng này được bật ở cấp giao thức. Nếu bạn quan tâm đến các tính năng này, ký gửi theo nhóm có thể phù hợp.",
+ "page-staking-comparison-saas-solo": "Điểm giống nhau ở đây là bạn sở hữu khóa xác thực của mình mà không cần gộp tiền, nhưng với SaaS bạn cần phải tin tưởng một bên thứ ba có thể hành động ác ý hoặc trở thành đối tượng bị tấn công hoặc điều chỉnh. Nếu những giả thiết về sự tin tưởng hay rủi ro về sự tập trung khiến bạn băn khoăn, tiêu chuẩn vàng của ký gửi tự quản là tự ký gửi một mình.",
+ "page-staking-comparison-saas-pools": "Điểm giống nhau ở đây đó là bạn phải tin tưởng vào SaaS, nhưng ký gửi theo nhóm cho phép bạn gửi vào ít ETH hơn. Nếu bạn đang muốn ký gửi ít hơn 32 ETH, có thể xem kỹ thêm dưới đây.",
+ "page-staking-comparison-pools-solo": "Ký gửi theo quỹ đòi hỏi thấp hơn đáng kể so với tự ký gửi, nhưng đi kèm với rủi ro do ủy quyền toàn bộ hoạt động của nút xác thực cho bên thứ ba, và có phí đi kèm. Tự ký gửi mang lại toàn quyền tự chủ và kiểm soát đối với các lựa chọn trong việc thiết lập ký gửi. Người ký gửi không bao giờ phải trao chìa khóa của mình và họ nhận toàn bộ phần thưởng mà không có bất kỳ trung gian nào cắt xén.",
+ "page-staking-comparison-pools-saas": "Điểm giống nhau nữa là những người ký gửi không cần phải tự chạy phần mềm xác thực, nhưng không giống ký gửi theo nhóm, dịch vụ SaaS yêu cầu gửi vào đủ 32 ETH để kích hoạt nốt xác thực. Phần thưởng được trao cho người ký gửi, bao gồm cả phí hàng tháng hoặc tiền ký gửi khác để sử dụng dịch vụ. Nếu bạn muốn tự giữ khóa xác thực và muốn ký gửi ít hơn 32 ETH, sử dụng nhà cung cấp dịch vụ SaaS sẽ là lựa chọn tốt cho bạn.",
+ "page-staking-considerations-dropdown-text": "Cân nhắc ký gửi",
+ "page-staking-considerations-dropdown-aria-label": "Danh sách dưới đây cho các yếu tố xem xét khi ký gửi",
"page-staking-considerations-solo-1-title": "Mã nguồn mở",
"page-staking-considerations-solo-1-description": "Mã thiết yếu là nguồn mở 100% và sẵn sàng công khai để sử dụng và sao chép",
"page-staking-considerations-solo-1-warning": "Nguồn đóng",
@@ -142,17 +142,17 @@
"page-staking-considerations-pools-6-description": "Hệ thống cho phép bất kỳ ai cũng có thể tham gia vào vận hành nốt trong nhóm mà không cần xin phép",
"page-staking-considerations-pools-7-description": "Dịch vụ không nên chạy hơn 50% những người xác thực với ứng dụng vận hành chủ yếu",
"page-staking-considerations-pools-8-title": "Token thanh khoản",
- "page-staking-considerations-pools-8-description": "Token thanh khoản được cấp đại diện cho số ETH bạn góp sẽ nằm trong ví của bạn",
+ "page-staking-considerations-pools-8-description": "Token thanh khoản được cấp đại diện cho số ETH bạn ký gửi sẽ nằm trong ví của bạn",
"page-staking-considerations-pools-8-valid": "Các token thanh khoản",
"page-staking-considerations-pools-8-warning": "Token không có tính thanh khoản",
"page-staking-considerations-pools-9-description": "Dịch vụ không nên chạy hơn 50% những người xác thực với ứng dụng đồg thuận chủ yếu",
- "page-staking-how-solo-works-item-1": "Dùng một phần cứng: Bạn cần phải chạy nút để góp cổ phần",
+ "page-staking-how-solo-works-item-1": "Dùng một phần cứng: Bạn cần phải chạy nút để ký gửi",
"page-staking-how-solo-works-item-2": "Đồng bộ ứng dụng vận hành của khách hàng",
"page-staking-how-solo-works-item-3": "Đồng bộ mạng lưới khách hàng đồng thuận",
"page-staking-how-solo-works-item-4": "Tạo khóa của bạn và đưa chúng vào ứng dụng xác thực của bạn",
"page-staking-how-solo-works-item-5": "Quan sát và duy trì nốt của bạn",
"page-staking-launchpad-widget-mainnet-label": "Mainnet",
- "page-staking-launchpad-widget-start": "Bắt đầu staking trên {network}",
+ "page-staking-launchpad-widget-start": "Bắt đầu ký gửi trên {network}",
"page-staking-launchpad-widget-span": "Chọn mạng",
"page-staking-launchpad-widget-p1": "Người xác thực độc lập cần kiểm tra thiết lập và kỹ năng vận hành của mình trên mạng thử nghiệm {{network}} trước khi mạo hiểm tiền. Hãy nhớ rằng điều quan trọng là phải chọn một client thiểu số vì nó giúp cải thiện tính bảo mật của mạng và hạn chế rủi ro cho bạn.",
"page-staking-launchpad-widget-p2": "Nếu bạn cảm thấy thoải mái, bạn có thể cài đặt mọi thứ cần thiết từ đường dẫn yêu cầu bằng cách sử dụng Staking Launchpad.",
@@ -160,30 +160,30 @@
"page-staking-launchpad-widget-link": "Hướng dẫn và công cụ phần mềm",
"page-staking-products-get-started": "Bắt đầu",
"page-staking-products-follow": "Truy cập",
- "page-staking-dropdown-staking-options": "Tùy chọn góp cổ phần",
- "page-staking-dropdown-staking-options-alt": "Menu thả xuống tùy chọn đặt cược",
- "page-staking-stats-box-metric-1": "Tổng số ETH đã góp",
+ "page-staking-dropdown-staking-options": "Tùy chọn ký gửi",
+ "page-staking-dropdown-staking-options-alt": "Menu thả xuống tùy chọn ký gửi",
+ "page-staking-stats-box-metric-1": "Tổng số ETH đã ký gửi",
"page-staking-stats-box-metric-2": "Tổng số nốt xác thực",
"page-staking-stats-box-metric-3": "Lãi suất hiện tại",
- "page-staking-stats-box-metric-1-tooltip": "Tổng số ETH đủ điều kiện được stake trên Beacon Chain",
+ "page-staking-stats-box-metric-1-tooltip": "Tổng số ETH đủ điều kiện được ký gửi trên Beacon Chain",
"page-staking-stats-box-metric-2-tooltip": "Số lượng của tài khoản xác thực hiện tại được kích hoạt trên blockchain Beacon",
"page-staking-stats-box-metric-3-tooltip": "Lợi nhuận tài chính trung bình hàng năm trên mỗi người xác thực trong vòng hơn 24 giờ qua",
- "page-staking-section-comparison-subtitle": "Không có giải pháp nào giải quyết được tất cả vấn đề cho việc góp cổ phần, mỗi giải pháp đều khác nhau. Ở đây chúng ta sẽ so sánh các rủi ro, phần thưởng và các yêu cầu của các phương pháp mà bạn có thể đặt cọc.",
+ "page-staking-section-comparison-subtitle": "Không có giải pháp nào giải quyết được tất cả vấn đề cho việc ký gửi, mỗi giải pháp đều khác nhau. Ở đây chúng ta sẽ so sánh các rủi ro, phần thưởng và các yêu cầu của các phương pháp mà bạn có thể ký gửi.",
"page-staking-section-comparison-rewards-title": "Phần thưởng",
"page-staking-section-comparison-solo-rewards-li1": "Phần thưởng tối đa - nhận phần thưởng đầy đủ trực tiếp từ giao thức",
"page-staking-section-comparison-solo-rewards-li2": "Phần thưởng cho việc đề xuất khối, bao gồm phí giao dịch không bị đốt và việc chứng thực thường xuyên cho trạng thái của mạng lưới",
- "page-staking-section-comparison-solo-rewards-li3": "Lựa chọn đúc Token Staking thanh khoản dựa trên nút xác thực tại nhà của bạn sử dụng trong DeFi",
+ "page-staking-section-comparison-solo-rewards-li3": "Lựa chọn đúc Token ký gửi thanh khoản dựa trên nút xác thực tại nhà của bạn sử dụng trong DeFi",
"page-staking-section-comparison-saas-rewards-li1": "Thường bao gồm các phần thưởng giao thức đầy đủ trừ đi phí hàng tháng để vận hành nốt",
"page-staking-section-comparison-saas-rewards-li2": "Luôn sẵn sàng dễ dàng kiểm tra ứng dụng xác thực của bạn trên màn hình",
- "page-staking-section-comparison-pools-rewards-li1": "Phần thưởng góp cổ phần theo nhóm khác nhau, phụ thuộc vào phương pháp góp cổ phần theo nhóm bạn lựa chọn",
- "page-staking-section-comparison-pools-rewards-li2": "Nhiều dịch vụ đặt cọc theo nhóm đưa ra một hoặc nhiều token thanh khoản đại diện cho số ETH bạn đặt cọc và cổ phần của phần thưởng xác thực",
+ "page-staking-section-comparison-pools-rewards-li1": "Phần thưởng ký gửi theo nhóm khác nhau, phụ thuộc vào phương pháp ký gửi theo nhóm bạn lựa chọn",
+ "page-staking-section-comparison-pools-rewards-li2": "Nhiều dịch vụ ký gửi theo nhóm đưa ra một hoặc nhiều token thanh khoản đại diện cho số ETH bạn ký gửi và cổ phần của phần thưởng xác thực",
"page-staking-section-comparison-pools-rewards-li3": "Token thanh khoản được lưu trữ trong ví riêng của bạn, được sử dụng trong DeFi và bán đi nếu bạn quyết định rút ra",
"page-staking-section-comparison-risks-title": "Các rủi ro",
"page-staking-section-comparison-solo-risks-li1": "ETH nắm giữ",
"page-staking-section-comparison-solo-risks-li2": "Mạng ngắt kết nối sẽ bị phạt tiền bằng ETH",
"page-staking-section-comparison-solo-risks-li3": "Slashing (hình phạt nặng hơn và bị loại khỏi mạng lưới) đối với hành vi độc hại",
- "page-staking-section-comparison-solo-risks-li4": "Việc đúc token staking thanh khoản sẽ phát sinh rủi ro hợp đồng thông minh, nhưng điều này hoàn toàn là không bắt buộc",
- "page-staking-section-comparison-saas-risks-li1": "Rủi ro tương tự như tự đặt cọc kèm thêm rủi ro từ bên thứ ba là nhà cung cấp dịch vụ",
+ "page-staking-section-comparison-solo-risks-li4": "Việc đúc token ký gửi thanh khoản sẽ phát sinh rủi ro hợp đồng thông minh, nhưng điều này hoàn toàn là không bắt buộc",
+ "page-staking-section-comparison-saas-risks-li1": "Rủi ro tương tự như tự ký gửi kèm thêm rủi ro từ bên thứ ba là nhà cung cấp dịch vụ",
"page-staking-section-comparison-saas-risks-li2": "Người được bạn ủy thác mã khóa có thể hành động gian lận",
"page-staking-section-comparison-pools-risks-li1": "Tùy theo phương pháp được sử dụng mà có rủi ro khác nhau",
"page-staking-section-comparison-pools-risks-li2": "Nhìn chung, các rủi ro bao gồm rủi ro từ bên thứ ba, hợp đồng thông minh và rủi ro vận hành",
@@ -195,22 +195,22 @@
"page-staking-section-comparison-saas-requirements-li2": "Lưu khóa của bạn an toàn",
"page-staking-section-comparison-saas-requirements-li3": "Phần còn lại là quan sát, mặc dù các chi tiết dịch vụ sẽ khác nhau",
"page-staking-section-comparison-pools-requirements-li1": "Yêu cầu ETH ít nhất, một số dự án yêu cầu ít nhất 0.01 ETH",
- "page-staking-section-comparison-pools-requirements-li2": "Gửi tiền từ ví của bạn sang nền tảng đặt cọc chung khác hoặc giao dịch dễ dàng với token thanh khoản",
+ "page-staking-section-comparison-pools-requirements-li2": "Gửi tiền từ ví của bạn sang nền tảng ký gửi chung khác hoặc giao dịch dễ dàng với token thanh khoản",
"page-staking-faq-1-question": "Người xác thực là gì?",
"page-staking-faq-1-answer": "Nốt xác thực là một thực thể ảo tồn tại trên Ethereum và tham gia vào quá trình đồng thuận của giao thức Ethereum. Nốt xác thực được thể hiện bằng số dư, khóa công khai và các hình thức khác. Một máy khách xác thực là một phần mềm hành động thay mặt cho nốt xác thực bằng cách giữ và sử dụng khóa riêng tư. Một máy khách xác thực đơn lẻ có thể giữ nhiều cặp khóa, kiểm soát nhiều nốt xác thực.",
- "page-staking-faq-2-question": "Tại sao tôi cần đặt cọc tiền?",
- "page-staking-faq-2-answer": "Nốt xác thực có khả năng tạo ra và chứng thực các khối cho mạng lưới. Để ngăn chặn hành vi thiếu trung thực, người dùng phải góp tiền của mình. Điều này cho phép giao thức phạt những hành vi ác ý. Góp cổ phần để giúp bạn trung thực, bởi vì hành vi của bạn sẽ có hậu quả về mặt tài chính.",
+ "page-staking-faq-2-question": "Tại sao tôi cần ký gửi tiền?",
+ "page-staking-faq-2-answer": "Nốt xác thực có khả năng tạo ra và chứng thực các khối cho mạng lưới. Để ngăn chặn hành vi thiếu trung thực, người dùng phải góp tiền của mình. Điều này cho phép giao thức phạt những hành vi ác ý. Ký gửi để giúp bạn trung thực, bởi vì hành vi của bạn sẽ có hậu quả về mặt tài chính.",
"page-staking-faq-3-question": "Tôi có thể mua 'Eth2' không?",
"page-staking-faq-3-answer-p1": "Không có token 'Eth2' nào trên giao thức bởi token ether (ETH) không thay đổi khi Ethereum chuyển sang proof-of-stake (bằng chứng đặt cọc).",
- "page-staking-faq-3-answer-p2": "Có các token/ticker phái sinh có thể đại diện cho ETH đã stake (tức là rETH từ Rocket Pool, stETH từ Lido, ETH2 từ Coinbase). Tìm hiểu thêm về các bể staking.",
- "page-staking-faq-4-question": "Góp cổ phần đã đi vào hoạt động chưa?",
- "page-staking-faq-4-answer-p1": "Rồi. Tính năng góp cổ phần chính thức hoạt động từ ngày 01 tháng 12 năm 2020",
- "page-staking-faq-4-answer-p2": "Điều này có nghĩa là góp cổ phần đi vào hoạt động để người dùng đặt cọc ETH của họ, chạy máy khách xác thực và bắt đầu săn phần thưởng.",
- "page-staking-faq-4-answer-p3": "Việc nâng cấp Capella/Shanghai được hoàn thành vào ngày 12 tháng 4 năm 2023, kích hoạt rút tiền đã góp, khép lại vấn đề thanh khoản cổ phẩn.",
- "page-staking-faq-5-question": "Khi nào tôi có thể rút số Eth đã góp?",
- "page-staking-faq-5-answer-p1": "Ngay bây giờ! Người góp cổ phần có thể rút phần thưởng và/hoặc số tiền đặt cọc từ số dư của nút xác thực nếu họ lựa chọn.",
- "page-staking-faq-5-answer-p2": "Người góp cổ phần sẽ nhận được phần thưởng dưới dạng phí và MEV khi đề xuất các khối, được cung cấp ngay lập tức theo địa chỉ nhận phí mà họ đã thiết lập.",
- "page-staking-faq-5-answer-link": "Thông tin thêm về rút tiền đặt cọc",
+ "page-staking-faq-3-answer-p2": "Có các token/ticker phái sinh có thể đại diện cho ETH đã ký gửi (tức là rETH từ Rocket Pool, stETH từ Lido, ETH2 từ Coinbase). Tìm hiểu thêm về các bể ký gửi.",
+ "page-staking-faq-4-question": "Ký gửi đã đi vào hoạt động chưa?",
+ "page-staking-faq-4-answer-p1": "Rồi. Tính năng ký gửi chính thức hoạt động từ ngày 01 tháng 12 năm 2020",
+ "page-staking-faq-4-answer-p2": "Điều này có nghĩa là ký gửi đi vào hoạt động để người dùng ký gửi ETH của họ, chạy máy khách xác thực và bắt đầu săn phần thưởng.",
+ "page-staking-faq-4-answer-p3": "Việc nâng cấp Capella/Shanghai được hoàn thành vào ngày 12 tháng 4 năm 2023, kích hoạt rút tiền đã ký gửi, khép lại vấn đề thanh khoản ký gửi.",
+ "page-staking-faq-5-question": "Khi nào tôi có thể rút số Eth đã ký gửi?",
+ "page-staking-faq-5-answer-p1": "Ngay bây giờ! Người ký gửi có thể rút phần thưởng và/hoặc số tiền ký gửi từ số dư của nút xác thực nếu họ lựa chọn.",
+ "page-staking-faq-5-answer-p2": "Người ký gửi sẽ nhận được phần thưởng dưới dạng phí và MEV khi đề xuất các khối, được cung cấp ngay lập tức theo địa chỉ nhận phí mà họ đã thiết lập.",
+ "page-staking-faq-5-answer-link": "Thông tin thêm về rút tiền ký gửi",
"page-staking-further-reading-author-vitalik-buterin": "Vitalik Buterin",
"page-staking-further-reading-2-link": "Cơ sở lý luận thiết kế trôi chảy",
"page-staking-further-reading-4-link": "Tin tức Eth2",
@@ -220,20 +220,20 @@
"page-staking-further-reading-6-link": "Các trạm chứng thực",
"page-staking-further-reading-8-link": "Tài liệu Giáo dục do Cộng đồng đóng góp về Beaconcha.in",
"page-staking-further-reading-9-link": "Câu hỏi thường gặp về Staking Launchpad Ethereum",
- "page-staking-further-reading-10-link": "Kiến thức nền tảng về Người đặt cọc Eth",
- "page-staking-toc-how-to-stake-your-eth": "Đặt cọc ETH như thế nào",
- "page-staking-toc-comparison-of-options": "So sánh các sự lựa chọn góp cổ phần",
+ "page-staking-further-reading-10-link": "Kiến thức nền tảng về Người ký gửi Eth",
+ "page-staking-toc-how-to-stake-your-eth": "Ký gửi ETH như thế nào",
+ "page-staking-toc-comparison-of-options": "So sánh các sự lựa chọn ký gửi",
"page-staking-toc-faq": "Câu hỏi thường gặp",
"page-staking-toc-further": "Đọc thêm",
- "page-staking-dom-info-title": "Góp cổ phần cho Ethereum",
- "page-staking-join-community": "Tham gia cộng đồng những người góp cổ phần",
- "page-staking-join-community-desc": "EthStaker là một cộng đồng để mọi người thảo luận và tìm hiểu về việc góp cổ phần trên Ethereum. Tham gia cùng hàng chục nghìn thành viên từ khắp nơi trên thế giới để được tư vấn, hỗ trợ và trò chuyện về mọi vấn đề liên quan đến góp cổ phần.",
- "page-staking-meta-description": "Tổng quan về việc góp cổ phần cho Ethereum: rủi ro, phần thưởng, yêu cầu và nơi thực hiện.",
- "page-staking-meta-title": "Staking Ethereum: Cách hoạt động như thế nào?",
+ "page-staking-dom-info-title": "Ký gửi cho Ethereum",
+ "page-staking-join-community": "Tham gia cộng đồng những người ký gửi",
+ "page-staking-join-community-desc": "EthStaker là một cộng đồng để mọi người thảo luận và tìm hiểu về việc ký gửi trên Ethereum. Tham gia cùng hàng chục nghìn thành viên từ khắp nơi trên thế giới để được tư vấn, hỗ trợ và trò chuyện về mọi vấn đề liên quan đến ký gửi.",
+ "page-staking-meta-description": "Tổng quan về việc ký gửi cho Ethereum: rủi ro, phần thưởng, yêu cầu và nơi thực hiện.",
+ "page-staking-meta-title": "Ký gửi Ethereum: Cách hoạt động như thế nào?",
"page-staking-withdrawals-important-notices": "Các lưu ý quan trọng",
- "page-staking-withdrawals-important-notices-desc": "Chức năng rút chưa sẵn sàng. Xin hãy đọc câu hỏi thường gặp về Gộp Ethh2 và sau khi gộp để biết thêm thông tin.",
+ "page-staking-withdrawals-important-notices-desc": "Chức năng rút chưa sẵn sàng. Xin hãy đọc câu hỏi thường gặp về Gộp Eth2 và sau khi gộp để biết thêm thông tin.",
"page-upgrades-merge-btn": "Đọc thêm về sự kiện The Merge",
- "subscribe-to-ef-blog": "Đăng ký Blog EF để nhận email thông báo mới nhất về các giao thức .",
+ "subscribe-to-ef-blog": "Đăng ký Blog EF để nhận email thông báo mới nhất về các giao thức .",
"page-staking-comparison-with-other-options": "So sánh với các lựa chọn khác",
"page-staking-any-amount": "Bất kể số lượng tiền là bao nhiêu",
"page-staking-network-testnet": "Mạng thử nghiệm {network}"
diff --git a/src/intl/vi/page-upgrades-index.json b/src/intl/vi/page-upgrades-index.json
index 7bc637b4863..b7fc5f3bdba 100644
--- a/src/intl/vi/page-upgrades-index.json
+++ b/src/intl/vi/page-upgrades-index.json
@@ -17,7 +17,7 @@
"page-upgrade-article-author-consensys": "Consensys",
"page-upgrade-article-author-delphi-digital": "Delphi Digital",
"page-upgrade-article-author-eip-4844": "Vitalik Buterin, Dankrad Feist, Diederik Loerakker, George Kadianakis, Matt Garnett, Mofi Taiwo",
- "page-upgrade-article-author-ethereum-foundation": "Nền tảng Ethereum",
+ "page-upgrade-article-author-ethereum-foundation": "Ethereum Foundation",
"page-upgrade-article-author-vitalik-buterin": "Vitalik Buterin",
"page-upgrade-article-author-ethos-dev": "Ethos.dev",
"page-upgrade-article-title-two-point-oh": "Two Point Oh: Chuỗi Hải Đăng",
diff --git a/src/intl/vi/template-usecase.json b/src/intl/vi/template-usecase.json
index a9c2029b3de..e439d914e79 100644
--- a/src/intl/vi/template-usecase.json
+++ b/src/intl/vi/template-usecase.json
@@ -13,7 +13,7 @@
"template-usecase-dropdown-refi": "Tài chính tái tạo (ReFi)",
"template-usecase-dropdown": "Trường hợp áp dụng Ethereum",
"template-usecase-banner": "Trường hợp áp dụng Ethereum luôn biến đổi và phát triển. Hãy thêm bất kỳ thông tin nào mà bạn nghĩ sẽ giúp cho mọi thứ trở nên rõ ràng hơn hoặc cập nhật hơn.",
- "template-usecase-edit-link": "Trang chỉnh sữa",
+ "template-usecase-edit-link": "Chỉnh sửa trang",
"template-usecase-dropdown-aria": "Menu thả xuống trường hợp áp dụng",
"template-usecase-dropdown-onchain-gaming": "Chơi game trên chuỗi",
"template-usecase-dropdown-rwa": "Tài sản thực (RWAs)"
From 72f9fd656aaea841a644832e3609a0c9c6918195 Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Thu, 19 Feb 2026 21:17:47 -0700
Subject: [PATCH 12/31] fix(i18n): fix Gemini's mistakes
Co-Authored-By: Claude Opus 4.6
---
.../vi/developers/docs/intro-to-ethereum/index.md | 7 +++----
public/content/translations/vi/web3/index.md | 2 +-
src/intl/vi/page-apps.json | 8 ++++----
src/intl/vi/page-bug-bounty.json | 2 +-
src/intl/vi/page-developers-docs.json | 2 +-
src/intl/vi/page-roadmap-vision.json | 2 +-
src/intl/vi/page-staking.json | 2 +-
src/intl/vi/page-start.json | 2 +-
8 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
index 258ba3cefae..07080317fb1 100644
--- a/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
+++ b/public/content/translations/vi/developers/docs/intro-to-ethereum/index.md
@@ -66,7 +66,7 @@ Thứ tự của những khối được ghi vĩnh viễn lên mạng lưới Et
### Máy ảo Ethereum {#evm}
-Máy ảo Ethereum là một máy ảo toàn cầu mà trạng thái của mỗi người tham gia mạng lưới của Ethereum được lưu trữ và đồng thuận. Bất kì người tham gia có thể yêu câu một thực thi mã nguồn tùy thích trên EVM; mã nguồn được thực thi sẽ thay đổi trạng thái của EVM.
+Máy ảo Ethereum là một máy ảo toàn cầu mà trạng thái của mỗi người tham gia mạng lưới của Ethereum được lưu trữ và đồng thuận. Bất kì người tham gia có thể yêu cầu một thực thi mã nguồn tùy thích trên EVM; mã nguồn được thực thi sẽ thay đổi trạng thái của EVM.
[Tìm hiểu thêm về EVM](/developers/docs/evm/)
@@ -94,7 +94,7 @@ Một "yêu cầu giao dịch" là thuật ngữ chính thức cho một yêu c
### Các khối {#blocks}
-Khối lượng giao dịch rất cao, nên các giao dịch được "cam kết" theo lô, hay các khối. Khối nói chúng chứa hàng chục đến hàng trăm giao dịch.
+Khối lượng giao dịch rất cao, nên các giao dịch được "cam kết" theo lô, hay các khối. Khối nói chung chứa hàng chục đến hàng trăm giao dịch.
[Tìm hiểu thêm về các khối](/developers/docs/blocks/)
@@ -109,8 +109,7 @@ Một mẫu mã nguồn tái sử dụng (một chương trình) mà lập trìn
- [Sách trắng Ethereum](/whitepaper/)
- [Rốt cuộc thì Ethereum hoạt động như thế nào?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) - _Preethi Kasireddy_ (**Lưu ý:** tài liệu này vẫn có giá trị nhưng xin lưu ý rằng nó được viết trước [The Merge](/roadmap/merge) và do đó vẫn đề cập đến cơ chế bằng chứng công việc của Ethereum - Ethereum hiện được bảo mật bằng [bằng chứng cổ phần](/developers/docs/consensus-mechanisms/pos))
-### Tìm hiểu thêm từ video trực quan?
-### Người học qua hình ảnh {#visual-learner}
+### Bạn là người học qua hình ảnh? {#visual-learner}
Chuỗi video này cho phép khám phá các chủ đề nền tảng:
diff --git a/public/content/translations/vi/web3/index.md b/public/content/translations/vi/web3/index.md
index 81f162c7bf5..553fbd2c626 100644
--- a/public/content/translations/vi/web3/index.md
+++ b/public/content/translations/vi/web3/index.md
@@ -10,7 +10,7 @@ lang: vi
-Tập trung đã giúp hàng tỷ người tiếp cận với Www ( World Wide Web) và tạo ra cơ sở hạ tầng ổn đinh, mạnh mẽ. Đồng thời, một số ít có tầm ảnh hưởng lớn trên không gian của World Wide Web đơn phương quyết định điều gì nên và không nên.
+Tập trung đã giúp hàng tỷ người tiếp cận với Www ( World Wide Web) và tạo ra cơ sở hạ tầng ổn định, mạnh mẽ. Đồng thời, một số ít có tầm ảnh hưởng lớn trên không gian của World Wide Web đơn phương quyết định điều gì nên và không nên.
Web3 là câu trả lời cho tình huống khó xử này. Thay vì một trang web được quản lí độc quyền bởi các công ty công nghệ lớn thì Web3 bao gồm sự phân quyền và được người dùng xây dựng, vận hành cũng như sở hữu. Web3 đặt quyền hạn vào tay các cá nhân hơn là các tập đoàn.
Trước khi bàn luận về Web3, hãy cùng nhau phân tích xem chúng có mặt ở đây như thế nào.
diff --git a/src/intl/vi/page-apps.json b/src/intl/vi/page-apps.json
index f83ed157c01..abc292144b6 100644
--- a/src/intl/vi/page-apps.json
+++ b/src/intl/vi/page-apps.json
@@ -26,17 +26,17 @@
"page-apps-category-collectibles-name": "Các món đồ sưu tập kĩ thuật số",
"page-apps-category-collectibles-description": "Đồ Sưu Tập là những vật phẩm kỹ thuật số độc nhất và không thể nhân bản.",
"page-apps-category-collectibles-meta-title": "Danh sách những ứng dụng NFT tốt nhất trên Ethereum",
- "page-apps-category-collectibles-meta-description": "Khám phá các ứng dụng sưu tập được xây dựng trên Ethereum. Tìm các ứng dụng phổ biến nhất để mua, bán và giao dịch các bộ sưu tập kỹ thuật số độc đáo và những vật phẩm quý hiếm.",,
+ "page-apps-category-collectibles-meta-description": "Khám phá các ứng dụng sưu tập được xây dựng trên Ethereum. Tìm các ứng dụng phổ biến nhất để mua, bán và giao dịch các bộ sưu tập kỹ thuật số độc đáo và những vật phẩm quý hiếm.",
"page-apps-category-social-name": "Xã hội",
"page-apps-category-social-description": "Xã Hội là một danh mục các ứng dụng phi tập trung cho phép người dùng kết nối với những người khác và chia sẻ nội dung.",
"page-apps-category-social-meta-title": "Các ứng dụng xã hội trên Ethereum: Farcaster, Zora và hơn thế nữa",
"page-apps-category-social-meta-description": "Khám phá các ứng dụng nhắn tin và mạng xã hội tốt nhất trên nền tảng Ethereum.",
"page-apps-category-gaming-name": "Trò chơi",
- "page-apps-category-gaming-description": "Trò chơi mà bạn sở hữu tài sản trong trò chơi và có thể kiếm tiền khi chơi. Người chơi có thể giao dịch tài sản của họ bên ngoài trò chơi.",,
+ "page-apps-category-gaming-description": "Trò chơi mà bạn sở hữu tài sản trong trò chơi và có thể kiếm tiền khi chơi. Người chơi có thể giao dịch tài sản của họ bên ngoài trò chơi.",
"page-apps-category-gaming-meta-title": "Danh sách các trò chơi crypto và NFT trên Ethereum",
"page-apps-category-gaming-meta-description": "Khám phá những game blockchain chơi vui nhất. MMORPG, game thẻ bài, game AI, RPG, game phổ thông",
"page-apps-category-bridge-name": "Cầu nối",
- "page-apps-category-bridge-description": "Cầu là một danh mục các dứng dụng phi tập trung cho phép người chơi di chuyển tài sản của họ giữa các chain khác nhau.",
+ "page-apps-category-bridge-description": "Cầu là một danh mục các ứng dụng phi tập trung cho phép người chơi di chuyển tài sản của họ giữa các chain khác nhau.",
"page-apps-category-bridge-meta-title": "Danh sách các cầu nối Ethereum đến các mạng lưới khác",
"page-apps-category-bridge-meta-description": "Khám phá những ứng dụng cầu crypto tốt nhất để dịch chuyển tài sản của bạn giữa các mạng lưới và các lớp 2.",
"page-apps-category-productivity-name": "Năng Suất",
@@ -46,7 +46,7 @@
"page-apps-category-privacy-name": "Bảo mật",
"page-apps-category-privacy-description": "Riêng Tư là một danh mục các ứng dụng phi tập trung cho phép người dùng giao dịch ẩn danh.",
"page-apps-category-privacy-meta-title": "Các ứng dụng riêng tư trên Ethereum; tornado cash và các ứng dụng khác",
- "page-apps-category-privacy-meta-description": "Khám phá các ứng dụng riêng tư trên Ethereum như Tornado Cash và những ứng dụng khác giúp bảo vệ tính ẩn anh, cho phép giao dịch riêng tư, và tăng cường tính bảo mật on-chain.",
+ "page-apps-category-privacy-meta-description": "Khám phá các ứng dụng riêng tư trên Ethereum như Tornado Cash và những ứng dụng khác giúp bảo vệ tính ẩn danh, cho phép giao dịch riêng tư, và tăng cường tính bảo mật on-chain.",
"page-apps-category-dao-name": "Tổ chức tự trị phi tập trung (DAO)",
"page-apps-category-dao-description": "DAO là một danh mục các ứng dụng phi tập trung cho phép người dùng quản trị và khởi tạo các tổ chức tự chủ phi tập trung.",
"page-apps-category-dao-meta-title": "Danh sách các công cụ DAO trên Ethereum",
diff --git a/src/intl/vi/page-bug-bounty.json b/src/intl/vi/page-bug-bounty.json
index f3184906a5a..20b40581a6c 100644
--- a/src/intl/vi/page-bug-bounty.json
+++ b/src/intl/vi/page-bug-bounty.json
@@ -49,7 +49,7 @@
"page-upgrades-bug-bounty-points-rights-desc": "Tổ chức Ethereum Foundation có quyền cứng đáng để thay đổi điều này không cần thông báo trước.",
"page-upgrades-bug-bounty-points-usd": "2 Đô la Mỹ",
"page-upgrades-bug-bounty-quality": "Chất lượng mô tả",
- "page-upgrades-bug-bounty-quality-desc": ": Trả phần thương cao hơn cho các bài nộp rõ ràng, viết tốt.",
+ "page-upgrades-bug-bounty-quality-desc": ": Trả phần thưởng cao hơn cho các bài nộp rõ ràng, viết tốt.",
"page-upgrades-bug-bounty-quality-fix": "Chất lượng sửa chữa, nếu có: Phần thưởng cao hơn được trả cho những bài nộp có mô tả rõ ràng về cách khắc phục vấn đề.",
"page-upgrades-bug-bounty-quality-repro": "Khả năng tái tạo chất lượng",
"page-upgrades-bug-bounty-quality-repro-desc": ": Phải bao gồm Bằng chứng về khái niệm (POC) để đủ điều kiện nhận phần thưởng. Vui lòng bao gồm mã kiểm tra, tập lệnh và hướng dẫn chi tiết. Việc chúng tôi tái tạo và xác minh lỗ hổng càng dễ dàng thì phần thưởng càng cao.",
diff --git a/src/intl/vi/page-developers-docs.json b/src/intl/vi/page-developers-docs.json
index 9ea85b53b5f..3eab0703105 100644
--- a/src/intl/vi/page-developers-docs.json
+++ b/src/intl/vi/page-developers-docs.json
@@ -143,7 +143,7 @@
"page-calltocontribute-desc-4": "Có câu hỏi? Hãy hỏi chúng tôi trong kênh #content trên của chúng tôi",
"page-calltocontribute-link": "mẫu văn bản",
"page-calltocontribute-link-2": "Discord server",
- "page-calltocontribute-span": "Chỉnh sửa trang này",,
+ "page-calltocontribute-span": "Chỉnh sửa trang này",
"page-calltocontribute-title": "Giúp đỡ chúng tôi tại trang này",
"layer-2-arbitrum-note": "Bằng chứng gian lận chỉ dành cho những người dùng trong danh sách trắng, hiện danh sách trắng vẫn chưa mở",
"layer-2-boba-note": "Kiểm duyệt trạng thái trong quá trình phát triển",
diff --git a/src/intl/vi/page-roadmap-vision.json b/src/intl/vi/page-roadmap-vision.json
index e46b458c33e..34e5f7985c5 100644
--- a/src/intl/vi/page-roadmap-vision.json
+++ b/src/intl/vi/page-roadmap-vision.json
@@ -6,7 +6,7 @@
"page-roadmap-vision-desc-1": "Ethereum cần giảm thiểu vấn đề nghẽn mạng và cải thiện tốc độ thực hiện giao dịch để phục vụ tốt hơn một cộng đồng người dùng toàn cầu.",
"page-roadmap-vision-desc-2": "Việc vận hành một nút đang ngày càng trở nên khó khăn hơn khi mạng lưới Ethereum phát triển. Điều này sẽ còn khó khăn hơn nữa với những nỗ lực để mở rộng quy mô của mạng lưới.",
"page-roadmap-vision-desc-3": "Ethereum đang sử dụng quá nhiều điện. Công nghệ để bảo đảm an toàn cho mạng lưới cần phải có tính bền vững hơn.",
- "page-roadmap-vision-ethereum-node": "Hiểm thêm về nút",
+ "page-roadmap-vision-ethereum-node": "Tìm hiểu thêm về nút",
"page-roadmap-vision-future": "Một tương lai số với quy mô toàn cầu",
"page-roadmap-vision-meta-desc": "Tổng quan về tác động của những nâng cấp đối với Ethereum và những thách thức mà chúng phải vượt qua.",
"page-roadmap-vision-meta-title": "Tầm nhìn của Ethereum",
diff --git a/src/intl/vi/page-staking.json b/src/intl/vi/page-staking.json
index 49f6e609e68..6ad872199fb 100644
--- a/src/intl/vi/page-staking.json
+++ b/src/intl/vi/page-staking.json
@@ -233,7 +233,7 @@
"page-staking-withdrawals-important-notices": "Các lưu ý quan trọng",
"page-staking-withdrawals-important-notices-desc": "Chức năng rút chưa sẵn sàng. Xin hãy đọc câu hỏi thường gặp về Gộp Eth2 và sau khi gộp để biết thêm thông tin.",
"page-upgrades-merge-btn": "Đọc thêm về sự kiện The Merge",
- "subscribe-to-ef-blog": "Đăng ký Blog EF để nhận email thông báo mới nhất về các giao thức .",
+ "subscribe-to-ef-blog": "Đăng ký Blog EF để nhận email thông báo mới nhất về các giao thức.",
"page-staking-comparison-with-other-options": "So sánh với các lựa chọn khác",
"page-staking-any-amount": "Bất kể số lượng tiền là bao nhiêu",
"page-staking-network-testnet": "Mạng thử nghiệm {network}"
diff --git a/src/intl/vi/page-start.json b/src/intl/vi/page-start.json
index 3bd55d856ac..568884f95d9 100644
--- a/src/intl/vi/page-start.json
+++ b/src/intl/vi/page-start.json
@@ -20,7 +20,7 @@
"page-start-download-wallet-continue": "Tiếp tục",
"page-start-download-wallet-get-wallet": "Tạo ví",
"page-start-connect-wallet-title": "Kết nối ví của bạn",
- "page-start-connect-wallet-description": "Bạn có thể sử dụng ví mới như một tài khoảng độc lập trên mọi ứng dụng và dự án Ethereum. Không cần tài khoản riêng.",
+ "page-start-connect-wallet-description": "Bạn có thể sử dụng ví mới như một tài khoản độc lập trên mọi ứng dụng và dự án Ethereum. Không cần tài khoản riêng.",
"page-start-connect-wallet-account-message": "Đây là tài khoản của bạn",
"page-start-connect-wallet-continue": "Cùng tiếp tục thôi",
"page-start-connect-wallet-finance-alt": "Tài chính",
From a55cd8493118ce9abd8c4bcd03d4bb0824a10492 Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Thu, 19 Feb 2026 23:49:43 -0700
Subject: [PATCH 13/31] fix(i18n): correct remaining vi diacritical and
terminology errors
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Fix diacritical typos
- Standardize "mã thông báo" → "token" across web3, defi, security
- Fix giấy trắng → sách trắng (whitepaper self-reference)
- Fix broken HTML: missing , missing spaces before /
- Reorder defi sections to match English source structure
- Normalize markdown table column widths in defi comparison table
Co-Authored-By: Claude Opus 4.6
---
public/content/translations/vi/defi/index.md | 36 +++++++++----------
.../content/translations/vi/security/index.md | 6 ++--
public/content/translations/vi/web3/index.md | 2 +-
.../translations/vi/whitepaper/index.md | 2 +-
src/intl/vi/common.json | 2 +-
src/intl/vi/page-apps.json | 2 +-
src/intl/vi/page-collectibles.json | 6 ++--
src/intl/vi/page-learn.json | 2 +-
src/intl/vi/page-staking.json | 10 +++---
src/intl/vi/page-upgrades-index.json | 4 +--
10 files changed, 36 insertions(+), 36 deletions(-)
diff --git a/public/content/translations/vi/defi/index.md b/public/content/translations/vi/defi/index.md
index a92dad5dd97..453fc2310dc 100644
--- a/public/content/translations/vi/defi/index.md
+++ b/public/content/translations/vi/defi/index.md
@@ -38,14 +38,14 @@ Một trong những cách hay nhất để nhìn nhận tiềm năng của tài
### So sánh {#defi-comparison}
-| Tài chính phi tập trung | Tài chính truyền thống |
-| --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Bạn giữ tiền của mình. | Tiền của bạn được giữ tại các tổ chức khác. |
-| Bạn kiểm soát việc tiền của bạn đi đâu và chúng được dùng như thế nào. | Bạn phải tin tưởng rằng các tổ chức kia sẽ không quản lý tiền của bạn một cách yếu kém, ví dụ như cho những người vay đầy rủi ro vay tiền. |
-| Các giao dịch chuyển khoản diễn ra trong thời gian tính bằng phút. | Giao dịch có thể mất vài ngày do các quy trình thủ công. |
-| Hoạt động giao dịch được mã hóa. | Hoạt động giao dịch gắn liền với danh tính của bạn. |
-| Tài chính phi tập trung được mở ra cho bất cứ ai. | Bạn phải nộp đơn đăng kí để được sử dụng các dịch vụ tài chính. |
-| Các thị trường luôn luôn mở cửa. | Các thị trường có thể đóng cửa vì nhân viên cần thời gian nghỉ ngơi. |
+| Tài chính phi tập trung | Tài chính truyền thống |
+| ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Bạn giữ tiền của mình. | Tiền của bạn được giữ tại các tổ chức khác. |
+| Bạn kiểm soát việc tiền của bạn đi đâu và chúng được dùng như thế nào. | Bạn phải tin tưởng rằng các tổ chức kia sẽ không quản lý tiền của bạn một cách yếu kém, ví dụ như cho những người vay đầy rủi ro vay tiền. |
+| Các giao dịch chuyển khoản diễn ra trong thời gian tính bằng phút. | Giao dịch có thể mất vài ngày do các quy trình thủ công. |
+| Hoạt động giao dịch được mã hóa. | Hoạt động giao dịch gắn liền với danh tính của bạn. |
+| Tài chính phi tập trung được mở ra cho bất cứ ai. | Bạn phải nộp đơn đăng kí để được sử dụng các dịch vụ tài chính. |
+| Các thị trường luôn luôn mở cửa. | Các thị trường có thể đóng cửa vì nhân viên cần thời gian nghỉ ngơi. |
| Được xây dựng trên sự minh bạch – bất kì ai cũng có thể nhìn vào dữ liệu sản phẩm và tìm hiểu xem hệ thống hoạt động thế nào. | Các định chế tài chính là những cuốn sách đóng kín: bạn không thể yêu cầu xem lịch sử cho vay của họ hay sổ sách liệt kê những tài sản họ quản lý v.v. và v.v. |
@@ -215,7 +215,7 @@ Bể tiền thưởng được tạo ra từ tất cả lãi suất được s
Có hàng ngàn loại tokens trên Ethereum. Các sàn giao dịch phi tập trung (DEXs) cho phép bạn mua bán những loại tokens khác nhau bất cứ khi nào bạn muốn. Bạn không bao giờ phải từ bỏ quyền kiểm soát tài sản của mình. Nó giống như việc sử dụng một điểm thu đổi ngoại tệ khi bạn đang thăm một quốc gia khác. Nhưng phiên bản tài chính phi tập trung thì không bao giờ đóng cửa. Các thị trường này mở 24/7, 365 ngày một năm và công nghệ của chúng bảo đảm rằng sẽ luôn luôn có một ai đó để chấp nhận một giao dịch.
-Ví dụ, nếu bạn muốn tham gia vào xổ số không mất PoolTogether (đề cập ở trên), bạn sẽ cần một loại token như Dai hay USDC. Các DEX này cho phép bạn hoán đổi ETH của mình cho các mã thông báo đó và ngược lại khi bạn hoàn tất.
+Ví dụ, nếu bạn muốn tham gia vào xổ số không mất PoolTogether (đề cập ở trên), bạn sẽ cần một loại token như Dai hay USDC. Các DEX này cho phép bạn hoán đổi ETH của mình cho các token đó và ngược lại khi bạn hoàn tất.
Xem các sàn giao dịch token
@@ -338,6 +338,15 @@ Tài chính phi tập trung là một phong trào nguồn mở. Các giao thức
Tìm hiểu thêm về việc xây dựng các ứng dụng phi tập trung
+## Ngoài DeFi truyền thống {#beyond-traditional-defi}
+
+Hệ sinh thái DeFi tiếp tục mở rộng sang các lĩnh vực mới:
+
+- **[Thị trường dự đoán](/prediction-markets/)** – Các nền tảng phi tập trung nơi bạn có thể đặt cược vào kết quả của các sự kiện trong tương lai, từ bầu cử đến các sự kiện thể thao, mà không cần trung gian.
+- **[Tài sản trong thế giới thực (RWA)](/real-world-assets/)** – Token hóa các tài sản vật chất như bất động sản, hàng hóa và trái phiếu trên Ethereum, mang lại hàng nghìn tỷ đô la giá trị trên chuỗi.
+- **[Thanh toán](/payments/)** – Sử dụng Ethereum và stablecoin để thanh toán toàn cầu nhanh chóng, chi phí thấp mà không cần cơ sở hạ tầng ngân hàng truyền thống.
+- **[Tác nhân AI](/ai-agents/)** – Các tác nhân phần mềm tự trị có thể giao dịch trên Ethereum, cho phép các hình thức giao dịch tự động, quản lý danh mục đầu tư và tương tác trên chuỗi mới.
+
## Đọc thêm {#further-reading}
### Dữ liệu DeFi {#defi-data}
@@ -363,12 +372,3 @@ Tài chính phi tập trung là một phong trào nguồn mở. Các giao thức
-
-## Ngoài DeFi truyền thống {#beyond-traditional-defi}
-
-Hệ sinh thái DeFi tiếp tục mở rộng sang các lĩnh vực mới:
-
-- **[Thị trường dự đoán](/prediction-markets/)** – Các nền tảng phi tập trung nơi bạn có thể đặt cược vào kết quả của các sự kiện trong tương lai, từ bầu cử đến các sự kiện thể thao, mà không cần trung gian.
-- **[Tài sản trong thế giới thực (RWA)](/real-world-assets/)** – Token hóa các tài sản vật chất như bất động sản, hàng hóa và trái phiếu trên Ethereum, mang lại hàng nghìn tỷ đô la giá trị trên chuỗi.
-- **[Thanh toán](/payments/)** – Sử dụng Ethereum và stablecoin để thanh toán toàn cầu nhanh chóng, chi phí thấp mà không cần cơ sở hạ tầng ngân hàng truyền thống.
-- **[Tác nhân AI](/ai-agents/)** – Các tác nhân phần mềm tự trị có thể giao dịch trên Ethereum, cho phép các hình thức giao dịch tự động, quản lý danh mục đầu tư và tương tác trên chuỗi mới.
diff --git a/public/content/translations/vi/security/index.md b/public/content/translations/vi/security/index.md
index 16b3bec9495..53bef04aef3 100644
--- a/public/content/translations/vi/security/index.md
+++ b/public/content/translations/vi/security/index.md
@@ -136,7 +136,7 @@ Về nguyên tắc chung, nhân viên sẽ không bao giờ liên lạc với b
### Lừa đảo token 'Eth2' {#eth2-token-scam}
-Trong giai đoạn chuẩn bị cho [Hợp nhất](/roadmap/merge/), những kẻ lừa đảo đã lợi dụng sự nhầm lẫn xung quanh thuật ngữ 'Eth2' để cố gắng lừa người dùng đổi ETH của họ lấy một token 'ETH2'. Không có 'ETH2' nào tồn tại, không có mã thông cáo báo nào được ra mắt trong sự kiện hợp nhất. ETH mà bạn sở hữu trước sự kiện hợp nhất cũng là ETH hiện tại. Bạn **không cần thực hiện bất kỳ hành động nào liên quan đến ETH của mình để chuẩn bị cho việc chuyển đổi từ bằng chứng công việc sang bằng chứng cổ phần**.
+Trong giai đoạn chuẩn bị cho [Hợp nhất](/roadmap/merge/), những kẻ lừa đảo đã lợi dụng sự nhầm lẫn xung quanh thuật ngữ 'Eth2' để cố gắng lừa người dùng đổi ETH của họ lấy một token 'ETH2'. Không có 'ETH2' nào tồn tại, không có token mới nào được ra mắt trong sự kiện hợp nhất. ETH mà bạn sở hữu trước sự kiện hợp nhất cũng là ETH hiện tại. Bạn **không cần thực hiện bất kỳ hành động nào liên quan đến ETH của mình để chuẩn bị cho việc chuyển đổi từ bằng chứng công việc sang bằng chứng cổ phần**.
Những kẻ lừa đảo có thể xuất hiện dưới dạng "hỗ trợ", cho bạn biết rằng nếu bạn gửi ETH của mình, bạn sẽ nhận lại 'ETH2'. Không có [hỗ trợ Ethereum chính thức](/community/support/), và không có token mới nào cả. Không bao giờ chia sẻ cụm từ hạt giống ví của bạn với bất kỳ ai.
@@ -182,7 +182,7 @@ Một số thứ cần nhớ:
### Lừa đảo Airdrop {#airdrop-scams}
-Các trò gian lận trong airdrop liên quan đến một dự án lừa đảo chuyển một tài sản (NFT, mã thông báo) vào ví của bạn và đưa bạn đến một trang web lừa đảo để yêu cầu tài sản airdrop. Bạn sẽ được nhắc đăng nhập bằng ví Ethereum của mình và "chấp thuận" giao dịch khi cố gắng nhận thưởng. Giao dịch này xâm phạm tài khoản của bạn bằng cách gửi các khóa công khai và riêng tư của bạn cho kẻ lừa đảo. Một hình thức khác của trò lừa đảo này có thể yêu cầu bạn xác nhận một giao dịch gửi tiền vào tài khoản của kẻ lừa đảo.
+Các trò gian lận trong airdrop liên quan đến một dự án lừa đảo chuyển một tài sản (NFT, token) vào ví của bạn và đưa bạn đến một trang web lừa đảo để yêu cầu tài sản airdrop. Bạn sẽ được nhắc đăng nhập bằng ví Ethereum của mình và "chấp thuận" giao dịch khi cố gắng nhận thưởng. Giao dịch này xâm phạm tài khoản của bạn bằng cách gửi các khóa công khai và riêng tư của bạn cho kẻ lừa đảo. Một hình thức khác của trò lừa đảo này có thể yêu cầu bạn xác nhận một giao dịch gửi tiền vào tài khoản của kẻ lừa đảo.
[Thông tin thêm về lừa đảo Airdrop](https://www.youtube.com/watch?v=LLL_nQp1lGk)
@@ -247,7 +247,7 @@ Việc ghi nhớ mật khẩu mạnh, duy nhất cho mọi tài khoản bạn c
- Một cái gì đó của bạn (chẳng hạn như dấu vân tay hoặc máy quét mống mắt / khuôn mặt)
- Thứ mà bạn sở hữu (khóa bảo mật hoặc ứng dụng xác thực trên điện thoại của bạn)
-Sử dụng **Xác thực hai yếu tố (2FA)** cung cấp thêm một _yếu tố bảo mật_ cho tài khoản trực tuyến của bạn. 2FA đảm bảo rằng việc sử dụngmật khẩu là chưa đủ để truy cập tài khoản. Thông thường nhất, yếu tố thứ hai là một mã 6 chữ số ngẫu nhiên, được gọi là **mật khẩu một lần dựa trên thời gian (TOTP)**, mà bạn có thể truy cập thông qua một ứng dụng xác thực như Google Authenticator hoặc Authy. Chúng hoạt động như một yếu tố "thứ gì đó bạn sở hữu" vì hạt giống tạo mã hẹn giờ được lưu trữ trên thiết bị của bạn.
+Sử dụng **Xác thực hai yếu tố (2FA)** cung cấp thêm một _yếu tố bảo mật_ cho tài khoản trực tuyến của bạn. 2FA đảm bảo rằng việc sử dụng mật khẩu là chưa đủ để truy cập tài khoản. Thông thường nhất, yếu tố thứ hai là một mã 6 chữ số ngẫu nhiên, được gọi là **mật khẩu một lần dựa trên thời gian (TOTP)**, mà bạn có thể truy cập thông qua một ứng dụng xác thực như Google Authenticator hoặc Authy. Chúng hoạt động như một yếu tố "thứ gì đó bạn sở hữu" vì hạt giống tạo mã hẹn giờ được lưu trữ trên thiết bị của bạn.
diff --git a/public/content/translations/vi/web3/index.md b/public/content/translations/vi/web3/index.md
index 553fbd2c626..8aa24195037 100644
--- a/public/content/translations/vi/web3/index.md
+++ b/public/content/translations/vi/web3/index.md
@@ -88,7 +88,7 @@ Web 2.0 yêu cầu người tạo nội dung tin tưởng các nền tảng khô
#### Các tổ chức tự trị phi tập trung (DAO) {#daos}
-Cũng như sở hữu dữ liệu của bạn trong Web3, bạn có thể sở hữu nền tảng này như một tập thể, sử dụng các mã thông báo hoạt động giống như cổ phần trong một công ty. DAO cho phép bạn điều phối quyền sở hữu phi tập trung của một nền tảng và đưa ra quyết định về tương lai của nó.
+Cũng như sở hữu dữ liệu của bạn trong Web3, bạn có thể sở hữu nền tảng này như một tập thể, sử dụng các token hoạt động giống như cổ phần trong một công ty. DAO cho phép bạn điều phối quyền sở hữu phi tập trung của một nền tảng và đưa ra quyết định về tương lai của nó.
Về mặt kỹ thuật, các DAO được định nghĩa là các [hợp đồng thông minh](/glossary/#smart-contract) đã được thống nhất, giúp tự động hóa việc ra quyết định phi tập trung đối với một quỹ tài nguyên (token). Người dùng sở hữu token bỏ phiếu và cách sử dụng tài nguyên và dùng code tự động thực hiện kết quả bỏ phiếu.
diff --git a/public/content/translations/vi/whitepaper/index.md b/public/content/translations/vi/whitepaper/index.md
index 83323f3e89a..dec84a582d3 100644
--- a/public/content/translations/vi/whitepaper/index.md
+++ b/public/content/translations/vi/whitepaper/index.md
@@ -12,7 +12,7 @@ _Bài viết giới thiệu này được xuất bản lần đầu vào năm 20
_Mặc dù có nhiều năm tuổi, chúng tôi vẫn lưu giữ tài liệu này vì nó vẫn hữu ích cho việc tham khảo và giải thích Ethereum và tầm nhìn của nó. _Để tìm hiểu về những phát triển mới nhất của Ethereum và cách thực hiện các thay đổi đối với giao thức, chúng tôi khuyên bạn nên đọc [hướng dẫn này](/learn/)._
-[Các nhà nghiên cứu và học giả đang tìm kiếm phiên bản lịch sử hoặc chính thức của giấy trắng [từ tháng 12 năm 2014] nên sử dụng tệp PDF này.](./whitepaper-pdf/Ethereum_Whitepaper_-_Buterin_2014.pdf)
+[Các nhà nghiên cứu và học giả đang tìm kiếm phiên bản lịch sử hoặc chính thức của sách trắng [từ tháng 12 năm 2014] nên sử dụng tệp PDF này.](./whitepaper-pdf/Ethereum_Whitepaper_-_Buterin_2014.pdf)
## Nền tảng Hợp đồng thông minh và Ứng dụng phi tập trung thế hệ tiếp theo {#a-next-generation-smart-contract-and-decentralized-application-platform}
diff --git a/src/intl/vi/common.json b/src/intl/vi/common.json
index 53b472af558..de2bb8d0485 100644
--- a/src/intl/vi/common.json
+++ b/src/intl/vi/common.json
@@ -413,7 +413,7 @@
"prediction-markets": "Thị trường dự đoán",
"privacy-policy": "Chính sách quyền riêng tư",
"private-ethereum": "Ethereum riêng",
- "product-disclaimer": "Các sản phẩm và dịch vụ được liệt kê để đảm bảo thuận tiện cho cộng đồng Ethereum. Việc liệt kê một sản phẩm hoặc dịch vụ không đồng nghĩa với sự chứng thực từ đội nghĩa trang web ethereum.org hay Ethereum Foundation.",
+ "product-disclaimer": "Các sản phẩm và dịch vụ được liệt kê để đảm bảo thuận tiện cho cộng đồng Ethereum. Việc liệt kê một sản phẩm hoặc dịch vụ không đồng nghĩa với sự chứng thực từ đội ngũ trang web ethereum.org hay Ethereum Foundation.",
"quizzes": "Trắc nghiệm",
"quizzes-title": "Trung tâm trắc nghiệm",
"refresh": "Tải lại trang",
diff --git a/src/intl/vi/page-apps.json b/src/intl/vi/page-apps.json
index abc292144b6..0d5ecf9dad2 100644
--- a/src/intl/vi/page-apps.json
+++ b/src/intl/vi/page-apps.json
@@ -53,7 +53,7 @@
"page-apps-category-dao-meta-description": "Khám phá các công cụ DAO hàng đầu trên Ethereum giúp quản trị, quản lý ngân quỹ, bỏ phiếu, và hợp tác với những người đóng góp. Khám phá, quản lý, và phát triển tổ chức phi tập trung của bạn.",
"page-apps-see-all": "Xem tất cả",
"page-apps-suggest-an-app-title": "Đề xuất ứng dụng",
- "page-apps-suggest-an-app-description": "Chúng tôi luôn tìm kiếm các ứng dụng mới để thêm vào danh sách của mình. Nếu có ứng dụng nào mà bạn nghĩa là nên được thêm vào dan sách, hãy cho chúng tôi biết.",
+ "page-apps-suggest-an-app-description": "Chúng tôi luôn tìm kiếm các ứng dụng mới để thêm vào danh sách của mình. Nếu có ứng dụng nào mà bạn nghĩ là nên được thêm vào danh sách, hãy cho chúng tôi biết.",
"page-apps-suggest-an-app-button": "Đề xuất ứng dụng",
"page-apps-filter-by": "Lọc bởi",
"page-apps-filter-all": "Tất cả",
diff --git a/src/intl/vi/page-collectibles.json b/src/intl/vi/page-collectibles.json
index cd6f73b3eea..4cab0cd953b 100644
--- a/src/intl/vi/page-collectibles.json
+++ b/src/intl/vi/page-collectibles.json
@@ -19,7 +19,7 @@
"page-collectibles-code-content-instructions-3": "Đẩy sửa chữa hoặc sự cải thiện",
"page-collectibles-code-content-title": "Mã nguồn và nội dung",
"page-collectibles-code-content-writing-badge-1": "Huy hiệu đóng góp nội dung",
- "page-collectibles-code-content-writing-desc": "Bất kỳ cái thiển nội dung đều được hợp vào bản gốc (main)",
+ "page-collectibles-code-content-writing-desc": "Bất kỳ cải thiện nội dung đều được hợp vào bản gốc (main)",
"page-collectibles-code-content-writing-title": "Viết",
"page-collectibles-connect-wallet": "Kết nối ví",
"page-collectibles-contributing-since": "Đóng góp từ",
@@ -37,8 +37,8 @@
"page-collectibles-how-step3-desc": "trên Galxe",
"page-collectibles-how-step3-title": "Nhận NFT",
"page-collectibles-how-title": "Cơ chế hoạt động",
- "page-collectibles-improve-desc-1": "Kiếm NFT riêng biệt bằng cách giúp duy trì và mở rộng trang web ethereum.org. Những huy hiệu nàyghi nhận sư tham gia của bạn trong chuỗi",
- "page-collectibles-improve-desc-2": "Những người giữ thứ hạng cao nhất sẽ nhận đượcQuà dàng cho người đóng góp hoặc giảm giá đến những sự kiện như Devcon. Những huy hiệu của bạn trên chuỗi giúp những người khác dễ dàng ủng hộ bạn",
+ "page-collectibles-improve-desc-1": "Kiếm NFT riêng biệt bằng cách giúp duy trì và mở rộng trang web ethereum.org. Những huy hiệu này ghi nhận sự tham gia của bạn trong chuỗi",
+ "page-collectibles-improve-desc-2": "Những người giữ thứ hạng cao nhất sẽ nhận được Quà tặng cho người đóng góp hoặc giảm giá đến những sự kiện như Devcon. Những huy hiệu của bạn trên chuỗi giúp những người khác dễ dàng ủng hộ bạn",
"page-collectibles-improve-title": "Cải thiện ethereum.org",
"page-collectibles-index-frequency": "Kết quả được cập nhật 1 lần mỗi ngày vào 15:15 UTC",
"page-collectibles-instructions-label": "Hướng dẫn",
diff --git a/src/intl/vi/page-learn.json b/src/intl/vi/page-learn.json
index 96929f24cd2..3abfe55149f 100644
--- a/src/intl/vi/page-learn.json
+++ b/src/intl/vi/page-learn.json
@@ -27,7 +27,7 @@
"additional-reading-what-are-smart-contracts": "Hợp đồng thông minh là gì?",
"additional-reading-what-is-web3": "Web3 là gì?",
"additional-reading-ethereum-in-thirty-minutes": "Ethereum trong 30 phút bởi Vitalik Buterin",
- "additional-reading-get-eth": "Tìm hiểm cách kiếm ETH",
+ "additional-reading-get-eth": "Tìm hiểu cách kiếm ETH",
"how-do-i-use-ethereum-1": "Sử dụng Ethereum có thể mang nhiều ý nghĩa khác nhau đối với mỗi người. Bạn có thể muốn đăng nhập vào một ứng dụng, xác minh danh tính trực tuyến hoặc chuyển một số ETH. Bước đầu tiên bạn cần làm là tạo một tài khoản. Cách dễ nhất để tạo và truy cập tài khoản là sử dụng phần mềm được gọi là ví điện tử.",
"what-is-a-wallet-card-title": "Ví là gì?",
"what-is-a-wallet-card-description": "Ví điện tử cũng giống như ví tiền thật vậy; chúng chứa những gì bạn cần để xác minh danh tính của bạn và cho phép bạn truy cập vào những nơi mà bạn muốn.",
diff --git a/src/intl/vi/page-staking.json b/src/intl/vi/page-staking.json
index 6ad872199fb..6e5a942bc0a 100644
--- a/src/intl/vi/page-staking.json
+++ b/src/intl/vi/page-staking.json
@@ -11,7 +11,7 @@
"comp-withdrawal-credentials-placeholder": "Chỉ số xác thực",
"comp-withdrawal-credentials-error": "Rất tiếc! Kiểm tra chỉ số xác thực và thử lại.",
"comp-withdrawal-credentials-upgraded-1": "Chỉ số nút xác thực {validatorIndex} đã sẵn sàng để bắt đầu nhận phần thưởng!",
- "comp-withdrawal-credentials-upgraded-2": "Thông tin rút tiền được gắn liền với địa chủ rút:",
+ "comp-withdrawal-credentials-upgraded-2": "Thông tin rút tiền được gắn liền với địa chỉ rút:",
"comp-withdrawal-credentials-not-upgraded-1": "Trình xác thực {network} này cần được nâng cấp.",
"comp-withdrawal-credentials-not-upgraded-2": "Hướng dẫn nâng cấp có thể tìm thấy tại Staking Launchpad",
"comp-withdrawal-credentials-verify": "Xác thực trên {network}",
@@ -55,7 +55,7 @@
"page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)",
"page-staking-hierarchy-solo-h2": "Ký gửi một mình",
"page-staking-hierarchy-solo-pill-1": "Tác động mạnh mẽ nhất",
- "page-staking-hierarchy-solo-pill-2": "Toàn quyển kiểm soát",
+ "page-staking-hierarchy-solo-pill-2": "Toàn quyền kiểm soát",
"page-staking-hierarchy-solo-pill-3": "Nhận thưởng hoàn toàn",
"page-staking-hierarchy-solo-pill-4": "Không tin tưởng",
"page-staking-hierarchy-solo-p1": "Ký gửi tại nhà trên Ethereum là tiêu chuẩn vàng cho việc ký gửi. Nó mang lại phần thưởng đầy đủ khi tham gia, cải thiện sự phi tập trung của mạng lưới và không bao giờ yêu cầu bạn phải tin tưởng người khác với tài sản của mình.",
@@ -120,7 +120,7 @@
"page-staking-considerations-solo-8-description": "Người dùng duy trì nắm giữ định danh xác thực, bao gồm cả chữ ký và khóa rút tiền",
"page-staking-considerations-solo-8-warning": "Bên thứ ba nắm giữ",
"page-staking-considerations-solo-9-title": "Tiết kiệm",
- "page-staking-considerations-solo-9-description": "Người dùng có thể vận hành xác thực bằng cách đặc cọc ít hơn 32 ETH, bằng cách tận dụng tiền chung của người khác",
+ "page-staking-considerations-solo-9-description": "Người dùng có thể vận hành xác thực bằng cách đặt cọc ít hơn 32 ETH, bằng cách tận dụng tiền chung của người khác",
"page-staking-considerations-solo-9-valid": "< 32 ETH",
"page-staking-considerations-solo-9-warning": "32 ETH",
"page-staking-considerations-saas-4-description": "Phần mềm đã sẵn sàng và được mọi người sử dụng trong một khoảng thời gian nhất định",
@@ -133,7 +133,7 @@
"page-staking-considerations-saas-7-caution": "Vẫn chưa biết",
"page-staking-considerations-saas-7-warning": "Nhiều hơn 50%",
"page-staking-considerations-saas-8-title": "Đa dạng đồng thuận",
- "page-staking-considerations-saas-8-description": "Dịch vụ không nên chạy hơn 50% những người xác thực với ứng dụng đồg thuận chủ yếu",
+ "page-staking-considerations-saas-8-description": "Dịch vụ không nên chạy hơn 50% những người xác thực với ứng dụng đồng thuận chủ yếu",
"page-staking-considerations-saas-8-valid": "Ít hơn 50%",
"page-staking-considerations-saas-8-caution": "Vẫn chưa biết",
"page-staking-considerations-saas-8-warning": "Nhiều hơn 50%",
@@ -145,7 +145,7 @@
"page-staking-considerations-pools-8-description": "Token thanh khoản được cấp đại diện cho số ETH bạn ký gửi sẽ nằm trong ví của bạn",
"page-staking-considerations-pools-8-valid": "Các token thanh khoản",
"page-staking-considerations-pools-8-warning": "Token không có tính thanh khoản",
- "page-staking-considerations-pools-9-description": "Dịch vụ không nên chạy hơn 50% những người xác thực với ứng dụng đồg thuận chủ yếu",
+ "page-staking-considerations-pools-9-description": "Dịch vụ không nên chạy hơn 50% những người xác thực với ứng dụng đồng thuận chủ yếu",
"page-staking-how-solo-works-item-1": "Dùng một phần cứng: Bạn cần phải chạy nút để ký gửi",
"page-staking-how-solo-works-item-2": "Đồng bộ ứng dụng vận hành của khách hàng",
"page-staking-how-solo-works-item-3": "Đồng bộ mạng lưới khách hàng đồng thuận",
diff --git a/src/intl/vi/page-upgrades-index.json b/src/intl/vi/page-upgrades-index.json
index b7fc5f3bdba..578966517da 100644
--- a/src/intl/vi/page-upgrades-index.json
+++ b/src/intl/vi/page-upgrades-index.json
@@ -73,9 +73,9 @@
"page-upgrades-meta-title": "Bản nâng cấp của Ethereum (trước đây là 'Eth2')",
"page-upgrades-proof-stake-link": "Đọc thêm về minh chứng cổ phần",
"page-upgrades-question-1-title": "Khi nào bản nâng cấp phát hành?",
- "page-upgrades-question-1-desc": "Ethereum đang được nâng gấp dần dần; các bản nâng cấp đều khác biệt cùng ngày phát hành khác nhau.",
+ "page-upgrades-question-1-desc": "Ethereum đang được nâng cấp dần dần; các bản nâng cấp đều khác biệt cùng ngày phát hành khác nhau.",
"page-upgrades-question-2-title": "Chuỗi Hải Đăng có phải là một chuỗi khối riêng biệt?",
- "page-upgrades-question-2-desc": "Chính xác. Chuỗi Hải Đăng là tên được đặt cho chuỗi khối chạy song song trên cơ chế bằng chứng cổ phẩn để nâng cấp mạng chính của Ethereum. Hiện tại chỉ có một mạng lưới được hình thành từ chuỗi khối Ethereum gốc và Chuỗi Hải Đăng.",
+ "page-upgrades-question-2-desc": "Chính xác. Chuỗi Hải Đăng là tên được đặt cho chuỗi khối chạy song song trên cơ chế bằng chứng cổ phần để nâng cấp mạng chính của Ethereum. Hiện tại chỉ có một mạng lưới được hình thành từ chuỗi khối Ethereum gốc và Chuỗi Hải Đăng.",
"page-upgrades-question-3-answer-2a": "Sự kiện The Merge có tác động nhỏ đến các nhà phát triển dapp - họ vẫn tương tác với Ethereum như trước.",
"page-upgrades-question-3-answer-2a-link": "Sự kiện The Merge và các nhà phát triển ứng dụng phi tập trung",
"page-upgrades-question-3-answer-2b": "Các kế hoạch phân mảnh vẫn đang được phát triển, nhưng sẽ được thiết kế với việc tích hợp các lớp 2 trong tâm trí nó.",
From 460916f37c152c851a1e24dee0f44882066532c2 Mon Sep 17 00:00:00 2001
From: Paul Wackerow <54227730+wackerow@users.noreply.github.com>
Date: Fri, 20 Feb 2026 00:07:23 -0700
Subject: [PATCH 14/31] docs: extend vi translation-review retrospective
---
...owdin-import-review-vietnamese-pr-17176.md | 64 ++++++++++++++++++-
1 file changed, 62 insertions(+), 2 deletions(-)
diff --git a/docs/solutions/translation-review/crowdin-import-review-vietnamese-pr-17176.md b/docs/solutions/translation-review/crowdin-import-review-vietnamese-pr-17176.md
index ead34e01f60..b2bd8f4edb2 100644
--- a/docs/solutions/translation-review/crowdin-import-review-vietnamese-pr-17176.md
+++ b/docs/solutions/translation-review/crowdin-import-review-vietnamese-pr-17176.md
@@ -179,9 +179,69 @@ Key terms from `vi-glossary-terms.json` used during review:
4. **Run character-set validation** to catch cross-script contamination early
5. **Document VPS/EVM ambiguity** in Vietnamese translation guidelines for future translators
+---
+
+## Phase 2: Deep Quality Review (Feb 19–20)
+
+A second review pass on 49 JSON + 7 high-traffic markdown files found 13 additional critical issues and 20+ diacritical typos missed by Phase 1.
+
+### Additional Critical Issues
+
+- **Offensive mistranslation**: "upvoted" → `bình luận đồng tính` ("homosexual comments") in `security/index.md`
+- **Wrong content**: `page-staking-benefits-1-description` described DeFi collateral instead of consensus rewards
+- **Brand names translated**: "Devcon" → "Hội nghị các nhà phát triển", "Ethereum Foundation" → "Nền tảng Ethereum" (3 locations)
+- **"Gas" as natural gas**: "khí đốt" (fuel gas) instead of "gas" in `page-roadmap.json`
+- **"Token" as "notification code"**: `mã thông báo` used instead of "token" across multiple files, one garbled to `mã thông cáo báo`
+- **Broken HTML**: Subscribe link with invisible `` tag, missing `` closing tags
+- **Structural drift**: DeFi section ordering didn't match English source
+
+### Vietnamese Diacritical Marks: Semantic, Not Cosmetic
+
+Vietnamese tone marks change meaning entirely. These are not cosmetic typos — 20+ found across files:
+
+| Typo | Meaning | Correct | Meaning |
+|------|---------|---------|---------|
+| địa **chủ** | landlord | địa **chỉ** | address |
+| quyển | book/volume | quyền | right/authority |
+| cổ phẩn | (nonsense) | cổ phần | equity/stake |
+| nâng gấp | (nonsense) | nâng cấp | upgrade |
+| đặc cọc | (nonsense) | đặt cọc | deposit |
+| Tìm hiểm | find danger | Tìm hiểu | learn |
+
+Standard spellcheck won't catch these. A dedicated Vietnamese diacritical validator using a dictionary corpus would.
+
+### AI-Assisted Fixing Introduces New Errors
+
+Gemini 2.5 Pro was used to apply Phase 2 fixes. It resolved most criticals but **introduced 3 new build-breaking errors**:
+- 3 JSON double-comma (`,,`) syntax breaks
+- Subscribe link "fixed" but left `` tag with no link text
+- Single `### Heading {#id}` split into two bare `###` headings
+- 6 explicitly flagged typos missed
+- Summary doc contained false "Refuted" claims about issues it actually changed
+
+**Total fix passes required**: sanitizer → Phase 1 terminology → Gemini fixes → Claude Code re-review → Claude Code final patches. What should be one-click took ~20 rounds.
+
+### Crowdin Glossary Contradictions
+
+The approved glossary contradicts itself on key term families:
+
+| Base Term | Glossary | Compound Term | Glossary | Conflict |
+|-----------|----------|---------------|----------|----------|
+| gas | "ga" | gas fee | "phí **gas**" | ga vs gas |
+| staking | "ký gửi" | staker | "những người **đặt cọc**" | ký gửi vs đặt cọc |
+| token | "token" | non-fungible token | "**mã thông báo** không thể thay thế" | token vs mã thông báo |
+
+### Additional Prevention Recommendations
+
+6. **Post-sanitizer quality gate:** Automated scan for known-bad translations ("mã thông báo", "khí đốt", "Nền tảng Ethereum")
+7. **Vietnamese diacritical validator:** Dictionary-based check for tonal mark errors
+8. **Glossary consistency audit:** Resolve contradictions before next import cycle
+9. **Section ordering check:** Validate translated markdown structure against English source
+10. **AI fix verification:** If using AI to apply fixes, always run a separate verification pass
+
## Related Files
- **Sanitizer**: `src/scripts/i18n/post_import_sanitize.ts`
-- **Review Command**: `.claude/commands/review-translations.md`
+- **Review Command**: `.claude/skills/review-translations.md`
+- **Crowdin Glossary**: `docs/translation-glossary-vi.json`
- **Community Glossary**: `vi-glossary-terms.json` (repo root)
-- **CI Workflow**: `.github/workflows/claude-review-translations.yml`
From 0ea11242be6bbf809fc6768561e30713395420ec Mon Sep 17 00:00:00 2001
From: Pablo Pettinari
Date: Fri, 27 Feb 2026 14:19:14 +0100
Subject: [PATCH 15/31] chore: remove unused releasesData export and CoinGecko
console.warn
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Remove the legacy `releasesData` named export from releases.tsx — it was
unused (all consumers use `getReleasesData(t)` directly) and logged
warnings for every translation key.
Replace the noisy CoinGecko `console.warn` in stablecoins page with a
silent comment since missing coins are expected behavior.
---
app/[locale]/stablecoins/page.tsx | 2 +-
src/data/roadmap/releases.tsx | 8 --------
2 files changed, 1 insertion(+), 9 deletions(-)
diff --git a/app/[locale]/stablecoins/page.tsx b/app/[locale]/stablecoins/page.tsx
index 9d256bf9856..f7765d1c24d 100644
--- a/app/[locale]/stablecoins/page.tsx
+++ b/app/[locale]/stablecoins/page.tsx
@@ -105,7 +105,7 @@ async function Page({ params }: { params: PageParams }) {
.map(({ id, ...rest }) => {
const coinMarketData = stablecoinsData.find((coin) => coin.id === id)
if (!coinMarketData) {
- console.warn("CoinGecko stablecoin data not found:", id)
+ // CoinGecko data may not include all configured stablecoins
return null
}
return { ...coinMarketData, ...rest }
diff --git a/src/data/roadmap/releases.tsx b/src/data/roadmap/releases.tsx
index 38df20f04b7..7113db6d813 100644
--- a/src/data/roadmap/releases.tsx
+++ b/src/data/roadmap/releases.tsx
@@ -190,11 +190,3 @@ export const getReleasesData = (t: TranslationFunction): Release[] => [
forkcast_href: "https://forkcast.org/upgrade/glamsterdam",
},
]
-
-// Legacy export for backward compatibility - uses hardcoded English strings
-export const releasesData: Release[] = getReleasesData((key: string) => {
- // This is a fallback that returns the key itself if translations aren't available
- // In practice, this should not be used in the actual app
- console.warn(`Translation key ${key} used without translation function`)
- return key
-})
From cd5744eab44487278930d6839002337a07a5112f Mon Sep 17 00:00:00 2001
From: 0xMushow <105550256+0xMushow@users.noreply.github.com>
Date: Fri, 27 Feb 2026 20:27:08 +0400
Subject: [PATCH 16/31] Add new bounty hunter 'Evgeny Legerov' - Low 1000
points
---
src/data/consensus-bounty-hunters.json | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/data/consensus-bounty-hunters.json b/src/data/consensus-bounty-hunters.json
index bbf396b03b6..3750e7ae041 100644
--- a/src/data/consensus-bounty-hunters.json
+++ b/src/data/consensus-bounty-hunters.json
@@ -124,6 +124,11 @@
"name": "0xPulp",
"score": 1000
},
+ {
+ "username": "quasar",
+ "name": "Evgeny Legerov",
+ "score": 1000
+ },
{
"username": "0xfadam",
"name": "fadam",
From dd44c06a3695cb04149ca3494d50b9cf321b7369 Mon Sep 17 00:00:00 2001
From: myelinated-wackerow
<263208946+myelinated-wackerow@users.noreply.github.com>
Date: Fri, 27 Feb 2026 23:44:04 +0000
Subject: [PATCH 17/31] fix(i18n): review vi translations PR #17176
- Replace "ma thong bao" with "token" (16 files)
- Fix "not" -> "nut" for node terminology (8 files)
- Fix garbled text in merge/, pbs/, verkle-trees/
- Fix meaning inversion: centralization -> decentralization
- Fix factual errors: PoW->PoS validators, 2h->24h
- Fix deposit contract mistranslation (email->reveal)
- Fix "Relays" mistranslated as "Repeat"
- Fix diacritical errors changing word meanings
Co-Authored-By: Claude Opus 4.6
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
---
.../content/translations/vi/bridges/index.md | 6 ++--
.../contributing/translation-program/index.md | 2 +-
.../pos/attack-and-defense/index.md | 2 +-
.../consensus-mechanisms/pos/faqs/index.md | 2 +-
.../developers/docs/ethereum-stack/index.md | 2 +-
.../vi/developers/docs/gas/index.md | 2 +-
.../networking-layer/portal-network/index.md | 2 +-
.../node-architecture/index.md | 2 +-
.../nodes-as-a-service/index.md | 2 +-
.../nodes-and-clients/run-a-node/index.md | 2 +-
.../index.md | 2 +-
.../tutorials/all-you-can-cache/index.md | 2 +-
.../index.md | 2 +-
.../index.md | 4 +--
.../index.md | 4 +--
.../index.md | 2 +-
.../erc-721-vyper-annotated-code/index.md | 2 +-
.../tutorials/erc20-annotated-code/index.md | 2 +-
.../index.md | 4 +--
.../index.md | 2 +-
.../hello-world-smart-contract/index.md | 6 ++--
.../index.md | 2 +-
.../tutorials/how-to-mint-an-nft/index.md | 6 ++--
.../index.md | 2 +-
.../index.md | 2 +-
.../index.md | 2 +-
.../index.md | 2 +-
.../how-to-use-tellor-as-your-oracle/index.md | 2 +-
.../how-to-view-nft-in-metamask/index.md | 2 +-
.../how-to-write-and-deploy-an-nft/index.md | 6 ++--
.../index.md | 4 +--
.../index.md | 2 +-
.../logging-events-smart-contracts/index.md | 2 +-
.../index.md | 2 +-
.../reverse-engineering-a-contract/index.md | 6 ++--
.../tutorials/scam-token-tricks/index.md | 6 ++--
.../secure-development-workflow/index.md | 2 +-
.../index.md | 2 +-
.../index.md | 2 +-
.../index.md | 2 +-
.../tutorials/stealth-addr/index.md | 4 +--
.../index.md | 2 +-
.../token-integration-checklist/index.md | 2 +-
.../index.md | 2 +-
.../index.md | 34 +++++++++----------
.../tutorials/using-websockets/index.md | 2 +-
.../index.md | 4 +--
.../index.md | 6 ++--
.../index.md | 2 +-
.../translations/vi/eth/supply/index.md | 8 ++---
.../vi/guides/how-to-id-scam-tokens/index.md | 8 ++---
.../how-to-revoke-token-access/index.md | 2 +-
.../vi/guides/how-to-swap-tokens/index.md | 2 +-
.../vi/guides/how-to-use-a-bridge/index.md | 2 +-
.../vi/guides/how-to-use-a-wallet/index.md | 4 +--
.../translations/vi/roadmap/merge/index.md | 24 ++++++-------
.../vi/roadmap/merge/issuance/index.md | 8 ++---
.../translations/vi/roadmap/pbs/index.md | 6 ++--
.../translations/vi/roadmap/scaling/index.md | 2 +-
.../vi/roadmap/single-slot-finality/index.md | 6 ++--
.../vi/roadmap/verkle-trees/index.md | 6 ++--
.../translations/vi/staking/pools/index.md | 2 +-
src/intl/vi/glossary-tooltip.json | 4 +--
src/intl/vi/glossary.json | 2 +-
src/intl/vi/learn-quizzes.json | 4 +--
src/intl/vi/page-10-year-anniversary.json | 2 +-
src/intl/vi/page-resources.json | 4 +--
.../vi/page-staking-deposit-contract.json | 2 +-
src/intl/vi/page-staking.json | 30 ++++++++--------
.../vi/page-trillion-dollar-security.json | 2 +-
70 files changed, 150 insertions(+), 150 deletions(-)
diff --git a/public/content/translations/vi/bridges/index.md b/public/content/translations/vi/bridges/index.md
index 424c7972292..fd18639f19f 100644
--- a/public/content/translations/vi/bridges/index.md
+++ b/public/content/translations/vi/bridges/index.md
@@ -24,9 +24,9 @@ Nhưng bạn sẽ làm gì nếu muốn thực hiện một trao đổi tương
Tất cả chuỗi khối đều có giới hạn. Để Ethereum mở rộng quy mô và đáp ứng nhu cầu, nó đã yêu cầu các [rollup](/glossary/#rollups). Ngoài ra, các L1 như Solana và Avalanche được thiết kế khác nhau để cho phép thông lượng cao hơn nhưng phải trả giá bằng sự kém phi tập trung.
-Tuy nhiên, tất cả các chuỗi khối đều được phát triển trong các môi trường biệt lập và có các quy tắc cũng như cơ chế [sự đồng thuận](/glossary/#consensus) khác nhau. Điều này có nghĩa là chúng không thể giao tiếp tự nhiên và các mã thông báo không thể di chuyển tự do giữa các chuỗi khối.
+Tuy nhiên, tất cả các chuỗi khối đều được phát triển trong các môi trường biệt lập và có các quy tắc cũng như cơ chế [sự đồng thuận](/glossary/#consensus) khác nhau. Điều này có nghĩa là chúng không thể giao tiếp tự nhiên và các token không thể di chuyển tự do giữa các chuỗi khối.
-Cầu tồn tại để kết nối các chuỗi khối, cho phép trao đổi thông tin và mã thông báo giữa chúng.
+Cầu tồn tại để kết nối các chuỗi khối, cho phép trao đổi thông tin và token giữa chúng.
**Cầu nối cho phép**:
@@ -63,7 +63,7 @@ Giả sử bạn muốn sở hữu Bitcoin (BTC) gốc, nhưng bạn chỉ có t
- Bạn cũng có thể thực hiện tất cả những điều trên bằng cách sử dụng một [sàn giao dịch tập trung](/get-eth). Tuy nhiên, trừ khi tiền của bạn đã có sẵn trên một sàn giao dịch, nó sẽ bao gồm nhiều bước và có thể sẽ tối hơn nếu bạn sử dụng cầu nối.
+ Bạn cũng có thể thực hiện tất cả những điều trên bằng cách sử dụng một [sàn giao dịch tập trung](/get-eth). Tuy nhiên, trừ khi tiền của bạn đã có sẵn trên một sàn giao dịch, nó sẽ bao gồm nhiều bước và có thể sẽ tốt hơn nếu bạn sử dụng cầu nối.
diff --git a/public/content/translations/vi/contributing/translation-program/index.md b/public/content/translations/vi/contributing/translation-program/index.md
index 8dde2245709..f731cba1737 100644
--- a/public/content/translations/vi/contributing/translation-program/index.md
+++ b/public/content/translations/vi/contributing/translation-program/index.md
@@ -53,7 +53,7 @@ Nếu bạn đã đóng góp cho Chương trình Dịch thuật và có ít nh
#### OAT {#oats}
-Những người đóng góp cho Chương trình Dịch thuật đủ điều kiện nhận các OAT (mã thông báo thành tích trên chuỗi) khác nhau dựa trên số lượng từ đã dịch của họ trong năm 2024. OAT là các NFT chứng minh sự đóng góp của bạn cho Chương trình Dịch thuật của ethereum.org. [Thông tin thêm về OAT](/contributing/translation-program/acknowledgements/#oats)
+Những người đóng góp cho Chương trình Dịch thuật đủ điều kiện nhận các OAT (token thành tích trên chuỗi) khác nhau dựa trên số lượng từ đã dịch của họ trong năm 2024. OAT là các NFT chứng minh sự đóng góp của bạn cho Chương trình Dịch thuật của ethereum.org. [Thông tin thêm về OAT](/contributing/translation-program/acknowledgements/#oats)
#### Ghi nhận dịch giả {#translator-acknowledgements}
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md
index 34f0cf5e43c..42a32c87aec 100644
--- a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md
@@ -50,7 +50,7 @@ Cuối cùng, điều tối quan trọng là cộng đồng Ethereum phải cở
### Tấn công giao thức {#attacking-the-protocol}
-Bất kì ai cũng có thể chạy phần mềm Client Ethereum. Để có thể thêm nốt xác thực vào Client, người dùng cần phải đặt cược (Stake) 32 Ether vào trong một hợp đồng kí quỹ. Nút xác thực cho phép người dùng tham gia tích cực vào việc bảo mật mạng lưới Ethereum bằng cách đề xuất và xác nhận các khối mới. Người vận hành nút lúc này có tiếng nói để tác động đến nội dung tương lai của chuỗi khối – họ có thể làm điều đó một cách trung thực và gia tăng số Ether tích lũy thông qua phần thưởng, hoặc họ có thể tìm cách thao túng quy trình vì lợi ích riêng, đồng thời đối mặt với rủi ro mất phần Stake của mình. Một cách để tiến hành cuộc tấn công là tích lũy tỷ lệ Stake cao hơn trong tổng số ETH Stake trên mạng lưới và sử dụng chúng để bỏ phiếu áp đảo những nút xác thực trung thực. Tỷ lệ Stake mà kẻ tấn công kiểm soát càng lớn thì quyền biểu quyết của họ càng mạnh, đặc biệt tại một số mốc kinh tế mà chúng ta sẽ tìm hiểu sau. Tuy nhiên, hầu hết kẻ tấn công sẽ không thể tích lũy đủ lượng Ether để tấn công theo cách này, nên thay vào đó họ phải dùng những kỹ thuật tinh vi nhằm thao túng đa số thành viên trung thực hành động theo một hướng nhất định.
+Bất kì ai cũng có thể chạy phần mềm Client Ethereum. Để có thể thêm nút xác thực vào Client, người dùng cần phải đặt cược (Stake) 32 Ether vào trong một hợp đồng kí quỹ. Nút xác thực cho phép người dùng tham gia tích cực vào việc bảo mật mạng lưới Ethereum bằng cách đề xuất và xác nhận các khối mới. Người vận hành nút lúc này có tiếng nói để tác động đến nội dung tương lai của chuỗi khối – họ có thể làm điều đó một cách trung thực và gia tăng số Ether tích lũy thông qua phần thưởng, hoặc họ có thể tìm cách thao túng quy trình vì lợi ích riêng, đồng thời đối mặt với rủi ro mất phần Stake của mình. Một cách để tiến hành cuộc tấn công là tích lũy tỷ lệ Stake cao hơn trong tổng số ETH Stake trên mạng lưới và sử dụng chúng để bỏ phiếu áp đảo những nút xác thực trung thực. Tỷ lệ Stake mà kẻ tấn công kiểm soát càng lớn thì quyền biểu quyết của họ càng mạnh, đặc biệt tại một số mốc kinh tế mà chúng ta sẽ tìm hiểu sau. Tuy nhiên, hầu hết kẻ tấn công sẽ không thể tích lũy đủ lượng Ether để tấn công theo cách này, nên thay vào đó họ phải dùng những kỹ thuật tinh vi nhằm thao túng đa số thành viên trung thực hành động theo một hướng nhất định.
Về cơ bản, tất cả các cuộc tấn công với số stake nhỏ đều là những biến thể của hai dạng hành vi độc hại từ nút xác thực: hoạt động ít (không thực hiện việc xác nhận/đề xuất hoặc thực hiện trễ) hoặc hoạt động quá mức (đề xuất/xác nhận quá nhiều lần trong một Slot). Ở dạng đơn giản nhất, những hành vi này có thể dễ dàng được xử lý bởi thuật toán chọn nhánh (Fork-Choice) và lớp khuyến khích (khuyến khích hành động đúng bằng thưởng), nhưng vẫn tồn tại những cách tinh vi để lợi dụng hệ thống nhằm đem lại lợi thế cho kẻ tấn công.
diff --git a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/faqs/index.md
index 64292d2fe07..f049967a620 100644
--- a/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/faqs/index.md
+++ b/public/content/translations/vi/developers/docs/consensus-mechanisms/pos/faqs/index.md
@@ -161,7 +161,7 @@ Không, có vài chuỗi khối bằng chứng cổ phần khác. Không có cá
## Sự kiện Hợp nhất là gì? {#what-is-the-merge}
-Sự kiện Hợp nhất là khoảnh khắc Ethereum tắt cơ chế đồng thuận bằng chứng công việc của mình và bật cơ chế đồng thuận bằng chứng cổ phẩn. Sự kiện Hợp nhất đã diễn ra vào 15 tháng 9 năm 2022.
+Sự kiện Hợp nhất là khoảnh khắc Ethereum tắt cơ chế đồng thuận bằng chứng công việc của mình và bật cơ chế đồng thuận bằng chứng cổ phần. Sự kiện Hợp nhất đã diễn ra vào 15 tháng 9 năm 2022.
[Tìm hiểu thêm về The Merge](/roadmap/merge)
diff --git a/public/content/translations/vi/developers/docs/ethereum-stack/index.md b/public/content/translations/vi/developers/docs/ethereum-stack/index.md
index 43ad14d2b19..2e5ae74942f 100644
--- a/public/content/translations/vi/developers/docs/ethereum-stack/index.md
+++ b/public/content/translations/vi/developers/docs/ethereum-stack/index.md
@@ -12,7 +12,7 @@ Tuy nhiên, có những thành phần chính của Ethereum giúp chúng ta hìn
[Máy ảo Ethereum (EVM)](/developers/docs/evm/) là môi trường thực thi cho các hợp đồng thông minh trên Ethereum. Tất cả các hợp đồng thông minh và thay đổi trạng thái trên chuỗi khối Ethereum đều được thực thi bởi [các giao dịch](/developers/docs/transactions/). EVM xử lý toàn bộ quy trình giao dịch trên mạng Ethereum.
-Giống như bất kỳ máy ảo nào, EVM tạo ra một lớp trừu tượng giữa các mã và máy đang chạy (một nút Ethereum). Hiện tại, EVM đang chạy trên hàng ngàn nút phân bổkhắp nơi trên thế giới.
+Giống như bất kỳ máy ảo nào, EVM tạo ra một lớp trừu tượng giữa các mã và máy đang chạy (một nút Ethereum). Hiện tại, EVM đang chạy trên hàng ngàn nút phân bổ khắp nơi trên thế giới.
Chi tiết thì EVM sử dụng một bộ lệnh opcode để thực hiện các tác vụ cụ thể. Các mã vận hành này (140 mã riêng biệt) cho phép EVM [hoàn thiện Turing](https://en.wikipedia.org/wiki/Turing_completeness), nghĩa là EVM có thể tính toán gần như mọi thứ, miễn là có đủ tài nguyên.
diff --git a/public/content/translations/vi/developers/docs/gas/index.md b/public/content/translations/vi/developers/docs/gas/index.md
index f8214c82179..c2f8991b84e 100644
--- a/public/content/translations/vi/developers/docs/gas/index.md
+++ b/public/content/translations/vi/developers/docs/gas/index.md
@@ -122,7 +122,7 @@ Phí gas cao là do sự phổ biến của Ethereum. Nếu nhu cầu quá cao,
Các [bản nâng cấp khả năng mở rộng](/roadmap/) của Ethereum cuối cùng sẽ giải quyết một số vấn đề về phí gas, điều này sẽ cho phép nền tảng xử lý hàng nghìn giao dịch mỗi giây và mở rộng quy mô trên toàn cầu.
-Layer 2 là là sáng kiến chính để cải thiện về mặt chi phí gas, trải nghiệm người dùng và khả năng mở rộng quy mô.
+Layer 2 là sáng kiến chính để cải thiện về mặt chi phí gas, trải nghiệm người dùng và khả năng mở rộng quy mô.
[Tìm hiểu thêm về mở rộng quy mô lớp 2](/developers/docs/scaling/#layer-2-scaling)
diff --git a/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
index b8df108b2c8..115c39576f4 100644
--- a/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
+++ b/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
@@ -55,7 +55,7 @@ Những lợi ích của thiết kế mạng này là:
- giảm sự phụ thuộc vào các nhà cung cấp tập trung
- Giảm sử dụng băng thông Internet
- Đồng bộ hóa tối thiểu hoặc bằng không
-- Có thể truy cập được đối với các thiết bị có tài nguyên hạn chế (\<1 GB RAM, \<100 MB dung lượng đĩa, 1 CPU)
+- Có thể truy cập được đối với các thiết bị có tài nguyên hạn chế (\<1 GB RAM, \<100 MB dung lượng đĩa, 1 CPU)
Bảng dưới đây hiển thị các chức năng của các máy khách hiện có mà Mạng Portal có thể cung cấp, cho phép người dùng truy cập các chức năng này trên các thiết bị có tài nguyên rất thấp.
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/node-architecture/index.md
index 872bc731f86..c7da1e062ac 100644
--- a/public/content/translations/vi/developers/docs/nodes-and-clients/node-architecture/index.md
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/node-architecture/index.md
@@ -1,5 +1,5 @@
---
-title: "Kiến trúc nốt"
+title: "Kiến trúc nút"
description: "Giới thiệu về cách tổ chức các nút Ethereum."
lang: vi
---
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md
index 895d699c780..90529bc23f9 100644
--- a/public/content/translations/vi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/nodes-as-a-service/index.md
@@ -67,7 +67,7 @@ Dưới đây là danh sách một số nhà cung cấp nút Ethereum phổ bi
- [**Allnodes**](https://www.allnodes.com/)
- [Tài liệu](https://docs.allnodes.com/)
- Tính năng
- - Không giới hạn tỷ lệ với mã thông báo PublicNode được tạo trên trang portfolio của Allnodes.
+ - Không giới hạn tỷ lệ với token PublicNode được tạo trên trang portfolio của Allnodes.
- Các điểm cuối RPC miễn phí tập trung vào quyền riêng tư (hơn 100 chuỗi khối) trên [PublicNode](https://www.publicnode.com)
- Các nút chuyên dụng không giới hạn tốc độ cho hơn 90 chuỗi khối
- Các nút lưu trữ chuyên dụng cho hơn 30 chuỗi khối
diff --git a/public/content/translations/vi/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/vi/developers/docs/nodes-and-clients/run-a-node/index.md
index 8ca9a27006b..9c44e00bc63 100644
--- a/public/content/translations/vi/developers/docs/nodes-and-clients/run-a-node/index.md
+++ b/public/content/translations/vi/developers/docs/nodes-and-clients/run-a-node/index.md
@@ -1,5 +1,5 @@
---
-title: "Đăng kí nốt Ethereum của bạn"
+title: "Đăng kí nút Ethereum của bạn"
description: "Một giới thiệu chung về cách tự vận hành một Client Ethereum."
lang: vi
sidebarDepth: 2
diff --git a/public/content/translations/vi/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/vi/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md
index 4c7ff0662dd..184ba98301f 100644
--- a/public/content/translations/vi/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md
+++ b/public/content/translations/vi/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md
@@ -3,7 +3,7 @@ title: "Giới thiệu về Ethereum cho nhà phát triển Python, phần 1"
description: "Nhập môn phát triển Ethereum, đặc biệt hữu ích cho những ai có kiến thức về lập trình ngôn ngữ Python"
author: Marc Garreau
lang: vi
-tags: [ "python", "web3.py" ]
+tags: [ "Python", "web3.py" ]
skill: beginner
published: 2020-09-08
source: Snake charmers
diff --git a/public/content/translations/vi/developers/tutorials/all-you-can-cache/index.md b/public/content/translations/vi/developers/tutorials/all-you-can-cache/index.md
index 363987e256e..417429d2ca1 100644
--- a/public/content/translations/vi/developers/tutorials/all-you-can-cache/index.md
+++ b/public/content/translations/vi/developers/tutorials/all-you-can-cache/index.md
@@ -535,7 +535,7 @@ Hàm này tương tự như `testReadParam`, ngoại trừ việc thay vì viế
} // testEncodeVal
```
-Bài kiểm thử bổ sung duy nhất trong `testEncodeVal()` là để xác minh rằng độ dài của `_callInput` là chính xác. Đối với cuộc gọi đầu tiên, nó là 4+33\*4. Đối với lần thứ hai, nơi mọi giá trị đã có trong bộ nhớ đệm, nó là 4+1\*4.
+Bài kiểm thử bổ sung duy nhất trong `testEncodeVal()` là để xác minh rằng độ dài của `_callInput` là chính xác. Đối với cuộc gọi đầu tiên, nó là 4+33*4. Đối với lần thứ hai, nơi mọi giá trị đã có trong bộ nhớ đệm, nó là 4+1*4.
```solidity
// Kiểm tra encodeVal khi khóa dài hơn một byte
diff --git a/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md b/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md
index 7fd4e12e436..eb917e0f525 100644
--- a/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md
@@ -2,7 +2,7 @@
title: "Xây dựng giao diện người dùng cho hợp đồng của bạn"
description: "Sử dụng các thành phần hiện đại như TypeScript, React, Vite và Wagmi, chúng ta sẽ xem xét một giao diện người dùng hiện đại nhưng tối giản và tìm hiểu cách kết nối ví với giao diện người dùng, gọi hợp đồng thông minh để đọc thông tin, gửi giao dịch đến hợp đồng thông minh và giám sát các sự kiện từ hợp đồng thông minh để xác định các thay đổi."
author: Ori Pomerantz
-tags: [ "typescript", "react", "vite", "wagmi", "frontend" ]
+tags: [ "TypeScript", "react", "vite", "wagmi", "frontend" ]
skill: beginner
published: 2023-11-01
lang: vi
diff --git a/public/content/translations/vi/developers/tutorials/deploying-your-first-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/deploying-your-first-smart-contract/index.md
index b91b5b9dec5..cefbafd80af 100644
--- a/public/content/translations/vi/developers/tutorials/deploying-your-first-smart-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/deploying-your-first-smart-contract/index.md
@@ -5,8 +5,8 @@ author: "jdourlens"
tags:
[
"hợp đồng thông minh",
- "remix",
- "solidity",
+ "Remix",
+ "Solidity",
"triển khai"
]
skill: beginner
diff --git a/public/content/translations/vi/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/translations/vi/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md
index 00609d886ed..680c3d18ead 100644
--- a/public/content/translations/vi/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md
+++ b/public/content/translations/vi/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md
@@ -116,8 +116,8 @@ git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-ku
Thư mục [smart-contract-example](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example) được sử dụng ở đây chứa thiết lập điển hình cho một nhà phát triển dApp sử dụng khuôn khổ [Hardhat](https://hardhat.org/):
- [`contracts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/contracts) chứa một vài hợp đồng thông minh đơn giản cho một dApp Blackjack
-- [`scripts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/scripts) chứa một tập lệnh để triển khai hợp đồng mã thông báo cho mạng Ethereum cục bộ của bạn
-- [`test/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/test) chứa một bài kiểm tra .js đơn giản cho hợp đồng mã thông báo của bạn để xác nhận mỗi người chơi trong dApp Blackjack của chúng tôi có 1000 được đúc cho họ
+- [`scripts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/scripts) chứa một tập lệnh để triển khai hợp đồng token cho mạng Ethereum cục bộ của bạn
+- [`test/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/test) chứa một bài kiểm tra .js đơn giản cho hợp đồng token của bạn để xác nhận mỗi người chơi trong dApp Blackjack của chúng tôi có 1000 được đúc cho họ
- [`hardhat.config.ts`](https://github.com/kurtosis-tech/awesome-kurtosis/blob/main/smart-contract-example/hardhat.config.ts) cấu hình thiết lập Hardhat của bạn
### Cấu hình Hardhat để sử dụng mạng thử nghiệm cục bộ {#configure-hardhat}
diff --git a/public/content/translations/vi/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md b/public/content/translations/vi/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md
index c86c781641f..aca75406f65 100644
--- a/public/content/translations/vi/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md
+++ b/public/content/translations/vi/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md
@@ -3,7 +3,7 @@ title: "Thu hẹp hợp đồng để chống lại giới hạn kích thước
description: "Bạn có thể làm gì để ngăn các hợp đồng thông minh của mình trở nên quá lớn?"
author: Markus Waas
lang: vi
-tags: [ "solidity", "hợp đồng thông minh", "lưu trữ" ]
+tags: [ "Solidity", "hợp đồng thông minh", "lưu trữ" ]
skill: intermediate
published: 2020-06-26
source: soliditydeveloper.com
diff --git a/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
index 2fba50691fe..ad70c04a956 100644
--- a/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
+++ b/public/content/translations/vi/developers/tutorials/erc-721-vyper-annotated-code/index.md
@@ -3,7 +3,7 @@ title: "Hướng dẫn hợp đồng Vyper ERC-721"
description: "Hợp đồng ERC-721 của Ryuya Nakamura và cách hoạt động"
author: Ori Pomerantz
lang: vi
-tags: [ "vyper", "erc-721", "python" ]
+tags: [ "Vyper", "erc-721", "Python" ]
skill: beginner
published: 2021-04-01
---
diff --git a/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md
index 89fd94962bd..fcb9ab937bf 100644
--- a/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md
+++ b/public/content/translations/vi/developers/tutorials/erc20-annotated-code/index.md
@@ -3,7 +3,7 @@ title: "Hướng dẫn về Hợp đồng ERC-20"
description: "Hợp đồng ERC-20 của OpenZeppelin chứa những gì và tại sao chúng lại ở đó?"
author: Ori Pomerantz
lang: vi
-tags: [ "solidity", "erc-20" ]
+tags: [ "Solidity", "erc-20" ]
skill: beginner
published: 2021-03-09
---
diff --git a/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
index 58cbf9269e5..692316a35ca 100644
--- a/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
+++ b/public/content/translations/vi/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
@@ -4,11 +4,11 @@ description: "Đây là hướng dẫn cho người mới bắt đầu phát tri
author: "Elan Halpern"
tags:
[
- "javascript",
+ "JavaScript",
"ethers.js",
"nút",
"truy vấn",
- "từ Alchemy"
+ "Alchemy"
]
skill: beginner
lang: vi
diff --git a/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md
index 271aaf64cf0..88b163f5da8 100644
--- a/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md
+++ b/public/content/translations/vi/developers/tutorials/guide-to-smart-contract-security-tools/index.md
@@ -3,7 +3,7 @@ title: "Hướng dẫn về các công cụ bảo mật hợp đồng thông min
description: "Tổng quan về ba kỹ thuật kiểm thử và phân tích chương trình khác nhau"
author: "Trailofbits"
lang: vi
-tags: [ "solidity", "hợp đồng thông minh", "tính bảo mật" ]
+tags: [ "Solidity", "hợp đồng thông minh", "tính bảo mật" ]
skill: intermediate
published: 2020-09-07
source: Building secure contracts
diff --git a/public/content/translations/vi/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/hello-world-smart-contract/index.md
index 6b5055f8efd..565f65ba90f 100644
--- a/public/content/translations/vi/developers/tutorials/hello-world-smart-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/hello-world-smart-contract/index.md
@@ -4,9 +4,9 @@ description: "Hướng dẫn giới thiệu về cách viết và triển khai m
author: "elanh"
tags:
[
- "solidity",
- "hardhat",
- "từ Alchemy",
+ "Solidity",
+ "Hardhat",
+ "Alchemy",
"hợp đồng thông minh",
"triển khai"
]
diff --git a/public/content/translations/vi/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/vi/developers/tutorials/how-to-implement-an-erc721-market/index.md
index 21f5b395c02..a22d839adaf 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-implement-an-erc721-market/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-implement-an-erc721-market/index.md
@@ -6,7 +6,7 @@ tags:
[
"hợp đồng thông minh",
"erc-721",
- "solidity",
+ "Solidity",
"tokens"
]
skill: intermediate
diff --git a/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
index d5f24316e9b..902a3a5d23d 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
@@ -5,8 +5,8 @@ author: "Sumi Mudgil"
tags:
[
"ERC-721",
- "từ Alchemy",
- "solidity",
+ "Alchemy",
+ "Solidity",
"hợp đồng thông minh"
]
skill: beginner
@@ -18,7 +18,7 @@ published: 2021-04-22
[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 triệu đô la
[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 triệu đô la
-Tất cả họ đã đúc các NFT của mình bằng cách sử dụng Giao diện Lập trình Ứng dụng mạnh mẽ của Alchemy. Trong hướng dẫn này, chúng tôi sẽ dạy bạn cách làm điều tương tự trong vòng \<10 phút.
+Tất cả họ đã đúc các NFT của mình bằng cách sử dụng Giao diện Lập trình Ứng dụng mạnh mẽ của Alchemy. Trong hướng dẫn này, chúng tôi sẽ dạy bạn cách làm điều tương tự trong vòng \<10 phút.
“Đúc một NFT” là hành động xuất bản một phiên bản duy nhất của token ERC-721 của bạn trên chuỗi khối. Sử dụng hợp đồng thông minh của chúng tôi từ [Phần 1 của chuỗi hướng dẫn NFT này](/developers/tutorials/how-to-write-and-deploy-an-nft/), hãy vận dụng các kỹ năng Web3 của chúng ta và đúc một NFT. Khi kết thúc hướng dẫn này, bạn sẽ có thể đúc bao nhiêu NFT tùy thích (và ví của bạn cho phép)!
diff --git a/public/content/translations/vi/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/vi/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md
index 87c4ea2ea08..649d7388970 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md
@@ -5,7 +5,7 @@ author: Markus Waas
lang: vi
tags:
[
- "solidity",
+ "Solidity",
"hợp đồng thông minh",
"kiểm thử",
"mocking"
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
index dcc6fc5cfbc..e69e3883ec4 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
@@ -5,7 +5,7 @@ author: "Trailofbits"
lang: vi
tags:
[
- "solidity",
+ "Solidity",
"hợp đồng thông minh",
"tính bảo mật",
"kiểm thử",
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
index 0fdd0588862..46f3b5fa7e3 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
@@ -5,7 +5,7 @@ author: Trailofbits
lang: vi
tags:
[
- "solidity",
+ "Solidity",
"hợp đồng thông minh",
"tính bảo mật",
"kiểm thử",
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
index 26e45ee74a2..cbe115d1e8c 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
@@ -5,7 +5,7 @@ author: Trailofbits
lang: vi
tags:
[
- "solidity",
+ "Solidity",
"hợp đồng thông minh",
"tính bảo mật",
"kiểm thử"
diff --git a/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
index 0219e464807..982ddbb7f08 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
@@ -3,7 +3,7 @@ title: "Cách thiết lập Tellor làm Oracle của bạn"
description: "Hướng dẫn bắt đầu tích hợp oracle Tellor vào giao thức của bạn"
author: "Tellor"
lang: vi
-tags: [ "solidity", "hợp đồng thông minh", "oracles" ]
+tags: [ "Solidity", "hợp đồng thông minh", "oracles" ]
skill: beginner
published: 2021-06-29
source: Tellor Docs
diff --git a/public/content/translations/vi/developers/tutorials/how-to-view-nft-in-metamask/index.md b/public/content/translations/vi/developers/tutorials/how-to-view-nft-in-metamask/index.md
index b68ded69b65..28be04a88e6 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-view-nft-in-metamask/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-view-nft-in-metamask/index.md
@@ -2,7 +2,7 @@
title: "Cách xem NFT của bạn trong Ví (Phần 3/3 của Chuỗi hướng dẫn NFT)"
description: "Hướng dẫn này mô tả cách xem một NFT hiện có trên MetaMask!"
author: "Sumi Mudgil"
-tags: [ "ERC-721", "Từ Alchemy", "Solidity" ]
+tags: [ "ERC-721", "Alchemy", "Solidity" ]
skill: beginner
lang: vi
published: 2021-04-22
diff --git a/public/content/translations/vi/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/vi/developers/tutorials/how-to-write-and-deploy-an-nft/index.md
index 6705a092f09..14e4cd39ff6 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-write-and-deploy-an-nft/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-write-and-deploy-an-nft/index.md
@@ -1,11 +1,11 @@
---
title: "Cách viết và triển khai một NFT (Phần 1/3 trong Loạt bài hướng dẫn về NFT)"
-description: "Hướng dẫn này là phần 1 của chuỗi hướng dẫn về NFT mà sẽ đưa bạn từng bước viết và triển khai một hợp đồng thông minh cho mã thông báo không thể thay thế (mã ERC-721) sử dụng Ethereum và Hệ thống tệp liên hành tinh (IPFS)."
+description: "Hướng dẫn này là phần 1 của chuỗi hướng dẫn về NFT mà sẽ đưa bạn từng bước viết và triển khai một hợp đồng thông minh cho token không thể thay thế (mã ERC-721) sử dụng Ethereum và Hệ thống tệp liên hành tinh (IPFS)."
author: "Sumi Mudgil"
tags:
[
"ERC-721",
- "Từ Alchemy",
+ "Alchemy",
"Solidity",
"hợp đồng thông minh"
]
@@ -14,7 +14,7 @@ lang: vi
published: 2021-04-22
---
-Với việc NFT đưa blockchain ra mắt công chúng, đây là một cơ hội tuyệt vời để tự mình tìm hiểu về cơn sốt này bằng cách xuất bản hợp đồng NFT (Mã thông báo ERC-721) của riêng bạn trên blockchain Ethereum!
+Với việc NFT đưa blockchain ra mắt công chúng, đây là một cơ hội tuyệt vời để tự mình tìm hiểu về cơn sốt này bằng cách xuất bản hợp đồng NFT (Token ERC-721) của riêng bạn trên blockchain Ethereum!
Alchemy vô cùng tự hào khi cung cấp sức mạnh cho những tên tuổi lớn nhất trong không gian NFT, bao gồm Makersplace (gần đây đã lập kỷ lục bán tác phẩm nghệ thuật kỹ thuật số tại Christie's với giá 69 triệu đô la), Dapper Labs (những người tạo ra NBA Top Shot & Crypto Kitties), OpenSea (thị trường NFT lớn nhất thế giới), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable, và nhiều hơn nữa.
diff --git a/public/content/translations/vi/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/vi/developers/tutorials/interact-with-other-contracts-from-solidity/index.md
index ab34e7668e3..82029c1809a 100644
--- a/public/content/translations/vi/developers/tutorials/interact-with-other-contracts-from-solidity/index.md
+++ b/public/content/translations/vi/developers/tutorials/interact-with-other-contracts-from-solidity/index.md
@@ -5,8 +5,8 @@ author: "jdourlens"
tags:
[
"hợp đồng thông minh",
- "solidity",
- "remix",
+ "Solidity",
+ "Remix",
"triển khai",
"khả năng tổng hợp"
]
diff --git a/public/content/translations/vi/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/vi/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md
index 44a3960ed2a..bdd6fa1e163 100644
--- a/public/content/translations/vi/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md
+++ b/public/content/translations/vi/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md
@@ -5,7 +5,7 @@ author: "Markus Waas"
tags:
[
"frontend",
- "javascript",
+ "JavaScript",
"ethers.js",
"the graph",
"tài chính phi tập trung"
diff --git a/public/content/translations/vi/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/vi/developers/tutorials/logging-events-smart-contracts/index.md
index 9a862ee6bb8..8eb7eeff069 100644
--- a/public/content/translations/vi/developers/tutorials/logging-events-smart-contracts/index.md
+++ b/public/content/translations/vi/developers/tutorials/logging-events-smart-contracts/index.md
@@ -2,7 +2,7 @@
title: "Ghi nhật ký dữ liệu từ hợp đồng thông minh bằng các sự kiện"
description: "Giới thiệu về các sự kiện của hợp đồng thông minh và cách bạn có thể sử dụng chúng để ghi nhật ký dữ liệu"
author: "jdourlens"
-tags: [ "hợp đồng thông minh", "remix", "solidity", "sự kiện" ]
+tags: [ "hợp đồng thông minh", "Remix", "Solidity", "sự kiện" ]
skill: intermediate
lang: vi
published: 2020-04-03
diff --git a/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md
index 1983e2df81e..6a749ac0170 100644
--- a/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md
+++ b/public/content/translations/vi/developers/tutorials/optimism-std-bridge-annotated-code/index.md
@@ -2,7 +2,7 @@
title: "Hướng dẫn hợp đồng cầu nối tiêu chuẩn Optimism"
description: "Cầu nối tiêu chuẩn cho Optimism hoạt động như thế nào? Tại sao nó lại hoạt động theo cách này?"
author: Ori Pomerantz
-tags: [ "solidity", "cầu nối", "lớp 2" ]
+tags: [ "Solidity", "cầu nối", "lớp 2" ]
skill: intermediate
published: 2022-03-30
lang: vi
diff --git a/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
index f84104a1717..96a4b7a3ea3 100644
--- a/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
@@ -51,8 +51,8 @@ Các hợp đồng luôn được thực thi từ byte đầu tiên. Đây là p
| 4 | MSTORE | Trống |
| 5 | PUSH1 0x04 | 0x04 |
| 7 | CALLDATASIZE | CALLDATASIZE 0x04 |
-| 8 | LT | CALLDATASIZE\<4 |
-| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 |
+| 8 | LT | CALLDATASIZE\<4 |
+| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 |
| C | JUMPI | Trống |
Mã này thực hiện hai việc:
@@ -429,7 +429,7 @@ Mã ở độ lệch 0x138-0x143 giống hệt với những gì chúng ta đã
| 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 |
+| 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 |
diff --git a/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md
index 831f90d6e04..105e581dd46 100644
--- a/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md
+++ b/public/content/translations/vi/developers/tutorials/scam-token-tricks/index.md
@@ -5,10 +5,10 @@ author: Ori Pomerantz
tags:
[
"lừa đảo",
- "solidity",
+ "Solidity",
"erc-20",
- "javascript",
- "typescript"
+ "JavaScript",
+ "TypeScript"
]
skill: intermediate
published: 2023-09-15
diff --git a/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
index 0343fbd1e93..7394d0414d4 100644
--- a/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
+++ b/public/content/translations/vi/developers/tutorials/secure-development-workflow/index.md
@@ -2,7 +2,7 @@
title: "Danh sách kiểm tra bảo mật hợp đồng thông minh"
description: "Quy trình làm việc được đề xuất để viết các hợp đồng thông minh bảo mật"
author: "Trailofbits"
-tags: [ "hợp đồng thông minh", "tính bảo mật", "solidity" ]
+tags: [ "hợp đồng thông minh", "tính bảo mật", "Solidity" ]
skill: intermediate
lang: vi
published: 2020-09-07
diff --git a/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
index c4bae2cf5c6..f0a28b8c788 100644
--- a/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
+++ b/public/content/translations/vi/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md
@@ -2,7 +2,7 @@
title: "Gửi Giao dịch bằng Web3"
description: "Đây là hướng dẫn thân thiện với người mới bắt đầu về cách gửi giao dịch Ethereum bằng Web3. Có ba bước chính để gửi một giao dịch đến chuỗi khối Ethereum: tạo, ký và quảng bá. Chúng ta sẽ đi qua cả ba bước."
author: "Elan Halpern"
-tags: [ "các giao dịch", "web3.js", "từ Alchemy" ]
+tags: [ "các giao dịch", "web3.js", "Alchemy" ]
skill: beginner
lang: vi
published: 2020-11-04
diff --git a/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
index a54be4e1957..a3dab51f360 100644
--- a/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
+++ b/public/content/translations/vi/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md
@@ -2,7 +2,7 @@
title: "Thiết lập web3.js để sử dụng chuỗi khối Ethereum trong JavaScript"
description: "Tìm hiểu cách thiết lập và cấu hình thư viện web3.js để tương tác với chuỗi khối Ethereum từ các ứng dụng JavaScript."
author: "jdourlens"
-tags: [ "web3.js", "javascript" ]
+tags: [ "web3.js", "JavaScript" ]
skill: beginner
lang: vi
published: 2020-04-11
diff --git a/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
index 38ec652f1d1..09b6604cc93 100644
--- a/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
+++ b/public/content/translations/vi/developers/tutorials/smart-contract-security-guidelines/index.md
@@ -2,7 +2,7 @@
title: "Các nguyên tắc bảo mật hợp đồng thông minh"
description: "Danh sách kiểm tra các nguyên tắc bảo mật cần xem xét khi xây dựng ứng dụng phi tập trung của bạn"
author: "Trailofbits"
-tags: [ "solidity", "hợp đồng thông minh", "tính bảo mật" ]
+tags: [ "Solidity", "hợp đồng thông minh", "tính bảo mật" ]
skill: intermediate
lang: vi
published: 2020-09-06
diff --git a/public/content/translations/vi/developers/tutorials/stealth-addr/index.md b/public/content/translations/vi/developers/tutorials/stealth-addr/index.md
index ed51a28587b..fd0ec322b8f 100644
--- a/public/content/translations/vi/developers/tutorials/stealth-addr/index.md
+++ b/public/content/translations/vi/developers/tutorials/stealth-addr/index.md
@@ -7,7 +7,7 @@ tags:
"Địa chỉ ẩn",
"quyền riêng tư",
"mật mã học",
- "rust",
+ "Rust",
"wasm"
]
skill: intermediate
@@ -46,7 +46,7 @@ Bill tạo khóa riêng tư thứ ba, _Rpriv_, và xuất bản _RprivVpub = GRprivVpriv_, mà anh ta mong đợi Alice cũng biết (được giải thích bên dưới). Giá trị này được gọi là _S_, bí mật chung. Điều này cho Bill một khóa công khai, _Ppub = Kpub+G\*hàm băm(S)_. Từ khóa công khai này, anh ta có thể tính toán một địa chỉ và gửi bất kỳ tài nguyên nào anh ta muốn đến đó. Trong tương lai, nếu Alice thắng, Bill có thể nói cho cô ấy biết _Rpriv_ để chứng minh các tài nguyên đến từ anh ta.
-Alice tính toán _RpubVpriv = GRprivVpriv_. Điều này cho cô ấy cùng một bí mật chung, _S_. Bởi vì cô ấy biết khóa riêng tư, _Kpriv_, cô ấy có thể tính toán _Ppriv = Kpriv+hàm băm(S)_. Khóa này cho phép cô ấy truy cập tài sản trong địa chỉ kết quả từ _Ppub = GPpriv = GKpriv+G\*hàm băm(S) = Kpub+G\*hàm băm(S)_.
+Alice tính toán _RpubVpriv = GRprivVpriv_. Điều này cho cô ấy cùng một bí mật chung, _S_. Bởi vì cô ấy biết khóa riêng tư, _Kpriv_, cô ấy có thể tính toán _Ppriv = Kpriv+hàm băm(S)_. Khóa này cho phép cô ấy truy cập tài sản trong địa chỉ kết quả từ _Ppub = GPpriv = GKpriv+G*hàm băm(S) = Kpub+G*hàm băm(S)_.
Chúng tôi có một khóa xem riêng để cho phép Alice ký hợp đồng phụ với Dịch vụ Chiến dịch Thống trị Thế giới của Dave. Alice sẵn sàng cho Dave biết các địa chỉ công khai và thông báo cho cô ấy khi có thêm tiền, nhưng cô ấy không muốn anh ta tiêu tiền chiến dịch của mình.
diff --git a/public/content/translations/vi/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/vi/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
index 702ed9c32d9..8a9a6fa5dc1 100644
--- a/public/content/translations/vi/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
+++ b/public/content/translations/vi/developers/tutorials/the-graph-fixing-web3-data-querying/index.md
@@ -5,7 +5,7 @@ author: Markus Waas
lang: vi
tags:
[
- "solidity",
+ "Solidity",
"hợp đồng thông minh",
"truy vấn",
"the graph",
diff --git a/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md b/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
index e0d09d68df5..3dea3a4a3af 100644
--- a/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
+++ b/public/content/translations/vi/developers/tutorials/token-integration-checklist/index.md
@@ -5,7 +5,7 @@ author: "Trailofbits"
lang: vi
tags:
[
- "solidity",
+ "Solidity",
"hợp đồng thông minh",
"tính bảo mật",
"tokens"
diff --git a/public/content/translations/vi/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
index dcc476c5424..bf89b154d97 100644
--- a/public/content/translations/vi/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md
@@ -2,7 +2,7 @@
title: "Chuyển khoản và phê duyệt token ERC-20 từ một hợp đồng thông minh Solidity"
description: "Xây dựng một hợp đồng thông minh của sàn giao dịch phi tập trung (DEX) xử lý việc chuyển khoản và phê duyệt token ERC-20 bằng Solidity."
author: "jdourlens"
-tags: [ "hợp đồng thông minh", "tokens", "solidity", "erc-20" ]
+tags: [ "hợp đồng thông minh", "tokens", "Solidity", "erc-20" ]
skill: intermediate
lang: vi
published: 2020-04-07
diff --git a/public/content/translations/vi/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
index 18a2483a79a..ed289812f8c 100644
--- a/public/content/translations/vi/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md
@@ -1,8 +1,8 @@
---
-title: "Hiểu hợp đồng thông minh mã thông báo ERC-20"
-description: "Tìm hiểu cách triển khai tiêu chuẩn mã thông báo ERC-20 thông qua ví dụ và giải thích đầy đủ về hợp đồng thông minh Solidity."
+title: "Hiểu hợp đồng thông minh token ERC-20"
+description: "Tìm hiểu cách triển khai tiêu chuẩn token ERC-20 thông qua ví dụ và giải thích đầy đủ về hợp đồng thông minh Solidity."
author: "jdourlens"
-tags: [ "hợp đồng thông minh", "tokens", "solidity", "erc-20" ]
+tags: [ "hợp đồng thông minh", "tokens", "Solidity", "erc-20" ]
skill: beginner
lang: vi
published: 2020-04-05
@@ -11,9 +11,9 @@ sourceUrl: https://ethereumdev.io/understand-the-erc20-token-smart-contract/
address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
---
-Một trong những [tiêu chuẩn hợp đồng thông minh](/developers/docs/standards/) quan trọng nhất trên Ethereum được gọi là [ERC-20](/developers/docs/standards/tokens/erc-20/), đã nổi lên như một tiêu chuẩn kỹ thuật được sử dụng cho tất cả các hợp đồng thông minh trên chuỗi khối Ethereum để triển khai mã thông báo có thể thay thế.
+Một trong những [tiêu chuẩn hợp đồng thông minh](/developers/docs/standards/) quan trọng nhất trên Ethereum được gọi là [ERC-20](/developers/docs/standards/tokens/erc-20/), đã nổi lên như một tiêu chuẩn kỹ thuật được sử dụng cho tất cả các hợp đồng thông minh trên chuỗi khối Ethereum để triển khai token có thể thay thế.
-ERC-20 định nghĩa một danh sách các quy tắc chung mà tất cả các mã thông báo Ethereum có thể thay thế phải tuân thủ. Do đó, tiêu chuẩn mã thông báo này cho phép các nhà phát triển thuộc mọi loại dự đoán chính xác cách các mã thông báo mới sẽ hoạt động trong hệ thống Ethereum lớn hơn. Điều này đơn giản hóa và giảm nhẹ các tác vụ của nhà phát triển, bởi vì họ có thể tiếp tục công việc của mình khi biết rằng mỗi dự án mới sẽ không cần phải làm lại mỗi khi một mã thông báo mới được phát hành, miễn là mã thông báo đó tuân theo các quy tắc.
+ERC-20 định nghĩa một danh sách các quy tắc chung mà tất cả các token Ethereum có thể thay thế phải tuân thủ. Do đó, tiêu chuẩn token này cho phép các nhà phát triển thuộc mọi loại dự đoán chính xác cách các token mới sẽ hoạt động trong hệ thống Ethereum lớn hơn. Điều này đơn giản hóa và giảm nhẹ các tác vụ của nhà phát triển, bởi vì họ có thể tiếp tục công việc của mình khi biết rằng mỗi dự án mới sẽ không cần phải làm lại mỗi khi một token mới được phát hành, miễn là token đó tuân theo các quy tắc.
Dưới đây là các hàm mà một ERC-20 phải triển khai, được trình bày dưới dạng một giao diện. Nếu bạn không chắc chắn giao diện là gì: hãy xem bài viết của chúng tôi về [lập trình OOP trong Solidity](https://ethereumdev.io/inheritance-in-solidity-contracts-are-classes/).
@@ -36,7 +36,7 @@ interface IERC20 {
}
```
-Dưới đây là giải thích từng dòng về chức năng của mỗi hàm. Sau đây, chúng tôi sẽ trình bày một cách triển khai đơn giản của mã thông báo ERC-20.
+Dưới đây là giải thích từng dòng về chức năng của mỗi hàm. Sau đây, chúng tôi sẽ trình bày một cách triển khai đơn giản của token ERC-20.
## Các hàm getter {#getters}
@@ -44,19 +44,19 @@ Dưới đây là giải thích từng dòng về chức năng của mỗi hàm.
function totalSupply() external view returns (uint256);
```
-Trả về số lượng mã thông báo đang tồn tại. Hàm này là một hàm getter và không sửa đổi trạng thái của hợp đồng. Lưu ý rằng không có kiểu dữ liệu số thực (float) trong Solidity. Do đó, hầu hết các mã thông báo sử dụng 18 chữ số thập phân và sẽ trả về tổng nguồn cung cũng như các kết quả khác dưới dạng 1000000000000000000 cho 1 mã thông báo. Không phải mã thông báo nào cũng có 18 chữ số thập phân và đây là điều bạn thực sự cần lưu ý khi làm việc với các mã thông báo.
+Trả về số lượng token đang tồn tại. Hàm này là một hàm getter và không sửa đổi trạng thái của hợp đồng. Lưu ý rằng không có kiểu dữ liệu số thực (float) trong Solidity. Do đó, hầu hết các token sử dụng 18 chữ số thập phân và sẽ trả về tổng nguồn cung cũng như các kết quả khác dưới dạng 1000000000000000000 cho 1 token. Không phải token nào cũng có 18 chữ số thập phân và đây là điều bạn thực sự cần lưu ý khi làm việc với các token.
```solidity
function balanceOf(address account) external view returns (uint256);
```
-Trả về số lượng mã thông báo thuộc sở hữu của một địa chỉ (`account`). Hàm này là một hàm getter và không sửa đổi trạng thái của hợp đồng.
+Trả về số lượng token thuộc sở hữu của một địa chỉ (`account`). Hàm này là một hàm getter và không sửa đổi trạng thái của hợp đồng.
```solidity
function allowance(address owner, address spender) external view returns (uint256);
```
-Tiêu chuẩn ERC-20 cho phép một địa chỉ cấp quyền cho một địa chỉ khác để có thể lấy mã thông báo từ đó. Hàm getter này trả về số lượng mã thông báo còn lại mà `spender` sẽ được phép chi tiêu thay mặt cho `owner`. Hàm này là một hàm getter, không sửa đổi trạng thái của hợp đồng và sẽ trả về 0 theo mặc định.
+Tiêu chuẩn ERC-20 cho phép một địa chỉ cấp quyền cho một địa chỉ khác để có thể lấy token từ đó. Hàm getter này trả về số lượng token còn lại mà `spender` sẽ được phép chi tiêu thay mặt cho `owner`. Hàm này là một hàm getter, không sửa đổi trạng thái của hợp đồng và sẽ trả về 0 theo mặc định.
## Các hàm {#functions}
@@ -64,7 +64,7 @@ Tiêu chuẩn ERC-20 cho phép một địa chỉ cấp quyền cho một địa
function transfer(address recipient, uint256 amount) external returns (bool);
```
-Di chuyển số lượng mã thông báo `amount` từ địa chỉ người gọi hàm (`msg.sender`) đến địa chỉ người nhận. Hàm này phát ra sự kiện `Transfer` được định nghĩa sau. Nó trả về true nếu việc chuyển có thể thực hiện được.
+Di chuyển số lượng token `amount` từ địa chỉ người gọi hàm (`msg.sender`) đến địa chỉ người nhận. Hàm này phát ra sự kiện `Transfer` được định nghĩa sau. Nó trả về true nếu việc chuyển có thể thực hiện được.
```solidity
function approve(address spender, uint256 amount) external returns (bool);
@@ -76,7 +76,7 @@ function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
```
-Di chuyển số lượng mã thông báo `amount` từ `sender` đến `recipient` bằng cơ chế hạn mức. `amount` sau đó được trừ vào hạn mức của người gọi. Hàm này phát ra sự kiện `Transfer`.
+Di chuyển số lượng token `amount` từ `sender` đến `recipient` bằng cơ chế hạn mức. `amount` sau đó được trừ vào hạn mức của người gọi. Hàm này phát ra sự kiện `Transfer`.
## Sự kiện {#events}
@@ -84,19 +84,19 @@ Di chuyển số lượng mã thông báo `amount` từ `sender` đến `recipie
event Transfer(address indexed from, address indexed to, uint256 value);
```
-Sự kiện này được phát ra khi một lượng mã thông báo (giá trị) được gửi từ địa chỉ `from` đến địa chỉ `to`.
+Sự kiện này được phát ra khi một lượng token (giá trị) được gửi từ địa chỉ `from` đến địa chỉ `to`.
-Trong trường hợp đúc các mã thông báo mới, việc chuyển thường là `from` địa chỉ 0x00..0000, trong khi trong trường hợp đốt mã thông báo, việc chuyển là `to` 0x00..0000.
+Trong trường hợp đúc các token mới, việc chuyển thường là `from` địa chỉ 0x00..0000, trong khi trong trường hợp đốt token, việc chuyển là `to` 0x00..0000.
```solidity
event Approval(address indexed owner, address indexed spender, uint256 value);
```
-Sự kiện này được phát ra khi số lượng mã thông báo (`value`) được `owner` phê duyệt để `spender` sử dụng.
+Sự kiện này được phát ra khi số lượng token (`value`) được `owner` phê duyệt để `spender` sử dụng.
-## Một cách triển khai cơ bản của mã thông báo ERC-20 {#a-basic-implementation-of-erc-20-tokens}
+## Một cách triển khai cơ bản của token ERC-20 {#a-basic-implementation-of-erc-20-tokens}
-Dưới đây là đoạn mã đơn giản nhất để bạn dựa vào đó tạo mã thông báo ERC-20 của mình:
+Dưới đây là đoạn mã đơn giản nhất để bạn dựa vào đó tạo token ERC-20 của mình:
```solidity
pragma solidity ^0.8.0;
@@ -174,4 +174,4 @@ contract ERC20Basic is IERC20 {
}
```
-Một cách triển khai tuyệt vời khác của tiêu chuẩn mã thông báo ERC-20 là [cách triển khai ERC-20 của OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20).
+Một cách triển khai tuyệt vời khác của tiêu chuẩn token ERC-20 là [cách triển khai ERC-20 của OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20).
diff --git a/public/content/translations/vi/developers/tutorials/using-websockets/index.md b/public/content/translations/vi/developers/tutorials/using-websockets/index.md
index edcfe4271cc..3f00d24ae5c 100644
--- a/public/content/translations/vi/developers/tutorials/using-websockets/index.md
+++ b/public/content/translations/vi/developers/tutorials/using-websockets/index.md
@@ -3,7 +3,7 @@ title: "Sử dụng WebSocket"
description: "Hướng dẫn sử dụng WebSocket và Alchemy để thực hiện các yêu cầu JSON-RPC và đăng ký các sự kiện."
author: "Elan Halpern"
lang: vi
-tags: [ "từ Alchemy", "websockets", "truy vấn", "javascript" ]
+tags: [ "Alchemy", "websockets", "truy vấn", "JavaScript" ]
skill: beginner
source: Alchemy docs
sourceUrl: https://www.alchemy.com/docs/reference/best-practices-for-using-websockets-in-web3
diff --git a/public/content/translations/vi/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/vi/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
index bf00efb65d6..db0e5ff8367 100644
--- a/public/content/translations/vi/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
+++ b/public/content/translations/vi/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md
@@ -4,9 +4,9 @@ description: "Hướng dẫn Waffle nâng cao về cách sử dụng tính năng
author: "Daniel Izdebski"
tags:
[
- "waffle",
+ "Waffle",
"hợp đồng thông minh",
- "solidity",
+ "Solidity",
"kiểm thử",
"mocking"
]
diff --git a/public/content/translations/vi/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md b/public/content/translations/vi/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
index c39cc0af85f..aa8a4b48f78 100644
--- a/public/content/translations/vi/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
+++ b/public/content/translations/vi/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md
@@ -4,11 +4,11 @@ description: "Tạo dự án Waffle đầu tiên của bạn với hardhat và e
author: "MiZiet"
tags:
[
- "waffle",
+ "Waffle",
"hợp đồng thông minh",
- "solidity",
+ "Solidity",
"kiểm thử",
- "hardhat",
+ "Hardhat",
"ethers.js"
]
skill: beginner
diff --git a/public/content/translations/vi/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/vi/developers/tutorials/waffle-test-simple-smart-contract/index.md
index 0d4e69f0345..3cbe9fd8b24 100644
--- a/public/content/translations/vi/developers/tutorials/waffle-test-simple-smart-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/waffle-test-simple-smart-contract/index.md
@@ -5,7 +5,7 @@ author: Ewa Kowalska
tags:
[
"hợp đồng thông minh",
- "solidity",
+ "Solidity",
"Waffle",
"kiểm thử"
]
diff --git a/public/content/translations/vi/eth/supply/index.md b/public/content/translations/vi/eth/supply/index.md
index 6deb008e582..1eb7606ca3b 100644
--- a/public/content/translations/vi/eth/supply/index.md
+++ b/public/content/translations/vi/eth/supply/index.md
@@ -42,7 +42,7 @@ Hai cơ chế nào quyết định tổng cung Ethereum tăng (lạm phát) hay
## Nguồn cung và phát hành ETH hiện tại {#eth-supply-today}
-Hệ thống bằng chứng cổ phần (PoS) của Ethereum đã cắt giảm mạnh lượng ETH phát hành so với trước khi áp dụng cơ chế bằng chứng công việc (PoW). Nốt xác thực (Validators) — những người khóa ETH để có thể bảo mật mạng lưới — nhận được ETH như phần thưởng. Bạn có thể theo dõi tỷ lệ phát hành hiện tại trên [Ultrasound Money](https://ultrasound.money).
+Hệ thống bằng chứng cổ phần (PoS) của Ethereum đã cắt giảm mạnh lượng ETH phát hành so với trước khi áp dụng cơ chế bằng chứng công việc (PoW). Nút xác thực (Validators) — những người khóa ETH để có thể bảo mật mạng lưới — nhận được ETH như phần thưởng. Bạn có thể theo dõi tỷ lệ phát hành hiện tại trên [Ultrasound Money](https://ultrasound.money).
Tuy nhiên, con số này luôn biến động. Nhờ có EIP-1559, khi mà mạng lưới hoạt động mạnh, lượng ETH đốt có thể vượt quá lượng phát hành, tạo ra hiệu ứng giảm phát. Ví dụ, trong giai đoạn nhu cầu tăng vọt, như ra mắt NFT hay hoạt động DeFi, ETH có thể bị đốt nhiều hơn phát hành.
@@ -56,8 +56,8 @@ Tuy nhiên, con số này luôn biến động. Nhờ có EIP-1559, khi mà mạ
Nguồn cung tương lai của Ethereum không cố định — nó phụ thuộc vào vài yếu tố:
1. **Mức độ tham gia Staking**:
- - Càng nhiều nốt xác thực tham gia mạng lưới nghĩa là càng nhiều ETH được phân phối như phần thưởng.
- - Số nốt xác thực ít đi có thể làm giảm sự phát hành.
+ - Càng nhiều nút xác thực tham gia mạng lưới nghĩa là càng nhiều ETH được phân phối như phần thưởng.
+ - Số nút xác thực ít đi có thể làm giảm sự phát hành.
- Tìm hiểu thêm về [staking](/staking/).
2. **Các hoạt động của mạng lưới**:
@@ -73,7 +73,7 @@ Nguồn cung tương lai của Ethereum không cố định — nó phụ thuộ
Đây là tóm tắt nhanh những gì bạn cần nắm về nguồn cung và phát hành ETH:
- **Nguồn cung ETH**: Biến động và sẽ luôn thay đổi, có thể theo dõi theo thời gian thực qua công cụ như [Ultrasound Money](https://ultrasound.money)
-- **Phát hành dưới PoS**: Giảm đáng kể so với PoW, với phần thưởng cho các nốt xác thực. Theo dõi tỷ lệ hiện tại trên [Ultrasound Money](https://ultrasound.money)
+- **Phát hành dưới PoS**: Giảm đáng kể so với PoW, với phần thưởng cho các nút xác thực. Theo dõi tỷ lệ hiện tại trên [Ultrasound Money](https://ultrasound.money)
- **Luật của EIP-1559**: ETH bị đốt đi giúp mạng lưới giảm phát trong thời gian hoạt động cao
- **Xu hướng tương lai**: Mức độ tham gia Staking, nhu cầu sử dụng và các bản nâng cấp giao thức sẽ định hình nguồn cung ETH
diff --git a/public/content/translations/vi/guides/how-to-id-scam-tokens/index.md b/public/content/translations/vi/guides/how-to-id-scam-tokens/index.md
index c3172fb4906..53c2ae84597 100644
--- a/public/content/translations/vi/guides/how-to-id-scam-tokens/index.md
+++ b/public/content/translations/vi/guides/how-to-id-scam-tokens/index.md
@@ -11,7 +11,7 @@ Một trong những ứng dụng cho Ethereum đó là cho một nhóm tạo ra
Có hai cách mà họ có thể đã sử dụng để lừa bạn:
- **Bán cho bạn một token lừa đảo**, có thể trông giống như token hợp pháp mà bạn muốn mua, nhưng được những kẻ lừa đảo phát hành và không có giá trị.
-- **Lừa bạn ký các giao dịch xấu**, thường bằng cách hướng bạn vào giao diện người dùng của họ. Họ có thể cố gắng yêu cầu bạn cấp cho hợp đồng của họ một khoản trợ cấp đối với mã thông báo ERC-20 của bạn, tiết lộ thông tin nhạy cảm cho phép họ truy cập vào tài sản của bạn, v.v. Những giao diện người dùng này có thể là bản sao gần như hoàn hảo của các trang web trung thực nhưng có những thủ thuật ẩn.
+- **Lừa bạn ký các giao dịch xấu**, thường bằng cách hướng bạn vào giao diện người dùng của họ. Họ có thể cố gắng yêu cầu bạn cấp cho hợp đồng của họ một khoản trợ cấp đối với token ERC-20 của bạn, tiết lộ thông tin nhạy cảm cho phép họ truy cập vào tài sản của bạn, v.v. Những giao diện người dùng này có thể là bản sao gần như hoàn hảo của các trang web trung thực nhưng có những thủ thuật ẩn.
Để minh họa token lừa đảo là gì và cách nhận diện chúng, chúng ta sẽ xem xét một ví dụ: [`wARB`](https://eth.blockscout.com/token/0xB047c8032b99841713b8E3872F06cF32beb27b82). Token này cố gắng trông giống như token [`ARB`](https://eth.blockscout.com/address/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1) hợp pháp.
@@ -28,10 +28,10 @@ contentPreview=''>
Có một quy ước trong Ethereum là khi một nội dung không tuân thủ ERC-20, chúng tôi sẽ tạo một phiên bản "được bao bọc" của nội dung đó với tên bắt đầu bằng "w". Vì vậy, ví dụ: chúng ta có wBTC cho bitcoin và wETH cho ether.
-Không có ý nghĩa gì khi tạo ra một phiên bản được gói của mã thông báo ERC-20 đã có trên Ethereum, nhưng những kẻ lừa đảo dựa vào sự xuất hiện của tính hợp pháp hơn là thực tế cơ bản.
+Không có ý nghĩa gì khi tạo ra một phiên bản được gói của token ERC-20 đã có trên Ethereum, nhưng những kẻ lừa đảo dựa vào sự xuất hiện của tính hợp pháp hơn là thực tế cơ bản.
-## Làm thế nào để các mã thông báo lừa đảo hoạt động? {#how-do-scam-tokens-work}
+## Làm thế nào để các token lừa đảo hoạt động? {#how-do-scam-tokens-work}
Mục đích chính của Ethereum là mạng lưới phi tập trung. Điều đó có nghĩa là sẽ không có cơ quan tập trung nào có quyền tịch thu tài sản của bạn hoặc ngan cản bạn triển khai hợp đồng thông minh. Nhưng điều đó cũng đồng nghĩa là những người lừa đảo cũng có quyền triển khai hợp đồng thông minh theo họ muốn.
@@ -46,7 +46,7 @@ Cụ thể, Arbitrum đã triển khai một hợp đồng sử dụng ký hiệ
## Trông có vẻ hợp pháp {#appearing-legitimate}
-Có một số chiêu trò mà những người tạo mã thông báo lừa đảo sử dụng để xuất hiện hợp pháp.
+Có một số chiêu trò mà những người tạo token lừa đảo sử dụng để xuất hiện hợp pháp.
- **Chứng minh tên và giấu hiệu**. Như đã đề cập trước đó, hợp đồng ERC-20 có thể có cùng ký hiệu và tên như các hợp đồng ERC-20 khác. Bạn không thể dựa vào cách đánh giá đó cho bảo chứng.
diff --git a/public/content/translations/vi/guides/how-to-revoke-token-access/index.md b/public/content/translations/vi/guides/how-to-revoke-token-access/index.md
index 4a0b0eb4e61..f32331706c7 100644
--- a/public/content/translations/vi/guides/how-to-revoke-token-access/index.md
+++ b/public/content/translations/vi/guides/how-to-revoke-token-access/index.md
@@ -1,6 +1,6 @@
---
title: "Cách thu hồi quyền truy cập hợp đồng thông minh vào tài sản tiền mã hóa của bạn"
-description: "Hướng dẫn thu hồi quyền truy cập mã thông báo hợp đồng thông minh khai thác"
+description: "Hướng dẫn thu hồi quyền truy cập token hợp đồng thông minh khai thác"
lang: vi
---
diff --git a/public/content/translations/vi/guides/how-to-swap-tokens/index.md b/public/content/translations/vi/guides/how-to-swap-tokens/index.md
index 926ec4261a3..a3ad2283ad7 100644
--- a/public/content/translations/vi/guides/how-to-swap-tokens/index.md
+++ b/public/content/translations/vi/guides/how-to-swap-tokens/index.md
@@ -63,7 +63,7 @@ Khi giao dịch hoàn thành, bạn sẽ nhận được tài sản mà bạn đ
### Có thể hoán đổi ETH với BTC ở ví lưu trữ vừa tạo hay không?
-Không, bạn chỉ có thể hoán đổi những cặp tài sản được tạo ra trên mạng lưới Ethereum, như là ETH, mã thông báo ERC20, hoặc là NFTs. Hoặc bạn có thể hoán đổi "wrapped" Bitcoin, một dạng tài sản đã được bảo chứng bằng Btc và chuyển đổi, đồng thời có sẵn trên mạng Ethereum.
+Không, bạn chỉ có thể hoán đổi những cặp tài sản được tạo ra trên mạng lưới Ethereum, như là ETH, token ERC20, hoặc là NFTs. Hoặc bạn có thể hoán đổi "wrapped" Bitcoin, một dạng tài sản đã được bảo chứng bằng Btc và chuyển đổi, đồng thời có sẵn trên mạng Ethereum.
### Tỉ lệ trượt giá là gì?
diff --git a/public/content/translations/vi/guides/how-to-use-a-bridge/index.md b/public/content/translations/vi/guides/how-to-use-a-bridge/index.md
index c23ea635f41..6f95a550fc0 100644
--- a/public/content/translations/vi/guides/how-to-use-a-bridge/index.md
+++ b/public/content/translations/vi/guides/how-to-use-a-bridge/index.md
@@ -1,6 +1,6 @@
---
title: "Cách chuyển token sang lớp 2"
-description: "Một hướng dẫn giải thích cách do chuyển mã thông báo từ Ethereum sang lớp thứ 2 bằng cầu nối."
+description: "Một hướng dẫn giải thích cách do chuyển token từ Ethereum sang lớp thứ 2 bằng cầu nối."
lang: vi
---
diff --git a/public/content/translations/vi/guides/how-to-use-a-wallet/index.md b/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
index 93dd4b60a85..1b45ee57ea8 100644
--- a/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
+++ b/public/content/translations/vi/guides/how-to-use-a-wallet/index.md
@@ -1,7 +1,7 @@
---
title: "Cách để sử dụng ví"
metaTitle: "Hướng dẫn từng bước cách sử dụng ví Ethereum"
-description: "Hướng dẫn giải thích cách gửi, nhận mã thông báo và kết nối với các dự án web3."
+description: "Hướng dẫn giải thích cách gửi, nhận token và kết nối với các dự án web3."
lang: vi
---
@@ -11,7 +11,7 @@ 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í.
## Mở ví của bạn
-Bạn sẽ thấy một bảng điều khiển có khả năng hiển thị số dư của bạn và chứa các nút để gửi và nhận mã thông báo.
+Bạn sẽ thấy một bảng điều khiển có khả năng hiển thị số dư của bạn và chứa các nút để gửi và nhận token.
## Nhận tiền mã hóa
diff --git a/public/content/translations/vi/roadmap/merge/index.md b/public/content/translations/vi/roadmap/merge/index.md
index 17b8a95d48b..62371fe330c 100644
--- a/public/content/translations/vi/roadmap/merge/index.md
+++ b/public/content/translations/vi/roadmap/merge/index.md
@@ -29,11 +29,11 @@ Tưởng tượng Ethereum như một con tàu vũ trụ được phóng đi tr
Bằng chứng công việc đã bảo mật mạng chính Ethereum từ khối khởi nguyên tới sự kiện hợp nhất. Điều này cho phép chuỗi khối Ethereum mà chúng ta quen thuộc ra đời vào tháng 7 năm 2015 với tất cả tính năng đặc trưng như — giao dịch, hợp đồng thông minh, tài khoản,...
-Trong suốt lịch sử của Ethereum, lập trình viên chauarn bị cho sự thay đổi từ bằng chứng công việc sang bằng chứng cổ phần. Vào ngày 1 tháng 12 năm 2020, chuỗi Beacon được tạo ra như chuỗi khối rời so với mạng chính, chạy song song.
+Trong suốt lịch sử của Ethereum, lập trình viên chuẩn bị cho sự thay đổi từ bằng chứng công việc sang bằng chứng cổ phần. Vào ngày 1 tháng 12 năm 2020, chuỗi Beacon được tạo ra như chuỗi khối rời so với mạng chính, chạy song song.
Chuỗi Beacon không được sử lý các giao dịch trên mạng chính vào thời gian đầu. Thay vào đó, nó đạt đồng thuận về trạng thái riêng bằng cách thống nhất các nút xác thực đang hoạt động và số dư của tài khoản họ. Sau kiểm nghiệm, đã đến lúc chuỗi Beacon đạt đồng thuận trên dữ liệu thực tế. Sau sự kiện hợp nhất, chuỗi beacon trở thành động cơ đồng thuận cho toàn bộ dữ liệu mạng lưới, bao gồm giao dịch lớp xác thực và số dư tài khoản.
-Sự kiện hợp nhất đại diện cho sự hoán đổi hính thức sử dụng chuỗi Beacon như một động cơ sản xuất khối. Việc đào đã không còn sinh ra khối nữa. Thay vào đó, nút xác thực bằng chứng công việc đảm nhận vai trò này và chịu trách nhiệm xử lí mọi giao dịch và đề xuất khối.
+Sự kiện hợp nhất đại diện cho sự hoán đổi chính thức sử dụng chuỗi Beacon như một động cơ sản xuất khối. Việc đào đã không còn sinh ra khối nữa. Thay vào đó, nút xác thực bằng chứng cổ phần đảm nhận vai trò này và chịu trách nhiệm xử lí mọi giao dịch và đề xuất khối.
Không có dữ liệu lịch sử nào bị mất trong sự kiện hợp nhất. Khi mạng chính hợp nhất với chuỗi Beacon, nó cũng hợp nhất toàn bộ lịch sử giao dịch của Ethereum.
@@ -51,7 +51,7 @@ Quá trình chuyển đổi sang bằng chứng cổ phần này đã thay đổ
_Điều này cần được nhắc lại_: Là người dùng hoặc người nắm giữ ETH hay bất kỳ tài sản kỹ thuật số nào khác trên Ethereum, cũng như những người đặt cược không vận hành nút, **bạn không cần phải làm bất cứ điều gì với tiền hoặc ví của mình để chuẩn bị cho The Merge.** ETH vẫn là ETH. Không có khái niệm "ETH cũ / ETH mới" hay "ETH1 / ETH2" và ví vẫn hoạt động như cũ sau sự kiện hợp nhất — ai đó nói khác đi thì họ có thể là lừa đảo.
-Mặc dù chuyển khỏi cơ chế bằng chứng công việc, taonf bộ lịch sử từ khởi nguyên của Ethereum vẫn còn đó không bị ảnh hưởng bởi việc chuyển sang bằng chứng cổ phần. Bất kỳ tài sản nào được giữ trong ví của bạn trước sự kiện hợp nhất vẫn có thể truy cập sau sự kiện hợp nhất. **Không đòi hỏi bất kì hành động nào để nâng cấp từ bạn.**
+Mặc dù chuyển khỏi cơ chế bằng chứng công việc, toàn bộ lịch sử từ khởi nguyên của Ethereum vẫn còn đó không bị ảnh hưởng bởi việc chuyển sang bằng chứng cổ phần. Bất kỳ tài sản nào được giữ trong ví của bạn trước sự kiện hợp nhất vẫn có thể truy cập sau sự kiện hợp nhất. **Không đòi hỏi bất kì hành động nào để nâng cấp từ bạn.**
[Thông tin thêm về bảo mật Ethereum](/security/#eth2-token-scam)
@@ -105,7 +105,7 @@ Sự kiện hợp nhất thay đổi cơ chế đồng thuận, cũng đồng ng
định nghĩa đầu chuỗi an toàn(Safe Head) và khối được chốt (Finalized Block)
-Đây là một số thông tin thêm, hãy xem thêm bài viết của Tim Beiko về Các mà sự kiện hợp nhất tác động lên lớp ứng dụng của Ethereum.
+Đây là một số thông tin thêm, hãy xem thêm bài viết của Tim Beiko về Cách mà sự kiện hợp nhất tác động lên lớp ứng dụng của Ethereum.
## The Merge và mức tiêu thụ năng lượng {#merge-and-energy}
@@ -128,9 +128,9 @@ Nút có thể đề xuất khối là một con số nhỏ trong tổng số n
Các nút khác trên mạng (tức là phần lớn) không bắt buộc phải cam kết bất kỳ nguồn lực kinh tế nào ngoài một máy tính cấp tiêu dùng có dung lượng lưu trữ khả dụng 1-2 TB và kết nối internet. Các nút này không đề xuất khối, nhưng vẫn đóng vai trò then chốt trong việc bảo mật mạng lưới bằng cách giám sát tất cả những người đề xuất khối bằng cách theo dõi các khối mới và xác minh tính hợp lệ của chúng ngay khi xuất hiện theo quy tắc đồng thuận của mạng. Nếu một khối hợp lệ, nút sẽ tiếp tục phát tán nó trên mạng lưới. Nếu khối không hợp lệ vì bất kì lý do, phần mềm trên nút sẽ loại bỏ nó là ngừng phát tán.
-Việc vận hành một nút không đề xuất là khả thi cho mọi người thực hiện dù cho là theo cơ chế đồng thuận nào (đồng thuận công việc hay đồng thuận cổ phần); điều này rất khuyến nghị cho mọi người dùng nếu họ có nguồn lực. Vận hành nốt đóng góp giá trị to lớn với Ethereum và mang lại lợi ích cho cá nhân vận hành, chẳng hạng như tăng cường bảo mật, riêng tư và chống kiểm duyệt.
+Việc vận hành một nút không đề xuất là khả thi cho mọi người thực hiện dù cho là theo cơ chế đồng thuận nào (đồng thuận công việc hay đồng thuận cổ phần); điều này rất khuyến nghị cho mọi người dùng nếu họ có nguồn lực. Vận hành nút đóng góp giá trị to lớn với Ethereum và mang lại lợi ích cho cá nhân vận hành, chẳng hạn như tăng cường bảo mật, riêng tư và chống kiểm duyệt.
-Khả năng để bất kì ai chạy node của họ là thực sự cần thiết để duy trì tính tập trung mạng Ethereum.
+Khả năng để bất kì ai chạy node của họ là thực sự cần thiết để duy trì tính phi tập trung mạng Ethereum.
[Thông tin thêm về việc chạy nút của riêng bạn](/run-a-node/)
@@ -139,7 +139,7 @@ Khả năng để bất kì ai chạy node của họ là thực sự cần
title="Quan niệm sai lầm: "The Merge đã không làm giảm phí gas.""
contentPreview="Sai. The Merge là một sự thay đổi về cơ chế đồng thuận, không phải là một sự mở rộng về dung lượng mạng, và chưa bao giờ có mục đích làm giảm phí gas.">
-Phí Gas là kết quả của nhu cầu mạng so với năng lực xử lý của mạng. The Mere đã loại bỏ sử dụng bằng chứng công việc, chuyển sang cơ chế đồng thuận bằng chứng cổ phần nhưng không làm thay đổi đáng kể tới bất kì tham số nào ảnh hưởng đến năng lực hoặc thông lượng mạng lưới.
+Phí Gas là kết quả của nhu cầu mạng so với năng lực xử lý của mạng. The Merge đã loại bỏ sử dụng bằng chứng công việc, chuyển sang cơ chế đồng thuận bằng chứng cổ phần nhưng không làm thay đổi đáng kể tới bất kì tham số nào ảnh hưởng đến năng lực hoặc thông lượng mạng lưới.
Với lộ trình tập trung vào rollup, các nỗ lực đang được tập trung vào việc mở rộng hoạt động của người dùng ở [lớp 2](/layer-2/), đồng thời cho phép Mạng chính lớp 1 hoạt động như một lớp thanh toán phi tập trung an toàn được tối ưu hóa để lưu trữ dữ liệu rollup nhằm giúp các giao dịch rollup rẻ hơn theo cấp số nhân. Sự chuyển đổi sang cơ chế bằng chứng cổ phần là một bước tiền đề quan trọng để thực hiện hóa điều này. [Thông tin thêm về gas và phí.](/developers/docs/gas/)
@@ -172,9 +172,9 @@ Kể từ khi bản nâng cấp Shanghai/Capella cho phép rút tiền, các tr
Lưu ý quan trọng ở đây là việc thoát vận hành nút hoàn toàn bị giới hạn tốc độ bởi giao thức, và chỉ có một số lượng nhất định nút xác thực có thể thoát trong mỗi chu kỳ (khoảng 6,4 phút). Giới hạn này biến đổi tùy theo số lượng nút xác thực đang hoạt động, nhưng trung bình khoảng 0,33% tổng số tất cả ETH đã Stake trên mạng lưới có thể thoát mạng trong một ngày.
-Đều này ngăn chặn việc rút Stake hàng loạt. Hơn nữa, cơ chế này ngăn chặn một kẻ tấn công tiềm năng (có thể đang kiểm soát một phần lớn tổng ETH Stake trên toàn bộ mạng) khỏi thực hiện hành vi vi phạm có thể bị cắt quỹ (Slashing) rồi thoát ra/rút toàn bộ số dư của các nút xác thực vi phạm đó trong cùng một chu kỳ, trước khi giao thức kịp áp dụng hình phạt cắt quỹ.
+Điều này ngăn chặn việc rút Stake hàng loạt. Hơn nữa, cơ chế này ngăn chặn một kẻ tấn công tiềm năng (có thể đang kiểm soát một phần lớn tổng ETH Stake trên toàn bộ mạng) khỏi thực hiện hành vi vi phạm có thể bị cắt quỹ (Slashing) rồi thoát ra/rút toàn bộ số dư của các nút xác thực vi phạm đó trong cùng một chu kỳ, trước khi giao thức kịp áp dụng hình phạt cắt quỹ.
-Lợi nhuận hằng năm cũng biến đổi có mục đích, cho phép thị trường vận hành nút xác thực cân bằng giữa việc họ sẽ chịu chi trả bao nhiêu để giúp bảo mật mạng lưới. Nếu như tỉ lệ này quá thấp thì nút xác thực sẽ thoát ra tuân theo tỉ lệ của giao thức. Dần dần điều này sẽ tăng lợi nhuận hằng năm cho những gnuoiwf ở lại, thu hút người mới hoặc người đã Stake trước đó.
+Lợi nhuận hằng năm cũng biến đổi có mục đích, cho phép thị trường vận hành nút xác thực cân bằng giữa việc họ sẽ chịu chi trả bao nhiêu để giúp bảo mật mạng lưới. Nếu như tỉ lệ này quá thấp thì nút xác thực sẽ thoát ra tuân theo tỉ lệ của giao thức. Dần dần điều này sẽ tăng lợi nhuận hằng năm cho những người ở lại, thu hút người mới hoặc người đã Stake trước đó.
## Chuyện gì đã xảy ra với 'Eth2'? {#eth2}
@@ -192,7 +192,7 @@ Những thuật ngữ mới này chỉ thay đổi quy ước đặt tên; nó k
## Mối quan hệ giữa các bản nâng cấp {#relationship-between-upgrades}
-Các bản nâng cấp Ethereum đều có liên hệ với nhau. Vậy cùng nhau tóm lượng về những nâng cấp liên hệ như thế nào với sự kiện hợp nhất.
+Các bản nâng cấp Ethereum đều có liên hệ với nhau. Vậy cùng nhau tóm lược về những nâng cấp liên hệ như thế nào với sự kiện hợp nhất.
### The Merge và Chuỗi Hải Đăng {#merge-and-beacon-chain}
@@ -212,9 +212,9 @@ Thay vào đó khối được đề xuất bởi các nút xác thực đã Sta
### The Merge và sharding {#merge-and-data-sharding}
-Bạn đầu, kế hoạch là sẽ tập trung vào phân đoạn (Sharding) trước sự kiện hợp nhất để giúp mở rộng. Tuy nhiên, với sự bùng nổ của các [giải pháp mở rộng quy mô lớp 2](/layer-2/), ưu tiên đã chuyển sang việc hoán đổi bằng chứng công việc sang bằng chứng cổ phần trước.
+Ban đầu, kế hoạch là sẽ tập trung vào phân đoạn (Sharding) trước sự kiện hợp nhất để giúp mở rộng. Tuy nhiên, với sự bùng nổ của các [giải pháp mở rộng quy mô lớp 2](/layer-2/), ưu tiên đã chuyển sang việc hoán đổi bằng chứng công việc sang bằng chứng cổ phần trước.
-Kế hoạch cho phân đoạn đang tiến triển nahnh, nhưng do sự thành công của công nghệ lớp 2 để mở rộng xử lí giao dịch, kế hoạch phân đoạn đã chuyển sang tìm giải pháp tốt nhất để có thể dữ trữ dữ liệu từ hợp đồng Rollups (Calldata), cho phép sự tăng trưởng tăng vọt của sức chứa mạng lưới. Đều này sẽ bất khả thi nếu không chuyển sang cơ chế bằng chứng cổ phần trước.
+Kế hoạch cho phân đoạn đang tiến triển nhanh, nhưng do sự thành công của công nghệ lớp 2 để mở rộng xử lí giao dịch, kế hoạch phân đoạn đã chuyển sang tìm giải pháp tốt nhất để có thể dự trữ dữ liệu từ hợp đồng Rollups (Calldata), cho phép sự tăng trưởng tăng vọt của sức chứa mạng lưới. Điều này sẽ bất khả thi nếu không chuyển sang cơ chế bằng chứng cổ phần trước.
Sharding
diff --git a/public/content/translations/vi/roadmap/merge/issuance/index.md b/public/content/translations/vi/roadmap/merge/issuance/index.md
index 7d4ccb68216..cc5d79565da 100644
--- a/public/content/translations/vi/roadmap/merge/issuance/index.md
+++ b/public/content/translations/vi/roadmap/merge/issuance/index.md
@@ -1,12 +1,12 @@
---
-title: "Làm thế nào để hợp nhất những ảnh hưởng được được ETH cung cấp"
+title: "The Merge đã tác động đến nguồn cung ETH như thế nào"
description: "Phân tích về cách Hợp nhất ảnh hưởng đến nguồn cung ETH"
lang: vi
---
# The Merge đã tác động đến nguồn cung ETH như thế nào {#how-the-merge-impacts-ETH-supply}
-The Mere (sự kiện hợp nhất) đánh dấu sự chuyển đổi của mạng lưới Ethereum từ cơ chế bằng chứng công việc sang bằng chứng cổ phần, diễn ra vào tháng 9 năm 2022. Cách ETH được phát hành đã có sự thay đổi vào thời điểm chuyển đổi đó. Trước đây, ETH mới được phát hành từ hai nguồn: lớp thực thi (tức là Mạng chính) và lớp đồng thuận (tức là Chuỗi Hải Đăng). Kể từ khi sự kiện hợp nhất diễn ra, đã không còn việc phát hành ở lớp thực thi. Hãy cùng phân tích chi tiết điều này.
+The Merge (sự kiện hợp nhất) đánh dấu sự chuyển đổi của mạng lưới Ethereum từ cơ chế bằng chứng công việc sang bằng chứng cổ phần, diễn ra vào tháng 9 năm 2022. Cách ETH được phát hành đã có sự thay đổi vào thời điểm chuyển đổi đó. Trước đây, ETH mới được phát hành từ hai nguồn: lớp thực thi (tức là Mạng chính) và lớp đồng thuận (tức là Chuỗi Hải Đăng). Kể từ khi sự kiện hợp nhất diễn ra, đã không còn việc phát hành ở lớp thực thi. Hãy cùng phân tích chi tiết điều này.
## Các thành phần của việc phát hành ETH {#components-of-eth-issuance}
@@ -33,9 +33,9 @@ Dưới cơ chế bằng chứng công việc, các thợ đào chỉ tương t
### Phát hành ở lớp đồng thuận {#cl-issuance-pre-merge}
-[Chuỗi Hải Đăng](/ethereum-forks/#beacon-chain-genesis) đã đi vào hoạt động vào năm 2020. Thay vì thợ đào, nó được bảo mật bởi các nốt xác thực sử dụng cơ chế bằng chứng cổ phần. Chuỗi này được khởi tạo bởi người dùng Ethereum gửi ETH một chiều vào hợp đồng thông minh trên mạng chính (lớp thực thi), mà chuỗi Beacon sẽ theo dõi và ghi nhận cho người dùng một lượng ETH tương ứng trên chuỗi mới. Cho đến khi sự kiện hợp nhất diễn ra, các nốt xác thực trên chuỗi Beacon chưa xử lý giao dịch mà về cơ bản chỉ đạt đồng thuận về trạng thái của chính quỹ nốt xác thực.
+[Chuỗi Hải Đăng](/ethereum-forks/#beacon-chain-genesis) đã đi vào hoạt động vào năm 2020. Thay vì thợ đào, nó được bảo mật bởi các nút xác thực sử dụng cơ chế bằng chứng cổ phần. Chuỗi này được khởi tạo bởi người dùng Ethereum gửi ETH một chiều vào hợp đồng thông minh trên mạng chính (lớp thực thi), mà chuỗi Beacon sẽ theo dõi và ghi nhận cho người dùng một lượng ETH tương ứng trên chuỗi mới. Cho đến khi sự kiện hợp nhất diễn ra, các nút xác thực trên chuỗi Beacon chưa xử lý giao dịch mà về cơ bản chỉ đạt đồng thuận về trạng thái của chính quỹ nút xác thực.
-Các nốt xác thực trên chuỗi Beacon được thưởng ETH khi xác nhận trạng thái của chuỗi và đề xuất khối. Phần thưởng (hoặc hình phạt) được tính toán và phân phối ở mỗi chu kỳ (Epoch - mỗi 6,4 phút), dựa trên hiệu suất hoạt động của nút xác thực. Phần thưởng của trình xác thực **ít hơn đáng kể** so với phần thưởng đào được phát hành trước đây theo bằng chứng công việc (2 ETH mỗi ~13,5 giây), vì việc vận hành một nút xác thực không tốn kém về mặt kinh tế và do đó không yêu cầu hoặc đảm bảo phần thưởng cao như vậy.
+Các nút xác thực trên chuỗi Beacon được thưởng ETH khi xác nhận trạng thái của chuỗi và đề xuất khối. Phần thưởng (hoặc hình phạt) được tính toán và phân phối ở mỗi chu kỳ (Epoch - mỗi 6,4 phút), dựa trên hiệu suất hoạt động của nút xác thực. Phần thưởng của trình xác thực **ít hơn đáng kể** so với phần thưởng đào được phát hành trước đây theo bằng chứng công việc (2 ETH mỗi ~13,5 giây), vì việc vận hành một nút xác thực không tốn kém về mặt kinh tế và do đó không yêu cầu hoặc đảm bảo phần thưởng cao như vậy.
### Phân tích chi tiết việc phát hành trước The Merge {#pre-merge-issuance-breakdown}
diff --git a/public/content/translations/vi/roadmap/pbs/index.md b/public/content/translations/vi/roadmap/pbs/index.md
index 8a9326e5a7b..6a8942f5dfc 100644
--- a/public/content/translations/vi/roadmap/pbs/index.md
+++ b/public/content/translations/vi/roadmap/pbs/index.md
@@ -14,7 +14,7 @@ Các trình xác thực Ethereum ngày nay tạo _và_ phát sóng các khối.
Việc tách riêng người xây và người đề xuất khối khiến việc kiểm duyệt giao dịch trở nên khó khăn hơn nhiều với người xây. Bởi vì có thể thêm những tiêu chí kiểm tra phức tạp để đảm bảo rằng không có giao dịch nào bị kiểm duyệt trước khi khối được đề xuất. Vì người đề xuất khối là một thực thể tách biệt khỏi người xây, nên họ có thể đóng vai trò người bảo vệ, chống lại các người xây có ý định kiểm duyệt.
-Ví dụ, có thể đưa vào danh sách bắt buộc để khi nút xác thực biết về các giao dịch nhưng không thấy chúng được đưa vào khoois, họ có thể buộc chúng phải có trong khối tiếp theo. Danh sách bắt buộc được tạo từ bộ nhớ tạm cục bộ của người đề xuất khối (danh sách các giao dịch mà nó biết đến) và được gửi cho các nút ngang hàng ngay trước khi khối được đề xuất. Nếu bất kỳ giao dịch nào trong danh sách bị thiếu, người đề xuất có thể: từ chối khối, thêm các giao dịch bị thiếu trước khi đề xuất, hoặc đề xuất khốiđó và để nó bị từ chối bởi các nút khác khi họ nhận được. Ngoài ra, còn có một phiên bản tiềm năng hiệu quả hơn của ý tưởng này, theo đó người xây bắt buộc phải tận dụng toàn bộ dung lượng khối khả dụng, và nếu họ không làm thì các giao dịch sẽ được thêm từ danh sách bắt buộc của người đề xuất. Đây vẫn là một lĩnh vực nghiên cứu đang diễn ra, và cấu hình tối ưu cho danh sách bắt buộc vẫn chưa được xác định.
+Ví dụ, có thể đưa vào danh sách bắt buộc để khi nút xác thực biết về các giao dịch nhưng không thấy chúng được đưa vào khối, họ có thể buộc chúng phải có trong khối tiếp theo. Danh sách bắt buộc được tạo từ bộ nhớ tạm cục bộ của người đề xuất khối (danh sách các giao dịch mà nó biết đến) và được gửi cho các nút ngang hàng ngay trước khi khối được đề xuất. Nếu bất kỳ giao dịch nào trong danh sách bị thiếu, người đề xuất có thể: từ chối khối, thêm các giao dịch bị thiếu trước khi đề xuất, hoặc đề xuất khối đó và để nó bị từ chối bởi các nút khác khi họ nhận được. Ngoài ra, còn có một phiên bản tiềm năng hiệu quả hơn của ý tưởng này, theo đó người xây bắt buộc phải tận dụng toàn bộ dung lượng khối khả dụng, và nếu họ không làm thì các giao dịch sẽ được thêm từ danh sách bắt buộc của người đề xuất. Đây vẫn là một lĩnh vực nghiên cứu đang diễn ra, và cấu hình tối ưu cho danh sách bắt buộc vẫn chưa được xác định.
[Các vùng nhớ giao dịch (mempool) được mã hóa](https://www.youtube.com/watch?v=fHDjgFcha0M&list=PLpktWkixc1gUqkyc1-iE6TT0RWQTBJELe&index=3) cũng có thể khiến những người xây dựng và người đề xuất không thể biết họ đang đưa giao dịch nào vào một khối cho đến khi khối đó đã được phát sóng.
@@ -25,7 +25,7 @@ Các tổ chức quyền lực có thể gây áp lực buộc nút kiểm duy
## PBS và MEV {#pbs-and-mev}
-**Giá trị trích xuất tối đa (MEV)** đề cập đến việc các trình xác thực tối đa hóa lợi nhuận của họ bằng cách sắp xếp các giao dịch một cách có lợi. Các ví dụ phổ biến bao gồm kinh doanh chênh lệch giá các giao dịch hoán đổi trên các sàn giao dịch phi tập trung (ví dụ: chạy trước một lệnh mua hoặc bán lớn) hoặc xác định các cơ hội để thanh lý các vị thế DeFi. Tối ưu MEV đòi hỏi phải có chuyên môn giỏi và phần mềm tùy chỉnh bổ sung cho nút xác thực thông thường, làm cho các tổ chức lớn có khả năng vượt trội hơn cá nhân và dân nghiệp dư trong việc thai khác MEV. Điều này có nghĩa là lợi nhuận từ việc Staking sẽ cao hơn đối với tổ chức tập trung, tạo một thế lực tập trung có thể giảm động lực chạy Staking tại nhà.
+**Giá trị trích xuất tối đa (MEV)** đề cập đến việc các trình xác thực tối đa hóa lợi nhuận của họ bằng cách sắp xếp các giao dịch một cách có lợi. Các ví dụ phổ biến bao gồm kinh doanh chênh lệch giá các giao dịch hoán đổi trên các sàn giao dịch phi tập trung (ví dụ: chạy trước một lệnh mua hoặc bán lớn) hoặc xác định các cơ hội để thanh lý các vị thế DeFi. Tối ưu MEV đòi hỏi phải có chuyên môn giỏi và phần mềm tùy chỉnh bổ sung cho nút xác thực thông thường, làm cho các tổ chức lớn có khả năng vượt trội hơn cá nhân và dân nghiệp dư trong việc khai thác MEV. Điều này có nghĩa là lợi nhuận từ việc Staking sẽ cao hơn đối với tổ chức tập trung, tạo một thế lực tập trung có thể giảm động lực chạy Staking tại nhà.
PBS giúp giải quyết các phần đề này bằng cách tái cấu trúc lại cơ chế kinh tế của MEV. Thay vì người đề xuất khối tự mình tìm kiếm MEV, họ chỉ đơn giản chọn một khối được nhiều người xây đề xuất cho họ. Những người xây khối có thể đã thực hiện khai thác MEV tinh vi, nhưng phần thưởng lại thuộc về các người đề xuất khối. Điều này có nghĩa là khi một nhóm nhỏ người xây khối chuyên biệt thống trị việc khai thác MEV, thì phần thưởng cũng có thể thuộc về bất kì nút xác thực nào trong mạng và gồm cả những người Stake tại nhà.
@@ -36,7 +36,7 @@ Những cá nhân được khuyến khích Stake thông qua nhóm chung (Pool) t
## PBS và Danksharding {#pbs-and-danksharding}
-Danksharding là cách Ethereum sẽ mở rộng quy mô lên >100.000 giao dịch mỗi giây và giảm thiểu phí cho người dùng rollup. Nó dựa trên PBS, bởi vì nó tăng khối lượng công việc cho những người xây khối, những người phải tính toán bằng chứng lên đến 64 MB Rollups trong chưa đầy một giây. Điều này có lẽ sẽ đòi hỏi người xây chuyên biệt, có thể dành phần cứng mạnh mẽ cho công việc này. Tuy nhiên, trong tình hình hiện tại xây dựng khối có thể ngày càng tập trung hơn vào các nhà vận hành tinh vi và mạnh mẽ hơn cũng vì khai thác MEV. Tách người đề xuất và xây khối là một cách để chấp nhận thực tế này, đồng thời ngăn nó gây lực tập trung hóa lên xác thực khối (đây là phần quan trọng) haocjw phân phối phần thưởng Staking. Một lợi ích bên cạch đó là những nhà xây khối chuyên biệt cũng rất sẵn sàng và có khả năng tính toán các bằng chứng dữ liệu cần thiết cho phân đoạn thế hệ mới.
+Danksharding là cách Ethereum sẽ mở rộng quy mô lên >100.000 giao dịch mỗi giây và giảm thiểu phí cho người dùng rollup. Nó dựa trên PBS, bởi vì nó tăng khối lượng công việc cho những người xây khối, những người phải tính toán bằng chứng lên đến 64 MB Rollups trong chưa đầy một giây. Điều này có lẽ sẽ đòi hỏi người xây chuyên biệt, có thể dành phần cứng mạnh mẽ cho công việc này. Tuy nhiên, trong tình hình hiện tại xây dựng khối có thể ngày càng tập trung hơn vào các nhà vận hành tinh vi và mạnh mẽ hơn cũng vì khai thác MEV. Tách người đề xuất và xây khối là một cách để chấp nhận thực tế này, đồng thời ngăn nó gây lực tập trung hóa lên xác thực khối (đây là phần quan trọng) hoặc phân phối phần thưởng Staking. Một lợi ích bên cạnh đó là những nhà xây khối chuyên biệt cũng rất sẵn sàng và có khả năng tính toán các bằng chứng dữ liệu cần thiết cho phân đoạn thế hệ mới.
## Tiến độ hiện tại {#current-progress}
diff --git a/public/content/translations/vi/roadmap/scaling/index.md b/public/content/translations/vi/roadmap/scaling/index.md
index ff0cb7da537..a230b59fd2c 100644
--- a/public/content/translations/vi/roadmap/scaling/index.md
+++ b/public/content/translations/vi/roadmap/scaling/index.md
@@ -7,7 +7,7 @@ alt: "Lộ trình Ethereum"
template: roadmap
---
-Ethereum được mở rộng quy mô bằng cách sử dụng các [lớp 2](/layer-2/#rollups) (còn được gọi là rollup), chúng gộp các giao dịch lại với nhau và gửi kết quả đầu ra đến Ethereum. Mặc dù Rollups rẻ hơn gấp tám lần mạng chính Ethereum, tuy nhiên Optimize Rollups vẫn có thể giảm chi phí cho người dùng nhiều hơn. Rollupss cũng phụ thuộc vào một số thành phần tập trung dẫn đến nhà phát triển có thể loại bỏ khi Rollups hoàn thiện.
+Ethereum được mở rộng quy mô bằng cách sử dụng các [lớp 2](/layer-2/#rollups) (còn được gọi là rollup), chúng gộp các giao dịch lại với nhau và gửi kết quả đầu ra đến Ethereum. Mặc dù Rollups rẻ hơn gấp tám lần mạng chính Ethereum, tuy nhiên Optimize Rollups vẫn có thể giảm chi phí cho người dùng nhiều hơn. Rollups cũng phụ thuộc vào một số thành phần tập trung dẫn đến nhà phát triển có thể loại bỏ khi Rollups hoàn thiện.
diff --git a/public/content/translations/vi/roadmap/single-slot-finality/index.md b/public/content/translations/vi/roadmap/single-slot-finality/index.md
index 9e20d67933f..b4d97794e1c 100644
--- a/public/content/translations/vi/roadmap/single-slot-finality/index.md
+++ b/public/content/translations/vi/roadmap/single-slot-finality/index.md
@@ -14,7 +14,7 @@ Cơ chế bằng chứng cổ phần nền tảng của Ethereum, chốt chuỗi
## Tại sao lại muốn chốt chuỗi (Finality) nhanh hơn? {#why-aim-for-quicker-finality}
-Thời gian hiện tại quá lâu để có thể chốt chuỗi. Hầu hết người dùng không muốn chờ 15 phút chỉ để chốt chuỗi, và nó gây bất tiện cho các ứng dụng và sàn giao dịch muốn thông lượng giao dịch vào phải chờ quá lâu để một vài giao dịch của họ được ghi vào chuỗi khối. Việc có độ trễ giữa lúc đề xuất và chốt khối cũng tạo cơ hội cho cuộc tấn công tái tổ chức chuỗi ngắn (Short Reorg), mà kẻ tấn công có thể lợi dụng để kiểm duyệt một số khối hoặc trích xuất MEV (giá trị trích xuất tối đa). Cơ chế xử lý việc nâng cấp khối theo từng giai đoạn cũng khá phức tạp và đã được vá lỗi nhiều lần để khắc phục lỗ hổng bảo mật, khiến nó trở thành phần mã nguồn Ethereum mà có thể xảy ra các lỗi tinh vi. Những vấn đề này có thể được loại bỏ khi thời gian chốt chuỗi đưcọ hoàn thành trong 1 Slot.
+Thời gian hiện tại quá lâu để có thể chốt chuỗi. Hầu hết người dùng không muốn chờ 15 phút chỉ để chốt chuỗi, và nó gây bất tiện cho các ứng dụng và sàn giao dịch muốn thông lượng giao dịch vào phải chờ quá lâu để một vài giao dịch của họ được ghi vào chuỗi khối. Việc có độ trễ giữa lúc đề xuất và chốt khối cũng tạo cơ hội cho cuộc tấn công tái tổ chức chuỗi ngắn (Short Reorg), mà kẻ tấn công có thể lợi dụng để kiểm duyệt một số khối hoặc trích xuất MEV (giá trị trích xuất tối đa). Cơ chế xử lý việc nâng cấp khối theo từng giai đoạn cũng khá phức tạp và đã được vá lỗi nhiều lần để khắc phục lỗ hổng bảo mật, khiến nó trở thành phần mã nguồn Ethereum mà có thể xảy ra các lỗi tinh vi. Những vấn đề này có thể được loại bỏ khi thời gian chốt chuỗi được hoàn thành trong 1 Slot.
## Sự đánh đổi giữa tính phi tập trung / thời gian / chi phí chung {#the-decentralization-time-overhead-tradeoff}
@@ -22,7 +22,7 @@ Thời gian hiện tại quá lâu để có thể chốt chuỗi. Hầu hết n
Thời gian để chốt càng ngắn thì mỗi nút cần nhiều sức mạnh tính toán hơn, vì phải sử lý sự xác thực phải diễn ra nhanh hơn. Ngoài ra, càng có nhiều nút xác thực trong mạng, thì mỗi khối càng có nhiều sự xác thực cần phải xử lý, lại càng làm tăng yêu câu về sức mạnh tính toán. Đòi hỏi sức mạnh tính toán càng lớn thì càng ít người có thể tham gia, vì phần cứng máy tính mắc tiền hơn để chạy một nút xác thực. Việc tăng thời gian giữa các khối sẽ làm giảm nhu cầu về sức mạnh tính toán giữa mỗi nút, nhưng đồng thời cũng kéo dài thời gian chốt, bởi vì sự chứng thực được xử lí chậm hơn.
-Vì thế, sự đánh đổi giữa chi phí vận hành (sức mạnh tính toán), phi tập trung (số lượng nút có thể tham gia trong chuỗi xác thực và thời gian để chốt chuỗi. Hệ thống lý tưởng sẽ cân bằng được: sức mạnh tính toán mức tối thiếu, mức độ phi tập trung tối đa và thời gian chốt chuỗi tối thiểu.
+Vì thế, sự đánh đổi giữa chi phí vận hành (sức mạnh tính toán), phi tập trung (số lượng nút có thể tham gia trong chuỗi xác thực và thời gian để chốt chuỗi. Hệ thống lý tưởng sẽ cân bằng được: sức mạnh tính toán mức tối thiểu, mức độ phi tập trung tối đa và thời gian chốt chuỗi tối thiểu.
Cơ chế đồng thuận hiện tại của Ethereum cân bằng giữa ba yếu tố này bằng cách:
@@ -50,7 +50,7 @@ Tuy nhiên, việc xác minh không phải là nút nghẽn cổ chai thực s
## Vai trò của quy tắc chọn nhánh trong SSF là gì? Vai trò của quy tắc lựa chọn phân nhánh {#role-of-the-fork-choice-rule}
-Cơ chế đồng thuận hiện tại dựa trên sự gắn kết chặt chẽ giữa cơ chế chốt chuỗi (thuật toán xác định liệu 2/3 nút đã chứng thực cho một chuỗi nhất định hay chưa) và quy tắc chọn nhánh (thuật toán quyết định chuỗi nào là đúng khi có nhiều lựa chọn). Thuật toán lựa chọn phân nhánh chỉ xem xét các khối _kể từ_ khối được hoàn tất sau cùng. Trong SSF sẽ không có khói nào để quy tắc chọn chỗi cân nhắc, bởi vì việc chốt diễn ra trong cùng Slot khi khối được đề xuất. Điều này có nghĩa là trong SSF, tại bất kỳ thời điểm nào, _hoặc là_ thuật toán lựa chọn phân nhánh _hoặc là_ tiện ích hoàn tất sẽ hoạt động. Cơ chế chốt sẽ chốt các khối trong trường hợp có 2/3 nút xác thực trực tuyến và chứng thực trung thực. Nếu một khối không thể vượt qua ngưỡng 2/3, thì quy tắc chọn chuỗi sẽ được kích hoạt để quyết định chọn chuỗi nào. Điều này cũng tạo cơ hội để duy trì cơ chế rò rỉ do không hoạt động, giúp khôi phục chuỗi khi >1/3 người xác thực ngoại tuyến, dù có thêm một số điểm khác biệt nhỏ.
+Cơ chế đồng thuận hiện tại dựa trên sự gắn kết chặt chẽ giữa cơ chế chốt chuỗi (thuật toán xác định liệu 2/3 nút đã chứng thực cho một chuỗi nhất định hay chưa) và quy tắc chọn nhánh (thuật toán quyết định chuỗi nào là đúng khi có nhiều lựa chọn). Thuật toán lựa chọn phân nhánh chỉ xem xét các khối _kể từ_ khối được hoàn tất sau cùng. Trong SSF sẽ không có khối nào để quy tắc chọn chỗi cân nhắc, bởi vì việc chốt diễn ra trong cùng Slot khi khối được đề xuất. Điều này có nghĩa là trong SSF, tại bất kỳ thời điểm nào, _hoặc là_ thuật toán lựa chọn phân nhánh _hoặc là_ tiện ích hoàn tất sẽ hoạt động. Cơ chế chốt sẽ chốt các khối trong trường hợp có 2/3 nút xác thực trực tuyến và chứng thực trung thực. Nếu một khối không thể vượt qua ngưỡng 2/3, thì quy tắc chọn chuỗi sẽ được kích hoạt để quyết định chọn chuỗi nào. Điều này cũng tạo cơ hội để duy trì cơ chế rò rỉ do không hoạt động, giúp khôi phục chuỗi khi >1/3 người xác thực ngoại tuyến, dù có thêm một số điểm khác biệt nhỏ.
## Các vấn đề còn tồn đọng {#outstanding-issues}
diff --git a/public/content/translations/vi/roadmap/verkle-trees/index.md b/public/content/translations/vi/roadmap/verkle-trees/index.md
index a0afae0673f..cc675f0bcd7 100644
--- a/public/content/translations/vi/roadmap/verkle-trees/index.md
+++ b/public/content/translations/vi/roadmap/verkle-trees/index.md
@@ -17,12 +17,12 @@ Cây Verkle là một bước quan trọng trên con đường Client Ethereum k
-Client Ethereum hiện tại sử dụng cấu trúc dữ liệu được biết đến là cây Merkle-Patricia để chứa dữ liệu trạng thái của nó. Thông tin về mỗi tài khoản được lưu trữ như một lá của một nhánh và một đôi lá được băm liên tục cho đến khi còn một hàm băm thôi. Kết quả băm cuối cùng này được gọi là "Rễ" (Root). Để xác thực một khối, Client Ethereum thực thi tất cả giao dịch trong một khối và nâng cấp trạng thái của nhánh cục bộ. Khối được xem là hợp lệ nếu như rễ của cây cục bộ đồng với kết quả cung cấp bởi người đề xuất khối, bởi vì nếu có bất kì những thay đổi trong tính toán bởi người đề xuất khối và xác thực khối sẽ khiến cho hàm băm rễ khác nhau hoàn toàn. Vấn đề là việc xác thực chuỗi khối này cần mỗi Client lưu trữ toàn bộ trạng thái nhánh của đầu khói và một và khối trước đó (mặc định trong Geth là giữ trạng thái của 128 khối trước đầu chuỗi). Điều này đòi hỏi Client phải có truy cập vào một lượng ổ cứng lớn, là một rào cản cho việc chạy nút toàn bộ rẻ, với phần cứng yếu. Một giải pháp cho vấn đề này là cập nhật cây trạng thái sang một cấu trúc hiệu quả hơn (cây Verkle) có thể được tóm gọn bằng một “tập dữ liệu chứng minh” nhỏ để chia sẻ thay cho toàn bộ dữ liệu trạng thái. Việc định dạng lại dữ liệu trạng thái thành một cây Verkle là bước đệm để tiến tới các Client không trạng thái.
+Client Ethereum hiện tại sử dụng cấu trúc dữ liệu được biết đến là cây Merkle-Patricia để chứa dữ liệu trạng thái của nó. Thông tin về mỗi tài khoản được lưu trữ như một lá của một nhánh và một đôi lá được băm liên tục cho đến khi còn một hàm băm thôi. Kết quả băm cuối cùng này được gọi là "Rễ" (Root). Để xác thực một khối, Client Ethereum thực thi tất cả giao dịch trong một khối và nâng cấp trạng thái của nhánh cục bộ. Khối được xem là hợp lệ nếu như rễ của cây cục bộ đồng với kết quả cung cấp bởi người đề xuất khối, bởi vì nếu có bất kì những thay đổi trong tính toán bởi người đề xuất khối và xác thực khối sẽ khiến cho hàm băm rễ khác nhau hoàn toàn. Vấn đề là việc xác thực chuỗi khối này cần mỗi Client lưu trữ toàn bộ trạng thái nhánh của đầu khối và một và khối trước đó (mặc định trong Geth là giữ trạng thái của 128 khối trước đầu chuỗi). Điều này đòi hỏi Client phải có truy cập vào một lượng ổ cứng lớn, là một rào cản cho việc chạy nút toàn bộ rẻ, với phần cứng yếu. Một giải pháp cho vấn đề này là cập nhật cây trạng thái sang một cấu trúc hiệu quả hơn (cây Verkle) có thể được tóm gọn bằng một “tập dữ liệu chứng minh” nhỏ để chia sẻ thay cho toàn bộ dữ liệu trạng thái. Việc định dạng lại dữ liệu trạng thái thành một cây Verkle là bước đệm để tiến tới các Client không trạng thái.
-## Tập dữ liệu chứng minh là gì tại sao chúng ta cần chúng? {#what-is-a-witness}
+## Tập dữ liệu chứng minh là gì và tại sao chúng ta cần chúng? {#what-is-a-witness}
-Xác minh một khối đồng nghĩa với việc thực thi lại giao dịch chứa trong khói, áp dụng để thay đổi trạng thái cây Ethereum, và tình toán hàm băm rễ mới. Một khối được xác minh là khối có giá trị băm của trạng thái rễ được tính toán trùng khớp với giá trị được cung cấp cùng với khối (bởi vì điều này có nghĩa là người đề xuất khối thật sự đã thực hiện phép tính mà họ tuyên bố). Trong Client Ethereum ngày nay, việc cập nhật trạng thái đòi hỏi truy cập cả cây trạng thái, một cấu trúc dữ liệu lớn cần được lưu trữ cục bộ. Một tập dữ liệu chứng minh chỉ chứa các phần của dữ liệu trạng thái cần thiết để thực thi các giao dịch trong khối. Một nút xác thực có thể sử dụng các phần này để xác thực rằng người đề xuất khối đã thực hiện giao dịch hkoois và cập nhật trạng thái đúng. Tuy nhiên, điều này có nghĩa là tập dữ liệu chứng minh cần được truyền giữa các bên ngang hàng trong mạng Ethereum đủ nhanh để mỗi nút nhận và xử lí kịp trong 12 giây của một Slot. Nếu trạng thái tập dữ liệu chứng minh quá lớn, nó sẽ khiến một số nút xác thực quá chậm trong việc tải và bắt kịp với chuỗi. Điều này làm tập trung hóa, bởi vì có nghĩa là những nút có kết nối internet nhanh mới có thể tham gia xác thực khối. Với cây Verkle, không cần phải lưu trữ trạng thái trên ổ cứng của bạn; _mọi thứ_ bạn cần để xác minh một khối đều được chứa trong chính khối đó. Không may là tập dữ liệu chứng minh được tạo từ cây Merkle trả lại kết quả quá lớn đẻ hỗ trợ cho Client không trạng thái.
+Xác minh một khối đồng nghĩa với việc thực thi lại giao dịch chứa trong khối, áp dụng để thay đổi trạng thái cây Ethereum, và tính toán hàm băm rễ mới. Một khối được xác minh là khối có giá trị băm của trạng thái rễ được tính toán trùng khớp với giá trị được cung cấp cùng với khối (bởi vì điều này có nghĩa là người đề xuất khối thật sự đã thực hiện phép tính mà họ tuyên bố). Trong Client Ethereum ngày nay, việc cập nhật trạng thái đòi hỏi truy cập cả cây trạng thái, một cấu trúc dữ liệu lớn cần được lưu trữ cục bộ. Một tập dữ liệu chứng minh chỉ chứa các phần của dữ liệu trạng thái cần thiết để thực thi các giao dịch trong khối. Một nút xác thực có thể sử dụng các phần này để xác thực rằng người đề xuất khối đã thực hiện giao dịch khối và cập nhật trạng thái đúng. Tuy nhiên, điều này có nghĩa là tập dữ liệu chứng minh cần được truyền giữa các bên ngang hàng trong mạng Ethereum đủ nhanh để mỗi nút nhận và xử lí kịp trong 12 giây của một Slot. Nếu trạng thái tập dữ liệu chứng minh quá lớn, nó sẽ khiến một số nút xác thực quá chậm trong việc tải và bắt kịp với chuỗi. Điều này làm tập trung hóa, bởi vì có nghĩa là những nút có kết nối internet nhanh mới có thể tham gia xác thực khối. Với cây Verkle, không cần phải lưu trữ trạng thái trên ổ cứng của bạn; _mọi thứ_ bạn cần để xác minh một khối đều được chứa trong chính khối đó. Không may là tập dữ liệu chứng minh được tạo từ cây Merkle trả lại kết quả quá lớn để hỗ trợ cho Client không trạng thái.
## Tại sao cây Verkle lại cần tập dữ liệu chứng minh nhỏ hơn nữa? {#why-do-verkle-trees-enable-smaller-witnesses}
diff --git a/public/content/translations/vi/staking/pools/index.md b/public/content/translations/vi/staking/pools/index.md
index 7cf9dc205ea..b14e0480ab3 100644
--- a/public/content/translations/vi/staking/pools/index.md
+++ b/public/content/translations/vi/staking/pools/index.md
@@ -8,7 +8,7 @@ image: /images/staking/leslie-pool.png
alt: "Chú tê giác Leslie đang bơi trong bể."
sidebarDepth: 2
summaryPoints:
- - Đặc 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
+ - Đặ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
- Bỏ qua phần phức tạp và giao phó việc điều hành nút xác thực cho bên thứ ba
- Giữ các token đã góp trong ví riêng
---
diff --git a/src/intl/vi/glossary-tooltip.json b/src/intl/vi/glossary-tooltip.json
index b84e7f61e97..18dbddb3b8c 100644
--- a/src/intl/vi/glossary-tooltip.json
+++ b/src/intl/vi/glossary-tooltip.json
@@ -1,6 +1,6 @@
{
"51%-attack-term": "tấn công 51%",
- "51%-attack-definition": "Một loại tấn công mà một nhóm chiếm quyền kiểm soát phần lớn nút. Điều này sẽ cho phép họ gian lận blockchain bằng cách đảo ngược giao dịch và chi tiêu gấp đôi ether và các mã thông báo khác.",
+ "51%-attack-definition": "Một loại tấn công mà một nhóm chiếm quyền kiểm soát phần lớn nút. Điều này sẽ cho phép họ gian lận blockchain bằng cách đảo ngược giao dịch và chi tiêu gấp đôi ether và các token khác.",
"abi-term": "Giao diện nhị phân ứng dụng (ABI)",
"abi-definition": "Một tệp JSON xác định các hàm và biến có trong một hợp đồng thông minh. ABI cho phép mã bytecode được ánh xạ sang các định dạng mà con người có thể đọc được.",
"account-term": "Tài khoản",
@@ -87,7 +87,7 @@
"key-definition": "Trong bối cảnh Ethereum, khóa (Key) là các mã số điện tử: khóa công khai (Public Key) để nhận giao dịch và khóa riêng tư (Private Key) để truy cập và gửi tài sản.",
"layer-2-term": "Lớp 2",
"layer-2-definition": "Các layer 2 là những mạng lưới khác được xây dựng dựa trên mạng chính Ethereum để giúp giao dịch nhanh chóng và rẻ hơn. Thêm về layer 2.",
- "liquidity-tokens-term": "Mã thông báo thanh khoản",
+ "liquidity-tokens-term": "Token thanh khoản",
"liquidity-tokens-definition": "Liquidity token (LT) là Token điện tử được phát hành cho những người tham gia gửi tài sản vào một quỹ thanh khoản — một tập hợp quỹ được khóa trong hợp đồng thông minh và được sử dụng để hỗ trợ thanh khoản trên sàn phi tập trung (DEX).",
"mainnet-term": "Mainnet",
"mainnet-definition": "Viết tắt của \"mạng chính\", đây là chuỗi khối Ethereum công khai chính.",
diff --git a/src/intl/vi/glossary.json b/src/intl/vi/glossary.json
index 803b08cdce2..9eafff1400f 100644
--- a/src/intl/vi/glossary.json
+++ b/src/intl/vi/glossary.json
@@ -223,7 +223,7 @@
"light-client-definition": "Một máy khách Ethereum không lưu trữ một bản sao cục bộ của chuỗi khối, hoặc xác thực các khối và giao dịch. Nó cung cấp các chức năng của một ví và có thể tạo và phát sóng các giao dịch.",
"liquidity-term": "Thanh khoản",
"liquidity-definition": "Thanh khoản là tốc độ và độ dễ dàng một tài sản có thể được chuyển thành tiền mặt hay tài sản khác. Các sàn giao dịch phi tập trung như Uniswap có số lượng lớn các bể thanh khoản cho phép người nắm giữ tài sản cung cấp tài sản cho các nhà giao dịch khác mua và bán một cách phi tập trung, đổi lấy phần thưởng.",
- "liquidity-tokens-term": "Mã thông báo thanh khoản",
+ "liquidity-tokens-term": "Token thanh khoản",
"liquidity-tokens-definition": "Token thanh khoản (LST) là các token kỹ thuật số được phát hành cho những người tham gia gửi tài sản vào một bể thanh khoản, là một tập hợp các quỹ bị khóa trong một hợp đồng thông minh và được sử dụng để tạo điều kiện thuận lợi cho giao dịch trên một sàn giao dịch phi tập trung (DEX).
Các token này đại diện cho phần chia sẻ của người tham gia trong bể và có thể được đổi sau đó để lấy lại khoản tiền gửi ban đầu cộng với một phần phí giao dịch được tạo ra từ hoạt động của bể. Về cơ bản, token thanh khoản đóng vai trò là một bằng chứng về quyền sở hữu hoặc cổ phần trong một bể thanh khoản, cho phép chủ sở hữu kiếm được phần thưởng trong khi cung cấp thanh khoản cần thiết cho những người khác để giao dịch hiệu quả các cặp tiền mã hóa khác nhau.",
"liquid-staking-tokens-term": "Token đặt cược thanh khoản",
"liquid-staking-tokens-definition": "Một token phái sinh đại diện cho quyền sở hữu của tiền mã hóa bị khóa mà người dùng đang đặt cược. Khi đặt cược một tài sản, một số nền tảng cho phép đúc token đặt cược thanh khoản (LST), đại diện cho một phần tương đương của các token bị khóa. Các LST này sau đó có thể được giao dịch, bán hoặc sử dụng trong các giao thức DeFi khác, cải thiện hiệu quả vốn cho người đặt cược bằng cách cho phép truy cập thanh khoản từ quỹ của họ, ngay cả khi tài sản ban đầu của họ vẫn được đặt cược.",
diff --git a/src/intl/vi/learn-quizzes.json b/src/intl/vi/learn-quizzes.json
index 371d614bb62..55630938d95 100644
--- a/src/intl/vi/learn-quizzes.json
+++ b/src/intl/vi/learn-quizzes.json
@@ -451,7 +451,7 @@
"staking-solo-4-c-label": "Phần thưởng xác nhận đầu chuỗi",
"staking-solo-4-c-explanation": "Người xác thực nhận phần thưởng dưới dạng ETH mới phát hành khi họ xác nhận đúng và kịp thời đối với khối đầu chuỗi, đầu chu kỳ đã được xác minh, và đầu chu kỳ đã được hoàn tất.",
"staking-solo-4-d-label": "Phí giao dịch của Uniswap",
- "staking-solo-4-d-explanation": "Phí giao dịch trên các nền tảng và sàn giao dịch không được chuyển cho những nốt xác thực của Ethereum.",
+ "staking-solo-4-d-explanation": "Phí giao dịch trên các nền tảng và sàn giao dịch không được chuyển cho những nút xác thực của Ethereum.",
"staking-solo-5-prompt": "Thời gian hoạt động tối thiểu bao nhiêu thì một nút xác thực mới có lợi nhuận?",
"staking-solo-5-a-label": "100%",
"staking-solo-5-a-explanation": "Mặc dù 100% thời gian hoạt động là mục tiêu lý tưởng, nhưng đó không phải là yêu cầu tối thiểu để một nút xác thực vẫn có lợi nhuận.",
@@ -599,7 +599,7 @@
"stablecoins-4-prompt": "Điều gì làm cho stablecoin trở nên độc đáo?",
"stablecoins-4-a-label": "Nó là một token gắn liền với một tài sản trong thế giới thực",
"stablecoins-4-a-explanation": "Điều này là không chính xác. Mặc dù nhiều stablecoin được neo giá vào tài sản thực tế, đặc điểm này không chỉ giới hạn ở stablecoin (ví dụ: các token được thế chấp bằng ETH).",
- "stablecoins-4-b-label": "Đó là một mã thông báo tiền điện tử được thiết kế đặc biệt để giữ giá trị của nó ổn định",
+ "stablecoins-4-b-label": "Đó là một token tiền điện tử được thiết kế đặc biệt để giữ giá trị của nó ổn định",
"stablecoins-4-b-explanation": "Chính xác! Stablecoin được thiết kế để giữ giá trị của chúng tương đối ổn định, thường được gắn với các tài sản như tiền tệ (ví dụ: 1 USDC = 1 đô la Mỹ), nhưng không phải tất cả các stablecoin đều tuân theo mô hình này (ví dụ: RAI).",
"stablecoins-4-c-label": "Nó có khả năng được gửi qua internet",
"stablecoins-4-c-explanation": "Điều này là không chính xác. Mặc dù đây là một khả năng, nhưng nó không phải là duy nhất đối với stablecoin.",
diff --git a/src/intl/vi/page-10-year-anniversary.json b/src/intl/vi/page-10-year-anniversary.json
index 0901240db56..bde53eba3c2 100644
--- a/src/intl/vi/page-10-year-anniversary.json
+++ b/src/intl/vi/page-10-year-anniversary.json
@@ -120,7 +120,7 @@
"page-10-year-torch-one-of-kind-title": "Độc nhất:",
"page-10-year-torch-one-of-kind-description": "Chỉ có một NFT Ngọn Đuốc Ethereum tồn tại, giúp cho những người nắm giữ trở thành người bảo hộ tạm thời của di sản Ethereum",
"page-10-year-torch-time-limited-title": "Nắm giữ trong thời gian giới hạn:",
- "page-10-year-torch-time-limited-description": "Mỗi người cằm đuốc sẽ nắm giữ nó trong vòng 2 giờ trước khi chuyền cho người bảo hộ kế tếp. Vào ngày 30 tháng 7, NFT này sẽ được đốt đi để ăn mừng lễ kỷ niệm.",
+ "page-10-year-torch-time-limited-description": "Mỗi người cầm đuốc sẽ nắm giữ nó trong vòng 24 giờ trước khi chuyền cho người bảo hộ kế tiếp. Vào ngày 30 tháng 7, NFT này sẽ được đốt đi để ăn mừng lễ kỷ niệm.",
"page-10-year-mint-card-title": "Đúc khoảnh khắc",
"page-10-year-mint-card-description": "Kỷ niệm một thập kỷ phi tập trung với NFT kỷ niệm 10 năm hoàn toàn miễn phí, chỉ có thể đúc trong thời gian giới hạn. Đúc NFT của bạn trước khi hết hạn.",
"page-10-year-mint-card-ended-title": "Thời gian nhận đã kết thúc",
diff --git a/src/intl/vi/page-resources.json b/src/intl/vi/page-resources.json
index 4ef4abcff1b..815c7d6da82 100644
--- a/src/intl/vi/page-resources.json
+++ b/src/intl/vi/page-resources.json
@@ -46,7 +46,7 @@
"page-resources-adoption-reserves-description": "Bảng điều khiển cho sáng kiến Quỹ Dự trữ Chiến lược Ethereum.",
"page-resources-roadmap-title": "Lộ trình của Ethereum",
"page-resources-roadmap-metric-label": "Nâng cấp mới nhất",
- "page-resources-roadmap-ethroadmap-description": "Hình minh họa chi tiết về lộ trình phát triển của Ethereum và bản nâng cấp mạng lướt sắp tới.",
+ "page-resources-roadmap-ethroadmap-description": "Hình minh họa chi tiết về lộ trình phát triển của Ethereum và bản nâng cấp mạng lưới sắp tới.",
"page-resources-blobs-title": "Các khối dữ liệu tạm",
"page-resources-blobs-metric-total-label": "Tổng số blob",
"page-resources-blobs-metric-fee-label": "Phí Blob trung bình",
@@ -66,7 +66,7 @@
"page-resources-network-resilience-supermajority-description": "Rủi ro khi một client chiếm ưu thế tuyệt đối trong lớp thực thi Ethereum, nhất là ở các dịch vụ staking (đặt cọc).",
"page-resources-attestations-title": "Các chứng thực",
"page-resources-attestations-eas-description": "EAS cho phép mọi người tạo và xác minh chứng thực, cả trên chuỗi lẫn ngoài chuỗi, trong hệ sinh thái Ethereum.",
- "page-resources-relays-title": "Lặp lại",
+ "page-resources-relays-title": "Relay",
"page-resources-relays-beaconchain-description": "Người xác thực có thể nhờ các relay đứng ra sản xuất khối, nhằm tối ưu hóa và gia tăng nguồn thu.",
"page-resources-relays-ratednetwork-description": "Thống kê về thị phần MEV relay, tổng giá trị được chuyển tiếp, giá trị mỗi khối và các chỉ số khác trong mạng Ethereum.",
"page-resources-relays-relayscan-description": "Bộ phân tích dữ liệu MEV-Boost.",
diff --git a/src/intl/vi/page-staking-deposit-contract.json b/src/intl/vi/page-staking-deposit-contract.json
index ddcddfa6d4d..7580e846810 100644
--- a/src/intl/vi/page-staking-deposit-contract.json
+++ b/src/intl/vi/page-staking-deposit-contract.json
@@ -5,7 +5,7 @@
"page-staking-deposit-contract-checkbox1": "Tôi sử dụng launchpad để thiết lập nút Ethereum của tôi.",
"page-staking-deposit-contract-checkbox2": "Tôi hiểu rằng tôi cần sử dụng launchpad để góp cổ phần. Việc chỉ chuyển tiền vào địa chỉ ví này sẽ không có hiệu lực.",
"page-staking-deposit-contract-checkbox3": "Tôi sẽ kiểm tra địa chỉ hợp đồng đặt cọc với những nguồn khác.",
- "page-staking-deposit-contract-confirm-address": "Xác nhận địa chỉ email của bạn",
+ "page-staking-deposit-contract-confirm-address": "Xác nhận để hiển thị địa chỉ",
"page-staking-deposit-contract-copied": "Đã sao chép địa chỉ",
"page-staking-deposit-contract-copy": "Sao chép địa chỉ",
"page-staking-deposit-contract-blockexplorer": "Xem hợp đồng trên Blockscout",
diff --git a/src/intl/vi/page-staking.json b/src/intl/vi/page-staking.json
index 6e5a942bc0a..7ad5c4256e5 100644
--- a/src/intl/vi/page-staking.json
+++ b/src/intl/vi/page-staking.json
@@ -20,7 +20,7 @@
"page-staking-benefits-1-title": "Kiếm phần thưởng",
"page-staking-benefits-1-description": "Phần thưởng được trao cho các hành động giúp mạng đạt được sự đồng thuận. Bạn sẽ nhận được phần thưởng khi chạy phần mềm gộp các giao dịch vào các khối mới một cách hợp lý và kiểm tra công việc của các trình xác thực khác vì đó là điều giúp chuỗi hoạt động an toàn.",
"page-staking-benefits-2-title": "Bảo mật hơn",
- "page-staking-benefits-2-description": "Mạng lưới trở nên mạnh hơn trước các cuộc tấn công khi có nhiều ETH được ký gửi hơn, vì sau đó mạng lưới cần số ETH đó để kiểm soát phần lớn mạng lưới. Để trở thành mối đe dọa cho mạng lưới, bạn cần phải nắm được phần lớn nốt xác thực, cũng đồng nghĩa là bạn cần nắm giữ rất nhiều ETH trong mạng lưới–một con số khá lớn!",
+ "page-staking-benefits-2-description": "Mạng lưới trở nên mạnh hơn trước các cuộc tấn công khi có nhiều ETH được ký gửi hơn, vì sau đó mạng lưới cần số ETH đó để kiểm soát phần lớn mạng lưới. Để trở thành mối đe dọa cho mạng lưới, bạn cần phải nắm được phần lớn nút xác thực, cũng đồng nghĩa là bạn cần nắm giữ rất nhiều ETH trong mạng lưới–một con số khá lớn!",
"page-staking-benefits-3-title": "Bền vững hơn",
"page-staking-benefits-3-description": "Những người ký gửi không cần tốn nhiều năng lượng như chất xám, điện năng để chạy node theo cơ chế đồng thuận bằng chứng công việc cũ nữa, nghĩa là các node được úy quyền ký gửi có thể chạy trên phần cứng sử dụng rất ít điện năng.",
"page-staking-benefits-3-link": "Thông tin thêm về mức tiêu thụ năng lượng của Ethereum",
@@ -63,7 +63,7 @@
"page-staking-hierarchy-solo-p3": "Những người ký gửi có thể góp quỹ của họ với người khác hoặc có thể tự mình với ít nhất 32 ETH. Giải pháp Token ký gửi thanh khoản được dùng để duy trì truy cập vào DeFi.",
"page-staking-hierarchy-saas-pill-1": "32 ETH của bạn",
"page-staking-hierarchy-saas-pill-2": "Khóa xác thực của bạn",
- "page-staking-hierarchy-saas-pill-3": "Vận hành nốt được giao",
+ "page-staking-hierarchy-saas-pill-3": "Vận hành nút được giao",
"page-staking-hierarchy-saas-p1": "Nếu bạn không muốn hoặc không cảm thấy thoải mái khi phải đối phó với phần cứng nhưng vẫn muốn ký gửi 32 ETH, lựa chọn dịch vụ ký gửi cho phép bạn ủy thác phần cứng trong khi bạn kiếm phần thưởng khối vốn có.",
"page-staking-hierarchy-saas-p2": "Những lựa chọn này thường yêu cầu bạn tạo định danh xác thực, cập nhật khóa chữ ký cho chúng và gửi vào 32 ETH. Điều này sẽ cho phép dịch vụ xác thực thay cho bạn.",
"page-staking-hierarchy-saas-p3": "Phương pháp ký gửi yêu cầu sự tin tưởng nhất định vào nhà cung cấp. Để hạn chế rủi ro giữa các bên, bạn phải luôn giữ khóa để rút ETH.",
@@ -72,22 +72,22 @@
"page-staking-hierarchy-pools-pill-3": "Giữ nó một cách đơn giản",
"page-staking-hierarchy-pools-pill-4": "Phổ biến",
"page-staking-hierarchy-pools-p1": "Có nhiều giải pháp huy động vốn tồn tại để hỗ trợ những người dùng không có hoặc không cảm thấy thoải mái khi đầu tư 32 ETH.",
- "page-staking-hierarchy-pools-p2": "Nhiều tùy chọn trong số này bao gồm cái được gọi là 'ký gửi thanh khoản' bao gồm mã thông báo thanh khoản ERC-20 đại diện cho ETH mà bạn đã ký gửi.",
+ "page-staking-hierarchy-pools-p2": "Nhiều tùy chọn trong số này bao gồm cái được gọi là 'ký gửi thanh khoản' bao gồm token thanh khoản ERC-20 đại diện cho ETH mà bạn đã ký gửi.",
"page-staking-hierarchy-pools-p3": "Ký gửi thanh khoản khiến việc ký gửi và hủy ký gửi trở nên đơn giản như một giao dịch token và cho phép sử dụng vốn đã ký gửi trong DeFi. Tùy chọn này cũng cho phép người dùng giữ quyền kiểm soát tài sản của họ trong ví Ethereum của riêng mình.",
"page-staking-hierarchy-pools-p4": "Ký gửi theo nhóm chung vốn không có trên mạng lưới Ethereum. Các bên thứ ba tạo nên giải pháp này, và họ tự chịu trách nhiệm cho những rủi ro.",
"page-staking-hierarchy-cex-h2": "Các sàn giao dịch tập trung",
"page-staking-hierarchy-cex-pill-1": "Ít tác động nhất",
"page-staking-hierarchy-cex-pill-2": "Giả thiết tin cậy nhất",
"page-staking-hierarchy-cex-p1": "Nhiều sàn tập trung cung cấp dịch vụ ký gửi nếu như bạn vẫn không thoải mái khi giữ ETH trong ví của mình. Họ sẽ giữ ETH cho bạn, trong khi đó bạn có thể hưởng được lợi tức từ đó mà không mất quá nhiều công sức hoặc chỉ phải giám sát rất ít.",
- "page-staking-hierarchy-cex-p2": "Nhưng cái giá phải trả ở đây là những nhà cung cấp dịch vụ phi tập trung thường tổng hợp số lượng ETH lớn để chạy một số lượng lớn các nốt xác thực. Điều này có thể gây nguy hiểm cho mạng lưới và người dùng vì nó sẽ tạo ra các mục tiêu tập trung lớn và điểm tới hạn, làm cho mạng lưới dễ bị tấn công hơn hoặc xảy ra lỗi.",
+ "page-staking-hierarchy-cex-p2": "Nhưng cái giá phải trả ở đây là những nhà cung cấp dịch vụ phi tập trung thường tổng hợp số lượng ETH lớn để chạy một số lượng lớn các nút xác thực. Điều này có thể gây nguy hiểm cho mạng lưới và người dùng vì nó sẽ tạo ra các mục tiêu tập trung lớn và điểm tới hạn, làm cho mạng lưới dễ bị tấn công hơn hoặc xảy ra lỗi.",
"page-staking-hierarchy-cex-p3": "Nếu bạn không cảm thấy thoải mái khi giữ khóa của mình thì cũng không sao. Bạn có những lựa chọn sau. Lúc này, cân nhắc kiểm tra trang ví, nơi bạn có thể bắt đầu học làm thế nào để nắm giữ quyền sở hữu hoàn toàn với tiền của mình. Khi bạn sẵn sàng, quay lại và ký gửi cao hơn bằng cách thử lại một trong những dịch vụ ký gửi theo nhóm bạn tự kiếm soát đã có.",
"page-staking-hierarchy-subtext": "Bạn có thể thấy rằng, có nhiều cách để ký gửi Ethereum. Những cách này hướng tới nhiều loại người dùng và mỗi cách lại khác biệt và có rủi ro, phần thưởng, mức độ tin cậy giả định khác nhau. Một số thì phi tập trung, thử nghiệm triệt để và mạo hiểm hơn cái khác. Chúng tôi cung cấp cho bạn một số thông tin về các dự án phổ biến trong bối cảnh này, nhưng hãy luôn tự nghiên cứu kỹ trước khi gửi ETH của bạn đi bất kỳ đâu.",
- "page-staking-comparison-solo-saas": "Với nhà cung cấp SaaS, bạn vẫn cần phải gửi vào 32 ETH, nhưng không phải chạy phần cứng. Bạn thường vẫn có quyền truy cập khóa xác thực của bạn, nhưng cũng cần phải chia sẻ khóa chữ ký để những người vận hành có thể hành động thay cho nốt xác thực của bạn. Điều này đưa ra một lớp tin tưởng nhưng không hiển thị khi bạn chạy phần cứng riêng, cũng không giống như bạn ký gửi một mình, dịch vụ SaaS không giúp bạn nhiều về việc phân phối các nốt theo địa lý. Nếu bạn không thoải mái khi vận hành phần cứng nhưng vẫn muốn ký gửi 32 ETH, dịch vụ SaaS có thể là một sự lựa chọn tốt cho bạn.",
- "page-staking-comparison-solo-pools": "Ký gửi một mình yêu cầu tham gia nhiều hơn đáng kể so với ký gửi bằng dịch vụ chung, nhưng cung cấp toàn quyền truy cập vào phần thưởng ETH cũng như toàn quyền kiểm soát việc thiết lập và bảo mật nốt xác thực của bạn. Ký gửi theo nhóm có rào cản gia nhập thấp hơn đáng kể. Người dùng có thể ký gửi một lượng nhỏ ETH, không bắt buộc phải tạo khóa xác thực và không có yêu cầu về phần cứng ngoài kết nối internet tiêu chuẩn. Mã thông báo thanh khoản cho phép khả năng thoát quy trình ký gửi trước khi tính năng này được bật ở cấp giao thức. Nếu bạn quan tâm đến các tính năng này, ký gửi theo nhóm có thể phù hợp.",
+ "page-staking-comparison-solo-saas": "Với nhà cung cấp SaaS, bạn vẫn cần phải gửi vào 32 ETH, nhưng không phải chạy phần cứng. Bạn thường vẫn có quyền truy cập khóa xác thực của bạn, nhưng cũng cần phải chia sẻ khóa chữ ký để những người vận hành có thể hành động thay cho nút xác thực của bạn. Điều này đưa ra một lớp tin tưởng nhưng không hiển thị khi bạn chạy phần cứng riêng, cũng không giống như bạn ký gửi một mình, dịch vụ SaaS không giúp bạn nhiều về việc phân phối các nút theo địa lý. Nếu bạn không thoải mái khi vận hành phần cứng nhưng vẫn muốn ký gửi 32 ETH, dịch vụ SaaS có thể là một sự lựa chọn tốt cho bạn.",
+ "page-staking-comparison-solo-pools": "Ký gửi một mình yêu cầu tham gia nhiều hơn đáng kể so với ký gửi bằng dịch vụ chung, nhưng cung cấp toàn quyền truy cập vào phần thưởng ETH cũng như toàn quyền kiểm soát việc thiết lập và bảo mật nút xác thực của bạn. Ký gửi theo nhóm có rào cản gia nhập thấp hơn đáng kể. Người dùng có thể ký gửi một lượng nhỏ ETH, không bắt buộc phải tạo khóa xác thực và không có yêu cầu về phần cứng ngoài kết nối internet tiêu chuẩn. Token thanh khoản cho phép khả năng thoát quy trình ký gửi trước khi tính năng này được bật ở cấp giao thức. Nếu bạn quan tâm đến các tính năng này, ký gửi theo nhóm có thể phù hợp.",
"page-staking-comparison-saas-solo": "Điểm giống nhau ở đây là bạn sở hữu khóa xác thực của mình mà không cần gộp tiền, nhưng với SaaS bạn cần phải tin tưởng một bên thứ ba có thể hành động ác ý hoặc trở thành đối tượng bị tấn công hoặc điều chỉnh. Nếu những giả thiết về sự tin tưởng hay rủi ro về sự tập trung khiến bạn băn khoăn, tiêu chuẩn vàng của ký gửi tự quản là tự ký gửi một mình.",
"page-staking-comparison-saas-pools": "Điểm giống nhau ở đây đó là bạn phải tin tưởng vào SaaS, nhưng ký gửi theo nhóm cho phép bạn gửi vào ít ETH hơn. Nếu bạn đang muốn ký gửi ít hơn 32 ETH, có thể xem kỹ thêm dưới đây.",
"page-staking-comparison-pools-solo": "Ký gửi theo quỹ đòi hỏi thấp hơn đáng kể so với tự ký gửi, nhưng đi kèm với rủi ro do ủy quyền toàn bộ hoạt động của nút xác thực cho bên thứ ba, và có phí đi kèm. Tự ký gửi mang lại toàn quyền tự chủ và kiểm soát đối với các lựa chọn trong việc thiết lập ký gửi. Người ký gửi không bao giờ phải trao chìa khóa của mình và họ nhận toàn bộ phần thưởng mà không có bất kỳ trung gian nào cắt xén.",
- "page-staking-comparison-pools-saas": "Điểm giống nhau nữa là những người ký gửi không cần phải tự chạy phần mềm xác thực, nhưng không giống ký gửi theo nhóm, dịch vụ SaaS yêu cầu gửi vào đủ 32 ETH để kích hoạt nốt xác thực. Phần thưởng được trao cho người ký gửi, bao gồm cả phí hàng tháng hoặc tiền ký gửi khác để sử dụng dịch vụ. Nếu bạn muốn tự giữ khóa xác thực và muốn ký gửi ít hơn 32 ETH, sử dụng nhà cung cấp dịch vụ SaaS sẽ là lựa chọn tốt cho bạn.",
+ "page-staking-comparison-pools-saas": "Điểm giống nhau nữa là những người ký gửi không cần phải tự chạy phần mềm xác thực, nhưng không giống ký gửi theo nhóm, dịch vụ SaaS yêu cầu gửi vào đủ 32 ETH để kích hoạt nút xác thực. Phần thưởng được trao cho người ký gửi, bao gồm cả phí hàng tháng hoặc tiền ký gửi khác để sử dụng dịch vụ. Nếu bạn muốn tự giữ khóa xác thực và muốn ký gửi ít hơn 32 ETH, sử dụng nhà cung cấp dịch vụ SaaS sẽ là lựa chọn tốt cho bạn.",
"page-staking-considerations-dropdown-text": "Cân nhắc ký gửi",
"page-staking-considerations-dropdown-aria-label": "Danh sách dưới đây cho các yếu tố xem xét khi ký gửi",
"page-staking-considerations-solo-1-title": "Mã nguồn mở",
@@ -106,10 +106,10 @@
"page-staking-considerations-solo-4-caution": "Hơn 6 tháng",
"page-staking-considerations-solo-4-warning": "Mới ra mắt",
"page-staking-considerations-solo-5-title": "Không tin tưởng",
- "page-staking-considerations-solo-5-description": "Không được giao khóa xác thực cho người khác trong khi đang vận hành nốt xác thực. Mọi hợp đồng thông minh liên quan đều không có cửa sau, không phụ thuộc vào các quyền đặc quyền để thực thi.",
+ "page-staking-considerations-solo-5-description": "Không được giao khóa xác thực cho người khác trong khi đang vận hành nút xác thực. Mọi hợp đồng thông minh liên quan đều không có cửa sau, không phụ thuộc vào các quyền đặc quyền để thực thi.",
"page-staking-considerations-solo-5-warning": "Tin cậy",
"page-staking-considerations-solo-6-title": "Không cần sự cho phép",
- "page-staking-considerations-solo-6-description": "Người dùng không yêu cầu bất kì sự cho phép đặc biệt nào để vận hành nốt xác thực để sử dụng phần mềm hay dịch vụ",
+ "page-staking-considerations-solo-6-description": "Người dùng không yêu cầu bất kì sự cho phép đặc biệt nào để vận hành nút xác thực để sử dụng phần mềm hay dịch vụ",
"page-staking-considerations-solo-6-valid": "Không cho phép",
"page-staking-considerations-solo-6-warning": "Yêu cầu ETH ít nhất, một số dự án yêu cầu ít nhất 0,01 ETH",
"page-staking-considerations-solo-7-title": "Khách hàng đa dạng",
@@ -139,7 +139,7 @@
"page-staking-considerations-saas-8-warning": "Nhiều hơn 50%",
"page-staking-considerations-pools-5-description": "Dịch vụ không yêu cầu tin tưởng bất kỳ ai để nắm giữ khóa của bạn hoặc chia thưởng",
"page-staking-considerations-pools-6-title": "Nốt không được cấp quyền",
- "page-staking-considerations-pools-6-description": "Hệ thống cho phép bất kỳ ai cũng có thể tham gia vào vận hành nốt trong nhóm mà không cần xin phép",
+ "page-staking-considerations-pools-6-description": "Hệ thống cho phép bất kỳ ai cũng có thể tham gia vào vận hành nút trong nhóm mà không cần xin phép",
"page-staking-considerations-pools-7-description": "Dịch vụ không nên chạy hơn 50% những người xác thực với ứng dụng vận hành chủ yếu",
"page-staking-considerations-pools-8-title": "Token thanh khoản",
"page-staking-considerations-pools-8-description": "Token thanh khoản được cấp đại diện cho số ETH bạn ký gửi sẽ nằm trong ví của bạn",
@@ -150,7 +150,7 @@
"page-staking-how-solo-works-item-2": "Đồng bộ ứng dụng vận hành của khách hàng",
"page-staking-how-solo-works-item-3": "Đồng bộ mạng lưới khách hàng đồng thuận",
"page-staking-how-solo-works-item-4": "Tạo khóa của bạn và đưa chúng vào ứng dụng xác thực của bạn",
- "page-staking-how-solo-works-item-5": "Quan sát và duy trì nốt của bạn",
+ "page-staking-how-solo-works-item-5": "Quan sát và duy trì nút của bạn",
"page-staking-launchpad-widget-mainnet-label": "Mainnet",
"page-staking-launchpad-widget-start": "Bắt đầu ký gửi trên {network}",
"page-staking-launchpad-widget-span": "Chọn mạng",
@@ -163,7 +163,7 @@
"page-staking-dropdown-staking-options": "Tùy chọn ký gửi",
"page-staking-dropdown-staking-options-alt": "Menu thả xuống tùy chọn ký gửi",
"page-staking-stats-box-metric-1": "Tổng số ETH đã ký gửi",
- "page-staking-stats-box-metric-2": "Tổng số nốt xác thực",
+ "page-staking-stats-box-metric-2": "Tổng số nút xác thực",
"page-staking-stats-box-metric-3": "Lãi suất hiện tại",
"page-staking-stats-box-metric-1-tooltip": "Tổng số ETH đủ điều kiện được ký gửi trên Beacon Chain",
"page-staking-stats-box-metric-2-tooltip": "Số lượng của tài khoản xác thực hiện tại được kích hoạt trên blockchain Beacon",
@@ -173,7 +173,7 @@
"page-staking-section-comparison-solo-rewards-li1": "Phần thưởng tối đa - nhận phần thưởng đầy đủ trực tiếp từ giao thức",
"page-staking-section-comparison-solo-rewards-li2": "Phần thưởng cho việc đề xuất khối, bao gồm phí giao dịch không bị đốt và việc chứng thực thường xuyên cho trạng thái của mạng lưới",
"page-staking-section-comparison-solo-rewards-li3": "Lựa chọn đúc Token ký gửi thanh khoản dựa trên nút xác thực tại nhà của bạn sử dụng trong DeFi",
- "page-staking-section-comparison-saas-rewards-li1": "Thường bao gồm các phần thưởng giao thức đầy đủ trừ đi phí hàng tháng để vận hành nốt",
+ "page-staking-section-comparison-saas-rewards-li1": "Thường bao gồm các phần thưởng giao thức đầy đủ trừ đi phí hàng tháng để vận hành nút",
"page-staking-section-comparison-saas-rewards-li2": "Luôn sẵn sàng dễ dàng kiểm tra ứng dụng xác thực của bạn trên màn hình",
"page-staking-section-comparison-pools-rewards-li1": "Phần thưởng ký gửi theo nhóm khác nhau, phụ thuộc vào phương pháp ký gửi theo nhóm bạn lựa chọn",
"page-staking-section-comparison-pools-rewards-li2": "Nhiều dịch vụ ký gửi theo nhóm đưa ra một hoặc nhiều token thanh khoản đại diện cho số ETH bạn ký gửi và cổ phần của phần thưởng xác thực",
@@ -197,9 +197,9 @@
"page-staking-section-comparison-pools-requirements-li1": "Yêu cầu ETH ít nhất, một số dự án yêu cầu ít nhất 0.01 ETH",
"page-staking-section-comparison-pools-requirements-li2": "Gửi tiền từ ví của bạn sang nền tảng ký gửi chung khác hoặc giao dịch dễ dàng với token thanh khoản",
"page-staking-faq-1-question": "Người xác thực là gì?",
- "page-staking-faq-1-answer": "Nốt xác thực là một thực thể ảo tồn tại trên Ethereum và tham gia vào quá trình đồng thuận của giao thức Ethereum. Nốt xác thực được thể hiện bằng số dư, khóa công khai và các hình thức khác. Một máy khách xác thực là một phần mềm hành động thay mặt cho nốt xác thực bằng cách giữ và sử dụng khóa riêng tư. Một máy khách xác thực đơn lẻ có thể giữ nhiều cặp khóa, kiểm soát nhiều nốt xác thực.",
+ "page-staking-faq-1-answer": "Nút xác thực là một thực thể ảo tồn tại trên Ethereum và tham gia vào quá trình đồng thuận của giao thức Ethereum. Nút xác thực được thể hiện bằng số dư, khóa công khai và các hình thức khác. Một máy khách xác thực là một phần mềm hành động thay mặt cho nút xác thực bằng cách giữ và sử dụng khóa riêng tư. Một máy khách xác thực đơn lẻ có thể giữ nhiều cặp khóa, kiểm soát nhiều nút xác thực.",
"page-staking-faq-2-question": "Tại sao tôi cần ký gửi tiền?",
- "page-staking-faq-2-answer": "Nốt xác thực có khả năng tạo ra và chứng thực các khối cho mạng lưới. Để ngăn chặn hành vi thiếu trung thực, người dùng phải góp tiền của mình. Điều này cho phép giao thức phạt những hành vi ác ý. Ký gửi để giúp bạn trung thực, bởi vì hành vi của bạn sẽ có hậu quả về mặt tài chính.",
+ "page-staking-faq-2-answer": "Nút xác thực có khả năng tạo ra và chứng thực các khối cho mạng lưới. Để ngăn chặn hành vi thiếu trung thực, người dùng phải góp tiền của mình. Điều này cho phép giao thức phạt những hành vi ác ý. Ký gửi để giúp bạn trung thực, bởi vì hành vi của bạn sẽ có hậu quả về mặt tài chính.",
"page-staking-faq-3-question": "Tôi có thể mua 'Eth2' không?",
"page-staking-faq-3-answer-p1": "Không có token 'Eth2' nào trên giao thức bởi token ether (ETH) không thay đổi khi Ethereum chuyển sang proof-of-stake (bằng chứng đặt cọc).",
"page-staking-faq-3-answer-p2": "Có các token/ticker phái sinh có thể đại diện cho ETH đã ký gửi (tức là rETH từ Rocket Pool, stETH từ Lido, ETH2 từ Coinbase). Tìm hiểu thêm về các bể ký gửi.",
diff --git a/src/intl/vi/page-trillion-dollar-security.json b/src/intl/vi/page-trillion-dollar-security.json
index 5988d84ace1..622df9c2b5b 100644
--- a/src/intl/vi/page-trillion-dollar-security.json
+++ b/src/intl/vi/page-trillion-dollar-security.json
@@ -46,7 +46,7 @@
"page-trillion-dollar-security-section-1-2-title": "1.2 Ký mù và sự không chắc chắn trong giao dịch",
"page-trillion-dollar-security-section-1-2-paragraph": "Người dùng thường phê duyệt các giao dịch một cách \"mù quáng\" mà không hiểu họ đang làm gì. Ví thường trình bày dữ liệu thô ở dạng hệ thập phân hệ số 16, địa chỉ hợp đồng bị cắt ngắn, hoặc các thông tin khác không đủ để người dùng hiểu được hậu quả của một giao dịch cụ thể. Điều này khiến cho người dùng thuộc mọi loại hình dễ bị tổn thương trước các hợp đồng thông minh độc hại, lừa đảo qua mạng, gian lận, giao diện giả danh, sự xâm phạm giao diện người dùng phía trước, và các lỗi cơ bản của người dùng.",
"page-trillion-dollar-security-section-1-3-title": "1.3 Quản lý phê duyệt và cấp phép",
- "page-trillion-dollar-security-section-1-3-paragraph-1": "Trong nhiều ứng dụng Ethereum, việc người dùng cấp quyền nhất định cho ứng dụng cơ sở là điều thường thấy trong quá trình sử dụng bình thường. Ví dụ, người dùng có thể cấp quyền cho một sàn giao dịch phi tập trung như Uniswap để di chuyển các mã thông báo của họ nhằm mục đích hoán đổi chúng lấy ETH.",
+ "page-trillion-dollar-security-section-1-3-paragraph-1": "Trong nhiều ứng dụng Ethereum, việc người dùng cấp quyền nhất định cho ứng dụng cơ sở là điều thường thấy trong quá trình sử dụng bình thường. Ví dụ, người dùng có thể cấp quyền cho một sàn giao dịch phi tập trung như Uniswap để di chuyển các token của họ nhằm mục đích hoán đổi chúng lấy ETH.",
"page-trillion-dollar-security-section-1-3-paragraph-2": "Những phê duyệt này có thể có giới hạn về số lượng, nhưng nhiều ví mặc định cho phép cấp phê duyệt không giới hạn mà không có ngày hết hạn. Không có cách nào cho người dùng quản lý hoặc xem xét các phê duyệt còn lại từ hầu hết các ví.",
"page-trillion-dollar-security-section-1-3-paragraph-3": "Điều này có thể khiến người dùng phải đối mặt với các ứng dụng ác ý hoặc các giao diện bị xâm phạm, bởi vì mẫu mặc định cho nhiều người dùng là cấp quyền không giới hạn, điều này có thể bị lợi dụng để rút tiền của họ. Ngay cả khi một người dùng cấp quyền cho một hợp đồng thông minh hợp pháp, nếu hợp đồng đó sau này bị xâm phạm trong khi quyền cấp vẫn còn hiệu lực, thì hợp đồng bị xâm phạm đó có thể rút cạn tài sản của người dùng.",
"page-trillion-dollar-security-section-1-3-paragraph-4": "Điều này cũng là một nguy cơ đối với người dùng trong tổ chức. Chẳng hạn, một tổ chức có thể quyết định cấp quyền sử dụng USDC không giới hạn cho một bộ định tuyến DEX để thuận tiện trong hoạt động, điều này sẽ khiến họ phải đối mặt với rủi ro nếu hợp đồng của bộ định tuyến được nâng cấp.",
From e6fa15813eda70845defc88baf8b8b863f614196 Mon Sep 17 00:00:00 2001
From: myelinated-wackerow
<263208946+myelinated-wackerow@users.noreply.github.com>
Date: Sat, 28 Feb 2026 00:17:04 +0000
Subject: [PATCH 18/31] fix(i18n): fix backslash-escape double-encoding
The escapeMdxAngleBrackets regex was converting \<1 to
\<1 (double-escaping). Added \\ to the negative
lookbehind so backslash-escaped angle brackets are left
intact. Fixed 7 affected files across vi, cs, fr, ru.
Added 2 unit tests for the backslash-escape case.
Co-Authored-By: Claude Opus 4.6
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
---
.../tutorials/how-to-mint-an-nft/index.md | 2 +-
.../tutorials/how-to-mint-an-nft/index.md | 2 +-
.../networking-layer/portal-network/index.md | 2 +-
.../reverse-engineering-a-contract/index.md | 6 +-
.../networking-layer/portal-network/index.md | 2 +-
.../tutorials/how-to-mint-an-nft/index.md | 2 +-
.../reverse-engineering-a-contract/index.md | 6 +-
src/scripts/i18n/post_import_sanitize.ts | 2 +-
tests/unit/sanitizer/standalone-fixes.spec.ts | 62 ++++++++++---------
9 files changed, 44 insertions(+), 42 deletions(-)
diff --git a/public/content/translations/cs/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/cs/developers/tutorials/how-to-mint-an-nft/index.md
index 0edf29471d4..23d3561cb4e 100644
--- a/public/content/translations/cs/developers/tutorials/how-to-mint-an-nft/index.md
+++ b/public/content/translations/cs/developers/tutorials/how-to-mint-an-nft/index.md
@@ -18,7 +18,7 @@ published: 2021-04-22
[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 milionů
[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 milionů
-Všichni z nich vyrazili svá NFT pomocí výkonného API od Alchemy. V tomto tutoriálu vás naučíme, jak udělat to samé za \<10 minut.
+Všichni z nich vyrazili svá NFT pomocí výkonného API od Alchemy. V tomto tutoriálu vás naučíme, jak udělat to samé za \<10 minut.
„Ražba NFT“ je akt publikování jedinečné instance vašeho tokenu ERC-721 na blockchainu. Pomocí našeho chytrého kontraktu z [1. části této série tutoriálů o NFT](/developers/tutorials/how-to-write-and-deploy-an-nft/) si procvičíme naše dovednosti s Web3 a vyrazíme si NFT. Na konci tohoto tutoriálu si budete moci vyrazit tolik NFT, kolik jen vaše srdce (a peněženka) bude chtít!
diff --git a/public/content/translations/fr/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/fr/developers/tutorials/how-to-mint-an-nft/index.md
index cc3792d9c8d..084ec6daae3 100644
--- a/public/content/translations/fr/developers/tutorials/how-to-mint-an-nft/index.md
+++ b/public/content/translations/fr/developers/tutorials/how-to-mint-an-nft/index.md
@@ -18,7 +18,7 @@ published: 2021-04-22
[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b) : 11 millions de dollars
[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens) : 6 millions de dollars
-Tous ont frappé leurs NFT en utilisant la puissante API d'Alchemy. Dans ce tutoriel, nous vous apprendrons comment faire la même chose en \<10 minutes.
+Tous ont frappé leurs NFT en utilisant la puissante API d'Alchemy. Dans ce tutoriel, nous vous apprendrons comment faire la même chose en \<10 minutes.
« Frapper un NFT » est l'acte de publier une instance unique de votre jeton ERC-721 sur la blockchain. En utilisant notre contrat intelligent de la [partie 1 de cette série de tutoriels sur les NFT](/developers/tutorials/how-to-write-and-deploy-an-nft/), mettons en pratique nos compétences Web3 et frappons un NFT. À la fin de ce tutoriel, vous serez en mesure de frapper autant de NFT que votre cœur (et votre portefeuille) le désire !
diff --git a/public/content/translations/ru/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/ru/developers/docs/networking-layer/portal-network/index.md
index 5871bd2164c..25df21da815 100644
--- a/public/content/translations/ru/developers/docs/networking-layer/portal-network/index.md
+++ b/public/content/translations/ru/developers/docs/networking-layer/portal-network/index.md
@@ -55,7 +55,7 @@ JSON-RPC API также не является идеальным выбором
- уменьшение зависимости от централизованных провайдеров
- Снижение использования пропускной способности Интернета
- Минимизированная или нулевая синхронизация
-- Доступность для устройств с ограниченными ресурсами (\<1 ГБ ОЗУ, \<100 МБ на диске, 1 ЦП)
+- Доступность для устройств с ограниченными ресурсами (\<1 ГБ ОЗУ, \<100 МБ на диске, 1 ЦП)
В таблице ниже показаны функции существующих клиентов, которые могут быть реализованы Портальной сетью, что позволяет пользователям получать доступ к этим функциям на устройствах с очень низкими ресурсами.
diff --git a/public/content/translations/ru/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/ru/developers/tutorials/reverse-engineering-a-contract/index.md
index fe2c2bdfe03..8d1412a916f 100644
--- a/public/content/translations/ru/developers/tutorials/reverse-engineering-a-contract/index.md
+++ b/public/content/translations/ru/developers/tutorials/reverse-engineering-a-contract/index.md
@@ -51,8 +51,8 @@ _В блокчейне нет секретов_, все, что происход
| 4 | Сохранить слово в память | Пусто |
| 5 | PUSH1 0x04 | 0x04 |
| 7 | Получить размер входных данных текущей среды | CALLDATASIZE 0x04 |
-| 8 | Меньше, чем сравниваемое | CALLDATASIZE\<4 |
-| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 |
+| 8 | Меньше, чем сравниваемое | CALLDATASIZE\<4 |
+| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 |
| C | Условно изменить счетчик команд | Пусто |
Этот код делает две вещи:
@@ -429,7 +429,7 @@ Etherscan сообщает нам, что `1C` — это неизвестный
| 194 | DUP3 | 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
| 195 | DUP5 | CALLDATASIZE 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
| 196 | Вычитание | CALLDATASIZE-4 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 197 | Подписано меньше, чем сравниваемое | CALLDATASIZE-4\<32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 197 | Подписано меньше, чем сравниваемое | CALLDATASIZE-4\<32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
| 198 | Просто НЕ оператор | CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
| 199 | PUSH2 0x01a0 | 0x01A0 CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
| 19C | Условно изменить счетчик команд | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
diff --git a/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
index 115c39576f4..b8df108b2c8 100644
--- a/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
+++ b/public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
@@ -55,7 +55,7 @@ Những lợi ích của thiết kế mạng này là:
- giảm sự phụ thuộc vào các nhà cung cấp tập trung
- Giảm sử dụng băng thông Internet
- Đồng bộ hóa tối thiểu hoặc bằng không
-- Có thể truy cập được đối với các thiết bị có tài nguyên hạn chế (\<1 GB RAM, \<100 MB dung lượng đĩa, 1 CPU)
+- Có thể truy cập được đối với các thiết bị có tài nguyên hạn chế (\<1 GB RAM, \<100 MB dung lượng đĩa, 1 CPU)
Bảng dưới đây hiển thị các chức năng của các máy khách hiện có mà Mạng Portal có thể cung cấp, cho phép người dùng truy cập các chức năng này trên các thiết bị có tài nguyên rất thấp.
diff --git a/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
index 902a3a5d23d..76cc9840a32 100644
--- a/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
+++ b/public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
@@ -18,7 +18,7 @@ published: 2021-04-22
[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 triệu đô la
[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 triệu đô la
-Tất cả họ đã đúc các NFT của mình bằng cách sử dụng Giao diện Lập trình Ứng dụng mạnh mẽ của Alchemy. Trong hướng dẫn này, chúng tôi sẽ dạy bạn cách làm điều tương tự trong vòng \<10 phút.
+Tất cả họ đã đúc các NFT của mình bằng cách sử dụng Giao diện Lập trình Ứng dụng mạnh mẽ của Alchemy. Trong hướng dẫn này, chúng tôi sẽ dạy bạn cách làm điều tương tự trong vòng \<10 phút.
“Đúc một NFT” là hành động xuất bản một phiên bản duy nhất của token ERC-721 của bạn trên chuỗi khối. Sử dụng hợp đồng thông minh của chúng tôi từ [Phần 1 của chuỗi hướng dẫn NFT này](/developers/tutorials/how-to-write-and-deploy-an-nft/), hãy vận dụng các kỹ năng Web3 của chúng ta và đúc một NFT. Khi kết thúc hướng dẫn này, bạn sẽ có thể đúc bao nhiêu NFT tùy thích (và ví của bạn cho phép)!
diff --git a/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
index 96a4b7a3ea3..f84104a1717 100644
--- a/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
+++ b/public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
@@ -51,8 +51,8 @@ Các hợp đồng luôn được thực thi từ byte đầu tiên. Đây là p
| 4 | MSTORE | Trống |
| 5 | PUSH1 0x04 | 0x04 |
| 7 | CALLDATASIZE | CALLDATASIZE 0x04 |
-| 8 | LT | CALLDATASIZE\<4 |
-| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 |
+| 8 | LT | CALLDATASIZE\<4 |
+| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 |
| C | JUMPI | Trống |
Mã này thực hiện hai việc:
@@ -429,7 +429,7 @@ Mã ở độ lệch 0x138-0x143 giống hệt với những gì chúng ta đã
| 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 |
+| 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 |
diff --git a/src/scripts/i18n/post_import_sanitize.ts b/src/scripts/i18n/post_import_sanitize.ts
index d386c89d5ab..0751d166bc8 100644
--- a/src/scripts/i18n/post_import_sanitize.ts
+++ b/src/scripts/i18n/post_import_sanitize.ts
@@ -1555,7 +1555,7 @@ function escapeMdxAngleBrackets(content: string): {
const original = parts[i]
// Match < followed by a digit (not already escaped, not part of HTML tag)
- parts[i] = parts[i].replace(/(? {
+ parts[i] = parts[i].replace(/(? {
fixCount++
return `<${digit}`
})
diff --git a/tests/unit/sanitizer/standalone-fixes.spec.ts b/tests/unit/sanitizer/standalone-fixes.spec.ts
index 7d2aa37100c..969f1817c40 100644
--- a/tests/unit/sanitizer/standalone-fixes.spec.ts
+++ b/tests/unit/sanitizer/standalone-fixes.spec.ts
@@ -74,8 +74,7 @@ test.describe("Standalone Fixes", () => {
})
test("fixes multiple broken links in one string", () => {
- const input =
- "See [link1] (url1) and [link2] (url2) for more."
+ const input = "See [link1] (url1) and [link2] (url2) for more."
const { content, fixCount } = fixBrokenMarkdownLinks(input)
expect(content).toBe("See [link1](url1) and [link2](url2) for more.")
expect(fixCount).toBe(2)
@@ -112,10 +111,9 @@ test.describe("Standalone Fixes", () => {
})
test("fixes prose but skips table in mixed content", () => {
- const input = [
- "\\*\\*bold\\*\\* prose",
- "| 2\\*\\*256 | value |",
- ].join("\n")
+ const input = ["\\*\\*bold\\*\\* prose", "| 2\\*\\*256 | value |"].join(
+ "\n"
+ )
const { content, fixCount } = fixEscapedBoldAndItalic(input)
expect(content).toContain("**bold** prose")
expect(content).toContain("| 2\\*\\*256 | value |")
@@ -211,6 +209,23 @@ test.describe("Standalone Fixes", () => {
expect(content).toBe(input)
expect(fixCount).toBe(0)
})
+
+ test("does not escape < that is already backslash-escaped", () => {
+ // English uses \<1 GB to escape < in MDX prose.
+ // The sanitizer must NOT convert \<1 to \<1 (double-escape).
+ const input =
+ "Accessible to resource-constrained devices (\\<1 GB RAM, \\<100 MB disk space, 1 CPU)"
+ const { content, fixCount } = escapeMdxAngleBrackets(input)
+ expect(content).toBe(input)
+ expect(fixCount).toBe(0)
+ })
+
+ test("does not escape backslash-escaped < before single digit", () => {
+ const input = "do the same in \\<10 minutes"
+ const { content, fixCount } = escapeMdxAngleBrackets(input)
+ expect(content).toBe(input)
+ expect(fixCount).toBe(0)
+ })
})
test.describe("removeOrphanedClosingTags", () => {
@@ -320,7 +335,7 @@ test.describe("Standalone Fixes", () => {
test.describe("quoteFrontmatterNonAscii", () => {
test("quotes values with non-ASCII characters", () => {
- const input = '---\ntitle: \u00DCber Ethereum\n---\nContent'
+ const input = "---\ntitle: \u00DCber Ethereum\n---\nContent"
const { content, fixCount } = quoteFrontmatterNonAscii(input)
expect(content).toContain('title: "\u00DCber Ethereum"')
expect(fixCount).toBe(1)
@@ -364,9 +379,7 @@ test.describe("Standalone Fixes", () => {
test.describe("Utility functions", () => {
test("toAsciiId normalizes accented characters", () => {
- expect(toAsciiId("qu-est-ce-qu-ethereum")).toBe(
- "qu-est-ce-qu-ethereum"
- )
+ expect(toAsciiId("qu-est-ce-qu-ethereum")).toBe("qu-est-ce-qu-ethereum")
expect(toAsciiId("\u00FCber-ethereum")).toBe("uber-ethereum")
})
@@ -411,8 +424,7 @@ test.describe("Standalone Fixes", () => {
test.describe("fixBackslashBeforeClosingTag", () => {
test("fixes backslash before ", () => {
- const input =
- 'Bon à savoir\\
'
+ const input = 'Bon à savoir\\
'
const { content, fixCount } = fixBackslashBeforeClosingTag(input)
expect(content).toBe(
'Bon à savoir
'
@@ -435,12 +447,9 @@ test.describe("Standalone Fixes", () => {
})
test("fixes multiple occurrences", () => {
- const input =
- "text1\\ and text2\\"
+ const input = "text1\\ and text2\\"
const { content, fixCount } = fixBackslashBeforeClosingTag(input)
- expect(content).toBe(
- "text1 and text2"
- )
+ expect(content).toBe("text1 and text2")
expect(fixCount).toBe(2)
})
@@ -452,8 +461,7 @@ test.describe("Standalone Fixes", () => {
})
test("skips code blocks", () => {
- const input =
- "```\ntext\\\n```"
+ const input = "```\ntext\\\n```"
const { content, fixCount } = fixBackslashBeforeClosingTag(input)
expect(content).toBe(input)
expect(fixCount).toBe(0)
@@ -470,22 +478,16 @@ test.describe("Standalone Fixes", () => {
test.describe("escapeMdxAngleBrackets — extended patterns", () => {
test("escapes bare < before word containing [", () => {
- const input =
- "| calldataload(4) {
- const input =
- "| {
})
test("does not escape valid MDX component tags", () => {
- const input = " "
+ const input = ' '
const { content, fixCount } = escapeMdxAngleBrackets(input)
expect(content).toBe(input)
expect(fixCount).toBe(0)
From 2f7bfa4979ae6174ba40812934510036e6eb97fd Mon Sep 17 00:00:00 2001
From: myelinated-wackerow
<263208946+myelinated-wackerow@users.noreply.github.com>
Date: Sat, 28 Feb 2026 00:28:09 +0000
Subject: [PATCH 19/31] docs: compound backslash-escape fix
Co-Authored-By: Claude Opus 4.6
Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
---
...port-sanitizer-regex-backslash-escaping.md | 154 ++++++++++++++++++
1 file changed, 154 insertions(+)
create mode 100644 docs/solutions/logic-errors/post-import-sanitizer-regex-backslash-escaping.md
diff --git a/docs/solutions/logic-errors/post-import-sanitizer-regex-backslash-escaping.md b/docs/solutions/logic-errors/post-import-sanitizer-regex-backslash-escaping.md
new file mode 100644
index 00000000000..6d9a598620f
--- /dev/null
+++ b/docs/solutions/logic-errors/post-import-sanitizer-regex-backslash-escaping.md
@@ -0,0 +1,154 @@
+---
+title: Fix double-escaping of backslash-escaped angle brackets in MDX sanitizer
+date: 2026-02-28
+category: logic-errors
+component: Translation post-import sanitizer
+tags:
+ - regex
+ - mdx
+ - escaping
+ - i18n
+ - sanitizer
+ - translation
+ - angle-brackets
+severity: high
+recurring: true
+languages_affected:
+ - vi
+ - cs
+ - fr
+ - ru
+files_modified:
+ - src/scripts/i18n/post_import_sanitize.ts
+ - tests/unit/sanitizer/standalone-fixes.spec.ts
+ - public/content/translations/cs/developers/tutorials/how-to-mint-an-nft/index.md
+ - public/content/translations/fr/developers/tutorials/how-to-mint-an-nft/index.md
+ - public/content/translations/ru/developers/docs/networking-layer/portal-network/index.md
+ - public/content/translations/ru/developers/tutorials/reverse-engineering-a-contract/index.md
+ - public/content/translations/vi/developers/docs/networking-layer/portal-network/index.md
+ - public/content/translations/vi/developers/tutorials/how-to-mint-an-nft/index.md
+ - public/content/translations/vi/developers/tutorials/reverse-engineering-a-contract/index.md
+---
+
+# Fix double-escaping of backslash-escaped angle brackets in MDX sanitizer
+
+## Problem Symptom
+
+Translated markdown files contained `\<1 GB RAM` instead of the correct `\<1 GB RAM`. This rendered as literal `\<` in the browser rather than the intended `<` character. The pattern appeared across multiple languages (vi, cs, fr, ru) in files like `portal-network/index.md`, `how-to-mint-an-nft/index.md`, and `reverse-engineering-a-contract/index.md`.
+
+The English source uses `\<1` as a valid MDX backslash escape for `<` before digits. After running the sanitizer, translations gained the extra `<` entity, producing a double-escape.
+
+## Root Cause Analysis
+
+The `escapeMdxAngleBrackets` function in `src/scripts/i18n/post_import_sanitize.ts` (line 1558) used the following regex:
+
+```typescript
+// BUGGY:
+parts[i] = parts[i].replace(/(? {
+ fixCount++
+ return `<${digit}`
+})
+```
+
+The negative lookbehind `(? {
+
+// AFTER (fixed):
+parts[i] = parts[i].replace(/(? {
+```
+
+The `\\` in the regex source represents a literal `\` character in the lookbehind, so the pattern now reads: "match `<` followed by a digit, but NOT if preceded by `<`, `&`, or `\`".
+
+### Tests Added
+
+Two new unit tests in `tests/unit/sanitizer/standalone-fixes.spec.ts`:
+
+```typescript
+test("does not escape < that is already backslash-escaped", () => {
+ const input =
+ "Accessible to resource-constrained devices (\\<1 GB RAM, \\<100 MB disk space, 1 CPU)"
+ const { content, fixCount } = escapeMdxAngleBrackets(input)
+ expect(content).toBe(input)
+ expect(fixCount).toBe(0)
+})
+
+test("does not escape backslash-escaped < before single digit", () => {
+ const input = "do the same in \\<10 minutes"
+ const { content, fixCount } = escapeMdxAngleBrackets(input)
+ expect(content).toBe(input)
+ expect(fixCount).toBe(0)
+})
+```
+
+All 131 tests pass (129 existing + 2 new).
+
+### Translation Files Repaired
+
+Reverted `\<` back to `\<` in 7 files across 4 languages:
+
+| Language | File |
+|----------|------|
+| cs | `developers/tutorials/how-to-mint-an-nft/index.md` |
+| fr | `developers/tutorials/how-to-mint-an-nft/index.md` |
+| ru | `developers/docs/networking-layer/portal-network/index.md` |
+| ru | `developers/tutorials/reverse-engineering-a-contract/index.md` |
+| vi | `developers/docs/networking-layer/portal-network/index.md` |
+| vi | `developers/tutorials/how-to-mint-an-nft/index.md` |
+| vi | `developers/tutorials/reverse-engineering-a-contract/index.md` |
+
+## Prevention Strategies
+
+### 1. Lookbehind Completeness Checklist
+
+For every negative lookbehind `(?
Date: Sat, 28 Feb 2026 11:36:22 +0100
Subject: [PATCH 20/31] fix(bug-bounty): comment out BugBountyBanner component
Temporarily disable the BugBountyBanner by commenting it out on the
bug bounty page, as indicated by the existing comment suggesting it
should be uncommented when needed.
---
app/[locale]/bug-bounty/page.tsx | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/app/[locale]/bug-bounty/page.tsx b/app/[locale]/bug-bounty/page.tsx
index 07d0bcb8f7e..1f0608c0b6e 100644
--- a/app/[locale]/bug-bounty/page.tsx
+++ b/app/[locale]/bug-bounty/page.tsx
@@ -4,7 +4,6 @@ import type { ComponentProps } from "react"
import type { ChildOnlyProp, CommitHistory, Lang, Params } from "@/lib/types"
/* Uncomment for Bug Bounty Banner: */
-import BugBountyBanner from "@/components/Banners/BugBountyBanner"
import Breadcrumbs from "@/components/Breadcrumbs"
import BugBountyCards from "@/components/BugBountyCards"
import Card from "@/components/Card"
@@ -257,7 +256,7 @@ export default async function Page({ params }: { params: Promise }) {
{/* Uncomment for Bug Bounty Banner: */}
-
+ {/* */}
From 150af4a73cce93b5d2234cccc53a27892ead5ecf Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 11:49:36 +0100
Subject: [PATCH 21/31] fix(bug-bounty): replace email contact with Google Form
submission
Replace all references to `bounty@ethereum.org` with a Google Form
link (https://forms.gle/Gnh4gzGh66Yc3V7G8) for bug submissions.
- Update validity description to point to the bug submission form
instead of email and PGP key
- Remove mailto links from FAQ Q5 and update response time note to
reflect increased AI submission volume (up to one week)
- Replace "email us" CTA with a "submit" link to the Google Form
- Swap `:email:` emoji for `:bug:` emoji in the contact section
- Remove FAQ Q1 and Q8 (PGP key instructions no longer relevant)
- Add new `not-included-li-9` exclusion list item
---
app/[locale]/bug-bounty/page.tsx | 83 ++------------------------------
src/intl/en/page-bug-bounty.json | 7 +--
2 files changed, 7 insertions(+), 83 deletions(-)
diff --git a/app/[locale]/bug-bounty/page.tsx b/app/[locale]/bug-bounty/page.tsx
index 1f0608c0b6e..5c726562798 100644
--- a/app/[locale]/bug-bounty/page.tsx
+++ b/app/[locale]/bug-bounty/page.tsx
@@ -345,11 +345,8 @@ export default async function Page({ params }: { params: Promise }) {
{t("page-upgrades-bug-bounty-validity")}
{t.rich("page-upgrades-bug-bounty-validity-desc", {
- mailto: (chunks) => (
- {chunks}
- ),
a: (chunks) => (
-
+
{chunks}
),
@@ -616,6 +613,7 @@ export default async function Page({ params }: { params: Promise }) {
{t("page-upgrades-bug-bounty-not-included-li-6")}
{t("page-upgrades-bug-bounty-not-included-li-7")}
{t("page-upgrades-bug-bounty-not-included-li-8")}
+ {t("page-upgrades-bug-bounty-not-included-li-9")}
*
@@ -705,47 +703,6 @@ export default async function Page({ params }: { params: Promise }) {
-
-
- {t.rich("bug-bounty-faq-q1-content-1", {
- strong: Strong,
- })}
-
-
- {t.rich("bug-bounty-faq-q1-content-2", {
- strong: Strong,
- })}
-
-
- {t.rich("bug-bounty-faq-q1-content-3", {
- strong: Strong,
- })}
-
-
- {t.rich("bug-bounty-faq-q1-content-4", {
- strong: Strong,
- })}
-
-
- {t.rich("bug-bounty-faq-q1-content-5", {
- strong: Strong,
- })}
-
-
- {t.rich("bug-bounty-faq-q1-content-6", {
- strong: Strong,
- code: (chunks) => {chunks},
- })}
-
-
- {t.rich("bug-bounty-faq-q1-content-7", {
- strong: Strong,
- })}
-
-
}) {
title={t("bug-bounty-faq-q5-title")}
contentPreview={t("bug-bounty-faq-q5-contentPreview")}
>
-
- {t.rich("bug-bounty-faq-q5-content-1", {
- a: (chunks) => (
- {chunks}
- ),
- })}
-
+ {t("bug-bounty-faq-q5-content-1")}
}) {
>
{t("bug-bounty-faq-q7-content-1")}
-
-
- {t.rich("bug-bounty-faq-q8-content-1", {
- code: (chunks) => {chunks},
- })}
-
-
- {t("bug-bounty-faq-q8-PGP-key")}
-
-
}) {
lastEditLocaleTimestamp={lastEditLocaleTimestamp}
/>
-
-
-
-
- {t("page-upgrades-bug-bounty-questions")}
-
-
- {t("page-upgrades-bug-bounty-email-us")}{" "}
-
- bounty@ethereum.org
-
-
-
-
-
>
diff --git a/src/intl/en/page-bug-bounty.json b/src/intl/en/page-bug-bounty.json
index c9f72f7db2a..794e7544808 100644
--- a/src/intl/en/page-bug-bounty.json
+++ b/src/intl/en/page-bug-bounty.json
@@ -73,7 +73,7 @@
"page-upgrades-bug-bounty-type-4": "Calculation or parameter inconsistencies",
"page-upgrades-bug-bounty-types": "Types of bugs",
"page-upgrades-bug-bounty-validity": "In Scope",
- "page-upgrades-bug-bounty-validity-desc": "Our bug bounty program spans end-to-end: from soundness of protocols (such as the blockchain consensus model, the wire and p2p protocols, proof of stake, etc.) and protocol/implementation compliance to network security and consensus integrity. Classical client security as well as security of cryptographic primitives are also part of the program. When in doubt, send an email to bounty@ethereum.org and ask us. You may also submit a disclosure/vulnerability directly to bounty@ethereum.org , in which case we ask that you encrypt the message using our PGP Key",
+ "page-upgrades-bug-bounty-validity-desc": "Our bug bounty program spans end-to-end: from soundness of protocols (such as the blockchain consensus model, the wire and p2p protocols, proof of stake, etc.) and protocol/implementation compliance to network security and consensus integrity. Classical client security as well as security of cryptographic primitives are also part of the program. All bug disclosures and vulnerability submissions must be made through our bug submission form.",
"page-upgrades-bug-bounty-card-critical": "Critical",
"page-upgrades-bug-bounty-card-critical-risk": "Submit critical risk bug",
"page-upgrades-bug-bounty-card-h2": "Medium",
@@ -125,7 +125,7 @@
"bug-bounty-faq-q4-content-1": "We can donate your reward to an established charitable organization of your choice.",
"bug-bounty-faq-q5-title": "I reported an issue / vulnerability but have not received a response!",
"bug-bounty-faq-q5-contentPreview": "Please allow a few days for someone to respond to your submission.",
- "bug-bounty-faq-q5-content-1": "We aim to respond to submissions as fast as possible. Feel free to email us at bounty@ethereum.org if you have not received a response within a day or two.",
+ "bug-bounty-faq-q5-content-1": "We aim to respond to submissions as fast as possible. Due to the increase in AI submissions, please allow up to a week for us to respond to your submission.",
"bug-bounty-faq-q6-title": "I want to be anonymous / I do not want my name on the leader board.",
"bug-bounty-faq-q6-contentPreview": "You can do this, but it might make you ineligible for rewards.",
"bug-bounty-faq-q6-content-1": "Submitting anonymously or with a pseudonym is OK, but will make you ineligible for ETH/DAI rewards. To be eligible for ETH/DAI rewards, we require your real name and a proof of your identity to be sent, encrypted using PGP on our secure drop website, to our legal team at the Ethereum Foundation who are the sole reviewers of the documentation. Donating your bounty to a charity doesn’t require your identity.",
@@ -165,5 +165,6 @@
"page-upgrades-bug-bounty-not-included-li-5": "Typographical errors",
"page-upgrades-bug-bounty-not-included-li-6": "Tests",
"page-upgrades-bug-bounty-not-included-li-7": "High-effort (sustained, CPU or bandwidth intensive, and/or requires more than 1 packet or onchain transaction) single-peer DoS attacks",
- "page-upgrades-bug-bounty-not-included-li-8": "Any publicly known issues (includes forum posts, PRs, github issues, commits, blog posts, public discord messages, etc.)"
+ "page-upgrades-bug-bounty-not-included-li-8": "Any publicly known issues (includes forum posts, PRs, github issues, commits, blog posts, public discord messages, etc.)",
+ "page-upgrades-bug-bounty-not-included-li-9": "Anything that does not currently have a direct impact on Ethereum mainnet."
}
From e821d66c85500b7928d6048e53d2bc55bb4c82b0 Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 11:52:17 +0100
Subject: [PATCH 22/31] content(bug-bounty): include EF grantees in bounty
program eligibility note
---
src/intl/en/page-bug-bounty.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/intl/en/page-bug-bounty.json b/src/intl/en/page-bug-bounty.json
index 794e7544808..c843463d593 100644
--- a/src/intl/en/page-bug-bounty.json
+++ b/src/intl/en/page-bug-bounty.json
@@ -28,7 +28,7 @@
"page-upgrades-bug-bounty-hunting-execution-leaderboard-subtitle": "Find execution layer bugs to get added to this leaderboard",
"page-upgrades-bug-bounty-hunting-li-1": "Issues without a POC or that have already been submitted by another user or are already known to spec and client maintainers are not eligible for bounty rewards.",
"page-upgrades-bug-bounty-hunting-li-2": "Public disclosure of a vulnerability or reporting it to other parties without prior agreement makes it ineligible for a bounty.",
- "page-upgrades-bug-bounty-hunting-li-3": "Employees and contractors of the Ethereum Foundation or client teams in scope of the bounty program may participate in the program only in the accrual of points and will not receive monetary rewards.",
+ "page-upgrades-bug-bounty-hunting-li-3": "Employees and contractors of the Ethereum Foundation, Ethereum Foundation grantees, or client teams in scope of the bounty program may participate in the program only in the accrual of points and will not receive monetary rewards.",
"page-upgrades-bug-bounty-hunting-li-4": "Ethereum bounty program considers a number of variables in determining rewards. Determinations of eligibility, score and all terms related to an award are at the sole and final discretion of the Ethereum Foundation bug bounty panel.",
"page-upgrades-bug-bounty-leaderboard": "See full leaderboards",
"page-upgrades-bug-bounty-leaderboard-list": "Bug bounty leaderboard",
From d8da36c6f8153028c391bf3bb45ef29f88e8426f Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 12:43:14 +0100
Subject: [PATCH 23/31] refactor(bug-bounty): remove outdated submission
details and card severity content
Remove deprecated text sections from the bug bounty page, including
submission description, points, quality, and fix-related paragraphs.
Also strip severity list items, subheaders, and text fields from
BugBountyCards component and its data definitions, simplifying the
card structure across all severity levels (low, medium, high, critical).
---
app/[locale]/bug-bounty/page.tsx | 26 -----------------------
src/components/BugBountyCards.tsx | 35 -------------------------------
src/intl/en/page-bug-bounty.json | 11 ----------
3 files changed, 72 deletions(-)
diff --git a/app/[locale]/bug-bounty/page.tsx b/app/[locale]/bug-bounty/page.tsx
index 5c726562798..286f2daba79 100644
--- a/app/[locale]/bug-bounty/page.tsx
+++ b/app/[locale]/bug-bounty/page.tsx
@@ -626,32 +626,6 @@ export default async function Page({ params }: { params: Promise }) {
{t("page-upgrades-bug-bounty-submit")}
-
- {t.rich("page-upgrades-bug-bounty-submit-desc", {
- strong: Strong,
- })}{" "}
-
- {t("page-upgrades-bug-bounty-owasp")}
-
-
- {t("page-upgrades-bug-bounty-points")}
-
-
- {t("page-upgrades-bug-bounty-quality")}
-
- {t("page-upgrades-bug-bounty-quality-desc")}
-
-
-
- {t("page-upgrades-bug-bounty-quality-repro")}
-
- {t("page-upgrades-bug-bounty-quality-repro-desc")}
-
-
- {t.rich("page-upgrades-bug-bounty-quality-fix", {
- strong: Strong,
- })}
-
diff --git a/src/components/BugBountyCards.tsx b/src/components/BugBountyCards.tsx
index 2db59f97921..a9d19c4b058 100644
--- a/src/components/BugBountyCards.tsx
+++ b/src/components/BugBountyCards.tsx
@@ -45,10 +45,6 @@ export interface BugBountyCardInfo {
h2TranslationId: TranslationKey
descriptionTranslationId: TranslationKey
subDescriptionTranslationId: TranslationKey
- subHeader1TranslationId: TranslationKey
- severityList: TranslationKey[]
- subHeader2TranslationId: TranslationKey
- textTranslationId: TranslationKey
styledButtonTranslationId: TranslationKey
}
@@ -58,13 +54,6 @@ const bugBountyCardsInfo: BugBountyCardInfo[] = [
h2TranslationId: "page-upgrades-bug-bounty-card-low",
descriptionTranslationId: "page-upgrades-bug-bounty-card-label-2",
subDescriptionTranslationId: "page-upgrades-bug-bounty-card-label-1",
- subHeader1TranslationId: "page-upgrades-bug-bounty-card-subheader",
- severityList: [
- "page-upgrades-bug-bounty-card-li-1",
- "page-upgrades-bug-bounty-card-li-2",
- ],
- subHeader2TranslationId: "page-upgrades-bug-bounty-card-subheader-2",
- textTranslationId: "page-upgrades-bug-bounty-card-text",
styledButtonTranslationId: "page-upgrades-bug-bounty-card-low-risk",
},
{
@@ -72,14 +61,6 @@ const bugBountyCardsInfo: BugBountyCardInfo[] = [
h2TranslationId: "page-upgrades-bug-bounty-card-h2",
descriptionTranslationId: "page-upgrades-bug-bounty-card-label-4",
subDescriptionTranslationId: "page-upgrades-bug-bounty-card-label-3",
- subHeader1TranslationId: "page-upgrades-bug-bounty-card-subheader",
- severityList: [
- "page-upgrades-bug-bounty-card-li-3",
- "page-upgrades-bug-bounty-card-li-4",
- "page-upgrades-bug-bounty-card-li-5",
- ],
- subHeader2TranslationId: "page-upgrades-bug-bounty-card-subheader-2",
- textTranslationId: "page-upgrades-bug-bounty-card-text-1",
styledButtonTranslationId: "page-upgrades-bug-bounty-card-medium-risk",
},
{
@@ -87,13 +68,6 @@ const bugBountyCardsInfo: BugBountyCardInfo[] = [
h2TranslationId: "page-upgrades-bug-bounty-card-high",
descriptionTranslationId: "page-upgrades-bug-bounty-card-label-6",
subDescriptionTranslationId: "page-upgrades-bug-bounty-card-label-5",
- subHeader1TranslationId: "page-upgrades-bug-bounty-card-subheader",
- severityList: [
- "page-upgrades-bug-bounty-card-li-6",
- "page-upgrades-bug-bounty-card-li-7",
- ],
- subHeader2TranslationId: "page-upgrades-bug-bounty-card-subheader-2",
- textTranslationId: "page-upgrades-bug-bounty-card-text-2",
styledButtonTranslationId: "page-upgrades-bug-bounty-card-high-risk",
},
{
@@ -101,10 +75,6 @@ const bugBountyCardsInfo: BugBountyCardInfo[] = [
h2TranslationId: "page-upgrades-bug-bounty-card-critical",
descriptionTranslationId: "page-upgrades-bug-bounty-card-label-8",
subDescriptionTranslationId: "page-upgrades-bug-bounty-card-label-7",
- subHeader1TranslationId: "page-upgrades-bug-bounty-card-subheader",
- severityList: ["page-upgrades-bug-bounty-card-li-8"],
- subHeader2TranslationId: "page-upgrades-bug-bounty-card-subheader-2",
- textTranslationId: "page-upgrades-bug-bounty-card-text-3",
styledButtonTranslationId: "page-upgrades-bug-bounty-card-critical-risk",
},
]
@@ -156,11 +126,6 @@ const BugBountyCards = () => {
{t(card.subHeader1TranslationId)}
-
- {card.severityList.map((listItemId) => (
- - {t(listItemId)}
- ))}
-
diff --git a/src/intl/en/page-bug-bounty.json b/src/intl/en/page-bug-bounty.json
index c843463d593..9aa4d9a04c2 100644
--- a/src/intl/en/page-bug-bounty.json
+++ b/src/intl/en/page-bug-bounty.json
@@ -40,7 +40,6 @@
"page-upgrades-bug-bounty-not-included": "Out of scope",
"page-upgrades-bug-bounty-not-included-desc": "Only the targets listed under in-scope are part of the Bug Bounty Program. Vulnerabilities that do NOT qualify under the program include:",
"page-upgrades-bug-bounty-owasp": "View OWASP method",
- "page-upgrades-bug-bounty-points": "The EF will also provide rewards based on:",
"page-upgrades-bug-bounty-points-error": "Error loading data... please refresh.",
"page-upgrades-bug-bounty-points-exchange": "Points Exchange",
"page-upgrades-bug-bounty-points-loading": "Loading data...",
@@ -48,11 +47,6 @@
"page-upgrades-bug-bounty-points-point": "1 point",
"page-upgrades-bug-bounty-points-rights-desc": "The Ethereum Foundation reserves the right to change this without prior notice.",
"page-upgrades-bug-bounty-points-usd": "2 USD",
- "page-upgrades-bug-bounty-quality": "Quality of description",
- "page-upgrades-bug-bounty-quality-desc": ": Higher rewards are paid for clear, well-written submissions.",
- "page-upgrades-bug-bounty-quality-fix": "Quality of fix, if included: Higher rewards are paid for submissions with clear description of how to fix the issue.",
- "page-upgrades-bug-bounty-quality-repro": "Quality of reproducibility",
- "page-upgrades-bug-bounty-quality-repro-desc": ": A Proof of Concept (POC) must be included to be eligible for rewards. Please include test code, scripts and detailed instructions. The easier it is for us to reproduce and verify the vulnerability, the higher the reward.",
"page-upgrades-bug-bounty-questions": "Questions?",
"page-upgrades-bug-bounty-rules": "Read rules",
"page-upgrades-bug-bounty-slogan": "Bug Bounty Program",
@@ -60,7 +54,6 @@
"page-upgrades-bug-bounty-execution-specs": "Execution Layer Specifications",
"page-upgrades-bug-bounty-specs-docs": "Specification documents",
"page-upgrades-bug-bounty-submit": "Submit a bug",
- "page-upgrades-bug-bounty-submit-desc": "For each valid bug you find you’ll earn rewards. The quantity of rewards awarded will vary depending on severity. The severity is calculated according to the OWASP risk rating model based on Impact on the Ethereum Network and Likelihood.",
"page-upgrades-bug-bounty-subtitle": "Earn up to 250,000 USD and a place on the leaderboard by finding protocol, client and language compiler bugs affecting the Ethereum network.",
"page-upgrades-bug-bounty-title": "Open for submissions",
"page-upgrades-bug-bounty-title-1": "Beacon Chain",
@@ -100,10 +93,6 @@
"page-upgrades-bug-bounty-card-medium-risk": "Submit medium risk bug",
"page-upgrades-bug-bounty-card-subheader": "Severity",
"page-upgrades-bug-bounty-card-subheader-2": "Example",
- "page-upgrades-bug-bounty-card-text": "Attacker can sometimes put a node in a state that causes it to drop one out of every one hundred attestations made by a validator",
- "page-upgrades-bug-bounty-card-text-1": "Attacker can successfully conduct eclipse attacks on nodes with peer-ids with 4 leading zero bytes",
- "page-upgrades-bug-bounty-card-text-2": "Attacker can successfully partition large parts of the network, and it is trivial for an attacker to trigger the vulnerability",
- "page-upgrades-bug-bounty-card-text-3": "Attacker can successfully conduct remote code execution in a majority client, and it is trivial for an attacker to trigger the vulnerability",
"page-upgrades-question-title": "Frequently asked questions",
"bug-bounty-faq-q1-title": "What should a good vulnerability submission look like?",
"bug-bounty-faq-q1-contentPreview": "See a real example of a quality vulnerability submission.",
From 1f083f50424b050565d84e4ec6df03621ab6c12b Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 12:45:06 +0100
Subject: [PATCH 24/31] fix(bug-bounty): wrap leaderboards in Flex for
side-by-side layout
Wrap the execution and consensus leaderboard containers in a `Flex`
component to display them side by side on large screens (`lg:flex-row`)
while stacking vertically on smaller screens (`flex-col`), improving
the layout and use of available space.
---
app/[locale]/bug-bounty/page.tsx | 42 +++++++++++++++++---------------
1 file changed, 22 insertions(+), 20 deletions(-)
diff --git a/app/[locale]/bug-bounty/page.tsx b/app/[locale]/bug-bounty/page.tsx
index 286f2daba79..b605658a08a 100644
--- a/app/[locale]/bug-bounty/page.tsx
+++ b/app/[locale]/bug-bounty/page.tsx
@@ -647,26 +647,28 @@ export default async function Page({ params }: { params: Promise }) {
-
-
- {t("page-upgrades-bug-bounty-hunting-execution-leaderboard")}
-
-
- {t(
- "page-upgrades-bug-bounty-hunting-execution-leaderboard-subtitle"
- )}
-
-
-
-
-
- {t("page-upgrades-bug-bounty-hunting-leaderboard")}
-
-
- {t("page-upgrades-bug-bounty-hunting-leaderboard-subtitle")}
-
-
-
+
+
+
+ {t("page-upgrades-bug-bounty-hunting-execution-leaderboard")}
+
+
+ {t(
+ "page-upgrades-bug-bounty-hunting-execution-leaderboard-subtitle"
+ )}
+
+
+
+
+
+ {t("page-upgrades-bug-bounty-hunting-leaderboard")}
+
+
+ {t("page-upgrades-bug-bounty-hunting-leaderboard-subtitle")}
+
+
+
+
From 6669e5ad32c5e0ae8a8c40d96462b6ca40f26a9f Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 12:49:40 +0100
Subject: [PATCH 25/31] fix(bug-bounty): reorder page sections for better
content flow
Move the "hunting rules" and "out-of-scope" sections to appear before
the severity qualifications section, rather than after BugBountyCards.
This improves the logical reading order of the bug bounty page.
---
app/[locale]/bug-bounty/page.tsx | 98 +++++++++++++++++---------------
1 file changed, 51 insertions(+), 47 deletions(-)
diff --git a/app/[locale]/bug-bounty/page.tsx b/app/[locale]/bug-bounty/page.tsx
index b605658a08a..813d8854e10 100644
--- a/app/[locale]/bug-bounty/page.tsx
+++ b/app/[locale]/bug-bounty/page.tsx
@@ -471,6 +471,57 @@ export default async function Page({ params }: { params: Promise }) {
+
+ {t("page-upgrades-bug-bounty-hunting")}
+
+ {t("page-upgrades-bug-bounty-hunting-desc")}
+
+
+
+ {t("page-upgrades-bug-bounty-hunting-li-1")}
+
+
+ {t("page-upgrades-bug-bounty-hunting-li-2")}
+
+
+ {t("page-upgrades-bug-bounty-hunting-li-3")}
+
+
+ {t("page-upgrades-bug-bounty-hunting-li-4")}
+
+
+
+
+
+ {t("page-upgrades-bug-bounty-not-included")}
+
+
+ {t.rich("page-upgrades-bug-bounty-not-included-desc", {
+ a: (chunks) => {chunks},
+ })}
+
+
+ -
+ {t("page-upgrades-bug-bounty-not-included-li-1")}
+ *
+
+ -
+ {t("page-upgrades-bug-bounty-not-included-li-2")}
+ *
+
+ - {t("page-upgrades-bug-bounty-not-included-li-3")}
+ - {t("page-upgrades-bug-bounty-not-included-li-4")}
+ - {t("page-upgrades-bug-bounty-not-included-li-5")}
+ - {t("page-upgrades-bug-bounty-not-included-li-6")}
+ - {t("page-upgrades-bug-bounty-not-included-li-7")}
+ - {t("page-upgrades-bug-bounty-not-included-li-8")}
+ - {t("page-upgrades-bug-bounty-not-included-li-9")}
+
+
+ *
+ {t("page-upgrades-bug-bounty-out-of-scope-footnote")}
+
+
{t("page-upgrades-bug-bounty-severity-qualifications-title")}
@@ -589,37 +640,6 @@ export default async function Page({ params }: { params: Promise }) {
-
-
- {t("page-upgrades-bug-bounty-not-included")}
-
-
- {t.rich("page-upgrades-bug-bounty-not-included-desc", {
- a: (chunks) => {chunks},
- })}
-
-
- -
- {t("page-upgrades-bug-bounty-not-included-li-1")}
- *
-
- -
- {t("page-upgrades-bug-bounty-not-included-li-2")}
- *
-
- - {t("page-upgrades-bug-bounty-not-included-li-3")}
- - {t("page-upgrades-bug-bounty-not-included-li-4")}
- - {t("page-upgrades-bug-bounty-not-included-li-5")}
- - {t("page-upgrades-bug-bounty-not-included-li-6")}
- - {t("page-upgrades-bug-bounty-not-included-li-7")}
- - {t("page-upgrades-bug-bounty-not-included-li-8")}
- - {t("page-upgrades-bug-bounty-not-included-li-9")}
-
-
- *
- {t("page-upgrades-bug-bounty-out-of-scope-footnote")}
-
-
@@ -630,22 +650,6 @@ export default async function Page({ params }: { params: Promise }) {
-
-
- {t("page-upgrades-bug-bounty-hunting")}
-
- {t("page-upgrades-bug-bounty-hunting-desc")}
-
-
- {t("page-upgrades-bug-bounty-hunting-li-1")}
- {t("page-upgrades-bug-bounty-hunting-li-2")}
- {t("page-upgrades-bug-bounty-hunting-li-3")}
-
- {t("page-upgrades-bug-bounty-hunting-li-4")}
-
-
-
-
From 5f96586ae93a673a5c934a0eeeef78132d781cd6 Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 12:57:06 +0100
Subject: [PATCH 26/31] refactor(bug-bounty): modernize page layout with styled
list components
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Replace legacy `UnorderedList`/`ListItem` components with styled native
HTML list elements across the Bug Hunting Rules, Out of Scope, and
In Scope sections. Updates include:
- Numbered rule items with primary-colored badges
- Card-style bordered containers for scoped/out-of-scope lists
- Visual indicators (✕/✓) for exclusion/inclusion lists
- Improved typography using `text-body-medium` and spacing utilities
- Refactor repeated list items into mapped arrays for maintainability
---
app/[locale]/bug-bounty/page.tsx | 190 ++++++++++++++++++------------
src/components/BugBountyCards.tsx | 8 +-
src/intl/en/page-bug-bounty.json | 2 +-
3 files changed, 122 insertions(+), 78 deletions(-)
diff --git a/app/[locale]/bug-bounty/page.tsx b/app/[locale]/bug-bounty/page.tsx
index 813d8854e10..78c8daa8dd2 100644
--- a/app/[locale]/bug-bounty/page.tsx
+++ b/app/[locale]/bug-bounty/page.tsx
@@ -471,69 +471,116 @@ export default async function Page({ params }: { params: Promise }) {
-
+ {/* Bug Hunting Rules */}
+
{t("page-upgrades-bug-bounty-hunting")}
-
+
{t("page-upgrades-bug-bounty-hunting-desc")}
-
-
- {t("page-upgrades-bug-bounty-hunting-li-1")}
-
-
- {t("page-upgrades-bug-bounty-hunting-li-2")}
-
-
- {t("page-upgrades-bug-bounty-hunting-li-3")}
-
-
- {t("page-upgrades-bug-bounty-hunting-li-4")}
-
-
+
+ {(
+ [
+ "page-upgrades-bug-bounty-hunting-li-1",
+ "page-upgrades-bug-bounty-hunting-li-2",
+ "page-upgrades-bug-bounty-hunting-li-3",
+ "page-upgrades-bug-bounty-hunting-li-4",
+ ] as const
+ ).map((key, idx) => (
+ -
+
+ {idx + 1}
+
+ {t(key)}
+
+ ))}
+
-
-
- {t("page-upgrades-bug-bounty-not-included")}
-
-
+
+ {/* Out of Scope */}
+
+ {t("page-upgrades-bug-bounty-not-included")}
+
{t.rich("page-upgrades-bug-bounty-not-included-desc", {
a: (chunks) => {chunks},
})}
-
- -
- {t("page-upgrades-bug-bounty-not-included-li-1")}
- *
-
- -
- {t("page-upgrades-bug-bounty-not-included-li-2")}
+
+
+ {(
+ [
+ {
+ key: "page-upgrades-bug-bounty-not-included-li-1",
+ footnote: true,
+ },
+ {
+ key: "page-upgrades-bug-bounty-not-included-li-2",
+ footnote: true,
+ },
+ {
+ key: "page-upgrades-bug-bounty-not-included-li-3",
+ footnote: false,
+ },
+ {
+ key: "page-upgrades-bug-bounty-not-included-li-4",
+ footnote: false,
+ },
+ {
+ key: "page-upgrades-bug-bounty-not-included-li-5",
+ footnote: false,
+ },
+ {
+ key: "page-upgrades-bug-bounty-not-included-li-6",
+ footnote: false,
+ },
+ {
+ key: "page-upgrades-bug-bounty-not-included-li-7",
+ footnote: false,
+ },
+ {
+ key: "page-upgrades-bug-bounty-not-included-li-8",
+ footnote: false,
+ },
+ {
+ key: "page-upgrades-bug-bounty-not-included-li-9",
+ footnote: false,
+ },
+ ] as const
+ ).map(({ key, footnote }) => (
+ -
+ ✕
+
+ {t(key)}
+ {footnote && *}
+
+
+ ))}
+
+
*
-
-
- {t("page-upgrades-bug-bounty-not-included-li-3")}
- - {t("page-upgrades-bug-bounty-not-included-li-4")}
- - {t("page-upgrades-bug-bounty-not-included-li-5")}
- - {t("page-upgrades-bug-bounty-not-included-li-6")}
- - {t("page-upgrades-bug-bounty-not-included-li-7")}
- - {t("page-upgrades-bug-bounty-not-included-li-8")}
- - {t("page-upgrades-bug-bounty-not-included-li-9")}
-
-
- *
- {t("page-upgrades-bug-bounty-out-of-scope-footnote")}
-
+ {t("page-upgrades-bug-bounty-out-of-scope-footnote")}
+
+
-
+
+ {/* Vulnerability Severity Qualifications */}
+
{t("page-upgrades-bug-bounty-severity-qualifications-title")}
-
+
{t("page-upgrades-bug-bounty-severity-qualifications-desc")}
-
-
-
- {t("page-upgrades-bug-bounty-severity-low-title")}
-
+
+ {/* Low */}
+
+
+ {t("page-upgrades-bug-bounty-severity-low-title")}
+
+
-
{t.rich("page-upgrades-bug-bounty-severity-low-li-1", {
strong: StrongGreaterThan,
@@ -551,9 +598,12 @@ export default async function Page({ params }: { params: Promise
}) {
-
- {t("page-upgrades-bug-bounty-severity-medium-title")}
-
+ {/* Medium */}
+
+
+ {t("page-upgrades-bug-bounty-severity-medium-title")}
+
+
-
{t.rich("page-upgrades-bug-bounty-severity-medium-li-1", {
strong: StrongGreaterThan,
@@ -571,9 +621,12 @@ export default async function Page({ params }: { params: Promise
}) {
-
- {t("page-upgrades-bug-bounty-severity-high-title")}
-
+ {/* High */}
+
+
+ {t("page-upgrades-bug-bounty-severity-high-title")}
+
+
-
{t.rich("page-upgrades-bug-bounty-severity-high-li-1", {
strong: StrongGreaterThan,
@@ -591,49 +644,40 @@ export default async function Page({ params }: { params: Promise
}) {
-
-
+ {/* Critical */}
+
+
{t("page-upgrades-bug-bounty-severity-critical-title")}
-
-
+
+
-
{t.rich(
"page-upgrades-bug-bounty-severity-critical-li-1",
- {
- strong: StrongGreaterThan,
- }
+ { strong: StrongGreaterThan }
)}
-
{t.rich(
"page-upgrades-bug-bounty-severity-critical-li-2",
- {
- strong: Strong,
- }
+ { strong: Strong }
)}
-
{t.rich(
"page-upgrades-bug-bounty-severity-critical-li-3",
- {
- strong: Strong,
- }
+ { strong: Strong }
)}
-
{t.rich(
"page-upgrades-bug-bounty-severity-critical-li-4",
- {
- strong: Strong,
- }
+ { strong: Strong }
)}
-
{t.rich(
"page-upgrades-bug-bounty-severity-critical-li-5",
- {
- strong: Strong,
- }
+ { strong: Strong }
)}
diff --git a/src/components/BugBountyCards.tsx b/src/components/BugBountyCards.tsx
index a9d19c4b058..5add46a1447 100644
--- a/src/components/BugBountyCards.tsx
+++ b/src/components/BugBountyCards.tsx
@@ -18,10 +18,10 @@ type LabelProps = FlexProps & {
}
const classNameByVariant = {
- low: "bg-red-100 text-black",
- medium: "bg-red-300 text-black",
- high: "bg-red-700 text-white",
- critical: "bg-red-900 text-white",
+ low: "bg-green-500/15 text-green-700 dark:text-green-300",
+ medium: "bg-yellow-500/15 text-yellow-700 dark:text-yellow-300",
+ high: "bg-orange-500/15 text-orange-700 dark:text-orange-300",
+ critical: "bg-red-500/15 text-red-700 dark:text-red-300",
}
const Label = ({ children, variant = "medium", ...props }: LabelProps) => {
diff --git a/src/intl/en/page-bug-bounty.json b/src/intl/en/page-bug-bounty.json
index 9aa4d9a04c2..baeca628e99 100644
--- a/src/intl/en/page-bug-bounty.json
+++ b/src/intl/en/page-bug-bounty.json
@@ -146,7 +146,7 @@
"page-upgrades-bug-bounty-severity-critical-li-3": "Steal ETH from all EOAs",
"page-upgrades-bug-bounty-severity-critical-li-4": "Burn ETH from all EOAs",
"page-upgrades-bug-bounty-severity-critical-li-5": "Take down the entire network by sending a single malicious onchain transaction that ends up crashing all clients",
- "page-upgrades-bug-bounty-out-of-scope-footnote": "These are typically not included, however, we can help reach out to affected parties, such as authors or exchanges in such cases",
+ "page-upgrades-bug-bounty-out-of-scope-footnote": "These are not included, however, we can sometimes help reaching out to affected parties",
"page-upgrades-bug-bounty-not-included-li-1": "Infrastructure bugs—such as webpages, dns, email, etc.",
"page-upgrades-bug-bounty-not-included-li-2": "ERC-20 contract bugs",
"page-upgrades-bug-bounty-not-included-li-3": "Ethereum Naming Service (ENS) bugs (maintained by the ENS foundation)",
From df2c7ac408fdb8db76cc9f43ead92e7b83381978 Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 12:58:55 +0100
Subject: [PATCH 27/31] fix(bug-bounty): move leaderboard anchor id to section
container
Relocates the `id="leaderboard"` attribute from a list item (index 3)
to the leaderboard section `div` container, ensuring the anchor link
points to the correct and more semantically appropriate element.
---
app/[locale]/bug-bounty/page.tsx | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/[locale]/bug-bounty/page.tsx b/app/[locale]/bug-bounty/page.tsx
index 78c8daa8dd2..f106060c807 100644
--- a/app/[locale]/bug-bounty/page.tsx
+++ b/app/[locale]/bug-bounty/page.tsx
@@ -488,7 +488,6 @@ export default async function Page({ params }: { params: Promise }) {
).map((key, idx) => (
-
@@ -694,7 +693,10 @@ export default async function Page({ params }: { params: Promise
}) {
-
+
From 57f0abfa73cfb925c9f135fc2977f9995b2cc725 Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 13:07:00 +0100
Subject: [PATCH 28/31] refactor(BugBountyCards): remove unused sub-headers and
text sections
Remove the `subHeader1`, `subHeader2`, and associated text elements
from the bug bounty card layout, simplifying the card structure to
only show the description and call-to-action button.
---
src/components/BugBountyCards.tsx | 13 -------------
1 file changed, 13 deletions(-)
diff --git a/src/components/BugBountyCards.tsx b/src/components/BugBountyCards.tsx
index 5add46a1447..95aae72a54b 100644
--- a/src/components/BugBountyCards.tsx
+++ b/src/components/BugBountyCards.tsx
@@ -122,19 +122,6 @@ const BugBountyCards = () => {
{t(card.subDescriptionTranslationId)}
-
-
- {t(card.subHeader1TranslationId)}
-
-
-
-
-
- {t(card.subHeader2TranslationId)}
-
- {t(card.textTranslationId)}
-
-
{t(card.styledButtonTranslationId)}
From e6aef508201c629d445986defec0a187828c3418 Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 14:30:42 +0100
Subject: [PATCH 29/31] refactor(bug-bounty): reorder sections and update
layout styling
Restructure the bug bounty page by moving "Out of Scope" before
"Bug Hunting Rules" sections and wrapping both in styled card
containers with consistent border and background styling. Removes
the `max-w-[100ch]` width constraint and updates section containers
to use `flex-[1_1_100%]` with overflow handling for better layout
consistency.
---
app/[locale]/bug-bounty/page.tsx | 81 ++++++++++++++++----------------
1 file changed, 41 insertions(+), 40 deletions(-)
diff --git a/app/[locale]/bug-bounty/page.tsx b/app/[locale]/bug-bounty/page.tsx
index f106060c807..ad13a254ed8 100644
--- a/app/[locale]/bug-bounty/page.tsx
+++ b/app/[locale]/bug-bounty/page.tsx
@@ -341,7 +341,7 @@ export default async function Page({ params }: { params: Promise }) {
-
+
{t("page-upgrades-bug-bounty-validity")}
{t.rich("page-upgrades-bug-bounty-validity-desc", {
@@ -470,44 +470,17 @@ export default async function Page({ params }: { params: Promise }) {
-
- {/* Bug Hunting Rules */}
-
- {t("page-upgrades-bug-bounty-hunting")}
-
- {t("page-upgrades-bug-bounty-hunting-desc")}
-
-
- {(
- [
- "page-upgrades-bug-bounty-hunting-li-1",
- "page-upgrades-bug-bounty-hunting-li-2",
- "page-upgrades-bug-bounty-hunting-li-3",
- "page-upgrades-bug-bounty-hunting-li-4",
- ] as const
- ).map((key, idx) => (
- -
-
- {idx + 1}
-
- {t(key)}
-
- ))}
-
-
-
- {/* Out of Scope */}
-
- {t("page-upgrades-bug-bounty-not-included")}
-
- {t.rich("page-upgrades-bug-bounty-not-included-desc", {
- a: (chunks) => {chunks},
- })}
-
-
+ {/* Out of Scope */}
+
+ {t("page-upgrades-bug-bounty-not-included")}
+
+ {t.rich("page-upgrades-bug-bounty-not-included-desc", {
+ a: (chunks) => {chunks},
+ })}
+
{(
[
@@ -563,7 +536,35 @@ export default async function Page({ params }: { params: Promise }) {
{t("page-upgrades-bug-bounty-out-of-scope-footnote")}
-
+
+ {/* Bug Hunting Rules */}
+
+ {t("page-upgrades-bug-bounty-hunting")}
+
+ {t("page-upgrades-bug-bounty-hunting-desc")}
+
+
+ {(
+ [
+ "page-upgrades-bug-bounty-hunting-li-1",
+ "page-upgrades-bug-bounty-hunting-li-2",
+ "page-upgrades-bug-bounty-hunting-li-3",
+ "page-upgrades-bug-bounty-hunting-li-4",
+ ] as const
+ ).map((key, idx) => (
+ -
+
+ {idx + 1}
+
+ {t(key)}
+
+ ))}
+
+
+
{/* Vulnerability Severity Qualifications */}
From 45d73e70206261ff0a91589d4ac1ccf6f2c8abf9 Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Sat, 28 Feb 2026 14:33:46 +0100
Subject: [PATCH 30/31] fix(bug-bounty): update card styles and fix grammar in
footnote
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Replace `rounded` with `rounded-sm` and `border-border bg-background` with `border-solid bg-background-highlight` on "Out of Scope" and "Bug Hunting Rules" sections for visual consistency
- Revert inner rule list item background from `bg-background-highlight` back to `bg-background` to maintain correct contrast
- Fix grammar in `page-upgrades-bug-bounty-out-of-scope-footnote`: "help reaching out" → "help reach out"
---
app/[locale]/bug-bounty/page.tsx | 6 +++---
src/intl/en/page-bug-bounty.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/app/[locale]/bug-bounty/page.tsx b/app/[locale]/bug-bounty/page.tsx
index ad13a254ed8..98df167612f 100644
--- a/app/[locale]/bug-bounty/page.tsx
+++ b/app/[locale]/bug-bounty/page.tsx
@@ -473,7 +473,7 @@ export default async function Page({ params }: { params: Promise }) {
{/* Out of Scope */}
{t("page-upgrades-bug-bounty-not-included")}
@@ -538,7 +538,7 @@ export default async function Page({ params }: { params: Promise }) {
{/* Bug Hunting Rules */}
-
+
{t("page-upgrades-bug-bounty-hunting")}
{t("page-upgrades-bug-bounty-hunting-desc")}
@@ -554,7 +554,7 @@ export default async function Page({ params }: { params: Promise }) {
).map((key, idx) => (
-
{idx + 1}
diff --git a/src/intl/en/page-bug-bounty.json b/src/intl/en/page-bug-bounty.json
index baeca628e99..65c001c7cfb 100644
--- a/src/intl/en/page-bug-bounty.json
+++ b/src/intl/en/page-bug-bounty.json
@@ -146,7 +146,7 @@
"page-upgrades-bug-bounty-severity-critical-li-3": "Steal ETH from all EOAs",
"page-upgrades-bug-bounty-severity-critical-li-4": "Burn ETH from all EOAs",
"page-upgrades-bug-bounty-severity-critical-li-5": "Take down the entire network by sending a single malicious onchain transaction that ends up crashing all clients",
- "page-upgrades-bug-bounty-out-of-scope-footnote": "These are not included, however, we can sometimes help reaching out to affected parties",
+ "page-upgrades-bug-bounty-out-of-scope-footnote": "These are not included, however, we can sometimes help reach out to affected parties",
"page-upgrades-bug-bounty-not-included-li-1": "Infrastructure bugs—such as webpages, dns, email, etc.",
"page-upgrades-bug-bounty-not-included-li-2": "ERC-20 contract bugs",
"page-upgrades-bug-bounty-not-included-li-3": "Ethereum Naming Service (ENS) bugs (maintained by the ENS foundation)",
From 9aa95eb7a35e132508884cbf90ac5aa6d61bb1c3 Mon Sep 17 00:00:00 2001
From: Fredrik Svantes
Date: Mon, 2 Mar 2026 15:14:48 +0100
Subject: [PATCH 31/31] text update
---
src/intl/en/page-bug-bounty.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/intl/en/page-bug-bounty.json b/src/intl/en/page-bug-bounty.json
index 65c001c7cfb..e5c70e3f028 100644
--- a/src/intl/en/page-bug-bounty.json
+++ b/src/intl/en/page-bug-bounty.json
@@ -139,7 +139,7 @@
"page-upgrades-bug-bounty-severity-high-title": "High severity",
"page-upgrades-bug-bounty-severity-high-li-1": "Slash 33% of validators",
"page-upgrades-bug-bounty-severity-high-li-2": "Trivially cause network splits affecting 33% of the network",
- "page-upgrades-bug-bounty-severity-high-li-3": "Be able to bring down 33% of the network by sending a single network packet or an onchain transaction",
+ "page-upgrades-bug-bounty-severity-high-li-3": "Be able to bring down 33% of the network by sending a single onchain transaction",
"page-upgrades-bug-bounty-severity-critical-title": "Critical severity",
"page-upgrades-bug-bounty-severity-critical-li-1": "Slash 50% of validators",
"page-upgrades-bug-bounty-severity-critical-li-2": "Exploit an EIP/specification or client bug to easily create an infinite amount of ETH which is finalized by the network",