From 04f699a78515eafce8e5e49e63f5f2550a16aede Mon Sep 17 00:00:00 2001 From: Davirain Date: Wed, 9 Aug 2023 11:08:29 +0800 Subject: [PATCH] Deploy website - based on 04b754d49f660cd1cebeae9be9ba762332b86e8c --- 404.html | 14 +++++++------- assets/js/00660f19.17d7904e.js | 1 - assets/js/00660f19.499abbd0.js | 1 + assets/js/02293396.332d01c6.js | 1 - assets/js/02293396.6e27b061.js | 1 + assets/js/0231789f.13909feb.js | 1 - assets/js/0231789f.6b136546.js | 1 + assets/js/0279d735.760d3f7d.js | 1 + assets/js/0279d735.d031f311.js | 1 - assets/js/04e84b79.6749cf4b.js | 1 + assets/js/04e84b79.8f7a0bda.js | 1 - assets/js/05970efd.22e5f4f7.js | 1 + assets/js/05970efd.5b8f90ce.js | 1 - assets/js/07dea239.7ba519e2.js | 1 + assets/js/07dea239.fd1cdeb6.js | 1 - assets/js/0b59e1b8.1b5312fa.js | 1 - assets/js/0b59e1b8.2dc214f4.js | 1 + assets/js/0e384e19.1e393f00.js | 1 - assets/js/0e384e19.9ef7e243.js | 1 + ...5a820c.4060d1f6.js => 0e5a820c.289585b4.js} | 2 +- assets/js/117cdc53.747e20cf.js | 1 + assets/js/15911b08.126afa86.js | 1 + assets/js/15911b08.ac0288be.js | 1 - assets/js/16fd20c7.92817426.js | 1 - assets/js/1c315ff9.5960d73a.js | 1 + assets/js/1c315ff9.d4f23c9d.js | 1 - assets/js/1ce18368.039e85c8.js | 1 + assets/js/1ce18368.6f69a2fa.js | 1 - assets/js/1fc16822.4169faeb.js | 1 + assets/js/1fc16822.abd029ea.js | 1 - ...3ecfa8.4f5f457c.js => 253ecfa8.8752bca8.js} | 2 +- assets/js/28898abe.4e890585.js | 1 - assets/js/28898abe.5fab0569.js | 1 + assets/js/299fc64b.a6bc006f.js | 1 + assets/js/299fc64b.ace951a4.js | 1 - assets/js/2a910045.cc9a8f37.js | 1 - assets/js/2be88b23.6d57dbac.js | 1 + assets/js/2f1581e9.8dfc367a.js | 1 + assets/js/32aaa719.c5bfe6cd.js | 1 - assets/js/32aaa719.fa972b9c.js | 1 + assets/js/3853220b.73cb102b.js | 1 + assets/js/3853220b.e7ee4835.js | 1 - assets/js/3895fba0.642bccac.js | 1 - assets/js/3895fba0.7636ee21.js | 1 + assets/js/38dec77c.4ebbe698.js | 1 - assets/js/38dec77c.66b3a97d.js | 1 + assets/js/393be207.3e30333d.js | 1 - assets/js/393be207.b174dfb7.js | 1 + assets/js/3f3a03c1.192c27e4.js | 1 - assets/js/405ac2c3.14edfe5b.js | 1 - assets/js/468416a0.1a02a1f4.js | 1 - assets/js/492e7013.5327f6c3.js | 1 - assets/js/492e7013.fa283319.js | 1 + assets/js/494c5677.b75cc721.js | 1 + assets/js/4b5a10c1.67e4c060.js | 1 - assets/js/4b5a10c1.b29b8ac9.js | 1 + assets/js/4cbf9b05.851c2dae.js | 1 - assets/js/4cbf9b05.ee2381b4.js | 1 + assets/js/4fc3eaac.575430b3.js | 1 + assets/js/4fc3eaac.f76bd32e.js | 1 - assets/js/5b601c6d.94140d42.js | 1 + assets/js/5c26d4ea.2804e305.js | 1 + assets/js/5c26d4ea.af643ed8.js | 1 - assets/js/61cdf435.989519d7.js | 1 - assets/js/61cdf435.ab4c07d3.js | 1 + assets/js/631037e5.1dc806b1.js | 1 - assets/js/6360bfde.b046773c.js | 1 + assets/js/6360bfde.c2dead6b.js | 1 - assets/js/664709d0.7072ae0b.js | 1 - assets/js/664709d0.fa86429a.js | 1 + assets/js/6939f7f7.0d634265.js | 1 + assets/js/6939f7f7.80892694.js | 1 - assets/js/697b977d.3823d2b9.js | 1 + assets/js/697b977d.6551f650.js | 1 - assets/js/70ad3ff0.b0b166cd.js | 1 - assets/js/711fc4ea.ab2365b7.js | 1 + assets/js/711fc4ea.f387e1e9.js | 1 - assets/js/74f1954d.b07ee465.js | 1 + assets/js/759c7395.50c15174.js | 1 - ...3c4032.ce0c9dae.js => 763c4032.d9bffb09.js} | 2 +- assets/js/7a511f30.0c99a60d.js | 1 - assets/js/7a511f30.41d8c678.js | 1 + assets/js/7b4b11c5.7ee5b97a.js | 1 - assets/js/7b4b11c5.c4b45684.js | 1 + assets/js/7be9c390.82fd288f.js | 1 + assets/js/7be9c390.f18bb2c9.js | 1 - ...4f3328.55dcb6a6.js => 814f3328.bb582790.js} | 2 +- assets/js/846341e5.8511011d.js | 1 - assets/js/846341e5.fe086d1e.js | 1 + assets/js/9096fd74.26b06e76.js | 1 - assets/js/9096fd74.f13566a7.js | 1 + assets/js/918f4956.4f18ba69.js | 1 - assets/js/918f4956.97ce3e08.js | 1 + assets/js/935f2afb.976cf8a7.js | 1 - assets/js/935f2afb.db8b5d03.js | 1 + assets/js/9aef0bec.35a70f1e.js | 1 - assets/js/9aef0bec.637e55fa.js | 1 + assets/js/9f5c2a59.1f1df22d.js | 1 + assets/js/9f5c2a59.aa5e1fbf.js | 1 - assets/js/a4421f51.0f2fb5db.js | 1 - assets/js/a4421f51.802442fa.js | 1 + assets/js/a5905e0d.71820077.js | 1 + assets/js/a5905e0d.a1d6fb7d.js | 1 - assets/js/a7023ddc.209f0442.js | 1 - assets/js/a723cf16.0d60f0dd.js | 1 + assets/js/a723cf16.88a16a8c.js | 1 - assets/js/a9637d4a.8fad74b8.js | 1 + assets/js/af1a8150.81ed4f21.js | 1 + assets/js/af284665.6bf08071.js | 1 - assets/js/af284665.f77f62b1.js | 1 + ...2b610d.12c89066.js => af2b610d.d11228d6.js} | 2 +- assets/js/b270f348.c94b504f.js | 1 + assets/js/b2b675dd.fd8b9d2a.js | 1 - assets/js/b2f554cd.ababda67.js | 1 - assets/js/b6baa538.4b5eb211.js | 1 + assets/js/b6baa538.9b03abba.js | 1 - assets/js/b7de6482.1ea8f352.js | 1 + assets/js/b7de6482.cae3afdc.js | 1 - assets/js/be5b884f.12836150.js | 1 - assets/js/be5b884f.b6d9a1a3.js | 1 + assets/js/c17a8821.284f6d50.js | 1 - assets/js/c17a8821.5ce9b118.js | 1 + assets/js/cad25036.6173d1b8.js | 1 - assets/js/cad25036.a31a2d76.js | 1 + assets/js/d2196d4f.466bf8c4.js | 1 + assets/js/d41aa6b4.5cfead72.js | 1 + assets/js/d41aa6b4.e9f8ec33.js | 1 - assets/js/d846cb9d.8453419f.js | 1 - assets/js/d846cb9d.c72dd33c.js | 1 + assets/js/d9f1fece.4e3b91e5.js | 1 - assets/js/d9f1fece.b49b73b9.js | 1 + assets/js/ddbb43e1.0ee5b354.js | 1 - assets/js/ddbb43e1.3ea521b8.js | 1 + assets/js/e7292380.6a4d36c7.js | 1 - assets/js/e7292380.6dffd912.js | 1 + assets/js/e9f74709.2f5124fa.js | 1 + assets/js/e9f74709.906399b9.js | 1 - ...b9b04a.9dac8537.js => edb9b04a.9f426b88.js} | 2 +- assets/js/eddf81a1.31a6296f.js | 1 - assets/js/eddf81a1.b6199c4c.js | 1 + assets/js/f0c8024b.3dc76fb9.js | 1 + assets/js/f18dbc91.205e824d.js | 1 + assets/js/f18dbc91.8df29e01.js | 1 - assets/js/f4cf1efc.a8f6f120.js | 1 + assets/js/f4cf1efc.b79dfb41.js | 1 - assets/js/f9b3936f.5c5c2bb4.js | 1 - assets/js/f9b3936f.92238fb6.js | 1 + assets/js/fa93d5c7.1ac5e461.js | 1 - assets/js/fa93d5c7.b6cee6b4.js | 1 + assets/js/fcc62127.09340d39.js | 1 - assets/js/fcc62127.2efabbf8.js | 1 + assets/js/main.49e15d79.js | 2 -- assets/js/main.7d45acfd.js | 2 ++ ...ICENSE.txt => main.7d45acfd.js.LICENSE.txt} | 0 assets/js/runtime~main.ad43d8a0.js | 1 - assets/js/runtime~main.fa61737c.js | 1 + blog/archive/index.html | 14 +++++++------- blog/atom.xml | 10 +++++----- blog/first-blog-post/index.html | 14 +++++++------- blog/index.html | 14 +++++++------- blog/rss.xml | 6 +++--- blog/tags/blockchain/index.html | 14 +++++++------- blog/tags/blog/index.html | 14 +++++++------- blog/tags/ibc/index.html | 14 +++++++------- blog/tags/index.html | 14 +++++++------- blog/tags/solana/index.html | 14 +++++++------- docs/Solana-Co-Learn/index.html | 14 +++++++------- .../build-an-interaction-script/index.html | 14 +++++++------- .../module1/client-side-development/index.html | 14 +++++++------- .../index.html | 14 +++++++------- .../write-data-to-the-blockchain/index.html | 14 +++++++------- .../build-a-movie-review-app/index.html | 16 ++++++++-------- .../custom-instructions/index.html | 14 +++++++------- .../module1/custom-instruction/index.html | 14 +++++++------- .../run-it-back-deserialization/index.html | 14 +++++++------- docs/Solana-Co-Learn/module1/index.html | 14 +++++++------- .../anchor_program_hello/index.html | 14 +++++++------- .../local_program_development/index.html | 14 +++++++------- .../native_program_hello/index.html | 14 +++++++------- .../solang_program_hello/index.html | 16 ++++++++-------- .../build-an-nft-minter-front-end/index.html | 14 +++++++------- .../deploy-to-vercel/index.html | 14 +++++++------- .../start-your-own-custom-project/index.html | 14 +++++++------- .../module1/wallet-usage/index.html | 16 ++++++++-------- .../connecting-to-wallet/index.html | 14 +++++++------- .../module1/wallets-and-frontends/index.html | 14 +++++++------- .../interact-with-a-program/index.html | 14 +++++++------- .../index.html | 14 +++++++------- .../displaying-nfts-from-a-wallet/index.html | 14 +++++++------- .../displaying-nfts/index.html | 14 +++++++------- .../displayings-nfts-in-a-ui/index.html | 14 +++++++------- docs/Solana-Co-Learn/module2/index.html | 14 +++++++------- .../create-candy-machine/index.html | 14 +++++++------- .../create-reward-tokens/index.html | 14 +++++++------- .../create-the-minting-ui/index.html | 14 +++++++------- .../index.html | 14 +++++++------- .../candy-machine-and-the-sugar-cli/index.html | 16 ++++++++-------- .../nfts-and-minting-with-metaplex/index.html | 14 +++++++------- .../nft-your-face/index.html | 14 +++++++------- .../nfts-one-solana/index.html | 14 +++++++------- .../give-your-token-an-identity/index.html | 18 +++++++++--------- .../module2/spl-token/index.html | 14 +++++++------- .../spl-token/mint-token-on-solana/index.html | 14 +++++++------- .../spl-token/the-token-program/index.html | 16 ++++++++-------- .../spl-token/token-metadata/index.html | 14 +++++++------- docs/Solana-Co-Learn/module3/index.html | 14 +++++++------- .../hello-world/index.html | 14 +++++++------- .../module3/introduction-to-rust/index.html | 14 +++++++------- .../index.html | 14 +++++++------- .../the-magic-internet-computer/index.html | 14 +++++++------- .../build-a-movie-review-program/index.html | 16 ++++++++-------- .../native-solana-development/index.html | 14 +++++++------- .../state-management/index.html | 16 ++++++++-------- .../the-rust-layer-cake/index.html | 16 ++++++++-------- .../build-an-nft-staking-program/index.html | 14 +++++++------- .../nft-staking/how-staking-works/index.html | 16 ++++++++-------- .../module3/nft-staking/index.html | 14 +++++++------- .../index.html | 16 ++++++++-------- .../module3/security-and-validation/index.html | 14 +++++++------- .../secure-our-program/index.html | 14 +++++++------- docs/Solana-Co-Learn/module4/index.html | 14 +++++++------- .../local-ent-setup-and-pdas/index.html | 14 +++++++------- .../pda-deep-dive/index.html | 14 +++++++------- .../setting-up-locally/index.html | 14 +++++++------- docs/Solana-Co-Learn/module5/index.html | 14 +++++++------- docs/Solana-Co-Learn/module6/index.html | 14 +++++++------- docs/Solana-Co-Learn/modules/index.html | 14 +++++++------- docs/intro/index.html | 14 +++++++------- hello/index.html | 14 +++++++------- index.html | 14 +++++++------- markdown-page/index.html | 14 +++++++------- sitemap.xml | 2 +- 232 files changed, 620 insertions(+), 620 deletions(-) delete mode 100644 assets/js/00660f19.17d7904e.js create mode 100644 assets/js/00660f19.499abbd0.js delete mode 100644 assets/js/02293396.332d01c6.js create mode 100644 assets/js/02293396.6e27b061.js delete mode 100644 assets/js/0231789f.13909feb.js create mode 100644 assets/js/0231789f.6b136546.js create mode 100644 assets/js/0279d735.760d3f7d.js delete mode 100644 assets/js/0279d735.d031f311.js create mode 100644 assets/js/04e84b79.6749cf4b.js delete mode 100644 assets/js/04e84b79.8f7a0bda.js create mode 100644 assets/js/05970efd.22e5f4f7.js delete mode 100644 assets/js/05970efd.5b8f90ce.js create mode 100644 assets/js/07dea239.7ba519e2.js delete mode 100644 assets/js/07dea239.fd1cdeb6.js delete mode 100644 assets/js/0b59e1b8.1b5312fa.js create mode 100644 assets/js/0b59e1b8.2dc214f4.js delete mode 100644 assets/js/0e384e19.1e393f00.js create mode 100644 assets/js/0e384e19.9ef7e243.js rename assets/js/{0e5a820c.4060d1f6.js => 0e5a820c.289585b4.js} (67%) create mode 100644 assets/js/117cdc53.747e20cf.js create mode 100644 assets/js/15911b08.126afa86.js delete mode 100644 assets/js/15911b08.ac0288be.js delete mode 100644 assets/js/16fd20c7.92817426.js create mode 100644 assets/js/1c315ff9.5960d73a.js delete mode 100644 assets/js/1c315ff9.d4f23c9d.js create mode 100644 assets/js/1ce18368.039e85c8.js delete mode 100644 assets/js/1ce18368.6f69a2fa.js create mode 100644 assets/js/1fc16822.4169faeb.js delete mode 100644 assets/js/1fc16822.abd029ea.js rename assets/js/{253ecfa8.4f5f457c.js => 253ecfa8.8752bca8.js} (53%) delete mode 100644 assets/js/28898abe.4e890585.js create mode 100644 assets/js/28898abe.5fab0569.js create mode 100644 assets/js/299fc64b.a6bc006f.js delete mode 100644 assets/js/299fc64b.ace951a4.js delete mode 100644 assets/js/2a910045.cc9a8f37.js create mode 100644 assets/js/2be88b23.6d57dbac.js create mode 100644 assets/js/2f1581e9.8dfc367a.js delete mode 100644 assets/js/32aaa719.c5bfe6cd.js create mode 100644 assets/js/32aaa719.fa972b9c.js create mode 100644 assets/js/3853220b.73cb102b.js delete mode 100644 assets/js/3853220b.e7ee4835.js delete mode 100644 assets/js/3895fba0.642bccac.js create mode 100644 assets/js/3895fba0.7636ee21.js delete mode 100644 assets/js/38dec77c.4ebbe698.js create mode 100644 assets/js/38dec77c.66b3a97d.js delete mode 100644 assets/js/393be207.3e30333d.js create mode 100644 assets/js/393be207.b174dfb7.js delete mode 100644 assets/js/3f3a03c1.192c27e4.js delete mode 100644 assets/js/405ac2c3.14edfe5b.js delete mode 100644 assets/js/468416a0.1a02a1f4.js delete mode 100644 assets/js/492e7013.5327f6c3.js create mode 100644 assets/js/492e7013.fa283319.js create mode 100644 assets/js/494c5677.b75cc721.js delete mode 100644 assets/js/4b5a10c1.67e4c060.js create mode 100644 assets/js/4b5a10c1.b29b8ac9.js delete mode 100644 assets/js/4cbf9b05.851c2dae.js create mode 100644 assets/js/4cbf9b05.ee2381b4.js create mode 100644 assets/js/4fc3eaac.575430b3.js delete mode 100644 assets/js/4fc3eaac.f76bd32e.js create mode 100644 assets/js/5b601c6d.94140d42.js create mode 100644 assets/js/5c26d4ea.2804e305.js delete mode 100644 assets/js/5c26d4ea.af643ed8.js delete mode 100644 assets/js/61cdf435.989519d7.js create mode 100644 assets/js/61cdf435.ab4c07d3.js delete mode 100644 assets/js/631037e5.1dc806b1.js create mode 100644 assets/js/6360bfde.b046773c.js delete mode 100644 assets/js/6360bfde.c2dead6b.js delete mode 100644 assets/js/664709d0.7072ae0b.js create mode 100644 assets/js/664709d0.fa86429a.js create mode 100644 assets/js/6939f7f7.0d634265.js delete mode 100644 assets/js/6939f7f7.80892694.js create mode 100644 assets/js/697b977d.3823d2b9.js delete mode 100644 assets/js/697b977d.6551f650.js delete mode 100644 assets/js/70ad3ff0.b0b166cd.js create mode 100644 assets/js/711fc4ea.ab2365b7.js delete mode 100644 assets/js/711fc4ea.f387e1e9.js create mode 100644 assets/js/74f1954d.b07ee465.js delete mode 100644 assets/js/759c7395.50c15174.js rename assets/js/{763c4032.ce0c9dae.js => 763c4032.d9bffb09.js} (56%) delete mode 100644 assets/js/7a511f30.0c99a60d.js create mode 100644 assets/js/7a511f30.41d8c678.js delete mode 100644 assets/js/7b4b11c5.7ee5b97a.js create mode 100644 assets/js/7b4b11c5.c4b45684.js create mode 100644 assets/js/7be9c390.82fd288f.js delete mode 100644 assets/js/7be9c390.f18bb2c9.js rename assets/js/{814f3328.55dcb6a6.js => 814f3328.bb582790.js} (73%) delete mode 100644 assets/js/846341e5.8511011d.js create mode 100644 assets/js/846341e5.fe086d1e.js delete mode 100644 assets/js/9096fd74.26b06e76.js create mode 100644 assets/js/9096fd74.f13566a7.js delete mode 100644 assets/js/918f4956.4f18ba69.js create mode 100644 assets/js/918f4956.97ce3e08.js delete mode 100644 assets/js/935f2afb.976cf8a7.js create mode 100644 assets/js/935f2afb.db8b5d03.js delete mode 100644 assets/js/9aef0bec.35a70f1e.js create mode 100644 assets/js/9aef0bec.637e55fa.js create mode 100644 assets/js/9f5c2a59.1f1df22d.js delete mode 100644 assets/js/9f5c2a59.aa5e1fbf.js delete mode 100644 assets/js/a4421f51.0f2fb5db.js create mode 100644 assets/js/a4421f51.802442fa.js create mode 100644 assets/js/a5905e0d.71820077.js delete mode 100644 assets/js/a5905e0d.a1d6fb7d.js delete mode 100644 assets/js/a7023ddc.209f0442.js create mode 100644 assets/js/a723cf16.0d60f0dd.js delete mode 100644 assets/js/a723cf16.88a16a8c.js create mode 100644 assets/js/a9637d4a.8fad74b8.js create mode 100644 assets/js/af1a8150.81ed4f21.js delete mode 100644 assets/js/af284665.6bf08071.js create mode 100644 assets/js/af284665.f77f62b1.js rename assets/js/{af2b610d.12c89066.js => af2b610d.d11228d6.js} (51%) create mode 100644 assets/js/b270f348.c94b504f.js delete mode 100644 assets/js/b2b675dd.fd8b9d2a.js delete mode 100644 assets/js/b2f554cd.ababda67.js create mode 100644 assets/js/b6baa538.4b5eb211.js delete mode 100644 assets/js/b6baa538.9b03abba.js create mode 100644 assets/js/b7de6482.1ea8f352.js delete mode 100644 assets/js/b7de6482.cae3afdc.js delete mode 100644 assets/js/be5b884f.12836150.js create mode 100644 assets/js/be5b884f.b6d9a1a3.js delete mode 100644 assets/js/c17a8821.284f6d50.js create mode 100644 assets/js/c17a8821.5ce9b118.js delete mode 100644 assets/js/cad25036.6173d1b8.js create mode 100644 assets/js/cad25036.a31a2d76.js create mode 100644 assets/js/d2196d4f.466bf8c4.js create mode 100644 assets/js/d41aa6b4.5cfead72.js delete mode 100644 assets/js/d41aa6b4.e9f8ec33.js delete mode 100644 assets/js/d846cb9d.8453419f.js create mode 100644 assets/js/d846cb9d.c72dd33c.js delete mode 100644 assets/js/d9f1fece.4e3b91e5.js create mode 100644 assets/js/d9f1fece.b49b73b9.js delete mode 100644 assets/js/ddbb43e1.0ee5b354.js create mode 100644 assets/js/ddbb43e1.3ea521b8.js delete mode 100644 assets/js/e7292380.6a4d36c7.js create mode 100644 assets/js/e7292380.6dffd912.js create mode 100644 assets/js/e9f74709.2f5124fa.js delete mode 100644 assets/js/e9f74709.906399b9.js rename assets/js/{edb9b04a.9dac8537.js => edb9b04a.9f426b88.js} (50%) delete mode 100644 assets/js/eddf81a1.31a6296f.js create mode 100644 assets/js/eddf81a1.b6199c4c.js create mode 100644 assets/js/f0c8024b.3dc76fb9.js create mode 100644 assets/js/f18dbc91.205e824d.js delete mode 100644 assets/js/f18dbc91.8df29e01.js create mode 100644 assets/js/f4cf1efc.a8f6f120.js delete mode 100644 assets/js/f4cf1efc.b79dfb41.js delete mode 100644 assets/js/f9b3936f.5c5c2bb4.js create mode 100644 assets/js/f9b3936f.92238fb6.js delete mode 100644 assets/js/fa93d5c7.1ac5e461.js create mode 100644 assets/js/fa93d5c7.b6cee6b4.js delete mode 100644 assets/js/fcc62127.09340d39.js create mode 100644 assets/js/fcc62127.2efabbf8.js delete mode 100644 assets/js/main.49e15d79.js create mode 100644 assets/js/main.7d45acfd.js rename assets/js/{main.49e15d79.js.LICENSE.txt => main.7d45acfd.js.LICENSE.txt} (100%) delete mode 100644 assets/js/runtime~main.ad43d8a0.js create mode 100644 assets/js/runtime~main.fa61737c.js diff --git a/404.html b/404.html index 67359d8ed..640e92b02 100644 --- a/404.html +++ b/404.html @@ -3,15 +3,15 @@ -Page Not Found | All in One Solana - - - +Page Not Found | All in One Solana + + +
-
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + \ No newline at end of file diff --git a/assets/js/00660f19.17d7904e.js b/assets/js/00660f19.17d7904e.js deleted file mode 100644 index 4dcd1a38c..000000000 --- a/assets/js/00660f19.17d7904e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2203],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=a,f=u["".concat(s,".").concat(m)]||u[m]||p[m]||o;return n?r.createElement(f,l(l({ref:t},d),{},{components:n})):r.createElement(f,l({ref:t},d))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={sidebar_position:16,sidebar_label:"\u94b1\u5305\u548c\u524d\u7aef",sidebar_class_name:"green"},l="\u94b1\u5305\u548c\u524d\u7aef",i={unversionedId:"Solana-Co-Learn/module1/wallets-and-frontends/README",id:"Solana-Co-Learn/module1/wallets-and-frontends/README",title:"\u94b1\u5305\u548c\u524d\u7aef",description:"- \u8fde\u63a5\u5230\u94b1\u5305",source:"@site/docs/Solana-Co-Learn/module1/wallets-and-frontends/README.md",sourceDirName:"Solana-Co-Learn/module1/wallets-and-frontends",slug:"/Solana-Co-Learn/module1/wallets-and-frontends/",permalink:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/wallets-and-frontends/README.md",tags:[],version:"current",sidebarPosition:16,frontMatter:{sidebar_position:16,sidebar_label:"\u94b1\u5305\u548c\u524d\u7aef",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/"},next:{title:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305",permalink:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/"}},s={},c=[],d={toc:c},u="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u94b1\u5305\u548c\u524d\u7aef"},"\u94b1\u5305\u548c\u524d\u7aef"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/"},"\u8fde\u63a5\u5230\u94b1\u5305")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/"},"\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/00660f19.499abbd0.js b/assets/js/00660f19.499abbd0.js new file mode 100644 index 000000000..1d9bc3f25 --- /dev/null +++ b/assets/js/00660f19.499abbd0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2203],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},d=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=c(t),m=a,f=u["".concat(s,".").concat(m)]||u[m]||p[m]||o;return t?r.createElement(f,l(l({ref:n},d),{},{components:t})):r.createElement(f,l({ref:n},d))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=m;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[u]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:16,sidebar_label:"\u94b1\u5305\u548c\u524d\u7aef",sidebar_class_name:"green"},l="\u94b1\u5305\u548c\u524d\u7aef",i={unversionedId:"Solana-Co-Learn/module1/wallets-and-frontends/README",id:"Solana-Co-Learn/module1/wallets-and-frontends/README",title:"\u94b1\u5305\u548c\u524d\u7aef",description:"- \u8fde\u63a5\u5230\u94b1\u5305",source:"@site/docs/Solana-Co-Learn/module1/wallets-and-frontends/README.md",sourceDirName:"Solana-Co-Learn/module1/wallets-and-frontends",slug:"/Solana-Co-Learn/module1/wallets-and-frontends/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/wallets-and-frontends/README.md",tags:[],version:"current",sidebarPosition:16,frontMatter:{sidebar_position:16,sidebar_label:"\u94b1\u5305\u548c\u524d\u7aef",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/"},next:{title:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/"}},s={},c=[],d={toc:c},u="wrapper";function p(e){let{components:n,...t}=e;return(0,a.kt)(u,(0,r.Z)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u94b1\u5305\u548c\u524d\u7aef"},"\u94b1\u5305\u548c\u524d\u7aef"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/"},"\u8fde\u63a5\u5230\u94b1\u5305")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/"},"\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/02293396.332d01c6.js b/assets/js/02293396.332d01c6.js deleted file mode 100644 index 41685345a..000000000 --- a/assets/js/02293396.332d01c6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1905],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),p=c(t),d=a,f=p["".concat(s,".").concat(d)]||p[d]||u[d]||o;return t?r.createElement(f,i(i({ref:n},m),{},{components:t})):r.createElement(f,i({ref:n},m))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[p]="string"==typeof e?e:a,i[1]=l;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:40,sidebar_label:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",sidebar_class_name:"green"},i="\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",l={unversionedId:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README",id:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README",title:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",description:"- \ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",source:"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README.md",sourceDirName:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs",slug:"/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_position:40,sidebar_label:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/"},next:{title:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/"}},s={},c=[],m={toc:c},p="wrapper";function u(e){let{components:n,...t}=e;return(0,a.kt)(p,(0,r.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247"},"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01"),(0,a.kt)("li",{parentName:"ul"},"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a"),(0,a.kt)("li",{parentName:"ul"},"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/02293396.6e27b061.js b/assets/js/02293396.6e27b061.js new file mode 100644 index 000000000..d59002e41 --- /dev/null +++ b/assets/js/02293396.6e27b061.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1905],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},m=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),p=c(t),d=a,f=p["".concat(s,".").concat(d)]||p[d]||u[d]||o;return t?r.createElement(f,l(l({ref:n},m),{},{components:t})):r.createElement(f,l({ref:n},m))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=d;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:40,sidebar_label:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",sidebar_class_name:"green"},l="\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",i={unversionedId:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README",id:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README",title:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",description:"- \ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",source:"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README.md",sourceDirName:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs",slug:"/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README.md",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_position:40,sidebar_label:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/"},next:{title:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/"}},s={},c=[],m={toc:c},p="wrapper";function u(e){let{components:n,...t}=e;return(0,a.kt)(p,(0,r.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247"},"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01"),(0,a.kt)("li",{parentName:"ul"},"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a"),(0,a.kt)("li",{parentName:"ul"},"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0231789f.13909feb.js b/assets/js/0231789f.13909feb.js deleted file mode 100644 index 880748b19..000000000 --- a/assets/js/0231789f.13909feb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5932],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=s(n),k=r,m=d["".concat(p,".").concat(k)]||d[k]||c[k]||l;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=k;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const l={sidebar_position:55,sidebar_label:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",sidebar_class_name:"green"},i="\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",o={unversionedId:"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README",id:"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README",title:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",description:"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\uff0c\u6211\u4eec\u5df2\u7ecf\u6253\u62db\u547c\u4e86\u3002\u73b0\u5728\u662f\u65f6\u5019\u5b66\u4e60\u5982\u4f55\u5904\u7406\u6307\u4ee4\u6570\u636e\u4e86\uff0c\u5c31\u50cf\u6211\u4eec\u5728\u5ba2\u6237\u7aef\u5f00\u53d1\u4e2d\u6240\u505a\u7684\u4e00\u6837\u3002",source:"@site/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README.md",sourceDirName:"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake",slug:"/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README.md",tags:[],version:"current",sidebarPosition:55,frontMatter:{sidebar_position:55,sidebar_label:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u539f\u751fSOLANA\u5f00\u53d1",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/"},next:{title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/"}},p={},s=[{value:"\ud83d\udc76 \u53d8\u91cf\u58f0\u660e\u548c\u53ef\u53d8\u6027",id:"-\u53d8\u91cf\u58f0\u660e\u548c\u53ef\u53d8\u6027",level:2},{value:"\ud83c\udf71 \u7ed3\u6784\u4f53",id:"-\u7ed3\u6784\u4f53",level:2},{value:"\ud83d\udcdc \u679a\u4e3e\u3001\u53d8\u4f53\u548c\u5339\u914d",id:"-\u679a\u4e3e\u53d8\u4f53\u548c\u5339\u914d",level:2},{value:"\ud83d\udce6 Implementations",id:"-implementations",level:2},{value:"\ud83c\udf81 Traits",id:"-traits",level:2},{value:"\ud83c\udf82 \u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77",id:"-\u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77",level:2},{value:"\ud83d\ude80 \u7a0b\u5e8f\u903b\u8f91",id:"-\u7a0b\u5e8f\u903b\u8f91",level:2},{value:"\ud83d\udcc2 \u6587\u4ef6\u7ed3\u6784\u8bf4\u660e",id:"-\u6587\u4ef6\u7ed3\u6784\u8bf4\u660e",level:2}],u={toc:s},d="wrapper";function c(e){let{components:t,...l}=e;return(0,r.kt)(d,(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-rust\u7684\u5206\u5c42\u86cb\u7cd5"},"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5"),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\uff0c\u6211\u4eec\u5df2\u7ecf\u6253\u62db\u547c\u4e86\u3002\u73b0\u5728\u662f\u65f6\u5019\u5b66\u4e60\u5982\u4f55\u5904\u7406\u6307\u4ee4\u6570\u636e\u4e86\uff0c\u5c31\u50cf\u6211\u4eec\u5728\u5ba2\u6237\u7aef\u5f00\u53d1\u4e2d\u6240\u505a\u7684\u4e00\u6837\u3002"),(0,r.kt)("p",null,"\u5728\u6211\u4eec\u5f00\u59cb\u6784\u5efa\u4e4b\u524d\uff0c\u6211\u60f3\u5148\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5c06\u8981\u4f7f\u7528\u7684\u6982\u5ff5\u3002\u8fd8\u8bb0\u5f97\u6211\u63d0\u5230\u7684\u89c4\u5219\u3001\u80fd\u529b\u548c\u4e92\u52a8\u5417\uff1f\u6211\u4f1a\u5e26\u4f60\u4e86\u89e3\u4e00\u4e0b\u4f60\u9700\u8981\u4e86\u89e3\u7684\u80fd\u529b\u548c\u89c4\u5219\uff0c\u4ee5\u4fbf\u7f16\u5199\u4e00\u4e2a\u672c\u5730\u7684Solana\u7a0b\u5e8f\u3002\u8fd9\u91cc\u7684\u672c\u5730\u5f88\u91cd\u8981 - \u6211\u4eec\u5c06\u5728\u540e\u9762\u7531Anchor\u6765\u5904\u7406\u6211\u4eec\u6240\u5b66\u5230\u7684\u5f88\u591a\u5185\u5bb9\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u5b66\u4e60\u539f\u751f\u5f00\u53d1\u7684\u539f\u56e0\u662f\u56e0\u4e3a\u4e86\u89e3\u5e95\u5c42\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u91cd\u8981\u3002\u4e00\u65e6\u4f60\u7406\u89e3\u4e86\u4e8b\u7269\u5728\u539f\u5b50\u7ea7\u522b\u4e0a\u662f\u5982\u4f55\u8fd0\u4f5c\u7684\uff0c\u4f60\u5c31\u80fd\u591f\u5229\u7528\u50cfAnchor\u8fd9\u6837\u7684\u5de5\u5177\u6765\u6784\u5efa\u66f4\u5f3a\u5927\u7684\u7a0b\u5e8f\u3002\u53ef\u4ee5\u628a\u5b83\u60f3\u8c61\u6210\u4e0e\u4e0d\u540c\u7c7b\u578b\u7684\u654c\u4eba\u8fdb\u884c\u7684\u9996\u9886\u6218 - \u5728\u540c\u65f6\u5bf9\u6297\u5b83\u4eec\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5b66\u4f1a\u5982\u4f55\u5bf9\u6297\u6bcf\u4e2a\u4e2a\u4f53\u602a\u7269\uff08\u4ee5\u53ca\u4f60\u81ea\u5df1\u7684\u80fd\u529b\uff09\u3002"),(0,r.kt)("p",null,"\u5f53\u6211\u521a\u5f00\u59cb\u5b66\u4e60\u8fd9\u4e2a\u4e1c\u897f\u7684\u65f6\u5019\uff0c\u6211\u5f88\u96be\u7406\u89e3\u81ea\u5df1\u7f3a\u5c11\u4e86\u4ec0\u4e48\uff0c\u6240\u4ee5\u6211\u5c06\u5b83\u5206\u89e3\u6210\u4e86\u201c\u5c42\u6b21\u201d\u3002\u4f60\u5b66\u4e60\u7684\u6bcf\u4e2a\u4e3b\u9898\u90fd\u662f\u5efa\u7acb\u5728\u4e00\u5c42\u77e5\u8bc6\u7684\u57fa\u7840\u4e0a\u7684\u3002\u5982\u679c\u6709\u4ec0\u4e48\u4e0d\u660e\u767d\u7684\u5730\u65b9\uff0c\u56de\u5230\u5b83\u6240\u5efa\u7acb\u7684\u5c42\u6b21\u4e0a\uff0c\u786e\u4fdd\u4f60\u7406\u89e3\u5b83\u4eec\u3002"),(0,r.kt)("p",null,"Rust\u7684\u5206\u5c42\u86cb\u7cd5"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(793).Z,width:"3693",height:"2476"})),(0,r.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u7531Rust\u5236\u4f5c\u7684\u86cb\u7cd5\u3002"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u6ce8\u610f - \u56fe\u5c42\u8868\u793a\u91cd\u91cf\u54c8\u54c8")),(0,r.kt)("h2",{id:"-\u53d8\u91cf\u58f0\u660e\u548c\u53ef\u53d8\u6027"},"\ud83d\udc76 \u53d8\u91cf\u58f0\u660e\u548c\u53ef\u53d8\u6027"),(0,r.kt)("p",null,"\u53d8\u91cf\u3002\u4f60\u77e5\u9053\u5b83\u4eec\u3002\u4f60\u7528\u8fc7\u5b83\u4eec\u3002\u4f60\u751a\u81f3\u53ef\u80fd\u62fc\u9519\u8fc7\u5b83\u4eec\u3002\u5173\u4e8eRust\u53d8\u91cf\u552f\u4e00\u7684\u65b0\u4e1c\u897f\u5c31\u662f\u53ef\u53d8\u6027\u3002\u5728Rust\u4e2d\uff0c\u6240\u6709\u53d8\u91cf\u9ed8\u8ba4\u90fd\u662f\u4e0d\u53ef\u53d8\u7684 - \u4e00\u65e6\u58f0\u660e\u4e86\u53d8\u91cf\uff0c\u5c31\u4e0d\u80fd\u6539\u53d8\u5176\u503c\u3002"),(0,r.kt)("p",null,"\u4f60\u6240\u8981\u505a\u7684\u5c31\u662f\u544a\u8bc9\u7f16\u8bd1\u5668\u4f60\u60f3\u8981\u4e00\u4e2a\u53ef\u53d8\u7684\u53d8\u91cf\uff0c\u901a\u8fc7\u6dfb\u52a0 ",(0,r.kt)("inlineCode",{parentName:"p"},"mut")," \u5173\u952e\u5b57\u3002\u7b80\u5355\u6613\u61c2\u3002\u5982\u679c\u6211\u4eec\u4e0d\u63d0\u4f9b\u7c7b\u578b\uff0c\u7f16\u8bd1\u5668\u4f1a\u6839\u636e\u6211\u4eec\u63d0\u4f9b\u7684\u6570\u636e\u8fdb\u884c\u63a8\u65ad\u3002\u7136\u540e\u5b83\u4f1a\u5f3a\u5236\u6211\u4eec\u5728\u65f6\u95f4\u4e0a\u4fdd\u6301\u8be5\u7c7b\u578b\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(3530).Z,width:"1488",height:"844"})),(0,r.kt)("h2",{id:"-\u7ed3\u6784\u4f53"},"\ud83c\udf71 \u7ed3\u6784\u4f53"),(0,r.kt)("p",null,"\u7ed3\u6784\u4f53\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u636e\u7ed3\u6784\uff1a\u4e00\u79cd\u5c06\u6570\u636e\u7ec4\u5408\u5728\u4e00\u8d77\u7684\u65b9\u5f0f\u3002\u5b83\u4eec\u662f\u60a8\u5b9a\u4e49\u7684\u81ea\u5b9a\u4e49\u6570\u636e\u7c7b\u578b\uff0c\u7c7b\u4f3c\u4e8eJavaScript\u4e2d\u7684\u5bf9\u8c61\u3002Rust\u5e76\u975e\u5b8c\u5168\u9762\u5411\u5bf9\u8c61 - \u7ed3\u6784\u4f53\u672c\u8eab\u9664\u4e86\u4fdd\u5b58\u6709\u7ec4\u7ec7\u7684\u6570\u636e\u5916\uff0c\u65e0\u6cd5\u6267\u884c\u4efb\u4f55\u64cd\u4f5c\u3002\u60a8\u53ef\u4ee5\u5411\u7ed3\u6784\u4f53\u6dfb\u52a0\u5185\u5bb9\uff0c\u4f7f\u5176\u66f4\u50cf\u5bf9\u8c61\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(2406).Z,width:"924",height:"844"})),(0,r.kt)("h2",{id:"-\u679a\u4e3e\u53d8\u4f53\u548c\u5339\u914d"},"\ud83d\udcdc \u679a\u4e3e\u3001\u53d8\u4f53\u548c\u5339\u914d"),(0,r.kt)("p",null,"\u679a\u4e3e\u5f88\u7b80\u5355 - \u5b83\u4eec\u5c31\u50cf\u4ee3\u7801\u4e2d\u7684\u4e0b\u62c9\u5217\u8868\u3002\u5b83\u4eec\u5f3a\u5236\u4f60\u4ece\u51e0\u4e2a\u53ef\u80fd\u7684\u53d8\u4f53\u4e2d\u9009\u62e9\u4e00\u4e2a\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(2554).Z,width:"935",height:"844"})),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(9328).Z,width:"935",height:"844"})),(0,r.kt)("p",null,"Rust\u4e2d\u679a\u4e3e\u7684\u9177\u70ab\u4e4b\u5904\u5728\u4e8e\u4f60\u53ef\u4ee5\uff08\u53ef\u9009\u5730\uff09\u5411\u5176\u6dfb\u52a0\u6570\u636e\uff0c\u4f7f\u5176\u51e0\u4e4e\u50cf\u4e00\u4e2a\u8ff7\u4f60if\u8bed\u53e5\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u4f60\u6b63\u5728\u9009\u62e9\u4ea4\u901a\u4fe1\u53f7\u706f\u7684\u72b6\u6001\u3002\u5982\u679c\u5b83\u662f\u5f00\u542f\u7684\uff0c\u4f60\u9700\u8981\u6307\u5b9a\u989c\u8272 - \u662f\u7ea2\u8272\u3001\u9ec4\u8272\u8fd8\u662f\u7eff\u8272\uff1f"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(8301).Z,width:"924",height:"844"})),(0,r.kt)("p",null,"\u5f53\u4e0e\u5339\u914d\u8bed\u53e5\u7ed3\u5408\u4f7f\u7528\u65f6\uff0c\u679a\u4e3e\u975e\u5e38\u6709\u7528\u3002\u5b83\u4eec\u662f\u4e00\u79cd\u68c0\u67e5\u53d8\u91cf\u503c\u5e76\u6839\u636e\u8be5\u503c\u6267\u884c\u4ee3\u7801\u7684\u65b9\u5f0f\uff0c\u4e0eJavaScript\u4e2d\u7684switch\u8bed\u53e5\u76f8\u540c\u3002"),(0,r.kt)("h2",{id:"-implementations"},"\ud83d\udce6 Implementations"),(0,r.kt)("p",null,"\u7ed3\u6784\u4f53\u5f88\u9177\uff0c\u4f46\u5982\u679c\u4f60\u80fd\u7ed9\u5b83\u4eec\u6dfb\u52a0\u51fd\u6570\u4f1a\u600e\u6837\u5462\uff1f\u8ba9\u6211\u4eec\u6765\u4ecb\u7ecd\u4e00\u4e0b\u5b9e\u73b0\uff1a\u5b83\u4eec\u5141\u8bb8\u4f60\u7ed9\u7ed3\u6784\u4f53\u6dfb\u52a0\u65b9\u6cd5\uff0c\u4f7f\u5176\u66f4\u50cf\u5bf9\u8c61\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(3658).Z,width:"1406",height:"612"})),(0,r.kt)("p",null,"\u5982\u679c\u4f60\u5bf9\u201c\u5411\u7ed3\u6784\u4f53\u6dfb\u52a0\u65b9\u6cd5\u201d\u7684\u542b\u4e49\u611f\u5230\u56f0\u60d1 - \u5c31\u50cf\u7ed9\u7ed3\u6784\u4f53\u8d4b\u4e88\u80fd\u529b\u4e00\u6837\u3002\u4f60\u53ef\u4ee5\u62e5\u6709\u4e00\u4e2a\u7b80\u5355\u7684",(0,r.kt)("inlineCode",{parentName:"p"},"user"),"\u7ed3\u6784\u4f53\uff0c\u5b83\u5177\u6709\u901f\u5ea6\u3001\u5065\u5eb7\u548c\u4f24\u5bb3\u5c5e\u6027\u3002\u901a\u8fc7\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"impl")," \u6765\u6dfb\u52a0\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"wordPerMinute")," \u65b9\u6cd5\uff0c\u4f60\u53ef\u4ee5\u8ba1\u7b97\u7528\u6237\u7684\u6253\u5b57\u901f\u5ea6\u2328\ufe0f\u3002"),(0,r.kt)("h2",{id:"-traits"},"\ud83c\udf81 Traits"),(0,r.kt)("p",null,"\u6700\u540e\uff0c\u6765\u8bf4\u8bf4\u201c\u7cd5\u70b9\u201d\u7684\u9876\u90e8\u3002\u7279\u5f81\u4e0e\u5b9e\u73b0\u7c7b\u4f3c-\u5b83\u4eec\u4e3a\u7c7b\u578b\u6dfb\u52a0\u529f\u80fd\u3002\u5c06\u5176\u89c6\u4e3a\u7c7b\u578b\u53ef\u4ee5\u5177\u5907\u7684\u54c1\u8d28\u3002"),(0,r.kt)("p",null,"\u56de\u5230\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"user")," \u7ed3\u6784\u4f53\uff0c\u5982\u679c\u6211\u6dfb\u52a0\u4e86\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"ThreeArms")," ",(0,r.kt)("inlineCode",{parentName:"p"},"Traits")," \uff0c\u7528\u6237\u5c06\u80fd\u591f\u4ee5\u66f4\u5feb\u7684\u901f\u5ea6\u8f93\u5165\uff0c\u56e0\u4e3a\u4ed6\u4eec\u5c06\u6709\u989d\u5916\u7684\u624b\u81c2\uff01",(0,r.kt)("inlineCode",{parentName:"p"},"Traits"),"\u6709\u70b9\u62bd\u8c61\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u770b\u4e00\u4e2a\u5b9e\u9645\u7684\u573a\u666f\uff0c\u6211\u4eec\u5c06\u5728\u5176\u4e2d\u4f7f\u7528\u5b83\u4eec\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(4776).Z,width:"813",height:"337"})),(0,r.kt)("p",null,"\u6b63\u5982\u60a8\u6240\u8bb0\u5f97\u7684\uff0c\u6211\u4eec\u7684\u6307\u4ee4\u6570\u636e\u4ee5\u5b57\u8282\u6570\u7ec4\uff081\u548c0\uff09\u7684\u5f62\u5f0f\u63d0\u4f9b\uff0c\u5e76\u4e14\u6211\u4eec\u5728\u7a0b\u5e8f\u4e2d\u5bf9\u5176\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\uff08\u5c06\u5176\u8f6c\u6362\u4e3aRust\u7c7b\u578b\uff09\u3002\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"BorshDeserialize")," \u7279\u6027\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\uff1a\u5b83\u5177\u6709\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"deserialize")," \u65b9\u6cd5\uff0c\u5c06\u6211\u4eec\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u6211\u4eec\u60f3\u8981\u7684\u7c7b\u578b\u3002\u8fd9\u610f\u5473\u7740\u5982\u679c\u6211\u4eec\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"BorshDeserialize")," \u7279\u6027\u6dfb\u52a0\u5230\u6211\u4eec\u7684\u6307\u4ee4\u7ed3\u6784\u4f53\u4e2d\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"deserialize")," \u65b9\u6cd5\u5c06\u6211\u4eec\u7684\u6307\u4ee4\u6570\u636e\u5b9e\u4f8b\u8f6c\u6362\u4e3aRust\u7c7b\u578b\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u8fd9\u6bb5\u8bdd\u8ba9\u4f60\u611f\u5230\u56f0\u60d1\uff0c\u968f\u65f6\u53ef\u4ee5\u518d\u8bfb\u4e00\u904d\u54c8\u54c8\uff0c\u6211\u4e5f\u82b1\u4e86\u4e00\u4e9b\u65f6\u95f4\u624d\u7406\u89e3\u6e05\u695a\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u5b9e\u9645\u64cd\u4f5c\u4e2d\u7684\u6837\u5b50\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(7869).Z,width:"813",height:"356"})),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u6ce8\u610f - \u4f60\u53ef\u80fd\u5fd8\u8bb0\u4e86\u4e00\u4e2a\u5c42\u6b21\uff0c\u5b8f\uff1a\u5b83\u4eec\u751f\u6210\u4ee3\u7801\u3002")),(0,r.kt)("p",null,"\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c\u7279\u8d28\u4e0e\u5b8f\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"BorshDeserialize Traits")," \u6709\u4e24\u4e2a\u5fc5\u987b\u5b9e\u73b0\u7684\u51fd\u6570\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"deserialize")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"try_from_slice")," \u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"#[derive(BorshDeserialize)]")," \u5c5e\u6027\u544a\u8bc9\u7f16\u8bd1\u5668\u5728\u7ed9\u5b9a\u7c7b\u578b\u4e0a\uff08\u5373\u6307\u4ee4\u6570\u636e\u7ed3\u6784\uff09\u4e3a\u6211\u4eec\u5b9e\u73b0\u8fd9\u4e24\u4e2a\u51fd\u6570\u3002\n\u6d41\u7a0b\u662f\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u901a\u8fc7\u5b8f\u5c06",(0,r.kt)("inlineCode",{parentName:"li"},"Traits"),"\u6dfb\u52a0\u5230\u7ed3\u6784\u4f53\u4e2d"),(0,r.kt)("li",{parentName:"ul"},"\u7f16\u8bd1\u5668\u5c06\u4f1a\u5bfb\u627e",(0,r.kt)("inlineCode",{parentName:"li"},"Traits"),"\u5b9a\u4e49"),(0,r.kt)("li",{parentName:"ul"},"\u7f16\u8bd1\u5668\u5c06\u4e3a\u8be5",(0,r.kt)("inlineCode",{parentName:"li"},"Traits"),"\u5b9e\u73b0\u5e95\u5c42\u51fd\u6570"),(0,r.kt)("li",{parentName:"ul"},"\u4f60\u7684\u7ed3\u6784\u4f53\u73b0\u5728\u5177\u6709\u4e86",(0,r.kt)("inlineCode",{parentName:"li"},"Traits"),"\u7684\u529f\u80fd")),(0,r.kt)("p",null,"\u8fd9\u91cc\u5b9e\u9645\u4e0a\u53d1\u751f\u7684\u662f\u5b8f\u5728\u7f16\u8bd1\u65f6\u751f\u6210\u4e86\u7528\u4e8e\u53cd\u5e8f\u5217\u5316\u5b57\u7b26\u4e32\u7684\u51fd\u6570\u3002\u4f7f\u7528\u8fd9\u4e2a",(0,r.kt)("inlineCode",{parentName:"p"},"Traits"),"\uff0c\u6211\u4eec\u544a\u8bc9Rust\uff1a\u201c\u563f\uff0c\u6211\u60f3\u8981\u80fd\u591f\u53cd\u5e8f\u5217\u5316\u5b57\u7b26\u4e32\uff0c\u8bf7\u4e3a\u6211\u751f\u6210\u4ee3\u7801\u3002\u201d"),(0,r.kt)("p",null,"\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c\u552f\u4e00\u7684\u8981\u6c42\u662f",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh"),"\u9700\u8981\u652f\u6301\u6240\u6709\u7684\u7ed3\u6784\u6570\u636e\u7c7b\u578b\uff08\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\u662f\u5b57\u7b26\u4e32\uff09\u3002\u5982\u679c\u60a8\u6709\u4e00\u4e2a",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh"),"\u4e0d\u652f\u6301\u7684\u81ea\u5b9a\u4e49\u6570\u636e\u7c7b\u578b\uff0c\u60a8\u9700\u8981\u901a\u8fc7\u6dfb\u52a0\u5230\u5b8f\u4e2d\u81ea\u5df1\u5b9e\u73b0\u8fd9\u4e9b\u529f\u80fd\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u8fd9\u8fd8\u6ca1\u6709\u70b9\u51fb\uff0c\u522b\u62c5\u5fc3\uff01\u6211\u5728\u770b\u5230\u6574\u4e2a\u6d41\u7a0b\u8fd0\u4f5c\u4e4b\u524d\u4e5f\u6ca1\u6709\u7406\u89e3\uff0c\u6240\u4ee5\u73b0\u5728\u8ba9\u6211\u4eec\u6765\u505a\u5427\uff01"),(0,r.kt)("h2",{id:"-\u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77"},"\ud83c\udf82 \u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77"),(0,r.kt)("p",null,"\u6211\u4eec\u521a\u521a\u8ba8\u8bba\u4e86\u4e00\u7cfb\u5217\u76f8\u4e92\u5173\u8054\u7684\u62bd\u8c61\u4e3b\u9898\u3002\u5982\u679c\u4ec5\u4ec5\u63cf\u8ff0\u6bcf\u4e00\u5c42\uff0c\u6211\u65e0\u6cd5\u60f3\u8c61\u51fa\u4e00\u4e2a\u86cb\u7cd5\u7684\u6837\u5b50\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u628a\u5b83\u4eec\u6574\u5408\u5728\u4e00\u8d77\u5427\uff01"),(0,r.kt)("p",null,"\u5047\u8bbe\u6211\u4eec\u6b63\u5728\u6784\u5efa\u4e00\u4e2a\u94fe\u4e0a\u7684\u7b14\u8bb0\u7a0b\u5e8f\u3002\u6211\u4eec\u5c06\u4fdd\u6301\u7b80\u5355\uff1a\u4f60\u53ea\u80fd\u521b\u5efa\u3001\u66f4\u65b0\u548c\u5220\u9664\u7b14\u8bb0\u3002\u6211\u4eec\u9700\u8981\u4e00\u6761\u6307\u4ee4\u6765\u5b8c\u6210\u8fd9\u4e9b\u64cd\u4f5c\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u4e3a\u6b64\u521b\u5efa\u4e00\u4e2a\u679a\u4e3e\u7c7b\u578b\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(7869).Z,width:"813",height:"356"})),(0,r.kt)("p",null,"\u6bcf\u4e2a\u6307\u4ee4\u53d8\u4f53\u7684\u5b57\u8282\u6570\u7ec4\u90fd\u6709\u81ea\u5df1\u7684\u6570\u636e\u7c7b\u578b\uff0c\u6211\u4eec\u5728\u8fd9\u91cc\u6709\u5b83\u4eec\uff01"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u77e5\u9053\u6307\u4ee4\u6570\u636e\u7684\u6837\u5b50\uff0c\u6211\u4eec\u9700\u8981\u5c06\u5176\u4ece\u5b57\u8282\u8f6c\u6362\u4e3a\u8fd9\u4e9b\u7c7b\u578b\u3002\u7b2c\u4e00\u6b65\u662f\u53cd\u5e8f\u5217\u5316\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u4e2a\u4e13\u95e8\u4e3a\u6709\u6548\u8d1f\u8f7d\u521b\u5efa\u7684\u65b0\u7ed3\u6784\u4f53\u4e0a\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"BorshDeserialize Traits")," \u6765\u5b8c\u6210\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(BorshDeserialize)]\nstruct NoteInstructionPayload {\n id: u64,\n title: String,\n body: String\n}\n")),(0,r.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u6709 ",(0,r.kt)("inlineCode",{parentName:"p"},"title")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"body")," \uff0c\u56e0\u4e3a\u8fd9\u5c31\u662f\u5b57\u8282\u6570\u7ec4\u4e2d\u7684\u5185\u5bb9\u3002",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh"),"\u6240\u505a\u7684\u53ea\u662f\u6dfb\u52a0\u53cd\u5e8f\u5217\u5316\u7684\u652f\u6301\uff01\u5b83\u5b9e\u9645\u4e0a\u5e76\u6ca1\u6709\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\u3002\u5b83\u53ea\u662f\u6dfb\u52a0\u4e86\u6211\u4eec\u53ef\u4ee5\u8c03\u7528\u7684\u53cd\u5e8f\u5217\u5316\u51fd\u6570\u3002"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u5b9e\u9645\u4f7f\u7528\u8fd9\u4e9b\u51fd\u6570\u6765\u53cd\u5e8f\u5217\u5316\u6570\u636e\u3002\u6211\u4eec\u5c06\u5728\u4e00\u4e2a\u5b9e\u73b0\u4e2d\u5b9a\u4e49\u8fd9\u4e2a\u884c\u4e3a\u3002\u8fd9\u662f\u624b\u52a8\u5de5\u4f5c\uff08\u6682\u65f6\uff09\uff01"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"impl NoteInstruction {\n // Unpack inbound buffer to associated Instruction\n // The expected format for input is a Borsh serialized vector\n pub fn unpack(input: &[u8]) -> Result {\n // Take the first byte as the variant to\n // determine which instruction to execute\n let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n // Use the temporary payload struct to deserialize\n let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();\n // Match the variant to determine which data struct is expected by\n // the function and return the TestStruct or an error\n Ok(match variant {\n 0 => Self::CreateNote {\n title: payload.title,\n body: payload.body,\n id: payload.id\n },\n 1 => Self::UpdateNote {\n title: payload.title,\n body: payload.body,\n id: payload.id\n },\n 2 => Self::DeleteNote {\n id: payload.id\n },\n _ => return Err(ProgramError::InvalidInstructionData)\n })\n }\n}\n")),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(7500).Z,width:"930",height:"844"})),(0,r.kt)("p",null,"\u8fd9\u53ef\u80fd\u770b\u8d77\u6765\u5413\u4eba\uff0c\u4f46\u4f60\u5f88\u5feb\u5c31\u4f1a\u7b11\u51fa\u58f0\u6765\uff0c\u56e0\u4e3a\u5b83\u5176\u5b9e\u975e\u5e38\u7b80\u5355\uff01\u8ba9\u6211\u4eec\u6765\u5206\u89e3\u4e00\u4e0b \ud83d\udd7a\ud83d\udc83\ud83d\udc6f\u200d\u2642\ufe0f"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn unpack(input: &[u8]) -> Result {\n")),(0,r.kt)("p",null,"\u6211\u4eec\u7684\u89e3\u5305\u51fd\u6570\u5c06\u4ece\u6307\u4ee4\u4e2d\u83b7\u53d6\u5b57\u8282\uff0c\u5e76\u8fd4\u56de\u4e00\u4e2a",(0,r.kt)("inlineCode",{parentName:"p"},"NoteInstruction"),"\u7c7b\u578b\uff08\u8fd9\u5c31\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"Self")," \uff09\u6216\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n")),(0,r.kt)("p",null,"\u662f\u65f6\u5019\u5c06\u6211\u4eec\u7684\u6570\u636e\u4ece\u5b57\u8282\u4e2d\u89e3\u5305\u5e76\u8c03\u7528\u53cd\u5e8f\u5217\u5316\u51fd\u6570\u4e86\u3002"),(0,r.kt)("p",null,"\u5728\u8fd9\u4e2a\u7a0b\u5e8f\u4e2d\uff0c\u6211\u4eec\u6307\u4ee4\u6570\u636e\u7684\u7b2c\u4e00\u4e2a\u5b57\u8282\u662f\u4e00\u4e2a\u6574\u6570\uff0c\u544a\u8bc9\u6211\u4eec\u6b63\u5728\u5904\u7406\u54ea\u4e2a\u6307\u4ee4\u3002\u6211\u4eec\u9700\u8981\u8fd9\u6837\u505a\u662f\u56e0\u4e3a\u6bcf\u4e2a\u6307\u4ee4\u53ef\u80fd\u6709\u4e0d\u540c\u7684\u5173\u8054\u6570\u636e\u3002\u4e5f\u8bb8\u6211\u4eec\u6b63\u5728\u7f16\u5199\u4e00\u4e2a\u98df\u8c31\u7a0b\u5e8f\uff0c\u800c\u4e0d\u662f\u70f9\u996a\u98df\u8c31\uff0c\u6211\u4eec\u6700\u7ec8\u5220\u9664\u4e86\u5b83\u3002\u6211\u4eec\u9700\u8981\u77e5\u9053\u6211\u4eec\u6b63\u5728\u5904\u7406\u54ea\u4e2a\u6307\u4ee4\uff0c\u4ee5\u4fbf\u80fd\u591f\u6b63\u786e\u89e3\u6790\u6570\u636e\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u8fd9\u6837\u505a\u7684\u65b9\u5f0f\u662f\u4f7f\u7528Rust\u5185\u7f6e\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"split_first")," \u51fd\u6570\u3002\u5b83\u63a5\u53d7\u4e00\u4e2a\u5b57\u8282\u5207\u7247\u5e76\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002\u7b2c\u4e00\u4e2a\u5143\u7d20\u662f\u5207\u7247\u4e2d\u7684\u7b2c\u4e00\u4e2a\u5b57\u8282\uff0c\u7b2c\u4e8c\u4e2a\u5143\u7d20\u662f\u5207\u7247\u7684\u5269\u4f59\u90e8\u5206\u3002\u5982\u679c\u5207\u7247\u4e3a\u7a7a\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"ok_or")," \u53ea\u662f\u8fd4\u56de ",(0,r.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u679a\u4e3e\u4e2d\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"InvalidInstructionData")," \u9519\u8bef\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();\n")),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u6709\u4e24\u4e2a\u53d8\u91cf\u8981\u5904\u7406 - \u6307\u4ee4\u6307\u793a\u5668\u548c\u6307\u4ee4\u7684\u6709\u6548\u8f7d\u8377\uff08\u6570\u636e\uff09\u3002",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh"),"\u5728\u6211\u4eec\u7684\u6709\u6548\u8f7d\u8377\u7ed3\u6784\u4e2d\u6dfb\u52a0\u4e86 ",(0,r.kt)("inlineCode",{parentName:"p"},"try_from_slice")," \u51fd\u6570\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6709\u6548\u8f7d\u8377\u53d8\u91cf ",(0,r.kt)("inlineCode",{parentName:"p"},"rest")," \u4e0a\u8c03\u7528\u5b83\u3002\u8fd9\u5c31\u662f\u53cd\u5e8f\u5217\u5316\u7684\u8fc7\u7a0b\uff01\u5982\u679c\u6ca1\u6709\u9519\u8bef\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"unwrap")," \u5c06\u4ece\u8fd9\u4e2a\u51fd\u6570\u4e2d\u8fd4\u56de\u503c\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u5feb\u5230\u4e86\uff01\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u5c06\u6211\u4eec\u7684\u6307\u4ee4\u6570\u636e\u5b9a\u4e49\u4e3a ",(0,r.kt)("inlineCode",{parentName:"li"},"Rust")," \u7c7b\u578b\u4e2d\u7684\u679a\u4e3e"),(0,r.kt)("li",{parentName:"ul"},"\u5b9a\u4e49\u4e86\u6211\u4eec\u7684\u8d1f\u8f7d\u7ed3\u6784\u4f53"),(0,r.kt)("li",{parentName:"ul"},"\u5728\u8d1f\u8f7d\u7ed3\u6784\u4f53\u4e0a\u58f0\u660e\u4e86 ",(0,r.kt)("inlineCode",{parentName:"li"},"BorshDeserialize")," \u5b8f"),(0,r.kt)("li",{parentName:"ul"},"\u4e3a\u8d1f\u8f7d\u7ed3\u6784\u521b\u5efa\u4e86\u4e00\u4e2a\u5b9e\u73b0\uff08\u5b57\u8282 -> \u7ed3\u6784\u4f53\uff09"),(0,r.kt)("li",{parentName:"ul"},"\u521b\u5efa\u4e86\u4e00\u4e2a",(0,r.kt)("inlineCode",{parentName:"li"},"unpack"),"\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u63a5\u6536\u6307\u4ee4\u6570\u636e\u5e76\u5bf9\u5176\u8fdb\u884c\u53cd\u5e8f\u5217\u5316")),(0,r.kt)("p",null,"\u6211\u4eec",(0,r.kt)("inlineCode",{parentName:"p"},"unpack"),"\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u662f\u5c06\u53cd\u5e8f\u5217\u5316\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u679a\u4e3e\u53d8\u4f53\uff08\u5373\u6307\u4ee4\u6570\u636e\u7c7b\u578b\uff09\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"Ok(match variant {\n 0 => Self::CreateNote {\n title: payload.title,\n body: payload.body,\n id: payload.id\n },\n 1 => Self::UpdateNote {\n title: payload.title,\n body: payload.body,\n id: payload.id\n },\n 2 => Self::DeleteNote {\n id: payload.id\n },\n _ => return Err(ProgramError::InvalidInstructionData)\n})\n")),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528\u5339\u914d\u8bed\u53e5\u6765\u5b8c\u6210\u8fd9\u4e2a\u64cd\u4f5c\u3002\u901a\u8fc7\u5339\u914d\u6307\u4ee4\u6307\u793a\u5668\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd4\u56de\u679a\u4e3e\u7684\u6b63\u786e\u53d8\u4f53\u3002\u53ef\u4ee5\u5c06\u5176\u89c6\u4e3a\u4f7f\u7528\u6307\u4ee4\u4e2d\u7684\u6570\u636e\u6765\u521b\u5efa\u6b63\u786e\u7c7b\u578b\u7684\u53d8\u91cf\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u77e5\u9053\u86cb\u7cd5\u7684\u6837\u5b50\u4e86\uff01\u6211\u53d1\u73b0\u4f60\u9700\u8981\u5f88\u591a\u8111\u529b\u6765\u4e00\u6b21\u6027\u5c06\u86cb\u7cd5\u7684\u6bcf\u4e00\u5757\u90fd\u653e\u5165\u5de5\u4f5c\u8bb0\u5fc6\u4e2d\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u9700\u8981\u56de\u8fc7\u5934\u6765\u8bfb\u51e0\u6b21\u4e5f\u6ca1\u5173\u7cfb\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u5f88\u591a\u5185\u5bb9\u3002\u53ef\u80fd\u4f1a\u8ba9\u4eba\u611f\u5230\u56f0\u60d1\u3002\u522b\u62c5\u5fc3\uff1a\u6211\u4eec\u4f1a\u8fdb\u884c\u5927\u91cf\u7ec3\u4e60\uff0c\u4ee5\u4fbf\u719f\u6089\u8fd9\u4e9b\u5185\u5bb9\u3002\u76f8\u4fe1\u7ecf\u8fc7\u4e00\u6bb5\u65f6\u95f4\u548c\u51e0\u6b21\u91cd\u590d\u7ec3\u4e60\uff0c\u8fd9\u4e9b\u5185\u5bb9\u4f1a\u5f00\u59cb\u53d8\u5f97\u6709\u610f\u4e49\u3002"),(0,r.kt)("h2",{id:"-\u7a0b\u5e8f\u903b\u8f91"},"\ud83d\ude80 \u7a0b\u5e8f\u903b\u8f91"),(0,r.kt)("p",null,"\u6211\u4eec\u5df2\u7ecf\u5c06\u6307\u4ee4\u6570\u636e\u89e3\u538b\u5e76\u51c6\u5907\u5c31\u7eea\u3002\u73b0\u5728\u6211\u4eec\u9700\u8981\u4e3a\u6bcf\u4e2a\u6307\u4ee4\u7f16\u5199\u903b\u8f91\u3002\u8fd9\u662f\u6700\u7b80\u5355\u7684\u90e8\u5206\uff01\u53cd\u5e8f\u5217\u5316\u662f\u8017\u65f6\u7684\u201c\u55ef\uff0c\u8fd9\u662f\u600e\u4e48\u56de\u4e8b\u201d\u7684\u90e8\u5206\uff08Anchor\u4f1a\u4e3a\u60a8\u5904\u7406\uff09\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(4220).Z,width:"926",height:"844"})),(0,r.kt)("p",null,"\u9996\u5148\uff0c\u6211\u4eec\u8981\u505a\u7684\u662f\u5b9a\u4e49\u7a0b\u5e8f\u7684\u5165\u53e3\u70b9\u3002\u51fd\u6570 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u7684\u5b9a\u4e49\u4e0e\u6211\u4eec\u7684",(0,r.kt)("inlineCode",{parentName:"p"},"Hello World"),"\u7a0b\u5e8f\u76f8\u540c\u3002\u7136\u540e\uff0c\u6211\u4eec\u5c06\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"NoteInstruction")," \u7684\u5b9e\u73b0\u4e2d\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"unpack")," \u51fd\u6570\u6765\u83b7\u53d6\u6307\u4ee4\u6570\u636e\u3002\u7136\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"NoteInstruction")," \u679a\u4e3e\u6765\u5339\u914d\u7c7b\u578b\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u8fd9\u91cc\u6ca1\u6709\u8fd9\u4e2a\u903b\u8f91\uff0c\u6211\u4eec\u4f1a\u5728\u771f\u6b63\u5f00\u59cb\u5efa\u8bbe\u65f6\u6dfb\u52a0\u5b83\uff01"),(0,r.kt)("h2",{id:"-\u6587\u4ef6\u7ed3\u6784\u8bf4\u660e"},"\ud83d\udcc2 \u6587\u4ef6\u7ed3\u6784\u8bf4\u660e"),(0,r.kt)("p",null,"\u5f53\u7f16\u5199\u81ea\u5b9a\u4e49\u7a0b\u5e8f\u65f6\uff0c\u6700\u597d\u5c06\u4ee3\u7801\u5206\u6210\u4e0d\u540c\u7684\u6587\u4ef6\u3002\u8fd9\u6837\u53ef\u4ee5\u91cd\u590d\u4f7f\u7528\u4ee3\u7801\uff0c\u5e76\u4e14\u66f4\u5bb9\u6613\u627e\u5230\u6240\u9700\u7684\u5185\u5bb9\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(648).Z,width:"1350",height:"582"})),(0,r.kt)("p",null,"\u9664\u4e86 ",(0,r.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u6587\u4ef6\u4e4b\u5916\uff0c\u6211\u4eec\u5c06\u628a\u7a0b\u5e8f\u7684\u5404\u4e2a\u90e8\u5206\u5206\u522b\u653e\u5728\u4e0d\u540c\u7684\u6587\u4ef6\u4e2d\u3002\u6700\u660e\u663e\u7684\u4e00\u4e2a\u5c31\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u6587\u4ef6\u3002\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u5c06\u5b9a\u4e49\u6307\u4ee4\u6570\u636e\u7c7b\u578b\u5e76\u5b9e\u73b0\u5bf9\u6307\u4ee4\u6570\u636e\u7684\u89e3\u5305\u3002"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u4f60\u505a\u5f97\u5f88\u68d2\ud83d\udc4f\ud83d\udc4f\ud83d\udc4f")),(0,r.kt)("p",null,"\u6211\u60f3\u82b1\u70b9\u65f6\u95f4\u6765\u8d5e\u8d4f\u4f60\u6240\u4ed8\u51fa\u7684\u52aa\u529b\u3002\u4f60\u6b63\u5728\u5b66\u4e60\u4e00\u4e9b\u975e\u5e38\u5f3a\u5927\u7684\u77e5\u8bc6\uff0c\u8fd9\u4e9b\u77e5\u8bc6\u53ef\u4ee5\u5728 Solana \u4e4b\u5916\u7684\u9886\u57df\u4e2d\u4f7f\u7528\uff0cRust \u6709\u5f88\u591a\u5e94\u7528\u3002Solana \u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u56f0\u96be\uff0c\u8fd9\u91cc\u6709\u4e00\u6761\u6765\u81ea FormFunction \u521b\u59cb\u4eba\u7684\u63a8\u6587\uff0c\u5927\u7ea6\u4e00\u5e74\u524d\u4ed6\u63d0\u5230\u4e86\u4ed6\u53d1\u73b0\u5b83\u6709\u591a\u4e48\u56f0\u96be\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(3189).Z,width:"1254",height:"778"})),(0,r.kt)("p",null,"FormFunction\u5df2\u7ecf\u7b79\u96c6\u4e86\u8d85\u8fc7470\u4e07\u7f8e\u5143\uff0c\u5e76\u4e14\u662fSolana\u4e0a\u6700\u597d\u76841/1 NFT\u5e73\u53f0\uff08\u5728\u6211\u770b\u6765\uff09\u3002Matt\u575a\u6301\u4e0d\u61c8\u5730\u5efa\u7acb\u4e86\u4e00\u4e9b\u4ee4\u4eba\u96be\u4ee5\u7f6e\u4fe1\u7684\u4e1c\u897f\u3002\u4f60\u80fd\u60f3\u8c61\u4e00\u4e0b\u62e5\u6709\u8fd9\u4e9b\u6280\u80fd\u4e00\u5e74\u540e\u4f60\u4f1a\u5728\u54ea\u91cc\u5417\uff1f"))}c.isMDXComponent=!0},7869:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/borsh-struct-e01fdaa79a1fcda693791ff88b467db4.png"},4776:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/borsh-393058cb1ff5574854f6365918b9dec9.png"},2554:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/enum-1-be0f79f199ff71eea731ccad8fc6b86a.png"},9328:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/enum-2-be0f79f199ff71eea731ccad8fc6b86a.png"},8301:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/enum-3-2b716e93f691c5e650c0f15de58d8b32.png"},648:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/file-structure-eee2fba4bbd91380e0f837e4601d2b85.png"},4220:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/process-instruction-6788dae5d2b396a2d8e802f44f21fac9.png"},2406:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rust-struct-e75b2612d0ea122f32ce27bae281f3a4.png"},3530:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rust-variable-19ed93dab21249baa04498197718bf4e.png"},3189:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/solana-learner-b7d0ee3d1fd3fa79f7d6c7825337e785.png"},3658:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/struct-impl-415daa9644058eb857e3de3319bf4d63.png"},793:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/the-rust-layer-cake-ca50fcbc4c5288f3a4e41245ee64a4af.png"},7500:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upack-struct-5e87d372784710ca02f9a415610d175f.png"}}]); \ No newline at end of file diff --git a/assets/js/0231789f.6b136546.js b/assets/js/0231789f.6b136546.js new file mode 100644 index 000000000..87b629a18 --- /dev/null +++ b/assets/js/0231789f.6b136546.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5932],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=s(n),k=r,m=d["".concat(p,".").concat(k)]||d[k]||c[k]||l;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,i=new Array(l);i[0]=k;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const l={sidebar_position:55,sidebar_label:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",sidebar_class_name:"green"},i="\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",o={unversionedId:"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README",id:"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README",title:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",description:"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\uff0c\u6211\u4eec\u5df2\u7ecf\u6253\u62db\u547c\u4e86\u3002\u73b0\u5728\u662f\u65f6\u5019\u5b66\u4e60\u5982\u4f55\u5904\u7406\u6307\u4ee4\u6570\u636e\u4e86\uff0c\u5c31\u50cf\u6211\u4eec\u5728\u5ba2\u6237\u7aef\u5f00\u53d1\u4e2d\u6240\u505a\u7684\u4e00\u6837\u3002",source:"@site/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README.md",sourceDirName:"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake",slug:"/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README.md",tags:[],version:"current",sidebarPosition:55,frontMatter:{sidebar_position:55,sidebar_label:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u539f\u751fSOLANA\u5f00\u53d1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/"},next:{title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/"}},p={},s=[{value:"\ud83d\udc76 \u53d8\u91cf\u58f0\u660e\u548c\u53ef\u53d8\u6027",id:"-\u53d8\u91cf\u58f0\u660e\u548c\u53ef\u53d8\u6027",level:2},{value:"\ud83c\udf71 \u7ed3\u6784\u4f53",id:"-\u7ed3\u6784\u4f53",level:2},{value:"\ud83d\udcdc \u679a\u4e3e\u3001\u53d8\u4f53\u548c\u5339\u914d",id:"-\u679a\u4e3e\u53d8\u4f53\u548c\u5339\u914d",level:2},{value:"\ud83d\udce6 Implementations",id:"-implementations",level:2},{value:"\ud83c\udf81 Traits",id:"-traits",level:2},{value:"\ud83c\udf82 \u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77",id:"-\u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77",level:2},{value:"\ud83d\ude80 \u7a0b\u5e8f\u903b\u8f91",id:"-\u7a0b\u5e8f\u903b\u8f91",level:2},{value:"\ud83d\udcc2 \u6587\u4ef6\u7ed3\u6784\u8bf4\u660e",id:"-\u6587\u4ef6\u7ed3\u6784\u8bf4\u660e",level:2}],u={toc:s},d="wrapper";function c(e){let{components:t,...l}=e;return(0,r.kt)(d,(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-rust\u7684\u5206\u5c42\u86cb\u7cd5"},"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5"),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\uff0c\u6211\u4eec\u5df2\u7ecf\u6253\u62db\u547c\u4e86\u3002\u73b0\u5728\u662f\u65f6\u5019\u5b66\u4e60\u5982\u4f55\u5904\u7406\u6307\u4ee4\u6570\u636e\u4e86\uff0c\u5c31\u50cf\u6211\u4eec\u5728\u5ba2\u6237\u7aef\u5f00\u53d1\u4e2d\u6240\u505a\u7684\u4e00\u6837\u3002"),(0,r.kt)("p",null,"\u5728\u6211\u4eec\u5f00\u59cb\u6784\u5efa\u4e4b\u524d\uff0c\u6211\u60f3\u5148\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5c06\u8981\u4f7f\u7528\u7684\u6982\u5ff5\u3002\u8fd8\u8bb0\u5f97\u6211\u63d0\u5230\u7684\u89c4\u5219\u3001\u80fd\u529b\u548c\u4e92\u52a8\u5417\uff1f\u6211\u4f1a\u5e26\u4f60\u4e86\u89e3\u4e00\u4e0b\u4f60\u9700\u8981\u4e86\u89e3\u7684\u80fd\u529b\u548c\u89c4\u5219\uff0c\u4ee5\u4fbf\u7f16\u5199\u4e00\u4e2a\u672c\u5730\u7684Solana\u7a0b\u5e8f\u3002\u8fd9\u91cc\u7684\u672c\u5730\u5f88\u91cd\u8981 - \u6211\u4eec\u5c06\u5728\u540e\u9762\u7531Anchor\u6765\u5904\u7406\u6211\u4eec\u6240\u5b66\u5230\u7684\u5f88\u591a\u5185\u5bb9\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u5b66\u4e60\u539f\u751f\u5f00\u53d1\u7684\u539f\u56e0\u662f\u56e0\u4e3a\u4e86\u89e3\u5e95\u5c42\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u91cd\u8981\u3002\u4e00\u65e6\u4f60\u7406\u89e3\u4e86\u4e8b\u7269\u5728\u539f\u5b50\u7ea7\u522b\u4e0a\u662f\u5982\u4f55\u8fd0\u4f5c\u7684\uff0c\u4f60\u5c31\u80fd\u591f\u5229\u7528\u50cfAnchor\u8fd9\u6837\u7684\u5de5\u5177\u6765\u6784\u5efa\u66f4\u5f3a\u5927\u7684\u7a0b\u5e8f\u3002\u53ef\u4ee5\u628a\u5b83\u60f3\u8c61\u6210\u4e0e\u4e0d\u540c\u7c7b\u578b\u7684\u654c\u4eba\u8fdb\u884c\u7684\u9996\u9886\u6218 - \u5728\u540c\u65f6\u5bf9\u6297\u5b83\u4eec\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5b66\u4f1a\u5982\u4f55\u5bf9\u6297\u6bcf\u4e2a\u4e2a\u4f53\u602a\u7269\uff08\u4ee5\u53ca\u4f60\u81ea\u5df1\u7684\u80fd\u529b\uff09\u3002"),(0,r.kt)("p",null,"\u5f53\u6211\u521a\u5f00\u59cb\u5b66\u4e60\u8fd9\u4e2a\u4e1c\u897f\u7684\u65f6\u5019\uff0c\u6211\u5f88\u96be\u7406\u89e3\u81ea\u5df1\u7f3a\u5c11\u4e86\u4ec0\u4e48\uff0c\u6240\u4ee5\u6211\u5c06\u5b83\u5206\u89e3\u6210\u4e86\u201c\u5c42\u6b21\u201d\u3002\u4f60\u5b66\u4e60\u7684\u6bcf\u4e2a\u4e3b\u9898\u90fd\u662f\u5efa\u7acb\u5728\u4e00\u5c42\u77e5\u8bc6\u7684\u57fa\u7840\u4e0a\u7684\u3002\u5982\u679c\u6709\u4ec0\u4e48\u4e0d\u660e\u767d\u7684\u5730\u65b9\uff0c\u56de\u5230\u5b83\u6240\u5efa\u7acb\u7684\u5c42\u6b21\u4e0a\uff0c\u786e\u4fdd\u4f60\u7406\u89e3\u5b83\u4eec\u3002"),(0,r.kt)("p",null,"Rust\u7684\u5206\u5c42\u86cb\u7cd5"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(793).Z,width:"3693",height:"2476"})),(0,r.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u7531Rust\u5236\u4f5c\u7684\u86cb\u7cd5\u3002"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u6ce8\u610f - \u56fe\u5c42\u8868\u793a\u91cd\u91cf\u54c8\u54c8")),(0,r.kt)("h2",{id:"-\u53d8\u91cf\u58f0\u660e\u548c\u53ef\u53d8\u6027"},"\ud83d\udc76 \u53d8\u91cf\u58f0\u660e\u548c\u53ef\u53d8\u6027"),(0,r.kt)("p",null,"\u53d8\u91cf\u3002\u4f60\u77e5\u9053\u5b83\u4eec\u3002\u4f60\u7528\u8fc7\u5b83\u4eec\u3002\u4f60\u751a\u81f3\u53ef\u80fd\u62fc\u9519\u8fc7\u5b83\u4eec\u3002\u5173\u4e8eRust\u53d8\u91cf\u552f\u4e00\u7684\u65b0\u4e1c\u897f\u5c31\u662f\u53ef\u53d8\u6027\u3002\u5728Rust\u4e2d\uff0c\u6240\u6709\u53d8\u91cf\u9ed8\u8ba4\u90fd\u662f\u4e0d\u53ef\u53d8\u7684 - \u4e00\u65e6\u58f0\u660e\u4e86\u53d8\u91cf\uff0c\u5c31\u4e0d\u80fd\u6539\u53d8\u5176\u503c\u3002"),(0,r.kt)("p",null,"\u4f60\u6240\u8981\u505a\u7684\u5c31\u662f\u544a\u8bc9\u7f16\u8bd1\u5668\u4f60\u60f3\u8981\u4e00\u4e2a\u53ef\u53d8\u7684\u53d8\u91cf\uff0c\u901a\u8fc7\u6dfb\u52a0 ",(0,r.kt)("inlineCode",{parentName:"p"},"mut")," \u5173\u952e\u5b57\u3002\u7b80\u5355\u6613\u61c2\u3002\u5982\u679c\u6211\u4eec\u4e0d\u63d0\u4f9b\u7c7b\u578b\uff0c\u7f16\u8bd1\u5668\u4f1a\u6839\u636e\u6211\u4eec\u63d0\u4f9b\u7684\u6570\u636e\u8fdb\u884c\u63a8\u65ad\u3002\u7136\u540e\u5b83\u4f1a\u5f3a\u5236\u6211\u4eec\u5728\u65f6\u95f4\u4e0a\u4fdd\u6301\u8be5\u7c7b\u578b\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(3530).Z,width:"1488",height:"844"})),(0,r.kt)("h2",{id:"-\u7ed3\u6784\u4f53"},"\ud83c\udf71 \u7ed3\u6784\u4f53"),(0,r.kt)("p",null,"\u7ed3\u6784\u4f53\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u636e\u7ed3\u6784\uff1a\u4e00\u79cd\u5c06\u6570\u636e\u7ec4\u5408\u5728\u4e00\u8d77\u7684\u65b9\u5f0f\u3002\u5b83\u4eec\u662f\u60a8\u5b9a\u4e49\u7684\u81ea\u5b9a\u4e49\u6570\u636e\u7c7b\u578b\uff0c\u7c7b\u4f3c\u4e8eJavaScript\u4e2d\u7684\u5bf9\u8c61\u3002Rust\u5e76\u975e\u5b8c\u5168\u9762\u5411\u5bf9\u8c61 - \u7ed3\u6784\u4f53\u672c\u8eab\u9664\u4e86\u4fdd\u5b58\u6709\u7ec4\u7ec7\u7684\u6570\u636e\u5916\uff0c\u65e0\u6cd5\u6267\u884c\u4efb\u4f55\u64cd\u4f5c\u3002\u60a8\u53ef\u4ee5\u5411\u7ed3\u6784\u4f53\u6dfb\u52a0\u5185\u5bb9\uff0c\u4f7f\u5176\u66f4\u50cf\u5bf9\u8c61\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(2406).Z,width:"924",height:"844"})),(0,r.kt)("h2",{id:"-\u679a\u4e3e\u53d8\u4f53\u548c\u5339\u914d"},"\ud83d\udcdc \u679a\u4e3e\u3001\u53d8\u4f53\u548c\u5339\u914d"),(0,r.kt)("p",null,"\u679a\u4e3e\u5f88\u7b80\u5355 - \u5b83\u4eec\u5c31\u50cf\u4ee3\u7801\u4e2d\u7684\u4e0b\u62c9\u5217\u8868\u3002\u5b83\u4eec\u5f3a\u5236\u4f60\u4ece\u51e0\u4e2a\u53ef\u80fd\u7684\u53d8\u4f53\u4e2d\u9009\u62e9\u4e00\u4e2a\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(2554).Z,width:"935",height:"844"})),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(9328).Z,width:"935",height:"844"})),(0,r.kt)("p",null,"Rust\u4e2d\u679a\u4e3e\u7684\u9177\u70ab\u4e4b\u5904\u5728\u4e8e\u4f60\u53ef\u4ee5\uff08\u53ef\u9009\u5730\uff09\u5411\u5176\u6dfb\u52a0\u6570\u636e\uff0c\u4f7f\u5176\u51e0\u4e4e\u50cf\u4e00\u4e2a\u8ff7\u4f60if\u8bed\u53e5\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u4f60\u6b63\u5728\u9009\u62e9\u4ea4\u901a\u4fe1\u53f7\u706f\u7684\u72b6\u6001\u3002\u5982\u679c\u5b83\u662f\u5f00\u542f\u7684\uff0c\u4f60\u9700\u8981\u6307\u5b9a\u989c\u8272 - \u662f\u7ea2\u8272\u3001\u9ec4\u8272\u8fd8\u662f\u7eff\u8272\uff1f"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(8301).Z,width:"924",height:"844"})),(0,r.kt)("p",null,"\u5f53\u4e0e\u5339\u914d\u8bed\u53e5\u7ed3\u5408\u4f7f\u7528\u65f6\uff0c\u679a\u4e3e\u975e\u5e38\u6709\u7528\u3002\u5b83\u4eec\u662f\u4e00\u79cd\u68c0\u67e5\u53d8\u91cf\u503c\u5e76\u6839\u636e\u8be5\u503c\u6267\u884c\u4ee3\u7801\u7684\u65b9\u5f0f\uff0c\u4e0eJavaScript\u4e2d\u7684switch\u8bed\u53e5\u76f8\u540c\u3002"),(0,r.kt)("h2",{id:"-implementations"},"\ud83d\udce6 Implementations"),(0,r.kt)("p",null,"\u7ed3\u6784\u4f53\u5f88\u9177\uff0c\u4f46\u5982\u679c\u4f60\u80fd\u7ed9\u5b83\u4eec\u6dfb\u52a0\u51fd\u6570\u4f1a\u600e\u6837\u5462\uff1f\u8ba9\u6211\u4eec\u6765\u4ecb\u7ecd\u4e00\u4e0b\u5b9e\u73b0\uff1a\u5b83\u4eec\u5141\u8bb8\u4f60\u7ed9\u7ed3\u6784\u4f53\u6dfb\u52a0\u65b9\u6cd5\uff0c\u4f7f\u5176\u66f4\u50cf\u5bf9\u8c61\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(3658).Z,width:"1406",height:"612"})),(0,r.kt)("p",null,"\u5982\u679c\u4f60\u5bf9\u201c\u5411\u7ed3\u6784\u4f53\u6dfb\u52a0\u65b9\u6cd5\u201d\u7684\u542b\u4e49\u611f\u5230\u56f0\u60d1 - \u5c31\u50cf\u7ed9\u7ed3\u6784\u4f53\u8d4b\u4e88\u80fd\u529b\u4e00\u6837\u3002\u4f60\u53ef\u4ee5\u62e5\u6709\u4e00\u4e2a\u7b80\u5355\u7684",(0,r.kt)("inlineCode",{parentName:"p"},"user"),"\u7ed3\u6784\u4f53\uff0c\u5b83\u5177\u6709\u901f\u5ea6\u3001\u5065\u5eb7\u548c\u4f24\u5bb3\u5c5e\u6027\u3002\u901a\u8fc7\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"impl")," \u6765\u6dfb\u52a0\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"wordPerMinute")," \u65b9\u6cd5\uff0c\u4f60\u53ef\u4ee5\u8ba1\u7b97\u7528\u6237\u7684\u6253\u5b57\u901f\u5ea6\u2328\ufe0f\u3002"),(0,r.kt)("h2",{id:"-traits"},"\ud83c\udf81 Traits"),(0,r.kt)("p",null,"\u6700\u540e\uff0c\u6765\u8bf4\u8bf4\u201c\u7cd5\u70b9\u201d\u7684\u9876\u90e8\u3002\u7279\u5f81\u4e0e\u5b9e\u73b0\u7c7b\u4f3c-\u5b83\u4eec\u4e3a\u7c7b\u578b\u6dfb\u52a0\u529f\u80fd\u3002\u5c06\u5176\u89c6\u4e3a\u7c7b\u578b\u53ef\u4ee5\u5177\u5907\u7684\u54c1\u8d28\u3002"),(0,r.kt)("p",null,"\u56de\u5230\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"user")," \u7ed3\u6784\u4f53\uff0c\u5982\u679c\u6211\u6dfb\u52a0\u4e86\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"ThreeArms")," ",(0,r.kt)("inlineCode",{parentName:"p"},"Traits")," \uff0c\u7528\u6237\u5c06\u80fd\u591f\u4ee5\u66f4\u5feb\u7684\u901f\u5ea6\u8f93\u5165\uff0c\u56e0\u4e3a\u4ed6\u4eec\u5c06\u6709\u989d\u5916\u7684\u624b\u81c2\uff01",(0,r.kt)("inlineCode",{parentName:"p"},"Traits"),"\u6709\u70b9\u62bd\u8c61\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u770b\u4e00\u4e2a\u5b9e\u9645\u7684\u573a\u666f\uff0c\u6211\u4eec\u5c06\u5728\u5176\u4e2d\u4f7f\u7528\u5b83\u4eec\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(4776).Z,width:"813",height:"337"})),(0,r.kt)("p",null,"\u6b63\u5982\u60a8\u6240\u8bb0\u5f97\u7684\uff0c\u6211\u4eec\u7684\u6307\u4ee4\u6570\u636e\u4ee5\u5b57\u8282\u6570\u7ec4\uff081\u548c0\uff09\u7684\u5f62\u5f0f\u63d0\u4f9b\uff0c\u5e76\u4e14\u6211\u4eec\u5728\u7a0b\u5e8f\u4e2d\u5bf9\u5176\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\uff08\u5c06\u5176\u8f6c\u6362\u4e3aRust\u7c7b\u578b\uff09\u3002\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"BorshDeserialize")," \u7279\u6027\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\uff1a\u5b83\u5177\u6709\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"deserialize")," \u65b9\u6cd5\uff0c\u5c06\u6211\u4eec\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u6211\u4eec\u60f3\u8981\u7684\u7c7b\u578b\u3002\u8fd9\u610f\u5473\u7740\u5982\u679c\u6211\u4eec\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"BorshDeserialize")," \u7279\u6027\u6dfb\u52a0\u5230\u6211\u4eec\u7684\u6307\u4ee4\u7ed3\u6784\u4f53\u4e2d\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"deserialize")," \u65b9\u6cd5\u5c06\u6211\u4eec\u7684\u6307\u4ee4\u6570\u636e\u5b9e\u4f8b\u8f6c\u6362\u4e3aRust\u7c7b\u578b\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u8fd9\u6bb5\u8bdd\u8ba9\u4f60\u611f\u5230\u56f0\u60d1\uff0c\u968f\u65f6\u53ef\u4ee5\u518d\u8bfb\u4e00\u904d\u54c8\u54c8\uff0c\u6211\u4e5f\u82b1\u4e86\u4e00\u4e9b\u65f6\u95f4\u624d\u7406\u89e3\u6e05\u695a\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u5b9e\u9645\u64cd\u4f5c\u4e2d\u7684\u6837\u5b50\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(7869).Z,width:"813",height:"356"})),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u6ce8\u610f - \u4f60\u53ef\u80fd\u5fd8\u8bb0\u4e86\u4e00\u4e2a\u5c42\u6b21\uff0c\u5b8f\uff1a\u5b83\u4eec\u751f\u6210\u4ee3\u7801\u3002")),(0,r.kt)("p",null,"\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c\u7279\u8d28\u4e0e\u5b8f\u4e00\u8d77\u4f7f\u7528\u3002\u4f8b\u5982\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"BorshDeserialize Traits")," \u6709\u4e24\u4e2a\u5fc5\u987b\u5b9e\u73b0\u7684\u51fd\u6570\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"deserialize")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"try_from_slice")," \u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"#[derive(BorshDeserialize)]")," \u5c5e\u6027\u544a\u8bc9\u7f16\u8bd1\u5668\u5728\u7ed9\u5b9a\u7c7b\u578b\u4e0a\uff08\u5373\u6307\u4ee4\u6570\u636e\u7ed3\u6784\uff09\u4e3a\u6211\u4eec\u5b9e\u73b0\u8fd9\u4e24\u4e2a\u51fd\u6570\u3002\n\u6d41\u7a0b\u662f\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u901a\u8fc7\u5b8f\u5c06",(0,r.kt)("inlineCode",{parentName:"li"},"Traits"),"\u6dfb\u52a0\u5230\u7ed3\u6784\u4f53\u4e2d"),(0,r.kt)("li",{parentName:"ul"},"\u7f16\u8bd1\u5668\u5c06\u4f1a\u5bfb\u627e",(0,r.kt)("inlineCode",{parentName:"li"},"Traits"),"\u5b9a\u4e49"),(0,r.kt)("li",{parentName:"ul"},"\u7f16\u8bd1\u5668\u5c06\u4e3a\u8be5",(0,r.kt)("inlineCode",{parentName:"li"},"Traits"),"\u5b9e\u73b0\u5e95\u5c42\u51fd\u6570"),(0,r.kt)("li",{parentName:"ul"},"\u4f60\u7684\u7ed3\u6784\u4f53\u73b0\u5728\u5177\u6709\u4e86",(0,r.kt)("inlineCode",{parentName:"li"},"Traits"),"\u7684\u529f\u80fd")),(0,r.kt)("p",null,"\u8fd9\u91cc\u5b9e\u9645\u4e0a\u53d1\u751f\u7684\u662f\u5b8f\u5728\u7f16\u8bd1\u65f6\u751f\u6210\u4e86\u7528\u4e8e\u53cd\u5e8f\u5217\u5316\u5b57\u7b26\u4e32\u7684\u51fd\u6570\u3002\u4f7f\u7528\u8fd9\u4e2a",(0,r.kt)("inlineCode",{parentName:"p"},"Traits"),"\uff0c\u6211\u4eec\u544a\u8bc9Rust\uff1a\u201c\u563f\uff0c\u6211\u60f3\u8981\u80fd\u591f\u53cd\u5e8f\u5217\u5316\u5b57\u7b26\u4e32\uff0c\u8bf7\u4e3a\u6211\u751f\u6210\u4ee3\u7801\u3002\u201d"),(0,r.kt)("p",null,"\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c\u552f\u4e00\u7684\u8981\u6c42\u662f",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh"),"\u9700\u8981\u652f\u6301\u6240\u6709\u7684\u7ed3\u6784\u6570\u636e\u7c7b\u578b\uff08\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\u662f\u5b57\u7b26\u4e32\uff09\u3002\u5982\u679c\u60a8\u6709\u4e00\u4e2a",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh"),"\u4e0d\u652f\u6301\u7684\u81ea\u5b9a\u4e49\u6570\u636e\u7c7b\u578b\uff0c\u60a8\u9700\u8981\u901a\u8fc7\u6dfb\u52a0\u5230\u5b8f\u4e2d\u81ea\u5df1\u5b9e\u73b0\u8fd9\u4e9b\u529f\u80fd\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u8fd9\u8fd8\u6ca1\u6709\u70b9\u51fb\uff0c\u522b\u62c5\u5fc3\uff01\u6211\u5728\u770b\u5230\u6574\u4e2a\u6d41\u7a0b\u8fd0\u4f5c\u4e4b\u524d\u4e5f\u6ca1\u6709\u7406\u89e3\uff0c\u6240\u4ee5\u73b0\u5728\u8ba9\u6211\u4eec\u6765\u505a\u5427\uff01"),(0,r.kt)("h2",{id:"-\u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77"},"\ud83c\udf82 \u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77"),(0,r.kt)("p",null,"\u6211\u4eec\u521a\u521a\u8ba8\u8bba\u4e86\u4e00\u7cfb\u5217\u76f8\u4e92\u5173\u8054\u7684\u62bd\u8c61\u4e3b\u9898\u3002\u5982\u679c\u4ec5\u4ec5\u63cf\u8ff0\u6bcf\u4e00\u5c42\uff0c\u6211\u65e0\u6cd5\u60f3\u8c61\u51fa\u4e00\u4e2a\u86cb\u7cd5\u7684\u6837\u5b50\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u628a\u5b83\u4eec\u6574\u5408\u5728\u4e00\u8d77\u5427\uff01"),(0,r.kt)("p",null,"\u5047\u8bbe\u6211\u4eec\u6b63\u5728\u6784\u5efa\u4e00\u4e2a\u94fe\u4e0a\u7684\u7b14\u8bb0\u7a0b\u5e8f\u3002\u6211\u4eec\u5c06\u4fdd\u6301\u7b80\u5355\uff1a\u4f60\u53ea\u80fd\u521b\u5efa\u3001\u66f4\u65b0\u548c\u5220\u9664\u7b14\u8bb0\u3002\u6211\u4eec\u9700\u8981\u4e00\u6761\u6307\u4ee4\u6765\u5b8c\u6210\u8fd9\u4e9b\u64cd\u4f5c\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u4e3a\u6b64\u521b\u5efa\u4e00\u4e2a\u679a\u4e3e\u7c7b\u578b\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(7869).Z,width:"813",height:"356"})),(0,r.kt)("p",null,"\u6bcf\u4e2a\u6307\u4ee4\u53d8\u4f53\u7684\u5b57\u8282\u6570\u7ec4\u90fd\u6709\u81ea\u5df1\u7684\u6570\u636e\u7c7b\u578b\uff0c\u6211\u4eec\u5728\u8fd9\u91cc\u6709\u5b83\u4eec\uff01"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u77e5\u9053\u6307\u4ee4\u6570\u636e\u7684\u6837\u5b50\uff0c\u6211\u4eec\u9700\u8981\u5c06\u5176\u4ece\u5b57\u8282\u8f6c\u6362\u4e3a\u8fd9\u4e9b\u7c7b\u578b\u3002\u7b2c\u4e00\u6b65\u662f\u53cd\u5e8f\u5217\u5316\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u4e2a\u4e13\u95e8\u4e3a\u6709\u6548\u8d1f\u8f7d\u521b\u5efa\u7684\u65b0\u7ed3\u6784\u4f53\u4e0a\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"BorshDeserialize Traits")," \u6765\u5b8c\u6210\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(BorshDeserialize)]\nstruct NoteInstructionPayload {\n id: u64,\n title: String,\n body: String\n}\n")),(0,r.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u6709 ",(0,r.kt)("inlineCode",{parentName:"p"},"title")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"body")," \uff0c\u56e0\u4e3a\u8fd9\u5c31\u662f\u5b57\u8282\u6570\u7ec4\u4e2d\u7684\u5185\u5bb9\u3002",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh"),"\u6240\u505a\u7684\u53ea\u662f\u6dfb\u52a0\u53cd\u5e8f\u5217\u5316\u7684\u652f\u6301\uff01\u5b83\u5b9e\u9645\u4e0a\u5e76\u6ca1\u6709\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\u3002\u5b83\u53ea\u662f\u6dfb\u52a0\u4e86\u6211\u4eec\u53ef\u4ee5\u8c03\u7528\u7684\u53cd\u5e8f\u5217\u5316\u51fd\u6570\u3002"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u5b9e\u9645\u4f7f\u7528\u8fd9\u4e9b\u51fd\u6570\u6765\u53cd\u5e8f\u5217\u5316\u6570\u636e\u3002\u6211\u4eec\u5c06\u5728\u4e00\u4e2a\u5b9e\u73b0\u4e2d\u5b9a\u4e49\u8fd9\u4e2a\u884c\u4e3a\u3002\u8fd9\u662f\u624b\u52a8\u5de5\u4f5c\uff08\u6682\u65f6\uff09\uff01"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"impl NoteInstruction {\n // Unpack inbound buffer to associated Instruction\n // The expected format for input is a Borsh serialized vector\n pub fn unpack(input: &[u8]) -> Result {\n // Take the first byte as the variant to\n // determine which instruction to execute\n let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n // Use the temporary payload struct to deserialize\n let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();\n // Match the variant to determine which data struct is expected by\n // the function and return the TestStruct or an error\n Ok(match variant {\n 0 => Self::CreateNote {\n title: payload.title,\n body: payload.body,\n id: payload.id\n },\n 1 => Self::UpdateNote {\n title: payload.title,\n body: payload.body,\n id: payload.id\n },\n 2 => Self::DeleteNote {\n id: payload.id\n },\n _ => return Err(ProgramError::InvalidInstructionData)\n })\n }\n}\n")),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(7500).Z,width:"930",height:"844"})),(0,r.kt)("p",null,"\u8fd9\u53ef\u80fd\u770b\u8d77\u6765\u5413\u4eba\uff0c\u4f46\u4f60\u5f88\u5feb\u5c31\u4f1a\u7b11\u51fa\u58f0\u6765\uff0c\u56e0\u4e3a\u5b83\u5176\u5b9e\u975e\u5e38\u7b80\u5355\uff01\u8ba9\u6211\u4eec\u6765\u5206\u89e3\u4e00\u4e0b \ud83d\udd7a\ud83d\udc83\ud83d\udc6f\u200d\u2642\ufe0f"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn unpack(input: &[u8]) -> Result {\n")),(0,r.kt)("p",null,"\u6211\u4eec\u7684\u89e3\u5305\u51fd\u6570\u5c06\u4ece\u6307\u4ee4\u4e2d\u83b7\u53d6\u5b57\u8282\uff0c\u5e76\u8fd4\u56de\u4e00\u4e2a",(0,r.kt)("inlineCode",{parentName:"p"},"NoteInstruction"),"\u7c7b\u578b\uff08\u8fd9\u5c31\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"Self")," \uff09\u6216\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n")),(0,r.kt)("p",null,"\u662f\u65f6\u5019\u5c06\u6211\u4eec\u7684\u6570\u636e\u4ece\u5b57\u8282\u4e2d\u89e3\u5305\u5e76\u8c03\u7528\u53cd\u5e8f\u5217\u5316\u51fd\u6570\u4e86\u3002"),(0,r.kt)("p",null,"\u5728\u8fd9\u4e2a\u7a0b\u5e8f\u4e2d\uff0c\u6211\u4eec\u6307\u4ee4\u6570\u636e\u7684\u7b2c\u4e00\u4e2a\u5b57\u8282\u662f\u4e00\u4e2a\u6574\u6570\uff0c\u544a\u8bc9\u6211\u4eec\u6b63\u5728\u5904\u7406\u54ea\u4e2a\u6307\u4ee4\u3002\u6211\u4eec\u9700\u8981\u8fd9\u6837\u505a\u662f\u56e0\u4e3a\u6bcf\u4e2a\u6307\u4ee4\u53ef\u80fd\u6709\u4e0d\u540c\u7684\u5173\u8054\u6570\u636e\u3002\u4e5f\u8bb8\u6211\u4eec\u6b63\u5728\u7f16\u5199\u4e00\u4e2a\u98df\u8c31\u7a0b\u5e8f\uff0c\u800c\u4e0d\u662f\u70f9\u996a\u98df\u8c31\uff0c\u6211\u4eec\u6700\u7ec8\u5220\u9664\u4e86\u5b83\u3002\u6211\u4eec\u9700\u8981\u77e5\u9053\u6211\u4eec\u6b63\u5728\u5904\u7406\u54ea\u4e2a\u6307\u4ee4\uff0c\u4ee5\u4fbf\u80fd\u591f\u6b63\u786e\u89e3\u6790\u6570\u636e\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u8fd9\u6837\u505a\u7684\u65b9\u5f0f\u662f\u4f7f\u7528Rust\u5185\u7f6e\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"split_first")," \u51fd\u6570\u3002\u5b83\u63a5\u53d7\u4e00\u4e2a\u5b57\u8282\u5207\u7247\u5e76\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002\u7b2c\u4e00\u4e2a\u5143\u7d20\u662f\u5207\u7247\u4e2d\u7684\u7b2c\u4e00\u4e2a\u5b57\u8282\uff0c\u7b2c\u4e8c\u4e2a\u5143\u7d20\u662f\u5207\u7247\u7684\u5269\u4f59\u90e8\u5206\u3002\u5982\u679c\u5207\u7247\u4e3a\u7a7a\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"ok_or")," \u53ea\u662f\u8fd4\u56de ",(0,r.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u679a\u4e3e\u4e2d\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"InvalidInstructionData")," \u9519\u8bef\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();\n")),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u6709\u4e24\u4e2a\u53d8\u91cf\u8981\u5904\u7406 - \u6307\u4ee4\u6307\u793a\u5668\u548c\u6307\u4ee4\u7684\u6709\u6548\u8f7d\u8377\uff08\u6570\u636e\uff09\u3002",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh"),"\u5728\u6211\u4eec\u7684\u6709\u6548\u8f7d\u8377\u7ed3\u6784\u4e2d\u6dfb\u52a0\u4e86 ",(0,r.kt)("inlineCode",{parentName:"p"},"try_from_slice")," \u51fd\u6570\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6709\u6548\u8f7d\u8377\u53d8\u91cf ",(0,r.kt)("inlineCode",{parentName:"p"},"rest")," \u4e0a\u8c03\u7528\u5b83\u3002\u8fd9\u5c31\u662f\u53cd\u5e8f\u5217\u5316\u7684\u8fc7\u7a0b\uff01\u5982\u679c\u6ca1\u6709\u9519\u8bef\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"unwrap")," \u5c06\u4ece\u8fd9\u4e2a\u51fd\u6570\u4e2d\u8fd4\u56de\u503c\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u5feb\u5230\u4e86\uff01\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u5c06\u6211\u4eec\u7684\u6307\u4ee4\u6570\u636e\u5b9a\u4e49\u4e3a ",(0,r.kt)("inlineCode",{parentName:"li"},"Rust")," \u7c7b\u578b\u4e2d\u7684\u679a\u4e3e"),(0,r.kt)("li",{parentName:"ul"},"\u5b9a\u4e49\u4e86\u6211\u4eec\u7684\u8d1f\u8f7d\u7ed3\u6784\u4f53"),(0,r.kt)("li",{parentName:"ul"},"\u5728\u8d1f\u8f7d\u7ed3\u6784\u4f53\u4e0a\u58f0\u660e\u4e86 ",(0,r.kt)("inlineCode",{parentName:"li"},"BorshDeserialize")," \u5b8f"),(0,r.kt)("li",{parentName:"ul"},"\u4e3a\u8d1f\u8f7d\u7ed3\u6784\u521b\u5efa\u4e86\u4e00\u4e2a\u5b9e\u73b0\uff08\u5b57\u8282 -> \u7ed3\u6784\u4f53\uff09"),(0,r.kt)("li",{parentName:"ul"},"\u521b\u5efa\u4e86\u4e00\u4e2a",(0,r.kt)("inlineCode",{parentName:"li"},"unpack"),"\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u63a5\u6536\u6307\u4ee4\u6570\u636e\u5e76\u5bf9\u5176\u8fdb\u884c\u53cd\u5e8f\u5217\u5316")),(0,r.kt)("p",null,"\u6211\u4eec",(0,r.kt)("inlineCode",{parentName:"p"},"unpack"),"\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u662f\u5c06\u53cd\u5e8f\u5217\u5316\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u679a\u4e3e\u53d8\u4f53\uff08\u5373\u6307\u4ee4\u6570\u636e\u7c7b\u578b\uff09\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"Ok(match variant {\n 0 => Self::CreateNote {\n title: payload.title,\n body: payload.body,\n id: payload.id\n },\n 1 => Self::UpdateNote {\n title: payload.title,\n body: payload.body,\n id: payload.id\n },\n 2 => Self::DeleteNote {\n id: payload.id\n },\n _ => return Err(ProgramError::InvalidInstructionData)\n})\n")),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528\u5339\u914d\u8bed\u53e5\u6765\u5b8c\u6210\u8fd9\u4e2a\u64cd\u4f5c\u3002\u901a\u8fc7\u5339\u914d\u6307\u4ee4\u6307\u793a\u5668\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd4\u56de\u679a\u4e3e\u7684\u6b63\u786e\u53d8\u4f53\u3002\u53ef\u4ee5\u5c06\u5176\u89c6\u4e3a\u4f7f\u7528\u6307\u4ee4\u4e2d\u7684\u6570\u636e\u6765\u521b\u5efa\u6b63\u786e\u7c7b\u578b\u7684\u53d8\u91cf\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u77e5\u9053\u86cb\u7cd5\u7684\u6837\u5b50\u4e86\uff01\u6211\u53d1\u73b0\u4f60\u9700\u8981\u5f88\u591a\u8111\u529b\u6765\u4e00\u6b21\u6027\u5c06\u86cb\u7cd5\u7684\u6bcf\u4e00\u5757\u90fd\u653e\u5165\u5de5\u4f5c\u8bb0\u5fc6\u4e2d\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u9700\u8981\u56de\u8fc7\u5934\u6765\u8bfb\u51e0\u6b21\u4e5f\u6ca1\u5173\u7cfb\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u5f88\u591a\u5185\u5bb9\u3002\u53ef\u80fd\u4f1a\u8ba9\u4eba\u611f\u5230\u56f0\u60d1\u3002\u522b\u62c5\u5fc3\uff1a\u6211\u4eec\u4f1a\u8fdb\u884c\u5927\u91cf\u7ec3\u4e60\uff0c\u4ee5\u4fbf\u719f\u6089\u8fd9\u4e9b\u5185\u5bb9\u3002\u76f8\u4fe1\u7ecf\u8fc7\u4e00\u6bb5\u65f6\u95f4\u548c\u51e0\u6b21\u91cd\u590d\u7ec3\u4e60\uff0c\u8fd9\u4e9b\u5185\u5bb9\u4f1a\u5f00\u59cb\u53d8\u5f97\u6709\u610f\u4e49\u3002"),(0,r.kt)("h2",{id:"-\u7a0b\u5e8f\u903b\u8f91"},"\ud83d\ude80 \u7a0b\u5e8f\u903b\u8f91"),(0,r.kt)("p",null,"\u6211\u4eec\u5df2\u7ecf\u5c06\u6307\u4ee4\u6570\u636e\u89e3\u538b\u5e76\u51c6\u5907\u5c31\u7eea\u3002\u73b0\u5728\u6211\u4eec\u9700\u8981\u4e3a\u6bcf\u4e2a\u6307\u4ee4\u7f16\u5199\u903b\u8f91\u3002\u8fd9\u662f\u6700\u7b80\u5355\u7684\u90e8\u5206\uff01\u53cd\u5e8f\u5217\u5316\u662f\u8017\u65f6\u7684\u201c\u55ef\uff0c\u8fd9\u662f\u600e\u4e48\u56de\u4e8b\u201d\u7684\u90e8\u5206\uff08Anchor\u4f1a\u4e3a\u60a8\u5904\u7406\uff09\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(4220).Z,width:"926",height:"844"})),(0,r.kt)("p",null,"\u9996\u5148\uff0c\u6211\u4eec\u8981\u505a\u7684\u662f\u5b9a\u4e49\u7a0b\u5e8f\u7684\u5165\u53e3\u70b9\u3002\u51fd\u6570 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u7684\u5b9a\u4e49\u4e0e\u6211\u4eec\u7684",(0,r.kt)("inlineCode",{parentName:"p"},"Hello World"),"\u7a0b\u5e8f\u76f8\u540c\u3002\u7136\u540e\uff0c\u6211\u4eec\u5c06\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"NoteInstruction")," \u7684\u5b9e\u73b0\u4e2d\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"unpack")," \u51fd\u6570\u6765\u83b7\u53d6\u6307\u4ee4\u6570\u636e\u3002\u7136\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"NoteInstruction")," \u679a\u4e3e\u6765\u5339\u914d\u7c7b\u578b\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u8fd9\u91cc\u6ca1\u6709\u8fd9\u4e2a\u903b\u8f91\uff0c\u6211\u4eec\u4f1a\u5728\u771f\u6b63\u5f00\u59cb\u5efa\u8bbe\u65f6\u6dfb\u52a0\u5b83\uff01"),(0,r.kt)("h2",{id:"-\u6587\u4ef6\u7ed3\u6784\u8bf4\u660e"},"\ud83d\udcc2 \u6587\u4ef6\u7ed3\u6784\u8bf4\u660e"),(0,r.kt)("p",null,"\u5f53\u7f16\u5199\u81ea\u5b9a\u4e49\u7a0b\u5e8f\u65f6\uff0c\u6700\u597d\u5c06\u4ee3\u7801\u5206\u6210\u4e0d\u540c\u7684\u6587\u4ef6\u3002\u8fd9\u6837\u53ef\u4ee5\u91cd\u590d\u4f7f\u7528\u4ee3\u7801\uff0c\u5e76\u4e14\u66f4\u5bb9\u6613\u627e\u5230\u6240\u9700\u7684\u5185\u5bb9\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(648).Z,width:"1350",height:"582"})),(0,r.kt)("p",null,"\u9664\u4e86 ",(0,r.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u6587\u4ef6\u4e4b\u5916\uff0c\u6211\u4eec\u5c06\u628a\u7a0b\u5e8f\u7684\u5404\u4e2a\u90e8\u5206\u5206\u522b\u653e\u5728\u4e0d\u540c\u7684\u6587\u4ef6\u4e2d\u3002\u6700\u660e\u663e\u7684\u4e00\u4e2a\u5c31\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u6587\u4ef6\u3002\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u5c06\u5b9a\u4e49\u6307\u4ee4\u6570\u636e\u7c7b\u578b\u5e76\u5b9e\u73b0\u5bf9\u6307\u4ee4\u6570\u636e\u7684\u89e3\u5305\u3002"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u4f60\u505a\u5f97\u5f88\u68d2\ud83d\udc4f\ud83d\udc4f\ud83d\udc4f")),(0,r.kt)("p",null,"\u6211\u60f3\u82b1\u70b9\u65f6\u95f4\u6765\u8d5e\u8d4f\u4f60\u6240\u4ed8\u51fa\u7684\u52aa\u529b\u3002\u4f60\u6b63\u5728\u5b66\u4e60\u4e00\u4e9b\u975e\u5e38\u5f3a\u5927\u7684\u77e5\u8bc6\uff0c\u8fd9\u4e9b\u77e5\u8bc6\u53ef\u4ee5\u5728 Solana \u4e4b\u5916\u7684\u9886\u57df\u4e2d\u4f7f\u7528\uff0cRust \u6709\u5f88\u591a\u5e94\u7528\u3002Solana \u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u56f0\u96be\uff0c\u8fd9\u91cc\u6709\u4e00\u6761\u6765\u81ea FormFunction \u521b\u59cb\u4eba\u7684\u63a8\u6587\uff0c\u5927\u7ea6\u4e00\u5e74\u524d\u4ed6\u63d0\u5230\u4e86\u4ed6\u53d1\u73b0\u5b83\u6709\u591a\u4e48\u56f0\u96be\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(3189).Z,width:"1254",height:"778"})),(0,r.kt)("p",null,"FormFunction\u5df2\u7ecf\u7b79\u96c6\u4e86\u8d85\u8fc7470\u4e07\u7f8e\u5143\uff0c\u5e76\u4e14\u662fSolana\u4e0a\u6700\u597d\u76841/1 NFT\u5e73\u53f0\uff08\u5728\u6211\u770b\u6765\uff09\u3002Matt\u575a\u6301\u4e0d\u61c8\u5730\u5efa\u7acb\u4e86\u4e00\u4e9b\u4ee4\u4eba\u96be\u4ee5\u7f6e\u4fe1\u7684\u4e1c\u897f\u3002\u4f60\u80fd\u60f3\u8c61\u4e00\u4e0b\u62e5\u6709\u8fd9\u4e9b\u6280\u80fd\u4e00\u5e74\u540e\u4f60\u4f1a\u5728\u54ea\u91cc\u5417\uff1f"))}c.isMDXComponent=!0},7869:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/borsh-struct-e01fdaa79a1fcda693791ff88b467db4.png"},4776:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/borsh-393058cb1ff5574854f6365918b9dec9.png"},2554:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/enum-1-be0f79f199ff71eea731ccad8fc6b86a.png"},9328:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/enum-2-be0f79f199ff71eea731ccad8fc6b86a.png"},8301:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/enum-3-2b716e93f691c5e650c0f15de58d8b32.png"},648:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/file-structure-eee2fba4bbd91380e0f837e4601d2b85.png"},4220:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/process-instruction-6788dae5d2b396a2d8e802f44f21fac9.png"},2406:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rust-struct-e75b2612d0ea122f32ce27bae281f3a4.png"},3530:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/rust-variable-19ed93dab21249baa04498197718bf4e.png"},3189:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/solana-learner-b7d0ee3d1fd3fa79f7d6c7825337e785.png"},3658:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/struct-impl-415daa9644058eb857e3de3319bf4d63.png"},793:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/the-rust-layer-cake-ca50fcbc4c5288f3a4e41245ee64a4af.png"},7500:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upack-struct-5e87d372784710ca02f9a415610d175f.png"}}]); \ No newline at end of file diff --git a/assets/js/0279d735.760d3f7d.js b/assets/js/0279d735.760d3f7d.js new file mode 100644 index 000000000..77a8adbad --- /dev/null +++ b/assets/js/0279d735.760d3f7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9673],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),p=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),c=p(n),d=r,f=c["".concat(u,".").concat(d)]||c[d]||m[d]||l;return n?a.createElement(f,o(o({ref:t},s),{},{components:n})):a.createElement(f,o({ref:t},s))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const l={sidebar_position:26,sidebar_label:"Module2",sidebar_class_name:"green"},o="Solana Module2",i={unversionedId:"Solana-Co-Learn/module2/README",id:"Solana-Co-Learn/module2/README",title:"Solana Module2",description:"SPL\u4ee3\u5e01",source:"@site/docs/Solana-Co-Learn/module2/README.md",sourceDirName:"Solana-Co-Learn/module2",slug:"/Solana-Co-Learn/module2/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/README.md",tags:[],version:"current",sidebarPosition:26,frontMatter:{sidebar_position:26,sidebar_label:"Module2",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Solana\u94b1\u5305\u4f7f\u7528",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallet-usage/"},next:{title:"Spl token",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/"}},u={},p=[{value:"SPL\u4ee3\u5e01",id:"spl\u4ee3\u5e01",level:2},{value:"NFTS + METAPLEX\u94f8\u9020",id:"nfts--metaplex\u94f8\u9020",level:2},{value:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts",level:2},{value:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",id:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247",level:2},{value:"\u4f7f\u7528token2022\u7a0b\u5e8f\u521b\u5efatoken",id:"\u4f7f\u7528token2022\u7a0b\u5e8f\u521b\u5efatoken",level:2},{value:"\u4f7f\u7528\u538b\u7f29nft\u7a0b\u5e8f\u521b\u5efa\u538b\u7f29nft",id:"\u4f7f\u7528\u538b\u7f29nft\u7a0b\u5e8f\u521b\u5efa\u538b\u7f29nft",level:2}],s={toc:p},c="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"solana-module2"},"Solana Module2"),(0,r.kt)("h2",{id:"spl\u4ee3\u5e01"},"SPL\u4ee3\u5e01"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u5e26\u6709Gage\u7684\u4ee4\u724c"),(0,r.kt)("li",{parentName:"ul"},"The Token Program"),(0,r.kt)("li",{parentName:"ul"},"\u5728Solana\u4e0a\u94f8\u9020Token"),(0,r.kt)("li",{parentName:"ul"},"Metaplex \u4e0e Gage"),(0,r.kt)("li",{parentName:"ul"},"\u4ee4\u724c\u5143\u6570\u636e"),(0,r.kt)("li",{parentName:"ul"},"\u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd")),(0,r.kt)("h2",{id:"nfts--metaplex\u94f8\u9020"},"NFTS + METAPLEX\u94f8\u9020"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Solana\u4e0a\u7684NFT\u4e0eGage"),(0,r.kt)("li",{parentName:"ul"},"Solana\u4e0a\u7684NFTs"),(0,r.kt)("li",{parentName:"ul"},"NFT\u4f60\u7684\u8138"),(0,r.kt)("li",{parentName:"ul"},"\u7cd6\u679c\u673a\u5e26Gage"),(0,r.kt)("li",{parentName:"ul"},"\u7cd6\u679c\u673a\u4e0eSugar\u547d\u4ee4\u884c\u754c\u9762")),(0,r.kt)("h2",{id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts"},"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u4f7f\u7528Gage\u5236\u4f5c\u7528\u6237\u754c\u9762"),(0,r.kt)("li",{parentName:"ul"},"\u5c55\u793aNFTs"),(0,r.kt)("li",{parentName:"ul"},"\u5c55\u793a\u6765\u81ea\u94b1\u5305\u7684NFTs"),(0,r.kt)("li",{parentName:"ul"},"\u5c55\u793a\u6765\u81ea\u7cd6\u679c\u673a\u7684NFTs")),(0,r.kt)("h2",{id:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247"},"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u521b\u5efa\u5956\u52b1\u4ee3\u5e01"),(0,r.kt)("li",{parentName:"ul"},"\u5236\u4f5c\u7cd6\u679c\u673a"),(0,r.kt)("li",{parentName:"ul"},"\u521b\u5efa\u94f8\u5e01\u754c\u9762")),(0,r.kt)("h2",{id:"\u4f7f\u7528token2022\u7a0b\u5e8f\u521b\u5efatoken"},"\u4f7f\u7528token2022\u7a0b\u5e8f\u521b\u5efatoken"),(0,r.kt)("h2",{id:"\u4f7f\u7528\u538b\u7f29nft\u7a0b\u5e8f\u521b\u5efa\u538b\u7f29nft"},"\u4f7f\u7528\u538b\u7f29nft\u7a0b\u5e8f\u521b\u5efa\u538b\u7f29nft"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0279d735.d031f311.js b/assets/js/0279d735.d031f311.js deleted file mode 100644 index 5b7f81cdc..000000000 --- a/assets/js/0279d735.d031f311.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9673],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=a.createContext({}),p=function(e){var t=a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},s=function(e){var t=p(e.components);return a.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),c=p(n),d=r,f=c["".concat(u,".").concat(d)]||c[d]||m[d]||l;return n?a.createElement(f,o(o({ref:t},s),{},{components:n})):a.createElement(f,o({ref:t},s))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const l={sidebar_position:26,sidebar_label:"Module2",sidebar_class_name:"green"},o="Solana Module2",i={unversionedId:"Solana-Co-Learn/module2/README",id:"Solana-Co-Learn/module2/README",title:"Solana Module2",description:"SPL\u4ee3\u5e01",source:"@site/docs/Solana-Co-Learn/module2/README.md",sourceDirName:"Solana-Co-Learn/module2",slug:"/Solana-Co-Learn/module2/",permalink:"/docs/Solana-Co-Learn/module2/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/README.md",tags:[],version:"current",sidebarPosition:26,frontMatter:{sidebar_position:26,sidebar_label:"Module2",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Solana\u94b1\u5305\u4f7f\u7528",permalink:"/docs/Solana-Co-Learn/module1/wallet-usage/"},next:{title:"Spl token",permalink:"/docs/Solana-Co-Learn/module2/spl-token/"}},u={},p=[{value:"SPL\u4ee3\u5e01",id:"spl\u4ee3\u5e01",level:2},{value:"NFTS + METAPLEX\u94f8\u9020",id:"nfts--metaplex\u94f8\u9020",level:2},{value:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts",level:2},{value:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",id:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247",level:2},{value:"\u4f7f\u7528token2022\u7a0b\u5e8f\u521b\u5efatoken",id:"\u4f7f\u7528token2022\u7a0b\u5e8f\u521b\u5efatoken",level:2},{value:"\u4f7f\u7528\u538b\u7f29nft\u7a0b\u5e8f\u521b\u5efa\u538b\u7f29nft",id:"\u4f7f\u7528\u538b\u7f29nft\u7a0b\u5e8f\u521b\u5efa\u538b\u7f29nft",level:2}],s={toc:p},c="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"solana-module2"},"Solana Module2"),(0,r.kt)("h2",{id:"spl\u4ee3\u5e01"},"SPL\u4ee3\u5e01"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u5e26\u6709Gage\u7684\u4ee4\u724c"),(0,r.kt)("li",{parentName:"ul"},"The Token Program"),(0,r.kt)("li",{parentName:"ul"},"\u5728Solana\u4e0a\u94f8\u9020Token"),(0,r.kt)("li",{parentName:"ul"},"Metaplex \u4e0e Gage"),(0,r.kt)("li",{parentName:"ul"},"\u4ee4\u724c\u5143\u6570\u636e"),(0,r.kt)("li",{parentName:"ul"},"\u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd")),(0,r.kt)("h2",{id:"nfts--metaplex\u94f8\u9020"},"NFTS + METAPLEX\u94f8\u9020"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Solana\u4e0a\u7684NFT\u4e0eGage"),(0,r.kt)("li",{parentName:"ul"},"Solana\u4e0a\u7684NFTs"),(0,r.kt)("li",{parentName:"ul"},"NFT\u4f60\u7684\u8138"),(0,r.kt)("li",{parentName:"ul"},"\u7cd6\u679c\u673a\u5e26Gage"),(0,r.kt)("li",{parentName:"ul"},"\u7cd6\u679c\u673a\u4e0eSugar\u547d\u4ee4\u884c\u754c\u9762")),(0,r.kt)("h2",{id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts"},"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u4f7f\u7528Gage\u5236\u4f5c\u7528\u6237\u754c\u9762"),(0,r.kt)("li",{parentName:"ul"},"\u5c55\u793aNFTs"),(0,r.kt)("li",{parentName:"ul"},"\u5c55\u793a\u6765\u81ea\u94b1\u5305\u7684NFTs"),(0,r.kt)("li",{parentName:"ul"},"\u5c55\u793a\u6765\u81ea\u7cd6\u679c\u673a\u7684NFTs")),(0,r.kt)("h2",{id:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247"},"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u521b\u5efa\u5956\u52b1\u4ee3\u5e01"),(0,r.kt)("li",{parentName:"ul"},"\u5236\u4f5c\u7cd6\u679c\u673a"),(0,r.kt)("li",{parentName:"ul"},"\u521b\u5efa\u94f8\u5e01\u754c\u9762")),(0,r.kt)("h2",{id:"\u4f7f\u7528token2022\u7a0b\u5e8f\u521b\u5efatoken"},"\u4f7f\u7528token2022\u7a0b\u5e8f\u521b\u5efatoken"),(0,r.kt)("h2",{id:"\u4f7f\u7528\u538b\u7f29nft\u7a0b\u5e8f\u521b\u5efa\u538b\u7f29nft"},"\u4f7f\u7528\u538b\u7f29nft\u7a0b\u5e8f\u521b\u5efa\u538b\u7f29nft"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/04e84b79.6749cf4b.js b/assets/js/04e84b79.6749cf4b.js new file mode 100644 index 000000000..fd4f5edfa --- /dev/null +++ b/assets/js/04e84b79.6749cf4b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7047],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>k});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=u(n),d=l,k=c["".concat(s,".").concat(d)]||c[d]||m[d]||o;return n?a.createElement(k,r(r({ref:t},p),{},{components:n})):a.createElement(k,r({ref:t},p))}));function k(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,r=new Array(o);r[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:l,r[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(7462),l=(n(7294),n(3905));const o={sidebar_position:32,sidebar_label:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",sidebar_class_name:"green"},r="\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",i={unversionedId:"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README",id:"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README",title:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",description:"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002",source:"@site/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity",slug:"/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README.md",tags:[],version:"current",sidebarPosition:32,frontMatter:{sidebar_position:32,sidebar_label:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/token-metadata/"},next:{title:"Ntfs & Minting with metaplex",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/"}},s={},u=[{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2},{value:"Reference",id:"reference",level:2}],p={toc:u},c="wrapper";function m(e){let{components:t,...o}=e;return(0,l.kt)(c,(0,a.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd"},"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece",(0,l.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-token-client/tree/solution-without-burn"},"\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801"),"\uff08\u786e\u4fdd\u4f60\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"solution-without-burn")," \u5206\u652f\u4e0a\uff09\u3002"),(0,l.kt)("p",null,"\u9996\u5148\u6dfb\u52a0\u65b0\u7684\u4f9d\u8d56\u9879\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @metaplex-foundation/js fs\nnpm install @metaplex-foundation/mpl-token-metadata\n")),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528Metaplex SDK\u6765\u6dfb\u52a0\u5143\u6570\u636e\u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"fs")," \u5e93\uff0c\u4ee5\u4fbf\u6211\u4eec\u53ef\u4ee5\u8bfb\u53d6\u4ee3\u5e01\u7684\u6807\u5fd7\u56fe\u7247\u3002\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},"assets")," \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5e76\u6dfb\u52a0\u60a8\u7684\u6807\u5fd7\u3002\u8fd9\u5c06\u5728\u6d4b\u8bd5\u7f51\u7edc\u4e0a\u8fdb\u884c\uff0c\u6240\u4ee5\u5c3d\u60c5\u4eab\u53d7\u5427\uff01\u6211\u9009\u62e9\u4e86\u4e00\u4e2a\u6bd4\u8428\u997c\u8868\u60c5\u7b26\u53f7\uff0c\u6240\u4ee5\u6211\u628a\u6211\u7684\u6587\u4ef6\u547d\u540d\u4e3a",(0,l.kt)("inlineCode",{parentName:"p"},"pizza.png"),"\uff0c\u54c8\u54c8\u3002"),(0,l.kt)("p",null,"Metaplex\u5c06\u4e3a\u6211\u4eec\u627f\u62c5\u6240\u6709\u7e41\u91cd\u7684\u5de5\u4f5c\uff0c\u6240\u4ee5\u8bf7\u5728\u9876\u90e8\u6dfb\u52a0\u4ee5\u4e0b\u5bfc\u5165\uff1a ",(0,l.kt)("inlineCode",{parentName:"p"},"index.ts")," \uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'import {\n Metaplex,\n keypairIdentity,\n bundlrStorage,\n toMetaplexFile,\n} from "@metaplex-foundation/js"\nimport {\n DataV2,\n createCreateMetadataAccountV3Instruction,\n} from "@metaplex-foundation/mpl-token-metadata"\nimport * as fs from "fs"\n')),(0,l.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\u4e00\u5207\uff0c\u6211\u4eec\u5c06\u5f00\u59cb\u5904\u7406\u5143\u6570\u636e\u90e8\u5206\u3002\u6211\u4eec\u5c06\u5148\u8fdb\u884c\u94fe\u4e0b\u90e8\u5206\uff0c\u7136\u540e\u521b\u5efa\u4ee3\u5e01\u5143\u6570\u636e\u8d26\u6237\u3002"),(0,l.kt)("p",null,"\u5728\u9ad8\u5c42\u6b21\u4e0a\uff0c\u8fd9\u662f\u9700\u8981\u53d1\u751f\u7684\u4e8b\u60c5\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"toMetaplexFile()")," \u5c06\u56fe\u50cf\u6587\u4ef6\u8f6c\u6362\u4e3ametaplex\u6587\u4ef6"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"metaplex.storage().upload")," \u4e0a\u4f20\u56fe\u7247"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:3},(0,l.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"metaplex.uploadMetadata()")," \u4e0a\u4f20\u94fe\u4e0b\u5143\u6570\u636e"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:4},(0,l.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"findMetadataPda()")," \u6765\u63a8\u5bfc\u5143\u6570\u636e\u8d26\u6237PDA"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:5},(0,l.kt)("li",{parentName:"ol"},"\u6784\u5efa\u7c7b\u578b\u4e3a ",(0,l.kt)("inlineCode",{parentName:"li"},"DataV2")," \u7684\u94fe\u4e0a\u6570\u636e\u683c\u5f0f"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:6},(0,l.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"createCreateMetadataAccountV2Instruction")," \u521b\u5efa\u5143\u6570\u636e\u8d26\u6237\u7684\u6784\u5efa\u6307\u4ee4\uff08\u4e0d\u662f\u62fc\u5199\u9519\u8bef\u54c8\u54c8\uff09"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:7},(0,l.kt)("li",{parentName:"ol"},"\u53d1\u9001\u5e26\u6709\u6307\u4ee4\u7684\u4ea4\u6613\u4ee5\u521b\u5efa\u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237")))),(0,l.kt)("p",null,"\u8fd9\u91cc\u53d1\u751f\u4e86\u5f88\u591a\u4e8b\u60c5\uff0c\u4f46\u90fd\u662f\u57fa\u7840\u7684\u4e1c\u897f\u3002\u82b1\u70b9\u65f6\u95f4\u770b\u4e00\u4e0b\uff0c\u4f60\u4f1a\u77e5\u9053\u53d1\u751f\u4e86\u4ec0\u4e48\uff01"),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u5355\u4e00\u7684\u51fd\u6570\u6765\u5b8c\u6210\u6240\u6709\u8fd9\u4e9b\u64cd\u4f5c\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'async function createTokenMetadata(\n connection: web3.Connection,\n metaplex: Metaplex,\n mint: web3.PublicKey,\n user: web3.Keypair,\n name: string,\n symbol: string,\n description: string\n) {\n // file to buffer\n const buffer = fs.readFileSync("assets/1203.png")\n\n // buffer to metaplex file\n const file = toMetaplexFile(buffer, "1203.png")\n\n // upload image and get image uri\n const imageUri = await metaplex.storage().upload(file)\n console.log("image uri:", imageUri)\n\n // upload metadata and get metadata uri (off chain metadata)\n const { uri } = await metaplex\n .nfts()\n .uploadMetadata({\n name: name,\n description: description,\n image: imageUri,\n })\n\n console.log("metadata uri:", uri)\n\n // get metadata account address\n const metadataPDA = metaplex.nfts().pdas().metadata({ mint })\n\n // onchain metadata format\n const tokenMetadata = {\n name: name,\n symbol: symbol,\n uri: uri,\n sellerFeeBasisPoints: 0,\n creators: null,\n collection: null,\n uses: null,\n } as DataV2\n\n // transaction to create metadata account\n const transaction = new web3.Transaction().add(\n createCreateMetadataAccountV3Instruction(\n {\n metadata: metadataPDA,\n mint: mint,\n mintAuthority: user.publicKey,\n payer: user.publicKey,\n updateAuthority: user.publicKey,\n },\n {\n createMetadataAccountArgsV3: {\n data: tokenMetadata,\n isMutable: true,\n collectionDetails: null\n },\n }\n )\n )\n\n // send transaction\n const transactionSignature = await web3.sendAndConfirmTransaction(\n connection,\n transaction,\n [user]\n )\n\n console.log(\n `Create Metadata Account: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n')),(0,l.kt)("p",null,"\u786e\u4fdd\u60a8\u66f4\u65b0\u6587\u4ef6\u540d\uff01\u6b64\u5916\uff0c\u4e0d\u7528\u62c5\u5fc3 ",(0,l.kt)("inlineCode",{parentName:"p"},"nfts()")," \u7684\u8c03\u7528 - Metaplex\u6700\u521d\u662f\u4e3aNFT\u6784\u5efa\u7684\uff0c\u6700\u8fd1\u6269\u5c55\u5230\u4e86\u53ef\u66ff\u4ee3\u4ee3\u5e01\u7684\u5de5\u4f5c\u3002"),(0,l.kt)("p",null,"\u4f60\u4f1a\u6ce8\u610f\u5230\u6211\u4eec\u5728\u8fd9\u91cc\u7559\u4e86\u4e00\u5806\u7a7a\u7684\u4e1c\u897f - \u90a3\u662f\u56e0\u4e3a\u5728\u521b\u5efa\u53ef\u66ff\u4ee3\u4ee3\u5e01\u65f6\u4e0d\u9700\u8981\u8bbe\u7f6e\u8fd9\u4e9b\u4e1c\u897f\u3002\u975e\u53ef\u66ff\u4ee3\u4ee3\u5e01\u6709\u66f4\u5177\u4f53\u7684\u884c\u4e3a\u9700\u8981\u5b9a\u4e49\u3002"),(0,l.kt)("p",null,"\u6211\u53ef\u4ee5\u9010\u4e2a\u89e3\u91ca\u8fd9\u4e2a\u51fd\u6570\uff0c\u4f46\u6211\u53ea\u4f1a\u91cd\u590d\u81ea\u5df1\u54c8\u54c8\u3002\u6bd4\u8d77\u4e86\u89e3\u5b83\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u66f4\u91cd\u8981\u7684\u662f\u77e5\u9053\u5982\u4f55\u4f7f\u7528\u5b83\u3002\u4f60\u9700\u8981\u9605\u8bfb\u6587\u6863\u6765\u4f7f\u7528API\uff0c\u4ee5\u521b\u5efa\u7c7b\u4f3c\u8fd9\u6837\u7684\u51fd\u6570\u3002"),(0,l.kt)("p",null,"\u6211\u5728\u8c08\u8bba\u5b66\u4f1a\u9493\u9c7c\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u62ff\u5230\u8fd9\u6761\u9c7c\u3002"),(0,l.kt)("p",null,"\u4f60\u7684\u9996\u8981\u8d44\u6e90\u5e94\u8be5\u59cb\u7ec8\u662f\u6587\u6863\u3002\u4f46\u662f\u5f53\u4ee3\u7801\u521a\u521a\u88ab\u7f16\u5199\u65f6\uff0c\u6587\u6863\u53ef\u80fd\u8fd8\u4e0d\u5b58\u5728\u3002\u6240\u4ee5\u4f60\u5c31\u662f\u8fd9\u6837\u505a - \u5728\u4ee3\u7801\u88ab\u7f16\u5199\u65f6\u67e5\u770b\u5b83\u3002\u5982\u679c\u4f60\u5728Metaplex\u5b58\u50a8\u5e93\u4e2d\u67e5\u770b\uff0c\u4f60\u4f1a\u770b\u5230\u8fd9\u4e9b\u5185\u5bb9\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://metaplex-foundation.github.io/metaplex-program-library/docs/token-metadata/index.html#createCreateMetadataAccountV2Instruction?utm_source=buildspace.so&utm_medium=buildspace_project"},"Function definition docs for createMetadataAccountV2 instruction")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/metaplex-foundation/metaplex-program-library/blob/caeab0f7/token-metadata/js/src/generated/instructions/CreateMetadataAccountV2.ts#L73?utm_source=buildspace.so&utm_medium=buildspace_project"},"Actual function definition for the createCreateMetadataAccountV2Instruction instruction")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/metaplex-foundation/js/blob/c171e1e31d9fe12852afb39e449123339848180e/packages/js/test/plugins/nftModule/createNft.test.ts#L465?utm_source=buildspace.so&utm_medium=buildspace_project"},"The test for createMetadataAccountV2 instruction"))),(0,l.kt)("p",null,"\u8fd9\u5e76\u4e0d\u662f\u4ec0\u4e48\u9ad8\u6df1\u7684\u79d1\u5b66\uff0c\u4f60\u9700\u8981\u6df1\u5165\u4ee3\u7801\u5e76\u627e\u5230\u4f60\u9700\u8981\u7684\u4e1c\u897f\u3002\u4f60\u5fc5\u987b\u7406\u89e3\u4ee3\u7801\u6240\u6784\u5efa\u7684\u57fa\u672c\u5143\u7d20\uff08\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u662fSolana\u6307\u4ee4\uff09\uff0c\u8fd9\u53ef\u80fd\u9700\u8981\u51e0\u6b21\u5c1d\u8bd5\uff0c\u4f46\u56de\u62a5\u5c06\u662f\u5de8\u5927\u7684\u3002"),(0,l.kt)("p",null,"\u901a\u5e38\u6211\u5c1d\u8bd5\u505a\u7684\u662f:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u5728",(0,l.kt)("inlineCode",{parentName:"li"},"Discord"),"\u4e2d\u641c\u7d22/\u8be2\u95ee\uff08",(0,l.kt)("inlineCode",{parentName:"li"},"Metaplex"),"\uff0c",(0,l.kt)("inlineCode",{parentName:"li"},"Anchor"),"\u7b49\uff09"),(0,l.kt)("li",{parentName:"ul"},"\u5728",(0,l.kt)("inlineCode",{parentName:"li"},"Stack Exchange"),"\u4e0a\u641c\u7d22/\u63d0\u95ee"),(0,l.kt)("li",{parentName:"ul"},"\u6d4f\u89c8\u9879\u76ee/\u7a0b\u5e8f\u5b58\u50a8\u5e93\uff0c\u5982\u679c\u4f60\u60f3\u5f04\u6e05\u695a\u5982\u4f55\u4e3a\u4e00\u4e2a\u7a0b\u5e8f\u8bbe\u7f6e\u6307\u4ee4\uff0c\u8bf7\u53c2\u8003\u6d4b\u8bd5"),(0,l.kt)("li",{parentName:"ul"},"\u6216\u8005\uff0c\u5982\u679c\u6ca1\u6709\u6d4b\u8bd5\u53ef\u4ee5\u53c2\u8003\uff0c\u53ef\u4ee5\u590d\u5236/\u7c98\u8d34",(0,l.kt)("inlineCode",{parentName:"li"},"GitHub"),"\uff0c\u5e76\u5e0c\u671b\u80fd\u5728\u67d0\u4e2a\u5730\u65b9\u627e\u5230\u53c2\u8003\u8d44\u6599")),(0,l.kt)("p",null,"\u5e0c\u671b\u8fd9\u80fd\u7ed9\u4f60\u4e00\u4e2a\u5173\u4e8e\u5148\u9a71\u8005\u662f\u5982\u4f55\u505a\u5230\u7684\u60f3\u6cd5 :)"),(0,l.kt)("p",null,"\u56de\u5230\u6211\u4eec\u6309\u8ba1\u5212\u8fdb\u884c\u7684\u5efa\u8bbe\uff01"),(0,l.kt)("p",null,"\u8bb0\u5f97\u4e4b\u524d\u4fdd\u5b58\u7684\u4ee3\u5e01\u94f8\u9020\u5730\u5740\u5417\uff1f\u5728\u8c03\u7528\u8fd9\u4e2a\u65b0\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u5b83\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u4ee3\u5e01\u94f8\u9020\u8d26\u6237\u5730\u5740\uff0c\u4f60\u53ef\u4ee5\u968f\u65f6\u901a\u8fc7",(0,l.kt)("a",{parentName:"p",href:"https://explorer.solana.com/?cluster=devnet"},"\u6d4f\u89c8\u5668"),"\u67e5\u627e\u94b1\u5305\u5730\u5740\u5e76\u68c0\u67e5\u4ee3\u5e01\u9009\u9879\u5361\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(763).Z,width:"1150",height:"287"})),(0,l.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u66f4\u65b0\u540e\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"main()")," \u51fd\u6570\u5728\u8c03\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"createTokenMetadata")," \u51fd\u6570\u65f6\u7684\u6837\u5b50"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n console.log("PublicKey:", user.publicKey.toBase58())\n\n // MAKE SURE YOU REPLACE THIS ADDRESS WITH YOURS!\n const MINT_ADDRESS = "87MGWR6EbAqegYXr3LoZmKKC9fSFXQx4EwJEAczcMpMF"\n\n // metaplex setup\n const metaplex = Metaplex.make(connection)\n .use(keypairIdentity(user))\n .use(\n bundlrStorage({\n address: "https://devnet.bundlr.network",\n providerUrl: "https://api.devnet.solana.com",\n timeout: 60000,\n })\n )\n\n // Calling the token\n await createTokenMetadata(\n connection,\n metaplex,\n new web3.PublicKey(MINT_ADDRESS),\n user,\n "Pizza", // Token name - REPLACE THIS WITH YOURS\n "PZA", // Token symbol - REPLACE THIS WITH YOURS\n "Whoever holds this token is invited to my pizza party" // Token description - REPLACE THIS WITH YOURS\n )\n}\n')),(0,l.kt)("p",null,"\u66f4\u65b0\u8584\u8377\u5730\u5740\u548c\u4ee3\u5e01\u8be6\u60c5\u5e76\u7c89\u788e ",(0,l.kt)("inlineCode",{parentName:"p"},"npm run start")," \uff0c\u4f60\u4f1a\u770b\u5230\u7c7b\u4f3c\u8fd9\u6837\u7684\u4e1c\u897f\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"> solana-course-client@1.0.0 start\n> ts-node src/index.ts\n\nCurrent balance is 1.996472479\nPublicKey: 5y3G3Rz5vgK9rKRxu3BaC3PvhsMKGyAmtcizgrxojYAA\nimage uri: https://arweave.net/7sDCnvGRJAqfgEuGOYWhIshfgTC-hNfG4NSjwsKunQs\nmetadata uri: https://arweave.net/-2vGrM69PNtb2YaHnOErh1_006D28JJa825CIcEGIok\nCreate Metadata Account: https://explorer.solana.com/tx/4w8XEGCJY82MnBnErW9F5r1i5UL5ffJCCujcgFeXS8TTdZ6tHBEMznWnPoQXVcsPY3WoPbL2Nb1ubXCUJWWt2GWi?cluster=devnet\nFinished successfully\n")),(0,l.kt)("p",null,"\u4e00\u5207\u5fc5\u8981\u7684\u4e8b\u60c5\u90fd\u5df2\u7ecf\u4e00\u6b21\u6027\u5b8c\u6210\uff01\u968f\u610f\u70b9\u51fbArweave\u94fe\u63a5 - \u5b83\u5c31\u50cf\u662f\u53bb\u4e2d\u5fc3\u5316\u548c\u6c38\u4e45\u7684AWS S3/Google Cloud\u5b58\u50a8\uff0c\u4f1a\u5c55\u793a\u7ed9\u4f60\u4e0a\u4f20\u7684\u8d44\u4ea7\u662f\u4ec0\u4e48\u6837\u5b50\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u4f60\u56de\u5230\u6d4f\u89c8\u5668\u4e0a\u7684\u4ee3\u5e01\u94f8\u9020\u8d26\u6237\uff0c\u4f60\u4f1a\u770b\u5230\u4e00\u4e2a\u6f02\u4eae\u7684\u65b0\u56fe\u6807\u548c\u540d\u79f0\u3002\u8fd9\u662f\u6211\u7684\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(8303).Z,width:"167",height:"110"})),(0,l.kt)("p",null,"\u6b63\u5982\u4e00\u4f4d\u667a\u8005\u66fe\u7ecf\u8bf4\u8fc7\uff0c"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(1972).Z,width:"498",height:"280"})),(0,l.kt)("p",null,"\u4f60\u7684\u4ee3\u5e01\u5df2\u7ecf\u51c6\u5907\u5c31\u7eea\uff01\u8bb0\u5f97\u8981\u4f20\u64ad\u7231\u5fc3\u54e6\u3002\u4e5f\u8bb8\u53ef\u4ee5\u7ed9\u4f60\u7684\u670b\u53cb\u6216\u8005Discord\u670d\u52a1\u5668\u4e2d\u7684\u5176\u4ed6\u5efa\u8bbe\u8005\u53d1\u9001\u4e00\u4e9b\u4ee3\u5e01\u3002\u5728 #progress \u9891\u9053\u5206\u4eab\u4f60\u7684\u5730\u5740\uff0c\u8fd9\u6837\u522b\u4eba\u5c31\u53ef\u4ee5\u7ed9\u4f60\u7a7a\u6295\u4ed6\u4eec\u7684\u4ee3\u5e01\u5566 :D"),(0,l.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,l.kt)("p",null,"\u5e74\u8f7b\u7684\u73bb\u7483\u5480\u56bc\u8005\uff0c\u662f\u65f6\u5019\u4ece\u5934\u5f00\u59cb\u91cd\u65b0\u5b9e\u65bd\u8bfe\u7a0b\u6982\u5ff5\u4e86\u3002"),(0,l.kt)("p",null,"\u5c1d\u8bd5\u6784\u5efa\u4e00\u4e2a\u5305\u542b\u4ee5\u4e0b\u6307\u4ee4\u7684\u5355\u4e2a\u4ea4\u6613\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4ee3\u5e01\u94f8\u9020"),(0,l.kt)("li",{parentName:"ul"},"\u4e3a\u4ee3\u5e01\u94f8\u9020\u521b\u5efa\u4e00\u4e2a\u5143\u6570\u636e\u8d26\u6237"),(0,l.kt)("li",{parentName:"ul"},"\u521b\u5efa\u4e00\u4e2a\u4ee4\u724c\u8d26\u6237",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u53ef\u4ee5\u7684\u8bdd\uff0c\u5c1d\u8bd5\u6709\u6761\u4ef6\u5730\u6dfb\u52a0\u8fd9\u4e2a\u6307\u4ee4"),(0,l.kt)("li",{parentName:"ul"},"\u8bf7\u53c2\u8003 ",(0,l.kt)("inlineCode",{parentName:"li"},"getOrCreateAssociatedTokenAccount")," \u7684\u5b9e\u65bd\u65b9\u6848"),(0,l.kt)("li",{parentName:"ul"},"Hint: ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/solana-labs/solana-program-library/blob/48fbb5b7c49ea35848442bba470b89331dea2b2b/token/js/src/actions/getOrCreateAssociatedTokenAccount.ts#L35"},"https://github.com/solana-labs/solana-program-library/blob/48fbb5b7c49ea35848442bba470b89331dea2b2b/token/js/src/actions/getOrCreateAssociatedTokenAccount.ts#L35")))),(0,l.kt)("li",{parentName:"ul"},"Mint tokens")),(0,l.kt)("p",null,"\u8fd9\u57fa\u672c\u4e0a\u5c31\u662f\u4f60\u5728\u751f\u4ea7\u4e2d\u8981\u505a\u7684\u4e8b\u60c5 - \u4e00\u5207\u90fd\u4e00\u6b21\u6027\u5730\u4e00\u8d77\u5b8c\u6210\u3002"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Note\n\u8fd9\u6bd4\u5e73\u5e38\u66f4\u52a0\u81ea\u7531\u3002\u6311\u6218\u81ea\u5df1\u3002\u5c1d\u8bd5\u4e00\u4e0b\u3002\u771f\u6b63\u52aa\u529b\u53bb\u7406\u89e3\u6bcf\u4e2a\u62fc\u56fe\u7684\u90e8\u5206\u3002")),(0,l.kt)("p",null,"\u8981\u6309\u7167\u6211\u4eec\u8bbe\u60f3\u7684\u65b9\u5f0f\u8fdb\u884c\u64cd\u4f5c\uff0c\u60a8\u9700\u8981\u9010\u6b65\u6784\u5efa\u6bcf\u4e2a\u6307\u4ee4\uff0c\u7136\u540e\u5c06\u5b83\u4eec\u5168\u90e8\u6dfb\u52a0\u5230\u4e00\u4e2a\u4e8b\u52a1\u4e2d\u3002\u5728\u60a8\u81ea\u5df1\u5c1d\u8bd5\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u540e\uff0c\u60a8\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://github.com/Unboxed-Software/solana-token-metadata?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8be5\u5b58\u50a8\u5e93"),"\u7684\u6311\u6218\u5206\u652f\u4e2d\u67e5\u770b\u4e00\u4e2a\u53ef\u80fd\u7684\u5b9e\u73b0\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(3877).Z,width:"1106",height:"1884"})),(0,l.kt)("p",null,"\u989d\u5916\u63d0\u793a\uff1a",(0,l.kt)("a",{parentName:"p",href:"https://solana-labs.github.io/solana-program-library/token/js/modules.html"},"https://solana-labs.github.io/solana-program-library/token/js/modules.html")," - \u67e5\u770b\u6e90\u4ee3\u7801\uff0c\u4e0d\u8981\u4f7f\u7528\u8f85\u52a9\u51fd\u6570\u3002"),(0,l.kt)("h2",{id:"reference"},"Reference"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.quicknode.com/guides/solana-development/spl-tokens/how-to-create-a-fungible-spl-token-with-the-new-metaplex-token-standard"},"How to Create a Fungible SPL token with the New Metaplex Token Standard\n")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://spl.solana.com/token"},"Token Program")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://davirain-su.github.io/solana-cookbook-zh/references/token.html"},"\u4e0e\u4ee3\u5e01\u4ea4\u4e92"))))}m.isMDXComponent=!0},8303:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKcAAABuCAYAAABC8QOQAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABIVSURBVHhe7Z0JcFTHnca/OTQ60QjdQqAARpY4jcHGJFaMHQTEELIBUnghZr2AKUvxbgyL44XC67BxMIGYJWwZQ2IbuyoGysT4BOMFKRgsbAwIccgINBxCEkLnSCONRnPPdr95I82pOZCe3kD/ql7NdL+eNz28T/+jX3cjSc3MsIHBECFS/pXBEB1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1hIE5vS5zYsqd7gTAQp4R/dcZbHeNuY2DEKaThY0Y2bBFWnA6hCGn4HN/FRBp2CLpunX6RP11mKW3ITjEjN8WK3GQrRiZZMWSQDXEKeze1Rglud0hwTS3F5Sb7oWqSo1rT+5UD+W6GuBBAnP5lMXe0CbOyzXhipBnREXxlkHSZgKPX5fg/lRyfV/i7CJNqODBgO36kxVmxZJIJiyaYMDi6b7vQ2iXB3gsR+NvZCDRo2WhZuCK4OBUyG37zqBGFU4yQ9LPxspFftuOUAv97QgGjhVnKcENQcVL3/Z/TjCSGtPI17hAByWSQkANSKSTkoK+cih1Kpr21kc9breTF8WoBLOSgavRCXYcUm44pAnD3DDEhmDg3zNRj0QMkMHRHoYBMORjywYmQKhMgkUcQHfJCdDat3eJ06i7/3kZebWYzrO1tMKvVsGpaYTMauHPO7D0fgXWHo/gSQ+z0uzizEmzYOqcLDw4hlo0gUURCnpQCaUICpLFxXJmzkDw2sw1N33ah+bQexhbyGXIqOkOO9MdjoBwTybfyA7GsNqMRFq2WCJUKtgk2vZ47VVYnw6qD0ahucxI+Q5T0qzjHp1uw4xd6ZCbJOesoS0mFPGEwERxx217oum1G5V9aoS71tHrU42c+GYf7likhiwxSWESsljYi0qYG8qrGrRYzCj+JwsV67/3oX2IwfO4ijE0h/wzEa8gtRhIPAx3lH+H4qVZyOhsT5z+BEVEWGCWkf83ncPzTU+igkVBKHmbOAr59vwQdEUOR+8vpSL1yEMfPNgNj5mLBYxnQ04vx3Pr6HZxTkTf03KRWHN5DPsdFVLmY+nQyvqfXoUWRIouNH7Sef9+nUGG+t9CAzNEjEJU7BvKUNEijY4jIvGfPVmIxy9Y2of2yF9fP06EyQlNhRPq0GHKZIARKQgJpdDRnsSMyhmJQjAwz0lvw7U0pGgXP5k1oqyyDqqwMnRkPQ3r+rzh6uAw3b9kte+ZPn0Jm7T58+dk3UJ2tgD5nJsbGq1B1i/zBxmbhvlFA7VUJEeZMJFR8gpIyNfc5pORgjLwMn35whLs2Per5U9y5nGykRtXg2s1OUpGMoRNi0HShGkZ7C1HSB3fG0/DSgXRqMTMmj4diWJZPS9kNucTlP7dCV2PmK3yjKTegpdR+I0OChBCKoVlInziG6yPtqyf9Gun0QjIGKdtRf41YUA4dalS3kZQ2hC8TFEPx4C/zEXP+7zhR5mgXALcuo35kPsam8eUwoA/E6WnBzCRBWXkgCtWdgSUfhlYLmk528aXeoTnQ9ffbYbPcmYCuaqPxAukj7asnIo5HowYjqbMU58rb+QonMh/DnGXL+SMf6Xw1h/U2LhTXYVh+HgYJ7SxCpF+6WdcuxZlaGXZ9SWKhADCoLbCZAhebrtoEY6uv4Sj/UD3+aW89SkkfaV/DinYVKoyTMWNuLhR8VTe3juPgrnf4owj1fHU3NUdR2pyDKY8k8xXiJvQ7Q26wPznt/rIJpW+SBOQLLfQ08/aBVW9zGSHyBx3mNHeFLs6GVhOKz2r4kne47gTRp76hGR2aeCQNi+fLMRiWnYGWhjq+TNHj1ud7cdbyqHeB+qHpyFG0jR6PTL4sZkIXJ/F87s7P/V52maw4VdyGyh1t+O65elx8rRkGLyKVxUh85UleoUmsPNb3B2hyRQ9fnKroIFmtq7jdW3O/rZ+9O31u4M6t4qPQT/hnzHuWuOYVT2OC4hxKz7i7cB35g9+Lc5ZHMGN2ds9NdHHryzExm693xnodpceuizoRchDaUBL9RIA37uGIKPyHIaG7edyoCEx4ORmRST1JkrHNipMrbsNCLGggxOcoMGlzqoug9U1m1Bfr0HiiC111NLGyQZkbidTHYpD6Y5Kpx9gbm4hoZ62+hO+rAotxg/mtjL4lCHvlRBA364xJjwZZj4nQXjVB9XYbX7KjSJBiyKxYvtQ7VJD3PaN0EabmkgGn/70BN3a3o7PKBKuRWE5iGlovGHDljVac+69mWAx2S3n+amfgwqQwYQ4YoYkzCKjh+U7qOvSjPqOHSePqVkcSwSnH+o+g0mfEQDm6p52h2UzChRaYO31b3Y5KI0pXN8JC4tSPjrfwtQyx0+/ipHxr64LVKaqj7ru51NV6SSMkGLcmCek/ieFiSndojDl8UTxyChMhkdvNGY0ryzepPYTujc5qM0lWdTj0Xe+JEEM89NsTImc0JL1+QBaFJGuP6mKGRSDxAddxUFmUFClTo5E2LYabzEHL3HP1n8Ri9KrBSH442jXObLDgBh3zDDBxP3RZgyINfULCCAcEsZzUZv4dHU62k1jCKB/BHKmOHiLH/QWD8eCGFEx8NQUjFseTuNTTnBo1loAH46nlPqDX8iVGOCCIOClVNjMMEruJo247aUo0975XqH57S0ioLgPTJnQyG+psvsdaGeJDMHF2EN/7jcKeGMWNiEDsD+584q+MDg8F+AsOyXToCtT/M0SBYOKkfGDVwkI0OWpFgss84lCJSpZxcak/uqRWfG5lsWa4Iag4NRYrrAWxSAh00rAfaAY/6lml37HISxITjNYA/T9DNAgqTsqhSs+hHKvJRjJvM3S3TDDZZ8MGTMb0WGTk03mifIUXTriNszLCgyAfX9KmPSpwLQVGZIQEZ9+egOSECJg7rWg4pkPVvg4Y1SRZIReUKiRInBSFEU/HIzaLrifiP9gLNmIVaz7TouZjLYyt9utQ6Hho6yArfq1pINl6cHj+tlB+LeNOCHKc0/XmhHKriGdHfKwMU0bGck9t6o/qYNHxaiLQhFpXa8btwzoolFLEZ/t/akQXxClzIpE5O44bI42nz9TzojBqeQI+1HXgdGXw8abnb2PCFBrBVl86M2FYNF6TJ0N7zfeSDApdKzT6t4lIeSSAYScv0IH8H//b91DVMrcejggec1Iu1XRBddO/YCwGG66/p+l1+ltvnKzQ4lqdl8VyjLBgQMRJJ7R9IHN9YuQLuiLT1B78+KSVxKHr36nlXu8Khi/F+m3bsWPzC8jnq+52ghSn642+k9teZjagTepfdDQGpYvagqW20YiKmzq+FDyev62PRf67w2iorfN+VN1A5Vf7sHXpOL4xYcaTWLxgHuYvno85fNXdTpDivPOEyIGRxIOVssDmY1v9L8r0oKi0DcYg1iW50+8JUTw/1tvZCNUVVc9R0w6DJRLKUXlY/OqH2F+YZW+nrrGfv1COSnvNXc+AJEQOfiCPwGvmRMisvm88nYU05Y00bhaTN+hwlL7JAoveStpKuInL1jgJfvR8OW6re0+4BpQtx9DwVDZwdS/SHl/NVzoYh5X7PsTaH8UD7SVYP2YhdvBn7iUGVJyUV6VJyDb7fs4emSzD1L+kc+OfLpBe1x/thOotDTeJ2OF16djm5VQzXqlrsleIlV7FSXkFRVUFGC9vRNELE/Gr/dOxcvN85GjOYOOGd1ENvuzrYZuhEvtf2oYiGquuegg+l6s3Oq7HM2ER1i6fh+nj0hAFAxpUp3HwzXXYdYE/LyADLs5ZslgsNQ3iS24QPY5arsSwf3I9TwfdK99sQ93hTq+h4M6IdnxlCT3eFAS/4izA/kuvIC++HSX/nYsFb21BSe0iZHdbUr7Mt/ZEhT1Dp2HVin2o/F0elHytB06WOX/d59i6YjJS5aRgMMAgi0QkfW9uRMmmn2PBjm4JC8KAZOvOlNr0MEm9KIwIc8hPYzH053F8BQ9pWvOp1qcw6SSPs+SaYc9Tj+J+boVwA6qPcDVubMOagudR+ILzsQlFNfazhqtncJC+eev3+LVLG3K89C4u8s8lNOX/sLcjlnrNMipM8sfw+kyk3TcCWcOHIP/1UmjkqchbuR0ruXbCMeCWk1KgSMATxihu7TqNMelMo+yCBG5PJPc8xGqw4eRz9V6XGFMOROrwvsnLbhhiw2E5q75A4Va7PBwkZM/Bsn+ZjWwiTsP3O5E36/fE7bpbTk/yd57E7p+RBMpQjh3TZ2J9FX/ChSys/ewYVk4i8UBTMVY9uAR7uHrizrflIet2CQr/uJersTMPu8u2Iz/FEV7w1QIgCnHmpkfh41XZJDEC5HFSbtmwr3XpHdeMOLOq0avVNEtsWCNtQa0thPReaBzi7AVDTTE2LlqCHZzIehdnVuE+FK2j7ptYvg0zfbrgfPK9u8j3RhqI2y8gbt+rVQbGz5iH7JyHMCM7DdkzZmN8d3jBNxCAAXfrlCq1EbpEcPtv0skevW2Y0FlNMnAff05qou4GeLeoosV9KOlKOUoO7MWfX1qIvB86hOmHGVuw50UqTANUHzzvU5hUwG9SYVIBv77EQ5hZv3gFu7+6jOqqOhS9ux071izF/AVEmMSBDQSiECfdfWPLvrqAtqTxyNp56Ec/lGlhCuQiYuJ2MfKmT3M6iNUrWI2Ne0p6MujeGE4Spy3EohIvbTi7E4tXF/Mn3OgWMFB9wFPAnOV9owD5w8n5U19g1x+fx7KFU5E2dCo+quUbCYwoxEnZ9w81mjX+xyXj74/0unRYQ6xmiSmIzRLuCrJQuHkl8ojXgboEG3+zyYegp2Pruvl2AV/di7UF7gLOwqqn7Jb34lszkbfwWax942Mc/IZebTZS6fUHgNDE2Q/GyWyx4asyDWc9ezN+isFSRKfT8Q1XzkuMQc/ZDAgRG+L8LX+zD9TT+HE1iUN9JECF+7Zj8SiiTCrgf12NIvsJJ7Kg5MZLDdA0usp7/Kvz8bBjXzGB6dOEiF7Iu9MNjIfiovHbLvu22srRkUh7PIZbx+7uyume8RVb1NysJYqNnN4Q0Ypyc+gzkO6070Hjd5zTHbeEaMHbuLiNWDVyxtCkQrVjF2Mnbh5Zgl/J3kZ14TgSZxLvUqNCo8fwbztO/3UuDj7hyPSrcebICVxoAtLGPor8KVncZ2m78EmIyN10V/Wd3txSbRdxS2aYtTa0nNbj0p/UOPdyU7cIHaT8MBojn4mHhDegNyJMdyRMinvfuW90/4F9STvf32DzNzO1b4T4eF40QGRKNsmsPY8JOZNJlhnZ3U45zFu7yRifCxQVPIuNR6thkGXhoZ8twrKlizBnUhoajm7CR1f4Cwg8CCKKoSRnnpTG4Bmzqx+heyNN/EOKiwWlq3y1VUZU7WnH5ouNOKwX+ROhcGF4HuZMTuEyetX+YlzkqwcC0YkznZjD/7EkEZPuasvGvJjILcFwh25pOOW5i6hrDocdJxnB0AfZundth6r4BpsZ5QpPodGFcN449F1ryML03UdR/b3es/SBOL1HmqHGn1QW79naYZW4CkRTQSItN82YLFasf5d/mBwCvvsYau8ZfUm/j3OGYoMaLRY08vsqOaDP1N2vdaPOgEa6pDhIQukTQ3j6XZyh2CCaFJ6Wu2bf0Zmea9g//lrNWc9gYXYxPOh3cYbKJxYt9E6uPXmK616ebVoLdn7awJcYdyOCizNQl9pps+Kc1G496XhmRr7rnvHFpW3Q6QOzmsyNhyeCizMYl1oi7YIsVoLxLydxOxw7s/+Yl0ciPmBuPDwRrVunnLcaEVkQh6TJrjt+lF/X4evzYTChmHFHCCDO0J0qnf724v5abqDdAX1fuPUGjCHuAmKHOfpwQID/sKDHqVJJBOtiW9rNOFXRicn3x0JN3hdsuYEyVfAbc7l+N3P04YCwjy9DUWdfMZDfzQgJYWNOhziE+3Po+S4mzLBjYBIiIYXCRBm2iDpbt+PNzAppehkDRRiI05vpY+bwXiAMxMm4V2HiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaAlqr6TExAH6TxAZ9ySi+3+IGAw7wP8DXX22u7Fna+sAAAAASUVORK5CYII="},3877:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/program-log-ea32f11794d3e55231898cab5af0be18.png"},1972:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/spider-man-pizza-time-0c8ed7d362499c2b4b4dbc2830905fb7.gif"},763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/token-spl-f87ccdb7e233a6a120fb9309fc18745e.png"}}]); \ No newline at end of file diff --git a/assets/js/04e84b79.8f7a0bda.js b/assets/js/04e84b79.8f7a0bda.js deleted file mode 100644 index cdda71aaa..000000000 --- a/assets/js/04e84b79.8f7a0bda.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7047],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=u(n),d=r,k=c["".concat(s,".").concat(d)]||c[d]||m[d]||o;return n?a.createElement(k,l(l({ref:t},p),{},{components:n})):a.createElement(k,l({ref:t},p))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[c]="string"==typeof e?e:r,l[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(7462),r=(n(7294),n(3905));const o={sidebar_position:32,sidebar_label:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",sidebar_class_name:"green"},l="\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",i={unversionedId:"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README",id:"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README",title:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",description:"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002",source:"@site/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity",slug:"/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/",permalink:"/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README.md",tags:[],version:"current",sidebarPosition:32,frontMatter:{sidebar_position:32,sidebar_label:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",permalink:"/docs/Solana-Co-Learn/module2/spl-token/token-metadata/"},next:{title:"Ntfs & Minting with metaplex",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/"}},s={},u=[{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2},{value:"Reference",id:"reference",level:2}],p={toc:u},c="wrapper";function m(e){let{components:t,...o}=e;return(0,r.kt)(c,(0,a.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd"},"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd"),(0,r.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece",(0,r.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-token-client/tree/solution-without-burn"},"\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801"),"\uff08\u786e\u4fdd\u4f60\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"solution-without-burn")," \u5206\u652f\u4e0a\uff09\u3002"),(0,r.kt)("p",null,"\u9996\u5148\u6dfb\u52a0\u65b0\u7684\u4f9d\u8d56\u9879\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @metaplex-foundation/js fs\nnpm install @metaplex-foundation/mpl-token-metadata\n")),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528Metaplex SDK\u6765\u6dfb\u52a0\u5143\u6570\u636e\u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"fs")," \u5e93\uff0c\u4ee5\u4fbf\u6211\u4eec\u53ef\u4ee5\u8bfb\u53d6\u4ee3\u5e01\u7684\u6807\u5fd7\u56fe\u7247\u3002\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"assets")," \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5e76\u6dfb\u52a0\u60a8\u7684\u6807\u5fd7\u3002\u8fd9\u5c06\u5728\u6d4b\u8bd5\u7f51\u7edc\u4e0a\u8fdb\u884c\uff0c\u6240\u4ee5\u5c3d\u60c5\u4eab\u53d7\u5427\uff01\u6211\u9009\u62e9\u4e86\u4e00\u4e2a\u6bd4\u8428\u997c\u8868\u60c5\u7b26\u53f7\uff0c\u6240\u4ee5\u6211\u628a\u6211\u7684\u6587\u4ef6\u547d\u540d\u4e3a",(0,r.kt)("inlineCode",{parentName:"p"},"pizza.png"),"\uff0c\u54c8\u54c8\u3002"),(0,r.kt)("p",null,"Metaplex\u5c06\u4e3a\u6211\u4eec\u627f\u62c5\u6240\u6709\u7e41\u91cd\u7684\u5de5\u4f5c\uff0c\u6240\u4ee5\u8bf7\u5728\u9876\u90e8\u6dfb\u52a0\u4ee5\u4e0b\u5bfc\u5165\uff1a ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import {\n Metaplex,\n keypairIdentity,\n bundlrStorage,\n toMetaplexFile,\n} from "@metaplex-foundation/js"\nimport {\n DataV2,\n createCreateMetadataAccountV3Instruction,\n} from "@metaplex-foundation/mpl-token-metadata"\nimport * as fs from "fs"\n')),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\u4e00\u5207\uff0c\u6211\u4eec\u5c06\u5f00\u59cb\u5904\u7406\u5143\u6570\u636e\u90e8\u5206\u3002\u6211\u4eec\u5c06\u5148\u8fdb\u884c\u94fe\u4e0b\u90e8\u5206\uff0c\u7136\u540e\u521b\u5efa\u4ee3\u5e01\u5143\u6570\u636e\u8d26\u6237\u3002"),(0,r.kt)("p",null,"\u5728\u9ad8\u5c42\u6b21\u4e0a\uff0c\u8fd9\u662f\u9700\u8981\u53d1\u751f\u7684\u4e8b\u60c5\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li"},(0,r.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"li"},"toMetaplexFile()")," \u5c06\u56fe\u50cf\u6587\u4ef6\u8f6c\u6362\u4e3ametaplex\u6587\u4ef6"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:2},(0,r.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"li"},"metaplex.storage().upload")," \u4e0a\u4f20\u56fe\u7247"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:3},(0,r.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"li"},"metaplex.uploadMetadata()")," \u4e0a\u4f20\u94fe\u4e0b\u5143\u6570\u636e"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:4},(0,r.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"li"},"findMetadataPda()")," \u6765\u63a8\u5bfc\u5143\u6570\u636e\u8d26\u6237PDA"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:5},(0,r.kt)("li",{parentName:"ol"},"\u6784\u5efa\u7c7b\u578b\u4e3a ",(0,r.kt)("inlineCode",{parentName:"li"},"DataV2")," \u7684\u94fe\u4e0a\u6570\u636e\u683c\u5f0f"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:6},(0,r.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"li"},"createCreateMetadataAccountV2Instruction")," \u521b\u5efa\u5143\u6570\u636e\u8d26\u6237\u7684\u6784\u5efa\u6307\u4ee4\uff08\u4e0d\u662f\u62fc\u5199\u9519\u8bef\u54c8\u54c8\uff09"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:7},(0,r.kt)("li",{parentName:"ol"},"\u53d1\u9001\u5e26\u6709\u6307\u4ee4\u7684\u4ea4\u6613\u4ee5\u521b\u5efa\u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237")))),(0,r.kt)("p",null,"\u8fd9\u91cc\u53d1\u751f\u4e86\u5f88\u591a\u4e8b\u60c5\uff0c\u4f46\u90fd\u662f\u57fa\u7840\u7684\u4e1c\u897f\u3002\u82b1\u70b9\u65f6\u95f4\u770b\u4e00\u4e0b\uff0c\u4f60\u4f1a\u77e5\u9053\u53d1\u751f\u4e86\u4ec0\u4e48\uff01"),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u5355\u4e00\u7684\u51fd\u6570\u6765\u5b8c\u6210\u6240\u6709\u8fd9\u4e9b\u64cd\u4f5c\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function createTokenMetadata(\n connection: web3.Connection,\n metaplex: Metaplex,\n mint: web3.PublicKey,\n user: web3.Keypair,\n name: string,\n symbol: string,\n description: string\n) {\n // file to buffer\n const buffer = fs.readFileSync("assets/1203.png")\n\n // buffer to metaplex file\n const file = toMetaplexFile(buffer, "1203.png")\n\n // upload image and get image uri\n const imageUri = await metaplex.storage().upload(file)\n console.log("image uri:", imageUri)\n\n // upload metadata and get metadata uri (off chain metadata)\n const { uri } = await metaplex\n .nfts()\n .uploadMetadata({\n name: name,\n description: description,\n image: imageUri,\n })\n\n console.log("metadata uri:", uri)\n\n // get metadata account address\n const metadataPDA = metaplex.nfts().pdas().metadata({ mint })\n\n // onchain metadata format\n const tokenMetadata = {\n name: name,\n symbol: symbol,\n uri: uri,\n sellerFeeBasisPoints: 0,\n creators: null,\n collection: null,\n uses: null,\n } as DataV2\n\n // transaction to create metadata account\n const transaction = new web3.Transaction().add(\n createCreateMetadataAccountV3Instruction(\n {\n metadata: metadataPDA,\n mint: mint,\n mintAuthority: user.publicKey,\n payer: user.publicKey,\n updateAuthority: user.publicKey,\n },\n {\n createMetadataAccountArgsV3: {\n data: tokenMetadata,\n isMutable: true,\n collectionDetails: null\n },\n }\n )\n )\n\n // send transaction\n const transactionSignature = await web3.sendAndConfirmTransaction(\n connection,\n transaction,\n [user]\n )\n\n console.log(\n `Create Metadata Account: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n')),(0,r.kt)("p",null,"\u786e\u4fdd\u60a8\u66f4\u65b0\u6587\u4ef6\u540d\uff01\u6b64\u5916\uff0c\u4e0d\u7528\u62c5\u5fc3 ",(0,r.kt)("inlineCode",{parentName:"p"},"nfts()")," \u7684\u8c03\u7528 - Metaplex\u6700\u521d\u662f\u4e3aNFT\u6784\u5efa\u7684\uff0c\u6700\u8fd1\u6269\u5c55\u5230\u4e86\u53ef\u66ff\u4ee3\u4ee3\u5e01\u7684\u5de5\u4f5c\u3002"),(0,r.kt)("p",null,"\u4f60\u4f1a\u6ce8\u610f\u5230\u6211\u4eec\u5728\u8fd9\u91cc\u7559\u4e86\u4e00\u5806\u7a7a\u7684\u4e1c\u897f - \u90a3\u662f\u56e0\u4e3a\u5728\u521b\u5efa\u53ef\u66ff\u4ee3\u4ee3\u5e01\u65f6\u4e0d\u9700\u8981\u8bbe\u7f6e\u8fd9\u4e9b\u4e1c\u897f\u3002\u975e\u53ef\u66ff\u4ee3\u4ee3\u5e01\u6709\u66f4\u5177\u4f53\u7684\u884c\u4e3a\u9700\u8981\u5b9a\u4e49\u3002"),(0,r.kt)("p",null,"\u6211\u53ef\u4ee5\u9010\u4e2a\u89e3\u91ca\u8fd9\u4e2a\u51fd\u6570\uff0c\u4f46\u6211\u53ea\u4f1a\u91cd\u590d\u81ea\u5df1\u54c8\u54c8\u3002\u6bd4\u8d77\u4e86\u89e3\u5b83\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u66f4\u91cd\u8981\u7684\u662f\u77e5\u9053\u5982\u4f55\u4f7f\u7528\u5b83\u3002\u4f60\u9700\u8981\u9605\u8bfb\u6587\u6863\u6765\u4f7f\u7528API\uff0c\u4ee5\u521b\u5efa\u7c7b\u4f3c\u8fd9\u6837\u7684\u51fd\u6570\u3002"),(0,r.kt)("p",null,"\u6211\u5728\u8c08\u8bba\u5b66\u4f1a\u9493\u9c7c\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u62ff\u5230\u8fd9\u6761\u9c7c\u3002"),(0,r.kt)("p",null,"\u4f60\u7684\u9996\u8981\u8d44\u6e90\u5e94\u8be5\u59cb\u7ec8\u662f\u6587\u6863\u3002\u4f46\u662f\u5f53\u4ee3\u7801\u521a\u521a\u88ab\u7f16\u5199\u65f6\uff0c\u6587\u6863\u53ef\u80fd\u8fd8\u4e0d\u5b58\u5728\u3002\u6240\u4ee5\u4f60\u5c31\u662f\u8fd9\u6837\u505a - \u5728\u4ee3\u7801\u88ab\u7f16\u5199\u65f6\u67e5\u770b\u5b83\u3002\u5982\u679c\u4f60\u5728Metaplex\u5b58\u50a8\u5e93\u4e2d\u67e5\u770b\uff0c\u4f60\u4f1a\u770b\u5230\u8fd9\u4e9b\u5185\u5bb9\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://metaplex-foundation.github.io/metaplex-program-library/docs/token-metadata/index.html#createCreateMetadataAccountV2Instruction?utm_source=buildspace.so&utm_medium=buildspace_project"},"Function definition docs for createMetadataAccountV2 instruction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/metaplex-foundation/metaplex-program-library/blob/caeab0f7/token-metadata/js/src/generated/instructions/CreateMetadataAccountV2.ts#L73?utm_source=buildspace.so&utm_medium=buildspace_project"},"Actual function definition for the createCreateMetadataAccountV2Instruction instruction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/metaplex-foundation/js/blob/c171e1e31d9fe12852afb39e449123339848180e/packages/js/test/plugins/nftModule/createNft.test.ts#L465?utm_source=buildspace.so&utm_medium=buildspace_project"},"The test for createMetadataAccountV2 instruction"))),(0,r.kt)("p",null,"\u8fd9\u5e76\u4e0d\u662f\u4ec0\u4e48\u9ad8\u6df1\u7684\u79d1\u5b66\uff0c\u4f60\u9700\u8981\u6df1\u5165\u4ee3\u7801\u5e76\u627e\u5230\u4f60\u9700\u8981\u7684\u4e1c\u897f\u3002\u4f60\u5fc5\u987b\u7406\u89e3\u4ee3\u7801\u6240\u6784\u5efa\u7684\u57fa\u672c\u5143\u7d20\uff08\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u662fSolana\u6307\u4ee4\uff09\uff0c\u8fd9\u53ef\u80fd\u9700\u8981\u51e0\u6b21\u5c1d\u8bd5\uff0c\u4f46\u56de\u62a5\u5c06\u662f\u5de8\u5927\u7684\u3002"),(0,r.kt)("p",null,"\u901a\u5e38\u6211\u5c1d\u8bd5\u505a\u7684\u662f:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u5728",(0,r.kt)("inlineCode",{parentName:"li"},"Discord"),"\u4e2d\u641c\u7d22/\u8be2\u95ee\uff08",(0,r.kt)("inlineCode",{parentName:"li"},"Metaplex"),"\uff0c",(0,r.kt)("inlineCode",{parentName:"li"},"Anchor"),"\u7b49\uff09"),(0,r.kt)("li",{parentName:"ul"},"\u5728",(0,r.kt)("inlineCode",{parentName:"li"},"Stack Exchange"),"\u4e0a\u641c\u7d22/\u63d0\u95ee"),(0,r.kt)("li",{parentName:"ul"},"\u6d4f\u89c8\u9879\u76ee/\u7a0b\u5e8f\u5b58\u50a8\u5e93\uff0c\u5982\u679c\u4f60\u60f3\u5f04\u6e05\u695a\u5982\u4f55\u4e3a\u4e00\u4e2a\u7a0b\u5e8f\u8bbe\u7f6e\u6307\u4ee4\uff0c\u8bf7\u53c2\u8003\u6d4b\u8bd5"),(0,r.kt)("li",{parentName:"ul"},"\u6216\u8005\uff0c\u5982\u679c\u6ca1\u6709\u6d4b\u8bd5\u53ef\u4ee5\u53c2\u8003\uff0c\u53ef\u4ee5\u590d\u5236/\u7c98\u8d34",(0,r.kt)("inlineCode",{parentName:"li"},"GitHub"),"\uff0c\u5e76\u5e0c\u671b\u80fd\u5728\u67d0\u4e2a\u5730\u65b9\u627e\u5230\u53c2\u8003\u8d44\u6599")),(0,r.kt)("p",null,"\u5e0c\u671b\u8fd9\u80fd\u7ed9\u4f60\u4e00\u4e2a\u5173\u4e8e\u5148\u9a71\u8005\u662f\u5982\u4f55\u505a\u5230\u7684\u60f3\u6cd5 :)"),(0,r.kt)("p",null,"\u56de\u5230\u6211\u4eec\u6309\u8ba1\u5212\u8fdb\u884c\u7684\u5efa\u8bbe\uff01"),(0,r.kt)("p",null,"\u8bb0\u5f97\u4e4b\u524d\u4fdd\u5b58\u7684\u4ee3\u5e01\u94f8\u9020\u5730\u5740\u5417\uff1f\u5728\u8c03\u7528\u8fd9\u4e2a\u65b0\u51fd\u6570\u65f6\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u5b83\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u4ee3\u5e01\u94f8\u9020\u8d26\u6237\u5730\u5740\uff0c\u4f60\u53ef\u4ee5\u968f\u65f6\u901a\u8fc7",(0,r.kt)("a",{parentName:"p",href:"https://explorer.solana.com/?cluster=devnet"},"\u6d4f\u89c8\u5668"),"\u67e5\u627e\u94b1\u5305\u5730\u5740\u5e76\u68c0\u67e5\u4ee3\u5e01\u9009\u9879\u5361\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(763).Z,width:"1150",height:"287"})),(0,r.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u66f4\u65b0\u540e\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"main()")," \u51fd\u6570\u5728\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"createTokenMetadata")," \u51fd\u6570\u65f6\u7684\u6837\u5b50"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n console.log("PublicKey:", user.publicKey.toBase58())\n\n // MAKE SURE YOU REPLACE THIS ADDRESS WITH YOURS!\n const MINT_ADDRESS = "87MGWR6EbAqegYXr3LoZmKKC9fSFXQx4EwJEAczcMpMF"\n\n // metaplex setup\n const metaplex = Metaplex.make(connection)\n .use(keypairIdentity(user))\n .use(\n bundlrStorage({\n address: "https://devnet.bundlr.network",\n providerUrl: "https://api.devnet.solana.com",\n timeout: 60000,\n })\n )\n\n // Calling the token\n await createTokenMetadata(\n connection,\n metaplex,\n new web3.PublicKey(MINT_ADDRESS),\n user,\n "Pizza", // Token name - REPLACE THIS WITH YOURS\n "PZA", // Token symbol - REPLACE THIS WITH YOURS\n "Whoever holds this token is invited to my pizza party" // Token description - REPLACE THIS WITH YOURS\n )\n}\n')),(0,r.kt)("p",null,"\u66f4\u65b0\u8584\u8377\u5730\u5740\u548c\u4ee3\u5e01\u8be6\u60c5\u5e76\u7c89\u788e ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run start")," \uff0c\u4f60\u4f1a\u770b\u5230\u7c7b\u4f3c\u8fd9\u6837\u7684\u4e1c\u897f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"> solana-course-client@1.0.0 start\n> ts-node src/index.ts\n\nCurrent balance is 1.996472479\nPublicKey: 5y3G3Rz5vgK9rKRxu3BaC3PvhsMKGyAmtcizgrxojYAA\nimage uri: https://arweave.net/7sDCnvGRJAqfgEuGOYWhIshfgTC-hNfG4NSjwsKunQs\nmetadata uri: https://arweave.net/-2vGrM69PNtb2YaHnOErh1_006D28JJa825CIcEGIok\nCreate Metadata Account: https://explorer.solana.com/tx/4w8XEGCJY82MnBnErW9F5r1i5UL5ffJCCujcgFeXS8TTdZ6tHBEMznWnPoQXVcsPY3WoPbL2Nb1ubXCUJWWt2GWi?cluster=devnet\nFinished successfully\n")),(0,r.kt)("p",null,"\u4e00\u5207\u5fc5\u8981\u7684\u4e8b\u60c5\u90fd\u5df2\u7ecf\u4e00\u6b21\u6027\u5b8c\u6210\uff01\u968f\u610f\u70b9\u51fbArweave\u94fe\u63a5 - \u5b83\u5c31\u50cf\u662f\u53bb\u4e2d\u5fc3\u5316\u548c\u6c38\u4e45\u7684AWS S3/Google Cloud\u5b58\u50a8\uff0c\u4f1a\u5c55\u793a\u7ed9\u4f60\u4e0a\u4f20\u7684\u8d44\u4ea7\u662f\u4ec0\u4e48\u6837\u5b50\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u4f60\u56de\u5230\u6d4f\u89c8\u5668\u4e0a\u7684\u4ee3\u5e01\u94f8\u9020\u8d26\u6237\uff0c\u4f60\u4f1a\u770b\u5230\u4e00\u4e2a\u6f02\u4eae\u7684\u65b0\u56fe\u6807\u548c\u540d\u79f0\u3002\u8fd9\u662f\u6211\u7684\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(8303).Z,width:"167",height:"110"})),(0,r.kt)("p",null,"\u6b63\u5982\u4e00\u4f4d\u667a\u8005\u66fe\u7ecf\u8bf4\u8fc7\uff0c"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(1972).Z,width:"498",height:"280"})),(0,r.kt)("p",null,"\u4f60\u7684\u4ee3\u5e01\u5df2\u7ecf\u51c6\u5907\u5c31\u7eea\uff01\u8bb0\u5f97\u8981\u4f20\u64ad\u7231\u5fc3\u54e6\u3002\u4e5f\u8bb8\u53ef\u4ee5\u7ed9\u4f60\u7684\u670b\u53cb\u6216\u8005Discord\u670d\u52a1\u5668\u4e2d\u7684\u5176\u4ed6\u5efa\u8bbe\u8005\u53d1\u9001\u4e00\u4e9b\u4ee3\u5e01\u3002\u5728 #progress \u9891\u9053\u5206\u4eab\u4f60\u7684\u5730\u5740\uff0c\u8fd9\u6837\u522b\u4eba\u5c31\u53ef\u4ee5\u7ed9\u4f60\u7a7a\u6295\u4ed6\u4eec\u7684\u4ee3\u5e01\u5566 :D"),(0,r.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,r.kt)("p",null,"\u5e74\u8f7b\u7684\u73bb\u7483\u5480\u56bc\u8005\uff0c\u662f\u65f6\u5019\u4ece\u5934\u5f00\u59cb\u91cd\u65b0\u5b9e\u65bd\u8bfe\u7a0b\u6982\u5ff5\u4e86\u3002"),(0,r.kt)("p",null,"\u5c1d\u8bd5\u6784\u5efa\u4e00\u4e2a\u5305\u542b\u4ee5\u4e0b\u6307\u4ee4\u7684\u5355\u4e2a\u4ea4\u6613\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4ee3\u5e01\u94f8\u9020"),(0,r.kt)("li",{parentName:"ul"},"\u4e3a\u4ee3\u5e01\u94f8\u9020\u521b\u5efa\u4e00\u4e2a\u5143\u6570\u636e\u8d26\u6237"),(0,r.kt)("li",{parentName:"ul"},"\u521b\u5efa\u4e00\u4e2a\u4ee4\u724c\u8d26\u6237",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"\u5982\u679c\u53ef\u4ee5\u7684\u8bdd\uff0c\u5c1d\u8bd5\u6709\u6761\u4ef6\u5730\u6dfb\u52a0\u8fd9\u4e2a\u6307\u4ee4"),(0,r.kt)("li",{parentName:"ul"},"\u8bf7\u53c2\u8003 ",(0,r.kt)("inlineCode",{parentName:"li"},"getOrCreateAssociatedTokenAccount")," \u7684\u5b9e\u65bd\u65b9\u6848"),(0,r.kt)("li",{parentName:"ul"},"Hint: ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/solana-labs/solana-program-library/blob/48fbb5b7c49ea35848442bba470b89331dea2b2b/token/js/src/actions/getOrCreateAssociatedTokenAccount.ts#L35"},"https://github.com/solana-labs/solana-program-library/blob/48fbb5b7c49ea35848442bba470b89331dea2b2b/token/js/src/actions/getOrCreateAssociatedTokenAccount.ts#L35")))),(0,r.kt)("li",{parentName:"ul"},"Mint tokens")),(0,r.kt)("p",null,"\u8fd9\u57fa\u672c\u4e0a\u5c31\u662f\u4f60\u5728\u751f\u4ea7\u4e2d\u8981\u505a\u7684\u4e8b\u60c5 - \u4e00\u5207\u90fd\u4e00\u6b21\u6027\u5730\u4e00\u8d77\u5b8c\u6210\u3002"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Note\n\u8fd9\u6bd4\u5e73\u5e38\u66f4\u52a0\u81ea\u7531\u3002\u6311\u6218\u81ea\u5df1\u3002\u5c1d\u8bd5\u4e00\u4e0b\u3002\u771f\u6b63\u52aa\u529b\u53bb\u7406\u89e3\u6bcf\u4e2a\u62fc\u56fe\u7684\u90e8\u5206\u3002")),(0,r.kt)("p",null,"\u8981\u6309\u7167\u6211\u4eec\u8bbe\u60f3\u7684\u65b9\u5f0f\u8fdb\u884c\u64cd\u4f5c\uff0c\u60a8\u9700\u8981\u9010\u6b65\u6784\u5efa\u6bcf\u4e2a\u6307\u4ee4\uff0c\u7136\u540e\u5c06\u5b83\u4eec\u5168\u90e8\u6dfb\u52a0\u5230\u4e00\u4e2a\u4e8b\u52a1\u4e2d\u3002\u5728\u60a8\u81ea\u5df1\u5c1d\u8bd5\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u540e\uff0c\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Unboxed-Software/solana-token-metadata?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8be5\u5b58\u50a8\u5e93"),"\u7684\u6311\u6218\u5206\u652f\u4e2d\u67e5\u770b\u4e00\u4e2a\u53ef\u80fd\u7684\u5b9e\u73b0\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(3877).Z,width:"1106",height:"1884"})),(0,r.kt)("p",null,"\u989d\u5916\u63d0\u793a\uff1a",(0,r.kt)("a",{parentName:"p",href:"https://solana-labs.github.io/solana-program-library/token/js/modules.html"},"https://solana-labs.github.io/solana-program-library/token/js/modules.html")," - \u67e5\u770b\u6e90\u4ee3\u7801\uff0c\u4e0d\u8981\u4f7f\u7528\u8f85\u52a9\u51fd\u6570\u3002"),(0,r.kt)("h2",{id:"reference"},"Reference"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.quicknode.com/guides/solana-development/spl-tokens/how-to-create-a-fungible-spl-token-with-the-new-metaplex-token-standard"},"How to Create a Fungible SPL token with the New Metaplex Token Standard\n")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://spl.solana.com/token"},"Token Program")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://davirain-su.github.io/solana-cookbook-zh/references/token.html"},"\u4e0e\u4ee3\u5e01\u4ea4\u4e92"))))}m.isMDXComponent=!0},8303:(e,t,n)=>{n.d(t,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKcAAABuCAYAAABC8QOQAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABIVSURBVHhe7Z0JcFTHnca/OTQ60QjdQqAARpY4jcHGJFaMHQTEELIBUnghZr2AKUvxbgyL44XC67BxMIGYJWwZQ2IbuyoGysT4BOMFKRgsbAwIccgINBxCEkLnSCONRnPPdr95I82pOZCe3kD/ql7NdL+eNz28T/+jX3cjSc3MsIHBECFS/pXBEB1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1MnAzRwsTJEC1hIE5vS5zYsqd7gTAQp4R/dcZbHeNuY2DEKaThY0Y2bBFWnA6hCGn4HN/FRBp2CLpunX6RP11mKW3ITjEjN8WK3GQrRiZZMWSQDXEKeze1Rglud0hwTS3F5Sb7oWqSo1rT+5UD+W6GuBBAnP5lMXe0CbOyzXhipBnREXxlkHSZgKPX5fg/lRyfV/i7CJNqODBgO36kxVmxZJIJiyaYMDi6b7vQ2iXB3gsR+NvZCDRo2WhZuCK4OBUyG37zqBGFU4yQ9LPxspFftuOUAv97QgGjhVnKcENQcVL3/Z/TjCSGtPI17hAByWSQkANSKSTkoK+cih1Kpr21kc9breTF8WoBLOSgavRCXYcUm44pAnD3DDEhmDg3zNRj0QMkMHRHoYBMORjywYmQKhMgkUcQHfJCdDat3eJ06i7/3kZebWYzrO1tMKvVsGpaYTMauHPO7D0fgXWHo/gSQ+z0uzizEmzYOqcLDw4hlo0gUURCnpQCaUICpLFxXJmzkDw2sw1N33ah+bQexhbyGXIqOkOO9MdjoBwTybfyA7GsNqMRFq2WCJUKtgk2vZ47VVYnw6qD0ahucxI+Q5T0qzjHp1uw4xd6ZCbJOesoS0mFPGEwERxx217oum1G5V9aoS71tHrU42c+GYf7likhiwxSWESsljYi0qYG8qrGrRYzCj+JwsV67/3oX2IwfO4ijE0h/wzEa8gtRhIPAx3lH+H4qVZyOhsT5z+BEVEWGCWkf83ncPzTU+igkVBKHmbOAr59vwQdEUOR+8vpSL1yEMfPNgNj5mLBYxnQ04vx3Pr6HZxTkTf03KRWHN5DPsdFVLmY+nQyvqfXoUWRIouNH7Sef9+nUGG+t9CAzNEjEJU7BvKUNEijY4jIvGfPVmIxy9Y2of2yF9fP06EyQlNhRPq0GHKZIARKQgJpdDRnsSMyhmJQjAwz0lvw7U0pGgXP5k1oqyyDqqwMnRkPQ3r+rzh6uAw3b9kte+ZPn0Jm7T58+dk3UJ2tgD5nJsbGq1B1i/zBxmbhvlFA7VUJEeZMJFR8gpIyNfc5pORgjLwMn35whLs2Per5U9y5nGykRtXg2s1OUpGMoRNi0HShGkZ7C1HSB3fG0/DSgXRqMTMmj4diWJZPS9kNucTlP7dCV2PmK3yjKTegpdR+I0OChBCKoVlInziG6yPtqyf9Gun0QjIGKdtRf41YUA4dalS3kZQ2hC8TFEPx4C/zEXP+7zhR5mgXALcuo35kPsam8eUwoA/E6WnBzCRBWXkgCtWdgSUfhlYLmk528aXeoTnQ9ffbYbPcmYCuaqPxAukj7asnIo5HowYjqbMU58rb+QonMh/DnGXL+SMf6Xw1h/U2LhTXYVh+HgYJ7SxCpF+6WdcuxZlaGXZ9SWKhADCoLbCZAhebrtoEY6uv4Sj/UD3+aW89SkkfaV/DinYVKoyTMWNuLhR8VTe3juPgrnf4owj1fHU3NUdR2pyDKY8k8xXiJvQ7Q26wPznt/rIJpW+SBOQLLfQ08/aBVW9zGSHyBx3mNHeFLs6GVhOKz2r4kne47gTRp76hGR2aeCQNi+fLMRiWnYGWhjq+TNHj1ud7cdbyqHeB+qHpyFG0jR6PTL4sZkIXJ/F87s7P/V52maw4VdyGyh1t+O65elx8rRkGLyKVxUh85UleoUmsPNb3B2hyRQ9fnKroIFmtq7jdW3O/rZ+9O31u4M6t4qPQT/hnzHuWuOYVT2OC4hxKz7i7cB35g9+Lc5ZHMGN2ds9NdHHryzExm693xnodpceuizoRchDaUBL9RIA37uGIKPyHIaG7edyoCEx4ORmRST1JkrHNipMrbsNCLGggxOcoMGlzqoug9U1m1Bfr0HiiC111NLGyQZkbidTHYpD6Y5Kpx9gbm4hoZ62+hO+rAotxg/mtjL4lCHvlRBA364xJjwZZj4nQXjVB9XYbX7KjSJBiyKxYvtQ7VJD3PaN0EabmkgGn/70BN3a3o7PKBKuRWE5iGlovGHDljVac+69mWAx2S3n+amfgwqQwYQ4YoYkzCKjh+U7qOvSjPqOHSePqVkcSwSnH+o+g0mfEQDm6p52h2UzChRaYO31b3Y5KI0pXN8JC4tSPjrfwtQyx0+/ipHxr64LVKaqj7ru51NV6SSMkGLcmCek/ieFiSndojDl8UTxyChMhkdvNGY0ryzepPYTujc5qM0lWdTj0Xe+JEEM89NsTImc0JL1+QBaFJGuP6mKGRSDxAddxUFmUFClTo5E2LYabzEHL3HP1n8Ri9KrBSH442jXObLDgBh3zDDBxP3RZgyINfULCCAcEsZzUZv4dHU62k1jCKB/BHKmOHiLH/QWD8eCGFEx8NQUjFseTuNTTnBo1loAH46nlPqDX8iVGOCCIOClVNjMMEruJo247aUo0975XqH57S0ioLgPTJnQyG+psvsdaGeJDMHF2EN/7jcKeGMWNiEDsD+584q+MDg8F+AsOyXToCtT/M0SBYOKkfGDVwkI0OWpFgss84lCJSpZxcak/uqRWfG5lsWa4Iag4NRYrrAWxSAh00rAfaAY/6lml37HISxITjNYA/T9DNAgqTsqhSs+hHKvJRjJvM3S3TDDZZ8MGTMb0WGTk03mifIUXTriNszLCgyAfX9KmPSpwLQVGZIQEZ9+egOSECJg7rWg4pkPVvg4Y1SRZIReUKiRInBSFEU/HIzaLrifiP9gLNmIVaz7TouZjLYyt9utQ6Hho6yArfq1pINl6cHj+tlB+LeNOCHKc0/XmhHKriGdHfKwMU0bGck9t6o/qYNHxaiLQhFpXa8btwzoolFLEZ/t/akQXxClzIpE5O44bI42nz9TzojBqeQI+1HXgdGXw8abnb2PCFBrBVl86M2FYNF6TJ0N7zfeSDApdKzT6t4lIeSSAYScv0IH8H//b91DVMrcejggec1Iu1XRBddO/YCwGG66/p+l1+ltvnKzQ4lqdl8VyjLBgQMRJJ7R9IHN9YuQLuiLT1B78+KSVxKHr36nlXu8Khi/F+m3bsWPzC8jnq+52ghSn642+k9teZjagTepfdDQGpYvagqW20YiKmzq+FDyev62PRf67w2iorfN+VN1A5Vf7sHXpOL4xYcaTWLxgHuYvno85fNXdTpDivPOEyIGRxIOVssDmY1v9L8r0oKi0DcYg1iW50+8JUTw/1tvZCNUVVc9R0w6DJRLKUXlY/OqH2F+YZW+nrrGfv1COSnvNXc+AJEQOfiCPwGvmRMisvm88nYU05Y00bhaTN+hwlL7JAoveStpKuInL1jgJfvR8OW6re0+4BpQtx9DwVDZwdS/SHl/NVzoYh5X7PsTaH8UD7SVYP2YhdvBn7iUGVJyUV6VJyDb7fs4emSzD1L+kc+OfLpBe1x/thOotDTeJ2OF16djm5VQzXqlrsleIlV7FSXkFRVUFGC9vRNELE/Gr/dOxcvN85GjOYOOGd1ENvuzrYZuhEvtf2oYiGquuegg+l6s3Oq7HM2ER1i6fh+nj0hAFAxpUp3HwzXXYdYE/LyADLs5ZslgsNQ3iS24QPY5arsSwf3I9TwfdK99sQ93hTq+h4M6IdnxlCT3eFAS/4izA/kuvIC++HSX/nYsFb21BSe0iZHdbUr7Mt/ZEhT1Dp2HVin2o/F0elHytB06WOX/d59i6YjJS5aRgMMAgi0QkfW9uRMmmn2PBjm4JC8KAZOvOlNr0MEm9KIwIc8hPYzH053F8BQ9pWvOp1qcw6SSPs+SaYc9Tj+J+boVwA6qPcDVubMOagudR+ILzsQlFNfazhqtncJC+eev3+LVLG3K89C4u8s8lNOX/sLcjlnrNMipM8sfw+kyk3TcCWcOHIP/1UmjkqchbuR0ruXbCMeCWk1KgSMATxihu7TqNMelMo+yCBG5PJPc8xGqw4eRz9V6XGFMOROrwvsnLbhhiw2E5q75A4Va7PBwkZM/Bsn+ZjWwiTsP3O5E36/fE7bpbTk/yd57E7p+RBMpQjh3TZ2J9FX/ChSys/ewYVk4i8UBTMVY9uAR7uHrizrflIet2CQr/uJersTMPu8u2Iz/FEV7w1QIgCnHmpkfh41XZJDEC5HFSbtmwr3XpHdeMOLOq0avVNEtsWCNtQa0thPReaBzi7AVDTTE2LlqCHZzIehdnVuE+FK2j7ptYvg0zfbrgfPK9u8j3RhqI2y8gbt+rVQbGz5iH7JyHMCM7DdkzZmN8d3jBNxCAAXfrlCq1EbpEcPtv0skevW2Y0FlNMnAff05qou4GeLeoosV9KOlKOUoO7MWfX1qIvB86hOmHGVuw50UqTANUHzzvU5hUwG9SYVIBv77EQ5hZv3gFu7+6jOqqOhS9ux071izF/AVEmMSBDQSiECfdfWPLvrqAtqTxyNp56Ec/lGlhCuQiYuJ2MfKmT3M6iNUrWI2Ne0p6MujeGE4Spy3EohIvbTi7E4tXF/Mn3OgWMFB9wFPAnOV9owD5w8n5U19g1x+fx7KFU5E2dCo+quUbCYwoxEnZ9w81mjX+xyXj74/0unRYQ6xmiSmIzRLuCrJQuHkl8ojXgboEG3+zyYegp2Pruvl2AV/di7UF7gLOwqqn7Jb34lszkbfwWax942Mc/IZebTZS6fUHgNDE2Q/GyWyx4asyDWc9ezN+isFSRKfT8Q1XzkuMQc/ZDAgRG+L8LX+zD9TT+HE1iUN9JECF+7Zj8SiiTCrgf12NIvsJJ7Kg5MZLDdA0usp7/Kvz8bBjXzGB6dOEiF7Iu9MNjIfiovHbLvu22srRkUh7PIZbx+7uyume8RVb1NysJYqNnN4Q0Ypyc+gzkO6070Hjd5zTHbeEaMHbuLiNWDVyxtCkQrVjF2Mnbh5Zgl/J3kZ14TgSZxLvUqNCo8fwbztO/3UuDj7hyPSrcebICVxoAtLGPor8KVncZ2m78EmIyN10V/Wd3txSbRdxS2aYtTa0nNbj0p/UOPdyU7cIHaT8MBojn4mHhDegNyJMdyRMinvfuW90/4F9STvf32DzNzO1b4T4eF40QGRKNsmsPY8JOZNJlhnZ3U45zFu7yRifCxQVPIuNR6thkGXhoZ8twrKlizBnUhoajm7CR1f4Cwg8CCKKoSRnnpTG4Bmzqx+heyNN/EOKiwWlq3y1VUZU7WnH5ouNOKwX+ROhcGF4HuZMTuEyetX+YlzkqwcC0YkznZjD/7EkEZPuasvGvJjILcFwh25pOOW5i6hrDocdJxnB0AfZundth6r4BpsZ5QpPodGFcN449F1ryML03UdR/b3es/SBOL1HmqHGn1QW79naYZW4CkRTQSItN82YLFasf5d/mBwCvvsYau8ZfUm/j3OGYoMaLRY08vsqOaDP1N2vdaPOgEa6pDhIQukTQ3j6XZyh2CCaFJ6Wu2bf0Zmea9g//lrNWc9gYXYxPOh3cYbKJxYt9E6uPXmK616ebVoLdn7awJcYdyOCizNQl9pps+Kc1G496XhmRr7rnvHFpW3Q6QOzmsyNhyeCizMYl1oi7YIsVoLxLydxOxw7s/+Yl0ciPmBuPDwRrVunnLcaEVkQh6TJrjt+lF/X4evzYTChmHFHCCDO0J0qnf724v5abqDdAX1fuPUGjCHuAmKHOfpwQID/sKDHqVJJBOtiW9rNOFXRicn3x0JN3hdsuYEyVfAbc7l+N3P04YCwjy9DUWdfMZDfzQgJYWNOhziE+3Po+S4mzLBjYBIiIYXCRBm2iDpbt+PNzAppehkDRRiI05vpY+bwXiAMxMm4V2HiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaGHiZIgWJk6GaAlqr6TExAH6TxAZ9ySi+3+IGAw7wP8DXX22u7Fna+sAAAAASUVORK5CYII="},3877:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/program-log-ea32f11794d3e55231898cab5af0be18.png"},1972:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/spider-man-pizza-time-0c8ed7d362499c2b4b4dbc2830905fb7.gif"},763:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/token-spl-f87ccdb7e233a6a120fb9309fc18745e.png"}}]); \ No newline at end of file diff --git a/assets/js/05970efd.22e5f4f7.js b/assets/js/05970efd.22e5f4f7.js new file mode 100644 index 000000000..29a4dc49e --- /dev/null +++ b/assets/js/05970efd.22e5f4f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6264],{3905:(e,n,a)=>{a.d(n,{Zo:()=>p,kt:()=>g});var t=a(7294);function r(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function o(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function l(e){for(var n=1;n=0||(r[a]=e[a]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var c=t.createContext({}),s=function(e){var n=t.useContext(c),a=n;return e&&(a="function"==typeof e?e(n):l(l({},n),e)),a},p=function(e){var n=s(e.components);return t.createElement(c.Provider,{value:n},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},u=t.forwardRef((function(e,n){var a=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),m=s(a),u=r,g=m["".concat(c,".").concat(u)]||m[u]||d[u]||o;return a?t.createElement(g,l(l({ref:n},p),{},{components:a})):t.createElement(g,l({ref:n},p))}));function g(e,n){var a=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=u;var i={};for(var c in n)hasOwnProperty.call(n,c)&&(i[c]=n[c]);i.originalType=e,i[m]="string"==typeof e?e:r,l[1]=i;for(var s=2;s{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var t=a(7462),r=(a(7294),a(3905));const o={sidebar_position:42,sidebar_label:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",sidebar_class_name:"green"},l="\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",i={unversionedId:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README",id:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README",title:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u8ba9\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u7684\u968f\u673a\u5316\u3002\u51c6\u5907\u597d\u5c06\u4e00\u4e9b\u4e1c\u897f\u653e\u5165\u6211\u4eec\u5728\u4e0a\u4e00\u8bfe\u4e2d\u521b\u5efa\u4f46\u6ca1\u6709\u4f7f\u7528\u7684\u6587\u4ef6\u5939\u4e2d\u4e86\u5417\uff1f",source:"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README.md",sourceDirName:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine",slug:"/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README.md",tags:[],version:"current",sidebarPosition:42,frontMatter:{sidebar_position:42,sidebar_label:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/"},next:{title:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/"}},c={},s=[{value:"\u4f7f\u7528Sugar CLI",id:"\u4f7f\u7528sugar-cli",level:2},{value:"\u2b06\ufe0f \u4e0a\u4f20\u4f60\u7684NFT",id:"\ufe0f-\u4e0a\u4f20\u4f60\u7684nft",level:2}],p={toc:s},m="wrapper";function d(e){let{components:n,...o}=e;return(0,r.kt)(m,(0,t.Z)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u521b\u9020\u7cd6\u679c\u673a"},"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u8ba9\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u7684\u968f\u673a\u5316\u3002\u51c6\u5907\u597d\u5c06\u4e00\u4e9b\u4e1c\u897f\u653e\u5165\u6211\u4eec\u5728\u4e0a\u4e00\u8bfe\u4e2d\u521b\u5efa\u4f46\u6ca1\u6709\u4f7f\u7528\u7684\u6587\u4ef6\u5939\u4e2d\u4e86\u5417\uff1f"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u9996\u5148\u5728\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"candy-machine")," \u6587\u4ef6\u5939\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d44\u4ea7\u6587\u4ef6\u5939\u3002\u5c06\u6240\u6709\u7684NFT\u56fe\u50cf\u548c\u5143\u6570\u636e\u653e\u5165\u5176\u4e2d\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/guides/preparing-assets"},"\u8fd9\u91cc"),"\u9605\u8bfb\u6709\u5173\u5982\u4f55\u51c6\u5907\u60a8\u7684NFT\u8d44\u4ea7\u7684\u66f4\u591a\u4fe1\u606f\u3002"),(0,r.kt)("h2",{id:"\u4f7f\u7528sugar-cli"},"\u4f7f\u7528Sugar CLI"),(0,r.kt)("p",null,"\u73b0\u5728\u60a8\u5df2\u7ecf\u6210\u529f\u521b\u5efa\u4e86\u6240\u6709\u7684NFT\u8d44\u4ea7\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528Sugar CLI\u6765\u5f00\u59cb\u90e8\u7f72\u5b83\u3002\u5982\u679c\u7531\u4e8e\u67d0\u79cd\u539f\u56e0\u60a8\u5c1a\u672a\u5b89\u88c5\u5b83\uff0c\u60a8\u53ef\u4ee5\u6309\u7167",(0,r.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/overview/installation"},"\u8fd9\u91cc"),"\u7684\u6307\u5357\u6765\u5b89\u88c5CLI\u3002"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"cd tokens/candy-machine/")," \u6765\u5f00\u59cb\u5bfc\u822a\u5230",(0,r.kt)("inlineCode",{parentName:"p"},"candy-machine"),"\u6587\u4ef6\u5939\uff0c\u5e76\u7ee7\u7eed\u901a\u8fc7\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"sugar launch")," \u6765\u542f\u52a8Sugar CLI\u3002\u5b83\u4f1a\u8be2\u95ee\u4f60\u4e00\u7cfb\u5217\u7684\u95ee\u9898\u3002\u968f\u610f\u914d\u7f6e\u5b83\uff0c\u4ee5\u4f60\u60f3\u8981\u7684\u65b9\u5f0f\u3002\u6700\u91cd\u8981\u7684\u662f\uff0c\u786e\u4fdd\u5c06NFT\u7684\u4ef7\u683c\u8bbe\u7f6e\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"0")," \uff0c\u5e76\u5c06\u5b58\u50a8\u65b9\u6cd5\u8bbe\u7f6e\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"bundlr")," \u3002\u4f60\u53ef\u4ee5\u9009\u62e9\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"yes")," \u8bbe\u7f6e\u4e3a\u6240\u6709\u5185\u5bb9\u3002"),(0,r.kt)("h2",{id:"\ufe0f-\u4e0a\u4f20\u4f60\u7684nft"},"\u2b06\ufe0f \u4e0a\u4f20\u4f60\u7684NFT"),(0,r.kt)("p",null,"\u73b0\u5728\u60a8\u5df2\u7ecf\u521b\u5efa\u4e86\u914d\u7f6e\u6587\u4ef6\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"sugar upload")," \u6765\u5f00\u59cb\u4e0a\u4f20\u60a8\u7684NFT\u3002\u8fd9\u5c06\u5c06\u6240\u6709NFT\u53ca\u5176\u5143\u6570\u636e\u4e0a\u4f20\u5230\u60a8\u6240\u9009\u62e9\u7684\u5b58\u50a8\u65b9\u5f0f\u4e2d\u3002\u6210\u529f\u4e0a\u4f20NFT\u540e\uff0c\u5b83\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(8477).Z,width:"1360",height:"293"})),(0,r.kt)("p",null,"\u4f60\u8fd8\u5e94\u8be5\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"cache.json")," \u6587\u4ef6\u5939\u4e2d\u770b\u5230\u4e00\u4e2a\u751f\u6210\u7684\u6587\u4ef6\u3002\u8fd9\u5c06\u5305\u542b\u4f60\u7684NFT\u548c\u5176\u5143\u6570\u636e\u7684\u6240\u6709\u5fc5\u8981\u4fe1\u606f\u3002\u590d\u5236 ",(0,r.kt)("inlineCode",{parentName:"p"},"collectionMint")," \u5730\u5740\u5e76\u7c98\u8d34\u5230",(0,r.kt)("inlineCode",{parentName:"p"},"https://explorer.solana.com/?cluster=devnet"),"\uff0c\u4f60\u5e94\u8be5\u80fd\u591f\u770b\u5230\u4e0e\u6211\u7684\u7c7b\u4f3c\u7684NFT\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(2135).Z,width:"1178",height:"747"})))}d.isMDXComponent=!0},2135:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/nft-bf6b80b099942911f12bb6e243be5bd4.png"},8477:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/sugar-upload-8d52eba50286e053e105ad18f5ea00c2.png"}}]); \ No newline at end of file diff --git a/assets/js/05970efd.5b8f90ce.js b/assets/js/05970efd.5b8f90ce.js deleted file mode 100644 index 9b291a1f7..000000000 --- a/assets/js/05970efd.5b8f90ce.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6264],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>g});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),s=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=s(e.components);return a.createElement(c.Provider,{value:n},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),m=s(t),u=r,g=m["".concat(c,".").concat(u)]||m[u]||d[u]||o;return t?a.createElement(g,i(i({ref:n},p),{},{components:t})):a.createElement(g,i({ref:n},p))}));function g(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=u;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[m]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:42,sidebar_label:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",sidebar_class_name:"green"},i="\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",l={unversionedId:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README",id:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README",title:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u8ba9\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u7684\u968f\u673a\u5316\u3002\u51c6\u5907\u597d\u5c06\u4e00\u4e9b\u4e1c\u897f\u653e\u5165\u6211\u4eec\u5728\u4e0a\u4e00\u8bfe\u4e2d\u521b\u5efa\u4f46\u6ca1\u6709\u4f7f\u7528\u7684\u6587\u4ef6\u5939\u4e2d\u4e86\u5417\uff1f",source:"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README.md",sourceDirName:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine",slug:"/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README.md",tags:[],version:"current",sidebarPosition:42,frontMatter:{sidebar_position:42,sidebar_label:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/"},next:{title:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/"}},c={},s=[{value:"\u4f7f\u7528Sugar CLI",id:"\u4f7f\u7528sugar-cli",level:2},{value:"\u2b06\ufe0f \u4e0a\u4f20\u4f60\u7684NFT",id:"\ufe0f-\u4e0a\u4f20\u4f60\u7684nft",level:2}],p={toc:s},m="wrapper";function d(e){let{components:n,...o}=e;return(0,r.kt)(m,(0,a.Z)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u521b\u9020\u7cd6\u679c\u673a"},"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u8ba9\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u7684\u968f\u673a\u5316\u3002\u51c6\u5907\u597d\u5c06\u4e00\u4e9b\u4e1c\u897f\u653e\u5165\u6211\u4eec\u5728\u4e0a\u4e00\u8bfe\u4e2d\u521b\u5efa\u4f46\u6ca1\u6709\u4f7f\u7528\u7684\u6587\u4ef6\u5939\u4e2d\u4e86\u5417\uff1f"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u9996\u5148\u5728\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"candy-machine")," \u6587\u4ef6\u5939\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d44\u4ea7\u6587\u4ef6\u5939\u3002\u5c06\u6240\u6709\u7684NFT\u56fe\u50cf\u548c\u5143\u6570\u636e\u653e\u5165\u5176\u4e2d\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/guides/preparing-assets"},"\u8fd9\u91cc"),"\u9605\u8bfb\u6709\u5173\u5982\u4f55\u51c6\u5907\u60a8\u7684NFT\u8d44\u4ea7\u7684\u66f4\u591a\u4fe1\u606f\u3002"),(0,r.kt)("h2",{id:"\u4f7f\u7528sugar-cli"},"\u4f7f\u7528Sugar CLI"),(0,r.kt)("p",null,"\u73b0\u5728\u60a8\u5df2\u7ecf\u6210\u529f\u521b\u5efa\u4e86\u6240\u6709\u7684NFT\u8d44\u4ea7\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528Sugar CLI\u6765\u5f00\u59cb\u90e8\u7f72\u5b83\u3002\u5982\u679c\u7531\u4e8e\u67d0\u79cd\u539f\u56e0\u60a8\u5c1a\u672a\u5b89\u88c5\u5b83\uff0c\u60a8\u53ef\u4ee5\u6309\u7167",(0,r.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/overview/installation"},"\u8fd9\u91cc"),"\u7684\u6307\u5357\u6765\u5b89\u88c5CLI\u3002"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"cd tokens/candy-machine/")," \u6765\u5f00\u59cb\u5bfc\u822a\u5230",(0,r.kt)("inlineCode",{parentName:"p"},"candy-machine"),"\u6587\u4ef6\u5939\uff0c\u5e76\u7ee7\u7eed\u901a\u8fc7\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"sugar launch")," \u6765\u542f\u52a8Sugar CLI\u3002\u5b83\u4f1a\u8be2\u95ee\u4f60\u4e00\u7cfb\u5217\u7684\u95ee\u9898\u3002\u968f\u610f\u914d\u7f6e\u5b83\uff0c\u4ee5\u4f60\u60f3\u8981\u7684\u65b9\u5f0f\u3002\u6700\u91cd\u8981\u7684\u662f\uff0c\u786e\u4fdd\u5c06NFT\u7684\u4ef7\u683c\u8bbe\u7f6e\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"0")," \uff0c\u5e76\u5c06\u5b58\u50a8\u65b9\u6cd5\u8bbe\u7f6e\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"bundlr")," \u3002\u4f60\u53ef\u4ee5\u9009\u62e9\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"yes")," \u8bbe\u7f6e\u4e3a\u6240\u6709\u5185\u5bb9\u3002"),(0,r.kt)("h2",{id:"\ufe0f-\u4e0a\u4f20\u4f60\u7684nft"},"\u2b06\ufe0f \u4e0a\u4f20\u4f60\u7684NFT"),(0,r.kt)("p",null,"\u73b0\u5728\u60a8\u5df2\u7ecf\u521b\u5efa\u4e86\u914d\u7f6e\u6587\u4ef6\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"sugar upload")," \u6765\u5f00\u59cb\u4e0a\u4f20\u60a8\u7684NFT\u3002\u8fd9\u5c06\u5c06\u6240\u6709NFT\u53ca\u5176\u5143\u6570\u636e\u4e0a\u4f20\u5230\u60a8\u6240\u9009\u62e9\u7684\u5b58\u50a8\u65b9\u5f0f\u4e2d\u3002\u6210\u529f\u4e0a\u4f20NFT\u540e\uff0c\u5b83\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(8477).Z,width:"1360",height:"293"})),(0,r.kt)("p",null,"\u4f60\u8fd8\u5e94\u8be5\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"cache.json")," \u6587\u4ef6\u5939\u4e2d\u770b\u5230\u4e00\u4e2a\u751f\u6210\u7684\u6587\u4ef6\u3002\u8fd9\u5c06\u5305\u542b\u4f60\u7684NFT\u548c\u5176\u5143\u6570\u636e\u7684\u6240\u6709\u5fc5\u8981\u4fe1\u606f\u3002\u590d\u5236 ",(0,r.kt)("inlineCode",{parentName:"p"},"collectionMint")," \u5730\u5740\u5e76\u7c98\u8d34\u5230",(0,r.kt)("inlineCode",{parentName:"p"},"https://explorer.solana.com/?cluster=devnet"),"\uff0c\u4f60\u5e94\u8be5\u80fd\u591f\u770b\u5230\u4e0e\u6211\u7684\u7c7b\u4f3c\u7684NFT\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(2135).Z,width:"1178",height:"747"})))}d.isMDXComponent=!0},2135:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/nft-bf6b80b099942911f12bb6e243be5bd4.png"},8477:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/sugar-upload-8d52eba50286e053e105ad18f5ea00c2.png"}}]); \ No newline at end of file diff --git a/assets/js/07dea239.7ba519e2.js b/assets/js/07dea239.7ba519e2.js new file mode 100644 index 000000000..8f219b52c --- /dev/null +++ b/assets/js/07dea239.7ba519e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3948],{3905:(e,n,t)=>{t.d(n,{Zo:()=>s,kt:()=>k});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=r.createContext({}),u=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},s=function(e){var n=u(e.components);return r.createElement(p.Provider,{value:n},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=u(t),d=a,k=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return t?r.createElement(k,i(i({ref:n},s),{},{components:t})):r.createElement(k,i({ref:n},s))}));function k(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=d;var l={};for(var p in n)hasOwnProperty.call(n,p)&&(l[p]=n[p]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var u=2;u{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:56,sidebar_label:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",sidebar_class_name:"green"},i="\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",l={unversionedId:"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README",id:"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README",title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",description:"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u8282\u76ee\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u7ee7\u7eed\u5f00\u53d1\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u4e0d\u4e00\u5b9a\u975e\u5f97\u662f\u7535\u5f71\uff0c\u6211\u53c8\u4e0d\u662f\u4f60\u7238\u7238\u3002",source:"@site/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README.md",sourceDirName:"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program",slug:"/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README.md",tags:[],version:"current",sidebarPosition:56,frontMatter:{sidebar_position:56,sidebar_label:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/"},next:{title:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/state-management/"}},p={},u=[{value:"\ud83d\udd2a \u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e",id:"-\u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e",level:2},{value:"\ud83d\udc40 \u6dfb\u52a0\u6307\u4ee4\u5230\u7a0b\u5e8f\u4e2d",id:"-\u6dfb\u52a0\u6307\u4ee4\u5230\u7a0b\u5e8f\u4e2d",level:2},{value:"\u63d0\u4ea4\u7535\u5f71\u8bc4\u8bba",id:"\u63d0\u4ea4\u7535\u5f71\u8bc4\u8bba",level:2},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2}],s={toc:u},c="wrapper";function m(e){let{components:n,...o}=e;return(0,a.kt)(c,(0,r.Z)({},s,o,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"},"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"),(0,a.kt)("p",null,"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u8282\u76ee\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u7ee7\u7eed\u5f00\u53d1\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u4e0d\u4e00\u5b9a\u975e\u5f97\u662f\u7535\u5f71\uff0c\u6211\u53c8\u4e0d\u662f\u4f60\u7238\u7238\u3002"),(0,a.kt)("p",null,"\u56de\u5230\u64cd\u573a\uff08\u4e0a\u4e00\u8282\u8bfe\u7684\u90a3\u4e2a\uff0c\u4e0d\u662f\u4e2d\u5b66\u7684\u90a3\u4e2a\uff09\uff0c\u5e76\u5f00\u59cb\u4e00\u4e2a\u65b0\u9879\u76ee\u3002\u6211\u4eec\u5c06\u4ece\u57fa\u672c\u7ed3\u6784\u5f00\u59cb ",(0,a.kt)("inlineCode",{parentName:"p"},"lib.rs")," \uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::{\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg,\n account_info::AccountInfo,\n};\n\nentrypoint!(process_instruction);\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n\n Ok(())\n}\n")),(0,a.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\u90fd\u662f\u4e00\u5982\u65e2\u5f80\u7684\u3002\u4e0e\u8bb0\u4e8b\u7a0b\u5e8f\u4e00\u6837\uff0c\u6211\u4eec\u5c06\u4ece\u5b9a\u4e49\u6307\u4ee4\u7ed3\u6784\u548c\u521b\u5efa\u53cd\u5e8f\u5217\u5316\u903b\u8f91\u5f00\u59cb\u3002"),(0,a.kt)("h2",{id:"-\u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e"},"\ud83d\udd2a \u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u4e00\u4e2a\u540d\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u7684\u65b0\u6587\u4ef6\u4e2d\u8fdb\u884c\u6b64\u64cd\u4f5c\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use borsh::{BorshDeserialize};\nuse solana_program::{program_error::ProgramError};\n\npub enum MovieInstruction {\n AddMovieReview {\n title: String,\n rating: u8,\n description: String\n }\n}\n\n#[derive(BorshDeserialize)]\nstruct MovieReviewPayload {\n title: String,\n rating: u8,\n description: String\n}\n")),(0,a.kt)("p",null,"\u6211\u4eec\u9700\u8981\u5f15\u5165\u7684\u53ea\u6709 ",(0,a.kt)("inlineCode",{parentName:"p"},"BorshDeserialize")," \u5b8f\u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u679a\u4e3e\u3002"),(0,a.kt)("p",null,"\u867d\u7136\u6211\u4eec\u53ea\u6709\u4e00\u79cd\u6307\u4ee4\u7c7b\u578b\uff0c\u4f46\u6211\u4eec\u4ecd\u7136\u4f1a\u4f7f\u7528\u679a\u4e3e\u3002\u4ee5\u540e\u6211\u4eec\u53ef\u80fd\u4f1a\u51b3\u5b9a\u6dfb\u52a0\u66f4\u591a\u7684\u6307\u4ee4 :)"),(0,a.kt)("p",null,"\u4f60\u53ef\u80fd\u4f1a\u60f3\u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981\u5728\u6709\u6548\u8f7d\u8377\u4e2d\u6307\u5b9a\u7c7b\u578b\u3002\u8fd9\u4e9b\u7c7b\u578b\u544a\u8bc9Borsh\u5728\u54ea\u91cc\u5206\u5272\u5b57\u8282\u3002\u5728\u5207\u5272\u4e4b\u524d\uff0c\u5f97\u5148\u77e5\u9053\u9999\u80a0\u6709\u591a\u957f\uff0c\u8bb0\u4f4f\u4e86\u5417\uff1f"),(0,a.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u9700\u8981\u7684\u6700\u540e\u4e00\u4ef6\u4e8b\u60c5\u662f\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"MovieInstruction")," \u679a\u4e3e\u6dfb\u52a0\u5b9e\u73b0\u3002\u5728\u679a\u4e3e\u5b9a\u4e49\u4e0b\u9762\u6dfb\u52a0\u8fd9\u4e2a\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"impl MovieInstruction {\n pub fn unpack(input: &[u8]) -> Result {\n\n let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n\n let payload = MovieReviewPayload::try_from_slice(rest).unwrap();\n\n Ok(match variant {\n 0 => Self::AddMovieReview {\n title: payload.title,\n rating: payload.rating,\n description: payload.description },\n _ => return Err(ProgramError::InvalidInstructionData)\n })\n }\n}\n")),(0,a.kt)("p",null,"\u4f60\u5df2\u7ecf\u77e5\u9053\u8fd9\u91cc\u53d1\u751f\u7684\u4e00\u5207\uff01\u6211\u4eec\u6b63\u5728\u89e3\u6790\u6307\u4ee4\u6570\u636e\u5e76\u8fd4\u56de\u679a\u4e3e\u7684\u6b63\u786e\u53d8\u4f53\u3002"),(0,a.kt)("p",null,"\u6ce8\u610f\u5728\u6211\u4eec\u5206\u5272\u7b2c\u4e00\u4e2a\u5b57\u8282\u65f6\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n")),(0,a.kt)("p",null,"\u5982\u679c ",(0,a.kt)("inlineCode",{parentName:"p"},"unpack")," \u7684\u7ed3\u679c\u662f\u9519\u8bef\u7684\uff0c\u8fd9\u662f\u4e00\u79cd\u8fd4\u56de\u9519\u8bef\u5e76\u9000\u51fa ",(0,a.kt)("inlineCode",{parentName:"p"},"unpack")," \u51fd\u6570\u7684\u7b80\u5199\u65b9\u5f0f\u3002\u5c31\u50cf\u4e00\u4e2a\u7b80\u5355\u7684",(0,a.kt)("inlineCode",{parentName:"p"},"try/catch"),"\u3002\u8fd9\u662fRust\u4e2d\u5e38\u89c1\u7684\u6a21\u5f0f\uff0c\u4f60\u4f1a\u7ecf\u5e38\u770b\u5230\u5b83\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"let payload = MovieReviewPayload::try_from_slice(rest).unwrap();\n")),(0,a.kt)("p",null,"\u6211\u4e5f\u60f3\u66f4\u6df1\u5165\u5730\u63a2\u8ba8\u4e00\u4e0b\uff1a ",(0,a.kt)("inlineCode",{parentName:"p"},".unwrap();")," \u5728Rust\u4e2d\uff0c\u201c",(0,a.kt)("inlineCode",{parentName:"p"},"unwrap"),"\u201d\u610f\u5473\u7740\u201c\u7ed9\u6211\u8ba1\u7b97\u7684\u7ed3\u679c\uff0c\u5982\u679c\u51fa\u73b0\u9519\u8bef\uff0c\u5c31\u4f1a\u53d1\u751f\u6050\u614c\u5e76\u505c\u6b62\u7a0b\u5e8f\u3002\u201d\u4f60\u53ef\u80fd\u4f1a\u60f3\uff1a\u201c\u55ef\uff0c\u4f46\u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981\u4ece\u51fd\u6570\u7684\u7ed3\u679c\u4e2d\u8fd4\u56de\u4e1c\u897f\u5462\uff1f\u96be\u9053 ",(0,a.kt)("inlineCode",{parentName:"p"},"try_from_slice()")," \u51fd\u6570\u4e0d\u4f1a\u8fd4\u56de\u6211\u4eec\u60f3\u8981\u7684\u5417\uff1f\u201d"),(0,a.kt)("p",null,"\u4e0d\u662f\u7684\u3002Rust\u6709 ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," \u7c7b\u578b\uff1a\u4e00\u79cd\u4f7f\u7528Rust\u7684\u7c7b\u578b\u7cfb\u7edf\u6765\u8868\u793a\u53ef\u80fd\u7684\u7f3a\u5931\u7684\u65b9\u5f0f\u3002\u8fd9\u4e0e\u5176\u4ed6\u8bed\u8a00\u4e2d\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"null")," \u4e0d\u540c\u3002 ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," \u662f\u4e00\u79cd\u7c7b\u578b\uff0c\u53ef\u4ee5\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"Some")," \u6216 ",(0,a.kt)("inlineCode",{parentName:"p"},"None")," \u3002 ",(0,a.kt)("inlineCode",{parentName:"p"},"Some")," \u662f\u4e00\u4e2a\u503c\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"None")," \u662f\u4e00\u4e2a\u503c\u7684\u7f3a\u5931\u3002\u4e3a\u4ec0\u4e48\uff1f\u56e0\u4e3a\u6709\u65f6\u5019\u4f60\u6ca1\u6709\u4e00\u4e2a\u503c\uff0c\u8fd9\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\u3002\u4ece",(0,a.kt)("a",{parentName:"p",href:"https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/error-handling.html#unwrapping-explained?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u6587\u6863"),"\u4e2d\uff1a"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u5c06\u7f3a\u5e2d\u7684\u53ef\u80fd\u6027\u7f16\u7801\u5230\u7c7b\u578b\u7cfb\u7edf\u4e2d\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u6982\u5ff5\uff0c\u56e0\u4e3a\u5b83\u4f1a\u8feb\u4f7f\u7f16\u8bd1\u5668\u5f3a\u5236\u7a0b\u5e8f\u5458\u5904\u7406\u8fd9\u79cd\u7f3a\u5e2d\u3002")),(0,a.kt)("p",null,"Rust\u8ba9\u4f60\u6210\u4e3a\u4e00\u4e2a\u66f4\u597d\u7684\u5f00\u53d1\u8005\uff01\u73b0\u5728\u4f60\u53c8\u4e86\u89e3\u4e86Rust\u86cb\u7cd5\u7684\u53e6\u4e00\u4e2a\u5c0f\u90e8\u5206\ud83c\udf70"),(0,a.kt)("h2",{id:"-\u6dfb\u52a0\u6307\u4ee4\u5230\u7a0b\u5e8f\u4e2d"},"\ud83d\udc40 \u6dfb\u52a0\u6307\u4ee4\u5230\u7a0b\u5e8f\u4e2d"),(0,a.kt)("p",null,"\u8fd9\u91cc\u7684\u6700\u540e\u4e00\u90e8\u5206\u662f\u5c06\u6307\u4ee4\u5f15\u5165\u7a0b\u5e8f\u4e2d\u3002\u6211\u4eec\u5c06\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u4e2d\u5b8c\u6210\u8fd9\u4e2a\u6b65\u9aa4\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub mod instruction;\nuse instruction::{MovieInstruction};\n")),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u6539\u53d8\u4e86\u679a\u4e3e\u540d\u79f0\uff0c\u8bf7\u786e\u4fdd\u66f4\u65b0\u5bfc\u5165"),(0,a.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ea\u9700\u5c06\u6307\u4ee4\u6570\u636e\u8bb0\u5f55\u5230\u63a7\u5236\u53f0\u3002\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u4e4b\u540e\u6dfb\u52a0\u8fd9\u6bb5\u4ee3\u7801\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'pub fn add_movie_review(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n title: String,\n rating: u8,\n description: String\n) -> ProgramResult {\n\n msg!("Adding movie review...");\n msg!("Title: {}", title);\n msg!("Rating: {}", rating);\n msg!("Description: {}", description);\n\n Ok(())\n}\n')),(0,a.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u66f4\u65b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\uff0c\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"unpack")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n\n let instruction = MovieInstruction::unpack(instruction_data)?;\n\n match instruction {\n MovieInstruction::AddMovieReview { title, rating, description } => {\n add_movie_review(program_id, accounts, title, rating, description)\n }\n }\n}\n")),(0,a.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u6240\u505a\u7684\u53ea\u662f\u89e3\u6790\u6307\u4ee4\u6570\u636e\uff0c\u7136\u540e\u4f7f\u7528\u6b63\u786e\u7684\u53c2\u6570\u8c03\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u7684\u7a0b\u5e8f\u73b0\u5728\u5df2\u7ecf\u5b8c\u6210\u4e86\uff01\u786e\u4fdd\u4f60\u70b9\u51fb\u90e8\u7f72\u6309\u94ae\uff0c\u5e76\u4ece\u6e38\u4e50\u573a\u590d\u5236\u7a0b\u5e8fID\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u89c9\u5f97\u8fd9\u6709\u70b9\u4ee4\u4eba\u5931\u671b\uff0c\u90a3\u662f\u56e0\u4e3a\u6211\u4eec\u5728\u4e0a\u4e00\u8bfe\u5df2\u7ecf\u8bb2\u89e3\u4e86\u6bcf\u4e2a\u90e8\u5206\u3002\u8ba9\u6211\u4eec\u5c1d\u8bd5\u4f7f\u7528\u5ba2\u6237\u7aef\u5c06\u7535\u5f71\u8bc4\u8bba\u6dfb\u52a0\u5230\u6211\u4eec\u7684\u7a0b\u5e8f\u4e2d\u3002"),(0,a.kt)("h2",{id:"\u63d0\u4ea4\u7535\u5f71\u8bc4\u8bba"},"\u63d0\u4ea4\u7535\u5f71\u8bc4\u8bba"),(0,a.kt)("p",null,"\u6211\u4eec\u98de\u5feb\u5730\u524d\u8fdb\u7740\uff0c\u54b1\u4eec\u8d70\u5427\uff01"),(0,a.kt)("p",null,"\u4e0d\u9700\u8981\u4ece\u5934\u5f00\u59cb\u5199\u811a\u672c\uff0c\u6211\u76f8\u4fe1\u4f60\u77e5\u9053\u600e\u4e48\u505a :)"),(0,a.kt)("p",null,"\u8fd9\u662f\u5982\u4f55\u8bbe\u7f6e\u4e00\u4e2a\u5b8c\u6574\u7684\u811a\u672c\uff0c\u5305\u62ec\u4f60\u6240\u9700\u7684\u4e00\u5207\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"git clone https://github.com/buildspace/solana-movie-client\ncd solana-movie-client\nnpm install\n")),(0,a.kt)("p",null,"\u6253\u5f00 ",(0,a.kt)("inlineCode",{parentName:"p"},"src/index.js")," \u5e76\u5c06\u7b2c94\u884c\u7684\u7a0b\u5e8fID\u66f4\u65b0\u4e3a\u4eceplayground\u590d\u5236\u7684ID\u3002\u5982\u679c\u4f60\u5bf9\u7a0b\u5e8f\u8fdb\u884c\u4e86\u4efb\u4f55\u66f4\u6539\uff0c\u8fd9\u91cc\u4e5f\u9700\u8981\u66f4\u65b0\u5ba2\u6237\u7aef\u3002"),(0,a.kt)("p",null,"\u5728\u7ec8\u7aef\u4e2d\u8f93\u5165 ",(0,a.kt)("inlineCode",{parentName:"p"},"npm start")," \uff0c\u7136\u540e\u4f60\u5e94\u8be5\u4f1a\u5f97\u5230\u4e00\u4e2a\u8d44\u6e90\u7ba1\u7406\u5668\u94fe\u63a5\u3002\u70b9\u51fb\u90a3\u4e2a\u94fe\u63a5\uff0c\u7136\u540e\u5411\u4e0b\u6eda\u52a8\u5230\u7a0b\u5e8f\u6307\u4ee4\u65e5\u5fd7\uff0c\u4f60\u5e94\u8be5\u80fd\u770b\u5230\u4f60\u7684\u7535\u5f71\u8bc4\u8bba\uff01"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(3485).Z,width:"721",height:"286"})),(0,a.kt)("p",null,"\u8f7b\u677e\u6109\u5feb\uff0c\u6211\u4eec\u80fd\u641e\u5b9a\u7684\uff0c\u51fa\u53d1\uff01"),(0,a.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,a.kt)("p",null,"\u5bf9\u4e8e\u672c\u8bfe\u7a0b\u7684\u6311\u6218\uff0c\u5c1d\u8bd5\u590d\u5236\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\u3002"),(0,a.kt)("p",null,"\u8be5\u7a0b\u5e8f\u63a5\u6536\u7528\u6237\u7684\u59d3\u540d\u548c\u77ed\u4fe1\u4f5c\u4e3a\u6307\u4ee4\u6570\u636e\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u8d26\u6237\u6765\u5c06\u6570\u636e\u5b58\u50a8\u5728\u533a\u5757\u94fe\u4e0a\u3002"),(0,a.kt)("p",null,"\u5229\u7528\u4f60\u5728\u672c\u8bfe\u7a0b\u4e2d\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u6784\u5efa\u4e00\u4e2a\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\uff0c\u4f7f\u5f97\u5f53\u7a0b\u5e8f\u88ab\u8c03\u7528\u65f6\uff0c\u80fd\u591f\u5c06\u7528\u6237\u63d0\u4f9b\u7684\u59d3\u540d\u548c\u4fe1\u606f\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002"),(0,a.kt)("p",null,"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\n\u4f60\u53ef\u4ee5\u901a\u8fc7\u6784\u5efa\u8fd9\u4e2a\u524d\u7aef\u5e76\u5728Solana Explorer\u4e0a\u68c0\u67e5\u7a0b\u5e8f\u65e5\u5fd7\u6765\u6d4b\u8bd5\u4f60\u7684\u7a0b\u5e8f\u3002\u8bb0\u5f97\u7528\u4f60\u90e8\u7f72\u7684\u7a0b\u5e8fID\u66ff\u6362\u524d\u7aef\u4ee3\u7801\u4e2d\u7684ID\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u53ef\u4ee5\u7684\u8bdd\uff0c\u5c3d\u91cf\u72ec\u7acb\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff01\u4f46\u5982\u679c\u9047\u5230\u56f0\u96be\uff0c\u53ef\u4ee5",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/62b0ce53f6273245aca4f5b0"},"\u53c2\u8003\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002"),(0,a.kt)("p",null,"\u6211\u76f8\u4fe1\u4f60\u3002"))}m.isMDXComponent=!0},3485:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/movie-logo-547ee48c997728d2ec59976f114fe4fe.png"}}]); \ No newline at end of file diff --git a/assets/js/07dea239.fd1cdeb6.js b/assets/js/07dea239.fd1cdeb6.js deleted file mode 100644 index 9361ae5c0..000000000 --- a/assets/js/07dea239.fd1cdeb6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3948],{3905:(e,n,t)=>{t.d(n,{Zo:()=>s,kt:()=>k});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=r.createContext({}),u=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},s=function(e){var n=u(e.components);return r.createElement(p.Provider,{value:n},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=u(t),d=a,k=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return t?r.createElement(k,i(i({ref:n},s),{},{components:t})):r.createElement(k,i({ref:n},s))}));function k(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=d;var l={};for(var p in n)hasOwnProperty.call(n,p)&&(l[p]=n[p]);l.originalType=e,l[c]="string"==typeof e?e:a,i[1]=l;for(var u=2;u{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:56,sidebar_label:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",sidebar_class_name:"green"},i="\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",l={unversionedId:"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README",id:"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README",title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",description:"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u8282\u76ee\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u7ee7\u7eed\u5f00\u53d1\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u4e0d\u4e00\u5b9a\u975e\u5f97\u662f\u7535\u5f71\uff0c\u6211\u53c8\u4e0d\u662f\u4f60\u7238\u7238\u3002",source:"@site/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README.md",sourceDirName:"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program",slug:"/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README.md",tags:[],version:"current",sidebarPosition:56,frontMatter:{sidebar_position:56,sidebar_label:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/"},next:{title:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/state-management/"}},p={},u=[{value:"\ud83d\udd2a \u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e",id:"-\u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e",level:2},{value:"\ud83d\udc40 \u6dfb\u52a0\u6307\u4ee4\u5230\u7a0b\u5e8f\u4e2d",id:"-\u6dfb\u52a0\u6307\u4ee4\u5230\u7a0b\u5e8f\u4e2d",level:2},{value:"\u63d0\u4ea4\u7535\u5f71\u8bc4\u8bba",id:"\u63d0\u4ea4\u7535\u5f71\u8bc4\u8bba",level:2},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2}],s={toc:u},c="wrapper";function m(e){let{components:n,...o}=e;return(0,a.kt)(c,(0,r.Z)({},s,o,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"},"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"),(0,a.kt)("p",null,"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u8282\u76ee\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u7ee7\u7eed\u5f00\u53d1\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u4e0d\u4e00\u5b9a\u975e\u5f97\u662f\u7535\u5f71\uff0c\u6211\u53c8\u4e0d\u662f\u4f60\u7238\u7238\u3002"),(0,a.kt)("p",null,"\u56de\u5230\u64cd\u573a\uff08\u4e0a\u4e00\u8282\u8bfe\u7684\u90a3\u4e2a\uff0c\u4e0d\u662f\u4e2d\u5b66\u7684\u90a3\u4e2a\uff09\uff0c\u5e76\u5f00\u59cb\u4e00\u4e2a\u65b0\u9879\u76ee\u3002\u6211\u4eec\u5c06\u4ece\u57fa\u672c\u7ed3\u6784\u5f00\u59cb ",(0,a.kt)("inlineCode",{parentName:"p"},"lib.rs")," \uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::{\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg,\n account_info::AccountInfo,\n};\n\nentrypoint!(process_instruction);\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n\n Ok(())\n}\n")),(0,a.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\u90fd\u662f\u4e00\u5982\u65e2\u5f80\u7684\u3002\u4e0e\u8bb0\u4e8b\u7a0b\u5e8f\u4e00\u6837\uff0c\u6211\u4eec\u5c06\u4ece\u5b9a\u4e49\u6307\u4ee4\u7ed3\u6784\u548c\u521b\u5efa\u53cd\u5e8f\u5217\u5316\u903b\u8f91\u5f00\u59cb\u3002"),(0,a.kt)("h2",{id:"-\u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e"},"\ud83d\udd2a \u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u4e00\u4e2a\u540d\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u7684\u65b0\u6587\u4ef6\u4e2d\u8fdb\u884c\u6b64\u64cd\u4f5c\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use borsh::{BorshDeserialize};\nuse solana_program::{program_error::ProgramError};\n\npub enum MovieInstruction {\n AddMovieReview {\n title: String,\n rating: u8,\n description: String\n }\n}\n\n#[derive(BorshDeserialize)]\nstruct MovieReviewPayload {\n title: String,\n rating: u8,\n description: String\n}\n")),(0,a.kt)("p",null,"\u6211\u4eec\u9700\u8981\u5f15\u5165\u7684\u53ea\u6709 ",(0,a.kt)("inlineCode",{parentName:"p"},"BorshDeserialize")," \u5b8f\u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u679a\u4e3e\u3002"),(0,a.kt)("p",null,"\u867d\u7136\u6211\u4eec\u53ea\u6709\u4e00\u79cd\u6307\u4ee4\u7c7b\u578b\uff0c\u4f46\u6211\u4eec\u4ecd\u7136\u4f1a\u4f7f\u7528\u679a\u4e3e\u3002\u4ee5\u540e\u6211\u4eec\u53ef\u80fd\u4f1a\u51b3\u5b9a\u6dfb\u52a0\u66f4\u591a\u7684\u6307\u4ee4 :)"),(0,a.kt)("p",null,"\u4f60\u53ef\u80fd\u4f1a\u60f3\u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981\u5728\u6709\u6548\u8f7d\u8377\u4e2d\u6307\u5b9a\u7c7b\u578b\u3002\u8fd9\u4e9b\u7c7b\u578b\u544a\u8bc9Borsh\u5728\u54ea\u91cc\u5206\u5272\u5b57\u8282\u3002\u5728\u5207\u5272\u4e4b\u524d\uff0c\u5f97\u5148\u77e5\u9053\u9999\u80a0\u6709\u591a\u957f\uff0c\u8bb0\u4f4f\u4e86\u5417\uff1f"),(0,a.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u9700\u8981\u7684\u6700\u540e\u4e00\u4ef6\u4e8b\u60c5\u662f\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"MovieInstruction")," \u679a\u4e3e\u6dfb\u52a0\u5b9e\u73b0\u3002\u5728\u679a\u4e3e\u5b9a\u4e49\u4e0b\u9762\u6dfb\u52a0\u8fd9\u4e2a\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"impl MovieInstruction {\n pub fn unpack(input: &[u8]) -> Result {\n\n let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n\n let payload = MovieReviewPayload::try_from_slice(rest).unwrap();\n\n Ok(match variant {\n 0 => Self::AddMovieReview {\n title: payload.title,\n rating: payload.rating,\n description: payload.description },\n _ => return Err(ProgramError::InvalidInstructionData)\n })\n }\n}\n")),(0,a.kt)("p",null,"\u4f60\u5df2\u7ecf\u77e5\u9053\u8fd9\u91cc\u53d1\u751f\u7684\u4e00\u5207\uff01\u6211\u4eec\u6b63\u5728\u89e3\u6790\u6307\u4ee4\u6570\u636e\u5e76\u8fd4\u56de\u679a\u4e3e\u7684\u6b63\u786e\u53d8\u4f53\u3002"),(0,a.kt)("p",null,"\u6ce8\u610f\u5728\u6211\u4eec\u5206\u5272\u7b2c\u4e00\u4e2a\u5b57\u8282\u65f6\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"?"),"\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n")),(0,a.kt)("p",null,"\u5982\u679c ",(0,a.kt)("inlineCode",{parentName:"p"},"unpack")," \u7684\u7ed3\u679c\u662f\u9519\u8bef\u7684\uff0c\u8fd9\u662f\u4e00\u79cd\u8fd4\u56de\u9519\u8bef\u5e76\u9000\u51fa ",(0,a.kt)("inlineCode",{parentName:"p"},"unpack")," \u51fd\u6570\u7684\u7b80\u5199\u65b9\u5f0f\u3002\u5c31\u50cf\u4e00\u4e2a\u7b80\u5355\u7684",(0,a.kt)("inlineCode",{parentName:"p"},"try/catch"),"\u3002\u8fd9\u662fRust\u4e2d\u5e38\u89c1\u7684\u6a21\u5f0f\uff0c\u4f60\u4f1a\u7ecf\u5e38\u770b\u5230\u5b83\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"let payload = MovieReviewPayload::try_from_slice(rest).unwrap();\n")),(0,a.kt)("p",null,"\u6211\u4e5f\u60f3\u66f4\u6df1\u5165\u5730\u63a2\u8ba8\u4e00\u4e0b\uff1a ",(0,a.kt)("inlineCode",{parentName:"p"},".unwrap();")," \u5728Rust\u4e2d\uff0c\u201c",(0,a.kt)("inlineCode",{parentName:"p"},"unwrap"),"\u201d\u610f\u5473\u7740\u201c\u7ed9\u6211\u8ba1\u7b97\u7684\u7ed3\u679c\uff0c\u5982\u679c\u51fa\u73b0\u9519\u8bef\uff0c\u5c31\u4f1a\u53d1\u751f\u6050\u614c\u5e76\u505c\u6b62\u7a0b\u5e8f\u3002\u201d\u4f60\u53ef\u80fd\u4f1a\u60f3\uff1a\u201c\u55ef\uff0c\u4f46\u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981\u4ece\u51fd\u6570\u7684\u7ed3\u679c\u4e2d\u8fd4\u56de\u4e1c\u897f\u5462\uff1f\u96be\u9053 ",(0,a.kt)("inlineCode",{parentName:"p"},"try_from_slice()")," \u51fd\u6570\u4e0d\u4f1a\u8fd4\u56de\u6211\u4eec\u60f3\u8981\u7684\u5417\uff1f\u201d"),(0,a.kt)("p",null,"\u4e0d\u662f\u7684\u3002Rust\u6709 ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," \u7c7b\u578b\uff1a\u4e00\u79cd\u4f7f\u7528Rust\u7684\u7c7b\u578b\u7cfb\u7edf\u6765\u8868\u793a\u53ef\u80fd\u7684\u7f3a\u5931\u7684\u65b9\u5f0f\u3002\u8fd9\u4e0e\u5176\u4ed6\u8bed\u8a00\u4e2d\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"null")," \u4e0d\u540c\u3002 ",(0,a.kt)("inlineCode",{parentName:"p"},"Option")," \u662f\u4e00\u79cd\u7c7b\u578b\uff0c\u53ef\u4ee5\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"Some")," \u6216 ",(0,a.kt)("inlineCode",{parentName:"p"},"None")," \u3002 ",(0,a.kt)("inlineCode",{parentName:"p"},"Some")," \u662f\u4e00\u4e2a\u503c\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"None")," \u662f\u4e00\u4e2a\u503c\u7684\u7f3a\u5931\u3002\u4e3a\u4ec0\u4e48\uff1f\u56e0\u4e3a\u6709\u65f6\u5019\u4f60\u6ca1\u6709\u4e00\u4e2a\u503c\uff0c\u8fd9\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\u3002\u4ece",(0,a.kt)("a",{parentName:"p",href:"https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/error-handling.html#unwrapping-explained?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u6587\u6863"),"\u4e2d\uff1a"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u5c06\u7f3a\u5e2d\u7684\u53ef\u80fd\u6027\u7f16\u7801\u5230\u7c7b\u578b\u7cfb\u7edf\u4e2d\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u6982\u5ff5\uff0c\u56e0\u4e3a\u5b83\u4f1a\u8feb\u4f7f\u7f16\u8bd1\u5668\u5f3a\u5236\u7a0b\u5e8f\u5458\u5904\u7406\u8fd9\u79cd\u7f3a\u5e2d\u3002")),(0,a.kt)("p",null,"Rust\u8ba9\u4f60\u6210\u4e3a\u4e00\u4e2a\u66f4\u597d\u7684\u5f00\u53d1\u8005\uff01\u73b0\u5728\u4f60\u53c8\u4e86\u89e3\u4e86Rust\u86cb\u7cd5\u7684\u53e6\u4e00\u4e2a\u5c0f\u90e8\u5206\ud83c\udf70"),(0,a.kt)("h2",{id:"-\u6dfb\u52a0\u6307\u4ee4\u5230\u7a0b\u5e8f\u4e2d"},"\ud83d\udc40 \u6dfb\u52a0\u6307\u4ee4\u5230\u7a0b\u5e8f\u4e2d"),(0,a.kt)("p",null,"\u8fd9\u91cc\u7684\u6700\u540e\u4e00\u90e8\u5206\u662f\u5c06\u6307\u4ee4\u5f15\u5165\u7a0b\u5e8f\u4e2d\u3002\u6211\u4eec\u5c06\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u4e2d\u5b8c\u6210\u8fd9\u4e2a\u6b65\u9aa4\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub mod instruction;\nuse instruction::{MovieInstruction};\n")),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u6539\u53d8\u4e86\u679a\u4e3e\u540d\u79f0\uff0c\u8bf7\u786e\u4fdd\u66f4\u65b0\u5bfc\u5165"),(0,a.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ea\u9700\u5c06\u6307\u4ee4\u6570\u636e\u8bb0\u5f55\u5230\u63a7\u5236\u53f0\u3002\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u4e4b\u540e\u6dfb\u52a0\u8fd9\u6bb5\u4ee3\u7801\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'pub fn add_movie_review(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n title: String,\n rating: u8,\n description: String\n) -> ProgramResult {\n\n msg!("Adding movie review...");\n msg!("Title: {}", title);\n msg!("Rating: {}", rating);\n msg!("Description: {}", description);\n\n Ok(())\n}\n')),(0,a.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u66f4\u65b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\uff0c\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"unpack")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n\n let instruction = MovieInstruction::unpack(instruction_data)?;\n\n match instruction {\n MovieInstruction::AddMovieReview { title, rating, description } => {\n add_movie_review(program_id, accounts, title, rating, description)\n }\n }\n}\n")),(0,a.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u6240\u505a\u7684\u53ea\u662f\u89e3\u6790\u6307\u4ee4\u6570\u636e\uff0c\u7136\u540e\u4f7f\u7528\u6b63\u786e\u7684\u53c2\u6570\u8c03\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u7684\u7a0b\u5e8f\u73b0\u5728\u5df2\u7ecf\u5b8c\u6210\u4e86\uff01\u786e\u4fdd\u4f60\u70b9\u51fb\u90e8\u7f72\u6309\u94ae\uff0c\u5e76\u4ece\u6e38\u4e50\u573a\u590d\u5236\u7a0b\u5e8fID\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u89c9\u5f97\u8fd9\u6709\u70b9\u4ee4\u4eba\u5931\u671b\uff0c\u90a3\u662f\u56e0\u4e3a\u6211\u4eec\u5728\u4e0a\u4e00\u8bfe\u5df2\u7ecf\u8bb2\u89e3\u4e86\u6bcf\u4e2a\u90e8\u5206\u3002\u8ba9\u6211\u4eec\u5c1d\u8bd5\u4f7f\u7528\u5ba2\u6237\u7aef\u5c06\u7535\u5f71\u8bc4\u8bba\u6dfb\u52a0\u5230\u6211\u4eec\u7684\u7a0b\u5e8f\u4e2d\u3002"),(0,a.kt)("h2",{id:"\u63d0\u4ea4\u7535\u5f71\u8bc4\u8bba"},"\u63d0\u4ea4\u7535\u5f71\u8bc4\u8bba"),(0,a.kt)("p",null,"\u6211\u4eec\u98de\u5feb\u5730\u524d\u8fdb\u7740\uff0c\u54b1\u4eec\u8d70\u5427\uff01"),(0,a.kt)("p",null,"\u4e0d\u9700\u8981\u4ece\u5934\u5f00\u59cb\u5199\u811a\u672c\uff0c\u6211\u76f8\u4fe1\u4f60\u77e5\u9053\u600e\u4e48\u505a :)"),(0,a.kt)("p",null,"\u8fd9\u662f\u5982\u4f55\u8bbe\u7f6e\u4e00\u4e2a\u5b8c\u6574\u7684\u811a\u672c\uff0c\u5305\u62ec\u4f60\u6240\u9700\u7684\u4e00\u5207\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"git clone https://github.com/buildspace/solana-movie-client\ncd solana-movie-client\nnpm install\n")),(0,a.kt)("p",null,"\u6253\u5f00 ",(0,a.kt)("inlineCode",{parentName:"p"},"src/index.js")," \u5e76\u5c06\u7b2c94\u884c\u7684\u7a0b\u5e8fID\u66f4\u65b0\u4e3a\u4eceplayground\u590d\u5236\u7684ID\u3002\u5982\u679c\u4f60\u5bf9\u7a0b\u5e8f\u8fdb\u884c\u4e86\u4efb\u4f55\u66f4\u6539\uff0c\u8fd9\u91cc\u4e5f\u9700\u8981\u66f4\u65b0\u5ba2\u6237\u7aef\u3002"),(0,a.kt)("p",null,"\u5728\u7ec8\u7aef\u4e2d\u8f93\u5165 ",(0,a.kt)("inlineCode",{parentName:"p"},"npm start")," \uff0c\u7136\u540e\u4f60\u5e94\u8be5\u4f1a\u5f97\u5230\u4e00\u4e2a\u8d44\u6e90\u7ba1\u7406\u5668\u94fe\u63a5\u3002\u70b9\u51fb\u90a3\u4e2a\u94fe\u63a5\uff0c\u7136\u540e\u5411\u4e0b\u6eda\u52a8\u5230\u7a0b\u5e8f\u6307\u4ee4\u65e5\u5fd7\uff0c\u4f60\u5e94\u8be5\u80fd\u770b\u5230\u4f60\u7684\u7535\u5f71\u8bc4\u8bba\uff01"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(3485).Z,width:"721",height:"286"})),(0,a.kt)("p",null,"\u8f7b\u677e\u6109\u5feb\uff0c\u6211\u4eec\u80fd\u641e\u5b9a\u7684\uff0c\u51fa\u53d1\uff01"),(0,a.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,a.kt)("p",null,"\u5bf9\u4e8e\u672c\u8bfe\u7a0b\u7684\u6311\u6218\uff0c\u5c1d\u8bd5\u590d\u5236\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\u3002"),(0,a.kt)("p",null,"\u8be5\u7a0b\u5e8f\u63a5\u6536\u7528\u6237\u7684\u59d3\u540d\u548c\u77ed\u4fe1\u4f5c\u4e3a\u6307\u4ee4\u6570\u636e\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u8d26\u6237\u6765\u5c06\u6570\u636e\u5b58\u50a8\u5728\u533a\u5757\u94fe\u4e0a\u3002"),(0,a.kt)("p",null,"\u5229\u7528\u4f60\u5728\u672c\u8bfe\u7a0b\u4e2d\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u6784\u5efa\u4e00\u4e2a\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\uff0c\u4f7f\u5f97\u5f53\u7a0b\u5e8f\u88ab\u8c03\u7528\u65f6\uff0c\u80fd\u591f\u5c06\u7528\u6237\u63d0\u4f9b\u7684\u59d3\u540d\u548c\u4fe1\u606f\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002"),(0,a.kt)("p",null,"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\n\u4f60\u53ef\u4ee5\u901a\u8fc7\u6784\u5efa\u8fd9\u4e2a\u524d\u7aef\u5e76\u5728Solana Explorer\u4e0a\u68c0\u67e5\u7a0b\u5e8f\u65e5\u5fd7\u6765\u6d4b\u8bd5\u4f60\u7684\u7a0b\u5e8f\u3002\u8bb0\u5f97\u7528\u4f60\u90e8\u7f72\u7684\u7a0b\u5e8fID\u66ff\u6362\u524d\u7aef\u4ee3\u7801\u4e2d\u7684ID\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u53ef\u4ee5\u7684\u8bdd\uff0c\u5c3d\u91cf\u72ec\u7acb\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff01\u4f46\u5982\u679c\u9047\u5230\u56f0\u96be\uff0c\u53ef\u4ee5",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/62b0ce53f6273245aca4f5b0"},"\u53c2\u8003\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002"),(0,a.kt)("p",null,"\u6211\u76f8\u4fe1\u4f60\u3002"))}m.isMDXComponent=!0},3485:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/movie-logo-547ee48c997728d2ec59976f114fe4fe.png"}}]); \ No newline at end of file diff --git a/assets/js/0b59e1b8.1b5312fa.js b/assets/js/0b59e1b8.1b5312fa.js deleted file mode 100644 index 3596ac3aa..000000000 --- a/assets/js/0b59e1b8.1b5312fa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[950],{3905:(n,e,t)=>{t.d(e,{Zo:()=>u,kt:()=>d});var a=t(7294);function o(n,e,t){return e in n?Object.defineProperty(n,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[e]=t,n}function i(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(n);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),t.push.apply(t,a)}return t}function l(n){for(var e=1;e=0||(o[t]=n[t]);return o}(n,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(n,t)&&(o[t]=n[t])}return o}var c=a.createContext({}),p=function(n){var e=a.useContext(c),t=e;return n&&(t="function"==typeof n?n(e):l(l({},e),n)),t},u=function(n){var e=p(n.components);return a.createElement(c.Provider,{value:e},n.children)},s="mdxType",k={inlineCode:"code",wrapper:function(n){var e=n.children;return a.createElement(a.Fragment,{},e)}},m=a.forwardRef((function(n,e){var t=n.components,o=n.mdxType,i=n.originalType,c=n.parentName,u=r(n,["components","mdxType","originalType","parentName"]),s=p(t),m=o,d=s["".concat(c,".").concat(m)]||s[m]||k[m]||i;return t?a.createElement(d,l(l({ref:e},u),{},{components:t})):a.createElement(d,l({ref:e},u))}));function d(n,e){var t=arguments,o=e&&e.mdxType;if("string"==typeof n||o){var i=t.length,l=new Array(i);l[0]=m;var r={};for(var c in e)hasOwnProperty.call(e,c)&&(r[c]=e[c]);r.originalType=n,r[s]="string"==typeof n?n:o,l[1]=r;for(var p=2;p{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>l,default:()=>k,frontMatter:()=>i,metadata:()=>r,toc:()=>p});var a=t(7462),o=(t(7294),t(3905));const i={sidebar_position:28,sidebar_label:"\ud83d\udcb5 The token Program",sidebar_class_name:"green"},l="\ud83d\udcb5 The Token Program",r={unversionedId:"Solana-Co-Learn/module2/spl-token/the-token-program/README",id:"Solana-Co-Learn/module2/spl-token/the-token-program/README",title:"\ud83d\udcb5 The Token Program",description:"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u5728\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u4e2d\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002\u4f5c\u4e3a\u533a\u5757\u94fe\u6700\u521d\u7684\u627f\u8bfa\uff0c\u4e5f\u53ef\u80fd\u662f\u4f60\u5b89\u88c5\u94b1\u5305\u7684\u4e3b\u8981\u539f\u56e0\uff0c\u8fd9\u4e9b\u8c26\u900a\u7684\u4ee3\u5e01\u662f\u5bf9\u533a\u5757\u94fe\u4e0a\u8d44\u4ea7\u7684\u6700\u7eaf\u7cb9\u7684\u8868\u8fbe\uff0c\u4ece\u5408\u6210\u80a1\u7968\u5230\u6570\u767e\u79cd\u72d7\u5e01\u3002",source:"@site/docs/Solana-Co-Learn/module2/spl-token/the-token-program/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token/the-token-program",slug:"/Solana-Co-Learn/module2/spl-token/the-token-program/",permalink:"/docs/Solana-Co-Learn/module2/spl-token/the-token-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/the-token-program/README.md",tags:[],version:"current",sidebarPosition:28,frontMatter:{sidebar_position:28,sidebar_label:"\ud83d\udcb5 The token Program",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Spl token",permalink:"/docs/Solana-Co-Learn/module2/spl-token/"},next:{title:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",permalink:"/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/"}},c={},p=[{value:"\ud83d\uddc3 \u8d26\u6237\u5173\u7cfb",id:"-\u8d26\u6237\u5173\u7cfb",level:2},{value:"\ud83c\udf0c Mint Account",id:"-mint-account",level:2},{value:"\ud83d\udc5b Token Accounts",id:"-token-accounts",level:2},{value:"\ud83e\udd11 \u4ee3\u5e01Mint\u8fc7\u7a0b",id:"-\u4ee3\u5e01mint\u8fc7\u7a0b",level:2},{value:"Reference",id:"reference",level:2},{value:"\u7b80\u800c\u8a00\u4e4b",id:"\u7b80\u800c\u8a00\u4e4b",level:2},{value:"\u6982\u8ff0",id:"\u6982\u8ff0",level:2},{value:"\u4ee3\u5e01\u94f8\u9020",id:"\u4ee3\u5e01\u94f8\u9020",level:2},{value:"\u79df\u91d1\u548c\u79df\u91d1\u8c41\u514d",id:"\u79df\u91d1\u548c\u79df\u91d1\u8c41\u514d",level:2},{value:"\u4ee4\u724c\u8d26\u6237",id:"\u4ee4\u724c\u8d26\u6237",level:2},{value:"\u5173\u8054\u4ee3\u5e01\u8d26\u6237",id:"\u5173\u8054\u4ee3\u5e01\u8d26\u6237",level:2},{value:"Mint token",id:"mint-token",level:2},{value:"\u8f6c\u79fb\u4ee3\u5e01",id:"\u8f6c\u79fb\u4ee3\u5e01",level:2},{value:"\u71c3\u70e7\u4ee3\u5e01",id:"\u71c3\u70e7\u4ee3\u5e01",level:2},{value:"\u6279\u51c6\u59d4\u6d3e",id:"\u6279\u51c6\u59d4\u6d3e",level:2},{value:"\u64a4\u9500\u59d4\u6258",id:"\u64a4\u9500\u59d4\u6258",level:2},{value:"\u6f14\u793a",id:"\u6f14\u793a",level:2},{value:"1. \u57fa\u672c\u811a\u624b\u67b6",id:"1-\u57fa\u672c\u811a\u624b\u67b6",level:3},{value:"2. \u521b\u5efaToken Mint",id:"2-\u521b\u5efatoken-mint",level:3},{value:"3. \u521b\u5efa\u4ee4\u724c\u8d26\u6237",id:"3-\u521b\u5efa\u4ee4\u724c\u8d26\u6237",level:3},{value:"4. Mint token",id:"4-mint-token",level:3},{value:"5. \u6279\u51c6\u59d4\u6d3e",id:"5-\u6279\u51c6\u59d4\u6d3e",level:3},{value:"6. \u8f6c\u79fb\u4ee3\u5e01",id:"6-\u8f6c\u79fb\u4ee3\u5e01",level:3},{value:"7. \u64a4\u9500\u59d4\u6258",id:"7-\u64a4\u9500\u59d4\u6258",level:3},{value:"8. \u71c3\u70e7\u4ee3\u5e01",id:"8-\u71c3\u70e7\u4ee3\u5e01",level:3},{value:"9. \u5168\u90e8\u6d4b\u8bd5\u4e00\u4e0b",id:"9-\u5168\u90e8\u6d4b\u8bd5\u4e00\u4e0b",level:3},{value:"\u6311\u6218",id:"\u6311\u6218",level:2}],u={toc:p},s="wrapper";function k(n){let{components:e,...i}=n;return(0,o.kt)(s,(0,a.Z)({},u,i,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"-the-token-program"},"\ud83d\udcb5 The Token Program"),(0,o.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u5728\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u4e2d\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece",(0,o.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-token-client/tree/solution-without-burn"},"\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801"),"\uff08\u786e\u4fdd\u4f60\u5728 ",(0,o.kt)("inlineCode",{parentName:"p"},"solution-without-burn")," \u5206\u652f\u4e0a\uff09\u3002\u4f5c\u4e3a\u533a\u5757\u94fe\u6700\u521d\u7684\u627f\u8bfa\uff0c\u4e5f\u53ef\u80fd\u662f\u4f60\u5b89\u88c5\u94b1\u5305\u7684\u4e3b\u8981\u539f\u56e0\uff0c\u8fd9\u4e9b\u8c26\u900a\u7684\u4ee3\u5e01\u662f\u5bf9\u533a\u5757\u94fe\u4e0a\u8d44\u4ea7\u7684\u6700\u7eaf\u7cb9\u7684\u8868\u8fbe\uff0c\u4ece\u5408\u6210\u80a1\u7968\u5230\u6570\u767e\u79cd\u72d7\u5e01\u3002"),(0,o.kt)("p",null,"\u8fd9\u8282\u8bfe\u4e3b\u8981\u8bb2\u89e3Solana\u4e0a\u7684\u4ee3\u5e01\u5de5\u4f5c\u539f\u7406\u3002\u5982\u679c\u4f60\u5bf9\u5176\u4ed6\u533a\u5757\u94fe\u6709\u6240\u4e86\u89e3\uff0c\u53ef\u80fd\u4f1a\u53d1\u73b0\u8fd9\u91cc\u6709\u4e00\u4e9b\u4e0d\u540c\u4e4b\u5904\uff0c\u6240\u4ee5\u5c3d\u91cf\u4e0d\u8981\u5c06\u5f53\u524d\u5bf9\u4ee3\u5e01\u7684\u7406\u89e3\u4e0e\u4e4b\u8054\u7cfb\u8d77\u6765\u3002"),(0,o.kt)("p",null,"\u8c08\u8bbaSolana\u4e2d\u4ee4\u724c\u7684\u5de5\u4f5c\u539f\u7406\u4e5f\u662f\u4e00\u4e2a\u4e86\u89e3\u4e0d\u540c\u7a0b\u5e8f\u5982\u4f55\u4f7f\u7528\u8d26\u6237\u7684\u7edd\u4f73\u673a\u4f1a\u3002\u4f60\u8d8a\u6df1\u5165\u4e86\u89e3Solana\uff0c\u5c31\u8d8a\u80fd\u610f\u8bc6\u5230\u8d26\u6237\u7684\u91cd\u8981\u6027\u3002\u5b83\u4eec\u50cf\u6587\u4ef6\u7cfb\u7edf\u4e2d\u7684\u6587\u4ef6\u4e00\u6837\u62bd\u8c61\u548c\u7075\u6d3b\uff0c\u4f46\u8fd9\u4e5f\u610f\u5473\u7740\u4efb\u4f55\u7ed9\u5b9a\u7a0b\u5e8f\u4e0a\u7684\u8d26\u6237\u53ef\u80fd\u53d8\u5f97\u590d\u6742\uff01\u521a\u5f00\u59cb\u53ef\u80fd\u4f1a\u611f\u5230\u56f0\u60d1\uff0c\u4f46\u7ed9\u5b83\u4e00\u4e9b\u65f6\u95f4\uff0c\u5b83\u4f1a\u53d8\u5f97\u66f4\u52a0\u6e05\u6670\u3002"),(0,o.kt)("p",null,"Solana\u4e0a\u7684\u4ee3\u5e01\u662f\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"Solana Token Program"),"\u8fdb\u884c\u521b\u5efa\u548c\u7ba1\u7406\u7684\uff0c\u5b83\u662f",(0,o.kt)("inlineCode",{parentName:"p"},"Solana Program Library\uff08SPL\uff09"),"\u4e2d\u7684\u51e0\u4e2a\u7a0b\u5e8f\u4e4b\u4e00\u3002\u5e38\u89c4\u4ee3\u5e01\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFTs\uff09\u90fd\u662fSolana\u7a0b\u5e8f\u5e93\u4e2d\u7684\u4ee3\u5e01\u3002\u4eca\u5929\u6211\u4eec\u4e0d\u4f1a\u6d89\u53caNFTs\uff0c\u4f46\u4e0d\u7528\u62c5\u5fc3\uff0c\u6211\u4eec\u5f88\u5feb\u4f1a\u4ecb\u7ecd\u3002"),(0,o.kt)("h2",{id:"-\u8d26\u6237\u5173\u7cfb"},"\ud83d\uddc3 \u8d26\u6237\u5173\u7cfb"),(0,o.kt)("p",null,"\u6211\u4eec\u9996\u5148\u8981\u4e86\u89e3\u4e00\u4e0b\u60c5\u51b5\u3002",(0,o.kt)("inlineCode",{parentName:"p"},"The token program"),"\u9700\u8981\u4e09\u4e2a\u5fc5\u8981\u7684\u8d26\u6237:"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(5564).Z,width:"1398",height:"324"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Wallet Account")," - \u8fd9\u662f\u4f60\u7684\u94b1\u5305\uff01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Mint Account")," - \u5b58\u50a8\u6709\u5173\u4ee3\u5e01Mint\u7684\u5143\u6570\u636e"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Token Account")," - \u8fd9\u4e0e\u94b1\u5305\u7ed1\u5b9a\uff0c\u5e76\u5b58\u50a8\u6709\u5173\u8be5\u7279\u5b9a\u94b1\u5305\u7684\u4fe1\u606f\uff0c\u4f8b\u5982\u5b83\u62e5\u6709\u591a\u5c11\u4ee4\u724c\u3002")),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u6df1\u5165\u4e86\u89e3\u6bcf\u4e2a\u8d26\u6237\uff0c\u5e76\u770b\u770b\u5b83\u4eec\u5185\u90e8\u7684\u60c5\u51b5\u3002"),(0,o.kt)("h2",{id:"-mint-account"},"\ud83c\udf0c Mint Account"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(871).Z,width:"1398",height:"432"})),(0,o.kt)("p",null,"Mint\u8d26\u6237\u5b58\u50a8\u6709\u5173\u4ee3\u5e01\u672c\u8eab\u7684\u5143\u6570\u636e\uff0c\u800c\u4e0d\u662f\u60a8\u5bf9\u4ee3\u5e01\u7684\u6240\u6709\u6743\uff0c\u800c\u662f\u66f4\u5e7f\u6cdb\u5730\u6d89\u53ca\u4ee3\u5e01\u3002\u5b83\u5177\u6709\u4ee5\u4e0b\u5c5e\u6027\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mint authority")," - \u53ea\u6709\u4e00\u4e2a\u8d26\u6237\u53ef\u4ee5\u4eceMint\u8d26\u6237\u7b7e\u540d\u5e76Mint\u4ee3\u5e01\u3002\u5f53\u60a8\u521b\u5efaMint\u8d26\u6237\u65f6\uff0c\u5fc5\u987b\u6307\u5b9aMint\u6743\u9650\uff0c\u53ef\u4ee5\u662f\u60a8\u7684\u4e2a\u4eba\u94b1\u5305\u6216\u5176\u4ed6\u7a0b\u5e8f\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"supply")," - \u6709\u591a\u5c11\u603b\u4ee3\u5e01\u5b58\u5728\u3002\u4f9b\u5e94\u57fa\u672c\u4e0a\u662f\u5728\u8bf4\uff0c\u201c\u7801\u519c\u5927\u795e\uff0c\u4f60\u597d\uff01\u8fd9\u662f\u53d1\u884c\u7684\u603b\u4ee3\u5e01\u6570\u91cf\u3002\u201d"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"decimals")," - \u5c0f\u6570\u4f4d\u6570\u662f\u6211\u4eec\u5141\u8bb8\u4ee4\u724c\u88ab\u5206\u5272\u6210\u7684\u5c0f\u6570\u4f4d\u6570 - \u6211\u4eec\u4ee4\u724c\u7684\u7cbe\u5ea6\u3002\u8fd9\u53ef\u80fd\u4f1a\u53d8\u5f97\u68d8\u624b\uff0c\u56e0\u4e3a\u5b9e\u9645\u4e0a\u94fe\u4e0a\u6ca1\u6709\u5c0f\u6570\u3002\u4ec0\u4e48\uff1f\u603b\u4f9b\u5e94\u91cf\u8868\u793a\u4e3a\u6574\u6570\uff0c\u6240\u4ee5\u4f60\u5fc5\u987b\u8fdb\u884c\u6570\u5b66\u8ba1\u7b97\u6765\u5728\u5c0f\u6570\u4e4b\u95f4\u8fdb\u884c\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4f60\u5c06\u5c0f\u6570\u4f4d\u6570\u8bbe\u7f6e\u4e3a\u4e24\u4f4d\uff0c\u800c\u4f60\u7684\u4f9b\u5e94\u91cf\u662f\u4e00\u767e\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u4f60\u53ea\u6709\u4e00\u4e2a\u4ee4\u724c\u3002\u4f9b\u5e94\u4e2d\u53ea\u6709\u4e00\u4e2a\u4ee4\u724c\uff0c\u4f46\u4f60\u5141\u8bb8\u5b83\u88ab\u5206\u5272\u6210\u8be5\u4ee4\u724c\u7684\u8f83\u5c0f\u9762\u989d\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Is Initialized")," - \u57fa\u672c\u4e0a\u662f\u6307\u8be5\u8d26\u6237\u662f\u5426\u51c6\u5907\u5c31\u7eea\u3002\u8fd9\u4e0e\u8d26\u6237\u672c\u8eab\u6709\u5173\uff0c\u800c\u4e0d\u662f",(0,o.kt)("inlineCode",{parentName:"li"},"token program"),"\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Freeze authority ")," - \u51bb\u7ed3\u6743\u9650\u7c7b\u4f3c\u4e8e",(0,o.kt)("inlineCode",{parentName:"li"},"Mint\u6743\u9650"),"\uff0c\u610f\u5473\u7740\u4e00\u4e2a\u4eba\u6216\u7a0b\u5e8f\u62e5\u6709\u51bb\u7ed3\uff08\u6216Mint\uff09\u7684\u6743\u9650\u3002")),(0,o.kt)("p",null,"\u5c06Mint\u6743\u9650\u8bbe\u7f6e\u7ed9\u4f60\u7684\u94b1\u5305\u662f\u76f8\u5f53\u6807\u51c6\u7684\u505a\u6cd5\uff0c\u4f60\u53ef\u4ee5Mint\u4efb\u4f55\u4f60\u60f3\u8981\u7684\u4e1c\u897f\uff0c\u7136\u540e\u53d6\u6d88Mint\u6743\u9650\uff0c\u57fa\u672c\u4e0a\u610f\u5473\u7740\u672a\u6765\u4e0d\u4f1a\u518d\u53d1\u884c\u66f4\u591a\u7684\u4f9b\u5e94\u91cf\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u6709\u67d0\u79cd\u52a8\u6001\u53d1\u884c\u4ee3\u5e01\u7684\u65b9\u5f0f\uff0c\u5e38\u89c1\u7684\u505a\u6cd5\u662f\u5c06\u5176\u653e\u5165\u6743\u9650\u4e2d\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u7a0b\u5e8f\u6765\u7ba1\u7406\u4ee3\u5e01\u7684Mint\u3002"),(0,o.kt)("p",null,"\u51bb\u7ed3\u6743\u9650\u7684\u5de5\u4f5c\u65b9\u5f0f\u76f8\u540c\u3002"),(0,o.kt)("h2",{id:"-token-accounts"},"\ud83d\udc5b Token Accounts"),(0,o.kt)("p",null,"\u4f60\u53ef\u80fd\u5df2\u7ecf\u770b\u5230\u4e86\u5927\u91cf\u5728\u751f\u6001\u7cfb\u7edf\u4e2d\u6d41\u901a\u7684\u4e0d\u540c\u4ee3\u5e01\u3002\u4f60\u7684\u94b1\u5305\u73b0\u5728\u53ef\u80fd\u88c5\u6ee1\u4e86\u5404\u79cd\u4e0d\u540c\u7684\u4ee3\u5e01\u3002\u90a3\u4e48\uff0c\u7f51\u7edc\u662f\u5982\u4f55\u77e5\u9053\u4f60\u6301\u6709\u67d0\u4e9b\u4ee3\u5e01\u7684\u5462\uff1f\u4e00\u4e2a\u8d26\u6237\u5b58\u50a8\u7740\u8fd9\u4e9b\u6570\u636e\uff01\u6700\u597d\u7684\u65b9\u5f0f\u662f\u901a\u8fc7\u4e00\u4e2a\u5173\u8054\u7684\u4ee3\u5e01\u8d26\u6237\u6765\u5b9e\u73b0\u3002\u770b\u770b\u5427"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(370).Z,width:"1210",height:"802"})),(0,o.kt)("p",null,"\u8fd9\u662f\u6570\u636e\u5173\u7cfb\u548c\u8d26\u6237\u5c5e\u6027\u7684\u6837\u5b50\u3002"),(0,o.kt)("p",null,"Token\u8d26\u6237\u5fc5\u987b\u4e0e\u7528\u6237\u6216\u94b1\u5305\u5173\u8054\u3002\u4e00\u4e2a\u7b80\u5355\u7684\u65b9\u6cd5\u662f\u521b\u5efa\u4e00\u4e2aPDA\uff0c\u5176\u5730\u5740\u94fe\u63a5\u4e86Mint\u8d26\u6237\u548c\u94b1\u5305\u3002\u4ee4\u724c\u8d26\u6237PDA\u7684\u79cd\u5b50\u662f\u94f8\u5e01\u8d26\u6237\u7684\u5730\u5740\u548c\u94b1\u5305\u5730\u5740\uff08\u4ee4\u724c\u7a0b\u5e8fID\u9ed8\u8ba4\u5b58\u5728\uff09\u3002"),(0,o.kt)("p",null,"\u6709\u5f88\u591a\u4e0d\u540c\u7684\u4fe1\u606f\u5305\u542b\u5728\u5185\uff0c\u4f46\u73b0\u5728\u53ea\u9700\u8981\u77e5\u9053\u4f60\u7684\u94b1\u5305\u5b9e\u9645\u4e0a\u5e76\u4e0d\u6301\u6709\u5177\u4f53\u7684\u4ee3\u5e01\u3002\u5b83\u4e0e\u4f60\u62e5\u6709\u7684\u53e6\u4e00\u4e2a\u8d26\u6237\u76f8\u5173\u8054\uff0c\u8be5\u8d26\u6237\u5b58\u50a8\u4e86\u4ee3\u5e01\u7684\u6570\u91cf\u3002\u53e6\u5916\uff0c\u8fd8\u6709\u4e00\u4e2a\u94f8\u5e01\u8d26\u6237\uff0c\u5b58\u50a8\u4e86\u5173\u4e8e\u6240\u6709\u4ee3\u5e01\u548c\u94f8\u5e01\u7684\u66f4\u5e7f\u6cdb\u4fe1\u606f\u3002"),(0,o.kt)("p",null,"\u82b1\u70b9\u65f6\u95f4\u76ef\u7740\u8fd9\u4e2a\u56fe\u8868\uff0c\u7136\u540e\u641c\u7d22\u4e00\u4e0b\u90a3\u4e9b\u4e0d\u660e\u767d\u7684\u90e8\u5206\uff08\u6bd4\u5982\u5173\u8054\u7684\u4ee4\u724c\u7a0b\u5e8f\u5230\u5e95\u662f\u4ec0\u4e48\u9b3c\uff1f\uff09\u3002\u5728\u5904\u7406\u5b8c\u6240\u6709\u7684\u7e41\u7410\u4e8b\u60c5\u4e4b\u540e\uff0c\u8fd9\u5c31\u5f88\u7b80\u5355\u4e86\uff01"),(0,o.kt)("h2",{id:"-\u4ee3\u5e01mint\u8fc7\u7a0b"},"\ud83e\udd11 \u4ee3\u5e01Mint\u8fc7\u7a0b"),(0,o.kt)("p",null,"\u522b\u518d\u770b\u56fe\u8868\u4e86\uff0c\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e9b\u4ee3\u7801\uff0c\u770b\u770b\u8fd9\u4e00\u5207\u662f\u5982\u4f55\u53d1\u751f\u7684\u3002"),(0,o.kt)("p",null,"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684SPL-Token\uff0c\u9996\u5148\u5fc5\u987b\u521b\u5efa\u4e00\u4e2aToken Mint\uff08\u4fdd\u5b58\u6709\u5173\u8be5\u7279\u5b9a\u4ee3\u5e01\u7684\u6570\u636e\u7684\u8d26\u6237\uff09\u3002"),(0,o.kt)("p",null,"\u628a\u5b83\u60f3\u8c61\u6210\u70e4\u6bd4\u8428\u997c\u3002\u4f60\u9700\u8981\u4e00\u4e2a\u98df\u8c31\uff08\u5173\u4e8e\u4ee3\u5e01\u7684\u6570\u636e\uff09\uff0c\u98df\u6750\uff08\u94f8\u5e01\u8d26\u6237\u548c\u94b1\u5305\u5730\u5740\uff09\uff0c\u4ee5\u53ca\u6709\u4eba\u628a\u5b83\u4eec\u7ec4\u5408\u5728\u4e00\u8d77\uff08\u6d3e\u751f\u4e00\u4e2a\u65b0\u7684PDA\uff09\u3002\u5c31\u50cf\u5236\u4f5c\u6bd4\u8428\u997c\u4e00\u6837\uff0c\u5982\u679c\u4f60\u62e5\u6709\u6240\u6709\u6b63\u786e\u7684\u98df\u6750\u5e76\u6309\u7167\u98df\u8c31\u64cd\u4f5c\uff0c\u6700\u7ec8\u4f60\u5c06\u5f97\u5230\u4e00\u679a\u7f8e\u5473\u7684\u65b0\u4ee3\u5e01\uff01"),(0,o.kt)("p",null,"\u7531\u4e8e\u4ee4\u724c\u8ba1\u5212\u662fSPL\u7684\u4e00\u90e8\u5206\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@solana/spl-token"},(0,o.kt)("inlineCode",{parentName:"a"},"@solana/spl-token"))," TypeScript SDK\u76f8\u5f53\u5bb9\u6613\u5730\u521b\u5efa\u4ea4\u6613\u3002"),(0,o.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u7684\u6837\u5b50\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const tokenMint = await createMint(\n connection,\n payer,\n mintAuthority,\n freezeAuthority,\n decimals,\n)\n")),(0,o.kt)("p",null,"\u4f60\u9700\u8981\u8fd9\u4e9b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ed8\u6b3e\u65b9\u4ea4\u6613\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mintAuthority")," - \u88ab\u6388\u6743Mint\u65b0\u4ee3\u5e01\u7684\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"freezeAuthority")," - \u4e00\u4e2a\u88ab\u6388\u6743\u51bb\u7ed3\u4ee3\u5e01\u7684\u8d26\u6237\u3002\u5982\u679c\u60a8\u4e0d\u60f3\u51bb\u7ed3\u4ee3\u5e01\uff0c\u8bf7\u5c06\u5176\u8bbe\u7f6e\u4e3anull\uff01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"decimals")," - \u6307\u5b9a\u4ee4\u724c\u7684\u6240\u9700\u5c0f\u6570\u7cbe\u5ea6")),(0,o.kt)("p",null,"\u4e00\u65e6\u5b8c\u6210\u8fd9\u4e2a\u6b65\u9aa4\uff0c\u4f60\u5c31\u53ef\u4ee5\u7ee7\u7eed\u4e0b\u4e00\u6b65\u4e86\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u521b\u5efa\u5173\u8054\u7684Token\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},"\u5c06\u4ee3\u5e01Mint\u5230\u4e00\u4e2a\u8d26\u6237\u4e2d"),(0,o.kt)("li",{parentName:"ul"},"\u5982\u679c\u4f60\u60f3\u8981\u4f7f\u7528\u8f6c\u8d26\u529f\u80fd\u8fdb\u884c\u7a7a\u6295\u5230\u591a\u4e2a\u8d26\u6237\uff0c")),(0,o.kt)("p",null,"\u4f60\u9700\u8981\u7684\u4e00\u5207\u90fd\u5728 ",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," SDK\u4e2d\u3002\u5982\u679c\u4f60\u5bf9\u67d0\u4e2a\u5177\u4f53\u90e8\u5206\u611f\u5174\u8da3\uff0c\u53ef\u4ee5\u5728\u8fd9\u91cc",(0,o.kt)("a",{parentName:"p",href:"https://spl.solana.com/token"},"\u67e5\u770b\u6587\u6863"),"\u3002"),(0,o.kt)("p",null,"\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u60a8\u4e0d\u9700\u8981\u81ea\u5df1\u521b\u5efa\u539f\u59cb\u4ea4\u6613\uff0cSDK\u5c31\u8db3\u591f\u4e86\u3002"),(0,o.kt)("p",null,"\u5173\u4e8e\u8fd9\u4e2a\u5f88\u9177\u7684\u9644\u6ce8\u2014\u2014\u5982\u679c\u51fa\u4e8e\u67d0\u79cd\u539f\u56e0\uff0c\u4f60\u60f3\u8981\u5728\u521b\u5efaMint\u6307\u4ee4\u7684\u540c\u65f6\u521b\u5efa\u53e6\u4e00\u4e2a\u6307\u4ee4\uff0c\u4f60\u4f1a\u5e0c\u671b\u81ea\u5df1\u521b\u5efa\u8fd9\u4e9b\u6307\u4ee4\uff0c\u5e76\u5c06\u5b83\u4eec\u6253\u5305\u6210\u4e00\u4e2a\u4e8b\u52a1\uff0c\u4ee5\u786e\u4fdd\u6240\u6709\u64cd\u4f5c\u90fd\u662f\u539f\u5b50\u6027\u7684\u3002\u4e5f\u8bb8\u4f60\u6b63\u5728\u6784\u5efa\u4e00\u4e2a\u8d85\u7ea7\u673a\u5bc6\u7684\u4ee3\u5e01\u7a0b\u5e8f\uff0c\u4f60\u5e0c\u671b\u5728\u94f8\u5e01\u540e\u7acb\u5373\u9501\u5b9a\u6240\u6709\u4ee3\u5e01\uff0c\u800c\u6ca1\u6709\u4eba\u80fd\u591f\u8f6c\u79fb\u5b83\u4eec\u3002"),(0,o.kt)("p",null,"\u4e0d\u7528\u8bf4\uff0c\u8fd9\u4e9b\u4ee3\u5e01\u5468\u56f4\u53d1\u751f\u4e86\u5f88\u591a\u75af\u72c2\u7684\u4e8b\u60c5\u3002\u60a8\u53ef\u4ee5\u5728",(0,o.kt)("a",{parentName:"p",href:"https://www.soldev.app/course/token-program"},"\u8fd9\u91cc"),"\u67e5\u770b\u6bcf\u4e2a\u529f\u80fd\u5728\u5e55\u540e\u53d1\u751f\u7684\u60c5\u51b5\uff0c\u751a\u81f3\u53ef\u4ee5\u67e5\u770b\u4e00\u4e9b\u5173\u4e8e\u9500\u6bc1\u4ee3\u5e01\u4e4b\u7c7b\u7684\u8bf4\u660e\u3002:)"),(0,o.kt)("h2",{id:"reference"},"Reference"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://www.soldev.app/course/token-program"},"Create Tokens With The Token Program"))),(0,o.kt)("hr",null),(0,o.kt)("hr",null),(0,o.kt)("h1",{id:"\u4f7f\u7528token\u7a0b\u5e8f\u521b\u5efa\u4ee4\u724c"},"\u4f7f\u7528Token\u7a0b\u5e8f\u521b\u5efa\u4ee4\u724c"),(0,o.kt)("h2",{id:"\u7b80\u800c\u8a00\u4e4b"},"\u7b80\u800c\u8a00\u4e4b"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"SPL\u4ee3\u5e01\u4ee3\u8868Solana\u7f51\u7edc\u4e0a\u7684\u6240\u6709\u975e\u672c\u5730\u4ee3\u5e01\u3002Solana\u4e0a\u7684\u53ef\u66ff\u4ee3\u548c\u4e0d\u53ef\u66ff\u4ee3\u4ee3\u5e01\uff08NFT\uff09\u90fd\u662fSPL\u4ee3\u5e01\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Token Program"),"\u5305\u542b\u4e86\u521b\u5efa\u548c\u4e0eSPL-Tokens\u8fdb\u884c\u4ea4\u4e92\u7684\u6307\u4ee4"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Token Mints")," \u662f\u6307\u4fdd\u5b58\u7279\u5b9a Token \u6570\u636e\u7684\u8d26\u6237\uff0c\u4f46\u4e0d\u6301\u6709 Tokens"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Token Account"),"\u7528\u4e8e\u6301\u6709\u7279\u5b9aToken Mint\u7684Token"),(0,o.kt)("li",{parentName:"ul"},"\u521b\u5efa\u4ee3\u5e01Mint\u548cToken\u8d26\u6237\u9700\u8981\u5206\u914d SOL \u4f5c\u4e3a\u79df\u91d1\u3002\u4ee3\u5e01\u8d26\u6237\u7684\u79df\u91d1\u5728\u5173\u95ed\u8d26\u6237\u65f6\u53ef\u4ee5\u9000\u8fd8\uff0c\u7136\u800c\uff0c\u76ee\u524d\u65e0\u6cd5\u5173\u95ed\u4ee3\u5e01\u94f8\u5e01\u3002")),(0,o.kt)("h2",{id:"\u6982\u8ff0"},"\u6982\u8ff0"),(0,o.kt)("p",null,"Token\u8ba1\u5212\u662fSolana\u7a0b\u5e8f\u5e93\uff08SPL\uff09\u63d0\u4f9b\u7684\u4f17\u591a\u8ba1\u5212\u4e4b\u4e00\u3002\u5b83\u5305\u542b\u4e86\u521b\u5efa\u548c\u4e0eSPL-Tokens\u8fdb\u884c\u4ea4\u4e92\u7684\u6307\u4ee4\u3002\u8fd9\u4e9b\u4ee3\u5e01\u4ee3\u8868\u4e86Solana\u7f51\u7edc\u4e0a\u7684\u6240\u6709\u975e\u672c\u5730\uff08\u5373\u975eSOL\uff09\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u672c\u8bfe\u7a0b\u5c06\u91cd\u70b9\u4ecb\u7ecd\u4f7f\u7528Token\u7a0b\u5e8f\u521b\u5efa\u548c\u7ba1\u7406\u65b0\u7684SPL-Token\u7684\u57fa\u7840\u77e5\u8bc6"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u7684",(0,o.kt)("inlineCode",{parentName:"li"},"Token Mint")),(0,o.kt)("li",{parentName:"ol"},"\u521b\u5efa",(0,o.kt)("inlineCode",{parentName:"li"},"Token accounts")),(0,o.kt)("li",{parentName:"ol"},"Mint"),(0,o.kt)("li",{parentName:"ol"},"\u5c06\u4ee3\u5e01\u4ece\u4e00\u4e2a\u6301\u6709\u4eba\u8f6c\u79fb\u5230\u53e6\u4e00\u4e2a\u6301\u6709\u4eba"),(0,o.kt)("li",{parentName:"ol"},"\u71c3\u70e7\u4ee3\u5e01")),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u5f00\u53d1\u8fc7\u7a0b\u7684\u5ba2\u6237\u7aef\u89d2\u5ea6\u6765\u5904\u7406\uff0c\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," JavaScript\u5e93\u3002"),(0,o.kt)("h2",{id:"\u4ee3\u5e01\u94f8\u9020"},"\u4ee3\u5e01\u94f8\u9020"),(0,o.kt)("p",null,"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684SPL-Token\uff0c\u9996\u5148\u5fc5\u987b\u521b\u5efa\u4e00\u4e2aToken Mint\u3002Token Mint\u662f\u4fdd\u5b58\u7279\u5b9a\u4ee3\u5e01\u6570\u636e\u7684\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u4ee5USD Coin (USDC)\u5728",(0,o.kt)("a",{parentName:"p",href:"https://solana.fm/address/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v?cluster=mainnet-qn1"},"Solana Explorer"),"\u4e0a\u4e3a\u4f8b\u3002USDC\u7684\u4ee3\u5e01\u94f8\u9020\u5730\u5740\u662f",(0,o.kt)("inlineCode",{parentName:"p"},"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),"\u3002\u901a\u8fc7\u6d4f\u89c8\u5668\uff0c\u6211\u4eec\u53ef\u4ee5\u67e5\u770b\u6709\u5173USDC\u4ee3\u5e01\u94f8\u9020\u7684\u7279\u5b9a\u7ec6\u8282\uff0c\u4f8b\u5982\u4ee3\u5e01\u7684\u5f53\u524d\u4f9b\u5e94\u91cf\u3001\u94f8\u9020\u548c\u51bb\u7ed3\u6743\u9650\u7684\u5730\u5740\uff0c\u4ee5\u53ca\u4ee3\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(6546).Z,width:"2766",height:"1062"})),(0,o.kt)("p",null,"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4ee3\u5e01\u94f8\u9020\uff0c\u60a8\u9700\u8981\u5411\u4ee3\u5e01\u7a0b\u5e8f\u53d1\u9001\u6b63\u786e\u7684\u4ea4\u6613\u6307\u4ee4\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u5c06\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u4e2d\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const tokenMint = await createMint(\n connection,\n payer,\n mintAuthority,\n freezeAuthority,\n decimal\n);\n")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u8fd4\u56de\u65b0",(0,o.kt)("inlineCode",{parentName:"p"},"Token Mint"),"\u7684\u516c\u94a5\u3002\u6b64\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mintAuthority")," - \u6388\u6743\u8fdb\u884c\u4ece",(0,o.kt)("inlineCode",{parentName:"li"},"Token Mint"),"\u4e2d\u5b9e\u9645\u94f8\u9020\u4ee3\u5e01\u7684\u8d26\u6237\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"freezeAuthority")," - \u4e00\u4e2a\u88ab\u6388\u6743\u51bb\u7ed3\u4ee3\u5e01\u8d26\u6237\u7684\u8d26\u6237\u3002\u5982\u679c\u4e0d\u9700\u8981\u51bb\u7ed3\u529f\u80fd\uff0c\u8be5\u53c2\u6570\u53ef\u4ee5\u8bbe\u7f6e\u4e3anull\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"decimals")," - \u6307\u5b9a\u4ee4\u724c\u7684\u6240\u9700\u5c0f\u6570\u7cbe\u5ea6")),(0,o.kt)("p",null,"\u5f53\u4f7f\u7528\u5177\u6709\u8bbf\u95ee\u60a8\u7684\u79d8\u94a5\u6743\u9650\u7684\u811a\u672c\u521b\u5efa\u65b0\u7684\u94f8\u5e01\u65f6\uff0c\u60a8\u53ef\u4ee5\u7b80\u5355\u5730\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u3002\u7136\u800c\uff0c\u5982\u679c\u60a8\u8981\u6784\u5efa\u4e00\u4e2a\u5141\u8bb8\u7528\u6237\u521b\u5efa\u65b0\u7684\u4ee3\u5e01\u94f8\u5e01\u7684\u7f51\u7ad9\uff0c\u60a8\u9700\u8981\u5728\u4e0d\u8ba9\u7528\u6237\u66b4\u9732\u79d8\u94a5\u7ed9\u6d4f\u89c8\u5668\u7684\u60c5\u51b5\u4e0b\u5b8c\u6210\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u60a8\u9700\u8981\u6784\u5efa\u5e76\u63d0\u4ea4\u4e00\u7b14\u5305\u542b\u6b63\u786e\u6307\u4ee4\u7684\u4ea4\u6613\u3002"),(0,o.kt)("p",null,"\u5728\u5185\u90e8\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u53ea\u662f\u521b\u5efa\u4e86\u4e00\u4e2a\u5305\u542b\u4e24\u4e2a\u6307\u4ee4\u7684\u4ea4\u6613\uff1a"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u8d26\u6237"),(0,o.kt)("li",{parentName:"ol"},"\u521d\u59cb\u5316\u4e00\u4e2a\u65b0\u7684Mint")),(0,o.kt)("p",null,"\u8fd9\u5c06\u5982\u4e0b\u6240\u793a\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildCreateMintTransaction(\n connection: web3.Connection,\n payer: web3.PublicKey,\n decimals: number\n): Promise {\n const lamports = await token.getMinimumBalanceForRentExemptMint(connection);\n const accountKeypair = web3.Keypair.generate();\n const programId = token.TOKEN_PROGRAM_ID\n\n const transaction = new web3.Transaction().add(\n web3.SystemProgram.createAccount({\n fromPubkey: payer,\n newAccountPubkey: accountKeypair.publicKey,\n space: token.MINT_SIZE,\n lamports,\n programId,\n }),\n token.createInitializeMintInstruction(\n accountKeypair.publicKey,\n decimals,\n payer,\n payer,\n programId\n )\n );\n\n return transaction\n}\n")),(0,o.kt)("p",null,"\u5728\u624b\u52a8\u6784\u5efa\u521b\u5efa\u65b0\u4ee3\u5e01\u94f8\u9020\u6307\u4ee4\u65f6\uff0c\u8bf7\u786e\u4fdd\u5c06\u521b\u5efa\u8d26\u6237\u548c\u521d\u59cb\u5316\u94f8\u9020\u6307\u4ee4\u6dfb\u52a0\u5230\u540c\u4e00\u7b14\u4ea4\u6613\u4e2d\u3002\u5982\u679c\u60a8\u5c06\u6bcf\u4e2a\u6b65\u9aa4\u5206\u5f00\u8fdb\u884c\u4ea4\u6613\uff0c\u7406\u8bba\u4e0a\u6709\u53ef\u80fd\u8ba9\u5176\u4ed6\u4eba\u63a5\u7ba1\u60a8\u521b\u5efa\u7684\u8d26\u6237\u5e76\u5c06\u5176\u7528\u4e8e\u81ea\u5df1\u7684\u94f8\u9020\u3002"),(0,o.kt)("h2",{id:"\u79df\u91d1\u548c\u79df\u91d1\u8c41\u514d"},"\u79df\u91d1\u548c\u79df\u91d1\u8c41\u514d"),(0,o.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u524d\u9762\u4ee3\u7801\u7247\u6bb5\u7684\u51fd\u6570\u4f53\u4e2d\u7684\u7b2c\u4e00\u884c\u5305\u542b\u5bf9",(0,o.kt)("inlineCode",{parentName:"p"},"getMinimumBalanceForRentExemptMint"),"\u7684\u8c03\u7528\uff0c\u5176\u7ed3\u679c\u4f20\u9012\u7ed9",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u3002\u8fd9\u662f\u8d26\u6237\u521d\u59cb\u5316\u4e2d\u7684\u79df\u91d1\u8c41\u514d\u7684\u4e00\u90e8\u5206\u3002"),(0,o.kt)("p",null,"\u76f4\u5230\u6700\u8fd1\uff0cSolana\u4e0a\u7684\u6240\u6709\u8d26\u6237\u90fd\u9700\u8981\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\u4e4b\u4e00\uff0c\u4ee5\u907f\u514d\u88ab\u89e3\u9664\u5206\u914d\uff1a"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u6309\u7279\u5b9a\u95f4\u9694\u652f\u4ed8\u79df\u91d1"),(0,o.kt)("li",{parentName:"ol"},"\u521d\u59cb\u5316\u65f6\u5b58\u5165\u8db3\u591f\u7684SOL\u4ee5\u88ab\u89c6\u4e3a\u514d\u79df\u91d1")),(0,o.kt)("p",null,"\u6700\u8fd1\uff0c\u7b2c\u4e00\u4e2a\u9009\u9879\u88ab\u53d6\u6d88\u4e86\uff0c\u73b0\u5728\u5728\u521d\u59cb\u5316\u65b0\u8d26\u6237\u65f6\uff0c\u9700\u8981\u5b58\u5165\u8db3\u591f\u7684SOL\u4ee5\u514d\u9664\u79df\u91d1\u3002"),(0,o.kt)("p",null,"\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u6b63\u5728\u4e3a\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d26\u6237\uff0c\u6240\u4ee5\u6211\u4eec\u4f7f\u7528\u4e86 ",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," \u5e93\u4e2d\u7684 ",(0,o.kt)("inlineCode",{parentName:"p"},"getMinimumBalanceForRentExemptMint")," \u65b9\u6cd5\u3002\u7136\u800c\uff0c\u8fd9\u4e2a\u6982\u5ff5\u9002\u7528\u4e8e\u6240\u6709\u8d26\u6237\uff0c\u4f60\u53ef\u4ee5\u5728 Connection \u4e0a\u4f7f\u7528\u66f4\u901a\u7528\u7684 ",(0,o.kt)("inlineCode",{parentName:"p"},"getMinimumBalanceForRentExemption")," \u65b9\u6cd5\u6765\u521b\u5efa\u5176\u4ed6\u53ef\u80fd\u9700\u8981\u7684\u8d26\u6237\u3002"),(0,o.kt)("h2",{id:"\u4ee4\u724c\u8d26\u6237"},"\u4ee4\u724c\u8d26\u6237"),(0,o.kt)("p",null,"\u5728\u60a8\u53ef\u4ee5\u94f8\u9020\u4ee3\u5e01\uff08\u53d1\u884c\u65b0\u4f9b\u5e94\uff09\u4e4b\u524d\uff0c\u60a8\u9700\u8981\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\u6765\u6301\u6709\u65b0\u53d1\u884c\u7684\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\u6301\u6709\u7279\u5b9a\u201c\u94f8\u5e01\u201d\u6240\u53d1\u884c\u7684\u4ee3\u5e01\uff0c\u5e76\u6307\u5b9a\u4e86\u8d26\u6237\u7684\u201c\u6240\u6709\u8005\u201d\u3002\u53ea\u6709\u6240\u6709\u8005\u6709\u6743\u51cf\u5c11\u4ee3\u5e01\u8d26\u6237\u7684\u4f59\u989d\uff08\u8f6c\u8d26\u3001\u9500\u6bc1\u7b49\uff09\uff0c\u800c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u5411\u4ee3\u5e01\u8d26\u6237\u53d1\u9001\u4ee3\u5e01\u4ee5\u589e\u52a0\u5176\u4f59\u989d\u3002"),(0,o.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"spl-token"),"\u5e93\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u6765\u521b\u5efa\u65b0\u7684\u4ee4\u724c\u8d26\u6237\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const tokenAccount = await createAccount(\n connection,\n payer,\n mint,\n owner,\n keypair\n);\n")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u8fd4\u56de\u65b0\u4ee4\u724c\u8d26\u6237\u7684\u516c\u94a5\u3002\u6b64\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mint")," - \u4e0e\u65b0\u4ee3\u5e01\u8d26\u6237\u5173\u8054\u7684\u4ee3\u5e01\u94f8\u5e01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u65b0\u4ee3\u5e01\u8d26\u6237\u7684\u6240\u6709\u8005\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"keypair")," - \u8fd9\u662f\u4e00\u4e2a\u53ef\u9009\u53c2\u6570\uff0c\u7528\u4e8e\u6307\u5b9a\u65b0\u7684\u4ee4\u724c\u8d26\u6237\u5730\u5740\u3002\u5982\u679c\u6ca1\u6709\u63d0\u4f9b",(0,o.kt)("inlineCode",{parentName:"li"},"keypair"),"\uff0c\u5219",(0,o.kt)("inlineCode",{parentName:"li"},"createAccount"),"\u51fd\u6570\u5c06\u9ed8\u8ba4\u4ece\u5173\u8054\u7684\u94f8\u5e01\u548c\u6240\u6709\u8005\u8d26\u6237\u6d3e\u751f\u3002")),(0,o.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u8fd9\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u4e0e\u6211\u4eec\u5728\u67e5\u770b",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u5185\u90e8\u65f6\u6240\u5c55\u793a\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u4e0d\u540c\u3002\u4e4b\u524d\u6211\u4eec\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"SystemProgram"),"\u4e0a\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u6765\u8fd4\u56de\u521b\u5efa\u6240\u6709\u8d26\u6237\u7684\u6307\u4ee4\u3002\u800c\u8fd9\u91cc\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u662f",(0,o.kt)("inlineCode",{parentName:"p"},"spl-token"),"\u5e93\u4e2d\u7684\u4e00\u4e2a\u8f85\u52a9\u51fd\u6570\uff0c\u5b83\u4f1a\u63d0\u4ea4\u4e00\u4e2a\u5305\u542b\u4e24\u4e2a\u6307\u4ee4\u7684\u4ea4\u6613\u3002\u7b2c\u4e00\u4e2a\u6307\u4ee4\u7528\u4e8e\u521b\u5efa\u8d26\u6237\uff0c\u7b2c\u4e8c\u4e2a\u6307\u4ee4\u7528\u4e8e\u5c06\u8d26\u6237\u521d\u59cb\u5316\u4e3a\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u5c31\u50cf\u521b\u5efa\u4e00\u4e2aToken Mint\u4e00\u6837\uff0c\u5982\u679c\u6211\u4eec\u9700\u8981\u624b\u52a8\u6784\u5efa",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u7684\u4ea4\u6613\uff0c\u6211\u4eec\u53ef\u4ee5\u590d\u5236\u51fd\u6570\u5728\u5185\u90e8\u6240\u505a\u7684\u64cd\u4f5c\uff1a"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"getMint"),"\u6765\u68c0\u7d22\u4e0eMint\u76f8\u5173\u7684\u6570\u636e"),(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"getAccountLenForMint"),"\u51fd\u6570\u6765\u8ba1\u7b97\u4ee3\u5e01\u8d26\u6237\u6240\u9700\u7684\u7a7a\u95f4"),(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"getMinimumBalanceForRentExemption"),"\u51fd\u6570\u6765\u8ba1\u7b97\u79df\u91d1\u8c41\u514d\u6240\u9700\u7684Lamports\u6570\u91cf"),(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"SystemProgram.createAccount"),"\u548c",(0,o.kt)("inlineCode",{parentName:"li"},"createInitializeAccountInstruction"),"\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4ea4\u6613\u3002\u8bf7\u6ce8\u610f\uff0c\u8fd9\u91cc\u7684",(0,o.kt)("inlineCode",{parentName:"li"},"createAccount"),"\u662f\u6765\u81ea",(0,o.kt)("inlineCode",{parentName:"li"},"@solana/web3.js"),"\uff0c\u7528\u4e8e\u521b\u5efa\u4e00\u4e2a\u901a\u7528\u7684\u65b0\u8d26\u6237\u3002",(0,o.kt)("inlineCode",{parentName:"li"},"createInitializeAccountInstruction"),"\u4f7f\u7528\u8fd9\u4e2a\u65b0\u8d26\u6237\u6765\u521d\u59cb\u5316\u65b0\u7684\u4ee3\u5e01\u8d26\u6237\u3002")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildCreateTokenAccountTransaction(\n connection: web3.Connection,\n payer: web3.PublicKey,\n mint: web3.PublicKey\n): Promise {\n const mintState = await token.getMint(connection, mint)\n const accountKeypair = await web3.Keypair.generate()\n const space = token.getAccountLenForMint(mintState);\n const lamports = await connection.getMinimumBalanceForRentExemption(space);\n const programId = token.TOKEN_PROGRAM_ID\n\n const transaction = new web3.Transaction().add(\n web3.SystemProgram.createAccount({\n fromPubkey: payer,\n newAccountPubkey: accountKeypair.publicKey,\n space,\n lamports,\n programId,\n }),\n token.createInitializeAccountInstruction(\n accountKeypair.publicKey,\n mint,\n payer,\n programId\n )\n );\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u5173\u8054\u4ee3\u5e01\u8d26\u6237"},"\u5173\u8054\u4ee3\u5e01\u8d26\u6237"),(0,o.kt)("p",null,"\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u662f\u4e00\u79cd\u4f7f\u7528\u6240\u6709\u8005\u7684\u516c\u94a5\u548c\u4ee3\u5e01\u94f8\u5e01\u5730\u5740\u6d3e\u751f\u51fa\u7684\u4ee3\u5e01\u8d26\u6237\u3002\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u63d0\u4f9b\u4e86\u4e00\u79cd\u786e\u5b9a\u6027\u7684\u65b9\u5f0f\uff0c\u7528\u4e8e\u627e\u5230\u7279\u5b9a\u516c\u94a5\u6240\u62e5\u6709\u7684\u7279\u5b9a\u4ee3\u5e01\u94f8\u5e01\u7684\u4ee3\u5e01\u8d26\u6237\u3002\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u521b\u5efa\u4ee3\u5e01\u8d26\u6237\u65f6\uff0c\u60a8\u5e0c\u671b\u5b83\u6210\u4e3a\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u4e0e\u4e0a\u8ff0\u7c7b\u4f3c\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"spl-token"),"\u5e93\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createAssociatedTokenAccount"),"\u51fd\u6570\u521b\u5efa\u4e00\u4e2a\u5173\u8054\u7684\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const associatedTokenAccount = await createAssociatedTokenAccount(\n connection,\n payer,\n mint,\n owner,\n);\n")),(0,o.kt)("p",null,"\u8be5\u51fd\u6570\u8fd4\u56de\u65b0\u5173\u8054\u4ee4\u724c\u8d26\u6237\u7684\u516c\u94a5\uff0c\u5e76\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mint")," - \u4e0e\u65b0\u4ee3\u5e01\u8d26\u6237\u5173\u8054\u7684\u4ee3\u5e01\u94f8\u5e01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u65b0\u4ee3\u5e01\u8d26\u6237\u7684\u6240\u6709\u8005\u8d26\u6237")),(0,o.kt)("p",null,"\u60a8\u8fd8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"getOrCreateAssociatedTokenAccount"),"\u6765\u83b7\u53d6\u4e0e\u7ed9\u5b9a\u5730\u5740\u5173\u8054\u7684Token\u8d26\u6237\uff0c\u5982\u679c\u8be5\u8d26\u6237\u4e0d\u5b58\u5728\uff0c\u5219\u521b\u5efa\u5b83\u3002\u4f8b\u5982\uff0c\u5982\u679c\u60a8\u6b63\u5728\u7f16\u5199\u4ee3\u7801\u5411\u7ed9\u5b9a\u7528\u6237\u7a7a\u6295\u4ee3\u5e01\uff0c\u60a8\u5f88\u53ef\u80fd\u4f1a\u4f7f\u7528\u6b64\u51fd\u6570\u6765\u786e\u4fdd\u4e0e\u7ed9\u5b9a\u7528\u6237\u5173\u8054\u7684Token\u8d26\u6237\u5728\u4e0d\u5b58\u5728\u65f6\u88ab\u521b\u5efa\u3002"),(0,o.kt)("p",null,"\u5728\u5e95\u5c42\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"createAssociatedTokenAccount"),"\u6b63\u5728\u6267\u884c\u4e24\u4e2a\u64cd\u4f5c\uff1a"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,o.kt)("inlineCode",{parentName:"li"},"getAssociatedTokenAddress"),"\u4ece\u94f8\u5e01\u548c\u6240\u6709\u8005\u4e2d\u63a8\u5bfc\u51fa\u5173\u8054\u7684\u4ee3\u5e01\u8d26\u6237\u5730\u5740"),(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"createAssociatedTokenAccountInstruction"),"\u6307\u4ee4\u6784\u5efa\u4ea4\u6613")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildCreateAssociatedTokenAccountTransaction(\n payer: web3.PublicKey,\n mint: web3.PublicKey\n): Promise {\n const associatedTokenAddress = await token.getAssociatedTokenAddress(mint, payer, false);\n\n const transaction = new web3.Transaction().add(\n token.createAssociatedTokenAccountInstruction(\n payer,\n associatedTokenAddress,\n payer,\n mint\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"mint-token"},"Mint token"),(0,o.kt)("p",null,"\u94f8\u5e01\u662f\u5c06\u65b0\u4ee3\u5e01\u53d1\u884c\u5230\u6d41\u901a\u4e2d\u7684\u8fc7\u7a0b\u3002\u5f53\u4f60\u94f8\u9020\u4ee3\u5e01\u65f6\uff0c\u4f60\u589e\u52a0\u4e86\u4ee3\u5e01\u94f8\u9020\u7684\u4f9b\u5e94\uff0c\u5e76\u5c06\u65b0\u94f8\u9020\u7684\u4ee3\u5e01\u5b58\u5165\u4ee3\u5e01\u8d26\u6237\u3002\u53ea\u6709\u4ee3\u5e01\u94f8\u9020\u7684\u94f8\u5e01\u673a\u6784\u624d\u88ab\u5141\u8bb8\u94f8\u9020\u65b0\u7684\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"spl-token"),"\u5e93\u6765\u94f8\u9020\u4ee3\u5e01\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"mintTo"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await mintTo(\n connection,\n payer,\n mint,\n destination,\n authority,\n amount\n);\n")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"mintTo"),"\u51fd\u6570\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684TransactionSignature\u3002mintTo\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"mint")," - \u4e0e\u65b0\u4ee3\u5e01\u8d26\u6237\u5173\u8054\u7684\u4ee3\u5e01\u94f8\u5e01")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"destination")," - \u63a5\u6536\u65b0\u94f8\u9020\u4ee3\u5e01\u7684\u4ee3\u5e01\u8d26\u6237")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"authority")," - \u6388\u6743\u7528\u4e8e\u94f8\u9020\u4ee3\u5e01\u7684\u8d26\u6237")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"amount")," - \u5728\u5c0f\u6570\u70b9\u4e4b\u5916\u94f8\u9020\u7684\u4ee3\u5e01\u7684\u539f\u59cb\u6570\u91cf\uff0c\u4f8b\u5982\uff0c\u5982\u679cScrooge Coin\u7684\u5c0f\u6570\u5c5e\u6027\u8bbe\u7f6e\u4e3a2\uff0c\u5219\u8981\u83b7\u5f971\u4e2a\u5b8c\u6574\u7684Scrooge Coin\uff0c\u60a8\u9700\u8981\u5c06\u6b64\u5c5e\u6027\u8bbe\u7f6e\u4e3a100\u3002"),(0,o.kt)("p",{parentName:"li"},"\u5728\u4ee3\u5e01\u94f8\u9020\u5b8c\u6210\u540e\uff0c\u5c06\u94f8\u5e01\u6743\u9650\u66f4\u65b0\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"null"),"\u5e76\u4e0d\u7f55\u89c1\u3002\u8fd9\u5c06\u8bbe\u5b9a\u6700\u5927\u4f9b\u5e94\u91cf\uff0c\u5e76\u786e\u4fdd\u672a\u6765\u65e0\u6cd5\u518d\u94f8\u9020\u4efb\u4f55\u4ee3\u5e01\u3002\u76f8\u53cd\u5730\uff0c\u53ef\u4ee5\u5c06\u94f8\u5e01\u6743\u9650\u6388\u4e88\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u4ee5\u4fbf\u4ee3\u5e01\u53ef\u4ee5\u6839\u636e\u56fa\u5b9a\u95f4\u9694\u6216\u53ef\u7f16\u7a0b\u6761\u4ef6\u81ea\u52a8\u94f8\u9020\u3002"))),(0,o.kt)("p",null," \u5728\u5185\u90e8\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"mintTo"),"\u51fd\u6570\u53ea\u662f\u4f7f\u7528\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"createMintToInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildMintToTransaction(\n authority: web3.PublicKey,\n mint: web3.PublicKey,\n amount: number,\n destination: web3.PublicKey\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createMintToInstruction(\n mint,\n destination,\n authority,\n amount\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u8f6c\u79fb\u4ee3\u5e01"},"\u8f6c\u79fb\u4ee3\u5e01"),(0,o.kt)("p",null," SPL-Token\u8f6c\u8d26\u9700\u8981\u53d1\u9001\u65b9\u548c\u63a5\u6536\u65b9\u90fd\u62e5\u6709\u76f8\u5e94\u4ee3\u5e01\u7684\u8d26\u6237\u3002\u4ee3\u5e01\u4ece\u53d1\u9001\u65b9\u7684\u8d26\u6237\u8f6c\u79fb\u5230\u63a5\u6536\u65b9\u7684\u8d26\u6237\u3002"),(0,o.kt)("p",null," \u5728\u83b7\u53d6\u63a5\u6536\u8005\u7684\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u65f6\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"getOrCreateAssociatedTokenAccount"),"\u51fd\u6570\u6765\u786e\u4fdd\u5176\u4ee3\u5e01\u8d26\u6237\u5728\u8f6c\u8d26\u4e4b\u524d\u5df2\u5b58\u5728\u3002\u53ea\u9700\u8bb0\u4f4f\uff0c\u5982\u679c\u8d26\u6237\u5c1a\u4e0d\u5b58\u5728\uff0c\u8be5\u51fd\u6570\u5c06\u521b\u5efa\u8be5\u8d26\u6237\uff0c\u5e76\u4e14\u4ea4\u6613\u7684\u4ed8\u6b3e\u65b9\u5c06\u88ab\u6263\u9664\u6240\u9700\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"lamports"),"\u7528\u4e8e\u8d26\u6237\u521b\u5efa\u3002"),(0,o.kt)("p",null," \u4e00\u65e6\u60a8\u77e5\u9053\u63a5\u6536\u8005\u7684\u4ee4\u724c\u8d26\u6237\u5730\u5740\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528spl-token\u5e93\u7684\u8f6c\u8d26\u51fd\u6570\u8fdb\u884c\u4ee4\u724c\u8f6c\u8d26\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await transfer(\n connection,\n payer,\n source,\n destination,\n owner,\n amount\n)\n")),(0,o.kt)("p",null,"\u8f6c\u8d26\u51fd\u6570\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"TransactionSignature"),"\u3002\n\u8f6c\u8d26\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"source")," - \u53d1\u9001\u4ee3\u5e01\u7684\u4ee3\u5e01\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"destination")," - \u63a5\u6536\u4ee3\u5e01\u7684\u4ee3\u5e01\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u53d1\u9001\u4ee3\u5e01\u7684\u4ee3\u5e01\u8d26\u6237\u7684\u6240\u6709\u8005"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"amount")," - \u8981\u8f6c\u79fb\u7684\u4ee3\u5e01\u7684\u6570\u91cf")),(0,o.kt)("p",null,"\u5728\u5e95\u5c42\uff0c\u8f6c\u8d26\u51fd\u6570\u53ea\u662f\u6839\u636e\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"createTransferInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildTransferTransaction(\n source: web3.PublicKey,\n destination: web3.PublicKey,\n owner: web3.PublicKey,\n amount: number\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createTransferInstruction(\n source,\n destination,\n owner,\n amount,\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u71c3\u70e7\u4ee3\u5e01"},"\u71c3\u70e7\u4ee3\u5e01"),(0,o.kt)("p",null,"\u71c3\u70e7\u4ee3\u5e01\u662f\u51cf\u5c11\u7279\u5b9a\u4ee3\u5e01\u53d1\u884c\u91cf\u7684\u8fc7\u7a0b\u3002\u71c3\u70e7\u4ee3\u5e01\u4f1a\u5c06\u5176\u4ece\u7279\u5b9a\u4ee3\u5e01\u8d26\u6237\u548c\u66f4\u5e7f\u6cdb\u7684\u6d41\u901a\u4e2d\u79fb\u9664\u3002"),(0,o.kt)("p",null,"\u4f7f\u7528spl-token\u5e93\u70e7\u6bc1\u4ee3\u5e01\u65f6\uff0c\u60a8\u9700\u8981\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await burn(\n connection,\n payer,\n account,\n mint,\n owner,\n amount\n)\n")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"TransactionSignature"),"\u3002",(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"account")," - \u8981\u71c3\u70e7\u7684\u4ee3\u5e01\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mint")," - \u4e0e\u4ee3\u5e01\u8d26\u6237\u5173\u8054\u7684\u4ee3\u5e01\u94f8\u5e01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u4ee3\u5e01\u8d26\u6237\u7684\u6240\u6709\u8005"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"amount")," - \u8981\u71c3\u70e7\u7684\u4ee3\u5e01\u7684\u6570\u91cf")),(0,o.kt)("p",null,"\u5728\u5185\u90e8\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"createBurnInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e86\u4e00\u4e2a\u4ea4\u6613\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildBurnTransaction(\n account: web3.PublicKey,\n mint: web3.PublicKey,\n owner: web3.PublicKey,\n amount: number\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createBurnInstruction(\n account,\n mint,\n owner,\n amount\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u6279\u51c6\u59d4\u6d3e"},"\u6279\u51c6\u59d4\u6d3e"),(0,o.kt)("p",null,"\u6279\u51c6\u59d4\u6258\u662f\u6388\u6743\u53e6\u4e00\u4e2a\u8d26\u6237\u4ece\u4ee3\u5e01\u8d26\u6237\u4e2d\u8f6c\u79fb\u6216\u9500\u6bc1\u4ee3\u5e01\u7684\u8fc7\u7a0b\u3002\u4f7f\u7528\u59d4\u6258\u65f6\uff0c\u5bf9\u4ee3\u5e01\u8d26\u6237\u7684\u63a7\u5236\u6743\u4ecd\u5f52\u539f\u59cb\u6240\u6709\u8005\u6240\u6709\u3002\u59d4\u6258\u8d26\u6237\u53ef\u4ee5\u5728\u539f\u59cb\u6240\u6709\u8005\u6279\u51c6\u59d4\u6258\u65f6\u6307\u5b9a\u53ef\u8f6c\u79fb\u6216\u9500\u6bc1\u7684\u4ee3\u5e01\u6700\u5927\u6570\u91cf\u3002\u8bf7\u6ce8\u610f\uff0c\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\u5728\u4efb\u4f55\u7ed9\u5b9a\u65f6\u95f4\u53ea\u80fd\u5173\u8054\u4e00\u4e2a\u59d4\u6258\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u4f7f\u7528spl-token\u5e93\u6765\u6279\u51c6\u59d4\u6258\u4eba\uff0c\u60a8\u9700\u8981\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"approve"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await approve(\n connection,\n payer,\n account,\n delegate,\n owner,\n amount\n )\n")),(0,o.kt)("p",null,"\u6279\u51c6\u529f\u80fd\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"TransactionSignature"),"\u3002\u6279\u51c6\u529f\u80fd\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u652f\u4ed8\u4eba\u7684\u8d26\u6237\u7528\u4e8e\u4ea4\u6613"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"account")," - \u8003\u8651\u5c06\u4ee3\u5e01\u4ece\u4ee4\u724c\u8d26\u6237\u59d4\u6258\u51fa\u53bb"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"delegate")," - \u59d4\u6258\u8d26\u6237\u7684\u6240\u6709\u8005\u6388\u6743\u8f6c\u79fb\u6216\u9500\u6bc1\u4ee3\u5e01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u8d26\u6237\u7684\u6240\u6709\u8005\u4ee4\u724c\u8d26\u6237\u7684\u6240\u6709\u8005"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"amount")," - \u59d4\u6258\u8d26\u6237\u53ef\u4ee5\u8f6c\u79fb\u6216\u9500\u6bc1\u7684\u4ee3\u5e01\u7684\u6700\u5927\u6570\u91cf")),(0,o.kt)("p",null,"\u5728\u5185\u90e8\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"approve"),"\u51fd\u6570\u4f7f\u7528\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"createApproveInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildApproveTransaction(\n account: web3.PublicKey,\n delegate: web3.PublicKey,\n owner: web3.PublicKey,\n amount: number\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createApproveInstruction(\n account,\n delegate,\n owner,\n amount\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u64a4\u9500\u59d4\u6258"},"\u64a4\u9500\u59d4\u6258"),(0,o.kt)("p",null,"\u4e4b\u524d\u5df2\u6279\u51c6\u7684\u4ee3\u8868\u4ee4\u724c\u8d26\u6237\u7684\u59d4\u6258\u53ef\u4ee5\u88ab\u64a4\u9500\u3002\u4e00\u65e6\u59d4\u6258\u88ab\u64a4\u9500\uff0c\u59d4\u6258\u4eba\u5c06\u65e0\u6cd5\u518d\u4ece\u6240\u6709\u8005\u7684\u4ee4\u724c\u8d26\u6237\u4e2d\u8f6c\u79fb\u4ee4\u724c\u3002\u4e4b\u524d\u6279\u51c6\u7684\u5269\u4f59\u91d1\u989d\u4e5f\u65e0\u6cd5\u518d\u7531\u59d4\u6258\u4eba\u8fdb\u884c\u8f6c\u79fb\u3002"),(0,o.kt)("p",null,"\u4f7f\u7528spl-token\u5e93\u64a4\u9500\u59d4\u6258\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"revoke"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await revoke(\n connection,\n payer,\n account,\n owner,\n )\n")),(0,o.kt)("p",null,"\u64a4\u9500\u51fd\u6570\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"TransactionSignature"),"\u3002\u64a4\u9500\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"account")," - \u64a4\u9500\u4ee3\u8868\u6743\u9650\u7684\u4ee4\u724c\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u4ee4\u724c\u8d26\u6237\u7684\u6240\u6709\u8005")),(0,o.kt)("p",null,"\u5728\u5e95\u5c42\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"revoke"),"\u51fd\u6570\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"createRevokeInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e86\u4e00\u4e2a\u4ea4\u6613\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildRevokeTransaction(\n account: web3.PublicKey,\n owner: web3.PublicKey,\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createRevokeInstruction(\n account,\n owner,\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u6f14\u793a"},"\u6f14\u793a"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u4e0eToken\u7a0b\u5e8f\u4e0a\u7684\u6307\u4ee4\u8fdb\u884c\u4ea4\u4e92\u7684\u811a\u672c\u3002\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2aToken\u94f8\u9020\u5382\uff0c\u521b\u5efaToken\u8d26\u6237\uff0c\u94f8\u9020\u4ee3\u5e01\uff0c\u6279\u51c6\u59d4\u6258\u4eba\uff0c\u8f6c\u79fb\u4ee3\u5e01\uff0c\u5e76\u9500\u6bc1\u4ee3\u5e01\u3002"),(0,o.kt)("h3",{id:"1-\u57fa\u672c\u811a\u624b\u67b6"},"1. \u57fa\u672c\u811a\u624b\u67b6"),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u4ece\u4e00\u4e9b\u57fa\u672c\u7684\u811a\u624b\u67b6\u5f00\u59cb\u3002\u60a8\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u9700\u8981\u8bbe\u7f6e\u9879\u76ee\uff0c\u4f46\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u4e2a\u7b80\u5355\u7684TypeScript\u9879\u76ee\uff0c\u5e76\u4f9d\u8d56\u4e8e",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/web3.js"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u5305\u3002"),(0,o.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728\u547d\u4ee4\u884c\u4e2d\u4f7f\u7528 ",(0,o.kt)("inlineCode",{parentName:"p"},"npx create-solana-client [INSERT_NAME_HERE] --initialize-keypair")," \u547d\u4ee4\u6765\u514b\u9686\u6211\u4eec\u5c06\u8981\u5f00\u59cb\u7684",(0,o.kt)("a",{parentName:"p",href:"https://github.com/Unboxed-Software/solana-npx-client-template/tree/with-keypair-env"},"\u6a21\u677f"),"\u3002\u6216\u8005\u60a8\u4e5f\u53ef\u4ee5\u624b\u52a8\u5728\u6b64\u5904\u514b\u9686\u6a21\u677f\u3002\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u60a8\u76f4\u63a5\u4f7f\u7528 git \u4ed3\u5e93\u4f5c\u4e3a\u8d77\u70b9\uff0c\u6211\u4eec\u5c06\u4ece ",(0,o.kt)("inlineCode",{parentName:"p"},"with-keypair-env")," \u5206\u652f\u5f00\u59cb\u3002"),(0,o.kt)("p",null,"\u7136\u540e\uff0c\u60a8\u9700\u8981\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u4e0a\u6dfb\u52a0\u4e00\u4e2a\u4f9d\u8d56\u9879\u3002\u4ece\u65b0\u521b\u5efa\u7684\u76ee\u5f55\u4e2d\u7684\u547d\u4ee4\u884c\u4e2d\uff0c\u4f7f\u7528\u547d\u4ee4",(0,o.kt)("inlineCode",{parentName:"p"},"npm install @solana/spl-token"),"\u3002"),(0,o.kt)("h3",{id:"2-\u521b\u5efatoken-mint"},"2. \u521b\u5efaToken Mint"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u5e93\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u4ece\u6587\u4ef6\u9876\u90e8\u5bfc\u5165\u5b83\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as token from '@solana/spl-token'\n")),(0,o.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u58f0\u660e\u4e00\u4e2a\u540d\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"createNewMint"),"\u7684\u65b0\u51fd\u6570\uff0c\u5b83\u5e26\u6709\u53c2\u6570",(0,o.kt)("inlineCode",{parentName:"p"},"connection"),"\u3001",(0,o.kt)("inlineCode",{parentName:"p"},"payer"),"\u3001",(0,o.kt)("inlineCode",{parentName:"p"},"mintAuthority"),"\u3001",(0,o.kt)("inlineCode",{parentName:"p"},"freezeAuthority"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"decimals"),"\u3002"),(0,o.kt)("p",null,"\u5728\u51fd\u6570Import\u7684\u4e3b\u4f53\u4e2d\uff0c\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u4e2d\u521b\u5efa",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\uff0c\u7136\u540e\u521b\u5efa\u4e00\u4e2a\u8c03\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u7684\u51fd\u6570"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function createNewMint(\n connection: web3.Connection,\n payer: web3.Keypair,\n mintAuthority: web3.PublicKey,\n freezeAuthority: web3.PublicKey,\n decimals: number\n): Promise {\n\n const tokenMint = await token.createMint(\n connection,\n payer,\n mintAuthority,\n freezeAuthority,\n decimals\n );\n\n console.log(\n `Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`\n );\n\n return tokenMint;\n}\n")),(0,o.kt)("p",null,"\u5b8c\u6210\u8be5\u529f\u80fd\u540e\uff0c\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"main"),"\u51fd\u6570\u7684\u4e3b\u4f53\u4e2d\u8c03\u7528\u5b83\uff0c\u5c06",(0,o.kt)("inlineCode",{parentName:"p"},"user"),"\u8bbe\u7f6e\u4e3a\u4ed8\u6b3e\u65b9\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"mintAuthority"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"freezeAuthority"),"\u3002"),(0,o.kt)("p",null,"\u521b\u5efa\u65b0\u7684\u94f8\u5e01\u540e\uff0c\u8ba9\u6211\u4eec\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"getMint"),"\u51fd\u6570\u83b7\u53d6\u8d26\u6237\u6570\u636e\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728\u540d\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"mintInfo"),"\u7684\u53d8\u91cf\u4e2d\u3002\u7a0d\u540e\u6211\u4eec\u5c06\u4f7f\u7528\u8fd9\u4e9b\u6570\u636e\u6765\u8c03\u6574\u94f8\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n}\n')),(0,o.kt)("h3",{id:"3-\u521b\u5efa\u4ee4\u724c\u8d26\u6237"},"3. \u521b\u5efa\u4ee4\u724c\u8d26\u6237"),(0,o.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u521b\u5efa\u4e86\u94f8\u5e01\u673a\u6784\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4ee3\u5e01\u8d26\u6237\uff0c\u6307\u5b9a\u7528\u6237\u4e3a\u6240\u6709\u8005\u3002"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Token\u8d26\u6237\uff0c\u5e76\u53ef\u4ee5\u9009\u62e9\u6307\u5b9aToken\u8d26\u6237\u7684\u5730\u5740\u3002\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u6ca1\u6709\u63d0\u4f9b\u5730\u5740\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u5c06\u9ed8\u8ba4\u4f7f\u7528\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"mint"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"owner"),"\u6d3e\u751f\u7684\u5173\u8054Token\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u53e6\u5916\uff0c\u51fd\u6570",(0,o.kt)("inlineCode",{parentName:"p"},"createAssociatedTokenAccount"),"\u4e5f\u4f1a\u6839\u636e\u4ee3\u5e01\u548c\u6240\u6709\u8005\u7684\u516c\u94a5\u6d3e\u751f\u51fa\u76f8\u540c\u5730\u5740\u7684\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u4e3a\u4e86\u8fdb\u884c\u6f14\u793a\uff0c\u6211\u4eec\u5c06\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"thegetOrCreateAssociatedTokenAccount"),"\u51fd\u6570\u6765\u521b\u5efa\u6211\u4eec\u7684\u4ee3\u5e01\u8d26\u6237\u3002\u5982\u679c\u8be5\u51fd\u6570\u5df2\u5b58\u5728\uff0c\u5219\u83b7\u53d6\u4ee3\u5e01\u8d26\u6237\u7684\u5730\u5740\u3002\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u5219\u5728\u9002\u5f53\u7684\u5730\u5740\u4e0a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function createTokenAccount(\n connection: web3.Connection,\n payer: web3.Keypair,\n mint: web3.PublicKey,\n owner: web3.PublicKey\n) {\n const tokenAccount = await token.getOrCreateAssociatedTokenAccount(\n connection,\n payer,\n mint,\n owner\n )\n\n console.log(\n `Token Account: https://explorer.solana.com/address/${tokenAccount.address}?cluster=devnet`\n )\n\n return tokenAccount\n}\n")),(0,o.kt)("p",null,"\u5728\u4e3b\u51fd\u6570\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u8c03\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"createTokenAccount"),"\u7684\u8bed\u53e5\uff0c\u5c06\u4e4b\u524d\u521b\u5efa\u7684\u8d27\u5e01\u4f20\u9012\u8fdb\u53bb\uff0c\u5e76\u5c06\u7528\u6237\u8bbe\u7f6e\u4e3a\u652f\u4ed8\u8005\u548c\u6240\u6709\u8005\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n}\n')),(0,o.kt)("h3",{id:"4-mint-token"},"4. Mint token"),(0,o.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u6709\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u548c\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\uff0c\u8ba9\u6211\u4eec\u5c06\u4ee3\u5e01\u94f8\u9020\u5230\u4ee3\u5e01\u8d26\u6237\u4e2d\u3002\u8bf7\u6ce8\u610f\uff0c\u53ea\u6709\u94f8\u5e01\u6388\u6743\u8005\u624d\u80fd\u5c06\u65b0\u7684\u4ee3\u5e01\u94f8\u9020\u5230\u4ee3\u5e01\u8d26\u6237\u4e2d\u3002\u56de\u60f3\u4e00\u4e0b\uff0c\u6211\u4eec\u5c06\u7528\u6237\u8bbe\u7f6e\u4e3a\u6211\u4eec\u521b\u5efa\u7684\u4ee3\u5e01\u7684\u94f8\u5e01\u6388\u6743\u8005\u3002"),(0,o.kt)("p",null,"\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"mintTokens"),"\u7684\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u4f7f\u7528spl-token\u51fd\u6570",(0,o.kt)("inlineCode",{parentName:"p"},"mintTo"),"\u6765\u94f8\u9020\u4ee3\u5e01\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function mintTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n mint: web3.PublicKey,\n destination: web3.PublicKey,\n authority: web3.Keypair,\n amount: number\n) {\n const transactionSignature = await token.mintTo(\n connection,\n payer,\n mint,\n destination,\n authority,\n amount\n )\n\n console.log(\n `Mint Token Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u5728\u4e3b\u51fd\u6570\u4e2d\u4f7f\u7528\u4e4b\u524d\u521b\u5efa\u7684 ",(0,o.kt)("inlineCode",{parentName:"p"},"mint")," \u548c ",(0,o.kt)("inlineCode",{parentName:"p"},"tokenAccount")," \u6765\u8c03\u7528\u8be5\u51fd\u6570\u3002"),(0,o.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u6211\u4eec\u9700\u8981\u6839\u636e\u94f8\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u8c03\u6574\u8f93\u5165\u91d1\u989d\u3002\u6211\u4eec\u7684\u94f8\u5e01\u4ee3\u5e01\u5177\u67092\u4f4d\u5c0f\u6570\u7cbe\u5ea6\u3002\u5982\u679c\u6211\u4eec\u53ea\u6307\u5b9a100\u4f5c\u4e3a\u8f93\u5165\u91d1\u989d\uff0c\u90a3\u4e48\u53ea\u4f1a\u94f8\u90201\u4e2a\u4ee3\u5e01\u5230\u6211\u4eec\u7684\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n}\n')),(0,o.kt)("h3",{id:"5-\u6279\u51c6\u59d4\u6d3e"},"5. \u6279\u51c6\u59d4\u6d3e"),(0,o.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u6709\u4e86\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u548c\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\uff0c\u8ba9\u6211\u4eec\u6388\u6743\u4e00\u4e2a\u4ee3\u8868\u6765\u4ee3\u8868\u6211\u4eec\u8f6c\u79fb\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"approveDelegate"),"\u7684\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u4f7f\u7528spl-token\u51fd\u6570",(0,o.kt)("inlineCode",{parentName:"p"},"approve"),"\u6765\u94f8\u9020\u4ee3\u5e01\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function approveDelegate(\n connection: web3.Connection,\n payer: web3.Keypair,\n account: web3.PublicKey,\n delegate: web3.PublicKey,\n owner: web3.Signer | web3.PublicKey,\n amount: number\n) {\n const transactionSignature = await token.approve(\n connection,\n payer,\n account,\n delegate,\n owner,\n amount\n )\n\n console.log(\n `Approve Delegate Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u9996\u5148\uff0c\u5728\u4e3b\u51fd\u6570\u4e2d\uff0c\u8ba9\u6211\u4eec\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9\u6765\u4ee3\u8868\u59d4\u6258\u8d26\u6237\u3002\u7136\u540e\uff0c\u8ba9\u6211\u4eec\u8c03\u7528\u6211\u4eec\u7684\u65b0",(0,o.kt)("inlineCode",{parentName:"p"},"approveDelegate"),"\u51fd\u6570\uff0c\u5e76\u6388\u6743\u59d4\u6258\u8d26\u6237\u4ece\u7528\u6237\u4ee3\u5e01\u8d26\u6237\u4e2d\u8f6c\u79fb\u6700\u591a50\u4e2a\u4ee3\u5e01\u3002\u8bb0\u5f97\u6839\u636e\u4ee3\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u8c03\u6574\u91d1\u989d\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n\n const delegate = web3.Keypair.generate();\n\n await approveDelegate(\n connection,\n user,\n tokenAccount.address,\n delegate.publicKey,\n user.publicKey,\n 50 * 10 ** mintInfo.decimals\n )\n}\n')),(0,o.kt)("h3",{id:"6-\u8f6c\u79fb\u4ee3\u5e01"},"6. \u8f6c\u79fb\u4ee3\u5e01"),(0,o.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u8ba9\u6211\u4eec\u4f7f\u7528spl-token\u5e93\u7684\u8f6c\u8d26\u529f\u80fd\uff0c\u8f6c\u79fb\u4e00\u4e9b\u521a\u521a\u94f8\u9020\u7684\u4ee3\u5e01\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function transferTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n source: web3.PublicKey,\n destination: web3.PublicKey,\n owner: web3.Keypair,\n amount: number\n) {\n const transactionSignature = await token.transfer(\n connection,\n payer,\n source,\n destination,\n owner,\n amount\n )\n\n console.log(\n `Transfer Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u5728\u6211\u4eec\u8c03\u7528\u8fd9\u4e2a\u65b0\u529f\u80fd\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u77e5\u9053\u5c06\u8981\u8f6c\u79fb\u4ee3\u5e01\u7684\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u5728\u4e3b\u51fd\u6570\u4e2d\uff0c\u8ba9\u6211\u4eec\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9\u4f5c\u4e3a\u63a5\u6536\u8005\uff08\u4f46\u8bf7\u8bb0\u4f4f\uff0c\u8fd9\u53ea\u662f\u6a21\u62df\u6709\u4eba\u53ef\u4ee5\u53d1\u9001\u4ee3\u5e01\u7ed9\u7684\u60c5\u51b5 - \u5728\u771f\u5b9e\u5e94\u7528\u4e2d\uff0c\u60a8\u9700\u8981\u77e5\u9053\u63a5\u6536\u4ee3\u5e01\u7684\u4eba\u7684\u94b1\u5305\u5730\u5740\uff09\u3002"),(0,o.kt)("p",null,"\u7136\u540e\uff0c\u4e3a\u63a5\u6536\u8005\u521b\u5efa\u4e00\u4e2a\u4ee4\u724c\u8d26\u6237\u3002\u6700\u540e\uff0c\u8ba9\u6211\u4eec\u8c03\u7528\u6211\u4eec\u7684\u65b0\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"transferTokens"),"\u51fd\u6570\uff0c\u5c06\u4ee4\u724c\u4ece\u7528\u6237\u4ee4\u724c\u8d26\u6237\u8f6c\u79fb\u5230\u63a5\u6536\u8005\u4ee4\u724c\u8d26\u6237\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u5728\u524d\u4e00\u6b65\u4e2d\u6279\u51c6\u7684\u59d4\u6258\u6765\u4ee3\u8868\u6211\u4eec\u6267\u884c\u8f6c\u8d26\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n\n const receiver = web3.Keypair.generate().publicKey\n const receiverTokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n receiver\n )\n\n const delegate = web3.Keypair.generate();\n await approveDelegate(\n connection,\n user,\n tokenAccount.address,\n delegate.publicKey,\n user.publicKey,\n 50 * 10 ** mintInfo.decimals\n )\n\n await transferTokens(\n connection,\n user,\n tokenAccount.address,\n receiverTokenAccount.address,\n delegate,\n 50 * 10 ** mintInfo.decimals\n )\n}\n')),(0,o.kt)("h3",{id:"7-\u64a4\u9500\u59d4\u6258"},"7. \u64a4\u9500\u59d4\u6258"),(0,o.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u4ee3\u5e01\u7684\u8f6c\u79fb\uff0c\u8ba9\u6211\u4eec\u4f7f\u7528spl-token\u5e93\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"revoke"),"\u51fd\u6570\u6765\u64a4\u9500\u59d4\u6258\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function revokeDelegate(\n connection: web3.Connection,\n payer: web3.Keypair,\n account: web3.PublicKey,\n owner: web3.Signer | web3.PublicKey,\n) {\n const transactionSignature = await token.revoke(\n connection,\n payer,\n account,\n owner,\n )\n\n console.log(\n `Revote Delegate Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u64a4\u9500\u5c06\u4f1a\u5c06\u4ee3\u5e01\u8d26\u6237\u7684\u59d4\u6258\u8bbe\u7f6e\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"null"),"\uff0c\u5e76\u5c06\u59d4\u6258\u6570\u91cf\u91cd\u7f6e\u4e3a0\u3002\u6211\u4eec\u53ea\u9700\u8981\u4ee3\u5e01\u8d26\u6237\u548c\u7528\u6237\u6765\u6267\u884c\u8fd9\u4e2a\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u8c03\u7528\u6211\u4eec\u7684\u65b0",(0,o.kt)("inlineCode",{parentName:"p"},"revokeDelegate"),"\u51fd\u6570\u6765\u4ece\u7528\u6237\u7684\u4ee3\u5e01\u8d26\u6237\u4e2d\u64a4\u9500\u59d4\u6258\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n\n const receiver = web3.Keypair.generate().publicKey\n const receiverTokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n receiver\n )\n\n const delegate = web3.Keypair.generate();\n await approveDelegate(\n connection,\n user,\n tokenAccount.address,\n delegate.publicKey,\n user.publicKey,\n 50 * 10 ** mintInfo.decimals\n )\n\n await transferTokens(\n connection,\n user,\n tokenAccount.address,\n receiverTokenAccount.address,\n delegate,\n 50 * 10 ** mintInfo.decimals\n )\n\n await revokeDelegate(\n connection,\n user,\n tokenAccount.address,\n user.publicKey,\n )\n}\n')),(0,o.kt)("h3",{id:"8-\u71c3\u70e7\u4ee3\u5e01"},"8. \u71c3\u70e7\u4ee3\u5e01"),(0,o.kt)("p",null,"\u6700\u540e\uff0c\u8ba9\u6211\u4eec\u901a\u8fc7\u9500\u6bc1\u4e00\u4e9b\u4ee3\u5e01\u6765\u51cf\u5c11\u6d41\u901a\u91cf\u3002"),(0,o.kt)("p",null,"\u521b\u5efa\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"burnTokens"),"\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u4f7f\u7528spl-token\u5e93\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u5c06\u60a8\u7684\u4ee3\u5e01\u4f9b\u5e94\u91cf\u51cf\u5c11\u4e00\u534a\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function burnTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n account: web3.PublicKey,\n mint: web3.PublicKey,\n owner: web3.Keypair,\n amount: number\n) {\n const transactionSignature = await token.burn(\n connection,\n payer,\n account,\n mint,\n owner,\n amount\n )\n\n console.log(\n `Burn Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u73b0\u5728\u5728\u4e3b\u51fd\u6570\u4e2d\u8c03\u7528\u8fd9\u4e2a\u65b0\u51fd\u6570\uff0c\u70e7\u6389\u7528\u6237\u4ee3\u5e01\u4e2d\u768425\u4e2a\u3002\u8bb0\u5f97\u6839\u636e\u94f8\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u8c03\u6574\u6570\u91cf\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n\n const receiver = web3.Keypair.generate().publicKey\n const receiverTokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n receiver\n )\n\n const delegate = web3.Keypair.generate();\n await approveDelegate(\n connection,\n user,\n tokenAccount.address,\n delegate.publicKey,\n user.publicKey,\n 50 * 10 ** mintInfo.decimals\n )\n\n await transferTokens(\n connection,\n user,\n tokenAccount.address,\n receiverTokenAccount.address,\n delegate,\n 50 * 10 ** mintInfo.decimals\n )\n\n await revokeDelegate(\n connection,\n user,\n tokenAccount.address,\n user.publicKey,\n )\n\n await burnTokens(\n connection,\n user,\n tokenAccount.address,\n mint, user,\n 25 * 10 ** mintInfo.decimals\n )\n}\n')),(0,o.kt)("h3",{id:"9-\u5168\u90e8\u6d4b\u8bd5\u4e00\u4e0b"},"9. \u5168\u90e8\u6d4b\u8bd5\u4e00\u4e0b"),(0,o.kt)("p",null,"\u6709\u4e86\u8fd9\u4e9b\uff0c\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"npm start"),"\u3002\u60a8\u5e94\u8be5\u5728\u63a7\u5236\u53f0\u4e0a\u770b\u5230\u4e00\u7cfb\u5217Solana Explorer\u94fe\u63a5\u7684\u65e5\u5fd7\u3002\u70b9\u51fb\u5b83\u4eec\uff0c\u770b\u770b\u6bcf\u4e2a\u6b65\u9aa4\u53d1\u751f\u4e86\u4ec0\u4e48\uff01\u60a8\u521b\u5efa\u4e86\u4e00\u4e2a\u65b0\u7684\u4ee3\u5e01\u94f8\u9020\uff0c\u521b\u5efa\u4e86\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\uff0c\u94f8\u9020\u4e86100\u4e2a\u4ee3\u5e01\uff0c\u6279\u51c6\u4e86\u4e00\u4e2a\u59d4\u6258\u4eba\uff0c\u4f7f\u7528\u59d4\u6258\u4eba\u8f6c\u79fb\u4e8650\u4e2a\u4ee3\u5e01\uff0c\u64a4\u9500\u4e86\u59d4\u6258\u4eba\uff0c\u5e76\u70e7\u6bc1\u4e86\u53e6\u591625\u4e2a\u4ee3\u5e01\u3002\u60a8\u6b63\u5728\u6210\u4e3a\u4e00\u4e2a\u4ee3\u5e01\u4e13\u5bb6\u7684\u9053\u8def\u4e0a\u8fdb\u5c55\u987a\u5229\u3002"),(0,o.kt)("p",null,"\u5982\u679c\u4f60\u9700\u8981\u66f4\u591a\u65f6\u95f4\u6765\u5b8c\u6210\u8fd9\u4e2a\u9879\u76ee\u5e76\u611f\u5230\u8212\u9002\uff0c\u53ef\u4ee5\u67e5\u770b\u5b8c\u6574\u7684",(0,o.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-token-client"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801")),(0,o.kt)("h2",{id:"\u6311\u6218"},"\u6311\u6218"),(0,o.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u5efa\u7acb\u4e00\u4e9b\u4e1c\u897f\u4e86\u3002\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff0c\u5141\u8bb8\u7528\u6237\u521b\u5efa\u65b0\u7684\u94f8\u5e01\u3001\u521b\u5efa\u4ee3\u5e01\u8d26\u6237\u5e76\u94f8\u9020\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u60a8\u5c06\u65e0\u6cd5\u76f4\u63a5\u4f7f\u7528\u6211\u4eec\u5728\u6f14\u793a\u4e2d\u4ecb\u7ecd\u7684\u8f85\u52a9\u529f\u80fd\u3002\u4e3a\u4e86\u4f7f\u7528Phantom\u94b1\u5305\u9002\u914d\u5668\u4e0eToken\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\uff0c\u60a8\u9700\u8981\u624b\u52a8\u6784\u5efa\u6bcf\u4e2a\u4ea4\u6613\u5e76\u5c06\u4ea4\u6613\u63d0\u4ea4\u7ed9Phantom\u8fdb\u884c\u6279\u51c6\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(4929).Z,width:"2560",height:"1440"})),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"\u4f60\u53ef\u4ee5\u4ece\u96f6\u5f00\u59cb\u6784\u5efa\u8fd9\u4e2a\u9879\u76ee\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u5728\u8fd9\u91cc\u4e0b\u8f7d",(0,o.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-token-frontend/tree/starter"},"\u8d77\u59cb\u4ee3\u7801"),"\u3002")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"CreateMint"),"\u7ec4\u4ef6\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Token Mint\u3002"))),(0,o.kt)("p",null,"\u521b\u5efa\u65b0\u7684\u8d27\u5e01\u65f6\uff0c\u65b0\u751f\u6210\u7684\u5bc6\u94a5\u5bf9\u4e5f\u5fc5\u987b\u5bf9\u4ea4\u6613\u8fdb\u884c\u7b7e\u540d\u3002\u5f53\u9664\u4e86\u8fde\u63a5\u7684\u94b1\u5305\u5916\u8fd8\u9700\u8981\u989d\u5916\u7684\u7b7e\u540d\u8005\u65f6\uff0c\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u683c\u5f0f\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"sendTransaction(transaction, connection, {\n signers: [Keypair],\n})\n")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"CreateTokenAccount"),"\u7ec4\u4ef6\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Token\u8d26\u6237\u3002")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"MintToForm"),"\u7ec4\u4ef6\u4e2d\u94f8\u9020Mint\u4ee3\u5e01\u3002"))),(0,o.kt)("p",null,"\u5982\u679c\u4f60\u9047\u5230\u56f0\u96be\uff0c\u968f\u65f6\u53ef\u4ee5\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/ZYJLiu/solana-token-frontend"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002"),(0,o.kt)("p",null,"\u8bb0\u4f4f\uff0c\u5bf9\u8fd9\u4e9b\u6311\u6218\u8981\u6709\u521b\u610f\uff0c\u8ba9\u5b83\u4eec\u6210\u4e3a\u4f60\u81ea\u5df1\u7684\uff01"))}k.isMDXComponent=!0},5564:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/account-relationships-32aea7eebf191f14b24d07413a4830ef.png"},871:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/mint-account-fde825e14362cee72fa5485c8c97a171.png"},370:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/token-account-3c6963a8d1ed41b58a413bac17b70494.png"},4929:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/token-program-frontend-d8f9d4b149a1378eaf2dba5e2d3ecb8a.png"},6546:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/usdc-token-6b7f07ed350d9b3164b776019785ebf3.png"}}]); \ No newline at end of file diff --git a/assets/js/0b59e1b8.2dc214f4.js b/assets/js/0b59e1b8.2dc214f4.js new file mode 100644 index 000000000..89e6330eb --- /dev/null +++ b/assets/js/0b59e1b8.2dc214f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[950],{3905:(n,e,t)=>{t.d(e,{Zo:()=>u,kt:()=>d});var a=t(7294);function o(n,e,t){return e in n?Object.defineProperty(n,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[e]=t,n}function i(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(n);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),t.push.apply(t,a)}return t}function l(n){for(var e=1;e=0||(o[t]=n[t]);return o}(n,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(n,t)&&(o[t]=n[t])}return o}var c=a.createContext({}),p=function(n){var e=a.useContext(c),t=e;return n&&(t="function"==typeof n?n(e):l(l({},e),n)),t},u=function(n){var e=p(n.components);return a.createElement(c.Provider,{value:e},n.children)},s="mdxType",k={inlineCode:"code",wrapper:function(n){var e=n.children;return a.createElement(a.Fragment,{},e)}},m=a.forwardRef((function(n,e){var t=n.components,o=n.mdxType,i=n.originalType,c=n.parentName,u=r(n,["components","mdxType","originalType","parentName"]),s=p(t),m=o,d=s["".concat(c,".").concat(m)]||s[m]||k[m]||i;return t?a.createElement(d,l(l({ref:e},u),{},{components:t})):a.createElement(d,l({ref:e},u))}));function d(n,e){var t=arguments,o=e&&e.mdxType;if("string"==typeof n||o){var i=t.length,l=new Array(i);l[0]=m;var r={};for(var c in e)hasOwnProperty.call(e,c)&&(r[c]=e[c]);r.originalType=n,r[s]="string"==typeof n?n:o,l[1]=r;for(var p=2;p{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>l,default:()=>k,frontMatter:()=>i,metadata:()=>r,toc:()=>p});var a=t(7462),o=(t(7294),t(3905));const i={sidebar_position:28,sidebar_label:"\ud83d\udcb5 The token Program",sidebar_class_name:"green"},l="\ud83d\udcb5 The Token Program",r={unversionedId:"Solana-Co-Learn/module2/spl-token/the-token-program/README",id:"Solana-Co-Learn/module2/spl-token/the-token-program/README",title:"\ud83d\udcb5 The Token Program",description:"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u5728\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u4e2d\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002\u4f5c\u4e3a\u533a\u5757\u94fe\u6700\u521d\u7684\u627f\u8bfa\uff0c\u4e5f\u53ef\u80fd\u662f\u4f60\u5b89\u88c5\u94b1\u5305\u7684\u4e3b\u8981\u539f\u56e0\uff0c\u8fd9\u4e9b\u8c26\u900a\u7684\u4ee3\u5e01\u662f\u5bf9\u533a\u5757\u94fe\u4e0a\u8d44\u4ea7\u7684\u6700\u7eaf\u7cb9\u7684\u8868\u8fbe\uff0c\u4ece\u5408\u6210\u80a1\u7968\u5230\u6570\u767e\u79cd\u72d7\u5e01\u3002",source:"@site/docs/Solana-Co-Learn/module2/spl-token/the-token-program/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token/the-token-program",slug:"/Solana-Co-Learn/module2/spl-token/the-token-program/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/the-token-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/the-token-program/README.md",tags:[],version:"current",sidebarPosition:28,frontMatter:{sidebar_position:28,sidebar_label:"\ud83d\udcb5 The token Program",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Spl token",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/"},next:{title:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/"}},c={},p=[{value:"\ud83d\uddc3 \u8d26\u6237\u5173\u7cfb",id:"-\u8d26\u6237\u5173\u7cfb",level:2},{value:"\ud83c\udf0c Mint Account",id:"-mint-account",level:2},{value:"\ud83d\udc5b Token Accounts",id:"-token-accounts",level:2},{value:"\ud83e\udd11 \u4ee3\u5e01Mint\u8fc7\u7a0b",id:"-\u4ee3\u5e01mint\u8fc7\u7a0b",level:2},{value:"Reference",id:"reference",level:2},{value:"\u7b80\u800c\u8a00\u4e4b",id:"\u7b80\u800c\u8a00\u4e4b",level:2},{value:"\u6982\u8ff0",id:"\u6982\u8ff0",level:2},{value:"\u4ee3\u5e01\u94f8\u9020",id:"\u4ee3\u5e01\u94f8\u9020",level:2},{value:"\u79df\u91d1\u548c\u79df\u91d1\u8c41\u514d",id:"\u79df\u91d1\u548c\u79df\u91d1\u8c41\u514d",level:2},{value:"\u4ee4\u724c\u8d26\u6237",id:"\u4ee4\u724c\u8d26\u6237",level:2},{value:"\u5173\u8054\u4ee3\u5e01\u8d26\u6237",id:"\u5173\u8054\u4ee3\u5e01\u8d26\u6237",level:2},{value:"Mint token",id:"mint-token",level:2},{value:"\u8f6c\u79fb\u4ee3\u5e01",id:"\u8f6c\u79fb\u4ee3\u5e01",level:2},{value:"\u71c3\u70e7\u4ee3\u5e01",id:"\u71c3\u70e7\u4ee3\u5e01",level:2},{value:"\u6279\u51c6\u59d4\u6d3e",id:"\u6279\u51c6\u59d4\u6d3e",level:2},{value:"\u64a4\u9500\u59d4\u6258",id:"\u64a4\u9500\u59d4\u6258",level:2},{value:"\u6f14\u793a",id:"\u6f14\u793a",level:2},{value:"1. \u57fa\u672c\u811a\u624b\u67b6",id:"1-\u57fa\u672c\u811a\u624b\u67b6",level:3},{value:"2. \u521b\u5efaToken Mint",id:"2-\u521b\u5efatoken-mint",level:3},{value:"3. \u521b\u5efa\u4ee4\u724c\u8d26\u6237",id:"3-\u521b\u5efa\u4ee4\u724c\u8d26\u6237",level:3},{value:"4. Mint token",id:"4-mint-token",level:3},{value:"5. \u6279\u51c6\u59d4\u6d3e",id:"5-\u6279\u51c6\u59d4\u6d3e",level:3},{value:"6. \u8f6c\u79fb\u4ee3\u5e01",id:"6-\u8f6c\u79fb\u4ee3\u5e01",level:3},{value:"7. \u64a4\u9500\u59d4\u6258",id:"7-\u64a4\u9500\u59d4\u6258",level:3},{value:"8. \u71c3\u70e7\u4ee3\u5e01",id:"8-\u71c3\u70e7\u4ee3\u5e01",level:3},{value:"9. \u5168\u90e8\u6d4b\u8bd5\u4e00\u4e0b",id:"9-\u5168\u90e8\u6d4b\u8bd5\u4e00\u4e0b",level:3},{value:"\u6311\u6218",id:"\u6311\u6218",level:2}],u={toc:p},s="wrapper";function k(n){let{components:e,...i}=n;return(0,o.kt)(s,(0,a.Z)({},u,i,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"-the-token-program"},"\ud83d\udcb5 The Token Program"),(0,o.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u5728\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u4e2d\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece",(0,o.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-token-client/tree/solution-without-burn"},"\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801"),"\uff08\u786e\u4fdd\u4f60\u5728 ",(0,o.kt)("inlineCode",{parentName:"p"},"solution-without-burn")," \u5206\u652f\u4e0a\uff09\u3002\u4f5c\u4e3a\u533a\u5757\u94fe\u6700\u521d\u7684\u627f\u8bfa\uff0c\u4e5f\u53ef\u80fd\u662f\u4f60\u5b89\u88c5\u94b1\u5305\u7684\u4e3b\u8981\u539f\u56e0\uff0c\u8fd9\u4e9b\u8c26\u900a\u7684\u4ee3\u5e01\u662f\u5bf9\u533a\u5757\u94fe\u4e0a\u8d44\u4ea7\u7684\u6700\u7eaf\u7cb9\u7684\u8868\u8fbe\uff0c\u4ece\u5408\u6210\u80a1\u7968\u5230\u6570\u767e\u79cd\u72d7\u5e01\u3002"),(0,o.kt)("p",null,"\u8fd9\u8282\u8bfe\u4e3b\u8981\u8bb2\u89e3Solana\u4e0a\u7684\u4ee3\u5e01\u5de5\u4f5c\u539f\u7406\u3002\u5982\u679c\u4f60\u5bf9\u5176\u4ed6\u533a\u5757\u94fe\u6709\u6240\u4e86\u89e3\uff0c\u53ef\u80fd\u4f1a\u53d1\u73b0\u8fd9\u91cc\u6709\u4e00\u4e9b\u4e0d\u540c\u4e4b\u5904\uff0c\u6240\u4ee5\u5c3d\u91cf\u4e0d\u8981\u5c06\u5f53\u524d\u5bf9\u4ee3\u5e01\u7684\u7406\u89e3\u4e0e\u4e4b\u8054\u7cfb\u8d77\u6765\u3002"),(0,o.kt)("p",null,"\u8c08\u8bbaSolana\u4e2d\u4ee4\u724c\u7684\u5de5\u4f5c\u539f\u7406\u4e5f\u662f\u4e00\u4e2a\u4e86\u89e3\u4e0d\u540c\u7a0b\u5e8f\u5982\u4f55\u4f7f\u7528\u8d26\u6237\u7684\u7edd\u4f73\u673a\u4f1a\u3002\u4f60\u8d8a\u6df1\u5165\u4e86\u89e3Solana\uff0c\u5c31\u8d8a\u80fd\u610f\u8bc6\u5230\u8d26\u6237\u7684\u91cd\u8981\u6027\u3002\u5b83\u4eec\u50cf\u6587\u4ef6\u7cfb\u7edf\u4e2d\u7684\u6587\u4ef6\u4e00\u6837\u62bd\u8c61\u548c\u7075\u6d3b\uff0c\u4f46\u8fd9\u4e5f\u610f\u5473\u7740\u4efb\u4f55\u7ed9\u5b9a\u7a0b\u5e8f\u4e0a\u7684\u8d26\u6237\u53ef\u80fd\u53d8\u5f97\u590d\u6742\uff01\u521a\u5f00\u59cb\u53ef\u80fd\u4f1a\u611f\u5230\u56f0\u60d1\uff0c\u4f46\u7ed9\u5b83\u4e00\u4e9b\u65f6\u95f4\uff0c\u5b83\u4f1a\u53d8\u5f97\u66f4\u52a0\u6e05\u6670\u3002"),(0,o.kt)("p",null,"Solana\u4e0a\u7684\u4ee3\u5e01\u662f\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"Solana Token Program"),"\u8fdb\u884c\u521b\u5efa\u548c\u7ba1\u7406\u7684\uff0c\u5b83\u662f",(0,o.kt)("inlineCode",{parentName:"p"},"Solana Program Library\uff08SPL\uff09"),"\u4e2d\u7684\u51e0\u4e2a\u7a0b\u5e8f\u4e4b\u4e00\u3002\u5e38\u89c4\u4ee3\u5e01\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFTs\uff09\u90fd\u662fSolana\u7a0b\u5e8f\u5e93\u4e2d\u7684\u4ee3\u5e01\u3002\u4eca\u5929\u6211\u4eec\u4e0d\u4f1a\u6d89\u53caNFTs\uff0c\u4f46\u4e0d\u7528\u62c5\u5fc3\uff0c\u6211\u4eec\u5f88\u5feb\u4f1a\u4ecb\u7ecd\u3002"),(0,o.kt)("h2",{id:"-\u8d26\u6237\u5173\u7cfb"},"\ud83d\uddc3 \u8d26\u6237\u5173\u7cfb"),(0,o.kt)("p",null,"\u6211\u4eec\u9996\u5148\u8981\u4e86\u89e3\u4e00\u4e0b\u60c5\u51b5\u3002",(0,o.kt)("inlineCode",{parentName:"p"},"The token program"),"\u9700\u8981\u4e09\u4e2a\u5fc5\u8981\u7684\u8d26\u6237:"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(5564).Z,width:"1398",height:"324"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Wallet Account")," - \u8fd9\u662f\u4f60\u7684\u94b1\u5305\uff01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Mint Account")," - \u5b58\u50a8\u6709\u5173\u4ee3\u5e01Mint\u7684\u5143\u6570\u636e"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Token Account")," - \u8fd9\u4e0e\u94b1\u5305\u7ed1\u5b9a\uff0c\u5e76\u5b58\u50a8\u6709\u5173\u8be5\u7279\u5b9a\u94b1\u5305\u7684\u4fe1\u606f\uff0c\u4f8b\u5982\u5b83\u62e5\u6709\u591a\u5c11\u4ee4\u724c\u3002")),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u6df1\u5165\u4e86\u89e3\u6bcf\u4e2a\u8d26\u6237\uff0c\u5e76\u770b\u770b\u5b83\u4eec\u5185\u90e8\u7684\u60c5\u51b5\u3002"),(0,o.kt)("h2",{id:"-mint-account"},"\ud83c\udf0c Mint Account"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(871).Z,width:"1398",height:"432"})),(0,o.kt)("p",null,"Mint\u8d26\u6237\u5b58\u50a8\u6709\u5173\u4ee3\u5e01\u672c\u8eab\u7684\u5143\u6570\u636e\uff0c\u800c\u4e0d\u662f\u60a8\u5bf9\u4ee3\u5e01\u7684\u6240\u6709\u6743\uff0c\u800c\u662f\u66f4\u5e7f\u6cdb\u5730\u6d89\u53ca\u4ee3\u5e01\u3002\u5b83\u5177\u6709\u4ee5\u4e0b\u5c5e\u6027\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mint authority")," - \u53ea\u6709\u4e00\u4e2a\u8d26\u6237\u53ef\u4ee5\u4eceMint\u8d26\u6237\u7b7e\u540d\u5e76Mint\u4ee3\u5e01\u3002\u5f53\u60a8\u521b\u5efaMint\u8d26\u6237\u65f6\uff0c\u5fc5\u987b\u6307\u5b9aMint\u6743\u9650\uff0c\u53ef\u4ee5\u662f\u60a8\u7684\u4e2a\u4eba\u94b1\u5305\u6216\u5176\u4ed6\u7a0b\u5e8f\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"supply")," - \u6709\u591a\u5c11\u603b\u4ee3\u5e01\u5b58\u5728\u3002\u4f9b\u5e94\u57fa\u672c\u4e0a\u662f\u5728\u8bf4\uff0c\u201c\u7801\u519c\u5927\u795e\uff0c\u4f60\u597d\uff01\u8fd9\u662f\u53d1\u884c\u7684\u603b\u4ee3\u5e01\u6570\u91cf\u3002\u201d"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"decimals")," - \u5c0f\u6570\u4f4d\u6570\u662f\u6211\u4eec\u5141\u8bb8\u4ee4\u724c\u88ab\u5206\u5272\u6210\u7684\u5c0f\u6570\u4f4d\u6570 - \u6211\u4eec\u4ee4\u724c\u7684\u7cbe\u5ea6\u3002\u8fd9\u53ef\u80fd\u4f1a\u53d8\u5f97\u68d8\u624b\uff0c\u56e0\u4e3a\u5b9e\u9645\u4e0a\u94fe\u4e0a\u6ca1\u6709\u5c0f\u6570\u3002\u4ec0\u4e48\uff1f\u603b\u4f9b\u5e94\u91cf\u8868\u793a\u4e3a\u6574\u6570\uff0c\u6240\u4ee5\u4f60\u5fc5\u987b\u8fdb\u884c\u6570\u5b66\u8ba1\u7b97\u6765\u5728\u5c0f\u6570\u4e4b\u95f4\u8fdb\u884c\u8f6c\u6362\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4f60\u5c06\u5c0f\u6570\u4f4d\u6570\u8bbe\u7f6e\u4e3a\u4e24\u4f4d\uff0c\u800c\u4f60\u7684\u4f9b\u5e94\u91cf\u662f\u4e00\u767e\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u4f60\u53ea\u6709\u4e00\u4e2a\u4ee4\u724c\u3002\u4f9b\u5e94\u4e2d\u53ea\u6709\u4e00\u4e2a\u4ee4\u724c\uff0c\u4f46\u4f60\u5141\u8bb8\u5b83\u88ab\u5206\u5272\u6210\u8be5\u4ee4\u724c\u7684\u8f83\u5c0f\u9762\u989d\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Is Initialized")," - \u57fa\u672c\u4e0a\u662f\u6307\u8be5\u8d26\u6237\u662f\u5426\u51c6\u5907\u5c31\u7eea\u3002\u8fd9\u4e0e\u8d26\u6237\u672c\u8eab\u6709\u5173\uff0c\u800c\u4e0d\u662f",(0,o.kt)("inlineCode",{parentName:"li"},"token program"),"\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Freeze authority ")," - \u51bb\u7ed3\u6743\u9650\u7c7b\u4f3c\u4e8e",(0,o.kt)("inlineCode",{parentName:"li"},"Mint\u6743\u9650"),"\uff0c\u610f\u5473\u7740\u4e00\u4e2a\u4eba\u6216\u7a0b\u5e8f\u62e5\u6709\u51bb\u7ed3\uff08\u6216Mint\uff09\u7684\u6743\u9650\u3002")),(0,o.kt)("p",null,"\u5c06Mint\u6743\u9650\u8bbe\u7f6e\u7ed9\u4f60\u7684\u94b1\u5305\u662f\u76f8\u5f53\u6807\u51c6\u7684\u505a\u6cd5\uff0c\u4f60\u53ef\u4ee5Mint\u4efb\u4f55\u4f60\u60f3\u8981\u7684\u4e1c\u897f\uff0c\u7136\u540e\u53d6\u6d88Mint\u6743\u9650\uff0c\u57fa\u672c\u4e0a\u610f\u5473\u7740\u672a\u6765\u4e0d\u4f1a\u518d\u53d1\u884c\u66f4\u591a\u7684\u4f9b\u5e94\u91cf\u3002\u6216\u8005\uff0c\u5982\u679c\u4f60\u6709\u67d0\u79cd\u52a8\u6001\u53d1\u884c\u4ee3\u5e01\u7684\u65b9\u5f0f\uff0c\u5e38\u89c1\u7684\u505a\u6cd5\u662f\u5c06\u5176\u653e\u5165\u6743\u9650\u4e2d\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u7a0b\u5e8f\u6765\u7ba1\u7406\u4ee3\u5e01\u7684Mint\u3002"),(0,o.kt)("p",null,"\u51bb\u7ed3\u6743\u9650\u7684\u5de5\u4f5c\u65b9\u5f0f\u76f8\u540c\u3002"),(0,o.kt)("h2",{id:"-token-accounts"},"\ud83d\udc5b Token Accounts"),(0,o.kt)("p",null,"\u4f60\u53ef\u80fd\u5df2\u7ecf\u770b\u5230\u4e86\u5927\u91cf\u5728\u751f\u6001\u7cfb\u7edf\u4e2d\u6d41\u901a\u7684\u4e0d\u540c\u4ee3\u5e01\u3002\u4f60\u7684\u94b1\u5305\u73b0\u5728\u53ef\u80fd\u88c5\u6ee1\u4e86\u5404\u79cd\u4e0d\u540c\u7684\u4ee3\u5e01\u3002\u90a3\u4e48\uff0c\u7f51\u7edc\u662f\u5982\u4f55\u77e5\u9053\u4f60\u6301\u6709\u67d0\u4e9b\u4ee3\u5e01\u7684\u5462\uff1f\u4e00\u4e2a\u8d26\u6237\u5b58\u50a8\u7740\u8fd9\u4e9b\u6570\u636e\uff01\u6700\u597d\u7684\u65b9\u5f0f\u662f\u901a\u8fc7\u4e00\u4e2a\u5173\u8054\u7684\u4ee3\u5e01\u8d26\u6237\u6765\u5b9e\u73b0\u3002\u770b\u770b\u5427"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(370).Z,width:"1210",height:"802"})),(0,o.kt)("p",null,"\u8fd9\u662f\u6570\u636e\u5173\u7cfb\u548c\u8d26\u6237\u5c5e\u6027\u7684\u6837\u5b50\u3002"),(0,o.kt)("p",null,"Token\u8d26\u6237\u5fc5\u987b\u4e0e\u7528\u6237\u6216\u94b1\u5305\u5173\u8054\u3002\u4e00\u4e2a\u7b80\u5355\u7684\u65b9\u6cd5\u662f\u521b\u5efa\u4e00\u4e2aPDA\uff0c\u5176\u5730\u5740\u94fe\u63a5\u4e86Mint\u8d26\u6237\u548c\u94b1\u5305\u3002\u4ee4\u724c\u8d26\u6237PDA\u7684\u79cd\u5b50\u662f\u94f8\u5e01\u8d26\u6237\u7684\u5730\u5740\u548c\u94b1\u5305\u5730\u5740\uff08\u4ee4\u724c\u7a0b\u5e8fID\u9ed8\u8ba4\u5b58\u5728\uff09\u3002"),(0,o.kt)("p",null,"\u6709\u5f88\u591a\u4e0d\u540c\u7684\u4fe1\u606f\u5305\u542b\u5728\u5185\uff0c\u4f46\u73b0\u5728\u53ea\u9700\u8981\u77e5\u9053\u4f60\u7684\u94b1\u5305\u5b9e\u9645\u4e0a\u5e76\u4e0d\u6301\u6709\u5177\u4f53\u7684\u4ee3\u5e01\u3002\u5b83\u4e0e\u4f60\u62e5\u6709\u7684\u53e6\u4e00\u4e2a\u8d26\u6237\u76f8\u5173\u8054\uff0c\u8be5\u8d26\u6237\u5b58\u50a8\u4e86\u4ee3\u5e01\u7684\u6570\u91cf\u3002\u53e6\u5916\uff0c\u8fd8\u6709\u4e00\u4e2a\u94f8\u5e01\u8d26\u6237\uff0c\u5b58\u50a8\u4e86\u5173\u4e8e\u6240\u6709\u4ee3\u5e01\u548c\u94f8\u5e01\u7684\u66f4\u5e7f\u6cdb\u4fe1\u606f\u3002"),(0,o.kt)("p",null,"\u82b1\u70b9\u65f6\u95f4\u76ef\u7740\u8fd9\u4e2a\u56fe\u8868\uff0c\u7136\u540e\u641c\u7d22\u4e00\u4e0b\u90a3\u4e9b\u4e0d\u660e\u767d\u7684\u90e8\u5206\uff08\u6bd4\u5982\u5173\u8054\u7684\u4ee4\u724c\u7a0b\u5e8f\u5230\u5e95\u662f\u4ec0\u4e48\u9b3c\uff1f\uff09\u3002\u5728\u5904\u7406\u5b8c\u6240\u6709\u7684\u7e41\u7410\u4e8b\u60c5\u4e4b\u540e\uff0c\u8fd9\u5c31\u5f88\u7b80\u5355\u4e86\uff01"),(0,o.kt)("h2",{id:"-\u4ee3\u5e01mint\u8fc7\u7a0b"},"\ud83e\udd11 \u4ee3\u5e01Mint\u8fc7\u7a0b"),(0,o.kt)("p",null,"\u522b\u518d\u770b\u56fe\u8868\u4e86\uff0c\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e9b\u4ee3\u7801\uff0c\u770b\u770b\u8fd9\u4e00\u5207\u662f\u5982\u4f55\u53d1\u751f\u7684\u3002"),(0,o.kt)("p",null,"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684SPL-Token\uff0c\u9996\u5148\u5fc5\u987b\u521b\u5efa\u4e00\u4e2aToken Mint\uff08\u4fdd\u5b58\u6709\u5173\u8be5\u7279\u5b9a\u4ee3\u5e01\u7684\u6570\u636e\u7684\u8d26\u6237\uff09\u3002"),(0,o.kt)("p",null,"\u628a\u5b83\u60f3\u8c61\u6210\u70e4\u6bd4\u8428\u997c\u3002\u4f60\u9700\u8981\u4e00\u4e2a\u98df\u8c31\uff08\u5173\u4e8e\u4ee3\u5e01\u7684\u6570\u636e\uff09\uff0c\u98df\u6750\uff08\u94f8\u5e01\u8d26\u6237\u548c\u94b1\u5305\u5730\u5740\uff09\uff0c\u4ee5\u53ca\u6709\u4eba\u628a\u5b83\u4eec\u7ec4\u5408\u5728\u4e00\u8d77\uff08\u6d3e\u751f\u4e00\u4e2a\u65b0\u7684PDA\uff09\u3002\u5c31\u50cf\u5236\u4f5c\u6bd4\u8428\u997c\u4e00\u6837\uff0c\u5982\u679c\u4f60\u62e5\u6709\u6240\u6709\u6b63\u786e\u7684\u98df\u6750\u5e76\u6309\u7167\u98df\u8c31\u64cd\u4f5c\uff0c\u6700\u7ec8\u4f60\u5c06\u5f97\u5230\u4e00\u679a\u7f8e\u5473\u7684\u65b0\u4ee3\u5e01\uff01"),(0,o.kt)("p",null,"\u7531\u4e8e\u4ee4\u724c\u8ba1\u5212\u662fSPL\u7684\u4e00\u90e8\u5206\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@solana/spl-token"},(0,o.kt)("inlineCode",{parentName:"a"},"@solana/spl-token"))," TypeScript SDK\u76f8\u5f53\u5bb9\u6613\u5730\u521b\u5efa\u4ea4\u6613\u3002"),(0,o.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u7684\u6837\u5b50\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const tokenMint = await createMint(\n connection,\n payer,\n mintAuthority,\n freezeAuthority,\n decimals,\n)\n")),(0,o.kt)("p",null,"\u4f60\u9700\u8981\u8fd9\u4e9b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ed8\u6b3e\u65b9\u4ea4\u6613\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mintAuthority")," - \u88ab\u6388\u6743Mint\u65b0\u4ee3\u5e01\u7684\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"freezeAuthority")," - \u4e00\u4e2a\u88ab\u6388\u6743\u51bb\u7ed3\u4ee3\u5e01\u7684\u8d26\u6237\u3002\u5982\u679c\u60a8\u4e0d\u60f3\u51bb\u7ed3\u4ee3\u5e01\uff0c\u8bf7\u5c06\u5176\u8bbe\u7f6e\u4e3anull\uff01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"decimals")," - \u6307\u5b9a\u4ee4\u724c\u7684\u6240\u9700\u5c0f\u6570\u7cbe\u5ea6")),(0,o.kt)("p",null,"\u4e00\u65e6\u5b8c\u6210\u8fd9\u4e2a\u6b65\u9aa4\uff0c\u4f60\u5c31\u53ef\u4ee5\u7ee7\u7eed\u4e0b\u4e00\u6b65\u4e86\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u521b\u5efa\u5173\u8054\u7684Token\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},"\u5c06\u4ee3\u5e01Mint\u5230\u4e00\u4e2a\u8d26\u6237\u4e2d"),(0,o.kt)("li",{parentName:"ul"},"\u5982\u679c\u4f60\u60f3\u8981\u4f7f\u7528\u8f6c\u8d26\u529f\u80fd\u8fdb\u884c\u7a7a\u6295\u5230\u591a\u4e2a\u8d26\u6237\uff0c")),(0,o.kt)("p",null,"\u4f60\u9700\u8981\u7684\u4e00\u5207\u90fd\u5728 ",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," SDK\u4e2d\u3002\u5982\u679c\u4f60\u5bf9\u67d0\u4e2a\u5177\u4f53\u90e8\u5206\u611f\u5174\u8da3\uff0c\u53ef\u4ee5\u5728\u8fd9\u91cc",(0,o.kt)("a",{parentName:"p",href:"https://spl.solana.com/token"},"\u67e5\u770b\u6587\u6863"),"\u3002"),(0,o.kt)("p",null,"\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u60a8\u4e0d\u9700\u8981\u81ea\u5df1\u521b\u5efa\u539f\u59cb\u4ea4\u6613\uff0cSDK\u5c31\u8db3\u591f\u4e86\u3002"),(0,o.kt)("p",null,"\u5173\u4e8e\u8fd9\u4e2a\u5f88\u9177\u7684\u9644\u6ce8\u2014\u2014\u5982\u679c\u51fa\u4e8e\u67d0\u79cd\u539f\u56e0\uff0c\u4f60\u60f3\u8981\u5728\u521b\u5efaMint\u6307\u4ee4\u7684\u540c\u65f6\u521b\u5efa\u53e6\u4e00\u4e2a\u6307\u4ee4\uff0c\u4f60\u4f1a\u5e0c\u671b\u81ea\u5df1\u521b\u5efa\u8fd9\u4e9b\u6307\u4ee4\uff0c\u5e76\u5c06\u5b83\u4eec\u6253\u5305\u6210\u4e00\u4e2a\u4e8b\u52a1\uff0c\u4ee5\u786e\u4fdd\u6240\u6709\u64cd\u4f5c\u90fd\u662f\u539f\u5b50\u6027\u7684\u3002\u4e5f\u8bb8\u4f60\u6b63\u5728\u6784\u5efa\u4e00\u4e2a\u8d85\u7ea7\u673a\u5bc6\u7684\u4ee3\u5e01\u7a0b\u5e8f\uff0c\u4f60\u5e0c\u671b\u5728\u94f8\u5e01\u540e\u7acb\u5373\u9501\u5b9a\u6240\u6709\u4ee3\u5e01\uff0c\u800c\u6ca1\u6709\u4eba\u80fd\u591f\u8f6c\u79fb\u5b83\u4eec\u3002"),(0,o.kt)("p",null,"\u4e0d\u7528\u8bf4\uff0c\u8fd9\u4e9b\u4ee3\u5e01\u5468\u56f4\u53d1\u751f\u4e86\u5f88\u591a\u75af\u72c2\u7684\u4e8b\u60c5\u3002\u60a8\u53ef\u4ee5\u5728",(0,o.kt)("a",{parentName:"p",href:"https://www.soldev.app/course/token-program"},"\u8fd9\u91cc"),"\u67e5\u770b\u6bcf\u4e2a\u529f\u80fd\u5728\u5e55\u540e\u53d1\u751f\u7684\u60c5\u51b5\uff0c\u751a\u81f3\u53ef\u4ee5\u67e5\u770b\u4e00\u4e9b\u5173\u4e8e\u9500\u6bc1\u4ee3\u5e01\u4e4b\u7c7b\u7684\u8bf4\u660e\u3002:)"),(0,o.kt)("h2",{id:"reference"},"Reference"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://www.soldev.app/course/token-program"},"Create Tokens With The Token Program"))),(0,o.kt)("hr",null),(0,o.kt)("hr",null),(0,o.kt)("h1",{id:"\u4f7f\u7528token\u7a0b\u5e8f\u521b\u5efa\u4ee4\u724c"},"\u4f7f\u7528Token\u7a0b\u5e8f\u521b\u5efa\u4ee4\u724c"),(0,o.kt)("h2",{id:"\u7b80\u800c\u8a00\u4e4b"},"\u7b80\u800c\u8a00\u4e4b"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"SPL\u4ee3\u5e01\u4ee3\u8868Solana\u7f51\u7edc\u4e0a\u7684\u6240\u6709\u975e\u672c\u5730\u4ee3\u5e01\u3002Solana\u4e0a\u7684\u53ef\u66ff\u4ee3\u548c\u4e0d\u53ef\u66ff\u4ee3\u4ee3\u5e01\uff08NFT\uff09\u90fd\u662fSPL\u4ee3\u5e01\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Token Program"),"\u5305\u542b\u4e86\u521b\u5efa\u548c\u4e0eSPL-Tokens\u8fdb\u884c\u4ea4\u4e92\u7684\u6307\u4ee4"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Token Mints")," \u662f\u6307\u4fdd\u5b58\u7279\u5b9a Token \u6570\u636e\u7684\u8d26\u6237\uff0c\u4f46\u4e0d\u6301\u6709 Tokens"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Token Account"),"\u7528\u4e8e\u6301\u6709\u7279\u5b9aToken Mint\u7684Token"),(0,o.kt)("li",{parentName:"ul"},"\u521b\u5efa\u4ee3\u5e01Mint\u548cToken\u8d26\u6237\u9700\u8981\u5206\u914d SOL \u4f5c\u4e3a\u79df\u91d1\u3002\u4ee3\u5e01\u8d26\u6237\u7684\u79df\u91d1\u5728\u5173\u95ed\u8d26\u6237\u65f6\u53ef\u4ee5\u9000\u8fd8\uff0c\u7136\u800c\uff0c\u76ee\u524d\u65e0\u6cd5\u5173\u95ed\u4ee3\u5e01\u94f8\u5e01\u3002")),(0,o.kt)("h2",{id:"\u6982\u8ff0"},"\u6982\u8ff0"),(0,o.kt)("p",null,"Token\u8ba1\u5212\u662fSolana\u7a0b\u5e8f\u5e93\uff08SPL\uff09\u63d0\u4f9b\u7684\u4f17\u591a\u8ba1\u5212\u4e4b\u4e00\u3002\u5b83\u5305\u542b\u4e86\u521b\u5efa\u548c\u4e0eSPL-Tokens\u8fdb\u884c\u4ea4\u4e92\u7684\u6307\u4ee4\u3002\u8fd9\u4e9b\u4ee3\u5e01\u4ee3\u8868\u4e86Solana\u7f51\u7edc\u4e0a\u7684\u6240\u6709\u975e\u672c\u5730\uff08\u5373\u975eSOL\uff09\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u672c\u8bfe\u7a0b\u5c06\u91cd\u70b9\u4ecb\u7ecd\u4f7f\u7528Token\u7a0b\u5e8f\u521b\u5efa\u548c\u7ba1\u7406\u65b0\u7684SPL-Token\u7684\u57fa\u7840\u77e5\u8bc6"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u7684",(0,o.kt)("inlineCode",{parentName:"li"},"Token Mint")),(0,o.kt)("li",{parentName:"ol"},"\u521b\u5efa",(0,o.kt)("inlineCode",{parentName:"li"},"Token accounts")),(0,o.kt)("li",{parentName:"ol"},"Mint"),(0,o.kt)("li",{parentName:"ol"},"\u5c06\u4ee3\u5e01\u4ece\u4e00\u4e2a\u6301\u6709\u4eba\u8f6c\u79fb\u5230\u53e6\u4e00\u4e2a\u6301\u6709\u4eba"),(0,o.kt)("li",{parentName:"ol"},"\u71c3\u70e7\u4ee3\u5e01")),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u5f00\u53d1\u8fc7\u7a0b\u7684\u5ba2\u6237\u7aef\u89d2\u5ea6\u6765\u5904\u7406\uff0c\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," JavaScript\u5e93\u3002"),(0,o.kt)("h2",{id:"\u4ee3\u5e01\u94f8\u9020"},"\u4ee3\u5e01\u94f8\u9020"),(0,o.kt)("p",null,"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684SPL-Token\uff0c\u9996\u5148\u5fc5\u987b\u521b\u5efa\u4e00\u4e2aToken Mint\u3002Token Mint\u662f\u4fdd\u5b58\u7279\u5b9a\u4ee3\u5e01\u6570\u636e\u7684\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u4ee5USD Coin (USDC)\u5728",(0,o.kt)("a",{parentName:"p",href:"https://solana.fm/address/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v?cluster=mainnet-qn1"},"Solana Explorer"),"\u4e0a\u4e3a\u4f8b\u3002USDC\u7684\u4ee3\u5e01\u94f8\u9020\u5730\u5740\u662f",(0,o.kt)("inlineCode",{parentName:"p"},"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),"\u3002\u901a\u8fc7\u6d4f\u89c8\u5668\uff0c\u6211\u4eec\u53ef\u4ee5\u67e5\u770b\u6709\u5173USDC\u4ee3\u5e01\u94f8\u9020\u7684\u7279\u5b9a\u7ec6\u8282\uff0c\u4f8b\u5982\u4ee3\u5e01\u7684\u5f53\u524d\u4f9b\u5e94\u91cf\u3001\u94f8\u9020\u548c\u51bb\u7ed3\u6743\u9650\u7684\u5730\u5740\uff0c\u4ee5\u53ca\u4ee3\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(6546).Z,width:"2766",height:"1062"})),(0,o.kt)("p",null,"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4ee3\u5e01\u94f8\u9020\uff0c\u60a8\u9700\u8981\u5411\u4ee3\u5e01\u7a0b\u5e8f\u53d1\u9001\u6b63\u786e\u7684\u4ea4\u6613\u6307\u4ee4\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u5c06\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u4e2d\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const tokenMint = await createMint(\n connection,\n payer,\n mintAuthority,\n freezeAuthority,\n decimal\n);\n")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u8fd4\u56de\u65b0",(0,o.kt)("inlineCode",{parentName:"p"},"Token Mint"),"\u7684\u516c\u94a5\u3002\u6b64\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mintAuthority")," - \u6388\u6743\u8fdb\u884c\u4ece",(0,o.kt)("inlineCode",{parentName:"li"},"Token Mint"),"\u4e2d\u5b9e\u9645\u94f8\u9020\u4ee3\u5e01\u7684\u8d26\u6237\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"freezeAuthority")," - \u4e00\u4e2a\u88ab\u6388\u6743\u51bb\u7ed3\u4ee3\u5e01\u8d26\u6237\u7684\u8d26\u6237\u3002\u5982\u679c\u4e0d\u9700\u8981\u51bb\u7ed3\u529f\u80fd\uff0c\u8be5\u53c2\u6570\u53ef\u4ee5\u8bbe\u7f6e\u4e3anull\u3002"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"decimals")," - \u6307\u5b9a\u4ee4\u724c\u7684\u6240\u9700\u5c0f\u6570\u7cbe\u5ea6")),(0,o.kt)("p",null,"\u5f53\u4f7f\u7528\u5177\u6709\u8bbf\u95ee\u60a8\u7684\u79d8\u94a5\u6743\u9650\u7684\u811a\u672c\u521b\u5efa\u65b0\u7684\u94f8\u5e01\u65f6\uff0c\u60a8\u53ef\u4ee5\u7b80\u5355\u5730\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u3002\u7136\u800c\uff0c\u5982\u679c\u60a8\u8981\u6784\u5efa\u4e00\u4e2a\u5141\u8bb8\u7528\u6237\u521b\u5efa\u65b0\u7684\u4ee3\u5e01\u94f8\u5e01\u7684\u7f51\u7ad9\uff0c\u60a8\u9700\u8981\u5728\u4e0d\u8ba9\u7528\u6237\u66b4\u9732\u79d8\u94a5\u7ed9\u6d4f\u89c8\u5668\u7684\u60c5\u51b5\u4e0b\u5b8c\u6210\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u60a8\u9700\u8981\u6784\u5efa\u5e76\u63d0\u4ea4\u4e00\u7b14\u5305\u542b\u6b63\u786e\u6307\u4ee4\u7684\u4ea4\u6613\u3002"),(0,o.kt)("p",null,"\u5728\u5185\u90e8\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u53ea\u662f\u521b\u5efa\u4e86\u4e00\u4e2a\u5305\u542b\u4e24\u4e2a\u6307\u4ee4\u7684\u4ea4\u6613\uff1a"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u8d26\u6237"),(0,o.kt)("li",{parentName:"ol"},"\u521d\u59cb\u5316\u4e00\u4e2a\u65b0\u7684Mint")),(0,o.kt)("p",null,"\u8fd9\u5c06\u5982\u4e0b\u6240\u793a\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildCreateMintTransaction(\n connection: web3.Connection,\n payer: web3.PublicKey,\n decimals: number\n): Promise {\n const lamports = await token.getMinimumBalanceForRentExemptMint(connection);\n const accountKeypair = web3.Keypair.generate();\n const programId = token.TOKEN_PROGRAM_ID\n\n const transaction = new web3.Transaction().add(\n web3.SystemProgram.createAccount({\n fromPubkey: payer,\n newAccountPubkey: accountKeypair.publicKey,\n space: token.MINT_SIZE,\n lamports,\n programId,\n }),\n token.createInitializeMintInstruction(\n accountKeypair.publicKey,\n decimals,\n payer,\n payer,\n programId\n )\n );\n\n return transaction\n}\n")),(0,o.kt)("p",null,"\u5728\u624b\u52a8\u6784\u5efa\u521b\u5efa\u65b0\u4ee3\u5e01\u94f8\u9020\u6307\u4ee4\u65f6\uff0c\u8bf7\u786e\u4fdd\u5c06\u521b\u5efa\u8d26\u6237\u548c\u521d\u59cb\u5316\u94f8\u9020\u6307\u4ee4\u6dfb\u52a0\u5230\u540c\u4e00\u7b14\u4ea4\u6613\u4e2d\u3002\u5982\u679c\u60a8\u5c06\u6bcf\u4e2a\u6b65\u9aa4\u5206\u5f00\u8fdb\u884c\u4ea4\u6613\uff0c\u7406\u8bba\u4e0a\u6709\u53ef\u80fd\u8ba9\u5176\u4ed6\u4eba\u63a5\u7ba1\u60a8\u521b\u5efa\u7684\u8d26\u6237\u5e76\u5c06\u5176\u7528\u4e8e\u81ea\u5df1\u7684\u94f8\u9020\u3002"),(0,o.kt)("h2",{id:"\u79df\u91d1\u548c\u79df\u91d1\u8c41\u514d"},"\u79df\u91d1\u548c\u79df\u91d1\u8c41\u514d"),(0,o.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u524d\u9762\u4ee3\u7801\u7247\u6bb5\u7684\u51fd\u6570\u4f53\u4e2d\u7684\u7b2c\u4e00\u884c\u5305\u542b\u5bf9",(0,o.kt)("inlineCode",{parentName:"p"},"getMinimumBalanceForRentExemptMint"),"\u7684\u8c03\u7528\uff0c\u5176\u7ed3\u679c\u4f20\u9012\u7ed9",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u3002\u8fd9\u662f\u8d26\u6237\u521d\u59cb\u5316\u4e2d\u7684\u79df\u91d1\u8c41\u514d\u7684\u4e00\u90e8\u5206\u3002"),(0,o.kt)("p",null,"\u76f4\u5230\u6700\u8fd1\uff0cSolana\u4e0a\u7684\u6240\u6709\u8d26\u6237\u90fd\u9700\u8981\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\u4e4b\u4e00\uff0c\u4ee5\u907f\u514d\u88ab\u89e3\u9664\u5206\u914d\uff1a"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u6309\u7279\u5b9a\u95f4\u9694\u652f\u4ed8\u79df\u91d1"),(0,o.kt)("li",{parentName:"ol"},"\u521d\u59cb\u5316\u65f6\u5b58\u5165\u8db3\u591f\u7684SOL\u4ee5\u88ab\u89c6\u4e3a\u514d\u79df\u91d1")),(0,o.kt)("p",null,"\u6700\u8fd1\uff0c\u7b2c\u4e00\u4e2a\u9009\u9879\u88ab\u53d6\u6d88\u4e86\uff0c\u73b0\u5728\u5728\u521d\u59cb\u5316\u65b0\u8d26\u6237\u65f6\uff0c\u9700\u8981\u5b58\u5165\u8db3\u591f\u7684SOL\u4ee5\u514d\u9664\u79df\u91d1\u3002"),(0,o.kt)("p",null,"\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u6b63\u5728\u4e3a\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d26\u6237\uff0c\u6240\u4ee5\u6211\u4eec\u4f7f\u7528\u4e86 ",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," \u5e93\u4e2d\u7684 ",(0,o.kt)("inlineCode",{parentName:"p"},"getMinimumBalanceForRentExemptMint")," \u65b9\u6cd5\u3002\u7136\u800c\uff0c\u8fd9\u4e2a\u6982\u5ff5\u9002\u7528\u4e8e\u6240\u6709\u8d26\u6237\uff0c\u4f60\u53ef\u4ee5\u5728 Connection \u4e0a\u4f7f\u7528\u66f4\u901a\u7528\u7684 ",(0,o.kt)("inlineCode",{parentName:"p"},"getMinimumBalanceForRentExemption")," \u65b9\u6cd5\u6765\u521b\u5efa\u5176\u4ed6\u53ef\u80fd\u9700\u8981\u7684\u8d26\u6237\u3002"),(0,o.kt)("h2",{id:"\u4ee4\u724c\u8d26\u6237"},"\u4ee4\u724c\u8d26\u6237"),(0,o.kt)("p",null,"\u5728\u60a8\u53ef\u4ee5\u94f8\u9020\u4ee3\u5e01\uff08\u53d1\u884c\u65b0\u4f9b\u5e94\uff09\u4e4b\u524d\uff0c\u60a8\u9700\u8981\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\u6765\u6301\u6709\u65b0\u53d1\u884c\u7684\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\u6301\u6709\u7279\u5b9a\u201c\u94f8\u5e01\u201d\u6240\u53d1\u884c\u7684\u4ee3\u5e01\uff0c\u5e76\u6307\u5b9a\u4e86\u8d26\u6237\u7684\u201c\u6240\u6709\u8005\u201d\u3002\u53ea\u6709\u6240\u6709\u8005\u6709\u6743\u51cf\u5c11\u4ee3\u5e01\u8d26\u6237\u7684\u4f59\u989d\uff08\u8f6c\u8d26\u3001\u9500\u6bc1\u7b49\uff09\uff0c\u800c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u5411\u4ee3\u5e01\u8d26\u6237\u53d1\u9001\u4ee3\u5e01\u4ee5\u589e\u52a0\u5176\u4f59\u989d\u3002"),(0,o.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"spl-token"),"\u5e93\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u6765\u521b\u5efa\u65b0\u7684\u4ee4\u724c\u8d26\u6237\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const tokenAccount = await createAccount(\n connection,\n payer,\n mint,\n owner,\n keypair\n);\n")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u8fd4\u56de\u65b0\u4ee4\u724c\u8d26\u6237\u7684\u516c\u94a5\u3002\u6b64\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mint")," - \u4e0e\u65b0\u4ee3\u5e01\u8d26\u6237\u5173\u8054\u7684\u4ee3\u5e01\u94f8\u5e01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u65b0\u4ee3\u5e01\u8d26\u6237\u7684\u6240\u6709\u8005\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"keypair")," - \u8fd9\u662f\u4e00\u4e2a\u53ef\u9009\u53c2\u6570\uff0c\u7528\u4e8e\u6307\u5b9a\u65b0\u7684\u4ee4\u724c\u8d26\u6237\u5730\u5740\u3002\u5982\u679c\u6ca1\u6709\u63d0\u4f9b",(0,o.kt)("inlineCode",{parentName:"li"},"keypair"),"\uff0c\u5219",(0,o.kt)("inlineCode",{parentName:"li"},"createAccount"),"\u51fd\u6570\u5c06\u9ed8\u8ba4\u4ece\u5173\u8054\u7684\u94f8\u5e01\u548c\u6240\u6709\u8005\u8d26\u6237\u6d3e\u751f\u3002")),(0,o.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u8fd9\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u4e0e\u6211\u4eec\u5728\u67e5\u770b",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\u5185\u90e8\u65f6\u6240\u5c55\u793a\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u4e0d\u540c\u3002\u4e4b\u524d\u6211\u4eec\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"SystemProgram"),"\u4e0a\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u6765\u8fd4\u56de\u521b\u5efa\u6240\u6709\u8d26\u6237\u7684\u6307\u4ee4\u3002\u800c\u8fd9\u91cc\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u662f",(0,o.kt)("inlineCode",{parentName:"p"},"spl-token"),"\u5e93\u4e2d\u7684\u4e00\u4e2a\u8f85\u52a9\u51fd\u6570\uff0c\u5b83\u4f1a\u63d0\u4ea4\u4e00\u4e2a\u5305\u542b\u4e24\u4e2a\u6307\u4ee4\u7684\u4ea4\u6613\u3002\u7b2c\u4e00\u4e2a\u6307\u4ee4\u7528\u4e8e\u521b\u5efa\u8d26\u6237\uff0c\u7b2c\u4e8c\u4e2a\u6307\u4ee4\u7528\u4e8e\u5c06\u8d26\u6237\u521d\u59cb\u5316\u4e3a\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u5c31\u50cf\u521b\u5efa\u4e00\u4e2aToken Mint\u4e00\u6837\uff0c\u5982\u679c\u6211\u4eec\u9700\u8981\u624b\u52a8\u6784\u5efa",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u7684\u4ea4\u6613\uff0c\u6211\u4eec\u53ef\u4ee5\u590d\u5236\u51fd\u6570\u5728\u5185\u90e8\u6240\u505a\u7684\u64cd\u4f5c\uff1a"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"getMint"),"\u6765\u68c0\u7d22\u4e0eMint\u76f8\u5173\u7684\u6570\u636e"),(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"getAccountLenForMint"),"\u51fd\u6570\u6765\u8ba1\u7b97\u4ee3\u5e01\u8d26\u6237\u6240\u9700\u7684\u7a7a\u95f4"),(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"getMinimumBalanceForRentExemption"),"\u51fd\u6570\u6765\u8ba1\u7b97\u79df\u91d1\u8c41\u514d\u6240\u9700\u7684Lamports\u6570\u91cf"),(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"SystemProgram.createAccount"),"\u548c",(0,o.kt)("inlineCode",{parentName:"li"},"createInitializeAccountInstruction"),"\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4ea4\u6613\u3002\u8bf7\u6ce8\u610f\uff0c\u8fd9\u91cc\u7684",(0,o.kt)("inlineCode",{parentName:"li"},"createAccount"),"\u662f\u6765\u81ea",(0,o.kt)("inlineCode",{parentName:"li"},"@solana/web3.js"),"\uff0c\u7528\u4e8e\u521b\u5efa\u4e00\u4e2a\u901a\u7528\u7684\u65b0\u8d26\u6237\u3002",(0,o.kt)("inlineCode",{parentName:"li"},"createInitializeAccountInstruction"),"\u4f7f\u7528\u8fd9\u4e2a\u65b0\u8d26\u6237\u6765\u521d\u59cb\u5316\u65b0\u7684\u4ee3\u5e01\u8d26\u6237\u3002")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildCreateTokenAccountTransaction(\n connection: web3.Connection,\n payer: web3.PublicKey,\n mint: web3.PublicKey\n): Promise {\n const mintState = await token.getMint(connection, mint)\n const accountKeypair = await web3.Keypair.generate()\n const space = token.getAccountLenForMint(mintState);\n const lamports = await connection.getMinimumBalanceForRentExemption(space);\n const programId = token.TOKEN_PROGRAM_ID\n\n const transaction = new web3.Transaction().add(\n web3.SystemProgram.createAccount({\n fromPubkey: payer,\n newAccountPubkey: accountKeypair.publicKey,\n space,\n lamports,\n programId,\n }),\n token.createInitializeAccountInstruction(\n accountKeypair.publicKey,\n mint,\n payer,\n programId\n )\n );\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u5173\u8054\u4ee3\u5e01\u8d26\u6237"},"\u5173\u8054\u4ee3\u5e01\u8d26\u6237"),(0,o.kt)("p",null,"\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u662f\u4e00\u79cd\u4f7f\u7528\u6240\u6709\u8005\u7684\u516c\u94a5\u548c\u4ee3\u5e01\u94f8\u5e01\u5730\u5740\u6d3e\u751f\u51fa\u7684\u4ee3\u5e01\u8d26\u6237\u3002\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u63d0\u4f9b\u4e86\u4e00\u79cd\u786e\u5b9a\u6027\u7684\u65b9\u5f0f\uff0c\u7528\u4e8e\u627e\u5230\u7279\u5b9a\u516c\u94a5\u6240\u62e5\u6709\u7684\u7279\u5b9a\u4ee3\u5e01\u94f8\u5e01\u7684\u4ee3\u5e01\u8d26\u6237\u3002\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u521b\u5efa\u4ee3\u5e01\u8d26\u6237\u65f6\uff0c\u60a8\u5e0c\u671b\u5b83\u6210\u4e3a\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u4e0e\u4e0a\u8ff0\u7c7b\u4f3c\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"spl-token"),"\u5e93\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"createAssociatedTokenAccount"),"\u51fd\u6570\u521b\u5efa\u4e00\u4e2a\u5173\u8054\u7684\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const associatedTokenAccount = await createAssociatedTokenAccount(\n connection,\n payer,\n mint,\n owner,\n);\n")),(0,o.kt)("p",null,"\u8be5\u51fd\u6570\u8fd4\u56de\u65b0\u5173\u8054\u4ee4\u724c\u8d26\u6237\u7684\u516c\u94a5\uff0c\u5e76\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mint")," - \u4e0e\u65b0\u4ee3\u5e01\u8d26\u6237\u5173\u8054\u7684\u4ee3\u5e01\u94f8\u5e01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u65b0\u4ee3\u5e01\u8d26\u6237\u7684\u6240\u6709\u8005\u8d26\u6237")),(0,o.kt)("p",null,"\u60a8\u8fd8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"getOrCreateAssociatedTokenAccount"),"\u6765\u83b7\u53d6\u4e0e\u7ed9\u5b9a\u5730\u5740\u5173\u8054\u7684Token\u8d26\u6237\uff0c\u5982\u679c\u8be5\u8d26\u6237\u4e0d\u5b58\u5728\uff0c\u5219\u521b\u5efa\u5b83\u3002\u4f8b\u5982\uff0c\u5982\u679c\u60a8\u6b63\u5728\u7f16\u5199\u4ee3\u7801\u5411\u7ed9\u5b9a\u7528\u6237\u7a7a\u6295\u4ee3\u5e01\uff0c\u60a8\u5f88\u53ef\u80fd\u4f1a\u4f7f\u7528\u6b64\u51fd\u6570\u6765\u786e\u4fdd\u4e0e\u7ed9\u5b9a\u7528\u6237\u5173\u8054\u7684Token\u8d26\u6237\u5728\u4e0d\u5b58\u5728\u65f6\u88ab\u521b\u5efa\u3002"),(0,o.kt)("p",null,"\u5728\u5e95\u5c42\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"createAssociatedTokenAccount"),"\u6b63\u5728\u6267\u884c\u4e24\u4e2a\u64cd\u4f5c\uff1a"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528 ",(0,o.kt)("inlineCode",{parentName:"li"},"getAssociatedTokenAddress"),"\u4ece\u94f8\u5e01\u548c\u6240\u6709\u8005\u4e2d\u63a8\u5bfc\u51fa\u5173\u8054\u7684\u4ee3\u5e01\u8d26\u6237\u5730\u5740"),(0,o.kt)("li",{parentName:"ol"},"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"li"},"createAssociatedTokenAccountInstruction"),"\u6307\u4ee4\u6784\u5efa\u4ea4\u6613")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildCreateAssociatedTokenAccountTransaction(\n payer: web3.PublicKey,\n mint: web3.PublicKey\n): Promise {\n const associatedTokenAddress = await token.getAssociatedTokenAddress(mint, payer, false);\n\n const transaction = new web3.Transaction().add(\n token.createAssociatedTokenAccountInstruction(\n payer,\n associatedTokenAddress,\n payer,\n mint\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"mint-token"},"Mint token"),(0,o.kt)("p",null,"\u94f8\u5e01\u662f\u5c06\u65b0\u4ee3\u5e01\u53d1\u884c\u5230\u6d41\u901a\u4e2d\u7684\u8fc7\u7a0b\u3002\u5f53\u4f60\u94f8\u9020\u4ee3\u5e01\u65f6\uff0c\u4f60\u589e\u52a0\u4e86\u4ee3\u5e01\u94f8\u9020\u7684\u4f9b\u5e94\uff0c\u5e76\u5c06\u65b0\u94f8\u9020\u7684\u4ee3\u5e01\u5b58\u5165\u4ee3\u5e01\u8d26\u6237\u3002\u53ea\u6709\u4ee3\u5e01\u94f8\u9020\u7684\u94f8\u5e01\u673a\u6784\u624d\u88ab\u5141\u8bb8\u94f8\u9020\u65b0\u7684\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"spl-token"),"\u5e93\u6765\u94f8\u9020\u4ee3\u5e01\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"mintTo"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await mintTo(\n connection,\n payer,\n mint,\n destination,\n authority,\n amount\n);\n")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"mintTo"),"\u51fd\u6570\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684TransactionSignature\u3002mintTo\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"mint")," - \u4e0e\u65b0\u4ee3\u5e01\u8d26\u6237\u5173\u8054\u7684\u4ee3\u5e01\u94f8\u5e01")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"destination")," - \u63a5\u6536\u65b0\u94f8\u9020\u4ee3\u5e01\u7684\u4ee3\u5e01\u8d26\u6237")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"authority")," - \u6388\u6743\u7528\u4e8e\u94f8\u9020\u4ee3\u5e01\u7684\u8d26\u6237")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"amount")," - \u5728\u5c0f\u6570\u70b9\u4e4b\u5916\u94f8\u9020\u7684\u4ee3\u5e01\u7684\u539f\u59cb\u6570\u91cf\uff0c\u4f8b\u5982\uff0c\u5982\u679cScrooge Coin\u7684\u5c0f\u6570\u5c5e\u6027\u8bbe\u7f6e\u4e3a2\uff0c\u5219\u8981\u83b7\u5f971\u4e2a\u5b8c\u6574\u7684Scrooge Coin\uff0c\u60a8\u9700\u8981\u5c06\u6b64\u5c5e\u6027\u8bbe\u7f6e\u4e3a100\u3002"),(0,o.kt)("p",{parentName:"li"},"\u5728\u4ee3\u5e01\u94f8\u9020\u5b8c\u6210\u540e\uff0c\u5c06\u94f8\u5e01\u6743\u9650\u66f4\u65b0\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"null"),"\u5e76\u4e0d\u7f55\u89c1\u3002\u8fd9\u5c06\u8bbe\u5b9a\u6700\u5927\u4f9b\u5e94\u91cf\uff0c\u5e76\u786e\u4fdd\u672a\u6765\u65e0\u6cd5\u518d\u94f8\u9020\u4efb\u4f55\u4ee3\u5e01\u3002\u76f8\u53cd\u5730\uff0c\u53ef\u4ee5\u5c06\u94f8\u5e01\u6743\u9650\u6388\u4e88\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u4ee5\u4fbf\u4ee3\u5e01\u53ef\u4ee5\u6839\u636e\u56fa\u5b9a\u95f4\u9694\u6216\u53ef\u7f16\u7a0b\u6761\u4ef6\u81ea\u52a8\u94f8\u9020\u3002"))),(0,o.kt)("p",null," \u5728\u5185\u90e8\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"mintTo"),"\u51fd\u6570\u53ea\u662f\u4f7f\u7528\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"createMintToInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildMintToTransaction(\n authority: web3.PublicKey,\n mint: web3.PublicKey,\n amount: number,\n destination: web3.PublicKey\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createMintToInstruction(\n mint,\n destination,\n authority,\n amount\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u8f6c\u79fb\u4ee3\u5e01"},"\u8f6c\u79fb\u4ee3\u5e01"),(0,o.kt)("p",null," SPL-Token\u8f6c\u8d26\u9700\u8981\u53d1\u9001\u65b9\u548c\u63a5\u6536\u65b9\u90fd\u62e5\u6709\u76f8\u5e94\u4ee3\u5e01\u7684\u8d26\u6237\u3002\u4ee3\u5e01\u4ece\u53d1\u9001\u65b9\u7684\u8d26\u6237\u8f6c\u79fb\u5230\u63a5\u6536\u65b9\u7684\u8d26\u6237\u3002"),(0,o.kt)("p",null," \u5728\u83b7\u53d6\u63a5\u6536\u8005\u7684\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u65f6\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"getOrCreateAssociatedTokenAccount"),"\u51fd\u6570\u6765\u786e\u4fdd\u5176\u4ee3\u5e01\u8d26\u6237\u5728\u8f6c\u8d26\u4e4b\u524d\u5df2\u5b58\u5728\u3002\u53ea\u9700\u8bb0\u4f4f\uff0c\u5982\u679c\u8d26\u6237\u5c1a\u4e0d\u5b58\u5728\uff0c\u8be5\u51fd\u6570\u5c06\u521b\u5efa\u8be5\u8d26\u6237\uff0c\u5e76\u4e14\u4ea4\u6613\u7684\u4ed8\u6b3e\u65b9\u5c06\u88ab\u6263\u9664\u6240\u9700\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"lamports"),"\u7528\u4e8e\u8d26\u6237\u521b\u5efa\u3002"),(0,o.kt)("p",null," \u4e00\u65e6\u60a8\u77e5\u9053\u63a5\u6536\u8005\u7684\u4ee4\u724c\u8d26\u6237\u5730\u5740\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528spl-token\u5e93\u7684\u8f6c\u8d26\u51fd\u6570\u8fdb\u884c\u4ee4\u724c\u8f6c\u8d26\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await transfer(\n connection,\n payer,\n source,\n destination,\n owner,\n amount\n)\n")),(0,o.kt)("p",null,"\u8f6c\u8d26\u51fd\u6570\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"TransactionSignature"),"\u3002\n\u8f6c\u8d26\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"source")," - \u53d1\u9001\u4ee3\u5e01\u7684\u4ee3\u5e01\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"destination")," - \u63a5\u6536\u4ee3\u5e01\u7684\u4ee3\u5e01\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u53d1\u9001\u4ee3\u5e01\u7684\u4ee3\u5e01\u8d26\u6237\u7684\u6240\u6709\u8005"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"amount")," - \u8981\u8f6c\u79fb\u7684\u4ee3\u5e01\u7684\u6570\u91cf")),(0,o.kt)("p",null,"\u5728\u5e95\u5c42\uff0c\u8f6c\u8d26\u51fd\u6570\u53ea\u662f\u6839\u636e\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"createTransferInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildTransferTransaction(\n source: web3.PublicKey,\n destination: web3.PublicKey,\n owner: web3.PublicKey,\n amount: number\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createTransferInstruction(\n source,\n destination,\n owner,\n amount,\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u71c3\u70e7\u4ee3\u5e01"},"\u71c3\u70e7\u4ee3\u5e01"),(0,o.kt)("p",null,"\u71c3\u70e7\u4ee3\u5e01\u662f\u51cf\u5c11\u7279\u5b9a\u4ee3\u5e01\u53d1\u884c\u91cf\u7684\u8fc7\u7a0b\u3002\u71c3\u70e7\u4ee3\u5e01\u4f1a\u5c06\u5176\u4ece\u7279\u5b9a\u4ee3\u5e01\u8d26\u6237\u548c\u66f4\u5e7f\u6cdb\u7684\u6d41\u901a\u4e2d\u79fb\u9664\u3002"),(0,o.kt)("p",null,"\u4f7f\u7528spl-token\u5e93\u70e7\u6bc1\u4ee3\u5e01\u65f6\uff0c\u60a8\u9700\u8981\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await burn(\n connection,\n payer,\n account,\n mint,\n owner,\n amount\n)\n")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"TransactionSignature"),"\u3002",(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"account")," - \u8981\u71c3\u70e7\u7684\u4ee3\u5e01\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"mint")," - \u4e0e\u4ee3\u5e01\u8d26\u6237\u5173\u8054\u7684\u4ee3\u5e01\u94f8\u5e01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u4ee3\u5e01\u8d26\u6237\u7684\u6240\u6709\u8005"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"amount")," - \u8981\u71c3\u70e7\u7684\u4ee3\u5e01\u7684\u6570\u91cf")),(0,o.kt)("p",null,"\u5728\u5185\u90e8\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"createBurnInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e86\u4e00\u4e2a\u4ea4\u6613\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildBurnTransaction(\n account: web3.PublicKey,\n mint: web3.PublicKey,\n owner: web3.PublicKey,\n amount: number\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createBurnInstruction(\n account,\n mint,\n owner,\n amount\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u6279\u51c6\u59d4\u6d3e"},"\u6279\u51c6\u59d4\u6d3e"),(0,o.kt)("p",null,"\u6279\u51c6\u59d4\u6258\u662f\u6388\u6743\u53e6\u4e00\u4e2a\u8d26\u6237\u4ece\u4ee3\u5e01\u8d26\u6237\u4e2d\u8f6c\u79fb\u6216\u9500\u6bc1\u4ee3\u5e01\u7684\u8fc7\u7a0b\u3002\u4f7f\u7528\u59d4\u6258\u65f6\uff0c\u5bf9\u4ee3\u5e01\u8d26\u6237\u7684\u63a7\u5236\u6743\u4ecd\u5f52\u539f\u59cb\u6240\u6709\u8005\u6240\u6709\u3002\u59d4\u6258\u8d26\u6237\u53ef\u4ee5\u5728\u539f\u59cb\u6240\u6709\u8005\u6279\u51c6\u59d4\u6258\u65f6\u6307\u5b9a\u53ef\u8f6c\u79fb\u6216\u9500\u6bc1\u7684\u4ee3\u5e01\u6700\u5927\u6570\u91cf\u3002\u8bf7\u6ce8\u610f\uff0c\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\u5728\u4efb\u4f55\u7ed9\u5b9a\u65f6\u95f4\u53ea\u80fd\u5173\u8054\u4e00\u4e2a\u59d4\u6258\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u4f7f\u7528spl-token\u5e93\u6765\u6279\u51c6\u59d4\u6258\u4eba\uff0c\u60a8\u9700\u8981\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"approve"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await approve(\n connection,\n payer,\n account,\n delegate,\n owner,\n amount\n )\n")),(0,o.kt)("p",null,"\u6279\u51c6\u529f\u80fd\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"TransactionSignature"),"\u3002\u6279\u51c6\u529f\u80fd\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u652f\u4ed8\u4eba\u7684\u8d26\u6237\u7528\u4e8e\u4ea4\u6613"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"account")," - \u8003\u8651\u5c06\u4ee3\u5e01\u4ece\u4ee4\u724c\u8d26\u6237\u59d4\u6258\u51fa\u53bb"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"delegate")," - \u59d4\u6258\u8d26\u6237\u7684\u6240\u6709\u8005\u6388\u6743\u8f6c\u79fb\u6216\u9500\u6bc1\u4ee3\u5e01"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u8d26\u6237\u7684\u6240\u6709\u8005\u4ee4\u724c\u8d26\u6237\u7684\u6240\u6709\u8005"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"amount")," - \u59d4\u6258\u8d26\u6237\u53ef\u4ee5\u8f6c\u79fb\u6216\u9500\u6bc1\u7684\u4ee3\u5e01\u7684\u6700\u5927\u6570\u91cf")),(0,o.kt)("p",null,"\u5728\u5185\u90e8\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"approve"),"\u51fd\u6570\u4f7f\u7528\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"createApproveInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildApproveTransaction(\n account: web3.PublicKey,\n delegate: web3.PublicKey,\n owner: web3.PublicKey,\n amount: number\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createApproveInstruction(\n account,\n delegate,\n owner,\n amount\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u64a4\u9500\u59d4\u6258"},"\u64a4\u9500\u59d4\u6258"),(0,o.kt)("p",null,"\u4e4b\u524d\u5df2\u6279\u51c6\u7684\u4ee3\u8868\u4ee4\u724c\u8d26\u6237\u7684\u59d4\u6258\u53ef\u4ee5\u88ab\u64a4\u9500\u3002\u4e00\u65e6\u59d4\u6258\u88ab\u64a4\u9500\uff0c\u59d4\u6258\u4eba\u5c06\u65e0\u6cd5\u518d\u4ece\u6240\u6709\u8005\u7684\u4ee4\u724c\u8d26\u6237\u4e2d\u8f6c\u79fb\u4ee4\u724c\u3002\u4e4b\u524d\u6279\u51c6\u7684\u5269\u4f59\u91d1\u989d\u4e5f\u65e0\u6cd5\u518d\u7531\u59d4\u6258\u4eba\u8fdb\u884c\u8f6c\u79fb\u3002"),(0,o.kt)("p",null,"\u4f7f\u7528spl-token\u5e93\u64a4\u9500\u59d4\u6258\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"revoke"),"\u51fd\u6570\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"const transactionSignature = await revoke(\n connection,\n payer,\n account,\n owner,\n )\n")),(0,o.kt)("p",null,"\u64a4\u9500\u51fd\u6570\u8fd4\u56de\u4e00\u4e2a\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"TransactionSignature"),"\u3002\u64a4\u9500\u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"connection")," - \u4e0e\u96c6\u7fa4\u7684JSON-RPC\u8fde\u63a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"payer")," - \u4ea4\u6613\u7684\u4ed8\u6b3e\u4eba\u7684\u516c\u94a5"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"account")," - \u64a4\u9500\u4ee3\u8868\u6743\u9650\u7684\u4ee4\u724c\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"owner")," - \u4ee4\u724c\u8d26\u6237\u7684\u6240\u6709\u8005")),(0,o.kt)("p",null,"\u5728\u5e95\u5c42\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"revoke"),"\u51fd\u6570\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"createRevokeInstruction"),"\u51fd\u6570\u83b7\u53d6\u7684\u6307\u4ee4\u521b\u5efa\u4e86\u4e00\u4e2a\u4ea4\u6613\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3'\nimport * as token from '@solana/spl-token'\n\nasync function buildRevokeTransaction(\n account: web3.PublicKey,\n owner: web3.PublicKey,\n): Promise {\n const transaction = new web3.Transaction().add(\n token.createRevokeInstruction(\n account,\n owner,\n )\n )\n\n return transaction\n}\n")),(0,o.kt)("h2",{id:"\u6f14\u793a"},"\u6f14\u793a"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u4e0eToken\u7a0b\u5e8f\u4e0a\u7684\u6307\u4ee4\u8fdb\u884c\u4ea4\u4e92\u7684\u811a\u672c\u3002\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2aToken\u94f8\u9020\u5382\uff0c\u521b\u5efaToken\u8d26\u6237\uff0c\u94f8\u9020\u4ee3\u5e01\uff0c\u6279\u51c6\u59d4\u6258\u4eba\uff0c\u8f6c\u79fb\u4ee3\u5e01\uff0c\u5e76\u9500\u6bc1\u4ee3\u5e01\u3002"),(0,o.kt)("h3",{id:"1-\u57fa\u672c\u811a\u624b\u67b6"},"1. \u57fa\u672c\u811a\u624b\u67b6"),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u4ece\u4e00\u4e9b\u57fa\u672c\u7684\u811a\u624b\u67b6\u5f00\u59cb\u3002\u60a8\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u9700\u8981\u8bbe\u7f6e\u9879\u76ee\uff0c\u4f46\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u4e2a\u7b80\u5355\u7684TypeScript\u9879\u76ee\uff0c\u5e76\u4f9d\u8d56\u4e8e",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/web3.js"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u5305\u3002"),(0,o.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728\u547d\u4ee4\u884c\u4e2d\u4f7f\u7528 ",(0,o.kt)("inlineCode",{parentName:"p"},"npx create-solana-client [INSERT_NAME_HERE] --initialize-keypair")," \u547d\u4ee4\u6765\u514b\u9686\u6211\u4eec\u5c06\u8981\u5f00\u59cb\u7684",(0,o.kt)("a",{parentName:"p",href:"https://github.com/Unboxed-Software/solana-npx-client-template/tree/with-keypair-env"},"\u6a21\u677f"),"\u3002\u6216\u8005\u60a8\u4e5f\u53ef\u4ee5\u624b\u52a8\u5728\u6b64\u5904\u514b\u9686\u6a21\u677f\u3002\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u60a8\u76f4\u63a5\u4f7f\u7528 git \u4ed3\u5e93\u4f5c\u4e3a\u8d77\u70b9\uff0c\u6211\u4eec\u5c06\u4ece ",(0,o.kt)("inlineCode",{parentName:"p"},"with-keypair-env")," \u5206\u652f\u5f00\u59cb\u3002"),(0,o.kt)("p",null,"\u7136\u540e\uff0c\u60a8\u9700\u8981\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u4e0a\u6dfb\u52a0\u4e00\u4e2a\u4f9d\u8d56\u9879\u3002\u4ece\u65b0\u521b\u5efa\u7684\u76ee\u5f55\u4e2d\u7684\u547d\u4ee4\u884c\u4e2d\uff0c\u4f7f\u7528\u547d\u4ee4",(0,o.kt)("inlineCode",{parentName:"p"},"npm install @solana/spl-token"),"\u3002"),(0,o.kt)("h3",{id:"2-\u521b\u5efatoken-mint"},"2. \u521b\u5efaToken Mint"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u5e93\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u4ece\u6587\u4ef6\u9876\u90e8\u5bfc\u5165\u5b83\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"import * as token from '@solana/spl-token'\n")),(0,o.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u58f0\u660e\u4e00\u4e2a\u540d\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"createNewMint"),"\u7684\u65b0\u51fd\u6570\uff0c\u5b83\u5e26\u6709\u53c2\u6570",(0,o.kt)("inlineCode",{parentName:"p"},"connection"),"\u3001",(0,o.kt)("inlineCode",{parentName:"p"},"payer"),"\u3001",(0,o.kt)("inlineCode",{parentName:"p"},"mintAuthority"),"\u3001",(0,o.kt)("inlineCode",{parentName:"p"},"freezeAuthority"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"decimals"),"\u3002"),(0,o.kt)("p",null,"\u5728\u51fd\u6570Import\u7684\u4e3b\u4f53\u4e2d\uff0c\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"@solana/spl-token"),"\u4e2d\u521b\u5efa",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u51fd\u6570\uff0c\u7136\u540e\u521b\u5efa\u4e00\u4e2a\u8c03\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"createMint"),"\u7684\u51fd\u6570"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function createNewMint(\n connection: web3.Connection,\n payer: web3.Keypair,\n mintAuthority: web3.PublicKey,\n freezeAuthority: web3.PublicKey,\n decimals: number\n): Promise {\n\n const tokenMint = await token.createMint(\n connection,\n payer,\n mintAuthority,\n freezeAuthority,\n decimals\n );\n\n console.log(\n `Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`\n );\n\n return tokenMint;\n}\n")),(0,o.kt)("p",null,"\u5b8c\u6210\u8be5\u529f\u80fd\u540e\uff0c\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"main"),"\u51fd\u6570\u7684\u4e3b\u4f53\u4e2d\u8c03\u7528\u5b83\uff0c\u5c06",(0,o.kt)("inlineCode",{parentName:"p"},"user"),"\u8bbe\u7f6e\u4e3a\u4ed8\u6b3e\u65b9\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"mintAuthority"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"freezeAuthority"),"\u3002"),(0,o.kt)("p",null,"\u521b\u5efa\u65b0\u7684\u94f8\u5e01\u540e\uff0c\u8ba9\u6211\u4eec\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"getMint"),"\u51fd\u6570\u83b7\u53d6\u8d26\u6237\u6570\u636e\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728\u540d\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"mintInfo"),"\u7684\u53d8\u91cf\u4e2d\u3002\u7a0d\u540e\u6211\u4eec\u5c06\u4f7f\u7528\u8fd9\u4e9b\u6570\u636e\u6765\u8c03\u6574\u94f8\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n}\n')),(0,o.kt)("h3",{id:"3-\u521b\u5efa\u4ee4\u724c\u8d26\u6237"},"3. \u521b\u5efa\u4ee4\u724c\u8d26\u6237"),(0,o.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u521b\u5efa\u4e86\u94f8\u5e01\u673a\u6784\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u4ee3\u5e01\u8d26\u6237\uff0c\u6307\u5b9a\u7528\u6237\u4e3a\u6240\u6709\u8005\u3002"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Token\u8d26\u6237\uff0c\u5e76\u53ef\u4ee5\u9009\u62e9\u6307\u5b9aToken\u8d26\u6237\u7684\u5730\u5740\u3002\u8bf7\u6ce8\u610f\uff0c\u5982\u679c\u6ca1\u6709\u63d0\u4f9b\u5730\u5740\uff0c",(0,o.kt)("inlineCode",{parentName:"p"},"createAccount"),"\u51fd\u6570\u5c06\u9ed8\u8ba4\u4f7f\u7528\u901a\u8fc7",(0,o.kt)("inlineCode",{parentName:"p"},"mint"),"\u548c",(0,o.kt)("inlineCode",{parentName:"p"},"owner"),"\u6d3e\u751f\u7684\u5173\u8054Token\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u53e6\u5916\uff0c\u51fd\u6570",(0,o.kt)("inlineCode",{parentName:"p"},"createAssociatedTokenAccount"),"\u4e5f\u4f1a\u6839\u636e\u4ee3\u5e01\u548c\u6240\u6709\u8005\u7684\u516c\u94a5\u6d3e\u751f\u51fa\u76f8\u540c\u5730\u5740\u7684\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u4e3a\u4e86\u8fdb\u884c\u6f14\u793a\uff0c\u6211\u4eec\u5c06\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"thegetOrCreateAssociatedTokenAccount"),"\u51fd\u6570\u6765\u521b\u5efa\u6211\u4eec\u7684\u4ee3\u5e01\u8d26\u6237\u3002\u5982\u679c\u8be5\u51fd\u6570\u5df2\u5b58\u5728\uff0c\u5219\u83b7\u53d6\u4ee3\u5e01\u8d26\u6237\u7684\u5730\u5740\u3002\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u5219\u5728\u9002\u5f53\u7684\u5730\u5740\u4e0a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u5173\u8054\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function createTokenAccount(\n connection: web3.Connection,\n payer: web3.Keypair,\n mint: web3.PublicKey,\n owner: web3.PublicKey\n) {\n const tokenAccount = await token.getOrCreateAssociatedTokenAccount(\n connection,\n payer,\n mint,\n owner\n )\n\n console.log(\n `Token Account: https://explorer.solana.com/address/${tokenAccount.address}?cluster=devnet`\n )\n\n return tokenAccount\n}\n")),(0,o.kt)("p",null,"\u5728\u4e3b\u51fd\u6570\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u8c03\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"createTokenAccount"),"\u7684\u8bed\u53e5\uff0c\u5c06\u4e4b\u524d\u521b\u5efa\u7684\u8d27\u5e01\u4f20\u9012\u8fdb\u53bb\uff0c\u5e76\u5c06\u7528\u6237\u8bbe\u7f6e\u4e3a\u652f\u4ed8\u8005\u548c\u6240\u6709\u8005\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n}\n')),(0,o.kt)("h3",{id:"4-mint-token"},"4. Mint token"),(0,o.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u6709\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u548c\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\uff0c\u8ba9\u6211\u4eec\u5c06\u4ee3\u5e01\u94f8\u9020\u5230\u4ee3\u5e01\u8d26\u6237\u4e2d\u3002\u8bf7\u6ce8\u610f\uff0c\u53ea\u6709\u94f8\u5e01\u6388\u6743\u8005\u624d\u80fd\u5c06\u65b0\u7684\u4ee3\u5e01\u94f8\u9020\u5230\u4ee3\u5e01\u8d26\u6237\u4e2d\u3002\u56de\u60f3\u4e00\u4e0b\uff0c\u6211\u4eec\u5c06\u7528\u6237\u8bbe\u7f6e\u4e3a\u6211\u4eec\u521b\u5efa\u7684\u4ee3\u5e01\u7684\u94f8\u5e01\u6388\u6743\u8005\u3002"),(0,o.kt)("p",null,"\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"mintTokens"),"\u7684\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u4f7f\u7528spl-token\u51fd\u6570",(0,o.kt)("inlineCode",{parentName:"p"},"mintTo"),"\u6765\u94f8\u9020\u4ee3\u5e01\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function mintTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n mint: web3.PublicKey,\n destination: web3.PublicKey,\n authority: web3.Keypair,\n amount: number\n) {\n const transactionSignature = await token.mintTo(\n connection,\n payer,\n mint,\n destination,\n authority,\n amount\n )\n\n console.log(\n `Mint Token Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u5728\u4e3b\u51fd\u6570\u4e2d\u4f7f\u7528\u4e4b\u524d\u521b\u5efa\u7684 ",(0,o.kt)("inlineCode",{parentName:"p"},"mint")," \u548c ",(0,o.kt)("inlineCode",{parentName:"p"},"tokenAccount")," \u6765\u8c03\u7528\u8be5\u51fd\u6570\u3002"),(0,o.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u6211\u4eec\u9700\u8981\u6839\u636e\u94f8\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u8c03\u6574\u8f93\u5165\u91d1\u989d\u3002\u6211\u4eec\u7684\u94f8\u5e01\u4ee3\u5e01\u5177\u67092\u4f4d\u5c0f\u6570\u7cbe\u5ea6\u3002\u5982\u679c\u6211\u4eec\u53ea\u6307\u5b9a100\u4f5c\u4e3a\u8f93\u5165\u91d1\u989d\uff0c\u90a3\u4e48\u53ea\u4f1a\u94f8\u90201\u4e2a\u4ee3\u5e01\u5230\u6211\u4eec\u7684\u4ee3\u5e01\u8d26\u6237\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n}\n')),(0,o.kt)("h3",{id:"5-\u6279\u51c6\u59d4\u6d3e"},"5. \u6279\u51c6\u59d4\u6d3e"),(0,o.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u6709\u4e86\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u548c\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\uff0c\u8ba9\u6211\u4eec\u6388\u6743\u4e00\u4e2a\u4ee3\u8868\u6765\u4ee3\u8868\u6211\u4eec\u8f6c\u79fb\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"approveDelegate"),"\u7684\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u4f7f\u7528spl-token\u51fd\u6570",(0,o.kt)("inlineCode",{parentName:"p"},"approve"),"\u6765\u94f8\u9020\u4ee3\u5e01\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function approveDelegate(\n connection: web3.Connection,\n payer: web3.Keypair,\n account: web3.PublicKey,\n delegate: web3.PublicKey,\n owner: web3.Signer | web3.PublicKey,\n amount: number\n) {\n const transactionSignature = await token.approve(\n connection,\n payer,\n account,\n delegate,\n owner,\n amount\n )\n\n console.log(\n `Approve Delegate Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u9996\u5148\uff0c\u5728\u4e3b\u51fd\u6570\u4e2d\uff0c\u8ba9\u6211\u4eec\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9\u6765\u4ee3\u8868\u59d4\u6258\u8d26\u6237\u3002\u7136\u540e\uff0c\u8ba9\u6211\u4eec\u8c03\u7528\u6211\u4eec\u7684\u65b0",(0,o.kt)("inlineCode",{parentName:"p"},"approveDelegate"),"\u51fd\u6570\uff0c\u5e76\u6388\u6743\u59d4\u6258\u8d26\u6237\u4ece\u7528\u6237\u4ee3\u5e01\u8d26\u6237\u4e2d\u8f6c\u79fb\u6700\u591a50\u4e2a\u4ee3\u5e01\u3002\u8bb0\u5f97\u6839\u636e\u4ee3\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u8c03\u6574\u91d1\u989d\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n\n const delegate = web3.Keypair.generate();\n\n await approveDelegate(\n connection,\n user,\n tokenAccount.address,\n delegate.publicKey,\n user.publicKey,\n 50 * 10 ** mintInfo.decimals\n )\n}\n')),(0,o.kt)("h3",{id:"6-\u8f6c\u79fb\u4ee3\u5e01"},"6. \u8f6c\u79fb\u4ee3\u5e01"),(0,o.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u8ba9\u6211\u4eec\u4f7f\u7528spl-token\u5e93\u7684\u8f6c\u8d26\u529f\u80fd\uff0c\u8f6c\u79fb\u4e00\u4e9b\u521a\u521a\u94f8\u9020\u7684\u4ee3\u5e01\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function transferTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n source: web3.PublicKey,\n destination: web3.PublicKey,\n owner: web3.Keypair,\n amount: number\n) {\n const transactionSignature = await token.transfer(\n connection,\n payer,\n source,\n destination,\n owner,\n amount\n )\n\n console.log(\n `Transfer Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u5728\u6211\u4eec\u8c03\u7528\u8fd9\u4e2a\u65b0\u529f\u80fd\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u77e5\u9053\u5c06\u8981\u8f6c\u79fb\u4ee3\u5e01\u7684\u8d26\u6237\u3002"),(0,o.kt)("p",null,"\u5728\u4e3b\u51fd\u6570\u4e2d\uff0c\u8ba9\u6211\u4eec\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9\u4f5c\u4e3a\u63a5\u6536\u8005\uff08\u4f46\u8bf7\u8bb0\u4f4f\uff0c\u8fd9\u53ea\u662f\u6a21\u62df\u6709\u4eba\u53ef\u4ee5\u53d1\u9001\u4ee3\u5e01\u7ed9\u7684\u60c5\u51b5 - \u5728\u771f\u5b9e\u5e94\u7528\u4e2d\uff0c\u60a8\u9700\u8981\u77e5\u9053\u63a5\u6536\u4ee3\u5e01\u7684\u4eba\u7684\u94b1\u5305\u5730\u5740\uff09\u3002"),(0,o.kt)("p",null,"\u7136\u540e\uff0c\u4e3a\u63a5\u6536\u8005\u521b\u5efa\u4e00\u4e2a\u4ee4\u724c\u8d26\u6237\u3002\u6700\u540e\uff0c\u8ba9\u6211\u4eec\u8c03\u7528\u6211\u4eec\u7684\u65b0\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"transferTokens"),"\u51fd\u6570\uff0c\u5c06\u4ee4\u724c\u4ece\u7528\u6237\u4ee4\u724c\u8d26\u6237\u8f6c\u79fb\u5230\u63a5\u6536\u8005\u4ee4\u724c\u8d26\u6237\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u5728\u524d\u4e00\u6b65\u4e2d\u6279\u51c6\u7684\u59d4\u6258\u6765\u4ee3\u8868\u6211\u4eec\u6267\u884c\u8f6c\u8d26\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n\n const receiver = web3.Keypair.generate().publicKey\n const receiverTokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n receiver\n )\n\n const delegate = web3.Keypair.generate();\n await approveDelegate(\n connection,\n user,\n tokenAccount.address,\n delegate.publicKey,\n user.publicKey,\n 50 * 10 ** mintInfo.decimals\n )\n\n await transferTokens(\n connection,\n user,\n tokenAccount.address,\n receiverTokenAccount.address,\n delegate,\n 50 * 10 ** mintInfo.decimals\n )\n}\n')),(0,o.kt)("h3",{id:"7-\u64a4\u9500\u59d4\u6258"},"7. \u64a4\u9500\u59d4\u6258"),(0,o.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u4ee3\u5e01\u7684\u8f6c\u79fb\uff0c\u8ba9\u6211\u4eec\u4f7f\u7528spl-token\u5e93\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"revoke"),"\u51fd\u6570\u6765\u64a4\u9500\u59d4\u6258\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function revokeDelegate(\n connection: web3.Connection,\n payer: web3.Keypair,\n account: web3.PublicKey,\n owner: web3.Signer | web3.PublicKey,\n) {\n const transactionSignature = await token.revoke(\n connection,\n payer,\n account,\n owner,\n )\n\n console.log(\n `Revote Delegate Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u64a4\u9500\u5c06\u4f1a\u5c06\u4ee3\u5e01\u8d26\u6237\u7684\u59d4\u6258\u8bbe\u7f6e\u4e3a",(0,o.kt)("inlineCode",{parentName:"p"},"null"),"\uff0c\u5e76\u5c06\u59d4\u6258\u6570\u91cf\u91cd\u7f6e\u4e3a0\u3002\u6211\u4eec\u53ea\u9700\u8981\u4ee3\u5e01\u8d26\u6237\u548c\u7528\u6237\u6765\u6267\u884c\u8fd9\u4e2a\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u8c03\u7528\u6211\u4eec\u7684\u65b0",(0,o.kt)("inlineCode",{parentName:"p"},"revokeDelegate"),"\u51fd\u6570\u6765\u4ece\u7528\u6237\u7684\u4ee3\u5e01\u8d26\u6237\u4e2d\u64a4\u9500\u59d4\u6258\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n\n const receiver = web3.Keypair.generate().publicKey\n const receiverTokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n receiver\n )\n\n const delegate = web3.Keypair.generate();\n await approveDelegate(\n connection,\n user,\n tokenAccount.address,\n delegate.publicKey,\n user.publicKey,\n 50 * 10 ** mintInfo.decimals\n )\n\n await transferTokens(\n connection,\n user,\n tokenAccount.address,\n receiverTokenAccount.address,\n delegate,\n 50 * 10 ** mintInfo.decimals\n )\n\n await revokeDelegate(\n connection,\n user,\n tokenAccount.address,\n user.publicKey,\n )\n}\n')),(0,o.kt)("h3",{id:"8-\u71c3\u70e7\u4ee3\u5e01"},"8. \u71c3\u70e7\u4ee3\u5e01"),(0,o.kt)("p",null,"\u6700\u540e\uff0c\u8ba9\u6211\u4eec\u901a\u8fc7\u9500\u6bc1\u4e00\u4e9b\u4ee3\u5e01\u6765\u51cf\u5c11\u6d41\u901a\u91cf\u3002"),(0,o.kt)("p",null,"\u521b\u5efa\u4e00\u4e2a",(0,o.kt)("inlineCode",{parentName:"p"},"burnTokens"),"\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u4f7f\u7528spl-token\u5e93\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"burn"),"\u51fd\u6570\u5c06\u60a8\u7684\u4ee3\u5e01\u4f9b\u5e94\u91cf\u51cf\u5c11\u4e00\u534a\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"async function burnTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n account: web3.PublicKey,\n mint: web3.PublicKey,\n owner: web3.Keypair,\n amount: number\n) {\n const transactionSignature = await token.burn(\n connection,\n payer,\n account,\n mint,\n owner,\n amount\n )\n\n console.log(\n `Burn Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,o.kt)("p",null,"\u73b0\u5728\u5728\u4e3b\u51fd\u6570\u4e2d\u8c03\u7528\u8fd9\u4e2a\u65b0\u51fd\u6570\uff0c\u70e7\u6389\u7528\u6237\u4ee3\u5e01\u4e2d\u768425\u4e2a\u3002\u8bb0\u5f97\u6839\u636e\u94f8\u5e01\u7684\u5c0f\u6570\u7cbe\u5ea6\u8c03\u6574\u6570\u91cf\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n const mint = await createNewMint(\n connection,\n user,\n user.publicKey,\n user.publicKey,\n 2\n )\n\n const mintInfo = await token.getMint(connection, mint);\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey\n )\n\n await mintTokens(\n connection,\n user,\n mint,\n tokenAccount.address,\n user,\n 100 * 10 ** mintInfo.decimals\n )\n\n const receiver = web3.Keypair.generate().publicKey\n const receiverTokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n receiver\n )\n\n const delegate = web3.Keypair.generate();\n await approveDelegate(\n connection,\n user,\n tokenAccount.address,\n delegate.publicKey,\n user.publicKey,\n 50 * 10 ** mintInfo.decimals\n )\n\n await transferTokens(\n connection,\n user,\n tokenAccount.address,\n receiverTokenAccount.address,\n delegate,\n 50 * 10 ** mintInfo.decimals\n )\n\n await revokeDelegate(\n connection,\n user,\n tokenAccount.address,\n user.publicKey,\n )\n\n await burnTokens(\n connection,\n user,\n tokenAccount.address,\n mint, user,\n 25 * 10 ** mintInfo.decimals\n )\n}\n')),(0,o.kt)("h3",{id:"9-\u5168\u90e8\u6d4b\u8bd5\u4e00\u4e0b"},"9. \u5168\u90e8\u6d4b\u8bd5\u4e00\u4e0b"),(0,o.kt)("p",null,"\u6709\u4e86\u8fd9\u4e9b\uff0c\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"npm start"),"\u3002\u60a8\u5e94\u8be5\u5728\u63a7\u5236\u53f0\u4e0a\u770b\u5230\u4e00\u7cfb\u5217Solana Explorer\u94fe\u63a5\u7684\u65e5\u5fd7\u3002\u70b9\u51fb\u5b83\u4eec\uff0c\u770b\u770b\u6bcf\u4e2a\u6b65\u9aa4\u53d1\u751f\u4e86\u4ec0\u4e48\uff01\u60a8\u521b\u5efa\u4e86\u4e00\u4e2a\u65b0\u7684\u4ee3\u5e01\u94f8\u9020\uff0c\u521b\u5efa\u4e86\u4e00\u4e2a\u4ee3\u5e01\u8d26\u6237\uff0c\u94f8\u9020\u4e86100\u4e2a\u4ee3\u5e01\uff0c\u6279\u51c6\u4e86\u4e00\u4e2a\u59d4\u6258\u4eba\uff0c\u4f7f\u7528\u59d4\u6258\u4eba\u8f6c\u79fb\u4e8650\u4e2a\u4ee3\u5e01\uff0c\u64a4\u9500\u4e86\u59d4\u6258\u4eba\uff0c\u5e76\u70e7\u6bc1\u4e86\u53e6\u591625\u4e2a\u4ee3\u5e01\u3002\u60a8\u6b63\u5728\u6210\u4e3a\u4e00\u4e2a\u4ee3\u5e01\u4e13\u5bb6\u7684\u9053\u8def\u4e0a\u8fdb\u5c55\u987a\u5229\u3002"),(0,o.kt)("p",null,"\u5982\u679c\u4f60\u9700\u8981\u66f4\u591a\u65f6\u95f4\u6765\u5b8c\u6210\u8fd9\u4e2a\u9879\u76ee\u5e76\u611f\u5230\u8212\u9002\uff0c\u53ef\u4ee5\u67e5\u770b\u5b8c\u6574\u7684",(0,o.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-token-client"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801")),(0,o.kt)("h2",{id:"\u6311\u6218"},"\u6311\u6218"),(0,o.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u5efa\u7acb\u4e00\u4e9b\u4e1c\u897f\u4e86\u3002\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff0c\u5141\u8bb8\u7528\u6237\u521b\u5efa\u65b0\u7684\u94f8\u5e01\u3001\u521b\u5efa\u4ee3\u5e01\u8d26\u6237\u5e76\u94f8\u9020\u4ee3\u5e01\u3002"),(0,o.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u60a8\u5c06\u65e0\u6cd5\u76f4\u63a5\u4f7f\u7528\u6211\u4eec\u5728\u6f14\u793a\u4e2d\u4ecb\u7ecd\u7684\u8f85\u52a9\u529f\u80fd\u3002\u4e3a\u4e86\u4f7f\u7528Phantom\u94b1\u5305\u9002\u914d\u5668\u4e0eToken\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\uff0c\u60a8\u9700\u8981\u624b\u52a8\u6784\u5efa\u6bcf\u4e2a\u4ea4\u6613\u5e76\u5c06\u4ea4\u6613\u63d0\u4ea4\u7ed9Phantom\u8fdb\u884c\u6279\u51c6\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(4929).Z,width:"2560",height:"1440"})),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"\u4f60\u53ef\u4ee5\u4ece\u96f6\u5f00\u59cb\u6784\u5efa\u8fd9\u4e2a\u9879\u76ee\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u5728\u8fd9\u91cc\u4e0b\u8f7d",(0,o.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-token-frontend/tree/starter"},"\u8d77\u59cb\u4ee3\u7801"),"\u3002")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"CreateMint"),"\u7ec4\u4ef6\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Token Mint\u3002"))),(0,o.kt)("p",null,"\u521b\u5efa\u65b0\u7684\u8d27\u5e01\u65f6\uff0c\u65b0\u751f\u6210\u7684\u5bc6\u94a5\u5bf9\u4e5f\u5fc5\u987b\u5bf9\u4ea4\u6613\u8fdb\u884c\u7b7e\u540d\u3002\u5f53\u9664\u4e86\u8fde\u63a5\u7684\u94b1\u5305\u5916\u8fd8\u9700\u8981\u989d\u5916\u7684\u7b7e\u540d\u8005\u65f6\uff0c\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u683c\u5f0f\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},"sendTransaction(transaction, connection, {\n signers: [Keypair],\n})\n")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"CreateTokenAccount"),"\u7ec4\u4ef6\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Token\u8d26\u6237\u3002")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"MintToForm"),"\u7ec4\u4ef6\u4e2d\u94f8\u9020Mint\u4ee3\u5e01\u3002"))),(0,o.kt)("p",null,"\u5982\u679c\u4f60\u9047\u5230\u56f0\u96be\uff0c\u968f\u65f6\u53ef\u4ee5\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/ZYJLiu/solana-token-frontend"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002"),(0,o.kt)("p",null,"\u8bb0\u4f4f\uff0c\u5bf9\u8fd9\u4e9b\u6311\u6218\u8981\u6709\u521b\u610f\uff0c\u8ba9\u5b83\u4eec\u6210\u4e3a\u4f60\u81ea\u5df1\u7684\uff01"))}k.isMDXComponent=!0},5564:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/account-relationships-32aea7eebf191f14b24d07413a4830ef.png"},871:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/mint-account-fde825e14362cee72fa5485c8c97a171.png"},370:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/token-account-3c6963a8d1ed41b58a413bac17b70494.png"},4929:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/token-program-frontend-d8f9d4b149a1378eaf2dba5e2d3ecb8a.png"},6546:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/usdc-token-6b7f07ed350d9b3164b776019785ebf3.png"}}]); \ No newline at end of file diff --git a/assets/js/0e384e19.1e393f00.js b/assets/js/0e384e19.1e393f00.js deleted file mode 100644 index 9965af678..000000000 --- a/assets/js/0e384e19.1e393f00.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9671],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},m=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),c=s(a),k=r,h=c["".concat(p,".").concat(k)]||c[k]||u[k]||l;return a?n.createElement(h,o(o({ref:t},m),{},{components:a})):n.createElement(h,o({ref:t},m))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=k;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[c]="string"==typeof e?e:r,o[1]=i;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const l={sidebar_position:0,sidebar_label:"Start",sidebar_class_name:"green"},o="Start",i={unversionedId:"intro",id:"intro",title:"Start",description:"- Solana Co Learn",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/docs/intro",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/intro.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{sidebar_position:0,sidebar_label:"Start",sidebar_class_name:"green"},sidebar:"tutorialSidebar",next:{title:"Solana Co Learn tutorials",permalink:"/docs/Solana-Co-Learn/"}},p={},s=[{value:"awesome solana development",id:"awesome-solana-development",level:2},{value:"Solana development \u6587\u6863",id:"solana-development-\u6587\u6863",level:3},{value:"\u4e0d\u9519\u7684Solana\u6587\u7ae0",id:"\u4e0d\u9519\u7684solana\u6587\u7ae0",level:3},{value:"Solana explore",id:"solana-explore",level:2},{value:"\u5e0c\u671b\u540e\u9762\u8981\u505a\u7684\u4e8b\u60c5",id:"\u5e0c\u671b\u540e\u9762\u8981\u505a\u7684\u4e8b\u60c5",level:3}],m={toc:s},c="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"start"},"Start"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"/docs/Solana-Co-Learn/"},"Solana Co Learn"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://davirain-su.github.io/solana-cookbook-zh/"},"Solana Cook book Zh"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://www.coingecko.com/en/coins/solana"},"Solana On CoinGecko")))),(0,r.kt)("h2",{id:"awesome-solana-development"},"awesome solana development"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"\u6b22\u8fce\u63d0\u4ea4pr\u6301\u7eed\u8865\u5145\u8fd9\u4e2a\u5217\u8868")),(0,r.kt)("h3",{id:"solana-development-\u6587\u6863"},"Solana development \u6587\u6863"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.soldev.app/course"},"Intro Solana")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://spl.solana.com/"},"Solana Program Library")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.quicknode.com/guides/welcome"},"QuickNode Solana docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://solanacookbook.com/"},"Solana CookBook")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.solana.com/"},"Solana Docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.alchemy.com/reference/solana-api-quickstart"},"alchemy Solana docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.alchemy.com/"},"Alchemy Doc")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://learn.figment.io/protocols/solana"},"Figment Learn"))),(0,r.kt)("h3",{id:"\u4e0d\u9519\u7684solana\u6587\u7ae0"},"\u4e0d\u9519\u7684Solana\u6587\u7ae0"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://squads.so/blog"},"Squads blog")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.soldev.app/"},"Solana Dev"))),(0,r.kt)("h2",{id:"solana-explore"},"Solana explore"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://solscan.io/"},"https://solscan.io/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://explorer.solana.com/"},"https://explorer.solana.com/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://solanabeach.io/"},"https://solanabeach.io/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://solana.fm/"},"https://solana.fm/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.oklink.com/cn/sol"},"https://www.oklink.com/cn/sol")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://xray.helius.xyz/"},"https://xray.helius.xyz/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.hellomoon.io/solana"},"https://www.hellomoon.io/solana"))),(0,r.kt)("h3",{id:"\u5e0c\u671b\u540e\u9762\u8981\u505a\u7684\u4e8b\u60c5"},"\u5e0c\u671b\u540e\u9762\u8981\u505a\u7684\u4e8b\u60c5"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://solanamobile.com/zh/developers"},"Solana \u624b\u673aApp\u5f00\u53d1"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/solana-mobile/solana-mobile-stack-sdk#solana-mobile-stack-sdk"},"Solana Mobile Stack SDK")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/solana-mobile/mobile-wallet-adapter"},"Mobile Wallet Adapter")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.xnfts.dev/getting-started/introduction"},"backpack app\u5f00\u53d1"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e384e19.9ef7e243.js b/assets/js/0e384e19.9ef7e243.js new file mode 100644 index 000000000..099a28546 --- /dev/null +++ b/assets/js/0e384e19.9ef7e243.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9671],{3905:(e,a,t)=>{t.d(a,{Zo:()=>m,kt:()=>h});var n=t(7294);function l(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function o(e){for(var a=1;a=0||(l[t]=e[t]);return l}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var p=n.createContext({}),s=function(e){var a=n.useContext(p),t=a;return e&&(t="function"==typeof e?e(a):o(o({},a),e)),t},m=function(e){var a=s(e.components);return n.createElement(p.Provider,{value:a},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},k=n.forwardRef((function(e,a){var t=e.components,l=e.mdxType,r=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),c=s(t),k=l,h=c["".concat(p,".").concat(k)]||c[k]||u[k]||r;return t?n.createElement(h,o(o({ref:a},m),{},{components:t})):n.createElement(h,o({ref:a},m))}));function h(e,a){var t=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var r=t.length,o=new Array(r);o[0]=k;var i={};for(var p in a)hasOwnProperty.call(a,p)&&(i[p]=a[p]);i.originalType=e,i[c]="string"==typeof e?e:l,o[1]=i;for(var s=2;s{t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>s});var n=t(7462),l=(t(7294),t(3905));const r={sidebar_position:0,sidebar_label:"Start",sidebar_class_name:"green"},o="Start",i={unversionedId:"intro",id:"intro",title:"Start",description:"- Solana Co Learn",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/all-in-one-solana/docs/intro",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/intro.md",tags:[],version:"current",sidebarPosition:0,frontMatter:{sidebar_position:0,sidebar_label:"Start",sidebar_class_name:"green"},sidebar:"tutorialSidebar",next:{title:"Solana Co Learn tutorials",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/"}},p={},s=[{value:"awesome solana development",id:"awesome-solana-development",level:2},{value:"Solana development \u6587\u6863",id:"solana-development-\u6587\u6863",level:3},{value:"\u4e0d\u9519\u7684Solana\u6587\u7ae0",id:"\u4e0d\u9519\u7684solana\u6587\u7ae0",level:3},{value:"Solana explore",id:"solana-explore",level:2},{value:"\u5e0c\u671b\u540e\u9762\u8981\u505a\u7684\u4e8b\u60c5",id:"\u5e0c\u671b\u540e\u9762\u8981\u505a\u7684\u4e8b\u60c5",level:3}],m={toc:s},c="wrapper";function u(e){let{components:a,...t}=e;return(0,l.kt)(c,(0,n.Z)({},m,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"start"},"Start"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},(0,l.kt)("a",{parentName:"p",href:"/all-in-one-solana/docs/Solana-Co-Learn/"},"Solana Co Learn"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},(0,l.kt)("a",{parentName:"p",href:"https://davirain-su.github.io/solana-cookbook-zh/"},"Solana Cook book Zh"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("p",{parentName:"li"},(0,l.kt)("a",{parentName:"p",href:"https://www.coingecko.com/en/coins/solana"},"Solana On CoinGecko")))),(0,l.kt)("h2",{id:"awesome-solana-development"},"awesome solana development"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\u6b22\u8fce\u63d0\u4ea4pr\u6301\u7eed\u8865\u5145\u8fd9\u4e2a\u5217\u8868")),(0,l.kt)("h3",{id:"solana-development-\u6587\u6863"},"Solana development \u6587\u6863"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.soldev.app/course"},"Intro Solana")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://spl.solana.com/"},"Solana Program Library")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.quicknode.com/guides/welcome"},"QuickNode Solana docs")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://solanacookbook.com/"},"Solana CookBook")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://docs.solana.com/"},"Solana Docs")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://docs.alchemy.com/reference/solana-api-quickstart"},"alchemy Solana docs")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://docs.alchemy.com/"},"Alchemy Doc")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://learn.figment.io/protocols/solana"},"Figment Learn"))),(0,l.kt)("h3",{id:"\u4e0d\u9519\u7684solana\u6587\u7ae0"},"\u4e0d\u9519\u7684Solana\u6587\u7ae0"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://squads.so/blog"},"Squads blog")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.soldev.app/"},"Solana Dev"))),(0,l.kt)("h2",{id:"solana-explore"},"Solana explore"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://solscan.io/"},"https://solscan.io/")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://explorer.solana.com/"},"https://explorer.solana.com/")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://solanabeach.io/"},"https://solanabeach.io/")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://solana.fm/"},"https://solana.fm/")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.oklink.com/cn/sol"},"https://www.oklink.com/cn/sol")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://xray.helius.xyz/"},"https://xray.helius.xyz/")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.hellomoon.io/solana"},"https://www.hellomoon.io/solana"))),(0,l.kt)("h3",{id:"\u5e0c\u671b\u540e\u9762\u8981\u505a\u7684\u4e8b\u60c5"},"\u5e0c\u671b\u540e\u9762\u8981\u505a\u7684\u4e8b\u60c5"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://solanamobile.com/zh/developers"},"Solana \u624b\u673aApp\u5f00\u53d1"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/solana-mobile/solana-mobile-stack-sdk#solana-mobile-stack-sdk"},"Solana Mobile Stack SDK")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://github.com/solana-mobile/mobile-wallet-adapter"},"Mobile Wallet Adapter")))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://docs.xnfts.dev/getting-started/introduction"},"backpack app\u5f00\u53d1"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e5a820c.4060d1f6.js b/assets/js/0e5a820c.289585b4.js similarity index 67% rename from assets/js/0e5a820c.4060d1f6.js rename to assets/js/0e5a820c.289585b4.js index fd23e4894..3996ba308 100644 --- a/assets/js/0e5a820c.4060d1f6.js +++ b/assets/js/0e5a820c.289585b4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[83],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),u=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},c=function(e){var n=u(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(t),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return t?r.createElement(f,i(i({ref:n},c),{},{components:t})):r.createElement(f,i({ref:n},c))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=m;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[p]="string"==typeof e?e:a,i[1]=l;for(var u=2;u{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:37,sidebar_label:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",sidebar_class_name:"green"},i="\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",l={unversionedId:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README",id:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README",title:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",description:"- \u4f7f\u7528Gage\u5236\u4f5c\u7528\u6237\u754c\u9762",source:"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README.md",sourceDirName:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui",slug:"/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README.md",tags:[],version:"current",sidebarPosition:37,frontMatter:{sidebar_position:37,sidebar_label:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/"},next:{title:"\u5c55\u793aNFTs \ud83d\udc83",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/"}},s={},u=[],c={toc:u},p="wrapper";function d(e){let{components:n,...t}=e;return(0,a.kt)(p,(0,r.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts"},"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528Gage\u5236\u4f5c\u7528\u6237\u754c\u9762"),(0,a.kt)("li",{parentName:"ul"},"\u5c55\u793aNFTs"),(0,a.kt)("li",{parentName:"ul"},"\u5c55\u793a\u6765\u81ea\u94b1\u5305\u7684NFTs"),(0,a.kt)("li",{parentName:"ul"},"\u5c55\u793a\u6765\u81ea\u7cd6\u679c\u673a\u7684NFTs")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[83],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),u=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},c=function(e){var n=u(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(t),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return t?r.createElement(f,i(i({ref:n},c),{},{components:t})):r.createElement(f,i({ref:n},c))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=m;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[p]="string"==typeof e?e:a,i[1]=l;for(var u=2;u{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:37,sidebar_label:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",sidebar_class_name:"green"},i="\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",l={unversionedId:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README",id:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README",title:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",description:"- \u4f7f\u7528Gage\u5236\u4f5c\u7528\u6237\u754c\u9762",source:"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README.md",sourceDirName:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui",slug:"/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README.md",tags:[],version:"current",sidebarPosition:37,frontMatter:{sidebar_position:37,sidebar_label:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/"},next:{title:"\u5c55\u793aNFTs \ud83d\udc83",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/"}},s={},u=[],c={toc:u},p="wrapper";function d(e){let{components:n,...t}=e;return(0,a.kt)(p,(0,r.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts"},"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528Gage\u5236\u4f5c\u7528\u6237\u754c\u9762"),(0,a.kt)("li",{parentName:"ul"},"\u5c55\u793aNFTs"),(0,a.kt)("li",{parentName:"ul"},"\u5c55\u793a\u6765\u81ea\u94b1\u5305\u7684NFTs"),(0,a.kt)("li",{parentName:"ul"},"\u5c55\u793a\u6765\u81ea\u7cd6\u679c\u673a\u7684NFTs")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/117cdc53.747e20cf.js b/assets/js/117cdc53.747e20cf.js new file mode 100644 index 000000000..48b70ed3f --- /dev/null +++ b/assets/js/117cdc53.747e20cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5836],{4999:a=>{a.exports=JSON.parse('{"label":"blockchain","permalink":"/all-in-one-solana/blog/tags/blockchain","allTagsPath":"/all-in-one-solana/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/15911b08.126afa86.js b/assets/js/15911b08.126afa86.js new file mode 100644 index 000000000..f951275e6 --- /dev/null +++ b/assets/js/15911b08.126afa86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5106],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>y});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=r.createContext({}),s=function(e){var n=r.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=s(e.components);return r.createElement(c.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(t),m=a,y=u["".concat(c,".").concat(m)]||u[m]||d[m]||o;return t?r.createElement(y,i(i({ref:n},p),{},{components:t})):r.createElement(y,i({ref:n},p))}));function y(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,i=new Array(o);i[0]=m;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:53,sidebar_label:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",sidebar_class_name:"green"},i="\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",l={unversionedId:"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README",id:"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README",title:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",description:"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\u3002\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u90e8\u7f72\u4e86\u6211\u4eec\u7684\u7a0b\u5e8f\uff0c\u6211\u4eec\u53ef\u4ee5\u4e0e\u4e4b\u4ea4\u4e92\u3002\u5728\u4e4b\u524d\u7684\u90e8\u5206\u4e2d\uff0c\u4f60\u5df2\u7ecf\u505a\u8fc7\u5f88\u591a\u6b21\u4e86\uff01\u4f60\u53ef\u4ee5\u50cf\u4ee5\u524d\u4e00\u6837create-solana-client\u8bbe\u7f6e\u4e00\u4e2a\u672c\u5730\u5ba2\u6237\u7aef\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u6e38\u4e50\u573a\u3002",source:"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README.md",sourceDirName:"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program",slug:"/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README.md",tags:[],version:"current",sidebarPosition:53,frontMatter:{sidebar_position:53,sidebar_label:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/"},next:{title:"\u539f\u751fSOLANA\u5f00\u53d1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/"}},c={},s=[],p={toc:s},u="wrapper";function d(e){let{components:n,...o}=e;return(0,a.kt)(u,(0,r.Z)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"},"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\u3002\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u90e8\u7f72\u4e86\u6211\u4eec\u7684\u7a0b\u5e8f\uff0c\u6211\u4eec\u53ef\u4ee5\u4e0e\u4e4b\u4ea4\u4e92\u3002\u5728\u4e4b\u524d\u7684\u90e8\u5206\u4e2d\uff0c\u4f60\u5df2\u7ecf\u505a\u8fc7\u5f88\u591a\u6b21\u4e86\uff01\u4f60\u53ef\u4ee5\u50cf\u4ee5\u524d\u4e00\u6837",(0,a.kt)("inlineCode",{parentName:"p"},"create-solana-client"),"\u8bbe\u7f6e\u4e00\u4e2a\u672c\u5730\u5ba2\u6237\u7aef\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u6e38\u4e50\u573a\u3002"),(0,a.kt)("p",null,"\u6211\u4f1a\u9009\u62e9\u64cd\u573a\uff0c\u56e0\u4e3a\u90a3\u91cc\u66f4\u5feb :P"),(0,a.kt)("p",null,"\u9996\u5148\uff0c\u60a8\u9700\u8981\u83b7\u53d6\u60a8\u7684\u7a0b\u5e8fID\u3002\u60a8\u53ef\u4ee5\u5728\u201c\u7a0b\u5e8f\u51ed\u8bc1\u201d\u9009\u9879\u5361\u4e0b\u627e\u5230\u5b83\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(6273).Z,width:"411",height:"590"})),(0,a.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u6211\u4eec\u7684TS\u811a\u672c\u3002\u56de\u5230\u201c\u8d44\u6e90\u7ba1\u7406\u5668\u201d\u9009\u9879\u5361\uff0c\u7136\u540e\u5728\u5de6\u4fa7\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"Client")," \u90e8\u5206\u4e0b\u6253\u5f00 ",(0,a.kt)("inlineCode",{parentName:"p"},"client.ts")," \u3002\u4ee5\u4e0b\u662f\u6211\u4eec\u6240\u9700\u8981\u7684\u5185\u5bb9\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const programId = new web3.PublicKey(\n "REPLACE_WITH_YOUR_PROGRAM_ID"\n);\n\nasync function sayHello(\n payer: web3.Keypair\n): Promise {\n const transaction = new web3.Transaction();\n\n const instruction = new web3.TransactionInstruction({\n keys: [], // We\'re not using any accounts yet\n programId,\n // No need to add data here!\n });\n\n transaction.add(instruction);\n\n const transactionSignature = await web3.sendAndConfirmTransaction(\n pg.connection,\n transaction,\n [payer]\n );\n\n return transactionSignature;\n}\n\nasync function main() {\n const transactionSignature = await sayHello(pg.wallet.keypair);\n\n console.log(\n `Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n );\n}\n\nmain();\n')),(0,a.kt)("p",null,"\u8fd9\u5e94\u8be5\u770b\u8d77\u6765\u5f88\u719f\u6089\u3002\u5728\u6e38\u4e50\u573a\u4e2d\uff0c\u4e0e\u5bc6\u94a5\u5bf9\u7684\u8bbf\u95ee\u65b9\u5f0f\u548c\u4e0e\u5f00\u53d1\u7f51\u7edc\u7684\u8fde\u63a5\u65b9\u5f0f\u662f\u4e24\u4e2a\u53d8\u5316\u7684\u8981\u70b9\u3002\u5168\u5c40\u53ef\u7528\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"pg")," \u5bf9\u8c61\u5305\u542b\u4e86\u8fd9\u4e24\u4e2a\u8981\u7d20\u3002"),(0,a.kt)("p",null,"\u5f53\u4f60\u8fd0\u884c\u8fd9\u4e2a\u811a\u672c\u65f6\uff0c\u4f60\u5e94\u8be5\u5728\u63a7\u5236\u53f0\u4e2d\u770b\u5230\u4e00\u6761\u5df2\u8bb0\u5f55\u7684\u4ea4\u6613\u3002\u6253\u5f00\u94fe\u63a5\u5e76\u5411\u4e0b\u6eda\u52a8\uff0c\u4f60\u4f1a\u770b\u5230\u4f60\u7684\u6d88\u606f\uff01"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(3876).Z,width:"728",height:"208"})),(0,a.kt)("h1",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,a.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u6784\u5efa\u4e00\u4e9b\u4e1c\u897f\u4e86\u3002\u7531\u4e8e\u6211\u4eec\u4ece\u975e\u5e38\u7b80\u5355\u7684\u7a0b\u5e8f\u5f00\u59cb\uff0c\u4f60\u6240\u521b\u5efa\u7684\u7a0b\u5e8f\u51e0\u4e4e\u4e0e\u6211\u4eec\u521a\u521a\u521b\u5efa\u7684\u7a0b\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\u5c3d\u91cf\u8fbe\u5230\u80fd\u591f\u72ec\u7acb\u7f16\u5199\u4ee3\u7801\u800c\u65e0\u9700\u53c2\u8003\u4e4b\u524d\u7684\u4ee3\u7801\u7684\u7a0b\u5ea6\uff0c\u6240\u4ee5\u8bf7\u5c3d\u91cf\u4e0d\u8981\u5728\u8fd9\u91cc\u590d\u5236\u7c98\u8d34\u3002"),(0,a.kt)("p",null,"\u5728Solana Playground\u4e2d\u7f16\u5199\u4e00\u4e2a\u65b0\u7684\u7a0b\u5e8f\uff0c\u4f7f\u7528",(0,a.kt)("inlineCode",{parentName:"p"},"msg!"),"\u5b8f\u5c06\u81ea\u5df1\u7684\u6d88\u606f\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002\u50cf\u6211\u4eec\u5728\u6f14\u793a\u4e2d\u6240\u505a\u7684\u90a3\u6837\u6784\u5efa\u548c\u90e8\u7f72\u4f60\u7684\u7a0b\u5e8f\u3002\u7f16\u5199\u4e00\u4e2a\u5ba2\u6237\u7aef\u811a\u672c\u6765\u8c03\u7528\u4f60\u65b0\u90e8\u7f72\u7684\u7a0b\u5e8f\uff0c\u7136\u540e\u4f7f\u7528Solana Explorer\u6765\u68c0\u67e5\u4f60\u7684\u6d88\u606f\u662f\u5426\u5df2\u7ecf\u6253\u5370\u5728\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002"),(0,a.kt)("p",null,"\u9664\u4e86\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684\u7a0b\u5e8f\u4e4b\u5916\uff0c\u82b1\u70b9\u65f6\u95f4\u53bb\u5c1d\u8bd5\u4e00\u4e0bRust\u4e5f\u662f\u503c\u5f97\u7684\u3002\u67e5\u770b\u4e00\u4e0b",(0,a.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/book/"},"Rust\u4e66\u7c4d"),"\uff0c\u5e76\u4f7f\u7528",(0,a.kt)("a",{parentName:"p",href:"https://play.rust-lang.org/"},"Rust Playground"),"\u6765\u66f4\u597d\u5730\u4e86\u89e3\u8fd9\u95e8\u8bed\u8a00\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u8fd9\u6837\u5f53\u6211\u4eec\u6df1\u5165\u63a2\u8ba8\u66f4\u5177\u6311\u6218\u6027\u7684Solana\u7a0b\u5e8f\u4e3b\u9898\u65f6\uff0c\u4f60\u5c31\u80fd\u8d70\u5728\u524d\u9762\u3002"),(0,a.kt)("p",null,"\u4e5f\u8bb8\u53ef\u4ee5\u8ba9\u7a0b\u5e8f\u4f7f\u7528\u4e00\u7ec4\u8bcd\u8bed\u7684\u7ec4\u5408\u6765\u968f\u673a\u751f\u6210\u767b\u51fa\u65f6\u7684\u6d88\u606f\uff0c\u800c\u4e0d\u662f\u56fa\u5b9a\u7684\u6d88\u606f\uff1f"))}d.isMDXComponent=!0},6273:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/deploy-program-89a74b592a38ec8b2e0e4de687e3f31a.png"},3876:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/program-log-49d83fc12c47eb275f1a0c42706fa6db.png"}}]); \ No newline at end of file diff --git a/assets/js/15911b08.ac0288be.js b/assets/js/15911b08.ac0288be.js deleted file mode 100644 index da3d6f489..000000000 --- a/assets/js/15911b08.ac0288be.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5106],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>y});var r=t(7294);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var c=r.createContext({}),s=function(e){var n=r.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=s(e.components);return r.createElement(c.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(t),m=o,y=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return t?r.createElement(y,i(i({ref:n},p),{},{components:t})):r.createElement(y,i({ref:n},p))}));function y(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,i=new Array(a);i[0]=m;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var s=2;s{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var r=t(7462),o=(t(7294),t(3905));const a={sidebar_position:53,sidebar_label:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",sidebar_class_name:"green"},i="\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",l={unversionedId:"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README",id:"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README",title:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",description:"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\u3002\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u90e8\u7f72\u4e86\u6211\u4eec\u7684\u7a0b\u5e8f\uff0c\u6211\u4eec\u53ef\u4ee5\u4e0e\u4e4b\u4ea4\u4e92\u3002\u5728\u4e4b\u524d\u7684\u90e8\u5206\u4e2d\uff0c\u4f60\u5df2\u7ecf\u505a\u8fc7\u5f88\u591a\u6b21\u4e86\uff01\u4f60\u53ef\u4ee5\u50cf\u4ee5\u524d\u4e00\u6837create-solana-client\u8bbe\u7f6e\u4e00\u4e2a\u672c\u5730\u5ba2\u6237\u7aef\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u6e38\u4e50\u573a\u3002",source:"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README.md",sourceDirName:"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program",slug:"/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README.md",tags:[],version:"current",sidebarPosition:53,frontMatter:{sidebar_position:53,sidebar_label:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/"},next:{title:"\u539f\u751fSOLANA\u5f00\u53d1",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/"}},c={},s=[],p={toc:s},u="wrapper";function d(e){let{components:n,...a}=e;return(0,o.kt)(u,(0,r.Z)({},p,a,{components:n,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"-\u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"},"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\u3002\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u90e8\u7f72\u4e86\u6211\u4eec\u7684\u7a0b\u5e8f\uff0c\u6211\u4eec\u53ef\u4ee5\u4e0e\u4e4b\u4ea4\u4e92\u3002\u5728\u4e4b\u524d\u7684\u90e8\u5206\u4e2d\uff0c\u4f60\u5df2\u7ecf\u505a\u8fc7\u5f88\u591a\u6b21\u4e86\uff01\u4f60\u53ef\u4ee5\u50cf\u4ee5\u524d\u4e00\u6837",(0,o.kt)("inlineCode",{parentName:"p"},"create-solana-client"),"\u8bbe\u7f6e\u4e00\u4e2a\u672c\u5730\u5ba2\u6237\u7aef\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u6e38\u4e50\u573a\u3002"),(0,o.kt)("p",null,"\u6211\u4f1a\u9009\u62e9\u64cd\u573a\uff0c\u56e0\u4e3a\u90a3\u91cc\u66f4\u5feb :P"),(0,o.kt)("p",null,"\u9996\u5148\uff0c\u60a8\u9700\u8981\u83b7\u53d6\u60a8\u7684\u7a0b\u5e8fID\u3002\u60a8\u53ef\u4ee5\u5728\u201c\u7a0b\u5e8f\u51ed\u8bc1\u201d\u9009\u9879\u5361\u4e0b\u627e\u5230\u5b83\uff1a"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(6273).Z,width:"411",height:"590"})),(0,o.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u6211\u4eec\u7684TS\u811a\u672c\u3002\u56de\u5230\u201c\u8d44\u6e90\u7ba1\u7406\u5668\u201d\u9009\u9879\u5361\uff0c\u7136\u540e\u5728\u5de6\u4fa7\u7684 ",(0,o.kt)("inlineCode",{parentName:"p"},"Client")," \u90e8\u5206\u4e0b\u6253\u5f00 ",(0,o.kt)("inlineCode",{parentName:"p"},"client.ts")," \u3002\u4ee5\u4e0b\u662f\u6211\u4eec\u6240\u9700\u8981\u7684\u5185\u5bb9\uff1a"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-ts"},'const programId = new web3.PublicKey(\n "REPLACE_WITH_YOUR_PROGRAM_ID"\n);\n\nasync function sayHello(\n payer: web3.Keypair\n): Promise {\n const transaction = new web3.Transaction();\n\n const instruction = new web3.TransactionInstruction({\n keys: [], // We\'re not using any accounts yet\n programId,\n // No need to add data here!\n });\n\n transaction.add(instruction);\n\n const transactionSignature = await web3.sendAndConfirmTransaction(\n pg.connection,\n transaction,\n [payer]\n );\n\n return transactionSignature;\n}\n\nasync function main() {\n const transactionSignature = await sayHello(pg.wallet.keypair);\n\n console.log(\n `Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n );\n}\n\nmain();\n')),(0,o.kt)("p",null,"\u8fd9\u5e94\u8be5\u770b\u8d77\u6765\u5f88\u719f\u6089\u3002\u5728\u6e38\u4e50\u573a\u4e2d\uff0c\u4e0e\u5bc6\u94a5\u5bf9\u7684\u8bbf\u95ee\u65b9\u5f0f\u548c\u4e0e\u5f00\u53d1\u7f51\u7edc\u7684\u8fde\u63a5\u65b9\u5f0f\u662f\u4e24\u4e2a\u53d8\u5316\u7684\u8981\u70b9\u3002\u5168\u5c40\u53ef\u7528\u7684 ",(0,o.kt)("inlineCode",{parentName:"p"},"pg")," \u5bf9\u8c61\u5305\u542b\u4e86\u8fd9\u4e24\u4e2a\u8981\u7d20\u3002"),(0,o.kt)("p",null,"\u5f53\u4f60\u8fd0\u884c\u8fd9\u4e2a\u811a\u672c\u65f6\uff0c\u4f60\u5e94\u8be5\u5728\u63a7\u5236\u53f0\u4e2d\u770b\u5230\u4e00\u6761\u5df2\u8bb0\u5f55\u7684\u4ea4\u6613\u3002\u6253\u5f00\u94fe\u63a5\u5e76\u5411\u4e0b\u6eda\u52a8\uff0c\u4f60\u4f1a\u770b\u5230\u4f60\u7684\u6d88\u606f\uff01"),(0,o.kt)("p",null,(0,o.kt)("img",{src:t(3876).Z,width:"728",height:"208"})),(0,o.kt)("h1",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,o.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u6784\u5efa\u4e00\u4e9b\u4e1c\u897f\u4e86\u3002\u7531\u4e8e\u6211\u4eec\u4ece\u975e\u5e38\u7b80\u5355\u7684\u7a0b\u5e8f\u5f00\u59cb\uff0c\u4f60\u6240\u521b\u5efa\u7684\u7a0b\u5e8f\u51e0\u4e4e\u4e0e\u6211\u4eec\u521a\u521a\u521b\u5efa\u7684\u7a0b\u5e8f\u5b8c\u5168\u76f8\u540c\u3002\u5c3d\u91cf\u8fbe\u5230\u80fd\u591f\u72ec\u7acb\u7f16\u5199\u4ee3\u7801\u800c\u65e0\u9700\u53c2\u8003\u4e4b\u524d\u7684\u4ee3\u7801\u7684\u7a0b\u5ea6\uff0c\u6240\u4ee5\u8bf7\u5c3d\u91cf\u4e0d\u8981\u5728\u8fd9\u91cc\u590d\u5236\u7c98\u8d34\u3002"),(0,o.kt)("p",null,"\u5728Solana Playground\u4e2d\u7f16\u5199\u4e00\u4e2a\u65b0\u7684\u7a0b\u5e8f\uff0c\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"msg!"),"\u5b8f\u5c06\u81ea\u5df1\u7684\u6d88\u606f\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002\u50cf\u6211\u4eec\u5728\u6f14\u793a\u4e2d\u6240\u505a\u7684\u90a3\u6837\u6784\u5efa\u548c\u90e8\u7f72\u4f60\u7684\u7a0b\u5e8f\u3002\u7f16\u5199\u4e00\u4e2a\u5ba2\u6237\u7aef\u811a\u672c\u6765\u8c03\u7528\u4f60\u65b0\u90e8\u7f72\u7684\u7a0b\u5e8f\uff0c\u7136\u540e\u4f7f\u7528Solana Explorer\u6765\u68c0\u67e5\u4f60\u7684\u6d88\u606f\u662f\u5426\u5df2\u7ecf\u6253\u5370\u5728\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002"),(0,o.kt)("p",null,"\u9664\u4e86\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684\u7a0b\u5e8f\u4e4b\u5916\uff0c\u82b1\u70b9\u65f6\u95f4\u53bb\u5c1d\u8bd5\u4e00\u4e0bRust\u4e5f\u662f\u503c\u5f97\u7684\u3002\u67e5\u770b\u4e00\u4e0b",(0,o.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/book/"},"Rust\u4e66\u7c4d"),"\uff0c\u5e76\u4f7f\u7528",(0,o.kt)("a",{parentName:"p",href:"https://play.rust-lang.org/"},"Rust Playground"),"\u6765\u66f4\u597d\u5730\u4e86\u89e3\u8fd9\u95e8\u8bed\u8a00\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u8fd9\u6837\u5f53\u6211\u4eec\u6df1\u5165\u63a2\u8ba8\u66f4\u5177\u6311\u6218\u6027\u7684Solana\u7a0b\u5e8f\u4e3b\u9898\u65f6\uff0c\u4f60\u5c31\u80fd\u8d70\u5728\u524d\u9762\u3002"),(0,o.kt)("p",null,"\u4e5f\u8bb8\u53ef\u4ee5\u8ba9\u7a0b\u5e8f\u4f7f\u7528\u4e00\u7ec4\u8bcd\u8bed\u7684\u7ec4\u5408\u6765\u968f\u673a\u751f\u6210\u767b\u51fa\u65f6\u7684\u6d88\u606f\uff0c\u800c\u4e0d\u662f\u56fa\u5b9a\u7684\u6d88\u606f\uff1f"))}d.isMDXComponent=!0},6273:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/deploy-program-89a74b592a38ec8b2e0e4de687e3f31a.png"},3876:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/program-log-49d83fc12c47eb275f1a0c42706fa6db.png"}}]); \ No newline at end of file diff --git a/assets/js/16fd20c7.92817426.js b/assets/js/16fd20c7.92817426.js deleted file mode 100644 index 44add3e48..000000000 --- a/assets/js/16fd20c7.92817426.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[517],{7639:e=>{e.exports=JSON.parse('{"label":"IBC","permalink":"/blog/tags/ibc","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/1c315ff9.5960d73a.js b/assets/js/1c315ff9.5960d73a.js new file mode 100644 index 000000000..70e5055ee --- /dev/null +++ b/assets/js/1c315ff9.5960d73a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3061],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),c=l,f=d["".concat(s,".").concat(c)]||d[c]||m[c]||r;return n?a.createElement(f,o(o({ref:t},u),{},{components:n})):a.createElement(f,o({ref:t},u))}));function f(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,o=new Array(r);o[0]=c;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:l,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var a=n(7462),l=(n(7294),n(3905));const r={sidebar_position:34,sidebar_label:"\ud83c\udfa8 NFTs on Solana",sidebar_class_name:"green"},o="\ud83c\udfa8 NFTs on Solana",i={unversionedId:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README",id:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README",title:"\ud83c\udfa8 NFTs on Solana",description:"\u6211\u4eec\u5230\u4e86\u3002\u6ca1\u82b1\u592a\u957f\u65f6\u95f4\u3002\u7334\u5b50\u56fe\u7247\u3002\u733f\u7c7b\u3002\u5ca9\u77f3\u3002\u8fd8\u6709\u5176\u4ed6\u52a8\u7269\u4e3b\u9898\u7684\u5934\u50cf\uff0c\u770b\u8d77\u6765\u4e11\u5f97\u8981\u547d\uff0c\u4f46\u5374\u80fd\u5356\u523010\u4e07\u7f8e\u5143\uff0c\u8fd9\u5c31\u662fNFT\u3002",source:"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README.md",sourceDirName:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana",slug:"/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README.md",tags:[],version:"current",sidebarPosition:34,frontMatter:{sidebar_position:34,sidebar_label:"\ud83c\udfa8 NFTs on Solana",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Ntfs & Minting with metaplex",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/"},next:{title:"\ud83e\udd28 NFT\u4f60\u7684\u8138",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/"}},s={},p=[{value:"\ud83e\udee3 NFTs \u662f\u4ee3\u5e01",id:"-nfts-\u662f\u4ee3\u5e01",level:2},{value:"\ud83d\udc19 Master Edition \u8d26\u6237",id:"-master-edition--\u8d26\u6237",level:2},{value:"\ud83e\udeb0 Editions \u8d26\u6237",id:"-editions-\u8d26\u6237",level:2},{value:"\ud83e\uddf0 Metaplex SDK",id:"-metaplex-sdk",level:2}],u={toc:p},d="wrapper";function m(e){let{components:t,...r}=e;return(0,l.kt)(d,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-nfts-on-solana"},"\ud83c\udfa8 NFTs on Solana"),(0,l.kt)("p",null,"\u6211\u4eec\u5230\u4e86\u3002\u6ca1\u82b1\u592a\u957f\u65f6\u95f4\u3002\u7334\u5b50\u56fe\u7247\u3002\u733f\u7c7b\u3002\u5ca9\u77f3\u3002\u8fd8\u6709\u5176\u4ed6\u52a8\u7269\u4e3b\u9898\u7684\u5934\u50cf\uff0c\u770b\u8d77\u6765\u4e11\u5f97\u8981\u547d\uff0c\u4f46\u5374\u80fd\u5356\u523010\u4e07\u7f8e\u5143\uff0c\u8fd9\u5c31\u662fNFT\u3002"),(0,l.kt)("p",null,"\u4e0e\u4ee5\u592a\u574a\u4e0d\u540c\uff0cSolana\u4e0a\u7684NFT\u94f8\u9020\u975e\u5e38\u4fbf\u5b9c\uff0c\u8fd9\u4f7f\u5f97\u5b83\u4eec\u66f4\u52a0\u6709\u8da3\u3002\u5373\u4f7f\u5728\u8fd9\u4e9b\u718a\u5e02\u7684\u65e5\u5b50\u91cc\uff0c\u5728\u4ee5\u592a\u574a\u4e0a\u94f8\u9020\u4e00\u4e2aNFT\u4e5f\u53ea\u97005\u7f8e\u5143\uff0c\u8fd9\u5b9e\u5728\u662f\u6709\u70b9\u65e0\u804a\u3002\u4e3a\u4ec0\u4e48\u6211\u8981\u652f\u4ed85\u7f8e\u5143\u6765\u8ba9\u6211\u7684\u6a21\u56e0\u6c38\u5782\u4e0d\u673d\u5462\uff1f"),(0,l.kt)("h2",{id:"-nfts-\u662f\u4ee3\u5e01"},"\ud83e\udee3 NFTs \u662f\u4ee3\u5e01"),(0,l.kt)("p",null,"Solana\u4e0a\u7684NFT\u4ef7\u683c\u4fbf\u5b9c\u7684\u4e00\u4e2a\u91cd\u8981\u539f\u56e0\u662f\u5b83\u4eec\u5e76\u4e0d\u662f\u7279\u522b\u7684\u4ee3\u7801\uff0c\u5b83\u4eec\u53ea\u662f\u666e\u901a\u7684\u4ee3\u5e01\uff0c\u9644\u5e26\u4e86\u989d\u5916\u7684\u6570\u636e\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(4884).Z,width:"1040",height:"550"})),(0,l.kt)("p",null,"\u7b2c\u4e00\u4e2a\u4e3b\u8981\u7684\u533a\u522b\u662f\u94f8\u9020\u8d26\u6237\u3002\u5bf9\u4e8eNFTs\u6765\u8bf4\uff0c\u94f8\u9020\u8d26\u6237"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"\u4f9b\u5e94\u91cf\u4e3a1"),"\uff0c\u610f\u5473\u7740\u53ea\u6709\u4e00\u4e2a\u4ee3\u5e01\u5728\u6d41\u901a\u3002"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"\u6ca1\u6709\u5c0f\u6570\u70b9"),"\uff0c\u610f\u5473\u7740\u4e0d\u5b58\u57280.5\u4e2a\u4ee3\u5e01\u8fd9\u6837\u7684\u4e8b\u60c5\u3002"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("strong",{parentName:"li"},"\u6ca1\u6709\u94f8\u5e01\u673a\u6784"),"\uff0c\u610f\u5473\u7740\u6ca1\u6709\u4eba\u53ef\u4ee5\u94f8\u9020\u989d\u5916\u7684\u4ee3\u5e01\u3002")),(0,l.kt)("p",null,"\u6b63\u5982\u4f60\u53ef\u80fd\u731c\u5230\u7684\u90a3\u6837\uff0c\u989d\u5916\u7684\u6570\u636e\u5b58\u50a8\u5728\u7a0b\u5e8f\u6d3e\u751f\u7684\u8d26\u6237\u4e2d\u3002\u8ba9\u6211\u4eec\u6765\u89c1\u8bc6\u4e00\u4e0b\u8fd9\u4e9b\u65b0\u8d26\u6237 :D"),(0,l.kt)("h2",{id:"-master-edition--\u8d26\u6237"},"\ud83d\udc19 Master Edition \u8d26\u6237"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(7409).Z,width:"1015",height:"591"})),(0,l.kt)("p",null,"Token Metadata\u7a0b\u5e8f\u4e3aNFTs\u63d0\u4f9b\u4e86\u53e6\u4e00\u4e2a\u4e13\u95e8\u7684\u8d26\u6237\uff0c\u79f0\u4e3aMaster Edition\u8d26\u6237\u3002\u5b83\u4e0d\u4f1a\u5e9f\u9664Mint\u6743\u9650\uff0c\u800c\u662f\u5c06Mint\u6743\u9650\u548c\u51bb\u7ed3\u6743\u9650\u90fd\u8f6c\u79fb\u5230",(0,l.kt)("inlineCode",{parentName:"p"},"Master Edition PDA"),"\u3002"),(0,l.kt)("p",null,"\u6362\u53e5\u8bdd\u8bf4\uff0c\u9020\u5e01\u6743\u88ab\u8f6c\u79fb\u5230\u5c5e\u4e8eToken Metadata\u7a0b\u5e8f\u7684PDA\u4e0a\u3002\u8fd9\u786e\u4fdd\u4efb\u4f55\u4eba\u5728\u672a\u7ecf\u8fc7Token Metadata\u7a0b\u5e8f\u7684\u60c5\u51b5\u4e0b\u65e0\u6cd5\u94f8\u9020\u6216\u51bb\u7ed3\u4ee3\u5e01\u3002"),(0,l.kt)("p",null,"\u53ea\u6709\u7a0b\u5e8f\u63d0\u4f9b\u7684\u6307\u4ee4\u624d\u80fd\u4f7f\u7528\u5b83\uff0c\u800c\u7a0b\u5e8f\u4e2d\u5e76\u4e0d\u5b58\u5728\u8fd9\u6837\u7684\u6307\u4ee4\u3002\u8fd9\u6837\u505a\u7684\u539f\u56e0\u662f\u4e3a\u4e86\u8ba9Metaplex\u80fd\u591f\u90e8\u7f72Token Metadata\u7a0b\u5e8f\u7684\u5347\u7ea7\uff0c\u5e76\u5c06\u73b0\u6709\u7684NFT\u8fc1\u79fb\u5230\u65b0\u7248\u672c\u3002"),(0,l.kt)("h2",{id:"-editions-\u8d26\u6237"},"\ud83e\udeb0 Editions \u8d26\u6237"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(5293).Z,width:"1231",height:"780"})),(0,l.kt)("p",null,"\u9664\u4e86\u4f5c\u4e3a\u4e0d\u53ef\u66ff\u4ee3\u6027\u8bc1\u636e\uff0cMaster Edition\u8d26\u6237\u8fd8\u5141\u8bb8\u7528\u6237\u6253\u5370\u4e00\u4e2a\u6216\u591a\u4e2aNFT\u7684\u526f\u672c\u3002\u8fd9\u4e2a\u529f\u80fd\u4f7f\u521b\u4f5c\u8005\u80fd\u591f\u63d0\u4f9b\u591a\u4e2a1/1 NFT\u7684\u526f\u672c\u3002"),(0,l.kt)("p",null,"Master Edition \u8d26\u6237\u5305\u542b\u4e00\u4e2a\u53ef\u9009\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"Max Supply")," \u5c5e\u6027\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u8bbe\u7f6e\u4e3a ",(0,l.kt)("inlineCode",{parentName:"li"},"0")," \uff0c\u5219\u7981\u7528\u6253\u5370\u529f\u80fd"),(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u8bbe\u7f6e\u4e3a ",(0,l.kt)("inlineCode",{parentName:"li"},"None")," \uff0c\u53ef\u4ee5\u6253\u5370\u65e0\u9650\u6570\u91cf\u7684\u526f\u672c\u3002")),(0,l.kt)("h2",{id:"-metaplex-sdk"},"\ud83e\uddf0 Metaplex SDK"),(0,l.kt)("p",null,"\u901a\u8fc7\u6211\u4eec\u7684\u65b0\u670b\u53cbMetaplex SDK\uff0c\u6240\u6709\u8fd9\u4e9b\u90fd\u53d8\u5f97\u8f7b\u800c\u6613\u4e3e\u3002\u5b83\u8ba9\u60a8\u8f7b\u677e\u521b\u5efa\u548c\u66f4\u65b0NFTs - \u60a8\u53ea\u9700\u63d0\u4f9b\u6700\u57fa\u672c\u7684\u4fe1\u606f\uff0c\u5b83\u4f1a\u81ea\u52a8\u586b\u5145\u5176\u4f59\u7684\u9ed8\u8ba4\u503c\u3002"),(0,l.kt)("p",null,"\u5c31\u50cf\u4ee4\u724c\u5143\u6570\u636e\u4e00\u6837\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u76f8\u540c\u7684\u6d41\u7a0b\u6765\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u4e0a\u4f20\u4e00\u5f20\u56fe\u7247"),(0,l.kt)("li",{parentName:"ul"},"\u4e0a\u4f20\u5143\u6570\u636e"),(0,l.kt)("li",{parentName:"ul"},"\u7136\u540e\u4f7f\u7528\u5143\u6570\u636e URI \u521b\u5efa\u4e00\u4e2a NFT")),(0,l.kt)("p",null,"\u4f60\u80fd\u731c\u5230\u4ee3\u7801\u4f1a\u662f\u4ec0\u4e48\u6837\u5b50\u5417\uff1f\u5728\u6211\u4eec\u5f00\u59cb\u4e4b\u524d\uff0c\u8bd5\u7740\u5728\u8111\u6d77\u4e2d\u5f62\u8c61\u5316\u5b83\uff0c\u7136\u540e\u6211\u4eec\u4e00\u8d77\u6765\u89e3\u51b3\u5b83\u5427 :)"))}m.isMDXComponent=!0},5293:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/edition-account-4c1f1e00e0a59f114788173909752904.png"},7409:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/master-edition-account-5eaa60f7110d574738483802e19f365f.png"},4884:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/nft-metadata-75caf355770f1b55d1127e80473b1fa7.png"}}]); \ No newline at end of file diff --git a/assets/js/1c315ff9.d4f23c9d.js b/assets/js/1c315ff9.d4f23c9d.js deleted file mode 100644 index e5dc500ea..000000000 --- a/assets/js/1c315ff9.d4f23c9d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3061],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=p(n),c=r,f=d["".concat(s,".").concat(c)]||d[c]||m[c]||l;return n?a.createElement(f,o(o({ref:t},u),{},{components:n})):a.createElement(f,o({ref:t},u))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=c;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const l={sidebar_position:34,sidebar_label:"\ud83c\udfa8 NFTs on Solana",sidebar_class_name:"green"},o="\ud83c\udfa8 NFTs on Solana",i={unversionedId:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README",id:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README",title:"\ud83c\udfa8 NFTs on Solana",description:"\u6211\u4eec\u5230\u4e86\u3002\u6ca1\u82b1\u592a\u957f\u65f6\u95f4\u3002\u7334\u5b50\u56fe\u7247\u3002\u733f\u7c7b\u3002\u5ca9\u77f3\u3002\u8fd8\u6709\u5176\u4ed6\u52a8\u7269\u4e3b\u9898\u7684\u5934\u50cf\uff0c\u770b\u8d77\u6765\u4e11\u5f97\u8981\u547d\uff0c\u4f46\u5374\u80fd\u5356\u523010\u4e07\u7f8e\u5143\uff0c\u8fd9\u5c31\u662fNFT\u3002",source:"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README.md",sourceDirName:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana",slug:"/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README.md",tags:[],version:"current",sidebarPosition:34,frontMatter:{sidebar_position:34,sidebar_label:"\ud83c\udfa8 NFTs on Solana",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Ntfs & Minting with metaplex",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/"},next:{title:"\ud83e\udd28 NFT\u4f60\u7684\u8138",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/"}},s={},p=[{value:"\ud83e\udee3 NFTs \u662f\u4ee3\u5e01",id:"-nfts-\u662f\u4ee3\u5e01",level:2},{value:"\ud83d\udc19 Master Edition \u8d26\u6237",id:"-master-edition--\u8d26\u6237",level:2},{value:"\ud83e\udeb0 Editions \u8d26\u6237",id:"-editions-\u8d26\u6237",level:2},{value:"\ud83e\uddf0 Metaplex SDK",id:"-metaplex-sdk",level:2}],u={toc:p},d="wrapper";function m(e){let{components:t,...l}=e;return(0,r.kt)(d,(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-nfts-on-solana"},"\ud83c\udfa8 NFTs on Solana"),(0,r.kt)("p",null,"\u6211\u4eec\u5230\u4e86\u3002\u6ca1\u82b1\u592a\u957f\u65f6\u95f4\u3002\u7334\u5b50\u56fe\u7247\u3002\u733f\u7c7b\u3002\u5ca9\u77f3\u3002\u8fd8\u6709\u5176\u4ed6\u52a8\u7269\u4e3b\u9898\u7684\u5934\u50cf\uff0c\u770b\u8d77\u6765\u4e11\u5f97\u8981\u547d\uff0c\u4f46\u5374\u80fd\u5356\u523010\u4e07\u7f8e\u5143\uff0c\u8fd9\u5c31\u662fNFT\u3002"),(0,r.kt)("p",null,"\u4e0e\u4ee5\u592a\u574a\u4e0d\u540c\uff0cSolana\u4e0a\u7684NFT\u94f8\u9020\u975e\u5e38\u4fbf\u5b9c\uff0c\u8fd9\u4f7f\u5f97\u5b83\u4eec\u66f4\u52a0\u6709\u8da3\u3002\u5373\u4f7f\u5728\u8fd9\u4e9b\u718a\u5e02\u7684\u65e5\u5b50\u91cc\uff0c\u5728\u4ee5\u592a\u574a\u4e0a\u94f8\u9020\u4e00\u4e2aNFT\u4e5f\u53ea\u97005\u7f8e\u5143\uff0c\u8fd9\u5b9e\u5728\u662f\u6709\u70b9\u65e0\u804a\u3002\u4e3a\u4ec0\u4e48\u6211\u8981\u652f\u4ed85\u7f8e\u5143\u6765\u8ba9\u6211\u7684\u6a21\u56e0\u6c38\u5782\u4e0d\u673d\u5462\uff1f"),(0,r.kt)("h2",{id:"-nfts-\u662f\u4ee3\u5e01"},"\ud83e\udee3 NFTs \u662f\u4ee3\u5e01"),(0,r.kt)("p",null,"Solana\u4e0a\u7684NFT\u4ef7\u683c\u4fbf\u5b9c\u7684\u4e00\u4e2a\u91cd\u8981\u539f\u56e0\u662f\u5b83\u4eec\u5e76\u4e0d\u662f\u7279\u522b\u7684\u4ee3\u7801\uff0c\u5b83\u4eec\u53ea\u662f\u666e\u901a\u7684\u4ee3\u5e01\uff0c\u9644\u5e26\u4e86\u989d\u5916\u7684\u6570\u636e\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(4884).Z,width:"1040",height:"550"})),(0,r.kt)("p",null,"\u7b2c\u4e00\u4e2a\u4e3b\u8981\u7684\u533a\u522b\u662f\u94f8\u9020\u8d26\u6237\u3002\u5bf9\u4e8eNFTs\u6765\u8bf4\uff0c\u94f8\u9020\u8d26\u6237"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"\u4f9b\u5e94\u91cf\u4e3a1"),"\uff0c\u610f\u5473\u7740\u53ea\u6709\u4e00\u4e2a\u4ee3\u5e01\u5728\u6d41\u901a\u3002"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"\u6ca1\u6709\u5c0f\u6570\u70b9"),"\uff0c\u610f\u5473\u7740\u4e0d\u5b58\u57280.5\u4e2a\u4ee3\u5e01\u8fd9\u6837\u7684\u4e8b\u60c5\u3002"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"\u6ca1\u6709\u94f8\u5e01\u673a\u6784"),"\uff0c\u610f\u5473\u7740\u6ca1\u6709\u4eba\u53ef\u4ee5\u94f8\u9020\u989d\u5916\u7684\u4ee3\u5e01\u3002")),(0,r.kt)("p",null,"\u6b63\u5982\u4f60\u53ef\u80fd\u731c\u5230\u7684\u90a3\u6837\uff0c\u989d\u5916\u7684\u6570\u636e\u5b58\u50a8\u5728\u7a0b\u5e8f\u6d3e\u751f\u7684\u8d26\u6237\u4e2d\u3002\u8ba9\u6211\u4eec\u6765\u89c1\u8bc6\u4e00\u4e0b\u8fd9\u4e9b\u65b0\u8d26\u6237 :D"),(0,r.kt)("h2",{id:"-master-edition--\u8d26\u6237"},"\ud83d\udc19 Master Edition \u8d26\u6237"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(7409).Z,width:"1015",height:"591"})),(0,r.kt)("p",null,"Token Metadata\u7a0b\u5e8f\u4e3aNFTs\u63d0\u4f9b\u4e86\u53e6\u4e00\u4e2a\u4e13\u95e8\u7684\u8d26\u6237\uff0c\u79f0\u4e3aMaster Edition\u8d26\u6237\u3002\u5b83\u4e0d\u4f1a\u5e9f\u9664Mint\u6743\u9650\uff0c\u800c\u662f\u5c06Mint\u6743\u9650\u548c\u51bb\u7ed3\u6743\u9650\u90fd\u8f6c\u79fb\u5230",(0,r.kt)("inlineCode",{parentName:"p"},"Master Edition PDA"),"\u3002"),(0,r.kt)("p",null,"\u6362\u53e5\u8bdd\u8bf4\uff0c\u9020\u5e01\u6743\u88ab\u8f6c\u79fb\u5230\u5c5e\u4e8eToken Metadata\u7a0b\u5e8f\u7684PDA\u4e0a\u3002\u8fd9\u786e\u4fdd\u4efb\u4f55\u4eba\u5728\u672a\u7ecf\u8fc7Token Metadata\u7a0b\u5e8f\u7684\u60c5\u51b5\u4e0b\u65e0\u6cd5\u94f8\u9020\u6216\u51bb\u7ed3\u4ee3\u5e01\u3002"),(0,r.kt)("p",null,"\u53ea\u6709\u7a0b\u5e8f\u63d0\u4f9b\u7684\u6307\u4ee4\u624d\u80fd\u4f7f\u7528\u5b83\uff0c\u800c\u7a0b\u5e8f\u4e2d\u5e76\u4e0d\u5b58\u5728\u8fd9\u6837\u7684\u6307\u4ee4\u3002\u8fd9\u6837\u505a\u7684\u539f\u56e0\u662f\u4e3a\u4e86\u8ba9Metaplex\u80fd\u591f\u90e8\u7f72Token Metadata\u7a0b\u5e8f\u7684\u5347\u7ea7\uff0c\u5e76\u5c06\u73b0\u6709\u7684NFT\u8fc1\u79fb\u5230\u65b0\u7248\u672c\u3002"),(0,r.kt)("h2",{id:"-editions-\u8d26\u6237"},"\ud83e\udeb0 Editions \u8d26\u6237"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(5293).Z,width:"1231",height:"780"})),(0,r.kt)("p",null,"\u9664\u4e86\u4f5c\u4e3a\u4e0d\u53ef\u66ff\u4ee3\u6027\u8bc1\u636e\uff0cMaster Edition\u8d26\u6237\u8fd8\u5141\u8bb8\u7528\u6237\u6253\u5370\u4e00\u4e2a\u6216\u591a\u4e2aNFT\u7684\u526f\u672c\u3002\u8fd9\u4e2a\u529f\u80fd\u4f7f\u521b\u4f5c\u8005\u80fd\u591f\u63d0\u4f9b\u591a\u4e2a1/1 NFT\u7684\u526f\u672c\u3002"),(0,r.kt)("p",null,"Master Edition \u8d26\u6237\u5305\u542b\u4e00\u4e2a\u53ef\u9009\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"Max Supply")," \u5c5e\u6027\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u5982\u679c\u8bbe\u7f6e\u4e3a ",(0,r.kt)("inlineCode",{parentName:"li"},"0")," \uff0c\u5219\u7981\u7528\u6253\u5370\u529f\u80fd"),(0,r.kt)("li",{parentName:"ul"},"\u5982\u679c\u8bbe\u7f6e\u4e3a ",(0,r.kt)("inlineCode",{parentName:"li"},"None")," \uff0c\u53ef\u4ee5\u6253\u5370\u65e0\u9650\u6570\u91cf\u7684\u526f\u672c\u3002")),(0,r.kt)("h2",{id:"-metaplex-sdk"},"\ud83e\uddf0 Metaplex SDK"),(0,r.kt)("p",null,"\u901a\u8fc7\u6211\u4eec\u7684\u65b0\u670b\u53cbMetaplex SDK\uff0c\u6240\u6709\u8fd9\u4e9b\u90fd\u53d8\u5f97\u8f7b\u800c\u6613\u4e3e\u3002\u5b83\u8ba9\u60a8\u8f7b\u677e\u521b\u5efa\u548c\u66f4\u65b0NFTs - \u60a8\u53ea\u9700\u63d0\u4f9b\u6700\u57fa\u672c\u7684\u4fe1\u606f\uff0c\u5b83\u4f1a\u81ea\u52a8\u586b\u5145\u5176\u4f59\u7684\u9ed8\u8ba4\u503c\u3002"),(0,r.kt)("p",null,"\u5c31\u50cf\u4ee4\u724c\u5143\u6570\u636e\u4e00\u6837\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u76f8\u540c\u7684\u6d41\u7a0b\u6765\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u4e0a\u4f20\u4e00\u5f20\u56fe\u7247"),(0,r.kt)("li",{parentName:"ul"},"\u4e0a\u4f20\u5143\u6570\u636e"),(0,r.kt)("li",{parentName:"ul"},"\u7136\u540e\u4f7f\u7528\u5143\u6570\u636e URI \u521b\u5efa\u4e00\u4e2a NFT")),(0,r.kt)("p",null,"\u4f60\u80fd\u731c\u5230\u4ee3\u7801\u4f1a\u662f\u4ec0\u4e48\u6837\u5b50\u5417\uff1f\u5728\u6211\u4eec\u5f00\u59cb\u4e4b\u524d\uff0c\u8bd5\u7740\u5728\u8111\u6d77\u4e2d\u5f62\u8c61\u5316\u5b83\uff0c\u7136\u540e\u6211\u4eec\u4e00\u8d77\u6765\u89e3\u51b3\u5b83\u5427 :)"))}m.isMDXComponent=!0},5293:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/edition-account-4c1f1e00e0a59f114788173909752904.png"},7409:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/master-edition-account-5eaa60f7110d574738483802e19f365f.png"},4884:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/nft-metadata-75caf355770f1b55d1127e80473b1fa7.png"}}]); \ No newline at end of file diff --git a/assets/js/1ce18368.039e85c8.js b/assets/js/1ce18368.039e85c8.js new file mode 100644 index 000000000..038798bdf --- /dev/null +++ b/assets/js/1ce18368.039e85c8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4547],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>c});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=s(n),k=l,c=m["".concat(p,".").concat(k)]||m[k]||d[k]||o;return n?a.createElement(c,r(r({ref:t},u),{},{components:n})):a.createElement(c,r({ref:t},u))}));function c(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,r=new Array(o);r[0]=k;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:l,r[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var a=n(7462),l=(n(7294),n(3905));const o={sidebar_position:31,sidebar_label:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",sidebar_class_name:"green"},r="\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",i={unversionedId:"Solana-Co-Learn/module2/spl-token/token-metadata/README",id:"Solana-Co-Learn/module2/spl-token/token-metadata/README",title:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",description:"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002",source:"@site/docs/Solana-Co-Learn/module2/spl-token/token-metadata/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token/token-metadata",slug:"/Solana-Co-Learn/module2/spl-token/token-metadata/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/token-metadata/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/token-metadata/README.md",tags:[],version:"current",sidebarPosition:31,frontMatter:{sidebar_position:31,sidebar_label:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/"},next:{title:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/"}},p={},s=[{value:"\ud83c\udfad \u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237",id:"-\u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237",level:2},{value:"\ud83d\uddbc \u4ee3\u5e01\u6807\u51c6",id:"-\u4ee3\u5e01\u6807\u51c6",level:2},{value:"\ud83e\uddf0 Metaplex SDK",id:"-metaplex-sdk",level:2}],u={toc:s},m="wrapper";function d(e){let{components:t,...o}=e;return(0,l.kt)(m,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u4ee4\u724c\u5143\u6570\u636e"},"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece",(0,l.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-token-client/tree/solution-without-burn?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"solution-without-burn")," \u5206\u652f\u4e0a\uff09\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(7493).Z,width:"739",height:"167"})),(0,l.kt)("p",null,"Token\u5143\u6570\u636e\u662f\u4e00\u4e2a\u4ee3\u5e01\u7684\u4fe1\u606f\uff0c\u6bd4\u5982\u540d\u79f0\u3001\u7b26\u53f7\u548c\u6807\u5fd7\u3002\u6ce8\u610f\u4e00\u4e0b\uff0c\u4f60\u94b1\u5305\u91cc\u7684\u5404\u79cd\u4ee3\u5e01\u90fd\u6709\u8fd9\u4e9b\u4e1c\u897f\uff0c\u9664\u4e86\u4f60\u81ea\u5df1\u521b\u5efa\u7684\u4ee3\u5e01\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(3497).Z,width:"356",height:"271"})),(0,l.kt)("p",null,"\u8fd9\u5c31\u662f\u6240\u6709\u7684\u5143\u6570\u636e\uff01\u8fd9\u9002\u7528\u4e8e\u6240\u6709\u7684\u4ee3\u5e01\uff0c\u4e0d\u4ec5\u4ec5\u662f\u53ef\u66ff\u4ee3\u8d27\u5e01\u3002\u5728Solana\u4e0a\uff0cNFT\u5c31\u50cf\u4efb\u4f55\u5176\u4ed6\u4ee3\u5e01\u4e00\u6837\uff0c\u53ea\u662f\u5143\u6570\u636e\u901a\u8fc7\u5c5e\u6027\uff08\u5982\u5c0f\u6570\u4f4d\uff09\u5c06\u5b83\u4eec\u5b9a\u4e49\u4e3aNFT\u3002"),(0,l.kt)("p",null,"\u8fd9\u4e00\u5207\u90fd\u662f\u901a\u8fc7",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/programs/token-metadata/overview"},"Token Metadata Program"),"\u5b8c\u6210\u7684 - \u8fd9\u662f\u5904\u7406Solana\u533a\u5757\u94fe\u4e0a\u7684Token\u548cNFT\u65f6\u6700\u91cd\u8981\u7684\u7a0b\u5e8f\u4e4b\u4e00\u3002\u5b83\u7684\u4e3b\u8981\u76ee\u6807\u662f\u5c06\u9644\u52a0\u6570\u636e\u9644\u52a0\u5230Solana\u4e0a\u7684\u53ef\u66ff\u4ee3\u6216\u4e0d\u53ef\u66ff\u4ee3Token\u4e0a\u3002\u5b83\u4f7f\u7528\u4eceMint\u8d26\u6237\u5730\u5740\u6d3e\u751f\u51fa\u6765\u7684\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\uff08PDAs\uff09\u6765\u5b9e\u73b0\u8fd9\u4e00\u76ee\u6807\u3002"),(0,l.kt)("h2",{id:"-\u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237"},"\ud83c\udfad \u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237"),(0,l.kt)("p",null,"\u4e00\u65e6\u6211\u4eec\u5236\u4f5c\u4e86\u4e00\u4e2a\u95ea\u4eae\u7684\u65b0\u4ee3\u5e01\uff0c\u6211\u4eec\u9700\u8981\u8ba9\u5b83\u53d8\u5f97\u534e\u4e3d\u8d77\u6765\u3002\u6211\u4eec\u5c06\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"Token Metadata Program"),"\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\uff0c\u4ee5\u4e0b\u662f\u751f\u6210\u7684\u8d26\u6237\u7684\u6837\u5b50\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6830).Z,width:"1322",height:"819"})),(0,l.kt)("p",null,"\u8fd9\u88ab\u79f0\u4e3a\u5143\u6570\u636e\u8d26\u6237\u3002\u5b83\u53ef\u4ee5\u5b58\u50a8\u5173\u4e8e\u7279\u5b9a\u4ee3\u5e01\u94f8\u9020\u8d26\u6237\u7684\u5404\u79cd\u4fe1\u606f\u3002\u4f60\u4f1a\u6ce8\u610f\u5230\u6709\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"URI")," \uff08\u7edf\u4e00\u8d44\u6e90\u6807\u8bc6\u7b26\uff09\u5c5e\u6027 - \u8fd9\u6307\u5411\u4e00\u4e2a\u94fe\u5916\u7684 JSON \u6587\u4ef6\uff0c\u4e3b\u8981\u7528\u4e8e\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFT\uff09\u3002\u7531\u4e8e\u94fe\u5916\u90e8\u5206\u4e0d\u53d7\u94fe\u4e0a\u8d39\u7528\u7684\u9650\u5236\uff0c\u4f60\u53ef\u4ee5\u5b58\u50a8\u9ad8\u8d28\u91cf\u7684\u56fe\u5f62\u548c\u5176\u4ed6\u5927\u578b\u6570\u636e\u5bf9\u8c61\u3002"),(0,l.kt)("p",null,"\u5143\u6570\u636e\u8d26\u6237\u6709\u5f88\u591a\u503c\uff0c\u4f60\u4e0d\u9700\u8981\u4e86\u89e3\u5176\u4e2d\u5927\u90e8\u5206\u3002\u6211\u4eec\u5c06\u5728\u9700\u8981\u65f6\u6df1\u5165\u4e86\u89e3\u76f8\u5173\u90e8\u5206\u3002\u73b0\u5728\uff0c\u6211\u4eec\u53ea\u5173\u5fc3\u79bb\u94fe\u90e8\u5206\uff0c\u8fd9\u662f\u6211\u4eec\u5236\u4f5c",(0,l.kt)("inlineCode",{parentName:"p"},"Pizzacoin"),"\u6240\u9700\u7684\u7b2c\u4e00\u4ef6\u4e8b\u3002"),(0,l.kt)("h2",{id:"-\u4ee3\u5e01\u6807\u51c6"},"\ud83d\uddbc \u4ee3\u5e01\u6807\u51c6"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"off-chain"),"\u90e8\u5206\u9075\u5faa",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/programs/token-metadata/token-standard"},"Metaplex\u4ee3\u5e01"),"\u6807\u51c6\uff0c\u57fa\u672c\u4e0a\u662f\u4e00\u79cd\u683c\u5f0f\uff0c\u4f60\u9700\u8981\u6309\u7167\u8fd9\u79cd\u683c\u5f0f\u6765\u5b9e\u73b0\u4e0d\u540c\u7c7b\u578b\u4ee3\u5e01\u7684\u5143\u6570\u636e\u3002\u6211\u4eec\u5728\u5143\u6570\u636e\u8d26\u6237\u7684\u94fe\u4e0a\u90e8\u5206\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"Token Standard")," \u5b57\u6bb5\u4e2d\u544a\u8bc9\u7f51\u7edc\u4e0a\u7684\u6240\u6709\u5e94\u7528\u7a0b\u5e8f\u6211\u4eec\u7684\u4ee3\u5e01\u7c7b\u578b\u3002\u6211\u4eec\u7684\u9009\u9879\u6709\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"NonFungible")," \uff1a\u4e00\u79cd\u5e26\u6709\u4e3b\u7248\u672c\u7684\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFTs\uff09\u3002"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"FungibleAsset")," \uff1a\u5177\u6709\u5143\u6570\u636e\u548c\u5c5e\u6027\u7684\u4ee4\u724c\uff0c\u6709\u65f6\u4e5f\u88ab\u79f0\u4e3a\u534a\u53ef\u66ff\u4ee3\u4ee4\u724c\uff08\u4f8b\u5982\u6e38\u620f\u7269\u54c1\uff09\u3002"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Fungible")," \uff1a\u5177\u6709\u7b80\u5355\u5143\u6570\u636e\u7684\u4ee3\u5e01\u3002\uff08\u50cfUSDC\u6216SOL\u8fd9\u6837\u7684\u5e38\u89c4\u4ee3\u5e01\uff09"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"NonFungibleEdition")," \uff1a\u4e00\u4e2a\u5177\u6709",(0,l.kt)("inlineCode",{parentName:"li"},"Edition"),"\u8d26\u6237\u7684\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08\u4eceMaster\u7248\u4e2d\u6253\u5370\u51fa\u6765\u7684\uff0c\u7c7b\u4f3c\u4e8e100\u4e2a\u4e2d\u76841\u4e2a\uff09\u3002")),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"Metaplex Token"),"\u6807\u51c6\u5728\u6574\u4e2a\u884c\u4e1a\u4e2d\u88ab\u5e7f\u6cdb\u63a5\u53d7\u3002\u5404\u79cd\u5e94\u7528\u7a0b\u5e8f\u3001\u4ea4\u6613\u6240\u548c\u94b1\u5305\u90fd\u5e0c\u671b\u4ee4\u724c\u7b26\u5408\u8be5\u6807\u51c6\u3002Token\u6807\u51c6\u7531Token\u5143\u6570\u636e\u7a0b\u5e8f\u81ea\u52a8\u8bbe\u7f6e\uff0c\u65e0\u6cd5\u624b\u52a8\u66f4\u65b0\u3002\u4ee5\u4e0b\u662f\u5b83\u5982\u4f55\u786e\u5b9a\u5982\u4f55\u5e94\u7528\u6b63\u786e\u7684\u6807\u51c6\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u4ee4\u724c\u62e5\u6709\u4e3b\u7248\u672c\u8d26\u6237\uff0c\u5219\u4e3a ",(0,l.kt)("inlineCode",{parentName:"li"},"NonFungible")," \u3002"),(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u4ee4\u724c\u5177\u6709Edition\u8d26\u6237\uff0c\u5219\u4e3a ",(0,l.kt)("inlineCode",{parentName:"li"},"NonFungibleEdition")," \u3002"),(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u4ee3\u5e01\u6ca1\u6709\uff08\u4e3b\uff09\u7248\u8d26\u6237\uff08\u786e\u4fdd\u5176\u4f9b\u5e94\u91cf\u53ef\u4ee5\u5927\u4e8e1\uff09\u5e76\u4e14\u4f7f\u7528\u96f6\u4f4d\u5c0f\u6570\uff0c\u90a3\u4e48\u5b83\u662f\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"li"},"FungibleAsset")," \u3002"),(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u4ee3\u5e01\u6ca1\u6709\uff08\u4e3b\uff09\u7248\u8d26\u6237\uff08\u786e\u4fdd\u5176\u4f9b\u5e94\u91cf\u53ef\u4ee5\u5927\u4e8e1\uff09\u5e76\u4e14\u4f7f\u7528\u81f3\u5c11\u4e00\u4f4d\u5c0f\u6570\uff0c\u90a3\u4e48\u5b83\u662f\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"li"},"Fungible")," \u3002")),(0,l.kt)("p",null,"\u4f60\u73b0\u5728\u53ef\u4ee5\u5ffd\u7565\u201cMaster Edition\u201d\u662f\u4ec0\u4e48\u610f\u601d\uff0c",(0,l.kt)("inlineCode",{parentName:"p"},"Pizzacoin"),"\u662f\u5b8c\u5168\u53ef\u66ff\u4ee3\u7684\uff0c\u6240\u4ee5\u6211\u4eec\u5c06\u4e13\u6ce8\u4e8e Fungible \u4ee3\u5e01\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(7541).Z,width:"1344",height:"844"})),(0,l.kt)("h2",{id:"-metaplex-sdk"},"\ud83e\uddf0 Metaplex SDK"),(0,l.kt)("p",null,"\u6b22\u8fce\u6765\u5230Solana\u4e0a\u6700\u5b9e\u7528\u7684SDK\u4e4b\u4e00\u3002\u5982\u679c\u4f60\u66fe\u7ecf\u5728Solana\u4e0a\u94f8\u9020\u8fc7NFT\uff0c\u90a3\u4e48\u4f60\u5f88\u53ef\u80fd\u5728\u4e0d\u77e5\u60c5\u7684\u60c5\u51b5\u4e0b\u4f7f\u7528\u4e86Metaplex SDK\u3002\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"@metaplex-foundation/js")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"@metaplex-foundation/mpl-token-metadata")," \u5e93\u6765\u521b\u5efa\u4e0e\u6211\u4eec\u7684\u4ee3\u5e01\u94f8\u9020\u76f8\u5173\u8054\u7684\u5143\u6570\u636e\u8d26\u6237\u3002\u662f\u65f6\u5019\u7ed9Pizzacoin\u4e00\u4e2a\u8eab\u4efd\u4e86\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u94fe\u4e0b\u90e8\u5206\u5f00\u59cb\uff0c\u53ea\u6709\u5728\u51c6\u5907\u5c31\u7eea\u540e\uff0c\u6211\u4eec\u624d\u4f1a\u7ee7\u7eed\u521b\u5efa\u4ee3\u5e01\u5143\u6570\u636e\u8d26\u6237\u3002"),(0,l.kt)("p",null,"\u4e00\u822c\u7684\u5de5\u4f5c\u6d41\u7a0b\u5c06\u662f\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"\u5b89\u88c5Metaplex SDK - \u4f60\u53ef\u80fd\u4f1a\u4f7f\u7528\u73b0\u6709\u7684\u5bc6\u94a5\u5bf9"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"\u4e0a\u4f20\u4e00\u4e2a\u56fe\u50cf\u4f5c\u4e3a\u6807\u5fd7 - \u6211\u4eec\u5c06\u4f7f\u7528\u672c\u5730\u6587\u4ef6\uff0c\u4f46SDK\u4e5f\u652f\u6301\u4ece\u6d4f\u89c8\u5668\u4e0a\u4f20"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:3},(0,l.kt)("li",{parentName:"ol"},"\u4e0a\u4f20\u94fe\u4e0b\u5143\u6570\u636e\uff08\u4ee5\u53ca\u60a8\u4e0a\u4f20\u7684\u56fe\u50cf\u7684URI\uff09\uff0c\u60a8\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u8fdb\u884c\u94fe\u4e0a\u64cd\u4f5c\u4e86\u3002"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:4},(0,l.kt)("li",{parentName:"ol"},"\u6d3e\u751f\u5143\u6570\u636e\u8d26\u6237PDA\uff08\u86cb\uff09"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:5},(0,l.kt)("li",{parentName:"ol"},"\u521b\u5efa\u94fe\u4e0a\u7684Token\u5143\u6570\u636e\u8d26\u6237 - \u6307\u4ee4\u3001\u4ea4\u6613\u7b49\u3002")))),(0,l.kt)("p",null,"\u611f\u89c9\u4e0d\u786e\u5b9a\uff1f\u8ba9\u6211\u4eec\u7528\u4e00\u4e9b\u4ee3\u7801\u6765\u6218\u80dc\u8fd9\u4e9b\u611f\u89c9\u5427 \ud83e\udd3a"))}d.isMDXComponent=!0},7541:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/fungible-token-2ac14bb1e4d6cb3b3ca96ef9a5d95115.png"},7493:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/metadata-15b62f5292c2643086cc0eab5bf127f8.png"},6830:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/token-metada-program-5a58935017366cdbad74d84ffa49d05a.png"},3497:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/token-metadata-98eafcec157bd4d186f68c4b66668f2c.png"}}]); \ No newline at end of file diff --git a/assets/js/1ce18368.6f69a2fa.js b/assets/js/1ce18368.6f69a2fa.js deleted file mode 100644 index 632e11085..000000000 --- a/assets/js/1ce18368.6f69a2fa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4547],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>c});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=a.createContext({}),u=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),m=u(n),k=l,c=m["".concat(p,".").concat(k)]||m[k]||d[k]||o;return n?a.createElement(c,r(r({ref:t},s),{},{components:n})):a.createElement(c,r({ref:t},s))}));function c(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,r=new Array(o);r[0]=k;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[m]="string"==typeof e?e:l,r[1]=i;for(var u=2;u{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=n(7462),l=(n(7294),n(3905));const o={sidebar_position:31,sidebar_label:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",sidebar_class_name:"green"},r="\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",i={unversionedId:"Solana-Co-Learn/module2/spl-token/token-metadata/README",id:"Solana-Co-Learn/module2/spl-token/token-metadata/README",title:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",description:"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002",source:"@site/docs/Solana-Co-Learn/module2/spl-token/token-metadata/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token/token-metadata",slug:"/Solana-Co-Learn/module2/spl-token/token-metadata/",permalink:"/docs/Solana-Co-Learn/module2/spl-token/token-metadata/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/token-metadata/README.md",tags:[],version:"current",sidebarPosition:31,frontMatter:{sidebar_position:31,sidebar_label:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",permalink:"/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/"},next:{title:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",permalink:"/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/"}},p={},u=[{value:"\ud83c\udfad \u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237",id:"-\u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237",level:2},{value:"\ud83d\uddbc \u4ee3\u5e01\u6807\u51c6",id:"-\u4ee3\u5e01\u6807\u51c6",level:2},{value:"\ud83e\uddf0 Metaplex SDK",id:"-metaplex-sdk",level:2}],s={toc:u},m="wrapper";function d(e){let{components:t,...o}=e;return(0,l.kt)(m,(0,a.Z)({},s,o,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u4ee4\u724c\u5143\u6570\u636e"},"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece",(0,l.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-token-client/tree/solution-without-burn?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"solution-without-burn")," \u5206\u652f\u4e0a\uff09\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(7493).Z,width:"739",height:"167"})),(0,l.kt)("p",null,"Token\u5143\u6570\u636e\u662f\u4e00\u4e2a\u4ee3\u5e01\u7684\u4fe1\u606f\uff0c\u6bd4\u5982\u540d\u79f0\u3001\u7b26\u53f7\u548c\u6807\u5fd7\u3002\u6ce8\u610f\u4e00\u4e0b\uff0c\u4f60\u94b1\u5305\u91cc\u7684\u5404\u79cd\u4ee3\u5e01\u90fd\u6709\u8fd9\u4e9b\u4e1c\u897f\uff0c\u9664\u4e86\u4f60\u81ea\u5df1\u521b\u5efa\u7684\u4ee3\u5e01\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(3497).Z,width:"356",height:"271"})),(0,l.kt)("p",null,"\u8fd9\u5c31\u662f\u6240\u6709\u7684\u5143\u6570\u636e\uff01\u8fd9\u9002\u7528\u4e8e\u6240\u6709\u7684\u4ee3\u5e01\uff0c\u4e0d\u4ec5\u4ec5\u662f\u53ef\u66ff\u4ee3\u8d27\u5e01\u3002\u5728Solana\u4e0a\uff0cNFT\u5c31\u50cf\u4efb\u4f55\u5176\u4ed6\u4ee3\u5e01\u4e00\u6837\uff0c\u53ea\u662f\u5143\u6570\u636e\u901a\u8fc7\u5c5e\u6027\uff08\u5982\u5c0f\u6570\u4f4d\uff09\u5c06\u5b83\u4eec\u5b9a\u4e49\u4e3aNFT\u3002"),(0,l.kt)("p",null,"\u8fd9\u4e00\u5207\u90fd\u662f\u901a\u8fc7",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/programs/token-metadata/overview"},"Token Metadata Program"),"\u5b8c\u6210\u7684 - \u8fd9\u662f\u5904\u7406Solana\u533a\u5757\u94fe\u4e0a\u7684Token\u548cNFT\u65f6\u6700\u91cd\u8981\u7684\u7a0b\u5e8f\u4e4b\u4e00\u3002\u5b83\u7684\u4e3b\u8981\u76ee\u6807\u662f\u5c06\u9644\u52a0\u6570\u636e\u9644\u52a0\u5230Solana\u4e0a\u7684\u53ef\u66ff\u4ee3\u6216\u4e0d\u53ef\u66ff\u4ee3Token\u4e0a\u3002\u5b83\u4f7f\u7528\u4eceMint\u8d26\u6237\u5730\u5740\u6d3e\u751f\u51fa\u6765\u7684\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\uff08PDAs\uff09\u6765\u5b9e\u73b0\u8fd9\u4e00\u76ee\u6807\u3002"),(0,l.kt)("h2",{id:"-\u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237"},"\ud83c\udfad \u4ee4\u724c\u5143\u6570\u636e\u8d26\u6237"),(0,l.kt)("p",null,"\u4e00\u65e6\u6211\u4eec\u5236\u4f5c\u4e86\u4e00\u4e2a\u95ea\u4eae\u7684\u65b0\u4ee3\u5e01\uff0c\u6211\u4eec\u9700\u8981\u8ba9\u5b83\u53d8\u5f97\u534e\u4e3d\u8d77\u6765\u3002\u6211\u4eec\u5c06\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"Token Metadata Program"),"\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\uff0c\u4ee5\u4e0b\u662f\u751f\u6210\u7684\u8d26\u6237\u7684\u6837\u5b50\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6830).Z,width:"1322",height:"819"})),(0,l.kt)("p",null,"\u8fd9\u88ab\u79f0\u4e3a\u5143\u6570\u636e\u8d26\u6237\u3002\u5b83\u53ef\u4ee5\u5b58\u50a8\u5173\u4e8e\u7279\u5b9a\u4ee3\u5e01\u94f8\u9020\u8d26\u6237\u7684\u5404\u79cd\u4fe1\u606f\u3002\u4f60\u4f1a\u6ce8\u610f\u5230\u6709\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"URI")," \uff08\u7edf\u4e00\u8d44\u6e90\u6807\u8bc6\u7b26\uff09\u5c5e\u6027 - \u8fd9\u6307\u5411\u4e00\u4e2a\u94fe\u5916\u7684 JSON \u6587\u4ef6\uff0c\u4e3b\u8981\u7528\u4e8e\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFT\uff09\u3002\u7531\u4e8e\u94fe\u5916\u90e8\u5206\u4e0d\u53d7\u94fe\u4e0a\u8d39\u7528\u7684\u9650\u5236\uff0c\u4f60\u53ef\u4ee5\u5b58\u50a8\u9ad8\u8d28\u91cf\u7684\u56fe\u5f62\u548c\u5176\u4ed6\u5927\u578b\u6570\u636e\u5bf9\u8c61\u3002"),(0,l.kt)("p",null,"\u5143\u6570\u636e\u8d26\u6237\u6709\u5f88\u591a\u503c\uff0c\u4f60\u4e0d\u9700\u8981\u4e86\u89e3\u5176\u4e2d\u5927\u90e8\u5206\u3002\u6211\u4eec\u5c06\u5728\u9700\u8981\u65f6\u6df1\u5165\u4e86\u89e3\u76f8\u5173\u90e8\u5206\u3002\u73b0\u5728\uff0c\u6211\u4eec\u53ea\u5173\u5fc3\u79bb\u94fe\u90e8\u5206\uff0c\u8fd9\u662f\u6211\u4eec\u5236\u4f5c",(0,l.kt)("inlineCode",{parentName:"p"},"Pizzacoin"),"\u6240\u9700\u7684\u7b2c\u4e00\u4ef6\u4e8b\u3002"),(0,l.kt)("h2",{id:"-\u4ee3\u5e01\u6807\u51c6"},"\ud83d\uddbc \u4ee3\u5e01\u6807\u51c6"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"off-chain"),"\u90e8\u5206\u9075\u5faa",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/programs/token-metadata/token-standard"},"Metaplex\u4ee3\u5e01"),"\u6807\u51c6\uff0c\u57fa\u672c\u4e0a\u662f\u4e00\u79cd\u683c\u5f0f\uff0c\u4f60\u9700\u8981\u6309\u7167\u8fd9\u79cd\u683c\u5f0f\u6765\u5b9e\u73b0\u4e0d\u540c\u7c7b\u578b\u4ee3\u5e01\u7684\u5143\u6570\u636e\u3002\u6211\u4eec\u5728\u5143\u6570\u636e\u8d26\u6237\u7684\u94fe\u4e0a\u90e8\u5206\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"Token Standard")," \u5b57\u6bb5\u4e2d\u544a\u8bc9\u7f51\u7edc\u4e0a\u7684\u6240\u6709\u5e94\u7528\u7a0b\u5e8f\u6211\u4eec\u7684\u4ee3\u5e01\u7c7b\u578b\u3002\u6211\u4eec\u7684\u9009\u9879\u6709\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"NonFungible")," \uff1a\u4e00\u79cd\u5e26\u6709\u4e3b\u7248\u672c\u7684\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFTs\uff09\u3002"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"FungibleAsset")," \uff1a\u5177\u6709\u5143\u6570\u636e\u548c\u5c5e\u6027\u7684\u4ee4\u724c\uff0c\u6709\u65f6\u4e5f\u88ab\u79f0\u4e3a\u534a\u53ef\u66ff\u4ee3\u4ee4\u724c\uff08\u4f8b\u5982\u6e38\u620f\u7269\u54c1\uff09\u3002"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Fungible")," \uff1a\u5177\u6709\u7b80\u5355\u5143\u6570\u636e\u7684\u4ee3\u5e01\u3002\uff08\u50cfUSDC\u6216SOL\u8fd9\u6837\u7684\u5e38\u89c4\u4ee3\u5e01\uff09"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"NonFungibleEdition")," \uff1a\u4e00\u4e2a\u5177\u6709",(0,l.kt)("inlineCode",{parentName:"li"},"Edition"),"\u8d26\u6237\u7684\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08\u4eceMaster\u7248\u4e2d\u6253\u5370\u51fa\u6765\u7684\uff0c\u7c7b\u4f3c\u4e8e100\u4e2a\u4e2d\u76841\u4e2a\uff09\u3002")),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"Metaplex Token"),"\u6807\u51c6\u5728\u6574\u4e2a\u884c\u4e1a\u4e2d\u88ab\u5e7f\u6cdb\u63a5\u53d7\u3002\u5404\u79cd\u5e94\u7528\u7a0b\u5e8f\u3001\u4ea4\u6613\u6240\u548c\u94b1\u5305\u90fd\u5e0c\u671b\u4ee4\u724c\u7b26\u5408\u8be5\u6807\u51c6\u3002Token\u6807\u51c6\u7531Token\u5143\u6570\u636e\u7a0b\u5e8f\u81ea\u52a8\u8bbe\u7f6e\uff0c\u65e0\u6cd5\u624b\u52a8\u66f4\u65b0\u3002\u4ee5\u4e0b\u662f\u5b83\u5982\u4f55\u786e\u5b9a\u5982\u4f55\u5e94\u7528\u6b63\u786e\u7684\u6807\u51c6\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u4ee4\u724c\u62e5\u6709\u4e3b\u7248\u672c\u8d26\u6237\uff0c\u5219\u4e3a ",(0,l.kt)("inlineCode",{parentName:"li"},"NonFungible")," \u3002"),(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u4ee4\u724c\u5177\u6709Edition\u8d26\u6237\uff0c\u5219\u4e3a ",(0,l.kt)("inlineCode",{parentName:"li"},"NonFungibleEdition")," \u3002"),(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u4ee3\u5e01\u6ca1\u6709\uff08\u4e3b\uff09\u7248\u8d26\u6237\uff08\u786e\u4fdd\u5176\u4f9b\u5e94\u91cf\u53ef\u4ee5\u5927\u4e8e1\uff09\u5e76\u4e14\u4f7f\u7528\u96f6\u4f4d\u5c0f\u6570\uff0c\u90a3\u4e48\u5b83\u662f\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"li"},"FungibleAsset")," \u3002"),(0,l.kt)("li",{parentName:"ul"},"\u5982\u679c\u4ee3\u5e01\u6ca1\u6709\uff08\u4e3b\uff09\u7248\u8d26\u6237\uff08\u786e\u4fdd\u5176\u4f9b\u5e94\u91cf\u53ef\u4ee5\u5927\u4e8e1\uff09\u5e76\u4e14\u4f7f\u7528\u81f3\u5c11\u4e00\u4f4d\u5c0f\u6570\uff0c\u90a3\u4e48\u5b83\u662f\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"li"},"Fungible")," \u3002")),(0,l.kt)("p",null,"\u4f60\u73b0\u5728\u53ef\u4ee5\u5ffd\u7565\u201cMaster Edition\u201d\u662f\u4ec0\u4e48\u610f\u601d\uff0c",(0,l.kt)("inlineCode",{parentName:"p"},"Pizzacoin"),"\u662f\u5b8c\u5168\u53ef\u66ff\u4ee3\u7684\uff0c\u6240\u4ee5\u6211\u4eec\u5c06\u4e13\u6ce8\u4e8e Fungible \u4ee3\u5e01\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(7541).Z,width:"1344",height:"844"})),(0,l.kt)("h2",{id:"-metaplex-sdk"},"\ud83e\uddf0 Metaplex SDK"),(0,l.kt)("p",null,"\u6b22\u8fce\u6765\u5230Solana\u4e0a\u6700\u5b9e\u7528\u7684SDK\u4e4b\u4e00\u3002\u5982\u679c\u4f60\u66fe\u7ecf\u5728Solana\u4e0a\u94f8\u9020\u8fc7NFT\uff0c\u90a3\u4e48\u4f60\u5f88\u53ef\u80fd\u5728\u4e0d\u77e5\u60c5\u7684\u60c5\u51b5\u4e0b\u4f7f\u7528\u4e86Metaplex SDK\u3002\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"@metaplex-foundation/js")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"@metaplex-foundation/mpl-token-metadata")," \u5e93\u6765\u521b\u5efa\u4e0e\u6211\u4eec\u7684\u4ee3\u5e01\u94f8\u9020\u76f8\u5173\u8054\u7684\u5143\u6570\u636e\u8d26\u6237\u3002\u662f\u65f6\u5019\u7ed9Pizzacoin\u4e00\u4e2a\u8eab\u4efd\u4e86\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u94fe\u4e0b\u90e8\u5206\u5f00\u59cb\uff0c\u53ea\u6709\u5728\u51c6\u5907\u5c31\u7eea\u540e\uff0c\u6211\u4eec\u624d\u4f1a\u7ee7\u7eed\u521b\u5efa\u4ee3\u5e01\u5143\u6570\u636e\u8d26\u6237\u3002"),(0,l.kt)("p",null,"\u4e00\u822c\u7684\u5de5\u4f5c\u6d41\u7a0b\u5c06\u662f\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"\u5b89\u88c5Metaplex SDK - \u4f60\u53ef\u80fd\u4f1a\u4f7f\u7528\u73b0\u6709\u7684\u5bc6\u94a5\u5bf9"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"\u4e0a\u4f20\u4e00\u4e2a\u56fe\u50cf\u4f5c\u4e3a\u6807\u5fd7 - \u6211\u4eec\u5c06\u4f7f\u7528\u672c\u5730\u6587\u4ef6\uff0c\u4f46SDK\u4e5f\u652f\u6301\u4ece\u6d4f\u89c8\u5668\u4e0a\u4f20"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:3},(0,l.kt)("li",{parentName:"ol"},"\u4e0a\u4f20\u94fe\u4e0b\u5143\u6570\u636e\uff08\u4ee5\u53ca\u60a8\u4e0a\u4f20\u7684\u56fe\u50cf\u7684URI\uff09\uff0c\u60a8\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u8fdb\u884c\u94fe\u4e0a\u64cd\u4f5c\u4e86\u3002"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:4},(0,l.kt)("li",{parentName:"ol"},"\u6d3e\u751f\u5143\u6570\u636e\u8d26\u6237PDA\uff08\u86cb\uff09"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:5},(0,l.kt)("li",{parentName:"ol"},"\u521b\u5efa\u94fe\u4e0a\u7684Token\u5143\u6570\u636e\u8d26\u6237 - \u6307\u4ee4\u3001\u4ea4\u6613\u7b49\u3002")))),(0,l.kt)("p",null,"\u611f\u89c9\u4e0d\u786e\u5b9a\uff1f\u8ba9\u6211\u4eec\u7528\u4e00\u4e9b\u4ee3\u7801\u6765\u6218\u80dc\u8fd9\u4e9b\u611f\u89c9\u5427 \ud83e\udd3a"))}d.isMDXComponent=!0},7541:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/fungible-token-2ac14bb1e4d6cb3b3ca96ef9a5d95115.png"},7493:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/metadata-15b62f5292c2643086cc0eab5bf127f8.png"},6830:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/token-metada-program-5a58935017366cdbad74d84ffa49d05a.png"},3497:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/token-metadata-98eafcec157bd4d186f68c4b66668f2c.png"}}]); \ No newline at end of file diff --git a/assets/js/1fc16822.4169faeb.js b/assets/js/1fc16822.4169faeb.js new file mode 100644 index 000000000..96b93e2e0 --- /dev/null +++ b/assets/js/1fc16822.4169faeb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2828],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>k});var a=t(7294);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var i=a.createContext({}),p=function(e){var n=a.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},d=function(e){var n=p(e.components);return a.createElement(i.Provider,{value:n},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,r=e.originalType,i=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=p(t),m=l,k=c["".concat(i,".").concat(m)]||c[m]||u[m]||r;return t?a.createElement(k,o(o({ref:n},d),{},{components:t})):a.createElement(k,o({ref:n},d))}));function k(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var r=t.length,o=new Array(r);o[0]=m;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[c]="string"==typeof e?e:l,o[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var a=t(7462),l=(t(7294),t(3905));const r={sidebar_position:13,sidebar_label:"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e",sidebar_class_name:"green"},o="\u4ece Solana \ud83e\udd13 \u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e",s={unversionedId:"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README",id:"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README",title:"\u4ece Solana \ud83e\udd13 \u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e",description:"\u662f\u65f6\u5019\u56de\u5230\u8fc7\u53bb\u4e86\u3002\u56de\u5230\u5e7c\u513f\u56ed\u7684\u65f6\u5149\u3002\u8fd8\u8bb0\u5f97\u4f60\u5b66\u5230\u7684\u7b2c\u4e00\u4ef6\u4e8b\u662f\u4ec0\u4e48\u5417\uff1f\u5b57\u6bcd\u8868\u3002\u4e00\u65e6\u4f60\u5f81\u670d\u4e86\u5168\u90e826\u4e2a\u5b57\u6bcd\uff0c\u4f60\u5c31\u5b66\u4f1a\u4e86\u9605\u8bfb\u3002\u8fd9\u662f\u4f60\u6210\u4e3aSolana\u5f00\u53d1\u8005\u4e4b\u65c5\u7684\u8d77\u70b9\u3002\u9605\u8bfb\u82f1\u8bed\u7684\u72ec\u7279\u6280\u80fd\u4f7f\u4f60\u6210\u4e3a\u4e86\u73b0\u5728\u8fd9\u4e2a\u80fd\u591f\u5480\u56bc\u77e5\u8bc6\u7684\u8d85\u7ea7\u5927\u8111\u3002",source:"@site/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README.md",sourceDirName:"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network",slug:"/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README.md",tags:[],version:"current",sidebarPosition:13,frontMatter:{sidebar_position:13,sidebar_label:"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5ba2\u6237\u7aef\u5f00\u53d1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/"},next:{title:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/"}},i={},p=[{value:"\ud83d\udc5c Solana\u4e0a\u7684\u8d26\u6237",id:"-solana\u4e0a\u7684\u8d26\u6237",level:2},{value:"\ud83d\udceb \u4ece\u7f51\u7edc\u4e2d\u8bfb\u53d6",id:"-\u4ece\u7f51\u7edc\u4e2d\u8bfb\u53d6",level:2},{value:"\ud83e\udd11 \u6784\u5efa\u4e00\u4e2a\u4f59\u989d\u83b7\u53d6\u5668",id:"-\u6784\u5efa\u4e00\u4e2a\u4f59\u989d\u83b7\u53d6\u5668",level:2},{value:"\ud83d\udea2 Ship \u6311\u6218",id:"-ship-\u6311\u6218",level:2}],d={toc:p},c="wrapper";function u(e){let{components:n,...r}=e;return(0,l.kt)(c,(0,a.Z)({},d,r,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"\u4ece-solana--\u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e"},"\u4ece Solana \ud83e\udd13 \u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u56de\u5230\u8fc7\u53bb\u4e86\u3002\u56de\u5230\u5e7c\u513f\u56ed\u7684\u65f6\u5149\u3002\u8fd8\u8bb0\u5f97\u4f60\u5b66\u5230\u7684\u7b2c\u4e00\u4ef6\u4e8b\u662f\u4ec0\u4e48\u5417\uff1f\u5b57\u6bcd\u8868\u3002\u4e00\u65e6\u4f60\u5f81\u670d\u4e86\u5168\u90e826\u4e2a\u5b57\u6bcd\uff0c\u4f60\u5c31\u5b66\u4f1a\u4e86\u9605\u8bfb\u3002\u8fd9\u662f\u4f60\u6210\u4e3aSolana\u5f00\u53d1\u8005\u4e4b\u65c5\u7684\u8d77\u70b9\u3002\u9605\u8bfb\u82f1\u8bed\u7684\u72ec\u7279\u6280\u80fd\u4f7f\u4f60\u6210\u4e3a\u4e86\u73b0\u5728\u8fd9\u4e2a\u80fd\u591f\u5480\u56bc\u77e5\u8bc6\u7684\u8d85\u7ea7\u5927\u8111\u3002"),(0,l.kt)("p",null,"\u65f6\u5019\u518d\u6b21\u884c\u52a8\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4f60\u7684\u5e7c\u513f\u56ed\u8001\u5e08\u5e94\u8be5\u6559\u6388\u7684\u5730\u65b9\u5f00\u59cb\u2014\u2014\u4ece\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e\u3002"),(0,l.kt)("h2",{id:"-solana\u4e0a\u7684\u8d26\u6237"},"\ud83d\udc5c Solana\u4e0a\u7684\u8d26\u6237"),(0,l.kt)("p",null,"\u4eceSolana\u5b57\u6bcd\u8868\u5f00\u59cb\uff0c\u6211\u4eec\u6709A\u4ee3\u8868\u8d26\u6237\u3002\u6211\u4eec\u4ece\u8d26\u6237\u5f00\u59cb\uff0c\u56e0\u4e3aSolana\u4e0a\u7684\u667a\u80fd\u5408\u7ea6\uff0c\u4e5f\u88ab\u79f0\u4e3a\u201c\u7a0b\u5e8f\u201d\uff0c\u662f\u65e0\u72b6\u6001\u7684\u2014\u2014\u610f\u5473\u7740\u5b83\u4eec\u9664\u4e86\u4ee3\u7801\u4e4b\u5916\u4e0d\u5b58\u50a8\u4efb\u4f55\u4e1c\u897f\u3002\u4e00\u5207\u90fd\u53d1\u751f\u5728\u8d26\u6237\u4e2d\uff0c\u6240\u4ee5\u5b83\u4eec\u5bf9Solana\u6765\u8bf4\u81f3\u5173\u91cd\u8981\uff0c\u5b83\u4eec\u7528\u4e8e\u5b58\u50a8\u3001\u5408\u7ea6\u548c\u672c\u5730\u533a\u5757\u94fe\u7a0b\u5e8f\u3002"),(0,l.kt)("p",null,"Solana \u4e0a\u6709\u4e09\u79cd\u7c7b\u578b\u7684\u8d26\u6237"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6570\u636e\u5e10\u6237 - \u8fd9\u4e9b\u5b58\u50a8\u6570\u636e, LOL"),(0,l.kt)("li",{parentName:"ul"},"\u7a0b\u5e8f\u5e10\u6237 - \u8fd9\u4e9b\u5b58\u50a8\u53ef\u6267\u884c\u7a0b\u5e8f\uff08\u53c8\u79f0\u667a\u80fd\u5408\u7ea6\uff09"),(0,l.kt)("li",{parentName:"ul"},"\u539f\u751f\u8d26\u6237 - \u8fd9\u4e9b\u7528\u4e8e\u6838\u5fc3\u533a\u5757\u94fe\u529f\u80fd\uff0c\u4f8b\u5982\u6743\u76ca\u3001\u6295\u7968")),(0,l.kt)("p",null,"\u672c\u5730\u8d26\u6237\uff08native account\uff09\u662f\u533a\u5757\u94fe\u8fd0\u884c\u6240\u9700\u7684\uff0c\u6211\u4eec\u7a0d\u540e\u4f1a\u8be6\u7ec6\u4ecb\u7ecd\u3002\u73b0\u5728\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5904\u7406\u6570\u636e\u548c\u7a0b\u5e8f\u8d26\u6237\u3002"),(0,l.kt)("p",null,"\u5728\u6570\u636e\u8d26\u6237\u4e2d\uff0c\u60a8\u8fd8\u6709\u4e24\u79cd\u8fdb\u4e00\u6b65\u7684\u7c7b\u578b"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u7cfb\u7edf\u62e5\u6709\u7684\u5e10\u6237"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"PDA"),"\uff08\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\uff09\u5e10\u6237")),(0,l.kt)("p",null,"\u6211\u4eec\u5f88\u5feb\u5c31\u4f1a\u4ecb\u7ecd\u8fd9\u4e9b\u5230\u5e95\u662f\u4ec0\u4e48\u2122\ufe0f\uff0c\u73b0\u5728\u5c31\u8ddf\u7740\u4e00\u8d77\u8d70\u5427\u3002"),(0,l.kt)("p",null,"\u6bcf\u4e2a\u8d26\u6237\u90fd\u6709\u4e00\u4e9b\u4f60\u5e94\u8be5\u4e86\u89e3\u7684\u5b57\u6bb5\uff1a"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"FIELD"),(0,l.kt)("th",{parentName:"tr",align:null},"\u63cf\u8ff0"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"lamports"),(0,l.kt)("td",{parentName:"tr",align:null},"\u8be5\u8d26\u6237\u62e5\u6709\u7684lamports\u6570\u91cf")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"owner"),(0,l.kt)("td",{parentName:"tr",align:null},"\u8fd9\u4e2a\u8d26\u6237\u7684\u6240\u6709\u8005\u7a0b\u5e8f")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"executable"),(0,l.kt)("td",{parentName:"tr",align:null},"\u8fd9\u4e2a\u8d26\u6237\u6210\u662f\u5426\u53ef\u4ee5\u5904\u7406\u6307\u4ee4")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"data"),(0,l.kt)("td",{parentName:"tr",align:null},"\u8fd9\u4e2a\u8d26\u6237\u5b58\u50a8\u7684\u6570\u636e\u7684\u5b57\u8282\u7801")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"rent_epoch"),(0,l.kt)("td",{parentName:"tr",align:null},"\u4e0b\u4e00\u4e2a\u9700\u8981\u4ed8\u79df\u91d1\u7684epoch\uff08\u4ee3\uff09")))),(0,l.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u53ea\u5173\u6ce8\u6211\u4eec\u9700\u8981\u4e86\u89e3\u7684\u4e8b\u60c5\uff0c\u6240\u4ee5\u5982\u679c\u6709\u4e9b\u4e1c\u897f\u4e0d\u592a\u660e\u767d\uff0c\u5c31\u7ee7\u7eed\u524d\u8fdb\u5427 - \u6211\u4eec\u4f1a\u8fb9\u8fdb\u884c\u4e0b\u53bb\u8fb9\u586b\u8865\u7a7a\u767d\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"Lamport"),"\u662fSolana\u7684\u6700\u5c0f\u5355\u4f4d\u3002\u5982\u679c\u4f60\u719f\u6089\u4ee5\u592a\u574a\u751f\u6001\u7cfb\u7edf\uff0c\u8fd9\u6709\u70b9\u50cfGwei\u3002\u4e00\u4e2a",(0,l.kt)("inlineCode",{parentName:"p"},"Lamport"),"\u7b49\u4e8e0.000000001 SOL\uff0c\u6240\u4ee5\u8fd9\u4e2a\u5b57\u6bb5\u544a\u8bc9\u6211\u4eec\u8d26\u6237\u62e5\u6709\u591a\u5c11SOL\u3002"),(0,l.kt)("p",null,"\u6bcf\u4e2a\u8d26\u6237\u90fd\u6709\u4e00\u4e2a\u516c\u94a5 - \u5b83\u5c31\u50cf\u8d26\u6237\u7684\u5730\u5740\u3002\u4f60\u77e5\u9053\u4f60\u7684\u94b1\u5305\u6709\u4e00\u4e2a\u5730\u5740\uff0c\u7528\u6765\u63a5\u6536\u90a3\u4e9b\u8fa3\u8fa3\u7684NFT\u5417\uff1f\u540c\u6837\u7684\u9053\u7406\uff01Solana\u5730\u5740\u53ea\u662fbase58\u7f16\u7801\u7684\u5b57\u7b26\u4e32\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"executable")," \u662f\u4e00\u4e2a\u5e03\u5c14\u5b57\u6bb5\uff0c\u544a\u8bc9\u6211\u4eec\u8be5\u5e10\u6237\u662f\u5426\u5305\u542b\u53ef\u6267\u884c\u6570\u636e\u3002\u6570\u636e\u662f\u5b58\u50a8\u5728\u5e10\u6237\u4e2d\u7684\u5185\u5bb9\uff0c\u79df\u91d1\u6211\u4eec\u7a0d\u540e\u4f1a\u652f\u4ed8\uff01"),(0,l.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u5148\u4ece\u7b80\u5355\u7684\u4e8b\u60c5\u5f00\u59cb\u5427 :)"),(0,l.kt)("h2",{id:"-\u4ece\u7f51\u7edc\u4e2d\u8bfb\u53d6"},"\ud83d\udceb \u4ece\u7f51\u7edc\u4e2d\u8bfb\u53d6"),(0,l.kt)("p",null,"\u597d\u7684\uff0c\u6211\u4eec\u77e5\u9053\u4ec0\u4e48\u662f\u8d26\u6237\uff0c\u90a3\u4e48\u6211\u4eec\u5982\u4f55\u8bfb\u53d6\u5b83\u4eec\u5462\uff1f\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u4e2a\u53eb\u505a JSON RPC \u7ec8\u7aef\u70b9\u7684\u4e1c\u897f\uff01\u770b\u770b\u8fd9\u4e2a\u56fe\u8868\uff0c\u4f60\u5c06\u626e\u6f14\u5ba2\u6237\u7aef\u7684\u89d2\u8272\uff0c\u5728 Solana \u7f51\u7edc\u4e2d\u5c1d\u8bd5\u8bfb\u53d6\u4fe1\u606f\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(9205).Z,width:"1600",height:"1035"})),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u901a\u8fc7API\u8c03\u7528JSON RPC\u6765\u83b7\u53d6\u60a8\u60f3\u8981\u7684\u5185\u5bb9\uff0c\u5b83\u4f1a\u4e0e\u7f51\u7edc\u8fdb\u884c\u901a\u4fe1\u5e76\u8fd4\u56de\u7ed9\u60a8\u6240\u9700\u7684\u6570\u636e\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u6211\u4eec\u60f3\u8981\u83b7\u53d6\u8d26\u6237\u7684\u4f59\u989d\uff0cAPI\u8c03\u7528\u5c06\u5982\u4e0b\u6240\u793a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"async function getBalanceUsingJSONRPC(address: string): Promise {\n const url = clusterApiUrl('devnet')\n console.log(url);\n return fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"getBalance\",\n \"params\": [\n address\n ]\n })\n }).then(response => response.json())\n .then(json => {\n if (json.error) {\n throw json.error\n }\n\n return json['result']['value'] as number;\n })\n .catch(error => {\n throw error\n })\n}\n")),(0,l.kt)("p",null,"\u8fd9\u91cc\u53d1\u751f\u4e86\u4e00\u5806\u4e8b\u60c5\u3002\u6211\u4eec\u6b63\u5728\u8fdb\u884c\u4e00\u4e2aPOST\u8bf7\u6c42\uff0c\u8bf7\u6c42\u4f53\u4e2d\u6709\u7279\u5b9a\u7684\u53c2\u6570\u544a\u8bc9RPC\u8981\u505a\u4ec0\u4e48\u3002\u6211\u4eec\u9700\u8981\u6307\u5b9aRPC\u7684\u7248\u672c\u3001id\u3001\u65b9\u6cd5\uff0c\u672c\u4f8b\u4e2d\u662fgetBalance\uff0c\u4ee5\u53ca\u8be5\u65b9\u6cd5\u6240\u9700\u7684\u53c2\u6570\uff0c\u672c\u4f8b\u4e2d\u53ea\u6709address\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u6709\u4e00\u5806\u9488\u5bf9\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u7684\u65b9\u6cd5\u7684\u6837\u677f\u4ee3\u7801\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528Solana\u7684",(0,l.kt)("inlineCode",{parentName:"p"},"Web3.js")," SDK\u3002\u4ee5\u4e0b\u662f\u6240\u9700\u7684\u5185\u5bb9\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"async function getBalanceUsingWeb3(address: PublicKey): Promise {\n const connection = new Connection(clusterApiUrl('devnet'));\n return connection.getBalance(address);\n}\n")),(0,l.kt)("p",null,"\u8fd9\u4e0d\u662f\u5f88\u6f02\u4eae\u5417\uff1f\u6211\u4eec\u53ea\u9700\u8981\u8fd9\u4e09\u884c\u4ee3\u7801\u5c31\u80fd\u83b7\u53d6\u5230\u67d0\u4eba\u7684Solana\u4f59\u989d\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u5982\u679c\u83b7\u53d6\u4efb\u4f55\u4eba\u7684\u94f6\u884c\u4f59\u989d\u4e5f\u662f\u8fd9\u4e48\u7b80\u5355\u7684\u8bdd\u3002"),(0,l.kt)("p",null,"\u73b0\u5728\u4f60\u77e5\u9053\u5982\u4f55\u4eceSolana\u4e0a\u7684\u8d26\u6237\u8bfb\u53d6\u6570\u636e\u4e86\uff01\u6211\u77e5\u9053\u8fd9\u53ef\u80fd\u770b\u8d77\u6765\u5fae\u4e0d\u8db3\u9053\uff0c\u4f46\u53ea\u8981\u4f7f\u7528\u8fd9\u4e2a\u51fd\u6570\uff0c\u4f60\u5c31\u53ef\u4ee5\u83b7\u53d6Solana\u4e0a\u4efb\u4f55\u8d26\u6237\u7684\u4f59\u989d\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u80fd\u591f\u83b7\u53d6\u5730\u7403\u4e0a\u4efb\u4f55\u94f6\u884c\u8d26\u6237\u7684\u4f59\u989d\uff0c\u8fd9\u5c31\u662f\u5b83\u7684\u5f3a\u5927\u4e4b\u5904"),(0,l.kt)("h2",{id:"-\u6784\u5efa\u4e00\u4e2a\u4f59\u989d\u83b7\u53d6\u5668"},"\ud83e\udd11 \u6784\u5efa\u4e00\u4e2a\u4f59\u989d\u83b7\u53d6\u5668"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u6784\u5efa\u4e00\u4e2a\u901a\u7528\u7684\u4f59\u989d\u83b7\u53d6\u5668\u4e86\uff08\u5047\u8bbe\u6574\u4e2a\u5b87\u5b99\u90fd\u5728Solana\u4e0a\uff09\u3002\u8fd9\u5c06\u662f\u4e00\u4e2a\u7b80\u5355\u4f46\u529f\u80fd\u5f3a\u5927\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u83b7\u53d6Solana\u4e0a\u4efb\u4f55\u8d26\u6237\u7684\u4f59\u989d\u3002"),(0,l.kt)("p",null,"\u5728\u4f60\u7684\u5de5\u4f5c\u533a\u57df\u521b\u5efa\u4e00\u4e2a\u6587\u4ef6\u5939\u3002\u6211\u5c06\u6211\u7684\u653e\u5728\u684c\u9762\u4e0a\u3002",(0,l.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-intro-frontend.git"},"\u514b\u9686\u8d77\u59cb\u5e93"),"\u5e76\u8fdb\u884c\u8bbe\u7f6e\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-intro-frontend.git\ncd solana-intro-frontend\ngit checkout starter\nnpm i\n")),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u7b80\u5355\u7684 Next.js \u5e94\u7528\u7a0b\u5e8f\uff0c\u56e0\u6b64\u4e00\u65e6\u5b89\u88c5\u4e86\u6240\u6709\u4f9d\u8d56\u9879\uff0c\u60a8\u5c31\u53ef\u4ee5\u5728\u7ec8\u7aef\u4e2d\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u542f\u52a8\u5b83\u3002\u60a8\u5e94\u8be5\u5728",(0,l.kt)("inlineCode",{parentName:"p"},"localhost"),"\u4e0a\u770b\u5230\u6b64\u5185\u5bb9\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(1201).Z,width:"1157",height:"516"})),(0,l.kt)("p",null,"\u6211\u4eec\u4e3a\u60a8\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7b80\u5355\u7684Next.js\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u6dfb\u52a0\u4e86\u4e00\u4e9b\u6837\u5f0f\u3002\u5982\u679c\u60a8\u5728\u5730\u5740\u680f\u4e2d\u8f93\u5165\u5185\u5bb9\u5e76\u70b9\u51fb\u201c\u68c0\u67e5SOL\u4f59\u989d\u201d\u6309\u94ae\uff0c\u60a8\u5c06\u770b\u52301,000 SOL\u7684\u4f59\u989d\u3002\u662f\u65f6\u5019\u8ba9\u5b83\u6b63\u5e38\u5de5\u4f5c\u4e86\u3002"),(0,l.kt)("p",null,"\u9996\u5148\uff0c\u4f60\u60f3\u8981\u5b89\u88c5",(0,l.kt)("inlineCode",{parentName:"p"},"Solana/web3.js"),"\u5e93\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @solana/web3.js\n")),(0,l.kt)("p",null,"\u8fd9\u5c06\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u7684\u51fd\u6570\u6765\u83b7\u53d6\u4f59\u989d\u3002\u8f6c\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"index.tsx")," \u5e76\u5c06\u5176\u5bfc\u5165\u5230\u9876\u90e8\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3.js'\n")),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u7740\u624b\u5904\u7406 ",(0,l.kt)("inlineCode",{parentName:"p"},"addressSubmittedHandler")," \u51fd\u6570\u3002\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u9996\u5148\u8981\u505a\u7684\u662f\u5c06\u5730\u5740\u4ece ",(0,l.kt)("inlineCode",{parentName:"p"},"string")," \u8f6c\u6362\u4e3a\u516c\u94a5\u3002\u8bb0\u4f4f - \u5730\u5740\u5b9e\u9645\u4e0a\u5e76\u4e0d\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\uff0c\u5728JS\u4e2d\u6211\u4eec\u53ea\u662f\u5c06\u5176\u8868\u793a\u4e3a\u4e00\u4e2a\u5b57\u7b26\u4e32\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"const addressSubmittedHandler = (address: string) => {\n const key = new web3.PublicKey(address);\n setAddress(address)\n setBalance(1000)\n}\n")),(0,l.kt)("p",null,"\u8fd9\u5c06\u9a8c\u8bc1\u60a8\u4f20\u5165\u7684\u5185\u5bb9\u662f\u5426\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a Solana \u5730\u5740\u3002\u73b0\u5728\uff0c\u5982\u679c\u60a8\u5728\u5730\u5740\u5b57\u6bb5\u4e2d\u8f93\u5165\u7684\u5185\u5bb9\u4e0d\u662f\u4e00\u4e2a\u5bc6\u94a5\uff0c\u60a8\u5c06\u4f1a\u770b\u5230\u5e94\u7528\u7a0b\u5e8f\u5d29\u6e83\u3002\u4e0d\u9519\uff01"),(0,l.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u8981\u4f7f\u7528\u5bc6\u94a5\uff0c\u6211\u4eec\u5c06\u5efa\u7acb\u4e00\u4e2a\u65b0\u7684\u8fde\u63a5\u5230JSON RPC\u3002\u901a\u8fc7\u8fd9\u4e2a\u8fde\u63a5\uff0c\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"getBalance")," \u51fd\u6570\uff0c\u5e76\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"setBalance")," \u8bbe\u7f6e\u7ed3\u679c\uff01\u8fd9\u662f\u5b8c\u6210\u7684\u51fd\u6570\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"const addressSubmittedHandler = (address: string) => {\n const key = new web3.PublicKey(address);\n setAddress(key.toBase58())\n\n const connection = new web3.Connection(web3.clusterApiUrl('devnet'))\n\n connection.getBalance(key).then(balance => {\n setBalance(balance / web3.LAMPORTS_PER_SOL)\n })\n}\n")),(0,l.kt)("p",null,"\u8fd9\u91cc\u6709\u4e00\u4e9b\u65b0\u4e1c\u897f"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6211\u4eec\u6b63\u5728\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"key.toBase58")," \u8bbe\u7f6e\u5730\u5740\u3002\u8fd9\u662fSolana\u5730\u5740\u7684\u5b57\u7b26\u4e32\u7f16\u7801\u3002"),(0,l.kt)("li",{parentName:"ul"},"\u6211\u4eec\u6b63\u5728\u8fde\u63a5\u5230 ",(0,l.kt)("inlineCode",{parentName:"li"},"devnet")," \u7f51\u7edc\u3002\u6709\u4e09\u4e2a\u7f51\u7edc - \u4e3b\u7f51\u3001\u6d4b\u8bd5\u7f51\u548c\u5f00\u53d1\u7f51\u3002\u6211\u4eec\u5c06\u5728\u5f00\u53d1\u7f51\u4e0a\u8fdb\u884c\u6240\u6709\u64cd\u4f5c\u3002"),(0,l.kt)("li",{parentName:"ul"},"\u6211\u4eec\u6b63\u5728\u5c06\u4f59\u989d\u4eceLamports\u8f6c\u6362\u4e3aSOL - \u4f59\u989d\u4ee5Lamports\u8fd4\u56de\uff0c\u800c\u4e0d\u662fSOL\u3002")),(0,l.kt)("p",null,"\u6211\u4eec\u5b8c\u6210\u4e86\uff01\u5982\u679c\u4f60\u5728\u8fd9\u91cc\u7c98\u8d34\u4e00\u4e2a\u5730\u5740\uff0c\u4f60\u5c31\u4f1a\u770b\u5230\u4f59\u989d\u3002\u786e\u4fdd\u4f60\u7684\u8d26\u6237\u4e0a\u6709\u5f00\u53d1\u7f51\u7edc\u7684 SOL\uff01\u5982\u679c\u6ca1\u6709\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u6211\u7684\u8d26\u6237\u6765\u6d4b\u8bd5\u4f60\u7684\u5e94\u7528 - ",(0,l.kt)("inlineCode",{parentName:"p"},"B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS")," \u3002"),(0,l.kt)("p",null,"\u8fd9\u4e2a\u8fd8\u4e0d\u9519\uff0c\u4f46\u662f\u5982\u679c\u5730\u5740\u641e\u9519\u4e86\uff0c\u5c31\u4f1a\u51fa\u73b0\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u9519\u8bef\u3002\u6211\u4eec\u6765\u6dfb\u52a0\u4e00\u4e9b\u9519\u8bef\u5904\u7406\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"const addressSubmittedHandler = (address: string) => {\n try {\n setAddress(address)\n const key = new web3.PublicKey(address)\n const connection = new web3.Connection(web3.clusterApiUrl('devnet'))\n connection.getBalance(key).then(balance => {\n setBalance(balance / web3.LAMPORTS_PER_SOL)\n })\n } catch (error) {\n setAddress('')\n setBalance(0)\n alert(error)\n }\n}\n")),(0,l.kt)("p",null,"\u73b0\u5728\u4f60\u5e94\u8be5\u4f1a\u6536\u5230\u4e00\u4e2a\u63d0\u793a\u4e86 :D"),(0,l.kt)("p",null,"\u54c7\uff0c\u4f60\u521a\u521a\u53d1\u5e03\u4e86\u4f60\u7684\u7b2c\u4e00\u4e2aSolana\u5e94\u7528\u3002\u52a0\u6cb9\uff01"),(0,l.kt)("h2",{id:"-ship-\u6311\u6218"},"\ud83d\udea2 Ship \u6311\u6218"),(0,l.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u5c0f\u6311\u6218\u6765\u8003\u9a8c\u4e00\u4e0b\u4f60\u7684\u77e5\u8bc6\u3002\u4ece\u4f60\u521a\u521a\u5b8c\u6210\u7684\u5e94\u7528\u5f00\u59cb\uff0c\u5411\u7528\u6237\u754c\u9762\u6dfb\u52a0\u53e6\u4e00\u884c\u9879\u76ee\uff0c\u663e\u793a\u8f93\u5165\u7684\u5730\u5740\u662f\u5426\u4e3a\u53ef\u6267\u884c\u8d26\u6237\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(7030).Z,width:"1159",height:"635"})),(0,l.kt)("p",null,"\u8981\u786e\u5b9a\u4e00\u4e2a\u8d26\u6237\u662f\u5426\u53ef\u6267\u884c\uff0c\u60a8\u9700\u8981\uff1a"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\u4f7f\u7528\u65b9\u6cd5 ",(0,l.kt)("inlineCode",{parentName:"li"},"getAccountInfo")," \u83b7\u53d6\u5305\u542b\u8d26\u6237\u4fe1\u606f\u7684JSON\u5bf9\u8c61"),(0,l.kt)("li",{parentName:"ol"},"\u68c0\u67e5\u5176\u5c5e\u6027\u4ee5\u786e\u5b9a\u662f\u5426\u53ef\u6267\u884c"),(0,l.kt)("li",{parentName:"ol"},"\u5728 ",(0,l.kt)("inlineCode",{parentName:"li"},"useState")," \u4e2d\u6dfb\u52a0\u53e6\u4e00\u4e2a\u8c03\u7528\uff0c\u5b83\u5141\u8bb8\u60a8\u4ece\u8d26\u6237\u4fe1\u606f\u4e2d\u8bbe\u7f6e ",(0,l.kt)("inlineCode",{parentName:"li"},"executable")," \u5c5e\u6027\u503c\uff0c\u5e76\u5728\u7528\u6237\u754c\u9762\u4e2d\u663e\u793a\u5b83")),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u53ef\u7528\u4e8e\u6d4b\u8bd5\u7684\u8d26\u6237\u5730\u5740 - ",(0,l.kt)("inlineCode",{parentName:"p"},"ComputeBudget111111111111111111111111111111")," \u3002"),(0,l.kt)("p",null,"\u5728\u4f60\u81ea\u5df1\u52aa\u529b\u5c1d\u8bd5\u4e4b\u524d\uff0c\u4e0d\u8981\u770b\u7b54\u6848\uff01\u8fd9\u4e2a\u5f88\u7b80\u5355\uff01"),(0,l.kt)("p",null,"\u5b8c\u6210\u540e\uff0c\u8bf7",(0,l.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-intro-frontend/tree/challenge-solution"},"\u67e5\u770b"),"\u6b64\u5904\u7684\u6311\u6218\u89e3\u51b3\u5206\u652f\u7684\u53c2\u8003\u8d44\u6599\u3002"))}u.isMDXComponent=!0},7030:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/intro-frontend-challenge-7197c9f88c0d9a740868cc79d78eea74.png"},1201:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/intro-frontend-demo-33f88294945837b38d5c03a869c1a612.png"},9205:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/json-rpc-illustration-59d18581baf636ba674cb7cf65b7e850.png"}}]); \ No newline at end of file diff --git a/assets/js/1fc16822.abd029ea.js b/assets/js/1fc16822.abd029ea.js deleted file mode 100644 index 117c0551f..000000000 --- a/assets/js/1fc16822.abd029ea.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2828],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>k});var a=t(7294);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var i=a.createContext({}),p=function(e){var n=a.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},d=function(e){var n=p(e.components);return a.createElement(i.Provider,{value:n},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,r=e.originalType,i=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=p(t),m=l,k=c["".concat(i,".").concat(m)]||c[m]||u[m]||r;return t?a.createElement(k,o(o({ref:n},d),{},{components:t})):a.createElement(k,o({ref:n},d))}));function k(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var r=t.length,o=new Array(r);o[0]=m;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[c]="string"==typeof e?e:l,o[1]=s;for(var p=2;p{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var a=t(7462),l=(t(7294),t(3905));const r={sidebar_position:13,sidebar_label:"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e",sidebar_class_name:"green"},o="\u4ece Solana \ud83e\udd13 \u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e",s={unversionedId:"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README",id:"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README",title:"\u4ece Solana \ud83e\udd13 \u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e",description:"\u662f\u65f6\u5019\u56de\u5230\u8fc7\u53bb\u4e86\u3002\u56de\u5230\u5e7c\u513f\u56ed\u7684\u65f6\u5149\u3002\u8fd8\u8bb0\u5f97\u4f60\u5b66\u5230\u7684\u7b2c\u4e00\u4ef6\u4e8b\u662f\u4ec0\u4e48\u5417\uff1f\u5b57\u6bcd\u8868\u3002\u4e00\u65e6\u4f60\u5f81\u670d\u4e86\u5168\u90e826\u4e2a\u5b57\u6bcd\uff0c\u4f60\u5c31\u5b66\u4f1a\u4e86\u9605\u8bfb\u3002\u8fd9\u662f\u4f60\u6210\u4e3aSolana\u5f00\u53d1\u8005\u4e4b\u65c5\u7684\u8d77\u70b9\u3002\u9605\u8bfb\u82f1\u8bed\u7684\u72ec\u7279\u6280\u80fd\u4f7f\u4f60\u6210\u4e3a\u4e86\u73b0\u5728\u8fd9\u4e2a\u80fd\u591f\u5480\u56bc\u77e5\u8bc6\u7684\u8d85\u7ea7\u5927\u8111\u3002",source:"@site/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README.md",sourceDirName:"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network",slug:"/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README.md",tags:[],version:"current",sidebarPosition:13,frontMatter:{sidebar_position:13,sidebar_label:"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5ba2\u6237\u7aef\u5f00\u53d1",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/"},next:{title:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/"}},i={},p=[{value:"\ud83d\udc5c Solana\u4e0a\u7684\u8d26\u6237",id:"-solana\u4e0a\u7684\u8d26\u6237",level:2},{value:"\ud83d\udceb \u4ece\u7f51\u7edc\u4e2d\u8bfb\u53d6",id:"-\u4ece\u7f51\u7edc\u4e2d\u8bfb\u53d6",level:2},{value:"\ud83e\udd11 \u6784\u5efa\u4e00\u4e2a\u4f59\u989d\u83b7\u53d6\u5668",id:"-\u6784\u5efa\u4e00\u4e2a\u4f59\u989d\u83b7\u53d6\u5668",level:2},{value:"\ud83d\udea2 Ship \u6311\u6218",id:"-ship-\u6311\u6218",level:2}],d={toc:p},c="wrapper";function u(e){let{components:n,...r}=e;return(0,l.kt)(c,(0,a.Z)({},d,r,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"\u4ece-solana--\u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e"},"\u4ece Solana \ud83e\udd13 \u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u56de\u5230\u8fc7\u53bb\u4e86\u3002\u56de\u5230\u5e7c\u513f\u56ed\u7684\u65f6\u5149\u3002\u8fd8\u8bb0\u5f97\u4f60\u5b66\u5230\u7684\u7b2c\u4e00\u4ef6\u4e8b\u662f\u4ec0\u4e48\u5417\uff1f\u5b57\u6bcd\u8868\u3002\u4e00\u65e6\u4f60\u5f81\u670d\u4e86\u5168\u90e826\u4e2a\u5b57\u6bcd\uff0c\u4f60\u5c31\u5b66\u4f1a\u4e86\u9605\u8bfb\u3002\u8fd9\u662f\u4f60\u6210\u4e3aSolana\u5f00\u53d1\u8005\u4e4b\u65c5\u7684\u8d77\u70b9\u3002\u9605\u8bfb\u82f1\u8bed\u7684\u72ec\u7279\u6280\u80fd\u4f7f\u4f60\u6210\u4e3a\u4e86\u73b0\u5728\u8fd9\u4e2a\u80fd\u591f\u5480\u56bc\u77e5\u8bc6\u7684\u8d85\u7ea7\u5927\u8111\u3002"),(0,l.kt)("p",null,"\u65f6\u5019\u518d\u6b21\u884c\u52a8\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4f60\u7684\u5e7c\u513f\u56ed\u8001\u5e08\u5e94\u8be5\u6559\u6388\u7684\u5730\u65b9\u5f00\u59cb\u2014\u2014\u4ece\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e\u3002"),(0,l.kt)("h2",{id:"-solana\u4e0a\u7684\u8d26\u6237"},"\ud83d\udc5c Solana\u4e0a\u7684\u8d26\u6237"),(0,l.kt)("p",null,"\u4eceSolana\u5b57\u6bcd\u8868\u5f00\u59cb\uff0c\u6211\u4eec\u6709A\u4ee3\u8868\u8d26\u6237\u3002\u6211\u4eec\u4ece\u8d26\u6237\u5f00\u59cb\uff0c\u56e0\u4e3aSolana\u4e0a\u7684\u667a\u80fd\u5408\u7ea6\uff0c\u4e5f\u88ab\u79f0\u4e3a\u201c\u7a0b\u5e8f\u201d\uff0c\u662f\u65e0\u72b6\u6001\u7684\u2014\u2014\u610f\u5473\u7740\u5b83\u4eec\u9664\u4e86\u4ee3\u7801\u4e4b\u5916\u4e0d\u5b58\u50a8\u4efb\u4f55\u4e1c\u897f\u3002\u4e00\u5207\u90fd\u53d1\u751f\u5728\u8d26\u6237\u4e2d\uff0c\u6240\u4ee5\u5b83\u4eec\u5bf9Solana\u6765\u8bf4\u81f3\u5173\u91cd\u8981\uff0c\u5b83\u4eec\u7528\u4e8e\u5b58\u50a8\u3001\u5408\u7ea6\u548c\u672c\u5730\u533a\u5757\u94fe\u7a0b\u5e8f\u3002"),(0,l.kt)("p",null,"Solana \u4e0a\u6709\u4e09\u79cd\u7c7b\u578b\u7684\u8d26\u6237"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6570\u636e\u5e10\u6237 - \u8fd9\u4e9b\u5b58\u50a8\u6570\u636e, LOL"),(0,l.kt)("li",{parentName:"ul"},"\u7a0b\u5e8f\u5e10\u6237 - \u8fd9\u4e9b\u5b58\u50a8\u53ef\u6267\u884c\u7a0b\u5e8f\uff08\u53c8\u79f0\u667a\u80fd\u5408\u7ea6\uff09"),(0,l.kt)("li",{parentName:"ul"},"\u539f\u751f\u8d26\u6237 - \u8fd9\u4e9b\u7528\u4e8e\u6838\u5fc3\u533a\u5757\u94fe\u529f\u80fd\uff0c\u4f8b\u5982\u6743\u76ca\u3001\u6295\u7968")),(0,l.kt)("p",null,"\u672c\u5730\u8d26\u6237\uff08native account\uff09\u662f\u533a\u5757\u94fe\u8fd0\u884c\u6240\u9700\u7684\uff0c\u6211\u4eec\u7a0d\u540e\u4f1a\u8be6\u7ec6\u4ecb\u7ecd\u3002\u73b0\u5728\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5904\u7406\u6570\u636e\u548c\u7a0b\u5e8f\u8d26\u6237\u3002"),(0,l.kt)("p",null,"\u5728\u6570\u636e\u8d26\u6237\u4e2d\uff0c\u60a8\u8fd8\u6709\u4e24\u79cd\u8fdb\u4e00\u6b65\u7684\u7c7b\u578b"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u7cfb\u7edf\u62e5\u6709\u7684\u5e10\u6237"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"PDA"),"\uff08\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\uff09\u5e10\u6237")),(0,l.kt)("p",null,"\u6211\u4eec\u5f88\u5feb\u5c31\u4f1a\u4ecb\u7ecd\u8fd9\u4e9b\u5230\u5e95\u662f\u4ec0\u4e48\u2122\ufe0f\uff0c\u73b0\u5728\u5c31\u8ddf\u7740\u4e00\u8d77\u8d70\u5427\u3002"),(0,l.kt)("p",null,"\u6bcf\u4e2a\u8d26\u6237\u90fd\u6709\u4e00\u4e9b\u4f60\u5e94\u8be5\u4e86\u89e3\u7684\u5b57\u6bb5\uff1a"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"FIELD"),(0,l.kt)("th",{parentName:"tr",align:null},"\u63cf\u8ff0"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"lamports"),(0,l.kt)("td",{parentName:"tr",align:null},"\u8be5\u8d26\u6237\u62e5\u6709\u7684lamports\u6570\u91cf")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"owner"),(0,l.kt)("td",{parentName:"tr",align:null},"\u8fd9\u4e2a\u8d26\u6237\u7684\u6240\u6709\u8005\u7a0b\u5e8f")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"executable"),(0,l.kt)("td",{parentName:"tr",align:null},"\u8fd9\u4e2a\u8d26\u6237\u6210\u662f\u5426\u53ef\u4ee5\u5904\u7406\u6307\u4ee4")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"data"),(0,l.kt)("td",{parentName:"tr",align:null},"\u8fd9\u4e2a\u8d26\u6237\u5b58\u50a8\u7684\u6570\u636e\u7684\u5b57\u8282\u7801")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"rent_epoch"),(0,l.kt)("td",{parentName:"tr",align:null},"\u4e0b\u4e00\u4e2a\u9700\u8981\u4ed8\u79df\u91d1\u7684epoch\uff08\u4ee3\uff09")))),(0,l.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u53ea\u5173\u6ce8\u6211\u4eec\u9700\u8981\u4e86\u89e3\u7684\u4e8b\u60c5\uff0c\u6240\u4ee5\u5982\u679c\u6709\u4e9b\u4e1c\u897f\u4e0d\u592a\u660e\u767d\uff0c\u5c31\u7ee7\u7eed\u524d\u8fdb\u5427 - \u6211\u4eec\u4f1a\u8fb9\u8fdb\u884c\u4e0b\u53bb\u8fb9\u586b\u8865\u7a7a\u767d\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"Lamport"),"\u662fSolana\u7684\u6700\u5c0f\u5355\u4f4d\u3002\u5982\u679c\u4f60\u719f\u6089\u4ee5\u592a\u574a\u751f\u6001\u7cfb\u7edf\uff0c\u8fd9\u6709\u70b9\u50cfGwei\u3002\u4e00\u4e2a",(0,l.kt)("inlineCode",{parentName:"p"},"Lamport"),"\u7b49\u4e8e0.000000001 SOL\uff0c\u6240\u4ee5\u8fd9\u4e2a\u5b57\u6bb5\u544a\u8bc9\u6211\u4eec\u8d26\u6237\u62e5\u6709\u591a\u5c11SOL\u3002"),(0,l.kt)("p",null,"\u6bcf\u4e2a\u8d26\u6237\u90fd\u6709\u4e00\u4e2a\u516c\u94a5 - \u5b83\u5c31\u50cf\u8d26\u6237\u7684\u5730\u5740\u3002\u4f60\u77e5\u9053\u4f60\u7684\u94b1\u5305\u6709\u4e00\u4e2a\u5730\u5740\uff0c\u7528\u6765\u63a5\u6536\u90a3\u4e9b\u8fa3\u8fa3\u7684NFT\u5417\uff1f\u540c\u6837\u7684\u9053\u7406\uff01Solana\u5730\u5740\u53ea\u662fbase58\u7f16\u7801\u7684\u5b57\u7b26\u4e32\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"executable")," \u662f\u4e00\u4e2a\u5e03\u5c14\u5b57\u6bb5\uff0c\u544a\u8bc9\u6211\u4eec\u8be5\u5e10\u6237\u662f\u5426\u5305\u542b\u53ef\u6267\u884c\u6570\u636e\u3002\u6570\u636e\u662f\u5b58\u50a8\u5728\u5e10\u6237\u4e2d\u7684\u5185\u5bb9\uff0c\u79df\u91d1\u6211\u4eec\u7a0d\u540e\u4f1a\u652f\u4ed8\uff01"),(0,l.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u5148\u4ece\u7b80\u5355\u7684\u4e8b\u60c5\u5f00\u59cb\u5427 :)"),(0,l.kt)("h2",{id:"-\u4ece\u7f51\u7edc\u4e2d\u8bfb\u53d6"},"\ud83d\udceb \u4ece\u7f51\u7edc\u4e2d\u8bfb\u53d6"),(0,l.kt)("p",null,"\u597d\u7684\uff0c\u6211\u4eec\u77e5\u9053\u4ec0\u4e48\u662f\u8d26\u6237\uff0c\u90a3\u4e48\u6211\u4eec\u5982\u4f55\u8bfb\u53d6\u5b83\u4eec\u5462\uff1f\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u4e2a\u53eb\u505a JSON RPC \u7ec8\u7aef\u70b9\u7684\u4e1c\u897f\uff01\u770b\u770b\u8fd9\u4e2a\u56fe\u8868\uff0c\u4f60\u5c06\u626e\u6f14\u5ba2\u6237\u7aef\u7684\u89d2\u8272\uff0c\u5728 Solana \u7f51\u7edc\u4e2d\u5c1d\u8bd5\u8bfb\u53d6\u4fe1\u606f\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(9205).Z,width:"1600",height:"1035"})),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u901a\u8fc7API\u8c03\u7528JSON RPC\u6765\u83b7\u53d6\u60a8\u60f3\u8981\u7684\u5185\u5bb9\uff0c\u5b83\u4f1a\u4e0e\u7f51\u7edc\u8fdb\u884c\u901a\u4fe1\u5e76\u8fd4\u56de\u7ed9\u60a8\u6240\u9700\u7684\u6570\u636e\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u6211\u4eec\u60f3\u8981\u83b7\u53d6\u8d26\u6237\u7684\u4f59\u989d\uff0cAPI\u8c03\u7528\u5c06\u5982\u4e0b\u6240\u793a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"async function getBalanceUsingJSONRPC(address: string): Promise {\n const url = clusterApiUrl('devnet')\n console.log(url);\n return fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"getBalance\",\n \"params\": [\n address\n ]\n })\n }).then(response => response.json())\n .then(json => {\n if (json.error) {\n throw json.error\n }\n\n return json['result']['value'] as number;\n })\n .catch(error => {\n throw error\n })\n}\n")),(0,l.kt)("p",null,"\u8fd9\u91cc\u53d1\u751f\u4e86\u4e00\u5806\u4e8b\u60c5\u3002\u6211\u4eec\u6b63\u5728\u8fdb\u884c\u4e00\u4e2aPOST\u8bf7\u6c42\uff0c\u8bf7\u6c42\u4f53\u4e2d\u6709\u7279\u5b9a\u7684\u53c2\u6570\u544a\u8bc9RPC\u8981\u505a\u4ec0\u4e48\u3002\u6211\u4eec\u9700\u8981\u6307\u5b9aRPC\u7684\u7248\u672c\u3001id\u3001\u65b9\u6cd5\uff0c\u672c\u4f8b\u4e2d\u662fgetBalance\uff0c\u4ee5\u53ca\u8be5\u65b9\u6cd5\u6240\u9700\u7684\u53c2\u6570\uff0c\u672c\u4f8b\u4e2d\u53ea\u6709address\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u6709\u4e00\u5806\u9488\u5bf9\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u7684\u65b9\u6cd5\u7684\u6837\u677f\u4ee3\u7801\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528Solana\u7684",(0,l.kt)("inlineCode",{parentName:"p"},"Web3.js")," SDK\u3002\u4ee5\u4e0b\u662f\u6240\u9700\u7684\u5185\u5bb9\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"async function getBalanceUsingWeb3(address: PublicKey): Promise {\n const connection = new Connection(clusterApiUrl('devnet'));\n return connection.getBalance(address);\n}\n")),(0,l.kt)("p",null,"\u8fd9\u4e0d\u662f\u5f88\u6f02\u4eae\u5417\uff1f\u6211\u4eec\u53ea\u9700\u8981\u8fd9\u4e09\u884c\u4ee3\u7801\u5c31\u80fd\u83b7\u53d6\u5230\u67d0\u4eba\u7684Solana\u4f59\u989d\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u5982\u679c\u83b7\u53d6\u4efb\u4f55\u4eba\u7684\u94f6\u884c\u4f59\u989d\u4e5f\u662f\u8fd9\u4e48\u7b80\u5355\u7684\u8bdd\u3002"),(0,l.kt)("p",null,"\u73b0\u5728\u4f60\u77e5\u9053\u5982\u4f55\u4eceSolana\u4e0a\u7684\u8d26\u6237\u8bfb\u53d6\u6570\u636e\u4e86\uff01\u6211\u77e5\u9053\u8fd9\u53ef\u80fd\u770b\u8d77\u6765\u5fae\u4e0d\u8db3\u9053\uff0c\u4f46\u53ea\u8981\u4f7f\u7528\u8fd9\u4e2a\u51fd\u6570\uff0c\u4f60\u5c31\u53ef\u4ee5\u83b7\u53d6Solana\u4e0a\u4efb\u4f55\u8d26\u6237\u7684\u4f59\u989d\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u80fd\u591f\u83b7\u53d6\u5730\u7403\u4e0a\u4efb\u4f55\u94f6\u884c\u8d26\u6237\u7684\u4f59\u989d\uff0c\u8fd9\u5c31\u662f\u5b83\u7684\u5f3a\u5927\u4e4b\u5904"),(0,l.kt)("h2",{id:"-\u6784\u5efa\u4e00\u4e2a\u4f59\u989d\u83b7\u53d6\u5668"},"\ud83e\udd11 \u6784\u5efa\u4e00\u4e2a\u4f59\u989d\u83b7\u53d6\u5668"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u6784\u5efa\u4e00\u4e2a\u901a\u7528\u7684\u4f59\u989d\u83b7\u53d6\u5668\u4e86\uff08\u5047\u8bbe\u6574\u4e2a\u5b87\u5b99\u90fd\u5728Solana\u4e0a\uff09\u3002\u8fd9\u5c06\u662f\u4e00\u4e2a\u7b80\u5355\u4f46\u529f\u80fd\u5f3a\u5927\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u83b7\u53d6Solana\u4e0a\u4efb\u4f55\u8d26\u6237\u7684\u4f59\u989d\u3002"),(0,l.kt)("p",null,"\u5728\u4f60\u7684\u5de5\u4f5c\u533a\u57df\u521b\u5efa\u4e00\u4e2a\u6587\u4ef6\u5939\u3002\u6211\u5c06\u6211\u7684\u653e\u5728\u684c\u9762\u4e0a\u3002",(0,l.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-intro-frontend.git"},"\u514b\u9686\u8d77\u59cb\u5e93"),"\u5e76\u8fdb\u884c\u8bbe\u7f6e\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-intro-frontend.git\ncd solana-intro-frontend\ngit checkout starter\nnpm i\n")),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u7b80\u5355\u7684 Next.js \u5e94\u7528\u7a0b\u5e8f\uff0c\u56e0\u6b64\u4e00\u65e6\u5b89\u88c5\u4e86\u6240\u6709\u4f9d\u8d56\u9879\uff0c\u60a8\u5c31\u53ef\u4ee5\u5728\u7ec8\u7aef\u4e2d\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u542f\u52a8\u5b83\u3002\u60a8\u5e94\u8be5\u5728",(0,l.kt)("inlineCode",{parentName:"p"},"localhost"),"\u4e0a\u770b\u5230\u6b64\u5185\u5bb9\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(1201).Z,width:"1157",height:"516"})),(0,l.kt)("p",null,"\u6211\u4eec\u4e3a\u60a8\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7b80\u5355\u7684Next.js\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u6dfb\u52a0\u4e86\u4e00\u4e9b\u6837\u5f0f\u3002\u5982\u679c\u60a8\u5728\u5730\u5740\u680f\u4e2d\u8f93\u5165\u5185\u5bb9\u5e76\u70b9\u51fb\u201c\u68c0\u67e5SOL\u4f59\u989d\u201d\u6309\u94ae\uff0c\u60a8\u5c06\u770b\u52301,000 SOL\u7684\u4f59\u989d\u3002\u662f\u65f6\u5019\u8ba9\u5b83\u6b63\u5e38\u5de5\u4f5c\u4e86\u3002"),(0,l.kt)("p",null,"\u9996\u5148\uff0c\u4f60\u60f3\u8981\u5b89\u88c5",(0,l.kt)("inlineCode",{parentName:"p"},"Solana/web3.js"),"\u5e93\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @solana/web3.js\n")),(0,l.kt)("p",null,"\u8fd9\u5c06\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u7684\u51fd\u6570\u6765\u83b7\u53d6\u4f59\u989d\u3002\u8f6c\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"index.tsx")," \u5e76\u5c06\u5176\u5bfc\u5165\u5230\u9876\u90e8\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"import * as web3 from '@solana/web3.js'\n")),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u7740\u624b\u5904\u7406 ",(0,l.kt)("inlineCode",{parentName:"p"},"addressSubmittedHandler")," \u51fd\u6570\u3002\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u9996\u5148\u8981\u505a\u7684\u662f\u5c06\u5730\u5740\u4ece ",(0,l.kt)("inlineCode",{parentName:"p"},"string")," \u8f6c\u6362\u4e3a\u516c\u94a5\u3002\u8bb0\u4f4f - \u5730\u5740\u5b9e\u9645\u4e0a\u5e76\u4e0d\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\uff0c\u5728JS\u4e2d\u6211\u4eec\u53ea\u662f\u5c06\u5176\u8868\u793a\u4e3a\u4e00\u4e2a\u5b57\u7b26\u4e32\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"const addressSubmittedHandler = (address: string) => {\n const key = new web3.PublicKey(address);\n setAddress(address)\n setBalance(1000)\n}\n")),(0,l.kt)("p",null,"\u8fd9\u5c06\u9a8c\u8bc1\u60a8\u4f20\u5165\u7684\u5185\u5bb9\u662f\u5426\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a Solana \u5730\u5740\u3002\u73b0\u5728\uff0c\u5982\u679c\u60a8\u5728\u5730\u5740\u5b57\u6bb5\u4e2d\u8f93\u5165\u7684\u5185\u5bb9\u4e0d\u662f\u4e00\u4e2a\u5bc6\u94a5\uff0c\u60a8\u5c06\u4f1a\u770b\u5230\u5e94\u7528\u7a0b\u5e8f\u5d29\u6e83\u3002\u4e0d\u9519\uff01"),(0,l.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u8981\u4f7f\u7528\u5bc6\u94a5\uff0c\u6211\u4eec\u5c06\u5efa\u7acb\u4e00\u4e2a\u65b0\u7684\u8fde\u63a5\u5230JSON RPC\u3002\u901a\u8fc7\u8fd9\u4e2a\u8fde\u63a5\uff0c\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"getBalance")," \u51fd\u6570\uff0c\u5e76\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"setBalance")," \u8bbe\u7f6e\u7ed3\u679c\uff01\u8fd9\u662f\u5b8c\u6210\u7684\u51fd\u6570\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"const addressSubmittedHandler = (address: string) => {\n const key = new web3.PublicKey(address);\n setAddress(key.toBase58())\n\n const connection = new web3.Connection(web3.clusterApiUrl('devnet'))\n\n connection.getBalance(key).then(balance => {\n setBalance(balance / web3.LAMPORTS_PER_SOL)\n })\n}\n")),(0,l.kt)("p",null,"\u8fd9\u91cc\u6709\u4e00\u4e9b\u65b0\u4e1c\u897f"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6211\u4eec\u6b63\u5728\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"key.toBase58")," \u8bbe\u7f6e\u5730\u5740\u3002\u8fd9\u662fSolana\u5730\u5740\u7684\u5b57\u7b26\u4e32\u7f16\u7801\u3002"),(0,l.kt)("li",{parentName:"ul"},"\u6211\u4eec\u6b63\u5728\u8fde\u63a5\u5230 ",(0,l.kt)("inlineCode",{parentName:"li"},"devnet")," \u7f51\u7edc\u3002\u6709\u4e09\u4e2a\u7f51\u7edc - \u4e3b\u7f51\u3001\u6d4b\u8bd5\u7f51\u548c\u5f00\u53d1\u7f51\u3002\u6211\u4eec\u5c06\u5728\u5f00\u53d1\u7f51\u4e0a\u8fdb\u884c\u6240\u6709\u64cd\u4f5c\u3002"),(0,l.kt)("li",{parentName:"ul"},"\u6211\u4eec\u6b63\u5728\u5c06\u4f59\u989d\u4eceLamports\u8f6c\u6362\u4e3aSOL - \u4f59\u989d\u4ee5Lamports\u8fd4\u56de\uff0c\u800c\u4e0d\u662fSOL\u3002")),(0,l.kt)("p",null,"\u6211\u4eec\u5b8c\u6210\u4e86\uff01\u5982\u679c\u4f60\u5728\u8fd9\u91cc\u7c98\u8d34\u4e00\u4e2a\u5730\u5740\uff0c\u4f60\u5c31\u4f1a\u770b\u5230\u4f59\u989d\u3002\u786e\u4fdd\u4f60\u7684\u8d26\u6237\u4e0a\u6709\u5f00\u53d1\u7f51\u7edc\u7684 SOL\uff01\u5982\u679c\u6ca1\u6709\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u6211\u7684\u8d26\u6237\u6765\u6d4b\u8bd5\u4f60\u7684\u5e94\u7528 - ",(0,l.kt)("inlineCode",{parentName:"p"},"B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS")," \u3002"),(0,l.kt)("p",null,"\u8fd9\u4e2a\u8fd8\u4e0d\u9519\uff0c\u4f46\u662f\u5982\u679c\u5730\u5740\u641e\u9519\u4e86\uff0c\u5c31\u4f1a\u51fa\u73b0\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u9519\u8bef\u3002\u6211\u4eec\u6765\u6dfb\u52a0\u4e00\u4e9b\u9519\u8bef\u5904\u7406\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"const addressSubmittedHandler = (address: string) => {\n try {\n setAddress(address)\n const key = new web3.PublicKey(address)\n const connection = new web3.Connection(web3.clusterApiUrl('devnet'))\n connection.getBalance(key).then(balance => {\n setBalance(balance / web3.LAMPORTS_PER_SOL)\n })\n } catch (error) {\n setAddress('')\n setBalance(0)\n alert(error)\n }\n}\n")),(0,l.kt)("p",null,"\u73b0\u5728\u4f60\u5e94\u8be5\u4f1a\u6536\u5230\u4e00\u4e2a\u63d0\u793a\u4e86 :D"),(0,l.kt)("p",null,"\u54c7\uff0c\u4f60\u521a\u521a\u53d1\u5e03\u4e86\u4f60\u7684\u7b2c\u4e00\u4e2aSolana\u5e94\u7528\u3002\u52a0\u6cb9\uff01"),(0,l.kt)("h2",{id:"-ship-\u6311\u6218"},"\ud83d\udea2 Ship \u6311\u6218"),(0,l.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u5c0f\u6311\u6218\u6765\u8003\u9a8c\u4e00\u4e0b\u4f60\u7684\u77e5\u8bc6\u3002\u4ece\u4f60\u521a\u521a\u5b8c\u6210\u7684\u5e94\u7528\u5f00\u59cb\uff0c\u5411\u7528\u6237\u754c\u9762\u6dfb\u52a0\u53e6\u4e00\u884c\u9879\u76ee\uff0c\u663e\u793a\u8f93\u5165\u7684\u5730\u5740\u662f\u5426\u4e3a\u53ef\u6267\u884c\u8d26\u6237\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(7030).Z,width:"1159",height:"635"})),(0,l.kt)("p",null,"\u8981\u786e\u5b9a\u4e00\u4e2a\u8d26\u6237\u662f\u5426\u53ef\u6267\u884c\uff0c\u60a8\u9700\u8981\uff1a"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"\u4f7f\u7528\u65b9\u6cd5 ",(0,l.kt)("inlineCode",{parentName:"li"},"getAccountInfo")," \u83b7\u53d6\u5305\u542b\u8d26\u6237\u4fe1\u606f\u7684JSON\u5bf9\u8c61"),(0,l.kt)("li",{parentName:"ol"},"\u68c0\u67e5\u5176\u5c5e\u6027\u4ee5\u786e\u5b9a\u662f\u5426\u53ef\u6267\u884c"),(0,l.kt)("li",{parentName:"ol"},"\u5728 ",(0,l.kt)("inlineCode",{parentName:"li"},"useState")," \u4e2d\u6dfb\u52a0\u53e6\u4e00\u4e2a\u8c03\u7528\uff0c\u5b83\u5141\u8bb8\u60a8\u4ece\u8d26\u6237\u4fe1\u606f\u4e2d\u8bbe\u7f6e ",(0,l.kt)("inlineCode",{parentName:"li"},"executable")," \u5c5e\u6027\u503c\uff0c\u5e76\u5728\u7528\u6237\u754c\u9762\u4e2d\u663e\u793a\u5b83")),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u53ef\u7528\u4e8e\u6d4b\u8bd5\u7684\u8d26\u6237\u5730\u5740 - ",(0,l.kt)("inlineCode",{parentName:"p"},"ComputeBudget111111111111111111111111111111")," \u3002"),(0,l.kt)("p",null,"\u5728\u4f60\u81ea\u5df1\u52aa\u529b\u5c1d\u8bd5\u4e4b\u524d\uff0c\u4e0d\u8981\u770b\u7b54\u6848\uff01\u8fd9\u4e2a\u5f88\u7b80\u5355\uff01"),(0,l.kt)("p",null,"\u5b8c\u6210\u540e\uff0c\u8bf7",(0,l.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-intro-frontend/tree/challenge-solution"},"\u67e5\u770b"),"\u6b64\u5904\u7684\u6311\u6218\u89e3\u51b3\u5206\u652f\u7684\u53c2\u8003\u8d44\u6599\u3002"))}u.isMDXComponent=!0},7030:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/intro-frontend-challenge-7197c9f88c0d9a740868cc79d78eea74.png"},1201:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/intro-frontend-demo-33f88294945837b38d5c03a869c1a612.png"},9205:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/json-rpc-illustration-59d18581baf636ba674cb7cf65b7e850.png"}}]); \ No newline at end of file diff --git a/assets/js/253ecfa8.4f5f457c.js b/assets/js/253ecfa8.8752bca8.js similarity index 53% rename from assets/js/253ecfa8.4f5f457c.js rename to assets/js/253ecfa8.8752bca8.js index 4601c7a83..9b8704110 100644 --- a/assets/js/253ecfa8.4f5f457c.js +++ b/assets/js/253ecfa8.8752bca8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3417],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=s(n),m=a,f=p["".concat(c,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,l(l({ref:t},u),{},{components:n})):r.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={sidebar_position:54,sidebar_label:"\u539f\u751fSOLANA\u5f00\u53d1",sidebar_class_name:"green"},l="\u539f\u751fSOLANA\u5f00\u53d1",i={unversionedId:"Solana-Co-Learn/module3/native-solana-development/README",id:"Solana-Co-Learn/module3/native-solana-development/README",title:"\u539f\u751fSOLANA\u5f00\u53d1",description:"- The Rust layer cake",source:"@site/docs/Solana-Co-Learn/module3/native-solana-development/README.md",sourceDirName:"Solana-Co-Learn/module3/native-solana-development",slug:"/Solana-Co-Learn/module3/native-solana-development/",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/native-solana-development/README.md",tags:[],version:"current",sidebarPosition:54,frontMatter:{sidebar_position:54,sidebar_label:"\u539f\u751fSOLANA\u5f00\u53d1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/"},next:{title:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/"}},c={},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u539f\u751fsolana\u5f00\u53d1"},"\u539f\u751fSOLANA\u5f00\u53d1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The Rust layer cake"),(0,a.kt)("li",{parentName:"ul"},"\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528Gage\u8fdb\u884c\u72b6\u6001\u7ba1\u7406"),(0,a.kt)("li",{parentName:"ul"},"\u72b6\u6001\u7ba1\u7406")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3417],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,l(l({ref:t},u),{},{components:n})):r.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={sidebar_position:54,sidebar_label:"\u539f\u751fSOLANA\u5f00\u53d1",sidebar_class_name:"green"},l="\u539f\u751fSOLANA\u5f00\u53d1",i={unversionedId:"Solana-Co-Learn/module3/native-solana-development/README",id:"Solana-Co-Learn/module3/native-solana-development/README",title:"\u539f\u751fSOLANA\u5f00\u53d1",description:"- The Rust layer cake",source:"@site/docs/Solana-Co-Learn/module3/native-solana-development/README.md",sourceDirName:"Solana-Co-Learn/module3/native-solana-development",slug:"/Solana-Co-Learn/module3/native-solana-development/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/native-solana-development/README.md",tags:[],version:"current",sidebarPosition:54,frontMatter:{sidebar_position:54,sidebar_label:"\u539f\u751fSOLANA\u5f00\u53d1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/"},next:{title:"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/"}},s={},c=[],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u539f\u751fsolana\u5f00\u53d1"},"\u539f\u751fSOLANA\u5f00\u53d1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The Rust layer cake"),(0,a.kt)("li",{parentName:"ul"},"\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528Gage\u8fdb\u884c\u72b6\u6001\u7ba1\u7406"),(0,a.kt)("li",{parentName:"ul"},"\u72b6\u6001\u7ba1\u7406")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/28898abe.4e890585.js b/assets/js/28898abe.4e890585.js deleted file mode 100644 index 2a56065b0..000000000 --- a/assets/js/28898abe.4e890585.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2712],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),u=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=u(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=u(r),m=a,f=d["".concat(c,".").concat(m)]||d[m]||p[m]||o;return r?n.createElement(f,i(i({ref:t},s),{},{components:r})):n.createElement(f,i({ref:t},s))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(7462),a=(r(7294),r(3905));const o={sidebar_position:58,sidebar_label:"\u5b89\u5168\u548c\u9a8c\u8bc1",sidebar_class_name:"green"},i="\u5b89\u5168\u548c\u9a8c\u8bc1",l={unversionedId:"Solana-Co-Learn/module3/security-and-validation/README",id:"Solana-Co-Learn/module3/security-and-validation/README",title:"\u5b89\u5168\u548c\u9a8c\u8bc1",description:"- \u5b89\u5168\u4e0e\u4fdd\u969c",source:"@site/docs/Solana-Co-Learn/module3/security-and-validation/README.md",sourceDirName:"Solana-Co-Learn/module3/security-and-validation",slug:"/Solana-Co-Learn/module3/security-and-validation/",permalink:"/docs/Solana-Co-Learn/module3/security-and-validation/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/security-and-validation/README.md",tags:[],version:"current",sidebarPosition:58,frontMatter:{sidebar_position:58,sidebar_label:"\u5b89\u5168\u548c\u9a8c\u8bc1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/state-management/"},next:{title:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",permalink:"/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/"}},c={},u=[],s={toc:u},d="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u5b89\u5168\u548c\u9a8c\u8bc1"},"\u5b89\u5168\u548c\u9a8c\u8bc1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5b89\u5168\u4e0e\u4fdd\u969c"),(0,a.kt)("li",{parentName:"ul"},"\u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("li",{parentName:"ul"},"Secure our program")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/28898abe.5fab0569.js b/assets/js/28898abe.5fab0569.js new file mode 100644 index 000000000..87c9fc812 --- /dev/null +++ b/assets/js/28898abe.5fab0569.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2712],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,f=d["".concat(c,".").concat(m)]||d[m]||p[m]||o;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={sidebar_position:58,sidebar_label:"\u5b89\u5168\u548c\u9a8c\u8bc1",sidebar_class_name:"green"},i="\u5b89\u5168\u548c\u9a8c\u8bc1",l={unversionedId:"Solana-Co-Learn/module3/security-and-validation/README",id:"Solana-Co-Learn/module3/security-and-validation/README",title:"\u5b89\u5168\u548c\u9a8c\u8bc1",description:"- \u5b89\u5168\u4e0e\u4fdd\u969c",source:"@site/docs/Solana-Co-Learn/module3/security-and-validation/README.md",sourceDirName:"Solana-Co-Learn/module3/security-and-validation",slug:"/Solana-Co-Learn/module3/security-and-validation/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/security-and-validation/README.md",tags:[],version:"current",sidebarPosition:58,frontMatter:{sidebar_position:58,sidebar_label:"\u5b89\u5168\u548c\u9a8c\u8bc1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/state-management/"},next:{title:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/"}},c={},s=[],u={toc:s},d="wrapper";function p(e){let{components:t,...n}=e;return(0,a.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u5b89\u5168\u548c\u9a8c\u8bc1"},"\u5b89\u5168\u548c\u9a8c\u8bc1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5b89\u5168\u4e0e\u4fdd\u969c"),(0,a.kt)("li",{parentName:"ul"},"\u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("li",{parentName:"ul"},"Secure our program")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/299fc64b.a6bc006f.js b/assets/js/299fc64b.a6bc006f.js new file mode 100644 index 000000000..f9f434719 --- /dev/null +++ b/assets/js/299fc64b.a6bc006f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[821],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>f});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,f=p["".concat(s,".").concat(d)]||p[d]||u[d]||o;return t?a.createElement(f,i(i({ref:n},m),{},{components:t})):a.createElement(f,i({ref:n},m))}));function f(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:33,sidebar_label:"Ntfs & Minting with metaplex",sidebar_class_name:"green"},i="Ntfs & Minting with metaplex",l={unversionedId:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README",id:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README",title:"Ntfs & Minting with metaplex",description:"- \ud83c\udfac NFTs on Solana with Gage",source:"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README.md",sourceDirName:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex",slug:"/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README.md",tags:[],version:"current",sidebarPosition:33,frontMatter:{sidebar_position:33,sidebar_label:"Ntfs & Minting with metaplex",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/"},next:{title:"\ud83c\udfa8 NFTs on Solana",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/"}},s={},c=[],m={toc:c},p="wrapper";function u(e){let{components:n,...t}=e;return(0,r.kt)(p,(0,a.Z)({},m,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"ntfs--minting-with-metaplex"},"Ntfs & Minting with metaplex"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud83c\udfac NFTs on Solana with Gage"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/"},"NTFs on Solana")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/"},"NFT your face")),(0,r.kt)("li",{parentName:"ul"},"\ud83c\udfac Candy Machine with Gage"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/"},"Candy Machine & the Sugar CLI"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/299fc64b.ace951a4.js b/assets/js/299fc64b.ace951a4.js deleted file mode 100644 index f89fed035..000000000 --- a/assets/js/299fc64b.ace951a4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[821],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},m=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),p=c(n),d=r,f=p["".concat(s,".").concat(d)]||p[d]||u[d]||o;return n?a.createElement(f,i(i({ref:t},m),{},{components:n})):a.createElement(f,i({ref:t},m))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=n(7462),r=(n(7294),n(3905));const o={sidebar_position:33,sidebar_label:"Ntfs & Minting with metaplex",sidebar_class_name:"green"},i="Ntfs & Minting with metaplex",l={unversionedId:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README",id:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README",title:"Ntfs & Minting with metaplex",description:"- \ud83c\udfac NFTs on Solana with Gage",source:"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README.md",sourceDirName:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex",slug:"/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README.md",tags:[],version:"current",sidebarPosition:33,frontMatter:{sidebar_position:33,sidebar_label:"Ntfs & Minting with metaplex",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd",permalink:"/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/"},next:{title:"\ud83c\udfa8 NFTs on Solana",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/"}},s={},c=[],m={toc:c},p="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"ntfs--minting-with-metaplex"},"Ntfs & Minting with metaplex"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\ud83c\udfac NFTs on Solana with Gage"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/"},"NTFs on Solana")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/"},"NFT your face")),(0,r.kt)("li",{parentName:"ul"},"\ud83c\udfac Candy Machine with Gage"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/"},"Candy Machine & the Sugar CLI"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2a910045.cc9a8f37.js b/assets/js/2a910045.cc9a8f37.js deleted file mode 100644 index b41bc1d43..000000000 --- a/assets/js/2a910045.cc9a8f37.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1815],{2718:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/ibc","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2be88b23.6d57dbac.js b/assets/js/2be88b23.6d57dbac.js new file mode 100644 index 000000000..d7b21ae9e --- /dev/null +++ b/assets/js/2be88b23.6d57dbac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[249],{6329:e=>{e.exports=JSON.parse('{"permalink":"/all-in-one-solana/blog/tags/solana","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2f1581e9.8dfc367a.js b/assets/js/2f1581e9.8dfc367a.js new file mode 100644 index 000000000..42d11ec34 --- /dev/null +++ b/assets/js/2f1581e9.8dfc367a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5542],{683:e=>{e.exports=JSON.parse('{"permalink":"/all-in-one-solana/blog/tags/ibc","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/32aaa719.c5bfe6cd.js b/assets/js/32aaa719.c5bfe6cd.js deleted file mode 100644 index 058ee1cd1..000000000 --- a/assets/js/32aaa719.c5bfe6cd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4916],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>f});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(t),d=r,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||l;return t?a.createElement(f,o(o({ref:n},c),{},{components:t})):a.createElement(f,o({ref:n},c))}));function f(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,o=new Array(l);o[0]=d;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[u]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:35,sidebar_label:"\ud83e\udd28 NFT\u4f60\u7684\u8138",sidebar_class_name:"green"},o="\ud83e\udd28 NFT\u4f60\u7684\u8138",i={unversionedId:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README",id:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README",title:"\ud83e\udd28 NFT\u4f60\u7684\u8138",description:"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u9009\u62e9\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u8bbe\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u7684\u5988\u5988\u4f60\u5df2\u7ecf\u767b\u4e0a\u4e86\u533a\u5757\u94fe\u3002",source:"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README.md",sourceDirName:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face",slug:"/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README.md",tags:[],version:"current",sidebarPosition:35,frontMatter:{sidebar_position:35,sidebar_label:"\ud83e\udd28 NFT\u4f60\u7684\u8138",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa8 NFTs on Solana",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/"},next:{title:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/"}},s={},p=[{value:"\ud83e\udd2f \u66f4\u65b0\u4f60\u7684NFT",id:"-\u66f4\u65b0\u4f60\u7684nft",level:2}],c={toc:p},u="wrapper";function m(e){let{components:n,...l}=e;return(0,r.kt)(u,(0,a.Z)({},c,l,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-nft\u4f60\u7684\u8138"},"\ud83e\udd28 NFT\u4f60\u7684\u8138"),(0,r.kt)("p",null,"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u9009\u62e9\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u8bbe\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u7684\u5988\u5988\u4f60\u5df2\u7ecf\u767b\u4e0a\u4e86\u533a\u5757\u94fe\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u4e00\u4e2a\u5ba2\u6237\u5f00\u59cb"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npx create-solana-client [name] --initialize-keypair\ncd [name]\n")),(0,r.kt)("p",null,"\u8bf7\u8bf7\u5927\u62db\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @metaplex-foundation/js fs\n")),(0,r.kt)("p",null,"\u5c06\u4e24\u4e2a\u56fe\u50cf\u6dfb\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"src")," \u6587\u4ef6\u5939\u4e2d\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u5176\u4e2d\u4e00\u4e2a\u4f5c\u4e3a\u521d\u59cb\u56fe\u50cf\uff0c\u7b2c\u4e8c\u4e2a\u4f5c\u4e3a\u66f4\u65b0\u540e\u7684\u56fe\u50cf\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"src/index.ts")," \u4e2d\u9700\u8981\u7684\u5bfc\u5165\u9879\uff0c\u6ca1\u6709\u4ec0\u4e48\u65b0\u7684\u4e1c\u897f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { Connection, clusterApiUrl, PublicKey } from "@solana/web3.js"\nimport {\n Metaplex,\n keypairIdentity,\n bundlrStorage,\n toMetaplexFile,\n NftWithToken,\n} from "@metaplex-foundation/js"\nimport * as fs from "fs"\n')),(0,r.kt)("p",null,"\u5982\u679c\u6211\u4eec\u58f0\u660e\u5e38\u91cf\uff0c\u90a3\u4e48\u5728\u521b\u5efa\u548c\u66f4\u65b0NFT\u4e4b\u95f4\u66f4\u6539\u53d8\u91cf\u4f1a\u66f4\u5bb9\u6613"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const tokenName = "Token Name"\nconst description = "Description"\nconst symbol = "SYMBOL"\nconst sellerFeeBasisPoints = 100\nconst imageFile = "test.png"\n\nasync function main() {\n ...\n}\n')),(0,r.kt)("p",null,"\u6211\u4eec\u4e0d\u4f1a\u521b\u5efa\u4e00\u4e2a\u8f85\u52a9\u51fd\u6570\uff0c\u800c\u662f\u53ef\u4ee5\u5c06\u6240\u6709\u5185\u5bb9\u653e\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"main()")," \u4e2d\u3002\u6211\u4eec\u5c06\u9996\u5148\u521b\u5efa\u4e00\u4e2a Metaplex \u5b9e\u4f8b\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n ...\n\n const metaplex = Metaplex.make(connection)\n .use(keypairIdentity(user))\n .use(\n bundlrStorage({\n address: "https://devnet.bundlr.network",\n providerUrl: "https://api.devnet.solana.com",\n timeout: 60000,\n })\n )\n}\n')),(0,r.kt)("p",null,"\u4e0a\u4f20\u56fe\u7247\uff0c\u6211\u4eec\u9700\u8981\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u8bfb\u53d6\u56fe\u50cf\u6587\u4ef6"),(0,r.kt)("li",{parentName:"ul"},"\u8f6c\u6362\u4e3aMetaplex\u6587\u4ef6"),(0,r.kt)("li",{parentName:"ul"},"\u4e0a\u4f20\u56fe\u7247")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n ...\n\n // file to buffer\n const buffer = fs.readFileSync("src/" + imageFile)\n\n // buffer to metaplex file\n const file = toMetaplexFile(buffer, imageFile)\n\n // upload image and get image uri\n const imageUri = await metaplex.storage().upload(file)\n console.log("image uri:", imageUri)\n}\n')),(0,r.kt)("p",null,"\u6700\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u6211\u4eec\u5f97\u5230\u7684\u56fe\u50cfURI\u4e0a\u4f20\u5143\u6570\u636e"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n ...\n\n // upload metadata and get metadata uri (off chain metadata)\n const { uri } = await metaplex\n .nfts()\n .uploadMetadata({\n name: tokenName,\n description: description,\n image: imageUri,\n })\n\n console.log("metadata uri:", uri)\n}\n')),(0,r.kt)("p",null,"\u5728\u8fd9\u91cc\uff0c\u4e00\u4e2a\u4e13\u95e8\u7684\u94f8\u5e01NFT\u529f\u80fd\u662f\u4e00\u4e2a\u597d\u4e3b\u610f\uff0c\u5c06\u5176\u653e\u5728\u4e3b\u8981\u529f\u80fd\u4e4b\u5916"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// create NFT\nasync function createNft(\n metaplex: Metaplex,\n uri: string\n): Promise {\n const { nft } = await metaplex\n .nfts()\n .create({\n uri: uri,\n name: tokenName,\n sellerFeeBasisPoints: sellerFeeBasisPoints,\n symbol: symbol,\n })\n\n console.log(\n `Token Mint: https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`\n )\n\n return nft\n}\n")),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u53ea\u9700\u8981\u5728\u4f60\u7684\u51fd\u6570\u672b\u5c3e\u8c03\u7528\u5b83\u5373\u53ef\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function main() {\n ...\n\n await createNft(metaplex, uri)\n}\n")),(0,r.kt)("p",null,"\u6211\u4eec\u51c6\u5907\u597d\u94f8\u9020\u6211\u4eec\u7684NFT\u4e86\uff01\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\u811a\u672c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run start")," \uff0c\u5e76\u70b9\u51fbSolana Explorer\u7684URL\uff0c\u4f60\u5e94\u8be5\u4f1a\u770b\u5230\u7c7b\u4f3c\u8fd9\u6837\u7684\u5185\u5bb9\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(3697).Z,width:"516",height:"236"})),(0,r.kt)("p",null,"\u6211\u4eec\u521a\u5728Solana\u4e0a\u5236\u4f5c\u4e86\u4e00\u4e2aNFT\ud83c\udf89\ud83c\udf89\ud83c\udf89\u3002\u8fd9\u5c31\u50cf\u70ed\u4e00\u70ed\u73b0\u6210\u7684\u996d\u83dc\u4e00\u6837\u7b80\u5355\u3002"),(0,r.kt)("h2",{id:"-\u66f4\u65b0\u4f60\u7684nft"},"\ud83e\udd2f \u66f4\u65b0\u4f60\u7684NFT"),(0,r.kt)("p",null,"\u603b\u7ed3\u4e00\u4e0b\uff0c\u8ba9\u6211\u4eec\u5feb\u901f\u770b\u4e00\u4e0b\u5982\u4f55\u66f4\u65b0\u521a\u521a\u94f8\u9020\u7684NFT\u3002"),(0,r.kt)("p",null,"\u5728\u4f60\u7684\u811a\u672c\u9876\u90e8\uff0c\u5c06 imageFile \u5e38\u91cf\u66f4\u65b0\u4e3a\u4f60\u7684NFT\u6700\u7ec8\u56fe\u50cf\u7684\u540d\u79f0\u3002"),(0,r.kt)("p",null,"\u552f\u4e00\u6539\u53d8\u7684\u662f\u6211\u4eec\u79f0\u4e4b\u4e3aMetaplex\u7684\u65b9\u6cd5\u3002\u5c06\u5176\u6dfb\u52a0\u5230main\u4e4b\u5916\u7684\u4efb\u4f55\u4f4d\u7f6e\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function updateNft(\n metaplex: Metaplex,\n uri: string,\n mintAddress: PublicKey\n) {\n // get "NftWithToken" type from mint address\n const nft = await metaplex.nfts().findByMint({ mintAddress })\n\n // omit any fields to keep unchanged\n await metaplex\n .nfts()\n .update({\n nftOrSft: nft,\n name: tokenName,\n symbol: symbol,\n uri: uri,\n sellerFeeBasisPoints: sellerFeeBasisPoints,\n })\n\n console.log(\n `Token Mint: https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`\n )\n}\n')),(0,r.kt)("p",null,"\u73b0\u5728\u5728\u4e3b\u51fd\u6570\u4e2d\uff0c\u4f60\u53ef\u4ee5\u6ce8\u91ca\u6389 ",(0,r.kt)("inlineCode",{parentName:"p"},"createNFT")," \u7684\u8c03\u7528\uff0c\u5e76\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"updateNFT")," \u8f85\u52a9\u51fd\u6570\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n\n ...\n\n // await createNft(metaplex, uri)\n\n // You can get this from the Solana Explorer URL\n const mintAddress = new PublicKey("EPd324PkQx53Cx2g2B9ZfxVmu6m6gyneMaoWTy2hk2bW")\n await updateNft(metaplex, uri, mintAddress)\n}\n')),(0,r.kt)("p",null,'\u60a8\u53ef\u4ee5\u4ece\u5728\u94f8\u9020NFT\u65f6\u8bb0\u5f55\u7684URL\u4e2d\u83b7\u53d6\u8584\u8377\u5730\u5740\u3002\u5b83\u51fa\u73b0\u5728\u591a\u4e2a\u4f4d\u7f6e - URL\u672c\u8eab\u3001"\u5730\u5740"\u5c5e\u6027\u548c\u5143\u6570\u636e\u9009\u9879\u5361\u4e2d\u3002'),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(8537).Z,width:"549",height:"225"})))}m.isMDXComponent=!0},3697:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/cloud-nft-1adf72d4bfd5bdafd7475cb4a941f64d.png"},8537:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/river-nft-6d397d00e15f250de4842e99ac8e8fdb.png"}}]); \ No newline at end of file diff --git a/assets/js/32aaa719.fa972b9c.js b/assets/js/32aaa719.fa972b9c.js new file mode 100644 index 000000000..420d92a67 --- /dev/null +++ b/assets/js/32aaa719.fa972b9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4916],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>f});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(t),d=r,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||l;return t?a.createElement(f,o(o({ref:n},c),{},{components:t})):a.createElement(f,o({ref:n},c))}));function f(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,o=new Array(l);o[0]=d;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[u]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:35,sidebar_label:"\ud83e\udd28 NFT\u4f60\u7684\u8138",sidebar_class_name:"green"},o="\ud83e\udd28 NFT\u4f60\u7684\u8138",i={unversionedId:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README",id:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README",title:"\ud83e\udd28 NFT\u4f60\u7684\u8138",description:"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u9009\u62e9\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u8bbe\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u7684\u5988\u5988\u4f60\u5df2\u7ecf\u767b\u4e0a\u4e86\u533a\u5757\u94fe\u3002",source:"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README.md",sourceDirName:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face",slug:"/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README.md",tags:[],version:"current",sidebarPosition:35,frontMatter:{sidebar_position:35,sidebar_label:"\ud83e\udd28 NFT\u4f60\u7684\u8138",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa8 NFTs on Solana",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/"},next:{title:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/"}},s={},p=[{value:"\ud83e\udd2f \u66f4\u65b0\u4f60\u7684NFT",id:"-\u66f4\u65b0\u4f60\u7684nft",level:2}],c={toc:p},u="wrapper";function m(e){let{components:n,...l}=e;return(0,r.kt)(u,(0,a.Z)({},c,l,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-nft\u4f60\u7684\u8138"},"\ud83e\udd28 NFT\u4f60\u7684\u8138"),(0,r.kt)("p",null,"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u9009\u62e9\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u8bbe\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u7684\u5988\u5988\u4f60\u5df2\u7ecf\u767b\u4e0a\u4e86\u533a\u5757\u94fe\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u4e00\u4e2a\u5ba2\u6237\u5f00\u59cb"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npx create-solana-client [name] --initialize-keypair\ncd [name]\n")),(0,r.kt)("p",null,"\u8bf7\u8bf7\u5927\u62db\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @metaplex-foundation/js fs\n")),(0,r.kt)("p",null,"\u5c06\u4e24\u4e2a\u56fe\u50cf\u6dfb\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"src")," \u6587\u4ef6\u5939\u4e2d\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u5176\u4e2d\u4e00\u4e2a\u4f5c\u4e3a\u521d\u59cb\u56fe\u50cf\uff0c\u7b2c\u4e8c\u4e2a\u4f5c\u4e3a\u66f4\u65b0\u540e\u7684\u56fe\u50cf\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"src/index.ts")," \u4e2d\u9700\u8981\u7684\u5bfc\u5165\u9879\uff0c\u6ca1\u6709\u4ec0\u4e48\u65b0\u7684\u4e1c\u897f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { Connection, clusterApiUrl, PublicKey } from "@solana/web3.js"\nimport {\n Metaplex,\n keypairIdentity,\n bundlrStorage,\n toMetaplexFile,\n NftWithToken,\n} from "@metaplex-foundation/js"\nimport * as fs from "fs"\n')),(0,r.kt)("p",null,"\u5982\u679c\u6211\u4eec\u58f0\u660e\u5e38\u91cf\uff0c\u90a3\u4e48\u5728\u521b\u5efa\u548c\u66f4\u65b0NFT\u4e4b\u95f4\u66f4\u6539\u53d8\u91cf\u4f1a\u66f4\u5bb9\u6613"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const tokenName = "Token Name"\nconst description = "Description"\nconst symbol = "SYMBOL"\nconst sellerFeeBasisPoints = 100\nconst imageFile = "test.png"\n\nasync function main() {\n ...\n}\n')),(0,r.kt)("p",null,"\u6211\u4eec\u4e0d\u4f1a\u521b\u5efa\u4e00\u4e2a\u8f85\u52a9\u51fd\u6570\uff0c\u800c\u662f\u53ef\u4ee5\u5c06\u6240\u6709\u5185\u5bb9\u653e\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"main()")," \u4e2d\u3002\u6211\u4eec\u5c06\u9996\u5148\u521b\u5efa\u4e00\u4e2a Metaplex \u5b9e\u4f8b\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n ...\n\n const metaplex = Metaplex.make(connection)\n .use(keypairIdentity(user))\n .use(\n bundlrStorage({\n address: "https://devnet.bundlr.network",\n providerUrl: "https://api.devnet.solana.com",\n timeout: 60000,\n })\n )\n}\n')),(0,r.kt)("p",null,"\u4e0a\u4f20\u56fe\u7247\uff0c\u6211\u4eec\u9700\u8981\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u8bfb\u53d6\u56fe\u50cf\u6587\u4ef6"),(0,r.kt)("li",{parentName:"ul"},"\u8f6c\u6362\u4e3aMetaplex\u6587\u4ef6"),(0,r.kt)("li",{parentName:"ul"},"\u4e0a\u4f20\u56fe\u7247")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n ...\n\n // file to buffer\n const buffer = fs.readFileSync("src/" + imageFile)\n\n // buffer to metaplex file\n const file = toMetaplexFile(buffer, imageFile)\n\n // upload image and get image uri\n const imageUri = await metaplex.storage().upload(file)\n console.log("image uri:", imageUri)\n}\n')),(0,r.kt)("p",null,"\u6700\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u6211\u4eec\u5f97\u5230\u7684\u56fe\u50cfURI\u4e0a\u4f20\u5143\u6570\u636e"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n ...\n\n // upload metadata and get metadata uri (off chain metadata)\n const { uri } = await metaplex\n .nfts()\n .uploadMetadata({\n name: tokenName,\n description: description,\n image: imageUri,\n })\n\n console.log("metadata uri:", uri)\n}\n')),(0,r.kt)("p",null,"\u5728\u8fd9\u91cc\uff0c\u4e00\u4e2a\u4e13\u95e8\u7684\u94f8\u5e01NFT\u529f\u80fd\u662f\u4e00\u4e2a\u597d\u4e3b\u610f\uff0c\u5c06\u5176\u653e\u5728\u4e3b\u8981\u529f\u80fd\u4e4b\u5916"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// create NFT\nasync function createNft(\n metaplex: Metaplex,\n uri: string\n): Promise {\n const { nft } = await metaplex\n .nfts()\n .create({\n uri: uri,\n name: tokenName,\n sellerFeeBasisPoints: sellerFeeBasisPoints,\n symbol: symbol,\n })\n\n console.log(\n `Token Mint: https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`\n )\n\n return nft\n}\n")),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u53ea\u9700\u8981\u5728\u4f60\u7684\u51fd\u6570\u672b\u5c3e\u8c03\u7528\u5b83\u5373\u53ef\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function main() {\n ...\n\n await createNft(metaplex, uri)\n}\n")),(0,r.kt)("p",null,"\u6211\u4eec\u51c6\u5907\u597d\u94f8\u9020\u6211\u4eec\u7684NFT\u4e86\uff01\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\u811a\u672c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run start")," \uff0c\u5e76\u70b9\u51fbSolana Explorer\u7684URL\uff0c\u4f60\u5e94\u8be5\u4f1a\u770b\u5230\u7c7b\u4f3c\u8fd9\u6837\u7684\u5185\u5bb9\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(3697).Z,width:"516",height:"236"})),(0,r.kt)("p",null,"\u6211\u4eec\u521a\u5728Solana\u4e0a\u5236\u4f5c\u4e86\u4e00\u4e2aNFT\ud83c\udf89\ud83c\udf89\ud83c\udf89\u3002\u8fd9\u5c31\u50cf\u70ed\u4e00\u70ed\u73b0\u6210\u7684\u996d\u83dc\u4e00\u6837\u7b80\u5355\u3002"),(0,r.kt)("h2",{id:"-\u66f4\u65b0\u4f60\u7684nft"},"\ud83e\udd2f \u66f4\u65b0\u4f60\u7684NFT"),(0,r.kt)("p",null,"\u603b\u7ed3\u4e00\u4e0b\uff0c\u8ba9\u6211\u4eec\u5feb\u901f\u770b\u4e00\u4e0b\u5982\u4f55\u66f4\u65b0\u521a\u521a\u94f8\u9020\u7684NFT\u3002"),(0,r.kt)("p",null,"\u5728\u4f60\u7684\u811a\u672c\u9876\u90e8\uff0c\u5c06 imageFile \u5e38\u91cf\u66f4\u65b0\u4e3a\u4f60\u7684NFT\u6700\u7ec8\u56fe\u50cf\u7684\u540d\u79f0\u3002"),(0,r.kt)("p",null,"\u552f\u4e00\u6539\u53d8\u7684\u662f\u6211\u4eec\u79f0\u4e4b\u4e3aMetaplex\u7684\u65b9\u6cd5\u3002\u5c06\u5176\u6dfb\u52a0\u5230main\u4e4b\u5916\u7684\u4efb\u4f55\u4f4d\u7f6e\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function updateNft(\n metaplex: Metaplex,\n uri: string,\n mintAddress: PublicKey\n) {\n // get "NftWithToken" type from mint address\n const nft = await metaplex.nfts().findByMint({ mintAddress })\n\n // omit any fields to keep unchanged\n await metaplex\n .nfts()\n .update({\n nftOrSft: nft,\n name: tokenName,\n symbol: symbol,\n uri: uri,\n sellerFeeBasisPoints: sellerFeeBasisPoints,\n })\n\n console.log(\n `Token Mint: https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`\n )\n}\n')),(0,r.kt)("p",null,"\u73b0\u5728\u5728\u4e3b\u51fd\u6570\u4e2d\uff0c\u4f60\u53ef\u4ee5\u6ce8\u91ca\u6389 ",(0,r.kt)("inlineCode",{parentName:"p"},"createNFT")," \u7684\u8c03\u7528\uff0c\u5e76\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"updateNFT")," \u8f85\u52a9\u51fd\u6570\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n\n ...\n\n // await createNft(metaplex, uri)\n\n // You can get this from the Solana Explorer URL\n const mintAddress = new PublicKey("EPd324PkQx53Cx2g2B9ZfxVmu6m6gyneMaoWTy2hk2bW")\n await updateNft(metaplex, uri, mintAddress)\n}\n')),(0,r.kt)("p",null,'\u60a8\u53ef\u4ee5\u4ece\u5728\u94f8\u9020NFT\u65f6\u8bb0\u5f55\u7684URL\u4e2d\u83b7\u53d6\u8584\u8377\u5730\u5740\u3002\u5b83\u51fa\u73b0\u5728\u591a\u4e2a\u4f4d\u7f6e - URL\u672c\u8eab\u3001"\u5730\u5740"\u5c5e\u6027\u548c\u5143\u6570\u636e\u9009\u9879\u5361\u4e2d\u3002'),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(8537).Z,width:"549",height:"225"})))}m.isMDXComponent=!0},3697:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/cloud-nft-1adf72d4bfd5bdafd7475cb4a941f64d.png"},8537:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/river-nft-6d397d00e15f250de4842e99ac8e8fdb.png"}}]); \ No newline at end of file diff --git a/assets/js/3853220b.73cb102b.js b/assets/js/3853220b.73cb102b.js new file mode 100644 index 000000000..e58ead28d --- /dev/null +++ b/assets/js/3853220b.73cb102b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2664],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>m});var a=t(7294);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function s(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=a.createContext({}),p=function(e){var n=a.useContext(o),t=n;return e&&(t="function"==typeof e?e(n):s(s({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(o.Provider,{value:n},e.children)},f="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),f=p(t),u=l,m=f["".concat(o,".").concat(u)]||f[u]||d[u]||r;return t?a.createElement(m,s(s({ref:n},c),{},{components:t})):a.createElement(m,s({ref:n},c))}));function m(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=u;var i={};for(var o in n)hasOwnProperty.call(n,o)&&(i[o]=n[o]);i.originalType=e,i[f]="string"==typeof e?e:l,s[1]=i;for(var p=2;p{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var a=t(7462),l=(t(7294),t(3905));const r={sidebar_position:38,sidebar_label:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",sidebar_class_name:"green"},s="\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",i={unversionedId:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README",id:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README",title:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u600e\u4e48\u56de\u4e8b\u3002\u6a21\u677f\u65f6\u95f4\u3002\u7136\u800c\uff0c\u968f\u7740\u6211\u4eec\u6784\u5efa\u7684\u4e1c\u897f\u53d8\u5f97\u66f4\u597d\uff0c\u6211\u4eec\u7684\u6a21\u677f\u4e5f\u4f1a\u53d8\u5f97\u66f4\u597d\u3002\u8fd9\u6b21\u6211\u4eec\u5c06\u5728Solana dApp\u811a\u624b\u67b6\u7684\u57fa\u7840\u4e0a\u6784\u5efa\u4e00\u4e2a\u6a21\u677f\u3002\u548c\u4e4b\u524d\u7684\u6a21\u677f\u4e00\u6837\uff0c\u5b83\u662f\u4e00\u4e2a\u4f7f\u7528 create-next-app \u5236\u4f5c\u7684Next.js\u5e94\u7528\u7a0b\u5e8f\u3002\u4e0d\u540c\u7684\u662f\uff0c\u5b83\u6709\u66f4\u591a\u7684\u529f\u80fd\u3002\u4e0d\u7528\u62c5\u5fc3\uff01\u6211\u4eec\u4ecd\u7136\u4f1a\u4f7f\u7528\u76f8\u540c\u7684\u4e1c\u897f\u3002",source:"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README.md",sourceDirName:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet",slug:"/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README.md",tags:[],version:"current",sidebarPosition:38,frontMatter:{sidebar_position:38,sidebar_label:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5c55\u793aNFTs \ud83d\udc83",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/"},next:{title:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/"}},o={},p=[],c={toc:p},f="wrapper";function d(e){let{components:n,...r}=e;return(0,l.kt)(f,(0,a.Z)({},c,r,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u5728\u94b1\u5305\u4e2d\u5c55\u793anfts"},"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs"),(0,l.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u600e\u4e48\u56de\u4e8b\u3002\u6a21\u677f\u65f6\u95f4\u3002\u7136\u800c\uff0c\u968f\u7740\u6211\u4eec\u6784\u5efa\u7684\u4e1c\u897f\u53d8\u5f97\u66f4\u597d\uff0c\u6211\u4eec\u7684\u6a21\u677f\u4e5f\u4f1a\u53d8\u5f97\u66f4\u597d\u3002\u8fd9\u6b21\u6211\u4eec\u5c06\u5728",(0,l.kt)("a",{parentName:"p",href:"https://github.com/solana-labs/dapp-scaffold"},"Solana dApp\u811a\u624b\u67b6"),"\u7684\u57fa\u7840\u4e0a\u6784\u5efa\u4e00\u4e2a\u6a21\u677f\u3002\u548c\u4e4b\u524d\u7684\u6a21\u677f\u4e00\u6837\uff0c\u5b83\u662f\u4e00\u4e2a\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"create-next-app")," \u5236\u4f5c\u7684Next.js\u5e94\u7528\u7a0b\u5e8f\u3002\u4e0d\u540c\u7684\u662f\uff0c\u5b83\u6709\u66f4\u591a\u7684\u529f\u80fd\u3002\u4e0d\u7528\u62c5\u5fc3\uff01\u6211\u4eec\u4ecd\u7136\u4f1a\u4f7f\u7528\u76f8\u540c\u7684\u4e1c\u897f\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/buildspace/solana-display-nfts-frontend\ncd solana-display-nfts-frontend\ngit checkout starter\nnpm install @metaplex-foundation/js@latest\nnpm i\nnpm run dev\n")),(0,l.kt)("p",null,"\u4f60\u5e94\u8be5\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u4e0a\u770b\u5230\u8fd9\u4e2a:"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(9757).Z,width:"1483",height:"911"})),(0,l.kt)("p",null,"\u201c\u663e\u793aNFT\u201d\u9875\u9762\u76ee\u524d\u8fd8\u6ca1\u6709\u663e\u793a\u4efb\u4f55\u5185\u5bb9 - \u8fd9\u5c31\u662f\u4f60\u7684\u4efb\u52a1\u6240\u5728\u3002"),(0,l.kt)("p",null,"\u6253\u5f00 ",(0,l.kt)("inlineCode",{parentName:"p"},"src/components/FetchNFT.tsx")," \uff0c\u6211\u4eec\u5f00\u59cb\u5427\u3002\u6211\u4eec\u5c06\u4ece\u7ec4\u4ef6\u9876\u90e8\u7684Metaplex\u8bbe\u7f6e\u5f00\u59cb\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-tsx"},"export const FetchNft: FC = () => {\n const [nftData, setNftData] = useState(null)\n\n const { connection } = useConnection()\n const wallet = useWallet()\n const metaplex = Metaplex.make(connection).use(walletAdapterIdentity(wallet))\n\n const fetchNfts = async () => {}\n\n return
\n}\n")),(0,l.kt)("p",null,"\u770b\u8d77\u6765\u5f88\u719f\u6089\u3002"),(0,l.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u6765\u586b\u5199 ",(0,l.kt)("inlineCode",{parentName:"p"},"fetchNfts")," \u51fd\u6570\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u4e4b\u524d\u770b\u5230\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"findAllByOwner")," \u65b9\u6cd5\u3002\u6211\u4eec\u8fd8\u9700\u8981\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"useWallet")," \u94a9\u5b50\u6765\u83b7\u53d6\u94b1\u5305\u5730\u5740\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-tsx"},"const fetchNfts = async () => {\n if (!wallet.connected) {\n return\n }\n\n // fetch NFTs for connected wallet\n const nfts = await metaplex\n .nfts()\n .findAllByOwner({ owner: wallet.publicKey })\n\n // fetch off chain metadata for each NFT\n let nftData = []\n for (let i = 0; i < nfts.length; i++) {\n let fetchResult = await fetch(nfts[i].uri)\n let json = await fetchResult.json()\n nftData.push(json)\n }\n\n // set state\n setNftData(nftData)\n }\n")),(0,l.kt)("p",null,"\u6211\u4eec\u60f3\u8981\u5728\u94b1\u5305\u66f4\u6539\u65f6\u66f4\u65b0\u663e\u793a\u7684NFTs\uff0c\u6240\u4ee5\u6211\u4eec\u5c06\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"useEffect")," \u51fd\u6570\u4e0b\u65b9\u6dfb\u52a0\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"fetchNfts")," \u94a9\u5b50\u6765\u8c03\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"fetchNfts")," \u51fd\u6570\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-tsx"},"export const FetchNft: FC = () => {\n ...\n\n const fetchNfts = async () => {\n ...\n }\n\n // fetch nfts when connected wallet changes\n useEffect(() => {\n fetchNfts()\n }, [wallet])\n\n return
\n}\n")),(0,l.kt)("p",null,"\u6700\u540e\uff0c\u6211\u4eec\u9700\u8981\u66f4\u65b0 ",(0,l.kt)("inlineCode",{parentName:"p"},"return")," \u8bed\u53e5\u4ee5\u663e\u793aNFTs\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u4e4b\u524d\u521b\u5efa\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"nftData")," \u72b6\u6001\u53d8\u91cf\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-tsx"},"return (\n
\n {nftData && (\n
\n {nftData.map((nft) => (\n
\n
    {nft.name}
\n \n
\n ))}\n
\n )}\n
\n )\n")),(0,l.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u7684NFT\u4e86\uff01\ud83c\udf89 \u8fd9\u662f\u6211\u7684\u94b1\u5305\u957f\u4ec0\u4e48\u6837\u5b50 \ud83d\ude06"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(8675).Z,width:"1259",height:"696"})),(0,l.kt)("p",null,"\u56de\u5230\u8fc7\u53bb\u7684\u65e5\u5b50\uff08\u5927\u7ea6\u57282021\u5e7410\u6708\uff09\uff0c\u6211\u4e0d\u5f97\u4e0d\u624b\u52a8\u5b8c\u6210\u6240\u6709\u8fd9\u4e9b\u5de5\u4f5c\uff0c\u800c\u4e14\u6211\u4e00\u76f4\u53d7\u5230RPC\u7684\u901f\u7387\u9650\u5236\uff0c\u6240\u4ee5\u8bf7\u82b1\u70b9\u65f6\u95f4\u611f\u6fc0Metaplex\u5f00\u53d1\u4eba\u5458\u4e3a\u6211\u4eec\u5e26\u6765\u8fd9\u4e2a\u7cbe\u5f69\u7684SDK\uff01"),(0,l.kt)("p",null,"\u5728",(0,l.kt)("inlineCode",{parentName:"p"},"nftData"),"\u8fd9\u91cc\u73a9\u4e00\u4e0b\u3002\u5c06\u5176\u8bb0\u5f55\u5230\u63a7\u5236\u53f0\u5e76\u5c1d\u8bd5\u663e\u793a\u5176\u4ed6\u503c\uff0c\u5982\u7b26\u53f7\u6216\u63cf\u8ff0\uff01\u4e5f\u8bb8\u6dfb\u52a0\u4e00\u4e2a\u8fc7\u6ee4\u5668\uff0c\u4ee5\u4fbf\u7528\u6237\u53ea\u80fd\u663e\u793a\u7279\u5b9a\u6536\u85cf\u7684NFT\uff1f"))}d.isMDXComponent=!0},9757:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/display-from-wallet-ab771e880d8a89ce190fc9d6c1bc8987.png"},8675:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/nfts-wallet-9b0d4678ead1e83ec711cd59e17325e0.png"}}]); \ No newline at end of file diff --git a/assets/js/3853220b.e7ee4835.js b/assets/js/3853220b.e7ee4835.js deleted file mode 100644 index e826470fd..000000000 --- a/assets/js/3853220b.e7ee4835.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2664],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>m});var a=t(7294);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function s(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var o=a.createContext({}),p=function(e){var n=a.useContext(o),t=n;return e&&(t="function"==typeof e?e(n):s(s({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(o.Provider,{value:n},e.children)},f="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),f=p(t),u=l,m=f["".concat(o,".").concat(u)]||f[u]||d[u]||r;return t?a.createElement(m,s(s({ref:n},c),{},{components:t})):a.createElement(m,s({ref:n},c))}));function m(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var r=t.length,s=new Array(r);s[0]=u;var i={};for(var o in n)hasOwnProperty.call(n,o)&&(i[o]=n[o]);i.originalType=e,i[f]="string"==typeof e?e:l,s[1]=i;for(var p=2;p{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var a=t(7462),l=(t(7294),t(3905));const r={sidebar_position:38,sidebar_label:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",sidebar_class_name:"green"},s="\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",i={unversionedId:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README",id:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README",title:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u600e\u4e48\u56de\u4e8b\u3002\u6a21\u677f\u65f6\u95f4\u3002\u7136\u800c\uff0c\u968f\u7740\u6211\u4eec\u6784\u5efa\u7684\u4e1c\u897f\u53d8\u5f97\u66f4\u597d\uff0c\u6211\u4eec\u7684\u6a21\u677f\u4e5f\u4f1a\u53d8\u5f97\u66f4\u597d\u3002\u8fd9\u6b21\u6211\u4eec\u5c06\u5728Solana dApp\u811a\u624b\u67b6\u7684\u57fa\u7840\u4e0a\u6784\u5efa\u4e00\u4e2a\u6a21\u677f\u3002\u548c\u4e4b\u524d\u7684\u6a21\u677f\u4e00\u6837\uff0c\u5b83\u662f\u4e00\u4e2a\u4f7f\u7528 create-next-app \u5236\u4f5c\u7684Next.js\u5e94\u7528\u7a0b\u5e8f\u3002\u4e0d\u540c\u7684\u662f\uff0c\u5b83\u6709\u66f4\u591a\u7684\u529f\u80fd\u3002\u4e0d\u7528\u62c5\u5fc3\uff01\u6211\u4eec\u4ecd\u7136\u4f1a\u4f7f\u7528\u76f8\u540c\u7684\u4e1c\u897f\u3002",source:"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README.md",sourceDirName:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet",slug:"/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README.md",tags:[],version:"current",sidebarPosition:38,frontMatter:{sidebar_position:38,sidebar_label:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5c55\u793aNFTs \ud83d\udc83",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/"},next:{title:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/"}},o={},p=[],c={toc:p},f="wrapper";function d(e){let{components:n,...r}=e;return(0,l.kt)(f,(0,a.Z)({},c,r,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u5728\u94b1\u5305\u4e2d\u5c55\u793anfts"},"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs"),(0,l.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u600e\u4e48\u56de\u4e8b\u3002\u6a21\u677f\u65f6\u95f4\u3002\u7136\u800c\uff0c\u968f\u7740\u6211\u4eec\u6784\u5efa\u7684\u4e1c\u897f\u53d8\u5f97\u66f4\u597d\uff0c\u6211\u4eec\u7684\u6a21\u677f\u4e5f\u4f1a\u53d8\u5f97\u66f4\u597d\u3002\u8fd9\u6b21\u6211\u4eec\u5c06\u5728",(0,l.kt)("a",{parentName:"p",href:"https://github.com/solana-labs/dapp-scaffold"},"Solana dApp\u811a\u624b\u67b6"),"\u7684\u57fa\u7840\u4e0a\u6784\u5efa\u4e00\u4e2a\u6a21\u677f\u3002\u548c\u4e4b\u524d\u7684\u6a21\u677f\u4e00\u6837\uff0c\u5b83\u662f\u4e00\u4e2a\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"create-next-app")," \u5236\u4f5c\u7684Next.js\u5e94\u7528\u7a0b\u5e8f\u3002\u4e0d\u540c\u7684\u662f\uff0c\u5b83\u6709\u66f4\u591a\u7684\u529f\u80fd\u3002\u4e0d\u7528\u62c5\u5fc3\uff01\u6211\u4eec\u4ecd\u7136\u4f1a\u4f7f\u7528\u76f8\u540c\u7684\u4e1c\u897f\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/buildspace/solana-display-nfts-frontend\ncd solana-display-nfts-frontend\ngit checkout starter\nnpm install @metaplex-foundation/js@latest\nnpm i\nnpm run dev\n")),(0,l.kt)("p",null,"\u4f60\u5e94\u8be5\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u4e0a\u770b\u5230\u8fd9\u4e2a:"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(9757).Z,width:"1483",height:"911"})),(0,l.kt)("p",null,"\u201c\u663e\u793aNFT\u201d\u9875\u9762\u76ee\u524d\u8fd8\u6ca1\u6709\u663e\u793a\u4efb\u4f55\u5185\u5bb9 - \u8fd9\u5c31\u662f\u4f60\u7684\u4efb\u52a1\u6240\u5728\u3002"),(0,l.kt)("p",null,"\u6253\u5f00 ",(0,l.kt)("inlineCode",{parentName:"p"},"src/components/FetchNFT.tsx")," \uff0c\u6211\u4eec\u5f00\u59cb\u5427\u3002\u6211\u4eec\u5c06\u4ece\u7ec4\u4ef6\u9876\u90e8\u7684Metaplex\u8bbe\u7f6e\u5f00\u59cb\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-tsx"},"export const FetchNft: FC = () => {\n const [nftData, setNftData] = useState(null)\n\n const { connection } = useConnection()\n const wallet = useWallet()\n const metaplex = Metaplex.make(connection).use(walletAdapterIdentity(wallet))\n\n const fetchNfts = async () => {}\n\n return
\n}\n")),(0,l.kt)("p",null,"\u770b\u8d77\u6765\u5f88\u719f\u6089\u3002"),(0,l.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u6765\u586b\u5199 ",(0,l.kt)("inlineCode",{parentName:"p"},"fetchNfts")," \u51fd\u6570\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u4e4b\u524d\u770b\u5230\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"findAllByOwner")," \u65b9\u6cd5\u3002\u6211\u4eec\u8fd8\u9700\u8981\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"useWallet")," \u94a9\u5b50\u6765\u83b7\u53d6\u94b1\u5305\u5730\u5740\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-tsx"},"const fetchNfts = async () => {\n if (!wallet.connected) {\n return\n }\n\n // fetch NFTs for connected wallet\n const nfts = await metaplex\n .nfts()\n .findAllByOwner({ owner: wallet.publicKey })\n\n // fetch off chain metadata for each NFT\n let nftData = []\n for (let i = 0; i < nfts.length; i++) {\n let fetchResult = await fetch(nfts[i].uri)\n let json = await fetchResult.json()\n nftData.push(json)\n }\n\n // set state\n setNftData(nftData)\n }\n")),(0,l.kt)("p",null,"\u6211\u4eec\u60f3\u8981\u5728\u94b1\u5305\u66f4\u6539\u65f6\u66f4\u65b0\u663e\u793a\u7684NFTs\uff0c\u6240\u4ee5\u6211\u4eec\u5c06\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"useEffect")," \u51fd\u6570\u4e0b\u65b9\u6dfb\u52a0\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"fetchNfts")," \u94a9\u5b50\u6765\u8c03\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"fetchNfts")," \u51fd\u6570\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-tsx"},"export const FetchNft: FC = () => {\n ...\n\n const fetchNfts = async () => {\n ...\n }\n\n // fetch nfts when connected wallet changes\n useEffect(() => {\n fetchNfts()\n }, [wallet])\n\n return
\n}\n")),(0,l.kt)("p",null,"\u6700\u540e\uff0c\u6211\u4eec\u9700\u8981\u66f4\u65b0 ",(0,l.kt)("inlineCode",{parentName:"p"},"return")," \u8bed\u53e5\u4ee5\u663e\u793aNFTs\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u4e4b\u524d\u521b\u5efa\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"nftData")," \u72b6\u6001\u53d8\u91cf\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-tsx"},"return (\n
\n {nftData && (\n
\n {nftData.map((nft) => (\n
\n
    {nft.name}
\n \n
\n ))}\n
\n )}\n
\n )\n")),(0,l.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u7684NFT\u4e86\uff01\ud83c\udf89 \u8fd9\u662f\u6211\u7684\u94b1\u5305\u957f\u4ec0\u4e48\u6837\u5b50 \ud83d\ude06"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(8675).Z,width:"1259",height:"696"})),(0,l.kt)("p",null,"\u56de\u5230\u8fc7\u53bb\u7684\u65e5\u5b50\uff08\u5927\u7ea6\u57282021\u5e7410\u6708\uff09\uff0c\u6211\u4e0d\u5f97\u4e0d\u624b\u52a8\u5b8c\u6210\u6240\u6709\u8fd9\u4e9b\u5de5\u4f5c\uff0c\u800c\u4e14\u6211\u4e00\u76f4\u53d7\u5230RPC\u7684\u901f\u7387\u9650\u5236\uff0c\u6240\u4ee5\u8bf7\u82b1\u70b9\u65f6\u95f4\u611f\u6fc0Metaplex\u5f00\u53d1\u4eba\u5458\u4e3a\u6211\u4eec\u5e26\u6765\u8fd9\u4e2a\u7cbe\u5f69\u7684SDK\uff01"),(0,l.kt)("p",null,"\u5728",(0,l.kt)("inlineCode",{parentName:"p"},"nftData"),"\u8fd9\u91cc\u73a9\u4e00\u4e0b\u3002\u5c06\u5176\u8bb0\u5f55\u5230\u63a7\u5236\u53f0\u5e76\u5c1d\u8bd5\u663e\u793a\u5176\u4ed6\u503c\uff0c\u5982\u7b26\u53f7\u6216\u63cf\u8ff0\uff01\u4e5f\u8bb8\u6dfb\u52a0\u4e00\u4e2a\u8fc7\u6ee4\u5668\uff0c\u4ee5\u4fbf\u7528\u6237\u53ea\u80fd\u663e\u793a\u7279\u5b9a\u6536\u85cf\u7684NFT\uff1f"))}d.isMDXComponent=!0},9757:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/display-from-wallet-ab771e880d8a89ce190fc9d6c1bc8987.png"},8675:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/nfts-wallet-9b0d4678ead1e83ec711cd59e17325e0.png"}}]); \ No newline at end of file diff --git a/assets/js/3895fba0.642bccac.js b/assets/js/3895fba0.642bccac.js deleted file mode 100644 index 4853340af..000000000 --- a/assets/js/3895fba0.642bccac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6636],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var i=a.createContext({}),s=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=s(e.components);return a.createElement(i.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,i=e.parentName,d=p(e,["components","mdxType","originalType","parentName"]),c=s(n),m=l,k=c["".concat(i,".").concat(m)]||c[m]||u[m]||r;return n?a.createElement(k,o(o({ref:t},d),{},{components:n})):a.createElement(k,o({ref:t},d))}));function k(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,o=new Array(r);o[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[c]="string"==typeof e?e:l,o[1]=p;for(var s=2;s{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>p,toc:()=>s});var a=n(7462),l=(n(7294),n(3905));const r={sidebar_position:17,sidebar_label:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305",sidebar_class_name:"green"},o="\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305 (TODO by davirain)",p={unversionedId:"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README",id:"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README",title:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305 (TODO by davirain)",description:"\u6211\u4eec\u73b0\u5728\u5bf9\u901a\u8fc7\u4ee3\u7801\u4e0e\u7f51\u7edc\u8fdb\u884c\u4ea4\u4e92\u6709\u4e86\u5f88\u591a\u4e86\u89e3\u3002\u4e3a\u4e86\u8fdb\u884c\u4ea4\u6613\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u79c1\u94a5\u3002\u8fd9\u5bf9\u7528\u6237\u6765\u8bf4\u884c\u4e0d\u901a\u54c8\u54c8\u3002\u4e3a\u4e86\u8ba9\u4eba\u4eec\u7528\u771f\u94b1\u4ece\u6211\u4eec\u8fd9\u91cc\u8d2d\u4e70JPEG\u56fe\u50cf\uff0c\u6211\u4eec\u9700\u8981\u4e0e\u94b1\u5305\u5408\u4f5c\u3002",source:"@site/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README.md",sourceDirName:"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet",slug:"/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/",permalink:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README.md",tags:[],version:"current",sidebarPosition:17,frontMatter:{sidebar_position:17,sidebar_label:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u94b1\u5305\u548c\u524d\u7aef",permalink:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/"},next:{title:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",permalink:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/"}},i={},s=[{value:"\ud83d\udee0 Solana \u94b1\u5305\u9002\u914d\u5668",id:"-solana-\u94b1\u5305\u9002\u914d\u5668",level:2},{value:"\ud83d\udc5c \u521b\u5efa\u4e00\u4e2a\u94b1\u5305\u8fde\u63a5\u6309\u94ae",id:"-\u521b\u5efa\u4e00\u4e2a\u94b1\u5305\u8fde\u63a5\u6309\u94ae",level:2},{value:"\ud83e\uddde\u200d\u2642\ufe0f \u4f7f\u7528\u63d0\u4f9b\u5546\u8fde\u63a5\u94b1\u5305",id:"\ufe0f-\u4f7f\u7528\u63d0\u4f9b\u5546\u8fde\u63a5\u94b1\u5305",level:2}],d={toc:s},c="wrapper";function u(e){let{components:t,...r}=e;return(0,l.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u8fde\u63a5\u5230\u94b1\u5305-todo-by-davirain"},"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305 (TODO by davirain)"),(0,l.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u5bf9\u901a\u8fc7\u4ee3\u7801\u4e0e\u7f51\u7edc\u8fdb\u884c\u4ea4\u4e92\u6709\u4e86\u5f88\u591a\u4e86\u89e3\u3002\u4e3a\u4e86\u8fdb\u884c\u4ea4\u6613\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u79c1\u94a5\u3002\u8fd9\u5bf9\u7528\u6237\u6765\u8bf4\u884c\u4e0d\u901a\u54c8\u54c8\u3002\u4e3a\u4e86\u8ba9\u4eba\u4eec\u7528\u771f\u94b1\u4ece\u6211\u4eec\u8fd9\u91cc\u8d2d\u4e70JPEG\u56fe\u50cf\uff0c\u6211\u4eec\u9700\u8981\u4e0e\u94b1\u5305\u5408\u4f5c\u3002"),(0,l.kt)("p",null,"\u201c\u94b1\u5305\u201d\u8fd9\u4e2a\u540d\u5b57\u6709\u70b9\u5947\u602a\uff0c\u56e0\u4e3a\u5b83\u4eec\u4e0d\u4ec5\u4ec5\u662f\u7528\u6765\u5b58\u653e\u4e1c\u897f\u7684\u3002\u94b1\u5305\u662f\u6307\u4efb\u4f55\u80fd\u591f\u5b89\u5168\u5b58\u50a8\u5bc6\u94a5\u5e76\u5141\u8bb8\u7528\u6237\u7b7e\u7f72\u4ea4\u6613\u7684\u4e1c\u897f\u3002\u5b83\u4eec\u6709\u5f88\u591a\u5f62\u5f0f\uff0c\u6700\u5e38\u89c1\u7684\u662f\u6d4f\u89c8\u5668\u6269\u5c55\uff0c\u5b83\u4eec\u4e3a\u4f60\uff08\u5f00\u53d1\u8005\uff09\u63d0\u4f9bAPI\uff0c\u4ee5\u5411\u7528\u6237\u5efa\u8bae\u4ea4\u6613\u3002\u94b1\u5305\u4f7f\u4f60\u80fd\u591f\u5b89\u5168\u5730\u8fdb\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(761).Z,width:"489",height:"638"})),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528 Phantom \u6d4f\u89c8\u5668\u6269\u5c55\u7a0b\u5e8f\uff0c\u56e0\u4e3a\u5b83\u662f\u6700\u53d7\u6b22\u8fce\u7684\uff0c\u5982\u679c\u60a8\u613f\u610f\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u53e6\u4e00\u4e2a:)"),(0,l.kt)("p",null,"\u8ba9\u6211\u4eec\u5c06\u6211\u4eec\u7684\u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f\u4e0e\u94b1\u5305\u8fde\u63a5\u8d77\u6765\uff0c\u8ba9\u5b83\u4e3a\u7528\u6237\u63d0\u4f9b\u4ea4\u6613\u62a5\u4ef7\uff01"),(0,l.kt)("h2",{id:"-solana-\u94b1\u5305\u9002\u914d\u5668"},"\ud83d\udee0 Solana \u94b1\u5305\u9002\u914d\u5668"),(0,l.kt)("p",null,"\u90a3\u91cc\u6709\u51e0\u5341\u4e2a\u94b1\u5305\u3002\u4ed6\u4eec\u6bcf\u4e2a\u4eba\u90fd\u4ee5\u81ea\u5df1\u7684\u65b9\u5f0f\u505a\u4e8b\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u5982\u679c\u60a8\u5fc5\u987b\u4e3a\u6bcf\u4e2a\u5355\u72ec\u7684\u94b1\u5305 API \u8fdb\u884c\u6784\u5efa\uff0c\u90a3\u5c06\u662f\u4e00\u573a\u5669\u68a6\u3002\u503c\u5f97\u5e86\u5e78\u7684\u662f\uff0c\u6211\u4eec\u6709 ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/solana-labs/wallet-adapter?utm_source=buildspace.so&utm_medium=buildspace_project"},"Solana Wallet-Adapter")," - \u5b83\u662f\u4e00\u5957\u5e93\uff0c\u4e3a\u60a8\u63d0\u4f9b\u51e0\u4e4e\u901a\u7528\u7684 API\uff0c\u53ef\u4e0e\u5927\u91cf\u94b1\u5305\u4e00\u8d77\u4f7f\u7528\uff08",(0,l.kt)("a",{parentName:"p",href:"https://github.com/solana-labs/wallet-adapter#wallets?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u5b8c\u6574\u5217\u8868\u89c1\u6b64\u5904"),"\uff09\u3002"),(0,l.kt)("p",null,"\u60a8\u5c06\u4e3b\u8981\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-base")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-react")," \u5e93\u3002\u60a8\u53ef\u4ee5\u9009\u62e9\u60a8\u60f3\u8981\u652f\u6301\u7684\u7279\u5b9a\u94b1\u5305\uff0c\u6216\u8005\u53ea\u652f\u6301\u6240\u6709\u94b1\u5305\u3002\u8fd9\u91cc\u7684\u533a\u522b\u5728\u4e8e\u60a8\u8981\u4f7f\u7528\u54ea\u4e9b\u5e93 - \u7279\u5b9a\u7684\u94b1\u5305\u5e93\u6216 ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-wallets")," \u3002\u7531\u4e8e\u6211\u4eec\u8981\u4f7f\u7528 Phantom\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u53ea\u4f7f\u7528 Phantom \u5e93\uff01"),(0,l.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u9700\u8981\u5b89\u88c5\u7684\u5185\u5bb9\uff08\u60a8\u73b0\u5728\u4e0d\u9700\u8981\u8fd0\u884c\u5b83\uff09\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @solana/wallet-adapter-base \\\n @solana/wallet-adapter-react \\\n @solana/wallet-adapter-phantom \\\n @solana/wallet-adapter-react-ui\n")),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-react-ui")," \u4e3a\u6211\u4eec\u5904\u7406\u6574\u4e2a UI - \u8fde\u63a5\u3001\u9009\u62e9\u94b1\u5305\u3001\u65ad\u5f00\u8fde\u63a5\uff0c\u4e00\u5207\u90fd\u5df2\u6392\u5e8f\uff01"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(5546).Z,width:"1715",height:"1258"})),(0,l.kt)("p",null,"\u591a\u4e8f\u4e86\u8fd9\u4e9b\u725b\u903c\u7684\u5e93\uff0c\u6211\u4eec\u5728Solana\u4e0a\u518d\u4e5f\u4e0d\u7528\u81ea\u5df1\u6784\u5efa\u94b1\u5305\u8fde\u63a5\u7684\u4e1c\u897f\u4e86\uff01\u8d81\u6b64\u673a\u4f1a\uff0c\u611f\u8c22\u90a3\u4e9b\u7ef4\u62a4\u8005\u4e3a\u4f60\u8282\u7701\u4e86\u65f6\u95f4\u548c\u5934\u53d1\u3002"),(0,l.kt)("h2",{id:"-\u521b\u5efa\u4e00\u4e2a\u94b1\u5305\u8fde\u63a5\u6309\u94ae"},"\ud83d\udc5c \u521b\u5efa\u4e00\u4e2a\u94b1\u5305\u8fde\u63a5\u6309\u94ae"),(0,l.kt)("p",null,"\u8ba9\u6211\u4eec\u6765\u770b\u770b\u8fd9\u4e9b\u5e93\u5427\uff01\u5728\u60a8\u7684\u5de5\u4f5c\u533a\u4e2d\u8bbe\u7f6e\u4e00\u4e2a\u65b0\u9879\u76ee\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-ping-frontend.git\ncd solana-ping-frontend\ngit checkout starter\nnpm i\n")),(0,l.kt)("p",null,"\u8be5\u6a21\u677f\u7ee7\u627f\u4e86\u6211\u4eec\u4e0a\u6b21\u6784\u5efa\u7684\u5185\u5bb9 - \u6211\u4eec\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},"ping")," \u5ba2\u6237\u7aef\u63d0\u4f9b\u4e86\u4e00\u4e2a\u524d\u7aef\uff0c\u7528\u4e8e\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe\u3002\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u4f60\u4f1a\u5728\u672c\u5730\u4e3b\u673a\u4e0a\u770b\u5230\u8fd9\u4e2a\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6012).Z,width:"1262",height:"563"})),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u51c6\u7cfb\u7edf UI - \u8ba9\u6211\u4eec\u5c06\u5176\u8fde\u63a5\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-react")," \u5e93\u3002"),(0,l.kt)("p",null,"\u62c9\u8d77 ",(0,l.kt)("inlineCode",{parentName:"p"},"_app.tsx")," \u5e76\u4f7f\u5176\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'import React, { useMemo } from "react";\nimport { WalletAdapterNetwork } from "@solana/wallet-adapter-base";\nimport { WalletModalProvider } from "@solana/wallet-adapter-react-ui";\nimport { ConnectionProvider, WalletProvider } from "@solana/wallet-adapter-react";\nimport {\n GlowWalletAdapter,\n PhantomWalletAdapter\n} from "@solana/wallet-adapter-wallets";\nimport { clusterApiUrl } from "@solana/web3.js";\n\nrequire("@solana/wallet-adapter-react-ui/styles.css");\nrequire("../styles/globals.css");\nrequire ("../styles/Home.module.css");\n\nconst App = ({ Component, pageProps }) => {\n // Can be set to \'devnet\', \'testnet\', or \'mainnet-beta\'\n const network = WalletAdapterNetwork.Devnet;\n\n // You can provide a custom RPC endpoint here\n const endpoint = useMemo(() => clusterApiUrl(network), [network]);\n\n // @solana/wallet-adapter-wallets includes all the adapters but supports tree shaking and lazy loading --\n // Only the wallets you configure here will be compiled into your application, and only the dependencies\n // of wallets that your users connect to will be loaded\n const wallets = useMemo(\n () => [\n new PhantomWalletAdapter(),\n new GlowWalletAdapter()\n ],\n [network]\n );\n\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n')),(0,l.kt)("p",null,"\u8fd9\u662f\u5f88\u591a\u7684\u5bfc\u5165\u3002\u522b\u62c5\u5fc3\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u6bcf\u4e2a\u5bfc\u5165\u662f\u7528\u6765\u505a\u4ec0\u4e48\u7684\uff0c\u4e0d\u9700\u8981\u6df1\u5165\u4e86\u89e3\u5b83\u4eec\u7684\u5de5\u4f5c\u539f\u7406\u3002\u4e0b\u9762\u662f\u6bcf\u4e2a\u90e8\u5206\u7684\u7b80\u8981\u6982\u8ff0\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u4ece ",(0,l.kt)("inlineCode",{parentName:"p"},"React")," \u5f00\u59cb\u3002 ",(0,l.kt)("inlineCode",{parentName:"p"},"useMemo()")," \u662f\u4e00\u4e2a\u94a9\u5b50\uff0c\u4ec5\u5f53\u4f9d\u8d56\u9879\u4e4b\u4e00\u53d1\u751f\u66f4\u6539\u65f6\u624d\u52a0\u8f7d\u5185\u5bb9\u3002\u5728\u6211\u4eec\u7684\u4f8b\u5b50\u4e2d\uff0c\u53ea\u6709\u5f53\u7528\u6237\u8fde\u63a5\u7684\u7f51\u7edc\u53d1\u751f\u53d8\u5316\u65f6\uff0c ",(0,l.kt)("inlineCode",{parentName:"p"},"clusterApiUrl")," \u7684\u503c\u624d\u4f1a\u53d1\u751f\u53d8\u5316\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u9996\u5148\u5bfc\u5165\u7684Solana\u5f15\u7528\u662f ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-network")," \u6765\u81ea ",(0,l.kt)("inlineCode",{parentName:"p"},"@solana/wallet-adapter-base")," \u3002\u8fd9\u53ea\u662f\u4e00\u4e2a\u53ef\u679a\u4e3e\u7684\u5bf9\u8c61\uff0c\u7528\u4e8e\u8868\u793a\u53ef\u7528\u7684\u7f51\u7edc\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"WalletModalProvider")," \u5c31\u662f\u8fd9\u6837\uff0c\u54c8\u54c8 - \u5b83\u662f\u4e00\u4e2a\u5947\u7279\u7684 React \u7ec4\u4ef6\uff0c\u4f1a\u63d0\u793a\u7528\u6237\u9009\u62e9\u4ed6\u4eec\u7684\u94b1\u5305\u3002\u57c3\u5179\u666e\u5179\u3002"),(0,l.kt)("p",null," ",(0,l.kt)("inlineCode",{parentName:"p"},"ConnectionProvider")," \u63a5\u6536\u4e00\u4e2aRPC\u7aef\u70b9\uff0c\u5e76\u8ba9\u6211\u4eec\u76f4\u63a5\u4e0eSolana\u533a\u5757\u94fe\u4e0a\u7684\u8282\u70b9\u8fdb\u884c\u901a\u4fe1\u3002\u6211\u4eec\u5c06\u5728\u6574\u4e2a\u5e94\u7528\u7a0b\u5e8f\u4e2d\u4f7f\u7528\u5b83\u6765\u53d1\u9001\u4ea4\u6613\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"WalletProvider")," \u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a\u8fde\u63a5\u5404\u79cd\u94b1\u5305\u7684\u6807\u51c6\u63a5\u53e3\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5fc5\u8d39\u5fc3\u9605\u8bfb\u6bcf\u4e2a\u94b1\u5305\u7684\u6587\u6863\u5475\u5475\u3002"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\u60a8\u5c06\u770b\u5230\u6765\u81ea ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-wallets")," \u7684\u4e00\u5806\u94b1\u5305\u9002\u914d\u5668\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u4ece\u4e2d\u5bfc\u5165\u7684\u5185\u5bb9\u6765\u521b\u5efa\u6211\u4eec\u5c06\u63d0\u4f9b\u7ed9 ",(0,l.kt)("inlineCode",{parentName:"p"},"WalletProvider")," \u7684\u94b1\u5305\u5217\u8868\u3002\u8fd8\u6709\u8bb8\u591a\u5176\u4ed6\u94b1\u5305\u9002\u914d\u5668\u53ef\u7528\uff0c\u751a\u81f3\u6709\u4e9b\u662f\u4e3a\u5176\u4ed6\u533a\u5757\u94fe\u5236\u4f5c\u7684\uff01\u5728\u8fd9\u91cc\u67e5\u770b\u5b83\u4eec\u3002\u6211\u521a\u521a\u9009\u62e9\u4e86 Phantom \u548c Glow\u3002"),(0,l.kt)("p",null,"\u6700\u540e\uff0c\u6211\u4eec\u6709 ",(0,l.kt)("inlineCode",{parentName:"p"},"clusterApiURL")," \uff0c\u5b83\u53ea\u662f\u4e00\u4e2a\u6839\u636e\u6211\u4eec\u63d0\u4f9b\u7684\u7f51\u7edc\u4e3a\u6211\u4eec\u751f\u6210 RPC \u7aef\u70b9\u7684\u51fd\u6570\u3002"),(0,l.kt)("p",null,"\u5bf9\u4e8e ",(0,l.kt)("inlineCode",{parentName:"p"},"React App")," \u7ec4\u4ef6\u5185\u7684 return \u8bed\u53e5\uff0c\u6211\u4eec\u7528\u4e00\u4e9b\u4e0a\u4e0b\u6587\u63d0\u4f9b\u7a0b\u5e8f\u5305\u88c5\u5b50\u7ec4\u4ef6\uff08\u5e94\u7528\u7a0b\u5e8f\u7684\u5176\u4f59\u90e8\u5206\uff09\u3002"),(0,l.kt)("p",null,"\u603b\u7ed3\u4e00\u4e0b\uff1a\u8fd9\u4e2a\u6587\u4ef6\u662f\u6211\u4eec\u7f51\u9875\u5e94\u7528\u7a0b\u5e8f\u7684\u6838\u5fc3\u3002\u6211\u4eec\u5728\u8fd9\u91cc\u63d0\u4f9b\u7684\u4efb\u4f55\u5185\u5bb9\u90fd\u53ef\u4ee5\u88ab\u6211\u4eec\u5e94\u7528\u7a0b\u5e8f\u7684\u5176\u4ed6\u90e8\u5206\u8bbf\u95ee\u5230\u3002\u6211\u4eec\u5c06\u6240\u6709\u7684\u94b1\u5305\u548c\u7f51\u7edc\u5de5\u5177\u90fd\u653e\u5728\u8fd9\u91cc\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u5728\u6bcf\u4e2a\u5b50\u7ec4\u4ef6\u4e2d\u91cd\u65b0\u521d\u59cb\u5316\u5b83\u4eec\u3002"),(0,l.kt)("p",null,"\u6211\u4ece\u5b98\u65b9 ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter Next.js")," \u6a21\u677f\u590d\u5236\u4e86\u6240\u6709\u8fd9\u4e9b\u4ee3\u7801\uff0c\u6240\u4ee5\u4e0d\u8981\u5bf9\u590d\u5236/\u7c98\u8d34\uff08\u8fd9\u6b21\uff09\u611f\u5230\u96be\u8fc7\u3002"),(0,l.kt)("h2",{id:"\ufe0f-\u4f7f\u7528\u63d0\u4f9b\u5546\u8fde\u63a5\u94b1\u5305"},"\ud83e\uddde\u200d\u2642\ufe0f \u4f7f\u7528\u63d0\u4f9b\u5546\u8fde\u63a5\u94b1\u5305"),(0,l.kt)("p",null,"\u5537\uff0c\u90a3\u662f\u4e00\u5806\u8bbe\u7f6e\uff01\u73b0\u5728\u60a8\u53ef\u4ee5\u770b\u5230\u4e0e\u94b1\u5305\u4ea4\u4e92\u662f\u591a\u4e48\u5bb9\u6613\u3002\u6211\u4eec\u6240\u8981\u505a\u7684\u5c31\u662f\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"components/AppBar.tsx")," \u4e2d\u8bbe\u7f6e\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"React hook"),"\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"import { FC } from 'react'\nimport styles from '../styles/Home.module.css'\nimport Image from 'next/image'\nimport { WalletMultiButton } from '@solana/wallet-adapter-react-ui'\n\nexport const AppBar: FC = () => {\n return (\n
\n \n Wallet-Adapter Example\n \n
\n )\n}\n")),(0,l.kt)("p",null,"\u633a\u7b80\u5355\u7684\uff0c\u662f\u5427\uff1f ",(0,l.kt)("inlineCode",{parentName:"p"},"WalletMultiButton")," \u4e3a\u6211\u4eec\u505a\u4e86\u5f88\u591a\u9b54\u6cd5\uff0c\u5904\u7406\u4e86\u6240\u6709\u7684\u8fde\u63a5\u7ec6\u8282\u3002\u5982\u679c\u4f60\u73b0\u5728\u5f3a\u5236\u5237\u65b0\u5e94\u7528\u7a0b\u5e8f\uff0c\u4f60\u5e94\u8be5\u80fd\u770b\u5230\u4e00\u4e2a\u6f02\u4eae\u7684\u7d2b\u8272\u6309\u94ae\u5728\u53f3\u4e0a\u89d2\uff01"))}u.isMDXComponent=!0},761:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upload_1-acf26f5a4b8304459f73d073ed17046c.png"},6012:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upload_2-64e28b9a44f062c9c84f19e48f89293a.png"},5546:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/wallets-4a4cdbca763c8954cbe5ae22c036e84b.png"}}]); \ No newline at end of file diff --git a/assets/js/3895fba0.7636ee21.js b/assets/js/3895fba0.7636ee21.js new file mode 100644 index 000000000..682076213 --- /dev/null +++ b/assets/js/3895fba0.7636ee21.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6636],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var i=a.createContext({}),s=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=s(e.components);return a.createElement(i.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,i=e.parentName,d=p(e,["components","mdxType","originalType","parentName"]),c=s(n),m=l,k=c["".concat(i,".").concat(m)]||c[m]||u[m]||r;return n?a.createElement(k,o(o({ref:t},d),{},{components:n})):a.createElement(k,o({ref:t},d))}));function k(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,o=new Array(r);o[0]=m;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[c]="string"==typeof e?e:l,o[1]=p;for(var s=2;s{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>p,toc:()=>s});var a=n(7462),l=(n(7294),n(3905));const r={sidebar_position:17,sidebar_label:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305",sidebar_class_name:"green"},o="\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305 (TODO by davirain)",p={unversionedId:"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README",id:"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README",title:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305 (TODO by davirain)",description:"\u6211\u4eec\u73b0\u5728\u5bf9\u901a\u8fc7\u4ee3\u7801\u4e0e\u7f51\u7edc\u8fdb\u884c\u4ea4\u4e92\u6709\u4e86\u5f88\u591a\u4e86\u89e3\u3002\u4e3a\u4e86\u8fdb\u884c\u4ea4\u6613\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u79c1\u94a5\u3002\u8fd9\u5bf9\u7528\u6237\u6765\u8bf4\u884c\u4e0d\u901a\u54c8\u54c8\u3002\u4e3a\u4e86\u8ba9\u4eba\u4eec\u7528\u771f\u94b1\u4ece\u6211\u4eec\u8fd9\u91cc\u8d2d\u4e70JPEG\u56fe\u50cf\uff0c\u6211\u4eec\u9700\u8981\u4e0e\u94b1\u5305\u5408\u4f5c\u3002",source:"@site/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README.md",sourceDirName:"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet",slug:"/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README.md",tags:[],version:"current",sidebarPosition:17,frontMatter:{sidebar_position:17,sidebar_label:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u94b1\u5305\u548c\u524d\u7aef",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/"},next:{title:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/"}},i={},s=[{value:"\ud83d\udee0 Solana \u94b1\u5305\u9002\u914d\u5668",id:"-solana-\u94b1\u5305\u9002\u914d\u5668",level:2},{value:"\ud83d\udc5c \u521b\u5efa\u4e00\u4e2a\u94b1\u5305\u8fde\u63a5\u6309\u94ae",id:"-\u521b\u5efa\u4e00\u4e2a\u94b1\u5305\u8fde\u63a5\u6309\u94ae",level:2},{value:"\ud83e\uddde\u200d\u2642\ufe0f \u4f7f\u7528\u63d0\u4f9b\u5546\u8fde\u63a5\u94b1\u5305",id:"\ufe0f-\u4f7f\u7528\u63d0\u4f9b\u5546\u8fde\u63a5\u94b1\u5305",level:2}],d={toc:s},c="wrapper";function u(e){let{components:t,...r}=e;return(0,l.kt)(c,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u8fde\u63a5\u5230\u94b1\u5305-todo-by-davirain"},"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305 (TODO by davirain)"),(0,l.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u5bf9\u901a\u8fc7\u4ee3\u7801\u4e0e\u7f51\u7edc\u8fdb\u884c\u4ea4\u4e92\u6709\u4e86\u5f88\u591a\u4e86\u89e3\u3002\u4e3a\u4e86\u8fdb\u884c\u4ea4\u6613\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u79c1\u94a5\u3002\u8fd9\u5bf9\u7528\u6237\u6765\u8bf4\u884c\u4e0d\u901a\u54c8\u54c8\u3002\u4e3a\u4e86\u8ba9\u4eba\u4eec\u7528\u771f\u94b1\u4ece\u6211\u4eec\u8fd9\u91cc\u8d2d\u4e70JPEG\u56fe\u50cf\uff0c\u6211\u4eec\u9700\u8981\u4e0e\u94b1\u5305\u5408\u4f5c\u3002"),(0,l.kt)("p",null,"\u201c\u94b1\u5305\u201d\u8fd9\u4e2a\u540d\u5b57\u6709\u70b9\u5947\u602a\uff0c\u56e0\u4e3a\u5b83\u4eec\u4e0d\u4ec5\u4ec5\u662f\u7528\u6765\u5b58\u653e\u4e1c\u897f\u7684\u3002\u94b1\u5305\u662f\u6307\u4efb\u4f55\u80fd\u591f\u5b89\u5168\u5b58\u50a8\u5bc6\u94a5\u5e76\u5141\u8bb8\u7528\u6237\u7b7e\u7f72\u4ea4\u6613\u7684\u4e1c\u897f\u3002\u5b83\u4eec\u6709\u5f88\u591a\u5f62\u5f0f\uff0c\u6700\u5e38\u89c1\u7684\u662f\u6d4f\u89c8\u5668\u6269\u5c55\uff0c\u5b83\u4eec\u4e3a\u4f60\uff08\u5f00\u53d1\u8005\uff09\u63d0\u4f9bAPI\uff0c\u4ee5\u5411\u7528\u6237\u5efa\u8bae\u4ea4\u6613\u3002\u94b1\u5305\u4f7f\u4f60\u80fd\u591f\u5b89\u5168\u5730\u8fdb\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(761).Z,width:"489",height:"638"})),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528 Phantom \u6d4f\u89c8\u5668\u6269\u5c55\u7a0b\u5e8f\uff0c\u56e0\u4e3a\u5b83\u662f\u6700\u53d7\u6b22\u8fce\u7684\uff0c\u5982\u679c\u60a8\u613f\u610f\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u53e6\u4e00\u4e2a:)"),(0,l.kt)("p",null,"\u8ba9\u6211\u4eec\u5c06\u6211\u4eec\u7684\u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f\u4e0e\u94b1\u5305\u8fde\u63a5\u8d77\u6765\uff0c\u8ba9\u5b83\u4e3a\u7528\u6237\u63d0\u4f9b\u4ea4\u6613\u62a5\u4ef7\uff01"),(0,l.kt)("h2",{id:"-solana-\u94b1\u5305\u9002\u914d\u5668"},"\ud83d\udee0 Solana \u94b1\u5305\u9002\u914d\u5668"),(0,l.kt)("p",null,"\u90a3\u91cc\u6709\u51e0\u5341\u4e2a\u94b1\u5305\u3002\u4ed6\u4eec\u6bcf\u4e2a\u4eba\u90fd\u4ee5\u81ea\u5df1\u7684\u65b9\u5f0f\u505a\u4e8b\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u5982\u679c\u60a8\u5fc5\u987b\u4e3a\u6bcf\u4e2a\u5355\u72ec\u7684\u94b1\u5305 API \u8fdb\u884c\u6784\u5efa\uff0c\u90a3\u5c06\u662f\u4e00\u573a\u5669\u68a6\u3002\u503c\u5f97\u5e86\u5e78\u7684\u662f\uff0c\u6211\u4eec\u6709 ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/solana-labs/wallet-adapter?utm_source=buildspace.so&utm_medium=buildspace_project"},"Solana Wallet-Adapter")," - \u5b83\u662f\u4e00\u5957\u5e93\uff0c\u4e3a\u60a8\u63d0\u4f9b\u51e0\u4e4e\u901a\u7528\u7684 API\uff0c\u53ef\u4e0e\u5927\u91cf\u94b1\u5305\u4e00\u8d77\u4f7f\u7528\uff08",(0,l.kt)("a",{parentName:"p",href:"https://github.com/solana-labs/wallet-adapter#wallets?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u5b8c\u6574\u5217\u8868\u89c1\u6b64\u5904"),"\uff09\u3002"),(0,l.kt)("p",null,"\u60a8\u5c06\u4e3b\u8981\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-base")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-react")," \u5e93\u3002\u60a8\u53ef\u4ee5\u9009\u62e9\u60a8\u60f3\u8981\u652f\u6301\u7684\u7279\u5b9a\u94b1\u5305\uff0c\u6216\u8005\u53ea\u652f\u6301\u6240\u6709\u94b1\u5305\u3002\u8fd9\u91cc\u7684\u533a\u522b\u5728\u4e8e\u60a8\u8981\u4f7f\u7528\u54ea\u4e9b\u5e93 - \u7279\u5b9a\u7684\u94b1\u5305\u5e93\u6216 ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-wallets")," \u3002\u7531\u4e8e\u6211\u4eec\u8981\u4f7f\u7528 Phantom\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u53ea\u4f7f\u7528 Phantom \u5e93\uff01"),(0,l.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u9700\u8981\u5b89\u88c5\u7684\u5185\u5bb9\uff08\u60a8\u73b0\u5728\u4e0d\u9700\u8981\u8fd0\u884c\u5b83\uff09\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @solana/wallet-adapter-base \\\n @solana/wallet-adapter-react \\\n @solana/wallet-adapter-phantom \\\n @solana/wallet-adapter-react-ui\n")),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-react-ui")," \u4e3a\u6211\u4eec\u5904\u7406\u6574\u4e2a UI - \u8fde\u63a5\u3001\u9009\u62e9\u94b1\u5305\u3001\u65ad\u5f00\u8fde\u63a5\uff0c\u4e00\u5207\u90fd\u5df2\u6392\u5e8f\uff01"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(5546).Z,width:"1715",height:"1258"})),(0,l.kt)("p",null,"\u591a\u4e8f\u4e86\u8fd9\u4e9b\u725b\u903c\u7684\u5e93\uff0c\u6211\u4eec\u5728Solana\u4e0a\u518d\u4e5f\u4e0d\u7528\u81ea\u5df1\u6784\u5efa\u94b1\u5305\u8fde\u63a5\u7684\u4e1c\u897f\u4e86\uff01\u8d81\u6b64\u673a\u4f1a\uff0c\u611f\u8c22\u90a3\u4e9b\u7ef4\u62a4\u8005\u4e3a\u4f60\u8282\u7701\u4e86\u65f6\u95f4\u548c\u5934\u53d1\u3002"),(0,l.kt)("h2",{id:"-\u521b\u5efa\u4e00\u4e2a\u94b1\u5305\u8fde\u63a5\u6309\u94ae"},"\ud83d\udc5c \u521b\u5efa\u4e00\u4e2a\u94b1\u5305\u8fde\u63a5\u6309\u94ae"),(0,l.kt)("p",null,"\u8ba9\u6211\u4eec\u6765\u770b\u770b\u8fd9\u4e9b\u5e93\u5427\uff01\u5728\u60a8\u7684\u5de5\u4f5c\u533a\u4e2d\u8bbe\u7f6e\u4e00\u4e2a\u65b0\u9879\u76ee\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-ping-frontend.git\ncd solana-ping-frontend\ngit checkout starter\nnpm i\n")),(0,l.kt)("p",null,"\u8be5\u6a21\u677f\u7ee7\u627f\u4e86\u6211\u4eec\u4e0a\u6b21\u6784\u5efa\u7684\u5185\u5bb9 - \u6211\u4eec\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},"ping")," \u5ba2\u6237\u7aef\u63d0\u4f9b\u4e86\u4e00\u4e2a\u524d\u7aef\uff0c\u7528\u4e8e\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe\u3002\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u4f60\u4f1a\u5728\u672c\u5730\u4e3b\u673a\u4e0a\u770b\u5230\u8fd9\u4e2a\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6012).Z,width:"1262",height:"563"})),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u51c6\u7cfb\u7edf UI - \u8ba9\u6211\u4eec\u5c06\u5176\u8fde\u63a5\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-react")," \u5e93\u3002"),(0,l.kt)("p",null,"\u62c9\u8d77 ",(0,l.kt)("inlineCode",{parentName:"p"},"_app.tsx")," \u5e76\u4f7f\u5176\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'import React, { useMemo } from "react";\nimport { WalletAdapterNetwork } from "@solana/wallet-adapter-base";\nimport { WalletModalProvider } from "@solana/wallet-adapter-react-ui";\nimport { ConnectionProvider, WalletProvider } from "@solana/wallet-adapter-react";\nimport {\n GlowWalletAdapter,\n PhantomWalletAdapter\n} from "@solana/wallet-adapter-wallets";\nimport { clusterApiUrl } from "@solana/web3.js";\n\nrequire("@solana/wallet-adapter-react-ui/styles.css");\nrequire("../styles/globals.css");\nrequire ("../styles/Home.module.css");\n\nconst App = ({ Component, pageProps }) => {\n // Can be set to \'devnet\', \'testnet\', or \'mainnet-beta\'\n const network = WalletAdapterNetwork.Devnet;\n\n // You can provide a custom RPC endpoint here\n const endpoint = useMemo(() => clusterApiUrl(network), [network]);\n\n // @solana/wallet-adapter-wallets includes all the adapters but supports tree shaking and lazy loading --\n // Only the wallets you configure here will be compiled into your application, and only the dependencies\n // of wallets that your users connect to will be loaded\n const wallets = useMemo(\n () => [\n new PhantomWalletAdapter(),\n new GlowWalletAdapter()\n ],\n [network]\n );\n\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n')),(0,l.kt)("p",null,"\u8fd9\u662f\u5f88\u591a\u7684\u5bfc\u5165\u3002\u522b\u62c5\u5fc3\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u6bcf\u4e2a\u5bfc\u5165\u662f\u7528\u6765\u505a\u4ec0\u4e48\u7684\uff0c\u4e0d\u9700\u8981\u6df1\u5165\u4e86\u89e3\u5b83\u4eec\u7684\u5de5\u4f5c\u539f\u7406\u3002\u4e0b\u9762\u662f\u6bcf\u4e2a\u90e8\u5206\u7684\u7b80\u8981\u6982\u8ff0\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u4ece ",(0,l.kt)("inlineCode",{parentName:"p"},"React")," \u5f00\u59cb\u3002 ",(0,l.kt)("inlineCode",{parentName:"p"},"useMemo()")," \u662f\u4e00\u4e2a\u94a9\u5b50\uff0c\u4ec5\u5f53\u4f9d\u8d56\u9879\u4e4b\u4e00\u53d1\u751f\u66f4\u6539\u65f6\u624d\u52a0\u8f7d\u5185\u5bb9\u3002\u5728\u6211\u4eec\u7684\u4f8b\u5b50\u4e2d\uff0c\u53ea\u6709\u5f53\u7528\u6237\u8fde\u63a5\u7684\u7f51\u7edc\u53d1\u751f\u53d8\u5316\u65f6\uff0c ",(0,l.kt)("inlineCode",{parentName:"p"},"clusterApiUrl")," \u7684\u503c\u624d\u4f1a\u53d1\u751f\u53d8\u5316\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u9996\u5148\u5bfc\u5165\u7684Solana\u5f15\u7528\u662f ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-network")," \u6765\u81ea ",(0,l.kt)("inlineCode",{parentName:"p"},"@solana/wallet-adapter-base")," \u3002\u8fd9\u53ea\u662f\u4e00\u4e2a\u53ef\u679a\u4e3e\u7684\u5bf9\u8c61\uff0c\u7528\u4e8e\u8868\u793a\u53ef\u7528\u7684\u7f51\u7edc\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"WalletModalProvider")," \u5c31\u662f\u8fd9\u6837\uff0c\u54c8\u54c8 - \u5b83\u662f\u4e00\u4e2a\u5947\u7279\u7684 React \u7ec4\u4ef6\uff0c\u4f1a\u63d0\u793a\u7528\u6237\u9009\u62e9\u4ed6\u4eec\u7684\u94b1\u5305\u3002\u57c3\u5179\u666e\u5179\u3002"),(0,l.kt)("p",null," ",(0,l.kt)("inlineCode",{parentName:"p"},"ConnectionProvider")," \u63a5\u6536\u4e00\u4e2aRPC\u7aef\u70b9\uff0c\u5e76\u8ba9\u6211\u4eec\u76f4\u63a5\u4e0eSolana\u533a\u5757\u94fe\u4e0a\u7684\u8282\u70b9\u8fdb\u884c\u901a\u4fe1\u3002\u6211\u4eec\u5c06\u5728\u6574\u4e2a\u5e94\u7528\u7a0b\u5e8f\u4e2d\u4f7f\u7528\u5b83\u6765\u53d1\u9001\u4ea4\u6613\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"WalletProvider")," \u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a\u8fde\u63a5\u5404\u79cd\u94b1\u5305\u7684\u6807\u51c6\u63a5\u53e3\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5fc5\u8d39\u5fc3\u9605\u8bfb\u6bcf\u4e2a\u94b1\u5305\u7684\u6587\u6863\u5475\u5475\u3002"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\u60a8\u5c06\u770b\u5230\u6765\u81ea ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter-wallets")," \u7684\u4e00\u5806\u94b1\u5305\u9002\u914d\u5668\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u4ece\u4e2d\u5bfc\u5165\u7684\u5185\u5bb9\u6765\u521b\u5efa\u6211\u4eec\u5c06\u63d0\u4f9b\u7ed9 ",(0,l.kt)("inlineCode",{parentName:"p"},"WalletProvider")," \u7684\u94b1\u5305\u5217\u8868\u3002\u8fd8\u6709\u8bb8\u591a\u5176\u4ed6\u94b1\u5305\u9002\u914d\u5668\u53ef\u7528\uff0c\u751a\u81f3\u6709\u4e9b\u662f\u4e3a\u5176\u4ed6\u533a\u5757\u94fe\u5236\u4f5c\u7684\uff01\u5728\u8fd9\u91cc\u67e5\u770b\u5b83\u4eec\u3002\u6211\u521a\u521a\u9009\u62e9\u4e86 Phantom \u548c Glow\u3002"),(0,l.kt)("p",null,"\u6700\u540e\uff0c\u6211\u4eec\u6709 ",(0,l.kt)("inlineCode",{parentName:"p"},"clusterApiURL")," \uff0c\u5b83\u53ea\u662f\u4e00\u4e2a\u6839\u636e\u6211\u4eec\u63d0\u4f9b\u7684\u7f51\u7edc\u4e3a\u6211\u4eec\u751f\u6210 RPC \u7aef\u70b9\u7684\u51fd\u6570\u3002"),(0,l.kt)("p",null,"\u5bf9\u4e8e ",(0,l.kt)("inlineCode",{parentName:"p"},"React App")," \u7ec4\u4ef6\u5185\u7684 return \u8bed\u53e5\uff0c\u6211\u4eec\u7528\u4e00\u4e9b\u4e0a\u4e0b\u6587\u63d0\u4f9b\u7a0b\u5e8f\u5305\u88c5\u5b50\u7ec4\u4ef6\uff08\u5e94\u7528\u7a0b\u5e8f\u7684\u5176\u4f59\u90e8\u5206\uff09\u3002"),(0,l.kt)("p",null,"\u603b\u7ed3\u4e00\u4e0b\uff1a\u8fd9\u4e2a\u6587\u4ef6\u662f\u6211\u4eec\u7f51\u9875\u5e94\u7528\u7a0b\u5e8f\u7684\u6838\u5fc3\u3002\u6211\u4eec\u5728\u8fd9\u91cc\u63d0\u4f9b\u7684\u4efb\u4f55\u5185\u5bb9\u90fd\u53ef\u4ee5\u88ab\u6211\u4eec\u5e94\u7528\u7a0b\u5e8f\u7684\u5176\u4ed6\u90e8\u5206\u8bbf\u95ee\u5230\u3002\u6211\u4eec\u5c06\u6240\u6709\u7684\u94b1\u5305\u548c\u7f51\u7edc\u5de5\u5177\u90fd\u653e\u5728\u8fd9\u91cc\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u5728\u6bcf\u4e2a\u5b50\u7ec4\u4ef6\u4e2d\u91cd\u65b0\u521d\u59cb\u5316\u5b83\u4eec\u3002"),(0,l.kt)("p",null,"\u6211\u4ece\u5b98\u65b9 ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet-adapter Next.js")," \u6a21\u677f\u590d\u5236\u4e86\u6240\u6709\u8fd9\u4e9b\u4ee3\u7801\uff0c\u6240\u4ee5\u4e0d\u8981\u5bf9\u590d\u5236/\u7c98\u8d34\uff08\u8fd9\u6b21\uff09\u611f\u5230\u96be\u8fc7\u3002"),(0,l.kt)("h2",{id:"\ufe0f-\u4f7f\u7528\u63d0\u4f9b\u5546\u8fde\u63a5\u94b1\u5305"},"\ud83e\uddde\u200d\u2642\ufe0f \u4f7f\u7528\u63d0\u4f9b\u5546\u8fde\u63a5\u94b1\u5305"),(0,l.kt)("p",null,"\u5537\uff0c\u90a3\u662f\u4e00\u5806\u8bbe\u7f6e\uff01\u73b0\u5728\u60a8\u53ef\u4ee5\u770b\u5230\u4e0e\u94b1\u5305\u4ea4\u4e92\u662f\u591a\u4e48\u5bb9\u6613\u3002\u6211\u4eec\u6240\u8981\u505a\u7684\u5c31\u662f\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"components/AppBar.tsx")," \u4e2d\u8bbe\u7f6e\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"React hook"),"\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"import { FC } from 'react'\nimport styles from '../styles/Home.module.css'\nimport Image from 'next/image'\nimport { WalletMultiButton } from '@solana/wallet-adapter-react-ui'\n\nexport const AppBar: FC = () => {\n return (\n
\n \n Wallet-Adapter Example\n \n
\n )\n}\n")),(0,l.kt)("p",null,"\u633a\u7b80\u5355\u7684\uff0c\u662f\u5427\uff1f ",(0,l.kt)("inlineCode",{parentName:"p"},"WalletMultiButton")," \u4e3a\u6211\u4eec\u505a\u4e86\u5f88\u591a\u9b54\u6cd5\uff0c\u5904\u7406\u4e86\u6240\u6709\u7684\u8fde\u63a5\u7ec6\u8282\u3002\u5982\u679c\u4f60\u73b0\u5728\u5f3a\u5236\u5237\u65b0\u5e94\u7528\u7a0b\u5e8f\uff0c\u4f60\u5e94\u8be5\u80fd\u770b\u5230\u4e00\u4e2a\u6f02\u4eae\u7684\u7d2b\u8272\u6309\u94ae\u5728\u53f3\u4e0a\u89d2\uff01"))}u.isMDXComponent=!0},761:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upload_1-acf26f5a4b8304459f73d073ed17046c.png"},6012:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upload_2-64e28b9a44f062c9c84f19e48f89293a.png"},5546:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/wallets-4a4cdbca763c8954cbe5ae22c036e84b.png"}}]); \ No newline at end of file diff --git a/assets/js/38dec77c.4ebbe698.js b/assets/js/38dec77c.4ebbe698.js deleted file mode 100644 index 87fe9bbee..000000000 --- a/assets/js/38dec77c.4ebbe698.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7549],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>h});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(t),d=r,h=u["".concat(s,".").concat(d)]||u[d]||m[d]||i;return t?a.createElement(h,o(o({ref:n},c),{},{components:t})):a.createElement(h,o({ref:n},c))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[u]="string"==typeof e?e:r,o[1]=l;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=t(7462),r=(t(7294),t(3905));const i={sidebar_position:21,sidebar_label:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",sidebar_class_name:"green"},o="\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",l={unversionedId:"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README",id:"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README",title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u7528\u8d77\u6765\u5427\uff01\u4e3a\u4e86\u5c06\u6240\u6709\u5185\u5bb9\u6574\u5408\u5728\u4e00\u8d77\uff0c\u6211\u4eec\u5c06\u6784\u5efa\u4e00\u4e2a\u57fa\u4e8e\u533a\u5757\u94fe\u7684\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u2014\u2014\u5b83\u5c06\u5141\u8bb8\u4efb\u4f55\u4eba\u63d0\u4ea4\u4ed6\u4eec\u6700\u559c\u6b22\u7684\u7535\u5f71\u7684\u8bc4\u8bba\uff0c\u6709\u70b9\u7c7b\u4f3c\u4e8e\u70c2\u756a\u8304\u7f51\u7ad9\u3002",source:"@site/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README.md",sourceDirName:"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app",slug:"/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README.md",tags:[],version:"current",sidebarPosition:21,frontMatter:{sidebar_position:21,sidebar_label:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/"},next:{title:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/"}},s={},p=[{value:"\ud83d\uddfa \u5b9a\u4e49\u67b6\u6784",id:"-\u5b9a\u4e49\u67b6\u6784",level:2},{value:"\ud83c\udf2d \u521b\u5efaserialize\u65b9\u6cd5",id:"-\u521b\u5efaserialize\u65b9\u6cd5",level:2},{value:"\ud83e\udd1d \u7528\u6570\u636e\u521b\u5efa\u4ea4\u6613",id:"-\u7528\u6570\u636e\u521b\u5efa\u4ea4\u6613",level:2},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2},{value:"\u8d77\u59cb\u4ee3\u7801",id:"\u8d77\u59cb\u4ee3\u7801",level:3}],c={toc:p},u="wrapper";function m(e){let{components:n,...i}=e;return(0,r.kt)(u,(0,a.Z)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528"},"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u7528\u8d77\u6765\u5427\uff01\u4e3a\u4e86\u5c06\u6240\u6709\u5185\u5bb9\u6574\u5408\u5728\u4e00\u8d77\uff0c\u6211\u4eec\u5c06\u6784\u5efa\u4e00\u4e2a\u57fa\u4e8e\u533a\u5757\u94fe\u7684\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u2014\u2014\u5b83\u5c06\u5141\u8bb8\u4efb\u4f55\u4eba\u63d0\u4ea4\u4ed6\u4eec\u6700\u559c\u6b22\u7684\u7535\u5f71\u7684\u8bc4\u8bba\uff0c\u6709\u70b9\u7c7b\u4f3c\u4e8e\u70c2\u756a\u8304\u7f51\u7ad9\u3002"),(0,r.kt)("p",null,"\u5728\u4f60\u7684Solana\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u8bbe\u7f6e\u8d77\u59cb\u4ee3\u7801"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-movie-frontend.git\ncd solana-movie-frontend\ngit checkout starter\nnpm i\n")),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u60a8\u5e94\u8be5\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u4e0a\u770b\u5230\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(3655).Z,width:"1117",height:"849"})),(0,r.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u666e\u901a\u7684 Next.js \u5e94\u7528\u7a0b\u5e8f\uff0c\u5b89\u88c5\u4e86\u4e00\u4e9b\u6a21\u677f\u7ec4\u4ef6\u548c\u4e00\u4e9b Solana \u4f9d\u8d56\u9879\uff0c\u4ee5\u5e2e\u52a9\u60a8\u8282\u7701\u65f6\u95f4\u3002\u90a3\u91cc\u6709\u4e00\u4e9b\u6a21\u62df\u8bc4\u8bba\uff0c\u8bf7\u67e5\u770b\u5404\u4e2a\u7ec4\u4ef6\u4ee5\u611f\u53d7\u8be5\u5e94\u7528\u7a0b\u5e8f\u3002"),(0,r.kt)("p",null,"\u60a8\u4f1a\u6ce8\u610f\u5230\u6211\u4eec\u5df2\u5c06\u94b1\u5305\u4e0a\u4e0b\u6587\u63d0\u4f9b\u7a0b\u5e8f\u4ece ",(0,r.kt)("inlineCode",{parentName:"p"},"_app.tsx")," \u79fb\u81f3\u5176\u81ea\u5df1\u7684\u7ec4\u4ef6\u3002\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e00\u6837\u7684\uff0c\u53ea\u662f\u5c06\u5176\u4e0e\u66f4\u5927\u7684\u5e94\u7528\u7a0b\u5e8f\u5206\u5f00\uff0c\u6027\u80fd\u66f4\u9ad8\u3002\u5e94\u7528\u7a0b\u5e8f\u73b0\u5728\u6240\u505a\u7684\u5c31\u662f\u5c06\u60a8\u7684\u8bc4\u8bba\u8bb0\u5f55\u5230\u63a7\u5236\u53f0\u4e2d\uff0c\u6211\u4eec\u5c06\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"Form.tsx")," \u4e2d\u8bbe\u7f6e ",(0,r.kt)("inlineCode",{parentName:"p"},"handleTransactionSubmit")," \u51fd\u6570\u3002\u6211\u4eec\u8d70\u5427\u545c\u545c\u545c\u545c"),(0,r.kt)("h2",{id:"-\u5b9a\u4e49\u67b6\u6784"},"\ud83d\uddfa \u5b9a\u4e49\u67b6\u6784"),(0,r.kt)("p",null,"\u5e8f\u5217\u5316\u7684\u7b2c\u4e00\u6b65\u662f\u4e3a\u6211\u4eec\u8981\u5e8f\u5217\u5316\u7684\u6570\u636e\u521b\u5efa\u4e00\u4e2a\u6a21\u5f0f/\u6620\u5c04\u3002\u6211\u4eec\u9700\u8981\u544a\u8bc9Borsh\u6570\u636e\u5c06\u88ab\u79f0\u4e3a\u4ec0\u4e48\u4ee5\u53ca\u6bcf\u4e2a\u9879\u76ee\u7684\u5927\u5c0f\u3002"),(0,r.kt)("p",null,"\u9996\u5148\u5b89\u88c5 ",(0,r.kt)("inlineCode",{parentName:"p"},"borsh")," \uff0c\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @project-serum/borsh --force\n")),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\u524d\u5f80 ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie.ts")," \u5bfc\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"borsh")," \u5e76\u5728 Movie \u7c7b\u4e2d\u6dfb\u52a0\u67b6\u6784\uff08\u4e0d\u8981\u590d\u5236\u7c98\u8d34\u6b64\u5185\u5bb9\uff09\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// We're importing borsh\nimport * as borsh from '@project-serum/borsh'\n\nexport class Movie {\n title: string;\n rating: number;\n description: string;\n\n // The constructor and the mocks will remain the same\n constructor(title: string, rating: number, description: string) {}\n static mocks: Movie[] = []\n\n // Here's our schema!\n borshInstructionSchema = borsh.struct([\n borsh.u8('variant'),\n borsh.str('title'),\n borsh.u8('rating'),\n borsh.str('description'),\n ])\n\n}\n")),(0,r.kt)("p",null,"\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u671f\u671b\u6307\u4ee4\u6570\u636e\u5305\u542b\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li"},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"variant")," \u4f5c\u4e3a\u65e0\u7b26\u53f7\u7684 8 \u4f4d\u6574\u6570\uff0c\u8868\u793a\u5e94\u6267\u884c\u54ea\u6761\u6307\u4ee4\uff08\u6362\u53e5\u8bdd\u8bf4\uff0c\u5e94\u8c03\u7528\u7a0b\u5e8f\u4e0a\u7684\u54ea\u4e2a\u51fd\u6570\uff09\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"title")," \u4f5c\u4e3a\u8868\u793a\u60a8\u6b63\u5728\u67e5\u770b\u7684\u7535\u5f71\u6807\u9898\u7684\u5b57\u7b26\u4e32\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"rating")," \u4f5c\u4e3a\u65e0\u7b26\u53f7 8 \u4f4d\u6574\u6570\uff0c\u8868\u793a\u60a8\u5bf9\u6b63\u5728\u8bc4\u8bba\u7684\u7535\u5f71\u7684\u8bc4\u5206\uff08\u6ee1\u5206 5 \u5206\uff09\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:4},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"description")," \u4f5c\u4e3a\u4e00\u4e2a\u5b57\u7b26\u4e32\uff0c\u8868\u793a\u60a8\u4e3a\u7535\u5f71\u7559\u4e0b\u7684\u8bc4\u8bba\u7684\u4e66\u9762\u90e8\u5206\u3002")))),(0,r.kt)("p",null,"\u6a21\u5f0f\u9700\u8981\u4e0e\u7a0b\u5e8f\u671f\u671b\u7684\u5339\u914d - \u5305\u62ec\u7ed3\u6784\u4e2d\u9879\u76ee\u7684\u987a\u5e8f\u3002\u5f53\u7a0b\u5e8f\u8bfb\u53d6\u60a8\u7684\u6570\u636e\u65f6\uff0c\u5b83\u5c06\u6309\u7167\u5b9a\u4e49\u7684\u987a\u5e8f\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\uff0c\u5982\u679c\u60a8\u7684\u987a\u5e8f\u4e0d\u540c\uff0c\u5b83\u521b\u5efa\u7684\u6570\u636e\u5c06\u65e0\u6548\u3002\u7531\u4e8e\u6211\u4eec\u6b63\u5728\u4f7f\u7528\u5df2\u90e8\u7f72\u7684\u7a0b\u5e8f\uff0c\u6211\u5df2\u7ecf\u7ed9\u60a8\u63d0\u4f9b\u4e86\u6a21\u5f0f\u3002\u901a\u5e38\uff0c\u60a8\u4f1a\u9605\u8bfb\u6587\u6863\u6216\u81ea\u5df1\u67e5\u770b\u7a0b\u5e8f\u4ee3\u7801\uff01"),(0,r.kt)("h2",{id:"-\u521b\u5efaserialize\u65b9\u6cd5"},"\ud83c\udf2d \u521b\u5efaserialize\u65b9\u6cd5"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u77e5\u9053\u6570\u636e\u662f\u4ec0\u4e48\u6837\u5b50\uff0c\u6211\u4eec\u9700\u8981\u7f16\u5199\u5c06\u5176\u5e8f\u5217\u5316\u7684\u65b9\u6cd5\u3002\u5c06\u5176\u6dfb\u52a0\u5230 Movie \u7c7b\u4e2d\u67b6\u6784\u7684\u6b63\u4e0b\u65b9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"serialize(): Buffer {\n const buffer = Buffer.alloc(1000)\n this.borshInstructionSchema.encode({ ...this, variant: 0 }, buffer)\n return buffer.slice(0, this.borshInstructionSchema.getSpan(buffer))\n}\n")),(0,r.kt)("p",null,"\u9996\u5148\uff0c\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u8d85\u5927\u7f13\u51b2\u533a - \u8fd9\u4e2a\u7f13\u51b2\u533a\u4e3a 1000 \u5b57\u8282\u3002\u4e3a\u4ec0\u4e48\u662f 1000 \u5b57\u8282\uff1f\u56e0\u4e3a\u6211\u77e5\u9053\u5b83\u8db3\u4ee5\u5bb9\u7eb3\u6211\u60f3\u8981\u7684\u6240\u6709\u4e1c\u897f\uff0c\u5e76\u5728\u6700\u540e\u7559\u4e0b\u989d\u5916\u7684\u7a7a\u95f4\u3002"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u4f7f\u7528\u521b\u5efa\u7684\u6a21\u5f0f\u5bf9\u6570\u636e\u8fdb\u884c\u7f16\u7801\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"encode")," \u63a5\u53d7\u4e24\u4e2a\u503c - \u6211\u4eec\u60f3\u8981\u7f16\u7801\u7684\u6570\u636e\u4ee5\u53ca\u6211\u4eec\u60f3\u8981\u5b58\u50a8\u5b83\u7684\u4f4d\u7f6e\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"this")," \u6307\u7684\u662f\u6211\u4eec\u6240\u5728\u7684\u5f53\u524d\u5bf9\u8c61 - \u56e0\u6b64\u6211\u4eec\u89e3\u6784\u7535\u5f71\u5bf9\u8c61\u5e76\u5c06\u5176\u4e0e ",(0,r.kt)("inlineCode",{parentName:"p"},"...this")," \u4e00\u8d77\u4f20\u9012\uff0c\u5c31\u50cf\u4f20\u9012 ",(0,r.kt)("inlineCode",{parentName:"p"},"{ title, rating, description, variant }")," \u4e00\u6837\u3002"),(0,r.kt)("p",null,"\u6700\u540e - \u6211\u4eec\u5220\u9664\u7f13\u51b2\u533a\u4e2d\u7684\u989d\u5916\u7a7a\u95f4\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"getSpan")," \u6709\u70b9\u50cf ",(0,r.kt)("inlineCode",{parentName:"p"},"array.length")," - \u5b83\u6839\u636e\u6a21\u5f0f\u4e3a\u6211\u4eec\u63d0\u4f9b\u7f13\u51b2\u533a\u4e2d\u6700\u540e\u4f7f\u7528\u7684\u9879\u76ee\u7684\u7d22\u5f15\uff0c\u56e0\u6b64\u6211\u4eec\u7684\u7f13\u51b2\u533a\u53ea\u5305\u542b\u6211\u4eec\u9700\u8981\u7684\u6570\u636e\uff0c\u800c\u4e0d\u5305\u542b\u5176\u4ed6\u6570\u636e\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u6211\u7684\u6700\u7ec8 ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie.ts")," \u7684\u6837\u5b50\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"import * as borsh from '@project-serum/borsh'\n\nexport class Movie {\n title: string;\n rating: number;\n description: string;\n\n constructor(title: string, rating: number, description: string) {\n this.title = title;\n this.rating = rating;\n this.description = description;\n }\n\n static mocks: Movie[] = [\n new Movie('The Shawshank Redemption', 5, `For a movie shot entirely in prison where there is no hope at all, Shawshank redemption's main message and purpose is to remind us of hope, that even in the darkest places hope exists, and only needs someone to find it. Combine this message with a brilliant screenplay, lovely characters, and Martin freeman, and you get a movie that can teach you a lesson every time you watch it. An all-time Classic!!!`),\n new Movie('The Godfather', 5, `One of Hollywood's greatest critical and commercial successes, The Godfather gets everything right; not only did the movie transcend expectations, it established new benchmarks for American cinema.`),\n new Movie('The Godfather: Part II', 4, `The Godfather: Part II is a continuation of the saga of the late Italian-American crime boss, Francis Ford Coppola, and his son, Vito Corleone. The story follows the continuing saga of the Corleone family as they attempt to successfully start a new life for themselves after years of crime and corruption.`),\n new Movie('The Dark Knight', 5, `The Dark Knight is a 2008 superhero film directed, produced, and co-written by Christopher Nolan. Batman, in his darkest hour, faces his greatest challenge yet: he must become the symbol of the opposite of the Batmanian order, the League of Shadows.`),\n ]\n\n borshInstructionSchema = borsh.struct([\n borsh.u8('variant'),\n borsh.str('title'),\n borsh.u8('rating'),\n borsh.str('description'),\n ])\n\n serialize(): Buffer {\n const buffer = Buffer.alloc(1000)\n this.borshInstructionSchema.encode({ ...this, variant: 0 }, buffer)\n return buffer.slice(0, this.borshInstructionSchema.getSpan(buffer))\n }\n}\n")),(0,r.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\uff01\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u5e8f\u5217\u5316\u90e8\u5206\u3002\u6765\u56de\u987e\u4e00\u4e0b\u51e0\u90e8\u7535\u5f71\u5427\ud83c\udf7f"),(0,r.kt)("h2",{id:"-\u7528\u6570\u636e\u521b\u5efa\u4ea4\u6613"},"\ud83e\udd1d \u7528\u6570\u636e\u521b\u5efa\u4ea4\u6613"),(0,r.kt)("p",null,"\u62fc\u56fe\u7684\u6700\u540e\u4e00\u5757\u5c31\u662f\u83b7\u53d6\u7528\u6237\u7684\u6570\u636e\uff0c\u4f7f\u7528\u6211\u4eec\u521a\u521a\u521b\u5efa\u7684\u65b9\u6cd5\u8fdb\u884c\u5e8f\u5217\u5316\uff0c\u5e76\u7528\u5b83\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\u3002"),(0,r.kt)("p",null,"\u9996\u5148\u66f4\u65b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"Form.tsx")," \u4e2d\u7684\u5bfc\u5165\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-tsx"},"import { FC } from 'react'\nimport { Movie } from '../models/Movie'\nimport { useState } from 'react'\nimport { Box, Button, FormControl, FormLabel, Input, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, Textarea } from '@chakra-ui/react'\nimport * as web3 from '@solana/web3.js'\nimport { useConnection, useWallet } from '@solana/wallet-adapter-react'\n")),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"handleSubmit")," \u51fd\u6570\u4e4b\u524d\u5efa\u7acb RPC \u8fde\u63a5\u5e76\u83b7\u53d6\u94b1\u5305\u8be6\u7ec6\u4fe1\u606f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-tsx"},"const { connection } = useConnection();\nconst { publicKey, sendTransaction } = useWallet();\n")),(0,r.kt)("p",null,"\u73b0\u5728\u662f\u91cd\u70b9\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"handleTransactionSubmit")," \u51fd\u6570\u3002\u9664\u4e86\u5e8f\u5217\u5316\u4f4d\u4e4b\u5916\uff0c\u8fd9\u5bf9\u4e8e\u60a8\u4e4b\u524d\u7684\u4ea4\u6613\u770b\u8d77\u6765\u975e\u5e38\u719f\u6089\uff1a\u8fdb\u884c\u4ea4\u6613\u3001\u5236\u5b9a\u6307\u4ee4\u3001\u63d0\u4ea4\u4ea4\u6613\u3002"),(0,r.kt)("p",null,"\u524d\u534a\u90e8\u5206\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-tsx"},"const handleTransactionSubmit = async (movie: Movie) => {\n if (!publicKey) {\n alert('Please connect your wallet!')\n return\n }\n\n const buffer = movie.serialize()\n const transaction = new web3.Transaction()\n\n const [pda] = await web3.PublicKey.findProgramAddress(\n [publicKey.toBuffer(), new TextEncoder().encode(movie.title)],\n new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)\n )\n}\n")),(0,r.kt)("p",null,"\u9664\u4e86 ",(0,r.kt)("inlineCode",{parentName:"p"},"pda")," \u4e4b\u5916\uff0c\u4f60\u5e94\u8be5\u90fd\u80fd\u8ba4\u8bc6\u5230\u8fd9\u4e9b\u3002\u56de\u60f3\u4e00\u4e0b\u6307\u4ee4\u7684\u8981\u6c42\u3002\u5b83\u9700\u8981\u4e0e\u4e4b\u4ea4\u4e92\u7684\u7a0b\u5e8fID\uff0c\u53ef\u9009\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u5b83\u5c06\u4ece\u4e2d\u8bfb\u53d6\u6216\u5199\u5165\u7684\u8d26\u6237\u5217\u8868\u3002\u7531\u4e8e\u6211\u4eec\u8981\u5c06\u6570\u636e\u63d0\u4ea4\u5230\u7f51\u7edc\u4e0a\u8fdb\u884c\u5b58\u50a8\uff0c\u5c06\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d26\u6237\u6765\u5b58\u50a8\u5b83\uff08\u8bb0\u4f4f\u300a\u6d77\u7ef5\u5b9d\u5b9d\u300b\u4e2d\u7684Patrick - \u7a0b\u5e8f\u662f\u65e0\u72b6\u6001\u7684\uff0c\u4e00\u5207\u90fd\u5728\u8d26\u6237\u4e2d\uff09\u3002"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"Patrick"),"\u5728\u63d0\u5230PDA\uff08\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\uff09\uff01\u8fd9\u662f\u4e00\u4e2a\u7528\u6765\u5b58\u50a8\u6211\u4eec\u7535\u5f71\u8bc4\u8bba\u7684\u8d26\u6237\u3002\u4f60\u53ef\u80fd\u4f1a\u5f00\u59cb\u6ce8\u610f\u5230\uff0c\u6211\u4eec\u9047\u5230\u4e86\u7ecf\u5178\u7684\u201c\u5148\u6709\u9e21\u8fd8\u662f\u5148\u6709\u86cb\u201d\u7684\u60c5\u51b5..."),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7533).Z,width:"419",height:"388"})),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u77e5\u9053\u5e10\u6237\u5730\u5740\u624d\u80fd\u8fdb\u884c\u6709\u6548\u4ea4\u6613\uff0c\u5e76\u4e14\u9700\u8981\u5904\u7406\u4ea4\u6613\u624d\u80fd\u521b\u5efa\u5e10\u6237\u3002\u89e3\u51b3\u65b9\u6848\uff1f\u4e00\u4e2a\u7406\u8bba\u86cb\u3002\u5982\u679c\u4ea4\u6613\u521b\u5efa\u8005\u548c\u7a0b\u5e8f\u90fd\u4f7f\u7528\u76f8\u540c\u7684\u8fc7\u7a0b\u6765\u9009\u62e9\u5730\u5740\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4ea4\u6613\u5904\u7406\u4e4b\u524d\u5bfc\u51fa\u5730\u5740\u3002"),(0,r.kt)("p",null,"\u8fd9\u5c31\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"web3.PublicKey.findProgramAddress")," \u65b9\u6cd5\u6b63\u5728\u505a\u7684\u4e8b\u60c5\u3002\u5b83\u63a5\u53d7\u4e24\u4e2a\u53d8\u91cf\uff1a\u79cd\u5b50\u548c\u751f\u6210\u79cd\u5b50\u7684\u7a0b\u5e8f\uff08\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\uff09\u3002\u5728\u6211\u4eec\u7684\u4f8b\u5b50\u4e2d\uff0c\u79cd\u5b50\u662f\u53d1\u4ef6\u4eba\u7684\u5730\u5740\u548c\u7535\u5f71\u7684\u6807\u9898\u3002\u901a\u8fc7\u8fd9\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff0c\u6211\u544a\u8bc9\u60a8\u79cd\u5b50\u8981\u6c42\uff0c\u901a\u5e38\u60a8\u8981\u4e48\u9605\u8bfb\u6587\u6863\uff0c\u67e5\u770b\u7a0b\u5e8f\u4ee3\u7801\uff0c\u8981\u4e48\u5bf9\u5176\u8fdb\u884c\u9006\u5411\u5de5\u7a0b\u3002"),(0,r.kt)("p",null,"\u8981\u5b8c\u6210 ",(0,r.kt)("inlineCode",{parentName:"p"},"handleTransactionSubmit")," \u529f\u80fd\uff0c\u60a8\u6240\u9700\u8981\u505a\u7684\u5c31\u662f\u521b\u5efa\u4e00\u6761\u6307\u4ee4\u5e76\u53d1\u9001\u5b83\uff0c\u4ee5\u4e0b\u662f\u5b8c\u6574\u4ee3\u7801\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-tsx"},"const handleTransactionSubmit = async (movie: Movie) => {\n if (!publicKey) {\n alert('Please connect your wallet!')\n return\n }\n\n const buffer = movie.serialize()\n const transaction = new web3.Transaction()\n\n const [pda] = await web3.PublicKey.findProgramAddress(\n [publicKey.toBuffer(), new TextEncoder().encode(movie.title)],\n new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)\n )\n\n const instruction = new web3.TransactionInstruction({\n keys: [\n {\n // Your account will pay the fees, so it's writing to the network\n pubkey: publicKey,\n isSigner: true,\n isWritable: false,\n },\n {\n // The PDA will store the movie review\n pubkey: pda,\n isSigner: false,\n isWritable: true\n },\n {\n // The system program will be used for creating the PDA\n pubkey: web3.SystemProgram.programId,\n isSigner: false,\n isWritable: false\n }\n ],\n // Here's the most important part!\n data: buffer,\n programId: new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)\n })\n\n transaction.add(instruction)\n\n try {\n let txid = await sendTransaction(transaction, connection)\n console.log(`Transaction submitted: https://explorer.solana.com/tx/${txid}?cluster=devnet`)\n } catch (e) {\n alert(JSON.stringify(e))\n }\n }\n")),(0,r.kt)("p",null,"\u4ed4\u7ec6\u9605\u8bfb\u4ee3\u7801\u6ce8\u91ca\uff0c\u6211\u4f1a\u89e3\u91ca\u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981\u6307\u4ee4\u952e\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5730\u5740\u3002"),(0,r.kt)("p",null,"\u5c31\u8fd9\u6837\u4e86\uff01\u786e\u4fdd\u4f60\u7684\u94b1\u5305\u5728\u5f00\u53d1\u7f51\u7edc\u4e0a\uff0c\u5e76\u4e14\u4f60\u6709\u5f00\u53d1\u7f51\u7edc\u7684SOL\uff0c\u7136\u540e\u524d\u5f80 ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u3002\u63d0\u4ea4\u8bc4\u8bba\u5e76\u8bbf\u95ee\u63a7\u5236\u53f0\u4e2d\u8bb0\u5f55\u7684\u6d4f\u89c8\u5668\u94fe\u63a5\u3002\u5411\u4e0b\u6eda\u52a8\u5230\u5e95\uff0c\u4f60\u4f1a\u770b\u5230\u4f60\u7684\u7535\u5f71\u540d\u79f0\u4ee5\u53ca\u5176\u4ed6\u4e00\u4e9b\u5185\u5bb9\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(6288).Z,width:"1181",height:"520"})),(0,r.kt)("p",null,"\u54c7\u3002\u60a8\u521a\u521a\u5c06\u81ea\u5b9a\u4e49\u6570\u636e\u5199\u5165 Solana \u7f51\u7edc\u3002"),(0,r.kt)("p",null,"\u7ed9\u81ea\u5df1\u4e00\u4e2a\u9f13\u52b1\uff0c\u8fd9\u53ef\u4e0d\u662f\u7b80\u5355\u7684\u4e8b\u60c5\uff01\u5230\u8fd9\u4e2a\u9636\u6bb5\uff0c\u53ef\u80fd\u6709\u4e9b\u4eba\u5df2\u7ecf\u9000\u51fa\u4e86\u8fd9\u4e2a\u9879\u76ee\uff0c\u7ed9\u4ed6\u4eec\u4e00\u4e9b\u52a8\u529b\uff0c\u5c55\u793a\u4e00\u4e0b\u4f60\u6240\u5efa\u7acb\u7684\u4e1c\u897f\uff01\u5982\u679c\u4f60\u5df2\u7ecf\u8d70\u5230\u8fd9\u4e00\u6b65\uff0c\u6211\u6beb\u4e0d\u6000\u7591\u4f60\u4f1a\u4e00\u76f4\u575a\u6301\u5230\u6700\u540e :)"),(0,r.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,r.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u5927\u8111\u591a\u6298\u51e0\u9053\u76b1\u7eb9\u4e86 \ud83e\udde0"),(0,r.kt)("p",null,"\u7ee7\u7eed\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff0c\u8ba9 Solana Core \u4e2d\u7684\u6784\u5efa\u8005\u8fdb\u884c\u81ea\u6211\u4ecb\u7ecd\uff01\u6211\u4eec\u5c06\u5728\u8fd9\u4e2a\u5730\u5740 ",(0,r.kt)("inlineCode",{parentName:"p"},"HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf")," \u5904\u4f7f\u7528 Solana \u7a0b\u5e8f\u3002\u5b83\u6700\u7ec8\u770b\u8d77\u6765\u4e0e\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u7a0b\u5e8f\u7c7b\u4f3c\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(4637).Z,width:"1451",height:"1039"})),(0,r.kt)("h3",{id:"\u8d77\u59cb\u4ee3\u7801"},"\u8d77\u59cb\u4ee3\u7801"),(0,r.kt)("p",null,"\u60a8\u53ef\u4ee5\u8bbe\u7f6e\u4f7f\u7528"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-student-intros-frontend\ncd solana-student-intros-frontend\ngit checkout starter\nnpm i\n")),(0,r.kt)("p",null,"\u63d0\u793a\uff1a\n\u7a0b\u5e8f\u671f\u671b\u6307\u4ee4\u6570\u636e\u6309\u987a\u5e8f\u5305\u542b\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li"},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"variant")," \u4f5c\u4e3a\u65e0\u7b26\u53f7 8 \u4f4d\u6574\u6570\uff0c\u8868\u793a\u8981\u8c03\u7528\u7684\u6307\u4ee4\uff08\u5728\u672c\u4f8b\u4e2d\u5e94\u4e3a 0\uff09"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"name")," \u4f5c\u4e3a\u5b57\u7b26\u4e32"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"message")," \u4f5c\u4e3a\u5b57\u7b26\u4e32")))),(0,r.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u8be5\u7a0b\u5e8f\u4f7f\u7528\u8fde\u63a5\u94b1\u5305\u7684\u516c\u94a5\uff08\u800c\u4e0d\u662f\u5176\u4ed6\u4efb\u4f55\u4fe1\u606f\uff09\u6765\u751f\u6210\u6bcf\u4e2a\u5b66\u751f\u4ecb\u7ecd\u8d26\u6237\u3002\u8fd9\u610f\u5473\u7740\u6bcf\u4e2a\u516c\u94a5\u53ea\u80fd\u521d\u59cb\u5316\u4e00\u4e2a\u5b66\u751f\u4ecb\u7ecd\u8d26\u6237\uff0c\u5982\u679c\u60a8\u4f7f\u7528\u76f8\u540c\u7684\u516c\u94a5\u63d0\u4ea4\u4e24\u6b21\uff0c\u4ea4\u6613\u5c06\u5931\u8d25\u3002"),(0,r.kt)("p",null,"\u4e0e\u5f80\u5e38\u4e00\u6837\uff0c\u9996\u5148\u5c1d\u8bd5\u72ec\u7acb\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u4f46\u5982\u679c\u60a8\u9677\u5165\u56f0\u5883\u6216\u53ea\u662f\u60f3\u5c06\u60a8\u7684\u89e3\u51b3\u65b9\u6848\u4e0e\u6211\u4eec\u7684\u89e3\u51b3\u65b9\u6848\u8fdb\u884c\u6bd4\u8f83\uff0c\u8bf7\u67e5\u770b",(0,r.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-student-intros-frontend/tree/solution-serialize-instruction-data"},"\u6b64\u5b58\u50a8\u5e93"),"\u4e2d\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"solution-serialize-instruction-data")," \u5206\u652f\u3002"))}m.isMDXComponent=!0},3655:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_1-06c79731d6f55e39d0f7df0489fe6802.png"},7533:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_2-184ef731e9eb7016e7fb8e682bf6b402.png"},6288:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_3-272a72038f399bf562fbfb242ed7a49a.png"},4637:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_4-c947e6536e70d9332ee428f1732604f0.png"}}]); \ No newline at end of file diff --git a/assets/js/38dec77c.66b3a97d.js b/assets/js/38dec77c.66b3a97d.js new file mode 100644 index 000000000..77679625d --- /dev/null +++ b/assets/js/38dec77c.66b3a97d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7549],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>h});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(t),d=r,h=u["".concat(s,".").concat(d)]||u[d]||m[d]||i;return t?a.createElement(h,o(o({ref:n},c),{},{components:t})):a.createElement(h,o({ref:n},c))}));function h(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[u]="string"==typeof e?e:r,o[1]=l;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=t(7462),r=(t(7294),t(3905));const i={sidebar_position:21,sidebar_label:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",sidebar_class_name:"green"},o="\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",l={unversionedId:"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README",id:"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README",title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u7528\u8d77\u6765\u5427\uff01\u4e3a\u4e86\u5c06\u6240\u6709\u5185\u5bb9\u6574\u5408\u5728\u4e00\u8d77\uff0c\u6211\u4eec\u5c06\u6784\u5efa\u4e00\u4e2a\u57fa\u4e8e\u533a\u5757\u94fe\u7684\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u2014\u2014\u5b83\u5c06\u5141\u8bb8\u4efb\u4f55\u4eba\u63d0\u4ea4\u4ed6\u4eec\u6700\u559c\u6b22\u7684\u7535\u5f71\u7684\u8bc4\u8bba\uff0c\u6709\u70b9\u7c7b\u4f3c\u4e8e\u70c2\u756a\u8304\u7f51\u7ad9\u3002",source:"@site/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README.md",sourceDirName:"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app",slug:"/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README.md",tags:[],version:"current",sidebarPosition:21,frontMatter:{sidebar_position:21,sidebar_label:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/"},next:{title:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/"}},s={},p=[{value:"\ud83d\uddfa \u5b9a\u4e49\u67b6\u6784",id:"-\u5b9a\u4e49\u67b6\u6784",level:2},{value:"\ud83c\udf2d \u521b\u5efaserialize\u65b9\u6cd5",id:"-\u521b\u5efaserialize\u65b9\u6cd5",level:2},{value:"\ud83e\udd1d \u7528\u6570\u636e\u521b\u5efa\u4ea4\u6613",id:"-\u7528\u6570\u636e\u521b\u5efa\u4ea4\u6613",level:2},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2},{value:"\u8d77\u59cb\u4ee3\u7801",id:"\u8d77\u59cb\u4ee3\u7801",level:3}],c={toc:p},u="wrapper";function m(e){let{components:n,...i}=e;return(0,r.kt)(u,(0,a.Z)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528"},"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u7528\u8d77\u6765\u5427\uff01\u4e3a\u4e86\u5c06\u6240\u6709\u5185\u5bb9\u6574\u5408\u5728\u4e00\u8d77\uff0c\u6211\u4eec\u5c06\u6784\u5efa\u4e00\u4e2a\u57fa\u4e8e\u533a\u5757\u94fe\u7684\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u2014\u2014\u5b83\u5c06\u5141\u8bb8\u4efb\u4f55\u4eba\u63d0\u4ea4\u4ed6\u4eec\u6700\u559c\u6b22\u7684\u7535\u5f71\u7684\u8bc4\u8bba\uff0c\u6709\u70b9\u7c7b\u4f3c\u4e8e\u70c2\u756a\u8304\u7f51\u7ad9\u3002"),(0,r.kt)("p",null,"\u5728\u4f60\u7684Solana\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u8bbe\u7f6e\u8d77\u59cb\u4ee3\u7801"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-movie-frontend.git\ncd solana-movie-frontend\ngit checkout starter\nnpm i\n")),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u60a8\u5e94\u8be5\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u4e0a\u770b\u5230\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(3655).Z,width:"1117",height:"849"})),(0,r.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u666e\u901a\u7684 Next.js \u5e94\u7528\u7a0b\u5e8f\uff0c\u5b89\u88c5\u4e86\u4e00\u4e9b\u6a21\u677f\u7ec4\u4ef6\u548c\u4e00\u4e9b Solana \u4f9d\u8d56\u9879\uff0c\u4ee5\u5e2e\u52a9\u60a8\u8282\u7701\u65f6\u95f4\u3002\u90a3\u91cc\u6709\u4e00\u4e9b\u6a21\u62df\u8bc4\u8bba\uff0c\u8bf7\u67e5\u770b\u5404\u4e2a\u7ec4\u4ef6\u4ee5\u611f\u53d7\u8be5\u5e94\u7528\u7a0b\u5e8f\u3002"),(0,r.kt)("p",null,"\u60a8\u4f1a\u6ce8\u610f\u5230\u6211\u4eec\u5df2\u5c06\u94b1\u5305\u4e0a\u4e0b\u6587\u63d0\u4f9b\u7a0b\u5e8f\u4ece ",(0,r.kt)("inlineCode",{parentName:"p"},"_app.tsx")," \u79fb\u81f3\u5176\u81ea\u5df1\u7684\u7ec4\u4ef6\u3002\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e00\u6837\u7684\uff0c\u53ea\u662f\u5c06\u5176\u4e0e\u66f4\u5927\u7684\u5e94\u7528\u7a0b\u5e8f\u5206\u5f00\uff0c\u6027\u80fd\u66f4\u9ad8\u3002\u5e94\u7528\u7a0b\u5e8f\u73b0\u5728\u6240\u505a\u7684\u5c31\u662f\u5c06\u60a8\u7684\u8bc4\u8bba\u8bb0\u5f55\u5230\u63a7\u5236\u53f0\u4e2d\uff0c\u6211\u4eec\u5c06\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"Form.tsx")," \u4e2d\u8bbe\u7f6e ",(0,r.kt)("inlineCode",{parentName:"p"},"handleTransactionSubmit")," \u51fd\u6570\u3002\u6211\u4eec\u8d70\u5427\u545c\u545c\u545c\u545c"),(0,r.kt)("h2",{id:"-\u5b9a\u4e49\u67b6\u6784"},"\ud83d\uddfa \u5b9a\u4e49\u67b6\u6784"),(0,r.kt)("p",null,"\u5e8f\u5217\u5316\u7684\u7b2c\u4e00\u6b65\u662f\u4e3a\u6211\u4eec\u8981\u5e8f\u5217\u5316\u7684\u6570\u636e\u521b\u5efa\u4e00\u4e2a\u6a21\u5f0f/\u6620\u5c04\u3002\u6211\u4eec\u9700\u8981\u544a\u8bc9Borsh\u6570\u636e\u5c06\u88ab\u79f0\u4e3a\u4ec0\u4e48\u4ee5\u53ca\u6bcf\u4e2a\u9879\u76ee\u7684\u5927\u5c0f\u3002"),(0,r.kt)("p",null,"\u9996\u5148\u5b89\u88c5 ",(0,r.kt)("inlineCode",{parentName:"p"},"borsh")," \uff0c\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm install @project-serum/borsh --force\n")),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\u524d\u5f80 ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie.ts")," \u5bfc\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"borsh")," \u5e76\u5728 Movie \u7c7b\u4e2d\u6dfb\u52a0\u67b6\u6784\uff08\u4e0d\u8981\u590d\u5236\u7c98\u8d34\u6b64\u5185\u5bb9\uff09\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// We're importing borsh\nimport * as borsh from '@project-serum/borsh'\n\nexport class Movie {\n title: string;\n rating: number;\n description: string;\n\n // The constructor and the mocks will remain the same\n constructor(title: string, rating: number, description: string) {}\n static mocks: Movie[] = []\n\n // Here's our schema!\n borshInstructionSchema = borsh.struct([\n borsh.u8('variant'),\n borsh.str('title'),\n borsh.u8('rating'),\n borsh.str('description'),\n ])\n\n}\n")),(0,r.kt)("p",null,"\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u671f\u671b\u6307\u4ee4\u6570\u636e\u5305\u542b\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li"},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"variant")," \u4f5c\u4e3a\u65e0\u7b26\u53f7\u7684 8 \u4f4d\u6574\u6570\uff0c\u8868\u793a\u5e94\u6267\u884c\u54ea\u6761\u6307\u4ee4\uff08\u6362\u53e5\u8bdd\u8bf4\uff0c\u5e94\u8c03\u7528\u7a0b\u5e8f\u4e0a\u7684\u54ea\u4e2a\u51fd\u6570\uff09\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"title")," \u4f5c\u4e3a\u8868\u793a\u60a8\u6b63\u5728\u67e5\u770b\u7684\u7535\u5f71\u6807\u9898\u7684\u5b57\u7b26\u4e32\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"rating")," \u4f5c\u4e3a\u65e0\u7b26\u53f7 8 \u4f4d\u6574\u6570\uff0c\u8868\u793a\u60a8\u5bf9\u6b63\u5728\u8bc4\u8bba\u7684\u7535\u5f71\u7684\u8bc4\u5206\uff08\u6ee1\u5206 5 \u5206\uff09\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:4},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"description")," \u4f5c\u4e3a\u4e00\u4e2a\u5b57\u7b26\u4e32\uff0c\u8868\u793a\u60a8\u4e3a\u7535\u5f71\u7559\u4e0b\u7684\u8bc4\u8bba\u7684\u4e66\u9762\u90e8\u5206\u3002")))),(0,r.kt)("p",null,"\u6a21\u5f0f\u9700\u8981\u4e0e\u7a0b\u5e8f\u671f\u671b\u7684\u5339\u914d - \u5305\u62ec\u7ed3\u6784\u4e2d\u9879\u76ee\u7684\u987a\u5e8f\u3002\u5f53\u7a0b\u5e8f\u8bfb\u53d6\u60a8\u7684\u6570\u636e\u65f6\uff0c\u5b83\u5c06\u6309\u7167\u5b9a\u4e49\u7684\u987a\u5e8f\u8fdb\u884c\u53cd\u5e8f\u5217\u5316\uff0c\u5982\u679c\u60a8\u7684\u987a\u5e8f\u4e0d\u540c\uff0c\u5b83\u521b\u5efa\u7684\u6570\u636e\u5c06\u65e0\u6548\u3002\u7531\u4e8e\u6211\u4eec\u6b63\u5728\u4f7f\u7528\u5df2\u90e8\u7f72\u7684\u7a0b\u5e8f\uff0c\u6211\u5df2\u7ecf\u7ed9\u60a8\u63d0\u4f9b\u4e86\u6a21\u5f0f\u3002\u901a\u5e38\uff0c\u60a8\u4f1a\u9605\u8bfb\u6587\u6863\u6216\u81ea\u5df1\u67e5\u770b\u7a0b\u5e8f\u4ee3\u7801\uff01"),(0,r.kt)("h2",{id:"-\u521b\u5efaserialize\u65b9\u6cd5"},"\ud83c\udf2d \u521b\u5efaserialize\u65b9\u6cd5"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u77e5\u9053\u6570\u636e\u662f\u4ec0\u4e48\u6837\u5b50\uff0c\u6211\u4eec\u9700\u8981\u7f16\u5199\u5c06\u5176\u5e8f\u5217\u5316\u7684\u65b9\u6cd5\u3002\u5c06\u5176\u6dfb\u52a0\u5230 Movie \u7c7b\u4e2d\u67b6\u6784\u7684\u6b63\u4e0b\u65b9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"serialize(): Buffer {\n const buffer = Buffer.alloc(1000)\n this.borshInstructionSchema.encode({ ...this, variant: 0 }, buffer)\n return buffer.slice(0, this.borshInstructionSchema.getSpan(buffer))\n}\n")),(0,r.kt)("p",null,"\u9996\u5148\uff0c\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u8d85\u5927\u7f13\u51b2\u533a - \u8fd9\u4e2a\u7f13\u51b2\u533a\u4e3a 1000 \u5b57\u8282\u3002\u4e3a\u4ec0\u4e48\u662f 1000 \u5b57\u8282\uff1f\u56e0\u4e3a\u6211\u77e5\u9053\u5b83\u8db3\u4ee5\u5bb9\u7eb3\u6211\u60f3\u8981\u7684\u6240\u6709\u4e1c\u897f\uff0c\u5e76\u5728\u6700\u540e\u7559\u4e0b\u989d\u5916\u7684\u7a7a\u95f4\u3002"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u4f7f\u7528\u521b\u5efa\u7684\u6a21\u5f0f\u5bf9\u6570\u636e\u8fdb\u884c\u7f16\u7801\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"encode")," \u63a5\u53d7\u4e24\u4e2a\u503c - \u6211\u4eec\u60f3\u8981\u7f16\u7801\u7684\u6570\u636e\u4ee5\u53ca\u6211\u4eec\u60f3\u8981\u5b58\u50a8\u5b83\u7684\u4f4d\u7f6e\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"this")," \u6307\u7684\u662f\u6211\u4eec\u6240\u5728\u7684\u5f53\u524d\u5bf9\u8c61 - \u56e0\u6b64\u6211\u4eec\u89e3\u6784\u7535\u5f71\u5bf9\u8c61\u5e76\u5c06\u5176\u4e0e ",(0,r.kt)("inlineCode",{parentName:"p"},"...this")," \u4e00\u8d77\u4f20\u9012\uff0c\u5c31\u50cf\u4f20\u9012 ",(0,r.kt)("inlineCode",{parentName:"p"},"{ title, rating, description, variant }")," \u4e00\u6837\u3002"),(0,r.kt)("p",null,"\u6700\u540e - \u6211\u4eec\u5220\u9664\u7f13\u51b2\u533a\u4e2d\u7684\u989d\u5916\u7a7a\u95f4\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"getSpan")," \u6709\u70b9\u50cf ",(0,r.kt)("inlineCode",{parentName:"p"},"array.length")," - \u5b83\u6839\u636e\u6a21\u5f0f\u4e3a\u6211\u4eec\u63d0\u4f9b\u7f13\u51b2\u533a\u4e2d\u6700\u540e\u4f7f\u7528\u7684\u9879\u76ee\u7684\u7d22\u5f15\uff0c\u56e0\u6b64\u6211\u4eec\u7684\u7f13\u51b2\u533a\u53ea\u5305\u542b\u6211\u4eec\u9700\u8981\u7684\u6570\u636e\uff0c\u800c\u4e0d\u5305\u542b\u5176\u4ed6\u6570\u636e\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u6211\u7684\u6700\u7ec8 ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie.ts")," \u7684\u6837\u5b50\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"import * as borsh from '@project-serum/borsh'\n\nexport class Movie {\n title: string;\n rating: number;\n description: string;\n\n constructor(title: string, rating: number, description: string) {\n this.title = title;\n this.rating = rating;\n this.description = description;\n }\n\n static mocks: Movie[] = [\n new Movie('The Shawshank Redemption', 5, `For a movie shot entirely in prison where there is no hope at all, Shawshank redemption's main message and purpose is to remind us of hope, that even in the darkest places hope exists, and only needs someone to find it. Combine this message with a brilliant screenplay, lovely characters, and Martin freeman, and you get a movie that can teach you a lesson every time you watch it. An all-time Classic!!!`),\n new Movie('The Godfather', 5, `One of Hollywood's greatest critical and commercial successes, The Godfather gets everything right; not only did the movie transcend expectations, it established new benchmarks for American cinema.`),\n new Movie('The Godfather: Part II', 4, `The Godfather: Part II is a continuation of the saga of the late Italian-American crime boss, Francis Ford Coppola, and his son, Vito Corleone. The story follows the continuing saga of the Corleone family as they attempt to successfully start a new life for themselves after years of crime and corruption.`),\n new Movie('The Dark Knight', 5, `The Dark Knight is a 2008 superhero film directed, produced, and co-written by Christopher Nolan. Batman, in his darkest hour, faces his greatest challenge yet: he must become the symbol of the opposite of the Batmanian order, the League of Shadows.`),\n ]\n\n borshInstructionSchema = borsh.struct([\n borsh.u8('variant'),\n borsh.str('title'),\n borsh.u8('rating'),\n borsh.str('description'),\n ])\n\n serialize(): Buffer {\n const buffer = Buffer.alloc(1000)\n this.borshInstructionSchema.encode({ ...this, variant: 0 }, buffer)\n return buffer.slice(0, this.borshInstructionSchema.getSpan(buffer))\n }\n}\n")),(0,r.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\uff01\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u5e8f\u5217\u5316\u90e8\u5206\u3002\u6765\u56de\u987e\u4e00\u4e0b\u51e0\u90e8\u7535\u5f71\u5427\ud83c\udf7f"),(0,r.kt)("h2",{id:"-\u7528\u6570\u636e\u521b\u5efa\u4ea4\u6613"},"\ud83e\udd1d \u7528\u6570\u636e\u521b\u5efa\u4ea4\u6613"),(0,r.kt)("p",null,"\u62fc\u56fe\u7684\u6700\u540e\u4e00\u5757\u5c31\u662f\u83b7\u53d6\u7528\u6237\u7684\u6570\u636e\uff0c\u4f7f\u7528\u6211\u4eec\u521a\u521a\u521b\u5efa\u7684\u65b9\u6cd5\u8fdb\u884c\u5e8f\u5217\u5316\uff0c\u5e76\u7528\u5b83\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\u3002"),(0,r.kt)("p",null,"\u9996\u5148\u66f4\u65b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"Form.tsx")," \u4e2d\u7684\u5bfc\u5165\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-tsx"},"import { FC } from 'react'\nimport { Movie } from '../models/Movie'\nimport { useState } from 'react'\nimport { Box, Button, FormControl, FormLabel, Input, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, Textarea } from '@chakra-ui/react'\nimport * as web3 from '@solana/web3.js'\nimport { useConnection, useWallet } from '@solana/wallet-adapter-react'\n")),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"handleSubmit")," \u51fd\u6570\u4e4b\u524d\u5efa\u7acb RPC \u8fde\u63a5\u5e76\u83b7\u53d6\u94b1\u5305\u8be6\u7ec6\u4fe1\u606f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-tsx"},"const { connection } = useConnection();\nconst { publicKey, sendTransaction } = useWallet();\n")),(0,r.kt)("p",null,"\u73b0\u5728\u662f\u91cd\u70b9\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"handleTransactionSubmit")," \u51fd\u6570\u3002\u9664\u4e86\u5e8f\u5217\u5316\u4f4d\u4e4b\u5916\uff0c\u8fd9\u5bf9\u4e8e\u60a8\u4e4b\u524d\u7684\u4ea4\u6613\u770b\u8d77\u6765\u975e\u5e38\u719f\u6089\uff1a\u8fdb\u884c\u4ea4\u6613\u3001\u5236\u5b9a\u6307\u4ee4\u3001\u63d0\u4ea4\u4ea4\u6613\u3002"),(0,r.kt)("p",null,"\u524d\u534a\u90e8\u5206\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-tsx"},"const handleTransactionSubmit = async (movie: Movie) => {\n if (!publicKey) {\n alert('Please connect your wallet!')\n return\n }\n\n const buffer = movie.serialize()\n const transaction = new web3.Transaction()\n\n const [pda] = await web3.PublicKey.findProgramAddress(\n [publicKey.toBuffer(), new TextEncoder().encode(movie.title)],\n new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)\n )\n}\n")),(0,r.kt)("p",null,"\u9664\u4e86 ",(0,r.kt)("inlineCode",{parentName:"p"},"pda")," \u4e4b\u5916\uff0c\u4f60\u5e94\u8be5\u90fd\u80fd\u8ba4\u8bc6\u5230\u8fd9\u4e9b\u3002\u56de\u60f3\u4e00\u4e0b\u6307\u4ee4\u7684\u8981\u6c42\u3002\u5b83\u9700\u8981\u4e0e\u4e4b\u4ea4\u4e92\u7684\u7a0b\u5e8fID\uff0c\u53ef\u9009\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u5b83\u5c06\u4ece\u4e2d\u8bfb\u53d6\u6216\u5199\u5165\u7684\u8d26\u6237\u5217\u8868\u3002\u7531\u4e8e\u6211\u4eec\u8981\u5c06\u6570\u636e\u63d0\u4ea4\u5230\u7f51\u7edc\u4e0a\u8fdb\u884c\u5b58\u50a8\uff0c\u5c06\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d26\u6237\u6765\u5b58\u50a8\u5b83\uff08\u8bb0\u4f4f\u300a\u6d77\u7ef5\u5b9d\u5b9d\u300b\u4e2d\u7684Patrick - \u7a0b\u5e8f\u662f\u65e0\u72b6\u6001\u7684\uff0c\u4e00\u5207\u90fd\u5728\u8d26\u6237\u4e2d\uff09\u3002"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"Patrick"),"\u5728\u63d0\u5230PDA\uff08\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\uff09\uff01\u8fd9\u662f\u4e00\u4e2a\u7528\u6765\u5b58\u50a8\u6211\u4eec\u7535\u5f71\u8bc4\u8bba\u7684\u8d26\u6237\u3002\u4f60\u53ef\u80fd\u4f1a\u5f00\u59cb\u6ce8\u610f\u5230\uff0c\u6211\u4eec\u9047\u5230\u4e86\u7ecf\u5178\u7684\u201c\u5148\u6709\u9e21\u8fd8\u662f\u5148\u6709\u86cb\u201d\u7684\u60c5\u51b5..."),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7533).Z,width:"419",height:"388"})),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u77e5\u9053\u5e10\u6237\u5730\u5740\u624d\u80fd\u8fdb\u884c\u6709\u6548\u4ea4\u6613\uff0c\u5e76\u4e14\u9700\u8981\u5904\u7406\u4ea4\u6613\u624d\u80fd\u521b\u5efa\u5e10\u6237\u3002\u89e3\u51b3\u65b9\u6848\uff1f\u4e00\u4e2a\u7406\u8bba\u86cb\u3002\u5982\u679c\u4ea4\u6613\u521b\u5efa\u8005\u548c\u7a0b\u5e8f\u90fd\u4f7f\u7528\u76f8\u540c\u7684\u8fc7\u7a0b\u6765\u9009\u62e9\u5730\u5740\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4ea4\u6613\u5904\u7406\u4e4b\u524d\u5bfc\u51fa\u5730\u5740\u3002"),(0,r.kt)("p",null,"\u8fd9\u5c31\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"web3.PublicKey.findProgramAddress")," \u65b9\u6cd5\u6b63\u5728\u505a\u7684\u4e8b\u60c5\u3002\u5b83\u63a5\u53d7\u4e24\u4e2a\u53d8\u91cf\uff1a\u79cd\u5b50\u548c\u751f\u6210\u79cd\u5b50\u7684\u7a0b\u5e8f\uff08\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\uff09\u3002\u5728\u6211\u4eec\u7684\u4f8b\u5b50\u4e2d\uff0c\u79cd\u5b50\u662f\u53d1\u4ef6\u4eba\u7684\u5730\u5740\u548c\u7535\u5f71\u7684\u6807\u9898\u3002\u901a\u8fc7\u8fd9\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff0c\u6211\u544a\u8bc9\u60a8\u79cd\u5b50\u8981\u6c42\uff0c\u901a\u5e38\u60a8\u8981\u4e48\u9605\u8bfb\u6587\u6863\uff0c\u67e5\u770b\u7a0b\u5e8f\u4ee3\u7801\uff0c\u8981\u4e48\u5bf9\u5176\u8fdb\u884c\u9006\u5411\u5de5\u7a0b\u3002"),(0,r.kt)("p",null,"\u8981\u5b8c\u6210 ",(0,r.kt)("inlineCode",{parentName:"p"},"handleTransactionSubmit")," \u529f\u80fd\uff0c\u60a8\u6240\u9700\u8981\u505a\u7684\u5c31\u662f\u521b\u5efa\u4e00\u6761\u6307\u4ee4\u5e76\u53d1\u9001\u5b83\uff0c\u4ee5\u4e0b\u662f\u5b8c\u6574\u4ee3\u7801\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-tsx"},"const handleTransactionSubmit = async (movie: Movie) => {\n if (!publicKey) {\n alert('Please connect your wallet!')\n return\n }\n\n const buffer = movie.serialize()\n const transaction = new web3.Transaction()\n\n const [pda] = await web3.PublicKey.findProgramAddress(\n [publicKey.toBuffer(), new TextEncoder().encode(movie.title)],\n new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)\n )\n\n const instruction = new web3.TransactionInstruction({\n keys: [\n {\n // Your account will pay the fees, so it's writing to the network\n pubkey: publicKey,\n isSigner: true,\n isWritable: false,\n },\n {\n // The PDA will store the movie review\n pubkey: pda,\n isSigner: false,\n isWritable: true\n },\n {\n // The system program will be used for creating the PDA\n pubkey: web3.SystemProgram.programId,\n isSigner: false,\n isWritable: false\n }\n ],\n // Here's the most important part!\n data: buffer,\n programId: new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)\n })\n\n transaction.add(instruction)\n\n try {\n let txid = await sendTransaction(transaction, connection)\n console.log(`Transaction submitted: https://explorer.solana.com/tx/${txid}?cluster=devnet`)\n } catch (e) {\n alert(JSON.stringify(e))\n }\n }\n")),(0,r.kt)("p",null,"\u4ed4\u7ec6\u9605\u8bfb\u4ee3\u7801\u6ce8\u91ca\uff0c\u6211\u4f1a\u89e3\u91ca\u4e3a\u4ec0\u4e48\u6211\u4eec\u9700\u8981\u6307\u4ee4\u952e\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5730\u5740\u3002"),(0,r.kt)("p",null,"\u5c31\u8fd9\u6837\u4e86\uff01\u786e\u4fdd\u4f60\u7684\u94b1\u5305\u5728\u5f00\u53d1\u7f51\u7edc\u4e0a\uff0c\u5e76\u4e14\u4f60\u6709\u5f00\u53d1\u7f51\u7edc\u7684SOL\uff0c\u7136\u540e\u524d\u5f80 ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u3002\u63d0\u4ea4\u8bc4\u8bba\u5e76\u8bbf\u95ee\u63a7\u5236\u53f0\u4e2d\u8bb0\u5f55\u7684\u6d4f\u89c8\u5668\u94fe\u63a5\u3002\u5411\u4e0b\u6eda\u52a8\u5230\u5e95\uff0c\u4f60\u4f1a\u770b\u5230\u4f60\u7684\u7535\u5f71\u540d\u79f0\u4ee5\u53ca\u5176\u4ed6\u4e00\u4e9b\u5185\u5bb9\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(6288).Z,width:"1181",height:"520"})),(0,r.kt)("p",null,"\u54c7\u3002\u60a8\u521a\u521a\u5c06\u81ea\u5b9a\u4e49\u6570\u636e\u5199\u5165 Solana \u7f51\u7edc\u3002"),(0,r.kt)("p",null,"\u7ed9\u81ea\u5df1\u4e00\u4e2a\u9f13\u52b1\uff0c\u8fd9\u53ef\u4e0d\u662f\u7b80\u5355\u7684\u4e8b\u60c5\uff01\u5230\u8fd9\u4e2a\u9636\u6bb5\uff0c\u53ef\u80fd\u6709\u4e9b\u4eba\u5df2\u7ecf\u9000\u51fa\u4e86\u8fd9\u4e2a\u9879\u76ee\uff0c\u7ed9\u4ed6\u4eec\u4e00\u4e9b\u52a8\u529b\uff0c\u5c55\u793a\u4e00\u4e0b\u4f60\u6240\u5efa\u7acb\u7684\u4e1c\u897f\uff01\u5982\u679c\u4f60\u5df2\u7ecf\u8d70\u5230\u8fd9\u4e00\u6b65\uff0c\u6211\u6beb\u4e0d\u6000\u7591\u4f60\u4f1a\u4e00\u76f4\u575a\u6301\u5230\u6700\u540e :)"),(0,r.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,r.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u5927\u8111\u591a\u6298\u51e0\u9053\u76b1\u7eb9\u4e86 \ud83e\udde0"),(0,r.kt)("p",null,"\u7ee7\u7eed\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff0c\u8ba9 Solana Core \u4e2d\u7684\u6784\u5efa\u8005\u8fdb\u884c\u81ea\u6211\u4ecb\u7ecd\uff01\u6211\u4eec\u5c06\u5728\u8fd9\u4e2a\u5730\u5740 ",(0,r.kt)("inlineCode",{parentName:"p"},"HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf")," \u5904\u4f7f\u7528 Solana \u7a0b\u5e8f\u3002\u5b83\u6700\u7ec8\u770b\u8d77\u6765\u4e0e\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u7a0b\u5e8f\u7c7b\u4f3c\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(4637).Z,width:"1451",height:"1039"})),(0,r.kt)("h3",{id:"\u8d77\u59cb\u4ee3\u7801"},"\u8d77\u59cb\u4ee3\u7801"),(0,r.kt)("p",null,"\u60a8\u53ef\u4ee5\u8bbe\u7f6e\u4f7f\u7528"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-student-intros-frontend\ncd solana-student-intros-frontend\ngit checkout starter\nnpm i\n")),(0,r.kt)("p",null,"\u63d0\u793a\uff1a\n\u7a0b\u5e8f\u671f\u671b\u6307\u4ee4\u6570\u636e\u6309\u987a\u5e8f\u5305\u542b\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li"},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"variant")," \u4f5c\u4e3a\u65e0\u7b26\u53f7 8 \u4f4d\u6574\u6570\uff0c\u8868\u793a\u8981\u8c03\u7528\u7684\u6307\u4ee4\uff08\u5728\u672c\u4f8b\u4e2d\u5e94\u4e3a 0\uff09"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"name")," \u4f5c\u4e3a\u5b57\u7b26\u4e32"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"message")," \u4f5c\u4e3a\u5b57\u7b26\u4e32")))),(0,r.kt)("p",null,"\u8bf7\u6ce8\u610f\uff0c\u8be5\u7a0b\u5e8f\u4f7f\u7528\u8fde\u63a5\u94b1\u5305\u7684\u516c\u94a5\uff08\u800c\u4e0d\u662f\u5176\u4ed6\u4efb\u4f55\u4fe1\u606f\uff09\u6765\u751f\u6210\u6bcf\u4e2a\u5b66\u751f\u4ecb\u7ecd\u8d26\u6237\u3002\u8fd9\u610f\u5473\u7740\u6bcf\u4e2a\u516c\u94a5\u53ea\u80fd\u521d\u59cb\u5316\u4e00\u4e2a\u5b66\u751f\u4ecb\u7ecd\u8d26\u6237\uff0c\u5982\u679c\u60a8\u4f7f\u7528\u76f8\u540c\u7684\u516c\u94a5\u63d0\u4ea4\u4e24\u6b21\uff0c\u4ea4\u6613\u5c06\u5931\u8d25\u3002"),(0,r.kt)("p",null,"\u4e0e\u5f80\u5e38\u4e00\u6837\uff0c\u9996\u5148\u5c1d\u8bd5\u72ec\u7acb\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u4f46\u5982\u679c\u60a8\u9677\u5165\u56f0\u5883\u6216\u53ea\u662f\u60f3\u5c06\u60a8\u7684\u89e3\u51b3\u65b9\u6848\u4e0e\u6211\u4eec\u7684\u89e3\u51b3\u65b9\u6848\u8fdb\u884c\u6bd4\u8f83\uff0c\u8bf7\u67e5\u770b",(0,r.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-student-intros-frontend/tree/solution-serialize-instruction-data"},"\u6b64\u5b58\u50a8\u5e93"),"\u4e2d\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"solution-serialize-instruction-data")," \u5206\u652f\u3002"))}m.isMDXComponent=!0},3655:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_1-06c79731d6f55e39d0f7df0489fe6802.png"},7533:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_2-184ef731e9eb7016e7fb8e682bf6b402.png"},6288:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_3-272a72038f399bf562fbfb242ed7a49a.png"},4637:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_4-c947e6536e70d9332ee428f1732604f0.png"}}]); \ No newline at end of file diff --git a/assets/js/393be207.3e30333d.js b/assets/js/393be207.3e30333d.js deleted file mode 100644 index 50e7c0c97..000000000 --- a/assets/js/393be207.3e30333d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7414],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),i=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),m=i(r),s=o,d=m["".concat(l,".").concat(s)]||m[s]||f[s]||a;return r?n.createElement(d,p(p({ref:t},u),{},{components:r})):n.createElement(d,p({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,p=new Array(a);p[0]=s;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:o,p[1]=c;for(var i=2;i{r.r(t),r.d(t,{contentTitle:()=>p,default:()=>m,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={title:"Markdown page example"},p="Markdown page example",c={type:"mdx",permalink:"/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"}},l=[],i={toc:l},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"markdown-page-example"},"Markdown page example"),(0,o.kt)("p",null,"You don't need React to write simple standalone pages."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/393be207.b174dfb7.js b/assets/js/393be207.b174dfb7.js new file mode 100644 index 000000000..18b07d165 --- /dev/null +++ b/assets/js/393be207.b174dfb7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7414],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),i=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},u=function(e){var t=i(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),m=i(r),f=a,d=m["".concat(l,".").concat(f)]||m[f]||s[f]||o;return r?n.createElement(d,p(p({ref:t},u),{},{components:r})):n.createElement(d,p({ref:t},u))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,p=new Array(o);p[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:a,p[1]=c;for(var i=2;i{r.r(t),r.d(t,{contentTitle:()=>p,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var n=r(7462),a=(r(7294),r(3905));const o={title:"Markdown page example"},p="Markdown page example",c={type:"mdx",permalink:"/all-in-one-solana/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"}},l=[],i={toc:l},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"markdown-page-example"},"Markdown page example"),(0,a.kt)("p",null,"You don't need React to write simple standalone pages."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3f3a03c1.192c27e4.js b/assets/js/3f3a03c1.192c27e4.js deleted file mode 100644 index 713afcb7b..000000000 --- a/assets/js/3f3a03c1.192c27e4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4451],{1721:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/405ac2c3.14edfe5b.js b/assets/js/405ac2c3.14edfe5b.js deleted file mode 100644 index c224393e9..000000000 --- a/assets/js/405ac2c3.14edfe5b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[274],{8057:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/solana","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/468416a0.1a02a1f4.js b/assets/js/468416a0.1a02a1f4.js deleted file mode 100644 index f63578060..000000000 --- a/assets/js/468416a0.1a02a1f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5614],{9557:e=>{e.exports=JSON.parse('{"label":"blockchain","permalink":"/blog/tags/blockchain","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/492e7013.5327f6c3.js b/assets/js/492e7013.5327f6c3.js deleted file mode 100644 index 3fe1e6be8..000000000 --- a/assets/js/492e7013.5327f6c3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2102],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),m=a,f=u["".concat(i,".").concat(m)]||u[m]||d[m]||o;return t?r.createElement(f,l(l({ref:n},p),{},{components:t})):r.createElement(f,l({ref:n},p))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=m;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:a,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:18,sidebar_label:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",sidebar_class_name:"green"},l="\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",s={unversionedId:"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README",id:"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README",title:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01",source:"@site/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README.md",sourceDirName:"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program",slug:"/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/",permalink:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README.md",tags:[],version:"current",sidebarPosition:18,frontMatter:{sidebar_position:18,sidebar_label:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305",permalink:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/"},next:{title:"\u81ea\u5b9a\u4e49\u6307\u4ee4",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/"}},i={},c=[{value:"\ud83d\udea2 Ship\u6311\u6218 - SOL \u53d1\u9001\u8005",id:"-ship\u6311\u6218---sol-\u53d1\u9001\u8005",level:2}],p={toc:c},u="wrapper";function d(e){let{components:n,...o}=e;return(0,a.kt)(u,(0,r.Z)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"},"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"),(0,a.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684",(0,a.kt)("inlineCode",{parentName:"p"},"ping"),"\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01"),(0,a.kt)("p",null,"\u8fd9\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"PingButton.tsx")," \u5e94\u8be5\u770b\u8d77\u6765\u7684\u6837\u5b50\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"import { useConnection, useWallet } from '@solana/wallet-adapter-react';\nimport * as Web3 from '@solana/web3.js'\nimport { FC } from 'react'\nimport styles from '../styles/PingButton.module.css'\n\nconst PROGRAM_ID = new Web3.PublicKey(\"ChT1B39WKLS8qUrkLvFDXMhEJ4F1XZzwUNHUt4AU9aVa\")\nconst PROGRAM_DATA_PUBLIC_KEY = new Web3.PublicKey(\"Ah9K7dQ8EHaZqcAsgBW8w37yN2eAy3koFmUn4x3CJtod\")\n\nexport const PingButton: FC = () => {\n const { connection } = useConnection();\n const { publicKey, sendTransaction } = useWallet();\n\n const onClick = () => {\n if (!connection || !publicKey) {\n alert(\"Please connect your wallet first lol\")\n return\n }\n\n const transaction = new Web3.Transaction()\n\n const instruction = new Web3.TransactionInstruction({\n keys: [\n {\n pubkey: PROGRAM_DATA_PUBLIC_KEY,\n isSigner: false,\n isWritable: true\n },\n ],\n programId: PROGRAM_ID,\n });\n\n transaction.add(instruction)\n sendTransaction(transaction, connection).then(sig => {\n console.log(`Explorer URL: https://explorer.solana.com/tx/${sig}?cluster=devnet`)\n })\n }\n\n return (\n
\n \n
\n )\n}\n")),(0,a.kt)("p",null,"\u8fd9\u4e00\u5806\u4e1c\u897f\u5bf9\u4f60\u6765\u8bf4\u5e94\u8be5\u5f88\u719f\u6089 - \u6211\u4eec\u6b63\u5728\u505a\u7684\u4e8b\u60c5\u4e0e\u6211\u4eec\u5728\u672c\u5730\u5ba2\u6237\u7aef\u4e0a\u505a\u7684\u5b8c\u5168\u4e00\u6837\uff0c\u53ea\u662f\u4f7f\u7528\u4e86",(0,a.kt)("inlineCode",{parentName:"p"},"React hooks"),"\uff01"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u6765\u6d4b\u8bd5\u4e00\u4e0b\u4e86\u3002\u786e\u4fdd\u4f60\u7684\u94b1\u5305\u5728\u5f00\u53d1\u7f51\u7edc\u4e0a - \u8bbe\u7f6e -> \u5f00\u53d1\u8005\u8bbe\u7f6e -> \u66f4\u6539\u7f51\u7edc\u3002\u8fde\u63a5\u4f60\u7684\u94b1\u5305\u5e76\u70b9\u51fb\u90a3\u4e2aping\u6309\u94ae\uff0c\u4f60\u5c06\u4f1a\u770b\u5230\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(525).Z,width:"465",height:"742"})),(0,a.kt)("p",null,"\u5982\u679c\u60a8\u70b9\u51fb\u786e\u8ba4\uff0c\u60a8\u7684\u63a7\u5236\u53f0\u5c06\u6253\u5370\u51fa\u4ea4\u6613\u94fe\u63a5\u3002\u5c31\u50cf\u4e4b\u524d\u4e00\u6837\uff0c\u5411\u4e0b\u6eda\u52a8\uff0c\u60a8\u4f1a\u770b\u5230\u6570\u5b57\u5df2\u7ecf\u589e\u52a0\u4e86\ud83d\ude80"),(0,a.kt)("p",null,"\u73b0\u5728\u4f60\u53ef\u4ee5\u8ba9\u7528\u6237\u4e0e\u5e94\u7528\u7a0b\u5e8f\u4e92\u52a8\u4e86\uff01\u4f60\u5728\u4e0a\u4e00\u8282\u4e2d\u5236\u4f5c\u7684\u90a3\u4e2a\u4ef7\u503c1\u4e07\u7f8e\u5143\u7684\u4ea7\u54c1\uff1f\u73b0\u5728\u5b83\u5df2\u7ecf\u6210\u4e3a\u4e86\u4e00\u4e2a\u4ef7\u503c\u767e\u4e07\u7f8e\u5143\u7684\u4ea7\u54c1\u3002\u60f3\u8c61\u4e00\u4e0b\u6240\u6709\u7684\u7a0b\u5e8f - Metaplex\u3001Serum\u3001Solana\u7a0b\u5e8f\u5e93\u4e2d\u7684\u4efb\u4f55\u7a0b\u5e8f - \u4f60\u73b0\u5728\u6709\u80fd\u529b\u5c06\u5b83\u4eec\u4e0e\u7528\u6237\u754c\u9762\u8fde\u63a5\u8d77\u6765\uff0c\u8ba9\u4eba\u4eec\u4f7f\u7528\u3002\u6211\u7684\u670b\u53cb\uff0c\u4f60\u53ef\u4ee5\u6784\u5efa\u672a\u6765\u3002"),(0,a.kt)("h2",{id:"-ship\u6311\u6218---sol-\u53d1\u9001\u8005"},"\ud83d\udea2 Ship\u6311\u6218 - SOL \u53d1\u9001\u8005"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u953b\u70bc\u4e00\u4e0b\u808c\u8089\u4e86\u3002"),(0,a.kt)("p",null,"\u5728\u6b64\u6311\u6218\u4e2d\uff0c\u4f7f\u7528",(0,a.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-send-sol-frontend"},"\u6b64\u8d77\u59cb\u4ee3\u7801"),"\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff0c\u8ba9\u7528\u6237\u8fde\u63a5\u5176 Phantom \u94b1\u5305\u5e76\u5c06 SOL \u53d1\u9001\u5230\u53e6\u4e00\u4e2a\u5e10\u6237\u3002\u786e\u4fdd\u514b\u9686\u540e\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"git checkout starter")," \u5207\u6362\u5230\u8d77\u59cb\u5206\u652f\u3002"),(0,a.kt)("p",null,"\u901a\u8fc7\u4e24\u4e2a\u5173\u952e\u6b65\u9aa4\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5c06\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\u5305\u88c5\u5728\u9002\u5f53\u7684\u4e0a\u4e0b\u6587\u63d0\u4f9b\u7a0b\u5e8f\u4e2d\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u5728\u8868\u5355\u7ec4\u4ef6\u4e2d\uff0c\u8bbe\u7f6e\u4ea4\u6613\u5e76\u5c06\u5176\u53d1\u9001\u5230\u7528\u6237\u7684\u94b1\u5305\u4ee5\u4f9b\u6279\u51c6\u3002")),(0,a.kt)("p",null,"\u6700\u540e\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff01"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(3387).Z,width:"2296",height:"1376"})),(0,a.kt)("p",null,"\u4e0d\u8981\u5fd8\u8bb0\u9a8c\u8bc1\u5730\u5740\uff01"),(0,a.kt)("p",null,"\u5b8c\u6210\u540e\uff0c\u5c06\u60a8\u7684\u89e3\u51b3\u65b9\u6848\u4e0e\u6b64\u5904\u7684",(0,a.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-send-sol-frontend"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u8fdb\u884c\u6bd4\u8f83\u3002"))}d.isMDXComponent=!0},525:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_1-c7889b54fd96b887f16df359656e5952.png"},3387:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_2-c9bdea4ce6ed103c6b14beb502450fb7.png"}}]); \ No newline at end of file diff --git a/assets/js/492e7013.fa283319.js b/assets/js/492e7013.fa283319.js new file mode 100644 index 000000000..865091f7f --- /dev/null +++ b/assets/js/492e7013.fa283319.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2102],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var i=r.createContext({}),c=function(e){var n=r.useContext(i),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(i.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(t),m=a,f=u["".concat(i,".").concat(m)]||u[m]||d[m]||o;return t?r.createElement(f,l(l({ref:n},p),{},{components:t})):r.createElement(f,l({ref:n},p))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=m;var s={};for(var i in n)hasOwnProperty.call(n,i)&&(s[i]=n[i]);s.originalType=e,s[u]="string"==typeof e?e:a,l[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:18,sidebar_label:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",sidebar_class_name:"green"},l="\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",s={unversionedId:"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README",id:"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README",title:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01",source:"@site/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README.md",sourceDirName:"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program",slug:"/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README.md",tags:[],version:"current",sidebarPosition:18,frontMatter:{sidebar_position:18,sidebar_label:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/"},next:{title:"\u81ea\u5b9a\u4e49\u6307\u4ee4",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/"}},i={},c=[{value:"\ud83d\udea2 Ship\u6311\u6218 - SOL \u53d1\u9001\u8005",id:"-ship\u6311\u6218---sol-\u53d1\u9001\u8005",level:2}],p={toc:c},u="wrapper";function d(e){let{components:n,...o}=e;return(0,a.kt)(u,(0,r.Z)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"},"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"),(0,a.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684",(0,a.kt)("inlineCode",{parentName:"p"},"ping"),"\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01"),(0,a.kt)("p",null,"\u8fd9\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"PingButton.tsx")," \u5e94\u8be5\u770b\u8d77\u6765\u7684\u6837\u5b50\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"import { useConnection, useWallet } from '@solana/wallet-adapter-react';\nimport * as Web3 from '@solana/web3.js'\nimport { FC } from 'react'\nimport styles from '../styles/PingButton.module.css'\n\nconst PROGRAM_ID = new Web3.PublicKey(\"ChT1B39WKLS8qUrkLvFDXMhEJ4F1XZzwUNHUt4AU9aVa\")\nconst PROGRAM_DATA_PUBLIC_KEY = new Web3.PublicKey(\"Ah9K7dQ8EHaZqcAsgBW8w37yN2eAy3koFmUn4x3CJtod\")\n\nexport const PingButton: FC = () => {\n const { connection } = useConnection();\n const { publicKey, sendTransaction } = useWallet();\n\n const onClick = () => {\n if (!connection || !publicKey) {\n alert(\"Please connect your wallet first lol\")\n return\n }\n\n const transaction = new Web3.Transaction()\n\n const instruction = new Web3.TransactionInstruction({\n keys: [\n {\n pubkey: PROGRAM_DATA_PUBLIC_KEY,\n isSigner: false,\n isWritable: true\n },\n ],\n programId: PROGRAM_ID,\n });\n\n transaction.add(instruction)\n sendTransaction(transaction, connection).then(sig => {\n console.log(`Explorer URL: https://explorer.solana.com/tx/${sig}?cluster=devnet`)\n })\n }\n\n return (\n
\n \n
\n )\n}\n")),(0,a.kt)("p",null,"\u8fd9\u4e00\u5806\u4e1c\u897f\u5bf9\u4f60\u6765\u8bf4\u5e94\u8be5\u5f88\u719f\u6089 - \u6211\u4eec\u6b63\u5728\u505a\u7684\u4e8b\u60c5\u4e0e\u6211\u4eec\u5728\u672c\u5730\u5ba2\u6237\u7aef\u4e0a\u505a\u7684\u5b8c\u5168\u4e00\u6837\uff0c\u53ea\u662f\u4f7f\u7528\u4e86",(0,a.kt)("inlineCode",{parentName:"p"},"React hooks"),"\uff01"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u6765\u6d4b\u8bd5\u4e00\u4e0b\u4e86\u3002\u786e\u4fdd\u4f60\u7684\u94b1\u5305\u5728\u5f00\u53d1\u7f51\u7edc\u4e0a - \u8bbe\u7f6e -> \u5f00\u53d1\u8005\u8bbe\u7f6e -> \u66f4\u6539\u7f51\u7edc\u3002\u8fde\u63a5\u4f60\u7684\u94b1\u5305\u5e76\u70b9\u51fb\u90a3\u4e2aping\u6309\u94ae\uff0c\u4f60\u5c06\u4f1a\u770b\u5230\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(525).Z,width:"465",height:"742"})),(0,a.kt)("p",null,"\u5982\u679c\u60a8\u70b9\u51fb\u786e\u8ba4\uff0c\u60a8\u7684\u63a7\u5236\u53f0\u5c06\u6253\u5370\u51fa\u4ea4\u6613\u94fe\u63a5\u3002\u5c31\u50cf\u4e4b\u524d\u4e00\u6837\uff0c\u5411\u4e0b\u6eda\u52a8\uff0c\u60a8\u4f1a\u770b\u5230\u6570\u5b57\u5df2\u7ecf\u589e\u52a0\u4e86\ud83d\ude80"),(0,a.kt)("p",null,"\u73b0\u5728\u4f60\u53ef\u4ee5\u8ba9\u7528\u6237\u4e0e\u5e94\u7528\u7a0b\u5e8f\u4e92\u52a8\u4e86\uff01\u4f60\u5728\u4e0a\u4e00\u8282\u4e2d\u5236\u4f5c\u7684\u90a3\u4e2a\u4ef7\u503c1\u4e07\u7f8e\u5143\u7684\u4ea7\u54c1\uff1f\u73b0\u5728\u5b83\u5df2\u7ecf\u6210\u4e3a\u4e86\u4e00\u4e2a\u4ef7\u503c\u767e\u4e07\u7f8e\u5143\u7684\u4ea7\u54c1\u3002\u60f3\u8c61\u4e00\u4e0b\u6240\u6709\u7684\u7a0b\u5e8f - Metaplex\u3001Serum\u3001Solana\u7a0b\u5e8f\u5e93\u4e2d\u7684\u4efb\u4f55\u7a0b\u5e8f - \u4f60\u73b0\u5728\u6709\u80fd\u529b\u5c06\u5b83\u4eec\u4e0e\u7528\u6237\u754c\u9762\u8fde\u63a5\u8d77\u6765\uff0c\u8ba9\u4eba\u4eec\u4f7f\u7528\u3002\u6211\u7684\u670b\u53cb\uff0c\u4f60\u53ef\u4ee5\u6784\u5efa\u672a\u6765\u3002"),(0,a.kt)("h2",{id:"-ship\u6311\u6218---sol-\u53d1\u9001\u8005"},"\ud83d\udea2 Ship\u6311\u6218 - SOL \u53d1\u9001\u8005"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u953b\u70bc\u4e00\u4e0b\u808c\u8089\u4e86\u3002"),(0,a.kt)("p",null,"\u5728\u6b64\u6311\u6218\u4e2d\uff0c\u4f7f\u7528",(0,a.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-send-sol-frontend"},"\u6b64\u8d77\u59cb\u4ee3\u7801"),"\u521b\u5efa\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\uff0c\u8ba9\u7528\u6237\u8fde\u63a5\u5176 Phantom \u94b1\u5305\u5e76\u5c06 SOL \u53d1\u9001\u5230\u53e6\u4e00\u4e2a\u5e10\u6237\u3002\u786e\u4fdd\u514b\u9686\u540e\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"git checkout starter")," \u5207\u6362\u5230\u8d77\u59cb\u5206\u652f\u3002"),(0,a.kt)("p",null,"\u901a\u8fc7\u4e24\u4e2a\u5173\u952e\u6b65\u9aa4\u6765\u505a\u5230\u8fd9\u4e00\u70b9\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5c06\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\u5305\u88c5\u5728\u9002\u5f53\u7684\u4e0a\u4e0b\u6587\u63d0\u4f9b\u7a0b\u5e8f\u4e2d\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u5728\u8868\u5355\u7ec4\u4ef6\u4e2d\uff0c\u8bbe\u7f6e\u4ea4\u6613\u5e76\u5c06\u5176\u53d1\u9001\u5230\u7528\u6237\u7684\u94b1\u5305\u4ee5\u4f9b\u6279\u51c6\u3002")),(0,a.kt)("p",null,"\u6700\u540e\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff01"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(3387).Z,width:"2296",height:"1376"})),(0,a.kt)("p",null,"\u4e0d\u8981\u5fd8\u8bb0\u9a8c\u8bc1\u5730\u5740\uff01"),(0,a.kt)("p",null,"\u5b8c\u6210\u540e\uff0c\u5c06\u60a8\u7684\u89e3\u51b3\u65b9\u6848\u4e0e\u6b64\u5904\u7684",(0,a.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-send-sol-frontend"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u8fdb\u884c\u6bd4\u8f83\u3002"))}d.isMDXComponent=!0},525:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_1-c7889b54fd96b887f16df359656e5952.png"},3387:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_2-c9bdea4ce6ed103c6b14beb502450fb7.png"}}]); \ No newline at end of file diff --git a/assets/js/494c5677.b75cc721.js b/assets/js/494c5677.b75cc721.js new file mode 100644 index 000000000..aba83d04f --- /dev/null +++ b/assets/js/494c5677.b75cc721.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7049],{2469:e=>{e.exports=JSON.parse('{"permalink":"/all-in-one-solana/blog/tags/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/4b5a10c1.67e4c060.js b/assets/js/4b5a10c1.67e4c060.js deleted file mode 100644 index 23f25650e..000000000 --- a/assets/js/4b5a10c1.67e4c060.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1556],{3905:(e,r,a)=>{a.d(r,{Zo:()=>u,kt:()=>_});var t=a(7294);function n(e,r,a){return r in e?Object.defineProperty(e,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[r]=a,e}function s(e,r){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),a.push.apply(a,t)}return a}function d(e){for(var r=1;r=0||(n[a]=e[a]);return n}(e,r);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=t.createContext({}),o=function(e){var r=t.useContext(p),a=r;return e&&(a="function"==typeof e?e(r):d(d({},r),e)),a},u=function(e){var r=o(e.components);return t.createElement(p.Provider,{value:r},e.children)},i="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},c=t.forwardRef((function(e,r){var a=e.components,n=e.mdxType,s=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),i=o(a),c=n,_=i["".concat(p,".").concat(c)]||i[c]||m[c]||s;return a?t.createElement(_,d(d({ref:r},u),{},{components:a})):t.createElement(_,d({ref:r},u))}));function _(e,r){var a=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var s=a.length,d=new Array(s);d[0]=c;var l={};for(var p in r)hasOwnProperty.call(r,p)&&(l[p]=r[p]);l.originalType=e,l[i]="string"==typeof e?e:n,d[1]=l;for(var o=2;o{a.r(r),a.d(r,{assets:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>o});var t=a(7462),n=(a(7294),a(3905));const s={sidebar_position:67,sidebar_label:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",sidebar_class_name:"green"},d="\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",l={unversionedId:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README",id:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README",title:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",description:"\u554a\uff0c\u9e21\u86cb\u3002\u6216\u8005\u6b63\u5f0f\u79f0\u4e4b\u4e3a\uff1a\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\u3002\u6211\u4eec\u4e4b\u524d\u5df2\u7ecf\u7528\u5b83\u4eec\u70f9\u996a\u8fc7\u3002\u8ba9\u6211\u4eec\u6253\u5f00\u5b83\u4eec\u770b\u770b\u5b83\u4eec\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002",source:"@site/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README.md",sourceDirName:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive",slug:"/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/",permalink:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README.md",tags:[],version:"current",sidebarPosition:67,frontMatter:{sidebar_position:67,sidebar_label:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",permalink:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/"},next:{title:"Module5",permalink:"/docs/Solana-Co-Learn/module5/"}},p={},o=[{value:"\ud83d\udd0e \u5bfb\u627e PDAs (PDAs)",id:"-\u5bfb\u627e-pdas-pdas",level:2},{value:"\ud83c\udf73 Under the hood of find_program_address",id:"-under-the-hood-of-find_program_address",level:2},{value:"\ud83e\udd14 \u5173\u4e8e\uff08PDA\uff09\u7684\u6ce8\u610f\u4e8b\u9879",id:"-\u5173\u4e8epda\u7684\u6ce8\u610f\u4e8b\u9879",level:2}],u={toc:o},i="wrapper";function m(e){let{components:r,...s}=e;return(0,n.kt)(i,(0,t.Z)({},u,s,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"-pda-\u6df1\u5165\u63a2\u7a76"},"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76"),(0,n.kt)("p",null,"\u554a\uff0c\u9e21\u86cb\u3002\u6216\u8005\u6b63\u5f0f\u79f0\u4e4b\u4e3a\uff1a\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\u3002\u6211\u4eec\u4e4b\u524d\u5df2\u7ecf\u7528\u5b83\u4eec\u70f9\u996a\u8fc7\u3002\u8ba9\u6211\u4eec\u6253\u5f00\u5b83\u4eec\u770b\u770b\u5b83\u4eec\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002"),(0,n.kt)("p",null,"PDA\u4e3b\u8981\u6709\u4e24\u4e2a\u4e3b\u8981\u529f\u80fd\uff1a"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"\u63d0\u4f9b\u4e00\u79cd",(0,n.kt)("a",{parentName:"li",href:"https://www.google.com.hk/search?q=define+deterministic&utm_source=buildspace.so&utm_medium=buildspace_project"},"\u786e\u5b9a\u6027"),"\u7684\u65b9\u6cd5\u6765\u67e5\u627e\u7a0b\u5e8f\u62e5\u6709\u7684\u8d26\u6237\u7684\u5730\u5740"),(0,n.kt)("li",{parentName:"ul"},"\u6388\u6743\u6d3e\u751f\u81eaPDA\u7684\u7a0b\u5e8f\u4ee3\u8868\u5176\u7b7e\u7f72\uff0c\u5c31\u50cf\u7528\u6237\u53ef\u4ee5\u4f7f\u7528\u4ed6\u4eec\u7684\u79c1\u94a5\u7b7e\u7f72\u4e00\u6837")),(0,n.kt)("p",null,"\u6362\u53e5\u8bdd\u8bf4\uff0c\u5b83\u4eec\u662fSolana\u7f51\u7edc\u4e0a\u7528\u4e8e\u5b58\u50a8\u7684\u5b89\u5168\u952e\u503c\u5b58\u50a8\u3002"),(0,n.kt)("h2",{id:"-\u5bfb\u627e-pdas-pdas"},"\ud83d\udd0e \u5bfb\u627e PDAs (PDAs)"),(0,n.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6bcf\u5f53\u6211\u4eec\u9700\u8981\u6d3e\u751f\u4e00\u4e2a\u5730\u5740\u65f6\uff0c\u6211\u4eec\u90fd\u4f7f\u7528\u4e86\u4e00\u4e2a\u65b9\u4fbf\u7684\u51fd\u6570\u3002\u8fd9\u4e2a\u51fd\u6570\u5230\u5e95\u662f\u505a\u4ec0\u4e48\u7684\u5462\uff1f\u8981\u627e\u51fa\u7b54\u6848\uff0c\u6211\u4eec\u9700\u8981\u4e86\u89e3Solana\u5bc6\u94a5\u5bf9\u662f\u5982\u4f55\u751f\u6210\u7684\u3002"),(0,n.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b\u5bc6\u94a5\u5bf9\u7684\u4f5c\u7528\u3002\u5b83\u662f\u4e00\u79cd\u8bc1\u660e\u4f60\u662f\u4f60\u6240\u8bf4\u7684\u90a3\u4e2a\u4eba\u7684\u65b9\u5f0f\u3002\u6211\u4eec\u4f7f\u7528\u6570\u5b57\u7b7e\u540d\u7cfb\u7edf\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\u3002Solana\u7684\u5bc6\u94a5\u5bf9\u662f\u57fa\u4e8e\u6240\u8c13\u7684Ed25519\u692d\u5706\u66f2\u7ebf\uff08\u4f60\u4e0d\u9700\u8981\u77e5\u9053\u8fd9\u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f\uff09\u3002"),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(1418).Z,width:"1204",height:"844"})),(0,n.kt)("p",null,"\u7531\u4e8e",(0,n.kt)("inlineCode",{parentName:"p"},"PDAs"),"\u662f\u7531\u7a0b\u5e8f\u63a7\u5236\u7684\uff0c\u6240\u4ee5\u5b83\u4eec\u4e0d\u9700\u8981\u79c1\u94a5\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4f7f\u7528\u4e0d\u5728Ed25519\u66f2\u7ebf\u4e0a\u7684\u5730\u5740\u6765\u521b\u5efaPDAs\u3002\u8fd9\u5b9e\u9645\u4e0a\u610f\u5473\u7740\u5b83\u4eec\u662f\u6ca1\u6709\u76f8\u5e94\u79c1\u94a5\u7684\u516c\u94a5\u3002"),(0,n.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\u3002\u4f60\u4e0d\u9700\u8981\u7406\u89e3Ed25519\uff0c\u751a\u81f3\u4e0d\u9700\u8981\u77e5\u9053\u6570\u5b57\u7b7e\u540d\u7b97\u6cd5\u662f\u4ec0\u4e48\u3002\u4f60\u53ea\u9700\u8981\u77e5\u9053PDA\u770b\u8d77\u6765\u50cf\u666e\u901a\u7684Solana\u5730\u5740\uff0c\u5e76\u4e14\u7531\u7a0b\u5e8f\u63a7\u5236\u3002\u5982\u679c\u4f60\u60f3\u8fdb\u4e00\u6b65\u4e86\u89e3\uff0c\u53ef\u4ee5\u770b\u770bComputerphile\u5173\u4e8e",(0,n.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=s22eJ1eVLTU&utm_source=buildspace.so&utm_medium=buildspace_project"},"\u6570\u5b57\u7b7e\u540d"),"\u7684\u9177\u70ab\u89c6\u9891\u3002"),(0,n.kt)("p",null,"\u8981\u5728Solana\u7a0b\u5e8f\u4e2d\u627e\u5230\u4e00\u4e2aPDA\uff0c\u6211\u4eec\u5c06\u4f7f\u7528 find_program_address \u51fd\u6570\u3002"),(0,n.kt)("p",null,"\u201c\u79cd\u5b50\u201d\u662f\u7528\u4e8e\u6d3e\u751fPDA\u7684 find_program_address \u51fd\u6570\u7684\u53ef\u9009\u8f93\u5165\u3002\u4f8b\u5982\uff0c\u79cd\u5b50\u53ef\u4ee5\u662f\u4efb\u610f\u7ec4\u5408\uff1a"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"\u6307\u4ee4\u6570\u636e"),(0,n.kt)("li",{parentName:"ul"},"\u786c\u7f16\u7801\u7684\u503c"),(0,n.kt)("li",{parentName:"ul"},"\u5176\u4ed6\u8d26\u6237\u7684\u516c\u94a5")),(0,n.kt)("p",null,"find_program_address \u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u4e2a\u989d\u5916\u7684\u79cd\u5b50\uff0c\u79f0\u4e3a\u201cbump seed\u201d\uff0c\u4ee5\u786e\u4fdd\u7ed3\u679c\u4e0d\u5728Ed25519\u66f2\u7ebf\u4e0a"),(0,n.kt)("p",null,"\u4e00\u65e6\u627e\u5230\u6709\u6548\u7684PDA\uff0c\u8be5\u51fd\u6570\u5c06\u8fd4\u56de\u4e24\u4e2a\u503c\uff1a"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"PDA"),(0,n.kt)("li",{parentName:"ul"},"the bump that was used to derive the PDA")),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(2658).Z,width:"1500",height:"396"})),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let (pda, bump_seed) = Pubkey::find_program_address(&[user.key.as_ref(), user_input.as_bytes().as_ref(), "SEED".as_bytes()], program_id)\n')),(0,n.kt)("h2",{id:"-under-the-hood-of-find_program_address"},"\ud83c\udf73 Under the hood of find_program_address"),(0,n.kt)("p",null,"find_program_address \u662f\u4e00\u4e2a\u5192\u724c\u8d27 - \u5b83\u5b9e\u9645\u4e0a\u5c06\u8f93\u5165 seeds \u548c program_id \u4f20\u9012\u7ed9 try_find_program_address \u51fd\u6570"),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(2786).Z,width:"1500",height:"379"})),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'pub fn find_program_address(seeds: &[&[u8]], program_id: &Pubkey) -> (Pubkey, u8) {\n Self::try_find_program_address(seeds, program_id)\n .unwrap_or_else(|| panic!("Unable to find a viable program address bump seed"))\n}\n')),(0,n.kt)("p",null,"\u7136\u540e\uff0c try_find_program_address \u51fd\u6570\u5f15\u5165\u4e86 bump_seed \u3002"),(0,n.kt)("p",null,"bump_seed \u662f\u4e00\u4e2a u8 \u53d8\u91cf\uff0c\u5176\u503c\u8303\u56f4\u57280\u5230255\u4e4b\u95f4\uff0c\u5b83\u88ab\u9644\u52a0\u5230\u53ef\u9009\u7684\u8f93\u5165\u79cd\u5b50\u4e2d\uff0c\u7136\u540e\u4f20\u9012\u7ed9 create_program_address \u51fd\u6570"),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(2318).Z,width:"1470",height:"844"})),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn try_find_program_address(seeds: &[&[u8]], program_id: &Pubkey) -> Option<(Pubkey, u8)> {\n\n let mut bump_seed = [std::u8::MAX];\n for _ in 0..std::u8::MAX {\n {\n let mut seeds_with_bump = seeds.to_vec();\n seeds_with_bump.push(&bump_seed);\n match Self::create_program_address(&seeds_with_bump, program_id) {\n Ok(address) => return Some((address, bump_seed[0])),\n Err(PubkeyError::InvalidSeeds) => (),\n _ => break,\n }\n }\n bump_seed[0] -= 1;\n }\n None\n\n}\n")),(0,n.kt)("p",null,"create_program_address \u51fd\u6570\u5bf9\u79cd\u5b50\u548c program_id \u6267\u884c\u4e00\u7cfb\u5217\u54c8\u5e0c\u64cd\u4f5c\u3002\u8fd9\u4e9b\u64cd\u4f5c\u8ba1\u7b97\u4e00\u4e2a\u5bc6\u94a5\uff0c\u7136\u540e\u9a8c\u8bc1\u8ba1\u7b97\u51fa\u7684\u5bc6\u94a5\u662f\u5426\u4f4d\u4e8eEd25519\u692d\u5706\u66f2\u7ebf\u4e0a\u3002"),(0,n.kt)("p",null,"\u5982\u679c\u627e\u5230\u4e00\u4e2a\u6709\u6548\u7684PDA\uff08\u5373\u4e00\u4e2a\u4e0d\u5728\u66f2\u7ebf\u4e0a\u7684\u5730\u5740\uff09\uff0c\u5219\u8fd4\u56de\u8be5PDA\u3002\u5426\u5219\uff0c\u8fd4\u56de\u4e00\u4e2a\u9519\u8bef\u3002"),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(6554).Z,width:"880",height:"844"})),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn create_program_address(\n seeds: &[&[u8]],\n program_id: &Pubkey,\n) -> Result {\n\n let mut hasher = crate::hash::Hasher::default();\n for seed in seeds.iter() {\n hasher.hash(seed);\n }\n hasher.hashv(&[program_id.as_ref(), PDA_MARKER]);\n let hash = hasher.result();\n\n if bytes_are_curve_point(hash) {\n return Err(PubkeyError::InvalidSeeds);\n }\n\n Ok(Pubkey::new(hash.as_ref()))\n\n}\n")),(0,n.kt)("p",null,"\u603b\u7ed3\u4e00\u4e0b\uff1a"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"\u8be5\u51fd\u6570\u5c06\u6211\u4eec\u7684\u8f93\u5165\u79cd\u5b50\u548c program_id \u4f20\u9012\u7ed9 try_find_program_address \u51fd\u6570\u3002"),(0,n.kt)("li",{parentName:"ul"},"try_find_program_address \u51fd\u6570\u5c06\u4e00\u4e2a bump_seed \uff08\u4ece255\u5f00\u59cb\uff09\u6dfb\u52a0\u5230\u6211\u4eec\u7684\u8f93\u5165\u79cd\u5b50\u4e2d\uff0c\u7136\u540e\u8c03\u7528 create_program_address \u51fd\u6570\uff0c\u76f4\u5230\u627e\u5230\u4e00\u4e2a\u6709\u6548\u7684PDA\u3002"),(0,n.kt)("li",{parentName:"ul"},"\u4e00\u65e6\u627e\u5230\uff0cPDA\u548c bump_seed \u90fd\u4f1a\u88ab\u5f52\u8fd8\u3002")),(0,n.kt)("p",null,"\u4f60\u4e0d\u9700\u8981\u8bb0\u4f4f\u6240\u6709\u7684\u7ec6\u8282\uff01\u91cd\u8981\u7684\u662f\u8981\u7406\u89e3\u5728\u9ad8\u5c42\u6b21\u4e0a\u8c03\u7528 find_program_address \u51fd\u6570\u65f6\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"),(0,n.kt)("h2",{id:"-\u5173\u4e8epda\u7684\u6ce8\u610f\u4e8b\u9879"},"\ud83e\udd14 \u5173\u4e8e\uff08PDA\uff09\u7684\u6ce8\u610f\u4e8b\u9879"))}m.isMDXComponent=!0},6554:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/create-program-address-a372e6f990f3981744c9d697844516c6.png"},2658:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/find-pda-fe645a6a415eda09eddc96221c074f99.png"},2786:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/find-program-address-a38b8175c5cbdd9ccf33ffc6f33e8e40.png"},1418:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/pda-a5bff67b5cd45b89420f1a94b25e790c.png"},2318:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/try-find-program-address-ec0b89673fe3c5978b19873a50660ce6.png"}}]); \ No newline at end of file diff --git a/assets/js/4b5a10c1.b29b8ac9.js b/assets/js/4b5a10c1.b29b8ac9.js new file mode 100644 index 000000000..880d91976 --- /dev/null +++ b/assets/js/4b5a10c1.b29b8ac9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1556],{3905:(e,r,a)=>{a.d(r,{Zo:()=>u,kt:()=>_});var t=a(7294);function n(e,r,a){return r in e?Object.defineProperty(e,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[r]=a,e}function s(e,r){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),a.push.apply(a,t)}return a}function d(e){for(var r=1;r=0||(n[a]=e[a]);return n}(e,r);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var o=t.createContext({}),p=function(e){var r=t.useContext(o),a=r;return e&&(a="function"==typeof e?e(r):d(d({},r),e)),a},u=function(e){var r=p(e.components);return t.createElement(o.Provider,{value:r},e.children)},i="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},c=t.forwardRef((function(e,r){var a=e.components,n=e.mdxType,s=e.originalType,o=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),i=p(a),c=n,_=i["".concat(o,".").concat(c)]||i[c]||m[c]||s;return a?t.createElement(_,d(d({ref:r},u),{},{components:a})):t.createElement(_,d({ref:r},u))}));function _(e,r){var a=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var s=a.length,d=new Array(s);d[0]=c;var l={};for(var o in r)hasOwnProperty.call(r,o)&&(l[o]=r[o]);l.originalType=e,l[i]="string"==typeof e?e:n,d[1]=l;for(var p=2;p{a.r(r),a.d(r,{assets:()=>o,contentTitle:()=>d,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>p});var t=a(7462),n=(a(7294),a(3905));const s={sidebar_position:67,sidebar_label:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",sidebar_class_name:"green"},d="\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",l={unversionedId:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README",id:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README",title:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",description:"\u554a\uff0c\u9e21\u86cb\u3002\u6216\u8005\u6b63\u5f0f\u79f0\u4e4b\u4e3a\uff1a\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\u3002\u6211\u4eec\u4e4b\u524d\u5df2\u7ecf\u7528\u5b83\u4eec\u70f9\u996a\u8fc7\u3002\u8ba9\u6211\u4eec\u6253\u5f00\u5b83\u4eec\u770b\u770b\u5b83\u4eec\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002",source:"@site/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README.md",sourceDirName:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive",slug:"/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README.md",tags:[],version:"current",sidebarPosition:67,frontMatter:{sidebar_position:67,sidebar_label:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/"},next:{title:"Module5",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module5/"}},o={},p=[{value:"\ud83d\udd0e \u5bfb\u627e PDAs (PDAs)",id:"-\u5bfb\u627e-pdas-pdas",level:2},{value:"\ud83c\udf73 Under the hood of find_program_address",id:"-under-the-hood-of-find_program_address",level:2},{value:"\ud83e\udd14 \u5173\u4e8e\uff08PDA\uff09\u7684\u6ce8\u610f\u4e8b\u9879",id:"-\u5173\u4e8epda\u7684\u6ce8\u610f\u4e8b\u9879",level:2}],u={toc:p},i="wrapper";function m(e){let{components:r,...s}=e;return(0,n.kt)(i,(0,t.Z)({},u,s,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"-pda-\u6df1\u5165\u63a2\u7a76"},"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76"),(0,n.kt)("p",null,"\u554a\uff0c\u9e21\u86cb\u3002\u6216\u8005\u6b63\u5f0f\u79f0\u4e4b\u4e3a\uff1a\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\u3002\u6211\u4eec\u4e4b\u524d\u5df2\u7ecf\u7528\u5b83\u4eec\u70f9\u996a\u8fc7\u3002\u8ba9\u6211\u4eec\u6253\u5f00\u5b83\u4eec\u770b\u770b\u5b83\u4eec\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002"),(0,n.kt)("p",null,"PDA\u4e3b\u8981\u6709\u4e24\u4e2a\u4e3b\u8981\u529f\u80fd\uff1a"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"\u63d0\u4f9b\u4e00\u79cd",(0,n.kt)("a",{parentName:"li",href:"https://www.google.com.hk/search?q=define+deterministic&utm_source=buildspace.so&utm_medium=buildspace_project"},"\u786e\u5b9a\u6027"),"\u7684\u65b9\u6cd5\u6765\u67e5\u627e\u7a0b\u5e8f\u62e5\u6709\u7684\u8d26\u6237\u7684\u5730\u5740"),(0,n.kt)("li",{parentName:"ul"},"\u6388\u6743\u6d3e\u751f\u81eaPDA\u7684\u7a0b\u5e8f\u4ee3\u8868\u5176\u7b7e\u7f72\uff0c\u5c31\u50cf\u7528\u6237\u53ef\u4ee5\u4f7f\u7528\u4ed6\u4eec\u7684\u79c1\u94a5\u7b7e\u7f72\u4e00\u6837")),(0,n.kt)("p",null,"\u6362\u53e5\u8bdd\u8bf4\uff0c\u5b83\u4eec\u662fSolana\u7f51\u7edc\u4e0a\u7528\u4e8e\u5b58\u50a8\u7684\u5b89\u5168\u952e\u503c\u5b58\u50a8\u3002"),(0,n.kt)("h2",{id:"-\u5bfb\u627e-pdas-pdas"},"\ud83d\udd0e \u5bfb\u627e PDAs (PDAs)"),(0,n.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6bcf\u5f53\u6211\u4eec\u9700\u8981\u6d3e\u751f\u4e00\u4e2a\u5730\u5740\u65f6\uff0c\u6211\u4eec\u90fd\u4f7f\u7528\u4e86\u4e00\u4e2a\u65b9\u4fbf\u7684\u51fd\u6570\u3002\u8fd9\u4e2a\u51fd\u6570\u5230\u5e95\u662f\u505a\u4ec0\u4e48\u7684\u5462\uff1f\u8981\u627e\u51fa\u7b54\u6848\uff0c\u6211\u4eec\u9700\u8981\u4e86\u89e3Solana\u5bc6\u94a5\u5bf9\u662f\u5982\u4f55\u751f\u6210\u7684\u3002"),(0,n.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b\u5bc6\u94a5\u5bf9\u7684\u4f5c\u7528\u3002\u5b83\u662f\u4e00\u79cd\u8bc1\u660e\u4f60\u662f\u4f60\u6240\u8bf4\u7684\u90a3\u4e2a\u4eba\u7684\u65b9\u5f0f\u3002\u6211\u4eec\u4f7f\u7528\u6570\u5b57\u7b7e\u540d\u7cfb\u7edf\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\u3002Solana\u7684\u5bc6\u94a5\u5bf9\u662f\u57fa\u4e8e\u6240\u8c13\u7684Ed25519\u692d\u5706\u66f2\u7ebf\uff08\u4f60\u4e0d\u9700\u8981\u77e5\u9053\u8fd9\u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f\uff09\u3002"),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(1418).Z,width:"1204",height:"844"})),(0,n.kt)("p",null,"\u7531\u4e8e",(0,n.kt)("inlineCode",{parentName:"p"},"PDAs"),"\u662f\u7531\u7a0b\u5e8f\u63a7\u5236\u7684\uff0c\u6240\u4ee5\u5b83\u4eec\u4e0d\u9700\u8981\u79c1\u94a5\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4f7f\u7528\u4e0d\u5728Ed25519\u66f2\u7ebf\u4e0a\u7684\u5730\u5740\u6765\u521b\u5efaPDAs\u3002\u8fd9\u5b9e\u9645\u4e0a\u610f\u5473\u7740\u5b83\u4eec\u662f\u6ca1\u6709\u76f8\u5e94\u79c1\u94a5\u7684\u516c\u94a5\u3002"),(0,n.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\u3002\u4f60\u4e0d\u9700\u8981\u7406\u89e3Ed25519\uff0c\u751a\u81f3\u4e0d\u9700\u8981\u77e5\u9053\u6570\u5b57\u7b7e\u540d\u7b97\u6cd5\u662f\u4ec0\u4e48\u3002\u4f60\u53ea\u9700\u8981\u77e5\u9053PDA\u770b\u8d77\u6765\u50cf\u666e\u901a\u7684Solana\u5730\u5740\uff0c\u5e76\u4e14\u7531\u7a0b\u5e8f\u63a7\u5236\u3002\u5982\u679c\u4f60\u60f3\u8fdb\u4e00\u6b65\u4e86\u89e3\uff0c\u53ef\u4ee5\u770b\u770bComputerphile\u5173\u4e8e",(0,n.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=s22eJ1eVLTU&utm_source=buildspace.so&utm_medium=buildspace_project"},"\u6570\u5b57\u7b7e\u540d"),"\u7684\u9177\u70ab\u89c6\u9891\u3002"),(0,n.kt)("p",null,"\u8981\u5728Solana\u7a0b\u5e8f\u4e2d\u627e\u5230\u4e00\u4e2aPDA\uff0c\u6211\u4eec\u5c06\u4f7f\u7528 find_program_address \u51fd\u6570\u3002"),(0,n.kt)("p",null,"\u201c\u79cd\u5b50\u201d\u662f\u7528\u4e8e\u6d3e\u751fPDA\u7684 find_program_address \u51fd\u6570\u7684\u53ef\u9009\u8f93\u5165\u3002\u4f8b\u5982\uff0c\u79cd\u5b50\u53ef\u4ee5\u662f\u4efb\u610f\u7ec4\u5408\uff1a"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"\u6307\u4ee4\u6570\u636e"),(0,n.kt)("li",{parentName:"ul"},"\u786c\u7f16\u7801\u7684\u503c"),(0,n.kt)("li",{parentName:"ul"},"\u5176\u4ed6\u8d26\u6237\u7684\u516c\u94a5")),(0,n.kt)("p",null,"find_program_address \u51fd\u6570\u63d0\u4f9b\u4e86\u4e00\u4e2a\u989d\u5916\u7684\u79cd\u5b50\uff0c\u79f0\u4e3a\u201cbump seed\u201d\uff0c\u4ee5\u786e\u4fdd\u7ed3\u679c\u4e0d\u5728Ed25519\u66f2\u7ebf\u4e0a"),(0,n.kt)("p",null,"\u4e00\u65e6\u627e\u5230\u6709\u6548\u7684PDA\uff0c\u8be5\u51fd\u6570\u5c06\u8fd4\u56de\u4e24\u4e2a\u503c\uff1a"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"PDA"),(0,n.kt)("li",{parentName:"ul"},"the bump that was used to derive the PDA")),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(2658).Z,width:"1500",height:"396"})),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let (pda, bump_seed) = Pubkey::find_program_address(&[user.key.as_ref(), user_input.as_bytes().as_ref(), "SEED".as_bytes()], program_id)\n')),(0,n.kt)("h2",{id:"-under-the-hood-of-find_program_address"},"\ud83c\udf73 Under the hood of find_program_address"),(0,n.kt)("p",null,"find_program_address \u662f\u4e00\u4e2a\u5192\u724c\u8d27 - \u5b83\u5b9e\u9645\u4e0a\u5c06\u8f93\u5165 seeds \u548c program_id \u4f20\u9012\u7ed9 try_find_program_address \u51fd\u6570"),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(2786).Z,width:"1500",height:"379"})),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'pub fn find_program_address(seeds: &[&[u8]], program_id: &Pubkey) -> (Pubkey, u8) {\n Self::try_find_program_address(seeds, program_id)\n .unwrap_or_else(|| panic!("Unable to find a viable program address bump seed"))\n}\n')),(0,n.kt)("p",null,"\u7136\u540e\uff0c try_find_program_address \u51fd\u6570\u5f15\u5165\u4e86 bump_seed \u3002"),(0,n.kt)("p",null,"bump_seed \u662f\u4e00\u4e2a u8 \u53d8\u91cf\uff0c\u5176\u503c\u8303\u56f4\u57280\u5230255\u4e4b\u95f4\uff0c\u5b83\u88ab\u9644\u52a0\u5230\u53ef\u9009\u7684\u8f93\u5165\u79cd\u5b50\u4e2d\uff0c\u7136\u540e\u4f20\u9012\u7ed9 create_program_address \u51fd\u6570"),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(2318).Z,width:"1470",height:"844"})),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn try_find_program_address(seeds: &[&[u8]], program_id: &Pubkey) -> Option<(Pubkey, u8)> {\n\n let mut bump_seed = [std::u8::MAX];\n for _ in 0..std::u8::MAX {\n {\n let mut seeds_with_bump = seeds.to_vec();\n seeds_with_bump.push(&bump_seed);\n match Self::create_program_address(&seeds_with_bump, program_id) {\n Ok(address) => return Some((address, bump_seed[0])),\n Err(PubkeyError::InvalidSeeds) => (),\n _ => break,\n }\n }\n bump_seed[0] -= 1;\n }\n None\n\n}\n")),(0,n.kt)("p",null,"create_program_address \u51fd\u6570\u5bf9\u79cd\u5b50\u548c program_id \u6267\u884c\u4e00\u7cfb\u5217\u54c8\u5e0c\u64cd\u4f5c\u3002\u8fd9\u4e9b\u64cd\u4f5c\u8ba1\u7b97\u4e00\u4e2a\u5bc6\u94a5\uff0c\u7136\u540e\u9a8c\u8bc1\u8ba1\u7b97\u51fa\u7684\u5bc6\u94a5\u662f\u5426\u4f4d\u4e8eEd25519\u692d\u5706\u66f2\u7ebf\u4e0a\u3002"),(0,n.kt)("p",null,"\u5982\u679c\u627e\u5230\u4e00\u4e2a\u6709\u6548\u7684PDA\uff08\u5373\u4e00\u4e2a\u4e0d\u5728\u66f2\u7ebf\u4e0a\u7684\u5730\u5740\uff09\uff0c\u5219\u8fd4\u56de\u8be5PDA\u3002\u5426\u5219\uff0c\u8fd4\u56de\u4e00\u4e2a\u9519\u8bef\u3002"),(0,n.kt)("p",null,(0,n.kt)("img",{src:a(6554).Z,width:"880",height:"844"})),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn create_program_address(\n seeds: &[&[u8]],\n program_id: &Pubkey,\n) -> Result {\n\n let mut hasher = crate::hash::Hasher::default();\n for seed in seeds.iter() {\n hasher.hash(seed);\n }\n hasher.hashv(&[program_id.as_ref(), PDA_MARKER]);\n let hash = hasher.result();\n\n if bytes_are_curve_point(hash) {\n return Err(PubkeyError::InvalidSeeds);\n }\n\n Ok(Pubkey::new(hash.as_ref()))\n\n}\n")),(0,n.kt)("p",null,"\u603b\u7ed3\u4e00\u4e0b\uff1a"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"\u8be5\u51fd\u6570\u5c06\u6211\u4eec\u7684\u8f93\u5165\u79cd\u5b50\u548c program_id \u4f20\u9012\u7ed9 try_find_program_address \u51fd\u6570\u3002"),(0,n.kt)("li",{parentName:"ul"},"try_find_program_address \u51fd\u6570\u5c06\u4e00\u4e2a bump_seed \uff08\u4ece255\u5f00\u59cb\uff09\u6dfb\u52a0\u5230\u6211\u4eec\u7684\u8f93\u5165\u79cd\u5b50\u4e2d\uff0c\u7136\u540e\u8c03\u7528 create_program_address \u51fd\u6570\uff0c\u76f4\u5230\u627e\u5230\u4e00\u4e2a\u6709\u6548\u7684PDA\u3002"),(0,n.kt)("li",{parentName:"ul"},"\u4e00\u65e6\u627e\u5230\uff0cPDA\u548c bump_seed \u90fd\u4f1a\u88ab\u5f52\u8fd8\u3002")),(0,n.kt)("p",null,"\u4f60\u4e0d\u9700\u8981\u8bb0\u4f4f\u6240\u6709\u7684\u7ec6\u8282\uff01\u91cd\u8981\u7684\u662f\u8981\u7406\u89e3\u5728\u9ad8\u5c42\u6b21\u4e0a\u8c03\u7528 find_program_address \u51fd\u6570\u65f6\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"),(0,n.kt)("h2",{id:"-\u5173\u4e8epda\u7684\u6ce8\u610f\u4e8b\u9879"},"\ud83e\udd14 \u5173\u4e8e\uff08PDA\uff09\u7684\u6ce8\u610f\u4e8b\u9879"))}m.isMDXComponent=!0},6554:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/create-program-address-a372e6f990f3981744c9d697844516c6.png"},2658:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/find-pda-fe645a6a415eda09eddc96221c074f99.png"},2786:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/find-program-address-a38b8175c5cbdd9ccf33ffc6f33e8e40.png"},1418:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/pda-a5bff67b5cd45b89420f1a94b25e790c.png"},2318:(e,r,a)=>{a.d(r,{Z:()=>t});const t=a.p+"assets/images/try-find-program-address-ec0b89673fe3c5978b19873a50660ce6.png"}}]); \ No newline at end of file diff --git a/assets/js/4cbf9b05.851c2dae.js b/assets/js/4cbf9b05.851c2dae.js deleted file mode 100644 index 335c11802..000000000 --- a/assets/js/4cbf9b05.851c2dae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2769],{3905:(e,n,a)=>{a.d(n,{Zo:()=>c,kt:()=>g});var l=a(7294);function o(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function r(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);n&&(l=l.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,l)}return a}function t(e){for(var n=1;n=0||(o[a]=e[a]);return o}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var i=l.createContext({}),s=function(e){var n=l.useContext(i),a=n;return e&&(a="function"==typeof e?e(n):t(t({},n),e)),a},c=function(e){var n=s(e.components);return l.createElement(i.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return l.createElement(l.Fragment,{},n)}},d=l.forwardRef((function(e,n){var a=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(a),d=o,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||r;return a?l.createElement(g,t(t({ref:n},c),{},{components:a})):l.createElement(g,t({ref:n},c))}));function g(e,n){var a=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var r=a.length,t=new Array(r);t[0]=d;var p={};for(var i in n)hasOwnProperty.call(n,i)&&(p[i]=n[i]);p.originalType=e,p[u]="string"==typeof e?e:o,t[1]=p;for(var s=2;s{a.r(n),a.d(n,{assets:()=>i,contentTitle:()=>t,default:()=>m,frontMatter:()=>r,metadata:()=>p,toc:()=>s});var l=a(7462),o=(a(7294),a(3905));const r={sidebar_position:8,sidebar_label:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},t="\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",p={unversionedId:"Solana-Co-Learn/module1/local_program_development/native_program_hello",id:"Solana-Co-Learn/module1/local_program_development/native_program_hello",title:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",description:"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002",source:"@site/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello.md",sourceDirName:"Solana-Co-Learn/module1/local_program_development",slug:"/Solana-Co-Learn/module1/local_program_development/native_program_hello",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8,sidebar_label:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/"},next:{title:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello"}},i={},s=[{value:"1. \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee",id:"1-\u521b\u5efa\u4e00\u4e2a\u65b0\u7684rust\u9879\u76ee",level:2},{value:"2. \u7f16\u5199\u4f60\u7684\u7a0b\u5e8f",id:"2-\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f",level:2},{value:"3. \u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668",id:"3-\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668",level:2},{value:"4. \u6784\u5efa\u548c\u90e8\u7f72",id:"4-\u6784\u5efa\u548c\u90e8\u7f72",level:2},{value:"5. \u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7",id:"5-\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7",level:2}],c={toc:s},u="wrapper";function m(e){let{components:n,...a}=e;return(0,o.kt)(u,(0,l.Z)({},c,a,{components:n,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"\u539f\u59cbsolana\u5408\u7ea6\u5b9e\u73b0hello-world"},"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b"),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u672c\u5730\u5b8c\u6210\u6240\u6709\u64cd\u4f5c\uff0c\u5305\u62ec\u90e8\u7f72\u5230\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u5df2\u7ecf\u5b89\u88c5\u4e86Rust\u548cSolana CLI\u3002\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u5b89\u88c5\uff0c\u8bf7\u53c2\u8003\u6982\u8ff0\u4e2d\u7684\u8bf4\u660e\u8fdb\u884c\u8bbe\u7f6e\u3002"),(0,o.kt)("h2",{id:"1-\u521b\u5efa\u4e00\u4e2a\u65b0\u7684rust\u9879\u76ee"},"1. \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee"),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee\u5f00\u59cb\u3002\u8fd0\u884c\u4e0b\u9762\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"cargo new --lib"),"\u547d\u4ee4\u3002\u968f\u610f\u7528\u4f60\u81ea\u5df1\u7684\u76ee\u5f55\u540d\u66ff\u6362\u5b83\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"cargo new --lib solana-hello-world-local\n")),(0,o.kt)("p",null,"\u8bb0\u5f97\u66f4\u65b0 cargo.toml \u6587\u4ef6\uff0c\u5c06 ",(0,o.kt)("inlineCode",{parentName:"p"},"solana-program")," \u6dfb\u52a0\u4e3a\u4f9d\u8d56\u9879\uff0c\u5e76\u68c0\u67e5 ",(0,o.kt)("inlineCode",{parentName:"p"},"crate-type")," \u662f\u5426\u5df2\u7ecf\u5b58\u5728\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[package]\nname = "solana-hello-world-local"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nsolana-program = "~1.8.14"\n\n[lib]\ncrate-type = ["cdylib", "lib"]\n')),(0,o.kt)("h2",{id:"2-\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f"},"2. \u7f16\u5199\u4f60\u7684\u7a0b\u5e8f"),(0,o.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528\u4e0b\u9762\u7684\u201cHello World\uff01\u201d\u7a0b\u5e8f\u66f4\u65b0lib.rs\u3002\u5f53\u7a0b\u5e8f\u88ab\u8c03\u7528\u65f6\uff0c\u8be5\u7a0b\u5e8f\u4f1a\u7b80\u5355\u5730\u5c06\u201cHello, world\uff01\u201d\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},'use solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg\n};\n\nentrypoint!(process_instruction);\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult{\n msg!("Hello, world!");\n\n Ok(())\n}\n')),(0,o.kt)("h2",{id:"3-\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"},"3. \u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"),(0,o.kt)("p",null,"\u5728\u7f16\u5199\u597d\u4f60\u7684\u7a0b\u5e8f\u4e4b\u540e\uff0c\u8ba9\u6211\u4eec\u786e\u4fdd\u6211\u4eec\u7684Solana CLI\u914d\u7f6e\u6307\u5411\u672c\u5730\u4e3b\u673a\uff0c\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"solana config set --url"),"\u547d\u4ee4\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --url localhost\n")),(0,o.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"solana config get"),"\u547d\u4ee4\u68c0\u67e5Solana CLI\u914d\u7f6e\u662f\u5426\u5df2\u66f4\u65b0\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana config get\n")),(0,o.kt)("p",null,"\u6700\u540e\uff0c\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u5728\u4e00\u4e2a\u5355\u72ec\u7684\u7ec8\u7aef\u7a97\u53e3\u4e2d\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"solana-test-validator"),"\u547d\u4ee4\u3002\u53ea\u6709\u5f53\u6211\u4eec\u7684RPC URL\u8bbe\u7f6e\u4e3alocalhost\u65f6\u624d\u9700\u8981\u8fd9\u6837\u505a\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana-test-validator\n")),(0,o.kt)("h2",{id:"4-\u6784\u5efa\u548c\u90e8\u7f72"},"4. \u6784\u5efa\u548c\u90e8\u7f72"),(0,o.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u51c6\u5907\u597d\u6784\u5efa\u548c\u90e8\u7f72\u6211\u4eec\u7684\u7a0b\u5e8f\u4e86\u3002\u901a\u8fc7\u8fd0\u884c ",(0,o.kt)("inlineCode",{parentName:"p"},"cargo build-sbf")," \u547d\u4ee4\u6765\u6784\u5efa\u7a0b\u5e8f\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"cargo build-sbf\n")),(0,o.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u90e8\u7f72\u6211\u4eec\u7684\u7a0b\u5e8f\u3002\u8fd0\u884c\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"cargo build-sbf"),"\u547d\u4ee4\u8f93\u51fa\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"solana program deploy"),"\u547d\u4ee4\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana program deploy \n")),(0,o.kt)("p",null,"solana\u7a0b\u5e8f\u90e8\u7f72\u5c06\u8f93\u51fa\u60a8\u7684\u7a0b\u5e8f\u7684\u7a0b\u5e8fID\u3002\u60a8\u73b0\u5728\u53ef\u4ee5\u5728",(0,o.kt)("a",{parentName:"p",href:"https://explorer.solana.com/?cluster=custom"},"Solana Explorer"),"\u4e0a\u67e5\u627e\u5df2\u90e8\u7f72\u7684\u7a0b\u5e8f\uff08\u5bf9\u4e8e\u672c\u5730\u4e3b\u673a\uff0c\u8bf7\u9009\u62e9\u201c\u81ea\u5b9a\u4e49RPC URL\u201d\u4f5c\u4e3a\u96c6\u7fa4\uff09\u3002"),(0,o.kt)("h2",{id:"5-\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7"},"5. \u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7"),(0,o.kt)("p",null,"\u5728\u6211\u4eec\u8c03\u7528\u7a0b\u5e8f\u4e4b\u524d\uff0c\u6253\u5f00\u4e00\u4e2a\u5355\u72ec\u7684\u7ec8\u7aef\u5e76\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u3002\u8fd9\u5c06\u5141\u8bb8\u6211\u4eec\u5728\u7ec8\u7aef\u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana logs \n")),(0,o.kt)("p",null,"\u5728\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u4ecd\u5728\u8fd0\u884c\u65f6\uff0c\u5c1d\u8bd5\u4f7f\u7528",(0,o.kt)("a",{parentName:"p",href:"https://github.com/Unboxed-Software/solana-hello-world-client"},"\u6b64\u5904"),"\u7684\u5ba2\u6237\u7aef\u811a\u672c\u8c03\u7528\u60a8\u7684\u7a0b\u5e8f\u3002"),(0,o.kt)("p",null,"\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"index.ts"),"\u4e2d\u7528\u521a\u521a\u90e8\u7f72\u7684\u7a0b\u5e8fID\u66ff\u6362\u6389\u539f\u6765\u7684\u7a0b\u5e8fID\uff0c\u7136\u540e\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"npm install"),"\uff0c\u63a5\u7740\u8fd0\u884cnpm start\u3002\u8fd9\u5c06\u8fd4\u56de\u4e00\u4e2aSolana Explorer\u7684URL\u3002\u5c06URL\u590d\u5236\u5230\u6d4f\u89c8\u5668\u4e2d\uff0c\u5728Solana Explorer\u4e0a\u67e5\u627e\u8be5\u4ea4\u6613\uff0c\u5e76\u68c0\u67e5\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u662f\u5426\u6253\u5370\u4e86\u201cHello, world!\u201d\u3002\u6216\u8005\uff0c\u60a8\u53ef\u4ee5\u5728\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u7684\u7ec8\u7aef\u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\u3002"),(0,o.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\uff01\u60a8\u521a\u521a\u5728\u672c\u5730\u5f00\u53d1\u73af\u5883\u4e2d\u521b\u5efa\u5e76\u90e8\u7f72\u4e86\u60a8\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f\u3002"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4cbf9b05.ee2381b4.js b/assets/js/4cbf9b05.ee2381b4.js new file mode 100644 index 000000000..b29173e82 --- /dev/null +++ b/assets/js/4cbf9b05.ee2381b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2769],{3905:(e,n,a)=>{a.d(n,{Zo:()=>c,kt:()=>g});var l=a(7294);function o(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function r(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);n&&(l=l.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,l)}return a}function t(e){for(var n=1;n=0||(o[a]=e[a]);return o}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var i=l.createContext({}),s=function(e){var n=l.useContext(i),a=n;return e&&(a="function"==typeof e?e(n):t(t({},n),e)),a},c=function(e){var n=s(e.components);return l.createElement(i.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return l.createElement(l.Fragment,{},n)}},d=l.forwardRef((function(e,n){var a=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(a),d=o,g=u["".concat(i,".").concat(d)]||u[d]||m[d]||r;return a?l.createElement(g,t(t({ref:n},c),{},{components:a})):l.createElement(g,t({ref:n},c))}));function g(e,n){var a=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var r=a.length,t=new Array(r);t[0]=d;var p={};for(var i in n)hasOwnProperty.call(n,i)&&(p[i]=n[i]);p.originalType=e,p[u]="string"==typeof e?e:o,t[1]=p;for(var s=2;s{a.r(n),a.d(n,{assets:()=>i,contentTitle:()=>t,default:()=>m,frontMatter:()=>r,metadata:()=>p,toc:()=>s});var l=a(7462),o=(a(7294),a(3905));const r={sidebar_position:8,sidebar_label:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},t="\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",p={unversionedId:"Solana-Co-Learn/module1/local_program_development/native_program_hello",id:"Solana-Co-Learn/module1/local_program_development/native_program_hello",title:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",description:"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002",source:"@site/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello.md",sourceDirName:"Solana-Co-Learn/module1/local_program_development",slug:"/Solana-Co-Learn/module1/local_program_development/native_program_hello",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8,sidebar_label:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/"},next:{title:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello"}},i={},s=[{value:"1. \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee",id:"1-\u521b\u5efa\u4e00\u4e2a\u65b0\u7684rust\u9879\u76ee",level:2},{value:"2. \u7f16\u5199\u4f60\u7684\u7a0b\u5e8f",id:"2-\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f",level:2},{value:"3. \u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668",id:"3-\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668",level:2},{value:"4. \u6784\u5efa\u548c\u90e8\u7f72",id:"4-\u6784\u5efa\u548c\u90e8\u7f72",level:2},{value:"5. \u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7",id:"5-\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7",level:2}],c={toc:s},u="wrapper";function m(e){let{components:n,...a}=e;return(0,o.kt)(u,(0,l.Z)({},c,a,{components:n,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"\u539f\u59cbsolana\u5408\u7ea6\u5b9e\u73b0hello-world"},"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b"),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u672c\u5730\u5b8c\u6210\u6240\u6709\u64cd\u4f5c\uff0c\u5305\u62ec\u90e8\u7f72\u5230\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u5df2\u7ecf\u5b89\u88c5\u4e86Rust\u548cSolana CLI\u3002\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u5b89\u88c5\uff0c\u8bf7\u53c2\u8003\u6982\u8ff0\u4e2d\u7684\u8bf4\u660e\u8fdb\u884c\u8bbe\u7f6e\u3002"),(0,o.kt)("h2",{id:"1-\u521b\u5efa\u4e00\u4e2a\u65b0\u7684rust\u9879\u76ee"},"1. \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee"),(0,o.kt)("p",null,"\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee\u5f00\u59cb\u3002\u8fd0\u884c\u4e0b\u9762\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"cargo new --lib"),"\u547d\u4ee4\u3002\u968f\u610f\u7528\u4f60\u81ea\u5df1\u7684\u76ee\u5f55\u540d\u66ff\u6362\u5b83\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"cargo new --lib solana-hello-world-local\n")),(0,o.kt)("p",null,"\u8bb0\u5f97\u66f4\u65b0 cargo.toml \u6587\u4ef6\uff0c\u5c06 ",(0,o.kt)("inlineCode",{parentName:"p"},"solana-program")," \u6dfb\u52a0\u4e3a\u4f9d\u8d56\u9879\uff0c\u5e76\u68c0\u67e5 ",(0,o.kt)("inlineCode",{parentName:"p"},"crate-type")," \u662f\u5426\u5df2\u7ecf\u5b58\u5728\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[package]\nname = "solana-hello-world-local"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nsolana-program = "~1.8.14"\n\n[lib]\ncrate-type = ["cdylib", "lib"]\n')),(0,o.kt)("h2",{id:"2-\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f"},"2. \u7f16\u5199\u4f60\u7684\u7a0b\u5e8f"),(0,o.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528\u4e0b\u9762\u7684\u201cHello World\uff01\u201d\u7a0b\u5e8f\u66f4\u65b0lib.rs\u3002\u5f53\u7a0b\u5e8f\u88ab\u8c03\u7528\u65f6\uff0c\u8be5\u7a0b\u5e8f\u4f1a\u7b80\u5355\u5730\u5c06\u201cHello, world\uff01\u201d\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},'use solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg\n};\n\nentrypoint!(process_instruction);\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult{\n msg!("Hello, world!");\n\n Ok(())\n}\n')),(0,o.kt)("h2",{id:"3-\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"},"3. \u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"),(0,o.kt)("p",null,"\u5728\u7f16\u5199\u597d\u4f60\u7684\u7a0b\u5e8f\u4e4b\u540e\uff0c\u8ba9\u6211\u4eec\u786e\u4fdd\u6211\u4eec\u7684Solana CLI\u914d\u7f6e\u6307\u5411\u672c\u5730\u4e3b\u673a\uff0c\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"solana config set --url"),"\u547d\u4ee4\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --url localhost\n")),(0,o.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528",(0,o.kt)("inlineCode",{parentName:"p"},"solana config get"),"\u547d\u4ee4\u68c0\u67e5Solana CLI\u914d\u7f6e\u662f\u5426\u5df2\u66f4\u65b0\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana config get\n")),(0,o.kt)("p",null,"\u6700\u540e\uff0c\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u5728\u4e00\u4e2a\u5355\u72ec\u7684\u7ec8\u7aef\u7a97\u53e3\u4e2d\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"solana-test-validator"),"\u547d\u4ee4\u3002\u53ea\u6709\u5f53\u6211\u4eec\u7684RPC URL\u8bbe\u7f6e\u4e3alocalhost\u65f6\u624d\u9700\u8981\u8fd9\u6837\u505a\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana-test-validator\n")),(0,o.kt)("h2",{id:"4-\u6784\u5efa\u548c\u90e8\u7f72"},"4. \u6784\u5efa\u548c\u90e8\u7f72"),(0,o.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u51c6\u5907\u597d\u6784\u5efa\u548c\u90e8\u7f72\u6211\u4eec\u7684\u7a0b\u5e8f\u4e86\u3002\u901a\u8fc7\u8fd0\u884c ",(0,o.kt)("inlineCode",{parentName:"p"},"cargo build-sbf")," \u547d\u4ee4\u6765\u6784\u5efa\u7a0b\u5e8f\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"cargo build-sbf\n")),(0,o.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u90e8\u7f72\u6211\u4eec\u7684\u7a0b\u5e8f\u3002\u8fd0\u884c\u4ece",(0,o.kt)("inlineCode",{parentName:"p"},"cargo build-sbf"),"\u547d\u4ee4\u8f93\u51fa\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"solana program deploy"),"\u547d\u4ee4\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana program deploy \n")),(0,o.kt)("p",null,"solana\u7a0b\u5e8f\u90e8\u7f72\u5c06\u8f93\u51fa\u60a8\u7684\u7a0b\u5e8f\u7684\u7a0b\u5e8fID\u3002\u60a8\u73b0\u5728\u53ef\u4ee5\u5728",(0,o.kt)("a",{parentName:"p",href:"https://explorer.solana.com/?cluster=custom"},"Solana Explorer"),"\u4e0a\u67e5\u627e\u5df2\u90e8\u7f72\u7684\u7a0b\u5e8f\uff08\u5bf9\u4e8e\u672c\u5730\u4e3b\u673a\uff0c\u8bf7\u9009\u62e9\u201c\u81ea\u5b9a\u4e49RPC URL\u201d\u4f5c\u4e3a\u96c6\u7fa4\uff09\u3002"),(0,o.kt)("h2",{id:"5-\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7"},"5. \u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7"),(0,o.kt)("p",null,"\u5728\u6211\u4eec\u8c03\u7528\u7a0b\u5e8f\u4e4b\u524d\uff0c\u6253\u5f00\u4e00\u4e2a\u5355\u72ec\u7684\u7ec8\u7aef\u5e76\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u3002\u8fd9\u5c06\u5141\u8bb8\u6211\u4eec\u5728\u7ec8\u7aef\u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\u3002"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"solana logs \n")),(0,o.kt)("p",null,"\u5728\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u4ecd\u5728\u8fd0\u884c\u65f6\uff0c\u5c1d\u8bd5\u4f7f\u7528",(0,o.kt)("a",{parentName:"p",href:"https://github.com/Unboxed-Software/solana-hello-world-client"},"\u6b64\u5904"),"\u7684\u5ba2\u6237\u7aef\u811a\u672c\u8c03\u7528\u60a8\u7684\u7a0b\u5e8f\u3002"),(0,o.kt)("p",null,"\u5728",(0,o.kt)("inlineCode",{parentName:"p"},"index.ts"),"\u4e2d\u7528\u521a\u521a\u90e8\u7f72\u7684\u7a0b\u5e8fID\u66ff\u6362\u6389\u539f\u6765\u7684\u7a0b\u5e8fID\uff0c\u7136\u540e\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"npm install"),"\uff0c\u63a5\u7740\u8fd0\u884cnpm start\u3002\u8fd9\u5c06\u8fd4\u56de\u4e00\u4e2aSolana Explorer\u7684URL\u3002\u5c06URL\u590d\u5236\u5230\u6d4f\u89c8\u5668\u4e2d\uff0c\u5728Solana Explorer\u4e0a\u67e5\u627e\u8be5\u4ea4\u6613\uff0c\u5e76\u68c0\u67e5\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u662f\u5426\u6253\u5370\u4e86\u201cHello, world!\u201d\u3002\u6216\u8005\uff0c\u60a8\u53ef\u4ee5\u5728\u8fd0\u884c",(0,o.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u7684\u7ec8\u7aef\u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\u3002"),(0,o.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\uff01\u60a8\u521a\u521a\u5728\u672c\u5730\u5f00\u53d1\u73af\u5883\u4e2d\u521b\u5efa\u5e76\u90e8\u7f72\u4e86\u60a8\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f\u3002"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4fc3eaac.575430b3.js b/assets/js/4fc3eaac.575430b3.js new file mode 100644 index 000000000..834813be2 --- /dev/null +++ b/assets/js/4fc3eaac.575430b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[43],{3905:(e,t,a)=>{a.d(t,{Zo:()=>i,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},i=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,i=c(e,["components","mdxType","originalType","parentName"]),u=s(a),m=r,k=u["".concat(p,".").concat(m)]||u[m]||d[m]||l;return a?n.createElement(k,o(o({ref:t},i),{},{components:a})):n.createElement(k,o({ref:t},i))}));function k(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,o=new Array(l);o[0]=m;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[u]="string"==typeof e?e:r,o[1]=c;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>c,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const l={},o="Solana\u94b1\u5305\u4f7f\u7528",c={unversionedId:"Solana-Co-Learn/module1/wallet-usage/README",id:"Solana-Co-Learn/module1/wallet-usage/README",title:"Solana\u94b1\u5305\u4f7f\u7528",description:"Solana\u7684\u94b1\u5305\u6709\u5f88\u591a\uff0c\u6bd4\u5982\u5f88\u6709\u7684Phantom\u94b1\u5305\u3002\u4f46\u662f\u8fd9\u91cc\u6211\u4e0d\u5728\u63a8\u8350\u4f7f\u7528Phantom\uff0c\u56e0\u4e3a\u4ed6\u5bf9\u4e8e\u5f00\u53d1\u8005",source:"@site/docs/Solana-Co-Learn/module1/wallet-usage/README.md",sourceDirName:"Solana-Co-Learn/module1/wallet-usage",slug:"/Solana-Co-Learn/module1/wallet-usage/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallet-usage/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/wallet-usage/README.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/"},next:{title:"Module2",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/"}},p={},s=[{value:"\u4e0b\u8f7dBackpack\u94b1\u5305",id:"\u4e0b\u8f7dbackpack\u94b1\u5305",level:2},{value:"\u521b\u5efa\u8d26\u6237",id:"\u521b\u5efa\u8d26\u6237",level:2},{value:"\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684RPC Endpoint",id:"\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684rpc-endpoint",level:2}],i={toc:s},u="wrapper";function d(e){let{components:t,...l}=e;return(0,r.kt)(u,(0,n.Z)({},i,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"solana\u94b1\u5305\u4f7f\u7528"},"Solana\u94b1\u5305\u4f7f\u7528"),(0,r.kt)("p",null,"Solana\u7684\u94b1\u5305\u6709\u5f88\u591a\uff0c\u6bd4\u5982\u5f88\u6709\u7684Phantom\u94b1\u5305\u3002\u4f46\u662f\u8fd9\u91cc\u6211\u4e0d\u5728\u63a8\u8350\u4f7f\u7528Phantom\uff0c\u56e0\u4e3a\u4ed6\u5bf9\u4e8e\u5f00\u53d1\u8005\n\u6765\u8bf4\uff0c\u4e0d\u662f\u5f88\u53cb\u597d\u3002"),(0,r.kt)("p",null,"\u5728\u672c\u5730\u5f00\u53d1\u7684\u65f6\u5019\u4e0d\u652f\u6301\u672c\u5730RPC\u5730\u5740\uff0c\u53ea\u80fd\u4f7f\u7528Solana\u5b98\u65b9\u7684\u6d4b\u8bd5\u7f51\uff0c\u8fd9\u6837\u7684\u8bdd\uff0c\u5f00\u53d1\u8005\u5728\u672c\u5730\u5f00\u53d1\u7684\u65f6\u5019\u5c31\u4e0d\u53ef\u4ee5\u3002\u8fd9\u4e5f\u662f\u6211\u63a8\u8350Backpack\u94b1\u5305\u7684\u539f\u56e0\u3002"),(0,r.kt)("h2",{id:"\u4e0b\u8f7dbackpack\u94b1\u5305"},"\u4e0b\u8f7dBackpack\u94b1\u5305"),(0,r.kt)("p",null,"\u4e0b\u8f7d\u5730\u5740\uff1a",(0,r.kt)("a",{parentName:"p",href:"https://www.backpack.app/"},"https://www.backpack.app/")," \u662f\u8fd9\u4e2a\u3002\u70b9\u51fb\u91cc\u9762\u7684Download\uff0c\u7136\u540e\u9009\u62e9\u81ea\u5df1\u7684\u6d4f\u89c8\u5668\u63d2\u4ef6\u3002"),(0,r.kt)("p",null,"\u76ee\u524d\u53ea\u652f\u6301Chrome\u548cBrave, Arc\u6d4f\u89c8\u5668\u3002\u79fb\u52a8\u7aef\u8fd8\u5728\u5f00\u53d1\u3002"),(0,r.kt)("h2",{id:"\u521b\u5efa\u8d26\u6237"},"\u521b\u5efa\u8d26\u6237"),(0,r.kt)("p",null,"\u4e0b\u8f7d\u5b8c\u4e4b\u540e\u8fd9\u4e2a\u5c31\u662f\u767b\u5f55\u754c\u9762\uff0c\u70b9\u51fbCreate Account\u521b\u5efa\u8d26\u6237\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(1642).Z,width:"1148",height:"1472"})),(0,r.kt)("p",null,"\u4e0b\u9762\u662fClaim \u8d26\u6237\u7684\u540d\u5b57, \u8f93\u5165\u4f60\u81ea\u5df2\u8981\u521b\u5efa\u7684\u8d26\u6237\u540d\u5b57\uff0c\u7136\u540e\u70b9\u51fbClaim Name\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(6299).Z,width:"956",height:"1334"})),(0,r.kt)("p",null,"\u4e4b\u540e\u4f1a\u8df3\u8f6c\u5230\u521b\u5efa\u65b0\u7684\u94b1\u5305\u6216\u8005\u5bfc\u5165\u79c1\u94a5\u7684\u754c\u9762\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u62e9\u521b\u5efa\u65b0\u7684\u94b1\u5305\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(684).Z,width:"980",height:"1380"})),(0,r.kt)("p",null,"\u4e4b\u540e\u51fa\u73b0\u52a9\u8bb0\u8bcd\u754c\u9762\uff0c\u6211\u4eec\u8fd9\u91cc\u53ef\u4ee5\u4fdd\u5b58\u81ea\u5df1\u7684\u52a9\u8bb0\u8bcd\u5230\u672c\u5730\uff0c\u7136\u540e\u70b9\u51fb\u4e0b\u4e00\u6b65\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(7910).Z,width:"934",height:"1322"})),(0,r.kt)("p",null,"\u56e0\u4e3abackpack\u4e5f\u662f\u4e00\u4e2a\u591a\u94fe\u94b1\u5305\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u62e9Solana\uff0c\u7136\u540e\u70b9\u51fb\u4e0b\u4e00\u6b65\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(9343).Z,width:"930",height:"1340"})),(0,r.kt)("h2",{id:"\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684rpc-endpoint"},"\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684RPC Endpoint"),(0,r.kt)("p",null,"\u8d26\u6237\u521b\u5efa\u597d\u4e86\u4e0b\u9762\u6211\u4eec\u5f00\u59cb\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684RPC Endpoint\uff0c\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u8bbe\u7f6e\u6309\u94ae\uff0c\u7136\u540e\u9009\u62e9Perference\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(5277).Z,width:"712",height:"1188"})),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(2118).Z,width:"738",height:"1188"})),(0,r.kt)("p",null,"\u4e4b\u540e\u6211\u4eec\u70b9\u51fbPerference\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(6570).Z,width:"720",height:"1164"})),(0,r.kt)("p",null,"\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u6709\u4e24\u4e2a\u7f51\u7edc\u4e00\u4e2a\u662fSolana\u4e00\u4e2a\u662f\u4ee5\u592a\u574a\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u62e9Solana\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(2158).Z,width:"732",height:"1128"})),(0,r.kt)("p",null,"\u8fd9\u91cc\u5c31\u662f\u8bbe\u7f6e\u81ea\u5b9a\u4e49rpc\u7684\u5730\u65b9\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u62e9\u4e86localnet\u3002"),(0,r.kt)("p",null,"\u5bf9\u4e8eCustom\uff0c\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4ee5\u4f60\u7684Rpc\u5730\u5740\uff0c\u9664\u4e86\u5b98\u65b9\u63d0\u4f9b\u7684testnet\u6216\u8005mainbeta\u7684\u5730\u5740\uff0c\u4f60\u53ef\u4ee5\u53bbquikcnode\u6216\u8005helius\u7533\u8bf7\u4f60\u81ea\u5df1\u7684rpc\u5730\u5740\u4f7f\u7528\u3002"))}d.isMDXComponent=!0},9343:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-chose-solana-619ea35996be176993ccd2a830ff23d5.png"},6299:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-cliam-name-fdce6ba8077feede49110a9ae3345ac1.png"},1642:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-create-account-21a5953e492d5059b54da65fc729c997.png"},684:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-create-new-wallet-30e46801d9b8095ad44367d252a1a9a1.png"},2158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-custom-rpc-683623854cecfaba3d7d7bafff72403e.png"},7910:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-mnemonic-255696ab2ad464206bd47fe1939aee17.png"},6570:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-perference-19fcfce38d274e7c89add83a9cf81de7.png"},5277:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-setting-b1988f897602ef8146ca09bb079ddbb2.png"},2118:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-setting1-8d1a99ca0c0763c2440f365a03f45474.png"}}]); \ No newline at end of file diff --git a/assets/js/4fc3eaac.f76bd32e.js b/assets/js/4fc3eaac.f76bd32e.js deleted file mode 100644 index 601254c1f..000000000 --- a/assets/js/4fc3eaac.f76bd32e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[43],{3905:(e,t,a)=>{a.d(t,{Zo:()=>i,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function c(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},i=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,c=e.originalType,p=e.parentName,i=o(e,["components","mdxType","originalType","parentName"]),u=s(a),m=r,k=u["".concat(p,".").concat(m)]||u[m]||d[m]||c;return a?n.createElement(k,l(l({ref:t},i),{},{components:a})):n.createElement(k,l({ref:t},i))}));function k(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var c=a.length,l=new Array(c);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[u]="string"==typeof e?e:r,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>c,metadata:()=>o,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const c={},l="Solana\u94b1\u5305\u4f7f\u7528",o={unversionedId:"Solana-Co-Learn/module1/wallet-usage/README",id:"Solana-Co-Learn/module1/wallet-usage/README",title:"Solana\u94b1\u5305\u4f7f\u7528",description:"Solana\u7684\u94b1\u5305\u6709\u5f88\u591a\uff0c\u6bd4\u5982\u5f88\u6709\u7684Phantom\u94b1\u5305\u3002\u4f46\u662f\u8fd9\u91cc\u6211\u4e0d\u5728\u63a8\u8350\u4f7f\u7528Phantom\uff0c\u56e0\u4e3a\u4ed6\u5bf9\u4e8e\u5f00\u53d1\u8005",source:"@site/docs/Solana-Co-Learn/module1/wallet-usage/README.md",sourceDirName:"Solana-Co-Learn/module1/wallet-usage",slug:"/Solana-Co-Learn/module1/wallet-usage/",permalink:"/docs/Solana-Co-Learn/module1/wallet-usage/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/wallet-usage/README.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",permalink:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/"},next:{title:"Module2",permalink:"/docs/Solana-Co-Learn/module2/"}},p={},s=[{value:"\u4e0b\u8f7dBackpack\u94b1\u5305",id:"\u4e0b\u8f7dbackpack\u94b1\u5305",level:2},{value:"\u521b\u5efa\u8d26\u6237",id:"\u521b\u5efa\u8d26\u6237",level:2},{value:"\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684RPC Endpoint",id:"\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684rpc-endpoint",level:2}],i={toc:s},u="wrapper";function d(e){let{components:t,...c}=e;return(0,r.kt)(u,(0,n.Z)({},i,c,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"solana\u94b1\u5305\u4f7f\u7528"},"Solana\u94b1\u5305\u4f7f\u7528"),(0,r.kt)("p",null,"Solana\u7684\u94b1\u5305\u6709\u5f88\u591a\uff0c\u6bd4\u5982\u5f88\u6709\u7684Phantom\u94b1\u5305\u3002\u4f46\u662f\u8fd9\u91cc\u6211\u4e0d\u5728\u63a8\u8350\u4f7f\u7528Phantom\uff0c\u56e0\u4e3a\u4ed6\u5bf9\u4e8e\u5f00\u53d1\u8005\n\u6765\u8bf4\uff0c\u4e0d\u662f\u5f88\u53cb\u597d\u3002"),(0,r.kt)("p",null,"\u5728\u672c\u5730\u5f00\u53d1\u7684\u65f6\u5019\u4e0d\u652f\u6301\u672c\u5730RPC\u5730\u5740\uff0c\u53ea\u80fd\u4f7f\u7528Solana\u5b98\u65b9\u7684\u6d4b\u8bd5\u7f51\uff0c\u8fd9\u6837\u7684\u8bdd\uff0c\u5f00\u53d1\u8005\u5728\u672c\u5730\u5f00\u53d1\u7684\u65f6\u5019\u5c31\u4e0d\u53ef\u4ee5\u3002\u8fd9\u4e5f\u662f\u6211\u63a8\u8350Backpack\u94b1\u5305\u7684\u539f\u56e0\u3002"),(0,r.kt)("h2",{id:"\u4e0b\u8f7dbackpack\u94b1\u5305"},"\u4e0b\u8f7dBackpack\u94b1\u5305"),(0,r.kt)("p",null,"\u4e0b\u8f7d\u5730\u5740\uff1a",(0,r.kt)("a",{parentName:"p",href:"https://www.backpack.app/"},"https://www.backpack.app/")," \u662f\u8fd9\u4e2a\u3002\u70b9\u51fb\u91cc\u9762\u7684Download\uff0c\u7136\u540e\u9009\u62e9\u81ea\u5df1\u7684\u6d4f\u89c8\u5668\u63d2\u4ef6\u3002"),(0,r.kt)("p",null,"\u76ee\u524d\u53ea\u652f\u6301Chrome\u548cBrave, Arc\u6d4f\u89c8\u5668\u3002\u79fb\u52a8\u7aef\u8fd8\u5728\u5f00\u53d1\u3002"),(0,r.kt)("h2",{id:"\u521b\u5efa\u8d26\u6237"},"\u521b\u5efa\u8d26\u6237"),(0,r.kt)("p",null,"\u4e0b\u8f7d\u5b8c\u4e4b\u540e\u8fd9\u4e2a\u5c31\u662f\u767b\u5f55\u754c\u9762\uff0c\u70b9\u51fbCreate Account\u521b\u5efa\u8d26\u6237\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(1642).Z,width:"1148",height:"1472"})),(0,r.kt)("p",null,"\u4e0b\u9762\u662fClaim \u8d26\u6237\u7684\u540d\u5b57, \u8f93\u5165\u4f60\u81ea\u5df2\u8981\u521b\u5efa\u7684\u8d26\u6237\u540d\u5b57\uff0c\u7136\u540e\u70b9\u51fbClaim Name\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(6299).Z,width:"956",height:"1334"})),(0,r.kt)("p",null,"\u4e4b\u540e\u4f1a\u8df3\u8f6c\u5230\u521b\u5efa\u65b0\u7684\u94b1\u5305\u6216\u8005\u5bfc\u5165\u79c1\u94a5\u7684\u754c\u9762\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u62e9\u521b\u5efa\u65b0\u7684\u94b1\u5305\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(684).Z,width:"980",height:"1380"})),(0,r.kt)("p",null,"\u4e4b\u540e\u51fa\u73b0\u52a9\u8bb0\u8bcd\u754c\u9762\uff0c\u6211\u4eec\u8fd9\u91cc\u53ef\u4ee5\u4fdd\u5b58\u81ea\u5df1\u7684\u52a9\u8bb0\u8bcd\u5230\u672c\u5730\uff0c\u7136\u540e\u70b9\u51fb\u4e0b\u4e00\u6b65\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(7910).Z,width:"934",height:"1322"})),(0,r.kt)("p",null,"\u56e0\u4e3abackpack\u4e5f\u662f\u4e00\u4e2a\u591a\u94fe\u94b1\u5305\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u62e9Solana\uff0c\u7136\u540e\u70b9\u51fb\u4e0b\u4e00\u6b65\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(9343).Z,width:"930",height:"1340"})),(0,r.kt)("h2",{id:"\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684rpc-endpoint"},"\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684RPC Endpoint"),(0,r.kt)("p",null,"\u8d26\u6237\u521b\u5efa\u597d\u4e86\u4e0b\u9762\u6211\u4eec\u5f00\u59cb\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684RPC Endpoint\uff0c\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u8bbe\u7f6e\u6309\u94ae\uff0c\u7136\u540e\u9009\u62e9Perference\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(5277).Z,width:"712",height:"1188"})),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(2118).Z,width:"738",height:"1188"})),(0,r.kt)("p",null,"\u4e4b\u540e\u6211\u4eec\u70b9\u51fbPerference\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(6570).Z,width:"720",height:"1164"})),(0,r.kt)("p",null,"\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u6709\u4e24\u4e2a\u7f51\u7edc\u4e00\u4e2a\u662fSolana\u4e00\u4e2a\u662f\u4ee5\u592a\u574a\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u62e9Solana\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:a(2158).Z,width:"732",height:"1128"})),(0,r.kt)("p",null,"\u8fd9\u91cc\u5c31\u662f\u8bbe\u7f6e\u81ea\u5b9a\u4e49rpc\u7684\u5730\u65b9\uff0c\u8fd9\u91cc\u6211\u4eec\u9009\u62e9\u4e86localnet\u3002"),(0,r.kt)("p",null,"\u5bf9\u4e8eCustom\uff0c\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4ee5\u4f60\u7684Rpc\u5730\u5740\uff0c\u9664\u4e86\u5b98\u65b9\u63d0\u4f9b\u7684testnet\u6216\u8005mainbeta\u7684\u5730\u5740\uff0c\u4f60\u53ef\u4ee5\u53bbquikcnode\u6216\u8005helius\u7533\u8bf7\u4f60\u81ea\u5df1\u7684rpc\u5730\u5740\u4f7f\u7528\u3002"))}d.isMDXComponent=!0},9343:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-chose-solana-619ea35996be176993ccd2a830ff23d5.png"},6299:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-cliam-name-fdce6ba8077feede49110a9ae3345ac1.png"},1642:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-create-account-21a5953e492d5059b54da65fc729c997.png"},684:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-create-new-wallet-30e46801d9b8095ad44367d252a1a9a1.png"},2158:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-custom-rpc-683623854cecfaba3d7d7bafff72403e.png"},7910:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-mnemonic-255696ab2ad464206bd47fe1939aee17.png"},6570:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-perference-19fcfce38d274e7c89add83a9cf81de7.png"},5277:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-setting-b1988f897602ef8146ca09bb079ddbb2.png"},2118:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/backpack-setting1-8d1a99ca0c0763c2440f365a03f45474.png"}}]); \ No newline at end of file diff --git a/assets/js/5b601c6d.94140d42.js b/assets/js/5b601c6d.94140d42.js new file mode 100644 index 000000000..edc711789 --- /dev/null +++ b/assets/js/5b601c6d.94140d42.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7702],{1563:a=>{a.exports=JSON.parse('{"label":"IBC","permalink":"/all-in-one-solana/blog/tags/ibc","allTagsPath":"/all-in-one-solana/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/5c26d4ea.2804e305.js b/assets/js/5c26d4ea.2804e305.js new file mode 100644 index 000000000..aa3f63ab2 --- /dev/null +++ b/assets/js/5c26d4ea.2804e305.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[297],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(n),d=r,k=c["".concat(s,".").concat(d)]||c[d]||m[d]||i;return n?a.createElement(k,o(o({ref:t},u),{},{components:n})):a.createElement(k,o({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const i={sidebar_position:22,sidebar_label:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",sidebar_class_name:"green"},o="\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",l={unversionedId:"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README",id:"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README",title:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u5c06\u6570\u636e\u5199\u5165\u7f51\u7edc\u8d26\u6237\u53ea\u662f\u6218\u6597\u7684\u4e00\u534a\uff0c\u53e6\u4e00\u534a\u662f\u8bfb\u53d6\u6570\u636e\u3002\u5728\u7b2c\u4e00\u90e8\u5206\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86Web3.js\u5e93\u4e2d\u7684\u5185\u7f6e\u51fd\u6570\u6765\u8bfb\u53d6\u5185\u5bb9\u3002\u8fd9\u4ec5\u9002\u7528\u4e8e\u7edd\u5bf9\u5fc5\u8981\u7684\u6570\u636e\uff0c\u5982\u4f59\u989d\u548c\u4ea4\u6613\u8be6\u60c5\u3002\u6b63\u5982\u6211\u4eec\u5728\u4e0a\u4e00\u90e8\u5206\u4e2d\u6240\u770b\u5230\u7684\uff0c\u6240\u6709\u597d\u4e1c\u897f\u90fd\u5728PDAs\u4e2d\u3002",source:"@site/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README.md",sourceDirName:"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization",slug:"/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README.md",tags:[],version:"current",sidebarPosition:22,frontMatter:{sidebar_position:22,sidebar_label:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/"},next:{title:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/"}},s={},p=[{value:"\ud83e\uddfe \u7a0b\u5e8f\u6d3e\u751f\u5730\u5740",id:"-\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740",level:2},{value:"\ud83c\udfa2 \u53cd\u5e8f\u5217\u5316",id:"-\u53cd\u5e8f\u5217\u5316",level:2},{value:"\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668",id:"\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668",level:2},{value:"\ud83d\udea2 Ship\u6311\u6218",id:"-ship\u6311\u6218",level:2},{value:"Hints:",id:"hints",level:3},{value:"Solution code:",id:"solution-code",level:3},{value:"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\uff1a",id:"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801",level:4}],u={toc:p},c="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(c,(0,a.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-run-is-back---\u53cd\u5e8f\u5217\u5316"},"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u5c06\u6570\u636e\u5199\u5165\u7f51\u7edc\u8d26\u6237\u53ea\u662f\u6218\u6597\u7684\u4e00\u534a\uff0c\u53e6\u4e00\u534a\u662f\u8bfb\u53d6\u6570\u636e\u3002\u5728\u7b2c\u4e00\u90e8\u5206\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86Web3.js\u5e93\u4e2d\u7684\u5185\u7f6e\u51fd\u6570\u6765\u8bfb\u53d6\u5185\u5bb9\u3002\u8fd9\u4ec5\u9002\u7528\u4e8e\u7edd\u5bf9\u5fc5\u8981\u7684\u6570\u636e\uff0c\u5982\u4f59\u989d\u548c\u4ea4\u6613\u8be6\u60c5\u3002\u6b63\u5982\u6211\u4eec\u5728\u4e0a\u4e00\u90e8\u5206\u4e2d\u6240\u770b\u5230\u7684\uff0c\u6240\u6709\u597d\u4e1c\u897f\u90fd\u5728PDAs\u4e2d\u3002"),(0,r.kt)("h2",{id:"-\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740"},"\ud83e\uddfe \u7a0b\u5e8f\u6d3e\u751f\u5730\u5740"),(0,r.kt)("p",null,"\u8d26\u6237\u662fSolana\u7684\u70ed\u95e8\u8bdd\u9898\u3002\u5982\u679c\u4f60\u542c\u8fc7\u8d26\u6237\u8fd9\u4e2a\u8bcd\uff0c\u4f60\u53ef\u80fd\u542c\u5230\u6709\u4eba\u8c08\u8bbaPDA\u3002PDA\u662fSolana\u4e0a\u7528\u4e8e\u5b58\u50a8\u6570\u636e\u7684\u7279\u6b8a\u7c7b\u578b\u8d26\u6237\u3002\u4f46\u5b9e\u9645\u4e0a\u5b83\u5e76\u4e0d\u662f\u4e00\u4e2a\u8d26\u6237\u2014\u2014\u5b83\u4eec\u88ab\u79f0\u4e3a\u5730\u5740\u800c\u4e0d\u662f\u8d26\u6237\uff0c\u56e0\u4e3a\u5b83\u4eec\u6ca1\u6709\u79c1\u94a5\u3002\u5b83\u4eec\u53ea\u80fd\u7531\u521b\u5efa\u5b83\u4eec\u7684\u7a0b\u5e8f\u63a7\u5236\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(1269).Z,width:"1188",height:"917"})),(0,r.kt)("p",null,"\u5e38\u89c4 Solana \u5e10\u6237\u662f\u4f7f\u7528 ",(0,r.kt)("a",{parentName:"p",href:"https://ed25519.cr.yp.to/?utm_source=buildspace.so&utm_medium=buildspace_project"},"Ed25519")," \u7b7e\u540d\u7cfb\u7edf\u521b\u5efa\u7684 - \u8be5\u7cfb\u7edf\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u516c\u94a5\u548c\u79c1\u94a5\u3002\u7531\u4e8e PDA \u662f\u7531\u7a0b\u5e8f\u63a7\u5236\u7684\uff0c\u56e0\u6b64\u5b83\u4eec\u4e0d\u9700\u8981\u79c1\u94a5\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4f7f\u7528\u4e0d\u5728 Ed25519 \u66f2\u7ebf\u4e0a\u7684\u5730\u5740\u6765\u5236\u4f5c PDA\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(7522).Z,width:"1204",height:"844"})),(0,r.kt)("p",null,"\u6709\u65f6\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"findProgramAddress")," \u7ed9\u6211\u4eec\u4e00\u4e2a\u4f4d\u4e8e\u66f2\u7ebf\u4e0a\u7684\u5bc6\u94a5\uff08\u610f\u5473\u7740\u5b83\u4e5f\u6709\u4e00\u4e2a\u79c1\u94a5\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u6dfb\u52a0\u4e00\u4e2a\u53ef\u9009\u7684\u201cbump\u201d\u53c2\u6570\u4ee5\u5c06\u5176\u79fb\u51fa\u66f2\u7ebf\u3002"),(0,r.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\u3002\u60a8\u4e0d\u9700\u8981\u4e86\u89e3 Ed25519\uff0c\u751a\u81f3\u4e0d\u9700\u8981\u4e86\u89e3\u6570\u5b57\u7b7e\u540d\u7b97\u6cd5\u662f\u4ec0\u4e48\u3002\u60a8\u53ea\u9700\u8981\u77e5\u9053 PDA \u770b\u8d77\u6765\u5c31\u50cf\u5e38\u89c4 Solana \u5730\u5740\u5e76\u4e14\u7531\u7a0b\u5e8f\u63a7\u5236\u3002"),(0,r.kt)("p",null,"\u60a8\u9700\u8981\u4e86\u89e3 PDA \u5de5\u4f5c\u539f\u7406\u7684\u539f\u56e0\u662f\uff0c\u5b83\u4eec\u662f\u94fe\u4e0a\u548c\u94fe\u4e0b\u7a0b\u5e8f\u5b9a\u4f4d\u6570\u636e\u7684\u786e\u5b9a\u6027\u65b9\u5f0f\u3002\u628a\u5b83\u60f3\u8c61\u6210\u4e00\u4e2a\u952e\u503c\u5b58\u50a8\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"seeds")," \u3001 ",(0,r.kt)("inlineCode",{parentName:"p"},"programId")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"bump")," \u7ec4\u5408\u8d77\u6765\u5f62\u6210\u5bc6\u94a5\uff0c\u4ee5\u53ca\u7f51\u7edc\u5728\u8be5\u5730\u5740\u5b58\u50a8\u7684\u503c\u3002\u5982\u679c\u6211\u4eec\u77e5\u9053\u5bc6\u94a5\u662f\u4ec0\u4e48\uff0c\u8fd9\u4f7f\u6211\u4eec\u80fd\u591f\u53ef\u9760\u4e14\u4e00\u81f4\u5730\u67e5\u627e\u5b58\u50a8\u5728\u7f51\u7edc\u4e0a\u7684\u6570\u636e\u3002"),(0,r.kt)("p",null,"\u591a\u4e8f\u4e86\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\uff08PDAs\uff09\uff0c\u6211\u4eec\u62e5\u6709\u4e00\u4e2a\u53ef\u4ee5\u88abSolana\u4e0a\u6240\u6709\u7a0b\u5e8f\u8bbf\u95ee\u7684\u901a\u7528\u6570\u636e\u5e93\u3002\u56de\u60f3\u4e00\u4e0b\u6211\u4eec\u4e0e\u7b2c\u4e00\u4e2a\u7a0b\u5e8f\u4e92\u52a8\u7684\u60c5\u666f\u2014\u2014\u6211\u4eec\u5411\u5176\u53d1\u9001\u4e86\u4e00\u4e2aping\u8bf7\u6c42\uff0c\u7136\u540e\u5b83\u9012\u589e\u4e86\u4e00\u4e2a\u6570\u5b57\u3002\u4e0b\u9762\u662f\u4f60\u53ef\u80fd\u4f1a\u627e\u5230\u4e0e\u6240\u6709\u8d26\u6237\u4e92\u52a8\u7684\u7a0b\u5e8f\u5171\u4eab\u7684\u6570\u636e\u7684\u65b9\u6cd5\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const [pda, bump] = await PublicKey.findProgramAddress(\n [Buffer.from("GLOBAL_STATE")],\n programId\n);\n')),(0,r.kt)("p",null,"\u8fd9\u6709\u70b9\u50cf Javascript \u4e2d\u7684\u5168\u5c40\u53d8\u91cf\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u60f3\u4e3a\u6bcf\u4e2a\u7528\u6237\u5b58\u50a8\u4e00\u4e2a\u5355\u72ec\u7684\u8ba1\u6570\u5668\u600e\u4e48\u529e\uff1f\u4f7f\u7528\u4ed6\u4eec\u7684\u516c\u94a5\u4f5c\u4e3a\u79cd\u5b50\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const [pda, bump] = await PublicKey.findProgramAddress(\n [\n publickey.toBuffer()\n ],\n programId\n);\n")),(0,r.kt)("p",null,"\u4e5f\u8bb8\u60a8\u60f3\u5236\u4f5c\u4e00\u4e2a\u94fe\u4e0a\u7b14\u8bb0\u7cfb\u7edf\uff0c\u6bcf\u4e2a\u7528\u6237\u90fd\u53ef\u4ee5\u5b58\u50a8\u81ea\u5df1\u7684\u7b14\u8bb0\uff1f\u5c06\u516c\u94a5\u4e0e\u6807\u8bc6\u7b26\u7ed3\u5408\u8d77\u6765\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const [pda, bump] = await PublicKey.findProgramAddress(\n [\n publickey.toBuffer(),\n Buffer.from("First Note")\n ],\n programId\n);\n')),(0,r.kt)("p",null,"\u53ea\u9700\u8bb0\u4f4f\uff0c\u65e0\u8bba\u662f\u60a8\u8fd8\u662f\u6765\u7535\u8005\u90fd\u5fc5\u987b\u652f\u4ed8\u5b58\u50a8\u8d39\u7528\uff0c\u5e76\u4e14\u6bcf\u4e2a\u8d26\u6237\u670910\u5146\u5b57\u8282\u7684\u9650\u5236\uff0c\u56e0\u6b64\u60a8\u9700\u8981\u8c28\u614e\u9009\u62e9\u8981\u653e\u5728\u94fe\u4e0a\u7684\u5185\u5bb9\u3002"),(0,r.kt)("h2",{id:"-\u53cd\u5e8f\u5217\u5316"},"\ud83c\udfa2 \u53cd\u5e8f\u5217\u5316"),(0,r.kt)("p",null,"\u627e\u5230\u8981\u8bfb\u53d6\u7684\u5e10\u6237\u540e\uff0c\u60a8\u9700\u8981\u53cd\u5e8f\u5217\u5316\u6570\u636e\uff0c\u4ee5\u4fbf\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u53ef\u4ee5\u4f7f\u7528\u5b83\u3002\u56de\u60f3\u4e00\u4e0b\u6211\u4eec\u5728\u8fd9\u4e2a\u7a0b\u5e8f\u4e2d\u5b66\u5230\u7684\u7b2c\u4e00\u4ef6\u4e8b\u2014\u2014\u5e10\u6237\u53ca\u5176\u5305\u542b\u7684\u5185\u5bb9\u3002\u56de\u987e\u4e00\u4e0b\uff1a"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"FIELD"),(0,r.kt)("th",{parentName:"tr",align:null},"\u63cf\u8ff0"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"lamports"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8be5\u8d26\u6237\u62e5\u6709\u7684lamports\u6570\u91cf")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"owner"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8be5\u5e10\u6237\u7684\u7a0b\u5e8f\u6240\u6709\u8005")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"executable"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8be5\u8d26\u6237\u662f\u5426\u53ef\u4ee5\u5904\u7406\u6307\u4ee4\uff08\u53ef\u6267\u884c\uff09")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"data"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8be5\u8d26\u6237\u5b58\u50a8\u7684\u539f\u59cb\u6570\u636e\u5b57\u8282\u6570\u7ec4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rent_epoch"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8fd9\u4e2a\u8d26\u6237\u5c06\u8981\u652f\u4ed8\u7684\u4e0b\u4e00\u4e2a\u65f6\u671f\u7684\u79df\u91d1")))),(0,r.kt)("p",null,"\u6570\u636e\u5b57\u6bb5\u5305\u542b\u4e86\u4e00\u4e2a\u5e9e\u5927\u7684\u5b57\u8282\u6570\u7ec4\u3002\u5c31\u50cf\u6211\u4eec\u5c06\u53ef\u8bfb\u6570\u636e\u8f6c\u6362\u4e3a\u5b57\u8282\u4ee5\u8fdb\u884c\u6307\u4ee4\u4e00\u6837\uff0c\u6211\u4eec\u5728\u8fd9\u91cc\u8981\u505a\u7684\u662f\u76f8\u53cd\u7684\u64cd\u4f5c\uff1a\u5c06\u5b57\u8282\u6570\u7ec4\u8f6c\u6362\u4e3a\u6211\u4eec\u7684\u5e94\u7528\u7a0b\u5e8f\u53ef\u4ee5\u5904\u7406\u7684\u6570\u636e\u3002\u8fd9\u65f6\u771f\u6b63\u7684\u9b54\u6cd5\u5f00\u59cb\u4e86\uff0c\u4f60\u4f1a\u771f\u5207\u5730\u611f\u53d7\u5230\u81ea\u5df1\u50cf\u5728\u73bb\u7483\u4e0a\u51b2\u6d6a\u4e00\u6837 \ud83d\ude0e"),(0,r.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u89c1\u5230\u4e86\u6211\u4eec\u6700\u597d\u7684\u65b0\u8001\u670b\u53cb ",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh")," \u5148\u751f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"impot * as borsh from '@project-serum/borsh';\n\nborshAccountSchema = borsh.struct({\n borsh.bool('initialized'),\n borsh.u16('playerId'),\n borsh.str('name')\n});\n\nconst { playerId, name } = borshAccountSchema.decode(buffer)\n")),(0,r.kt)("p",null,"\u8fd9\u4e9b\u6b65\u9aa4\u4e0e\u6211\u4eec\u5bf9\u5e8f\u5217\u5316\u6240\u505a\u7684\u7c7b\u4f3c\uff1a"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u521b\u5efa\u4e00\u4e2a\u5b57\u8282\u6570\u7ec4\u4e2d\u5b58\u50a8\u5185\u5bb9\u7684\u6a21\u5f0f/\u6620\u5c04"),(0,r.kt)("li",{parentName:"ol"},"\u4f7f\u7528\u6a21\u5f0f\u6765\u89e3\u7801\u6570\u636e"),(0,r.kt)("li",{parentName:"ol"},"\u63d0\u53d6\u6211\u4eec\u60f3\u8981\u7684\u7269\u54c1")),(0,r.kt)("p",null,"\u8fd9\u5e94\u8be5\u611f\u89c9\u5f88\u719f\u6089\uff0c\u4f46\u5982\u679c\u4e0d\u719f\u6089\uff0c\u5f53\u6211\u4eec\u4ed8\u8bf8\u884c\u52a8\u65f6\u5c31\u4f1a\u6709\u610f\u4e49\uff01"),(0,r.kt)("h2",{id:"\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668"},"\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668"),(0,r.kt)("p",null,"\u66fe\u7ecf\u60f3\u8fc7\u8981\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668\u5417\uff1f\u55ef\uff0c\u6211\u4eec\u5c06\u7ee7\u7eed\u4e4b\u524d\u7684\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u3002\u4f60\u53ef\u4ee5\u7ee7\u7eed\u4e0a\u4e00\u8282\u7684\u9879\u76ee\uff08\u63a8\u8350\uff09\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u4f7f\u7528\u5df2\u5b8c\u6210\u7684\u7248\u672c\u5f00\u59cb\u8bbe\u7f6e\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-movie-frontend.git\ncd solana-movie-frontend\ngit checkout solution-serialize-instruction-data\nnpm i\n")),(0,r.kt)("p",null,"\u5f53\u60a8\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u65f6\uff0c\u60a8\u5c06\u770b\u5230\u4e00\u5806\u6a21\u62df\u6570\u636e\u3002\u4e0e\u5047 yeezy \u4e0d\u540c\uff0c\u5047\u6570\u636e\u662f\u8e69\u811a\u7684\u3002\u8ba9\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie.ts")," \u4e2d\u4fdd\u6301\u771f\u5b9e\uff08\u4ec5\u590d\u5236/\u7c98\u8d34\u65b0\u5185\u5bb9\uff09\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"import * as borsh from '@project-serum/borsh'\n\nexport class Movie {\n title: string;\n rating: number;\n description: string;\n...\n\n static borshAccountSchema = borsh.struct([\n borsh.bool('initialized'),\n borsh.u8('rating'),\n borsh.str('title'),\n borsh.str('description'),\n ])\n\n static deserialize(buffer?: Buffer): Movie|null {\n if (!buffer) {\n return null\n }\n\n try {\n const { title, rating, description } = this.borshAccountSchema.decode(buffer)\n return new Movie(title, rating, description)\n } catch(error) {\n console.log('Deserialization error:', error)\n return null\n }\n }\n}\n")),(0,r.kt)("p",null,"\u5c31\u50cf\u5e8f\u5217\u5316\u4e00\u6837\uff0c\u6211\u4eec\u6709\u4e00\u4e2a\u6a21\u5f0f\u548c\u4e00\u4e2a\u65b9\u6cd5\u3002\u8be5\u67b6\u6784\u5177\u6709\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li"},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"initialized")," \u4f5c\u4e3a\u4e00\u4e2a\u5e03\u5c14\u503c\uff0c\u8868\u793a\u5e10\u6237\u662f\u5426\u5df2\u521d\u59cb\u5316\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"rating")," \u4f5c\u4e3a\u65e0\u7b26\u53f7 8 \u4f4d\u6574\u6570\uff0c\u8868\u793a\u8bc4\u8bba\u8005\u5bf9\u7535\u5f71\u7684\u8bc4\u5206\uff08\u6ee1\u5206 5 \u5206\uff09\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"title")," \u4f5c\u4e3a\u8868\u793a\u6240\u8bc4\u8bba\u7535\u5f71\u7684\u6807\u9898\u7684\u5b57\u7b26\u4e32\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:4},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"description")," \u4f5c\u4e3a\u8868\u793a\u8bc4\u8bba\u7684\u4e66\u9762\u90e8\u5206\u7684\u5b57\u7b26\u4e32.")))),(0,r.kt)("p",null,"\u770b\u8d77\u6765\u5f88\u719f\u6089\uff01\u597d\u4e1c\u897f\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"deserialize")," \u4e2d\u3002\u8fd9\u91cc\u7684\u8fd4\u56de\u7c7b\u578b\u53ef\u4ee5\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie")," \u6216 ",(0,r.kt)("inlineCode",{parentName:"p"},"null")," \uff0c\u56e0\u4e3a\u5e10\u6237\u53ef\u80fd\u6839\u672c\u6ca1\u6709\u4efb\u4f55\u6570\u636e\u3002"),(0,r.kt)("p",null,"\u6700\u540e\uff0c\u6211\u4eec\u9700\u8981\u5728\u9875\u9762\u52a0\u8f7d\u65f6\u4f7f\u7528\u6b64\u65b9\u6cd5\u4ece PDA \u83b7\u53d6\u6570\u636e\u3002\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"MovieList.tsx")," \u4e2d\u6267\u884c\u6b64\u64cd\u4f5c\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"import { Card } from './Card'\nimport { FC, useEffect, useState } from 'react'\nimport { Movie } from '../models/Movie'\nimport * as web3 from '@solana/web3.js'\n\nconst MOVIE_REVIEW_PROGRAM_ID = 'CenYq6bDRB7p73EjsPEpiYN7uveyPUTdXkDkgUduboaN'\n\nexport const MovieList: FC = () => {\n const connection = new web3.Connection(web3.clusterApiUrl('devnet'))\n const [movies, setMovies] = useState([])\n\n useEffect(() => {\n connection.getProgramAccounts(new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID))\n .then(async (accounts) => {\n const movies: Movie[] = accounts.reduce((accum: Movie[], { pubkey, account }) => {\n const movie = Movie.deserialize(account.data)\n if (!movie) {\n return accum\n }\n\n return [...accum, movie]\n }, [])\n setMovies(movies)\n })\n }, [])\n\n return (\n
\n {\n movies.map((movie, i) => )\n }\n
\n )\n}\n")),(0,r.kt)("p",null,"\u5c31\u50cf\u4ee5\u524d\u4e00\u6837\uff0c\u6211\u4eec\u8bbe\u7f6e\u4e86\u5bfc\u5165\u548c\u8fde\u63a5\u3002\u4e3b\u8981\u66f4\u6539\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"useEffect")," \u4e2d\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"connection.getProgramAccounts(new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID))\n")),(0,r.kt)("p",null,"\u5728\u83b7\u53d6\u7535\u5f71\u8bc4\u8bba\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u83b7\u53d6\u5305\u542b\u5b83\u4eec\u7684\u5e10\u6237\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"getProgramAccounts")," \u7aef\u70b9\u83b7\u53d6\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u7684\u6240\u6709\u7a0b\u5e8f\u5e10\u6237\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\u3002"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u8fd9\u662f\u4e00\u4e2a\u76f8\u5f53\u7e41\u91cd\u7684\u7aef\u70b9 - \u5982\u679c\u60a8\u5728\u50cf Magic Eden \u7a0b\u5e8f\u8fd9\u6837\u7684\u5927\u578b\u7a0b\u5e8f\u4e0a\u5c1d\u8bd5\u5b83\uff0c\u60a8\u5c06\u5f97\u5230\u6570\u5341\u4e07\u5230\u6570\u767e\u4e07\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u4e0d\u5c0f\u5fc3\u7684\u8bdd\uff0c\u8fd9\u4f1a\u7834\u574f\u4e1c\u897f\u3002\u5728\u73b0\u5b9e\u4e16\u754c\u4e2d\uff0c\u60a8\u5f88\u5c11",(0,r.kt)("a",{parentName:"strong",href:"https://twitter.com/redacted_noah/status/1593831571014012929?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u9700\u8981\u540c\u65f6\u83b7\u5f97\u591a\u4e2a\u5e10\u6237"),"\uff0c\u6240\u4ee5\u73b0\u5728\u4e0d\u7528\u62c5\u5fc3\u3002\u53ea\u9700\u77e5\u9053\u60a8\u4e0d\u5e94\u8be5\u5bf9\u6570\u636e\u8fdb\u884c\u5efa\u6a21\uff0c\u4f7f\u5f97 ",(0,r.kt)("inlineCode",{parentName:"strong"},"getProgramAccounts")," \u662f\u5fc5\u8981\u7684\u3002")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},".then(async (accounts) => {\n const movies: Movie[] = accounts.reduce((accum: Movie[], { pubkey, account }) => {\n // Try to extract movie item from account data\n const movie = Movie.deserialize(account.data)\n\n // If the account does not have a review, movie will be null\n if (!movie) {\n return accum\n }\n\n return [...accum, movie]\n }, [])\n setMovies(movies)\n})\n")),(0,r.kt)("p",null,"\u4e3a\u4e86\u5b58\u50a8\u6211\u4eec\u7684\u7535\u5f71\u8bc4\u8bba\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie"),"s \u7c7b\u578b\u7684\u6570\u7ec4\u3002\u4e3a\u4e86\u586b\u5145\u5b83\uff0c\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"reduce")," \u53cd\u5e8f\u5217\u5316\u6bcf\u4e2a\u5e10\u6237\u5e76\u5c1d\u8bd5\u89e3\u6784 ",(0,r.kt)("inlineCode",{parentName:"p"},"movie")," \u9879\u3002\u5982\u679c\u8be5\u5e10\u6237\u4e2d\u6709\u7535\u5f71\u6570\u636e\uff0c\u90a3\u4e48\u8fd9\u5c06\u8d77\u4f5c\u7528\uff01\u5982\u679c\u6ca1\u6709\uff0c\u7535\u5f71\u5c06\u4e3anull\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd4\u56de\u7d2f\u79ef\u7684\u7535\u5f71\u5217\u8868\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u8fd9\u770b\u8d77\u6765\u4ee4\u4eba\u56f0\u60d1\uff0c\u8bf7\u9010\u884c\u6d4f\u89c8\u4ee3\u7801\u5e76\u786e\u4fdd\u60a8\u77e5\u9053 ",(0,r.kt)("inlineCode",{parentName:"p"},"reduce")," \u65b9\u6cd5\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002"),(0,r.kt)("p",null,"\u786e\u4fdd\u60a8\u6b63\u5728\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u5e76\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \uff0c\u60a8\u5e94\u8be5\u4f1a\u770b\u5230\u5176\u4ed6\u6784\u5efa\u8005\u6dfb\u52a0\u7684\u4e00\u5806\u968f\u673a\u8bc4\u8bba\uff1aD"),(0,r.kt)("h2",{id:"-ship\u6311\u6218"},"\ud83d\udea2 Ship\u6311\u6218"),(0,r.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u53ef\u4ee5\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u6570\u636e\u3002\u597d\u7684\u3002\u8ba9\u6211\u4eec\u5207\u6362\u5230\u6211\u4eec\u5728\u5e8f\u5217\u5316\u90e8\u5206\u5f00\u59cb\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"Student Intros")," \u5e94\u7528\u7a0b\u5e8f\u3002"),(0,r.kt)("p",null,"\u76ee\u6807\uff1a\u66f4\u65b0\u5e94\u7528\u7a0b\u5e8f\u4ee5\u83b7\u53d6\u5e76\u53cd\u5e8f\u5217\u5316\u7a0b\u5e8f\u7684\u5e10\u6237\u6570\u636e\u3002\u652f\u6301\u6b64\u529f\u80fd\u7684 Solana \u7a0b\u5e8f\u4f4d\u4e8e\uff1a ",(0,r.kt)("inlineCode",{parentName:"p"},"HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf")),(0,r.kt)("p",null,"\u60a8\u53ef\u4ee5\u4ece\u4e0a\u6b21\u6311\u6218\u4e2d\u79bb\u5f00\u7684\u4f4d\u7f6e\u5f00\u59cb\uff0c\u4e5f\u53ef\u4ee5\u4ece\u6b64\u5b58\u50a8\u5e93\u4e2d",(0,r.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-student-intros-frontend/tree/solution-serialize-instruction-data"},"\u83b7\u53d6\u4ee3\u7801"),"\u3002\u786e\u4fdd\u60a8\u4ece ",(0,r.kt)("inlineCode",{parentName:"p"},"solution-serialize-instruction-data")," \u5206\u652f\u5f00\u59cb\u3002"),(0,r.kt)("h3",{id:"hints"},"Hints:"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntro.ts")," \u4e2d\u521b\u5efa\u5e10\u6237\u7f13\u51b2\u533a\u5e03\u5c40\u3002\u8d26\u6237\u6570\u636e\u5305\u542b\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li"},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"initialized")," \u4f5c\u4e3a\u4e00\u4e2a\u5e03\u5c14\u503c\uff0c\u8868\u793a\u5e10\u6237\u662f\u5426\u5df2\u521d\u59cb\u5316"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"name")," \u4f5c\u4e3a\u8868\u793a\u5b66\u751f\u59d3\u540d\u7684\u5b57\u7b26\u4e32"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"message")," \u4f5c\u4e3a\u8868\u793a\u5b66\u751f\u5206\u4eab\u7684\u6709\u5173 Solana \u65c5\u7a0b\u7684\u6d88\u606f\u7684\u5b57\u7b26\u4e32")))),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntro.ts")," \u4e2d\u521b\u5efa\u4e00\u4e2a\u9759\u6001\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u5c06\u4f7f\u7528\u7f13\u51b2\u533a\u5e03\u5c40\u5c06\u5e10\u6237\u6570\u636e\u7f13\u51b2\u533a\u53cd\u5e8f\u5217\u5316\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntro")," \u5bf9\u8c61\u3002"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntroList")," \u7ec4\u4ef6\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"useEffect")," \u4e2d\uff0c\u83b7\u53d6\u7a0b\u5e8f\u7684\u5e10\u6237\u5e76\u5c06\u5176\u6570\u636e\u53cd\u5e8f\u5217\u5316\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntro")," \u5bf9\u8c61\u5217\u8868\u4e2d\u3002"),(0,r.kt)("h3",{id:"solution-code"},"Solution code:"),(0,r.kt)("h4",{id:"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\uff1a"),(0,r.kt)("p",null,"\u4e0e\u5f80\u5e38\u4e00\u6837\uff0c\u9996\u5148\u5c1d\u8bd5\u72ec\u7acb\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u4f46\u5982\u679c\u60a8\u9677\u5165\u56f0\u5883\u6216\u53ea\u662f\u60f3\u5c06\u60a8\u7684\u89e3\u51b3\u65b9\u6848\u4e0e\u6211\u4eec\u7684\u89e3\u51b3\u65b9\u6848\u8fdb\u884c\u6bd4\u8f83\uff0c\u8bf7\u67e5\u770b\u6b64\u5b58\u50a8\u5e93\u4e2d\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"solution-deserialize-account-data")," ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-student-intros-frontend/tree/solution-deserialize-account-data"},"\u5206\u652f"),"\u3002"),(0,r.kt)("p",null,"\u795d\u4f60\u597d\u8fd0\uff01"))}m.isMDXComponent=!0},1269:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upload_1-51e61a1eddcb9e496393993ec25ebb14.png"},7522:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upload_2-a5bff67b5cd45b89420f1a94b25e790c.png"}}]); \ No newline at end of file diff --git a/assets/js/5c26d4ea.af643ed8.js b/assets/js/5c26d4ea.af643ed8.js deleted file mode 100644 index 5cd5476e7..000000000 --- a/assets/js/5c26d4ea.af643ed8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[297],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(n),d=r,k=c["".concat(s,".").concat(d)]||c[d]||m[d]||i;return n?a.createElement(k,o(o({ref:t},u),{},{components:n})):a.createElement(k,o({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const i={sidebar_position:22,sidebar_label:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",sidebar_class_name:"green"},o="\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",l={unversionedId:"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README",id:"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README",title:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u5c06\u6570\u636e\u5199\u5165\u7f51\u7edc\u8d26\u6237\u53ea\u662f\u6218\u6597\u7684\u4e00\u534a\uff0c\u53e6\u4e00\u534a\u662f\u8bfb\u53d6\u6570\u636e\u3002\u5728\u7b2c\u4e00\u90e8\u5206\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86Web3.js\u5e93\u4e2d\u7684\u5185\u7f6e\u51fd\u6570\u6765\u8bfb\u53d6\u5185\u5bb9\u3002\u8fd9\u4ec5\u9002\u7528\u4e8e\u7edd\u5bf9\u5fc5\u8981\u7684\u6570\u636e\uff0c\u5982\u4f59\u989d\u548c\u4ea4\u6613\u8be6\u60c5\u3002\u6b63\u5982\u6211\u4eec\u5728\u4e0a\u4e00\u90e8\u5206\u4e2d\u6240\u770b\u5230\u7684\uff0c\u6240\u6709\u597d\u4e1c\u897f\u90fd\u5728PDAs\u4e2d\u3002",source:"@site/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README.md",sourceDirName:"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization",slug:"/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README.md",tags:[],version:"current",sidebarPosition:22,frontMatter:{sidebar_position:22,sidebar_label:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/"},next:{title:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",permalink:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/"}},s={},p=[{value:"\ud83e\uddfe \u7a0b\u5e8f\u6d3e\u751f\u5730\u5740",id:"-\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740",level:2},{value:"\ud83c\udfa2 \u53cd\u5e8f\u5217\u5316",id:"-\u53cd\u5e8f\u5217\u5316",level:2},{value:"\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668",id:"\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668",level:2},{value:"\ud83d\udea2 Ship\u6311\u6218",id:"-ship\u6311\u6218",level:2},{value:"Hints:",id:"hints",level:3},{value:"Solution code:",id:"solution-code",level:3},{value:"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\uff1a",id:"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801",level:4}],u={toc:p},c="wrapper";function m(e){let{components:t,...i}=e;return(0,r.kt)(c,(0,a.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-run-is-back---\u53cd\u5e8f\u5217\u5316"},"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u5c06\u6570\u636e\u5199\u5165\u7f51\u7edc\u8d26\u6237\u53ea\u662f\u6218\u6597\u7684\u4e00\u534a\uff0c\u53e6\u4e00\u534a\u662f\u8bfb\u53d6\u6570\u636e\u3002\u5728\u7b2c\u4e00\u90e8\u5206\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86Web3.js\u5e93\u4e2d\u7684\u5185\u7f6e\u51fd\u6570\u6765\u8bfb\u53d6\u5185\u5bb9\u3002\u8fd9\u4ec5\u9002\u7528\u4e8e\u7edd\u5bf9\u5fc5\u8981\u7684\u6570\u636e\uff0c\u5982\u4f59\u989d\u548c\u4ea4\u6613\u8be6\u60c5\u3002\u6b63\u5982\u6211\u4eec\u5728\u4e0a\u4e00\u90e8\u5206\u4e2d\u6240\u770b\u5230\u7684\uff0c\u6240\u6709\u597d\u4e1c\u897f\u90fd\u5728PDAs\u4e2d\u3002"),(0,r.kt)("h2",{id:"-\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740"},"\ud83e\uddfe \u7a0b\u5e8f\u6d3e\u751f\u5730\u5740"),(0,r.kt)("p",null,"\u8d26\u6237\u662fSolana\u7684\u70ed\u95e8\u8bdd\u9898\u3002\u5982\u679c\u4f60\u542c\u8fc7\u8d26\u6237\u8fd9\u4e2a\u8bcd\uff0c\u4f60\u53ef\u80fd\u542c\u5230\u6709\u4eba\u8c08\u8bbaPDA\u3002PDA\u662fSolana\u4e0a\u7528\u4e8e\u5b58\u50a8\u6570\u636e\u7684\u7279\u6b8a\u7c7b\u578b\u8d26\u6237\u3002\u4f46\u5b9e\u9645\u4e0a\u5b83\u5e76\u4e0d\u662f\u4e00\u4e2a\u8d26\u6237\u2014\u2014\u5b83\u4eec\u88ab\u79f0\u4e3a\u5730\u5740\u800c\u4e0d\u662f\u8d26\u6237\uff0c\u56e0\u4e3a\u5b83\u4eec\u6ca1\u6709\u79c1\u94a5\u3002\u5b83\u4eec\u53ea\u80fd\u7531\u521b\u5efa\u5b83\u4eec\u7684\u7a0b\u5e8f\u63a7\u5236\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(1269).Z,width:"1188",height:"917"})),(0,r.kt)("p",null,"\u5e38\u89c4 Solana \u5e10\u6237\u662f\u4f7f\u7528 ",(0,r.kt)("a",{parentName:"p",href:"https://ed25519.cr.yp.to/?utm_source=buildspace.so&utm_medium=buildspace_project"},"Ed25519")," \u7b7e\u540d\u7cfb\u7edf\u521b\u5efa\u7684 - \u8be5\u7cfb\u7edf\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u516c\u94a5\u548c\u79c1\u94a5\u3002\u7531\u4e8e PDA \u662f\u7531\u7a0b\u5e8f\u63a7\u5236\u7684\uff0c\u56e0\u6b64\u5b83\u4eec\u4e0d\u9700\u8981\u79c1\u94a5\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4f7f\u7528\u4e0d\u5728 Ed25519 \u66f2\u7ebf\u4e0a\u7684\u5730\u5740\u6765\u5236\u4f5c PDA\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:n(7522).Z,width:"1204",height:"844"})),(0,r.kt)("p",null,"\u6709\u65f6\uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"findProgramAddress")," \u7ed9\u6211\u4eec\u4e00\u4e2a\u4f4d\u4e8e\u66f2\u7ebf\u4e0a\u7684\u5bc6\u94a5\uff08\u610f\u5473\u7740\u5b83\u4e5f\u6709\u4e00\u4e2a\u79c1\u94a5\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u6dfb\u52a0\u4e00\u4e2a\u53ef\u9009\u7684\u201cbump\u201d\u53c2\u6570\u4ee5\u5c06\u5176\u79fb\u51fa\u66f2\u7ebf\u3002"),(0,r.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\u3002\u60a8\u4e0d\u9700\u8981\u4e86\u89e3 Ed25519\uff0c\u751a\u81f3\u4e0d\u9700\u8981\u4e86\u89e3\u6570\u5b57\u7b7e\u540d\u7b97\u6cd5\u662f\u4ec0\u4e48\u3002\u60a8\u53ea\u9700\u8981\u77e5\u9053 PDA \u770b\u8d77\u6765\u5c31\u50cf\u5e38\u89c4 Solana \u5730\u5740\u5e76\u4e14\u7531\u7a0b\u5e8f\u63a7\u5236\u3002"),(0,r.kt)("p",null,"\u60a8\u9700\u8981\u4e86\u89e3 PDA \u5de5\u4f5c\u539f\u7406\u7684\u539f\u56e0\u662f\uff0c\u5b83\u4eec\u662f\u94fe\u4e0a\u548c\u94fe\u4e0b\u7a0b\u5e8f\u5b9a\u4f4d\u6570\u636e\u7684\u786e\u5b9a\u6027\u65b9\u5f0f\u3002\u628a\u5b83\u60f3\u8c61\u6210\u4e00\u4e2a\u952e\u503c\u5b58\u50a8\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"seeds")," \u3001 ",(0,r.kt)("inlineCode",{parentName:"p"},"programId")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"bump")," \u7ec4\u5408\u8d77\u6765\u5f62\u6210\u5bc6\u94a5\uff0c\u4ee5\u53ca\u7f51\u7edc\u5728\u8be5\u5730\u5740\u5b58\u50a8\u7684\u503c\u3002\u5982\u679c\u6211\u4eec\u77e5\u9053\u5bc6\u94a5\u662f\u4ec0\u4e48\uff0c\u8fd9\u4f7f\u6211\u4eec\u80fd\u591f\u53ef\u9760\u4e14\u4e00\u81f4\u5730\u67e5\u627e\u5b58\u50a8\u5728\u7f51\u7edc\u4e0a\u7684\u6570\u636e\u3002"),(0,r.kt)("p",null,"\u591a\u4e8f\u4e86\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\uff08PDAs\uff09\uff0c\u6211\u4eec\u62e5\u6709\u4e00\u4e2a\u53ef\u4ee5\u88abSolana\u4e0a\u6240\u6709\u7a0b\u5e8f\u8bbf\u95ee\u7684\u901a\u7528\u6570\u636e\u5e93\u3002\u56de\u60f3\u4e00\u4e0b\u6211\u4eec\u4e0e\u7b2c\u4e00\u4e2a\u7a0b\u5e8f\u4e92\u52a8\u7684\u60c5\u666f\u2014\u2014\u6211\u4eec\u5411\u5176\u53d1\u9001\u4e86\u4e00\u4e2aping\u8bf7\u6c42\uff0c\u7136\u540e\u5b83\u9012\u589e\u4e86\u4e00\u4e2a\u6570\u5b57\u3002\u4e0b\u9762\u662f\u4f60\u53ef\u80fd\u4f1a\u627e\u5230\u4e0e\u6240\u6709\u8d26\u6237\u4e92\u52a8\u7684\u7a0b\u5e8f\u5171\u4eab\u7684\u6570\u636e\u7684\u65b9\u6cd5\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const [pda, bump] = await PublicKey.findProgramAddress(\n [Buffer.from("GLOBAL_STATE")],\n programId\n);\n')),(0,r.kt)("p",null,"\u8fd9\u6709\u70b9\u50cf Javascript \u4e2d\u7684\u5168\u5c40\u53d8\u91cf\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u60f3\u4e3a\u6bcf\u4e2a\u7528\u6237\u5b58\u50a8\u4e00\u4e2a\u5355\u72ec\u7684\u8ba1\u6570\u5668\u600e\u4e48\u529e\uff1f\u4f7f\u7528\u4ed6\u4eec\u7684\u516c\u94a5\u4f5c\u4e3a\u79cd\u5b50\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const [pda, bump] = await PublicKey.findProgramAddress(\n [\n publickey.toBuffer()\n ],\n programId\n);\n")),(0,r.kt)("p",null,"\u4e5f\u8bb8\u60a8\u60f3\u5236\u4f5c\u4e00\u4e2a\u94fe\u4e0a\u7b14\u8bb0\u7cfb\u7edf\uff0c\u6bcf\u4e2a\u7528\u6237\u90fd\u53ef\u4ee5\u5b58\u50a8\u81ea\u5df1\u7684\u7b14\u8bb0\uff1f\u5c06\u516c\u94a5\u4e0e\u6807\u8bc6\u7b26\u7ed3\u5408\u8d77\u6765\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const [pda, bump] = await PublicKey.findProgramAddress(\n [\n publickey.toBuffer(),\n Buffer.from("First Note")\n ],\n programId\n);\n')),(0,r.kt)("p",null,"\u53ea\u9700\u8bb0\u4f4f\uff0c\u65e0\u8bba\u662f\u60a8\u8fd8\u662f\u6765\u7535\u8005\u90fd\u5fc5\u987b\u652f\u4ed8\u5b58\u50a8\u8d39\u7528\uff0c\u5e76\u4e14\u6bcf\u4e2a\u8d26\u6237\u670910\u5146\u5b57\u8282\u7684\u9650\u5236\uff0c\u56e0\u6b64\u60a8\u9700\u8981\u8c28\u614e\u9009\u62e9\u8981\u653e\u5728\u94fe\u4e0a\u7684\u5185\u5bb9\u3002"),(0,r.kt)("h2",{id:"-\u53cd\u5e8f\u5217\u5316"},"\ud83c\udfa2 \u53cd\u5e8f\u5217\u5316"),(0,r.kt)("p",null,"\u627e\u5230\u8981\u8bfb\u53d6\u7684\u5e10\u6237\u540e\uff0c\u60a8\u9700\u8981\u53cd\u5e8f\u5217\u5316\u6570\u636e\uff0c\u4ee5\u4fbf\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u53ef\u4ee5\u4f7f\u7528\u5b83\u3002\u56de\u60f3\u4e00\u4e0b\u6211\u4eec\u5728\u8fd9\u4e2a\u7a0b\u5e8f\u4e2d\u5b66\u5230\u7684\u7b2c\u4e00\u4ef6\u4e8b\u2014\u2014\u5e10\u6237\u53ca\u5176\u5305\u542b\u7684\u5185\u5bb9\u3002\u56de\u987e\u4e00\u4e0b\uff1a"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"FIELD"),(0,r.kt)("th",{parentName:"tr",align:null},"\u63cf\u8ff0"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"lamports"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8be5\u8d26\u6237\u62e5\u6709\u7684lamports\u6570\u91cf")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"owner"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8be5\u5e10\u6237\u7684\u7a0b\u5e8f\u6240\u6709\u8005")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"executable"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8be5\u8d26\u6237\u662f\u5426\u53ef\u4ee5\u5904\u7406\u6307\u4ee4\uff08\u53ef\u6267\u884c\uff09")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"data"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8be5\u8d26\u6237\u5b58\u50a8\u7684\u539f\u59cb\u6570\u636e\u5b57\u8282\u6570\u7ec4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"rent_epoch"),(0,r.kt)("td",{parentName:"tr",align:null},"\u8fd9\u4e2a\u8d26\u6237\u5c06\u8981\u652f\u4ed8\u7684\u4e0b\u4e00\u4e2a\u65f6\u671f\u7684\u79df\u91d1")))),(0,r.kt)("p",null,"\u6570\u636e\u5b57\u6bb5\u5305\u542b\u4e86\u4e00\u4e2a\u5e9e\u5927\u7684\u5b57\u8282\u6570\u7ec4\u3002\u5c31\u50cf\u6211\u4eec\u5c06\u53ef\u8bfb\u6570\u636e\u8f6c\u6362\u4e3a\u5b57\u8282\u4ee5\u8fdb\u884c\u6307\u4ee4\u4e00\u6837\uff0c\u6211\u4eec\u5728\u8fd9\u91cc\u8981\u505a\u7684\u662f\u76f8\u53cd\u7684\u64cd\u4f5c\uff1a\u5c06\u5b57\u8282\u6570\u7ec4\u8f6c\u6362\u4e3a\u6211\u4eec\u7684\u5e94\u7528\u7a0b\u5e8f\u53ef\u4ee5\u5904\u7406\u7684\u6570\u636e\u3002\u8fd9\u65f6\u771f\u6b63\u7684\u9b54\u6cd5\u5f00\u59cb\u4e86\uff0c\u4f60\u4f1a\u771f\u5207\u5730\u611f\u53d7\u5230\u81ea\u5df1\u50cf\u5728\u73bb\u7483\u4e0a\u51b2\u6d6a\u4e00\u6837 \ud83d\ude0e"),(0,r.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u89c1\u5230\u4e86\u6211\u4eec\u6700\u597d\u7684\u65b0\u8001\u670b\u53cb ",(0,r.kt)("inlineCode",{parentName:"p"},"Borsh")," \u5148\u751f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"impot * as borsh from '@project-serum/borsh';\n\nborshAccountSchema = borsh.struct({\n borsh.bool('initialized'),\n borsh.u16('playerId'),\n borsh.str('name')\n});\n\nconst { playerId, name } = borshAccountSchema.decode(buffer)\n")),(0,r.kt)("p",null,"\u8fd9\u4e9b\u6b65\u9aa4\u4e0e\u6211\u4eec\u5bf9\u5e8f\u5217\u5316\u6240\u505a\u7684\u7c7b\u4f3c\uff1a"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u521b\u5efa\u4e00\u4e2a\u5b57\u8282\u6570\u7ec4\u4e2d\u5b58\u50a8\u5185\u5bb9\u7684\u6a21\u5f0f/\u6620\u5c04"),(0,r.kt)("li",{parentName:"ol"},"\u4f7f\u7528\u6a21\u5f0f\u6765\u89e3\u7801\u6570\u636e"),(0,r.kt)("li",{parentName:"ol"},"\u63d0\u53d6\u6211\u4eec\u60f3\u8981\u7684\u7269\u54c1")),(0,r.kt)("p",null,"\u8fd9\u5e94\u8be5\u611f\u89c9\u5f88\u719f\u6089\uff0c\u4f46\u5982\u679c\u4e0d\u719f\u6089\uff0c\u5f53\u6211\u4eec\u4ed8\u8bf8\u884c\u52a8\u65f6\u5c31\u4f1a\u6709\u610f\u4e49\uff01"),(0,r.kt)("h2",{id:"\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668"},"\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668"),(0,r.kt)("p",null,"\u66fe\u7ecf\u60f3\u8fc7\u8981\u6784\u5efa\u4e00\u4e2a\u53cd\u5e8f\u5217\u5316\u5668\u5417\uff1f\u55ef\uff0c\u6211\u4eec\u5c06\u7ee7\u7eed\u4e4b\u524d\u7684\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u3002\u4f60\u53ef\u4ee5\u7ee7\u7eed\u4e0a\u4e00\u8282\u7684\u9879\u76ee\uff08\u63a8\u8350\uff09\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u4f7f\u7528\u5df2\u5b8c\u6210\u7684\u7248\u672c\u5f00\u59cb\u8bbe\u7f6e\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/RustyCab/solana-movie-frontend.git\ncd solana-movie-frontend\ngit checkout solution-serialize-instruction-data\nnpm i\n")),(0,r.kt)("p",null,"\u5f53\u60a8\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u65f6\uff0c\u60a8\u5c06\u770b\u5230\u4e00\u5806\u6a21\u62df\u6570\u636e\u3002\u4e0e\u5047 yeezy \u4e0d\u540c\uff0c\u5047\u6570\u636e\u662f\u8e69\u811a\u7684\u3002\u8ba9\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie.ts")," \u4e2d\u4fdd\u6301\u771f\u5b9e\uff08\u4ec5\u590d\u5236/\u7c98\u8d34\u65b0\u5185\u5bb9\uff09\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"import * as borsh from '@project-serum/borsh'\n\nexport class Movie {\n title: string;\n rating: number;\n description: string;\n...\n\n static borshAccountSchema = borsh.struct([\n borsh.bool('initialized'),\n borsh.u8('rating'),\n borsh.str('title'),\n borsh.str('description'),\n ])\n\n static deserialize(buffer?: Buffer): Movie|null {\n if (!buffer) {\n return null\n }\n\n try {\n const { title, rating, description } = this.borshAccountSchema.decode(buffer)\n return new Movie(title, rating, description)\n } catch(error) {\n console.log('Deserialization error:', error)\n return null\n }\n }\n}\n")),(0,r.kt)("p",null,"\u5c31\u50cf\u5e8f\u5217\u5316\u4e00\u6837\uff0c\u6211\u4eec\u6709\u4e00\u4e2a\u6a21\u5f0f\u548c\u4e00\u4e2a\u65b9\u6cd5\u3002\u8be5\u67b6\u6784\u5177\u6709\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li"},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"initialized")," \u4f5c\u4e3a\u4e00\u4e2a\u5e03\u5c14\u503c\uff0c\u8868\u793a\u5e10\u6237\u662f\u5426\u5df2\u521d\u59cb\u5316\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"rating")," \u4f5c\u4e3a\u65e0\u7b26\u53f7 8 \u4f4d\u6574\u6570\uff0c\u8868\u793a\u8bc4\u8bba\u8005\u5bf9\u7535\u5f71\u7684\u8bc4\u5206\uff08\u6ee1\u5206 5 \u5206\uff09\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"title")," \u4f5c\u4e3a\u8868\u793a\u6240\u8bc4\u8bba\u7535\u5f71\u7684\u6807\u9898\u7684\u5b57\u7b26\u4e32\u3002"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:4},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"description")," \u4f5c\u4e3a\u8868\u793a\u8bc4\u8bba\u7684\u4e66\u9762\u90e8\u5206\u7684\u5b57\u7b26\u4e32.")))),(0,r.kt)("p",null,"\u770b\u8d77\u6765\u5f88\u719f\u6089\uff01\u597d\u4e1c\u897f\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"deserialize")," \u4e2d\u3002\u8fd9\u91cc\u7684\u8fd4\u56de\u7c7b\u578b\u53ef\u4ee5\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie")," \u6216 ",(0,r.kt)("inlineCode",{parentName:"p"},"null")," \uff0c\u56e0\u4e3a\u5e10\u6237\u53ef\u80fd\u6839\u672c\u6ca1\u6709\u4efb\u4f55\u6570\u636e\u3002"),(0,r.kt)("p",null,"\u6700\u540e\uff0c\u6211\u4eec\u9700\u8981\u5728\u9875\u9762\u52a0\u8f7d\u65f6\u4f7f\u7528\u6b64\u65b9\u6cd5\u4ece PDA \u83b7\u53d6\u6570\u636e\u3002\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"MovieList.tsx")," \u4e2d\u6267\u884c\u6b64\u64cd\u4f5c\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"import { Card } from './Card'\nimport { FC, useEffect, useState } from 'react'\nimport { Movie } from '../models/Movie'\nimport * as web3 from '@solana/web3.js'\n\nconst MOVIE_REVIEW_PROGRAM_ID = 'CenYq6bDRB7p73EjsPEpiYN7uveyPUTdXkDkgUduboaN'\n\nexport const MovieList: FC = () => {\n const connection = new web3.Connection(web3.clusterApiUrl('devnet'))\n const [movies, setMovies] = useState([])\n\n useEffect(() => {\n connection.getProgramAccounts(new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID))\n .then(async (accounts) => {\n const movies: Movie[] = accounts.reduce((accum: Movie[], { pubkey, account }) => {\n const movie = Movie.deserialize(account.data)\n if (!movie) {\n return accum\n }\n\n return [...accum, movie]\n }, [])\n setMovies(movies)\n })\n }, [])\n\n return (\n
\n {\n movies.map((movie, i) => )\n }\n
\n )\n}\n")),(0,r.kt)("p",null,"\u5c31\u50cf\u4ee5\u524d\u4e00\u6837\uff0c\u6211\u4eec\u8bbe\u7f6e\u4e86\u5bfc\u5165\u548c\u8fde\u63a5\u3002\u4e3b\u8981\u66f4\u6539\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"useEffect")," \u4e2d\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"connection.getProgramAccounts(new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID))\n")),(0,r.kt)("p",null,"\u5728\u83b7\u53d6\u7535\u5f71\u8bc4\u8bba\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u83b7\u53d6\u5305\u542b\u5b83\u4eec\u7684\u5e10\u6237\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"getProgramAccounts")," \u7aef\u70b9\u83b7\u53d6\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u7684\u6240\u6709\u7a0b\u5e8f\u5e10\u6237\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\u3002"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u8fd9\u662f\u4e00\u4e2a\u76f8\u5f53\u7e41\u91cd\u7684\u7aef\u70b9 - \u5982\u679c\u60a8\u5728\u50cf Magic Eden \u7a0b\u5e8f\u8fd9\u6837\u7684\u5927\u578b\u7a0b\u5e8f\u4e0a\u5c1d\u8bd5\u5b83\uff0c\u60a8\u5c06\u5f97\u5230\u6570\u5341\u4e07\u5230\u6570\u767e\u4e07\u7684\u7ed3\u679c\u3002\u5982\u679c\u4f60\u4e0d\u5c0f\u5fc3\u7684\u8bdd\uff0c\u8fd9\u4f1a\u7834\u574f\u4e1c\u897f\u3002\u5728\u73b0\u5b9e\u4e16\u754c\u4e2d\uff0c\u60a8\u5f88\u5c11",(0,r.kt)("a",{parentName:"strong",href:"https://twitter.com/redacted_noah/status/1593831571014012929?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u9700\u8981\u540c\u65f6\u83b7\u5f97\u591a\u4e2a\u5e10\u6237"),"\uff0c\u6240\u4ee5\u73b0\u5728\u4e0d\u7528\u62c5\u5fc3\u3002\u53ea\u9700\u77e5\u9053\u60a8\u4e0d\u5e94\u8be5\u5bf9\u6570\u636e\u8fdb\u884c\u5efa\u6a21\uff0c\u4f7f\u5f97 ",(0,r.kt)("inlineCode",{parentName:"strong"},"getProgramAccounts")," \u662f\u5fc5\u8981\u7684\u3002")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},".then(async (accounts) => {\n const movies: Movie[] = accounts.reduce((accum: Movie[], { pubkey, account }) => {\n // Try to extract movie item from account data\n const movie = Movie.deserialize(account.data)\n\n // If the account does not have a review, movie will be null\n if (!movie) {\n return accum\n }\n\n return [...accum, movie]\n }, [])\n setMovies(movies)\n})\n")),(0,r.kt)("p",null,"\u4e3a\u4e86\u5b58\u50a8\u6211\u4eec\u7684\u7535\u5f71\u8bc4\u8bba\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"Movie"),"s \u7c7b\u578b\u7684\u6570\u7ec4\u3002\u4e3a\u4e86\u586b\u5145\u5b83\uff0c\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"reduce")," \u53cd\u5e8f\u5217\u5316\u6bcf\u4e2a\u5e10\u6237\u5e76\u5c1d\u8bd5\u89e3\u6784 ",(0,r.kt)("inlineCode",{parentName:"p"},"movie")," \u9879\u3002\u5982\u679c\u8be5\u5e10\u6237\u4e2d\u6709\u7535\u5f71\u6570\u636e\uff0c\u90a3\u4e48\u8fd9\u5c06\u8d77\u4f5c\u7528\uff01\u5982\u679c\u6ca1\u6709\uff0c\u7535\u5f71\u5c06\u4e3anull\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd4\u56de\u7d2f\u79ef\u7684\u7535\u5f71\u5217\u8868\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u8fd9\u770b\u8d77\u6765\u4ee4\u4eba\u56f0\u60d1\uff0c\u8bf7\u9010\u884c\u6d4f\u89c8\u4ee3\u7801\u5e76\u786e\u4fdd\u60a8\u77e5\u9053 ",(0,r.kt)("inlineCode",{parentName:"p"},"reduce")," \u65b9\u6cd5\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002"),(0,r.kt)("p",null,"\u786e\u4fdd\u60a8\u6b63\u5728\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run dev")," \u5e76\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \uff0c\u60a8\u5e94\u8be5\u4f1a\u770b\u5230\u5176\u4ed6\u6784\u5efa\u8005\u6dfb\u52a0\u7684\u4e00\u5806\u968f\u673a\u8bc4\u8bba\uff1aD"),(0,r.kt)("h2",{id:"-ship\u6311\u6218"},"\ud83d\udea2 Ship\u6311\u6218"),(0,r.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u53ef\u4ee5\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u6570\u636e\u3002\u597d\u7684\u3002\u8ba9\u6211\u4eec\u5207\u6362\u5230\u6211\u4eec\u5728\u5e8f\u5217\u5316\u90e8\u5206\u5f00\u59cb\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"Student Intros")," \u5e94\u7528\u7a0b\u5e8f\u3002"),(0,r.kt)("p",null,"\u76ee\u6807\uff1a\u66f4\u65b0\u5e94\u7528\u7a0b\u5e8f\u4ee5\u83b7\u53d6\u5e76\u53cd\u5e8f\u5217\u5316\u7a0b\u5e8f\u7684\u5e10\u6237\u6570\u636e\u3002\u652f\u6301\u6b64\u529f\u80fd\u7684 Solana \u7a0b\u5e8f\u4f4d\u4e8e\uff1a ",(0,r.kt)("inlineCode",{parentName:"p"},"HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf")),(0,r.kt)("p",null,"\u60a8\u53ef\u4ee5\u4ece\u4e0a\u6b21\u6311\u6218\u4e2d\u79bb\u5f00\u7684\u4f4d\u7f6e\u5f00\u59cb\uff0c\u4e5f\u53ef\u4ee5\u4ece\u6b64\u5b58\u50a8\u5e93\u4e2d",(0,r.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-student-intros-frontend/tree/solution-serialize-instruction-data"},"\u83b7\u53d6\u4ee3\u7801"),"\u3002\u786e\u4fdd\u60a8\u4ece ",(0,r.kt)("inlineCode",{parentName:"p"},"solution-serialize-instruction-data")," \u5206\u652f\u5f00\u59cb\u3002"),(0,r.kt)("h3",{id:"hints"},"Hints:"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntro.ts")," \u4e2d\u521b\u5efa\u5e10\u6237\u7f13\u51b2\u533a\u5e03\u5c40\u3002\u8d26\u6237\u6570\u636e\u5305\u542b\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li"},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"initialized")," \u4f5c\u4e3a\u4e00\u4e2a\u5e03\u5c14\u503c\uff0c\u8868\u793a\u5e10\u6237\u662f\u5426\u5df2\u521d\u59cb\u5316"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"name")," \u4f5c\u4e3a\u8868\u793a\u5b66\u751f\u59d3\u540d\u7684\u5b57\u7b26\u4e32"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("ol",{parentName:"li",start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"message")," \u4f5c\u4e3a\u8868\u793a\u5b66\u751f\u5206\u4eab\u7684\u6709\u5173 Solana \u65c5\u7a0b\u7684\u6d88\u606f\u7684\u5b57\u7b26\u4e32")))),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntro.ts")," \u4e2d\u521b\u5efa\u4e00\u4e2a\u9759\u6001\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u5c06\u4f7f\u7528\u7f13\u51b2\u533a\u5e03\u5c40\u5c06\u5e10\u6237\u6570\u636e\u7f13\u51b2\u533a\u53cd\u5e8f\u5217\u5316\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntro")," \u5bf9\u8c61\u3002"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntroList")," \u7ec4\u4ef6\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"useEffect")," \u4e2d\uff0c\u83b7\u53d6\u7a0b\u5e8f\u7684\u5e10\u6237\u5e76\u5c06\u5176\u6570\u636e\u53cd\u5e8f\u5217\u5316\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"StudentIntro")," \u5bf9\u8c61\u5217\u8868\u4e2d\u3002"),(0,r.kt)("h3",{id:"solution-code"},"Solution code:"),(0,r.kt)("h4",{id:"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\uff1a"),(0,r.kt)("p",null,"\u4e0e\u5f80\u5e38\u4e00\u6837\uff0c\u9996\u5148\u5c1d\u8bd5\u72ec\u7acb\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u4f46\u5982\u679c\u60a8\u9677\u5165\u56f0\u5883\u6216\u53ea\u662f\u60f3\u5c06\u60a8\u7684\u89e3\u51b3\u65b9\u6848\u4e0e\u6211\u4eec\u7684\u89e3\u51b3\u65b9\u6848\u8fdb\u884c\u6bd4\u8f83\uff0c\u8bf7\u67e5\u770b\u6b64\u5b58\u50a8\u5e93\u4e2d\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"solution-deserialize-account-data")," ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-student-intros-frontend/tree/solution-deserialize-account-data"},"\u5206\u652f"),"\u3002"),(0,r.kt)("p",null,"\u795d\u4f60\u597d\u8fd0\uff01"))}m.isMDXComponent=!0},1269:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upload_1-51e61a1eddcb9e496393993ec25ebb14.png"},7522:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/upload_2-a5bff67b5cd45b89420f1a94b25e790c.png"}}]); \ No newline at end of file diff --git a/assets/js/61cdf435.989519d7.js b/assets/js/61cdf435.989519d7.js deleted file mode 100644 index 6198cca9f..000000000 --- a/assets/js/61cdf435.989519d7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4334],{3905:(e,t,o)=>{o.d(t,{Zo:()=>h,kt:()=>m});var n=o(7294);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function r(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(a[o]=e[o]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},h=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,a=e.mdxType,r=e.originalType,c=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(o),d=a,m=u["".concat(c,".").concat(d)]||u[d]||p[d]||r;return o?n.createElement(m,i(i({ref:t},h),{},{components:o})):n.createElement(m,i({ref:t},h))}));function m(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=o.length,i=new Array(r);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var n=o(7462),a=(o(7294),o(3905));const r={slug:"first-blog-post",title:"All in One Blockchain First Blog",authors:["davirain"],tags:["blog","blockchain","solana","IBC"]},i="All in One Blockchain: Your Comprehensive Guide to Blockchain Technology",l={permalink:"/blog/first-blog-post",editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/blog/2023-07-06.md",source:"@site/blog/2023-07-06.md",title:"All in One Blockchain First Blog",description:"Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.",date:"2023-07-06T00:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"blog",permalink:"/blog/tags/blog"},{label:"blockchain",permalink:"/blog/tags/blockchain"},{label:"solana",permalink:"/blog/tags/solana"},{label:"IBC",permalink:"/blog/tags/ibc"}],readingTime:1.995,hasTruncateMarker:!1,authors:[{name:"Davirain",title:"Davirain Blog",url:"https://github.com/DaviRain-Su",imageURL:"https://github.com/DaviRain-Su.png",key:"davirain"}],frontMatter:{slug:"first-blog-post",title:"All in One Blockchain First Blog",authors:["davirain"],tags:["blog","blockchain","solana","IBC"]}},c={authorsImageUrls:[void 0]},s=[{value:"Understanding Blockchain",id:"understanding-blockchain",level:2},{value:"Spotlight on Solana",id:"spotlight-on-solana",level:2},{value:"Inter-Blockchain Communication (IBC) Protocol",id:"inter-blockchain-communication-ibc-protocol",level:2},{value:"The Future of Blockchain",id:"the-future-of-blockchain",level:2}],h={toc:s},u="wrapper";function p(e){let{components:t,...o}=e;return(0,a.kt)(u,(0,n.Z)({},h,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol."),(0,a.kt)("h2",{id:"understanding-blockchain"},"Understanding Blockchain"),(0,a.kt)("p",null,"Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data."),(0,a.kt)("h2",{id:"spotlight-on-solana"},"Spotlight on Solana"),(0,a.kt)("p",null,"Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps)."),(0,a.kt)("p",null,"One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency."),(0,a.kt)("p",null,"Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence."),(0,a.kt)("h2",{id:"inter-blockchain-communication-ibc-protocol"},"Inter-Blockchain Communication (IBC) Protocol"),(0,a.kt)("p",null,"The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability."),(0,a.kt)("p",null,"IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem."),(0,a.kt)("h2",{id:"the-future-of-blockchain"},"The Future of Blockchain"),(0,a.kt)("p",null,"The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics."),(0,a.kt)("p",null,"Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain."),(0,a.kt)("p",null,"Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/61cdf435.ab4c07d3.js b/assets/js/61cdf435.ab4c07d3.js new file mode 100644 index 000000000..14afbe6ad --- /dev/null +++ b/assets/js/61cdf435.ab4c07d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4334],{3905:(e,t,o)=>{o.d(t,{Zo:()=>h,kt:()=>m});var n=o(7294);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function r(e){for(var t=1;t=0||(a[o]=e[o]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):r(r({},t),e)),o},h=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(o),d=a,m=u["".concat(c,".").concat(d)]||u[d]||p[d]||i;return o?n.createElement(m,r(r({ref:t},h),{},{components:o})):n.createElement(m,r({ref:t},h))}));function m(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=o.length,r=new Array(i);r[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:a,r[1]=l;for(var s=2;s{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=o(7462),a=(o(7294),o(3905));const i={slug:"first-blog-post",title:"All in One Blockchain First Blog",authors:["davirain"],tags:["blog","blockchain","solana","IBC"]},r="All in One Blockchain: Your Comprehensive Guide to Blockchain Technology",l={permalink:"/all-in-one-solana/blog/first-blog-post",editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/blog/2023-07-06.md",source:"@site/blog/2023-07-06.md",title:"All in One Blockchain First Blog",description:"Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.",date:"2023-07-06T00:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"blog",permalink:"/all-in-one-solana/blog/tags/blog"},{label:"blockchain",permalink:"/all-in-one-solana/blog/tags/blockchain"},{label:"solana",permalink:"/all-in-one-solana/blog/tags/solana"},{label:"IBC",permalink:"/all-in-one-solana/blog/tags/ibc"}],readingTime:1.995,hasTruncateMarker:!1,authors:[{name:"Davirain",title:"Davirain Blog",url:"https://github.com/DaviRain-Su",imageURL:"https://github.com/DaviRain-Su.png",key:"davirain"}],frontMatter:{slug:"first-blog-post",title:"All in One Blockchain First Blog",authors:["davirain"],tags:["blog","blockchain","solana","IBC"]}},c={authorsImageUrls:[void 0]},s=[{value:"Understanding Blockchain",id:"understanding-blockchain",level:2},{value:"Spotlight on Solana",id:"spotlight-on-solana",level:2},{value:"Inter-Blockchain Communication (IBC) Protocol",id:"inter-blockchain-communication-ibc-protocol",level:2},{value:"The Future of Blockchain",id:"the-future-of-blockchain",level:2}],h={toc:s},u="wrapper";function p(e){let{components:t,...o}=e;return(0,a.kt)(u,(0,n.Z)({},h,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol."),(0,a.kt)("h2",{id:"understanding-blockchain"},"Understanding Blockchain"),(0,a.kt)("p",null,"Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data."),(0,a.kt)("h2",{id:"spotlight-on-solana"},"Spotlight on Solana"),(0,a.kt)("p",null,"Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps)."),(0,a.kt)("p",null,"One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency."),(0,a.kt)("p",null,"Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence."),(0,a.kt)("h2",{id:"inter-blockchain-communication-ibc-protocol"},"Inter-Blockchain Communication (IBC) Protocol"),(0,a.kt)("p",null,"The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability."),(0,a.kt)("p",null,"IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem."),(0,a.kt)("h2",{id:"the-future-of-blockchain"},"The Future of Blockchain"),(0,a.kt)("p",null,"The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics."),(0,a.kt)("p",null,"Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain."),(0,a.kt)("p",null,"Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/631037e5.1dc806b1.js b/assets/js/631037e5.1dc806b1.js deleted file mode 100644 index 15b56fc5b..000000000 --- a/assets/js/631037e5.1dc806b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[801],{7064:e=>{e.exports=JSON.parse('{"label":"blog","permalink":"/blog/tags/blog","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/6360bfde.b046773c.js b/assets/js/6360bfde.b046773c.js new file mode 100644 index 000000000..84c327a24 --- /dev/null +++ b/assets/js/6360bfde.b046773c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8036],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var u=r.createContext({}),s=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=s(n),m=a,f=p["".concat(u,".").concat(m)]||p[m]||d[m]||l;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[p]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const l={sidebar_position:64,sidebar_label:"Module4",sidebar_class_name:"green"},o="Solana Module4",i={unversionedId:"Solana-Co-Learn/module4/README",id:"Solana-Co-Learn/module4/README",title:"Solana Module4",description:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",source:"@site/docs/Solana-Co-Learn/module4/README.md",sourceDirName:"Solana-Co-Learn/module4",slug:"/Solana-Co-Learn/module4/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module4/README.md",tags:[],version:"current",sidebarPosition:64,frontMatter:{sidebar_position:64,sidebar_label:"Module4",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/"},next:{title:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/"}},u={},s=[{value:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",id:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cpda",level:2},{value:"\u8de8\u7a0b\u5e8f\u8c03\u7528",id:"\u8de8\u7a0b\u5e8f\u8c03\u7528",level:2},{value:"\u6d4b\u8bd5",id:"\u6d4b\u8bd5",level:2},{value:"\u53d1\u8d27\u4e00\u4e2a\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f",id:"\u53d1\u8d27\u4e00\u4e2a\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f",level:2}],c={toc:s},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"solana-module4"},"Solana Module4"),(0,a.kt)("h2",{id:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cpda"},"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e"),(0,a.kt)("li",{parentName:"ul"},"\u5e26\u6709Gage\u7684PDA"),(0,a.kt)("li",{parentName:"ul"},"PDA\u6df1\u5165\u63a2\u7a76"),(0,a.kt)("li",{parentName:"ul"},"\u5728\u94fe\u4e0a\u6784\u5efa\u8bc4\u8bba")),(0,a.kt)("h2",{id:"\u8de8\u7a0b\u5e8f\u8c03\u7528"},"\u8de8\u7a0b\u5e8f\u8c03\u7528"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"CPIs with Gage"),(0,a.kt)("li",{parentName:"ul"},"\u8de8\u9879\u76ee\u7684Boss\u6218"),(0,a.kt)("li",{parentName:"ul"},"\u7528\u6237\u63d0\u4f9b\u8584\u8377\u4ee3\u5e01"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528CPI\u6784\u5efa\u652f\u4ed8\u7cfb\u7edf")),(0,a.kt)("h2",{id:"\u6d4b\u8bd5"},"\u6d4b\u8bd5"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6d4b\u8bd5\u7528\u91cf\u89c4"),(0,a.kt)("li",{parentName:"ul"},"\u6d4b\u8bd5Solana\u7a0b\u5e8f"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528Rust\u7f16\u5199\u6d4b\u8bd5")),(0,a.kt)("h2",{id:"\u53d1\u8d27\u4e00\u4e2a\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f"},"\u53d1\u8d27\u4e00\u4e2a\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6784\u5efa\u4e00\u4e2a\u8d28\u62bc\u7528\u6237\u754c\u9762"),(0,a.kt)("li",{parentName:"ul"},"\u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668"),(0,a.kt)("li",{parentName:"ul"},"\u628a\u5b83\u4eec\u90fd\u653e\u5728\u4e00\u8d77")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6360bfde.c2dead6b.js b/assets/js/6360bfde.c2dead6b.js deleted file mode 100644 index 8df9024c9..000000000 --- a/assets/js/6360bfde.c2dead6b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8036],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),c=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},s="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=c(r),m=a,f=s["".concat(u,".").concat(m)]||s[m]||d[m]||l;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:a,o[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const l={sidebar_position:64,sidebar_label:"Module4",sidebar_class_name:"green"},o="Solana Module4",i={unversionedId:"Solana-Co-Learn/module4/README",id:"Solana-Co-Learn/module4/README",title:"Solana Module4",description:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",source:"@site/docs/Solana-Co-Learn/module4/README.md",sourceDirName:"Solana-Co-Learn/module4",slug:"/Solana-Co-Learn/module4/",permalink:"/docs/Solana-Co-Learn/module4/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module4/README.md",tags:[],version:"current",sidebarPosition:64,frontMatter:{sidebar_position:64,sidebar_label:"Module4",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",permalink:"/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/"},next:{title:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",permalink:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/"}},u={},c=[{value:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",id:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cpda",level:2},{value:"\u8de8\u7a0b\u5e8f\u8c03\u7528",id:"\u8de8\u7a0b\u5e8f\u8c03\u7528",level:2},{value:"\u6d4b\u8bd5",id:"\u6d4b\u8bd5",level:2},{value:"\u53d1\u8d27\u4e00\u4e2a\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f",id:"\u53d1\u8d27\u4e00\u4e2a\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f",level:2}],p={toc:c},s="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(s,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"solana-module4"},"Solana Module4"),(0,a.kt)("h2",{id:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cpda"},"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e"),(0,a.kt)("li",{parentName:"ul"},"\u5e26\u6709Gage\u7684PDA"),(0,a.kt)("li",{parentName:"ul"},"PDA\u6df1\u5165\u63a2\u7a76"),(0,a.kt)("li",{parentName:"ul"},"\u5728\u94fe\u4e0a\u6784\u5efa\u8bc4\u8bba")),(0,a.kt)("h2",{id:"\u8de8\u7a0b\u5e8f\u8c03\u7528"},"\u8de8\u7a0b\u5e8f\u8c03\u7528"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"CPIs with Gage"),(0,a.kt)("li",{parentName:"ul"},"\u8de8\u9879\u76ee\u7684Boss\u6218"),(0,a.kt)("li",{parentName:"ul"},"\u7528\u6237\u63d0\u4f9b\u8584\u8377\u4ee3\u5e01"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528CPI\u6784\u5efa\u652f\u4ed8\u7cfb\u7edf")),(0,a.kt)("h2",{id:"\u6d4b\u8bd5"},"\u6d4b\u8bd5"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6d4b\u8bd5\u7528\u91cf\u89c4"),(0,a.kt)("li",{parentName:"ul"},"\u6d4b\u8bd5Solana\u7a0b\u5e8f"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528Rust\u7f16\u5199\u6d4b\u8bd5")),(0,a.kt)("h2",{id:"\u53d1\u8d27\u4e00\u4e2a\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f"},"\u53d1\u8d27\u4e00\u4e2a\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6784\u5efa\u4e00\u4e2a\u8d28\u62bc\u7528\u6237\u754c\u9762"),(0,a.kt)("li",{parentName:"ul"},"\u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668"),(0,a.kt)("li",{parentName:"ul"},"\u628a\u5b83\u4eec\u90fd\u653e\u5728\u4e00\u8d77")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/664709d0.7072ae0b.js b/assets/js/664709d0.7072ae0b.js deleted file mode 100644 index 3a6829a8a..000000000 --- a/assets/js/664709d0.7072ae0b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3555],{3905:(e,n,t)=>{t.d(n,{Zo:()=>s,kt:()=>k});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var u=r.createContext({}),p=function(e){var n=r.useContext(u),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},s=function(e){var n=p(e.components);return r.createElement(u.Provider,{value:n},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),c=p(t),m=a,k=c["".concat(u,".").concat(m)]||c[m]||d[m]||i;return t?r.createElement(k,l(l({ref:n},s),{},{components:t})):r.createElement(k,l({ref:n},s))}));function k(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,l=new Array(i);l[0]=m;var o={};for(var u in n)hasOwnProperty.call(n,u)&&(o[u]=n[u]);o.originalType=e,o[c]="string"==typeof e?e:a,l[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var r=t(7462),a=(t(7294),t(3905));const i={sidebar_position:60,sidebar_label:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",sidebar_class_name:"green"},l="\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",o={unversionedId:"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README",id:"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README",title:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",description:"\u662f\u65f6\u5019\u786e\u4fdd\u6ca1\u6709\u4eba\u80fd\u591f\u5bf9\u6211\u4eec\u7684Solana\u7535\u5f71\u6570\u636e\u5e93\uff08SMDB\uff09\u7a0b\u5e8f\u8fdb\u884c\u5e72\u6270\u4e86\u3002\u6211\u4eec\u5c06\u6dfb\u52a0\u4e00\u4e9b\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\uff0c\u8fdb\u884c\u4e00\u4e9b\u8f93\u5165\u9a8c\u8bc1\uff0c\u5e76\u6dfb\u52a0\u4e00\u6761 updatemoviereview \u6307\u4ee4\u3002",source:"@site/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/README.md",sourceDirName:"Solana-Co-Learn/module3/security-and-validation/secure-our-program",slug:"/Solana-Co-Learn/module3/security-and-validation/secure-our-program/",permalink:"/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/README.md",tags:[],version:"current",sidebarPosition:60,frontMatter:{sidebar_position:60,sidebar_label:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",permalink:"/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/"},next:{title:"NFT\u8d28\u62bc",permalink:"/docs/Solana-Co-Learn/module3/nft-staking/"}},u={},p=[{value:"\u7b7e\u7f72\u4eba\u68c0\u67e5",id:"\u7b7e\u7f72\u4eba\u68c0\u67e5",level:3},{value:"\u8d26\u6237\u9a8c\u8bc1",id:"\u8d26\u6237\u9a8c\u8bc1",level:3},{value:"\u6570\u636e\u9a8c\u8bc1",id:"\u6570\u636e\u9a8c\u8bc1",level:3},{value:"\u2b06 \u66f4\u65b0\u7535\u5f71\u8bc4\u8bba",id:"-\u66f4\u65b0\u7535\u5f71\u8bc4\u8bba",level:2},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2}],s={toc:p},c="wrapper";function d(e){let{components:n,...t}=e;return(0,a.kt)(c,(0,r.Z)({},s,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f"},"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u786e\u4fdd\u6ca1\u6709\u4eba\u80fd\u591f\u5bf9\u6211\u4eec\u7684Solana\u7535\u5f71\u6570\u636e\u5e93\uff08SMDB\uff09\u7a0b\u5e8f\u8fdb\u884c\u5e72\u6270\u4e86\u3002\u6211\u4eec\u5c06\u6dfb\u52a0\u4e00\u4e9b\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\uff0c\u8fdb\u884c\u4e00\u4e9b\u8f93\u5165\u9a8c\u8bc1\uff0c\u5e76\u6dfb\u52a0\u4e00\u6761 ",(0,a.kt)("inlineCode",{parentName:"p"},"update_movie_review")," \u6307\u4ee4\u3002"),(0,a.kt)("p",null,"\u6211\u4f1a\u5728\u4e00\u4e2a\u70b9\u51fb\u4e2d\u5e2e\u4f60\u5f00\u59cb\uff0c\u770b\u770b\u8fd9\u4e2a",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/6322684077ea7f12846aee91?utm_source=buildspace.so&utm_medium=buildspace_project"},"Playground\u8bbe\u7f6e"),"\u3002"),(0,a.kt)("p",null,"\u5b8c\u6574\u7684\u6587\u4ef6\u7ed3\u6784\u5982\u4e0b\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"lib.rs")," - \u6ce8\u518c\u6a21\u5757"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"entrypoint.rs")," - \u7a0b\u5e8f\u7684\u5165\u53e3\u70b9"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"instruction.rs")," - \u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"processor.rs")," - \u5904\u7406\u6307\u4ee4\u7684\u7a0b\u5e8f\u903b\u8f91"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"state.rs")," - \u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u72b6\u6001"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"error.rs")," - \u81ea\u5b9a\u4e49\u7a0b\u5e8f\u9519\u8bef")),(0,a.kt)("p",null,"\u8bf7\u6ce8\u610f\u4e0e\u201c\u72b6\u6001\u7ba1\u7406\u201d\u7ed3\u675f\u65f6\u7684\u8d77\u59cb\u4ee3\u7801\u7684\u53d8\u5316"),(0,a.kt)("p",null,"\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u4e2d\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"account_len")," \u51fd\u6570\u4e2d\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u88ab\u66f4\u6539\u4e3a\u56fa\u5b9a\u5927\u5c0f\u7684 1000")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"\u8fd9\u6837\uff0c\u5f53\u7528\u6237\u66f4\u65b0\u4ed6\u4eec\u7684\u7535\u5f71\u8bc4\u8bba\u65f6\uff0c\u6211\u4eec\u5c31\u4e0d\u5fc5\u62c5\u5fc3\u91cd\u65b0\u5206\u914d\u5927\u5c0f\u6216\u91cd\u65b0\u8ba1\u7b97\u79df\u91d1\u3002"))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// from this\nlet account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());\n\n// to this\nlet account_len: usize = 1000;\n")),(0,a.kt)("p",null,"\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"state.rs")," \u4e2d"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5b9e\u73b0\u4e00\u4e2a\u51fd\u6570\uff0c\u68c0\u67e5 ",(0,a.kt)("inlineCode",{parentName:"li"},"is_initialized")," \u7ed3\u6784\u4f53\u4e0a\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"is_initialized")," \u5b57\u6bb5\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"Sealed")," \u5b9e\u73b0\u4e86 ",(0,a.kt)("inlineCode",{parentName:"li"},"MovieAccountState")," \uff0c\u5b83\u6307\u5b9a ",(0,a.kt)("inlineCode",{parentName:"li"},"MovieAccountState")," \u5177\u6709\u5df2\u77e5\u5927\u5c0f\u5e76\u63d0\u4f9b\u4e86\u4e00\u4e9b\u7f16\u8bd1\u5668\u4f18\u5316\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside state.rs\nimpl Sealed for MovieAccountState {}\n\nimpl IsInitialized for MovieAccountState {\n fn is_initialized(&self) -> bool {\n self.is_initialized\n }\n}\n")),(0,a.kt)("p",null,"\u8ba9\u6211\u4eec\u4ece\u4e00\u4e9b\u81ea\u5b9a\u4e49\u9519\u8bef\u5f00\u59cb\uff01"),(0,a.kt)("p",null,"\u6211\u4eec\u9700\u8981\u4e00\u4e9b\u53ef\u4ee5\u5728\u4ee5\u4e0b\u60c5\u51b5\u4e0b\u4f7f\u7528\u7684\u9519\u8bef"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u66f4\u65b0\u6307\u4ee4\u5df2\u5728\u5c1a\u672a\u521d\u59cb\u5316\u7684\u5e10\u6237\u4e0a\u8c03\u7528"),(0,a.kt)("li",{parentName:"ul"},"\u63d0\u4f9b\u7684",(0,a.kt)("inlineCode",{parentName:"li"},"PDA"),"\u4e0e\u9884\u671f\u6216\u6d3e\u751f\u7684",(0,a.kt)("inlineCode",{parentName:"li"},"PDA"),"\u4e0d\u5339\u914d"),(0,a.kt)("li",{parentName:"ul"},"\u8f93\u5165\u6570\u636e\u5927\u4e8e\u7a0b\u5e8f\u5141\u8bb8\u7684\u8303\u56f4"),(0,a.kt)("li",{parentName:"ul"},"\u6240\u63d0\u4f9b\u7684\u8bc4\u7ea7\u4e0d\u5728",(0,a.kt)("inlineCode",{parentName:"li"},"1-5"),"\u8303\u56f4\u5185")),(0,a.kt)("p",null,"\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"error.rs")," \u4e2d\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u521b\u5efa\u679a\u4e3e\u7c7b\u578b ",(0,a.kt)("inlineCode",{parentName:"li"},"ReviewError")),(0,a.kt)("li",{parentName:"ul"},"\u5b9e\u73b0\u8f6c\u6362\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"ProgramError"))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'// inside error.rs\nuse solana_program::{program_error::ProgramError};\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum ReviewError{\n // Error 0\n #[error("Account not initialized yet")]\n UninitializedAccount,\n // Error 1\n #[error("PDA derived does not equal PDA passed in")]\n InvalidPDA,\n // Error 2\n #[error("Input data exceeds max length")]\n InvalidDataLength,\n // Error 3\n #[error("Rating greater than 5 or less than 1")]\n InvalidRating,\n}\n\nimpl From for ProgramError {\n fn from(e: ReviewError) -> Self {\n ProgramError::Custom(e as u32)\n }\n}\n')),(0,a.kt)("p",null,"\u8bf7\u524d\u5f80 ",(0,a.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u5e76\u5c06 ",(0,a.kt)("inlineCode",{parentName:"p"},"ReviewError")," \u7eb3\u5165\u8303\u56f4\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside processor.rs\nuse crate::error::ReviewError;\n")),(0,a.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\u6dfb\u52a0\u5b89\u5168\u68c0\u67e5\u3002"),(0,a.kt)("h3",{id:"\u7b7e\u7f72\u4eba\u68c0\u67e5"},"\u7b7e\u7f72\u4eba\u68c0\u67e5"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u786e\u4fdd\u8bc4\u8bba\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"initializer")," \u4e5f\u662f\u4ea4\u6613\u7684\u7b7e\u7f72\u4eba\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'let account_info_iter = &mut accounts.iter();\n\nlet initializer = next_account_info(account_info_iter)?;\nlet pda_account = next_account_info(account_info_iter)?;\nlet system_program = next_account_info(account_info_iter)?;\n\n// add check here\nif !initializer.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature)\n}\n')),(0,a.kt)("h3",{id:"\u8d26\u6237\u9a8c\u8bc1"},"\u8d26\u6237\u9a8c\u8bc1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u786e\u4fdd\u7528\u6237\u4f20\u5165\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"pda_account")," \u662f\u6211\u4eec\u671f\u671b\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"pda"))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'let (pda, bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes().as_ref(),], program_id);\nif pda != *pda_account.key {\n msg!("Invalid seeds for PDA");\n return Err(ProgramError::InvalidArgument)\n}\n')),(0,a.kt)("h3",{id:"\u6570\u636e\u9a8c\u8bc1"},"\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u786e\u4fdd ",(0,a.kt)("inlineCode",{parentName:"li"},"rating")," \u5728",(0,a.kt)("inlineCode",{parentName:"li"},"1"),"\u5230",(0,a.kt)("inlineCode",{parentName:"li"},"5"),"\u7684\u8bc4\u5206\u8303\u56f4\u5185\u3002\u6211\u4eec\u4e0d\u5e0c\u671b\u6709",(0,a.kt)("inlineCode",{parentName:"li"},"0"),"\u6216",(0,a.kt)("inlineCode",{parentName:"li"},"69"),"\u661f\u7684\u8bc4\u4ef7\uff0c\u54c8\u54c8\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if rating > 5 || rating < 1 {\n msg!("Rating cannot be higher than 5");\n return Err(ReviewError::InvalidRating.into())\n}\n')),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u8ba9\u6211\u4eec\u8fd8\u8981\u68c0\u67e5\u4e00\u4e0b\u8bc4\u8bba\u7684\u5185\u5bb9\u662f\u5426\u8d85\u51fa\u4e86\u5206\u914d\u7684\u7a7a\u95f4")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'let total_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());\nif total_len > 1000 {\n msg!("Data length is larger than 1000 bytes");\n return Err(ReviewError::InvalidDataLength.into())\n}\n')),(0,a.kt)("h2",{id:"-\u66f4\u65b0\u7535\u5f71\u8bc4\u8bba"},"\u2b06 \u66f4\u65b0\u7535\u5f71\u8bc4\u8bba"),(0,a.kt)("p",null,"\u73b0\u5728\u662f\u6709\u8da3\u7684\u90e8\u5206\uff01\u8ba9\u6211\u4eec\u6dfb\u52a0 ",(0,a.kt)("inlineCode",{parentName:"p"},"update_movie_review")," \u6307\u4ee4\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u66f4\u65b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"MovieInstruction")," \u679a\u4e3e\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u6587\u4ef6\u5f00\u59cb\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside instruction.rs\npub enum MovieInstruction {\n AddMovieReview {\n title: String,\n rating: u8,\n description: String\n },\n UpdateMovieReview {\n title: String,\n rating: u8,\n description: String\n }\n}\n")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"Payload"),"\u7ed3\u6784\u4f53\u53ef\u4ee5\u4fdd\u6301\u4e0d\u53d8\uff0c\u56e0\u4e3a\u9664\u4e86\u53d8\u4f53\u7c7b\u578b\u4e4b\u5916\uff0c\u6307\u4ee4\u6570\u636e\u4e0e\u6211\u4eec\u7528\u4e8e ",(0,a.kt)("inlineCode",{parentName:"p"},"AddMovieReview")," \u7684\u76f8\u540c\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u8fd8\u9700\u8981\u5c06\u8fd9\u4e2a\u65b0\u7684\u53d8\u4f53\u6dfb\u52a0\u5230\u540c\u4e00\u6587\u4ef6\u4e2d\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"unpack")," \u51fd\u6570\u4e2d"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside instruction.rs\nimpl MovieInstruction {\n pub fn unpack(input: &[u8]) -> Result {\n let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n let payload = MovieReviewPayload::try_from_slice(rest).unwrap();\n Ok(match variant {\n 0 => Self::AddMovieReview {\n title: payload.title,\n rating: payload.rating,\n description: payload.description },\n 1 => Self::UpdateMovieReview {\n title: payload.title,\n rating: payload.rating,\n description: payload.description },\n _ => return Err(ProgramError::InvalidInstructionData)\n })\n }\n}\n")),(0,a.kt)("p",null,"\u6700\u540e\uff0c\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u7684\u5339\u914d\u8bed\u53e5\u4e2d\u6dfb\u52a0 ",(0,a.kt)("inlineCode",{parentName:"p"},"update_movie_review")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside processor.rs\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n // unpack instruction data\n let instruction = MovieInstruction::unpack(instruction_data)?;\n match instruction {\n MovieInstruction::AddMovieReview { title, rating, description } => {\n add_movie_review(program_id, accounts, title, rating, description)\n },\n // add UpdateMovieReview to match against our new data structure\n MovieInstruction::UpdateMovieReview { title, rating, description } => {\n // make call to update function that we'll define next\n update_movie_review(program_id, accounts, title, rating, description)\n }\n }\n}\n")),(0,a.kt)("p",null,"\u6211\u4eec\u9700\u8981\u66f4\u65b0\u7684\u6240\u6709\u5730\u65b9\u7684\u5feb\u901f\u56de\u987e\uff0c\u4ee5\u6dfb\u52a0\u65b0\u7684\u6307\u793a\uff1a"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"instruction.rs"),":")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5728 ",(0,a.kt)("inlineCode",{parentName:"li"},"MovieInstruction")," \u679a\u4e3e\u4e2d\u6dfb\u52a0\u65b0\u7684\u53d8\u91cf"),(0,a.kt)("li",{parentName:"ul"},"\u6dfb\u52a0\u65b0\u7684\u53d8\u4f53\u5230 ",(0,a.kt)("inlineCode",{parentName:"li"},"unpack")," \u51fd\u6570"),(0,a.kt)("li",{parentName:"ul"},"\uff08\u53ef\u9009\uff09- \u6dfb\u52a0\u65b0\u7684\u8d1f\u8f7d\u7ed3\u6784\u4f53")),(0,a.kt)("ol",{start:2},(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"processor.rs"))),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5728 ",(0,a.kt)("inlineCode",{parentName:"li"},"process_instruction")," \u5339\u914d\u8bed\u53e5\u4e2d\u6dfb\u52a0\u65b0\u7684\u53d8\u4f53")),(0,a.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u51c6\u5907\u597d\u7f16\u5199\u5b9e\u9645\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"update_movie_review")," \u51fd\u6570\u4e86\uff01"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u8d26\u6237\u5f00\u59cb\u8fed\u4ee3\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'pub fn update_movie_review(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n _title: String,\n rating: u8,\n description: String\n) -> ProgramResult {\n msg!("Updating movie review...");\n\n // Get Account iterator\n let account_info_iter = &mut accounts.iter();\n\n // Get accounts\n let initializer = next_account_info(account_info_iter)?;\n let pda_account = next_account_info(account_info_iter)?;\n\n Ok(())\n}\n')),(0,a.kt)("p",null,"\u73b0\u5728\u662f\u4e00\u4e2a\u597d\u65f6\u673a\uff0c\u68c0\u67e5\u4e00\u4e0b ",(0,a.kt)("inlineCode",{parentName:"p"},"pda_account.owner")," \u662f\u5426\u4e0e ",(0,a.kt)("inlineCode",{parentName:"p"},"program_id")," \u76f8\u540c\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"if pda_account.owner != program_id {\n return Err(ProgramError::IllegalOwner)\n}\n")),(0,a.kt)("p",null,"\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u68c0\u67e5\u7b7e\u7f72\u8005\u662f\u5426\u4e0e\u521d\u59cb\u5316\u8005\u76f8\u540c\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if !initializer.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature)\n}\n')),(0,a.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u4ece ",(0,a.kt)("inlineCode",{parentName:"p"},"pda_account")," \u4e2d\u89e3\u538b\u6570\u636e\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'msg!("unpacking state account");\nlet mut account_data = try_from_slice_unchecked::(&pda_account.data.borrow()).unwrap();\nmsg!("borrowed account data");\n')),(0,a.kt)("p",null,"\u5bf9\u8fd9\u4e9b\u5168\u65b0\u6570\u636e\u7684\u6700\u540e\u4e00\u6b21\u9a8c\u8bc1\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'// Derive PDA and check that it matches client\nlet (pda, _bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), account_data.title.as_bytes().as_ref(),], program_id);\n\nif pda != *pda_account.key {\n msg!("Invalid seeds for PDA");\n return Err(ReviewError::InvalidPDA.into())\n}\n\nif !account_data.is_initialized() {\n msg!("Account is not initialized");\n return Err(ReviewError::UninitializedAccount.into());\n}\n\nif rating > 5 || rating < 1 {\n msg!("Rating cannot be higher than 5");\n return Err(ReviewError::InvalidRating.into())\n}\n\nlet total_len: usize = 1 + 1 + (4 + account_data.title.len()) + (4 + description.len());\nif total_len > 1000 {\n msg!("Data length is larger than 1000 bytes");\n return Err(ReviewError::InvalidDataLength.into())\n}\n')),(0,a.kt)("p",null,"\u54c7\uff0c\u8fd9\u662f\u4e00\u5927\u5806\u652f\u7968\u554a\u3002\u8ba9\u6211\u611f\u89c9\u81ea\u5df1\u50cf\u4e2a\u94f6\u884c\u51fa\u7eb3\u5458\uff0c\u54c8\u54c8\u3002"),(0,a.kt)("p",null,"\u6700\u540e\u4e00\u6b65\u662f\u66f4\u65b0\u8d26\u6237\u4fe1\u606f\u5e76\u5c06\u5176\u5e8f\u5217\u5316\u4e3a\u8d26\u6237"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"account_data.rating = rating;\naccount_data.description = description;\n\naccount_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;\n")),(0,a.kt)("p",null,"\u6211\u4eec\u505a\u5230\u4e86\uff01\u6211\u4eec\u5728\u6211\u4eec\u7684\u7a0b\u5e8f\u4e2d\u6dfb\u52a0\u4e86\u4e00\u6761\u65b0\u7684\u6307\u4ee4\uff0c\u5e76\u4f7f\u5176\u975e\u5e38\u5b89\u5168\u3002\u8ba9\u6211\u4eec\u6765\u6d4b\u8bd5\u4e00\u4e0b\u5427\uff01"),(0,a.kt)("p",null,"\u6784\u5efa -> \u5347\u7ea7 -> \u590d\u5236\u5730\u5740 -> \u7c98\u8d34\u5230\u524d\u7aef"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"git clone https://github.com/buildspace/solana-movie-frontend/\ncd solana-movie-frontend\ngit checkout solution-update-reviews\nnpm install\n")),(0,a.kt)("p",null,"\u4f60\u7684\u524d\u7aef\u73b0\u5728\u5e94\u8be5\u663e\u793a\u8bc4\u8bba\u4e86\uff01\u4f60\u53ef\u4ee5\u6dfb\u52a0\u8bc4\u8bba\u5e76\u66f4\u65b0\u4f60\u7684\u65e7\u8bc4\u8bba\uff01"),(0,a.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,a.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u6784\u5efa\u4e00\u4e9b\u4e1c\u897f\u4e86\uff0c\u4f60\u53ef\u4ee5\u5728\u4e4b\u524d\u8bfe\u7a0b\u4e2d\u4f7f\u7528\u8fc7\u7684\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\u7684\u57fa\u7840\u4e0a\u8fdb\u884c\u6784\u5efa\u3002"),(0,a.kt)("p",null,"\u5b66\u751f\u4ecb\u7ecd\u8ba1\u5212\u662fSolana\u7684\u4e00\u4e2a\u9879\u76ee\uff0c\u8ba9\u5b66\u751f\u4eec\u53ef\u4ee5\u4ecb\u7ecd\u81ea\u5df1\u3002\u8be5\u8ba1\u5212\u4f1a\u63a5\u6536\u7528\u6237\u7684\u59d3\u540d\u548c\u7b80\u77ed\u7559\u8a00\u4f5c\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"instruction_data")," \uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u8d26\u6237\u5c06\u8fd9\u4e9b\u6570\u636e\u5b58\u50a8\u5728\u94fe\u4e0a\u3002"),(0,a.kt)("p",null,"\u4f7f\u7528\u4f60\u5728\u672c\u8bfe\u7a0b\u4e2d\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u5c1d\u8bd5\u5c06\u6240\u5b66\u5e94\u7528\u4e8e\u5b66\u751f\u4ecb\u7ecd\u8ba1\u5212\u3002\u8be5\u8ba1\u5212\u5e94\u8be5\uff1a"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"\u6dfb\u52a0\u4e00\u6761\u6307\u793a\uff0c\u5141\u8bb8\u5b66\u751f\u66f4\u65b0\u4ed6\u4eec\u7684\u7559\u8a00")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u5b9e\u65bd\u6211\u4eec\u6240\u5b66\u7684\u57fa\u672c\u5b89\u5168\u68c0\u67e5"))),(0,a.kt)("p",null,"\u8bf7\u968f\u610f\u4f7f\u7528\u8fd9\u4e2a",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/62b11ce4f6273245aca4f5b2?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8d77\u59cb\u4ee3\u7801"),"\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u53ef\u4ee5\u7684\u8bdd\uff0c\u5c3d\u91cf\u72ec\u7acb\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff01\u4f46\u5982\u679c\u9047\u5230\u56f0\u96be\uff0c\u53ef\u4ee5\u53c2\u8003",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/62c9120df6273245aca4f5e8?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002\u8bf7\u6ce8\u610f\uff0c\u6839\u636e\u4f60\u5b9e\u73b0\u7684\u68c0\u67e5\u548c\u9519\u8bef\u7f16\u5199\uff0c\u4f60\u7684\u4ee3\u7801\u53ef\u80fd\u4e0e\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\u7565\u6709\u4e0d\u540c\u3002"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/664709d0.fa86429a.js b/assets/js/664709d0.fa86429a.js new file mode 100644 index 000000000..ef9378bd1 --- /dev/null +++ b/assets/js/664709d0.fa86429a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3555],{3905:(e,n,t)=>{t.d(n,{Zo:()=>s,kt:()=>k});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var u=r.createContext({}),p=function(e){var n=r.useContext(u),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},s=function(e){var n=p(e.components);return r.createElement(u.Provider,{value:n},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,u=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),c=p(t),m=a,k=c["".concat(u,".").concat(m)]||c[m]||d[m]||i;return t?r.createElement(k,l(l({ref:n},s),{},{components:t})):r.createElement(k,l({ref:n},s))}));function k(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,l=new Array(i);l[0]=m;var o={};for(var u in n)hasOwnProperty.call(n,u)&&(o[u]=n[u]);o.originalType=e,o[c]="string"==typeof e?e:a,l[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var r=t(7462),a=(t(7294),t(3905));const i={sidebar_position:60,sidebar_label:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",sidebar_class_name:"green"},l="\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",o={unversionedId:"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README",id:"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README",title:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",description:"\u662f\u65f6\u5019\u786e\u4fdd\u6ca1\u6709\u4eba\u80fd\u591f\u5bf9\u6211\u4eec\u7684Solana\u7535\u5f71\u6570\u636e\u5e93\uff08SMDB\uff09\u7a0b\u5e8f\u8fdb\u884c\u5e72\u6270\u4e86\u3002\u6211\u4eec\u5c06\u6dfb\u52a0\u4e00\u4e9b\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\uff0c\u8fdb\u884c\u4e00\u4e9b\u8f93\u5165\u9a8c\u8bc1\uff0c\u5e76\u6dfb\u52a0\u4e00\u6761 updatemoviereview \u6307\u4ee4\u3002",source:"@site/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/README.md",sourceDirName:"Solana-Co-Learn/module3/security-and-validation/secure-our-program",slug:"/Solana-Co-Learn/module3/security-and-validation/secure-our-program/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/README.md",tags:[],version:"current",sidebarPosition:60,frontMatter:{sidebar_position:60,sidebar_label:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/"},next:{title:"NFT\u8d28\u62bc",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/"}},u={},p=[{value:"\u7b7e\u7f72\u4eba\u68c0\u67e5",id:"\u7b7e\u7f72\u4eba\u68c0\u67e5",level:3},{value:"\u8d26\u6237\u9a8c\u8bc1",id:"\u8d26\u6237\u9a8c\u8bc1",level:3},{value:"\u6570\u636e\u9a8c\u8bc1",id:"\u6570\u636e\u9a8c\u8bc1",level:3},{value:"\u2b06 \u66f4\u65b0\u7535\u5f71\u8bc4\u8bba",id:"-\u66f4\u65b0\u7535\u5f71\u8bc4\u8bba",level:2},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2}],s={toc:p},c="wrapper";function d(e){let{components:n,...t}=e;return(0,a.kt)(c,(0,r.Z)({},s,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f"},"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u786e\u4fdd\u6ca1\u6709\u4eba\u80fd\u591f\u5bf9\u6211\u4eec\u7684Solana\u7535\u5f71\u6570\u636e\u5e93\uff08SMDB\uff09\u7a0b\u5e8f\u8fdb\u884c\u5e72\u6270\u4e86\u3002\u6211\u4eec\u5c06\u6dfb\u52a0\u4e00\u4e9b\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\uff0c\u8fdb\u884c\u4e00\u4e9b\u8f93\u5165\u9a8c\u8bc1\uff0c\u5e76\u6dfb\u52a0\u4e00\u6761 ",(0,a.kt)("inlineCode",{parentName:"p"},"update_movie_review")," \u6307\u4ee4\u3002"),(0,a.kt)("p",null,"\u6211\u4f1a\u5728\u4e00\u4e2a\u70b9\u51fb\u4e2d\u5e2e\u4f60\u5f00\u59cb\uff0c\u770b\u770b\u8fd9\u4e2a",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/6322684077ea7f12846aee91?utm_source=buildspace.so&utm_medium=buildspace_project"},"Playground\u8bbe\u7f6e"),"\u3002"),(0,a.kt)("p",null,"\u5b8c\u6574\u7684\u6587\u4ef6\u7ed3\u6784\u5982\u4e0b\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"lib.rs")," - \u6ce8\u518c\u6a21\u5757"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"entrypoint.rs")," - \u7a0b\u5e8f\u7684\u5165\u53e3\u70b9"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"instruction.rs")," - \u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u6307\u4ee4\u6570\u636e"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"processor.rs")," - \u5904\u7406\u6307\u4ee4\u7684\u7a0b\u5e8f\u903b\u8f91"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"state.rs")," - \u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u72b6\u6001"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"error.rs")," - \u81ea\u5b9a\u4e49\u7a0b\u5e8f\u9519\u8bef")),(0,a.kt)("p",null,"\u8bf7\u6ce8\u610f\u4e0e\u201c\u72b6\u6001\u7ba1\u7406\u201d\u7ed3\u675f\u65f6\u7684\u8d77\u59cb\u4ee3\u7801\u7684\u53d8\u5316"),(0,a.kt)("p",null,"\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u4e2d\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"account_len")," \u51fd\u6570\u4e2d\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u88ab\u66f4\u6539\u4e3a\u56fa\u5b9a\u5927\u5c0f\u7684 1000")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"\u8fd9\u6837\uff0c\u5f53\u7528\u6237\u66f4\u65b0\u4ed6\u4eec\u7684\u7535\u5f71\u8bc4\u8bba\u65f6\uff0c\u6211\u4eec\u5c31\u4e0d\u5fc5\u62c5\u5fc3\u91cd\u65b0\u5206\u914d\u5927\u5c0f\u6216\u91cd\u65b0\u8ba1\u7b97\u79df\u91d1\u3002"))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// from this\nlet account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());\n\n// to this\nlet account_len: usize = 1000;\n")),(0,a.kt)("p",null,"\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"state.rs")," \u4e2d"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5b9e\u73b0\u4e00\u4e2a\u51fd\u6570\uff0c\u68c0\u67e5 ",(0,a.kt)("inlineCode",{parentName:"li"},"is_initialized")," \u7ed3\u6784\u4f53\u4e0a\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"is_initialized")," \u5b57\u6bb5\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"Sealed")," \u5b9e\u73b0\u4e86 ",(0,a.kt)("inlineCode",{parentName:"li"},"MovieAccountState")," \uff0c\u5b83\u6307\u5b9a ",(0,a.kt)("inlineCode",{parentName:"li"},"MovieAccountState")," \u5177\u6709\u5df2\u77e5\u5927\u5c0f\u5e76\u63d0\u4f9b\u4e86\u4e00\u4e9b\u7f16\u8bd1\u5668\u4f18\u5316\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside state.rs\nimpl Sealed for MovieAccountState {}\n\nimpl IsInitialized for MovieAccountState {\n fn is_initialized(&self) -> bool {\n self.is_initialized\n }\n}\n")),(0,a.kt)("p",null,"\u8ba9\u6211\u4eec\u4ece\u4e00\u4e9b\u81ea\u5b9a\u4e49\u9519\u8bef\u5f00\u59cb\uff01"),(0,a.kt)("p",null,"\u6211\u4eec\u9700\u8981\u4e00\u4e9b\u53ef\u4ee5\u5728\u4ee5\u4e0b\u60c5\u51b5\u4e0b\u4f7f\u7528\u7684\u9519\u8bef"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u66f4\u65b0\u6307\u4ee4\u5df2\u5728\u5c1a\u672a\u521d\u59cb\u5316\u7684\u5e10\u6237\u4e0a\u8c03\u7528"),(0,a.kt)("li",{parentName:"ul"},"\u63d0\u4f9b\u7684",(0,a.kt)("inlineCode",{parentName:"li"},"PDA"),"\u4e0e\u9884\u671f\u6216\u6d3e\u751f\u7684",(0,a.kt)("inlineCode",{parentName:"li"},"PDA"),"\u4e0d\u5339\u914d"),(0,a.kt)("li",{parentName:"ul"},"\u8f93\u5165\u6570\u636e\u5927\u4e8e\u7a0b\u5e8f\u5141\u8bb8\u7684\u8303\u56f4"),(0,a.kt)("li",{parentName:"ul"},"\u6240\u63d0\u4f9b\u7684\u8bc4\u7ea7\u4e0d\u5728",(0,a.kt)("inlineCode",{parentName:"li"},"1-5"),"\u8303\u56f4\u5185")),(0,a.kt)("p",null,"\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"error.rs")," \u4e2d\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u521b\u5efa\u679a\u4e3e\u7c7b\u578b ",(0,a.kt)("inlineCode",{parentName:"li"},"ReviewError")),(0,a.kt)("li",{parentName:"ul"},"\u5b9e\u73b0\u8f6c\u6362\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"ProgramError"))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'// inside error.rs\nuse solana_program::{program_error::ProgramError};\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum ReviewError{\n // Error 0\n #[error("Account not initialized yet")]\n UninitializedAccount,\n // Error 1\n #[error("PDA derived does not equal PDA passed in")]\n InvalidPDA,\n // Error 2\n #[error("Input data exceeds max length")]\n InvalidDataLength,\n // Error 3\n #[error("Rating greater than 5 or less than 1")]\n InvalidRating,\n}\n\nimpl From for ProgramError {\n fn from(e: ReviewError) -> Self {\n ProgramError::Custom(e as u32)\n }\n}\n')),(0,a.kt)("p",null,"\u8bf7\u524d\u5f80 ",(0,a.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u5e76\u5c06 ",(0,a.kt)("inlineCode",{parentName:"p"},"ReviewError")," \u7eb3\u5165\u8303\u56f4\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside processor.rs\nuse crate::error::ReviewError;\n")),(0,a.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\u6dfb\u52a0\u5b89\u5168\u68c0\u67e5\u3002"),(0,a.kt)("h3",{id:"\u7b7e\u7f72\u4eba\u68c0\u67e5"},"\u7b7e\u7f72\u4eba\u68c0\u67e5"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u786e\u4fdd\u8bc4\u8bba\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"initializer")," \u4e5f\u662f\u4ea4\u6613\u7684\u7b7e\u7f72\u4eba\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'let account_info_iter = &mut accounts.iter();\n\nlet initializer = next_account_info(account_info_iter)?;\nlet pda_account = next_account_info(account_info_iter)?;\nlet system_program = next_account_info(account_info_iter)?;\n\n// add check here\nif !initializer.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature)\n}\n')),(0,a.kt)("h3",{id:"\u8d26\u6237\u9a8c\u8bc1"},"\u8d26\u6237\u9a8c\u8bc1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u786e\u4fdd\u7528\u6237\u4f20\u5165\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"pda_account")," \u662f\u6211\u4eec\u671f\u671b\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"pda"))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'let (pda, bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes().as_ref(),], program_id);\nif pda != *pda_account.key {\n msg!("Invalid seeds for PDA");\n return Err(ProgramError::InvalidArgument)\n}\n')),(0,a.kt)("h3",{id:"\u6570\u636e\u9a8c\u8bc1"},"\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u786e\u4fdd ",(0,a.kt)("inlineCode",{parentName:"li"},"rating")," \u5728",(0,a.kt)("inlineCode",{parentName:"li"},"1"),"\u5230",(0,a.kt)("inlineCode",{parentName:"li"},"5"),"\u7684\u8bc4\u5206\u8303\u56f4\u5185\u3002\u6211\u4eec\u4e0d\u5e0c\u671b\u6709",(0,a.kt)("inlineCode",{parentName:"li"},"0"),"\u6216",(0,a.kt)("inlineCode",{parentName:"li"},"69"),"\u661f\u7684\u8bc4\u4ef7\uff0c\u54c8\u54c8\u3002")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if rating > 5 || rating < 1 {\n msg!("Rating cannot be higher than 5");\n return Err(ReviewError::InvalidRating.into())\n}\n')),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u8ba9\u6211\u4eec\u8fd8\u8981\u68c0\u67e5\u4e00\u4e0b\u8bc4\u8bba\u7684\u5185\u5bb9\u662f\u5426\u8d85\u51fa\u4e86\u5206\u914d\u7684\u7a7a\u95f4")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'let total_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());\nif total_len > 1000 {\n msg!("Data length is larger than 1000 bytes");\n return Err(ReviewError::InvalidDataLength.into())\n}\n')),(0,a.kt)("h2",{id:"-\u66f4\u65b0\u7535\u5f71\u8bc4\u8bba"},"\u2b06 \u66f4\u65b0\u7535\u5f71\u8bc4\u8bba"),(0,a.kt)("p",null,"\u73b0\u5728\u662f\u6709\u8da3\u7684\u90e8\u5206\uff01\u8ba9\u6211\u4eec\u6dfb\u52a0 ",(0,a.kt)("inlineCode",{parentName:"p"},"update_movie_review")," \u6307\u4ee4\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u66f4\u65b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"MovieInstruction")," \u679a\u4e3e\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u6587\u4ef6\u5f00\u59cb\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside instruction.rs\npub enum MovieInstruction {\n AddMovieReview {\n title: String,\n rating: u8,\n description: String\n },\n UpdateMovieReview {\n title: String,\n rating: u8,\n description: String\n }\n}\n")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"Payload"),"\u7ed3\u6784\u4f53\u53ef\u4ee5\u4fdd\u6301\u4e0d\u53d8\uff0c\u56e0\u4e3a\u9664\u4e86\u53d8\u4f53\u7c7b\u578b\u4e4b\u5916\uff0c\u6307\u4ee4\u6570\u636e\u4e0e\u6211\u4eec\u7528\u4e8e ",(0,a.kt)("inlineCode",{parentName:"p"},"AddMovieReview")," \u7684\u76f8\u540c\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u8fd8\u9700\u8981\u5c06\u8fd9\u4e2a\u65b0\u7684\u53d8\u4f53\u6dfb\u52a0\u5230\u540c\u4e00\u6587\u4ef6\u4e2d\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"unpack")," \u51fd\u6570\u4e2d"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside instruction.rs\nimpl MovieInstruction {\n pub fn unpack(input: &[u8]) -> Result {\n let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n let payload = MovieReviewPayload::try_from_slice(rest).unwrap();\n Ok(match variant {\n 0 => Self::AddMovieReview {\n title: payload.title,\n rating: payload.rating,\n description: payload.description },\n 1 => Self::UpdateMovieReview {\n title: payload.title,\n rating: payload.rating,\n description: payload.description },\n _ => return Err(ProgramError::InvalidInstructionData)\n })\n }\n}\n")),(0,a.kt)("p",null,"\u6700\u540e\uff0c\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u7684\u5339\u914d\u8bed\u53e5\u4e2d\u6dfb\u52a0 ",(0,a.kt)("inlineCode",{parentName:"p"},"update_movie_review")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"// inside processor.rs\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n // unpack instruction data\n let instruction = MovieInstruction::unpack(instruction_data)?;\n match instruction {\n MovieInstruction::AddMovieReview { title, rating, description } => {\n add_movie_review(program_id, accounts, title, rating, description)\n },\n // add UpdateMovieReview to match against our new data structure\n MovieInstruction::UpdateMovieReview { title, rating, description } => {\n // make call to update function that we'll define next\n update_movie_review(program_id, accounts, title, rating, description)\n }\n }\n}\n")),(0,a.kt)("p",null,"\u6211\u4eec\u9700\u8981\u66f4\u65b0\u7684\u6240\u6709\u5730\u65b9\u7684\u5feb\u901f\u56de\u987e\uff0c\u4ee5\u6dfb\u52a0\u65b0\u7684\u6307\u793a\uff1a"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"instruction.rs"),":")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5728 ",(0,a.kt)("inlineCode",{parentName:"li"},"MovieInstruction")," \u679a\u4e3e\u4e2d\u6dfb\u52a0\u65b0\u7684\u53d8\u91cf"),(0,a.kt)("li",{parentName:"ul"},"\u6dfb\u52a0\u65b0\u7684\u53d8\u4f53\u5230 ",(0,a.kt)("inlineCode",{parentName:"li"},"unpack")," \u51fd\u6570"),(0,a.kt)("li",{parentName:"ul"},"\uff08\u53ef\u9009\uff09- \u6dfb\u52a0\u65b0\u7684\u8d1f\u8f7d\u7ed3\u6784\u4f53")),(0,a.kt)("ol",{start:2},(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"processor.rs"))),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5728 ",(0,a.kt)("inlineCode",{parentName:"li"},"process_instruction")," \u5339\u914d\u8bed\u53e5\u4e2d\u6dfb\u52a0\u65b0\u7684\u53d8\u4f53")),(0,a.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u51c6\u5907\u597d\u7f16\u5199\u5b9e\u9645\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"update_movie_review")," \u51fd\u6570\u4e86\uff01"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u8d26\u6237\u5f00\u59cb\u8fed\u4ee3\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'pub fn update_movie_review(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n _title: String,\n rating: u8,\n description: String\n) -> ProgramResult {\n msg!("Updating movie review...");\n\n // Get Account iterator\n let account_info_iter = &mut accounts.iter();\n\n // Get accounts\n let initializer = next_account_info(account_info_iter)?;\n let pda_account = next_account_info(account_info_iter)?;\n\n Ok(())\n}\n')),(0,a.kt)("p",null,"\u73b0\u5728\u662f\u4e00\u4e2a\u597d\u65f6\u673a\uff0c\u68c0\u67e5\u4e00\u4e0b ",(0,a.kt)("inlineCode",{parentName:"p"},"pda_account.owner")," \u662f\u5426\u4e0e ",(0,a.kt)("inlineCode",{parentName:"p"},"program_id")," \u76f8\u540c\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"if pda_account.owner != program_id {\n return Err(ProgramError::IllegalOwner)\n}\n")),(0,a.kt)("p",null,"\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u68c0\u67e5\u7b7e\u7f72\u8005\u662f\u5426\u4e0e\u521d\u59cb\u5316\u8005\u76f8\u540c\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if !initializer.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature)\n}\n')),(0,a.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u4ece ",(0,a.kt)("inlineCode",{parentName:"p"},"pda_account")," \u4e2d\u89e3\u538b\u6570\u636e\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'msg!("unpacking state account");\nlet mut account_data = try_from_slice_unchecked::(&pda_account.data.borrow()).unwrap();\nmsg!("borrowed account data");\n')),(0,a.kt)("p",null,"\u5bf9\u8fd9\u4e9b\u5168\u65b0\u6570\u636e\u7684\u6700\u540e\u4e00\u6b21\u9a8c\u8bc1\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'// Derive PDA and check that it matches client\nlet (pda, _bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), account_data.title.as_bytes().as_ref(),], program_id);\n\nif pda != *pda_account.key {\n msg!("Invalid seeds for PDA");\n return Err(ReviewError::InvalidPDA.into())\n}\n\nif !account_data.is_initialized() {\n msg!("Account is not initialized");\n return Err(ReviewError::UninitializedAccount.into());\n}\n\nif rating > 5 || rating < 1 {\n msg!("Rating cannot be higher than 5");\n return Err(ReviewError::InvalidRating.into())\n}\n\nlet total_len: usize = 1 + 1 + (4 + account_data.title.len()) + (4 + description.len());\nif total_len > 1000 {\n msg!("Data length is larger than 1000 bytes");\n return Err(ReviewError::InvalidDataLength.into())\n}\n')),(0,a.kt)("p",null,"\u54c7\uff0c\u8fd9\u662f\u4e00\u5927\u5806\u652f\u7968\u554a\u3002\u8ba9\u6211\u611f\u89c9\u81ea\u5df1\u50cf\u4e2a\u94f6\u884c\u51fa\u7eb3\u5458\uff0c\u54c8\u54c8\u3002"),(0,a.kt)("p",null,"\u6700\u540e\u4e00\u6b65\u662f\u66f4\u65b0\u8d26\u6237\u4fe1\u606f\u5e76\u5c06\u5176\u5e8f\u5217\u5316\u4e3a\u8d26\u6237"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"account_data.rating = rating;\naccount_data.description = description;\n\naccount_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;\n")),(0,a.kt)("p",null,"\u6211\u4eec\u505a\u5230\u4e86\uff01\u6211\u4eec\u5728\u6211\u4eec\u7684\u7a0b\u5e8f\u4e2d\u6dfb\u52a0\u4e86\u4e00\u6761\u65b0\u7684\u6307\u4ee4\uff0c\u5e76\u4f7f\u5176\u975e\u5e38\u5b89\u5168\u3002\u8ba9\u6211\u4eec\u6765\u6d4b\u8bd5\u4e00\u4e0b\u5427\uff01"),(0,a.kt)("p",null,"\u6784\u5efa -> \u5347\u7ea7 -> \u590d\u5236\u5730\u5740 -> \u7c98\u8d34\u5230\u524d\u7aef"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"git clone https://github.com/buildspace/solana-movie-frontend/\ncd solana-movie-frontend\ngit checkout solution-update-reviews\nnpm install\n")),(0,a.kt)("p",null,"\u4f60\u7684\u524d\u7aef\u73b0\u5728\u5e94\u8be5\u663e\u793a\u8bc4\u8bba\u4e86\uff01\u4f60\u53ef\u4ee5\u6dfb\u52a0\u8bc4\u8bba\u5e76\u66f4\u65b0\u4f60\u7684\u65e7\u8bc4\u8bba\uff01"),(0,a.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,a.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u6784\u5efa\u4e00\u4e9b\u4e1c\u897f\u4e86\uff0c\u4f60\u53ef\u4ee5\u5728\u4e4b\u524d\u8bfe\u7a0b\u4e2d\u4f7f\u7528\u8fc7\u7684\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\u7684\u57fa\u7840\u4e0a\u8fdb\u884c\u6784\u5efa\u3002"),(0,a.kt)("p",null,"\u5b66\u751f\u4ecb\u7ecd\u8ba1\u5212\u662fSolana\u7684\u4e00\u4e2a\u9879\u76ee\uff0c\u8ba9\u5b66\u751f\u4eec\u53ef\u4ee5\u4ecb\u7ecd\u81ea\u5df1\u3002\u8be5\u8ba1\u5212\u4f1a\u63a5\u6536\u7528\u6237\u7684\u59d3\u540d\u548c\u7b80\u77ed\u7559\u8a00\u4f5c\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"instruction_data")," \uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u8d26\u6237\u5c06\u8fd9\u4e9b\u6570\u636e\u5b58\u50a8\u5728\u94fe\u4e0a\u3002"),(0,a.kt)("p",null,"\u4f7f\u7528\u4f60\u5728\u672c\u8bfe\u7a0b\u4e2d\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u5c1d\u8bd5\u5c06\u6240\u5b66\u5e94\u7528\u4e8e\u5b66\u751f\u4ecb\u7ecd\u8ba1\u5212\u3002\u8be5\u8ba1\u5212\u5e94\u8be5\uff1a"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"\u6dfb\u52a0\u4e00\u6761\u6307\u793a\uff0c\u5141\u8bb8\u5b66\u751f\u66f4\u65b0\u4ed6\u4eec\u7684\u7559\u8a00")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u5b9e\u65bd\u6211\u4eec\u6240\u5b66\u7684\u57fa\u672c\u5b89\u5168\u68c0\u67e5"))),(0,a.kt)("p",null,"\u8bf7\u968f\u610f\u4f7f\u7528\u8fd9\u4e2a",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/62b11ce4f6273245aca4f5b2?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8d77\u59cb\u4ee3\u7801"),"\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u53ef\u4ee5\u7684\u8bdd\uff0c\u5c3d\u91cf\u72ec\u7acb\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff01\u4f46\u5982\u679c\u9047\u5230\u56f0\u96be\uff0c\u53ef\u4ee5\u53c2\u8003",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/62c9120df6273245aca4f5e8?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002\u8bf7\u6ce8\u610f\uff0c\u6839\u636e\u4f60\u5b9e\u73b0\u7684\u68c0\u67e5\u548c\u9519\u8bef\u7f16\u5199\uff0c\u4f60\u7684\u4ee3\u7801\u53ef\u80fd\u4e0e\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\u7565\u6709\u4e0d\u540c\u3002"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6939f7f7.0d634265.js b/assets/js/6939f7f7.0d634265.js new file mode 100644 index 000000000..9e8543a97 --- /dev/null +++ b/assets/js/6939f7f7.0d634265.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9536],{3905:(e,n,t)=>{t.d(n,{Zo:()=>s,kt:()=>k});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=r.createContext({}),u=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},s=function(e){var n=u(e.components);return r.createElement(p.Provider,{value:n},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,l=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),c=u(t),m=a,k=c["".concat(p,".").concat(m)]||c[m]||d[m]||l;return t?r.createElement(k,o(o({ref:n},s),{},{components:t})):r.createElement(k,o({ref:n},s))}));function k(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var l=t.length,o=new Array(l);o[0]=m;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[c]="string"==typeof e?e:a,o[1]=i;for(var u=2;u{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var r=t(7462),a=(t(7294),t(3905));const l={sidebar_position:52,sidebar_label:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",sidebar_class_name:"green"},o="\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",i={unversionedId:"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README",id:"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README",title:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",description:"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002",source:"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/README.md",sourceDirName:"Solana-Co-Learn/module3/introduction-to-rust/hello-world",slug:"/Solana-Co-Learn/module3/introduction-to-rust/hello-world/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/README.md",tags:[],version:"current",sidebarPosition:52,frontMatter:{sidebar_position:52,sidebar_label:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/"},next:{title:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/"}},p={},u=[{value:"\ud83d\udce6 Rust\u6a21\u5757\u7cfb\u7edf",id:"-rust\u6a21\u5757\u7cfb\u7edf",level:2},{value:"\ud83d\udee3 \u8def\u5f84\u548c\u8303\u56f4",id:"-\u8def\u5f84\u548c\u8303\u56f4",level:2},{value:"\ud83c\udfc1 Solana\u7a0b\u5e8f\u5165\u53e3",id:"-solana\u7a0b\u5e8f\u5165\u53e3",level:2},{value:"\ud83d\udd28 Rust\u4e2d\u7684\u51fd\u6570",id:"-rust\u4e2d\u7684\u51fd\u6570",level:2},{value:"\ud83d\udcdc Result \u679a\u4e3e",id:"-result-\u679a\u4e3e",level:2},{value:"\ud83d\ude80 \u90e8\u7f72\u4f60\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f",id:"-\u90e8\u7f72\u4f60\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f",level:2}],s={toc:u},c="wrapper";function d(e){let{components:n,...l}=e;return(0,a.kt)(c,(0,r.Z)({},s,l,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u4f60\u597d\u4e16\u754c"},"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684",(0,a.kt)("inlineCode",{parentName:"p"},"Hello World"),"\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684",(0,a.kt)("inlineCode",{parentName:"p"},"Hello World"),"\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002"),(0,a.kt)("h2",{id:"-rust\u6a21\u5757\u7cfb\u7edf"},"\ud83d\udce6 Rust\u6a21\u5757\u7cfb\u7edf"),(0,a.kt)("p",null,"\u5c31\u50cf\u6211\u4eec\u5bf9\u5f85\u5ba2\u6237\u4e00\u6837\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u7cfb\u5217\u7684\u5e93\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u5fc5\u5199\u5927\u91cf\u7684\u6837\u677f\u4ee3\u7801\u3002Rust\u4f7f\u7528\u88ab\u7edf\u79f0\u4e3a\u201c\u6a21\u5757\u7cfb\u7edf\u201d\u7684\u65b9\u5f0f\u6765\u7ec4\u7ec7\u4ee3\u7801\u3002\u8fd9\u4e0e",(0,a.kt)("inlineCode",{parentName:"p"},"Node.js"),"\u4e2d\u7684\u6a21\u5757\u6216",(0,a.kt)("inlineCode",{parentName:"p"},"C++"),"\u4e2d\u7684\u547d\u540d\u7a7a\u95f4\u975e\u5e38\u76f8\u4f3c\u3002"),(0,a.kt)("p",null,"\u4e0b\u9762\u662f\u4e00\u4e2a\u65b9\u4fbf\u7684\u53ef\u89c6\u5316\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(6167).Z,width:"1094",height:"844"})),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://www.reddit.com/r/learnrust/comments/wb0gdt/visual_to_understandremember_packages_crates/"},"srouce")),(0,a.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u65b9\u4fbf\u7684\u53ef\u89c6\u5316\u5de5\u5177\uff1a"),(0,a.kt)("p",null,"\u8fd9\u4e2a\u7cfb\u7edf\u7684\u4e09\u4e2a\u90e8\u5206\u662f\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"package")," - \u4e00\u4e2a\u5305\u542b\u4e00\u7ec4\u6728\u7bb1\u4ee5\u53ca\u7528\u4e8e\u6307\u5b9a\u5143\u6570\u636e\u548c\u5305\u4e4b\u95f4\u4f9d\u8d56\u5173\u7cfb\u7684\u6e05\u5355\u6587\u4ef6\u7684\u5305\u3002\u5c06\u5176\u89c6\u4e3aNode.js\u4e2d\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"package.json")," \u3002"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"Crate\uff08\u677f\u6761\u7bb1\uff09"),"- \u4e00\u4e2a",(0,a.kt)("inlineCode",{parentName:"li"},"crate"),"\uff08\u677f\u6761\u7bb1\uff09\u53ef\u4ee5\u662f\u4e00\u4e2a\u5e93\uff08library\uff09\u6216\u4e00\u4e2a\u53ef\u6267\u884c\u7a0b\u5e8f\uff08executable program\uff09\u3002\u4e00\u4e2a",(0,a.kt)("inlineCode",{parentName:"li"},"crate"),"\uff08\u677f\u6761\u7bb1\uff09\u7684\u6e90\u4ee3\u7801\u901a\u5e38\u88ab\u7ec6\u5206\u4e3a\u591a\u4e2a\u6a21\u5757\uff08modules\uff09\u3002\u8fd9\u5c31\u50cf\u4e00\u4e2a\u8282\u70b9\u6a21\u5757\uff08node module\uff09\u3002"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"module")," - \u6a21\u5757\u5c06\u4ee3\u7801\u5206\u5272\u6210\u903b\u8f91\u5355\u5143\uff0c\u4e3a\u7ec4\u7ec7\u3001\u4f5c\u7528\u57df\u548c\u8def\u5f84\u7684\u9690\u79c1\u63d0\u4f9b\u4e86\u72ec\u7acb\u7684\u547d\u540d\u7a7a\u95f4\u3002\u8fd9\u4e9b\u57fa\u672c\u4e0a\u662f\u5355\u72ec\u7684\u6587\u4ef6\u548c\u6587\u4ef6\u5939\u3002")),(0,a.kt)("h2",{id:"-\u8def\u5f84\u548c\u8303\u56f4"},"\ud83d\udee3 \u8def\u5f84\u548c\u8303\u56f4"),(0,a.kt)("p",null,"\u5c31\u50cf\u4f60\u53ef\u4ee5\u5728React\u4e2d\u91cd\u7528\u7ec4\u4ef6\u548c\u5728Node\u4e2d\u91cd\u7528\u6a21\u5757\u4e00\u6837\uff0c",(0,a.kt)("inlineCode",{parentName:"p"},"Crate"),"\u6a21\u5757\u53ef\u4ee5\u5728\u9879\u76ee\u4e2d\u88ab\u91cd\u590d\u4f7f\u7528\u3002\u6a21\u5757\u5185\u90e8\u7684\u9879\u76ee\u6bd4\u8f83\u68d8\u624b\u7684\u5730\u65b9\u5728\u4e8e\u6211\u4eec\u9700\u8981\u77e5\u9053\u5b83\u4eec\u7684\u8def\u5f84\u624d\u80fd\u5f15\u7528\u5b83\u4eec\u3002"),(0,a.kt)("p",null,"\u5c06\u7bb1\u5b50\u7ed3\u6784\u770b\u4f5c\u4e00\u68f5\u6811\uff0c\u5176\u4e2d\u7bb1\u5b50\u662f\u6811\u7684\u57fa\u7840\uff0c\u6a21\u5757\u662f\u6811\u679d\uff0c\u6bcf\u4e2a\u6a21\u5757\u53ef\u4ee5\u6709\u5b50\u6a21\u5757\u6216\u8005\u989d\u5916\u7684\u5206\u652f\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u9700\u8981\u7684\u5176\u4e2d\u4e00\u4ef6\u4e8b\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u5b50\u6a21\u5757\u4e2d\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"account_info")," \u7ed3\u6784\u4f53\uff0c\u4ee5\u4e0b\u662f\u5b83\u7684\u6837\u5b50\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(275).Z,width:"1398",height:"684"})),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"struct"),"\u662f\u4e00\u79cd\u81ea\u5b9a\u4e49\u7684\u6570\u636e\u7c7b\u578b\uff0c\u987a\u4fbf\u8bf4\u4e00\u4e0b\u3002\u628a\u5b83\u60f3\u8c61\u6210\u4e00\u79cd\u81ea\u5b9a\u4e49\u7684\u539f\u59cb\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u50cf\u5b57\u7b26\u4e32\u6216\u6574\u6570\u4e00\u6837\u3002\u4e0e\u4ec5\u5b58\u50a8\u5355\u4e2a\u503c\u4e0d\u540c\uff0c",(0,a.kt)("inlineCode",{parentName:"p"},"struct"),"\u53ef\u4ee5\u5305\u542b\u591a\u4e2a\u503c\u3002"),(0,a.kt)("p",null,"\u5728Rust\u4e2d\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"::")," \u5c31\u50cf ",(0,a.kt)("inlineCode",{parentName:"p"},".")," \u6216 ",(0,a.kt)("inlineCode",{parentName:"p"},"/")," \u4e00\u6837\u3002\u56e0\u6b64\uff0c\u8981\u5f15\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u7ed3\u6784\u4f53\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u5199\uff1a :: \u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::account_info::AccountInfo;\n")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u57fa\u7840\u7bb1\u5b50\u662f ",(0,a.kt)("inlineCode",{parentName:"li"},"solana_program")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"solana_program")," \u5305\u542b\u4e00\u4e2a\u540d\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"account_info")," \u7684\u6a21\u5757"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"account_info")," \u5305\u542b\u4e00\u4e2a\u540d\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"AccountInfo")," \u7684\u7ed3\u6784\u4f53")),(0,a.kt)("p",null,"\u5728Rust\u6587\u4ef6\u7684\u9876\u90e8\u7ecf\u5e38\u4f1a\u770b\u5230\u4e00\u7cfb\u5217\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"use")," \u547d\u4ee4\uff0c\u5c31\u50cf ",(0,a.kt)("inlineCode",{parentName:"p"},"import")," \u6216 ",(0,a.kt)("inlineCode",{parentName:"p"},"require")," \u8bed\u53e5\u4e00\u6837\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u8fd8\u9700\u8981\u4e00\u4e9b\u5176\u4ed6\u7684\u9879\u76ee\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u82b1\u62ec\u53f7\u4ece\u5355\u4e2a\u6a21\u5757\u4e2d\u5f15\u5165\u591a\u4e2a\u9879\u76ee\uff0c\u6709\u70b9\u50cfJS\u4e2d\u7684\u89e3\u6784\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg\n};\n")),(0,a.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u975e\u5e38\u76f4\u63a5\u4e86\u5f53\u3002 ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u7ed3\u6784\u4f53\u662f Solana \u8d26\u6237\u6570\u636e\u7684\u901a\u7528\u63cf\u8ff0\u7b26 - \u5b83\u5b9a\u4e49\u4e86\u8d26\u6237\u5e94\u5177\u5907\u7684\u6240\u6709\u5c5e\u6027\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u4ee5\u524d\u4ece\u672a\u4f7f\u7528\u8fc7\u50cfTypeScript\u6216Java\u8fd9\u6837\u7684\u9759\u6001\u7c7b\u578b\u8bed\u8a00\uff0c\u4f60\u53ef\u80fd\u4f1a\u60f3\u77e5\u9053\u4e3a\u4ec0\u4e48\u6211\u4eec\u8981\u5bfc\u5165\u50cf ",(0,a.kt)("inlineCode",{parentName:"p"},"PubKey")," \u6216 ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u8fd9\u6837\u7684\u201c\u6570\u636e\u7c7b\u578b\u201d\u3002\u7b80\u800c\u8a00\u4e4b\uff0c\u5728Rust\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5728\u58f0\u660e\u53d8\u91cf\u65f6\u5b9a\u4e49\u5176\u7c7b\u578b\u3002\u8fd9\u6709\u52a9\u4e8e\u6211\u4eec\u5728\u7f16\u8bd1\u6216\u8fd0\u884c\u4ee3\u7801\u4e4b\u524d\u6355\u6349\u9519\u8bef\u3002\u56e0\u6b64\uff0c\u5f53\u4f60\u7684\u7a0b\u5e8f\u5728\u533a\u5757\u94fe\u4e0a\u6267\u884c\u4ea4\u6613\u65f6\uff0c\u5b83\u4e0d\u4f1a\u5d29\u6e83\uff0c\u800c\u662f\u5728\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u5d29\u6e83\uff0c\u8fd9\u6837\u4f60\u5c31\u53ef\u4ee5\u66f4\u5feb\u5730\u51c6\u5907\u597d\u53ef\u8fd0\u884c\u7684\u4ee3\u7801 :)"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(8385).Z,width:"2400",height:"1860"})),(0,a.kt)("p",null,"\u6211\u4f1a\u5728\u9700\u8981\u7684\u65f6\u5019\u5904\u7406\u5269\u4e0b\u7684\u8fd9\u4e9b\u9879\u76ee\u3002\u73b0\u5728\u7ee7\u7eed\u524d\u8fdb\uff01"),(0,a.kt)("h2",{id:"-solana\u7a0b\u5e8f\u5165\u53e3"},"\ud83c\udfc1 Solana\u7a0b\u5e8f\u5165\u53e3"),(0,a.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b\u6211\u4eec\u7684TypeScript\u5ba2\u6237\u7aef\u3002\u6211\u4eec\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"index.ts")," \u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"main")," \u4e2d\u6709\u4e00\u4e2a\u51fd\u6570\uff0c\u5b83\u662f\u6211\u4eec\u811a\u672c\u7684\u5165\u53e3\u70b9\u3002\u540c\u6837\u7684\u65b9\u6cd5\u4e5f\u9002\u7528\u4e8eRust\u811a\u672c\uff01\u53ea\u4e0d\u8fc7\u6211\u4eec\u4e0d\u4ec5\u4ec5\u662f\u7f16\u5199\u4efb\u4f55Rust\u811a\u672c\uff0c\u6211\u4eec\u6b63\u5728\u7f16\u5199\u4e00\u4e2a\u5c06\u5728Solana\u4e0a\u8fd0\u884c\u7684\u811a\u672c\u3002"),(0,a.kt)("p",null,"\u8fd9\u5c31\u662f\u6211\u4eec\u7684\u7b2c\u4e8c\u4e2a ",(0,a.kt)("inlineCode",{parentName:"p"},"use")," \u8bed\u53e5\u7684\u4f5c\u7528 - \u5b83\u5f15\u5165\u4e86 ",(0,a.kt)("inlineCode",{parentName:"p"},"entrypoint!")," \u5b8f\uff1a\u4e00\u79cd\u7279\u6b8a\u7c7b\u578b\u7684 main \u51fd\u6570\uff0cSolana\u5c06\u7528\u5b83\u6765\u6267\u884c\u6211\u4eec\u7684\u6307\u4ee4\u3002"),(0,a.kt)("p",null,"\u5b8f\u5c31\u50cf\u4ee3\u7801\u7684\u5feb\u6377\u65b9\u5f0f - \u5b83\u4eec\u662f\u4e00\u79cd\u7f16\u5199\u4ee3\u7801\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u7f16\u5199\u4ee3\u7801\u3002\u5728\u7f16\u8bd1\u65f6\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"entrypoint!(process_instruction)"),"; \u4f1a\u5c55\u5f00\u4e3a\u4e00\u5806\u6837\u677f\u4ee3\u7801\uff0c\u6709\u70b9\u50cf\u6a21\u677f\u3002\u4f60\u4e0d\u9700\u8981\u77e5\u9053\u5b8f\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u4f46\u4f60\u53ef\u4ee5\u5728",(0,a.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/book/ch19-06-macros.html"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u76f8\u5173\u4fe1\u606f\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u7684\u5165\u53e3\u51fd\u6570\u5c06\u8c03\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \uff0c\u6240\u4ee5\u8fd9\u662f\u6211\u4eec\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u6587\u4ef6\u76ee\u524d\u5e94\u8be5\u662f\u8fd9\u6837\u7684\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg\n};\n\nentrypoint!(process_instruction);\n")),(0,a.kt)("p",null,"\u73b0\u5728\u662f\u5173\u4e8e ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u7684\u90e8\u5206\u3002"),(0,a.kt)("h2",{id:"-rust\u4e2d\u7684\u51fd\u6570"},"\ud83d\udd28 Rust\u4e2d\u7684\u51fd\u6570"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"function"),"\u4e0eTypescript\u4e2d\u7684function\u975e\u5e38\u76f8\u4f3c - \u53ea\u9700\u8981\u53c2\u6570\u3001\u7c7b\u578b\u548c\u8fd4\u56de\u7c7b\u578b\u3002\u5c06\u6b64\u6dfb\u52a0\u5230 ",(0,a.kt)("inlineCode",{parentName:"p"},"entrypoint!")," \u5b8f\u4e0b\u9762\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn process_instruction(\n //Arguments and their types\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n // The return type (i.e. what data type the function returns)\n) -> ProgramResult{\n // Leave the body empty for now :)\n}\n")),(0,a.kt)("p",null,"\u6211\u4eec\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"program_id")," \uff1a\u7a0b\u5e8f\u8d26\u6237\u7684\u516c\u94a5\u3002\u7528\u4e8e\u9a8c\u8bc1\u7a0b\u5e8f\u662f\u5426\u7531\u6b63\u786e\u7684\u8d26\u6237\u8c03\u7528\u3002\u7c7b\u578b\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"&Pubkey")," \u3002"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"accounts")," \uff1a\u6307\u4ee4\u6240\u6d89\u53ca\u7684\u8d26\u6237\u3002\u5fc5\u987b\u4e3a\u7c7b\u578b ",(0,a.kt)("inlineCode",{parentName:"li"},"&[AccountInfo]")," \u3002"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"instruction_data")," \uff1a\u6211\u4eec\u4ea4\u6613\u4e2d\u76848\u4f4d\u6307\u4ee4\u6570\u636e\u3002\u5fc5\u987b\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"&[u8]")," \u7c7b\u578b\u3002")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"[]")," \u7684\u610f\u601d\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"u8")," \u662f\u201c\u5207\u7247\u201d\u7c7b\u578b - \u5b83\u4eec\u7c7b\u4f3c\u4e8e\u957f\u5ea6\u672a\u77e5\u7684\u6570\u7ec4\u3002\u6211\u4eec\u4e0d\u79f0\u5b83\u4eec\u4e3a\u6570\u7ec4\uff0c\u56e0\u4e3a\u5b83\u4eec\u66f4\u4f4e\u7ea7 - \u5728Rust\u4e2d\uff0c\u5207\u7247\u662f\u6307\u5411\u4e00\u5757\u5185\u5b58\u5757\u7684\u6307\u9488 \ud83e\udd2f"),(0,a.kt)("p",null,"\u6211\u4eec\u7a0d\u540e\u4f1a\u5904\u7406 ",(0,a.kt)("inlineCode",{parentName:"p"},"&")," :)"),(0,a.kt)("h2",{id:"-result-\u679a\u4e3e"},"\ud83d\udcdc Result \u679a\u4e3e"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u6765\u4ecb\u7ecd\u6211\u4eec\u7684\u7b2c\u4e09\u4e2a ",(0,a.kt)("inlineCode",{parentName:"p"},"use")," \u8bed\u53e5 - ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramResult")," \u4e86\u3002\u8fd9\u662f\u4e00\u4e2aRust\u679a\u4e3e\uff0c\u4ee3\u8868\u4e86Solana\u7a0b\u5e8f\u6267\u884c\u7684\u7ed3\u679c\u3002"),(0,a.kt)("p",null,"\u73b0\u5728\u5c1d\u8bd5\u901a\u8fc7\u70b9\u51fb\u5de6\u4fa7\u680f\u4e0a\u7684\u201c\u6784\u5efa\u201d\u6309\u94ae\u6765\u7f16\u8bd1\u811a\u672c\u3002\u4f60\u5e94\u8be5\u4f1a\u5f97\u5230\u4e00\u4e2a\u8b66\u544a\u548c\u4e00\u4e2a\u9519\u8bef\u3002\u8fd9\u662f\u9519\u8bef\u4fe1\u606f\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"error[E0308]: mismatched types\n --\x3e /src/lib.rs:12:6\n |\n7 | pub fn process_instruction(\n | ------------------- implicitly returns `()` as its body has no tail or `return` expression\n...\n12 | ) -> ProgramResult {\n | ^^^^^^^^^^^^^ expected enum `Result`, found `()`\n |\n = note: expected enum `Result<(), ProgramError>`\n found unit type `()`\n")),(0,a.kt)("p",null,"\u6211\u60f3\u82b1\u70b9\u65f6\u95f4\u8d5e\u8d4f\u4e00\u4e0bRust\u9519\u8bef\u4fe1\u606f\u6709\u591a\u4e48\u7f8e\u4e3d\u3002\u5b83\u51c6\u786e\u5730\u544a\u8bc9\u4f60\u51fa\u4e86\u4ec0\u4e48\u95ee\u9898\uff0c\u95ee\u9898\u51fa\u5728\u54ea\u91cc\u4ee5\u53ca\u5982\u4f55\u4fee\u590d\u3002\u6211\u60f3\u77e5\u9053\u5982\u679cJavaScript\u4e5f\u80fd\u8fd9\u4e48\u53cb\u597d\uff0c\u6211\u4f1a\u5c11\u6389\u591a\u5c11\u5934\u53d1\u5462 \ud83d\ude22"),(0,a.kt)("p",null,"\u7531\u4e8e\u6211\u4eec\u7684\u51fd\u6570\u4f53\u4e3a\u7a7a\uff0c\u5b83\u4f1a\u9690\u5f0f\u5730\u8fd4\u56de ",(0,a.kt)("inlineCode",{parentName:"p"},"()")," - \u7a7a\u5143\u7ec4\u3002\u9519\u8bef\u6d88\u606f\u8868\u793a\u5b83\u671f\u671b ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," \uff0c\u4f46\u6211\u4eec\u58f0\u660e\u7684\u8fd4\u56de\u7c7b\u578b\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramResult")," \u3002\u55ef\uff0c\u8fd9\u91cc\u53d1\u751f\u4e86\u4ec0\u4e48\u5462\ud83e\udd14\uff1f"),(0,a.kt)("p",null,"\u8fd9\u662f\u56e0\u4e3aSolana\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramResult")," \u7c7b\u578b\u4f7f\u7528\u4e86Rust\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," \u7c7b\u578b\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub type ProgramResult = Result<(), ProgramError>;\n")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"Result")," \u662f\u4e00\u4e2a\u6807\u51c6\u5e93\u7c7b\u578b\uff0c\u8868\u793a\u4e24\u4e2a\u79bb\u6563\u7684\u7ed3\u679c\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6210\u529f\uff08 ",(0,a.kt)("inlineCode",{parentName:"li"},"Ok")," \uff09\u6216"),(0,a.kt)("li",{parentName:"ul"},"\u5931\u8d25 ( ",(0,a.kt)("inlineCode",{parentName:"li"},"Err")," )")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub enum Result {\n Ok(T),\n Err(E),\n}\n")),(0,a.kt)("p",null,"\u628a\u5b83\u60f3\u8c61\u6210HTTP\u9519\u8bef\u4ee3\u7801\u2014\u2014200\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"Ok")," \uff0c404\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"Err")," \u3002\u6240\u4ee5\u5f53\u6211\u4eec\u8fd4\u56de ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramResult")," \u65f6\uff0c\u6211\u4eec\u662f\u5728\u8bf4\u6211\u4eec\u7684\u51fd\u6570\u53ef\u4ee5\u8fd4\u56de ",(0,a.kt)("inlineCode",{parentName:"p"},"()")," \uff08\u4e00\u4e2a\u7a7a\u503c\uff09\u8868\u793a\u6210\u529f\uff0c\u6216\u8005\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u679a\u4e3e\u544a\u8bc9\u6211\u4eec\u51fa\u4e86\u4ec0\u4e48\u95ee\u9898\u3002\u975e\u5e38\u6709\u7528\uff01"),(0,a.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u9700\u8981\u505a\u7684\u5168\u90e8\u4e8b\u60c5\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult{\n // Return Ok() for success\n Ok(())\n}\n")),(0,a.kt)("h2",{id:"-\u90e8\u7f72\u4f60\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f"},"\ud83d\ude80 \u90e8\u7f72\u4f60\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f"),(0,a.kt)("p",null,"\u6211\u4eec\u7684\u7a0b\u5e8f\u51e0\u4e4e\u5b8c\u6210\u4e86\uff01\u552f\u4e00\u7f3a\u5c11\u7684\u5c31\u662f\u5b9e\u9645\u4e0a\u8bf4\u51fa\u201cHello World\u201d\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"msg!")," \u5b8f\u6765\u5b9e\u73b0\u3002\u6211\u4eec\u6682\u65f6\u4e0d\u4f1a\u5bf9\u6307\u4ee4\u6570\u636e\u505a\u4efb\u4f55\u64cd\u4f5c\uff0c\u4e3a\u4e86\u907f\u514d\u201c\u672a\u4f7f\u7528\u7684\u53d8\u91cf\u201d\u8b66\u544a\uff0c\u53ea\u9700\u5728\u53d8\u91cf\u540d\u524d\u52a0\u4e0b\u5212\u7ebf\u5373\u53ef\u3002"),(0,a.kt)("p",null,"\u8fd9\u662f\u5b8c\u6574\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u7684\u6837\u5b50\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'pub fn process_instruction(\n _program_id: &Pubkey,\n _accounts: &[AccountInfo],\n _instruction_data: &[u8]\n) -> ProgramResult{\n msg!("Hello World!");\n Ok(())\n}\n')),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u70b9\u51fb\u6784\u5efa\uff0c\u4f60\u5e94\u8be5\u5728\u63a7\u5236\u53f0\u4e0a\u770b\u5230\u4e00\u4e2a\u7eff\u8272\u7684\u201c\u6784\u5efa\u6210\u529f\u201d\u6d88\u606f\u3002\u606d\u559c\uff01\u4f60\u5df2\u7ecf\u7f16\u5199\u4e86\u4f60\u7684\u7b2c\u4e00\u4e2aSolana\u7a0b\u5e8f\ud83c\udf89"),(0,a.kt)("p",null,"\u5728\u8fd9\u4e2a\u6e38\u4e50\u573a\u4e0a\u90e8\u7f72\u975e\u5e38\u7b80\u5355\u3002\u5207\u6362\u5230\u5de6\u4e0a\u89d2\u7684\u201c\u6784\u5efa\u548c\u90e8\u7f72\u201d\u9009\u9879\u5361\uff0c\u5728\u201c\u8d44\u6e90\u7ba1\u7406\u5668\u201d\u56fe\u6807\u4e0b\u65b9\uff0c\u70b9\u51fb\u201c\u90e8\u7f72\u201d\u6309\u94ae\u3002"))}d.isMDXComponent=!0},8385:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/error-compare-d4e97ee4663277ed693c53a1ae35b53f.png"},6167:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/rust-modules-dea5cf709b55a90decc4bd764250ed37.png"},275:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/solana-module-fc143b0bc2afd20842bf6c47cdb6459b.png"}}]); \ No newline at end of file diff --git a/assets/js/6939f7f7.80892694.js b/assets/js/6939f7f7.80892694.js deleted file mode 100644 index e24bb15d1..000000000 --- a/assets/js/6939f7f7.80892694.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9536],{3905:(e,n,t)=>{t.d(n,{Zo:()=>s,kt:()=>k});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=r.createContext({}),u=function(e){var n=r.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},s=function(e){var n=u(e.components);return r.createElement(p.Provider,{value:n},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,l=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),c=u(t),m=a,k=c["".concat(p,".").concat(m)]||c[m]||d[m]||l;return t?r.createElement(k,o(o({ref:n},s),{},{components:t})):r.createElement(k,o({ref:n},s))}));function k(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var l=t.length,o=new Array(l);o[0]=m;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[c]="string"==typeof e?e:a,o[1]=i;for(var u=2;u{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var r=t(7462),a=(t(7294),t(3905));const l={sidebar_position:52,sidebar_label:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",sidebar_class_name:"green"},o="\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",i={unversionedId:"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README",id:"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README",title:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",description:"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002",source:"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/README.md",sourceDirName:"Solana-Co-Learn/module3/introduction-to-rust/hello-world",slug:"/Solana-Co-Learn/module3/introduction-to-rust/hello-world/",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/README.md",tags:[],version:"current",sidebarPosition:52,frontMatter:{sidebar_position:52,sidebar_label:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/"},next:{title:"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/"}},p={},u=[{value:"\ud83d\udce6 Rust\u6a21\u5757\u7cfb\u7edf",id:"-rust\u6a21\u5757\u7cfb\u7edf",level:2},{value:"\ud83d\udee3 \u8def\u5f84\u548c\u8303\u56f4",id:"-\u8def\u5f84\u548c\u8303\u56f4",level:2},{value:"\ud83c\udfc1 Solana\u7a0b\u5e8f\u5165\u53e3",id:"-solana\u7a0b\u5e8f\u5165\u53e3",level:2},{value:"\ud83d\udd28 Rust\u4e2d\u7684\u51fd\u6570",id:"-rust\u4e2d\u7684\u51fd\u6570",level:2},{value:"\ud83d\udcdc Result \u679a\u4e3e",id:"-result-\u679a\u4e3e",level:2},{value:"\ud83d\ude80 \u90e8\u7f72\u4f60\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f",id:"-\u90e8\u7f72\u4f60\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f",level:2}],s={toc:u},c="wrapper";function d(e){let{components:n,...l}=e;return(0,a.kt)(c,(0,r.Z)({},s,l,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u4f60\u597d\u4e16\u754c"},"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684",(0,a.kt)("inlineCode",{parentName:"p"},"Hello World"),"\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684",(0,a.kt)("inlineCode",{parentName:"p"},"Hello World"),"\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002"),(0,a.kt)("h2",{id:"-rust\u6a21\u5757\u7cfb\u7edf"},"\ud83d\udce6 Rust\u6a21\u5757\u7cfb\u7edf"),(0,a.kt)("p",null,"\u5c31\u50cf\u6211\u4eec\u5bf9\u5f85\u5ba2\u6237\u4e00\u6837\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u7cfb\u5217\u7684\u5e93\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u5fc5\u5199\u5927\u91cf\u7684\u6837\u677f\u4ee3\u7801\u3002Rust\u4f7f\u7528\u88ab\u7edf\u79f0\u4e3a\u201c\u6a21\u5757\u7cfb\u7edf\u201d\u7684\u65b9\u5f0f\u6765\u7ec4\u7ec7\u4ee3\u7801\u3002\u8fd9\u4e0e",(0,a.kt)("inlineCode",{parentName:"p"},"Node.js"),"\u4e2d\u7684\u6a21\u5757\u6216",(0,a.kt)("inlineCode",{parentName:"p"},"C++"),"\u4e2d\u7684\u547d\u540d\u7a7a\u95f4\u975e\u5e38\u76f8\u4f3c\u3002"),(0,a.kt)("p",null,"\u4e0b\u9762\u662f\u4e00\u4e2a\u65b9\u4fbf\u7684\u53ef\u89c6\u5316\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(6167).Z,width:"1094",height:"844"})),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://www.reddit.com/r/learnrust/comments/wb0gdt/visual_to_understandremember_packages_crates/"},"srouce")),(0,a.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u65b9\u4fbf\u7684\u53ef\u89c6\u5316\u5de5\u5177\uff1a"),(0,a.kt)("p",null,"\u8fd9\u4e2a\u7cfb\u7edf\u7684\u4e09\u4e2a\u90e8\u5206\u662f\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"package")," - \u4e00\u4e2a\u5305\u542b\u4e00\u7ec4\u6728\u7bb1\u4ee5\u53ca\u7528\u4e8e\u6307\u5b9a\u5143\u6570\u636e\u548c\u5305\u4e4b\u95f4\u4f9d\u8d56\u5173\u7cfb\u7684\u6e05\u5355\u6587\u4ef6\u7684\u5305\u3002\u5c06\u5176\u89c6\u4e3aNode.js\u4e2d\u7684 ",(0,a.kt)("inlineCode",{parentName:"li"},"package.json")," \u3002"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"Crate\uff08\u677f\u6761\u7bb1\uff09"),"- \u4e00\u4e2a",(0,a.kt)("inlineCode",{parentName:"li"},"crate"),"\uff08\u677f\u6761\u7bb1\uff09\u53ef\u4ee5\u662f\u4e00\u4e2a\u5e93\uff08library\uff09\u6216\u4e00\u4e2a\u53ef\u6267\u884c\u7a0b\u5e8f\uff08executable program\uff09\u3002\u4e00\u4e2a",(0,a.kt)("inlineCode",{parentName:"li"},"crate"),"\uff08\u677f\u6761\u7bb1\uff09\u7684\u6e90\u4ee3\u7801\u901a\u5e38\u88ab\u7ec6\u5206\u4e3a\u591a\u4e2a\u6a21\u5757\uff08modules\uff09\u3002\u8fd9\u5c31\u50cf\u4e00\u4e2a\u8282\u70b9\u6a21\u5757\uff08node module\uff09\u3002"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"module")," - \u6a21\u5757\u5c06\u4ee3\u7801\u5206\u5272\u6210\u903b\u8f91\u5355\u5143\uff0c\u4e3a\u7ec4\u7ec7\u3001\u4f5c\u7528\u57df\u548c\u8def\u5f84\u7684\u9690\u79c1\u63d0\u4f9b\u4e86\u72ec\u7acb\u7684\u547d\u540d\u7a7a\u95f4\u3002\u8fd9\u4e9b\u57fa\u672c\u4e0a\u662f\u5355\u72ec\u7684\u6587\u4ef6\u548c\u6587\u4ef6\u5939\u3002")),(0,a.kt)("h2",{id:"-\u8def\u5f84\u548c\u8303\u56f4"},"\ud83d\udee3 \u8def\u5f84\u548c\u8303\u56f4"),(0,a.kt)("p",null,"\u5c31\u50cf\u4f60\u53ef\u4ee5\u5728React\u4e2d\u91cd\u7528\u7ec4\u4ef6\u548c\u5728Node\u4e2d\u91cd\u7528\u6a21\u5757\u4e00\u6837\uff0c",(0,a.kt)("inlineCode",{parentName:"p"},"Crate"),"\u6a21\u5757\u53ef\u4ee5\u5728\u9879\u76ee\u4e2d\u88ab\u91cd\u590d\u4f7f\u7528\u3002\u6a21\u5757\u5185\u90e8\u7684\u9879\u76ee\u6bd4\u8f83\u68d8\u624b\u7684\u5730\u65b9\u5728\u4e8e\u6211\u4eec\u9700\u8981\u77e5\u9053\u5b83\u4eec\u7684\u8def\u5f84\u624d\u80fd\u5f15\u7528\u5b83\u4eec\u3002"),(0,a.kt)("p",null,"\u5c06\u7bb1\u5b50\u7ed3\u6784\u770b\u4f5c\u4e00\u68f5\u6811\uff0c\u5176\u4e2d\u7bb1\u5b50\u662f\u6811\u7684\u57fa\u7840\uff0c\u6a21\u5757\u662f\u6811\u679d\uff0c\u6bcf\u4e2a\u6a21\u5757\u53ef\u4ee5\u6709\u5b50\u6a21\u5757\u6216\u8005\u989d\u5916\u7684\u5206\u652f\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u9700\u8981\u7684\u5176\u4e2d\u4e00\u4ef6\u4e8b\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u5b50\u6a21\u5757\u4e2d\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"account_info")," \u7ed3\u6784\u4f53\uff0c\u4ee5\u4e0b\u662f\u5b83\u7684\u6837\u5b50\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(275).Z,width:"1398",height:"684"})),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"struct"),"\u662f\u4e00\u79cd\u81ea\u5b9a\u4e49\u7684\u6570\u636e\u7c7b\u578b\uff0c\u987a\u4fbf\u8bf4\u4e00\u4e0b\u3002\u628a\u5b83\u60f3\u8c61\u6210\u4e00\u79cd\u81ea\u5b9a\u4e49\u7684\u539f\u59cb\u6570\u636e\u7c7b\u578b\uff0c\u5c31\u50cf\u5b57\u7b26\u4e32\u6216\u6574\u6570\u4e00\u6837\u3002\u4e0e\u4ec5\u5b58\u50a8\u5355\u4e2a\u503c\u4e0d\u540c\uff0c",(0,a.kt)("inlineCode",{parentName:"p"},"struct"),"\u53ef\u4ee5\u5305\u542b\u591a\u4e2a\u503c\u3002"),(0,a.kt)("p",null,"\u5728Rust\u4e2d\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"::")," \u5c31\u50cf ",(0,a.kt)("inlineCode",{parentName:"p"},".")," \u6216 ",(0,a.kt)("inlineCode",{parentName:"p"},"/")," \u4e00\u6837\u3002\u56e0\u6b64\uff0c\u8981\u5f15\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u7ed3\u6784\u4f53\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u5199\uff1a :: \u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::account_info::AccountInfo;\n")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u57fa\u7840\u7bb1\u5b50\u662f ",(0,a.kt)("inlineCode",{parentName:"li"},"solana_program")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"solana_program")," \u5305\u542b\u4e00\u4e2a\u540d\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"account_info")," \u7684\u6a21\u5757"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"account_info")," \u5305\u542b\u4e00\u4e2a\u540d\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"AccountInfo")," \u7684\u7ed3\u6784\u4f53")),(0,a.kt)("p",null,"\u5728Rust\u6587\u4ef6\u7684\u9876\u90e8\u7ecf\u5e38\u4f1a\u770b\u5230\u4e00\u7cfb\u5217\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"use")," \u547d\u4ee4\uff0c\u5c31\u50cf ",(0,a.kt)("inlineCode",{parentName:"p"},"import")," \u6216 ",(0,a.kt)("inlineCode",{parentName:"p"},"require")," \u8bed\u53e5\u4e00\u6837\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u8fd8\u9700\u8981\u4e00\u4e9b\u5176\u4ed6\u7684\u9879\u76ee\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u82b1\u62ec\u53f7\u4ece\u5355\u4e2a\u6a21\u5757\u4e2d\u5f15\u5165\u591a\u4e2a\u9879\u76ee\uff0c\u6709\u70b9\u50cfJS\u4e2d\u7684\u89e3\u6784\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg\n};\n")),(0,a.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u975e\u5e38\u76f4\u63a5\u4e86\u5f53\u3002 ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u7ed3\u6784\u4f53\u662f Solana \u8d26\u6237\u6570\u636e\u7684\u901a\u7528\u63cf\u8ff0\u7b26 - \u5b83\u5b9a\u4e49\u4e86\u8d26\u6237\u5e94\u5177\u5907\u7684\u6240\u6709\u5c5e\u6027\u3002"),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u4ee5\u524d\u4ece\u672a\u4f7f\u7528\u8fc7\u50cfTypeScript\u6216Java\u8fd9\u6837\u7684\u9759\u6001\u7c7b\u578b\u8bed\u8a00\uff0c\u4f60\u53ef\u80fd\u4f1a\u60f3\u77e5\u9053\u4e3a\u4ec0\u4e48\u6211\u4eec\u8981\u5bfc\u5165\u50cf ",(0,a.kt)("inlineCode",{parentName:"p"},"PubKey")," \u6216 ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u8fd9\u6837\u7684\u201c\u6570\u636e\u7c7b\u578b\u201d\u3002\u7b80\u800c\u8a00\u4e4b\uff0c\u5728Rust\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5728\u58f0\u660e\u53d8\u91cf\u65f6\u5b9a\u4e49\u5176\u7c7b\u578b\u3002\u8fd9\u6709\u52a9\u4e8e\u6211\u4eec\u5728\u7f16\u8bd1\u6216\u8fd0\u884c\u4ee3\u7801\u4e4b\u524d\u6355\u6349\u9519\u8bef\u3002\u56e0\u6b64\uff0c\u5f53\u4f60\u7684\u7a0b\u5e8f\u5728\u533a\u5757\u94fe\u4e0a\u6267\u884c\u4ea4\u6613\u65f6\uff0c\u5b83\u4e0d\u4f1a\u5d29\u6e83\uff0c\u800c\u662f\u5728\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u5d29\u6e83\uff0c\u8fd9\u6837\u4f60\u5c31\u53ef\u4ee5\u66f4\u5feb\u5730\u51c6\u5907\u597d\u53ef\u8fd0\u884c\u7684\u4ee3\u7801 :)"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(8385).Z,width:"2400",height:"1860"})),(0,a.kt)("p",null,"\u6211\u4f1a\u5728\u9700\u8981\u7684\u65f6\u5019\u5904\u7406\u5269\u4e0b\u7684\u8fd9\u4e9b\u9879\u76ee\u3002\u73b0\u5728\u7ee7\u7eed\u524d\u8fdb\uff01"),(0,a.kt)("h2",{id:"-solana\u7a0b\u5e8f\u5165\u53e3"},"\ud83c\udfc1 Solana\u7a0b\u5e8f\u5165\u53e3"),(0,a.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b\u6211\u4eec\u7684TypeScript\u5ba2\u6237\u7aef\u3002\u6211\u4eec\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"index.ts")," \u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"main")," \u4e2d\u6709\u4e00\u4e2a\u51fd\u6570\uff0c\u5b83\u662f\u6211\u4eec\u811a\u672c\u7684\u5165\u53e3\u70b9\u3002\u540c\u6837\u7684\u65b9\u6cd5\u4e5f\u9002\u7528\u4e8eRust\u811a\u672c\uff01\u53ea\u4e0d\u8fc7\u6211\u4eec\u4e0d\u4ec5\u4ec5\u662f\u7f16\u5199\u4efb\u4f55Rust\u811a\u672c\uff0c\u6211\u4eec\u6b63\u5728\u7f16\u5199\u4e00\u4e2a\u5c06\u5728Solana\u4e0a\u8fd0\u884c\u7684\u811a\u672c\u3002"),(0,a.kt)("p",null,"\u8fd9\u5c31\u662f\u6211\u4eec\u7684\u7b2c\u4e8c\u4e2a ",(0,a.kt)("inlineCode",{parentName:"p"},"use")," \u8bed\u53e5\u7684\u4f5c\u7528 - \u5b83\u5f15\u5165\u4e86 ",(0,a.kt)("inlineCode",{parentName:"p"},"entrypoint!")," \u5b8f\uff1a\u4e00\u79cd\u7279\u6b8a\u7c7b\u578b\u7684 main \u51fd\u6570\uff0cSolana\u5c06\u7528\u5b83\u6765\u6267\u884c\u6211\u4eec\u7684\u6307\u4ee4\u3002"),(0,a.kt)("p",null,"\u5b8f\u5c31\u50cf\u4ee3\u7801\u7684\u5feb\u6377\u65b9\u5f0f - \u5b83\u4eec\u662f\u4e00\u79cd\u7f16\u5199\u4ee3\u7801\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u7f16\u5199\u4ee3\u7801\u3002\u5728\u7f16\u8bd1\u65f6\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"entrypoint!(process_instruction)"),"; \u4f1a\u5c55\u5f00\u4e3a\u4e00\u5806\u6837\u677f\u4ee3\u7801\uff0c\u6709\u70b9\u50cf\u6a21\u677f\u3002\u4f60\u4e0d\u9700\u8981\u77e5\u9053\u5b8f\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u4f46\u4f60\u53ef\u4ee5\u5728",(0,a.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/book/ch19-06-macros.html"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u76f8\u5173\u4fe1\u606f\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u7684\u5165\u53e3\u51fd\u6570\u5c06\u8c03\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \uff0c\u6240\u4ee5\u8fd9\u662f\u6211\u4eec\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u6587\u4ef6\u76ee\u524d\u5e94\u8be5\u662f\u8fd9\u6837\u7684\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg\n};\n\nentrypoint!(process_instruction);\n")),(0,a.kt)("p",null,"\u73b0\u5728\u662f\u5173\u4e8e ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u7684\u90e8\u5206\u3002"),(0,a.kt)("h2",{id:"-rust\u4e2d\u7684\u51fd\u6570"},"\ud83d\udd28 Rust\u4e2d\u7684\u51fd\u6570"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"function"),"\u4e0eTypescript\u4e2d\u7684function\u975e\u5e38\u76f8\u4f3c - \u53ea\u9700\u8981\u53c2\u6570\u3001\u7c7b\u578b\u548c\u8fd4\u56de\u7c7b\u578b\u3002\u5c06\u6b64\u6dfb\u52a0\u5230 ",(0,a.kt)("inlineCode",{parentName:"p"},"entrypoint!")," \u5b8f\u4e0b\u9762\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn process_instruction(\n //Arguments and their types\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n // The return type (i.e. what data type the function returns)\n) -> ProgramResult{\n // Leave the body empty for now :)\n}\n")),(0,a.kt)("p",null,"\u6211\u4eec\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u9700\u8981\u4ee5\u4e0b\u53c2\u6570\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"program_id")," \uff1a\u7a0b\u5e8f\u8d26\u6237\u7684\u516c\u94a5\u3002\u7528\u4e8e\u9a8c\u8bc1\u7a0b\u5e8f\u662f\u5426\u7531\u6b63\u786e\u7684\u8d26\u6237\u8c03\u7528\u3002\u7c7b\u578b\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"&Pubkey")," \u3002"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"accounts")," \uff1a\u6307\u4ee4\u6240\u6d89\u53ca\u7684\u8d26\u6237\u3002\u5fc5\u987b\u4e3a\u7c7b\u578b ",(0,a.kt)("inlineCode",{parentName:"li"},"&[AccountInfo]")," \u3002"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"instruction_data")," \uff1a\u6211\u4eec\u4ea4\u6613\u4e2d\u76848\u4f4d\u6307\u4ee4\u6570\u636e\u3002\u5fc5\u987b\u4e3a ",(0,a.kt)("inlineCode",{parentName:"li"},"&[u8]")," \u7c7b\u578b\u3002")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"[]")," \u7684\u610f\u601d\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"AccountInfo")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"u8")," \u662f\u201c\u5207\u7247\u201d\u7c7b\u578b - \u5b83\u4eec\u7c7b\u4f3c\u4e8e\u957f\u5ea6\u672a\u77e5\u7684\u6570\u7ec4\u3002\u6211\u4eec\u4e0d\u79f0\u5b83\u4eec\u4e3a\u6570\u7ec4\uff0c\u56e0\u4e3a\u5b83\u4eec\u66f4\u4f4e\u7ea7 - \u5728Rust\u4e2d\uff0c\u5207\u7247\u662f\u6307\u5411\u4e00\u5757\u5185\u5b58\u5757\u7684\u6307\u9488 \ud83e\udd2f"),(0,a.kt)("p",null,"\u6211\u4eec\u7a0d\u540e\u4f1a\u5904\u7406 ",(0,a.kt)("inlineCode",{parentName:"p"},"&")," :)"),(0,a.kt)("h2",{id:"-result-\u679a\u4e3e"},"\ud83d\udcdc Result \u679a\u4e3e"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u6765\u4ecb\u7ecd\u6211\u4eec\u7684\u7b2c\u4e09\u4e2a ",(0,a.kt)("inlineCode",{parentName:"p"},"use")," \u8bed\u53e5 - ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramResult")," \u4e86\u3002\u8fd9\u662f\u4e00\u4e2aRust\u679a\u4e3e\uff0c\u4ee3\u8868\u4e86Solana\u7a0b\u5e8f\u6267\u884c\u7684\u7ed3\u679c\u3002"),(0,a.kt)("p",null,"\u73b0\u5728\u5c1d\u8bd5\u901a\u8fc7\u70b9\u51fb\u5de6\u4fa7\u680f\u4e0a\u7684\u201c\u6784\u5efa\u201d\u6309\u94ae\u6765\u7f16\u8bd1\u811a\u672c\u3002\u4f60\u5e94\u8be5\u4f1a\u5f97\u5230\u4e00\u4e2a\u8b66\u544a\u548c\u4e00\u4e2a\u9519\u8bef\u3002\u8fd9\u662f\u9519\u8bef\u4fe1\u606f\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"error[E0308]: mismatched types\n --\x3e /src/lib.rs:12:6\n |\n7 | pub fn process_instruction(\n | ------------------- implicitly returns `()` as its body has no tail or `return` expression\n...\n12 | ) -> ProgramResult {\n | ^^^^^^^^^^^^^ expected enum `Result`, found `()`\n |\n = note: expected enum `Result<(), ProgramError>`\n found unit type `()`\n")),(0,a.kt)("p",null,"\u6211\u60f3\u82b1\u70b9\u65f6\u95f4\u8d5e\u8d4f\u4e00\u4e0bRust\u9519\u8bef\u4fe1\u606f\u6709\u591a\u4e48\u7f8e\u4e3d\u3002\u5b83\u51c6\u786e\u5730\u544a\u8bc9\u4f60\u51fa\u4e86\u4ec0\u4e48\u95ee\u9898\uff0c\u95ee\u9898\u51fa\u5728\u54ea\u91cc\u4ee5\u53ca\u5982\u4f55\u4fee\u590d\u3002\u6211\u60f3\u77e5\u9053\u5982\u679cJavaScript\u4e5f\u80fd\u8fd9\u4e48\u53cb\u597d\uff0c\u6211\u4f1a\u5c11\u6389\u591a\u5c11\u5934\u53d1\u5462 \ud83d\ude22"),(0,a.kt)("p",null,"\u7531\u4e8e\u6211\u4eec\u7684\u51fd\u6570\u4f53\u4e3a\u7a7a\uff0c\u5b83\u4f1a\u9690\u5f0f\u5730\u8fd4\u56de ",(0,a.kt)("inlineCode",{parentName:"p"},"()")," - \u7a7a\u5143\u7ec4\u3002\u9519\u8bef\u6d88\u606f\u8868\u793a\u5b83\u671f\u671b ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," \uff0c\u4f46\u6211\u4eec\u58f0\u660e\u7684\u8fd4\u56de\u7c7b\u578b\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramResult")," \u3002\u55ef\uff0c\u8fd9\u91cc\u53d1\u751f\u4e86\u4ec0\u4e48\u5462\ud83e\udd14\uff1f"),(0,a.kt)("p",null,"\u8fd9\u662f\u56e0\u4e3aSolana\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramResult")," \u7c7b\u578b\u4f7f\u7528\u4e86Rust\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"Result")," \u7c7b\u578b\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub type ProgramResult = Result<(), ProgramError>;\n")),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"Result")," \u662f\u4e00\u4e2a\u6807\u51c6\u5e93\u7c7b\u578b\uff0c\u8868\u793a\u4e24\u4e2a\u79bb\u6563\u7684\u7ed3\u679c\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6210\u529f\uff08 ",(0,a.kt)("inlineCode",{parentName:"li"},"Ok")," \uff09\u6216"),(0,a.kt)("li",{parentName:"ul"},"\u5931\u8d25 ( ",(0,a.kt)("inlineCode",{parentName:"li"},"Err")," )")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub enum Result {\n Ok(T),\n Err(E),\n}\n")),(0,a.kt)("p",null,"\u628a\u5b83\u60f3\u8c61\u6210HTTP\u9519\u8bef\u4ee3\u7801\u2014\u2014200\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"Ok")," \uff0c404\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"Err")," \u3002\u6240\u4ee5\u5f53\u6211\u4eec\u8fd4\u56de ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramResult")," \u65f6\uff0c\u6211\u4eec\u662f\u5728\u8bf4\u6211\u4eec\u7684\u51fd\u6570\u53ef\u4ee5\u8fd4\u56de ",(0,a.kt)("inlineCode",{parentName:"p"},"()")," \uff08\u4e00\u4e2a\u7a7a\u503c\uff09\u8868\u793a\u6210\u529f\uff0c\u6216\u8005\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u679a\u4e3e\u544a\u8bc9\u6211\u4eec\u51fa\u4e86\u4ec0\u4e48\u95ee\u9898\u3002\u975e\u5e38\u6709\u7528\uff01"),(0,a.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u9700\u8981\u505a\u7684\u5168\u90e8\u4e8b\u60c5\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult{\n // Return Ok() for success\n Ok(())\n}\n")),(0,a.kt)("h2",{id:"-\u90e8\u7f72\u4f60\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f"},"\ud83d\ude80 \u90e8\u7f72\u4f60\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f"),(0,a.kt)("p",null,"\u6211\u4eec\u7684\u7a0b\u5e8f\u51e0\u4e4e\u5b8c\u6210\u4e86\uff01\u552f\u4e00\u7f3a\u5c11\u7684\u5c31\u662f\u5b9e\u9645\u4e0a\u8bf4\u51fa\u201cHello World\u201d\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"msg!")," \u5b8f\u6765\u5b9e\u73b0\u3002\u6211\u4eec\u6682\u65f6\u4e0d\u4f1a\u5bf9\u6307\u4ee4\u6570\u636e\u505a\u4efb\u4f55\u64cd\u4f5c\uff0c\u4e3a\u4e86\u907f\u514d\u201c\u672a\u4f7f\u7528\u7684\u53d8\u91cf\u201d\u8b66\u544a\uff0c\u53ea\u9700\u5728\u53d8\u91cf\u540d\u524d\u52a0\u4e0b\u5212\u7ebf\u5373\u53ef\u3002"),(0,a.kt)("p",null,"\u8fd9\u662f\u5b8c\u6574\u7684 ",(0,a.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u7684\u6837\u5b50\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'pub fn process_instruction(\n _program_id: &Pubkey,\n _accounts: &[AccountInfo],\n _instruction_data: &[u8]\n) -> ProgramResult{\n msg!("Hello World!");\n Ok(())\n}\n')),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u70b9\u51fb\u6784\u5efa\uff0c\u4f60\u5e94\u8be5\u5728\u63a7\u5236\u53f0\u4e0a\u770b\u5230\u4e00\u4e2a\u7eff\u8272\u7684\u201c\u6784\u5efa\u6210\u529f\u201d\u6d88\u606f\u3002\u606d\u559c\uff01\u4f60\u5df2\u7ecf\u7f16\u5199\u4e86\u4f60\u7684\u7b2c\u4e00\u4e2aSolana\u7a0b\u5e8f\ud83c\udf89"),(0,a.kt)("p",null,"\u5728\u8fd9\u4e2a\u6e38\u4e50\u573a\u4e0a\u90e8\u7f72\u975e\u5e38\u7b80\u5355\u3002\u5207\u6362\u5230\u5de6\u4e0a\u89d2\u7684\u201c\u6784\u5efa\u548c\u90e8\u7f72\u201d\u9009\u9879\u5361\uff0c\u5728\u201c\u8d44\u6e90\u7ba1\u7406\u5668\u201d\u56fe\u6807\u4e0b\u65b9\uff0c\u70b9\u51fb\u201c\u90e8\u7f72\u201d\u6309\u94ae\u3002"))}d.isMDXComponent=!0},8385:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/error-compare-d4e97ee4663277ed693c53a1ae35b53f.png"},6167:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/rust-modules-dea5cf709b55a90decc4bd764250ed37.png"},275:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/solana-module-fc143b0bc2afd20842bf6c47cdb6459b.png"}}]); \ No newline at end of file diff --git a/assets/js/697b977d.3823d2b9.js b/assets/js/697b977d.3823d2b9.js new file mode 100644 index 000000000..13b57db25 --- /dev/null +++ b/assets/js/697b977d.3823d2b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[645],{3905:(e,a,l)=>{l.d(a,{Zo:()=>u,kt:()=>k});var n=l(7294);function t(e,a,l){return a in e?Object.defineProperty(e,a,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[a]=l,e}function o(e,a){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),l.push.apply(l,n)}return l}function r(e){for(var a=1;a=0||(t[l]=e[l]);return t}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(t[l]=e[l])}return t}var p=n.createContext({}),i=function(e){var a=n.useContext(p),l=a;return e&&(l="function"==typeof e?e(a):r(r({},a),e)),l},u=function(e){var a=i(e.components);return n.createElement(p.Provider,{value:a},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},d=n.forwardRef((function(e,a){var l=e.components,t=e.mdxType,o=e.originalType,p=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=i(l),d=t,k=m["".concat(p,".").concat(d)]||m[d]||c[d]||o;return l?n.createElement(k,r(r({ref:a},u),{},{components:l})):n.createElement(k,r({ref:a},u))}));function k(e,a){var l=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var o=l.length,r=new Array(o);r[0]=d;var s={};for(var p in a)hasOwnProperty.call(a,p)&&(s[p]=a[p]);s.originalType=e,s[m]="string"==typeof e?e:t,r[1]=s;for(var i=2;i{l.r(a),l.d(a,{assets:()=>p,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>i});var n=l(7462),t=(l(7294),l(3905));const o={sidebar_position:7,sidebar_label:"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e",sidebar_class_name:"green"},r="Local Program Development",s={unversionedId:"Solana-Co-Learn/module1/local_program_development/local_program_development",id:"Solana-Co-Learn/module1/local_program_development/local_program_development",title:"Local Program Development",description:"\u7b80\u800c\u8a00\u4e4b",source:"@site/docs/Solana-Co-Learn/module1/local_program_development/local_program_development.md",sourceDirName:"Solana-Co-Learn/module1/local_program_development",slug:"/Solana-Co-Learn/module1/local_program_development/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/local_program_development/local_program_development.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7,sidebar_label:"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/"},next:{title:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello"}},p={},i=[{value:"\u7b80\u800c\u8a00\u4e4b",id:"\u7b80\u800c\u8a00\u4e4b",level:2},{value:"\u6982\u8ff0",id:"\u6982\u8ff0",level:2},{value:"\u5728Windows\u4e0a\u8bbe\u7f6e\uff08\u5e26\u6709Linux\uff09",id:"\u5728windows\u4e0a\u8bbe\u7f6e\u5e26\u6709linux",level:3},{value:"\u4e0b\u8f7dWindows\u5b50\u7cfb\u7edfLinux\uff08WSL\uff09",id:"\u4e0b\u8f7dwindows\u5b50\u7cfb\u7edflinuxwsl",level:4},{value:"\u4e0b\u8f7dUbuntu",id:"\u4e0b\u8f7dubuntu",level:4},{value:"\u4e0b\u8f7d Rust\uff08\u9002\u7528\u4e8e WSL\uff09",id:"\u4e0b\u8f7d-rust\u9002\u7528\u4e8e-wsl",level:4},{value:"\u4e0b\u8f7d Solana CLI",id:"\u4e0b\u8f7d-solana-cli",level:4},{value:"\u5728 macOS \u4e0a\u8fdb\u884c\u8bbe\u7f6e",id:"\u5728-macos-\u4e0a\u8fdb\u884c\u8bbe\u7f6e",level:3},{value:"\u4e0b\u8f7d Rust",id:"\u4e0b\u8f7d-rust",level:4},{value:"\u4e0b\u8f7dSolana CLI",id:"\u4e0b\u8f7dsolana-cli",level:4},{value:"Solana CLI\u57fa\u7840",id:"solana-cli\u57fa\u7840",level:3},{value:"Solana CLI \u914d\u7f6e",id:"solana-cli-\u914d\u7f6e",level:4},{value:"\u6d4b\u8bd5\u9a8c\u8bc1\u5668",id:"\u6d4b\u8bd5\u9a8c\u8bc1\u5668",level:4},{value:"Stream program logs",id:"stream-program-logs",level:4},{value:"\u5bc6\u94a5\u5bf9",id:"\u5bc6\u94a5\u5bf9",level:4},{value:"\u5728\u60a8\u7684\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1Solana\u7a0b\u5e8f",id:"\u5728\u60a8\u7684\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1solana\u7a0b\u5e8f",level:3},{value:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee",id:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee",level:4},{value:"\u6784\u5efa\u548c\u90e8\u7f72",id:"\u6784\u5efa\u548c\u90e8\u7f72",level:4},{value:"\u6311\u6218",id:"\u6311\u6218",level:3}],u={toc:i},m="wrapper";function c(e){let{components:a,...l}=e;return(0,t.kt)(m,(0,n.Z)({},u,l,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("h1",{id:"local-program-development"},"Local Program Development"),(0,t.kt)("h2",{id:"\u7b80\u800c\u8a00\u4e4b"},"\u7b80\u800c\u8a00\u4e4b"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"\u8981\u5728\u672c\u5730\u5f00\u59cb\u4f7f\u7528Solana\uff0c\u9996\u5148\u9700\u8981\u5b89\u88c5",(0,t.kt)("strong",{parentName:"li"},"Rust"),"\u548c",(0,t.kt)("strong",{parentName:"li"},"Solana CLI")),(0,t.kt)("li",{parentName:"ul"},"\u4f7f\u7528Solana CLI\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("strong",{parentName:"li"},"solana-test-validator"),"\u547d\u4ee4\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"),(0,t.kt)("li",{parentName:"ul"},"\u4e00\u65e6\u60a8\u5b89\u88c5\u4e86Rust\u548cSolana CLI\uff0c\u60a8\u5c31\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"li"},"cargo build-sbf"),"\u548c",(0,t.kt)("inlineCode",{parentName:"li"},"solana program deploy"),"\u547d\u4ee4\u5728\u672c\u5730\u6784\u5efa\u548c\u90e8\u7f72\u60a8\u7684\u7a0b\u5e8f"),(0,t.kt)("li",{parentName:"ul"},"\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"li"},"solana logs"),"\u547d\u4ee4\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7")),(0,t.kt)("h2",{id:"\u6982\u8ff0"},"\u6982\u8ff0"),(0,t.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u5728\u8fd9\u95e8\u8bfe\u7a0b\u4e2d\uff0c\u6211\u4eec\u4e00\u76f4\u4f7f\u7528Solana Playground\u6765\u5f00\u53d1\u548c\u90e8\u7f72Solana\u7a0b\u5e8f\u3002"),(0,t.kt)("p",null,"\u867d\u7136\u8fd9\u662f\u4e00\u4e2a\u5f88\u597d\u7684\u5de5\u5177\uff0c\u4f46\u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u7684\u9879\u76ee\uff0c\u60a8\u53ef\u80fd\u66f4\u559c\u6b22\u8bbe\u7f6e\u4e00\u4e2a\u672c\u5730\u5f00\u53d1\u73af\u5883\u3002"),(0,t.kt)("p",null,"\u8fd9\u53ef\u80fd\u662f\u4e3a\u4e86\u4f7f\u7528Solana Playground\u4e0d\u652f\u6301\u7684crate\uff0c\u5229\u7528\u60a8\u521b\u5efa\u7684\u81ea\u5b9a\u4e49\u811a\u672c\u6216\u5de5\u5177\uff0c\u6216\u8005\u4ec5\u4ec5\u662f\u51fa\u4e8e\u4e2a\u4eba\u504f\u597d\u3002"),(0,t.kt)("p",null,"\u8bdd\u867d\u5982\u6b64\uff0c\u8fd9\u8282\u8bfe\u4e0e\u5176\u4ed6\u8bfe\u7a0b\u6709\u4e9b\u4e0d\u540c\u3002\u4e0e\u5176\u6db5\u76d6\u5927\u91cf\u5173\u4e8e\u5982\u4f55\u7f16\u5199\u7a0b\u5e8f\u6216\u4e0eSolana\u7f51\u7edc\u4ea4\u4e92\u7684\u5185\u5bb9\uff0c\u8fd9\u8282\u8bfe\u4e3b\u8981\u4fa7\u91cd\u4e8e\u8bbe\u7f6e\u672c\u5730\u5f00\u53d1\u73af\u5883\u8fd9\u4e2a\u4e0d\u90a3\u4e48\u5f15\u4eba\u6ce8\u76ee\u7684\u4efb\u52a1\u3002"),(0,t.kt)("p",null,"\u4e3a\u4e86\u4ece\u60a8\u7684\u8ba1\u7b97\u673a\u4e0a\u6784\u5efa\u3001\u6d4b\u8bd5\u548c\u90e8\u7f72Solana\u7a0b\u5e8f\uff0c\u60a8\u9700\u8981\u5b89\u88c5Rust\u7f16\u8bd1\u5668\u548cSolana\u547d\u4ee4\u884c\u754c\u9762\uff08CLI\uff09\u3002\u6211\u4eec\u5c06\u9996\u5148\u6307\u5bfc\u60a8\u5b8c\u6210\u8fd9\u4e9b\u5b89\u88c5\u8fc7\u7a0b\uff0c\u7136\u540e\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528\u60a8\u521a\u521a\u5b89\u88c5\u7684\u5de5\u5177\u3002"),(0,t.kt)("p",null,"\u4ee5\u4e0b\u5b89\u88c5\u8bf4\u660e\u5305\u542b\u4e86\u5b89\u88c5Rust\u548cSolana CLI\u7684\u6b65\u9aa4\uff0c\u622a\u81f3\u64b0\u5199\u672c\u6587\u65f6\u7684\u6700\u65b0\u7248\u672c\u3002\u7531\u4e8e\u60a8\u9605\u8bfb\u65f6\u53ef\u80fd\u5df2\u6709\u66f4\u65b0\uff0c\u5982\u679c\u9047\u5230\u95ee\u9898\uff0c\u8bf7\u53c2\u8003\u5b98\u65b9\u5b89\u88c5\u9875\u9762\uff1a"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://www.rust-lang.org/tools/install"},"\u5b89\u88c5Rust")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"\u5b89\u88c5Solana\u5de5\u5177\u5957\u4ef6"))),(0,t.kt)("h3",{id:"\u5728windows\u4e0a\u8bbe\u7f6e\u5e26\u6709linux"},"\u5728Windows\u4e0a\u8bbe\u7f6e\uff08\u5e26\u6709Linux\uff09"),(0,t.kt)("h4",{id:"\u4e0b\u8f7dwindows\u5b50\u7cfb\u7edflinuxwsl"},"\u4e0b\u8f7dWindows\u5b50\u7cfb\u7edfLinux\uff08WSL\uff09"),(0,t.kt)("p",null,"\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662fWindows\u7535\u8111\uff0c\u5efa\u8bae\u4f7f\u7528Windows\u5b50\u7cfb\u7edfLinux\uff08WSL\uff09\u6765\u6784\u5efa\u4f60\u7684Solana\u7a0b\u5e8f\u3002"),(0,t.kt)("p",null,"\u6253\u5f00",(0,t.kt)("strong",{parentName:"p"},"\u7ba1\u7406\u5458"),"\u6743\u9650\u7684PowerShell\u6216Windows\u547d\u4ee4\u63d0\u793a\u7b26\uff0c\u68c0\u67e5Windows\u7248\u672c"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"winver\n")),(0,t.kt)("p",null,"\u5982\u679c\u60a8\u4f7f\u7528\u7684\u662fWindows 10\u7248\u672c2004\u53ca\u66f4\u9ad8\u7248\u672c\uff08Build 19041\u53ca\u66f4\u9ad8\u7248\u672c\uff09\u6216Windows 11\uff0c\u8bf7\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"wsl --install\n")),(0,t.kt)("p",null,"\u5982\u679c\u60a8\u6b63\u5728\u4f7f\u7528\u8f83\u65e7\u7248\u672c\u7684Windows\uff0c\u8bf7\u6309\u7167",(0,t.kt)("a",{parentName:"p",href:"https://docs.microsoft.com/en-us/windows/wsl/install-manual"},"\u8fd9\u91cc"),"\u7684\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\u3002"),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728",(0,t.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/windows/wsl/install"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u5173\u4e8e\u5b89\u88c5WSL\u7684\u4fe1\u606f\u3002"),(0,t.kt)("h4",{id:"\u4e0b\u8f7dubuntu"},"\u4e0b\u8f7dUbuntu"),(0,t.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u5728\u8fd9\u91cc",(0,t.kt)("a",{parentName:"p",href:"https://apps.microsoft.com/store/detail/ubuntu-2004/9N6SVWS3RX71?hl=en-us&gl=US"},"\u4e0b\u8f7dUbuntu"),"\u3002Ubuntu\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7ec8\u7aef\uff0c\u53ef\u4ee5\u8ba9\u4f60\u5728Windows\u7535\u8111\u4e0a\u8fd0\u884cLinux\u3002\u8fd9\u5c31\u662f\u4f60\u5c06\u8fd0\u884cSolana CLI\u547d\u4ee4\u7684\u5730\u65b9\u3002"),(0,t.kt)("h4",{id:"\u4e0b\u8f7d-rust\u9002\u7528\u4e8e-wsl"},"\u4e0b\u8f7d Rust\uff08\u9002\u7528\u4e8e WSL\uff09"),(0,t.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6253\u5f00Ubuntu\u7ec8\u7aef\u5e76\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u4e0b\u8f7d\u9002\u7528\u4e8eWSL\u7684Rust\u3002\u60a8\u53ef\u4ee5\u5728",(0,t.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/learn/get-started"},"\u6b64\u5904"),"\u9605\u8bfb\u6709\u5173\u4e0b\u8f7dRust\u7684\u66f4\u591a\u4fe1\u606f\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n")),(0,t.kt)("h4",{id:"\u4e0b\u8f7d-solana-cli"},"\u4e0b\u8f7d Solana CLI"),(0,t.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u51c6\u5907\u4e0b\u8f7d\u9002\u7528\u4e8eLinux\u7684Solana CLI\u3002\u8bf7\u5728Ubuntu\u7ec8\u7aef\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u3002\u60a8\u53ef\u4ee5",(0,t.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"\u5728\u6b64\u5904\u9605\u8bfb"),"\u6709\u5173\u4e0b\u8f7dSolana CLI\u7684\u66f4\u591a\u4fe1\u606f\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},'sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)"\n')),(0,t.kt)("h3",{id:"\u5728-macos-\u4e0a\u8fdb\u884c\u8bbe\u7f6e"},"\u5728 macOS \u4e0a\u8fdb\u884c\u8bbe\u7f6e"),(0,t.kt)("h4",{id:"\u4e0b\u8f7d-rust"},"\u4e0b\u8f7d Rust"),(0,t.kt)("p",null,"\u9996\u5148\uff0c\u6309\u7167",(0,t.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/tools/install"},"\u8fd9\u91cc"),"\u7684\u8bf4\u660e\u4e0b\u8f7dRust"),(0,t.kt)("h4",{id:"\u4e0b\u8f7dsolana-cli"},"\u4e0b\u8f7dSolana CLI"),(0,t.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u4e0b\u8f7dSolana CLI\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},'sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)"\n')),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728",(0,t.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"\u8fd9\u91cc"),"\u4e86\u89e3\u66f4\u591a\u5173\u4e8e\u4e0b\u8f7dSolana CLI\u7684\u4fe1\u606f\u3002"),(0,t.kt)("h3",{id:"solana-cli\u57fa\u7840"},"Solana CLI\u57fa\u7840"),(0,t.kt)("p",null,"Solana CLI\u662f\u4e00\u4e2a\u547d\u4ee4\u884c\u754c\u9762\u5de5\u5177\uff0c\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u547d\u4ee4\uff0c\u7528\u4e8e\u4e0eSolana\u96c6\u7fa4\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,t.kt)("p",null,"\u5728\u672c\u8bfe\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u6700\u5e38\u89c1\u7684\u547d\u4ee4\uff0c\u4f46\u60a8\u59cb\u7ec8\u53ef\u4ee5\u901a\u8fc7\u8fd0\u884c",(0,t.kt)("inlineCode",{parentName:"p"},"solana --help"),"\u6765\u67e5\u770b\u6240\u6709\u53ef\u80fd\u7684Solana CLI\u547d\u4ee4\u5217\u8868\u3002"),(0,t.kt)("h4",{id:"solana-cli-\u914d\u7f6e"},"Solana CLI \u914d\u7f6e"),(0,t.kt)("p",null,"Solana CLI\u5b58\u50a8\u4e86\u4e00\u4e9b\u914d\u7f6e\u8bbe\u7f6e\uff0c\u8fd9\u4e9b\u8bbe\u7f6e\u4f1a\u5f71\u54cd\u67d0\u4e9b\u547d\u4ee4\u7684\u884c\u4e3a\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u67e5\u770b\u5f53\u524d\u7684\u914d\u7f6e\uff1a"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana config get\n")),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"solana config get"),"\u547d\u4ee4\u5c06\u8fd4\u56de\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"\u914d\u7f6e\u6587\u4ef6 - Solana CLI\u6240\u5728\u7684\u6587\u4ef6\u4f4d\u4e8e\u60a8\u7684\u8ba1\u7b97\u673a\u4e0a"),(0,t.kt)("li",{parentName:"ul"},"RPC URL - \u60a8\u6b63\u5728\u4f7f\u7528\u7684\u7aef\u70b9\uff0c\u5c06\u60a8\u8fde\u63a5\u5230\u672c\u5730\u4e3b\u673a\u3001\u5f00\u53d1\u7f51\u7edc\u6216\u4e3b\u7f51\u7edc"),(0,t.kt)("li",{parentName:"ul"},"WebSocket URL - \u76d1\u542c\u6765\u81ea\u76ee\u6807\u96c6\u7fa4\u7684\u4e8b\u4ef6\u7684WebSocket\uff08\u5728\u8bbe\u7f6eRPC URL\u65f6\u8ba1\u7b97\uff09"),(0,t.kt)("li",{parentName:"ul"},"\u5bc6\u94a5\u5bf9\u8def\u5f84 - \u5728\u8fd0\u884cSolana CLI\u5b50\u547d\u4ee4\u65f6\u4f7f\u7528\u7684\u5bc6\u94a5\u5bf9\u8def\u5f84"),(0,t.kt)("li",{parentName:"ul"},"Commitment - \u63d0\u4f9b\u4e86\u7f51\u7edc\u786e\u8ba4\u7684\u5ea6\u91cf\uff0c\u5e76\u63cf\u8ff0\u4e86\u4e00\u4e2a\u533a\u5757\u5728\u7279\u5b9a\u65f6\u95f4\u70b9\u4e0a\u7684\u6700\u7ec8\u6027\u7a0b\u5ea6")),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u968f\u65f6\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana config set"),"\u547d\u4ee4\u66f4\u6539\u60a8\u7684Solana CLI\u914d\u7f6e\uff0c\u7136\u540e\u8ddf\u4e0a\u60a8\u60f3\u8981\u66f4\u65b0\u7684\u8bbe\u7f6e\u3002"),(0,t.kt)("p",null,"\u6700\u5e38\u89c1\u7684\u66f4\u6539\u5c06\u662f\u60a8\u8981\u5b9a\u4f4d\u7684\u96c6\u7fa4\u3002\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana config set --url"),"\u547d\u4ee4\u66f4\u6539RPC URL\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"# localhost\nsolana config set --url localhost\n\n# devnet\nsolana config set --url devnet\n\n\n# mainnet-beta\nsolana config set --url mainnet-beta\n")),(0,t.kt)("p",null,"\u540c\u6837\u5730\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana config set --keypair"),"\u547d\u4ee4\u6765\u66f4\u6539\u5bc6\u94a5\u5bf9\u8def\u5f84\u3002\u5f53\u8fd0\u884c\u547d\u4ee4\u65f6\uff0cSolana CLI\u5c06\u4f7f\u7528\u6307\u5b9a\u8def\u5f84\u4e0b\u7684\u5bc6\u94a5\u5bf9\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --keypair ~/\n")),(0,t.kt)("h4",{id:"\u6d4b\u8bd5\u9a8c\u8bc1\u5668"},"\u6d4b\u8bd5\u9a8c\u8bc1\u5668"),(0,t.kt)("p",null,"\u4f60\u4f1a\u53d1\u73b0\u5728\u6d4b\u8bd5\u548c\u8c03\u8bd5\u65f6\u8fd0\u884c\u672c\u5730\u9a8c\u8bc1\u5668\u6bd4\u90e8\u7f72\u5230\u5f00\u53d1\u7f51\u7edc\u66f4\u6709\u5e2e\u52a9\u3002"),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana-test-validator"),"\u547d\u4ee4\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u8be5\u547d\u4ee4\u4f1a\u521b\u5efa\u4e00\u4e2a\u6301\u7eed\u8fd0\u884c\u7684\u8fdb\u7a0b\uff0c\u9700\u8981\u5355\u72ec\u7684\u547d\u4ee4\u884c\u7a97\u53e3\u3002"),(0,t.kt)("h4",{id:"stream-program-logs"},"Stream program logs"),(0,t.kt)("p",null,"\u901a\u5e38\u5728\u6253\u5f00\u4e00\u4e2a\u65b0\u7684\u63a7\u5236\u53f0\u5e76\u5728\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u65c1\u8fb9\u8fd0\u884c",(0,t.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u4f1a\u5f88\u6709\u5e2e\u52a9\u3002\u8fd9\u5c06\u521b\u5efa\u53e6\u4e00\u4e2a\u6301\u7eed\u8fdb\u884c\u7684\u8fdb\u7a0b\uff0c\u7528\u4e8e\u6d41\u5f0f\u4f20\u8f93\u4e0e\u60a8\u914d\u7f6e\u7684\u96c6\u7fa4\u76f8\u5173\u7684\u65e5\u5fd7\u3002"),(0,t.kt)("p",null,"\u5982\u679c\u60a8\u7684CLI\u914d\u7f6e\u6307\u5411\u672c\u5730\u4e3b\u673a\uff0c\u5219\u65e5\u5fd7\u5c06\u59cb\u7ec8\u4e0e\u60a8\u521b\u5efa\u7684\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u76f8\u5173\u8054\uff0c\u4f46\u60a8\u4e5f\u53ef\u4ee5\u4ece\u5176\u4ed6\u96c6\u7fa4\uff08\u5982Devnet\u548cMainnet Beta\uff09\u6d41\u5f0f\u4f20\u8f93\u65e5\u5fd7\u3002\u5f53\u4ece\u5176\u4ed6\u96c6\u7fa4\u6d41\u5f0f\u4f20\u8f93\u65e5\u5fd7\u65f6\uff0c\u60a8\u9700\u8981\u5728\u547d\u4ee4\u4e2d\u5305\u542b\u4e00\u4e2a\u7a0b\u5e8fID\uff0c\u4ee5\u9650\u5236\u60a8\u6240\u770b\u5230\u7684\u65e5\u5fd7\u4ec5\u9488\u5bf9\u60a8\u7684\u7279\u5b9a\u7a0b\u5e8f\u3002"),(0,t.kt)("h4",{id:"\u5bc6\u94a5\u5bf9"},"\u5bc6\u94a5\u5bf9"),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana-keygen new --outfile"),"\u547d\u4ee4\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9\uff0c\u5e76\u6307\u5b9a\u6587\u4ef6\u8def\u5f84\u4ee5\u5b58\u50a8\u8be5\u5bc6\u94a5\u5bf9\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana-keygen new --outfile ~/\n")),(0,t.kt)("p",null,"\u6709\u65f6\u5019\u4f60\u53ef\u80fd\u9700\u8981\u68c0\u67e5\u4f60\u7684\u914d\u7f6e\u6307\u5411\u54ea\u4e2a\u5bc6\u94a5\u5bf9\u3002\u8981\u67e5\u770b\u5f53\u524d\u5728",(0,t.kt)("inlineCode",{parentName:"p"},"solana config"),"\u4e2d\u8bbe\u7f6e\u7684\u5bc6\u94a5\u5bf9\u7684\u516c\u94a5\uff0c\u8bf7\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana address"),"\u547d\u4ee4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana address\n")),(0,t.kt)("p",null,"\u8981\u67e5\u770b\u5728solana\u914d\u7f6e\u4e2d\u8bbe\u7f6e\u7684\u5f53\u524d\u5bc6\u94a5\u5bf9\u7684SOL\u4f59\u989d\uff0c\u8bf7\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana balance"),"\u547d\u4ee4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana balance\n")),(0,t.kt)("p",null,"\u8981\u5728Devnet\u6216\u672c\u5730\u4e3b\u673a\u4e0a\u8fdb\u884cSOL\u7684\u7a7a\u6295\uff0c\u8bf7\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana airdrop"),"\u547d\u4ee4\u3002\u8bf7\u6ce8\u610f\uff0c\u5728Devnet\u4e0a\uff0c\u6bcf\u6b21\u7a7a\u6295\u9650\u5236\u4e3a2\u4e2aSOL\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana airdrop 2\n")),(0,t.kt)("p",null,"\u5728\u60a8\u5f00\u53d1\u548c\u6d4b\u8bd5\u672c\u5730\u73af\u5883\u4e2d\u7684\u7a0b\u5e8f\u65f6\uff0c\u5f88\u53ef\u80fd\u4f1a\u9047\u5230\u7531\u4ee5\u4e0b\u539f\u56e0\u5f15\u8d77\u7684\u9519\u8bef\uff1a"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"\u4f7f\u7528\u9519\u8bef\u7684\u5bc6\u94a5\u5bf9"),(0,t.kt)("li",{parentName:"ul"},"\u6ca1\u6709\u8db3\u591f\u7684SOL\u6765\u90e8\u7f72\u60a8\u7684\u7a0b\u5e8f\u6216\u6267\u884c\u4ea4\u6613"),(0,t.kt)("li",{parentName:"ul"},"\u6307\u5411\u9519\u8bef\u7684\u96c6\u7fa4")),(0,t.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\u4ecb\u7ecd\u4e86\u4e00\u4e9bCLI\u547d\u4ee4\uff0c\u8fd9\u4e9b\u547d\u4ee4\u5e94\u8be5\u80fd\u5e2e\u52a9\u60a8\u5feb\u901f\u89e3\u51b3\u90a3\u4e9b\u95ee\u9898\u3002"),(0,t.kt)("h3",{id:"\u5728\u60a8\u7684\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1solana\u7a0b\u5e8f"},"\u5728\u60a8\u7684\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1Solana\u7a0b\u5e8f"),(0,t.kt)("p",null,"\u5c3d\u7ba1Solana Playground\u975e\u5e38\u6709\u5e2e\u52a9\uff0c\u4f46\u81ea\u5df1\u7684\u672c\u5730\u5f00\u53d1\u73af\u5883\u7684\u7075\u6d3b\u6027\u662f\u65e0\u6cd5\u6bd4\u62df\u7684\u3002\u968f\u7740\u60a8\u6784\u5efa\u66f4\u590d\u6742\u7684\u7a0b\u5e8f\uff0c\u60a8\u53ef\u80fd\u4f1a\u5c06\u5b83\u4eec\u4e0e\u4e00\u4e2a\u6216\u591a\u4e2a\u6b63\u5728\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1\u7684\u5ba2\u6237\u7aef\u96c6\u6210\u5728\u4e00\u8d77\u3002\u5728\u672c\u5730\u7f16\u5199\u3001\u6784\u5efa\u548c\u90e8\u7f72\u7a0b\u5e8f\u65f6\uff0c\u7a0b\u5e8f\u4e0e\u5ba2\u6237\u7aef\u4e4b\u95f4\u7684\u6d4b\u8bd5\u901a\u5e38\u66f4\u7b80\u5355\u3002"),(0,t.kt)("h4",{id:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee"),(0,t.kt)("p",null,"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u5305\u6765\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"cargo new --lib"),"\u547d\u4ee4\uff0c\u5e76\u6307\u5b9a\u60a8\u60f3\u8981\u521b\u5efa\u7684\u65b0\u76ee\u5f55\u7684\u540d\u79f0\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"cargo new --lib \n")),(0,t.kt)("p",null,"\u8fd9\u4e2a\u547d\u4ee4\u5c06\u5728\u547d\u4ee4\u7684\u672b\u5c3e\u521b\u5efa\u4e00\u4e2a\u4ee5\u60a8\u6307\u5b9a\u7684\u540d\u79f0\u547d\u540d\u7684\u65b0\u76ee\u5f55\u3002\u8fd9\u4e2a\u65b0\u76ee\u5f55\u5c06\u5305\u542b\u4e00\u4e2a\u63cf\u8ff0\u5305\u7684",(0,t.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),"\u6e05\u5355\u6587\u4ef6\u3002"),(0,t.kt)("p",null,"\u6e05\u5355\u6587\u4ef6\u5305\u542b\u5143\u6570\u636e\uff0c\u5982\u540d\u79f0\u3001\u7248\u672c\u548c\u4f9d\u8d56\u9879\uff08\u5305\uff09\u3002\u8981\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u60a8\u9700\u8981\u66f4\u65b0",(0,t.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),"\u6587\u4ef6\uff0c\u5c06",(0,t.kt)("inlineCode",{parentName:"p"},"solana-program"),"\u4f5c\u4e3a\u4f9d\u8d56\u9879\u5305\u62ec\u8fdb\u53bb\u3002\u60a8\u53ef\u80fd\u8fd8\u9700\u8981\u6dfb\u52a0\u4e0b\u9762\u663e\u793a\u7684",(0,t.kt)("inlineCode",{parentName:"p"},"[lib]"),"\u548c",(0,t.kt)("inlineCode",{parentName:"p"},"crate-type"),"\u884c\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-toml"},'[package]\nname = ""\nversion = "0.1.0"\nedition = "2021"\n\n[features]\nno-entrypoint = []\n\n[dependencies]\nsolana-program = "~1.8.14"\n\n[lib]\ncrate-type = ["cdylib", "lib"]\n')),(0,t.kt)("p",null,"\u5728\u90a3\u4e2a\u65f6\u5019\uff0c\u4f60\u53ef\u4ee5\u5f00\u59cb\u5728src\u6587\u4ef6\u5939\u4e2d\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f\u3002"),(0,t.kt)("h4",{id:"\u6784\u5efa\u548c\u90e8\u7f72"},"\u6784\u5efa\u548c\u90e8\u7f72"),(0,t.kt)("p",null,"\u5f53\u4f60\u51c6\u5907\u6784\u5efa\u4f60\u7684Solana\u7a0b\u5e8f\u65f6\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"cargo build-sbf"),"\u547d\u4ee4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"cargo build-sbf\n")),(0,t.kt)("p",null,"\u8fd9\u4e2a\u547d\u4ee4\u7684\u8f93\u51fa\u5c06\u5305\u542b\u90e8\u7f72\u7a0b\u5e8f\u7684\u6307\u4ee4\uff0c\u5927\u81f4\u5982\u4e0b\uff1a"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"To deploy this program:\n $ solana program deploy /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local.so\nThe program address will default to this keypair (override with --program-id):\n /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local-keypair.json\n")),(0,t.kt)("p",null,"\u5f53\u60a8\u51c6\u5907\u90e8\u7f72\u7a0b\u5e8f\u65f6\uff0c\u8bf7\u4f7f\u7528\u4ece",(0,t.kt)("inlineCode",{parentName:"p"},"cargo build-sbf"),"\u547d\u4ee4\u8f93\u51fa\u7684",(0,t.kt)("inlineCode",{parentName:"p"},"solana program deploy"),"\u547d\u4ee4\u3002\u8fd9\u5c06\u628a\u60a8\u7684\u7a0b\u5e8f\u90e8\u7f72\u5230CLI\u914d\u7f6e\u4e2d\u6307\u5b9a\u7684\u96c6\u7fa4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana program deploy \n")),(0,t.kt)("h3",{id:"\u6311\u6218"},"\u6311\u6218"),(0,t.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u6784\u5efa\u4e00\u4e9b\u4e1c\u897f\u4e86\u3002\u5c1d\u8bd5\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u7a0b\u5e8f\uff0c\u5c06\u4f60\u81ea\u5df1\u7684\u6d88\u606f\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002\u8fd9\u6b21\u5c06\u4f60\u7684\u7a0b\u5e8f\u90e8\u7f72\u5230Devnet\u800c\u4e0d\u662f\u672c\u5730\u4e3b\u673a\u3002"),(0,t.kt)("p",null,"\u8bb0\u5f97\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana config set --url"),"\u547d\u4ee4\u5c06\u4f60\u7684RPC URL\u66f4\u65b0\u4e3aDevnet\u3002"),(0,t.kt)("p",null,"\u53ea\u8981\u4f60\u5c06\u8fde\u63a5\u548cSolana Explorer\u7684URL\u66f4\u65b0\u4e3a\u6307\u5411Devnet\u800c\u4e0d\u662flocalhost\uff0c\u4f60\u5c31\u53ef\u4ee5\u4f7f\u7528\u4e0e\u6f14\u793a\u4e2d\u76f8\u540c\u7684\u5ba2\u6237\u7aef\u811a\u672c\u6765\u8c03\u7528\u8be5\u7a0b\u5e8f\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-ts"},'let connection = new web3.Connection(web3.clusterApiUrl("devnet"));\n')),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-ts"},"console.log(\n `Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n);\n")),(0,t.kt)("p",null,"\u60a8\u8fd8\u53ef\u4ee5\u6253\u5f00\u4e00\u4e2a\u5355\u72ec\u7684\u547d\u4ee4\u884c\u7a97\u53e3\uff0c\u5e76\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},'solana logs | grep " invoke" -A')," \u3002\u5728Devnet\u4e0a\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u65f6\uff0c\u60a8\u5fc5\u987b\u6307\u5b9a\u7a0b\u5e8fID\u3002\u5426\u5219\uff0c",(0,t.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u5c06\u8fd4\u56de\u6765\u81eaDevnet\u7684\u6301\u7eed\u65e5\u5fd7\u6d41\u3002\u4f8b\u5982\uff0c\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u76d1\u89c6\u5bf9Token\u7a0b\u5e8f\u7684\u8c03\u7528\uff0c\u5e76\u663e\u793a\u6bcf\u4e2a\u8c03\u7528\u7684\u524d5\u884c\u65e5\u5fd7\uff1a"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},'solana logs | grep "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke" -A 5\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/697b977d.6551f650.js b/assets/js/697b977d.6551f650.js deleted file mode 100644 index 25fe72e03..000000000 --- a/assets/js/697b977d.6551f650.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[645],{3905:(e,a,l)=>{l.d(a,{Zo:()=>u,kt:()=>k});var n=l(7294);function t(e,a,l){return a in e?Object.defineProperty(e,a,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[a]=l,e}function o(e,a){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),l.push.apply(l,n)}return l}function r(e){for(var a=1;a=0||(t[l]=e[l]);return t}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(t[l]=e[l])}return t}var p=n.createContext({}),i=function(e){var a=n.useContext(p),l=a;return e&&(l="function"==typeof e?e(a):r(r({},a),e)),l},u=function(e){var a=i(e.components);return n.createElement(p.Provider,{value:a},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},d=n.forwardRef((function(e,a){var l=e.components,t=e.mdxType,o=e.originalType,p=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=i(l),d=t,k=m["".concat(p,".").concat(d)]||m[d]||c[d]||o;return l?n.createElement(k,r(r({ref:a},u),{},{components:l})):n.createElement(k,r({ref:a},u))}));function k(e,a){var l=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var o=l.length,r=new Array(o);r[0]=d;var s={};for(var p in a)hasOwnProperty.call(a,p)&&(s[p]=a[p]);s.originalType=e,s[m]="string"==typeof e?e:t,r[1]=s;for(var i=2;i{l.r(a),l.d(a,{assets:()=>p,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>i});var n=l(7462),t=(l(7294),l(3905));const o={sidebar_position:7,sidebar_label:"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e",sidebar_class_name:"green"},r="Local Program Development",s={unversionedId:"Solana-Co-Learn/module1/local_program_development/local_program_development",id:"Solana-Co-Learn/module1/local_program_development/local_program_development",title:"Local Program Development",description:"\u7b80\u800c\u8a00\u4e4b",source:"@site/docs/Solana-Co-Learn/module1/local_program_development/local_program_development.md",sourceDirName:"Solana-Co-Learn/module1/local_program_development",slug:"/Solana-Co-Learn/module1/local_program_development/",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/local_program_development/local_program_development.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7,sidebar_label:"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module1",permalink:"/docs/Solana-Co-Learn/module1/"},next:{title:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello"}},p={},i=[{value:"\u7b80\u800c\u8a00\u4e4b",id:"\u7b80\u800c\u8a00\u4e4b",level:2},{value:"\u6982\u8ff0",id:"\u6982\u8ff0",level:2},{value:"\u5728Windows\u4e0a\u8bbe\u7f6e\uff08\u5e26\u6709Linux\uff09",id:"\u5728windows\u4e0a\u8bbe\u7f6e\u5e26\u6709linux",level:3},{value:"\u4e0b\u8f7dWindows\u5b50\u7cfb\u7edfLinux\uff08WSL\uff09",id:"\u4e0b\u8f7dwindows\u5b50\u7cfb\u7edflinuxwsl",level:4},{value:"\u4e0b\u8f7dUbuntu",id:"\u4e0b\u8f7dubuntu",level:4},{value:"\u4e0b\u8f7d Rust\uff08\u9002\u7528\u4e8e WSL\uff09",id:"\u4e0b\u8f7d-rust\u9002\u7528\u4e8e-wsl",level:4},{value:"\u4e0b\u8f7d Solana CLI",id:"\u4e0b\u8f7d-solana-cli",level:4},{value:"\u5728 macOS \u4e0a\u8fdb\u884c\u8bbe\u7f6e",id:"\u5728-macos-\u4e0a\u8fdb\u884c\u8bbe\u7f6e",level:3},{value:"\u4e0b\u8f7d Rust",id:"\u4e0b\u8f7d-rust",level:4},{value:"\u4e0b\u8f7dSolana CLI",id:"\u4e0b\u8f7dsolana-cli",level:4},{value:"Solana CLI\u57fa\u7840",id:"solana-cli\u57fa\u7840",level:3},{value:"Solana CLI \u914d\u7f6e",id:"solana-cli-\u914d\u7f6e",level:4},{value:"\u6d4b\u8bd5\u9a8c\u8bc1\u5668",id:"\u6d4b\u8bd5\u9a8c\u8bc1\u5668",level:4},{value:"Stream program logs",id:"stream-program-logs",level:4},{value:"\u5bc6\u94a5\u5bf9",id:"\u5bc6\u94a5\u5bf9",level:4},{value:"\u5728\u60a8\u7684\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1Solana\u7a0b\u5e8f",id:"\u5728\u60a8\u7684\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1solana\u7a0b\u5e8f",level:3},{value:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee",id:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee",level:4},{value:"\u6784\u5efa\u548c\u90e8\u7f72",id:"\u6784\u5efa\u548c\u90e8\u7f72",level:4},{value:"\u6311\u6218",id:"\u6311\u6218",level:3}],u={toc:i},m="wrapper";function c(e){let{components:a,...l}=e;return(0,t.kt)(m,(0,n.Z)({},u,l,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("h1",{id:"local-program-development"},"Local Program Development"),(0,t.kt)("h2",{id:"\u7b80\u800c\u8a00\u4e4b"},"\u7b80\u800c\u8a00\u4e4b"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"\u8981\u5728\u672c\u5730\u5f00\u59cb\u4f7f\u7528Solana\uff0c\u9996\u5148\u9700\u8981\u5b89\u88c5",(0,t.kt)("strong",{parentName:"li"},"Rust"),"\u548c",(0,t.kt)("strong",{parentName:"li"},"Solana CLI")),(0,t.kt)("li",{parentName:"ul"},"\u4f7f\u7528Solana CLI\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("strong",{parentName:"li"},"solana-test-validator"),"\u547d\u4ee4\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"),(0,t.kt)("li",{parentName:"ul"},"\u4e00\u65e6\u60a8\u5b89\u88c5\u4e86Rust\u548cSolana CLI\uff0c\u60a8\u5c31\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"li"},"cargo build-sbf"),"\u548c",(0,t.kt)("inlineCode",{parentName:"li"},"solana program deploy"),"\u547d\u4ee4\u5728\u672c\u5730\u6784\u5efa\u548c\u90e8\u7f72\u60a8\u7684\u7a0b\u5e8f"),(0,t.kt)("li",{parentName:"ul"},"\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"li"},"solana logs"),"\u547d\u4ee4\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7")),(0,t.kt)("h2",{id:"\u6982\u8ff0"},"\u6982\u8ff0"),(0,t.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u5728\u8fd9\u95e8\u8bfe\u7a0b\u4e2d\uff0c\u6211\u4eec\u4e00\u76f4\u4f7f\u7528Solana Playground\u6765\u5f00\u53d1\u548c\u90e8\u7f72Solana\u7a0b\u5e8f\u3002"),(0,t.kt)("p",null,"\u867d\u7136\u8fd9\u662f\u4e00\u4e2a\u5f88\u597d\u7684\u5de5\u5177\uff0c\u4f46\u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u7684\u9879\u76ee\uff0c\u60a8\u53ef\u80fd\u66f4\u559c\u6b22\u8bbe\u7f6e\u4e00\u4e2a\u672c\u5730\u5f00\u53d1\u73af\u5883\u3002"),(0,t.kt)("p",null,"\u8fd9\u53ef\u80fd\u662f\u4e3a\u4e86\u4f7f\u7528Solana Playground\u4e0d\u652f\u6301\u7684crate\uff0c\u5229\u7528\u60a8\u521b\u5efa\u7684\u81ea\u5b9a\u4e49\u811a\u672c\u6216\u5de5\u5177\uff0c\u6216\u8005\u4ec5\u4ec5\u662f\u51fa\u4e8e\u4e2a\u4eba\u504f\u597d\u3002"),(0,t.kt)("p",null,"\u8bdd\u867d\u5982\u6b64\uff0c\u8fd9\u8282\u8bfe\u4e0e\u5176\u4ed6\u8bfe\u7a0b\u6709\u4e9b\u4e0d\u540c\u3002\u4e0e\u5176\u6db5\u76d6\u5927\u91cf\u5173\u4e8e\u5982\u4f55\u7f16\u5199\u7a0b\u5e8f\u6216\u4e0eSolana\u7f51\u7edc\u4ea4\u4e92\u7684\u5185\u5bb9\uff0c\u8fd9\u8282\u8bfe\u4e3b\u8981\u4fa7\u91cd\u4e8e\u8bbe\u7f6e\u672c\u5730\u5f00\u53d1\u73af\u5883\u8fd9\u4e2a\u4e0d\u90a3\u4e48\u5f15\u4eba\u6ce8\u76ee\u7684\u4efb\u52a1\u3002"),(0,t.kt)("p",null,"\u4e3a\u4e86\u4ece\u60a8\u7684\u8ba1\u7b97\u673a\u4e0a\u6784\u5efa\u3001\u6d4b\u8bd5\u548c\u90e8\u7f72Solana\u7a0b\u5e8f\uff0c\u60a8\u9700\u8981\u5b89\u88c5Rust\u7f16\u8bd1\u5668\u548cSolana\u547d\u4ee4\u884c\u754c\u9762\uff08CLI\uff09\u3002\u6211\u4eec\u5c06\u9996\u5148\u6307\u5bfc\u60a8\u5b8c\u6210\u8fd9\u4e9b\u5b89\u88c5\u8fc7\u7a0b\uff0c\u7136\u540e\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528\u60a8\u521a\u521a\u5b89\u88c5\u7684\u5de5\u5177\u3002"),(0,t.kt)("p",null,"\u4ee5\u4e0b\u5b89\u88c5\u8bf4\u660e\u5305\u542b\u4e86\u5b89\u88c5Rust\u548cSolana CLI\u7684\u6b65\u9aa4\uff0c\u622a\u81f3\u64b0\u5199\u672c\u6587\u65f6\u7684\u6700\u65b0\u7248\u672c\u3002\u7531\u4e8e\u60a8\u9605\u8bfb\u65f6\u53ef\u80fd\u5df2\u6709\u66f4\u65b0\uff0c\u5982\u679c\u9047\u5230\u95ee\u9898\uff0c\u8bf7\u53c2\u8003\u5b98\u65b9\u5b89\u88c5\u9875\u9762\uff1a"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://www.rust-lang.org/tools/install"},"\u5b89\u88c5Rust")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"\u5b89\u88c5Solana\u5de5\u5177\u5957\u4ef6"))),(0,t.kt)("h3",{id:"\u5728windows\u4e0a\u8bbe\u7f6e\u5e26\u6709linux"},"\u5728Windows\u4e0a\u8bbe\u7f6e\uff08\u5e26\u6709Linux\uff09"),(0,t.kt)("h4",{id:"\u4e0b\u8f7dwindows\u5b50\u7cfb\u7edflinuxwsl"},"\u4e0b\u8f7dWindows\u5b50\u7cfb\u7edfLinux\uff08WSL\uff09"),(0,t.kt)("p",null,"\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662fWindows\u7535\u8111\uff0c\u5efa\u8bae\u4f7f\u7528Windows\u5b50\u7cfb\u7edfLinux\uff08WSL\uff09\u6765\u6784\u5efa\u4f60\u7684Solana\u7a0b\u5e8f\u3002"),(0,t.kt)("p",null,"\u6253\u5f00",(0,t.kt)("strong",{parentName:"p"},"\u7ba1\u7406\u5458"),"\u6743\u9650\u7684PowerShell\u6216Windows\u547d\u4ee4\u63d0\u793a\u7b26\uff0c\u68c0\u67e5Windows\u7248\u672c"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"winver\n")),(0,t.kt)("p",null,"\u5982\u679c\u60a8\u4f7f\u7528\u7684\u662fWindows 10\u7248\u672c2004\u53ca\u66f4\u9ad8\u7248\u672c\uff08Build 19041\u53ca\u66f4\u9ad8\u7248\u672c\uff09\u6216Windows 11\uff0c\u8bf7\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"wsl --install\n")),(0,t.kt)("p",null,"\u5982\u679c\u60a8\u6b63\u5728\u4f7f\u7528\u8f83\u65e7\u7248\u672c\u7684Windows\uff0c\u8bf7\u6309\u7167",(0,t.kt)("a",{parentName:"p",href:"https://docs.microsoft.com/en-us/windows/wsl/install-manual"},"\u8fd9\u91cc"),"\u7684\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\u3002"),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728",(0,t.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/windows/wsl/install"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u5173\u4e8e\u5b89\u88c5WSL\u7684\u4fe1\u606f\u3002"),(0,t.kt)("h4",{id:"\u4e0b\u8f7dubuntu"},"\u4e0b\u8f7dUbuntu"),(0,t.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u5728\u8fd9\u91cc",(0,t.kt)("a",{parentName:"p",href:"https://apps.microsoft.com/store/detail/ubuntu-2004/9N6SVWS3RX71?hl=en-us&gl=US"},"\u4e0b\u8f7dUbuntu"),"\u3002Ubuntu\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7ec8\u7aef\uff0c\u53ef\u4ee5\u8ba9\u4f60\u5728Windows\u7535\u8111\u4e0a\u8fd0\u884cLinux\u3002\u8fd9\u5c31\u662f\u4f60\u5c06\u8fd0\u884cSolana CLI\u547d\u4ee4\u7684\u5730\u65b9\u3002"),(0,t.kt)("h4",{id:"\u4e0b\u8f7d-rust\u9002\u7528\u4e8e-wsl"},"\u4e0b\u8f7d Rust\uff08\u9002\u7528\u4e8e WSL\uff09"),(0,t.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6253\u5f00Ubuntu\u7ec8\u7aef\u5e76\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u4e0b\u8f7d\u9002\u7528\u4e8eWSL\u7684Rust\u3002\u60a8\u53ef\u4ee5\u5728",(0,t.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/learn/get-started"},"\u6b64\u5904"),"\u9605\u8bfb\u6709\u5173\u4e0b\u8f7dRust\u7684\u66f4\u591a\u4fe1\u606f\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n")),(0,t.kt)("h4",{id:"\u4e0b\u8f7d-solana-cli"},"\u4e0b\u8f7d Solana CLI"),(0,t.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u51c6\u5907\u4e0b\u8f7d\u9002\u7528\u4e8eLinux\u7684Solana CLI\u3002\u8bf7\u5728Ubuntu\u7ec8\u7aef\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u3002\u60a8\u53ef\u4ee5",(0,t.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"\u5728\u6b64\u5904\u9605\u8bfb"),"\u6709\u5173\u4e0b\u8f7dSolana CLI\u7684\u66f4\u591a\u4fe1\u606f\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},'sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)"\n')),(0,t.kt)("h3",{id:"\u5728-macos-\u4e0a\u8fdb\u884c\u8bbe\u7f6e"},"\u5728 macOS \u4e0a\u8fdb\u884c\u8bbe\u7f6e"),(0,t.kt)("h4",{id:"\u4e0b\u8f7d-rust"},"\u4e0b\u8f7d Rust"),(0,t.kt)("p",null,"\u9996\u5148\uff0c\u6309\u7167",(0,t.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/tools/install"},"\u8fd9\u91cc"),"\u7684\u8bf4\u660e\u4e0b\u8f7dRust"),(0,t.kt)("h4",{id:"\u4e0b\u8f7dsolana-cli"},"\u4e0b\u8f7dSolana CLI"),(0,t.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u4e0b\u8f7dSolana CLI\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},'sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)"\n')),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728",(0,t.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"\u8fd9\u91cc"),"\u4e86\u89e3\u66f4\u591a\u5173\u4e8e\u4e0b\u8f7dSolana CLI\u7684\u4fe1\u606f\u3002"),(0,t.kt)("h3",{id:"solana-cli\u57fa\u7840"},"Solana CLI\u57fa\u7840"),(0,t.kt)("p",null,"Solana CLI\u662f\u4e00\u4e2a\u547d\u4ee4\u884c\u754c\u9762\u5de5\u5177\uff0c\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u547d\u4ee4\uff0c\u7528\u4e8e\u4e0eSolana\u96c6\u7fa4\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,t.kt)("p",null,"\u5728\u672c\u8bfe\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u6700\u5e38\u89c1\u7684\u547d\u4ee4\uff0c\u4f46\u60a8\u59cb\u7ec8\u53ef\u4ee5\u901a\u8fc7\u8fd0\u884c",(0,t.kt)("inlineCode",{parentName:"p"},"solana --help"),"\u6765\u67e5\u770b\u6240\u6709\u53ef\u80fd\u7684Solana CLI\u547d\u4ee4\u5217\u8868\u3002"),(0,t.kt)("h4",{id:"solana-cli-\u914d\u7f6e"},"Solana CLI \u914d\u7f6e"),(0,t.kt)("p",null,"Solana CLI\u5b58\u50a8\u4e86\u4e00\u4e9b\u914d\u7f6e\u8bbe\u7f6e\uff0c\u8fd9\u4e9b\u8bbe\u7f6e\u4f1a\u5f71\u54cd\u67d0\u4e9b\u547d\u4ee4\u7684\u884c\u4e3a\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u67e5\u770b\u5f53\u524d\u7684\u914d\u7f6e\uff1a"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana config get\n")),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"solana config get"),"\u547d\u4ee4\u5c06\u8fd4\u56de\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"\u914d\u7f6e\u6587\u4ef6 - Solana CLI\u6240\u5728\u7684\u6587\u4ef6\u4f4d\u4e8e\u60a8\u7684\u8ba1\u7b97\u673a\u4e0a"),(0,t.kt)("li",{parentName:"ul"},"RPC URL - \u60a8\u6b63\u5728\u4f7f\u7528\u7684\u7aef\u70b9\uff0c\u5c06\u60a8\u8fde\u63a5\u5230\u672c\u5730\u4e3b\u673a\u3001\u5f00\u53d1\u7f51\u7edc\u6216\u4e3b\u7f51\u7edc"),(0,t.kt)("li",{parentName:"ul"},"WebSocket URL - \u76d1\u542c\u6765\u81ea\u76ee\u6807\u96c6\u7fa4\u7684\u4e8b\u4ef6\u7684WebSocket\uff08\u5728\u8bbe\u7f6eRPC URL\u65f6\u8ba1\u7b97\uff09"),(0,t.kt)("li",{parentName:"ul"},"\u5bc6\u94a5\u5bf9\u8def\u5f84 - \u5728\u8fd0\u884cSolana CLI\u5b50\u547d\u4ee4\u65f6\u4f7f\u7528\u7684\u5bc6\u94a5\u5bf9\u8def\u5f84"),(0,t.kt)("li",{parentName:"ul"},"Commitment - \u63d0\u4f9b\u4e86\u7f51\u7edc\u786e\u8ba4\u7684\u5ea6\u91cf\uff0c\u5e76\u63cf\u8ff0\u4e86\u4e00\u4e2a\u533a\u5757\u5728\u7279\u5b9a\u65f6\u95f4\u70b9\u4e0a\u7684\u6700\u7ec8\u6027\u7a0b\u5ea6")),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u968f\u65f6\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana config set"),"\u547d\u4ee4\u66f4\u6539\u60a8\u7684Solana CLI\u914d\u7f6e\uff0c\u7136\u540e\u8ddf\u4e0a\u60a8\u60f3\u8981\u66f4\u65b0\u7684\u8bbe\u7f6e\u3002"),(0,t.kt)("p",null,"\u6700\u5e38\u89c1\u7684\u66f4\u6539\u5c06\u662f\u60a8\u8981\u5b9a\u4f4d\u7684\u96c6\u7fa4\u3002\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana config set --url"),"\u547d\u4ee4\u66f4\u6539RPC URL\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"# localhost\nsolana config set --url localhost\n\n# devnet\nsolana config set --url devnet\n\n\n# mainnet-beta\nsolana config set --url mainnet-beta\n")),(0,t.kt)("p",null,"\u540c\u6837\u5730\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana config set --keypair"),"\u547d\u4ee4\u6765\u66f4\u6539\u5bc6\u94a5\u5bf9\u8def\u5f84\u3002\u5f53\u8fd0\u884c\u547d\u4ee4\u65f6\uff0cSolana CLI\u5c06\u4f7f\u7528\u6307\u5b9a\u8def\u5f84\u4e0b\u7684\u5bc6\u94a5\u5bf9\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --keypair ~/\n")),(0,t.kt)("h4",{id:"\u6d4b\u8bd5\u9a8c\u8bc1\u5668"},"\u6d4b\u8bd5\u9a8c\u8bc1\u5668"),(0,t.kt)("p",null,"\u4f60\u4f1a\u53d1\u73b0\u5728\u6d4b\u8bd5\u548c\u8c03\u8bd5\u65f6\u8fd0\u884c\u672c\u5730\u9a8c\u8bc1\u5668\u6bd4\u90e8\u7f72\u5230\u5f00\u53d1\u7f51\u7edc\u66f4\u6709\u5e2e\u52a9\u3002"),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana-test-validator"),"\u547d\u4ee4\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u8be5\u547d\u4ee4\u4f1a\u521b\u5efa\u4e00\u4e2a\u6301\u7eed\u8fd0\u884c\u7684\u8fdb\u7a0b\uff0c\u9700\u8981\u5355\u72ec\u7684\u547d\u4ee4\u884c\u7a97\u53e3\u3002"),(0,t.kt)("h4",{id:"stream-program-logs"},"Stream program logs"),(0,t.kt)("p",null,"\u901a\u5e38\u5728\u6253\u5f00\u4e00\u4e2a\u65b0\u7684\u63a7\u5236\u53f0\u5e76\u5728\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u65c1\u8fb9\u8fd0\u884c",(0,t.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u4f1a\u5f88\u6709\u5e2e\u52a9\u3002\u8fd9\u5c06\u521b\u5efa\u53e6\u4e00\u4e2a\u6301\u7eed\u8fdb\u884c\u7684\u8fdb\u7a0b\uff0c\u7528\u4e8e\u6d41\u5f0f\u4f20\u8f93\u4e0e\u60a8\u914d\u7f6e\u7684\u96c6\u7fa4\u76f8\u5173\u7684\u65e5\u5fd7\u3002"),(0,t.kt)("p",null,"\u5982\u679c\u60a8\u7684CLI\u914d\u7f6e\u6307\u5411\u672c\u5730\u4e3b\u673a\uff0c\u5219\u65e5\u5fd7\u5c06\u59cb\u7ec8\u4e0e\u60a8\u521b\u5efa\u7684\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u76f8\u5173\u8054\uff0c\u4f46\u60a8\u4e5f\u53ef\u4ee5\u4ece\u5176\u4ed6\u96c6\u7fa4\uff08\u5982Devnet\u548cMainnet Beta\uff09\u6d41\u5f0f\u4f20\u8f93\u65e5\u5fd7\u3002\u5f53\u4ece\u5176\u4ed6\u96c6\u7fa4\u6d41\u5f0f\u4f20\u8f93\u65e5\u5fd7\u65f6\uff0c\u60a8\u9700\u8981\u5728\u547d\u4ee4\u4e2d\u5305\u542b\u4e00\u4e2a\u7a0b\u5e8fID\uff0c\u4ee5\u9650\u5236\u60a8\u6240\u770b\u5230\u7684\u65e5\u5fd7\u4ec5\u9488\u5bf9\u60a8\u7684\u7279\u5b9a\u7a0b\u5e8f\u3002"),(0,t.kt)("h4",{id:"\u5bc6\u94a5\u5bf9"},"\u5bc6\u94a5\u5bf9"),(0,t.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana-keygen new --outfile"),"\u547d\u4ee4\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9\uff0c\u5e76\u6307\u5b9a\u6587\u4ef6\u8def\u5f84\u4ee5\u5b58\u50a8\u8be5\u5bc6\u94a5\u5bf9\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana-keygen new --outfile ~/\n")),(0,t.kt)("p",null,"\u6709\u65f6\u5019\u4f60\u53ef\u80fd\u9700\u8981\u68c0\u67e5\u4f60\u7684\u914d\u7f6e\u6307\u5411\u54ea\u4e2a\u5bc6\u94a5\u5bf9\u3002\u8981\u67e5\u770b\u5f53\u524d\u5728",(0,t.kt)("inlineCode",{parentName:"p"},"solana config"),"\u4e2d\u8bbe\u7f6e\u7684\u5bc6\u94a5\u5bf9\u7684\u516c\u94a5\uff0c\u8bf7\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana address"),"\u547d\u4ee4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana address\n")),(0,t.kt)("p",null,"\u8981\u67e5\u770b\u5728solana\u914d\u7f6e\u4e2d\u8bbe\u7f6e\u7684\u5f53\u524d\u5bc6\u94a5\u5bf9\u7684SOL\u4f59\u989d\uff0c\u8bf7\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana balance"),"\u547d\u4ee4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana balance\n")),(0,t.kt)("p",null,"\u8981\u5728Devnet\u6216\u672c\u5730\u4e3b\u673a\u4e0a\u8fdb\u884cSOL\u7684\u7a7a\u6295\uff0c\u8bf7\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana airdrop"),"\u547d\u4ee4\u3002\u8bf7\u6ce8\u610f\uff0c\u5728Devnet\u4e0a\uff0c\u6bcf\u6b21\u7a7a\u6295\u9650\u5236\u4e3a2\u4e2aSOL\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana airdrop 2\n")),(0,t.kt)("p",null,"\u5728\u60a8\u5f00\u53d1\u548c\u6d4b\u8bd5\u672c\u5730\u73af\u5883\u4e2d\u7684\u7a0b\u5e8f\u65f6\uff0c\u5f88\u53ef\u80fd\u4f1a\u9047\u5230\u7531\u4ee5\u4e0b\u539f\u56e0\u5f15\u8d77\u7684\u9519\u8bef\uff1a"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"\u4f7f\u7528\u9519\u8bef\u7684\u5bc6\u94a5\u5bf9"),(0,t.kt)("li",{parentName:"ul"},"\u6ca1\u6709\u8db3\u591f\u7684SOL\u6765\u90e8\u7f72\u60a8\u7684\u7a0b\u5e8f\u6216\u6267\u884c\u4ea4\u6613"),(0,t.kt)("li",{parentName:"ul"},"\u6307\u5411\u9519\u8bef\u7684\u96c6\u7fa4")),(0,t.kt)("p",null,"\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\u4ecb\u7ecd\u4e86\u4e00\u4e9bCLI\u547d\u4ee4\uff0c\u8fd9\u4e9b\u547d\u4ee4\u5e94\u8be5\u80fd\u5e2e\u52a9\u60a8\u5feb\u901f\u89e3\u51b3\u90a3\u4e9b\u95ee\u9898\u3002"),(0,t.kt)("h3",{id:"\u5728\u60a8\u7684\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1solana\u7a0b\u5e8f"},"\u5728\u60a8\u7684\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1Solana\u7a0b\u5e8f"),(0,t.kt)("p",null,"\u5c3d\u7ba1Solana Playground\u975e\u5e38\u6709\u5e2e\u52a9\uff0c\u4f46\u81ea\u5df1\u7684\u672c\u5730\u5f00\u53d1\u73af\u5883\u7684\u7075\u6d3b\u6027\u662f\u65e0\u6cd5\u6bd4\u62df\u7684\u3002\u968f\u7740\u60a8\u6784\u5efa\u66f4\u590d\u6742\u7684\u7a0b\u5e8f\uff0c\u60a8\u53ef\u80fd\u4f1a\u5c06\u5b83\u4eec\u4e0e\u4e00\u4e2a\u6216\u591a\u4e2a\u6b63\u5728\u672c\u5730\u73af\u5883\u4e2d\u5f00\u53d1\u7684\u5ba2\u6237\u7aef\u96c6\u6210\u5728\u4e00\u8d77\u3002\u5728\u672c\u5730\u7f16\u5199\u3001\u6784\u5efa\u548c\u90e8\u7f72\u7a0b\u5e8f\u65f6\uff0c\u7a0b\u5e8f\u4e0e\u5ba2\u6237\u7aef\u4e4b\u95f4\u7684\u6d4b\u8bd5\u901a\u5e38\u66f4\u7b80\u5355\u3002"),(0,t.kt)("h4",{id:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee"),(0,t.kt)("p",null,"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u5305\u6765\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"cargo new --lib"),"\u547d\u4ee4\uff0c\u5e76\u6307\u5b9a\u60a8\u60f3\u8981\u521b\u5efa\u7684\u65b0\u76ee\u5f55\u7684\u540d\u79f0\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"cargo new --lib \n")),(0,t.kt)("p",null,"\u8fd9\u4e2a\u547d\u4ee4\u5c06\u5728\u547d\u4ee4\u7684\u672b\u5c3e\u521b\u5efa\u4e00\u4e2a\u4ee5\u60a8\u6307\u5b9a\u7684\u540d\u79f0\u547d\u540d\u7684\u65b0\u76ee\u5f55\u3002\u8fd9\u4e2a\u65b0\u76ee\u5f55\u5c06\u5305\u542b\u4e00\u4e2a\u63cf\u8ff0\u5305\u7684",(0,t.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),"\u6e05\u5355\u6587\u4ef6\u3002"),(0,t.kt)("p",null,"\u6e05\u5355\u6587\u4ef6\u5305\u542b\u5143\u6570\u636e\uff0c\u5982\u540d\u79f0\u3001\u7248\u672c\u548c\u4f9d\u8d56\u9879\uff08\u5305\uff09\u3002\u8981\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u60a8\u9700\u8981\u66f4\u65b0",(0,t.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),"\u6587\u4ef6\uff0c\u5c06",(0,t.kt)("inlineCode",{parentName:"p"},"solana-program"),"\u4f5c\u4e3a\u4f9d\u8d56\u9879\u5305\u62ec\u8fdb\u53bb\u3002\u60a8\u53ef\u80fd\u8fd8\u9700\u8981\u6dfb\u52a0\u4e0b\u9762\u663e\u793a\u7684",(0,t.kt)("inlineCode",{parentName:"p"},"[lib]"),"\u548c",(0,t.kt)("inlineCode",{parentName:"p"},"crate-type"),"\u884c\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-toml"},'[package]\nname = ""\nversion = "0.1.0"\nedition = "2021"\n\n[features]\nno-entrypoint = []\n\n[dependencies]\nsolana-program = "~1.8.14"\n\n[lib]\ncrate-type = ["cdylib", "lib"]\n')),(0,t.kt)("p",null,"\u5728\u90a3\u4e2a\u65f6\u5019\uff0c\u4f60\u53ef\u4ee5\u5f00\u59cb\u5728src\u6587\u4ef6\u5939\u4e2d\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f\u3002"),(0,t.kt)("h4",{id:"\u6784\u5efa\u548c\u90e8\u7f72"},"\u6784\u5efa\u548c\u90e8\u7f72"),(0,t.kt)("p",null,"\u5f53\u4f60\u51c6\u5907\u6784\u5efa\u4f60\u7684Solana\u7a0b\u5e8f\u65f6\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"cargo build-sbf"),"\u547d\u4ee4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"cargo build-sbf\n")),(0,t.kt)("p",null,"\u8fd9\u4e2a\u547d\u4ee4\u7684\u8f93\u51fa\u5c06\u5305\u542b\u90e8\u7f72\u7a0b\u5e8f\u7684\u6307\u4ee4\uff0c\u5927\u81f4\u5982\u4e0b\uff1a"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"To deploy this program:\n $ solana program deploy /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local.so\nThe program address will default to this keypair (override with --program-id):\n /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local-keypair.json\n")),(0,t.kt)("p",null,"\u5f53\u60a8\u51c6\u5907\u90e8\u7f72\u7a0b\u5e8f\u65f6\uff0c\u8bf7\u4f7f\u7528\u4ece",(0,t.kt)("inlineCode",{parentName:"p"},"cargo build-sbf"),"\u547d\u4ee4\u8f93\u51fa\u7684",(0,t.kt)("inlineCode",{parentName:"p"},"solana program deploy"),"\u547d\u4ee4\u3002\u8fd9\u5c06\u628a\u60a8\u7684\u7a0b\u5e8f\u90e8\u7f72\u5230CLI\u914d\u7f6e\u4e2d\u6307\u5b9a\u7684\u96c6\u7fa4\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"solana program deploy \n")),(0,t.kt)("h3",{id:"\u6311\u6218"},"\u6311\u6218"),(0,t.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u6784\u5efa\u4e00\u4e9b\u4e1c\u897f\u4e86\u3002\u5c1d\u8bd5\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u7a0b\u5e8f\uff0c\u5c06\u4f60\u81ea\u5df1\u7684\u6d88\u606f\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002\u8fd9\u6b21\u5c06\u4f60\u7684\u7a0b\u5e8f\u90e8\u7f72\u5230Devnet\u800c\u4e0d\u662f\u672c\u5730\u4e3b\u673a\u3002"),(0,t.kt)("p",null,"\u8bb0\u5f97\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana config set --url"),"\u547d\u4ee4\u5c06\u4f60\u7684RPC URL\u66f4\u65b0\u4e3aDevnet\u3002"),(0,t.kt)("p",null,"\u53ea\u8981\u4f60\u5c06\u8fde\u63a5\u548cSolana Explorer\u7684URL\u66f4\u65b0\u4e3a\u6307\u5411Devnet\u800c\u4e0d\u662flocalhost\uff0c\u4f60\u5c31\u53ef\u4ee5\u4f7f\u7528\u4e0e\u6f14\u793a\u4e2d\u76f8\u540c\u7684\u5ba2\u6237\u7aef\u811a\u672c\u6765\u8c03\u7528\u8be5\u7a0b\u5e8f\u3002"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-ts"},'let connection = new web3.Connection(web3.clusterApiUrl("devnet"));\n')),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-ts"},"console.log(\n `Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n);\n")),(0,t.kt)("p",null,"\u60a8\u8fd8\u53ef\u4ee5\u6253\u5f00\u4e00\u4e2a\u5355\u72ec\u7684\u547d\u4ee4\u884c\u7a97\u53e3\uff0c\u5e76\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},'solana logs | grep " invoke" -A')," \u3002\u5728Devnet\u4e0a\u4f7f\u7528",(0,t.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u65f6\uff0c\u60a8\u5fc5\u987b\u6307\u5b9a\u7a0b\u5e8fID\u3002\u5426\u5219\uff0c",(0,t.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u5c06\u8fd4\u56de\u6765\u81eaDevnet\u7684\u6301\u7eed\u65e5\u5fd7\u6d41\u3002\u4f8b\u5982\uff0c\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u76d1\u89c6\u5bf9Token\u7a0b\u5e8f\u7684\u8c03\u7528\uff0c\u5e76\u663e\u793a\u6bcf\u4e2a\u8c03\u7528\u7684\u524d5\u884c\u65e5\u5fd7\uff1a"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},'solana logs | grep "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke" -A 5\n')))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/70ad3ff0.b0b166cd.js b/assets/js/70ad3ff0.b0b166cd.js deleted file mode 100644 index 5dcf2fd6a..000000000 --- a/assets/js/70ad3ff0.b0b166cd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[147],{3478:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/blockchain","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/711fc4ea.ab2365b7.js b/assets/js/711fc4ea.ab2365b7.js new file mode 100644 index 000000000..d98ed3335 --- /dev/null +++ b/assets/js/711fc4ea.ab2365b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7664],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(n),f=a,m=p["".concat(s,".").concat(f)]||p[f]||d[f]||o;return n?r.createElement(m,i(i({ref:t},u),{},{components:n})):r.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=f;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:a,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={sidebar_position:61,sidebar_label:"NFT\u8d28\u62bc",sidebar_class_name:"green"},i="NFT\u8d28\u62bc",l={unversionedId:"Solana-Co-Learn/module3/nft-staking/README",id:"Solana-Co-Learn/module3/nft-staking/README",title:"NFT\u8d28\u62bc",description:"- \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",source:"@site/docs/Solana-Co-Learn/module3/nft-staking/README.md",sourceDirName:"Solana-Co-Learn/module3/nft-staking",slug:"/Solana-Co-Learn/module3/nft-staking/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/nft-staking/README.md",tags:[],version:"current",sidebarPosition:61,frontMatter:{sidebar_position:61,sidebar_label:"NFT\u8d28\u62bc",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/"},next:{title:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/"}},s={},c=[],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"nft\u8d28\u62bc"},"NFT\u8d28\u62bc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406"),(0,a.kt)("li",{parentName:"ul"},"\u5efa\u7acb\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/711fc4ea.f387e1e9.js b/assets/js/711fc4ea.f387e1e9.js deleted file mode 100644 index 6b65520d6..000000000 --- a/assets/js/711fc4ea.f387e1e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7664],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(r),f=a,m=p["".concat(s,".").concat(f)]||p[f]||d[f]||o;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=f;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:a,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={sidebar_position:61,sidebar_label:"NFT\u8d28\u62bc",sidebar_class_name:"green"},i="NFT\u8d28\u62bc",l={unversionedId:"Solana-Co-Learn/module3/nft-staking/README",id:"Solana-Co-Learn/module3/nft-staking/README",title:"NFT\u8d28\u62bc",description:"- \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",source:"@site/docs/Solana-Co-Learn/module3/nft-staking/README.md",sourceDirName:"Solana-Co-Learn/module3/nft-staking",slug:"/Solana-Co-Learn/module3/nft-staking/",permalink:"/docs/Solana-Co-Learn/module3/nft-staking/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/nft-staking/README.md",tags:[],version:"current",sidebarPosition:61,frontMatter:{sidebar_position:61,sidebar_label:"NFT\u8d28\u62bc",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",permalink:"/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/"},next:{title:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",permalink:"/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/"}},s={},c=[],u={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"nft\u8d28\u62bc"},"NFT\u8d28\u62bc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406"),(0,a.kt)("li",{parentName:"ul"},"\u5efa\u7acb\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/74f1954d.b07ee465.js b/assets/js/74f1954d.b07ee465.js new file mode 100644 index 000000000..557384e5e --- /dev/null +++ b/assets/js/74f1954d.b07ee465.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[420],{5207:a=>{a.exports=JSON.parse('{"label":"solana","permalink":"/all-in-one-solana/blog/tags/solana","allTagsPath":"/all-in-one-solana/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/759c7395.50c15174.js b/assets/js/759c7395.50c15174.js deleted file mode 100644 index beb572c50..000000000 --- a/assets/js/759c7395.50c15174.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4895],{8855:a=>{a.exports=JSON.parse('{"label":"solana","permalink":"/blog/tags/solana","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/763c4032.ce0c9dae.js b/assets/js/763c4032.d9bffb09.js similarity index 56% rename from assets/js/763c4032.ce0c9dae.js rename to assets/js/763c4032.d9bffb09.js index 1180c0d82..f9d438b2d 100644 --- a/assets/js/763c4032.ce0c9dae.js +++ b/assets/js/763c4032.d9bffb09.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5404],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=s(r),m=a,f=p["".concat(c,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(7462),a=(r(7294),r(3905));const o={sidebar_position:97,sidebar_label:"Module6",sidebar_class_name:"green"},l="Beyond the Basics",i={unversionedId:"Solana-Co-Learn/module6/README",id:"Solana-Co-Learn/module6/README",title:"Beyond the Basics",description:"- Solana\u7a0b\u5e8f\u4e2d\u7684\u73af\u5883\u53d8\u91cf",source:"@site/docs/Solana-Co-Learn/module6/README.md",sourceDirName:"Solana-Co-Learn/module6",slug:"/Solana-Co-Learn/module6/",permalink:"/docs/Solana-Co-Learn/module6/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module6/README.md",tags:[],version:"current",sidebarPosition:97,frontMatter:{sidebar_position:97,sidebar_label:"Module6",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module5",permalink:"/docs/Solana-Co-Learn/module5/"},next:{title:"Modules",permalink:"/docs/Solana-Co-Learn/modules/"}},c={},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"beyond-the-basics"},"Beyond the Basics"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Solana\u7a0b\u5e8f\u4e2d\u7684\u73af\u5883\u53d8\u91cf"),(0,a.kt)("li",{parentName:"ul"},"Solana Pay"),(0,a.kt)("li",{parentName:"ul"},"\u7248\u672c\u5316\u7684\u4e8b\u52a1\u548c\u67e5\u627e\u8868"),(0,a.kt)("li",{parentName:"ul"},"Rust\u8fc7\u7a0b\u5b8f")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5404],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={sidebar_position:97,sidebar_label:"Module6",sidebar_class_name:"green"},l="Beyond the Basics",i={unversionedId:"Solana-Co-Learn/module6/README",id:"Solana-Co-Learn/module6/README",title:"Beyond the Basics",description:"- Solana\u7a0b\u5e8f\u4e2d\u7684\u73af\u5883\u53d8\u91cf",source:"@site/docs/Solana-Co-Learn/module6/README.md",sourceDirName:"Solana-Co-Learn/module6",slug:"/Solana-Co-Learn/module6/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module6/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module6/README.md",tags:[],version:"current",sidebarPosition:97,frontMatter:{sidebar_position:97,sidebar_label:"Module6",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module5",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module5/"},next:{title:"Modules",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/modules/"}},s={},c=[],u={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"beyond-the-basics"},"Beyond the Basics"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Solana\u7a0b\u5e8f\u4e2d\u7684\u73af\u5883\u53d8\u91cf"),(0,a.kt)("li",{parentName:"ul"},"Solana Pay"),(0,a.kt)("li",{parentName:"ul"},"\u7248\u672c\u5316\u7684\u4e8b\u52a1\u548c\u67e5\u627e\u8868"),(0,a.kt)("li",{parentName:"ul"},"Rust\u8fc7\u7a0b\u5b8f")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7a511f30.0c99a60d.js b/assets/js/7a511f30.0c99a60d.js deleted file mode 100644 index df674be49..000000000 --- a/assets/js/7a511f30.0c99a60d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6260],{3905:(e,r,n)=>{n.d(r,{Zo:()=>u,kt:()=>g});var t=n(7294);function a(e,r,n){return r in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,e}function l(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.push.apply(n,t)}return n}function o(e){for(var r=1;r=0||(a[n]=e[n]);return a}(e,r);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var d=t.createContext({}),p=function(e){var r=t.useContext(d),n=r;return e&&(n="function"==typeof e?e(r):o(o({},r),e)),n},u=function(e){var r=p(e.components);return t.createElement(d.Provider,{value:r},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},m=t.forwardRef((function(e,r){var n=e.components,a=e.mdxType,l=e.originalType,d=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),s=p(n),m=a,g=s["".concat(d,".").concat(m)]||s[m]||c[m]||l;return n?t.createElement(g,o(o({ref:r},u),{},{components:n})):t.createElement(g,o({ref:r},u))}));function g(e,r){var n=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var d in r)hasOwnProperty.call(r,d)&&(i[d]=r[d]);i.originalType=e,i[s]="string"==typeof e?e:a,o[1]=i;for(var p=2;p{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var t=n(7462),a=(n(7294),n(3905));const l={sidebar_position:59,sidebar_label:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",sidebar_class_name:"green"},o="\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",i={unversionedId:"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README",id:"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README",title:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",description:"\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u56fd\u5bb6\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u5dde\u662f\u6307\u6211\u4eec\u7a0b\u5e8f\u4e2d\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u6570\u636e\u3002\u5982\u679c\u4f60\u8981\u5efa\u7acb\uff0c\u5c31\u5fc5\u987b\u51c6\u5907\u597d\u8fdb\u884c\u9632\u5fa1\u3002\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u9700\u8981\u6ce8\u610f\u7684\u57fa\u672c\u9677\u9631\u3002\u8fd9\u8fdc\u975e\u662f\u7a0b\u5e8f\u5b89\u5168\u7684\u5168\u9762\u6982\u8ff0\uff0c\u4f46\u5b83\u5c06\u5e2e\u52a9\u4f60\u50cf\u653b\u51fb\u8005\u4e00\u6837\u601d\u8003\uff0c\u5e76\u63d0\u51fa\u91cd\u8981\u7684\u95ee\u9898\uff1a\u6211\u8be5\u5982\u4f55\u7834\u89e3\u8fd9\u4e2a\uff1f",source:"@site/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README.md",sourceDirName:"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation",slug:"/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/",permalink:"/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README.md",tags:[],version:"current",sidebarPosition:59,frontMatter:{sidebar_position:59,sidebar_label:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5b89\u5168\u548c\u9a8c\u8bc1",permalink:"/docs/Solana-Co-Learn/module3/security-and-validation/"},next:{title:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",permalink:"/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/"}},d={},p=[{value:"\ud83d\ude21 \u81ea\u5b9a\u4e49\u9519\u8bef",id:"-\u81ea\u5b9a\u4e49\u9519\u8bef",level:2},{value:"\ud83d\udd13 \u57fa\u672c\u5b89\u5168",id:"-\u57fa\u672c\u5b89\u5168",level:2},{value:"\u6240\u6709\u6743\u68c0\u67e5",id:"\u6240\u6709\u6743\u68c0\u67e5",level:3},{value:"\u7b7e\u7f72\u8005\u68c0\u67e5",id:"\u7b7e\u7f72\u8005\u68c0\u67e5",level:3},{value:"\u6570\u636e\u9a8c\u8bc1",id:"\u6570\u636e\u9a8c\u8bc1",level:3},{value:"\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2",id:"\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2",level:3}],u={toc:p},s="wrapper";function c(e){let{components:r,...l}=e;return(0,a.kt)(s,(0,t.Z)({},u,l,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1"},"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("p",null,"\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u56fd\u5bb6\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u5dde\u662f\u6307\u6211\u4eec\u7a0b\u5e8f\u4e2d\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u6570\u636e\u3002\u5982\u679c\u4f60\u8981\u5efa\u7acb\uff0c\u5c31\u5fc5\u987b\u51c6\u5907\u597d\u8fdb\u884c\u9632\u5fa1\u3002\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u9700\u8981\u6ce8\u610f\u7684\u57fa\u672c\u9677\u9631\u3002\u8fd9\u8fdc\u975e\u662f\u7a0b\u5e8f\u5b89\u5168\u7684\u5168\u9762\u6982\u8ff0\uff0c\u4f46\u5b83\u5c06\u5e2e\u52a9\u4f60\u50cf\u653b\u51fb\u8005\u4e00\u6837\u601d\u8003\uff0c\u5e76\u63d0\u51fa\u91cd\u8981\u7684\u95ee\u9898\uff1a\u6211\u8be5\u5982\u4f55\u7834\u89e3\u8fd9\u4e2a\uff1f"),(0,a.kt)("h2",{id:"-\u81ea\u5b9a\u4e49\u9519\u8bef"},"\ud83d\ude21 \u81ea\u5b9a\u4e49\u9519\u8bef"),(0,a.kt)("p",null,"Rust\u62e5\u6709\u4e00\u4e2a\u975e\u5e38\u5f3a\u5927\u7684\u9519\u8bef\u5904\u7406\u7cfb\u7edf\u3002\u4f60\u5df2\u7ecf\u9047\u5230\u4e86\u4e00\u4e9b\u89c4\u5219\u548c\u7f16\u8bd1\u5668\u5982\u4f55\u5f3a\u5236\u4f60\u5904\u7406\u5f02\u5e38\u60c5\u51b5\u7684\u60c5\u51b5\u3002"),(0,a.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u4e3a\u6211\u4eec\u7684\u7b14\u8bb0\u7a0b\u5e8f\u521b\u5efa\u81ea\u5b9a\u4e49\u9519\u8bef\u7684\u65b9\u6cd5\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(5273).Z,width:"1222",height:"844"})),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'use solana_program::{program_error::ProgramError};\nuse thiserror::Error;\n\n#[derive(Error)]\npub enum NoteError {\n #[error("Wrong note owner")]\n Forbidden,\n\n #[error("Text is too long")]\n InvalidLength\n}\n')),(0,a.kt)("p",null,"derive\u5b8f\u5c5e\u6027\u63a5\u53d7\u9519\u8bef\u7279\u8d28\u5e76\u5c06\u5176\u5e94\u7528\u4e8e",(0,a.kt)("inlineCode",{parentName:"p"},"NoteError"),"\u679a\u4e3e\uff0c\u4e3a\u5176\u63d0\u4f9b\u9ed8\u8ba4\u5b9e\u73b0\u4ee5\u4f7f\u5176\u6210\u4e3a\u9519\u8bef\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4e3a\u6bcf\u79cd\u9519\u8bef\u7c7b\u578b\u63d0\u4f9b\u81ea\u5df1\u7684",(0,a.kt)("inlineCode",{parentName:"p"},'#[error("...")]'),"\u6807\u8bb0\u6765\u63d0\u4f9b\u9519\u8bef\u4fe1\u606f\u3002"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\u8fd4\u56de\u81ea\u5b9a\u4e49\u9519\u8bef")),(0,a.kt)("p",null,"\u7a0b\u5e8f\u8fd4\u56de\u7684\u9519\u8bef\u5fc5\u987b\u662f\u7c7b\u578b ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError"),"\n\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"impl")," \u5c06\u6211\u4eec\u7684\u81ea\u5b9a\u4e49\u9519\u8bef\u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u7c7b\u578b\u8f6c\u6362"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(4061).Z,width:"1465",height:"683"})),(0,a.kt)("p",null,"\u5728Solana\u7a0b\u5e8f\u4e2d\uff0c\u6211\u4eec\u53ea\u80fd\u4ece ",(0,a.kt)("inlineCode",{parentName:"p"},"solana_program crate"),"\u8fd4\u56de ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u7c7b\u578b\u7684\u9519\u8bef\u3002\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"From trait"),"\u5c06\u6211\u4eec\u81ea\u5b9a\u4e49\u7684\u9519\u8bef\u8f6c\u6362\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u7c7b\u578b\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"impl From for ProgramError {\n fn from(e: NoteError) -> Self {\n ProgramError::Custom(e as u32)\n }\n}\n")),(0,a.kt)("p",null,"\u7136\u540e\u5f53\u6211\u4eec\u9700\u8981\u5b9e\u9645\u8fd4\u56de\u9519\u8bef\u65f6\uff0c\u6211\u4eec\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"into()")," \u65b9\u6cd5\u5c06\u9519\u8bef\u8f6c\u6362\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u7684\u5b9e\u4f8b"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"if pda != *note_pda.key {\n return Err(NoteError::Forbidden.into());\n}\n")),(0,a.kt)("h2",{id:"-\u57fa\u672c\u5b89\u5168"},"\ud83d\udd13 \u57fa\u672c\u5b89\u5168"),(0,a.kt)("p",null,"\u6709\u51e0\u9879\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\u53ef\u4ee5\u5e2e\u52a9\u60a8\u63d0\u9ad8\u7a0b\u5e8f\u7684\u5b89\u5168\u6027\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6240\u6709\u6743\u68c0\u67e5 - \u9a8c\u8bc1\u8d26\u6237\u662f\u5426\u7531\u8be5\u7a0b\u5e8f\u62e5\u6709"),(0,a.kt)("li",{parentName:"ul"},"\u7b7e\u540d\u8005\u68c0\u67e5 - \u9a8c\u8bc1\u8d26\u6237\u662f\u5426\u5df2\u7b7e\u7f72\u4ea4\u6613"),(0,a.kt)("li",{parentName:"ul"},"\u901a\u7528\u8d26\u6237\u9a8c\u8bc1 - \u9a8c\u8bc1\u8d26\u6237\u662f\u5426\u4e3a\u9884\u671f\u8d26\u6237"),(0,a.kt)("li",{parentName:"ul"},"\u6570\u636e\u9a8c\u8bc1 - \u9a8c\u8bc1\u7528\u6237\u63d0\u4f9b\u7684\u8f93\u5165")),(0,a.kt)("p",null,"\u4e00\u822c\u6765\u8bf4\uff0c\u4f60\u5e94\u8be5\u59cb\u7ec8\u9a8c\u8bc1\u4ece\u7528\u6237\u90a3\u91cc\u6536\u5230\u7684\u8f93\u5165\u3002\u5f53\u4f60\u5904\u7406\u7528\u6237\u63d0\u4f9b\u7684\u6570\u636e\u65f6\uff0c\u8fd9\u5c24\u4e3a\u91cd\u8981\u3002\u8bb0\u4f4f - \u7a0b\u5e8f\u4e0d\u4f1a\u4fdd\u5b58\u72b6\u6001\u3002\u5b83\u4eec\u4e0d\u77e5\u9053\u5b83\u4eec\u7684\u6240\u6709\u8005\u662f\u8c01\uff0c\u9664\u975e\u4f60\u544a\u8bc9\u5b83\u4eec\uff0c\u5b83\u4eec\u4e5f\u4e0d\u4f1a\u68c0\u67e5\u8c01\u5728\u8c03\u7528\u5b83\u4eec\u3002"),(0,a.kt)("h3",{id:"\u6240\u6709\u6743\u68c0\u67e5"},"\u6240\u6709\u6743\u68c0\u67e5"),(0,a.kt)("p",null,"\u6240\u6709\u6743\u68c0\u67e5\u9a8c\u8bc1\u8d26\u6237\u662f\u5426\u7531\u9884\u671f\u7684\u7a0b\u5e8f\u62e5\u6709\u3002\u4e00\u5b9a\u8981\u786e\u4fdd\u53ea\u6709\u4f60\u80fd\u591f\u8bbf\u95ee\u5b83\u3002"),(0,a.kt)("p",null,"\u7528\u6237\u6709\u53ef\u80fd\u53d1\u9001\u4e0e\u8d26\u6237\u6570\u636e\u7ed3\u6784\u5339\u914d\u4f46\u7531\u4e0d\u540c\u7a0b\u5e8f\u521b\u5efa\u7684\u6570\u636e\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(9025).Z,width:"1500",height:"559"})),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"if note_pda.owner != program_id {\n return Err(ProgramError::InvalidNoteAccount);\n}\n")),(0,a.kt)("h3",{id:"\u7b7e\u7f72\u8005\u68c0\u67e5"},"\u7b7e\u7f72\u8005\u68c0\u67e5"),(0,a.kt)("p",null,"\u7b7e\u540d\u8005\u68c0\u67e5\u53ea\u662f\u9a8c\u8bc1\u4e00\u4e2a\u8d26\u6237\u662f\u5426\u7b7e\u7f72\u4e86\u4e00\u7b14\u4ea4\u6613"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(8732).Z,width:"1500",height:"575"})),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if !initializer.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature)\n}\n')),(0,a.kt)("p",null,"\u4f8b\u5982\uff0c\u6211\u4eec\u5e0c\u671b\u5728\u5904\u7406 ",(0,a.kt)("inlineCode",{parentName:"p"},"update")," \u6307\u4ee4\u4e4b\u524d\u9a8c\u8bc1\u7b14\u8bb0\u521b\u5efa\u8005\u662f\u5426\u5df2\u7b7e\u7f72\u8be5\u4ea4\u6613\u3002\u5426\u5219\uff0c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u901a\u8fc7\u5c06\u7528\u6237\u7684\u516c\u94a5\u4f5c\u4e3a\u521d\u59cb\u5316\u5668\u6765\u66f4\u65b0\u53e6\u4e00\u4e2a\u7528\u6237\u7684\u7b14\u8bb0\u3002"),(0,a.kt)("h3",{id:"\u6570\u636e\u9a8c\u8bc1"},"\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("p",null,"\u5728\u9002\u5f53\u7684\u60c5\u51b5\u4e0b\uff0c\u60a8\u8fd8\u5e94\u8be5\u9a8c\u8bc1\u5ba2\u6237\u63d0\u4f9b\u7684\u6307\u4ee4\u6570\u636e\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(8570).Z,width:"1500",height:"540"})),(0,a.kt)("p",null,"\u4f8b\u5982\uff0c\u60a8\u53ef\u80fd\u6709\u4e00\u4e2a\u6e38\u620f\u7a0b\u5e8f\uff0c\u7528\u6237\u53ef\u4ee5\u5c06\u89d2\u8272\u5c5e\u6027\u70b9\u5206\u914d\u7ed9\u5404\u4e2a\u7c7b\u522b\u3002"),(0,a.kt)("p",null,"\u60a8\u53ef\u80fd\u5e0c\u671b\u9a8c\u8bc1\u73b0\u6709\u7684\u79ef\u5206\u5206\u914d\u52a0\u4e0a\u65b0\u7684\u5206\u914d\u662f\u5426\u8d85\u8fc7\u4e86\u6700\u5927\u503c"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if character.agility + new_agility > 100 {\n msg!("Attribute points cannot exceed 100");\n return Err(AttributeError::TooHigh.into())\n}\n')),(0,a.kt)("p",null,"\u6216\u8005\uff0c\u89d2\u8272\u53ef\u80fd\u6709\u4e00\u5b9a\u6570\u91cf\u7684\u5c5e\u6027\u70b9\u53ef\u4ee5\u5206\u914d\uff0c\u4f60\u5e0c\u671b\u786e\u4fdd\u4ed6\u4eec\u4e0d\u8d85\u8fc7\u8fd9\u4e2a\u9650\u989d\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if attribute_allowance > new_agility {\n msg!("Trying to allocate more points than allowed");\n return Err(AttributeError::ExceedsAllowance.into())\n}\n')),(0,a.kt)("h3",{id:"\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2"},"\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2"),(0,a.kt)("p",null,"Rust\u6574\u6570\u5177\u6709\u56fa\u5b9a\u7684\u5927\u5c0f\uff0c\u610f\u5473\u7740\u5b83\u4eec\u53ea\u80fd\u652f\u6301\u7279\u5b9a\u8303\u56f4\u7684\u6570\u5b57\u3002\u5982\u679c\u8fdb\u884c\u7b97\u672f\u8fd0\u7b97\u5f97\u5230\u7684\u503c\u8d85\u51fa\u4e86\u8303\u56f4\uff0c\u90a3\u4e48\u7ed3\u679c\u5c06\u4f1a\u88ab\u5305\u88f9\u56de\u6765\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(9745).Z,width:"1280",height:"801"})),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u66fe\u7ecf\u542c\u8bf4\u8fc7\u7535\u5b50\u6e38\u620f\u300a\u6587\u660e\u300b\u4e2d\u7684\u6838",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Nuclear_Gandhi?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u7518\u5730"),"\uff0c\u8fd9\u5c31\u662f\u5bfc\u81f4\u8fd9\u4e00\u60c5\u51b5\u7684\u539f\u56e0\u3002\u4ed6\u672c\u5e94\u662f\u4e00\u4e2a\u975e\u5e38\u51b7\u9759\u548c\u548c\u5e73\u7684\u9886\u5bfc\u8005\uff0c\u5177\u6709\u975e\u5e38\u4f4e\u7684\u653b\u51fb\u6027\u6307\u6570\u3002\u4f46\u5f00\u53d1\u4eba\u5458\u6ca1\u6709\u9a8c\u8bc1\u8be5\u6307\u6570\u4e0d\u4f1a\u6ea2\u51fa\uff0c\u7ed3\u679c\u4ece0\u589e\u52a0\u5230255\uff0c\u4ed6\u53cd\u800c\u6210\u4e3a\u4e86\u4e00\u4e2a\u5177\u6709\u6700\u9ad8\u653b\u51fb\u6027\u7684\u6838\u6218\u4e89\u9886\u8896\u3002\u7cdf\u7cd5\u3002"),(0,a.kt)("p",null,"\u4e3a\u4e86\u907f\u514d\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2\uff0c\u53ef\u4ee5\u9009\u62e9\u4ee5\u4e0b\u65b9\u6cd5\u4e4b\u4e00\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u786e\u4fdd\u903b\u8f91\u4e0a\u4e0d\u4f1a\u53d1\u751f\u6ea2\u51fa\u6216\u4e0b\u6ea2\u7684\u60c5\u51b5"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528\u5df2\u68c0\u67e5\u7684\u6570\u5b66\u7b26\u53f7 ",(0,a.kt)("inlineCode",{parentName:"li"},"checked_add")," \u800c\u4e0d\u662f ",(0,a.kt)("inlineCode",{parentName:"li"},"+"))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"let first_int: u8 = 5;\nlet second_int: u8 = 255;\nlet sum = first_int.checked_add(second_int);\n")),(0,a.kt)("p",null,"\u60f3\u60f3\u90a3\u4e9b\u8fde\u6700\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\u90fd\u6ca1\u6709\u91c7\u53d6\u7684\u7a0b\u5e8f\u3002\u60f3\u8c61\u4e00\u4e0b\u90a3\u4e9b\u6f0f\u6d1e\u8d4f\u91d1\ud83e\udd75\ud83e\udd11\u3002"))}c.isMDXComponent=!0},9745:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/1280px-Nuclear_Gandhi-7327785a34058cc3b5a132552da97fcf.png"},4061:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/convert-erorr-9d01d3fd551ff863dd5e0f30d8936d6b.png"},8570:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/data-validation-bdc66c61216e490e22b74b0d244815a1.png"},9025:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/owner-check-5f29660d1449578edde849a4faf967a6.png"},8732:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/signer-check-5f69ea3ebbef895078cd582d3200c843.png"},5273:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/solana-program-error-0ba3d24e4b8fffb382f3f6a2e015e7e4.png"}}]); \ No newline at end of file diff --git a/assets/js/7a511f30.41d8c678.js b/assets/js/7a511f30.41d8c678.js new file mode 100644 index 000000000..6de5c917d --- /dev/null +++ b/assets/js/7a511f30.41d8c678.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6260],{3905:(e,r,n)=>{n.d(r,{Zo:()=>u,kt:()=>g});var t=n(7294);function a(e,r,n){return r in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,e}function l(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.push.apply(n,t)}return n}function o(e){for(var r=1;r=0||(a[n]=e[n]);return a}(e,r);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var d=t.createContext({}),p=function(e){var r=t.useContext(d),n=r;return e&&(n="function"==typeof e?e(r):o(o({},r),e)),n},u=function(e){var r=p(e.components);return t.createElement(d.Provider,{value:r},e.children)},s="mdxType",c={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},m=t.forwardRef((function(e,r){var n=e.components,a=e.mdxType,l=e.originalType,d=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),s=p(n),m=a,g=s["".concat(d,".").concat(m)]||s[m]||c[m]||l;return n?t.createElement(g,o(o({ref:r},u),{},{components:n})):t.createElement(g,o({ref:r},u))}));function g(e,r){var n=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var l=n.length,o=new Array(l);o[0]=m;var i={};for(var d in r)hasOwnProperty.call(r,d)&&(i[d]=r[d]);i.originalType=e,i[s]="string"==typeof e?e:a,o[1]=i;for(var p=2;p{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>o,default:()=>c,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var t=n(7462),a=(n(7294),n(3905));const l={sidebar_position:59,sidebar_label:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",sidebar_class_name:"green"},o="\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",i={unversionedId:"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README",id:"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README",title:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",description:"\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u56fd\u5bb6\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u5dde\u662f\u6307\u6211\u4eec\u7a0b\u5e8f\u4e2d\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u6570\u636e\u3002\u5982\u679c\u4f60\u8981\u5efa\u7acb\uff0c\u5c31\u5fc5\u987b\u51c6\u5907\u597d\u8fdb\u884c\u9632\u5fa1\u3002\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u9700\u8981\u6ce8\u610f\u7684\u57fa\u672c\u9677\u9631\u3002\u8fd9\u8fdc\u975e\u662f\u7a0b\u5e8f\u5b89\u5168\u7684\u5168\u9762\u6982\u8ff0\uff0c\u4f46\u5b83\u5c06\u5e2e\u52a9\u4f60\u50cf\u653b\u51fb\u8005\u4e00\u6837\u601d\u8003\uff0c\u5e76\u63d0\u51fa\u91cd\u8981\u7684\u95ee\u9898\uff1a\u6211\u8be5\u5982\u4f55\u7834\u89e3\u8fd9\u4e2a\uff1f",source:"@site/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README.md",sourceDirName:"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation",slug:"/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README.md",tags:[],version:"current",sidebarPosition:59,frontMatter:{sidebar_position:59,sidebar_label:"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5b89\u5168\u548c\u9a8c\u8bc1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/"},next:{title:"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/"}},d={},p=[{value:"\ud83d\ude21 \u81ea\u5b9a\u4e49\u9519\u8bef",id:"-\u81ea\u5b9a\u4e49\u9519\u8bef",level:2},{value:"\ud83d\udd13 \u57fa\u672c\u5b89\u5168",id:"-\u57fa\u672c\u5b89\u5168",level:2},{value:"\u6240\u6709\u6743\u68c0\u67e5",id:"\u6240\u6709\u6743\u68c0\u67e5",level:3},{value:"\u7b7e\u7f72\u8005\u68c0\u67e5",id:"\u7b7e\u7f72\u8005\u68c0\u67e5",level:3},{value:"\u6570\u636e\u9a8c\u8bc1",id:"\u6570\u636e\u9a8c\u8bc1",level:3},{value:"\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2",id:"\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2",level:3}],u={toc:p},s="wrapper";function c(e){let{components:r,...l}=e;return(0,a.kt)(s,(0,t.Z)({},u,l,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1"},"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("p",null,"\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u56fd\u5bb6\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u5dde\u662f\u6307\u6211\u4eec\u7a0b\u5e8f\u4e2d\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u6570\u636e\u3002\u5982\u679c\u4f60\u8981\u5efa\u7acb\uff0c\u5c31\u5fc5\u987b\u51c6\u5907\u597d\u8fdb\u884c\u9632\u5fa1\u3002\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u9700\u8981\u6ce8\u610f\u7684\u57fa\u672c\u9677\u9631\u3002\u8fd9\u8fdc\u975e\u662f\u7a0b\u5e8f\u5b89\u5168\u7684\u5168\u9762\u6982\u8ff0\uff0c\u4f46\u5b83\u5c06\u5e2e\u52a9\u4f60\u50cf\u653b\u51fb\u8005\u4e00\u6837\u601d\u8003\uff0c\u5e76\u63d0\u51fa\u91cd\u8981\u7684\u95ee\u9898\uff1a\u6211\u8be5\u5982\u4f55\u7834\u89e3\u8fd9\u4e2a\uff1f"),(0,a.kt)("h2",{id:"-\u81ea\u5b9a\u4e49\u9519\u8bef"},"\ud83d\ude21 \u81ea\u5b9a\u4e49\u9519\u8bef"),(0,a.kt)("p",null,"Rust\u62e5\u6709\u4e00\u4e2a\u975e\u5e38\u5f3a\u5927\u7684\u9519\u8bef\u5904\u7406\u7cfb\u7edf\u3002\u4f60\u5df2\u7ecf\u9047\u5230\u4e86\u4e00\u4e9b\u89c4\u5219\u548c\u7f16\u8bd1\u5668\u5982\u4f55\u5f3a\u5236\u4f60\u5904\u7406\u5f02\u5e38\u60c5\u51b5\u7684\u60c5\u51b5\u3002"),(0,a.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u4e3a\u6211\u4eec\u7684\u7b14\u8bb0\u7a0b\u5e8f\u521b\u5efa\u81ea\u5b9a\u4e49\u9519\u8bef\u7684\u65b9\u6cd5\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(5273).Z,width:"1222",height:"844"})),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'use solana_program::{program_error::ProgramError};\nuse thiserror::Error;\n\n#[derive(Error)]\npub enum NoteError {\n #[error("Wrong note owner")]\n Forbidden,\n\n #[error("Text is too long")]\n InvalidLength\n}\n')),(0,a.kt)("p",null,"derive\u5b8f\u5c5e\u6027\u63a5\u53d7\u9519\u8bef\u7279\u8d28\u5e76\u5c06\u5176\u5e94\u7528\u4e8e",(0,a.kt)("inlineCode",{parentName:"p"},"NoteError"),"\u679a\u4e3e\uff0c\u4e3a\u5176\u63d0\u4f9b\u9ed8\u8ba4\u5b9e\u73b0\u4ee5\u4f7f\u5176\u6210\u4e3a\u9519\u8bef\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4e3a\u6bcf\u79cd\u9519\u8bef\u7c7b\u578b\u63d0\u4f9b\u81ea\u5df1\u7684",(0,a.kt)("inlineCode",{parentName:"p"},'#[error("...")]'),"\u6807\u8bb0\u6765\u63d0\u4f9b\u9519\u8bef\u4fe1\u606f\u3002"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"\u8fd4\u56de\u81ea\u5b9a\u4e49\u9519\u8bef")),(0,a.kt)("p",null,"\u7a0b\u5e8f\u8fd4\u56de\u7684\u9519\u8bef\u5fc5\u987b\u662f\u7c7b\u578b ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError"),"\n\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"impl")," \u5c06\u6211\u4eec\u7684\u81ea\u5b9a\u4e49\u9519\u8bef\u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u7c7b\u578b\u8f6c\u6362"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(4061).Z,width:"1465",height:"683"})),(0,a.kt)("p",null,"\u5728Solana\u7a0b\u5e8f\u4e2d\uff0c\u6211\u4eec\u53ea\u80fd\u4ece ",(0,a.kt)("inlineCode",{parentName:"p"},"solana_program crate"),"\u8fd4\u56de ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u7c7b\u578b\u7684\u9519\u8bef\u3002\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"From trait"),"\u5c06\u6211\u4eec\u81ea\u5b9a\u4e49\u7684\u9519\u8bef\u8f6c\u6362\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u7c7b\u578b\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"impl From for ProgramError {\n fn from(e: NoteError) -> Self {\n ProgramError::Custom(e as u32)\n }\n}\n")),(0,a.kt)("p",null,"\u7136\u540e\u5f53\u6211\u4eec\u9700\u8981\u5b9e\u9645\u8fd4\u56de\u9519\u8bef\u65f6\uff0c\u6211\u4eec\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"into()")," \u65b9\u6cd5\u5c06\u9519\u8bef\u8f6c\u6362\u4e3a ",(0,a.kt)("inlineCode",{parentName:"p"},"ProgramError")," \u7684\u5b9e\u4f8b"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"if pda != *note_pda.key {\n return Err(NoteError::Forbidden.into());\n}\n")),(0,a.kt)("h2",{id:"-\u57fa\u672c\u5b89\u5168"},"\ud83d\udd13 \u57fa\u672c\u5b89\u5168"),(0,a.kt)("p",null,"\u6709\u51e0\u9879\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\u53ef\u4ee5\u5e2e\u52a9\u60a8\u63d0\u9ad8\u7a0b\u5e8f\u7684\u5b89\u5168\u6027\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u6240\u6709\u6743\u68c0\u67e5 - \u9a8c\u8bc1\u8d26\u6237\u662f\u5426\u7531\u8be5\u7a0b\u5e8f\u62e5\u6709"),(0,a.kt)("li",{parentName:"ul"},"\u7b7e\u540d\u8005\u68c0\u67e5 - \u9a8c\u8bc1\u8d26\u6237\u662f\u5426\u5df2\u7b7e\u7f72\u4ea4\u6613"),(0,a.kt)("li",{parentName:"ul"},"\u901a\u7528\u8d26\u6237\u9a8c\u8bc1 - \u9a8c\u8bc1\u8d26\u6237\u662f\u5426\u4e3a\u9884\u671f\u8d26\u6237"),(0,a.kt)("li",{parentName:"ul"},"\u6570\u636e\u9a8c\u8bc1 - \u9a8c\u8bc1\u7528\u6237\u63d0\u4f9b\u7684\u8f93\u5165")),(0,a.kt)("p",null,"\u4e00\u822c\u6765\u8bf4\uff0c\u4f60\u5e94\u8be5\u59cb\u7ec8\u9a8c\u8bc1\u4ece\u7528\u6237\u90a3\u91cc\u6536\u5230\u7684\u8f93\u5165\u3002\u5f53\u4f60\u5904\u7406\u7528\u6237\u63d0\u4f9b\u7684\u6570\u636e\u65f6\uff0c\u8fd9\u5c24\u4e3a\u91cd\u8981\u3002\u8bb0\u4f4f - \u7a0b\u5e8f\u4e0d\u4f1a\u4fdd\u5b58\u72b6\u6001\u3002\u5b83\u4eec\u4e0d\u77e5\u9053\u5b83\u4eec\u7684\u6240\u6709\u8005\u662f\u8c01\uff0c\u9664\u975e\u4f60\u544a\u8bc9\u5b83\u4eec\uff0c\u5b83\u4eec\u4e5f\u4e0d\u4f1a\u68c0\u67e5\u8c01\u5728\u8c03\u7528\u5b83\u4eec\u3002"),(0,a.kt)("h3",{id:"\u6240\u6709\u6743\u68c0\u67e5"},"\u6240\u6709\u6743\u68c0\u67e5"),(0,a.kt)("p",null,"\u6240\u6709\u6743\u68c0\u67e5\u9a8c\u8bc1\u8d26\u6237\u662f\u5426\u7531\u9884\u671f\u7684\u7a0b\u5e8f\u62e5\u6709\u3002\u4e00\u5b9a\u8981\u786e\u4fdd\u53ea\u6709\u4f60\u80fd\u591f\u8bbf\u95ee\u5b83\u3002"),(0,a.kt)("p",null,"\u7528\u6237\u6709\u53ef\u80fd\u53d1\u9001\u4e0e\u8d26\u6237\u6570\u636e\u7ed3\u6784\u5339\u914d\u4f46\u7531\u4e0d\u540c\u7a0b\u5e8f\u521b\u5efa\u7684\u6570\u636e\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(9025).Z,width:"1500",height:"559"})),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"if note_pda.owner != program_id {\n return Err(ProgramError::InvalidNoteAccount);\n}\n")),(0,a.kt)("h3",{id:"\u7b7e\u7f72\u8005\u68c0\u67e5"},"\u7b7e\u7f72\u8005\u68c0\u67e5"),(0,a.kt)("p",null,"\u7b7e\u540d\u8005\u68c0\u67e5\u53ea\u662f\u9a8c\u8bc1\u4e00\u4e2a\u8d26\u6237\u662f\u5426\u7b7e\u7f72\u4e86\u4e00\u7b14\u4ea4\u6613"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(8732).Z,width:"1500",height:"575"})),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if !initializer.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature)\n}\n')),(0,a.kt)("p",null,"\u4f8b\u5982\uff0c\u6211\u4eec\u5e0c\u671b\u5728\u5904\u7406 ",(0,a.kt)("inlineCode",{parentName:"p"},"update")," \u6307\u4ee4\u4e4b\u524d\u9a8c\u8bc1\u7b14\u8bb0\u521b\u5efa\u8005\u662f\u5426\u5df2\u7b7e\u7f72\u8be5\u4ea4\u6613\u3002\u5426\u5219\uff0c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u901a\u8fc7\u5c06\u7528\u6237\u7684\u516c\u94a5\u4f5c\u4e3a\u521d\u59cb\u5316\u5668\u6765\u66f4\u65b0\u53e6\u4e00\u4e2a\u7528\u6237\u7684\u7b14\u8bb0\u3002"),(0,a.kt)("h3",{id:"\u6570\u636e\u9a8c\u8bc1"},"\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("p",null,"\u5728\u9002\u5f53\u7684\u60c5\u51b5\u4e0b\uff0c\u60a8\u8fd8\u5e94\u8be5\u9a8c\u8bc1\u5ba2\u6237\u63d0\u4f9b\u7684\u6307\u4ee4\u6570\u636e\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(8570).Z,width:"1500",height:"540"})),(0,a.kt)("p",null,"\u4f8b\u5982\uff0c\u60a8\u53ef\u80fd\u6709\u4e00\u4e2a\u6e38\u620f\u7a0b\u5e8f\uff0c\u7528\u6237\u53ef\u4ee5\u5c06\u89d2\u8272\u5c5e\u6027\u70b9\u5206\u914d\u7ed9\u5404\u4e2a\u7c7b\u522b\u3002"),(0,a.kt)("p",null,"\u60a8\u53ef\u80fd\u5e0c\u671b\u9a8c\u8bc1\u73b0\u6709\u7684\u79ef\u5206\u5206\u914d\u52a0\u4e0a\u65b0\u7684\u5206\u914d\u662f\u5426\u8d85\u8fc7\u4e86\u6700\u5927\u503c"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if character.agility + new_agility > 100 {\n msg!("Attribute points cannot exceed 100");\n return Err(AttributeError::TooHigh.into())\n}\n')),(0,a.kt)("p",null,"\u6216\u8005\uff0c\u89d2\u8272\u53ef\u80fd\u6709\u4e00\u5b9a\u6570\u91cf\u7684\u5c5e\u6027\u70b9\u53ef\u4ee5\u5206\u914d\uff0c\u4f60\u5e0c\u671b\u786e\u4fdd\u4ed6\u4eec\u4e0d\u8d85\u8fc7\u8fd9\u4e2a\u9650\u989d\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},'if attribute_allowance > new_agility {\n msg!("Trying to allocate more points than allowed");\n return Err(AttributeError::ExceedsAllowance.into())\n}\n')),(0,a.kt)("h3",{id:"\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2"},"\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2"),(0,a.kt)("p",null,"Rust\u6574\u6570\u5177\u6709\u56fa\u5b9a\u7684\u5927\u5c0f\uff0c\u610f\u5473\u7740\u5b83\u4eec\u53ea\u80fd\u652f\u6301\u7279\u5b9a\u8303\u56f4\u7684\u6570\u5b57\u3002\u5982\u679c\u8fdb\u884c\u7b97\u672f\u8fd0\u7b97\u5f97\u5230\u7684\u503c\u8d85\u51fa\u4e86\u8303\u56f4\uff0c\u90a3\u4e48\u7ed3\u679c\u5c06\u4f1a\u88ab\u5305\u88f9\u56de\u6765\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:n(9745).Z,width:"1280",height:"801"})),(0,a.kt)("p",null,"\u5982\u679c\u4f60\u66fe\u7ecf\u542c\u8bf4\u8fc7\u7535\u5b50\u6e38\u620f\u300a\u6587\u660e\u300b\u4e2d\u7684\u6838",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Nuclear_Gandhi?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u7518\u5730"),"\uff0c\u8fd9\u5c31\u662f\u5bfc\u81f4\u8fd9\u4e00\u60c5\u51b5\u7684\u539f\u56e0\u3002\u4ed6\u672c\u5e94\u662f\u4e00\u4e2a\u975e\u5e38\u51b7\u9759\u548c\u548c\u5e73\u7684\u9886\u5bfc\u8005\uff0c\u5177\u6709\u975e\u5e38\u4f4e\u7684\u653b\u51fb\u6027\u6307\u6570\u3002\u4f46\u5f00\u53d1\u4eba\u5458\u6ca1\u6709\u9a8c\u8bc1\u8be5\u6307\u6570\u4e0d\u4f1a\u6ea2\u51fa\uff0c\u7ed3\u679c\u4ece0\u589e\u52a0\u5230255\uff0c\u4ed6\u53cd\u800c\u6210\u4e3a\u4e86\u4e00\u4e2a\u5177\u6709\u6700\u9ad8\u653b\u51fb\u6027\u7684\u6838\u6218\u4e89\u9886\u8896\u3002\u7cdf\u7cd5\u3002"),(0,a.kt)("p",null,"\u4e3a\u4e86\u907f\u514d\u6574\u6570\u6ea2\u51fa\u548c\u4e0b\u6ea2\uff0c\u53ef\u4ee5\u9009\u62e9\u4ee5\u4e0b\u65b9\u6cd5\u4e4b\u4e00\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u786e\u4fdd\u903b\u8f91\u4e0a\u4e0d\u4f1a\u53d1\u751f\u6ea2\u51fa\u6216\u4e0b\u6ea2\u7684\u60c5\u51b5"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528\u5df2\u68c0\u67e5\u7684\u6570\u5b66\u7b26\u53f7 ",(0,a.kt)("inlineCode",{parentName:"li"},"checked_add")," \u800c\u4e0d\u662f ",(0,a.kt)("inlineCode",{parentName:"li"},"+"))),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-rust"},"let first_int: u8 = 5;\nlet second_int: u8 = 255;\nlet sum = first_int.checked_add(second_int);\n")),(0,a.kt)("p",null,"\u60f3\u60f3\u90a3\u4e9b\u8fde\u6700\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\u90fd\u6ca1\u6709\u91c7\u53d6\u7684\u7a0b\u5e8f\u3002\u60f3\u8c61\u4e00\u4e0b\u90a3\u4e9b\u6f0f\u6d1e\u8d4f\u91d1\ud83e\udd75\ud83e\udd11\u3002"))}c.isMDXComponent=!0},9745:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/1280px-Nuclear_Gandhi-7327785a34058cc3b5a132552da97fcf.png"},4061:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/convert-erorr-9d01d3fd551ff863dd5e0f30d8936d6b.png"},8570:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/data-validation-bdc66c61216e490e22b74b0d244815a1.png"},9025:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/owner-check-5f29660d1449578edde849a4faf967a6.png"},8732:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/signer-check-5f69ea3ebbef895078cd582d3200c843.png"},5273:(e,r,n)=>{n.d(r,{Z:()=>t});const t=n.p+"assets/images/solana-program-error-0ba3d24e4b8fffb382f3f6a2e015e7e4.png"}}]); \ No newline at end of file diff --git a/assets/js/7b4b11c5.7ee5b97a.js b/assets/js/7b4b11c5.7ee5b97a.js deleted file mode 100644 index 32c9e7f9b..000000000 --- a/assets/js/7b4b11c5.7ee5b97a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3376],{3905:(e,t,o)=>{o.d(t,{Zo:()=>h,kt:()=>m});var n=o(7294);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function r(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t=0||(a[o]=e[o]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},h=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,a=e.mdxType,r=e.originalType,c=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(o),d=a,m=u["".concat(c,".").concat(d)]||u[d]||p[d]||r;return o?n.createElement(m,i(i({ref:t},h),{},{components:o})):n.createElement(m,i({ref:t},h))}));function m(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=o.length,i=new Array(r);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var s=2;s{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var n=o(7462),a=(o(7294),o(3905));const r={slug:"first-blog-post",title:"All in One Blockchain First Blog",authors:["davirain"],tags:["blog","blockchain","solana","IBC"]},i="All in One Blockchain: Your Comprehensive Guide to Blockchain Technology",l={permalink:"/blog/first-blog-post",editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/blog/2023-07-06.md",source:"@site/blog/2023-07-06.md",title:"All in One Blockchain First Blog",description:"Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.",date:"2023-07-06T00:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"blog",permalink:"/blog/tags/blog"},{label:"blockchain",permalink:"/blog/tags/blockchain"},{label:"solana",permalink:"/blog/tags/solana"},{label:"IBC",permalink:"/blog/tags/ibc"}],readingTime:1.995,hasTruncateMarker:!1,authors:[{name:"Davirain",title:"Davirain Blog",url:"https://github.com/DaviRain-Su",imageURL:"https://github.com/DaviRain-Su.png",key:"davirain"}],frontMatter:{slug:"first-blog-post",title:"All in One Blockchain First Blog",authors:["davirain"],tags:["blog","blockchain","solana","IBC"]}},c={authorsImageUrls:[void 0]},s=[{value:"Understanding Blockchain",id:"understanding-blockchain",level:2},{value:"Spotlight on Solana",id:"spotlight-on-solana",level:2},{value:"Inter-Blockchain Communication (IBC) Protocol",id:"inter-blockchain-communication-ibc-protocol",level:2},{value:"The Future of Blockchain",id:"the-future-of-blockchain",level:2}],h={toc:s},u="wrapper";function p(e){let{components:t,...o}=e;return(0,a.kt)(u,(0,n.Z)({},h,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol."),(0,a.kt)("h2",{id:"understanding-blockchain"},"Understanding Blockchain"),(0,a.kt)("p",null,"Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data."),(0,a.kt)("h2",{id:"spotlight-on-solana"},"Spotlight on Solana"),(0,a.kt)("p",null,"Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps)."),(0,a.kt)("p",null,"One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency."),(0,a.kt)("p",null,"Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence."),(0,a.kt)("h2",{id:"inter-blockchain-communication-ibc-protocol"},"Inter-Blockchain Communication (IBC) Protocol"),(0,a.kt)("p",null,"The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability."),(0,a.kt)("p",null,"IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem."),(0,a.kt)("h2",{id:"the-future-of-blockchain"},"The Future of Blockchain"),(0,a.kt)("p",null,"The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics."),(0,a.kt)("p",null,"Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain."),(0,a.kt)("p",null,"Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7b4b11c5.c4b45684.js b/assets/js/7b4b11c5.c4b45684.js new file mode 100644 index 000000000..e6a11ffcb --- /dev/null +++ b/assets/js/7b4b11c5.c4b45684.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3376],{3905:(e,t,o)=>{o.d(t,{Zo:()=>h,kt:()=>m});var n=o(7294);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function r(e){for(var t=1;t=0||(a[o]=e[o]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var c=n.createContext({}),s=function(e){var t=n.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):r(r({},t),e)),o},h=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var o=e.components,a=e.mdxType,i=e.originalType,c=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=s(o),d=a,m=u["".concat(c,".").concat(d)]||u[d]||p[d]||i;return o?n.createElement(m,r(r({ref:t},h),{},{components:o})):n.createElement(m,r({ref:t},h))}));function m(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=o.length,r=new Array(i);r[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:a,r[1]=l;for(var s=2;s{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=o(7462),a=(o(7294),o(3905));const i={slug:"first-blog-post",title:"All in One Blockchain First Blog",authors:["davirain"],tags:["blog","blockchain","solana","IBC"]},r="All in One Blockchain: Your Comprehensive Guide to Blockchain Technology",l={permalink:"/all-in-one-solana/blog/first-blog-post",editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/blog/2023-07-06.md",source:"@site/blog/2023-07-06.md",title:"All in One Blockchain First Blog",description:"Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.",date:"2023-07-06T00:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"blog",permalink:"/all-in-one-solana/blog/tags/blog"},{label:"blockchain",permalink:"/all-in-one-solana/blog/tags/blockchain"},{label:"solana",permalink:"/all-in-one-solana/blog/tags/solana"},{label:"IBC",permalink:"/all-in-one-solana/blog/tags/ibc"}],readingTime:1.995,hasTruncateMarker:!1,authors:[{name:"Davirain",title:"Davirain Blog",url:"https://github.com/DaviRain-Su",imageURL:"https://github.com/DaviRain-Su.png",key:"davirain"}],frontMatter:{slug:"first-blog-post",title:"All in One Blockchain First Blog",authors:["davirain"],tags:["blog","blockchain","solana","IBC"]}},c={authorsImageUrls:[void 0]},s=[{value:"Understanding Blockchain",id:"understanding-blockchain",level:2},{value:"Spotlight on Solana",id:"spotlight-on-solana",level:2},{value:"Inter-Blockchain Communication (IBC) Protocol",id:"inter-blockchain-communication-ibc-protocol",level:2},{value:"The Future of Blockchain",id:"the-future-of-blockchain",level:2}],h={toc:s},u="wrapper";function p(e){let{components:t,...o}=e;return(0,a.kt)(u,(0,n.Z)({},h,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol."),(0,a.kt)("h2",{id:"understanding-blockchain"},"Understanding Blockchain"),(0,a.kt)("p",null,"Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data."),(0,a.kt)("h2",{id:"spotlight-on-solana"},"Spotlight on Solana"),(0,a.kt)("p",null,"Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps)."),(0,a.kt)("p",null,"One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency."),(0,a.kt)("p",null,"Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence."),(0,a.kt)("h2",{id:"inter-blockchain-communication-ibc-protocol"},"Inter-Blockchain Communication (IBC) Protocol"),(0,a.kt)("p",null,"The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability."),(0,a.kt)("p",null,"IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem."),(0,a.kt)("h2",{id:"the-future-of-blockchain"},"The Future of Blockchain"),(0,a.kt)("p",null,"The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics."),(0,a.kt)("p",null,"Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain."),(0,a.kt)("p",null,"Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7be9c390.82fd288f.js b/assets/js/7be9c390.82fd288f.js new file mode 100644 index 000000000..8467b0028 --- /dev/null +++ b/assets/js/7be9c390.82fd288f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[210],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,l(l({ref:t},u),{},{components:n})):r.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={sidebar_position:65,sidebar_label:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",sidebar_class_name:"green"},l="\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",i={unversionedId:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/README",id:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/README",title:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",description:"- \ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",source:"@site/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/README.md",sourceDirName:"Solana-Co-Learn/module4/local-ent-setup-and-pdas",slug:"/Solana-Co-Learn/module4/local-ent-setup-and-pdas/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/README.md",tags:[],version:"current",sidebarPosition:65,frontMatter:{sidebar_position:65,sidebar_label:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module4",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/"},next:{title:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/"}},s={},c=[],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cpda"},"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e"),(0,a.kt)("li",{parentName:"ul"},"\u5e26\u6709Gage\u7684PDA"),(0,a.kt)("li",{parentName:"ul"},"PDA\u6df1\u5165\u63a2\u7a76"),(0,a.kt)("li",{parentName:"ul"},"\u5728\u94fe\u4e0a\u6784\u5efa\u8bc4\u8bba")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7be9c390.f18bb2c9.js b/assets/js/7be9c390.f18bb2c9.js deleted file mode 100644 index ded3c7820..000000000 --- a/assets/js/7be9c390.f18bb2c9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[210],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=s(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:a,l[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>s});var n=r(7462),a=(r(7294),r(3905));const o={sidebar_position:65,sidebar_label:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",sidebar_class_name:"green"},l="\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",c={unversionedId:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/README",id:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/README",title:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",description:"- \ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",source:"@site/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/README.md",sourceDirName:"Solana-Co-Learn/module4/local-ent-setup-and-pdas",slug:"/Solana-Co-Learn/module4/local-ent-setup-and-pdas/",permalink:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/README.md",tags:[],version:"current",sidebarPosition:65,frontMatter:{sidebar_position:65,sidebar_label:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module4",permalink:"/docs/Solana-Co-Learn/module4/"},next:{title:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",permalink:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/"}},i={},s=[],u={toc:s},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cpda"},"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e"),(0,a.kt)("li",{parentName:"ul"},"\u5e26\u6709Gage\u7684PDA"),(0,a.kt)("li",{parentName:"ul"},"PDA\u6df1\u5165\u63a2\u7a76"),(0,a.kt)("li",{parentName:"ul"},"\u5728\u94fe\u4e0a\u6784\u5efa\u8bc4\u8bba")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/814f3328.55dcb6a6.js b/assets/js/814f3328.bb582790.js similarity index 73% rename from assets/js/814f3328.55dcb6a6.js rename to assets/js/814f3328.bb582790.js index dc4f23be9..1ca146380 100644 --- a/assets/js/814f3328.55dcb6a6.js +++ b/assets/js/814f3328.bb582790.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"All in One Blockchain First Blog","permalink":"/blog/first-blog-post"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"All in One Blockchain First Blog","permalink":"/all-in-one-solana/blog/first-blog-post"}]}')}}]); \ No newline at end of file diff --git a/assets/js/846341e5.8511011d.js b/assets/js/846341e5.8511011d.js deleted file mode 100644 index 50ef45630..000000000 --- a/assets/js/846341e5.8511011d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3355],{3905:(n,e,t)=>{t.d(e,{Zo:()=>l,kt:()=>m});var a=t(7294);function r(n,e,t){return e in n?Object.defineProperty(n,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[e]=t,n}function o(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(n);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),t.push.apply(t,a)}return t}function s(n){for(var e=1;e=0||(r[t]=n[t]);return r}(n,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(n,t)&&(r[t]=n[t])}return r}var c=a.createContext({}),u=function(n){var e=a.useContext(c),t=e;return n&&(t="function"==typeof n?n(e):s(s({},e),n)),t},l=function(n){var e=u(n.components);return a.createElement(c.Provider,{value:e},n.children)},p="mdxType",_={inlineCode:"code",wrapper:function(n){var e=n.children;return a.createElement(a.Fragment,{},e)}},k=a.forwardRef((function(n,e){var t=n.components,r=n.mdxType,o=n.originalType,c=n.parentName,l=i(n,["components","mdxType","originalType","parentName"]),p=u(t),k=r,m=p["".concat(c,".").concat(k)]||p[k]||_[k]||o;return t?a.createElement(m,s(s({ref:e},l),{},{components:t})):a.createElement(m,s({ref:e},l))}));function m(n,e){var t=arguments,r=e&&e.mdxType;if("string"==typeof n||r){var o=t.length,s=new Array(o);s[0]=k;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=n,i[p]="string"==typeof n?n:r,s[1]=i;for(var u=2;u{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>_,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:63,sidebar_label:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",sidebar_class_name:"green"},s="\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",i={unversionedId:"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README",id:"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README",title:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",description:"\u4eca\u5929\uff0c\u6211\u4eec\u5c06\u7f16\u5199\u6211\u4eec\u7684\u8d28\u62bc\u7a0b\u5e8f\uff0c\u5e76\u7f16\u5199\u6240\u6709\u5fc5\u8981\u7684\u8d28\u62bc\u529f\u80fd\uff0c\u800c\u4e0d\u8fdb\u884c\u4efb\u4f55\u4ee3\u5e01\u8f6c\u8d26\u3002\u6211\u5c06\u4e0e\u60a8\u4e00\u8d77\u9010\u6b65\u8bb2\u89e3\u6574\u4e2a\u8fc7\u7a0b\uff0c\u89e3\u91ca\u6bcf\u4e2a\u6b65\u9aa4\uff0c\u4ee5\u4fbf\u60a8\u4e86\u89e3\u6b63\u5728\u53d1\u751f\u7684\u4e8b\u60c5\u3002\u8ba9\u6211\u4eec\u9996\u5148\u8fdb\u5165Solana Playground\uff0c\u5728 create a new project \u4e0a\u70b9\u51fb\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a src \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e2a\u540d\u4e3a lib.rs \u7684\u6587\u4ef6\u3002",source:"@site/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README.md",sourceDirName:"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program",slug:"/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/",permalink:"/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README.md",tags:[],version:"current",sidebarPosition:63,frontMatter:{sidebar_position:63,sidebar_label:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",permalink:"/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/"},next:{title:"Module4",permalink:"/docs/Solana-Co-Learn/module4/"}},c={},u=[{value:"\ud83d\udeab\u81ea\u5b9a\u4e49\u9519\u8bef",id:"\u81ea\u5b9a\u4e49\u9519\u8bef",level:2},{value:"\ud83e\uded9 \u5b8c\u6210\u4ee3\u7801",id:"-\u5b8c\u6210\u4ee3\u7801",level:2}],l={toc:u},p="wrapper";function _(n){let{components:e,...o}=n;return(0,r.kt)(p,(0,a.Z)({},l,o,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\ufe0f-\u6784\u5efa\u4e00\u4e2anft\u8d28\u62bc\u8ba1\u5212"},"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212"),(0,r.kt)("p",null,"\u4eca\u5929\uff0c\u6211\u4eec\u5c06\u7f16\u5199\u6211\u4eec\u7684\u8d28\u62bc\u7a0b\u5e8f\uff0c\u5e76\u7f16\u5199\u6240\u6709\u5fc5\u8981\u7684\u8d28\u62bc\u529f\u80fd\uff0c\u800c\u4e0d\u8fdb\u884c\u4efb\u4f55\u4ee3\u5e01\u8f6c\u8d26\u3002\u6211\u5c06\u4e0e\u60a8\u4e00\u8d77\u9010\u6b65\u8bb2\u89e3\u6574\u4e2a\u8fc7\u7a0b\uff0c\u89e3\u91ca\u6bcf\u4e2a\u6b65\u9aa4\uff0c\u4ee5\u4fbf\u60a8\u4e86\u89e3\u6b63\u5728\u53d1\u751f\u7684\u4e8b\u60c5\u3002\u8ba9\u6211\u4eec\u9996\u5148\u8fdb\u5165",(0,r.kt)("a",{parentName:"p",href:"https://beta.solpg.io/?utm_source=buildspace.so&utm_medium=buildspace_project"},"Solana Playground"),"\uff0c\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"create a new project")," \u4e0a\u70b9\u51fb\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"src")," \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u7684\u6587\u4ef6\u3002"),(0,r.kt)("p",null,"\u8fd9\u5c31\u662f\u4f60\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\u5e94\u8be5\u770b\u8d77\u6765\u7684\u6837\u5b50"),(0,r.kt)("p",null,"\u76ee\u524d\uff0c\u4e3b\u8981\u76ee\u6807\u662f\u7f16\u5199\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u8ddf\u8e2a\u6bcf\u4e2a\u7528\u6237\u7684\u8d28\u62bc\u72b6\u6001\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5927\u81f4\u7684\u6b65\u9aa4\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7277).Z,width:"1503",height:"917"})),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\uff0c\u6211\u4eec\u5c06\u7ee7\u7eed\u521b\u5efa\u5269\u4f59\u7684\u6587\u4ef6\uff0c\u5c31\u50cf\u6211\u4eec\u5728\u4e4b\u524d\u7684\u8bfe\u7a0b\u4e2d\u6240\u505a\u7684\u90a3\u6837\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"src")," \u6587\u4ef6\u5939\u4e2d\u521b\u5efa\u4ee5\u4e0b5\u4e2a\u6587\u4ef6\u3002\u8fd9\u4e9b\u6587\u4ef6\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"entrypoint.rs")," \uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"error.rs")," \uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"state.rs")," \u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(8663).Z,width:"185",height:"236"})),(0,r.kt)("p",null,"\u6211\u4eec\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\uff01\u73b0\u5728\u8ba9\u6211\u4eec\u7528\u4ee5\u4e0b\u4ee3\u7801\u586b\u5145\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"lib.rs")," \uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// Lib.rs\npub mod entrypoint;\npub mod error;\npub mod instruction;\npub mod processor;\npub mod state;\n")),(0,r.kt)("p",null,"\u8fdb\u5165 entrypoint.rs \u5e76\u6dfb\u52a0\u4ee5\u4e0b\u4ee3\u7801"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// Entrypoint.rs\nuse solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey\n};\nuse crate::processor;\n\n// This macro will help process all incoming instructions\nentrypoint!(process_instruction);\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n processor::process_instruction(program_id, accounts, instruction_data)?;\n Ok(())\n}\n")),(0,r.kt)("p",null,"\u5f53\u4f60\u8fd0\u884c\u4ee3\u7801\u65f6\uff0c\u4f60\u4f1a\u6ce8\u610f\u5230\u8fd9\u4f1a\u629b\u51fa\u4e00\u4e2a\u9519\u8bef\uff0c\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u4e2d\u5b9a\u4e49 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u3002\u73b0\u5728\u8ba9\u6211\u4eec\u521b\u5efa\u8fd9\u4e2a\u51fd\u6570\u3002\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u5e76\u6dfb\u52a0\u4ee5\u4e0b\u4ee3\u7801\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// Processor.rs\nuse solana_program::{\n account_info::AccountInfo,\n entrypoint::ProgramResult,\n pubkey::Pubkey\n};\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n Ok(())\n}\n")),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u4fee\u590d\u4e86 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u7684\u9519\u8bef\uff0c\u4f60\u4f1a\u6ce8\u610f\u5230\u5728\u7f16\u8bd1\u4ee3\u7801\u65f6\u4ecd\u7136\u5b58\u5728\u9519\u8bef\u3002\u8fd9\u662f\u56e0\u4e3a\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u4e2d\uff0c\u6211\u4eec\u5bfc\u5165\u4e86\u4e00\u4e9b\u7a7a\u6a21\u5757\u3002\u4e0d\u8fc7\u4e0d\u7528\u62c5\u5fc3\uff0c\u6211\u4eec\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4fee\u590d\u5b83\u4eec \ud83d\ude0a \u5728\u6211\u4eec\u5f00\u59cb\u5904\u7406 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u4e2d\u7684\u4efb\u4f55\u5185\u5bb9\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u4e2d\u7f16\u5199\u51fa\u6211\u4eec\u7684\u6307\u4ee4\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u5f00\u59cb\u5b9a\u4e49\u6211\u4eec\u7684\u6307\u4ee4\u5427\u3002"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u7ee7\u7eed\u521b\u5efa\u4e00\u4e2a\u679a\u4e3e ",(0,r.kt)("inlineCode",{parentName:"p"},"StakeInstruction")," \u5e76\u5411\u5176\u4e2d\u6dfb\u52a0\u56db\u4e2a\u6307\u4ee4\u3002\u57fa\u672c\u4e0a\uff0c\u8fd9\u662f\u5b9a\u4e49\u6211\u4eec\u7684\u6307\u4ee4\u5e94\u8be5\u505a\u4ec0\u4e48\u7684\u64cd\u4f5c\u3002\u7ee7\u7eed\u5c06\u8fd9\u6bb5\u4ee3\u7801\u590d\u5236\u7c98\u8d34\u5230\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u4e2d\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// Instruction.rs\nuse solana_program::{ program_error::ProgramError };\n\npub enum StakeInstruction {\n InitializeStakeAccount,\n Stake,\n Redeem,\n Unstake\n}\n\nimpl StakeInstruction {\n pub fn unpack(input: &[u8]) -> Result {\n let (&variant, _rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n Ok(match variant {\n 0 => Self::InitializeStakeAccount,\n 1 => Self::Stake,\n 2 => Self::Redeem,\n 3 => Self::Unstake,\n _ => return Err(ProgramError::InvalidInstructionData)\n })\n }\n}\n")),(0,r.kt)("p",null,"\u6240\u4ee5\u8ba9\u6211\u4eec\u6765\u5206\u89e3\u4e00\u4e0b\u6211\u4eec\u5728\u8fd9\u91cc\u505a\u7684\u4e8b\u60c5\u3002\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u4e2d\uff0c\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u679a\u4e3e\u6765\u8868\u793a\u6bcf\u4e2a\u79bb\u6563\u7684\u6307\u4ee4\uff0c\u5e76\u521b\u5efa\u4e86\u4e00\u4e2a\u89e3\u5305\u51fd\u6570\u6765\u53cd\u5e8f\u5217\u5316\u6570\u636e\uff0c\u8fd9\u91cc\u7684\u6570\u636e\u662f\u4e00\u4e2a\u6574\u6570\u3002"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u56de\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u5e76\u5b9a\u4e49\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// processor.rs\nuse solana_program:: {\n account_info:: { AccountInfo, next_account_info },\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n}\nuse crate::instruction::StakeInstruction;\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n let instruction = StakeInstruction::unpack(instruction_data)?;\n\n match instruction {\n StakeInstruction::InitializeStakeAccount => process_initialize_stake_account(program_id, accounts),\n StakeInstruction::Stake => process_stake(program_id, accounts),\n StakeInstruction::Redeem => process_redeem(program_id, accounts),\n StakeInstruction::Unstake => process_unstake(program_id, accounts)\n }\n}\n\n/**\nWhat this function does is to create a new PDA account that's unique to you\nand your NFT. This will store the information about the state of your program\nwhich will determine whether it's staked or not staked.\n**/\nfn process_initialize_stake_account(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n let system_program = next_account_info(account_info_iter)?;\n\n Ok(())\n}\n\nfn process_stake(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n Ok(())\n}\n\nfn process_redeem(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n Ok(())\n}\n\nfn process_unstake(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n Ok(())\n}\n")),(0,r.kt)("p",null,"\u6ce8\u610f\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_initialize_stake_account")," \u51fd\u6570\u4e2d\u5b9a\u4e49\u4e86\u53d8\u91cf\uff0c\u4f46\u662f\u5b83\u5728\u4efb\u4f55\u5730\u65b9\u90fd\u6ca1\u6709\u88ab\u4f7f\u7528\uff1f\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u7ed3\u6784\u4f53\u6765\u8868\u793a\u7a0b\u5e8f\u7684\u5f53\u524d\u72b6\u6001\u3002\u6240\u4ee5\u8ba9\u6211\u4eec\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"state.rs")," \u5e76\u5b9a\u4e49\u6211\u4eec\u7684\u7ed3\u6784\u4f53\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// state.rs\nuse borsh:: { BorshSerialize, BorshDeserialize };\nuse solana_program:: {\n program_pack::{ IsInitialized, Sealed },\n pubkey::Pubkey,\n clock::UnixTimestamp\n};\n\n#[derive(BorshSerialize, BorshDeserialize, Debug)]\npub struct UserStakeInfo {\n pub is_initialized: bool,\n pub token_account: Pubkey,\n pub stake_start_time: UnixTimestamp,\n pub last_stake_redeem: UnixTimestamp,\n pub user_pubkey: Pubkey,\n pub stake_state: StakeState,\n}\n\nimpl Sealed for UserStakeInfo { }\nimpl IsInitialized for UserStakeInfo {\n fn is_initialized(&self) -> bool {\n self.is_initialized\n }\n}\n\n#[derive(BorshSerialize, BorshDeserialize, Debug, PartialEq)]\npub enum StakeState {\n Staked,\n Unstaked\n}\n")),(0,r.kt)("h2",{id:"\u81ea\u5b9a\u4e49\u9519\u8bef"},"\ud83d\udeab\u81ea\u5b9a\u4e49\u9519\u8bef"),(0,r.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"error.rs")," \u6765\u4e3a\u6211\u4eec\u7684\u7a0b\u5e8f\u5b9a\u4e49\u81ea\u5b9a\u4e49\u9519\u8bef\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// error.rs\nuse solana_program::{ program_error::ProgramError };\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum StakeError {\n #[error("Account not initialized yet")]\n UninitializedAccount,\n\n #[error("PDA derived does not equal PDA passed in")]\n InvalidPda,\n\n #[error("Invalid token account")]\n InvalidTokenAccount,\n\n #[error("Invalid stake account")]\n InvalidStakeAccount\n}\n\nimpl From for ProgramError {\n fn from(e: StakeError) -> Self {\n ProgramError::Custom(e as u32)\n }\n}\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff0c\u73b0\u5728\u4f60\u5df2\u7ecf\u6210\u529f\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"error.rs")," \u4e2d\u521b\u5efa\u4e86\u679a\u4e3e\uff0c\u5f53\u4f60\u8fd0\u884c\u7a0b\u5e8f\u65f6\u4e0d\u5e94\u8be5\u518d\u51fa\u73b0\u4efb\u4f55\u9519\u8bef\u3002"),(0,r.kt)("h2",{id:"-\u5b8c\u6210\u4ee3\u7801"},"\ud83e\uded9 \u5b8c\u6210\u4ee3\u7801"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u56de\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u5e76\u5b8c\u6210 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_initialize_stake_account")," \u51fd\u6570\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// processor.rs\nuse solana_program::{\n account_info::{ AccountInfo, next_account_info },\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg,\n sysvar::{ rent::Rent, Sysvar },\n clock::Clock,\n program_pack::IsInitialized,\n system_instruction,\n program::invoke_signed,\n borsh::try_from_slice_unchecked,\n program_error::ProgramError\n};\nuse borsh::BorshSerialize;\nuse crate::instruction::StakeInstruction;\nuse crate::error::StakeError;\nuse crate::state::{ UserStakeInfo, StakeState };\n\nfn process_initialize_stake_account(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token_account = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n let system_program = next_account_info(account_info_iter)?;\n\n let (stake_state_pda, bump_seed) = Pubkey::find_program_address(\n &[user.key.as_ref(), nft_token_account.key.as_ref()],\n program_id\n );\n\n // Check to ensure that you\'re using the right PDA\n if stake_state_pda != *stake_state.key {\n msg!("Invalid seeds for PDA");\n return Err(StakeError::InvalidPda.into());\n }\n\n let rent = Rent::get()?;\n let rent_lamports = rent.minimum_balance(UserStakeInfo::SIZE);\n\n msg!("Creating state account at {:?}", stake_state_pda);\n invoke_signed(\n &system_instruction::create_account(\n user.key,\n stake_state.key,\n rent_lamports,\n UserStakeInfo::SIZE.try_into().unwrap(),\n program_id\n ),\n &[user.clone(), stake_state.clone(), system_program.clone()],\n &[&[\n user.key.as_ref(),\n nft_token_account.key.as_ref(),\n &[bump_seed],\n ]],\n )?;\n\n // Let\'s create account\n let mut account_data = try_from_slice_unchecked::(&stake_state.data.borrow()).unwrap();\n\n if account_data.is_initialized() {\n msg!("Account already initialized");\n return Err(ProgramError::AccountAlreadyInitialized);\n }\n\n account_data.token_account = *nft_token_account.key;\n account_data.user_pubkey = *user.key;\n account_data.stake_state = StakeState::Unstaked;\n account_data.is_initialized = true;\n\n account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;\n\n Ok(())\n}\n')),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"state.rs")," \u5e76\u5b58\u50a8\u7528\u6237\u7684\u63a5\u6536\u4fe1\u606f\uff0c\u4f7f\u7528\u9002\u5f53\u7684\u6570\u636e\u5927\u5c0f\u3002\u60a8\u53ef\u4ee5\u5c06\u6b64\u4ee3\u7801\u653e\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"impl Sealed")," \u4e4b\u4e0a\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// state.rs\n\nimpl UserStakeInfo {\n /**\n Here's how we determine the size of the data. In your UserStakeInfo in struct in state.rs, we have the following data.\n\n pub is_initialized: bool, // 1 bit\n pub token_account: Pubkey, // 32 bits\n pub stake_start_time: UnixTimestamp, // 64 bits\n pub last_stake_redeem: UnixTimestamp, // 64 bits\n pub user_pubkey: Pubkey, // 32 bits\n pub stake_state: StakeState, // 1 bit\n **/\n pub const SIZE: usize = 1 + 32 + 64 + 64 + 32 + 1;\n}\n")),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u521a\u521a\u5199\u4e86\u5f88\u591a\u4ee3\u7801\u7ed9 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_initialize_stake_account")," \u3002\u5982\u679c\u4f60\u8fd8\u4e0d\u660e\u767d\uff0c\u4e0d\u8981\u62c5\u5fc3\u3002\u6211\u4eec\u5c06\u4f1a\u6dfb\u52a0\u66f4\u591a\u7684\u4ee3\u7801\u6765\u586b\u5145\u5176\u4ed6\u7684\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u8fdb\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_stake")," \u51fd\u6570\u5e76\u4f7f\u7528\u8fd9\u6bb5\u4ee3\u7801\u3002\u8bf7\u8bb0\u4f4f\uff0c\u8fd9\u53ea\u662f\u4ee3\u7801\u7684\u4e00\u90e8\u5206\uff0c\u8bf7\u4e0d\u8981\u76f2\u76ee\u590d\u5236\u7c98\u8d34\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// processor.rs\n\nfn process_stake(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token_account = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n\n let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(\n &[user.key.as_ref(), nft_token_account.key.as_ref()],\n program_id,\n );\n\n if stake_state_pda != *stake_state.key {\n msg!("Invalid seeds for PDA");\n return Err(StakeError::InvalidPda.into());\n }\n\n // Let\'s create account\n let mut account_data = try_from_slice_unchecked::(&stake_state.data.borrow()).unwrap();\n\n if !account_data.is_initialized() {\n msg!("Account not initialized");\n return Err(ProgramError::UninitializedAccount.into());\n }\n\n let clock = Clock::get()?;\n\n account_data.token_account = *nft_token_account.key;\n account_data.user_pubkey = *user.key;\n account_data.stake_state = StakeState::Staked;\n account_data.stake_start_time = clock.unix_timestamp;\n account_data.last_stake_redeem = clock.unix_timestamp;\n account_data.is_initialized = true;\n\n account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;\n\n Ok(())\n}\n')),(0,r.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\uff01\u6211\u4eec\u73b0\u5728\u5df2\u7ecf\u5b8c\u6210\u4e86\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_stake")," \u51fd\u6570\u3002\u73b0\u5728\u8ba9\u6211\u4eec\u7ee7\u7eed ",(0,r.kt)("inlineCode",{parentName:"p"},"process_redeem")," \u3002\u4ee3\u7801\u5c06\u4e0e\u524d\u4e24\u4e2a\u51fd\u6570\u975e\u5e38\u76f8\u4f3c\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// process.rs\n\nfn process_redeem(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token_account = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n\n let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(\n &[user.key.as_ref(), nft_token_account.key.as_ref()],\n program_id,\n );\n\n if stake_state_pda != *stake_state.key {\n msg!("Invalid seeds for PDA");\n return Err(StakeError::InvalidPda.into());\n }\n\n // For verification, we need to make sure it\'s the right signer\n if !user.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature);\n }\n\n // Let\'s create account\n let mut account_data = try_from_slice_unchecked::(&stake_state.data.borrow()).unwrap();\n\n if !account_data.is_initialized() {\n msg!("Account not initialized");\n return Err(ProgramError::UninitializedAccount.into());\n }\n\n if account_data.stake_state != StakeState::Staked {\n msg!("Stake account is not staking anything");\n return Err(ProgramError::InvalidArgument);\n }\n\n if *user.key != account_data.user_pubkey {\n msg!("Incorrect stake account for user");\n return Err(StakeError::InvalidStakeAccount.into());\n }\n\n if *nft_token_account.key != account_data.token_account {\n msg!("NFT Token account do not match");\n return Err(StakeError::InvalidTokenAccount.into());\n }\n\n let clock = Clock::get()?;\n let unix_time = clock.unix_timestamp - account_data.last_stake_redeem;\n let redeem_amount = unix_time;\n msg!("Redeeming {} tokens", redeem_amount);\n\n account_data.last_stake_redeem = clock.unix_timestamp;\n account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;\n\n Ok(())\n}\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff01\u6211\u4eec\u73b0\u5728\u5c31\u5feb\u5230\u4e86\u3002\u63a5\u4e0b\u6765\u8fdb\u5165\u6700\u540e\u4e00\u4e2a\u529f\u80fd ",(0,r.kt)("inlineCode",{parentName:"p"},"process_unstake")," \u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// process.rs\n\nfn process_unstake(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token_account = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n\n let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(\n &[user.key.as_ref(), nft_token_account.key.as_ref()],\n program_id,\n );\n\n if stake_state_pda != *stake_state.key {\n msg!("Invalid seeds for PDA");\n return Err(StakeError::InvalidPda.into());\n }\n\n // For verification, we need to make sure it\'s the right signer\n if !user.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature);\n }\n\n // Let\'s create account\n let mut account_data = try_from_slice_unchecked::(&stake_state.data.borrow()).unwrap();\n\n if !account_data.is_initialized() {\n msg!("Account not initialized");\n return Err(ProgramError::UninitializedAccount.into());\n }\n\n if account_data.stake_state != StakeState::Staked {\n msg!("Stake account is not staking anything");\n return Err(ProgramError::InvalidArgument)\n }\n\n let clock = Clock::get()?;\n let unix_time = clock.unix_timestamp - account_data.last_stake_redeem;\n let redeem_amount = unix_time;\n msg!("Redeeming {} tokens", redeem_amount);\n\n msg!("Setting stake state to unstaked");\n account_data.stake_state = StakeState::Unstaked;\n account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..]);\n\n Ok(())\n}\n')),(0,r.kt)("p",null,"LFG!!! \u6211\u4eec\u7ec8\u4e8e\u5b8c\u6210\u4e86\u6240\u6709\u7684\u51fd\u6570\u5b9a\u4e49\u3002\u73b0\u5728\u5982\u679c\u4f60\u8fd0\u884c\u7a0b\u5e8f\uff0c\u5b83\u5e94\u8be5\u4f1a\u663e\u793a Build successful \u3002\u592a\u68d2\u4e86\uff01\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u7b2c\u4e09\u5468\uff01HALFWAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"))}_.isMDXComponent=!0},7277:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/Pn7GlMD-bd0cf0ba002868d9f34864e390e3c200.png"},8663:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/file-structure-b1f9a3c0450b7af05b1a5f4036b31416.png"}}]); \ No newline at end of file diff --git a/assets/js/846341e5.fe086d1e.js b/assets/js/846341e5.fe086d1e.js new file mode 100644 index 000000000..28a6f4a6f --- /dev/null +++ b/assets/js/846341e5.fe086d1e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3355],{3905:(n,e,t)=>{t.d(e,{Zo:()=>l,kt:()=>m});var a=t(7294);function r(n,e,t){return e in n?Object.defineProperty(n,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[e]=t,n}function o(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(n);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),t.push.apply(t,a)}return t}function s(n){for(var e=1;e=0||(r[t]=n[t]);return r}(n,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(n,t)&&(r[t]=n[t])}return r}var c=a.createContext({}),u=function(n){var e=a.useContext(c),t=e;return n&&(t="function"==typeof n?n(e):s(s({},e),n)),t},l=function(n){var e=u(n.components);return a.createElement(c.Provider,{value:e},n.children)},p="mdxType",_={inlineCode:"code",wrapper:function(n){var e=n.children;return a.createElement(a.Fragment,{},e)}},k=a.forwardRef((function(n,e){var t=n.components,r=n.mdxType,o=n.originalType,c=n.parentName,l=i(n,["components","mdxType","originalType","parentName"]),p=u(t),k=r,m=p["".concat(c,".").concat(k)]||p[k]||_[k]||o;return t?a.createElement(m,s(s({ref:e},l),{},{components:t})):a.createElement(m,s({ref:e},l))}));function m(n,e){var t=arguments,r=e&&e.mdxType;if("string"==typeof n||r){var o=t.length,s=new Array(o);s[0]=k;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=n,i[p]="string"==typeof n?n:r,s[1]=i;for(var u=2;u{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>_,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:63,sidebar_label:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",sidebar_class_name:"green"},s="\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",i={unversionedId:"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README",id:"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README",title:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",description:"\u4eca\u5929\uff0c\u6211\u4eec\u5c06\u7f16\u5199\u6211\u4eec\u7684\u8d28\u62bc\u7a0b\u5e8f\uff0c\u5e76\u7f16\u5199\u6240\u6709\u5fc5\u8981\u7684\u8d28\u62bc\u529f\u80fd\uff0c\u800c\u4e0d\u8fdb\u884c\u4efb\u4f55\u4ee3\u5e01\u8f6c\u8d26\u3002\u6211\u5c06\u4e0e\u60a8\u4e00\u8d77\u9010\u6b65\u8bb2\u89e3\u6574\u4e2a\u8fc7\u7a0b\uff0c\u89e3\u91ca\u6bcf\u4e2a\u6b65\u9aa4\uff0c\u4ee5\u4fbf\u60a8\u4e86\u89e3\u6b63\u5728\u53d1\u751f\u7684\u4e8b\u60c5\u3002\u8ba9\u6211\u4eec\u9996\u5148\u8fdb\u5165Solana Playground\uff0c\u5728 create a new project \u4e0a\u70b9\u51fb\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a src \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e2a\u540d\u4e3a lib.rs \u7684\u6587\u4ef6\u3002",source:"@site/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README.md",sourceDirName:"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program",slug:"/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README.md",tags:[],version:"current",sidebarPosition:63,frontMatter:{sidebar_position:63,sidebar_label:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/"},next:{title:"Module4",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/"}},c={},u=[{value:"\ud83d\udeab\u81ea\u5b9a\u4e49\u9519\u8bef",id:"\u81ea\u5b9a\u4e49\u9519\u8bef",level:2},{value:"\ud83e\uded9 \u5b8c\u6210\u4ee3\u7801",id:"-\u5b8c\u6210\u4ee3\u7801",level:2}],l={toc:u},p="wrapper";function _(n){let{components:e,...o}=n;return(0,r.kt)(p,(0,a.Z)({},l,o,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\ufe0f-\u6784\u5efa\u4e00\u4e2anft\u8d28\u62bc\u8ba1\u5212"},"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212"),(0,r.kt)("p",null,"\u4eca\u5929\uff0c\u6211\u4eec\u5c06\u7f16\u5199\u6211\u4eec\u7684\u8d28\u62bc\u7a0b\u5e8f\uff0c\u5e76\u7f16\u5199\u6240\u6709\u5fc5\u8981\u7684\u8d28\u62bc\u529f\u80fd\uff0c\u800c\u4e0d\u8fdb\u884c\u4efb\u4f55\u4ee3\u5e01\u8f6c\u8d26\u3002\u6211\u5c06\u4e0e\u60a8\u4e00\u8d77\u9010\u6b65\u8bb2\u89e3\u6574\u4e2a\u8fc7\u7a0b\uff0c\u89e3\u91ca\u6bcf\u4e2a\u6b65\u9aa4\uff0c\u4ee5\u4fbf\u60a8\u4e86\u89e3\u6b63\u5728\u53d1\u751f\u7684\u4e8b\u60c5\u3002\u8ba9\u6211\u4eec\u9996\u5148\u8fdb\u5165",(0,r.kt)("a",{parentName:"p",href:"https://beta.solpg.io/?utm_source=buildspace.so&utm_medium=buildspace_project"},"Solana Playground"),"\uff0c\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"create a new project")," \u4e0a\u70b9\u51fb\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"src")," \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u7684\u6587\u4ef6\u3002"),(0,r.kt)("p",null,"\u8fd9\u5c31\u662f\u4f60\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\u5e94\u8be5\u770b\u8d77\u6765\u7684\u6837\u5b50"),(0,r.kt)("p",null,"\u76ee\u524d\uff0c\u4e3b\u8981\u76ee\u6807\u662f\u7f16\u5199\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u8ddf\u8e2a\u6bcf\u4e2a\u7528\u6237\u7684\u8d28\u62bc\u72b6\u6001\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5927\u81f4\u7684\u6b65\u9aa4\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7277).Z,width:"1503",height:"917"})),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\uff0c\u6211\u4eec\u5c06\u7ee7\u7eed\u521b\u5efa\u5269\u4f59\u7684\u6587\u4ef6\uff0c\u5c31\u50cf\u6211\u4eec\u5728\u4e4b\u524d\u7684\u8bfe\u7a0b\u4e2d\u6240\u505a\u7684\u90a3\u6837\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"src")," \u6587\u4ef6\u5939\u4e2d\u521b\u5efa\u4ee5\u4e0b5\u4e2a\u6587\u4ef6\u3002\u8fd9\u4e9b\u6587\u4ef6\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"entrypoint.rs")," \uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"error.rs")," \uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \uff0c ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"state.rs")," \u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(8663).Z,width:"185",height:"236"})),(0,r.kt)("p",null,"\u6211\u4eec\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\uff01\u73b0\u5728\u8ba9\u6211\u4eec\u7528\u4ee5\u4e0b\u4ee3\u7801\u586b\u5145\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"lib.rs")," \uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// Lib.rs\npub mod entrypoint;\npub mod error;\npub mod instruction;\npub mod processor;\npub mod state;\n")),(0,r.kt)("p",null,"\u8fdb\u5165 entrypoint.rs \u5e76\u6dfb\u52a0\u4ee5\u4e0b\u4ee3\u7801"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// Entrypoint.rs\nuse solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey\n};\nuse crate::processor;\n\n// This macro will help process all incoming instructions\nentrypoint!(process_instruction);\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n processor::process_instruction(program_id, accounts, instruction_data)?;\n Ok(())\n}\n")),(0,r.kt)("p",null,"\u5f53\u4f60\u8fd0\u884c\u4ee3\u7801\u65f6\uff0c\u4f60\u4f1a\u6ce8\u610f\u5230\u8fd9\u4f1a\u629b\u51fa\u4e00\u4e2a\u9519\u8bef\uff0c\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u4e2d\u5b9a\u4e49 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\u3002\u73b0\u5728\u8ba9\u6211\u4eec\u521b\u5efa\u8fd9\u4e2a\u51fd\u6570\u3002\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u5e76\u6dfb\u52a0\u4ee5\u4e0b\u4ee3\u7801\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// Processor.rs\nuse solana_program::{\n account_info::AccountInfo,\n entrypoint::ProgramResult,\n pubkey::Pubkey\n};\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n Ok(())\n}\n")),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u4fee\u590d\u4e86 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u7684\u9519\u8bef\uff0c\u4f60\u4f1a\u6ce8\u610f\u5230\u5728\u7f16\u8bd1\u4ee3\u7801\u65f6\u4ecd\u7136\u5b58\u5728\u9519\u8bef\u3002\u8fd9\u662f\u56e0\u4e3a\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u4e2d\uff0c\u6211\u4eec\u5bfc\u5165\u4e86\u4e00\u4e9b\u7a7a\u6a21\u5757\u3002\u4e0d\u8fc7\u4e0d\u7528\u62c5\u5fc3\uff0c\u6211\u4eec\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u4fee\u590d\u5b83\u4eec \ud83d\ude0a \u5728\u6211\u4eec\u5f00\u59cb\u5904\u7406 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u4e2d\u7684\u4efb\u4f55\u5185\u5bb9\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u4e2d\u7f16\u5199\u51fa\u6211\u4eec\u7684\u6307\u4ee4\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u5f00\u59cb\u5b9a\u4e49\u6211\u4eec\u7684\u6307\u4ee4\u5427\u3002"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u7ee7\u7eed\u521b\u5efa\u4e00\u4e2a\u679a\u4e3e ",(0,r.kt)("inlineCode",{parentName:"p"},"StakeInstruction")," \u5e76\u5411\u5176\u4e2d\u6dfb\u52a0\u56db\u4e2a\u6307\u4ee4\u3002\u57fa\u672c\u4e0a\uff0c\u8fd9\u662f\u5b9a\u4e49\u6211\u4eec\u7684\u6307\u4ee4\u5e94\u8be5\u505a\u4ec0\u4e48\u7684\u64cd\u4f5c\u3002\u7ee7\u7eed\u5c06\u8fd9\u6bb5\u4ee3\u7801\u590d\u5236\u7c98\u8d34\u5230\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u4e2d\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// Instruction.rs\nuse solana_program::{ program_error::ProgramError };\n\npub enum StakeInstruction {\n InitializeStakeAccount,\n Stake,\n Redeem,\n Unstake\n}\n\nimpl StakeInstruction {\n pub fn unpack(input: &[u8]) -> Result {\n let (&variant, _rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;\n Ok(match variant {\n 0 => Self::InitializeStakeAccount,\n 1 => Self::Stake,\n 2 => Self::Redeem,\n 3 => Self::Unstake,\n _ => return Err(ProgramError::InvalidInstructionData)\n })\n }\n}\n")),(0,r.kt)("p",null,"\u6240\u4ee5\u8ba9\u6211\u4eec\u6765\u5206\u89e3\u4e00\u4e0b\u6211\u4eec\u5728\u8fd9\u91cc\u505a\u7684\u4e8b\u60c5\u3002\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"instruction.rs")," \u4e2d\uff0c\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u679a\u4e3e\u6765\u8868\u793a\u6bcf\u4e2a\u79bb\u6563\u7684\u6307\u4ee4\uff0c\u5e76\u521b\u5efa\u4e86\u4e00\u4e2a\u89e3\u5305\u51fd\u6570\u6765\u53cd\u5e8f\u5217\u5316\u6570\u636e\uff0c\u8fd9\u91cc\u7684\u6570\u636e\u662f\u4e00\u4e2a\u6574\u6570\u3002"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u56de\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u5e76\u5b9a\u4e49\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_instruction")," \u51fd\u6570\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// processor.rs\nuse solana_program:: {\n account_info:: { AccountInfo, next_account_info },\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n}\nuse crate::instruction::StakeInstruction;\n\npub fn process_instruction(\n program_id: &Pubkey,\n accounts: &[AccountInfo],\n instruction_data: &[u8]\n) -> ProgramResult {\n let instruction = StakeInstruction::unpack(instruction_data)?;\n\n match instruction {\n StakeInstruction::InitializeStakeAccount => process_initialize_stake_account(program_id, accounts),\n StakeInstruction::Stake => process_stake(program_id, accounts),\n StakeInstruction::Redeem => process_redeem(program_id, accounts),\n StakeInstruction::Unstake => process_unstake(program_id, accounts)\n }\n}\n\n/**\nWhat this function does is to create a new PDA account that's unique to you\nand your NFT. This will store the information about the state of your program\nwhich will determine whether it's staked or not staked.\n**/\nfn process_initialize_stake_account(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n let system_program = next_account_info(account_info_iter)?;\n\n Ok(())\n}\n\nfn process_stake(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n Ok(())\n}\n\nfn process_redeem(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n Ok(())\n}\n\nfn process_unstake(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n Ok(())\n}\n")),(0,r.kt)("p",null,"\u6ce8\u610f\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_initialize_stake_account")," \u51fd\u6570\u4e2d\u5b9a\u4e49\u4e86\u53d8\u91cf\uff0c\u4f46\u662f\u5b83\u5728\u4efb\u4f55\u5730\u65b9\u90fd\u6ca1\u6709\u88ab\u4f7f\u7528\uff1f\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u7ed3\u6784\u4f53\u6765\u8868\u793a\u7a0b\u5e8f\u7684\u5f53\u524d\u72b6\u6001\u3002\u6240\u4ee5\u8ba9\u6211\u4eec\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"state.rs")," \u5e76\u5b9a\u4e49\u6211\u4eec\u7684\u7ed3\u6784\u4f53\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// state.rs\nuse borsh:: { BorshSerialize, BorshDeserialize };\nuse solana_program:: {\n program_pack::{ IsInitialized, Sealed },\n pubkey::Pubkey,\n clock::UnixTimestamp\n};\n\n#[derive(BorshSerialize, BorshDeserialize, Debug)]\npub struct UserStakeInfo {\n pub is_initialized: bool,\n pub token_account: Pubkey,\n pub stake_start_time: UnixTimestamp,\n pub last_stake_redeem: UnixTimestamp,\n pub user_pubkey: Pubkey,\n pub stake_state: StakeState,\n}\n\nimpl Sealed for UserStakeInfo { }\nimpl IsInitialized for UserStakeInfo {\n fn is_initialized(&self) -> bool {\n self.is_initialized\n }\n}\n\n#[derive(BorshSerialize, BorshDeserialize, Debug, PartialEq)]\npub enum StakeState {\n Staked,\n Unstaked\n}\n")),(0,r.kt)("h2",{id:"\u81ea\u5b9a\u4e49\u9519\u8bef"},"\ud83d\udeab\u81ea\u5b9a\u4e49\u9519\u8bef"),(0,r.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"error.rs")," \u6765\u4e3a\u6211\u4eec\u7684\u7a0b\u5e8f\u5b9a\u4e49\u81ea\u5b9a\u4e49\u9519\u8bef\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// error.rs\nuse solana_program::{ program_error::ProgramError };\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum StakeError {\n #[error("Account not initialized yet")]\n UninitializedAccount,\n\n #[error("PDA derived does not equal PDA passed in")]\n InvalidPda,\n\n #[error("Invalid token account")]\n InvalidTokenAccount,\n\n #[error("Invalid stake account")]\n InvalidStakeAccount\n}\n\nimpl From for ProgramError {\n fn from(e: StakeError) -> Self {\n ProgramError::Custom(e as u32)\n }\n}\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff0c\u73b0\u5728\u4f60\u5df2\u7ecf\u6210\u529f\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"error.rs")," \u4e2d\u521b\u5efa\u4e86\u679a\u4e3e\uff0c\u5f53\u4f60\u8fd0\u884c\u7a0b\u5e8f\u65f6\u4e0d\u5e94\u8be5\u518d\u51fa\u73b0\u4efb\u4f55\u9519\u8bef\u3002"),(0,r.kt)("h2",{id:"-\u5b8c\u6210\u4ee3\u7801"},"\ud83e\uded9 \u5b8c\u6210\u4ee3\u7801"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u56de\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"processor.rs")," \u5e76\u5b8c\u6210 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_initialize_stake_account")," \u51fd\u6570\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// processor.rs\nuse solana_program::{\n account_info::{ AccountInfo, next_account_info },\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg,\n sysvar::{ rent::Rent, Sysvar },\n clock::Clock,\n program_pack::IsInitialized,\n system_instruction,\n program::invoke_signed,\n borsh::try_from_slice_unchecked,\n program_error::ProgramError\n};\nuse borsh::BorshSerialize;\nuse crate::instruction::StakeInstruction;\nuse crate::error::StakeError;\nuse crate::state::{ UserStakeInfo, StakeState };\n\nfn process_initialize_stake_account(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token_account = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n let system_program = next_account_info(account_info_iter)?;\n\n let (stake_state_pda, bump_seed) = Pubkey::find_program_address(\n &[user.key.as_ref(), nft_token_account.key.as_ref()],\n program_id\n );\n\n // Check to ensure that you\'re using the right PDA\n if stake_state_pda != *stake_state.key {\n msg!("Invalid seeds for PDA");\n return Err(StakeError::InvalidPda.into());\n }\n\n let rent = Rent::get()?;\n let rent_lamports = rent.minimum_balance(UserStakeInfo::SIZE);\n\n msg!("Creating state account at {:?}", stake_state_pda);\n invoke_signed(\n &system_instruction::create_account(\n user.key,\n stake_state.key,\n rent_lamports,\n UserStakeInfo::SIZE.try_into().unwrap(),\n program_id\n ),\n &[user.clone(), stake_state.clone(), system_program.clone()],\n &[&[\n user.key.as_ref(),\n nft_token_account.key.as_ref(),\n &[bump_seed],\n ]],\n )?;\n\n // Let\'s create account\n let mut account_data = try_from_slice_unchecked::(&stake_state.data.borrow()).unwrap();\n\n if account_data.is_initialized() {\n msg!("Account already initialized");\n return Err(ProgramError::AccountAlreadyInitialized);\n }\n\n account_data.token_account = *nft_token_account.key;\n account_data.user_pubkey = *user.key;\n account_data.stake_state = StakeState::Unstaked;\n account_data.is_initialized = true;\n\n account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;\n\n Ok(())\n}\n')),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"state.rs")," \u5e76\u5b58\u50a8\u7528\u6237\u7684\u63a5\u6536\u4fe1\u606f\uff0c\u4f7f\u7528\u9002\u5f53\u7684\u6570\u636e\u5927\u5c0f\u3002\u60a8\u53ef\u4ee5\u5c06\u6b64\u4ee3\u7801\u653e\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"impl Sealed")," \u4e4b\u4e0a\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// state.rs\n\nimpl UserStakeInfo {\n /**\n Here's how we determine the size of the data. In your UserStakeInfo in struct in state.rs, we have the following data.\n\n pub is_initialized: bool, // 1 bit\n pub token_account: Pubkey, // 32 bits\n pub stake_start_time: UnixTimestamp, // 64 bits\n pub last_stake_redeem: UnixTimestamp, // 64 bits\n pub user_pubkey: Pubkey, // 32 bits\n pub stake_state: StakeState, // 1 bit\n **/\n pub const SIZE: usize = 1 + 32 + 64 + 64 + 32 + 1;\n}\n")),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u521a\u521a\u5199\u4e86\u5f88\u591a\u4ee3\u7801\u7ed9 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_initialize_stake_account")," \u3002\u5982\u679c\u4f60\u8fd8\u4e0d\u660e\u767d\uff0c\u4e0d\u8981\u62c5\u5fc3\u3002\u6211\u4eec\u5c06\u4f1a\u6dfb\u52a0\u66f4\u591a\u7684\u4ee3\u7801\u6765\u586b\u5145\u5176\u4ed6\u7684\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u8fdb\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_stake")," \u51fd\u6570\u5e76\u4f7f\u7528\u8fd9\u6bb5\u4ee3\u7801\u3002\u8bf7\u8bb0\u4f4f\uff0c\u8fd9\u53ea\u662f\u4ee3\u7801\u7684\u4e00\u90e8\u5206\uff0c\u8bf7\u4e0d\u8981\u76f2\u76ee\u590d\u5236\u7c98\u8d34\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// processor.rs\n\nfn process_stake(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token_account = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n\n let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(\n &[user.key.as_ref(), nft_token_account.key.as_ref()],\n program_id,\n );\n\n if stake_state_pda != *stake_state.key {\n msg!("Invalid seeds for PDA");\n return Err(StakeError::InvalidPda.into());\n }\n\n // Let\'s create account\n let mut account_data = try_from_slice_unchecked::(&stake_state.data.borrow()).unwrap();\n\n if !account_data.is_initialized() {\n msg!("Account not initialized");\n return Err(ProgramError::UninitializedAccount.into());\n }\n\n let clock = Clock::get()?;\n\n account_data.token_account = *nft_token_account.key;\n account_data.user_pubkey = *user.key;\n account_data.stake_state = StakeState::Staked;\n account_data.stake_start_time = clock.unix_timestamp;\n account_data.last_stake_redeem = clock.unix_timestamp;\n account_data.is_initialized = true;\n\n account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;\n\n Ok(())\n}\n')),(0,r.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\uff01\u6211\u4eec\u73b0\u5728\u5df2\u7ecf\u5b8c\u6210\u4e86\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"process_stake")," \u51fd\u6570\u3002\u73b0\u5728\u8ba9\u6211\u4eec\u7ee7\u7eed ",(0,r.kt)("inlineCode",{parentName:"p"},"process_redeem")," \u3002\u4ee3\u7801\u5c06\u4e0e\u524d\u4e24\u4e2a\u51fd\u6570\u975e\u5e38\u76f8\u4f3c\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// process.rs\n\nfn process_redeem(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token_account = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n\n let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(\n &[user.key.as_ref(), nft_token_account.key.as_ref()],\n program_id,\n );\n\n if stake_state_pda != *stake_state.key {\n msg!("Invalid seeds for PDA");\n return Err(StakeError::InvalidPda.into());\n }\n\n // For verification, we need to make sure it\'s the right signer\n if !user.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature);\n }\n\n // Let\'s create account\n let mut account_data = try_from_slice_unchecked::(&stake_state.data.borrow()).unwrap();\n\n if !account_data.is_initialized() {\n msg!("Account not initialized");\n return Err(ProgramError::UninitializedAccount.into());\n }\n\n if account_data.stake_state != StakeState::Staked {\n msg!("Stake account is not staking anything");\n return Err(ProgramError::InvalidArgument);\n }\n\n if *user.key != account_data.user_pubkey {\n msg!("Incorrect stake account for user");\n return Err(StakeError::InvalidStakeAccount.into());\n }\n\n if *nft_token_account.key != account_data.token_account {\n msg!("NFT Token account do not match");\n return Err(StakeError::InvalidTokenAccount.into());\n }\n\n let clock = Clock::get()?;\n let unix_time = clock.unix_timestamp - account_data.last_stake_redeem;\n let redeem_amount = unix_time;\n msg!("Redeeming {} tokens", redeem_amount);\n\n account_data.last_stake_redeem = clock.unix_timestamp;\n account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;\n\n Ok(())\n}\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff01\u6211\u4eec\u73b0\u5728\u5c31\u5feb\u5230\u4e86\u3002\u63a5\u4e0b\u6765\u8fdb\u5165\u6700\u540e\u4e00\u4e2a\u529f\u80fd ",(0,r.kt)("inlineCode",{parentName:"p"},"process_unstake")," \u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// process.rs\n\nfn process_unstake(\n program_id: &Pubkey,\n accounts: &[AccountInfo]\n) -> ProgramResult {\n let account_info_iter = &mut accounts.iter();\n let user = next_account_info(account_info_iter)?;\n let nft_token_account = next_account_info(account_info_iter)?;\n let stake_state = next_account_info(account_info_iter)?;\n\n let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(\n &[user.key.as_ref(), nft_token_account.key.as_ref()],\n program_id,\n );\n\n if stake_state_pda != *stake_state.key {\n msg!("Invalid seeds for PDA");\n return Err(StakeError::InvalidPda.into());\n }\n\n // For verification, we need to make sure it\'s the right signer\n if !user.is_signer {\n msg!("Missing required signature");\n return Err(ProgramError::MissingRequiredSignature);\n }\n\n // Let\'s create account\n let mut account_data = try_from_slice_unchecked::(&stake_state.data.borrow()).unwrap();\n\n if !account_data.is_initialized() {\n msg!("Account not initialized");\n return Err(ProgramError::UninitializedAccount.into());\n }\n\n if account_data.stake_state != StakeState::Staked {\n msg!("Stake account is not staking anything");\n return Err(ProgramError::InvalidArgument)\n }\n\n let clock = Clock::get()?;\n let unix_time = clock.unix_timestamp - account_data.last_stake_redeem;\n let redeem_amount = unix_time;\n msg!("Redeeming {} tokens", redeem_amount);\n\n msg!("Setting stake state to unstaked");\n account_data.stake_state = StakeState::Unstaked;\n account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..]);\n\n Ok(())\n}\n')),(0,r.kt)("p",null,"LFG!!! \u6211\u4eec\u7ec8\u4e8e\u5b8c\u6210\u4e86\u6240\u6709\u7684\u51fd\u6570\u5b9a\u4e49\u3002\u73b0\u5728\u5982\u679c\u4f60\u8fd0\u884c\u7a0b\u5e8f\uff0c\u5b83\u5e94\u8be5\u4f1a\u663e\u793a Build successful \u3002\u592a\u68d2\u4e86\uff01\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u7b2c\u4e09\u5468\uff01HALFWAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"))}_.isMDXComponent=!0},7277:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/Pn7GlMD-bd0cf0ba002868d9f34864e390e3c200.png"},8663:(n,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/file-structure-b1f9a3c0450b7af05b1a5f4036b31416.png"}}]); \ No newline at end of file diff --git a/assets/js/9096fd74.26b06e76.js b/assets/js/9096fd74.26b06e76.js deleted file mode 100644 index e1379138a..000000000 --- a/assets/js/9096fd74.26b06e76.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6214],{3905:(e,a,l)=>{l.d(a,{Zo:()=>s,kt:()=>k});var n=l(7294);function t(e,a,l){return a in e?Object.defineProperty(e,a,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[a]=l,e}function o(e,a){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),l.push.apply(l,n)}return l}function r(e){for(var a=1;a=0||(t[l]=e[l]);return t}(e,a);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(t[l]=e[l])}return t}var d=n.createContext({}),u=function(e){var a=n.useContext(d),l=a;return e&&(l="function"==typeof e?e(a):r(r({},a),e)),l},s=function(e){var a=u(e.components);return n.createElement(d.Provider,{value:a},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},c=n.forwardRef((function(e,a){var l=e.components,t=e.mdxType,o=e.originalType,d=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),p=u(l),c=t,k=p["".concat(d,".").concat(c)]||p[c]||m[c]||o;return l?n.createElement(k,r(r({ref:a},s),{},{components:l})):n.createElement(k,r({ref:a},s))}));function k(e,a){var l=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var o=l.length,r=new Array(o);r[0]=c;var i={};for(var d in a)hasOwnProperty.call(a,d)&&(i[d]=a[d]);i.originalType=e,i[p]="string"==typeof e?e:t,r[1]=i;for(var u=2;u{l.r(a),l.d(a,{assets:()=>d,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=l(7462),t=(l(7294),l(3905));const o={sidebar_position:1,sidebar_label:"Solana Co Learn tutorials",sidebar_class_name:"green"},r="Solana Co Learn",i={unversionedId:"Solana-Co-Learn/README",id:"Solana-Co-Learn/README",title:"Solana Co Learn",description:"Module1: Solana Module1",source:"@site/docs/Solana-Co-Learn/README.md",sourceDirName:"Solana-Co-Learn",slug:"/Solana-Co-Learn/",permalink:"/docs/Solana-Co-Learn/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/README.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,sidebar_label:"Solana Co Learn tutorials",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Start",permalink:"/docs/intro"},next:{title:"Module1",permalink:"/docs/Solana-Co-Learn/module1/"}},d={},u=[{value:"Module1: Solana Module1",id:"module1-solana-module1",level:2},{value:"\u5ba2\u6237\u7aef\u5f00\u53d1",id:"\u5ba2\u6237\u7aef\u5f00\u53d1",level:3},{value:"\u94b1\u5305\u548c\u524d\u7aef",id:"\u94b1\u5305\u548c\u524d\u7aef",level:3},{value:"\u81ea\u5b9a\u4e49\u6307\u4ee4",id:"\u81ea\u5b9a\u4e49\u6307\u4ee4",level:3},{value:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",level:3},{value:"Module2: Solana Module2",id:"module2-solana-module2",level:2},{value:"SPL token",id:"spl-token",level:3},{value:"NFTs + \u4f7f\u7528Metaplex\u8fdb\u884c\u94f8\u9020",id:"nfts--\u4f7f\u7528metaplex\u8fdb\u884c\u94f8\u9020",level:3},{value:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTs",id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts",level:3},{value:"\u521b\u9020\u795e\u5947\u7684\u7f51\u7edc\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",id:"\u521b\u9020\u795e\u5947\u7684\u7f51\u7edc\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247",level:3},{value:"Module3: Solana Module3",id:"module3-solana-module3",level:2},{value:"Introduction to Rust",id:"introduction-to-rust",level:3},{value:"Native Solana Development",id:"native-solana-development",level:3},{value:"Security and validation",id:"security-and-validation",level:3},{value:"NFT staking",id:"nft-staking",level:3},{value:"Module4: Solana Module4",id:"module4-solana-module4",level:2},{value:"Local env setup and PDAs",id:"local-env-setup-and-pdas",level:3},{value:"Cross Program Invocations",id:"cross-program-invocations",level:3},{value:"Testing",id:"testing",level:3},{value:"Ship a staking app",id:"ship-a-staking-app",level:3},{value:"Module5: Solana Module5",id:"module5-solana-module5",level:2},{value:"Introduction to Anchor",id:"introduction-to-anchor",level:3},{value:"Programs in Anchor",id:"programs-in-anchor",level:3},{value:"Anchor on the front-end",id:"anchor-on-the-front-end",level:3},{value:"A full-stack Anchor App",id:"a-full-stack-anchor-app",level:3},{value:"Module6: Solana Module6",id:"module6-solana-module6",level:2},{value:"Ship Week",id:"ship-week",level:3},{value:"Randomness",id:"randomness",level:3},{value:"Finishing touches",id:"finishing-touches",level:3},{value:"Modules: Solana Modules",id:"modules-solana-modules",level:2},{value:"Beyond the Basics",id:"beyond-the-basics",level:3},{value:"Solana\u7a0b\u5e8f\u5b89\u5168",id:"solana\u7a0b\u5e8f\u5b89\u5168",level:3},{value:"\u5176\u4ed6",id:"\u5176\u4ed6",level:3}],s={toc:u},p="wrapper";function m(e){let{components:a,...l}=e;return(0,t.kt)(p,(0,n.Z)({},s,l,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("h1",{id:"solana-co-learn"},"Solana Co Learn"),(0,t.kt)("h2",{id:"module1-solana-module1"},"Module1: Solana Module1"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"\u533a\u5757\u94fe\u57fa\u672c\u6982\u5ff5\u4ecb\u7ecd")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},(0,t.kt)("a",{parentName:"p",href:"/docs/Solana-Co-Learn/module1/local_program_development/"},"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e")),(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello"},"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello"},"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello"},"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b")))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},(0,t.kt)("a",{parentName:"p",href:"/docs/Solana-Co-Learn/module1/wallet-usage/"},"BackPack\u94b1\u5305\u4f7f\u7528")))),(0,t.kt)("h3",{id:"\u5ba2\u6237\u7aef\u5f00\u53d1"},(0,t.kt)("a",{parentName:"h3",href:"/docs/Solana-Co-Learn/module1/client-side-development/"},"\u5ba2\u6237\u7aef\u5f00\u53d1")),(0,t.kt)("h3",{id:"\u94b1\u5305\u548c\u524d\u7aef"},(0,t.kt)("a",{parentName:"h3",href:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/"},"\u94b1\u5305\u548c\u524d\u7aef")),(0,t.kt)("h3",{id:"\u81ea\u5b9a\u4e49\u6307\u4ee4"},(0,t.kt)("a",{parentName:"h3",href:"/docs/Solana-Co-Learn/module1/custom-instruction/"},"\u81ea\u5b9a\u4e49\u6307\u4ee4")),(0,t.kt)("h3",{id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"},(0,t.kt)("a",{parentName:"h3",href:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/"},"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee")),(0,t.kt)("h2",{id:"module2-solana-module2"},"Module2: Solana Module2"),(0,t.kt)("h3",{id:"spl-token"},(0,t.kt)("a",{parentName:"h3",href:"/docs/Solana-Co-Learn/module2/spl-token/"},"SPL token")),(0,t.kt)("h3",{id:"nfts--\u4f7f\u7528metaplex\u8fdb\u884c\u94f8\u9020"},(0,t.kt)("a",{parentName:"h3",href:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/"},"NFTs + \u4f7f\u7528Metaplex\u8fdb\u884c\u94f8\u9020")),(0,t.kt)("h3",{id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts"},(0,t.kt)("a",{parentName:"h3",href:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/"},"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTs")),(0,t.kt)("h3",{id:"\u521b\u9020\u795e\u5947\u7684\u7f51\u7edc\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247"},(0,t.kt)("a",{parentName:"h3",href:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/"},"\u521b\u9020\u795e\u5947\u7684\u7f51\u7edc\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247")),(0,t.kt)("h2",{id:"module3-solana-module3"},"Module3: Solana Module3"),(0,t.kt)("h3",{id:"introduction-to-rust"},"Introduction to Rust"),(0,t.kt)("h3",{id:"native-solana-development"},"Native Solana Development"),(0,t.kt)("h3",{id:"security-and-validation"},"Security and validation"),(0,t.kt)("h3",{id:"nft-staking"},"NFT staking"),(0,t.kt)("h2",{id:"module4-solana-module4"},"Module4: Solana Module4"),(0,t.kt)("h3",{id:"local-env-setup-and-pdas"},"Local env setup and PDAs"),(0,t.kt)("h3",{id:"cross-program-invocations"},"Cross Program Invocations"),(0,t.kt)("h3",{id:"testing"},"Testing"),(0,t.kt)("h3",{id:"ship-a-staking-app"},"Ship a staking app"),(0,t.kt)("h2",{id:"module5-solana-module5"},"Module5: Solana Module5"),(0,t.kt)("h3",{id:"introduction-to-anchor"},"Introduction to Anchor"),(0,t.kt)("h3",{id:"programs-in-anchor"},"Programs in Anchor"),(0,t.kt)("h3",{id:"anchor-on-the-front-end"},"Anchor on the front-end"),(0,t.kt)("h3",{id:"a-full-stack-anchor-app"},"A full-stack Anchor App"),(0,t.kt)("h2",{id:"module6-solana-module6"},"Module6: Solana Module6"),(0,t.kt)("h3",{id:"ship-week"},"Ship Week"),(0,t.kt)("h3",{id:"randomness"},"Randomness"),(0,t.kt)("h3",{id:"finishing-touches"},"Finishing touches"),(0,t.kt)("h2",{id:"modules-solana-modules"},"Modules: Solana Modules"),(0,t.kt)("h3",{id:"beyond-the-basics"},"Beyond the Basics"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Solana\u7a0b\u5e8f\u4e2d\u7684\u73af\u5883\u53d8\u91cf"),(0,t.kt)("li",{parentName:"ul"},"Solana Pay"),(0,t.kt)("li",{parentName:"ul"},"\u7248\u672c\u5316\u7684\u4e8b\u52a1\u548c\u67e5\u627e\u8868"),(0,t.kt)("li",{parentName:"ul"},"Rust\u8fc7\u7a0b\u5b8f")),(0,t.kt)("h3",{id:"solana\u7a0b\u5e8f\u5b89\u5168"},"Solana\u7a0b\u5e8f\u5b89\u5168"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5904\u7406\u7a0b\u5e8f\u5b89\u5168\u6a21\u5757"),(0,t.kt)("li",{parentName:"ul"},"\u7b7e\u540d\u4eba\u6388\u6743"),(0,t.kt)("li",{parentName:"ul"},"Owner check"),(0,t.kt)("li",{parentName:"ul"},"\u8d26\u6237\u6570\u636e\u5339\u914d"),(0,t.kt)("li",{parentName:"ul"},"\u91cd\u65b0\u521d\u59cb\u5316\u653b\u51fb"),(0,t.kt)("li",{parentName:"ul"},"\u91cd\u590d\u7684\u53ef\u53d8\u8d26\u6237"),(0,t.kt)("li",{parentName:"ul"},"Type cosplay"),(0,t.kt)("li",{parentName:"ul"},"Arbitrary CPIs"),(0,t.kt)("li",{parentName:"ul"},"\u78b0\u649e\u79cd\u5b50\u89c4\u8303\u5316"),(0,t.kt)("li",{parentName:"ul"},"\u5173\u95ed\u8d26\u6237\u548c\u6062\u590d\u653b\u51fb"),(0,t.kt)("li",{parentName:"ul"},"PDA sharing")),(0,t.kt)("h3",{id:"\u5176\u4ed6"},"\u5176\u4ed6"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"\u4f7f\u7528Solidity \u7f16\u5199Solana\u5408\u7ea6",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Solidity \u4e0ePDAs"),(0,t.kt)("li",{parentName:"ul"},"Solidity \u4e0e CPIs"))),(0,t.kt)("li",{parentName:"ul"},"token2020 token\u5982\u4f55\u53d1\u884c"),(0,t.kt)("li",{parentName:"ul"},"Compression NFT \u5982\u4f55\u53d1\u884c"),(0,t.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728Solana\u4e2d\u4f7f\u7528The Graph"),(0,t.kt)("li",{parentName:"ul"},"Oracles Pyth sdk\u7684\u4f7f\u7528"),(0,t.kt)("li",{parentName:"ul"},"TipLink \u5982\u4f55\u4f7f\u7528"),(0,t.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728quicknode\u7533\u8bf7RPC endpoint"),(0,t.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728helius\u7533\u8bf7RPC endpoint"),(0,t.kt)("li",{parentName:"ul"},"etc ...")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9096fd74.f13566a7.js b/assets/js/9096fd74.f13566a7.js new file mode 100644 index 000000000..3a30128d9 --- /dev/null +++ b/assets/js/9096fd74.f13566a7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6214],{3905:(e,a,l)=>{l.d(a,{Zo:()=>s,kt:()=>k});var n=l(7294);function o(e,a,l){return a in e?Object.defineProperty(e,a,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[a]=l,e}function t(e,a){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),l.push.apply(l,n)}return l}function r(e){for(var a=1;a=0||(o[l]=e[l]);return o}(e,a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(o[l]=e[l])}return o}var d=n.createContext({}),u=function(e){var a=n.useContext(d),l=a;return e&&(l="function"==typeof e?e(a):r(r({},a),e)),l},s=function(e){var a=u(e.components);return n.createElement(d.Provider,{value:a},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},c=n.forwardRef((function(e,a){var l=e.components,o=e.mdxType,t=e.originalType,d=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),p=u(l),c=o,k=p["".concat(d,".").concat(c)]||p[c]||m[c]||t;return l?n.createElement(k,r(r({ref:a},s),{},{components:l})):n.createElement(k,r({ref:a},s))}));function k(e,a){var l=arguments,o=a&&a.mdxType;if("string"==typeof e||o){var t=l.length,r=new Array(t);r[0]=c;var i={};for(var d in a)hasOwnProperty.call(a,d)&&(i[d]=a[d]);i.originalType=e,i[p]="string"==typeof e?e:o,r[1]=i;for(var u=2;u{l.r(a),l.d(a,{assets:()=>d,contentTitle:()=>r,default:()=>m,frontMatter:()=>t,metadata:()=>i,toc:()=>u});var n=l(7462),o=(l(7294),l(3905));const t={sidebar_position:1,sidebar_label:"Solana Co Learn tutorials",sidebar_class_name:"green"},r="Solana Co Learn",i={unversionedId:"Solana-Co-Learn/README",id:"Solana-Co-Learn/README",title:"Solana Co Learn",description:"Module1: Solana Module1",source:"@site/docs/Solana-Co-Learn/README.md",sourceDirName:"Solana-Co-Learn",slug:"/Solana-Co-Learn/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/README.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,sidebar_label:"Solana Co Learn tutorials",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Start",permalink:"/all-in-one-solana/docs/intro"},next:{title:"Module1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/"}},d={},u=[{value:"Module1: Solana Module1",id:"module1-solana-module1",level:2},{value:"\u5ba2\u6237\u7aef\u5f00\u53d1",id:"\u5ba2\u6237\u7aef\u5f00\u53d1",level:3},{value:"\u94b1\u5305\u548c\u524d\u7aef",id:"\u94b1\u5305\u548c\u524d\u7aef",level:3},{value:"\u81ea\u5b9a\u4e49\u6307\u4ee4",id:"\u81ea\u5b9a\u4e49\u6307\u4ee4",level:3},{value:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",level:3},{value:"Module2: Solana Module2",id:"module2-solana-module2",level:2},{value:"SPL token",id:"spl-token",level:3},{value:"NFTs + \u4f7f\u7528Metaplex\u8fdb\u884c\u94f8\u9020",id:"nfts--\u4f7f\u7528metaplex\u8fdb\u884c\u94f8\u9020",level:3},{value:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTs",id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts",level:3},{value:"\u521b\u9020\u795e\u5947\u7684\u7f51\u7edc\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",id:"\u521b\u9020\u795e\u5947\u7684\u7f51\u7edc\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247",level:3},{value:"Module3: Solana Module3",id:"module3-solana-module3",level:2},{value:"Introduction to Rust",id:"introduction-to-rust",level:3},{value:"Native Solana Development",id:"native-solana-development",level:3},{value:"Security and validation",id:"security-and-validation",level:3},{value:"NFT staking",id:"nft-staking",level:3},{value:"Module4: Solana Module4",id:"module4-solana-module4",level:2},{value:"Local env setup and PDAs",id:"local-env-setup-and-pdas",level:3},{value:"Cross Program Invocations",id:"cross-program-invocations",level:3},{value:"Testing",id:"testing",level:3},{value:"Ship a staking app",id:"ship-a-staking-app",level:3},{value:"Module5: Solana Module5",id:"module5-solana-module5",level:2},{value:"Introduction to Anchor",id:"introduction-to-anchor",level:3},{value:"Programs in Anchor",id:"programs-in-anchor",level:3},{value:"Anchor on the front-end",id:"anchor-on-the-front-end",level:3},{value:"A full-stack Anchor App",id:"a-full-stack-anchor-app",level:3},{value:"Module6: Solana Module6",id:"module6-solana-module6",level:2},{value:"Ship Week",id:"ship-week",level:3},{value:"Randomness",id:"randomness",level:3},{value:"Finishing touches",id:"finishing-touches",level:3},{value:"Modules: Solana Modules",id:"modules-solana-modules",level:2},{value:"Beyond the Basics",id:"beyond-the-basics",level:3},{value:"Solana\u7a0b\u5e8f\u5b89\u5168",id:"solana\u7a0b\u5e8f\u5b89\u5168",level:3},{value:"\u5176\u4ed6",id:"\u5176\u4ed6",level:3}],s={toc:u},p="wrapper";function m(e){let{components:a,...l}=e;return(0,o.kt)(p,(0,n.Z)({},s,l,{components:a,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"solana-co-learn"},"Solana Co Learn"),(0,o.kt)("h2",{id:"module1-solana-module1"},"Module1: Solana Module1"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"\u533a\u5757\u94fe\u57fa\u672c\u6982\u5ff5\u4ecb\u7ecd")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/"},"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e")),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello"},"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello"},"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello"},"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b")))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("a",{parentName:"p",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallet-usage/"},"BackPack\u94b1\u5305\u4f7f\u7528")))),(0,o.kt)("h3",{id:"\u5ba2\u6237\u7aef\u5f00\u53d1"},(0,o.kt)("a",{parentName:"h3",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/"},"\u5ba2\u6237\u7aef\u5f00\u53d1")),(0,o.kt)("h3",{id:"\u94b1\u5305\u548c\u524d\u7aef"},(0,o.kt)("a",{parentName:"h3",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/"},"\u94b1\u5305\u548c\u524d\u7aef")),(0,o.kt)("h3",{id:"\u81ea\u5b9a\u4e49\u6307\u4ee4"},(0,o.kt)("a",{parentName:"h3",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/"},"\u81ea\u5b9a\u4e49\u6307\u4ee4")),(0,o.kt)("h3",{id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"},(0,o.kt)("a",{parentName:"h3",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/"},"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee")),(0,o.kt)("h2",{id:"module2-solana-module2"},"Module2: Solana Module2"),(0,o.kt)("h3",{id:"spl-token"},(0,o.kt)("a",{parentName:"h3",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/"},"SPL token")),(0,o.kt)("h3",{id:"nfts--\u4f7f\u7528metaplex\u8fdb\u884c\u94f8\u9020"},(0,o.kt)("a",{parentName:"h3",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/"},"NFTs + \u4f7f\u7528Metaplex\u8fdb\u884c\u94f8\u9020")),(0,o.kt)("h3",{id:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793anfts"},(0,o.kt)("a",{parentName:"h3",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/"},"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTs")),(0,o.kt)("h3",{id:"\u521b\u9020\u795e\u5947\u7684\u7f51\u7edc\u8d27\u5e01\u5e76\u51fa\u552ejpeg\u56fe\u7247"},(0,o.kt)("a",{parentName:"h3",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/"},"\u521b\u9020\u795e\u5947\u7684\u7f51\u7edc\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247")),(0,o.kt)("h2",{id:"module3-solana-module3"},"Module3: Solana Module3"),(0,o.kt)("h3",{id:"introduction-to-rust"},"Introduction to Rust"),(0,o.kt)("h3",{id:"native-solana-development"},"Native Solana Development"),(0,o.kt)("h3",{id:"security-and-validation"},"Security and validation"),(0,o.kt)("h3",{id:"nft-staking"},"NFT staking"),(0,o.kt)("h2",{id:"module4-solana-module4"},"Module4: Solana Module4"),(0,o.kt)("h3",{id:"local-env-setup-and-pdas"},"Local env setup and PDAs"),(0,o.kt)("h3",{id:"cross-program-invocations"},"Cross Program Invocations"),(0,o.kt)("h3",{id:"testing"},"Testing"),(0,o.kt)("h3",{id:"ship-a-staking-app"},"Ship a staking app"),(0,o.kt)("h2",{id:"module5-solana-module5"},"Module5: Solana Module5"),(0,o.kt)("h3",{id:"introduction-to-anchor"},"Introduction to Anchor"),(0,o.kt)("h3",{id:"programs-in-anchor"},"Programs in Anchor"),(0,o.kt)("h3",{id:"anchor-on-the-front-end"},"Anchor on the front-end"),(0,o.kt)("h3",{id:"a-full-stack-anchor-app"},"A full-stack Anchor App"),(0,o.kt)("h2",{id:"module6-solana-module6"},"Module6: Solana Module6"),(0,o.kt)("h3",{id:"ship-week"},"Ship Week"),(0,o.kt)("h3",{id:"randomness"},"Randomness"),(0,o.kt)("h3",{id:"finishing-touches"},"Finishing touches"),(0,o.kt)("h2",{id:"modules-solana-modules"},"Modules: Solana Modules"),(0,o.kt)("h3",{id:"beyond-the-basics"},"Beyond the Basics"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Solana\u7a0b\u5e8f\u4e2d\u7684\u73af\u5883\u53d8\u91cf"),(0,o.kt)("li",{parentName:"ul"},"Solana Pay"),(0,o.kt)("li",{parentName:"ul"},"\u7248\u672c\u5316\u7684\u4e8b\u52a1\u548c\u67e5\u627e\u8868"),(0,o.kt)("li",{parentName:"ul"},"Rust\u8fc7\u7a0b\u5b8f")),(0,o.kt)("h3",{id:"solana\u7a0b\u5e8f\u5b89\u5168"},"Solana\u7a0b\u5e8f\u5b89\u5168"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5904\u7406\u7a0b\u5e8f\u5b89\u5168\u6a21\u5757"),(0,o.kt)("li",{parentName:"ul"},"\u7b7e\u540d\u4eba\u6388\u6743"),(0,o.kt)("li",{parentName:"ul"},"Owner check"),(0,o.kt)("li",{parentName:"ul"},"\u8d26\u6237\u6570\u636e\u5339\u914d"),(0,o.kt)("li",{parentName:"ul"},"\u91cd\u65b0\u521d\u59cb\u5316\u653b\u51fb"),(0,o.kt)("li",{parentName:"ul"},"\u91cd\u590d\u7684\u53ef\u53d8\u8d26\u6237"),(0,o.kt)("li",{parentName:"ul"},"Type cosplay"),(0,o.kt)("li",{parentName:"ul"},"Arbitrary CPIs"),(0,o.kt)("li",{parentName:"ul"},"\u78b0\u649e\u79cd\u5b50\u89c4\u8303\u5316"),(0,o.kt)("li",{parentName:"ul"},"\u5173\u95ed\u8d26\u6237\u548c\u6062\u590d\u653b\u51fb"),(0,o.kt)("li",{parentName:"ul"},"PDA sharing")),(0,o.kt)("h3",{id:"\u5176\u4ed6"},"\u5176\u4ed6"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u4f7f\u7528Solidity \u7f16\u5199Solana\u5408\u7ea6",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Solidity \u4e0ePDAs"),(0,o.kt)("li",{parentName:"ul"},"Solidity \u4e0e CPIs"))),(0,o.kt)("li",{parentName:"ul"},"token2020 token\u5982\u4f55\u53d1\u884c"),(0,o.kt)("li",{parentName:"ul"},"Compression NFT \u5982\u4f55\u53d1\u884c"),(0,o.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728Solana\u4e2d\u4f7f\u7528The Graph"),(0,o.kt)("li",{parentName:"ul"},"Oracles Pyth sdk\u7684\u4f7f\u7528"),(0,o.kt)("li",{parentName:"ul"},"TipLink \u5982\u4f55\u4f7f\u7528"),(0,o.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728quicknode\u7533\u8bf7RPC endpoint"),(0,o.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728helius\u7533\u8bf7RPC endpoint"),(0,o.kt)("li",{parentName:"ul"},"etc ...")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/918f4956.4f18ba69.js b/assets/js/918f4956.4f18ba69.js deleted file mode 100644 index fc5cb5e2a..000000000 --- a/assets/js/918f4956.4f18ba69.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9720],{3905:(e,n,a)=>{a.d(n,{Zo:()=>s,kt:()=>g});var t=a(7294);function l(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function o(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function r(e){for(var n=1;n=0||(l[a]=e[a]);return l}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=t.createContext({}),c=function(e){var n=t.useContext(p),a=n;return e&&(a="function"==typeof e?e(n):r(r({},n),e)),a},s=function(e){var n=c(e.components);return t.createElement(p.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},m=t.forwardRef((function(e,n){var a=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=c(a),m=l,g=u["".concat(p,".").concat(m)]||u[m]||d[m]||o;return a?t.createElement(g,r(r({ref:n},s),{},{components:a})):t.createElement(g,r({ref:n},s))}));function g(e,n){var a=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var o=a.length,r=new Array(o);r[0]=m;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[u]="string"==typeof e?e:l,r[1]=i;for(var c=2;c{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var t=a(7462),l=(a(7294),a(3905));const o={sidebar_position:10,sidebar_label:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},r="\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",i={unversionedId:"Solana-Co-Learn/module1/local_program_development/solang_program_hello",id:"Solana-Co-Learn/module1/local_program_development/solang_program_hello",title:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",description:"\u6b22\u8fce\u6765\u5230Solana\u5165\u95e8\u6307\u5357\uff01Solang\u662f\u4e00\u4e2aSolidity\u7f16\u8bd1\u5668\uff0c\u5b83\u5141\u8bb8\u60a8\u4f7f\u7528Solidity\u7f16\u7a0b\u8bed\u8a00\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u5176\u4ed6\u533a\u5757\u94fe\u4e2d\u79f0\u4e3a\u201c\u667a\u80fd\u5408\u7ea6\u201d\u3002",source:"@site/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello.md",sourceDirName:"Solana-Co-Learn/module1/local_program_development",slug:"/Solana-Co-Learn/module1/local_program_development/solang_program_hello",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_position:10,sidebar_label:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello"},next:{title:"\u5ba2\u6237\u7aef\u5f00\u53d1",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/"}},p={},c=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee",id:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee",level:2},{value:"\u94fe\u4e0a\u7a0b\u5e8f\u6982\u8ff0",id:"\u94fe\u4e0a\u7a0b\u5e8f\u6982\u8ff0",level:2},{value:"\u91cd\u8981\u7684\u5dee\u5f02",id:"\u91cd\u8981\u7684\u5dee\u5f02",level:3},{value:"\u72b6\u6001\u6570\u636e\u7684\u5b58\u50a8",id:"\u72b6\u6001\u6570\u636e\u7684\u5b58\u50a8",level:3},{value:"\u6d4b\u8bd5\u6587\u4ef6\u6982\u8ff0",id:"\u6d4b\u8bd5\u6587\u4ef6\u6982\u8ff0",level:2},{value:"\u4e0b\u4e00\u6b65",id:"\u4e0b\u4e00\u6b65",level:2}],s={toc:c},u="wrapper";function d(e){let{components:n,...a}=e;return(0,l.kt)(u,(0,t.Z)({},s,a,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"\u4f7f\u7528solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0hello-world"},"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b"),(0,l.kt)("p",null,"\u6b22\u8fce\u6765\u5230Solana\u5165\u95e8\u6307\u5357\uff01Solang\u662f\u4e00\u4e2aSolidity\u7f16\u8bd1\u5668\uff0c\u5b83\u5141\u8bb8\u60a8\u4f7f\u7528Solidity\u7f16\u7a0b\u8bed\u8a00\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u5176\u4ed6\u533a\u5757\u94fe\u4e2d\u79f0\u4e3a\u201c\u667a\u80fd\u5408\u7ea6\u201d\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u4f60\u662f\u4e00\u4f4d\u5bf9Solana\u7f51\u7edc\u7684\u9ad8\u901f\u548c\u4f4e\u8d39\u7528\u611f\u5174\u8da3\u7684EVM\u5f00\u53d1\u8005\uff0c\u90a3\u4e48Solang\u662f\u4f60\u7684\u5b8c\u7f8e\u5de5\u5177\u3002\u901a\u8fc7Solang\uff0c\u4f60\u53ef\u4ee5\u5229\u7528\u4f60\u5bf9Solidity\u7684\u73b0\u6709\u77e5\u8bc6\u5f00\u59cb\u5728Solana\u4e0a\u8fdb\u884c\u6784\u5efa\uff01"),(0,l.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,l.kt)("p",null,"\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u5e2e\u52a9\u60a8\u8bbe\u7f6eSolang\u7684\u5f00\u53d1\u73af\u5883\u3002\u53ea\u9700\u6309\u7167\u4e0b\u9762\u5217\u51fa\u7684\u6b65\u9aa4\u8fdb\u884c\u64cd\u4f5c\u5373\u53ef\uff1a"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"\u68c0\u67e5\u5148\u51b3\u6761\u4ef6\uff1a\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u7684\u7cfb\u7edf\u4e0a\u5df2\u5b89\u88c5\u4e86",(0,l.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/tools/install"},"Rust"),"\u548c",(0,l.kt)("a",{parentName:"p",href:"https://nodejs.org/en"},"Node.js"),"\u3002Windows\u7528\u6237\u8fd8\u9700\u8981\u8bbe\u7f6e\u597d",(0,l.kt)("a",{parentName:"p",href:"https://solana.com/developers/guides/setup-local-development#windows-users-only"},"Windows\u5b50\u7cfb\u7edf"),"\u4ee5\u4fbf\u8fd0\u884cLinux\u3002")),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"Solana\u5de5\u5177\u5957\u4ef6\u5b89\u88c5\uff1a\u9996\u5148\u5b89\u88c5",(0,l.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"Solana\u5de5\u5177\u5957\u4ef6"),"\uff0c\u5176\u4e2d\u5305\u62ecSolana\u547d\u4ee4\u884c\u754c\u9762\uff08CLI\uff09\u548c\u6700\u65b0\u7248\u672c\u7684Solang\u3002")),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"Anchor\u6846\u67b6\u5b89\u88c5\uff1a\u63a5\u4e0b\u6765\uff0c",(0,l.kt)("a",{parentName:"p",href:"https://www.anchor-lang.com/docs/installation"},"\u5b89\u88c5Anchor\u6846\u67b6"),"\u3002Anchor\u662fSolana\u751f\u6001\u7cfb\u7edf\u4e2d\u5e7f\u6cdb\u4f7f\u7528\u7684\u6846\u67b6\uff0c\u53ef\u4ee5\u7b80\u5316\u6784\u5efaSolana\u7a0b\u5e8f\u7684\u8fc7\u7a0b\u3002\u4ece0.28\u7248\u672c\u5f00\u59cb\uff0c\u60a8\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7Anchor\u5f00\u59cb\u4f7f\u7528Solang\u8fdb\u884c\u6784\u5efa\u3002"))),(0,l.kt)("p",null,"\u622a\u81f3\u64b0\u5199\u672c\u6587\u65f6\uff0c\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5Anchor\uff0c\u4ee5\u786e\u4fdd\u4e0eSolang\u7248\u672c0.3.1\u517c\u5bb9\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"cargo install --git https://github.com/coral-xyz/anchor anchor-cli --locked --force\n")),(0,l.kt)("ol",{start:4},(0,l.kt)("li",{parentName:"ol"},"Solang\u6269\u5c55\u9002\u7528\u4e8eVSCode\uff1a\u5982\u679c\u60a8\u662fVisual Studio Code\uff08VSCode\uff09\u7684\u7528\u6237\uff0c\u5efa\u8bae\u5b89\u88c5",(0,l.kt)("a",{parentName:"li",href:"https://marketplace.visualstudio.com/items?itemName=solang.solang"},"Solang\u6269\u5c55"),"\u4ee5\u8f85\u52a9\u8bed\u6cd5\u9ad8\u4eae\u663e\u793a\u3002\u8bf7\u8bb0\u5f97\u7981\u7528\u4efb\u4f55\u6d3b\u52a8\u7684Solidity\u6269\u5c55\uff0c\u4ee5\u786e\u4fddSolang\u6269\u5c55\u6b63\u5e38\u5de5\u4f5c\u3002")),(0,l.kt)("h2",{id:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee"),(0,l.kt)("p",null,"\u4e00\u65e6\u60a8\u5b89\u88c5\u4e86Solana CLI\u548cAnchor\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"anchor init project_name --solidity\n")),(0,l.kt)("p",null,"\u8be5\u547d\u4ee4\u751f\u6210\u4e00\u4e2a\u65b0\u9879\u76ee\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e2a\u57fa\u672c\u7684Solang on-chain\u7a0b\u5e8f\uff08\u76f8\u5f53\u4e8eEVM\u4e0a\u7684\u667a\u80fd\u5408\u7ea6\uff09\u548c\u4e00\u4e2a\u6d4b\u8bd5\u6587\u4ef6\uff0c\u6f14\u793a\u4e86\u5982\u4f55\u4ece\u5ba2\u6237\u7aef\u4e0e\u8be5\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,l.kt)("h2",{id:"\u94fe\u4e0a\u7a0b\u5e8f\u6982\u8ff0"},"\u94fe\u4e0a\u7a0b\u5e8f\u6982\u8ff0"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u4ece\u94fe\u4e0a\u7a0b\u5e8f\u672c\u8eab\u5f00\u59cb\u7684\u521d\u59cb\u4ee3\u7801\u3002\u5728\u60a8\u7684\u9879\u76ee\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"./solidity")," \u76ee\u5f55\u4e2d\uff0c\u60a8\u5c06\u627e\u5230\u4e0b\u9762\u7684\u5408\u7ea6\uff0c\u5176\u4e2d\u5305\u62ec\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"li"},"constructor")," \u7528\u4e8e\u521d\u59cb\u5316\u72b6\u6001\u53d8\u91cf\u7684\u51fd\u6570"),(0,l.kt)("li",{parentName:"ul"},"\u4e00\u4e2a\u7528\u4e8e\u5c06\u6d88\u606f\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u7684\u51fd\u6570"),(0,l.kt)("li",{parentName:"ul"},"\u4e00\u4e2a\u7528\u4e8e\u66f4\u65b0\u72b6\u6001\u53d8\u91cf\u7684\u51fd\u6570"),(0,l.kt)("li",{parentName:"ul"},"\u4e00\u4e2a\u51fd\u6570\uff0c\u7528\u4e8e\u8fd4\u56de\u72b6\u6001\u53d8\u91cf\u7684\u5f53\u524d\u503c")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-solidity"},'@program_id("F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC")\ncontract starter {\n bool private value = true;\n\n @payer(payer)\n constructor(address payer) {\n print("Hello, World!");\n }\n\n /// A message that can be called on instantiated contracts.\n /// This one flips the value of the stored `bool` from `true`\n /// to `false` and vice versa.\n function flip() public {\n value = !value;\n }\n\n /// Simply returns the current value of our `bool`.\n function get() public view returns (bool) {\n return value;\n }\n}\n')),(0,l.kt)("h3",{id:"\u91cd\u8981\u7684\u5dee\u5f02"},"\u91cd\u8981\u7684\u5dee\u5f02"),(0,l.kt)("p",null,"\u4e0eEVM\u667a\u80fd\u5408\u7ea6\u76f8\u6bd4\uff0c\u4f60\u53ef\u80fd\u4f1a\u6ce8\u610f\u5230\u4e24\u4e2a\u91cd\u8981\u7684\u533a\u522b\uff1a"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("inlineCode",{parentName:"li"},"@program_id")," \u6ce8\u89e3\uff1a\n\u5728Solana\u4e0a\uff0c\u667a\u80fd\u5408\u7ea6\u88ab\u79f0\u4e3a\u201c\u7a0b\u5e8f\u201d\u3002\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"@program_id")," \u6ce8\u91ca\u6765\u6307\u5b9a\u7a0b\u5e8f\u7684\u94fe\u4e0a\u5730\u5740\u3002")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-solidity"},'@program_id("F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC") // on-chain program address\n')),(0,l.kt)("ol",{start:2},(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("inlineCode",{parentName:"li"},"@payer")," \u6ce8\u89e3\uff1a")),(0,l.kt)("p",null,"\u5728\u94fe\u4e0a\u5b58\u50a8\u6570\u636e\u65f6\uff0c\u9700\u8981\u5206\u914d\u4e00\u5b9a\u6570\u91cf\u7684SOL\u6765\u652f\u4ed8\u5b58\u50a8\u6210\u672c\u3002\u6ce8\u91ca ",(0,l.kt)("inlineCode",{parentName:"p"},"@payer")," \u6307\u5b9a\u4e86\u5c06\u652f\u4ed8\u6240\u9700SOL\u4ee5\u521b\u5efa\u7528\u4e8e\u5b58\u50a8\u72b6\u6001\u53d8\u91cf\u7684\u8d26\u6237\u7684\u7528\u6237\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-solidity"},'@payer(payer) // payer for the "data account"\nconstructor(address payer) {\n print("Hello, World!");\n}\n')),(0,l.kt)("h3",{id:"\u72b6\u6001\u6570\u636e\u7684\u5b58\u50a8"},"\u72b6\u6001\u6570\u636e\u7684\u5b58\u50a8"),(0,l.kt)("p",null,"EVM\u667a\u80fd\u5408\u7ea6\u548cSolana\u7a0b\u5e8f\u4e4b\u95f4\u7684\u4e00\u4e2a\u91cd\u8981\u533a\u522b\u5728\u4e8e\u5b83\u4eec\u5982\u4f55\u5b58\u50a8\u201c\u72b6\u6001\u201d\u53d8\u91cf/\u6570\u636e\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"EVM\u667a\u80fd\u5408\u7ea6\u53ef\u4ee5\u76f4\u63a5\u5b58\u50a8\u72b6\u6001\u53d8\u91cf\u3002"),(0,l.kt)("li",{parentName:"ul"},"Solana\u7684\u94fe\u4e0a\u7a0b\u5e8f\u5219\u4f1a\u521b\u5efa\u5355\u72ec\u7684\u8d26\u6237\u6765\u5b58\u50a8\u72b6\u6001\u6570\u636e\u3002\u8fd9\u4e9b\u8d26\u6237\u901a\u5e38\u88ab\u79f0\u4e3a\u201c\u6570\u636e\u8d26\u6237\u201d\uff0c\u5e76\u4e14\u662f\u7531\u7a0b\u5e8f\u201c\u62e5\u6709\u201d\u3002")),(0,l.kt)("p",null,"\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u5f53\u5408\u7ea6\u90e8\u7f72\u65f6\uff0c\u5b83\u88ab\u90e8\u7f72\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"@program_id")," \u4e2d\u6307\u5b9a\u7684\u5730\u5740\u3002\u5f53\u7a0b\u5e8f\u90e8\u7f72\u540e\u8c03\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"constructor")," \u65f6\uff0c\u4f1a\u521b\u5efa\u4e00\u4e2a\u72ec\u7acb\u7684\u5e10\u6237\uff0c\u7528\u4e8e\u5b58\u50a8\u72b6\u6001\u53d8\u91cf\uff0c\u800c\u4e0d\u662f\u5b58\u50a8\u5728\u5408\u7ea6\u672c\u8eab\u5185\u90e8\u3002"),(0,l.kt)("p",null,"\u8fd9\u53ef\u80fd\u542c\u8d77\u6765\u6709\u70b9\u4e0d\u540c\u4e8e\u4f60\u6240\u4e60\u60ef\u7684\uff0c\u4f46\u522b\u62c5\u5fc3\uff01\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u6d4b\u8bd5\u6587\u4ef6\uff0c\u4ee5\u66f4\u597d\u5730\u7406\u89e3\u8fd9\u4e2a\u6982\u5ff5\u3002"),(0,l.kt)("h2",{id:"\u6d4b\u8bd5\u6587\u4ef6\u6982\u8ff0"},"\u6d4b\u8bd5\u6587\u4ef6\u6982\u8ff0"),(0,l.kt)("p",null,"\u8d77\u59cb\u6d4b\u8bd5\u6587\u4ef6\u53ef\u4ee5\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"./tests")," \u76ee\u5f55\u4e2d\u627e\u5230\u3002\u8be5\u6587\u4ef6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u4e0e\u5ba2\u6237\u7aef\u4ea4\u4e92\u7684\u793a\u4f8b\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"Anchor"),"\u8bbe\u7f6e\u4e86 ",(0,l.kt)("inlineCode",{parentName:"p"},"provider")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"program")," \uff0c\u4ee5\u5e2e\u52a9\u6211\u4eec\u4ece\u5ba2\u6237\u7aef\u8fde\u63a5\u5230\u5408\u7ea6\u3002\u8fd9\u662f\u901a\u8fc7\u4f7f\u7528IDL\u6587\u4ef6\u6765\u5b8c\u6210\u7684\uff0c\u8be5\u6587\u4ef6\u63cf\u8ff0\u4e86\u7a0b\u5e8f\u7684\u516c\u5171\u63a5\u53e3\uff0c\u7c7b\u4f3c\u4e8eEVM\u667a\u80fd\u5408\u7ea6\u4e2d\u4f7f\u7528\u7684ABI\u6587\u4ef6\u3002\u5982\u679c\u60a8\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"anchor build")," \uff0c\u5219\u4f1a\u751f\u6210IDL\u6587\u4ef6\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"./target/idl")," \u627e\u5230\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'import * as anchor from "@coral-xyz/anchor"\nimport { Program } from "@coral-xyz/anchor"\nimport { Starter } from "../target/types/starter"\n\ndescribe("starter", () => {\n // Configure the client to use the local cluster.\n const provider = anchor.AnchorProvider.env()\n anchor.setProvider(provider)\n\n const dataAccount = anchor.web3.Keypair.generate()\n const wallet = provider.wallet\n\n const program = anchor.workspace.Starter as Program\n\n it("Is initialized!", async () => {\n // Add your test here.\n const tx = await program.methods\n .new(wallet.publicKey)\n .accounts({ dataAccount: dataAccount.publicKey })\n .signers([dataAccount])\n .rpc()\n console.log("Your transaction signature", tx)\n\n const val1 = await program.methods\n .get()\n .accounts({ dataAccount: dataAccount.publicKey })\n .view()\n\n console.log("state", val1)\n\n await program.methods\n .flip()\n .accounts({ dataAccount: dataAccount.publicKey })\n .rpc()\n\n const val2 = await program.methods\n .get()\n .accounts({ dataAccount: dataAccount.publicKey })\n .view()\n\n console.log("state", val2)\n })\n})\n')),(0,l.kt)("p",null,"\u5728\u6d4b\u8bd5\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u9996\u5148\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9\uff0c\u7528\u4e8e\u521b\u5efa\u5b58\u50a8\u5408\u7ea6\u72b6\u6001\u7684\u201c\u6570\u636e\u8d26\u6237\u201d\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"const dataAccount = anchor.web3.Keypair.generate();\n")),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"new")," \u6307\u4ee4\u6765\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u6570\u636e\u8d26\u6237\u3002\u8fd9\u4e2a\u6307\u4ee4\u5bf9\u5e94\u4e8e\u5408\u7ea6\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"constructor")," \u3002\u65b0\u521b\u5efa\u7684\u6570\u636e\u8d26\u6237\u5c06\u88ab\u521d\u59cb\u5316\uff0c\u7528\u4e8e\u5b58\u50a8\u5408\u7ea6\u4e2d\u5b9a\u4e49\u7684\u72b6\u6001\u53d8\u91cf\u3002"),(0,l.kt)("p",null,"\u5728\u8fd9\u91cc\uff0c ",(0,l.kt)("inlineCode",{parentName:"p"},"payer")," \u88ab\u6307\u5b9a\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet.publicKey")," \uff0c\u5e76\u63d0\u4f9b\u4e86\u6211\u4eec\u8ba1\u5212\u521b\u5efa\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"dataAccount")," \u7684\u5730\u5740\u3002\u751f\u6210\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"dataAccount")," Keypair\u4f5c\u4e3a\u4ea4\u6613\u7684\u9644\u52a0\u7b7e\u540d\u8005\u5305\u542b\u5728\u5176\u4e2d\uff0c\u56e0\u4e3a\u5b83\u88ab\u7528\u4e8e\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d26\u6237\u3002\u57fa\u672c\u4e0a\uff0c\u8fd9\u4e2a\u64cd\u4f5c\u9a8c\u8bc1\u4e86\u6211\u4eec\u6301\u6709\u4e0e\u6211\u4eec\u6b63\u5728\u521b\u5efa\u7684\u65b0\u8d26\u6237\u5730\u5740\u76f8\u5bf9\u5e94\u7684\u79c1\u94a5\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'// Client\nconst tx = await program.methods\n .new(wallet.publicKey)\n .accounts({ dataAccount: dataAccount.publicKey })\n .signers([dataAccount])\n .rpc()\n\n// on-chain program\n@payer(payer)\nconstructor(address payer) {\n print("Hello, World!");\n}\n')),(0,l.kt)("p",null,"\u5408\u7ea6\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"get")," \u51fd\u6570\u88ab\u8c03\u7528\u4ee5\u83b7\u53d6\u5b58\u50a8\u5728\u6307\u5b9a ",(0,l.kt)("inlineCode",{parentName:"p"},"dataAccount")," \u4e2d\u7684\u503c\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"// Client\nconst val1 = await program.methods\n .get()\n .accounts({ dataAccount: dataAccount.publicKey })\n .view()\n\n// on-chain program\nfunction get() public view returns (bool) {\n return value;\n}\n")),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u5408\u7ea6\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"flip")," \u51fd\u6570\u88ab\u7528\u6765\u4fee\u6539\u6307\u5b9a ",(0,l.kt)("inlineCode",{parentName:"p"},"dataAccount")," \u7684\u72b6\u6001\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"// Client\nawait program.methods\n .flip()\n .accounts({ dataAccount: dataAccount.publicKey })\n .rpc()\n\n// on-chain program\nfunction flip() public {\n value = !value;\n}\n")),(0,l.kt)("p",null,"\u8981\u8fd0\u884c\u6d4b\u8bd5\uff0c\u8bf7\u5728\u7ec8\u7aef\u4e2d\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"anchor test")," \u547d\u4ee4\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"anchor test")," \u547d\u4ee4\u6267\u884c\u4ee5\u4e0b\u4efb\u52a1\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u542f\u52a8\u672c\u5730Solana\u9a8c\u8bc1\u8282\u70b9"),(0,l.kt)("li",{parentName:"ul"},"\u6784\u5efa\u5e76\u90e8\u7f72\u60a8\u7684\u94fe\u4e0a\u7a0b\u5e8f\u5230\u672c\u5730\u9a8c\u8bc1\u8282\u70b9"),(0,l.kt)("li",{parentName:"ul"},"\u8fd0\u884c\u6d4b\u8bd5\u6587\u4ef6")),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\u5e94\u8be5\u5728\u63a7\u5236\u53f0\u4e2d\u663e\u793a\u4ee5\u4e0b\u8f93\u51fa\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"Your transaction signature 2x7jh3yka9LU6ZeJLUZNNDJSzq6vdUAXk3mUKuP1MYwr6ArYMHDGw6i15jJnMtnC7BP7zKactStHhTekjq2vh6hP\nstate true\nstate false\n \u2714 Is initialized! (782ms)\n")),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"./.anchor/program-logs")," \u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\uff0c\u90a3\u91cc\u4f1a\u627e\u5230\u201cHello, World!\u201d\u7684\u6d88\u606f"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"Program F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC invoke [1]\nProgram 11111111111111111111111111111111 invoke [2]\nProgram 11111111111111111111111111111111 success\nProgram log: Hello, World!\n")),(0,l.kt)("p",null,"\u606d\u559c\uff01\u4f60\u6210\u529f\u5730\u4f7f\u7528 Solang \u6784\u5efa\u4e86\u4f60\u7684\u7b2c\u4e00\u4e2a Solana \u7a0b\u5e8f\uff01\u867d\u7136\u4e0e\u6807\u51c6 Solidity \u667a\u80fd\u5408\u7ea6\u76f8\u6bd4\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u4f46 Solang \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6781\u597d\u7684\u6865\u6881\uff0c\u5e2e\u52a9\u4f60\u5229\u7528\u73b0\u6709\u7684 Solidity \u6280\u80fd\u548c\u7ecf\u9a8c\u6765\u6784\u5efa Solana \u4e0a\u7684\u5e94\u7528\u3002"),(0,l.kt)("h2",{id:"\u4e0b\u4e00\u6b65"},"\u4e0b\u4e00\u6b65"),(0,l.kt)("p",null,"\u6709\u5174\u8da3\u6df1\u5165\u4e86\u89e3\u5417\uff1f\u8bf7\u67e5\u770b ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/solana-developers/program-examples"},"solana-developers/program-examples \u5b58\u50a8\u5e93"),"\u3002\u60a8\u5c06\u5728 basics \u548c tokens \u90e8\u5206\u627e\u5230\u9002\u7528\u4e8e\u5e38\u89c1Solana\u7528\u4f8b\u7684Solang\u5b9e\u73b0\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u4f60\u6709\u95ee\u9898\uff0c\u8bf7\u968f\u65f6\u5728",(0,l.kt)("a",{parentName:"p",href:"https://solana.stackexchange.com/"},"Solana Stack exchange"),"\u4e0a\u53d1\u5e03\u3002\u5982\u679c\u4f60\u6709\u5173\u4e8eSolang\u7ef4\u62a4\u8005\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://discord.com/invite/hyperledger"},"Hyperledger Foundation"),"\u7684discord\u4e0a\u8054\u7cfb\u4ed6\u4eec\u3002"),(0,l.kt)("p",null,"\u73a9\u5f97\u5f00\u5fc3\uff0c\u5c3d\u60c5\u5efa\u9020\u5427\uff01"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/918f4956.97ce3e08.js b/assets/js/918f4956.97ce3e08.js new file mode 100644 index 000000000..a52da1908 --- /dev/null +++ b/assets/js/918f4956.97ce3e08.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9720],{3905:(e,n,a)=>{a.d(n,{Zo:()=>s,kt:()=>g});var t=a(7294);function l(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function o(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function r(e){for(var n=1;n=0||(l[a]=e[a]);return l}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=t.createContext({}),c=function(e){var n=t.useContext(p),a=n;return e&&(a="function"==typeof e?e(n):r(r({},n),e)),a},s=function(e){var n=c(e.components);return t.createElement(p.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},m=t.forwardRef((function(e,n){var a=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=c(a),m=l,g=u["".concat(p,".").concat(m)]||u[m]||d[m]||o;return a?t.createElement(g,r(r({ref:n},s),{},{components:a})):t.createElement(g,r({ref:n},s))}));function g(e,n){var a=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var o=a.length,r=new Array(o);r[0]=m;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[u]="string"==typeof e?e:l,r[1]=i;for(var c=2;c{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var t=a(7462),l=(a(7294),a(3905));const o={sidebar_position:10,sidebar_label:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},r="\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",i={unversionedId:"Solana-Co-Learn/module1/local_program_development/solang_program_hello",id:"Solana-Co-Learn/module1/local_program_development/solang_program_hello",title:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",description:"\u6b22\u8fce\u6765\u5230Solana\u5165\u95e8\u6307\u5357\uff01Solang\u662f\u4e00\u4e2aSolidity\u7f16\u8bd1\u5668\uff0c\u5b83\u5141\u8bb8\u60a8\u4f7f\u7528Solidity\u7f16\u7a0b\u8bed\u8a00\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u5176\u4ed6\u533a\u5757\u94fe\u4e2d\u79f0\u4e3a\u201c\u667a\u80fd\u5408\u7ea6\u201d\u3002",source:"@site/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello.md",sourceDirName:"Solana-Co-Learn/module1/local_program_development",slug:"/Solana-Co-Learn/module1/local_program_development/solang_program_hello",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_position:10,sidebar_label:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello"},next:{title:"\u5ba2\u6237\u7aef\u5f00\u53d1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/"}},p={},c=[{value:"\u5b89\u88c5",id:"\u5b89\u88c5",level:2},{value:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee",id:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee",level:2},{value:"\u94fe\u4e0a\u7a0b\u5e8f\u6982\u8ff0",id:"\u94fe\u4e0a\u7a0b\u5e8f\u6982\u8ff0",level:2},{value:"\u91cd\u8981\u7684\u5dee\u5f02",id:"\u91cd\u8981\u7684\u5dee\u5f02",level:3},{value:"\u72b6\u6001\u6570\u636e\u7684\u5b58\u50a8",id:"\u72b6\u6001\u6570\u636e\u7684\u5b58\u50a8",level:3},{value:"\u6d4b\u8bd5\u6587\u4ef6\u6982\u8ff0",id:"\u6d4b\u8bd5\u6587\u4ef6\u6982\u8ff0",level:2},{value:"\u4e0b\u4e00\u6b65",id:"\u4e0b\u4e00\u6b65",level:2}],s={toc:c},u="wrapper";function d(e){let{components:n,...a}=e;return(0,l.kt)(u,(0,t.Z)({},s,a,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"\u4f7f\u7528solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0hello-world"},"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b"),(0,l.kt)("p",null,"\u6b22\u8fce\u6765\u5230Solana\u5165\u95e8\u6307\u5357\uff01Solang\u662f\u4e00\u4e2aSolidity\u7f16\u8bd1\u5668\uff0c\u5b83\u5141\u8bb8\u60a8\u4f7f\u7528Solidity\u7f16\u7a0b\u8bed\u8a00\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u5176\u4ed6\u533a\u5757\u94fe\u4e2d\u79f0\u4e3a\u201c\u667a\u80fd\u5408\u7ea6\u201d\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u4f60\u662f\u4e00\u4f4d\u5bf9Solana\u7f51\u7edc\u7684\u9ad8\u901f\u548c\u4f4e\u8d39\u7528\u611f\u5174\u8da3\u7684EVM\u5f00\u53d1\u8005\uff0c\u90a3\u4e48Solang\u662f\u4f60\u7684\u5b8c\u7f8e\u5de5\u5177\u3002\u901a\u8fc7Solang\uff0c\u4f60\u53ef\u4ee5\u5229\u7528\u4f60\u5bf9Solidity\u7684\u73b0\u6709\u77e5\u8bc6\u5f00\u59cb\u5728Solana\u4e0a\u8fdb\u884c\u6784\u5efa\uff01"),(0,l.kt)("h2",{id:"\u5b89\u88c5"},"\u5b89\u88c5"),(0,l.kt)("p",null,"\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u5e2e\u52a9\u60a8\u8bbe\u7f6eSolang\u7684\u5f00\u53d1\u73af\u5883\u3002\u53ea\u9700\u6309\u7167\u4e0b\u9762\u5217\u51fa\u7684\u6b65\u9aa4\u8fdb\u884c\u64cd\u4f5c\u5373\u53ef\uff1a"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"\u68c0\u67e5\u5148\u51b3\u6761\u4ef6\uff1a\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u7684\u7cfb\u7edf\u4e0a\u5df2\u5b89\u88c5\u4e86",(0,l.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/tools/install"},"Rust"),"\u548c",(0,l.kt)("a",{parentName:"p",href:"https://nodejs.org/en"},"Node.js"),"\u3002Windows\u7528\u6237\u8fd8\u9700\u8981\u8bbe\u7f6e\u597d",(0,l.kt)("a",{parentName:"p",href:"https://solana.com/developers/guides/setup-local-development#windows-users-only"},"Windows\u5b50\u7cfb\u7edf"),"\u4ee5\u4fbf\u8fd0\u884cLinux\u3002")),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"Solana\u5de5\u5177\u5957\u4ef6\u5b89\u88c5\uff1a\u9996\u5148\u5b89\u88c5",(0,l.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"Solana\u5de5\u5177\u5957\u4ef6"),"\uff0c\u5176\u4e2d\u5305\u62ecSolana\u547d\u4ee4\u884c\u754c\u9762\uff08CLI\uff09\u548c\u6700\u65b0\u7248\u672c\u7684Solang\u3002")),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"Anchor\u6846\u67b6\u5b89\u88c5\uff1a\u63a5\u4e0b\u6765\uff0c",(0,l.kt)("a",{parentName:"p",href:"https://www.anchor-lang.com/docs/installation"},"\u5b89\u88c5Anchor\u6846\u67b6"),"\u3002Anchor\u662fSolana\u751f\u6001\u7cfb\u7edf\u4e2d\u5e7f\u6cdb\u4f7f\u7528\u7684\u6846\u67b6\uff0c\u53ef\u4ee5\u7b80\u5316\u6784\u5efaSolana\u7a0b\u5e8f\u7684\u8fc7\u7a0b\u3002\u4ece0.28\u7248\u672c\u5f00\u59cb\uff0c\u60a8\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7Anchor\u5f00\u59cb\u4f7f\u7528Solang\u8fdb\u884c\u6784\u5efa\u3002"))),(0,l.kt)("p",null,"\u622a\u81f3\u64b0\u5199\u672c\u6587\u65f6\uff0c\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5Anchor\uff0c\u4ee5\u786e\u4fdd\u4e0eSolang\u7248\u672c0.3.1\u517c\u5bb9\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"cargo install --git https://github.com/coral-xyz/anchor anchor-cli --locked --force\n")),(0,l.kt)("ol",{start:4},(0,l.kt)("li",{parentName:"ol"},"Solang\u6269\u5c55\u9002\u7528\u4e8eVSCode\uff1a\u5982\u679c\u60a8\u662fVisual Studio Code\uff08VSCode\uff09\u7684\u7528\u6237\uff0c\u5efa\u8bae\u5b89\u88c5",(0,l.kt)("a",{parentName:"li",href:"https://marketplace.visualstudio.com/items?itemName=solang.solang"},"Solang\u6269\u5c55"),"\u4ee5\u8f85\u52a9\u8bed\u6cd5\u9ad8\u4eae\u663e\u793a\u3002\u8bf7\u8bb0\u5f97\u7981\u7528\u4efb\u4f55\u6d3b\u52a8\u7684Solidity\u6269\u5c55\uff0c\u4ee5\u786e\u4fddSolang\u6269\u5c55\u6b63\u5e38\u5de5\u4f5c\u3002")),(0,l.kt)("h2",{id:"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee"},"\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee"),(0,l.kt)("p",null,"\u4e00\u65e6\u60a8\u5b89\u88c5\u4e86Solana CLI\u548cAnchor\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"anchor init project_name --solidity\n")),(0,l.kt)("p",null,"\u8be5\u547d\u4ee4\u751f\u6210\u4e00\u4e2a\u65b0\u9879\u76ee\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e2a\u57fa\u672c\u7684Solang on-chain\u7a0b\u5e8f\uff08\u76f8\u5f53\u4e8eEVM\u4e0a\u7684\u667a\u80fd\u5408\u7ea6\uff09\u548c\u4e00\u4e2a\u6d4b\u8bd5\u6587\u4ef6\uff0c\u6f14\u793a\u4e86\u5982\u4f55\u4ece\u5ba2\u6237\u7aef\u4e0e\u8be5\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,l.kt)("h2",{id:"\u94fe\u4e0a\u7a0b\u5e8f\u6982\u8ff0"},"\u94fe\u4e0a\u7a0b\u5e8f\u6982\u8ff0"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u4ece\u94fe\u4e0a\u7a0b\u5e8f\u672c\u8eab\u5f00\u59cb\u7684\u521d\u59cb\u4ee3\u7801\u3002\u5728\u60a8\u7684\u9879\u76ee\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"./solidity")," \u76ee\u5f55\u4e2d\uff0c\u60a8\u5c06\u627e\u5230\u4e0b\u9762\u7684\u5408\u7ea6\uff0c\u5176\u4e2d\u5305\u62ec\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"li"},"constructor")," \u7528\u4e8e\u521d\u59cb\u5316\u72b6\u6001\u53d8\u91cf\u7684\u51fd\u6570"),(0,l.kt)("li",{parentName:"ul"},"\u4e00\u4e2a\u7528\u4e8e\u5c06\u6d88\u606f\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u7684\u51fd\u6570"),(0,l.kt)("li",{parentName:"ul"},"\u4e00\u4e2a\u7528\u4e8e\u66f4\u65b0\u72b6\u6001\u53d8\u91cf\u7684\u51fd\u6570"),(0,l.kt)("li",{parentName:"ul"},"\u4e00\u4e2a\u51fd\u6570\uff0c\u7528\u4e8e\u8fd4\u56de\u72b6\u6001\u53d8\u91cf\u7684\u5f53\u524d\u503c")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-solidity"},'@program_id("F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC")\ncontract starter {\n bool private value = true;\n\n @payer(payer)\n constructor(address payer) {\n print("Hello, World!");\n }\n\n /// A message that can be called on instantiated contracts.\n /// This one flips the value of the stored `bool` from `true`\n /// to `false` and vice versa.\n function flip() public {\n value = !value;\n }\n\n /// Simply returns the current value of our `bool`.\n function get() public view returns (bool) {\n return value;\n }\n}\n')),(0,l.kt)("h3",{id:"\u91cd\u8981\u7684\u5dee\u5f02"},"\u91cd\u8981\u7684\u5dee\u5f02"),(0,l.kt)("p",null,"\u4e0eEVM\u667a\u80fd\u5408\u7ea6\u76f8\u6bd4\uff0c\u4f60\u53ef\u80fd\u4f1a\u6ce8\u610f\u5230\u4e24\u4e2a\u91cd\u8981\u7684\u533a\u522b\uff1a"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("inlineCode",{parentName:"li"},"@program_id")," \u6ce8\u89e3\uff1a\n\u5728Solana\u4e0a\uff0c\u667a\u80fd\u5408\u7ea6\u88ab\u79f0\u4e3a\u201c\u7a0b\u5e8f\u201d\u3002\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"@program_id")," \u6ce8\u91ca\u6765\u6307\u5b9a\u7a0b\u5e8f\u7684\u94fe\u4e0a\u5730\u5740\u3002")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-solidity"},'@program_id("F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC") // on-chain program address\n')),(0,l.kt)("ol",{start:2},(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("inlineCode",{parentName:"li"},"@payer")," \u6ce8\u89e3\uff1a")),(0,l.kt)("p",null,"\u5728\u94fe\u4e0a\u5b58\u50a8\u6570\u636e\u65f6\uff0c\u9700\u8981\u5206\u914d\u4e00\u5b9a\u6570\u91cf\u7684SOL\u6765\u652f\u4ed8\u5b58\u50a8\u6210\u672c\u3002\u6ce8\u91ca ",(0,l.kt)("inlineCode",{parentName:"p"},"@payer")," \u6307\u5b9a\u4e86\u5c06\u652f\u4ed8\u6240\u9700SOL\u4ee5\u521b\u5efa\u7528\u4e8e\u5b58\u50a8\u72b6\u6001\u53d8\u91cf\u7684\u8d26\u6237\u7684\u7528\u6237\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-solidity"},'@payer(payer) // payer for the "data account"\nconstructor(address payer) {\n print("Hello, World!");\n}\n')),(0,l.kt)("h3",{id:"\u72b6\u6001\u6570\u636e\u7684\u5b58\u50a8"},"\u72b6\u6001\u6570\u636e\u7684\u5b58\u50a8"),(0,l.kt)("p",null,"EVM\u667a\u80fd\u5408\u7ea6\u548cSolana\u7a0b\u5e8f\u4e4b\u95f4\u7684\u4e00\u4e2a\u91cd\u8981\u533a\u522b\u5728\u4e8e\u5b83\u4eec\u5982\u4f55\u5b58\u50a8\u201c\u72b6\u6001\u201d\u53d8\u91cf/\u6570\u636e\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"EVM\u667a\u80fd\u5408\u7ea6\u53ef\u4ee5\u76f4\u63a5\u5b58\u50a8\u72b6\u6001\u53d8\u91cf\u3002"),(0,l.kt)("li",{parentName:"ul"},"Solana\u7684\u94fe\u4e0a\u7a0b\u5e8f\u5219\u4f1a\u521b\u5efa\u5355\u72ec\u7684\u8d26\u6237\u6765\u5b58\u50a8\u72b6\u6001\u6570\u636e\u3002\u8fd9\u4e9b\u8d26\u6237\u901a\u5e38\u88ab\u79f0\u4e3a\u201c\u6570\u636e\u8d26\u6237\u201d\uff0c\u5e76\u4e14\u662f\u7531\u7a0b\u5e8f\u201c\u62e5\u6709\u201d\u3002")),(0,l.kt)("p",null,"\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u5f53\u5408\u7ea6\u90e8\u7f72\u65f6\uff0c\u5b83\u88ab\u90e8\u7f72\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"@program_id")," \u4e2d\u6307\u5b9a\u7684\u5730\u5740\u3002\u5f53\u7a0b\u5e8f\u90e8\u7f72\u540e\u8c03\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"constructor")," \u65f6\uff0c\u4f1a\u521b\u5efa\u4e00\u4e2a\u72ec\u7acb\u7684\u5e10\u6237\uff0c\u7528\u4e8e\u5b58\u50a8\u72b6\u6001\u53d8\u91cf\uff0c\u800c\u4e0d\u662f\u5b58\u50a8\u5728\u5408\u7ea6\u672c\u8eab\u5185\u90e8\u3002"),(0,l.kt)("p",null,"\u8fd9\u53ef\u80fd\u542c\u8d77\u6765\u6709\u70b9\u4e0d\u540c\u4e8e\u4f60\u6240\u4e60\u60ef\u7684\uff0c\u4f46\u522b\u62c5\u5fc3\uff01\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u6d4b\u8bd5\u6587\u4ef6\uff0c\u4ee5\u66f4\u597d\u5730\u7406\u89e3\u8fd9\u4e2a\u6982\u5ff5\u3002"),(0,l.kt)("h2",{id:"\u6d4b\u8bd5\u6587\u4ef6\u6982\u8ff0"},"\u6d4b\u8bd5\u6587\u4ef6\u6982\u8ff0"),(0,l.kt)("p",null,"\u8d77\u59cb\u6d4b\u8bd5\u6587\u4ef6\u53ef\u4ee5\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"./tests")," \u76ee\u5f55\u4e2d\u627e\u5230\u3002\u8be5\u6587\u4ef6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u4e0e\u5ba2\u6237\u7aef\u4ea4\u4e92\u7684\u793a\u4f8b\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"Anchor"),"\u8bbe\u7f6e\u4e86 ",(0,l.kt)("inlineCode",{parentName:"p"},"provider")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"program")," \uff0c\u4ee5\u5e2e\u52a9\u6211\u4eec\u4ece\u5ba2\u6237\u7aef\u8fde\u63a5\u5230\u5408\u7ea6\u3002\u8fd9\u662f\u901a\u8fc7\u4f7f\u7528IDL\u6587\u4ef6\u6765\u5b8c\u6210\u7684\uff0c\u8be5\u6587\u4ef6\u63cf\u8ff0\u4e86\u7a0b\u5e8f\u7684\u516c\u5171\u63a5\u53e3\uff0c\u7c7b\u4f3c\u4e8eEVM\u667a\u80fd\u5408\u7ea6\u4e2d\u4f7f\u7528\u7684ABI\u6587\u4ef6\u3002\u5982\u679c\u60a8\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"anchor build")," \uff0c\u5219\u4f1a\u751f\u6210IDL\u6587\u4ef6\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"./target/idl")," \u627e\u5230\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'import * as anchor from "@coral-xyz/anchor"\nimport { Program } from "@coral-xyz/anchor"\nimport { Starter } from "../target/types/starter"\n\ndescribe("starter", () => {\n // Configure the client to use the local cluster.\n const provider = anchor.AnchorProvider.env()\n anchor.setProvider(provider)\n\n const dataAccount = anchor.web3.Keypair.generate()\n const wallet = provider.wallet\n\n const program = anchor.workspace.Starter as Program\n\n it("Is initialized!", async () => {\n // Add your test here.\n const tx = await program.methods\n .new(wallet.publicKey)\n .accounts({ dataAccount: dataAccount.publicKey })\n .signers([dataAccount])\n .rpc()\n console.log("Your transaction signature", tx)\n\n const val1 = await program.methods\n .get()\n .accounts({ dataAccount: dataAccount.publicKey })\n .view()\n\n console.log("state", val1)\n\n await program.methods\n .flip()\n .accounts({ dataAccount: dataAccount.publicKey })\n .rpc()\n\n const val2 = await program.methods\n .get()\n .accounts({ dataAccount: dataAccount.publicKey })\n .view()\n\n console.log("state", val2)\n })\n})\n')),(0,l.kt)("p",null,"\u5728\u6d4b\u8bd5\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u9996\u5148\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9\uff0c\u7528\u4e8e\u521b\u5efa\u5b58\u50a8\u5408\u7ea6\u72b6\u6001\u7684\u201c\u6570\u636e\u8d26\u6237\u201d\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"const dataAccount = anchor.web3.Keypair.generate();\n")),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"new")," \u6307\u4ee4\u6765\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u6570\u636e\u8d26\u6237\u3002\u8fd9\u4e2a\u6307\u4ee4\u5bf9\u5e94\u4e8e\u5408\u7ea6\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"constructor")," \u3002\u65b0\u521b\u5efa\u7684\u6570\u636e\u8d26\u6237\u5c06\u88ab\u521d\u59cb\u5316\uff0c\u7528\u4e8e\u5b58\u50a8\u5408\u7ea6\u4e2d\u5b9a\u4e49\u7684\u72b6\u6001\u53d8\u91cf\u3002"),(0,l.kt)("p",null,"\u5728\u8fd9\u91cc\uff0c ",(0,l.kt)("inlineCode",{parentName:"p"},"payer")," \u88ab\u6307\u5b9a\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},"wallet.publicKey")," \uff0c\u5e76\u63d0\u4f9b\u4e86\u6211\u4eec\u8ba1\u5212\u521b\u5efa\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"dataAccount")," \u7684\u5730\u5740\u3002\u751f\u6210\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"dataAccount")," Keypair\u4f5c\u4e3a\u4ea4\u6613\u7684\u9644\u52a0\u7b7e\u540d\u8005\u5305\u542b\u5728\u5176\u4e2d\uff0c\u56e0\u4e3a\u5b83\u88ab\u7528\u4e8e\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d26\u6237\u3002\u57fa\u672c\u4e0a\uff0c\u8fd9\u4e2a\u64cd\u4f5c\u9a8c\u8bc1\u4e86\u6211\u4eec\u6301\u6709\u4e0e\u6211\u4eec\u6b63\u5728\u521b\u5efa\u7684\u65b0\u8d26\u6237\u5730\u5740\u76f8\u5bf9\u5e94\u7684\u79c1\u94a5\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},'// Client\nconst tx = await program.methods\n .new(wallet.publicKey)\n .accounts({ dataAccount: dataAccount.publicKey })\n .signers([dataAccount])\n .rpc()\n\n// on-chain program\n@payer(payer)\nconstructor(address payer) {\n print("Hello, World!");\n}\n')),(0,l.kt)("p",null,"\u5408\u7ea6\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"get")," \u51fd\u6570\u88ab\u8c03\u7528\u4ee5\u83b7\u53d6\u5b58\u50a8\u5728\u6307\u5b9a ",(0,l.kt)("inlineCode",{parentName:"p"},"dataAccount")," \u4e2d\u7684\u503c\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"// Client\nconst val1 = await program.methods\n .get()\n .accounts({ dataAccount: dataAccount.publicKey })\n .view()\n\n// on-chain program\nfunction get() public view returns (bool) {\n return value;\n}\n")),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u5408\u7ea6\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"flip")," \u51fd\u6570\u88ab\u7528\u6765\u4fee\u6539\u6307\u5b9a ",(0,l.kt)("inlineCode",{parentName:"p"},"dataAccount")," \u7684\u72b6\u6001\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-ts"},"// Client\nawait program.methods\n .flip()\n .accounts({ dataAccount: dataAccount.publicKey })\n .rpc()\n\n// on-chain program\nfunction flip() public {\n value = !value;\n}\n")),(0,l.kt)("p",null,"\u8981\u8fd0\u884c\u6d4b\u8bd5\uff0c\u8bf7\u5728\u7ec8\u7aef\u4e2d\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"anchor test")," \u547d\u4ee4\u3002"),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"anchor test")," \u547d\u4ee4\u6267\u884c\u4ee5\u4e0b\u4efb\u52a1\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u542f\u52a8\u672c\u5730Solana\u9a8c\u8bc1\u8282\u70b9"),(0,l.kt)("li",{parentName:"ul"},"\u6784\u5efa\u5e76\u90e8\u7f72\u60a8\u7684\u94fe\u4e0a\u7a0b\u5e8f\u5230\u672c\u5730\u9a8c\u8bc1\u8282\u70b9"),(0,l.kt)("li",{parentName:"ul"},"\u8fd0\u884c\u6d4b\u8bd5\u6587\u4ef6")),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\u5e94\u8be5\u5728\u63a7\u5236\u53f0\u4e2d\u663e\u793a\u4ee5\u4e0b\u8f93\u51fa\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"Your transaction signature 2x7jh3yka9LU6ZeJLUZNNDJSzq6vdUAXk3mUKuP1MYwr6ArYMHDGw6i15jJnMtnC7BP7zKactStHhTekjq2vh6hP\nstate true\nstate false\n \u2714 Is initialized! (782ms)\n")),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"./.anchor/program-logs")," \u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\uff0c\u90a3\u91cc\u4f1a\u627e\u5230\u201cHello, World!\u201d\u7684\u6d88\u606f"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"Program F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC invoke [1]\nProgram 11111111111111111111111111111111 invoke [2]\nProgram 11111111111111111111111111111111 success\nProgram log: Hello, World!\n")),(0,l.kt)("p",null,"\u606d\u559c\uff01\u4f60\u6210\u529f\u5730\u4f7f\u7528 Solang \u6784\u5efa\u4e86\u4f60\u7684\u7b2c\u4e00\u4e2a Solana \u7a0b\u5e8f\uff01\u867d\u7136\u4e0e\u6807\u51c6 Solidity \u667a\u80fd\u5408\u7ea6\u76f8\u6bd4\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u4f46 Solang \u63d0\u4f9b\u4e86\u4e00\u4e2a\u6781\u597d\u7684\u6865\u6881\uff0c\u5e2e\u52a9\u4f60\u5229\u7528\u73b0\u6709\u7684 Solidity \u6280\u80fd\u548c\u7ecf\u9a8c\u6765\u6784\u5efa Solana \u4e0a\u7684\u5e94\u7528\u3002"),(0,l.kt)("h2",{id:"\u4e0b\u4e00\u6b65"},"\u4e0b\u4e00\u6b65"),(0,l.kt)("p",null,"\u6709\u5174\u8da3\u6df1\u5165\u4e86\u89e3\u5417\uff1f\u8bf7\u67e5\u770b ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/solana-developers/program-examples"},"solana-developers/program-examples \u5b58\u50a8\u5e93"),"\u3002\u60a8\u5c06\u5728 basics \u548c tokens \u90e8\u5206\u627e\u5230\u9002\u7528\u4e8e\u5e38\u89c1Solana\u7528\u4f8b\u7684Solang\u5b9e\u73b0\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u4f60\u6709\u95ee\u9898\uff0c\u8bf7\u968f\u65f6\u5728",(0,l.kt)("a",{parentName:"p",href:"https://solana.stackexchange.com/"},"Solana Stack exchange"),"\u4e0a\u53d1\u5e03\u3002\u5982\u679c\u4f60\u6709\u5173\u4e8eSolang\u7ef4\u62a4\u8005\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://discord.com/invite/hyperledger"},"Hyperledger Foundation"),"\u7684discord\u4e0a\u8054\u7cfb\u4ed6\u4eec\u3002"),(0,l.kt)("p",null,"\u73a9\u5f97\u5f00\u5fc3\uff0c\u5c3d\u60c5\u5efa\u9020\u5427\uff01"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.976cf8a7.js b/assets/js/935f2afb.976cf8a7.js deleted file mode 100644 index 325903a5f..000000000 --- a/assets/js/935f2afb.976cf8a7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Start","href":"/docs/intro","className":"green","docId":"intro"},{"type":"category","label":"Solana Co Learn tutorials","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"Module1","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b","href":"/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello","className":"green","docId":"Solana-Co-Learn/module1/local_program_development/native_program_hello"},{"type":"link","label":"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b","href":"/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello","className":"green","docId":"Solana-Co-Learn/module1/local_program_development/anchor_program_hello"},{"type":"link","label":"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b","href":"/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello","className":"green","docId":"Solana-Co-Learn/module1/local_program_development/solang_program_hello"}],"href":"/docs/Solana-Co-Learn/module1/local_program_development/"},{"type":"category","label":"\u5ba2\u6237\u7aef\u5f00\u53d1","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e","href":"/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/","docId":"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README"},{"type":"link","label":"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe","href":"/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/","docId":"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README"},{"type":"link","label":"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c","href":"/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/","docId":"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README"}],"href":"/docs/Solana-Co-Learn/module1/client-side-development/"},{"type":"category","label":"\u94b1\u5305\u548c\u524d\u7aef","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305","href":"/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/","docId":"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README"},{"type":"link","label":"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92","href":"/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/","docId":"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README"}],"href":"/docs/Solana-Co-Learn/module1/wallets-and-frontends/"},{"type":"category","label":"\u81ea\u5b9a\u4e49\u6307\u4ee4","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4","href":"/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/","docId":"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README"},{"type":"link","label":"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528","href":"/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/","docId":"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README"},{"type":"link","label":"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316","href":"/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/","docId":"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README"}],"href":"/docs/Solana-Co-Learn/module1/custom-instruction/"},{"type":"category","label":"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef","href":"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/","docId":"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README"},{"type":"link","label":"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel","href":"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/","docId":"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README"}],"href":"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/"},{"type":"link","label":"Solana\u94b1\u5305\u4f7f\u7528","href":"/docs/Solana-Co-Learn/module1/wallet-usage/","docId":"Solana-Co-Learn/module1/wallet-usage/README"}],"href":"/docs/Solana-Co-Learn/module1/"},{"type":"category","label":"Module2","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"Spl token","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udcb5 The token Program","href":"/docs/Solana-Co-Learn/module2/spl-token/the-token-program/","docId":"Solana-Co-Learn/module2/spl-token/the-token-program/README"},{"type":"link","label":"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01","href":"/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/","docId":"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README"},{"type":"link","label":"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e","href":"/docs/Solana-Co-Learn/module2/spl-token/token-metadata/","docId":"Solana-Co-Learn/module2/spl-token/token-metadata/README"},{"type":"link","label":"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd","href":"/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/","docId":"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README"}],"href":"/docs/Solana-Co-Learn/module2/spl-token/"},{"type":"category","label":"Ntfs & Minting with metaplex","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83c\udfa8 NFTs on Solana","href":"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/","docId":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README"},{"type":"link","label":"\ud83e\udd28 NFT\u4f60\u7684\u8138","href":"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/","docId":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README"},{"type":"link","label":"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI","href":"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/","docId":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README"}],"href":"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/"},{"type":"category","label":"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u5c55\u793aNFTs \ud83d\udc83","href":"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/","docId":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README"},{"type":"link","label":"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs","href":"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/","docId":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README"},{"type":"link","label":"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs","href":"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/","docId":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README"}],"href":"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/"},{"type":"category","label":"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01","href":"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/","docId":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README"},{"type":"link","label":"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a","href":"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/","docId":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README"},{"type":"link","label":"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762","href":"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/","docId":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README"}],"href":"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/"}],"href":"/docs/Solana-Co-Learn/module2/"},{"type":"category","label":"Module3","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"Rust\u7b80\u4ecb","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a","href":"/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/","docId":"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README"},{"type":"link","label":"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c","href":"/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/","docId":"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README"},{"type":"link","label":"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92","href":"/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/","docId":"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README"}],"href":"/docs/Solana-Co-Learn/module3/introduction-to-rust/"},{"type":"category","label":"\u539f\u751fSOLANA\u5f00\u53d1","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5","href":"/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/","docId":"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README"},{"type":"link","label":"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f","href":"/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/","docId":"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README"},{"type":"link","label":"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406","href":"/docs/Solana-Co-Learn/module3/native-solana-development/state-management/","docId":"Solana-Co-Learn/module3/native-solana-development/state-management/README"}],"href":"/docs/Solana-Co-Learn/module3/native-solana-development/"},{"type":"category","label":"\u5b89\u5168\u548c\u9a8c\u8bc1","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1","href":"/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/","docId":"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README"},{"type":"link","label":"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f","href":"/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/","docId":"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README"}],"href":"/docs/Solana-Co-Learn/module3/security-and-validation/"},{"type":"category","label":"NFT\u8d28\u62bc","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406","href":"/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/","docId":"Solana-Co-Learn/module3/nft-staking/how-staking-works/README"},{"type":"link","label":"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212","href":"/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/","docId":"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README"}],"href":"/docs/Solana-Co-Learn/module3/nft-staking/"}],"href":"/docs/Solana-Co-Learn/module3/"},{"type":"category","label":"Module4","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e","href":"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/","docId":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README"},{"type":"link","label":"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76","href":"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/","docId":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README"}],"href":"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/"}],"href":"/docs/Solana-Co-Learn/module4/"},{"type":"link","label":"Module5","href":"/docs/Solana-Co-Learn/module5/","docId":"Solana-Co-Learn/module5/README"},{"type":"link","label":"Module6","href":"/docs/Solana-Co-Learn/module6/","docId":"Solana-Co-Learn/module6/README"},{"type":"link","label":"Modules","href":"/docs/Solana-Co-Learn/modules/","docId":"Solana-Co-Learn/modules/README"}],"href":"/docs/Solana-Co-Learn/"}]},"docs":{"intro":{"id":"intro","title":"Start","description":"- Solana Co Learn","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README":{"id":"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README","title":"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c","description":"\u51c6\u5907\u597d\u6233\u4e00\u4e0bSolana\u7f51\u7edc\u4e86\u5417\uff1f\u6211\u4eec\u5c06\u7f16\u5199\u4e00\u4e2a\u811a\u672c\uff0c\u751f\u6210\u4e00\u4e2a\u5bc6\u94a5\u5bf9\uff0c\u7528devnet SOL\u8d44\u91d1\u8fdb\u884c\u5145\u503c\uff0c\u5e76\u4e0eSolana\u7f51\u7edc\u4e0a\u7684\u73b0\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README":{"id":"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README","title":"\u4ece Solana \ud83e\udd13 \u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e","description":"\u662f\u65f6\u5019\u56de\u5230\u8fc7\u53bb\u4e86\u3002\u56de\u5230\u5e7c\u513f\u56ed\u7684\u65f6\u5149\u3002\u8fd8\u8bb0\u5f97\u4f60\u5b66\u5230\u7684\u7b2c\u4e00\u4ef6\u4e8b\u662f\u4ec0\u4e48\u5417\uff1f\u5b57\u6bcd\u8868\u3002\u4e00\u65e6\u4f60\u5f81\u670d\u4e86\u5168\u90e826\u4e2a\u5b57\u6bcd\uff0c\u4f60\u5c31\u5b66\u4f1a\u4e86\u9605\u8bfb\u3002\u8fd9\u662f\u4f60\u6210\u4e3aSolana\u5f00\u53d1\u8005\u4e4b\u65c5\u7684\u8d77\u70b9\u3002\u9605\u8bfb\u82f1\u8bed\u7684\u72ec\u7279\u6280\u80fd\u4f7f\u4f60\u6210\u4e3a\u4e86\u73b0\u5728\u8fd9\u4e2a\u80fd\u591f\u5480\u56bc\u77e5\u8bc6\u7684\u8d85\u7ea7\u5927\u8111\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/client-side-development/README":{"id":"Solana-Co-Learn/module1/client-side-development/README","title":"\u5ba2\u6237\u7aef\u5f00\u53d1","description":"- \ud83d\udcf9\u4f7f\u7528Gage\u5728Solana\u4e0a\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README":{"id":"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README","title":"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe","description":"\u662f\u65f6\u5019\u6bd5\u4e1a\u4e86\u5e7c\u513f\u56ed\u3002\u6211\u4eec\u5bf9\u9605\u8bfb\u4e86\u5982\u6307\u638c - \u4f60\u53ea\u9700\u5bf9JSON RPC\u7aef\u70b9\u8fdb\u884cAPI\u8c03\u7528\u3002\u8ba9\u6211\u4eec\u6765\u5199\u5165\u533a\u5757\u94fe\u5427\uff01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README":{"id":"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README","title":"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u7528\u8d77\u6765\u5427\uff01\u4e3a\u4e86\u5c06\u6240\u6709\u5185\u5bb9\u6574\u5408\u5728\u4e00\u8d77\uff0c\u6211\u4eec\u5c06\u6784\u5efa\u4e00\u4e2a\u57fa\u4e8e\u533a\u5757\u94fe\u7684\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u2014\u2014\u5b83\u5c06\u5141\u8bb8\u4efb\u4f55\u4eba\u63d0\u4ea4\u4ed6\u4eec\u6700\u559c\u6b22\u7684\u7535\u5f71\u7684\u8bc4\u8bba\uff0c\u6709\u70b9\u7c7b\u4f3c\u4e8e\u70c2\u756a\u8304\u7f51\u7ad9\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README":{"id":"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README","title":"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u4f60\u73b0\u5728\u77e5\u9053\u5982\u4f55\u8bfb\u53d6\u6570\u636e\u5e76\u901a\u8fc7\u7b80\u5355\u7684\u4ea4\u6613\u5199\u5165\u7f51\u7edc\u3002\u51e0\u4e4e\u7acb\u5373\uff0c\u4f60\u4f1a\u53d1\u73b0\u81ea\u5df1\u60f3\u8981\u901a\u8fc7\u4ea4\u6613\u53d1\u9001\u6570\u636e\u3002\u90a3\u4e48\u8ba9\u6211\u4eec\u770b\u770b\u5982\u4f55\u5411Solana\u533a\u5757\u94fe\u8bb2\u8ff0\u4f60\u7684\u6545\u4e8b\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/custom-instruction/README":{"id":"Solana-Co-Learn/module1/custom-instruction/README","title":"\u81ea\u5b9a\u4e49\u6307\u4ee4","description":"- \ud83d\udcf9\u4f7f\u7528Gage\u81ea\u5b9a\u4e49\u6307\u4ee4","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README":{"id":"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README","title":"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u5c06\u6570\u636e\u5199\u5165\u7f51\u7edc\u8d26\u6237\u53ea\u662f\u6218\u6597\u7684\u4e00\u534a\uff0c\u53e6\u4e00\u534a\u662f\u8bfb\u53d6\u6570\u636e\u3002\u5728\u7b2c\u4e00\u90e8\u5206\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86Web3.js\u5e93\u4e2d\u7684\u5185\u7f6e\u51fd\u6570\u6765\u8bfb\u53d6\u5185\u5bb9\u3002\u8fd9\u4ec5\u9002\u7528\u4e8e\u7edd\u5bf9\u5fc5\u8981\u7684\u6570\u636e\uff0c\u5982\u4f59\u989d\u548c\u4ea4\u6613\u8be6\u60c5\u3002\u6b63\u5982\u6211\u4eec\u5728\u4e0a\u4e00\u90e8\u5206\u4e2d\u6240\u770b\u5230\u7684\uff0c\u6240\u6709\u597d\u4e1c\u897f\u90fd\u5728PDAs\u4e2d\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/local_program_development/anchor_program_hello":{"id":"Solana-Co-Learn/module1/local_program_development/anchor_program_hello","title":"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b","description":"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/local_program_development/local_program_development":{"id":"Solana-Co-Learn/module1/local_program_development/local_program_development","title":"Local Program Development","description":"\u7b80\u800c\u8a00\u4e4b","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/local_program_development/native_program_hello":{"id":"Solana-Co-Learn/module1/local_program_development/native_program_hello","title":"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b","description":"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/local_program_development/solang_program_hello":{"id":"Solana-Co-Learn/module1/local_program_development/solang_program_hello","title":"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b","description":"\u6b22\u8fce\u6765\u5230Solana\u5165\u95e8\u6307\u5357\uff01Solang\u662f\u4e00\u4e2aSolidity\u7f16\u8bd1\u5668\uff0c\u5b83\u5141\u8bb8\u60a8\u4f7f\u7528Solidity\u7f16\u7a0b\u8bed\u8a00\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u5176\u4ed6\u533a\u5757\u94fe\u4e2d\u79f0\u4e3a\u201c\u667a\u80fd\u5408\u7ea6\u201d\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/README":{"id":"Solana-Co-Learn/module1/README","title":"Solana Module1","description":"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello world\u5408\u7ea6","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README":{"id":"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README","title":"\ud83d\udcbb \u6784\u5efa NFT \u94f8\u5e01\u8005\u524d\u7aef","description":"\u6b22\u8fce\u6765\u5230\u4f60\u7684\u7b2c\u4e00\u5468\u7684SHIPPING\u3002\u6bcf\u5468\u4f60\u90fd\u4f1a\u6709\u4e00\u4e2a\u4e13\u95e8\u7684\u90e8\u5206\uff0c\u5c06\u4f60\u7684\u5b66\u4e60\u6210\u679c\u5e94\u7528\u5230\u4f60\u7684\u5b9a\u5236NFT\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u8fd8\u6709\u6218\u5229\u54c1\u7bb1\u5b50\uff01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README":{"id":"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README","title":"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel","description":"\u8fd9\u662f\u4f60\u672c\u5468\u6240\u505a\u7684\u4e00\u5207\u4e2d\u6700\u91cd\u8981\u7684\u90e8\u5206\u3002\u79bb\u5f00\u672c\u5730\u4e3b\u673a\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/start-your-own-custom-project/README":{"id":"Solana-Co-Learn/module1/start-your-own-custom-project/README","title":"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee","description":"- \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/wallet-usage/README":{"id":"Solana-Co-Learn/module1/wallet-usage/README","title":"Solana\u94b1\u5305\u4f7f\u7528","description":"Solana\u7684\u94b1\u5305\u6709\u5f88\u591a\uff0c\u6bd4\u5982\u5f88\u6709\u7684Phantom\u94b1\u5305\u3002\u4f46\u662f\u8fd9\u91cc\u6211\u4e0d\u5728\u63a8\u8350\u4f7f\u7528Phantom\uff0c\u56e0\u4e3a\u4ed6\u5bf9\u4e8e\u5f00\u53d1\u8005","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README":{"id":"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README","title":"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305 (TODO by davirain)","description":"\u6211\u4eec\u73b0\u5728\u5bf9\u901a\u8fc7\u4ee3\u7801\u4e0e\u7f51\u7edc\u8fdb\u884c\u4ea4\u4e92\u6709\u4e86\u5f88\u591a\u4e86\u89e3\u3002\u4e3a\u4e86\u8fdb\u884c\u4ea4\u6613\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u79c1\u94a5\u3002\u8fd9\u5bf9\u7528\u6237\u6765\u8bf4\u884c\u4e0d\u901a\u54c8\u54c8\u3002\u4e3a\u4e86\u8ba9\u4eba\u4eec\u7528\u771f\u94b1\u4ece\u6211\u4eec\u8fd9\u91cc\u8d2d\u4e70JPEG\u56fe\u50cf\uff0c\u6211\u4eec\u9700\u8981\u4e0e\u94b1\u5305\u5408\u4f5c\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README":{"id":"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README","title":"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/wallets-and-frontends/README":{"id":"Solana-Co-Learn/module1/wallets-and-frontends/README","title":"\u94b1\u5305\u548c\u524d\u7aef","description":"- \u8fde\u63a5\u5230\u94b1\u5305","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README":{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README","title":"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u770b\u5230\u95ea\u4eae\u7684\u65b0iPhone\u6709\u591a\u4ee4\u4eba\u5174\u594b\u5417\uff1f\u7a00\u6709\u7684NFT\u6709\u70b9\u50cf\u90a3\u6837\u3002\u5bf9\u4e8e\u4f18\u79c0\u7684\u827a\u672f\u5bb6\u6765\u8bf4\uff0c\u5373\u4f7f\u53ea\u662f\u770b\u7740\u5b83\u4eec\u4e5f\u5f88\u6709\u8da3\u3002\u6bd5\u7adf\uff0c\u827a\u672f\u5c31\u662f\u7528\u6765\u6b23\u8d4f\u7684\uff01\u8ba9\u6211\u4eec\u5f04\u6e05\u695a\u5982\u679c\u6211\u4eec\u53ea\u6709Candy Machine\u7684\u5730\u5740\uff0c\u6211\u4eec\u5982\u4f55\u5c55\u793aNFTs\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README":{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README","title":"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u600e\u4e48\u56de\u4e8b\u3002\u6a21\u677f\u65f6\u95f4\u3002\u7136\u800c\uff0c\u968f\u7740\u6211\u4eec\u6784\u5efa\u7684\u4e1c\u897f\u53d8\u5f97\u66f4\u597d\uff0c\u6211\u4eec\u7684\u6a21\u677f\u4e5f\u4f1a\u53d8\u5f97\u66f4\u597d\u3002\u8fd9\u6b21\u6211\u4eec\u5c06\u5728Solana dApp\u811a\u624b\u67b6\u7684\u57fa\u7840\u4e0a\u6784\u5efa\u4e00\u4e2a\u6a21\u677f\u3002\u548c\u4e4b\u524d\u7684\u6a21\u677f\u4e00\u6837\uff0c\u5b83\u662f\u4e00\u4e2a\u4f7f\u7528 create-next-app \u5236\u4f5c\u7684Next.js\u5e94\u7528\u7a0b\u5e8f\u3002\u4e0d\u540c\u7684\u662f\uff0c\u5b83\u6709\u66f4\u591a\u7684\u529f\u80fd\u3002\u4e0d\u7528\u62c5\u5fc3\uff01\u6211\u4eec\u4ecd\u7136\u4f1a\u4f7f\u7528\u76f8\u540c\u7684\u4e1c\u897f\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README":{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README","title":"\u5c55\u793aNFTs \ud83d\udc83","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u5982\u679c\u4f60\u4e0d\u80fd\u70ab\u8000\u4f60\u7684NFT\uff0c\u90a3\u5b83\u6709\u4ec0\u4e48\u7528\u5462\uff01\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u5e2e\u52a9\u4f60\u5c55\u793a\u4f60\u7684\u4f5c\u54c1\uff08\u5047\u8bbe\u4f60\u7684NFT\u662f\u8d5a\u94b1\u7684\uff09\uff1a\u9996\u5148\u5728\u94b1\u5305\u4e2d\u5c55\u793a\u5b83\uff0c\u7136\u540e\u5728Candy Machine\u4e2d\u5c55\u793a\u5b83\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README":{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README","title":"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS","description":"- \u4f7f\u7528Gage\u5236\u4f5c\u7528\u6237\u754c\u9762","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README":{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README","title":"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u8ba9\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u7684\u968f\u673a\u5316\u3002\u51c6\u5907\u597d\u5c06\u4e00\u4e9b\u4e1c\u897f\u653e\u5165\u6211\u4eec\u5728\u4e0a\u4e00\u8bfe\u4e2d\u521b\u5efa\u4f46\u6ca1\u6709\u4f7f\u7528\u7684\u6587\u4ef6\u5939\u4e2d\u4e86\u5417\uff1f","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README":{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README","title":"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u662f\u65f6\u5019\u56de\u5230\u6211\u4eec\u7684\u81ea\u5b9a\u4e49NFT\u8d28\u62bc\u5e94\u7528\u4e86\u3002\u6211\u4eec\u5c06\u5229\u7528\u6211\u4eec\u5728\u4ee3\u5e01\u7a0b\u5e8f\u548c\u7cd6\u679c\u673a\u4e0a\u7684\u7ecf\u9a8c\u6765\u6784\u5efa\u6211\u4eec\u7684\u5e94\u7528\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README":{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README","title":"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u6210\u529f\u521b\u5efa\u4e86\u4ee3\u5e01\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFT\uff09\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u521b\u5efa\u6211\u4eec\u7684\u94f8\u5e01\u7528\u6237\u754c\u9762\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u76f4\u89c2\u5730\u4e0e\u667a\u80fd\u5408\u7ea6\u8fdb\u884c\u4ea4\u4e92\uff0c\u5e76\u5141\u8bb8\u5176\u4ed6\u4eba\u5728\u6211\u4eec\u7684\u6d4f\u89c8\u5668\u4e0a\u94f8\u9020\u6211\u4eec\u7684NFT\uff01\u8fd9\u4e0d\u662f\u5f88\u9177\u5417\uff1f\u5982\u679c\u4f60\u6ce8\u610f\u5230\uff0c\u4f60\u7684\u7f51\u7ad9\u76ee\u524d\u6709\u4e00\u4e2a minting \u6309\u94ae\uff0c\u4f46\u5b83\u8fd8\u6ca1\u6709\u4efb\u4f55\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u51fd\u6570\u5f00\u59cb\uff0c\u5e76\u6dfb\u52a0\u4e00\u4e9b\u903b\u8f91\uff0c\u4ee5\u5141\u8bb8\u6211\u4eec\u94f8\u9020\u6211\u4eec\u7684NFT\u3002\u5982\u679c\u4f60\u6ca1\u6709\u8d77\u59cb\u4ee3\u7801\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u91cc\u514b\u9686\u5b83\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README":{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README","title":"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247","description":"- \ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README":{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README","title":"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI","description":"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u9020\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u5988\u5988\u4f60\u5728\u533a\u5757\u94fe\u4e0a\u3002\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2a\u5355\u72ec\u7684NFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u8fc7\u7a0b\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README":{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README","title":"\ud83e\udd28 NFT\u4f60\u7684\u8138","description":"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u9009\u62e9\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u8bbe\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u7684\u5988\u5988\u4f60\u5df2\u7ecf\u767b\u4e0a\u4e86\u533a\u5757\u94fe\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README":{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README","title":"\ud83c\udfa8 NFTs on Solana","description":"\u6211\u4eec\u5230\u4e86\u3002\u6ca1\u82b1\u592a\u957f\u65f6\u95f4\u3002\u7334\u5b50\u56fe\u7247\u3002\u733f\u7c7b\u3002\u5ca9\u77f3\u3002\u8fd8\u6709\u5176\u4ed6\u52a8\u7269\u4e3b\u9898\u7684\u5934\u50cf\uff0c\u770b\u8d77\u6765\u4e11\u5f97\u8981\u547d\uff0c\u4f46\u5374\u80fd\u5356\u523010\u4e07\u7f8e\u5143\uff0c\u8fd9\u5c31\u662fNFT\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README":{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README","title":"Ntfs & Minting with metaplex","description":"- \ud83c\udfac NFTs on Solana with Gage","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/README":{"id":"Solana-Co-Learn/module2/README","title":"Solana Module2","description":"SPL\u4ee3\u5e01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README":{"id":"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README","title":"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd","description":"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README":{"id":"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README","title":"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01","description":"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e0a\u4e00\u8282\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002\u8bf4\u4e86\u8fd9\u4e48\u591a\uff0c\u8ba9\u6211\u4eec\u6765\u521b\u9020\u4e00\u4e9b\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5427\u3002\u5728\u6211\u4eec\u7684\u6700\u7ec8\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u4ee3\u5e01\uff0c\u4f60\u5c06\u968f\u7740\u62b5\u62bc\u4f60\u7684\u793e\u533aNFT\u800c\u9010\u6e10\u83b7\u5f97\u5b83\u3002\u5728\u90a3\u4e4b\u524d\uff0c\u8ba9\u6211\u4eec\u5148\u73a9\u4e00\u4e0b\u5b9e\u9645\u6784\u5efa\u8fd9\u4e2a\u94f8\u5e01\u8fc7\u7a0b\u7684\u8fc7\u7a0b\u3002\u73b0\u5728\u662f\u53d1\u6325\u4f60\u7684\u60f3\u8c61\u529b\uff0c\u5c3d\u60c5\u4eab\u53d7\u7684\u597d\u65f6\u673a\u3002\u4e5f\u8bb8\u4f60\u4e00\u76f4\u60f3\u521b\u5efa\u81ea\u5df1\u7684\u6a21\u56e0\u5e01 - \u73b0\u5728\u662f\u4f60\u7684\u673a\u4f1a\u4e86 \ud83d\ude80","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/README":{"id":"Solana-Co-Learn/module2/spl-token/README","title":"SPL\u4ee3\u5e01","description":"- \ud83d\udcf9\u5e26\u6709Gage\u7684\u4ee4\u724c","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/the-token-program/README":{"id":"Solana-Co-Learn/module2/spl-token/the-token-program/README","title":"\ud83d\udcb5 The Token Program","description":"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u5728\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u4e2d\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002\u4f5c\u4e3a\u533a\u5757\u94fe\u6700\u521d\u7684\u627f\u8bfa\uff0c\u4e5f\u53ef\u80fd\u662f\u4f60\u5b89\u88c5\u94b1\u5305\u7684\u4e3b\u8981\u539f\u56e0\uff0c\u8fd9\u4e9b\u8c26\u900a\u7684\u4ee3\u5e01\u662f\u5bf9\u533a\u5757\u94fe\u4e0a\u8d44\u4ea7\u7684\u6700\u7eaf\u7cb9\u7684\u8868\u8fbe\uff0c\u4ece\u5408\u6210\u80a1\u7968\u5230\u6570\u767e\u79cd\u72d7\u5e01\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/token-metadata/README":{"id":"Solana-Co-Learn/module2/spl-token/token-metadata/README","title":"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e","description":"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README":{"id":"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README","title":"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c","description":"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README":{"id":"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README","title":"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92","description":"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\u3002\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u90e8\u7f72\u4e86\u6211\u4eec\u7684\u7a0b\u5e8f\uff0c\u6211\u4eec\u53ef\u4ee5\u4e0e\u4e4b\u4ea4\u4e92\u3002\u5728\u4e4b\u524d\u7684\u90e8\u5206\u4e2d\uff0c\u4f60\u5df2\u7ecf\u505a\u8fc7\u5f88\u591a\u6b21\u4e86\uff01\u4f60\u53ef\u4ee5\u50cf\u4ee5\u524d\u4e00\u6837create-solana-client\u8bbe\u7f6e\u4e00\u4e2a\u672c\u5730\u5ba2\u6237\u7aef\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u6e38\u4e50\u573a\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/introduction-to-rust/README":{"id":"Solana-Co-Learn/module3/introduction-to-rust/README","title":"Rust\u7b80\u4ecb","description":"- \ud83c\udfac \u4e0eGage\u4e00\u8d77\u8fdb\u884c\u8282\u76ee\u5f00\u53d1","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README":{"id":"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README","title":"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a","description":"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u54c8\u3002\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\u505a\u4e86\u5f88\u591a\u5f88\u9177\u7684\u4e8b\u60c5\u3002\u6211\u4eec\u5efa\u7acb\u4e86\u5404\u79cd\u7c7b\u578b\u7684\u5ba2\u6237\u7aef\uff0c\u521b\u5efa\u4e86NFT\u6536\u85cf\u54c1\uff0c\u94f8\u9020\u4e86SPL\u4ee3\u5e01\uff0c\u751a\u81f3\u6784\u5efa\u4e86\u7528\u6237\u754c\u9762\uff0c\u8ba9\u5176\u4ed6\u4eba\u4e0e\u5b83\u4eec\u8fdb\u884c\u4ea4\u4e92\u3002\u7136\u800c\uff0c\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u6240\u505a\u7684\u4e00\u5207\u90fd\u662f\u57fa\u4e8e\u73b0\u6709\u7684\u7a0b\u5e8f\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README":{"id":"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README","title":"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f","description":"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u8282\u76ee\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u7ee7\u7eed\u5f00\u53d1\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u4e0d\u4e00\u5b9a\u975e\u5f97\u662f\u7535\u5f71\uff0c\u6211\u53c8\u4e0d\u662f\u4f60\u7238\u7238\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/native-solana-development/README":{"id":"Solana-Co-Learn/module3/native-solana-development/README","title":"\u539f\u751fSOLANA\u5f00\u53d1","description":"- The Rust layer cake","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/native-solana-development/state-management/README":{"id":"Solana-Co-Learn/module3/native-solana-development/state-management/README","title":"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406","description":"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e2d\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u6784\u5efa\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u7535\u5f71\uff0c\u6211\u4e0d\u662f\u4f60\u7238\u7238\u3002\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u7c7b\u578b\u7684\u72b6\u6001\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u72b6\u6001\u662f\u6307\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u7a0b\u5e8f\u6570\u636e\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README":{"id":"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README","title":"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5","description":"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\uff0c\u6211\u4eec\u5df2\u7ecf\u6253\u62db\u547c\u4e86\u3002\u73b0\u5728\u662f\u65f6\u5019\u5b66\u4e60\u5982\u4f55\u5904\u7406\u6307\u4ee4\u6570\u636e\u4e86\uff0c\u5c31\u50cf\u6211\u4eec\u5728\u5ba2\u6237\u7aef\u5f00\u53d1\u4e2d\u6240\u505a\u7684\u4e00\u6837\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README":{"id":"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README","title":"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212","description":"\u4eca\u5929\uff0c\u6211\u4eec\u5c06\u7f16\u5199\u6211\u4eec\u7684\u8d28\u62bc\u7a0b\u5e8f\uff0c\u5e76\u7f16\u5199\u6240\u6709\u5fc5\u8981\u7684\u8d28\u62bc\u529f\u80fd\uff0c\u800c\u4e0d\u8fdb\u884c\u4efb\u4f55\u4ee3\u5e01\u8f6c\u8d26\u3002\u6211\u5c06\u4e0e\u60a8\u4e00\u8d77\u9010\u6b65\u8bb2\u89e3\u6574\u4e2a\u8fc7\u7a0b\uff0c\u89e3\u91ca\u6bcf\u4e2a\u6b65\u9aa4\uff0c\u4ee5\u4fbf\u60a8\u4e86\u89e3\u6b63\u5728\u53d1\u751f\u7684\u4e8b\u60c5\u3002\u8ba9\u6211\u4eec\u9996\u5148\u8fdb\u5165Solana Playground\uff0c\u5728 create a new project \u4e0a\u70b9\u51fb\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a src \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e2a\u540d\u4e3a lib.rs \u7684\u6587\u4ef6\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/nft-staking/how-staking-works/README":{"id":"Solana-Co-Learn/module3/nft-staking/how-staking-works/README","title":"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406","description":"\u4f60\u5df2\u7ecf\u63a5\u8fd1\u5b8c\u6210\u7b2c\u4e09\u5468\u4e86\uff01\u8ba9\u6211\u4eec\u628a\u4f60\u5b66\u5230\u7684\u4e00\u5207\u90fd\u7528\u5728\u4e0e\u4f60\u6b63\u5728\u8fdb\u884c\u7684NFT\u9879\u76ee\uff08buildoors\u9879\u76ee\uff09\u76f8\u5173\u7684\u8d28\u62bc\u8ba1\u5212\u4e0a\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/nft-staking/README":{"id":"Solana-Co-Learn/module3/nft-staking/README","title":"NFT\u8d28\u62bc","description":"- \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/README":{"id":"Solana-Co-Learn/module3/README","title":"Module3: Solana Module3","description":"Rust\u7b80\u4ecb","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README":{"id":"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README","title":"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1","description":"\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u56fd\u5bb6\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u5dde\u662f\u6307\u6211\u4eec\u7a0b\u5e8f\u4e2d\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u6570\u636e\u3002\u5982\u679c\u4f60\u8981\u5efa\u7acb\uff0c\u5c31\u5fc5\u987b\u51c6\u5907\u597d\u8fdb\u884c\u9632\u5fa1\u3002\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u9700\u8981\u6ce8\u610f\u7684\u57fa\u672c\u9677\u9631\u3002\u8fd9\u8fdc\u975e\u662f\u7a0b\u5e8f\u5b89\u5168\u7684\u5168\u9762\u6982\u8ff0\uff0c\u4f46\u5b83\u5c06\u5e2e\u52a9\u4f60\u50cf\u653b\u51fb\u8005\u4e00\u6837\u601d\u8003\uff0c\u5e76\u63d0\u51fa\u91cd\u8981\u7684\u95ee\u9898\uff1a\u6211\u8be5\u5982\u4f55\u7834\u89e3\u8fd9\u4e2a\uff1f","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/security-and-validation/README":{"id":"Solana-Co-Learn/module3/security-and-validation/README","title":"\u5b89\u5168\u548c\u9a8c\u8bc1","description":"- \u5b89\u5168\u4e0e\u4fdd\u969c","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README":{"id":"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README","title":"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f","description":"\u662f\u65f6\u5019\u786e\u4fdd\u6ca1\u6709\u4eba\u80fd\u591f\u5bf9\u6211\u4eec\u7684Solana\u7535\u5f71\u6570\u636e\u5e93\uff08SMDB\uff09\u7a0b\u5e8f\u8fdb\u884c\u5e72\u6270\u4e86\u3002\u6211\u4eec\u5c06\u6dfb\u52a0\u4e00\u4e9b\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\uff0c\u8fdb\u884c\u4e00\u4e9b\u8f93\u5165\u9a8c\u8bc1\uff0c\u5e76\u6dfb\u52a0\u4e00\u6761 updatemoviereview \u6307\u4ee4\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README":{"id":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README","title":"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76","description":"\u554a\uff0c\u9e21\u86cb\u3002\u6216\u8005\u6b63\u5f0f\u79f0\u4e4b\u4e3a\uff1a\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\u3002\u6211\u4eec\u4e4b\u524d\u5df2\u7ecf\u7528\u5b83\u4eec\u70f9\u996a\u8fc7\u3002\u8ba9\u6211\u4eec\u6253\u5f00\u5b83\u4eec\u770b\u770b\u5b83\u4eec\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module4/local-ent-setup-and-pdas/README":{"id":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/README","title":"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA","description":"- \ud83d\udc40 \u672c\u5730\u8bbe\u7f6e","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README":{"id":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README","title":"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e","description":"\u662f\u65f6\u5019\u8fdb\u5165\u4e13\u4e1a\u9886\u57df\u4e86\u3002Solana\u6e38\u4e50\u573a\u662f\u4e00\u4e2a\u4ee4\u4eba\u60ca\u53f9\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5165\u95e8\u5e76\u90e8\u7f72\u5230\u5f00\u53d1\u7f51\u7edc\u3002\u7136\u800c\uff0c\u5b83\u8fd8\u4e0d\u9002\u5408\u672c\u5730\u5f00\u53d1\uff0c\u800c\u8fd9\u6b63\u662f\u4e13\u4e1a\u4eba\u58eb\u7684\u505a\u6cd5\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module4/README":{"id":"Solana-Co-Learn/module4/README","title":"Solana Module4","description":"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module5/README":{"id":"Solana-Co-Learn/module5/README","title":"Anchor Program Development","description":"- Anchor \u5f00\u53d1\u7b80\u4ecb","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module6/README":{"id":"Solana-Co-Learn/module6/README","title":"Beyond the Basics","description":"- Solana\u7a0b\u5e8f\u4e2d\u7684\u73af\u5883\u53d8\u91cf","sidebar":"tutorialSidebar"},"Solana-Co-Learn/modules/README":{"id":"Solana-Co-Learn/modules/README","title":"README","description":"Solana program of Solidity by Solang Developement","sidebar":"tutorialSidebar"},"Solana-Co-Learn/README":{"id":"Solana-Co-Learn/README","title":"Solana Co Learn","description":"Module1: Solana Module1","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.db8b5d03.js b/assets/js/935f2afb.db8b5d03.js new file mode 100644 index 000000000..0799631d4 --- /dev/null +++ b/assets/js/935f2afb.db8b5d03.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[53],{1109:a=>{a.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Start","href":"/all-in-one-solana/docs/intro","className":"green","docId":"intro"},{"type":"category","label":"Solana Co Learn tutorials","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"Module1","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello","className":"green","docId":"Solana-Co-Learn/module1/local_program_development/native_program_hello"},{"type":"link","label":"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello","className":"green","docId":"Solana-Co-Learn/module1/local_program_development/anchor_program_hello"},{"type":"link","label":"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello","className":"green","docId":"Solana-Co-Learn/module1/local_program_development/solang_program_hello"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/"},{"type":"category","label":"\u5ba2\u6237\u7aef\u5f00\u53d1","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/","docId":"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README"},{"type":"link","label":"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/","docId":"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README"},{"type":"link","label":"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/","docId":"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/"},{"type":"category","label":"\u94b1\u5305\u548c\u524d\u7aef","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/","docId":"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README"},{"type":"link","label":"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/","docId":"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/"},{"type":"category","label":"\u81ea\u5b9a\u4e49\u6307\u4ee4","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/","docId":"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README"},{"type":"link","label":"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/","docId":"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README"},{"type":"link","label":"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/","docId":"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/"},{"type":"category","label":"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/","docId":"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README"},{"type":"link","label":"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/","docId":"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/"},{"type":"link","label":"Solana\u94b1\u5305\u4f7f\u7528","href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallet-usage/","docId":"Solana-Co-Learn/module1/wallet-usage/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module1/"},{"type":"category","label":"Module2","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"Spl token","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udcb5 The token Program","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/the-token-program/","docId":"Solana-Co-Learn/module2/spl-token/the-token-program/README"},{"type":"link","label":"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/","docId":"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README"},{"type":"link","label":"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/token-metadata/","docId":"Solana-Co-Learn/module2/spl-token/token-metadata/README"},{"type":"link","label":"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/","docId":"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/"},{"type":"category","label":"Ntfs & Minting with metaplex","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83c\udfa8 NFTs on Solana","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/","docId":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README"},{"type":"link","label":"\ud83e\udd28 NFT\u4f60\u7684\u8138","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/","docId":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README"},{"type":"link","label":"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/","docId":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/"},{"type":"category","label":"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u5c55\u793aNFTs \ud83d\udc83","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/","docId":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README"},{"type":"link","label":"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/","docId":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README"},{"type":"link","label":"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/","docId":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/"},{"type":"category","label":"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/","docId":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README"},{"type":"link","label":"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/","docId":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README"},{"type":"link","label":"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762","href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/","docId":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module2/"},{"type":"category","label":"Module3","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"Rust\u7b80\u4ecb","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/","docId":"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README"},{"type":"link","label":"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/","docId":"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README"},{"type":"link","label":"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/","docId":"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/"},{"type":"category","label":"\u539f\u751fSOLANA\u5f00\u53d1","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/","docId":"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README"},{"type":"link","label":"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/","docId":"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README"},{"type":"link","label":"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/state-management/","docId":"Solana-Co-Learn/module3/native-solana-development/state-management/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/"},{"type":"category","label":"\u5b89\u5168\u548c\u9a8c\u8bc1","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/","docId":"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README"},{"type":"link","label":"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/","docId":"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/"},{"type":"category","label":"NFT\u8d28\u62bc","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/","docId":"Solana-Co-Learn/module3/nft-staking/how-staking-works/README"},{"type":"link","label":"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212","href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/","docId":"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module3/"},{"type":"category","label":"Module4","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"category","label":"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA","collapsible":true,"collapsed":true,"className":"green","items":[{"type":"link","label":"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e","href":"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/","docId":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README"},{"type":"link","label":"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76","href":"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/","docId":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/module4/"},{"type":"link","label":"Module5","href":"/all-in-one-solana/docs/Solana-Co-Learn/module5/","docId":"Solana-Co-Learn/module5/README"},{"type":"link","label":"Module6","href":"/all-in-one-solana/docs/Solana-Co-Learn/module6/","docId":"Solana-Co-Learn/module6/README"},{"type":"link","label":"Modules","href":"/all-in-one-solana/docs/Solana-Co-Learn/modules/","docId":"Solana-Co-Learn/modules/README"}],"href":"/all-in-one-solana/docs/Solana-Co-Learn/"}]},"docs":{"intro":{"id":"intro","title":"Start","description":"- Solana Co Learn","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README":{"id":"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README","title":"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c","description":"\u51c6\u5907\u597d\u6233\u4e00\u4e0bSolana\u7f51\u7edc\u4e86\u5417\uff1f\u6211\u4eec\u5c06\u7f16\u5199\u4e00\u4e2a\u811a\u672c\uff0c\u751f\u6210\u4e00\u4e2a\u5bc6\u94a5\u5bf9\uff0c\u7528devnet SOL\u8d44\u91d1\u8fdb\u884c\u5145\u503c\uff0c\u5e76\u4e0eSolana\u7f51\u7edc\u4e0a\u7684\u73b0\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README":{"id":"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README","title":"\u4ece Solana \ud83e\udd13 \u533a\u5757\u94fe\u8bfb\u53d6\u6570\u636e","description":"\u662f\u65f6\u5019\u56de\u5230\u8fc7\u53bb\u4e86\u3002\u56de\u5230\u5e7c\u513f\u56ed\u7684\u65f6\u5149\u3002\u8fd8\u8bb0\u5f97\u4f60\u5b66\u5230\u7684\u7b2c\u4e00\u4ef6\u4e8b\u662f\u4ec0\u4e48\u5417\uff1f\u5b57\u6bcd\u8868\u3002\u4e00\u65e6\u4f60\u5f81\u670d\u4e86\u5168\u90e826\u4e2a\u5b57\u6bcd\uff0c\u4f60\u5c31\u5b66\u4f1a\u4e86\u9605\u8bfb\u3002\u8fd9\u662f\u4f60\u6210\u4e3aSolana\u5f00\u53d1\u8005\u4e4b\u65c5\u7684\u8d77\u70b9\u3002\u9605\u8bfb\u82f1\u8bed\u7684\u72ec\u7279\u6280\u80fd\u4f7f\u4f60\u6210\u4e3a\u4e86\u73b0\u5728\u8fd9\u4e2a\u80fd\u591f\u5480\u56bc\u77e5\u8bc6\u7684\u8d85\u7ea7\u5927\u8111\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/client-side-development/README":{"id":"Solana-Co-Learn/module1/client-side-development/README","title":"\u5ba2\u6237\u7aef\u5f00\u53d1","description":"- \ud83d\udcf9\u4f7f\u7528Gage\u5728Solana\u4e0a\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README":{"id":"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README","title":"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe","description":"\u662f\u65f6\u5019\u6bd5\u4e1a\u4e86\u5e7c\u513f\u56ed\u3002\u6211\u4eec\u5bf9\u9605\u8bfb\u4e86\u5982\u6307\u638c - \u4f60\u53ea\u9700\u5bf9JSON RPC\u7aef\u70b9\u8fdb\u884cAPI\u8c03\u7528\u3002\u8ba9\u6211\u4eec\u6765\u5199\u5165\u533a\u5757\u94fe\u5427\uff01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README":{"id":"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README","title":"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u7528\u8d77\u6765\u5427\uff01\u4e3a\u4e86\u5c06\u6240\u6709\u5185\u5bb9\u6574\u5408\u5728\u4e00\u8d77\uff0c\u6211\u4eec\u5c06\u6784\u5efa\u4e00\u4e2a\u57fa\u4e8e\u533a\u5757\u94fe\u7684\u7535\u5f71\u8bc4\u8bba\u5e94\u7528\u2014\u2014\u5b83\u5c06\u5141\u8bb8\u4efb\u4f55\u4eba\u63d0\u4ea4\u4ed6\u4eec\u6700\u559c\u6b22\u7684\u7535\u5f71\u7684\u8bc4\u8bba\uff0c\u6709\u70b9\u7c7b\u4f3c\u4e8e\u70c2\u756a\u8304\u7f51\u7ad9\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README":{"id":"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README","title":"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u4f60\u73b0\u5728\u77e5\u9053\u5982\u4f55\u8bfb\u53d6\u6570\u636e\u5e76\u901a\u8fc7\u7b80\u5355\u7684\u4ea4\u6613\u5199\u5165\u7f51\u7edc\u3002\u51e0\u4e4e\u7acb\u5373\uff0c\u4f60\u4f1a\u53d1\u73b0\u81ea\u5df1\u60f3\u8981\u901a\u8fc7\u4ea4\u6613\u53d1\u9001\u6570\u636e\u3002\u90a3\u4e48\u8ba9\u6211\u4eec\u770b\u770b\u5982\u4f55\u5411Solana\u533a\u5757\u94fe\u8bb2\u8ff0\u4f60\u7684\u6545\u4e8b\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/custom-instruction/README":{"id":"Solana-Co-Learn/module1/custom-instruction/README","title":"\u81ea\u5b9a\u4e49\u6307\u4ee4","description":"- \ud83d\udcf9\u4f7f\u7528Gage\u81ea\u5b9a\u4e49\u6307\u4ee4","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README":{"id":"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README","title":"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u5c06\u6570\u636e\u5199\u5165\u7f51\u7edc\u8d26\u6237\u53ea\u662f\u6218\u6597\u7684\u4e00\u534a\uff0c\u53e6\u4e00\u534a\u662f\u8bfb\u53d6\u6570\u636e\u3002\u5728\u7b2c\u4e00\u90e8\u5206\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86Web3.js\u5e93\u4e2d\u7684\u5185\u7f6e\u51fd\u6570\u6765\u8bfb\u53d6\u5185\u5bb9\u3002\u8fd9\u4ec5\u9002\u7528\u4e8e\u7edd\u5bf9\u5fc5\u8981\u7684\u6570\u636e\uff0c\u5982\u4f59\u989d\u548c\u4ea4\u6613\u8be6\u60c5\u3002\u6b63\u5982\u6211\u4eec\u5728\u4e0a\u4e00\u90e8\u5206\u4e2d\u6240\u770b\u5230\u7684\uff0c\u6240\u6709\u597d\u4e1c\u897f\u90fd\u5728PDAs\u4e2d\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/local_program_development/anchor_program_hello":{"id":"Solana-Co-Learn/module1/local_program_development/anchor_program_hello","title":"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b","description":"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/local_program_development/local_program_development":{"id":"Solana-Co-Learn/module1/local_program_development/local_program_development","title":"Local Program Development","description":"\u7b80\u800c\u8a00\u4e4b","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/local_program_development/native_program_hello":{"id":"Solana-Co-Learn/module1/local_program_development/native_program_hello","title":"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b","description":"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/local_program_development/solang_program_hello":{"id":"Solana-Co-Learn/module1/local_program_development/solang_program_hello","title":"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b","description":"\u6b22\u8fce\u6765\u5230Solana\u5165\u95e8\u6307\u5357\uff01Solang\u662f\u4e00\u4e2aSolidity\u7f16\u8bd1\u5668\uff0c\u5b83\u5141\u8bb8\u60a8\u4f7f\u7528Solidity\u7f16\u7a0b\u8bed\u8a00\u7f16\u5199Solana\u7a0b\u5e8f\uff0c\u5176\u4ed6\u533a\u5757\u94fe\u4e2d\u79f0\u4e3a\u201c\u667a\u80fd\u5408\u7ea6\u201d\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/README":{"id":"Solana-Co-Learn/module1/README","title":"Solana Module1","description":"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello world\u5408\u7ea6","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README":{"id":"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README","title":"\ud83d\udcbb \u6784\u5efa NFT \u94f8\u5e01\u8005\u524d\u7aef","description":"\u6b22\u8fce\u6765\u5230\u4f60\u7684\u7b2c\u4e00\u5468\u7684SHIPPING\u3002\u6bcf\u5468\u4f60\u90fd\u4f1a\u6709\u4e00\u4e2a\u4e13\u95e8\u7684\u90e8\u5206\uff0c\u5c06\u4f60\u7684\u5b66\u4e60\u6210\u679c\u5e94\u7528\u5230\u4f60\u7684\u5b9a\u5236NFT\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u8fd8\u6709\u6218\u5229\u54c1\u7bb1\u5b50\uff01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README":{"id":"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README","title":"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel","description":"\u8fd9\u662f\u4f60\u672c\u5468\u6240\u505a\u7684\u4e00\u5207\u4e2d\u6700\u91cd\u8981\u7684\u90e8\u5206\u3002\u79bb\u5f00\u672c\u5730\u4e3b\u673a\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/start-your-own-custom-project/README":{"id":"Solana-Co-Learn/module1/start-your-own-custom-project/README","title":"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee","description":"- \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/wallet-usage/README":{"id":"Solana-Co-Learn/module1/wallet-usage/README","title":"Solana\u94b1\u5305\u4f7f\u7528","description":"Solana\u7684\u94b1\u5305\u6709\u5f88\u591a\uff0c\u6bd4\u5982\u5f88\u6709\u7684Phantom\u94b1\u5305\u3002\u4f46\u662f\u8fd9\u91cc\u6211\u4e0d\u5728\u63a8\u8350\u4f7f\u7528Phantom\uff0c\u56e0\u4e3a\u4ed6\u5bf9\u4e8e\u5f00\u53d1\u8005","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README":{"id":"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README","title":"\ud83d\udd0c \u8fde\u63a5\u5230\u94b1\u5305 (TODO by davirain)","description":"\u6211\u4eec\u73b0\u5728\u5bf9\u901a\u8fc7\u4ee3\u7801\u4e0e\u7f51\u7edc\u8fdb\u884c\u4ea4\u4e92\u6709\u4e86\u5f88\u591a\u4e86\u89e3\u3002\u4e3a\u4e86\u8fdb\u884c\u4ea4\u6613\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u79c1\u94a5\u3002\u8fd9\u5bf9\u7528\u6237\u6765\u8bf4\u884c\u4e0d\u901a\u54c8\u54c8\u3002\u4e3a\u4e86\u8ba9\u4eba\u4eec\u7528\u771f\u94b1\u4ece\u6211\u4eec\u8fd9\u91cc\u8d2d\u4e70JPEG\u56fe\u50cf\uff0c\u6211\u4eec\u9700\u8981\u4e0e\u94b1\u5305\u5408\u4f5c\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README":{"id":"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README","title":"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module1/wallets-and-frontends/README":{"id":"Solana-Co-Learn/module1/wallets-and-frontends/README","title":"\u94b1\u5305\u548c\u524d\u7aef","description":"- \u8fde\u63a5\u5230\u94b1\u5305","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README":{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README","title":"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u770b\u5230\u95ea\u4eae\u7684\u65b0iPhone\u6709\u591a\u4ee4\u4eba\u5174\u594b\u5417\uff1f\u7a00\u6709\u7684NFT\u6709\u70b9\u50cf\u90a3\u6837\u3002\u5bf9\u4e8e\u4f18\u79c0\u7684\u827a\u672f\u5bb6\u6765\u8bf4\uff0c\u5373\u4f7f\u53ea\u662f\u770b\u7740\u5b83\u4eec\u4e5f\u5f88\u6709\u8da3\u3002\u6bd5\u7adf\uff0c\u827a\u672f\u5c31\u662f\u7528\u6765\u6b23\u8d4f\u7684\uff01\u8ba9\u6211\u4eec\u5f04\u6e05\u695a\u5982\u679c\u6211\u4eec\u53ea\u6709Candy Machine\u7684\u5730\u5740\uff0c\u6211\u4eec\u5982\u4f55\u5c55\u793aNFTs\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README":{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README","title":"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u600e\u4e48\u56de\u4e8b\u3002\u6a21\u677f\u65f6\u95f4\u3002\u7136\u800c\uff0c\u968f\u7740\u6211\u4eec\u6784\u5efa\u7684\u4e1c\u897f\u53d8\u5f97\u66f4\u597d\uff0c\u6211\u4eec\u7684\u6a21\u677f\u4e5f\u4f1a\u53d8\u5f97\u66f4\u597d\u3002\u8fd9\u6b21\u6211\u4eec\u5c06\u5728Solana dApp\u811a\u624b\u67b6\u7684\u57fa\u7840\u4e0a\u6784\u5efa\u4e00\u4e2a\u6a21\u677f\u3002\u548c\u4e4b\u524d\u7684\u6a21\u677f\u4e00\u6837\uff0c\u5b83\u662f\u4e00\u4e2a\u4f7f\u7528 create-next-app \u5236\u4f5c\u7684Next.js\u5e94\u7528\u7a0b\u5e8f\u3002\u4e0d\u540c\u7684\u662f\uff0c\u5b83\u6709\u66f4\u591a\u7684\u529f\u80fd\u3002\u4e0d\u7528\u62c5\u5fc3\uff01\u6211\u4eec\u4ecd\u7136\u4f1a\u4f7f\u7528\u76f8\u540c\u7684\u4e1c\u897f\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README":{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README","title":"\u5c55\u793aNFTs \ud83d\udc83","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u5982\u679c\u4f60\u4e0d\u80fd\u70ab\u8000\u4f60\u7684NFT\uff0c\u90a3\u5b83\u6709\u4ec0\u4e48\u7528\u5462\uff01\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u5e2e\u52a9\u4f60\u5c55\u793a\u4f60\u7684\u4f5c\u54c1\uff08\u5047\u8bbe\u4f60\u7684NFT\u662f\u8d5a\u94b1\u7684\uff09\uff1a\u9996\u5148\u5728\u94b1\u5305\u4e2d\u5c55\u793a\u5b83\uff0c\u7136\u540e\u5728Candy Machine\u4e2d\u5c55\u793a\u5b83\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README":{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README","title":"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS","description":"- \u4f7f\u7528Gage\u5236\u4f5c\u7528\u6237\u754c\u9762","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README":{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README","title":"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a","description":"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff0c\u5b83\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u8ba9\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u7684\u968f\u673a\u5316\u3002\u51c6\u5907\u597d\u5c06\u4e00\u4e9b\u4e1c\u897f\u653e\u5165\u6211\u4eec\u5728\u4e0a\u4e00\u8bfe\u4e2d\u521b\u5efa\u4f46\u6ca1\u6709\u4f7f\u7528\u7684\u6587\u4ef6\u5939\u4e2d\u4e86\u5417\uff1f","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README":{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README","title":"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u662f\u65f6\u5019\u56de\u5230\u6211\u4eec\u7684\u81ea\u5b9a\u4e49NFT\u8d28\u62bc\u5e94\u7528\u4e86\u3002\u6211\u4eec\u5c06\u5229\u7528\u6211\u4eec\u5728\u4ee3\u5e01\u7a0b\u5e8f\u548c\u7cd6\u679c\u673a\u4e0a\u7684\u7ecf\u9a8c\u6765\u6784\u5efa\u6211\u4eec\u7684\u5e94\u7528\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README":{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README","title":"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762","description":"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u6210\u529f\u521b\u5efa\u4e86\u4ee3\u5e01\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFT\uff09\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u521b\u5efa\u6211\u4eec\u7684\u94f8\u5e01\u7528\u6237\u754c\u9762\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u76f4\u89c2\u5730\u4e0e\u667a\u80fd\u5408\u7ea6\u8fdb\u884c\u4ea4\u4e92\uff0c\u5e76\u5141\u8bb8\u5176\u4ed6\u4eba\u5728\u6211\u4eec\u7684\u6d4f\u89c8\u5668\u4e0a\u94f8\u9020\u6211\u4eec\u7684NFT\uff01\u8fd9\u4e0d\u662f\u5f88\u9177\u5417\uff1f\u5982\u679c\u4f60\u6ce8\u610f\u5230\uff0c\u4f60\u7684\u7f51\u7ad9\u76ee\u524d\u6709\u4e00\u4e2a minting \u6309\u94ae\uff0c\u4f46\u5b83\u8fd8\u6ca1\u6709\u4efb\u4f55\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u51fd\u6570\u5f00\u59cb\uff0c\u5e76\u6dfb\u52a0\u4e00\u4e9b\u903b\u8f91\uff0c\u4ee5\u5141\u8bb8\u6211\u4eec\u94f8\u9020\u6211\u4eec\u7684NFT\u3002\u5982\u679c\u4f60\u6ca1\u6709\u8d77\u59cb\u4ee3\u7801\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u91cc\u514b\u9686\u5b83\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README":{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README","title":"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247","description":"- \ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README":{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README","title":"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI","description":"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u9020\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u5988\u5988\u4f60\u5728\u533a\u5757\u94fe\u4e0a\u3002\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2a\u5355\u72ec\u7684NFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u8fc7\u7a0b\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README":{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README","title":"\ud83e\udd28 NFT\u4f60\u7684\u8138","description":"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u9009\u62e9\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u8bbe\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u7684\u5988\u5988\u4f60\u5df2\u7ecf\u767b\u4e0a\u4e86\u533a\u5757\u94fe\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README":{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README","title":"\ud83c\udfa8 NFTs on Solana","description":"\u6211\u4eec\u5230\u4e86\u3002\u6ca1\u82b1\u592a\u957f\u65f6\u95f4\u3002\u7334\u5b50\u56fe\u7247\u3002\u733f\u7c7b\u3002\u5ca9\u77f3\u3002\u8fd8\u6709\u5176\u4ed6\u52a8\u7269\u4e3b\u9898\u7684\u5934\u50cf\uff0c\u770b\u8d77\u6765\u4e11\u5f97\u8981\u547d\uff0c\u4f46\u5374\u80fd\u5356\u523010\u4e07\u7f8e\u5143\uff0c\u8fd9\u5c31\u662fNFT\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README":{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README","title":"Ntfs & Minting with metaplex","description":"- \ud83c\udfac NFTs on Solana with Gage","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/README":{"id":"Solana-Co-Learn/module2/README","title":"Solana Module2","description":"SPL\u4ee3\u5e01","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README":{"id":"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README","title":"\ud83e\uddec \u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd","description":"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README":{"id":"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README","title":"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01","description":"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e0a\u4e00\u8282\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002\u8bf4\u4e86\u8fd9\u4e48\u591a\uff0c\u8ba9\u6211\u4eec\u6765\u521b\u9020\u4e00\u4e9b\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5427\u3002\u5728\u6211\u4eec\u7684\u6700\u7ec8\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u4ee3\u5e01\uff0c\u4f60\u5c06\u968f\u7740\u62b5\u62bc\u4f60\u7684\u793e\u533aNFT\u800c\u9010\u6e10\u83b7\u5f97\u5b83\u3002\u5728\u90a3\u4e4b\u524d\uff0c\u8ba9\u6211\u4eec\u5148\u73a9\u4e00\u4e0b\u5b9e\u9645\u6784\u5efa\u8fd9\u4e2a\u94f8\u5e01\u8fc7\u7a0b\u7684\u8fc7\u7a0b\u3002\u73b0\u5728\u662f\u53d1\u6325\u4f60\u7684\u60f3\u8c61\u529b\uff0c\u5c3d\u60c5\u4eab\u53d7\u7684\u597d\u65f6\u673a\u3002\u4e5f\u8bb8\u4f60\u4e00\u76f4\u60f3\u521b\u5efa\u81ea\u5df1\u7684\u6a21\u56e0\u5e01 - \u73b0\u5728\u662f\u4f60\u7684\u673a\u4f1a\u4e86 \ud83d\ude80","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/README":{"id":"Solana-Co-Learn/module2/spl-token/README","title":"SPL\u4ee3\u5e01","description":"- \ud83d\udcf9\u5e26\u6709Gage\u7684\u4ee4\u724c","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/the-token-program/README":{"id":"Solana-Co-Learn/module2/spl-token/the-token-program/README","title":"\ud83d\udcb5 The Token Program","description":"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u5728\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u4e2d\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002\u4f5c\u4e3a\u533a\u5757\u94fe\u6700\u521d\u7684\u627f\u8bfa\uff0c\u4e5f\u53ef\u80fd\u662f\u4f60\u5b89\u88c5\u94b1\u5305\u7684\u4e3b\u8981\u539f\u56e0\uff0c\u8fd9\u4e9b\u8c26\u900a\u7684\u4ee3\u5e01\u662f\u5bf9\u533a\u5757\u94fe\u4e0a\u8d44\u4ea7\u7684\u6700\u7eaf\u7cb9\u7684\u8868\u8fbe\uff0c\u4ece\u5408\u6210\u80a1\u7968\u5230\u6570\u767e\u79cd\u72d7\u5e01\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module2/spl-token/token-metadata/README":{"id":"Solana-Co-Learn/module2/spl-token/token-metadata/README","title":"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e","description":"\u662f\u65f6\u5019\u8ba9\u4ee4\u724c\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e4b\u524d\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README":{"id":"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README","title":"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c","description":"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README":{"id":"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README","title":"\ud83d\udc4b \u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92","description":"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u521b\u5efa\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\u3002\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u90e8\u7f72\u4e86\u6211\u4eec\u7684\u7a0b\u5e8f\uff0c\u6211\u4eec\u53ef\u4ee5\u4e0e\u4e4b\u4ea4\u4e92\u3002\u5728\u4e4b\u524d\u7684\u90e8\u5206\u4e2d\uff0c\u4f60\u5df2\u7ecf\u505a\u8fc7\u5f88\u591a\u6b21\u4e86\uff01\u4f60\u53ef\u4ee5\u50cf\u4ee5\u524d\u4e00\u6837create-solana-client\u8bbe\u7f6e\u4e00\u4e2a\u672c\u5730\u5ba2\u6237\u7aef\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u6e38\u4e50\u573a\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/introduction-to-rust/README":{"id":"Solana-Co-Learn/module3/introduction-to-rust/README","title":"Rust\u7b80\u4ecb","description":"- \ud83c\udfac \u4e0eGage\u4e00\u8d77\u8fdb\u884c\u8282\u76ee\u5f00\u53d1","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README":{"id":"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README","title":"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a","description":"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u54c8\u3002\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\u505a\u4e86\u5f88\u591a\u5f88\u9177\u7684\u4e8b\u60c5\u3002\u6211\u4eec\u5efa\u7acb\u4e86\u5404\u79cd\u7c7b\u578b\u7684\u5ba2\u6237\u7aef\uff0c\u521b\u5efa\u4e86NFT\u6536\u85cf\u54c1\uff0c\u94f8\u9020\u4e86SPL\u4ee3\u5e01\uff0c\u751a\u81f3\u6784\u5efa\u4e86\u7528\u6237\u754c\u9762\uff0c\u8ba9\u5176\u4ed6\u4eba\u4e0e\u5b83\u4eec\u8fdb\u884c\u4ea4\u4e92\u3002\u7136\u800c\uff0c\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u6240\u505a\u7684\u4e00\u5207\u90fd\u662f\u57fa\u4e8e\u73b0\u6709\u7684\u7a0b\u5e8f\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README":{"id":"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README","title":"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f","description":"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u8282\u76ee\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u7ee7\u7eed\u5f00\u53d1\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u4e0d\u4e00\u5b9a\u975e\u5f97\u662f\u7535\u5f71\uff0c\u6211\u53c8\u4e0d\u662f\u4f60\u7238\u7238\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/native-solana-development/README":{"id":"Solana-Co-Learn/module3/native-solana-development/README","title":"\u539f\u751fSOLANA\u5f00\u53d1","description":"- The Rust layer cake","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/native-solana-development/state-management/README":{"id":"Solana-Co-Learn/module3/native-solana-development/state-management/README","title":"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406","description":"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e2d\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u6784\u5efa\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u7535\u5f71\uff0c\u6211\u4e0d\u662f\u4f60\u7238\u7238\u3002\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u7c7b\u578b\u7684\u72b6\u6001\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u72b6\u6001\u662f\u6307\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u7a0b\u5e8f\u6570\u636e\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README":{"id":"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README","title":"\ud83c\udf82 Rust\u7684\u5206\u5c42\u86cb\u7cd5","description":"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\uff0c\u6211\u4eec\u5df2\u7ecf\u6253\u62db\u547c\u4e86\u3002\u73b0\u5728\u662f\u65f6\u5019\u5b66\u4e60\u5982\u4f55\u5904\u7406\u6307\u4ee4\u6570\u636e\u4e86\uff0c\u5c31\u50cf\u6211\u4eec\u5728\u5ba2\u6237\u7aef\u5f00\u53d1\u4e2d\u6240\u505a\u7684\u4e00\u6837\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README":{"id":"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README","title":"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212","description":"\u4eca\u5929\uff0c\u6211\u4eec\u5c06\u7f16\u5199\u6211\u4eec\u7684\u8d28\u62bc\u7a0b\u5e8f\uff0c\u5e76\u7f16\u5199\u6240\u6709\u5fc5\u8981\u7684\u8d28\u62bc\u529f\u80fd\uff0c\u800c\u4e0d\u8fdb\u884c\u4efb\u4f55\u4ee3\u5e01\u8f6c\u8d26\u3002\u6211\u5c06\u4e0e\u60a8\u4e00\u8d77\u9010\u6b65\u8bb2\u89e3\u6574\u4e2a\u8fc7\u7a0b\uff0c\u89e3\u91ca\u6bcf\u4e2a\u6b65\u9aa4\uff0c\u4ee5\u4fbf\u60a8\u4e86\u89e3\u6b63\u5728\u53d1\u751f\u7684\u4e8b\u60c5\u3002\u8ba9\u6211\u4eec\u9996\u5148\u8fdb\u5165Solana Playground\uff0c\u5728 create a new project \u4e0a\u70b9\u51fb\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a src \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e2a\u540d\u4e3a lib.rs \u7684\u6587\u4ef6\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/nft-staking/how-staking-works/README":{"id":"Solana-Co-Learn/module3/nft-staking/how-staking-works/README","title":"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406","description":"\u4f60\u5df2\u7ecf\u63a5\u8fd1\u5b8c\u6210\u7b2c\u4e09\u5468\u4e86\uff01\u8ba9\u6211\u4eec\u628a\u4f60\u5b66\u5230\u7684\u4e00\u5207\u90fd\u7528\u5728\u4e0e\u4f60\u6b63\u5728\u8fdb\u884c\u7684NFT\u9879\u76ee\uff08buildoors\u9879\u76ee\uff09\u76f8\u5173\u7684\u8d28\u62bc\u8ba1\u5212\u4e0a\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/nft-staking/README":{"id":"Solana-Co-Learn/module3/nft-staking/README","title":"NFT\u8d28\u62bc","description":"- \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/README":{"id":"Solana-Co-Learn/module3/README","title":"Module3: Solana Module3","description":"Rust\u7b80\u4ecb","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README":{"id":"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README","title":"\u2757 \u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1","description":"\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u56fd\u5bb6\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u5dde\u662f\u6307\u6211\u4eec\u7a0b\u5e8f\u4e2d\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u6570\u636e\u3002\u5982\u679c\u4f60\u8981\u5efa\u7acb\uff0c\u5c31\u5fc5\u987b\u51c6\u5907\u597d\u8fdb\u884c\u9632\u5fa1\u3002\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u4e00\u4e9b\u9700\u8981\u6ce8\u610f\u7684\u57fa\u672c\u9677\u9631\u3002\u8fd9\u8fdc\u975e\u662f\u7a0b\u5e8f\u5b89\u5168\u7684\u5168\u9762\u6982\u8ff0\uff0c\u4f46\u5b83\u5c06\u5e2e\u52a9\u4f60\u50cf\u653b\u51fb\u8005\u4e00\u6837\u601d\u8003\uff0c\u5e76\u63d0\u51fa\u91cd\u8981\u7684\u95ee\u9898\uff1a\u6211\u8be5\u5982\u4f55\u7834\u89e3\u8fd9\u4e2a\uff1f","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/security-and-validation/README":{"id":"Solana-Co-Learn/module3/security-and-validation/README","title":"\u5b89\u5168\u548c\u9a8c\u8bc1","description":"- \u5b89\u5168\u4e0e\u4fdd\u969c","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README":{"id":"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README","title":"\ud83d\udd11 \u4fdd\u62a4\u6211\u4eec\u7684\u7a0b\u5e8f","description":"\u662f\u65f6\u5019\u786e\u4fdd\u6ca1\u6709\u4eba\u80fd\u591f\u5bf9\u6211\u4eec\u7684Solana\u7535\u5f71\u6570\u636e\u5e93\uff08SMDB\uff09\u7a0b\u5e8f\u8fdb\u884c\u5e72\u6270\u4e86\u3002\u6211\u4eec\u5c06\u6dfb\u52a0\u4e00\u4e9b\u57fa\u672c\u7684\u5b89\u5168\u63aa\u65bd\uff0c\u8fdb\u884c\u4e00\u4e9b\u8f93\u5165\u9a8c\u8bc1\uff0c\u5e76\u6dfb\u52a0\u4e00\u6761 updatemoviereview \u6307\u4ee4\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README":{"id":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README","title":"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76","description":"\u554a\uff0c\u9e21\u86cb\u3002\u6216\u8005\u6b63\u5f0f\u79f0\u4e4b\u4e3a\uff1a\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740\u3002\u6211\u4eec\u4e4b\u524d\u5df2\u7ecf\u7528\u5b83\u4eec\u70f9\u996a\u8fc7\u3002\u8ba9\u6211\u4eec\u6253\u5f00\u5b83\u4eec\u770b\u770b\u5b83\u4eec\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module4/local-ent-setup-and-pdas/README":{"id":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/README","title":"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA","description":"- \ud83d\udc40 \u672c\u5730\u8bbe\u7f6e","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README":{"id":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README","title":"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e","description":"\u662f\u65f6\u5019\u8fdb\u5165\u4e13\u4e1a\u9886\u57df\u4e86\u3002Solana\u6e38\u4e50\u573a\u662f\u4e00\u4e2a\u4ee4\u4eba\u60ca\u53f9\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5165\u95e8\u5e76\u90e8\u7f72\u5230\u5f00\u53d1\u7f51\u7edc\u3002\u7136\u800c\uff0c\u5b83\u8fd8\u4e0d\u9002\u5408\u672c\u5730\u5f00\u53d1\uff0c\u800c\u8fd9\u6b63\u662f\u4e13\u4e1a\u4eba\u58eb\u7684\u505a\u6cd5\u3002","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module4/README":{"id":"Solana-Co-Learn/module4/README","title":"Solana Module4","description":"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module5/README":{"id":"Solana-Co-Learn/module5/README","title":"Anchor Program Development","description":"- Anchor \u5f00\u53d1\u7b80\u4ecb","sidebar":"tutorialSidebar"},"Solana-Co-Learn/module6/README":{"id":"Solana-Co-Learn/module6/README","title":"Beyond the Basics","description":"- Solana\u7a0b\u5e8f\u4e2d\u7684\u73af\u5883\u53d8\u91cf","sidebar":"tutorialSidebar"},"Solana-Co-Learn/modules/README":{"id":"Solana-Co-Learn/modules/README","title":"README","description":"Solana program of Solidity by Solang Developement","sidebar":"tutorialSidebar"},"Solana-Co-Learn/README":{"id":"Solana-Co-Learn/README","title":"Solana Co Learn","description":"Module1: Solana Module1","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/9aef0bec.35a70f1e.js b/assets/js/9aef0bec.35a70f1e.js deleted file mode 100644 index 62db0756d..000000000 --- a/assets/js/9aef0bec.35a70f1e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3707],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>y});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),c=p(r),d=a,y=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return r?n.createElement(y,l(l({ref:t},s),{},{components:r})):n.createElement(y,l({ref:t},s))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,l[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={sidebar_position:98,sidebar_label:"Modules",sidebar_class_name:"green"},l=void 0,i={unversionedId:"Solana-Co-Learn/modules/README",id:"Solana-Co-Learn/modules/README",title:"README",description:"Solana program of Solidity by Solang Developement",source:"@site/docs/Solana-Co-Learn/modules/README.md",sourceDirName:"Solana-Co-Learn/modules",slug:"/Solana-Co-Learn/modules/",permalink:"/docs/Solana-Co-Learn/modules/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/modules/README.md",tags:[],version:"current",sidebarPosition:98,frontMatter:{sidebar_position:98,sidebar_label:"Modules",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module6",permalink:"/docs/Solana-Co-Learn/module6/"}},u={},p=[{value:"Solana program of Solidity by Solang Developement",id:"solana-program-of-solidity-by-solang-developement",level:2},{value:"Solana\u7a0b\u5e8f\u5b89\u5168",id:"solana\u7a0b\u5e8f\u5b89\u5168",level:2}],s={toc:p},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"solana-program-of-solidity-by-solang-developement"},"Solana program of Solidity by Solang Developement"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Solidity \u4e0ePDAs"),(0,a.kt)("li",{parentName:"ul"},"Solidity \u4e0e CPIs"),(0,a.kt)("li",{parentName:"ul"},"etc")),(0,a.kt)("h2",{id:"solana\u7a0b\u5e8f\u5b89\u5168"},"Solana\u7a0b\u5e8f\u5b89\u5168"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5904\u7406\u7a0b\u5e8f\u5b89\u5168\u6a21\u5757"),(0,a.kt)("li",{parentName:"ul"},"\u7b7e\u540d\u4eba\u6388\u6743"),(0,a.kt)("li",{parentName:"ul"},"Owner check"),(0,a.kt)("li",{parentName:"ul"},"\u8d26\u6237\u6570\u636e\u5339\u914d"),(0,a.kt)("li",{parentName:"ul"},"\u91cd\u65b0\u521d\u59cb\u5316\u653b\u51fb"),(0,a.kt)("li",{parentName:"ul"},"\u91cd\u590d\u7684\u53ef\u53d8\u8d26\u6237"),(0,a.kt)("li",{parentName:"ul"},"Type cosplay"),(0,a.kt)("li",{parentName:"ul"},"Arbitrary CPIs"),(0,a.kt)("li",{parentName:"ul"},"\u78b0\u649e\u79cd\u5b50\u89c4\u8303\u5316"),(0,a.kt)("li",{parentName:"ul"},"\u5173\u95ed\u8d26\u6237\u548c\u6062\u590d\u653b\u51fb"),(0,a.kt)("li",{parentName:"ul"},"PDA sharing")),(0,a.kt)("h1",{id:"\u5176\u4ed6"},"\u5176\u4ed6"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728Solana\u4e2d\u4f7f\u7528The Graph"),(0,a.kt)("li",{parentName:"ul"},"Oracles Pyth sdk\u7684\u4f7f\u7528"),(0,a.kt)("li",{parentName:"ul"},"TipLink \u5982\u4f55\u4f7f\u7528"),(0,a.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728quicknode\u7533\u8bf7RPC endpoint"),(0,a.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728helius\u7533\u8bf7RPC endpoint"),(0,a.kt)("li",{parentName:"ul"},"etc ...")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9aef0bec.637e55fa.js b/assets/js/9aef0bec.637e55fa.js new file mode 100644 index 000000000..b3b7bf1bd --- /dev/null +++ b/assets/js/9aef0bec.637e55fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3707],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>y});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),s=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(u.Provider,{value:t},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=s(r),d=a,y=c["".concat(u,".").concat(d)]||c[d]||m[d]||o;return r?n.createElement(y,l(l({ref:t},p),{},{components:r})):n.createElement(y,l({ref:t},p))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[c]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(7462),a=(r(7294),r(3905));const o={sidebar_position:98,sidebar_label:"Modules",sidebar_class_name:"green"},l=void 0,i={unversionedId:"Solana-Co-Learn/modules/README",id:"Solana-Co-Learn/modules/README",title:"README",description:"Solana program of Solidity by Solang Developement",source:"@site/docs/Solana-Co-Learn/modules/README.md",sourceDirName:"Solana-Co-Learn/modules",slug:"/Solana-Co-Learn/modules/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/modules/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/modules/README.md",tags:[],version:"current",sidebarPosition:98,frontMatter:{sidebar_position:98,sidebar_label:"Modules",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module6",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module6/"}},u={},s=[{value:"Solana program of Solidity by Solang Developement",id:"solana-program-of-solidity-by-solang-developement",level:2},{value:"Solana\u7a0b\u5e8f\u5b89\u5168",id:"solana\u7a0b\u5e8f\u5b89\u5168",level:2}],p={toc:s},c="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(c,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"solana-program-of-solidity-by-solang-developement"},"Solana program of Solidity by Solang Developement"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Solidity \u4e0ePDAs"),(0,a.kt)("li",{parentName:"ul"},"Solidity \u4e0e CPIs"),(0,a.kt)("li",{parentName:"ul"},"etc")),(0,a.kt)("h2",{id:"solana\u7a0b\u5e8f\u5b89\u5168"},"Solana\u7a0b\u5e8f\u5b89\u5168"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5904\u7406\u7a0b\u5e8f\u5b89\u5168\u6a21\u5757"),(0,a.kt)("li",{parentName:"ul"},"\u7b7e\u540d\u4eba\u6388\u6743"),(0,a.kt)("li",{parentName:"ul"},"Owner check"),(0,a.kt)("li",{parentName:"ul"},"\u8d26\u6237\u6570\u636e\u5339\u914d"),(0,a.kt)("li",{parentName:"ul"},"\u91cd\u65b0\u521d\u59cb\u5316\u653b\u51fb"),(0,a.kt)("li",{parentName:"ul"},"\u91cd\u590d\u7684\u53ef\u53d8\u8d26\u6237"),(0,a.kt)("li",{parentName:"ul"},"Type cosplay"),(0,a.kt)("li",{parentName:"ul"},"Arbitrary CPIs"),(0,a.kt)("li",{parentName:"ul"},"\u78b0\u649e\u79cd\u5b50\u89c4\u8303\u5316"),(0,a.kt)("li",{parentName:"ul"},"\u5173\u95ed\u8d26\u6237\u548c\u6062\u590d\u653b\u51fb"),(0,a.kt)("li",{parentName:"ul"},"PDA sharing")),(0,a.kt)("h1",{id:"\u5176\u4ed6"},"\u5176\u4ed6"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728Solana\u4e2d\u4f7f\u7528The Graph"),(0,a.kt)("li",{parentName:"ul"},"Oracles Pyth sdk\u7684\u4f7f\u7528"),(0,a.kt)("li",{parentName:"ul"},"TipLink \u5982\u4f55\u4f7f\u7528"),(0,a.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728quicknode\u7533\u8bf7RPC endpoint"),(0,a.kt)("li",{parentName:"ul"},"\u5982\u4f55\u5728helius\u7533\u8bf7RPC endpoint"),(0,a.kt)("li",{parentName:"ul"},"etc ...")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9f5c2a59.1f1df22d.js b/assets/js/9f5c2a59.1f1df22d.js new file mode 100644 index 000000000..b1eaedd70 --- /dev/null +++ b/assets/js/9f5c2a59.1f1df22d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9962],{3905:(e,n,a)=>{a.d(n,{Zo:()=>i,kt:()=>k});var t=a(7294);function l(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function o(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function r(e){for(var n=1;n=0||(l[a]=e[a]);return l}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var p=t.createContext({}),u=function(e){var n=t.useContext(p),a=n;return e&&(a="function"==typeof e?e(n):r(r({},n),e)),a},i=function(e){var n=u(e.components);return t.createElement(p.Provider,{value:n},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},d=t.forwardRef((function(e,n){var a=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,i=s(e,["components","mdxType","originalType","parentName"]),c=u(a),d=l,k=c["".concat(p,".").concat(d)]||c[d]||m[d]||o;return a?t.createElement(k,r(r({ref:n},i),{},{components:a})):t.createElement(k,r({ref:n},i))}));function k(e,n){var a=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var o=a.length,r=new Array(o);r[0]=d;var s={};for(var p in n)hasOwnProperty.call(n,p)&&(s[p]=n[p]);s.originalType=e,s[c]="string"==typeof e?e:l,r[1]=s;for(var u=2;u{a.r(n),a.d(n,{assets:()=>p,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var t=a(7462),l=(a(7294),a(3905));const o={sidebar_position:66,sidebar_label:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",sidebar_class_name:"green"},r="\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",s={unversionedId:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README",id:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README",title:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",description:"\u662f\u65f6\u5019\u8fdb\u5165\u4e13\u4e1a\u9886\u57df\u4e86\u3002Solana\u6e38\u4e50\u573a\u662f\u4e00\u4e2a\u4ee4\u4eba\u60ca\u53f9\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5165\u95e8\u5e76\u90e8\u7f72\u5230\u5f00\u53d1\u7f51\u7edc\u3002\u7136\u800c\uff0c\u5b83\u8fd8\u4e0d\u9002\u5408\u672c\u5730\u5f00\u53d1\uff0c\u800c\u8fd9\u6b63\u662f\u4e13\u4e1a\u4eba\u58eb\u7684\u505a\u6cd5\u3002",source:"@site/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README.md",sourceDirName:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally",slug:"/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README.md",tags:[],version:"current",sidebarPosition:66,frontMatter:{sidebar_position:66,sidebar_label:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/"},next:{title:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/"}},p={},u=[{value:"\ud83e\udd80 \u5b89\u88c5 Rust \u7f16\u8bd1\u5668",id:"-\u5b89\u88c5-rust-\u7f16\u8bd1\u5668",level:2},{value:"\ud83c\udfc4\u200d\u2642\ufe0f \u5b89\u88c5 Solana \u547d\u4ee4\u884c\u754c\u9762 (CLI)",id:"\ufe0f-\u5b89\u88c5-solana-\u547d\u4ee4\u884c\u754c\u9762-cli",level:2},{value:"\u2699 Solana\u914d\u7f6e",id:"-solana\u914d\u7f6e",level:2},{value:"\ud83e\uddbe \u672c\u5730\u7a0b\u5e8f\u90e8\u7f72",id:"-\u672c\u5730\u7a0b\u5e8f\u90e8\u7f72",level:2}],i={toc:u},c="wrapper";function m(e){let{components:n,...o}=e;return(0,l.kt)(c,(0,t.Z)({},i,o,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u672c\u5730\u8bbe\u7f6e"},"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u8fdb\u5165\u4e13\u4e1a\u9886\u57df\u4e86\u3002Solana\u6e38\u4e50\u573a\u662f\u4e00\u4e2a\u4ee4\u4eba\u60ca\u53f9\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5165\u95e8\u5e76\u90e8\u7f72\u5230\u5f00\u53d1\u7f51\u7edc\u3002\u7136\u800c\uff0c\u5b83\u8fd8\u4e0d\u9002\u5408\u672c\u5730\u5f00\u53d1\uff0c\u800c\u8fd9\u6b63\u662f\u4e13\u4e1a\u4eba\u58eb\u7684\u505a\u6cd5\u3002"),(0,l.kt)("p",null,"\u672c\u5730\u8bbe\u7f6e\u9700\u8981\u51e0\u4e2a\u6b65\u9aa4\uff0c\u4f46\u5b83\u66f4\u52a0\u5f3a\u5927 - \u4f60\u57fa\u672c\u4e0a\u5c06\u5728\u4f60\u7684\u8bbe\u5907\u4e0a\u8fd0\u884c\u4e00\u4e2a\u672c\u5730\u7248\u672c\u7684Solana\u7f51\u7edc\u3002\u8fd9\u5e26\u6765\u4e86\u8bb8\u591a\u597d\u5904\uff0c\u5305\u62ec\u51e0\u4e4e\u65e0\u9650\u7684SOL\u3002"),(0,l.kt)("p",null,"\u8fd9\u4e2a\u8bbe\u7f6e\u6709\u4e24\u4e2a\u4e3b\u8981\u90e8\u5206"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Rust\u7f16\u8bd1\u5668"),(0,l.kt)("li",{parentName:"ul"},"Solana\u547d\u4ee4\u884c\u754c\u9762")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Windows\u7528\u6237")),(0,l.kt)("p",null,"\u867d\u7136Solana CLI\u53ef\u4ee5\u5728Windows\u4e0a\u8fd0\u884c\uff0c\u4f46\u5728Linux\u4e0a\u8fd0\u884c\u4f1a\u6709\u66f4\u597d\u7684\u4f53\u9a8c - \u60a8\u4e0d\u4f1a\u9047\u5230Windows\u7279\u5b9a\u7684\u95ee\u9898\uff0c\u5e76\u4e14\u53ef\u4ee5\u4f7f\u7528\u4e0eMacOS/Linux\u7528\u6237\u76f8\u540c\u7684\u547d\u4ee4\u3002"),(0,l.kt)("p",null,"\u4f60\u5728\u8fd9\u91cc\u60f3\u8981\u505a\u7684\u662f\u5b89\u88c5Windows\u5b50\u7cfb\u7edf\u7528\u4e8eLinux\u3002\u5728",(0,l.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/windows/wsl/install?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u67e5\u770b\u76f8\u5173\u6587\u6863\uff0c\u5b83\u4eec\u975e\u5e38\u6709\u5e2e\u52a9\u3002"),(0,l.kt)("p",null,"\u4ece\u73b0\u5728\u5f00\u59cb\uff0c\u6bcf\u6b21\u6211\u8981\u6c42\u4f60\u8fd0\u884cSolana\u547d\u4ee4\u65f6\uff0c\u4f60\u5e94\u8be5\u5728WSL2\u4e2d\u8fd0\u884c\u5b83\u3002\u6211\u5f3a\u70c8\u63a8\u8350\u5b89\u88c5",(0,l.kt)("a",{parentName:"p",href:"https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=en-nz&gl=nz&utm_source=buildspace.so&utm_medium=buildspace_project"},"Windows\u7ec8\u7aef"),"\u5e94\u7528\u7a0b\u5e8f\uff0c\u5b83\u5177\u6709\u6f02\u4eae\u7684\u7528\u6237\u754c\u9762\uff0c\u5e76\u4e14\u53ef\u4ee5\u8f7b\u677e\u5207\u6362\u5230WSL2\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:a(4630).Z,width:"683",height:"386"})),(0,l.kt)("p",null,"\u4f60\u8981\u5728WSL2\u4e2d\u5b89\u88c5Solana CLI\u548cRust\u7f16\u8bd1\u5668\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0e\u4f60\u7684Windows\u5b89\u88c5\u5206\u5f00\u7684\u73af\u5883\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u8bd5\u56fe\u5728\u9519\u8bef\u7684\u4f4d\u7f6e\u8fd0\u884c\u547d\u4ee4\uff0c\u4f1a\u51fa\u73b0\u9519\u8bef\uff01\uff01\uff01"),(0,l.kt)("h2",{id:"-\u5b89\u88c5-rust-\u7f16\u8bd1\u5668"},"\ud83e\udd80 \u5b89\u88c5 Rust \u7f16\u8bd1\u5668"),(0,l.kt)("p",null,"\u6700\u597d\u7684\u65b9\u6cd5\u662f\u6309\u7167\u5b98\u65b9\u6307\u5357\u8fdb\u884c\u64cd\u4f5c\u3002\u5728",(0,l.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/tools/install?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u67e5\u770b\u5b83\u4eec\u3002"),(0,l.kt)("h2",{id:"\ufe0f-\u5b89\u88c5-solana-\u547d\u4ee4\u884c\u754c\u9762-cli"},"\ud83c\udfc4\u200d\u2642\ufe0f \u5b89\u88c5 Solana \u547d\u4ee4\u884c\u754c\u9762 (CLI)"),(0,l.kt)("p",null,"\u6211\u8fd8\u8bb0\u5f97\u4ee5\u524d\u542f\u52a8Solana CLI\u9700\u8981\u51e0\u4e2a\u5c0f\u65f6\u7684\u65f6\u95f4\u3002\u5982\u4eca\u53ea\u9700\u8981\u51e0\u4e2a\u547d\u4ee4\uff01"),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli/install-solana-cli-tools?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u627e\u5230\u9002\u7528\u4e8e\u60a8\u7279\u5b9a\u64cd\u4f5c\u7cfb\u7edf\u7684\u7248\u672c\u3002"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Windows\u7528\u6237\u5e94\u8be5\u6309\u7167Linux\u5b89\u88c5\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\uff01")),(0,l.kt)("p",null,"\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u60a8\u5e94\u8be5\u5f97\u5230\u4e00\u4e2a\u7248\u672c\u7684\u6253\u5370\u8f93\u51fa\uff0c\u800c\u4e0d\u662f\u8fd0\u884c\u65f6\u51fa\u73b0\u9519\u8bef"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana --version\n")),(0,l.kt)("p",null,"\u5982\u679c\u4f60\u786e\u5b9a\u5df2\u7ecf\u5b89\u88c5\u4e86\u6240\u6709\u7684\u4e1c\u897f\uff0c\u4f46\u4ecd\u7136\u51fa\u73b0\u9519\u8bef\uff0c\u8bf7\u5173\u95ed\u6240\u6709\u7684\u7ec8\u7aef\u7a97\u53e3\uff0c\u7136\u540e\u5728\u4e00\u4e2a\u65b0\u7684\u7a97\u53e3\u4e2d\u518d\u6b21\u5c1d\u8bd5\u3002"),(0,l.kt)("h2",{id:"-solana\u914d\u7f6e"},"\u2699 Solana\u914d\u7f6e"),(0,l.kt)("p",null,"Solana CLI\u6709\u4e00\u4e9b\u53ef\u4ee5\u914d\u7f6e\u7684\u9009\u9879\uff0c\u6bd4\u5982\u4f60\u60f3\u8fde\u63a5\u7684\u7f51\u7edc\u548c\u4f60\u7684\u5bc6\u94a5\u5bf9\u6240\u5728\u7684\u4f4d\u7f6e\u3002\u4f60\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u83b7\u53d6\u5f53\u524d\u914d\u7f6e\u7684\u62a5\u544a\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config get\n")),(0,l.kt)("p",null,"\u8fd9\u662f\u6211\u770b\u5230\u7684\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"Config File: /home/endgame/.config/solana/cli/config.yml\nRPC URL: http://localhost:8899\nWebSocket URL: ws://localhost:8900/ (computed)\nKeypair Path: /home/endgame/.config/solana/id.json\nCommitment: confirmed\n")),(0,l.kt)("p",null,"\u6709\u8da3\uff01\u4ee5\u4e0b\u662f\u6bcf\u4e2a\u8bcd\u7684\u610f\u601d\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Config File")," - Solana CLI \u6587\u4ef6\u4f4d\u4e8e\u60a8\u7684\u8ba1\u7b97\u673a\u4e0a"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"RPC URL")," - \u60a8\u6b63\u5728\u4f7f\u7528\u7684\u7ec8\u7aef\u70b9\uff0c\u5c06\u60a8\u8fde\u63a5\u5230\u672c\u5730\u4e3b\u673a\u3001\u5f00\u53d1\u7f51\u7edc\u6216\u4e3b\u7f51\u7edc"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"WebSocket URL")," - \u76d1\u542c\u6765\u81ea\u76ee\u6807\u96c6\u7fa4\u7684\u4e8b\u4ef6\u7684 WebSocket\uff08\u5728\u8bbe\u7f6e RPC URL \u65f6\u8ba1\u7b97\uff09"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Keypair Path")," - \u8fd0\u884cSolana CLI\u5b50\u547d\u4ee4\u65f6\u4f7f\u7528\u7684\u5bc6\u94a5\u5bf9\u8def\u5f84"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Commitment")," - \u63d0\u4f9b\u4e86\u7f51\u7edc\u786e\u8ba4\u7684\u5ea6\u91cf\uff0c\u5e76\u63cf\u8ff0\u4e86\u4e00\u4e2a\u533a\u5757\u5728\u7279\u5b9a\u65f6\u95f4\u70b9\u4e0a\u7684\u6700\u7ec8\u6027\u7a0b\u5ea6")),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"config set --url")," \u547d\u4ee4\u6765\u66f4\u6539 RPC URL \uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --url localhost\n\nsolana config set --url devnet\n\nsolana config set --url mainnet-beta\n")),(0,l.kt)("p",null,"\u6211\u4eec\u5f00\u53d1\u4eba\u5458\u5728\u751f\u6d3b\u4e2d\u9700\u8981\u6309\u952e\u8f83\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u5c06\u5b83\u4eec\u7f29\u77ed\u4e3a\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --u l\n\nsolana config set --u d\n\nsolana config set --u m\n")),(0,l.kt)("p",null,"\u54c7\uff0c\u8282\u7701\u4e86\u8fd9\u4e48\u591a\u65f6\u95f4\uff0c\u8d70\u8d77\u6765\u5427\uff01"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u5bc6\u94a5\u5bf9")),(0,l.kt)("p",null,"\u4f60\u7ecf\u5e38\u9700\u8981\u4f7f\u7528\u4e0d\u540c\u7684\u5bc6\u94a5\u5bf9\u6765\u6d4b\u8bd5\u4ea4\u4e92\uff0c\u6240\u4ee5\u547d\u4ee4\u884c\u754c\u9762\uff08CLI\uff09\u63d0\u4f9b\u4e86\u4e00\u79cd\u7b80\u5355\u7684\u65b9\u5f0f\u6765\u7ba1\u7406\u4f60\u7684\u5bc6\u94a5\u5bf9\u3002\u5b83\u5c06\u5b83\u4eec\u5b58\u50a8\u5728\u4f60\u7684\u6587\u4ef6\u5939\u4e2d\u7684JSON\u6587\u4ef6\u4e2d\u3002\u4ee5\u4e0b\u662f\u4f60\u9700\u8981\u4e86\u89e3\u7684\u6240\u6709\u4e0e\u5bc6\u94a5\u5bf9\u76f8\u5173\u7684\u547d\u4ee4"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana-keygen new --outfile ~/\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u8bbe\u7f6e\u9ed8\u8ba4\u5bc6\u94a5\u5bf9")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --keypair ~/\n")),(0,l.kt)("p",null,"\u83b7\u53d6\u5f53\u524d\u9ed8\u8ba4\u5bc6\u94a5\u5bf9\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"publickey")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana address\n")),(0,l.kt)("p",null,"\u83b7\u53d6\u5f53\u524d\u9ed8\u8ba4\u5bc6\u94a5\u5bf9\u7684SOL\u4f59\u989d"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana balance\n")),(0,l.kt)("p",null,"\u7a7a\u6295\u5230\u5f53\u524d\u9ed8\u8ba4\u5bc6\u94a5\u5bf9"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana airdrop 2\n")),(0,l.kt)("p",null,"\u786e\u4fdd\u4f60\u5c06\u8fd9\u4e9b\u5bc6\u94a5\u6587\u4ef6\u4fdd\u5b58\u5b89\u5168\uff0c\u4e0d\u8981\u5728\u6d4b\u8bd5\u548c\u90e8\u7f72\u4e2d\u4f7f\u7528\u76f8\u540c\u7684\u5bc6\u94a5\u5bf9\uff01\u4f60\u53ef\u4e0d\u60f3\u56e0\u4e3a\u4e0d\u5c0f\u5fc3\u5c06\u5bc6\u94a5\u5bf9\u63a8\u9001\u5230\u516c\u5171\u7684 GitHub \u4ed3\u5e93\u800c\u4e22\u5931\u6240\u6709\u7cbe\u7f8e\u7684 NFT\u3002"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u672c\u5730\u9a8c\u8bc1\u5668")),(0,l.kt)("p",null,"Solana CLI\u5e26\u6709\u4e00\u4e2a\u65b9\u4fbf\u7684\u547d\u4ee4\uff0c\u53ef\u4ee5\u5feb\u901f\u542f\u52a8\u672c\u5730\u9a8c\u8bc1\u8282\u70b9\u3002\u8fd9\u7c7b\u4f3c\u4e8eSolana\u7f51\u7edc\u7684\u672c\u5730\u7248\u672c\uff0c\u60a8\u53ef\u4ee5\u7528\u5b83\u6765\u6d4b\u8bd5\u60a8\u7684\u7a0b\u5e8f\u3002\u4e0e\u90e8\u7f72\u5230Devnet\u76f8\u6bd4\uff0c\u5b83\u901f\u5ea6\u66f4\u5feb\uff0c\u800c\u4e14\u60a8\u53ef\u4ee5\u5728\u4e0d\u82b1\u8d39\u4efb\u4f55Devnet SOL\u7684\u60c5\u51b5\u4e0b\u4f7f\u7528\u5b83\u6765\u6d4b\u8bd5\u60a8\u7684\u7a0b\u5e8f\u3002"),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u542f\u52a8\u672c\u5730\u9a8c\u8bc1\u5668\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana-test-validator\n")),(0,l.kt)("p",null,"\u5728Windows\u4e0a\u7684WSL\u4e2d\uff0c\u5728\u5c1d\u8bd5\u8fd0\u884c\u9a8c\u8bc1\u5668\u4e4b\u524d\uff0c\u60a8\u9700\u8981\u8fd0\u884c\u6b64\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"cd ~\n")),(0,l.kt)("p",null,"\u6211\u4eec\u6b63\u5728\u5207\u6362\u76ee\u5f55\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"~")," \uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u4f1a\u5728WSL\u5185\u90e8\u7684\u5df2\u6302\u8f7d\u7684Windows\u6620\u50cf\u4e2d\u4e86\u3002\u8fd9\u6837\u4fee\u590d\u4e86\u4e00\u4e9b\u4f1a\u51fa\u9519\u7684\u8def\u5f84\u95ee\u9898\u3002"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6253\u5f00\u53e6\u4e00\u4e2a\u7ec8\u7aef\u7a97\u53e3\u5e76\u8f93\u5165"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana logs\n")),(0,l.kt)("p",null,"\u8fd9\u5c06\u4e3a\u60a8\u63d0\u4f9b\u672c\u5730\u7f51\u7edc\u7684\u6240\u6709\u4ea4\u6613\u65e5\u5fd7\u3002\u5728\u60a8\u8fdb\u884c\u4ea4\u6613\u4e4b\u524d\uff0c\u8fd9\u91cc\u4e0d\u4f1a\u53d1\u751f\u4efb\u4f55\u4e8b\u60c5\uff0c\u6240\u4ee5\u6253\u5f00\u7b2c\u4e09\u4e2a\u7ec8\u7aef\u7a97\u53e3\u5e76\u8fd0\u884c\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana address\nsolana airdrop 999 YOUR_ADDRESS\n")),(0,l.kt)("p",null,"\u4f60\u5e94\u8be5\u80fd\u770b\u5230\u7a7a\u6295\u4ea4\u6613\u7684\u5230\u6765\uff01\u633a\u9177\u7684\uff0c\u5bf9\u5427\uff1f"),(0,l.kt)("p",null,"\u4f60\u53ef\u4ee5\u901a\u8fc7\u65e5\u5fd7\u548c\u672c\u5730\u9a8c\u8bc1\u5668\u505a\u5f88\u591a\u9177\u70ab\u7684\u4e8b\u60c5\uff0c\u6bd4\u5982\u7b5b\u9009\u7279\u5b9a\u7a0b\u5e8f\u7684\u65e5\u5fd7\u3002\u70b9\u51fb",(0,l.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u67e5\u770b\u66f4\u591a\u9177\u70ab\u7684\u5185\u5bb9\u3002"),(0,l.kt)("p",null,"\u9700\u8981\u8bb0\u4f4f\u7684\u4e00\u4ef6\u4e8b\u662f\uff0c\u53ea\u8981\u4f60\u9700\u8981\u7f51\u7edc\u8fd0\u884c\uff0c\u5c31\u5fc5\u987b\u4fdd\u6301\u7ec8\u7aef\u7a97\u53e3 ",(0,l.kt)("inlineCode",{parentName:"p"},"solana-test-validator")," \u4e00\u76f4\u8fd0\u884c\u3002\u5982\u679c\u5173\u95ed\u5b83\uff0c\u7f51\u7edc\u4e5f\u4f1a\u5173\u95ed\u3002\u5728Windows\u4e0a\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"CTRL + C")," \u9000\u51fa\uff0c\u800c\u5728Mac\u4e0a\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"CMD + C")," \u9000\u51fa\u3002"),(0,l.kt)("h2",{id:"-\u672c\u5730\u7a0b\u5e8f\u90e8\u7f72"},"\ud83e\uddbe \u672c\u5730\u7a0b\u5e8f\u90e8\u7f72"),(0,l.kt)("p",null,"\u65e2\u7136\u4f60\u5df2\u7ecf\u638c\u63e1\u4e86\u6240\u6709\u672c\u5730\u5f00\u53d1\u5de5\u5177\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u8bd5\u7740\u5728\u672c\u5730\u90e8\u7f72\u4e00\u4e2a\u7a0b\u5e8f\u5427\uff01"),(0,l.kt)("p",null,"\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u521b\u5efa\u4e00\u4e2aSolana\u7a0b\u5e8f\u3002\u8fd9\u5c31\u662f\u6211\u4eec\u5b89\u88c5Rust\u7684\u539f\u56e0\u3002\u6211\u4eec\u53ea\u9700\u8981\u4e00\u4e2a\u7b80\u5355\u7684Rust\u9879\u76ee\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"cargo new --lib local-program\ncd local-program\ncode .\n")),(0,l.kt)("p",null,"Cargo\u5c31\u50cfRust\u7684NPM\u3002\u5b83\u4f1a\u751f\u6210\u6211\u4eec\u6240\u9700\u7684\u6240\u6709\u6837\u677f\u4ee3\u7801\u3002\u5982\u679c ",(0,l.kt)("inlineCode",{parentName:"p"},"code .")," \u65e0\u6cd5\u6253\u5f00VS Code\uff0c\u8bf7\u4e0d\u8981\u62c5\u5fc3\uff0c\u53ea\u9700\u5728\u4ee3\u7801\u7f16\u8f91\u5668\u4e2d\u6253\u5f00\u8be5\u76ee\u5f55\u7684\u6839\u76ee\u5f55\u5373\u53ef\u3002"),(0,l.kt)("p",null,"\u6253\u5f00 ",(0,l.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," \u5e76\u6dfb\u52a0Solana\u4f9d\u8d56\u9879\uff0c\u5c06\u8fd9\u4e2aRust\u9879\u76ee\u53d8\u6210\u4e00\u4e2aSolana\u7a0b\u5e8f\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-toml"},'[package]\nname = ""\nversion = "0.1.0"\nedition = "2021"\n\n[features]\nno-entrypoint = []\n\n[dependencies]\nsolana-program = "~1.8.14"\n\n[lib]\ncrate-type = ["cdylib", "lib"]\n')),(0,l.kt)("p",null,"\u6211\u4eec\u4e0d\u80fd\u53ea\u90e8\u7f72\u4e00\u4e2a\u7a7a\u6587\u4ef6\uff0c\u6240\u4ee5\u6253\u5f00 ",(0,l.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u5e76\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'use solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg,\n};\n\nentrypoint!(process_instruction);\n\npub fn process_instruction(\n _program_id: &Pubkey,\n _accounts: &[AccountInfo],\n _instruction_data: &[u8],\n ) -> ProgramResult {\n msg!("Hello local Solana network!!");\n Ok(())\n}\n')),(0,l.kt)("p",null,"\u8fd9\u5c31\u662f\u6211\u4eec\u6240\u9700\u8981\u7684\uff01\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u6784\u5efa\u8fd9\u4e2a\u3002Cargo\u914d\u5907\u4e86\u4e00\u79cd\u7279\u6b8a\u7c7b\u578b\u7684\u6784\u5efa\u547d\u4ee4\uff0c\u4e0eSolana\u52a0\u8f7d\u5668\u76f8\u5339\u914d\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"cargo build-sbf\n")),(0,l.kt)("p",null,"\u7b2c\u4e00\u6b21\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\uff0c\u4e4b\u540e\u901f\u5ea6\u4f1a\u66f4\u5feb\u3002\u4f60\u4f1a\u6ce8\u610f\u5230\u51fa\u73b0\u4e86\u4e00\u4e2a\u540d\u4e3a\u201ctarget\u201d\u7684\u65b0\u6587\u4ef6\u5939\u3002\u8fd9\u662f\u7f16\u8bd1\u597d\u7684\u4ee3\u7801\uff0c\u51c6\u5907\u597d\u90e8\u7f72\u3002\u8981\u90e8\u7f72\u8fd9\u4e2a\u7a0b\u5e8f\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u547d\u4ee4 ",(0,l.kt)("inlineCode",{parentName:"p"},"solana program deploy ")," \uff0c\u6307\u5411\u4f60\u7684\u201ctarget\u201d\u6587\u4ef6\u5939\uff0c\u5bf9\u6211\u6765\u8bf4\u662f"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana program deploy ~/Desktop/solana-core/local-program/target/deploy/local_program.so\n")))}m.isMDXComponent=!0},4630:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/wsl-4c9af7953a2abc1ff0e390b976e3ae6f.png"}}]); \ No newline at end of file diff --git a/assets/js/9f5c2a59.aa5e1fbf.js b/assets/js/9f5c2a59.aa5e1fbf.js deleted file mode 100644 index 236b4cf69..000000000 --- a/assets/js/9f5c2a59.aa5e1fbf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9962],{3905:(e,n,a)=>{a.d(n,{Zo:()=>i,kt:()=>k});var t=a(7294);function l(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function o(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function r(e){for(var n=1;n=0||(l[a]=e[a]);return l}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=t.createContext({}),u=function(e){var n=t.useContext(s),a=n;return e&&(a="function"==typeof e?e(n):r(r({},n),e)),a},i=function(e){var n=u(e.components);return t.createElement(s.Provider,{value:n},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},d=t.forwardRef((function(e,n){var a=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,i=p(e,["components","mdxType","originalType","parentName"]),c=u(a),d=l,k=c["".concat(s,".").concat(d)]||c[d]||m[d]||o;return a?t.createElement(k,r(r({ref:n},i),{},{components:a})):t.createElement(k,r({ref:n},i))}));function k(e,n){var a=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var o=a.length,r=new Array(o);r[0]=d;var p={};for(var s in n)hasOwnProperty.call(n,s)&&(p[s]=n[s]);p.originalType=e,p[c]="string"==typeof e?e:l,r[1]=p;for(var u=2;u{a.r(n),a.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>u});var t=a(7462),l=(a(7294),a(3905));const o={sidebar_position:66,sidebar_label:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",sidebar_class_name:"green"},r="\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",p={unversionedId:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README",id:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README",title:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",description:"\u662f\u65f6\u5019\u8fdb\u5165\u4e13\u4e1a\u9886\u57df\u4e86\u3002Solana\u6e38\u4e50\u573a\u662f\u4e00\u4e2a\u4ee4\u4eba\u60ca\u53f9\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5165\u95e8\u5e76\u90e8\u7f72\u5230\u5f00\u53d1\u7f51\u7edc\u3002\u7136\u800c\uff0c\u5b83\u8fd8\u4e0d\u9002\u5408\u672c\u5730\u5f00\u53d1\uff0c\u800c\u8fd9\u6b63\u662f\u4e13\u4e1a\u4eba\u58eb\u7684\u505a\u6cd5\u3002",source:"@site/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README.md",sourceDirName:"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally",slug:"/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/",permalink:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README.md",tags:[],version:"current",sidebarPosition:66,frontMatter:{sidebar_position:66,sidebar_label:"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u672c\u5730\u73af\u5883\u8bbe\u7f6e\u548cPDA",permalink:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/"},next:{title:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",permalink:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/"}},s={},u=[{value:"\ud83e\udd80 \u5b89\u88c5 Rust \u7f16\u8bd1\u5668",id:"-\u5b89\u88c5-rust-\u7f16\u8bd1\u5668",level:2},{value:"\ud83c\udfc4\u200d\u2642\ufe0f \u5b89\u88c5 Solana \u547d\u4ee4\u884c\u754c\u9762 (CLI)",id:"\ufe0f-\u5b89\u88c5-solana-\u547d\u4ee4\u884c\u754c\u9762-cli",level:2},{value:"\u2699 Solana\u914d\u7f6e",id:"-solana\u914d\u7f6e",level:2},{value:"\ud83e\uddbe \u672c\u5730\u7a0b\u5e8f\u90e8\u7f72",id:"-\u672c\u5730\u7a0b\u5e8f\u90e8\u7f72",level:2}],i={toc:u},c="wrapper";function m(e){let{components:n,...o}=e;return(0,l.kt)(c,(0,t.Z)({},i,o,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u672c\u5730\u8bbe\u7f6e"},"\ud83d\udc40 \u672c\u5730\u8bbe\u7f6e"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u8fdb\u5165\u4e13\u4e1a\u9886\u57df\u4e86\u3002Solana\u6e38\u4e50\u573a\u662f\u4e00\u4e2a\u4ee4\u4eba\u60ca\u53f9\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5165\u95e8\u5e76\u90e8\u7f72\u5230\u5f00\u53d1\u7f51\u7edc\u3002\u7136\u800c\uff0c\u5b83\u8fd8\u4e0d\u9002\u5408\u672c\u5730\u5f00\u53d1\uff0c\u800c\u8fd9\u6b63\u662f\u4e13\u4e1a\u4eba\u58eb\u7684\u505a\u6cd5\u3002"),(0,l.kt)("p",null,"\u672c\u5730\u8bbe\u7f6e\u9700\u8981\u51e0\u4e2a\u6b65\u9aa4\uff0c\u4f46\u5b83\u66f4\u52a0\u5f3a\u5927 - \u4f60\u57fa\u672c\u4e0a\u5c06\u5728\u4f60\u7684\u8bbe\u5907\u4e0a\u8fd0\u884c\u4e00\u4e2a\u672c\u5730\u7248\u672c\u7684Solana\u7f51\u7edc\u3002\u8fd9\u5e26\u6765\u4e86\u8bb8\u591a\u597d\u5904\uff0c\u5305\u62ec\u51e0\u4e4e\u65e0\u9650\u7684SOL\u3002"),(0,l.kt)("p",null,"\u8fd9\u4e2a\u8bbe\u7f6e\u6709\u4e24\u4e2a\u4e3b\u8981\u90e8\u5206"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Rust\u7f16\u8bd1\u5668"),(0,l.kt)("li",{parentName:"ul"},"Solana\u547d\u4ee4\u884c\u754c\u9762")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Windows\u7528\u6237")),(0,l.kt)("p",null,"\u867d\u7136Solana CLI\u53ef\u4ee5\u5728Windows\u4e0a\u8fd0\u884c\uff0c\u4f46\u5728Linux\u4e0a\u8fd0\u884c\u4f1a\u6709\u66f4\u597d\u7684\u4f53\u9a8c - \u60a8\u4e0d\u4f1a\u9047\u5230Windows\u7279\u5b9a\u7684\u95ee\u9898\uff0c\u5e76\u4e14\u53ef\u4ee5\u4f7f\u7528\u4e0eMacOS/Linux\u7528\u6237\u76f8\u540c\u7684\u547d\u4ee4\u3002"),(0,l.kt)("p",null,"\u4f60\u5728\u8fd9\u91cc\u60f3\u8981\u505a\u7684\u662f\u5b89\u88c5Windows\u5b50\u7cfb\u7edf\u7528\u4e8eLinux\u3002\u5728",(0,l.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/windows/wsl/install?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u67e5\u770b\u76f8\u5173\u6587\u6863\uff0c\u5b83\u4eec\u975e\u5e38\u6709\u5e2e\u52a9\u3002"),(0,l.kt)("p",null,"\u4ece\u73b0\u5728\u5f00\u59cb\uff0c\u6bcf\u6b21\u6211\u8981\u6c42\u4f60\u8fd0\u884cSolana\u547d\u4ee4\u65f6\uff0c\u4f60\u5e94\u8be5\u5728WSL2\u4e2d\u8fd0\u884c\u5b83\u3002\u6211\u5f3a\u70c8\u63a8\u8350\u5b89\u88c5",(0,l.kt)("a",{parentName:"p",href:"https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=en-nz&gl=nz&utm_source=buildspace.so&utm_medium=buildspace_project"},"Windows\u7ec8\u7aef"),"\u5e94\u7528\u7a0b\u5e8f\uff0c\u5b83\u5177\u6709\u6f02\u4eae\u7684\u7528\u6237\u754c\u9762\uff0c\u5e76\u4e14\u53ef\u4ee5\u8f7b\u677e\u5207\u6362\u5230WSL2\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:a(4630).Z,width:"683",height:"386"})),(0,l.kt)("p",null,"\u4f60\u8981\u5728WSL2\u4e2d\u5b89\u88c5Solana CLI\u548cRust\u7f16\u8bd1\u5668\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0e\u4f60\u7684Windows\u5b89\u88c5\u5206\u5f00\u7684\u73af\u5883\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u8bd5\u56fe\u5728\u9519\u8bef\u7684\u4f4d\u7f6e\u8fd0\u884c\u547d\u4ee4\uff0c\u4f1a\u51fa\u73b0\u9519\u8bef\uff01\uff01\uff01"),(0,l.kt)("h2",{id:"-\u5b89\u88c5-rust-\u7f16\u8bd1\u5668"},"\ud83e\udd80 \u5b89\u88c5 Rust \u7f16\u8bd1\u5668"),(0,l.kt)("p",null,"\u6700\u597d\u7684\u65b9\u6cd5\u662f\u6309\u7167\u5b98\u65b9\u6307\u5357\u8fdb\u884c\u64cd\u4f5c\u3002\u5728",(0,l.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/tools/install?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u67e5\u770b\u5b83\u4eec\u3002"),(0,l.kt)("h2",{id:"\ufe0f-\u5b89\u88c5-solana-\u547d\u4ee4\u884c\u754c\u9762-cli"},"\ud83c\udfc4\u200d\u2642\ufe0f \u5b89\u88c5 Solana \u547d\u4ee4\u884c\u754c\u9762 (CLI)"),(0,l.kt)("p",null,"\u6211\u8fd8\u8bb0\u5f97\u4ee5\u524d\u542f\u52a8Solana CLI\u9700\u8981\u51e0\u4e2a\u5c0f\u65f6\u7684\u65f6\u95f4\u3002\u5982\u4eca\u53ea\u9700\u8981\u51e0\u4e2a\u547d\u4ee4\uff01"),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli/install-solana-cli-tools?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u627e\u5230\u9002\u7528\u4e8e\u60a8\u7279\u5b9a\u64cd\u4f5c\u7cfb\u7edf\u7684\u7248\u672c\u3002"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Windows\u7528\u6237\u5e94\u8be5\u6309\u7167Linux\u5b89\u88c5\u8bf4\u660e\u8fdb\u884c\u64cd\u4f5c\uff01")),(0,l.kt)("p",null,"\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u60a8\u5e94\u8be5\u5f97\u5230\u4e00\u4e2a\u7248\u672c\u7684\u6253\u5370\u8f93\u51fa\uff0c\u800c\u4e0d\u662f\u8fd0\u884c\u65f6\u51fa\u73b0\u9519\u8bef"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana --version\n")),(0,l.kt)("p",null,"\u5982\u679c\u4f60\u786e\u5b9a\u5df2\u7ecf\u5b89\u88c5\u4e86\u6240\u6709\u7684\u4e1c\u897f\uff0c\u4f46\u4ecd\u7136\u51fa\u73b0\u9519\u8bef\uff0c\u8bf7\u5173\u95ed\u6240\u6709\u7684\u7ec8\u7aef\u7a97\u53e3\uff0c\u7136\u540e\u5728\u4e00\u4e2a\u65b0\u7684\u7a97\u53e3\u4e2d\u518d\u6b21\u5c1d\u8bd5\u3002"),(0,l.kt)("h2",{id:"-solana\u914d\u7f6e"},"\u2699 Solana\u914d\u7f6e"),(0,l.kt)("p",null,"Solana CLI\u6709\u4e00\u4e9b\u53ef\u4ee5\u914d\u7f6e\u7684\u9009\u9879\uff0c\u6bd4\u5982\u4f60\u60f3\u8fde\u63a5\u7684\u7f51\u7edc\u548c\u4f60\u7684\u5bc6\u94a5\u5bf9\u6240\u5728\u7684\u4f4d\u7f6e\u3002\u4f60\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u83b7\u53d6\u5f53\u524d\u914d\u7f6e\u7684\u62a5\u544a\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config get\n")),(0,l.kt)("p",null,"\u8fd9\u662f\u6211\u770b\u5230\u7684\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"Config File: /home/endgame/.config/solana/cli/config.yml\nRPC URL: http://localhost:8899\nWebSocket URL: ws://localhost:8900/ (computed)\nKeypair Path: /home/endgame/.config/solana/id.json\nCommitment: confirmed\n")),(0,l.kt)("p",null,"\u6709\u8da3\uff01\u4ee5\u4e0b\u662f\u6bcf\u4e2a\u8bcd\u7684\u610f\u601d\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Config File")," - Solana CLI \u6587\u4ef6\u4f4d\u4e8e\u60a8\u7684\u8ba1\u7b97\u673a\u4e0a"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"RPC URL")," - \u60a8\u6b63\u5728\u4f7f\u7528\u7684\u7ec8\u7aef\u70b9\uff0c\u5c06\u60a8\u8fde\u63a5\u5230\u672c\u5730\u4e3b\u673a\u3001\u5f00\u53d1\u7f51\u7edc\u6216\u4e3b\u7f51\u7edc"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"WebSocket URL")," - \u76d1\u542c\u6765\u81ea\u76ee\u6807\u96c6\u7fa4\u7684\u4e8b\u4ef6\u7684 WebSocket\uff08\u5728\u8bbe\u7f6e RPC URL \u65f6\u8ba1\u7b97\uff09"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Keypair Path")," - \u8fd0\u884cSolana CLI\u5b50\u547d\u4ee4\u65f6\u4f7f\u7528\u7684\u5bc6\u94a5\u5bf9\u8def\u5f84"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"Commitment")," - \u63d0\u4f9b\u4e86\u7f51\u7edc\u786e\u8ba4\u7684\u5ea6\u91cf\uff0c\u5e76\u63cf\u8ff0\u4e86\u4e00\u4e2a\u533a\u5757\u5728\u7279\u5b9a\u65f6\u95f4\u70b9\u4e0a\u7684\u6700\u7ec8\u6027\u7a0b\u5ea6")),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"config set --url")," \u547d\u4ee4\u6765\u66f4\u6539 RPC URL \uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --url localhost\n\nsolana config set --url devnet\n\nsolana config set --url mainnet-beta\n")),(0,l.kt)("p",null,"\u6211\u4eec\u5f00\u53d1\u4eba\u5458\u5728\u751f\u6d3b\u4e2d\u9700\u8981\u6309\u952e\u8f83\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u5c06\u5b83\u4eec\u7f29\u77ed\u4e3a\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --u l\n\nsolana config set --u d\n\nsolana config set --u m\n")),(0,l.kt)("p",null,"\u54c7\uff0c\u8282\u7701\u4e86\u8fd9\u4e48\u591a\u65f6\u95f4\uff0c\u8d70\u8d77\u6765\u5427\uff01"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u5bc6\u94a5\u5bf9")),(0,l.kt)("p",null,"\u4f60\u7ecf\u5e38\u9700\u8981\u4f7f\u7528\u4e0d\u540c\u7684\u5bc6\u94a5\u5bf9\u6765\u6d4b\u8bd5\u4ea4\u4e92\uff0c\u6240\u4ee5\u547d\u4ee4\u884c\u754c\u9762\uff08CLI\uff09\u63d0\u4f9b\u4e86\u4e00\u79cd\u7b80\u5355\u7684\u65b9\u5f0f\u6765\u7ba1\u7406\u4f60\u7684\u5bc6\u94a5\u5bf9\u3002\u5b83\u5c06\u5b83\u4eec\u5b58\u50a8\u5728\u4f60\u7684\u6587\u4ef6\u5939\u4e2d\u7684JSON\u6587\u4ef6\u4e2d\u3002\u4ee5\u4e0b\u662f\u4f60\u9700\u8981\u4e86\u89e3\u7684\u6240\u6709\u4e0e\u5bc6\u94a5\u5bf9\u76f8\u5173\u7684\u547d\u4ee4"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5bc6\u94a5\u5bf9")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana-keygen new --outfile ~/\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u8bbe\u7f6e\u9ed8\u8ba4\u5bc6\u94a5\u5bf9")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --keypair ~/\n")),(0,l.kt)("p",null,"\u83b7\u53d6\u5f53\u524d\u9ed8\u8ba4\u5bc6\u94a5\u5bf9\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"publickey")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana address\n")),(0,l.kt)("p",null,"\u83b7\u53d6\u5f53\u524d\u9ed8\u8ba4\u5bc6\u94a5\u5bf9\u7684SOL\u4f59\u989d"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana balance\n")),(0,l.kt)("p",null,"\u7a7a\u6295\u5230\u5f53\u524d\u9ed8\u8ba4\u5bc6\u94a5\u5bf9"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana airdrop 2\n")),(0,l.kt)("p",null,"\u786e\u4fdd\u4f60\u5c06\u8fd9\u4e9b\u5bc6\u94a5\u6587\u4ef6\u4fdd\u5b58\u5b89\u5168\uff0c\u4e0d\u8981\u5728\u6d4b\u8bd5\u548c\u90e8\u7f72\u4e2d\u4f7f\u7528\u76f8\u540c\u7684\u5bc6\u94a5\u5bf9\uff01\u4f60\u53ef\u4e0d\u60f3\u56e0\u4e3a\u4e0d\u5c0f\u5fc3\u5c06\u5bc6\u94a5\u5bf9\u63a8\u9001\u5230\u516c\u5171\u7684 GitHub \u4ed3\u5e93\u800c\u4e22\u5931\u6240\u6709\u7cbe\u7f8e\u7684 NFT\u3002"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u672c\u5730\u9a8c\u8bc1\u5668")),(0,l.kt)("p",null,"Solana CLI\u5e26\u6709\u4e00\u4e2a\u65b9\u4fbf\u7684\u547d\u4ee4\uff0c\u53ef\u4ee5\u5feb\u901f\u542f\u52a8\u672c\u5730\u9a8c\u8bc1\u8282\u70b9\u3002\u8fd9\u7c7b\u4f3c\u4e8eSolana\u7f51\u7edc\u7684\u672c\u5730\u7248\u672c\uff0c\u60a8\u53ef\u4ee5\u7528\u5b83\u6765\u6d4b\u8bd5\u60a8\u7684\u7a0b\u5e8f\u3002\u4e0e\u90e8\u7f72\u5230Devnet\u76f8\u6bd4\uff0c\u5b83\u901f\u5ea6\u66f4\u5feb\uff0c\u800c\u4e14\u60a8\u53ef\u4ee5\u5728\u4e0d\u82b1\u8d39\u4efb\u4f55Devnet SOL\u7684\u60c5\u51b5\u4e0b\u4f7f\u7528\u5b83\u6765\u6d4b\u8bd5\u60a8\u7684\u7a0b\u5e8f\u3002"),(0,l.kt)("p",null,"\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u542f\u52a8\u672c\u5730\u9a8c\u8bc1\u5668\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana-test-validator\n")),(0,l.kt)("p",null,"\u5728Windows\u4e0a\u7684WSL\u4e2d\uff0c\u5728\u5c1d\u8bd5\u8fd0\u884c\u9a8c\u8bc1\u5668\u4e4b\u524d\uff0c\u60a8\u9700\u8981\u8fd0\u884c\u6b64\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"cd ~\n")),(0,l.kt)("p",null,"\u6211\u4eec\u6b63\u5728\u5207\u6362\u76ee\u5f55\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"~")," \uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u4f1a\u5728WSL\u5185\u90e8\u7684\u5df2\u6302\u8f7d\u7684Windows\u6620\u50cf\u4e2d\u4e86\u3002\u8fd9\u6837\u4fee\u590d\u4e86\u4e00\u4e9b\u4f1a\u51fa\u9519\u7684\u8def\u5f84\u95ee\u9898\u3002"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6253\u5f00\u53e6\u4e00\u4e2a\u7ec8\u7aef\u7a97\u53e3\u5e76\u8f93\u5165"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana logs\n")),(0,l.kt)("p",null,"\u8fd9\u5c06\u4e3a\u60a8\u63d0\u4f9b\u672c\u5730\u7f51\u7edc\u7684\u6240\u6709\u4ea4\u6613\u65e5\u5fd7\u3002\u5728\u60a8\u8fdb\u884c\u4ea4\u6613\u4e4b\u524d\uff0c\u8fd9\u91cc\u4e0d\u4f1a\u53d1\u751f\u4efb\u4f55\u4e8b\u60c5\uff0c\u6240\u4ee5\u6253\u5f00\u7b2c\u4e09\u4e2a\u7ec8\u7aef\u7a97\u53e3\u5e76\u8fd0\u884c\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana address\nsolana airdrop 999 YOUR_ADDRESS\n")),(0,l.kt)("p",null,"\u4f60\u5e94\u8be5\u80fd\u770b\u5230\u7a7a\u6295\u4ea4\u6613\u7684\u5230\u6765\uff01\u633a\u9177\u7684\uff0c\u5bf9\u5427\uff1f"),(0,l.kt)("p",null,"\u4f60\u53ef\u4ee5\u901a\u8fc7\u65e5\u5fd7\u548c\u672c\u5730\u9a8c\u8bc1\u5668\u505a\u5f88\u591a\u9177\u70ab\u7684\u4e8b\u60c5\uff0c\u6bd4\u5982\u7b5b\u9009\u7279\u5b9a\u7a0b\u5e8f\u7684\u65e5\u5fd7\u3002\u70b9\u51fb",(0,l.kt)("a",{parentName:"p",href:"https://docs.solana.com/cli?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u67e5\u770b\u66f4\u591a\u9177\u70ab\u7684\u5185\u5bb9\u3002"),(0,l.kt)("p",null,"\u9700\u8981\u8bb0\u4f4f\u7684\u4e00\u4ef6\u4e8b\u662f\uff0c\u53ea\u8981\u4f60\u9700\u8981\u7f51\u7edc\u8fd0\u884c\uff0c\u5c31\u5fc5\u987b\u4fdd\u6301\u7ec8\u7aef\u7a97\u53e3 ",(0,l.kt)("inlineCode",{parentName:"p"},"solana-test-validator")," \u4e00\u76f4\u8fd0\u884c\u3002\u5982\u679c\u5173\u95ed\u5b83\uff0c\u7f51\u7edc\u4e5f\u4f1a\u5173\u95ed\u3002\u5728Windows\u4e0a\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"CTRL + C")," \u9000\u51fa\uff0c\u800c\u5728Mac\u4e0a\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"CMD + C")," \u9000\u51fa\u3002"),(0,l.kt)("h2",{id:"-\u672c\u5730\u7a0b\u5e8f\u90e8\u7f72"},"\ud83e\uddbe \u672c\u5730\u7a0b\u5e8f\u90e8\u7f72"),(0,l.kt)("p",null,"\u65e2\u7136\u4f60\u5df2\u7ecf\u638c\u63e1\u4e86\u6240\u6709\u672c\u5730\u5f00\u53d1\u5de5\u5177\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u8bd5\u7740\u5728\u672c\u5730\u90e8\u7f72\u4e00\u4e2a\u7a0b\u5e8f\u5427\uff01"),(0,l.kt)("p",null,"\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u521b\u5efa\u4e00\u4e2aSolana\u7a0b\u5e8f\u3002\u8fd9\u5c31\u662f\u6211\u4eec\u5b89\u88c5Rust\u7684\u539f\u56e0\u3002\u6211\u4eec\u53ea\u9700\u8981\u4e00\u4e2a\u7b80\u5355\u7684Rust\u9879\u76ee\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"cargo new --lib local-program\ncd local-program\ncode .\n")),(0,l.kt)("p",null,"Cargo\u5c31\u50cfRust\u7684NPM\u3002\u5b83\u4f1a\u751f\u6210\u6211\u4eec\u6240\u9700\u7684\u6240\u6709\u6837\u677f\u4ee3\u7801\u3002\u5982\u679c ",(0,l.kt)("inlineCode",{parentName:"p"},"code .")," \u65e0\u6cd5\u6253\u5f00VS Code\uff0c\u8bf7\u4e0d\u8981\u62c5\u5fc3\uff0c\u53ea\u9700\u5728\u4ee3\u7801\u7f16\u8f91\u5668\u4e2d\u6253\u5f00\u8be5\u76ee\u5f55\u7684\u6839\u76ee\u5f55\u5373\u53ef\u3002"),(0,l.kt)("p",null,"\u6253\u5f00 ",(0,l.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," \u5e76\u6dfb\u52a0Solana\u4f9d\u8d56\u9879\uff0c\u5c06\u8fd9\u4e2aRust\u9879\u76ee\u53d8\u6210\u4e00\u4e2aSolana\u7a0b\u5e8f\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-toml"},'[package]\nname = ""\nversion = "0.1.0"\nedition = "2021"\n\n[features]\nno-entrypoint = []\n\n[dependencies]\nsolana-program = "~1.8.14"\n\n[lib]\ncrate-type = ["cdylib", "lib"]\n')),(0,l.kt)("p",null,"\u6211\u4eec\u4e0d\u80fd\u53ea\u90e8\u7f72\u4e00\u4e2a\u7a7a\u6587\u4ef6\uff0c\u6240\u4ee5\u6253\u5f00 ",(0,l.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u5e76\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'use solana_program::{\n account_info::AccountInfo,\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg,\n};\n\nentrypoint!(process_instruction);\n\npub fn process_instruction(\n _program_id: &Pubkey,\n _accounts: &[AccountInfo],\n _instruction_data: &[u8],\n ) -> ProgramResult {\n msg!("Hello local Solana network!!");\n Ok(())\n}\n')),(0,l.kt)("p",null,"\u8fd9\u5c31\u662f\u6211\u4eec\u6240\u9700\u8981\u7684\uff01\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u6784\u5efa\u8fd9\u4e2a\u3002Cargo\u914d\u5907\u4e86\u4e00\u79cd\u7279\u6b8a\u7c7b\u578b\u7684\u6784\u5efa\u547d\u4ee4\uff0c\u4e0eSolana\u52a0\u8f7d\u5668\u76f8\u5339\u914d\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"cargo build-sbf\n")),(0,l.kt)("p",null,"\u7b2c\u4e00\u6b21\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\uff0c\u4e4b\u540e\u901f\u5ea6\u4f1a\u66f4\u5feb\u3002\u4f60\u4f1a\u6ce8\u610f\u5230\u51fa\u73b0\u4e86\u4e00\u4e2a\u540d\u4e3a\u201ctarget\u201d\u7684\u65b0\u6587\u4ef6\u5939\u3002\u8fd9\u662f\u7f16\u8bd1\u597d\u7684\u4ee3\u7801\uff0c\u51c6\u5907\u597d\u90e8\u7f72\u3002\u8981\u90e8\u7f72\u8fd9\u4e2a\u7a0b\u5e8f\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u547d\u4ee4 ",(0,l.kt)("inlineCode",{parentName:"p"},"solana program deploy ")," \uff0c\u6307\u5411\u4f60\u7684\u201ctarget\u201d\u6587\u4ef6\u5939\uff0c\u5bf9\u6211\u6765\u8bf4\u662f"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana program deploy ~/Desktop/solana-core/local-program/target/deploy/local_program.so\n")))}m.isMDXComponent=!0},4630:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/wsl-4c9af7953a2abc1ff0e390b976e3ae6f.png"}}]); \ No newline at end of file diff --git a/assets/js/a4421f51.0f2fb5db.js b/assets/js/a4421f51.0f2fb5db.js deleted file mode 100644 index d2a6155c5..000000000 --- a/assets/js/a4421f51.0f2fb5db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6989],{3905:(e,n,l)=>{l.d(n,{Zo:()=>i,kt:()=>h});var a=l(7294);function r(e,n,l){return n in e?Object.defineProperty(e,n,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[n]=l,e}function o(e,n){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),l.push.apply(l,a)}return l}function t(e){for(var n=1;n=0||(r[l]=e[l]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(r[l]=e[l])}return r}var c=a.createContext({}),s=function(e){var n=a.useContext(c),l=n;return e&&(l="function"==typeof e?e(n):t(t({},n),e)),l},i=function(e){var n=s(e.components);return a.createElement(c.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var l=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,i=p(e,["components","mdxType","originalType","parentName"]),u=s(l),m=r,h=u["".concat(c,".").concat(m)]||u[m]||d[m]||o;return l?a.createElement(h,t(t({ref:n},i),{},{components:l})):a.createElement(h,t({ref:n},i))}));function h(e,n){var l=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=l.length,t=new Array(o);t[0]=m;var p={};for(var c in n)hasOwnProperty.call(n,c)&&(p[c]=n[c]);p.originalType=e,p[u]="string"==typeof e?e:r,t[1]=p;for(var s=2;s{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var a=l(7462),r=(l(7294),l(3905));const o={sidebar_position:9,sidebar_label:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},t="Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",p={unversionedId:"Solana-Co-Learn/module1/local_program_development/anchor_program_hello",id:"Solana-Co-Learn/module1/local_program_development/anchor_program_hello",title:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",description:"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002",source:"@site/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello.md",sourceDirName:"Solana-Co-Learn/module1/local_program_development",slug:"/Solana-Co-Learn/module1/local_program_development/anchor_program_hello",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello.md",tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9,sidebar_label:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello"},next:{title:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello"}},c={},s=[{value:"Anchor \u5b89\u88c5",id:"anchor-\u5b89\u88c5",level:2},{value:"1. \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee",id:"1-\u521b\u5efa\u4e00\u4e2a\u65b0\u7684rust\u9879\u76ee",level:2},{value:"2. \u7f16\u5199\u4f60\u7684\u7a0b\u5e8f",id:"2-\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f",level:4},{value:"3. \u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668",id:"3-\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668",level:4},{value:"4. \u6784\u5efa\u548c\u90e8\u7f72",id:"4-\u6784\u5efa\u548c\u90e8\u7f72",level:4},{value:"5. \u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7",id:"5-\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7",level:4}],i={toc:s},u="wrapper";function d(e){let{components:n,...l}=e;return(0,r.kt)(u,(0,a.Z)({},i,l,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"anchor-\u5408\u7ea6\u6846\u67b6\u5b9e\u73b0hello-world"},"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u672c\u5730\u5b8c\u6210\u6240\u6709\u64cd\u4f5c\uff0c\u5305\u62ec\u90e8\u7f72\u5230\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u5df2\u7ecf\u5b89\u88c5\u4e86Rust\u548cSolana CLI\u3002\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u5b89\u88c5\uff0c\u8bf7\u53c2\u8003\u6982\u8ff0\u4e2d\u7684\u8bf4\u660e\u8fdb\u884c\u8bbe\u7f6e\u3002"),(0,r.kt)("h2",{id:"anchor-\u5b89\u88c5"},"Anchor \u5b89\u88c5"),(0,r.kt)("p",null,"\u8fd9\u91cc\u662fanchor\u7684",(0,r.kt)("a",{parentName:"p",href:"https://www.anchor-lang.com/docs/installation"},"\u5b89\u88c5\u5b98\u65b9\u6307\u5357"),"."),(0,r.kt)("p",null,"\u9700\u8981\u4f60\u6309\u7167\u6b65\u9aa4\u5b89\u88c5\u597danchor\u3002"),(0,r.kt)("p",null,"\u5b89\u88c5\u5b8c\u6210\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6267\u884c\u4e0b\u9762\u7684\u547d\u4ee4,\u68c0\u6d4banchor\u662f\u5426\u5b89\u88c5\u5b8c\u6210\u2705\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"anchor --version\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"anchor --version\nanchor-cli 0.28.0\n")),(0,r.kt)("h2",{id:"1-\u521b\u5efa\u4e00\u4e2a\u65b0\u7684rust\u9879\u76ee"},"1. \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee\u5f00\u59cb\u3002\u8fd0\u884c\u4e0b\u9762\u7684",(0,r.kt)("inlineCode",{parentName:"p"},"anchor init "),"\u547d\u4ee4\u3002\u968f\u610f\u7528\u4f60\u81ea\u5df1\u7684\u76ee\u5f55\u540d\u66ff\u6362\u5b83\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"anchor init hello_world\n")),(0,r.kt)("h4",{id:"2-\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f"},"2. \u7f16\u5199\u4f60\u7684\u7a0b\u5e8f"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528\u4e0b\u9762\u7684\u201cHello World\uff01\u201d\u7a0b\u5e8f\u66f4\u65b0hello_world/program/src/lib.rs\u3002\u5f53\u7a0b\u5e8f\u88ab\u8c03\u7528\u65f6\uff0c\u8be5\u7a0b\u5e8f\u4f1a\u7b80\u5355\u5730\u5c06\u201cHello, world\uff01\u201d\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'use anchor_lang::prelude::*;\n\ndeclare_id!("Eo7uunKkgdRe8JtgmDimLkUEuT1oYbua4zWRCysWpv45");\n\n#[program]\npub mod hello_world {\n use super::*;\n\n pub fn initialize(ctx: Context) -> Result<()> {\n msg!("Hello,World!");\n Ok(())\n }\n}\n\n#[derive(Accounts)]\npub struct Initialize {}\n')),(0,r.kt)("h4",{id:"3-\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"},"3. \u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"),(0,r.kt)("p",null,"\u5728\u7f16\u5199\u597d\u4f60\u7684\u7a0b\u5e8f\u4e4b\u540e\uff0c\u8ba9\u6211\u4eec\u786e\u4fdd\u6211\u4eec\u7684Solana CLI\u914d\u7f6e\u6307\u5411\u672c\u5730\u4e3b\u673a\uff0c\u4f7f\u7528",(0,r.kt)("inlineCode",{parentName:"p"},"solana config set --url"),"\u547d\u4ee4\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --url localhost\n")),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528",(0,r.kt)("inlineCode",{parentName:"p"},"solana config get"),"\u547d\u4ee4\u68c0\u67e5Solana CLI\u914d\u7f6e\u662f\u5426\u5df2\u66f4\u65b0\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"solana config get\n")),(0,r.kt)("p",null,"\u6700\u540e\uff0c\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u5728\u4e00\u4e2a\u5355\u72ec\u7684\u7ec8\u7aef\u7a97\u53e3\u4e2d\u8fd0\u884c",(0,r.kt)("inlineCode",{parentName:"p"},"solana-test-validator"),"\u547d\u4ee4\u3002\u53ea\u6709\u5f53\u6211\u4eec\u7684RPC URL\u8bbe\u7f6e\u4e3alocalhost\u65f6\u624d\u9700\u8981\u8fd9\u6837\u505a\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"solana-test-validator\n")),(0,r.kt)("h4",{id:"4-\u6784\u5efa\u548c\u90e8\u7f72"},"4. \u6784\u5efa\u548c\u90e8\u7f72"),(0,r.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u51c6\u5907\u597d\u6784\u5efa\u548c\u90e8\u7f72\u6211\u4eec\u7684\u7a0b\u5e8f\u4e86\u3002\u901a\u8fc7\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"anchor build")," \u547d\u4ee4\u6765\u6784\u5efa\u7a0b\u5e8f\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"anchor build\n")),(0,r.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u90e8\u7f72\u6211\u4eec\u7684\u7a0b\u5e8f\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"anchor deploy\n")),(0,r.kt)("p",null,"solana\u7a0b\u5e8f\u90e8\u7f72\u5c06\u8f93\u51fa\u60a8\u7684\u7a0b\u5e8f\u7684\u7a0b\u5e8fID\u3002\u60a8\u73b0\u5728\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://explorer.solana.com/?cluster=custom"},"Solana Explorer"),"\u4e0a\u67e5\u627e\u5df2\u90e8\u7f72\u7684\u7a0b\u5e8f\uff08\u5bf9\u4e8e\u672c\u5730\u4e3b\u673a\uff0c\u8bf7\u9009\u62e9\u201c\u81ea\u5b9a\u4e49RPC URL\u201d\u4f5c\u4e3a\u96c6\u7fa4\uff09\u3002"),(0,r.kt)("h4",{id:"5-\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7"},"5. \u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7"),(0,r.kt)("p",null,"\u5728\u6211\u4eec\u8c03\u7528\u7a0b\u5e8f\u4e4b\u524d\uff0c\u6253\u5f00\u4e00\u4e2a\u5355\u72ec\u7684\u7ec8\u7aef\u5e76\u8fd0\u884c",(0,r.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u3002\u8fd9\u5c06\u5141\u8bb8\u6211\u4eec\u5728\u7ec8\u7aef\u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"solana logs \n")),(0,r.kt)("p",null,"\u6216\u8005\u4e5f\u53ef\u4ee5\u901a\u8fc7(Solana Exporer)","[https://explorer.solana.com/?cluster=custom]","\uff0c\u67e5\u770b\u4ea7\u751f\u7684\u65e5\u5fd7\ud83d\udcd4\u3002"),(0,r.kt)("p",null,"\u5728\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u4ecd\u5728\u8fd0\u884c\u65f6\uff0c\u5c1d\u8bd5\u4f7f\u7528",(0,r.kt)("a",{parentName:"p",href:"https://github.com/DaviRain-Su/all-in-one-solana/tree/main/code/contract/hello_world/app/hello-frontend"},"\u6b64\u5904"),"\u7684\u5ba2\u6237\u7aef\u811a\u672c\u8c03\u7528\u60a8\u7684\u7a0b\u5e8f\u3002"),(0,r.kt)("p",null,"\u8fd9\u5c06\u8fd4\u56de\u4e00\u4e2aSolana Explorer\u7684URL(",(0,r.kt)("inlineCode",{parentName:"p"},"Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=custom"),")\u3002\u5c06URL\u590d\u5236\u5230\u6d4f\u89c8\u5668\u4e2d\uff0c\u5728Solana Explorer\u4e0a\u67e5\u627e\u8be5\u4ea4\u6613\uff0c\u5e76\u68c0\u67e5\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u662f\u5426\u6253\u5370\u4e86\u201cHello, world!\u201d\u3002\u6216\u8005\uff0c\u60a8\u53ef\u4ee5\u5728\u8fd0\u884c",(0,r.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u7684\u7ec8\u7aef\u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\u3002"),(0,r.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\uff01\u60a8\u521a\u521a\u5728\u672c\u5730\u5f00\u53d1\u73af\u5883\u4e2d\u521b\u5efa\u5e76\u90e8\u7f72\u4e86\u60a8\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f\u3002"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a4421f51.802442fa.js b/assets/js/a4421f51.802442fa.js new file mode 100644 index 000000000..f3c7b0b11 --- /dev/null +++ b/assets/js/a4421f51.802442fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6989],{3905:(e,n,l)=>{l.d(n,{Zo:()=>i,kt:()=>h});var a=l(7294);function r(e,n,l){return n in e?Object.defineProperty(e,n,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[n]=l,e}function o(e,n){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),l.push.apply(l,a)}return l}function t(e){for(var n=1;n=0||(r[l]=e[l]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(r[l]=e[l])}return r}var c=a.createContext({}),s=function(e){var n=a.useContext(c),l=n;return e&&(l="function"==typeof e?e(n):t(t({},n),e)),l},i=function(e){var n=s(e.components);return a.createElement(c.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var l=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,i=p(e,["components","mdxType","originalType","parentName"]),u=s(l),m=r,h=u["".concat(c,".").concat(m)]||u[m]||d[m]||o;return l?a.createElement(h,t(t({ref:n},i),{},{components:l})):a.createElement(h,t({ref:n},i))}));function h(e,n){var l=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=l.length,t=new Array(o);t[0]=m;var p={};for(var c in n)hasOwnProperty.call(n,c)&&(p[c]=n[c]);p.originalType=e,p[u]="string"==typeof e?e:r,t[1]=p;for(var s=2;s{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>d,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var a=l(7462),r=(l(7294),l(3905));const o={sidebar_position:9,sidebar_label:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},t="Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",p={unversionedId:"Solana-Co-Learn/module1/local_program_development/anchor_program_hello",id:"Solana-Co-Learn/module1/local_program_development/anchor_program_hello",title:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",description:"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002",source:"@site/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello.md",sourceDirName:"Solana-Co-Learn/module1/local_program_development",slug:"/Solana-Co-Learn/module1/local_program_development/anchor_program_hello",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello.md",tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9,sidebar_label:"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u539f\u59cbSolana\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello"},next:{title:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello"}},c={},s=[{value:"Anchor \u5b89\u88c5",id:"anchor-\u5b89\u88c5",level:2},{value:"1. \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee",id:"1-\u521b\u5efa\u4e00\u4e2a\u65b0\u7684rust\u9879\u76ee",level:2},{value:"2. \u7f16\u5199\u4f60\u7684\u7a0b\u5e8f",id:"2-\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f",level:4},{value:"3. \u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668",id:"3-\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668",level:4},{value:"4. \u6784\u5efa\u548c\u90e8\u7f72",id:"4-\u6784\u5efa\u548c\u90e8\u7f72",level:4},{value:"5. \u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7",id:"5-\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7",level:4}],i={toc:s},u="wrapper";function d(e){let{components:n,...l}=e;return(0,r.kt)(u,(0,a.Z)({},i,l,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"anchor-\u5408\u7ea6\u6846\u67b6\u5b9e\u73b0hello-world"},"Anchor \u5408\u7ea6\u6846\u67b6\u5b9e\u73b0\u300ahello, World\u300b"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u6784\u5efa\u548c\u90e8\u7f72\u201cHello World\uff01\u201d\u7a0b\u5e8f\u6765\u8fdb\u884c\u7ec3\u4e60\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u672c\u5730\u5b8c\u6210\u6240\u6709\u64cd\u4f5c\uff0c\u5305\u62ec\u90e8\u7f72\u5230\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u60a8\u5df2\u7ecf\u5b89\u88c5\u4e86Rust\u548cSolana CLI\u3002\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u5b89\u88c5\uff0c\u8bf7\u53c2\u8003\u6982\u8ff0\u4e2d\u7684\u8bf4\u660e\u8fdb\u884c\u8bbe\u7f6e\u3002"),(0,r.kt)("h2",{id:"anchor-\u5b89\u88c5"},"Anchor \u5b89\u88c5"),(0,r.kt)("p",null,"\u8fd9\u91cc\u662fanchor\u7684",(0,r.kt)("a",{parentName:"p",href:"https://www.anchor-lang.com/docs/installation"},"\u5b89\u88c5\u5b98\u65b9\u6307\u5357"),"."),(0,r.kt)("p",null,"\u9700\u8981\u4f60\u6309\u7167\u6b65\u9aa4\u5b89\u88c5\u597danchor\u3002"),(0,r.kt)("p",null,"\u5b89\u88c5\u5b8c\u6210\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6267\u884c\u4e0b\u9762\u7684\u547d\u4ee4,\u68c0\u6d4banchor\u662f\u5426\u5b89\u88c5\u5b8c\u6210\u2705\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"anchor --version\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"anchor --version\nanchor-cli 0.28.0\n")),(0,r.kt)("h2",{id:"1-\u521b\u5efa\u4e00\u4e2a\u65b0\u7684rust\u9879\u76ee"},"1. \u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Rust\u9879\u76ee\u5f00\u59cb\u3002\u8fd0\u884c\u4e0b\u9762\u7684",(0,r.kt)("inlineCode",{parentName:"p"},"anchor init "),"\u547d\u4ee4\u3002\u968f\u610f\u7528\u4f60\u81ea\u5df1\u7684\u76ee\u5f55\u540d\u66ff\u6362\u5b83\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"anchor init hello_world\n")),(0,r.kt)("h4",{id:"2-\u7f16\u5199\u4f60\u7684\u7a0b\u5e8f"},"2. \u7f16\u5199\u4f60\u7684\u7a0b\u5e8f"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528\u4e0b\u9762\u7684\u201cHello World\uff01\u201d\u7a0b\u5e8f\u66f4\u65b0hello_world/program/src/lib.rs\u3002\u5f53\u7a0b\u5e8f\u88ab\u8c03\u7528\u65f6\uff0c\u8be5\u7a0b\u5e8f\u4f1a\u7b80\u5355\u5730\u5c06\u201cHello, world\uff01\u201d\u6253\u5370\u5230\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'use anchor_lang::prelude::*;\n\ndeclare_id!("Eo7uunKkgdRe8JtgmDimLkUEuT1oYbua4zWRCysWpv45");\n\n#[program]\npub mod hello_world {\n use super::*;\n\n pub fn initialize(ctx: Context) -> Result<()> {\n msg!("Hello,World!");\n Ok(())\n }\n}\n\n#[derive(Accounts)]\npub struct Initialize {}\n')),(0,r.kt)("h4",{id:"3-\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"},"3. \u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668"),(0,r.kt)("p",null,"\u5728\u7f16\u5199\u597d\u4f60\u7684\u7a0b\u5e8f\u4e4b\u540e\uff0c\u8ba9\u6211\u4eec\u786e\u4fdd\u6211\u4eec\u7684Solana CLI\u914d\u7f6e\u6307\u5411\u672c\u5730\u4e3b\u673a\uff0c\u4f7f\u7528",(0,r.kt)("inlineCode",{parentName:"p"},"solana config set --url"),"\u547d\u4ee4\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --url localhost\n")),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528",(0,r.kt)("inlineCode",{parentName:"p"},"solana config get"),"\u547d\u4ee4\u68c0\u67e5Solana CLI\u914d\u7f6e\u662f\u5426\u5df2\u66f4\u65b0\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"solana config get\n")),(0,r.kt)("p",null,"\u6700\u540e\uff0c\u8fd0\u884c\u672c\u5730\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u3002\u5728\u4e00\u4e2a\u5355\u72ec\u7684\u7ec8\u7aef\u7a97\u53e3\u4e2d\u8fd0\u884c",(0,r.kt)("inlineCode",{parentName:"p"},"solana-test-validator"),"\u547d\u4ee4\u3002\u53ea\u6709\u5f53\u6211\u4eec\u7684RPC URL\u8bbe\u7f6e\u4e3alocalhost\u65f6\u624d\u9700\u8981\u8fd9\u6837\u505a\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"solana-test-validator\n")),(0,r.kt)("h4",{id:"4-\u6784\u5efa\u548c\u90e8\u7f72"},"4. \u6784\u5efa\u548c\u90e8\u7f72"),(0,r.kt)("p",null,"\u6211\u4eec\u73b0\u5728\u51c6\u5907\u597d\u6784\u5efa\u548c\u90e8\u7f72\u6211\u4eec\u7684\u7a0b\u5e8f\u4e86\u3002\u901a\u8fc7\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"anchor build")," \u547d\u4ee4\u6765\u6784\u5efa\u7a0b\u5e8f\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"anchor build\n")),(0,r.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u90e8\u7f72\u6211\u4eec\u7684\u7a0b\u5e8f\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"anchor deploy\n")),(0,r.kt)("p",null,"solana\u7a0b\u5e8f\u90e8\u7f72\u5c06\u8f93\u51fa\u60a8\u7684\u7a0b\u5e8f\u7684\u7a0b\u5e8fID\u3002\u60a8\u73b0\u5728\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://explorer.solana.com/?cluster=custom"},"Solana Explorer"),"\u4e0a\u67e5\u627e\u5df2\u90e8\u7f72\u7684\u7a0b\u5e8f\uff08\u5bf9\u4e8e\u672c\u5730\u4e3b\u673a\uff0c\u8bf7\u9009\u62e9\u201c\u81ea\u5b9a\u4e49RPC URL\u201d\u4f5c\u4e3a\u96c6\u7fa4\uff09\u3002"),(0,r.kt)("h4",{id:"5-\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7"},"5. \u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7"),(0,r.kt)("p",null,"\u5728\u6211\u4eec\u8c03\u7528\u7a0b\u5e8f\u4e4b\u524d\uff0c\u6253\u5f00\u4e00\u4e2a\u5355\u72ec\u7684\u7ec8\u7aef\u5e76\u8fd0\u884c",(0,r.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u3002\u8fd9\u5c06\u5141\u8bb8\u6211\u4eec\u5728\u7ec8\u7aef\u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"solana logs \n")),(0,r.kt)("p",null,"\u6216\u8005\u4e5f\u53ef\u4ee5\u901a\u8fc7(Solana Exporer)","[https://explorer.solana.com/?cluster=custom]","\uff0c\u67e5\u770b\u4ea7\u751f\u7684\u65e5\u5fd7\ud83d\udcd4\u3002"),(0,r.kt)("p",null,"\u5728\u6d4b\u8bd5\u9a8c\u8bc1\u5668\u4ecd\u5728\u8fd0\u884c\u65f6\uff0c\u5c1d\u8bd5\u4f7f\u7528",(0,r.kt)("a",{parentName:"p",href:"https://github.com/DaviRain-Su/all-in-one-solana/tree/main/code/contract/hello_world/app/hello-frontend"},"\u6b64\u5904"),"\u7684\u5ba2\u6237\u7aef\u811a\u672c\u8c03\u7528\u60a8\u7684\u7a0b\u5e8f\u3002"),(0,r.kt)("p",null,"\u8fd9\u5c06\u8fd4\u56de\u4e00\u4e2aSolana Explorer\u7684URL(",(0,r.kt)("inlineCode",{parentName:"p"},"Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=custom"),")\u3002\u5c06URL\u590d\u5236\u5230\u6d4f\u89c8\u5668\u4e2d\uff0c\u5728Solana Explorer\u4e0a\u67e5\u627e\u8be5\u4ea4\u6613\uff0c\u5e76\u68c0\u67e5\u7a0b\u5e8f\u65e5\u5fd7\u4e2d\u662f\u5426\u6253\u5370\u4e86\u201cHello, world!\u201d\u3002\u6216\u8005\uff0c\u60a8\u53ef\u4ee5\u5728\u8fd0\u884c",(0,r.kt)("inlineCode",{parentName:"p"},"solana logs"),"\u547d\u4ee4\u7684\u7ec8\u7aef\u4e2d\u67e5\u770b\u7a0b\u5e8f\u65e5\u5fd7\u3002"),(0,r.kt)("p",null,"\u5c31\u662f\u8fd9\u6837\uff01\u60a8\u521a\u521a\u5728\u672c\u5730\u5f00\u53d1\u73af\u5883\u4e2d\u521b\u5efa\u5e76\u90e8\u7f72\u4e86\u60a8\u7684\u7b2c\u4e00\u4e2a\u7a0b\u5e8f\u3002"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a5905e0d.71820077.js b/assets/js/a5905e0d.71820077.js new file mode 100644 index 000000000..bf7144ff3 --- /dev/null +++ b/assets/js/a5905e0d.71820077.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1894],{3905:(e,a,n)=>{n.d(a,{Zo:()=>c,kt:()=>f});var t=n(7294);function o(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function l(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function r(e){for(var a=1;a=0||(o[n]=e[n]);return o}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=t.createContext({}),s=function(e){var a=t.useContext(u),n=a;return e&&(n="function"==typeof e?e(a):r(r({},a),e)),n},c=function(e){var a=s(e.components);return t.createElement(u.Provider,{value:a},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},p=t.forwardRef((function(e,a){var n=e.components,o=e.mdxType,l=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),d=s(n),p=o,f=d["".concat(u,".").concat(p)]||d[p]||m[p]||l;return n?t.createElement(f,r(r({ref:a},c),{},{components:n})):t.createElement(f,r({ref:a},c))}));function f(e,a){var n=arguments,o=a&&a.mdxType;if("string"==typeof e||o){var l=n.length,r=new Array(l);r[0]=p;var i={};for(var u in a)hasOwnProperty.call(a,u)&&(i[u]=a[u]);i.originalType=e,i[d]="string"==typeof e?e:o,r[1]=i;for(var s=2;s{n.r(a),n.d(a,{assets:()=>u,contentTitle:()=>r,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var t=n(7462),o=(n(7294),n(3905));const l={sidebar_position:11,sidebar_label:"Module1",sidebar_class_name:"green"},r="Solana Module1",i={unversionedId:"Solana-Co-Learn/module1/README",id:"Solana-Co-Learn/module1/README",title:"Solana Module1",description:"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello world\u5408\u7ea6",source:"@site/docs/Solana-Co-Learn/module1/README.md",sourceDirName:"Solana-Co-Learn/module1",slug:"/Solana-Co-Learn/module1/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/README.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{sidebar_position:11,sidebar_label:"Module1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Solana Co Learn tutorials",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/"},next:{title:"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/"}},u={},s=[{value:"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello world\u5408\u7ea6",id:"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello-world\u5408\u7ea6",level:2},{value:"\u5ba2\u6237\u7aef\u5f00\u53d1",id:"\u5ba2\u6237\u7aef\u5f00\u53d1",level:2},{value:"\u94b1\u5305\u548c\u524d\u7aef",id:"\u94b1\u5305\u548c\u524d\u7aef",level:2},{value:"\u81ea\u5b9a\u4e49\u6307\u4ee4",id:"\u81ea\u5b9a\u4e49\u6307\u4ee4",level:2},{value:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",level:2}],c={toc:s},d="wrapper";function m(e){let{components:a,...n}=e;return(0,o.kt)(d,(0,t.Z)({},c,n,{components:a,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"solana-module1"},"Solana Module1"),(0,o.kt)("h2",{id:"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello-world\u5408\u7ea6"},"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello world\u5408\u7ea6"),(0,o.kt)("h2",{id:"\u5ba2\u6237\u7aef\u5f00\u53d1"},"\u5ba2\u6237\u7aef\u5f00\u53d1"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u4f7f\u7528Gage\u5728Solana\u4e0a\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/"},"\u4ece\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/"},"\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/"},"\u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c"))),(0,o.kt)("h2",{id:"\u94b1\u5305\u548c\u524d\u7aef"},"\u94b1\u5305\u548c\u524d\u7aef"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/"},"\u8fde\u63a5\u5230\u94b1\u5305")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/"},"\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"))),(0,o.kt)("h2",{id:"\u81ea\u5b9a\u4e49\u6307\u4ee4"},"\u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u4f7f\u7528Gage\u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/"},"\u81ea\u5b9a\u4e49\u6307\u4ee4")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/"},"\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/"},"Run is back - \u53cd\u5e8f\u5217\u5316"))),(0,o.kt)("h2",{id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"},"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/"},"\u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/"},"\u90e8\u7f72\u5230 Vercel"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a5905e0d.a1d6fb7d.js b/assets/js/a5905e0d.a1d6fb7d.js deleted file mode 100644 index c4fa65ed8..000000000 --- a/assets/js/a5905e0d.a1d6fb7d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1894],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>f});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var u=r.createContext({}),c=function(e){var t=r.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=c(e.components);return r.createElement(u.Provider,{value:t},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,u=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),s=c(a),p=n,f=s["".concat(u,".").concat(p)]||s[p]||m[p]||o;return a?r.createElement(f,l(l({ref:t},d),{},{components:a})):r.createElement(f,l({ref:t},d))}));function f(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,l=new Array(o);l[0]=p;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[s]="string"==typeof e?e:n,l[1]=i;for(var c=2;c{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=a(7462),n=(a(7294),a(3905));const o={sidebar_position:11,sidebar_label:"Module1",sidebar_class_name:"green"},l="Solana Module1",i={unversionedId:"Solana-Co-Learn/module1/README",id:"Solana-Co-Learn/module1/README",title:"Solana Module1",description:"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello world\u5408\u7ea6",source:"@site/docs/Solana-Co-Learn/module1/README.md",sourceDirName:"Solana-Co-Learn/module1",slug:"/Solana-Co-Learn/module1/",permalink:"/docs/Solana-Co-Learn/module1/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/README.md",tags:[],version:"current",sidebarPosition:11,frontMatter:{sidebar_position:11,sidebar_label:"Module1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Solana Co Learn tutorials",permalink:"/docs/Solana-Co-Learn/"},next:{title:"\u672c\u5730\u7a0b\u5e8f\u5f00\u53d1\u73af\u5883\u914d\u7f6e",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/"}},u={},c=[{value:"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello world\u5408\u7ea6",id:"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello-world\u5408\u7ea6",level:2},{value:"\u5ba2\u6237\u7aef\u5f00\u53d1",id:"\u5ba2\u6237\u7aef\u5f00\u53d1",level:2},{value:"\u94b1\u5305\u548c\u524d\u7aef",id:"\u94b1\u5305\u548c\u524d\u7aef",level:2},{value:"\u81ea\u5b9a\u4e49\u6307\u4ee4",id:"\u81ea\u5b9a\u4e49\u6307\u4ee4",level:2},{value:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",level:2}],d={toc:c},s="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"solana-module1"},"Solana Module1"),(0,n.kt)("h2",{id:"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello-world\u5408\u7ea6"},"\u672c\u5730\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u4ee5\u53cahello world\u5408\u7ea6"),(0,n.kt)("h2",{id:"\u5ba2\u6237\u7aef\u5f00\u53d1"},"\u5ba2\u6237\u7aef\u5f00\u53d1"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u4f7f\u7528Gage\u5728Solana\u4e0a\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/"},"\u4ece\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/"},"\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/"},"\u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c"))),(0,n.kt)("h2",{id:"\u94b1\u5305\u548c\u524d\u7aef"},"\u94b1\u5305\u548c\u524d\u7aef"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/"},"\u8fde\u63a5\u5230\u94b1\u5305")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/"},"\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92"))),(0,n.kt)("h2",{id:"\u81ea\u5b9a\u4e49\u6307\u4ee4"},"\u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u4f7f\u7528Gage\u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/"},"\u81ea\u5b9a\u4e49\u6307\u4ee4")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/"},"\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/"},"Run is back - \u53cd\u5e8f\u5217\u5316"))),(0,n.kt)("h2",{id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"},"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/"},"\u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/"},"\u90e8\u7f72\u5230 Vercel"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a7023ddc.209f0442.js b/assets/js/a7023ddc.209f0442.js deleted file mode 100644 index b5a418a3c..000000000 --- a/assets/js/a7023ddc.209f0442.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1713],{3457:l=>{l.exports=JSON.parse('[{"label":"blog","permalink":"/blog/tags/blog","count":1},{"label":"blockchain","permalink":"/blog/tags/blockchain","count":1},{"label":"solana","permalink":"/blog/tags/solana","count":1},{"label":"IBC","permalink":"/blog/tags/ibc","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/a723cf16.0d60f0dd.js b/assets/js/a723cf16.0d60f0dd.js new file mode 100644 index 000000000..7d106509c --- /dev/null +++ b/assets/js/a723cf16.0d60f0dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2777],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(n),d=o,f=m["".concat(c,".").concat(d)]||m[d]||p[d]||a;return n?r.createElement(f,i(i({ref:t},u),{},{components:n})):r.createElement(f,i({ref:t},u))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[m]="string"==typeof e?e:o,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var r=n(7462),o=(n(7294),n(3905));const a={sidebar_position:19,sidebar_label:"\u81ea\u5b9a\u4e49\u6307\u4ee4",sidebar_class_name:"green"},i="\u81ea\u5b9a\u4e49\u6307\u4ee4",l={unversionedId:"Solana-Co-Learn/module1/custom-instruction/README",id:"Solana-Co-Learn/module1/custom-instruction/README",title:"\u81ea\u5b9a\u4e49\u6307\u4ee4",description:"- \ud83d\udcf9\u4f7f\u7528Gage\u81ea\u5b9a\u4e49\u6307\u4ee4",source:"@site/docs/Solana-Co-Learn/module1/custom-instruction/README.md",sourceDirName:"Solana-Co-Learn/module1/custom-instruction",slug:"/Solana-Co-Learn/module1/custom-instruction/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/custom-instruction/README.md",tags:[],version:"current",sidebarPosition:19,frontMatter:{sidebar_position:19,sidebar_label:"\u81ea\u5b9a\u4e49\u6307\u4ee4",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/"},next:{title:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/"}},c={},s=[],u={toc:s},m="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"\u81ea\u5b9a\u4e49\u6307\u4ee4"},"\u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u4f7f\u7528Gage\u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/"},"\u81ea\u5b9a\u4e49\u6307\u4ee4")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/"},"\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/"},"Run is back - \u53cd\u5e8f\u5217\u5316"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a723cf16.88a16a8c.js b/assets/js/a723cf16.88a16a8c.js deleted file mode 100644 index 91336ab6a..000000000 --- a/assets/js/a723cf16.88a16a8c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2777],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),m=s(r),d=o,f=m["".concat(l,".").concat(d)]||m[d]||p[d]||a;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:o,i[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const a={sidebar_position:19,sidebar_label:"\u81ea\u5b9a\u4e49\u6307\u4ee4",sidebar_class_name:"green"},i="\u81ea\u5b9a\u4e49\u6307\u4ee4",c={unversionedId:"Solana-Co-Learn/module1/custom-instruction/README",id:"Solana-Co-Learn/module1/custom-instruction/README",title:"\u81ea\u5b9a\u4e49\u6307\u4ee4",description:"- \ud83d\udcf9\u4f7f\u7528Gage\u81ea\u5b9a\u4e49\u6307\u4ee4",source:"@site/docs/Solana-Co-Learn/module1/custom-instruction/README.md",sourceDirName:"Solana-Co-Learn/module1/custom-instruction",slug:"/Solana-Co-Learn/module1/custom-instruction/",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/custom-instruction/README.md",tags:[],version:"current",sidebarPosition:19,frontMatter:{sidebar_position:19,sidebar_label:"\u81ea\u5b9a\u4e49\u6307\u4ee4",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\uddba \u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92",permalink:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/"},next:{title:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/"}},l={},s=[],u={toc:s},m="wrapper";function p(e){let{components:t,...r}=e;return(0,o.kt)(m,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"\u81ea\u5b9a\u4e49\u6307\u4ee4"},"\u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u4f7f\u7528Gage\u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/"},"\u81ea\u5b9a\u4e49\u6307\u4ee4")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/"},"\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/"},"Run is back - \u53cd\u5e8f\u5217\u5316"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a9637d4a.8fad74b8.js b/assets/js/a9637d4a.8fad74b8.js new file mode 100644 index 000000000..a7ac5bddd --- /dev/null +++ b/assets/js/a9637d4a.8fad74b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8230],{4151:e=>{e.exports=JSON.parse('{"permalink":"/all-in-one-solana/blog/tags/blockchain","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/af1a8150.81ed4f21.js b/assets/js/af1a8150.81ed4f21.js new file mode 100644 index 000000000..a4cf5324b --- /dev/null +++ b/assets/js/af1a8150.81ed4f21.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2337],{490:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"first-blog-post","metadata":{"permalink":"/all-in-one-solana/blog/first-blog-post","editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/blog/2023-07-06.md","source":"@site/blog/2023-07-06.md","title":"All in One Blockchain First Blog","description":"Welcome to our first blog post at All in One Blockchain! We\'re thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we\'ll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.","date":"2023-07-06T00:00:00.000Z","formattedDate":"July 6, 2023","tags":[{"label":"blog","permalink":"/all-in-one-solana/blog/tags/blog"},{"label":"blockchain","permalink":"/all-in-one-solana/blog/tags/blockchain"},{"label":"solana","permalink":"/all-in-one-solana/blog/tags/solana"},{"label":"IBC","permalink":"/all-in-one-solana/blog/tags/ibc"}],"readingTime":1.995,"hasTruncateMarker":false,"authors":[{"name":"Davirain","title":"Davirain Blog","url":"https://github.com/DaviRain-Su","imageURL":"https://github.com/DaviRain-Su.png","key":"davirain"}],"frontMatter":{"slug":"first-blog-post","title":"All in One Blockchain First Blog","authors":["davirain"],"tags":["blog","blockchain","solana","IBC"]}},"content":"Welcome to our first blog post at All in One Blockchain! We\'re thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we\'ll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.\\n\\n## Understanding Blockchain\\n\\nBlockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.\\n\\n## Spotlight on Solana\\n\\nSolana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It\'s known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).\\n\\nOne of Solana\'s key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network\'s overall efficiency.\\n\\nSolana\'s architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.\\n\\n## Inter-Blockchain Communication (IBC) Protocol\\n\\nThe Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It\'s a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.\\n\\nIBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.\\n\\n## The Future of Blockchain\\n\\nThe world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we\'ll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.\\n\\nJoin us on this journey as we unravel the complexities of blockchain technology. Whether you\'re a seasoned developer, a crypto enthusiast, or a curious newcomer, there\'s always something new to learn in the dynamic world of blockchain.\\n\\nStay tuned for more insightful content, and don\'t hesitate to reach out if you have any questions or topics you\'d like us to cover. Welcome aboard!"}]}')}}]); \ No newline at end of file diff --git a/assets/js/af284665.6bf08071.js b/assets/js/af284665.6bf08071.js deleted file mode 100644 index ece247fd1..000000000 --- a/assets/js/af284665.6bf08071.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[106],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),u=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},c=function(e){var n=u(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(t),d=a,k=p["".concat(s,".").concat(d)]||p[d]||m[d]||o;return t?r.createElement(k,l(l({ref:n},c),{},{components:t})):r.createElement(k,l({ref:n},c))}));function k(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=d;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:20,sidebar_label:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",sidebar_class_name:"green"},l="\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",i={unversionedId:"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README",id:"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README",title:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u4f60\u73b0\u5728\u77e5\u9053\u5982\u4f55\u8bfb\u53d6\u6570\u636e\u5e76\u901a\u8fc7\u7b80\u5355\u7684\u4ea4\u6613\u5199\u5165\u7f51\u7edc\u3002\u51e0\u4e4e\u7acb\u5373\uff0c\u4f60\u4f1a\u53d1\u73b0\u81ea\u5df1\u60f3\u8981\u901a\u8fc7\u4ea4\u6613\u53d1\u9001\u6570\u636e\u3002\u90a3\u4e48\u8ba9\u6211\u4eec\u770b\u770b\u5982\u4f55\u5411Solana\u533a\u5757\u94fe\u8bb2\u8ff0\u4f60\u7684\u6545\u4e8b\u3002",source:"@site/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/README.md",sourceDirName:"Solana-Co-Learn/module1/custom-instruction/custom-instructions",slug:"/Solana-Co-Learn/module1/custom-instruction/custom-instructions/",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/README.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_position:20,sidebar_label:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u81ea\u5b9a\u4e49\u6307\u4ee4",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/"},next:{title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/"}},s={},u=[{value:"\ud83d\udce7 \u6307\u4ee4\u6570\u636e",id:"-\u6307\u4ee4\u6570\u636e",level:2},{value:"\ud83d\udd28 \u5e8f\u5217\u5316\u548cborsh",id:"-\u5e8f\u5217\u5316\u548cborsh",level:2}],c={toc:u},p="wrapper";function m(e){let{components:n,...o}=e;return(0,a.kt)(p,(0,r.Z)({},c,o,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u81ea\u5b9a\u4e49\u6307\u4ee4"},"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,a.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u4f60\u73b0\u5728\u77e5\u9053\u5982\u4f55\u8bfb\u53d6\u6570\u636e\u5e76\u901a\u8fc7\u7b80\u5355\u7684\u4ea4\u6613\u5199\u5165\u7f51\u7edc\u3002\u51e0\u4e4e\u7acb\u5373\uff0c\u4f60\u4f1a\u53d1\u73b0\u81ea\u5df1\u60f3\u8981\u901a\u8fc7\u4ea4\u6613\u53d1\u9001\u6570\u636e\u3002\u90a3\u4e48\u8ba9\u6211\u4eec\u770b\u770b\u5982\u4f55\u5411Solana\u533a\u5757\u94fe\u8bb2\u8ff0\u4f60\u7684\u6545\u4e8b\u3002"),(0,a.kt)("p",null,"Solana\u4e2d\u5173\u4e8e\u6570\u636e\u7684\u68d8\u624b\u4e4b\u5904\u5728\u4e8e\u7a0b\u5e8f\u662f\u65e0\u72b6\u6001\u7684\u3002\u4e0e\u4ee5\u592a\u574a\u7b49\u5176\u4ed6\u533a\u5757\u94fe\u4e2d\u7684\u667a\u80fd\u5408\u7ea6\u4e0d\u540c\uff0c\u7a0b\u5e8f\u4e0d\u5b58\u50a8\u4efb\u4f55\u6570\u636e\uff0c\u53ea\u5b58\u50a8\u903b\u8f91"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(7915).Z,width:"488",height:"860"})),(0,a.kt)("p",null,"\u56fe\u4e3a\uff1aSolana \u521b\u59cb\u4eba ",(0,a.kt)("inlineCode",{parentName:"p"},"Anatoly Yakovenko")," \u6b63\u5728\u5236\u4f5c Solana\u3002"),(0,a.kt)("p",null,"Solana \u7a0b\u5e8f\u4e2d\u7edd\u5bf9\u4e0d\u5b58\u50a8\u4efb\u4f55\u5185\u5bb9\u3002\u5b83\u4e0d\u77e5\u9053\u6240\u6709\u8005\u662f\u8c01\uff0c\u751a\u81f3\u4e0d\u77e5\u9053\u662f\u8c01\u90e8\u7f72\u4e86\u5b83\u3002\u4e00\u5207\u90fd\u5b58\u50a8\u5728\u5e10\u6237\u5185\u3002"),(0,a.kt)("h2",{id:"-\u6307\u4ee4\u6570\u636e"},"\ud83d\udce7 \u6307\u4ee4\u6570\u636e"),(0,a.kt)("p",null,"\u6211\u4eec\u8981\u7a0d\u5fae\u770b\u4e00\u4e0b\u5f15\u64ce\u76d6\u4e0b\u9762\u7684\u4e1c\u897f\u3002\u5728\u8fd9\u4e00\u90e8\u5206\uff0c\u5f88\u591a\u5de5\u4f5c\u5b9e\u9645\u4e0a\u4f1a\u7531\u50cf",(0,a.kt)("inlineCode",{parentName:"p"},"Anchor"),"\u8fd9\u6837\u7684\u5e93\u6765\u5904\u7406\uff0c\u4f46\u662f\u4e86\u89e3\u539f\u5b50\u6307\u4ee4\u7ea7\u522b\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\u5f88\u91cd\u8981\u7684\u3002"),(0,a.kt)("p",null,"\u8ba9\u6211\u4eec\u9000\u540e\u4e00\u6b65\uff0c\u770b\u770b\u6307\u4ee4\u6570\u636e\u7684\u4f4d\u7f6e\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(4874).Z,width:"594",height:"417"})),(0,a.kt)("p",null,"\u4ea4\u6613\u53ef\u4ee5\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u6307\u4ee4\uff0c\u6bcf\u4e2a\u6307\u4ee4\u53ef\u4ee5\u6709\u6570\u636e\u3002"),(0,a.kt)("p",null,"\u5173\u4e8e\u6307\u4ee4\u6570\u636e\u7684\u91cd\u8981\u4e4b\u5904\u5728\u4e8e\u5176\u683c\u5f0f - \u5b83\u662f",(0,a.kt)("strong",{parentName:"p"},"8\u4f4d\u6570\u636e"),'\u3002 "\u4f4d" \u610f\u5473\u7740\u5b83\u662f\u673a\u5668\u7801\uff1a1\u548c0\u30028\u53ea\u662f\u6307\u5927\u5c0f\uff0c\u5c31\u50cf32\u4f4d\u621664\u4f4d\u4e00\u6837\u3002\u5982\u679c\u60a8\u7684\u6307\u4ee4\u6570\u636e\u4e0d\u7b26\u5408\u8fd9\u4e2a\u683c\u5f0f\uff0cSolana\u8fd0\u884c\u65f6\u5c06\u65e0\u6cd5\u8bc6\u522b\u5b83\u3002'),(0,a.kt)("p",null,"\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48Solana\u5982\u6b64\u5feb\u901f\uff01\u5b83\u4e0d\u662f\u8ba9\u7f51\u7edc\u8f6c\u6362\u4f60\u7684\u6570\u636e\uff0c\u800c\u662f\u4f60\u63d0\u4f9b\u5df2\u7ecf\u8f6c\u6362\u597d\u7684\u6570\u636e\uff0c\u7136\u540e\u7f51\u7edc\u53ea\u9700\u5904\u7406\u5b83\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u5982\u679c\u4f60\u5728\u5f00\u59cb\u70f9\u996a\u4e4b\u524d\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\u6240\u6709\u83dc\u80b4\u7684\u98df\u6750\uff0c\u4f60\u5c06\u80fd\u591f\u66f4\u5feb\u5730\u70f9\u996a\uff0c\u56e0\u4e3a\u4f60\u4e0d\u9700\u8981\u5207\u5272\u98df\u6750\u3002"),(0,a.kt)("p",null,"\u4f60\u4e0d\u9700\u8981\u77e5\u9053\u673a\u5668\u7801\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002\u4f60\u53ea\u9700\u8981\u8bb0\u4f4f\u6307\u4ee4\u6570\u636e\u662f\u67d0\u79cd\u7c7b\u578b\u7684\uff0c\u5f53\u4f60\u60f3\u8981\u5c06\u6570\u636e\u5305\u542b\u5728\u6307\u4ee4\u4e2d\u65f6\uff0c\u4f60\u9700\u8981\u5c06\u4f60\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u8be5\u7c7b\u578b\u3002"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u8fd9\u6bb5\u8bdd\u5728\u89e3\u91ca Solana \u7f51\u7edc\u5982\u4f55\u5904\u7406\u4e8b\u52a1\u548c\u6307\u4ee4\u6570\u636e\u7684\u3002\u5728 Solana \u4e2d\uff0c\u4e00\u4e2a\u4e8b\u52a1\u53ef\u4ee5\u5305\u542b\u4e00\u6761\u6216\u591a\u6761\u6307\u4ee4\uff0c\u6bcf\u6761\u6307\u4ee4\u90fd\u53ef\u4ee5\u643a\u5e26\u4e00\u4e9b\u6570\u636e\u3002"),(0,a.kt)("p",{parentName:"blockquote"},"\u91cd\u70b9\u662f\uff0c\u8fd9\u4e9b\u6307\u4ee4\u6570\u636e\u9700\u8981\u4ee5\u7279\u5b9a\u683c\u5f0f\u63d0\u4f9b\uff0c\u5373 8 \u4f4d\u6570\u636e\u3002\u8fd9\u91cc\u7684 \u201c8\u4f4d\u201d \u4e0d\u662f\u6307\u6570\u636e\u7684\u5927\u5c0f\uff0c\u800c\u662f\u6307\u6570\u636e\u7684\u683c\u5f0f\uff0c\u8fd9\u79cd\u683c\u5f0f\u662f\u673a\u5668\u4ee3\u7801\u683c\u5f0f\uff0c\u7528 1 \u548c 0 \u8868\u793a\u3002\u5982\u679c\u4f60\u63d0\u4f9b\u7684\u6307\u4ee4\u6570\u636e\u4e0d\u662f\u8fd9\u79cd\u683c\u5f0f\uff0cSolana \u8fd0\u884c\u65f6\u5c31\u65e0\u6cd5\u8bc6\u522b\u548c\u5904\u7406\u5b83\u3002"),(0,a.kt)("p",{parentName:"blockquote"},"\u8fd9\u79cd\u5904\u7406\u65b9\u5f0f\u662f Solana \u80fd\u591f\u9ad8\u901f\u8fd0\u884c\u7684\u4e00\u4e2a\u539f\u56e0\u3002\u4f60\u4e0d\u9700\u8981\u8ba9\u7f51\u7edc\u8f6c\u6362\u4f60\u7684\u6570\u636e\uff0c\u800c\u662f\u81ea\u5df1\u8f6c\u6362\u6570\u636e\u5e76\u63d0\u4f9b\u7ed9\u7f51\u7edc\uff0c\u7f51\u7edc\u53ea\u8d1f\u8d23\u5904\u7406\u5b83\u3002\u8fd9\u5c31\u50cf\u5728\u5f00\u59cb\u70f9\u996a\u524d\u5c31\u51c6\u5907\u597d\u6240\u6709\u98df\u6750\uff0c\u8fd9\u6837\u4f60\u5c31\u80fd\u66f4\u5feb\u5730\u70f9\u996a\uff0c\u56e0\u4e3a\u4f60\u4e0d\u9700\u8981\u5728\u70f9\u996a\u8fc7\u7a0b\u4e2d\u53bb\u5207\u4e1c\u897f\u3002"),(0,a.kt)("p",{parentName:"blockquote"},"\u4f5c\u8005\u5f3a\u8c03\u7684\u662f\uff0c\u4f60\u5e76\u4e0d\u9700\u8981\u4e86\u89e3\u673a\u5668\u4ee3\u7801\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002\u4f60\u9700\u8981\u8bb0\u4f4f\u7684\u662f\uff0c\u5f53\u4f60\u60f3\u8981\u5728\u6307\u4ee4\u4e2d\u5305\u542b\u4e00\u4e9b\u6570\u636e\u65f6\uff0c\u8fd9\u4e9b\u6570\u636e\u9700\u8981\u662f\u7279\u5b9a\u7c7b\u578b\u7684\uff0c\u4f60\u9700\u8981\u628a\u4f60\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u8fd9\u79cd\u7c7b\u578b\u3002\u8fd9\u5c31\u610f\u5473\u7740\u5728\u4f60\u7f16\u5199\u548c\u63d0\u4ea4\u7ed9 Solana \u7f51\u7edc\u7684\u4ee3\u7801\u4e2d\uff0c\u4f60\u9700\u8981\u8d1f\u8d23\u628a\u4f60\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u9002\u5f53\u7684\u683c\u5f0f\u3002"),(0,a.kt)("p",{parentName:"blockquote"},"\u8fd9\u662f\u4f4e\u7ea7\u522b\u7f16\u7a0b\u7684\u4e00\u4e2a\u5e38\u89c1\u7279\u6027\u3002\u867d\u7136\u5f88\u591a\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\uff08\u6bd4\u5982 Python \u6216 JavaScript\uff09\u4f1a\u81ea\u52a8\u5904\u7406\u8fd9\u4e9b\u7c7b\u578b\u8f6c\u6362\uff0c\u4f46\u5728\u4f4e\u7ea7\u8bed\u8a00\uff08\u6bd4\u5982 Rust\uff0c\u8fd9\u4e5f\u662f Solana \u4e3b\u8981\u4f7f\u7528\u7684\u8bed\u8a00\uff09\u4e2d\uff0c\u4f60\u9700\u8981\u81ea\u5df1\u5904\u7406\u8fd9\u4e9b\u8f6c\u6362\u3002\u7136\u800c\uff0c\u6709\u4e9b\u5e93\uff0c\u5982 Anchor\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5904\u7406\u8fd9\u4e9b\u8f6c\u6362\uff0c\u8ba9\u7f16\u7a0b\u66f4\u7b80\u5355\u3002")),(0,a.kt)("h2",{id:"-\u5e8f\u5217\u5316\u548cborsh"},"\ud83d\udd28 \u5e8f\u5217\u5316\u548cborsh"),(0,a.kt)("p",null,"\u8fd9\u5c31\u662f\u5e8f\u5217\u5316\u7684\u4f5c\u7528 - \u5b83\u662f\u5c06\u5e38\u89c4\u7684\u4ee3\u7801\u6216\u6570\u636e\u8f6c\u6362\u4e3a\u5b57\u8282\u6570\u7ec4\uff08\u673a\u5668\u4ee3\u7801\uff1a1\u548c0\uff09\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6211\u4eec\u7684\u9879\u76ee\u4e2d\u4f7f\u7528 ",(0,a.kt)("a",{parentName:"p",href:"https://borsh.io/"},"Borsh")," \u5e8f\u5217\u5316\u683c\u5f0f\uff0c\u56e0\u4e3a\u5b83\u6709\u4e00\u4e2a\u65b9\u4fbf\u6211\u4eec\u4f7f\u7528\u7684\u5e93\u3002"),(0,a.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u6765\u770b\u770b\u5b83\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u2014\u2014\u76ee\u6807\u662f\u88c5\u5907\u4e00\u4e2a\u94fe\u4e0a\u6e38\u620f\u7269\u54c1\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4e09\u4e2a\u6570\u636e"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"variant")," - \u6211\u4eec\u8981\u8c03\u7528\u7684\u547d\u4ee4\u7684\u540d\u79f0\uff08\u5373\u88c5\u5907\u6216\u5220\u9664\uff09"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"playerId")," - \u88c5\u5907\u8be5\u7269\u54c1\u7684\u73a9\u5bb6\u7684ID"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"itemId")," - \u6211\u4eec\u60f3\u8981\u88c5\u5907\u7684\u7269\u54c1")),(0,a.kt)("p",null,"\u5e8f\u5217\u5316\u6b64\u6570\u636e\u6709\u56db\u4e2a\u6b65\u9aa4\uff1a"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\u521b\u5efa\u6570\u636e\u6a21\u5f0f/\u6620\u5c04\uff0c\u4ee5\u786e\u5b9a\u6570\u636e\u7684\u9884\u671f\u7ed3\u6784"),(0,a.kt)("li",{parentName:"ol"},"\u4e3a\u6570\u636e\u5206\u914d\u4e00\u4e2a\u6bd4\u5b9e\u9645\u9700\u8981\u7684\u8981\u5927\u5f97\u591a\u7684\u7f13\u51b2\u533a"),(0,a.kt)("li",{parentName:"ol"},"\u5c06\u6211\u4eec\u7684\u6570\u636e\u8fdb\u884c\u7f16\u7801\u5e76\u6dfb\u52a0\u5230\u7f13\u51b2\u533a\u4e2d"),(0,a.kt)("li",{parentName:"ol"},"\u53bb\u6389\u7f13\u51b2\u533a\u672b\u5c3e\u7684\u989d\u5916\u7a7a\u683c")),(0,a.kt)("p",null,"\u4f5c\u4e3a\u7f51\u7edc\u5f00\u53d1\u4eba\u5458\uff0c\u6211\u4eec\u6c38\u8fdc\u4e0d\u9700\u8981\u5904\u7406\u8fd9\u6837\u7684\u4f4e\u7ea7\u5185\u5bb9\uff0c\u6240\u4ee5\u6211\u8fd9\u6837\u505a\u662f\u4e3a\u4e86\u8ba9\u5b83\u611f\u89c9\u4e0d\u90a3\u4e48\u62bd\u8c61\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(9289).Z,width:"658",height:"638"})),(0,a.kt)("p",null,"\u6211\u5e0c\u671b\u8fd9\u662f\u6709\u9053\u7406\u7684\uff0c\u54c8\u54c8\u3002\u8ba9\u6211\u4eec\u770b\u4e00\u4e9b\u4ee3\u7801\u4ee5\u4e86\u89e3\u5176\u5b9e\u9645\u60c5\u51b5\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import * as Borsh from "@project-serum/borsh"\n\nconst equipPlayerSchema = Borsh.struct([\n Borsh.u8("variant"),\n Borsh.u8("playerId"),\n Borsh.u8("itemId"),\n])\n')),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u4e3a\u88c5\u5907\u7269\u54c1\u6307\u4ee4\u521b\u5efa\u4e00\u4e2a\u6a21\u5f0f\u5f00\u59cb\u3002\u6211\u4eec\u6b63\u5728\u521b\u5efa\u4e00\u4e2a\u5305\u542b\u4e09\u4e2a\u6570\u636e\u7247\u6bb5\u7684borsh\u7ed3\u6784\uff0c\u5b83\u4eec\u90fd\u662f\u65e0\u7b26\u53f7\u6574\u6570\uff0c\u4f46\u5927\u5c0f\u4e0d\u540c - 8\u4f4d\u300116\u4f4d\u548c256\u4f4d\u3002"),(0,a.kt)("p",null,"\u7531\u4e8e\u6211\u4eec\u7684\u6570\u636e\u5c06\u53d8\u6210\u4e00\u957f\u4e32\u76841\u548c0\uff0c\u6211\u4eec\u9700\u8981\u77e5\u9053\u6bcf\u4e2a\u6570\u636e\u9879\u7684\u8d77\u59cb\u548c\u7ed3\u675f\u4f4d\u7f6e\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6211\u4eec\u7ed9\u6bcf\u4e2a\u9879\u5206\u914d\u4e00\u4e2a\u7279\u5b9a\u7684\u5927\u5c0f\u3002\u5f53\u7a0b\u5e8f\u9700\u8981\u8bfb\u53d6\u8fd9\u4e9b\u6570\u636e\u65f6\uff0c\u5b83\u5c06\u77e5\u9053 ",(0,a.kt)("inlineCode",{parentName:"p"},"variant")," \u7684\u7ed3\u675f\u4f4d\u7f6e\u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"playerId")," \u7684\u8d77\u59cb\u4f4d\u7f6e\u3002"),(0,a.kt)("p",null,"\u60f3\u8c61\u4e00\u4e0b\u8499\u7740\u773c\u775b\u8bd5\u56fe\u4ece\u94fe\u63a5\u4e0a\u5207\u9999\u80a0\u3002\u53ea\u6709\u77e5\u9053\u6bcf\u6839\u9999\u80a0\u7684\u957f\u5ea6\uff0c\u624d\u80fd\u5728\u6b63\u786e\u7684\u4f4d\u7f6e\u5207\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(3836).Z,width:"520",height:"300"})),(0,a.kt)("p",null,"\u5728\u6211\u4eec\u7684\u4f8b\u5b50\u4e2d\uff0c\u7b2c\u4e8c\u6839\u548c\u7b2c\u4e09\u6839\u9999\u80a0\u4f1a\u957f\u5f88\u591a\uff0c\u4f46\u6211\u60f3\u4f60\u660e\u767d\u4e86\uff0c\u54c8\u54c8\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import * as Borsh from "@project-serum/borsh"\n\nconst equipPlayerSchema = Borsh.struct([\n Borsh.u8("variant"),\n Borsh.u8("playerId"),\n Borsh.u8("itemId"),\n])\n\nconst buffer = Buffer.alloc(1000)\nequipPlayerSchems.encode({ variant: 2, playerId: 1435, itemId: 737498}, buffer)\n\nconst instructBuffer = buffer.slice(0, equipPlayerSchems.getSpan(buffer))\n')),(0,a.kt)("p",null,"\u8fd9\u91cc\u53d1\u751f\u7b2c\u4e8c\u6b65\u3001\u7b2c\u4e09\u6b65\u548c\u7b2c\u56db\u6b65\u3002\u6211\u4eec\u521b\u5efa\u4e00\u4e2a 1000 \u5b57\u8282\u957f\u7684\u7f13\u51b2\u533a\u3002\u6211\u4eec\u5bf9\u6570\u636e\u8fdb\u884c\u7f16\u7801\u5e76\u5c06\u5176\u6dfb\u52a0\u5230\u7f13\u51b2\u533a\u4e2d\u3002\u7136\u540e\u6211\u4eec\u5c06\u672b\u7aef\u5207\u6210\u8584\u7247\uff0c\u4f7f\u5176\u957f\u5ea6\u8fbe\u5230\u9700\u8981\u7684\u957f\u5ea6\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const endpoint = clusterApiUrl("devnet")\nconst connection = new Connection(endpoint)\n\nconst transaction = new Transaction().add({\n key: [\n {\n pubkey: player.Publickey,\n isSigner: true,\n isWritable: false,\n },\n {\n pubkey: playerInfoAccount,\n isSigner: false,\n isWritable: true,\n },\n {\n pubkey: SystemProgram.programId,\n isSigner: false,\n isWritable: false,\n },\n ],\n data: instructBuffer,\n programId: PROGRAM_ID,\n})\n\nsendAndConfirmTransaction(connection, transaction, [player])\n')),(0,a.kt)("p",null,"\u4e00\u65e6\u6211\u4eec\u6709\u4e86\u6b63\u786e\u683c\u5f0f\u7684\u6570\u636e\uff0c\u5269\u4e0b\u7684\u5c31\u662f\u5c0f\u83dc\u4e00\u789f\uff01\u8fd9\u4e2a\u4ea4\u6613\u5e94\u8be5\u770b\u8d77\u6765\u5f88\u719f\u6089\u3002\u552f\u4e00\u7684\u201c\u65b0\u201d\u4e1c\u897f\u5c31\u662f\u6211\u4eec\u4ee5\u524d\u6ca1\u6709\u7684\u53ef\u9009\u9879 ",(0,a.kt)("inlineCode",{parentName:"p"},"data")," \u3002"),(0,a.kt)("p",null,"\u6211\u5728\u8fd9\u91cc\u5bf9\u4f60\u7684\u77e5\u8bc6\u505a\u4e86\u4e00\u4e9b\u5047\u8bbe - \u4f60\u5927\u81f4\u4e86\u89e3\u673a\u5668\u7801\u662f\u4ec0\u4e48\uff0c\u4ee5\u53ca\u5185\u5b58\u5206\u914d\u5982\u4f55\u53d1\u6325\u4f5c\u7528\u3002\u4f60\u4e0d\u9700\u8981\u4e86\u89e3\u6240\u6709\u8fd9\u4e9b\u4e1c\u897f\uff0c\u6211\u81ea\u5df1\u4e5f\u4e0d\u9700\u8981\u3002\u53ea\u9700\u5728YouTube\u4e0a\u89c2\u770b\u4e00\u4e24\u4e2a\u89c6\u9891\uff0c\u76f4\u5230\u4f60\u5bf9\u6b63\u5728\u53d1\u751f\u7684\u4e8b\u60c5\u6709\u4e00\u4e2a\u5927\u81f4\u7684\u611f\u89c9\u5373\u53ef\u3002"),(0,a.kt)("p",null,"\u73b0\u4ee3\u5f00\u53d1\u4eba\u5458\u5f88\u5c11\u7ecf\u5e38\u5904\u7406\u5b57\u8282\u7f13\u51b2\u533a - \u8fd9\u88ab\u8ba4\u4e3a\u662f\u4f4e\u7ea7\u522b\u7684\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u5bf9\u6b64\u611f\u5230\u964c\u751f\u6216\u65b0\u5947\uff0c\u4e0d\u7528\u62c5\u5fc3\u3002\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u4f7f\u7528\u5b83\u6784\u5efa\uff0c\u8fd9\u6837\u4f60\u5c31\u53ef\u4ee5\u79f0\u81ea\u5df1\u4e3a\u8f6f\u4ef6\u5de5\u7a0b\u5e08\u4e86 \ud83d\ude0e"))}m.isMDXComponent=!0},7915:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_1-488a66e2929336a828195f5701f9ab94.png"},4874:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_2-a4c99080d257f6d8cff5e66b9eb93c74.png"},9289:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_3-e21a9380d242c77b52206d375c7d662c.png"},3836:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_4-8d932bb31a0cb8a748116cc79ee63fb9.png"}}]); \ No newline at end of file diff --git a/assets/js/af284665.f77f62b1.js b/assets/js/af284665.f77f62b1.js new file mode 100644 index 000000000..303a7404e --- /dev/null +++ b/assets/js/af284665.f77f62b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[106],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),u=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},c=function(e){var n=u(e.components);return r.createElement(s.Provider,{value:n},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(t),d=a,k=p["".concat(s,".").concat(d)]||p[d]||m[d]||o;return t?r.createElement(k,l(l({ref:n},c),{},{components:t})):r.createElement(k,l({ref:n},c))}));function k(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=d;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:20,sidebar_label:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",sidebar_class_name:"green"},l="\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",i={unversionedId:"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README",id:"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README",title:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u4f60\u73b0\u5728\u77e5\u9053\u5982\u4f55\u8bfb\u53d6\u6570\u636e\u5e76\u901a\u8fc7\u7b80\u5355\u7684\u4ea4\u6613\u5199\u5165\u7f51\u7edc\u3002\u51e0\u4e4e\u7acb\u5373\uff0c\u4f60\u4f1a\u53d1\u73b0\u81ea\u5df1\u60f3\u8981\u901a\u8fc7\u4ea4\u6613\u53d1\u9001\u6570\u636e\u3002\u90a3\u4e48\u8ba9\u6211\u4eec\u770b\u770b\u5982\u4f55\u5411Solana\u533a\u5757\u94fe\u8bb2\u8ff0\u4f60\u7684\u6545\u4e8b\u3002",source:"@site/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/README.md",sourceDirName:"Solana-Co-Learn/module1/custom-instruction/custom-instructions",slug:"/Solana-Co-Learn/module1/custom-instruction/custom-instructions/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/README.md",tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_position:20,sidebar_label:"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u81ea\u5b9a\u4e49\u6307\u4ee4",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/"},next:{title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u5e94\u7528",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/"}},s={},u=[{value:"\ud83d\udce7 \u6307\u4ee4\u6570\u636e",id:"-\u6307\u4ee4\u6570\u636e",level:2},{value:"\ud83d\udd28 \u5e8f\u5217\u5316\u548cborsh",id:"-\u5e8f\u5217\u5316\u548cborsh",level:2}],c={toc:u},p="wrapper";function m(e){let{components:n,...o}=e;return(0,a.kt)(p,(0,r.Z)({},c,o,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u81ea\u5b9a\u4e49\u6307\u4ee4"},"\ud83e\udd14 \u81ea\u5b9a\u4e49\u6307\u4ee4"),(0,a.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u94b1\u5305\u8fde\u63a5\u7684\u8bbe\u7f6e\uff0c\u8ba9\u6211\u4eec\u8ba9\u6211\u4eec\u7684ping\u6309\u94ae\u771f\u6b63\u6709\u6240\u4f5c\u4e3a\u5427\uff01\u4f60\u73b0\u5728\u77e5\u9053\u5982\u4f55\u8bfb\u53d6\u6570\u636e\u5e76\u901a\u8fc7\u7b80\u5355\u7684\u4ea4\u6613\u5199\u5165\u7f51\u7edc\u3002\u51e0\u4e4e\u7acb\u5373\uff0c\u4f60\u4f1a\u53d1\u73b0\u81ea\u5df1\u60f3\u8981\u901a\u8fc7\u4ea4\u6613\u53d1\u9001\u6570\u636e\u3002\u90a3\u4e48\u8ba9\u6211\u4eec\u770b\u770b\u5982\u4f55\u5411Solana\u533a\u5757\u94fe\u8bb2\u8ff0\u4f60\u7684\u6545\u4e8b\u3002"),(0,a.kt)("p",null,"Solana\u4e2d\u5173\u4e8e\u6570\u636e\u7684\u68d8\u624b\u4e4b\u5904\u5728\u4e8e\u7a0b\u5e8f\u662f\u65e0\u72b6\u6001\u7684\u3002\u4e0e\u4ee5\u592a\u574a\u7b49\u5176\u4ed6\u533a\u5757\u94fe\u4e2d\u7684\u667a\u80fd\u5408\u7ea6\u4e0d\u540c\uff0c\u7a0b\u5e8f\u4e0d\u5b58\u50a8\u4efb\u4f55\u6570\u636e\uff0c\u53ea\u5b58\u50a8\u903b\u8f91"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(7915).Z,width:"488",height:"860"})),(0,a.kt)("p",null,"\u56fe\u4e3a\uff1aSolana \u521b\u59cb\u4eba ",(0,a.kt)("inlineCode",{parentName:"p"},"Anatoly Yakovenko")," \u6b63\u5728\u5236\u4f5c Solana\u3002"),(0,a.kt)("p",null,"Solana \u7a0b\u5e8f\u4e2d\u7edd\u5bf9\u4e0d\u5b58\u50a8\u4efb\u4f55\u5185\u5bb9\u3002\u5b83\u4e0d\u77e5\u9053\u6240\u6709\u8005\u662f\u8c01\uff0c\u751a\u81f3\u4e0d\u77e5\u9053\u662f\u8c01\u90e8\u7f72\u4e86\u5b83\u3002\u4e00\u5207\u90fd\u5b58\u50a8\u5728\u5e10\u6237\u5185\u3002"),(0,a.kt)("h2",{id:"-\u6307\u4ee4\u6570\u636e"},"\ud83d\udce7 \u6307\u4ee4\u6570\u636e"),(0,a.kt)("p",null,"\u6211\u4eec\u8981\u7a0d\u5fae\u770b\u4e00\u4e0b\u5f15\u64ce\u76d6\u4e0b\u9762\u7684\u4e1c\u897f\u3002\u5728\u8fd9\u4e00\u90e8\u5206\uff0c\u5f88\u591a\u5de5\u4f5c\u5b9e\u9645\u4e0a\u4f1a\u7531\u50cf",(0,a.kt)("inlineCode",{parentName:"p"},"Anchor"),"\u8fd9\u6837\u7684\u5e93\u6765\u5904\u7406\uff0c\u4f46\u662f\u4e86\u89e3\u539f\u5b50\u6307\u4ee4\u7ea7\u522b\u4e0a\u53d1\u751f\u7684\u4e8b\u60c5\u662f\u5f88\u91cd\u8981\u7684\u3002"),(0,a.kt)("p",null,"\u8ba9\u6211\u4eec\u9000\u540e\u4e00\u6b65\uff0c\u770b\u770b\u6307\u4ee4\u6570\u636e\u7684\u4f4d\u7f6e\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(4874).Z,width:"594",height:"417"})),(0,a.kt)("p",null,"\u4ea4\u6613\u53ef\u4ee5\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u6307\u4ee4\uff0c\u6bcf\u4e2a\u6307\u4ee4\u53ef\u4ee5\u6709\u6570\u636e\u3002"),(0,a.kt)("p",null,"\u5173\u4e8e\u6307\u4ee4\u6570\u636e\u7684\u91cd\u8981\u4e4b\u5904\u5728\u4e8e\u5176\u683c\u5f0f - \u5b83\u662f",(0,a.kt)("strong",{parentName:"p"},"8\u4f4d\u6570\u636e"),'\u3002 "\u4f4d" \u610f\u5473\u7740\u5b83\u662f\u673a\u5668\u7801\uff1a1\u548c0\u30028\u53ea\u662f\u6307\u5927\u5c0f\uff0c\u5c31\u50cf32\u4f4d\u621664\u4f4d\u4e00\u6837\u3002\u5982\u679c\u60a8\u7684\u6307\u4ee4\u6570\u636e\u4e0d\u7b26\u5408\u8fd9\u4e2a\u683c\u5f0f\uff0cSolana\u8fd0\u884c\u65f6\u5c06\u65e0\u6cd5\u8bc6\u522b\u5b83\u3002'),(0,a.kt)("p",null,"\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48Solana\u5982\u6b64\u5feb\u901f\uff01\u5b83\u4e0d\u662f\u8ba9\u7f51\u7edc\u8f6c\u6362\u4f60\u7684\u6570\u636e\uff0c\u800c\u662f\u4f60\u63d0\u4f9b\u5df2\u7ecf\u8f6c\u6362\u597d\u7684\u6570\u636e\uff0c\u7136\u540e\u7f51\u7edc\u53ea\u9700\u5904\u7406\u5b83\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u5982\u679c\u4f60\u5728\u5f00\u59cb\u70f9\u996a\u4e4b\u524d\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\u6240\u6709\u83dc\u80b4\u7684\u98df\u6750\uff0c\u4f60\u5c06\u80fd\u591f\u66f4\u5feb\u5730\u70f9\u996a\uff0c\u56e0\u4e3a\u4f60\u4e0d\u9700\u8981\u5207\u5272\u98df\u6750\u3002"),(0,a.kt)("p",null,"\u4f60\u4e0d\u9700\u8981\u77e5\u9053\u673a\u5668\u7801\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002\u4f60\u53ea\u9700\u8981\u8bb0\u4f4f\u6307\u4ee4\u6570\u636e\u662f\u67d0\u79cd\u7c7b\u578b\u7684\uff0c\u5f53\u4f60\u60f3\u8981\u5c06\u6570\u636e\u5305\u542b\u5728\u6307\u4ee4\u4e2d\u65f6\uff0c\u4f60\u9700\u8981\u5c06\u4f60\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u8be5\u7c7b\u578b\u3002"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"\u8fd9\u6bb5\u8bdd\u5728\u89e3\u91ca Solana \u7f51\u7edc\u5982\u4f55\u5904\u7406\u4e8b\u52a1\u548c\u6307\u4ee4\u6570\u636e\u7684\u3002\u5728 Solana \u4e2d\uff0c\u4e00\u4e2a\u4e8b\u52a1\u53ef\u4ee5\u5305\u542b\u4e00\u6761\u6216\u591a\u6761\u6307\u4ee4\uff0c\u6bcf\u6761\u6307\u4ee4\u90fd\u53ef\u4ee5\u643a\u5e26\u4e00\u4e9b\u6570\u636e\u3002"),(0,a.kt)("p",{parentName:"blockquote"},"\u91cd\u70b9\u662f\uff0c\u8fd9\u4e9b\u6307\u4ee4\u6570\u636e\u9700\u8981\u4ee5\u7279\u5b9a\u683c\u5f0f\u63d0\u4f9b\uff0c\u5373 8 \u4f4d\u6570\u636e\u3002\u8fd9\u91cc\u7684 \u201c8\u4f4d\u201d \u4e0d\u662f\u6307\u6570\u636e\u7684\u5927\u5c0f\uff0c\u800c\u662f\u6307\u6570\u636e\u7684\u683c\u5f0f\uff0c\u8fd9\u79cd\u683c\u5f0f\u662f\u673a\u5668\u4ee3\u7801\u683c\u5f0f\uff0c\u7528 1 \u548c 0 \u8868\u793a\u3002\u5982\u679c\u4f60\u63d0\u4f9b\u7684\u6307\u4ee4\u6570\u636e\u4e0d\u662f\u8fd9\u79cd\u683c\u5f0f\uff0cSolana \u8fd0\u884c\u65f6\u5c31\u65e0\u6cd5\u8bc6\u522b\u548c\u5904\u7406\u5b83\u3002"),(0,a.kt)("p",{parentName:"blockquote"},"\u8fd9\u79cd\u5904\u7406\u65b9\u5f0f\u662f Solana \u80fd\u591f\u9ad8\u901f\u8fd0\u884c\u7684\u4e00\u4e2a\u539f\u56e0\u3002\u4f60\u4e0d\u9700\u8981\u8ba9\u7f51\u7edc\u8f6c\u6362\u4f60\u7684\u6570\u636e\uff0c\u800c\u662f\u81ea\u5df1\u8f6c\u6362\u6570\u636e\u5e76\u63d0\u4f9b\u7ed9\u7f51\u7edc\uff0c\u7f51\u7edc\u53ea\u8d1f\u8d23\u5904\u7406\u5b83\u3002\u8fd9\u5c31\u50cf\u5728\u5f00\u59cb\u70f9\u996a\u524d\u5c31\u51c6\u5907\u597d\u6240\u6709\u98df\u6750\uff0c\u8fd9\u6837\u4f60\u5c31\u80fd\u66f4\u5feb\u5730\u70f9\u996a\uff0c\u56e0\u4e3a\u4f60\u4e0d\u9700\u8981\u5728\u70f9\u996a\u8fc7\u7a0b\u4e2d\u53bb\u5207\u4e1c\u897f\u3002"),(0,a.kt)("p",{parentName:"blockquote"},"\u4f5c\u8005\u5f3a\u8c03\u7684\u662f\uff0c\u4f60\u5e76\u4e0d\u9700\u8981\u4e86\u89e3\u673a\u5668\u4ee3\u7801\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002\u4f60\u9700\u8981\u8bb0\u4f4f\u7684\u662f\uff0c\u5f53\u4f60\u60f3\u8981\u5728\u6307\u4ee4\u4e2d\u5305\u542b\u4e00\u4e9b\u6570\u636e\u65f6\uff0c\u8fd9\u4e9b\u6570\u636e\u9700\u8981\u662f\u7279\u5b9a\u7c7b\u578b\u7684\uff0c\u4f60\u9700\u8981\u628a\u4f60\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u8fd9\u79cd\u7c7b\u578b\u3002\u8fd9\u5c31\u610f\u5473\u7740\u5728\u4f60\u7f16\u5199\u548c\u63d0\u4ea4\u7ed9 Solana \u7f51\u7edc\u7684\u4ee3\u7801\u4e2d\uff0c\u4f60\u9700\u8981\u8d1f\u8d23\u628a\u4f60\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u9002\u5f53\u7684\u683c\u5f0f\u3002"),(0,a.kt)("p",{parentName:"blockquote"},"\u8fd9\u662f\u4f4e\u7ea7\u522b\u7f16\u7a0b\u7684\u4e00\u4e2a\u5e38\u89c1\u7279\u6027\u3002\u867d\u7136\u5f88\u591a\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\uff08\u6bd4\u5982 Python \u6216 JavaScript\uff09\u4f1a\u81ea\u52a8\u5904\u7406\u8fd9\u4e9b\u7c7b\u578b\u8f6c\u6362\uff0c\u4f46\u5728\u4f4e\u7ea7\u8bed\u8a00\uff08\u6bd4\u5982 Rust\uff0c\u8fd9\u4e5f\u662f Solana \u4e3b\u8981\u4f7f\u7528\u7684\u8bed\u8a00\uff09\u4e2d\uff0c\u4f60\u9700\u8981\u81ea\u5df1\u5904\u7406\u8fd9\u4e9b\u8f6c\u6362\u3002\u7136\u800c\uff0c\u6709\u4e9b\u5e93\uff0c\u5982 Anchor\uff0c\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5904\u7406\u8fd9\u4e9b\u8f6c\u6362\uff0c\u8ba9\u7f16\u7a0b\u66f4\u7b80\u5355\u3002")),(0,a.kt)("h2",{id:"-\u5e8f\u5217\u5316\u548cborsh"},"\ud83d\udd28 \u5e8f\u5217\u5316\u548cborsh"),(0,a.kt)("p",null,"\u8fd9\u5c31\u662f\u5e8f\u5217\u5316\u7684\u4f5c\u7528 - \u5b83\u662f\u5c06\u5e38\u89c4\u7684\u4ee3\u7801\u6216\u6570\u636e\u8f6c\u6362\u4e3a\u5b57\u8282\u6570\u7ec4\uff08\u673a\u5668\u4ee3\u7801\uff1a1\u548c0\uff09\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6211\u4eec\u7684\u9879\u76ee\u4e2d\u4f7f\u7528 ",(0,a.kt)("a",{parentName:"p",href:"https://borsh.io/"},"Borsh")," \u5e8f\u5217\u5316\u683c\u5f0f\uff0c\u56e0\u4e3a\u5b83\u6709\u4e00\u4e2a\u65b9\u4fbf\u6211\u4eec\u4f7f\u7528\u7684\u5e93\u3002"),(0,a.kt)("p",null,"\u8ba9\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u6765\u770b\u770b\u5b83\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u2014\u2014\u76ee\u6807\u662f\u88c5\u5907\u4e00\u4e2a\u94fe\u4e0a\u6e38\u620f\u7269\u54c1\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4e09\u4e2a\u6570\u636e"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"variant")," - \u6211\u4eec\u8981\u8c03\u7528\u7684\u547d\u4ee4\u7684\u540d\u79f0\uff08\u5373\u88c5\u5907\u6216\u5220\u9664\uff09"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"playerId")," - \u88c5\u5907\u8be5\u7269\u54c1\u7684\u73a9\u5bb6\u7684ID"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"itemId")," - \u6211\u4eec\u60f3\u8981\u88c5\u5907\u7684\u7269\u54c1")),(0,a.kt)("p",null,"\u5e8f\u5217\u5316\u6b64\u6570\u636e\u6709\u56db\u4e2a\u6b65\u9aa4\uff1a"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\u521b\u5efa\u6570\u636e\u6a21\u5f0f/\u6620\u5c04\uff0c\u4ee5\u786e\u5b9a\u6570\u636e\u7684\u9884\u671f\u7ed3\u6784"),(0,a.kt)("li",{parentName:"ol"},"\u4e3a\u6570\u636e\u5206\u914d\u4e00\u4e2a\u6bd4\u5b9e\u9645\u9700\u8981\u7684\u8981\u5927\u5f97\u591a\u7684\u7f13\u51b2\u533a"),(0,a.kt)("li",{parentName:"ol"},"\u5c06\u6211\u4eec\u7684\u6570\u636e\u8fdb\u884c\u7f16\u7801\u5e76\u6dfb\u52a0\u5230\u7f13\u51b2\u533a\u4e2d"),(0,a.kt)("li",{parentName:"ol"},"\u53bb\u6389\u7f13\u51b2\u533a\u672b\u5c3e\u7684\u989d\u5916\u7a7a\u683c")),(0,a.kt)("p",null,"\u4f5c\u4e3a\u7f51\u7edc\u5f00\u53d1\u4eba\u5458\uff0c\u6211\u4eec\u6c38\u8fdc\u4e0d\u9700\u8981\u5904\u7406\u8fd9\u6837\u7684\u4f4e\u7ea7\u5185\u5bb9\uff0c\u6240\u4ee5\u6211\u8fd9\u6837\u505a\u662f\u4e3a\u4e86\u8ba9\u5b83\u611f\u89c9\u4e0d\u90a3\u4e48\u62bd\u8c61\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(9289).Z,width:"658",height:"638"})),(0,a.kt)("p",null,"\u6211\u5e0c\u671b\u8fd9\u662f\u6709\u9053\u7406\u7684\uff0c\u54c8\u54c8\u3002\u8ba9\u6211\u4eec\u770b\u4e00\u4e9b\u4ee3\u7801\u4ee5\u4e86\u89e3\u5176\u5b9e\u9645\u60c5\u51b5\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import * as Borsh from "@project-serum/borsh"\n\nconst equipPlayerSchema = Borsh.struct([\n Borsh.u8("variant"),\n Borsh.u8("playerId"),\n Borsh.u8("itemId"),\n])\n')),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u4e3a\u88c5\u5907\u7269\u54c1\u6307\u4ee4\u521b\u5efa\u4e00\u4e2a\u6a21\u5f0f\u5f00\u59cb\u3002\u6211\u4eec\u6b63\u5728\u521b\u5efa\u4e00\u4e2a\u5305\u542b\u4e09\u4e2a\u6570\u636e\u7247\u6bb5\u7684borsh\u7ed3\u6784\uff0c\u5b83\u4eec\u90fd\u662f\u65e0\u7b26\u53f7\u6574\u6570\uff0c\u4f46\u5927\u5c0f\u4e0d\u540c - 8\u4f4d\u300116\u4f4d\u548c256\u4f4d\u3002"),(0,a.kt)("p",null,"\u7531\u4e8e\u6211\u4eec\u7684\u6570\u636e\u5c06\u53d8\u6210\u4e00\u957f\u4e32\u76841\u548c0\uff0c\u6211\u4eec\u9700\u8981\u77e5\u9053\u6bcf\u4e2a\u6570\u636e\u9879\u7684\u8d77\u59cb\u548c\u7ed3\u675f\u4f4d\u7f6e\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6211\u4eec\u7ed9\u6bcf\u4e2a\u9879\u5206\u914d\u4e00\u4e2a\u7279\u5b9a\u7684\u5927\u5c0f\u3002\u5f53\u7a0b\u5e8f\u9700\u8981\u8bfb\u53d6\u8fd9\u4e9b\u6570\u636e\u65f6\uff0c\u5b83\u5c06\u77e5\u9053 ",(0,a.kt)("inlineCode",{parentName:"p"},"variant")," \u7684\u7ed3\u675f\u4f4d\u7f6e\u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"playerId")," \u7684\u8d77\u59cb\u4f4d\u7f6e\u3002"),(0,a.kt)("p",null,"\u60f3\u8c61\u4e00\u4e0b\u8499\u7740\u773c\u775b\u8bd5\u56fe\u4ece\u94fe\u63a5\u4e0a\u5207\u9999\u80a0\u3002\u53ea\u6709\u77e5\u9053\u6bcf\u6839\u9999\u80a0\u7684\u957f\u5ea6\uff0c\u624d\u80fd\u5728\u6b63\u786e\u7684\u4f4d\u7f6e\u5207\u3002"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(3836).Z,width:"520",height:"300"})),(0,a.kt)("p",null,"\u5728\u6211\u4eec\u7684\u4f8b\u5b50\u4e2d\uff0c\u7b2c\u4e8c\u6839\u548c\u7b2c\u4e09\u6839\u9999\u80a0\u4f1a\u957f\u5f88\u591a\uff0c\u4f46\u6211\u60f3\u4f60\u660e\u767d\u4e86\uff0c\u54c8\u54c8\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'import * as Borsh from "@project-serum/borsh"\n\nconst equipPlayerSchema = Borsh.struct([\n Borsh.u8("variant"),\n Borsh.u8("playerId"),\n Borsh.u8("itemId"),\n])\n\nconst buffer = Buffer.alloc(1000)\nequipPlayerSchems.encode({ variant: 2, playerId: 1435, itemId: 737498}, buffer)\n\nconst instructBuffer = buffer.slice(0, equipPlayerSchems.getSpan(buffer))\n')),(0,a.kt)("p",null,"\u8fd9\u91cc\u53d1\u751f\u7b2c\u4e8c\u6b65\u3001\u7b2c\u4e09\u6b65\u548c\u7b2c\u56db\u6b65\u3002\u6211\u4eec\u521b\u5efa\u4e00\u4e2a 1000 \u5b57\u8282\u957f\u7684\u7f13\u51b2\u533a\u3002\u6211\u4eec\u5bf9\u6570\u636e\u8fdb\u884c\u7f16\u7801\u5e76\u5c06\u5176\u6dfb\u52a0\u5230\u7f13\u51b2\u533a\u4e2d\u3002\u7136\u540e\u6211\u4eec\u5c06\u672b\u7aef\u5207\u6210\u8584\u7247\uff0c\u4f7f\u5176\u957f\u5ea6\u8fbe\u5230\u9700\u8981\u7684\u957f\u5ea6\u3002"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'const endpoint = clusterApiUrl("devnet")\nconst connection = new Connection(endpoint)\n\nconst transaction = new Transaction().add({\n key: [\n {\n pubkey: player.Publickey,\n isSigner: true,\n isWritable: false,\n },\n {\n pubkey: playerInfoAccount,\n isSigner: false,\n isWritable: true,\n },\n {\n pubkey: SystemProgram.programId,\n isSigner: false,\n isWritable: false,\n },\n ],\n data: instructBuffer,\n programId: PROGRAM_ID,\n})\n\nsendAndConfirmTransaction(connection, transaction, [player])\n')),(0,a.kt)("p",null,"\u4e00\u65e6\u6211\u4eec\u6709\u4e86\u6b63\u786e\u683c\u5f0f\u7684\u6570\u636e\uff0c\u5269\u4e0b\u7684\u5c31\u662f\u5c0f\u83dc\u4e00\u789f\uff01\u8fd9\u4e2a\u4ea4\u6613\u5e94\u8be5\u770b\u8d77\u6765\u5f88\u719f\u6089\u3002\u552f\u4e00\u7684\u201c\u65b0\u201d\u4e1c\u897f\u5c31\u662f\u6211\u4eec\u4ee5\u524d\u6ca1\u6709\u7684\u53ef\u9009\u9879 ",(0,a.kt)("inlineCode",{parentName:"p"},"data")," \u3002"),(0,a.kt)("p",null,"\u6211\u5728\u8fd9\u91cc\u5bf9\u4f60\u7684\u77e5\u8bc6\u505a\u4e86\u4e00\u4e9b\u5047\u8bbe - \u4f60\u5927\u81f4\u4e86\u89e3\u673a\u5668\u7801\u662f\u4ec0\u4e48\uff0c\u4ee5\u53ca\u5185\u5b58\u5206\u914d\u5982\u4f55\u53d1\u6325\u4f5c\u7528\u3002\u4f60\u4e0d\u9700\u8981\u4e86\u89e3\u6240\u6709\u8fd9\u4e9b\u4e1c\u897f\uff0c\u6211\u81ea\u5df1\u4e5f\u4e0d\u9700\u8981\u3002\u53ea\u9700\u5728YouTube\u4e0a\u89c2\u770b\u4e00\u4e24\u4e2a\u89c6\u9891\uff0c\u76f4\u5230\u4f60\u5bf9\u6b63\u5728\u53d1\u751f\u7684\u4e8b\u60c5\u6709\u4e00\u4e2a\u5927\u81f4\u7684\u611f\u89c9\u5373\u53ef\u3002"),(0,a.kt)("p",null,"\u73b0\u4ee3\u5f00\u53d1\u4eba\u5458\u5f88\u5c11\u7ecf\u5e38\u5904\u7406\u5b57\u8282\u7f13\u51b2\u533a - \u8fd9\u88ab\u8ba4\u4e3a\u662f\u4f4e\u7ea7\u522b\u7684\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u5bf9\u6b64\u611f\u5230\u964c\u751f\u6216\u65b0\u5947\uff0c\u4e0d\u7528\u62c5\u5fc3\u3002\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u4f7f\u7528\u5b83\u6784\u5efa\uff0c\u8fd9\u6837\u4f60\u5c31\u53ef\u4ee5\u79f0\u81ea\u5df1\u4e3a\u8f6f\u4ef6\u5de5\u7a0b\u5e08\u4e86 \ud83d\ude0e"))}m.isMDXComponent=!0},7915:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_1-488a66e2929336a828195f5701f9ab94.png"},4874:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_2-a4c99080d257f6d8cff5e66b9eb93c74.png"},9289:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_3-e21a9380d242c77b52206d375c7d662c.png"},3836:(e,n,t)=>{t.d(n,{Z:()=>r});const r=t.p+"assets/images/upload_4-8d932bb31a0cb8a748116cc79ee63fb9.png"}}]); \ No newline at end of file diff --git a/assets/js/af2b610d.12c89066.js b/assets/js/af2b610d.d11228d6.js similarity index 51% rename from assets/js/af2b610d.12c89066.js rename to assets/js/af2b610d.d11228d6.js index 88e563c22..b5beda33f 100644 --- a/assets/js/af2b610d.12c89066.js +++ b/assets/js/af2b610d.d11228d6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7729],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),p=c(r),m=o,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return r?n.createElement(f,i(i({ref:t},s),{},{components:r})):n.createElement(f,i({ref:t},s))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var u={};for(var l in t)hasOwnProperty.call(t,l)&&(u[l]=t[l]);u.originalType=e,u[p]="string"==typeof e?e:o,i[1]=u;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>u,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const a={sidebar_position:51,sidebar_label:"Rust\u7b80\u4ecb",sidebar_class_name:"green"},i="Rust\u7b80\u4ecb",u={unversionedId:"Solana-Co-Learn/module3/introduction-to-rust/README",id:"Solana-Co-Learn/module3/introduction-to-rust/README",title:"Rust\u7b80\u4ecb",description:"- \ud83c\udfac \u4e0eGage\u4e00\u8d77\u8fdb\u884c\u8282\u76ee\u5f00\u53d1",source:"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/README.md",sourceDirName:"Solana-Co-Learn/module3/introduction-to-rust",slug:"/Solana-Co-Learn/module3/introduction-to-rust/",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/introduction-to-rust/README.md",tags:[],version:"current",sidebarPosition:51,frontMatter:{sidebar_position:51,sidebar_label:"Rust\u7b80\u4ecb",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module3",permalink:"/docs/Solana-Co-Learn/module3/"},next:{title:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/"}},l={},c=[],s={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"rust\u7b80\u4ecb"},"Rust\u7b80\u4ecb"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\ud83c\udfac \u4e0eGage\u4e00\u8d77\u8fdb\u884c\u8282\u76ee\u5f00\u53d1"),(0,o.kt)("li",{parentName:"ul"},"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a"),(0,o.kt)("li",{parentName:"ul"},"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c"),(0,o.kt)("li",{parentName:"ul"},"\u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7729],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),c=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=c(r),m=o,f=p["".concat(u,".").concat(m)]||p[m]||d[m]||a;return r?n.createElement(f,i(i({ref:t},s),{},{components:r})):n.createElement(f,i({ref:t},s))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[p]="string"==typeof e?e:o,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const a={sidebar_position:51,sidebar_label:"Rust\u7b80\u4ecb",sidebar_class_name:"green"},i="Rust\u7b80\u4ecb",l={unversionedId:"Solana-Co-Learn/module3/introduction-to-rust/README",id:"Solana-Co-Learn/module3/introduction-to-rust/README",title:"Rust\u7b80\u4ecb",description:"- \ud83c\udfac \u4e0eGage\u4e00\u8d77\u8fdb\u884c\u8282\u76ee\u5f00\u53d1",source:"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/README.md",sourceDirName:"Solana-Co-Learn/module3/introduction-to-rust",slug:"/Solana-Co-Learn/module3/introduction-to-rust/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/introduction-to-rust/README.md",tags:[],version:"current",sidebarPosition:51,frontMatter:{sidebar_position:51,sidebar_label:"Rust\u7b80\u4ecb",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module3",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/"},next:{title:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/"}},u={},c=[],s={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"rust\u7b80\u4ecb"},"Rust\u7b80\u4ecb"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\ud83c\udfac \u4e0eGage\u4e00\u8d77\u8fdb\u884c\u8282\u76ee\u5f00\u53d1"),(0,o.kt)("li",{parentName:"ul"},"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a"),(0,o.kt)("li",{parentName:"ul"},"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c"),(0,o.kt)("li",{parentName:"ul"},"\u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b270f348.c94b504f.js b/assets/js/b270f348.c94b504f.js new file mode 100644 index 000000000..e6023710e --- /dev/null +++ b/assets/js/b270f348.c94b504f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4666],{115:e=>{e.exports=JSON.parse('{"permalink":"/all-in-one-solana/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b2b675dd.fd8b9d2a.js b/assets/js/b2b675dd.fd8b9d2a.js deleted file mode 100644 index acdab912a..000000000 --- a/assets/js/b2b675dd.fd8b9d2a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[533],{8017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b2f554cd.ababda67.js b/assets/js/b2f554cd.ababda67.js deleted file mode 100644 index 7e27ae77d..000000000 --- a/assets/js/b2f554cd.ababda67.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1477],{10:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"first-blog-post","metadata":{"permalink":"/blog/first-blog-post","editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/blog/2023-07-06.md","source":"@site/blog/2023-07-06.md","title":"All in One Blockchain First Blog","description":"Welcome to our first blog post at All in One Blockchain! We\'re thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we\'ll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.","date":"2023-07-06T00:00:00.000Z","formattedDate":"July 6, 2023","tags":[{"label":"blog","permalink":"/blog/tags/blog"},{"label":"blockchain","permalink":"/blog/tags/blockchain"},{"label":"solana","permalink":"/blog/tags/solana"},{"label":"IBC","permalink":"/blog/tags/ibc"}],"readingTime":1.995,"hasTruncateMarker":false,"authors":[{"name":"Davirain","title":"Davirain Blog","url":"https://github.com/DaviRain-Su","imageURL":"https://github.com/DaviRain-Su.png","key":"davirain"}],"frontMatter":{"slug":"first-blog-post","title":"All in One Blockchain First Blog","authors":["davirain"],"tags":["blog","blockchain","solana","IBC"]}},"content":"Welcome to our first blog post at All in One Blockchain! We\'re thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we\'ll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.\\n\\n## Understanding Blockchain\\n\\nBlockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.\\n\\n## Spotlight on Solana\\n\\nSolana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It\'s known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).\\n\\nOne of Solana\'s key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network\'s overall efficiency.\\n\\nSolana\'s architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.\\n\\n## Inter-Blockchain Communication (IBC) Protocol\\n\\nThe Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It\'s a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.\\n\\nIBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.\\n\\n## The Future of Blockchain\\n\\nThe world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we\'ll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.\\n\\nJoin us on this journey as we unravel the complexities of blockchain technology. Whether you\'re a seasoned developer, a crypto enthusiast, or a curious newcomer, there\'s always something new to learn in the dynamic world of blockchain.\\n\\nStay tuned for more insightful content, and don\'t hesitate to reach out if you have any questions or topics you\'d like us to cover. Welcome aboard!"}]}')}}]); \ No newline at end of file diff --git a/assets/js/b6baa538.4b5eb211.js b/assets/js/b6baa538.4b5eb211.js new file mode 100644 index 000000000..efae9a8e7 --- /dev/null +++ b/assets/js/b6baa538.4b5eb211.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7919],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),s=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},c=function(e){var n=s(e.components);return a.createElement(p.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=s(t),d=r,k=u["".concat(p,".").concat(d)]||u[d]||m[d]||l;return t?a.createElement(k,o(o({ref:n},c),{},{components:t})):a.createElement(k,o({ref:n},c))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,o=new Array(l);o[0]=d;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[u]="string"==typeof e?e:r,o[1]=i;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:14,sidebar_label:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",sidebar_class_name:"green"},o="\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",i={unversionedId:"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README",id:"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README",title:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",description:"\u662f\u65f6\u5019\u6bd5\u4e1a\u4e86\u5e7c\u513f\u56ed\u3002\u6211\u4eec\u5bf9\u9605\u8bfb\u4e86\u5982\u6307\u638c - \u4f60\u53ea\u9700\u5bf9JSON RPC\u7aef\u70b9\u8fdb\u884cAPI\u8c03\u7528\u3002\u8ba9\u6211\u4eec\u6765\u5199\u5165\u533a\u5757\u94fe\u5427\uff01",source:"@site/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README.md",sourceDirName:"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain",slug:"/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README.md",tags:[],version:"current",sidebarPosition:14,frontMatter:{sidebar_position:14,sidebar_label:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/"},next:{title:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/"}},p={},s=[{value:"\ud83d\udd10 \u5bc6\u94a5\u5bf9",id:"-\u5bc6\u94a5\u5bf9",level:2},{value:"\ud83d\ude86 \u521b\u5efa\u5e76\u53d1\u9001\u4e00\u7b14\u4ea4\u6613",id:"-\u521b\u5efa\u5e76\u53d1\u9001\u4e00\u7b14\u4ea4\u6613",level:2},{value:"\u270d \u6307\u4ee4",id:"-\u6307\u4ee4",level:2},{value:"\u26fd \u4ea4\u6613\u8d39\u7528",id:"-\u4ea4\u6613\u8d39\u7528",level:2}],c={toc:s},u="wrapper";function m(e){let{components:n,...t}=e;return(0,r.kt)(u,(0,a.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe"},"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe"),(0,r.kt)("p",null,"\u662f\u65f6\u5019\u6bd5\u4e1a\u4e86\u5e7c\u513f\u56ed\u3002\u6211\u4eec\u5bf9\u9605\u8bfb\u4e86\u5982\u6307\u638c - \u4f60\u53ea\u9700\u5bf9JSON RPC\u7aef\u70b9\u8fdb\u884cAPI\u8c03\u7528\u3002\u8ba9\u6211\u4eec\u6765\u5199\u5165\u533a\u5757\u94fe\u5427\uff01"),(0,r.kt)("h2",{id:"-\u5bc6\u94a5\u5bf9"},"\ud83d\udd10 \u5bc6\u94a5\u5bf9"),(0,r.kt)("p",null,"\u8981\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe\uff0c\u9700\u8981\u63d0\u4ea4\u4ea4\u6613\u3002\u53ef\u4ee5\u5c06\u5176\u89c6\u4e3a\u6570\u636e\u5199\u5165\u547d\u4ee4\uff0c\u5982\u679c\u4e0d\u6ee1\u8db3\u67d0\u4e9b\u6761\u4ef6\uff0c\u5219\u53ef\u4ee5\u62d2\u7edd\u8be5\u547d\u4ee4\u3002"),(0,r.kt)("p",null,"\u4e3a\u4e86\u7406\u89e3\u4ea4\u6613\u53ca\u5176\u5de5\u4f5c\u539f\u7406\uff0c\u60a8\u9700\u8981\u77e5\u9053\u4ec0\u4e48\u662f\u5bc6\u94a5\u5bf9\u3002\u987e\u540d\u601d\u4e49\uff0c\u8fd9\u662f\u4e00\u5bf9\u5bc6\u94a5 - \u4e00\u4e2a\u662f\u516c\u5171\u7684\uff0c\u53e6\u4e00\u4e2a\u662f\u79c1\u6709\u7684\u3002\u516c\u94a5\u6307\u5411\u7f51\u7edc\u4e0a\u5e10\u6237\u7684\u5730\u5740\uff0c\u6bcf\u4e2a\u516c\u94a5\u90fd\u6709\u4e00\u4e2a\u76f8\u5e94\u7684\u79c1\u94a5/\u79d8\u5bc6\u5bc6\u94a5\u3002"),(0,r.kt)("p",null,"Web3.js \u5e93\u6709\u51e0\u4e2a\u7528\u4e8e\u5904\u7406\u5bc6\u94a5\u5bf9\u7684\u8f85\u52a9\u51fd\u6570\u3002\u60a8\u53ef\u4ee5\u751f\u6210\u5bc6\u94a5\u5bf9\u5e76\u4f7f\u7528\u5b83\u4eec\u6765\u83b7\u53d6\u516c\u94a5\u6216\u79c1\u94a5\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"// Create a new keypair\nconst ownerKeypair = Keypair.generate()\n\n// Get the public key (address)\nconst publicKey = ownerKeypair.publicKey\n\n// Get the secret key\nconst secretKey = ownerKeypair.secretKey\n")),(0,r.kt)("p",null,"\u5bc6\u94a5\u53ef\u4ee5\u6709\u51e0\u79cd\u4e0d\u540c\u7684\u683c\u5f0f"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u52a9\u8bb0\u8bcd\u2014\u2014\u8fd9\u662f\u6700\u5e38\u89c1\u7684")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pill tomorrow foster begin walnut borrow virtual kick shift mutual shoe scatter\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"bs58 \u5b57\u7b26\u4e32 - \u94b1\u5305\u6709\u65f6\u4f1a\u5bfc\u51fa\u8be5\u5b57\u7b26\u4e32")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"5MaiiCavjCmn9Hs1o3eznqDEhRwxo7pXiAYez7keQUviUkauRiTMD8DrESdrNjN8zd9mTmVhRvBJeg5vhyvgrAhG\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"Bytes")," - \u7f16\u5199\u4ee3\u7801\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u539f\u59cb\u5b57\u8282\u4f5c\u4e3a\u6570\u5b57\u6570\u7ec4\u5904\u7406")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"[ 174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56, 222, 53, 138, 189, 224, 216, 117,173, 10, 149, 53, 45, 73, 251, 237, 246, 15, 185, 186, 82, 177, 240, 148, 69, 241, 227, 167, 80, 141, 89, 240, 121, 121, 35, 172, 247, 68, 251, 226, 218, 48, 63, 176, 109, 168, 89, 238, 135, ]\n")),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u5df2\u7ecf\u6709\u60f3\u8981\u4f7f\u7528\u7684\u5bc6\u94a5\u5bf9\uff0c\u5219\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"Keypair.fromSecretKey()")," \u51fd\u6570\u4ece\u5bc6\u94a5\u521b\u5efa ",(0,r.kt)("inlineCode",{parentName:"p"},"Keypair")," \u5bf9\u8c61\u3002"),(0,r.kt)("p",null,"\u5f53\u6d89\u53ca\u5230\u4e3b\u7f51\u65f6\uff0c\u60a8\u5c06\u9762\u4e34\u771f\u5b9e\u7684\u91d1\u94b1\u548c\u771f\u5b9e\u7684\u540e\u679c\u3002\u82b1\u65f6\u95f4\u7814\u7a76\u7ba1\u7406\u79d8\u5bc6\u7684\u5404\u79cd\u65b9\u6cd5\u662f\u503c\u5f97\u7684\u3002\u60a8\u53ef\u80fd\u4e0d\u60f3\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},".env")," \u53d8\u91cf\u6ce8\u5165\u5bc6\u94a5\u3002\u8fd9\u91cc\u6709",(0,r.kt)("a",{parentName:"p",href:"https://security.stackexchange.com/questions/197784/is-it-unsafe-to-use-environmental-variables-for-secret-data?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u4e00\u7bc7\u5f88\u597d\u7684\u8bfb\u7269"),"\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'//private key as an array of bytes\nconst secret = JSON.parse(process.env.PRIVATE_KEY ?? "") as number[]\nconst secretKey = Uint8Array.from(secret)\nconst keypairFromSecretKey = Keypair.fromSecretKey(secretKey)\n')),(0,r.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u6240\u505a\u7684\u662f\u4ee5\u5b57\u8282\u683c\u5f0f\u83b7\u53d6\u79c1\u94a5\u5e76\u5c06\u5176\u89e3\u6790\u4e3a\u6570\u5b57\u6570\u7ec4\uff0c\u7136\u540e\u5c06\u5176\u8f6c\u6362\u4e3a uint \u6570\u7ec4\u3002\u6211\u4eec\u4f7f\u7528\u8fd9\u4e2a uint \u6570\u7ec4\u6765\u521b\u5efa\u5bc6\u94a5\u5bf9\u3002",(0,r.kt)("strong",{parentName:"p"},"\u60a8\u4e0d\u9700\u8981\u77e5\u9053\u5b83\u662f\u5982\u4f55\u5de5\u4f5c\u7684"),"\uff0c\u4f46\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://solanacookbook.com/references/keypairs-and-wallets.html"},"\u6b64\u5904"),"\u548c",(0,r.kt)("a",{parentName:"p",href:"https://mattmazur.com/2021/11/19/splitting-a-solana-keypair-into-a-public-and-private-keys/"},"\u6b64\u5904"),"\u9605\u8bfb\u66f4\u591a\u76f8\u5173\u4fe1\u606f\u3002"),(0,r.kt)("p",null,"\u597d\u5427\u3002\u73b0\u5728\u60a8\u5bf9 Solana \u5bc6\u94a5\u5bf9\u7684\u4e86\u89e3\u6bd4 98% \u7684 Solana \u5f00\u53d1\u4eba\u5458\u8fd8\u8981\u591a \ud83d\udd76\ufe0f"),(0,r.kt)("p",null,"\u56de\u5230\u4ea4\u6613\u57ce\u3002"),(0,r.kt)("p",null,"\u6240\u6709\u5bf9Solana\u7f51\u7edc\u4e0a\u7684\u6570\u636e\u7684\u4fee\u6539\u90fd\u662f\u901a\u8fc7\u4ea4\u6613\u8fdb\u884c\u7684\u3002\u6240\u6709\u4ea4\u6613\u90fd\u4e0e\u7f51\u7edc\u4e0a\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92 - \u8fd9\u4e9b\u7a0b\u5e8f\u53ef\u4ee5\u662f\u7cfb\u7edf\u7a0b\u5e8f\u6216\u7528\u6237\u6784\u5efa\u7684\u7a0b\u5e8f\u3002\u4ea4\u6613\u544a\u8bc9\u7a0b\u5e8f\u5b83\u4eec\u60f3\u8981\u901a\u8fc7\u4e00\u7cfb\u5217\u6307\u4ee4\u505a\u4ec0\u4e48\uff0c\u5982\u679c\u5b83\u4eec\u662f\u6709\u6548\u7684\uff0c\u7a0b\u5e8f\u5c31\u4f1a\u6267\u884c\u8fd9\u4e9b\u64cd\u4f5c\uff01"),(0,r.kt)("p",null,"\u8fd9\u4e9b\u6307\u793a\u770b\u8d77\u6765\u50cf\u4ec0\u4e48\u9b3c\u4e1c\u897f\uff1f\u5b83\u4eec\u5305\u62ec\uff1a"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u60a8\u6253\u7b97\u8c03\u7528\u7684\u7a0b\u5e8f\u7684\u6807\u8bc6\u7b26"),(0,r.kt)("li",{parentName:"ol"},"\u5c06\u8981\u8bfb\u53d6\u548c/\u6216\u5199\u5165\u7684\u8d26\u6237\u6570\u7ec4"),(0,r.kt)("li",{parentName:"ol"},"\u4ee5\u5b57\u8282\u6570\u7ec4\u5f62\u5f0f\u7ed3\u6784\u5316\u7684\u6570\u636e\uff0c\u6839\u636e\u88ab\u8c03\u7528\u7684\u7a0b\u5e8f\u8fdb\u884c\u6307\u5b9a")),(0,r.kt)("p",null,"\u5982\u679c\u8fd9\u611f\u89c9\u5f88\u591a\uff0c\u522b\u62c5\u5fc3\uff0c\u968f\u7740\u6211\u4eec\u5f00\u59cb\uff0c\u4e00\u5207\u90fd\u4f1a\u660e\u6717\u8d77\u6765\u7684\uff01"),(0,r.kt)("h2",{id:"-\u521b\u5efa\u5e76\u53d1\u9001\u4e00\u7b14\u4ea4\u6613"},"\ud83d\ude86 \u521b\u5efa\u5e76\u53d1\u9001\u4e00\u7b14\u4ea4\u6613"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u8fdb\u884c\u4e00\u7b14\u4ea4\u6613\u3002\u6211\u4eec\u5c06\u8c03\u7528\u7cfb\u7edf\u7a0b\u5e8f\u6765\u8f6c\u79fb\u4e00\u4e9bSOL\u3002\u7531\u4e8e\u6211\u4eec\u6b63\u5728\u4e0e\u7cfb\u7edf\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\uff0c",(0,r.kt)("inlineCode",{parentName:"p"},"web3.js"),"\u5e93\u4e2d\u6709\u4e00\u4e9b\u8f85\u52a9\u51fd\u6570\uff0c\u4f7f\u8fd9\u53d8\u5f97\u975e\u5e38\u7b80\u5355\uff01"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const transaction = new Transaction()\n\nconst sendSolInstruction = SystemProgram.transfer({\n fromPubkey: sender,\n toPubkey: recipient,\n lamports: LAMPORTS_PER_SOL * amount\n})\n\ntransaction.add(sendSolInstruction)\n")),(0,r.kt)("p",null,"\u8fd9\u5c31\u662f\u521b\u5efa\u8f6c\u8d26\u4ea4\u6613\u6240\u9700\u7684\u5168\u90e8\uff01\u60a8\u53ef\u4ee5\u5411\u4e00\u7b14\u4ea4\u6613\u6dfb\u52a0\u591a\u6761\u6307\u4ee4\uff0c\u5b83\u4eec\u5c06\u6309\u987a\u5e8f\u6267\u884c\u3002\u6211\u4eec\u7a0d\u540e\u4f1a\u5c1d\u8bd5\u8fd9\u4e2a\ud83d\ude08"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"web3.js")," \u5e93\u8fd8\u63d0\u4f9b\u4e86\u53d1\u9001\u4ea4\u6613\u7684\u529f\u80fd\u3002\u4ee5\u4e0b\u662f\u6211\u4eec\u53d1\u9001\u4ea4\u6613\u7684\u65b9\u5f0f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const signature = sendAndConfirmTransaction(\n connection,\n transaction,\n [senderKeypair]\n)\n")),(0,r.kt)("p",null,"\u4f60\u5728\u8fd9\u91cc\u4e86\u89e3\u4e00\u5207 - \u8fde\u63a5\u662f\u6211\u4eec\u901a\u8fc7 JSON RPC \u4e0e\u7f51\u7edc\u8fdb\u884c\u901a\u4fe1\u7684\u65b9\u5f0f\u3002\u4ea4\u6613\u662f\u6211\u4eec\u521a\u521a\u4f7f\u7528\u8f6c\u8d26\u6307\u4ee4\u521b\u5efa\u7684\u4e8b\u52a1\u3002\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u662f\u7b7e\u540d\u8005\u7684\u6570\u7ec4\u3002\u8fd9\u4e9b\u662f\u201c\u7b7e\u7f72\u201d\u4e8b\u52a1\u7684\u5bc6\u94a5\u5bf9\uff0c\u4ee5\u4fbf Solana \u8fd0\u884c\u65f6\u548c\u4f60\u53d1\u9001\u4e8b\u52a1\u7684\u7a0b\u5e8f\u77e5\u9053\u8c01\u6388\u6743\u4e86\u8be5\u4e8b\u52a1\u3002\u67d0\u4e9b\u4ea4\u6613\u9700\u8981\u591a\u65b9\u7b7e\u540d\uff0c\u6240\u4ee5\u8fd9\u91cc\u4e0d\u603b\u662f\u4e00\u4e2a\u5730\u5740\u3002"),(0,r.kt)("p",null,"\u7b7e\u540d\u662f\u5fc5\u8981\u7684\uff0c\u8fd9\u6837\u6211\u4eec\u624d\u80fd\u8fdb\u884c\u6388\u6743\u7684\u66f4\u6539\u3002\u7531\u4e8e\u6b64\u4ea4\u6613\u5c06SOL\u4ece\u4e00\u4e2a\u8d26\u6237\u8f6c\u79fb\u5230\u53e6\u4e00\u4e2a\u8d26\u6237\uff0c\u6211\u4eec\u9700\u8981\u8bc1\u660e\u6211\u4eec\u63a7\u5236\u7740\u8981\u53d1\u9001\u7684\u8d26\u6237\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u5df2\u7ecf\u4e86\u89e3\u4e86\u6240\u6709\u5173\u4e8e\u4ea4\u6613\u7684\u5185\u5bb9\uff0c\u4ee5\u53ca\u6211\u63d0\u5230\u7684\u201c\u6761\u4ef6\u201d\u662f\u4ec0\u4e48 :)"),(0,r.kt)("h2",{id:"-\u6307\u4ee4"},"\u270d \u6307\u4ee4"),(0,r.kt)("p",null,"\u6211\u4eec\u5728\u4e0a\u6b21\u7684\u4ea4\u6613\u4e2d\u6709\u70b9\u8d70\u6377\u5f84\u3002\u5f53\u4e0e\u975e\u672c\u5730\u7a0b\u5e8f\u6216\u4e0d\u5728web3\u5e93\u4e2d\u6784\u5efa\u7684\u7a0b\u5e8f\u4e00\u8d77\u5de5\u4f5c\u65f6\uff0c\u6211\u4eec\u9700\u8981\u975e\u5e38\u660e\u786e\u6211\u4eec\u6240\u521b\u5efa\u7684\u6307\u4ee4\u3002\u8fd9\u662f\u6211\u4eec\u9700\u8981\u4f20\u9012\u7ed9\u6784\u9020\u51fd\u6570\u4ee5\u521b\u5efa\u6307\u4ee4\u7684\u7c7b\u578b\u3002\u770b\u4e00\u4e0b\u5427"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"export type TransactionInstructionCtorFields = {\n keys: Array;\n programId: PublicKey;\n data?: Buffer;\n};\n")),(0,r.kt)("p",null,"\u672c\u8d28\u4e0a\uff0c\u6307\u4ee4\u5305\u542b\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"AccountMeta")," \u7c7b\u578b\u7684\u952e\u6570\u7ec4"),(0,r.kt)("li",{parentName:"ul"},"\u60a8\u8c03\u7528\u7684\u7a0b\u5e8f\u7684\u516c\u94a5/\u5730\u5740"),(0,r.kt)("li",{parentName:"ul"},"\u53ef\u9009 - \u5305\u542b\u8981\u4f20\u9012\u7ed9\u7a0b\u5e8f\u7684\u6570\u636e\u7684 ",(0,r.kt)("inlineCode",{parentName:"li"},"Buffer"))),(0,r.kt)("p",null,"\u4ece",(0,r.kt)("inlineCode",{parentName:"p"},"Keys"),"\u5f00\u59cb-\u8be5\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5bf9\u8c61\u4ee3\u8868\u4e00\u4e2a\u5c06\u5728\u4e8b\u52a1\u6267\u884c\u671f\u95f4\u8bfb\u53d6\u6216\u5199\u5165\u7684\u5e10\u6237\u3002\u8fd9\u6837\u8282\u70b9\u5c31\u77e5\u9053\u54ea\u4e9b\u8d26\u6237\u5c06\u53c2\u4e0e\u4ea4\u6613\uff0c\u4ece\u800c\u52a0\u5feb\u901f\u5ea6\uff01\u8fd9\u610f\u5473\u7740\u60a8\u9700\u8981\u4e86\u89e3\u6b63\u5728\u8c03\u7528\u7684\u7a0b\u5e8f\u7684\u884c\u4e3a\uff0c\u5e76\u786e\u4fdd\u63d0\u4f9b\u6570\u7ec4\u4e2d\u6240\u6709\u5fc5\u8981\u7684\u5e10\u6237\u3002"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"Keys"),"\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5bf9\u8c61\u5fc5\u987b\u5305\u542b\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"pubkey")," - \u8d26\u6237\u7684\u516c\u94a5"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"isSigner")," - \u4e00\u4e2a\u5e03\u5c14\u503c\uff0c\u8868\u793a\u8be5\u5e10\u6237\u662f\u5426\u662f\u4ea4\u6613\u7684\u7b7e\u540d\u8005"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"isWritable")," - \u4e00\u4e2a\u5e03\u5c14\u503c\uff0c\u8868\u793a\u5728\u4ea4\u6613\u6267\u884c\u671f\u95f4\u662f\u5426\u5199\u5165\u5e10\u6237")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"programId")," \u5b57\u6bb5\u662f\u76f8\u5f53\u4e0d\u8a00\u81ea\u660e\u7684\uff1a\u5b83\u662f\u4e0e\u60a8\u60f3\u8981\u4ea4\u4e92\u7684\u7a0b\u5e8f\u5173\u8054\u7684\u516c\u94a5\u3002\u5f97\u77e5\u60a8\u60f3\u8981\u4e0e\u8c01\u4ea4\u8c08\uff01"),(0,r.kt)("p",null,"\u6211\u4eec\u6682\u65f6\u4e0d\u4f1a\u8003\u8651\u6570\u636e\u5b57\u6bb5\uff0c\u5c06\u6765\u4f1a\u91cd\u65b0\u5ba1\u89c6\u5b83\u3002"),(0,r.kt)("p",null,"\u4e0b\u9762\u662f\u5b9e\u9645\u64cd\u4f5c\u4e2d\u7684\u793a\u4f8b\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"async function callProgram(\n connection: web3.Connection,\n payer: web3.Keypair,\n programId: web3.PublicKey,\n programDataAccount: web3.PublicKey\n) {\n const instruction = new web3.TransactionInstruction({\n // We only have one key here\n keys: [\n {\n pubkey: programDataAccount,\n isSigner: false,\n isWritable: true\n },\n ],\n\n // The program we're interacting with\n programId\n\n // We don't have any data here!\n })\n\n const sig = await web3.sendAndConfirmTransaction(\n connection,\n new web3.Transaction().add(instruction),\n [payer]\n )\n}\n")),(0,r.kt)("p",null,"\u6ca1\u90a3\u4e48\u96be\uff01\u6211\u4eec\u5f97\u5230\u4e86\u8fd9\u4e2a\uff1aP"),(0,r.kt)("h2",{id:"-\u4ea4\u6613\u8d39\u7528"},"\u26fd \u4ea4\u6613\u8d39\u7528"),(0,r.kt)("p",null,"\u552f\u4e00\u6211\u4eec\u8fd8\u6ca1\u6709\u8ba8\u8bba\u7684\u4e8b\u60c5\uff1a\u8d39\u7528\u3002Solana\u7684\u8d39\u7528\u975e\u5e38\u4f4e\uff0c\u4f60\u53ef\u4ee5\u5ffd\u7565\u5b83\u4eec\uff01\u53ef\u60dc\u4f5c\u4e3a\u5f00\u53d1\u8005\uff0c\u6211\u4eec\u5fc5\u987b\u5173\u6ce8\u5b83\u4eec\u54c8\u54c8\u3002Solana\u7684\u8d39\u7528\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u4ee5\u592a\u574a\u7b49EVM\u94fe\u3002\u6bcf\u6b21\u4f60\u63d0\u4ea4\u4e00\u7b14\u4ea4\u6613\uff0c\u7f51\u7edc\u4e0a\u7684\u67d0\u4e2a\u4eba\u63d0\u4f9b\u7a7a\u95f4\u548c\u5904\u7406\u80fd\u529b\u6765\u5b9e\u73b0\u5b83\u3002\u8d39\u7528\u6fc0\u52b1\u4eba\u4eec\u63d0\u4f9b\u8fd9\u4e9b\u7a7a\u95f4\u548c\u5904\u7406\u80fd\u529b\u3002"),(0,r.kt)("p",null,"\u9700\u8981\u6ce8\u610f\u7684\u4e3b\u8981\u4e8b\u9879\u662f\uff0c\u5728\u4ea4\u6613\u7684\u7b7e\u540d\u8005\u6570\u7ec4\u4e2d\uff0c\u7b2c\u4e00\u4e2a\u7b7e\u540d\u8005\u59cb\u7ec8\u8d1f\u8d23\u652f\u4ed8\u4ea4\u6613\u8d39\u7528\u3002\u5982\u679c\u4f60\u6ca1\u6709\u8db3\u591f\u7684SOL\u4f1a\u600e\u4e48\u6837\uff1f\u4ea4\u6613\u5c06\u88ab\u53d6\u6d88\uff01"),(0,r.kt)("p",null,"\u5f53\u4f60\u5728devnet\u6216\u672c\u5730\u4e3b\u673a\u4e0a\u65f6\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528CLI\u4e2d\u7684 solana airdrop \u6765\u83b7\u53d6devnet SOL\u3002\u4f60\u8fd8\u53ef\u4ee5\u4f7f\u7528",(0,r.kt)("a",{parentName:"p",href:"https://spl-token-faucet.com/"},"SPL\u4ee3\u5e01\u6c34\u9f99\u5934"),"\u6765\u83b7\u53d6SPL\u4ee3\u5e01\uff08\u6211\u4eec\u7a0d\u540e\u4f1a\u4e86\u89e3\u8fd9\u4e9b\u662f\u4ec0\u4e48:P\uff09\u3002"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b6baa538.9b03abba.js b/assets/js/b6baa538.9b03abba.js deleted file mode 100644 index 9765c8007..000000000 --- a/assets/js/b6baa538.9b03abba.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7919],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),s=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},c=function(e){var n=s(e.components);return a.createElement(p.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=s(t),d=r,k=u["".concat(p,".").concat(d)]||u[d]||m[d]||l;return t?a.createElement(k,o(o({ref:n},c),{},{components:t})):a.createElement(k,o({ref:n},c))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,o=new Array(l);o[0]=d;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i[u]="string"==typeof e?e:r,o[1]=i;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:14,sidebar_label:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",sidebar_class_name:"green"},o="\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",i={unversionedId:"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README",id:"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README",title:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",description:"\u662f\u65f6\u5019\u6bd5\u4e1a\u4e86\u5e7c\u513f\u56ed\u3002\u6211\u4eec\u5bf9\u9605\u8bfb\u4e86\u5982\u6307\u638c - \u4f60\u53ea\u9700\u5bf9JSON RPC\u7aef\u70b9\u8fdb\u884cAPI\u8c03\u7528\u3002\u8ba9\u6211\u4eec\u6765\u5199\u5165\u533a\u5757\u94fe\u5427\uff01",source:"@site/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README.md",sourceDirName:"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain",slug:"/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README.md",tags:[],version:"current",sidebarPosition:14,frontMatter:{sidebar_position:14,sidebar_label:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/"},next:{title:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/"}},p={},s=[{value:"\ud83d\udd10 \u5bc6\u94a5\u5bf9",id:"-\u5bc6\u94a5\u5bf9",level:2},{value:"\ud83d\ude86 \u521b\u5efa\u5e76\u53d1\u9001\u4e00\u7b14\u4ea4\u6613",id:"-\u521b\u5efa\u5e76\u53d1\u9001\u4e00\u7b14\u4ea4\u6613",level:2},{value:"\u270d \u6307\u4ee4",id:"-\u6307\u4ee4",level:2},{value:"\u26fd \u4ea4\u6613\u8d39\u7528",id:"-\u4ea4\u6613\u8d39\u7528",level:2}],c={toc:s},u="wrapper";function m(e){let{components:n,...t}=e;return(0,r.kt)(u,(0,a.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe"},"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe"),(0,r.kt)("p",null,"\u662f\u65f6\u5019\u6bd5\u4e1a\u4e86\u5e7c\u513f\u56ed\u3002\u6211\u4eec\u5bf9\u9605\u8bfb\u4e86\u5982\u6307\u638c - \u4f60\u53ea\u9700\u5bf9JSON RPC\u7aef\u70b9\u8fdb\u884cAPI\u8c03\u7528\u3002\u8ba9\u6211\u4eec\u6765\u5199\u5165\u533a\u5757\u94fe\u5427\uff01"),(0,r.kt)("h2",{id:"-\u5bc6\u94a5\u5bf9"},"\ud83d\udd10 \u5bc6\u94a5\u5bf9"),(0,r.kt)("p",null,"\u8981\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe\uff0c\u9700\u8981\u63d0\u4ea4\u4ea4\u6613\u3002\u53ef\u4ee5\u5c06\u5176\u89c6\u4e3a\u6570\u636e\u5199\u5165\u547d\u4ee4\uff0c\u5982\u679c\u4e0d\u6ee1\u8db3\u67d0\u4e9b\u6761\u4ef6\uff0c\u5219\u53ef\u4ee5\u62d2\u7edd\u8be5\u547d\u4ee4\u3002"),(0,r.kt)("p",null,"\u4e3a\u4e86\u7406\u89e3\u4ea4\u6613\u53ca\u5176\u5de5\u4f5c\u539f\u7406\uff0c\u60a8\u9700\u8981\u77e5\u9053\u4ec0\u4e48\u662f\u5bc6\u94a5\u5bf9\u3002\u987e\u540d\u601d\u4e49\uff0c\u8fd9\u662f\u4e00\u5bf9\u5bc6\u94a5 - \u4e00\u4e2a\u662f\u516c\u5171\u7684\uff0c\u53e6\u4e00\u4e2a\u662f\u79c1\u6709\u7684\u3002\u516c\u94a5\u6307\u5411\u7f51\u7edc\u4e0a\u5e10\u6237\u7684\u5730\u5740\uff0c\u6bcf\u4e2a\u516c\u94a5\u90fd\u6709\u4e00\u4e2a\u76f8\u5e94\u7684\u79c1\u94a5/\u79d8\u5bc6\u5bc6\u94a5\u3002"),(0,r.kt)("p",null,"Web3.js \u5e93\u6709\u51e0\u4e2a\u7528\u4e8e\u5904\u7406\u5bc6\u94a5\u5bf9\u7684\u8f85\u52a9\u51fd\u6570\u3002\u60a8\u53ef\u4ee5\u751f\u6210\u5bc6\u94a5\u5bf9\u5e76\u4f7f\u7528\u5b83\u4eec\u6765\u83b7\u53d6\u516c\u94a5\u6216\u79c1\u94a5\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"// Create a new keypair\nconst ownerKeypair = Keypair.generate()\n\n// Get the public key (address)\nconst publicKey = ownerKeypair.publicKey\n\n// Get the secret key\nconst secretKey = ownerKeypair.secretKey\n")),(0,r.kt)("p",null,"\u5bc6\u94a5\u53ef\u4ee5\u6709\u51e0\u79cd\u4e0d\u540c\u7684\u683c\u5f0f"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u52a9\u8bb0\u8bcd\u2014\u2014\u8fd9\u662f\u6700\u5e38\u89c1\u7684")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"pill tomorrow foster begin walnut borrow virtual kick shift mutual shoe scatter\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"bs58 \u5b57\u7b26\u4e32 - \u94b1\u5305\u6709\u65f6\u4f1a\u5bfc\u51fa\u8be5\u5b57\u7b26\u4e32")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"5MaiiCavjCmn9Hs1o3eznqDEhRwxo7pXiAYez7keQUviUkauRiTMD8DrESdrNjN8zd9mTmVhRvBJeg5vhyvgrAhG\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"Bytes")," - \u7f16\u5199\u4ee3\u7801\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u539f\u59cb\u5b57\u8282\u4f5c\u4e3a\u6570\u5b57\u6570\u7ec4\u5904\u7406")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"[ 174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56, 222, 53, 138, 189, 224, 216, 117,173, 10, 149, 53, 45, 73, 251, 237, 246, 15, 185, 186, 82, 177, 240, 148, 69, 241, 227, 167, 80, 141, 89, 240, 121, 121, 35, 172, 247, 68, 251, 226, 218, 48, 63, 176, 109, 168, 89, 238, 135, ]\n")),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u5df2\u7ecf\u6709\u60f3\u8981\u4f7f\u7528\u7684\u5bc6\u94a5\u5bf9\uff0c\u5219\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"Keypair.fromSecretKey()")," \u51fd\u6570\u4ece\u5bc6\u94a5\u521b\u5efa ",(0,r.kt)("inlineCode",{parentName:"p"},"Keypair")," \u5bf9\u8c61\u3002"),(0,r.kt)("p",null,"\u5f53\u6d89\u53ca\u5230\u4e3b\u7f51\u65f6\uff0c\u60a8\u5c06\u9762\u4e34\u771f\u5b9e\u7684\u91d1\u94b1\u548c\u771f\u5b9e\u7684\u540e\u679c\u3002\u82b1\u65f6\u95f4\u7814\u7a76\u7ba1\u7406\u79d8\u5bc6\u7684\u5404\u79cd\u65b9\u6cd5\u662f\u503c\u5f97\u7684\u3002\u60a8\u53ef\u80fd\u4e0d\u60f3\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},".env")," \u53d8\u91cf\u6ce8\u5165\u5bc6\u94a5\u3002\u8fd9\u91cc\u6709",(0,r.kt)("a",{parentName:"p",href:"https://security.stackexchange.com/questions/197784/is-it-unsafe-to-use-environmental-variables-for-secret-data?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u4e00\u7bc7\u5f88\u597d\u7684\u8bfb\u7269"),"\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'//private key as an array of bytes\nconst secret = JSON.parse(process.env.PRIVATE_KEY ?? "") as number[]\nconst secretKey = Uint8Array.from(secret)\nconst keypairFromSecretKey = Keypair.fromSecretKey(secretKey)\n')),(0,r.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u6240\u505a\u7684\u662f\u4ee5\u5b57\u8282\u683c\u5f0f\u83b7\u53d6\u79c1\u94a5\u5e76\u5c06\u5176\u89e3\u6790\u4e3a\u6570\u5b57\u6570\u7ec4\uff0c\u7136\u540e\u5c06\u5176\u8f6c\u6362\u4e3a uint \u6570\u7ec4\u3002\u6211\u4eec\u4f7f\u7528\u8fd9\u4e2a uint \u6570\u7ec4\u6765\u521b\u5efa\u5bc6\u94a5\u5bf9\u3002",(0,r.kt)("strong",{parentName:"p"},"\u60a8\u4e0d\u9700\u8981\u77e5\u9053\u5b83\u662f\u5982\u4f55\u5de5\u4f5c\u7684"),"\uff0c\u4f46\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://solanacookbook.com/references/keypairs-and-wallets.html"},"\u6b64\u5904"),"\u548c",(0,r.kt)("a",{parentName:"p",href:"https://mattmazur.com/2021/11/19/splitting-a-solana-keypair-into-a-public-and-private-keys/"},"\u6b64\u5904"),"\u9605\u8bfb\u66f4\u591a\u76f8\u5173\u4fe1\u606f\u3002"),(0,r.kt)("p",null,"\u597d\u5427\u3002\u73b0\u5728\u60a8\u5bf9 Solana \u5bc6\u94a5\u5bf9\u7684\u4e86\u89e3\u6bd4 98% \u7684 Solana \u5f00\u53d1\u4eba\u5458\u8fd8\u8981\u591a \ud83d\udd76\ufe0f"),(0,r.kt)("p",null,"\u56de\u5230\u4ea4\u6613\u57ce\u3002"),(0,r.kt)("p",null,"\u6240\u6709\u5bf9Solana\u7f51\u7edc\u4e0a\u7684\u6570\u636e\u7684\u4fee\u6539\u90fd\u662f\u901a\u8fc7\u4ea4\u6613\u8fdb\u884c\u7684\u3002\u6240\u6709\u4ea4\u6613\u90fd\u4e0e\u7f51\u7edc\u4e0a\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92 - \u8fd9\u4e9b\u7a0b\u5e8f\u53ef\u4ee5\u662f\u7cfb\u7edf\u7a0b\u5e8f\u6216\u7528\u6237\u6784\u5efa\u7684\u7a0b\u5e8f\u3002\u4ea4\u6613\u544a\u8bc9\u7a0b\u5e8f\u5b83\u4eec\u60f3\u8981\u901a\u8fc7\u4e00\u7cfb\u5217\u6307\u4ee4\u505a\u4ec0\u4e48\uff0c\u5982\u679c\u5b83\u4eec\u662f\u6709\u6548\u7684\uff0c\u7a0b\u5e8f\u5c31\u4f1a\u6267\u884c\u8fd9\u4e9b\u64cd\u4f5c\uff01"),(0,r.kt)("p",null,"\u8fd9\u4e9b\u6307\u793a\u770b\u8d77\u6765\u50cf\u4ec0\u4e48\u9b3c\u4e1c\u897f\uff1f\u5b83\u4eec\u5305\u62ec\uff1a"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"\u60a8\u6253\u7b97\u8c03\u7528\u7684\u7a0b\u5e8f\u7684\u6807\u8bc6\u7b26"),(0,r.kt)("li",{parentName:"ol"},"\u5c06\u8981\u8bfb\u53d6\u548c/\u6216\u5199\u5165\u7684\u8d26\u6237\u6570\u7ec4"),(0,r.kt)("li",{parentName:"ol"},"\u4ee5\u5b57\u8282\u6570\u7ec4\u5f62\u5f0f\u7ed3\u6784\u5316\u7684\u6570\u636e\uff0c\u6839\u636e\u88ab\u8c03\u7528\u7684\u7a0b\u5e8f\u8fdb\u884c\u6307\u5b9a")),(0,r.kt)("p",null,"\u5982\u679c\u8fd9\u611f\u89c9\u5f88\u591a\uff0c\u522b\u62c5\u5fc3\uff0c\u968f\u7740\u6211\u4eec\u5f00\u59cb\uff0c\u4e00\u5207\u90fd\u4f1a\u660e\u6717\u8d77\u6765\u7684\uff01"),(0,r.kt)("h2",{id:"-\u521b\u5efa\u5e76\u53d1\u9001\u4e00\u7b14\u4ea4\u6613"},"\ud83d\ude86 \u521b\u5efa\u5e76\u53d1\u9001\u4e00\u7b14\u4ea4\u6613"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u8fdb\u884c\u4e00\u7b14\u4ea4\u6613\u3002\u6211\u4eec\u5c06\u8c03\u7528\u7cfb\u7edf\u7a0b\u5e8f\u6765\u8f6c\u79fb\u4e00\u4e9bSOL\u3002\u7531\u4e8e\u6211\u4eec\u6b63\u5728\u4e0e\u7cfb\u7edf\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\uff0c",(0,r.kt)("inlineCode",{parentName:"p"},"web3.js"),"\u5e93\u4e2d\u6709\u4e00\u4e9b\u8f85\u52a9\u51fd\u6570\uff0c\u4f7f\u8fd9\u53d8\u5f97\u975e\u5e38\u7b80\u5355\uff01"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const transaction = new Transaction()\n\nconst sendSolInstruction = SystemProgram.transfer({\n fromPubkey: sender,\n toPubkey: recipient,\n lamports: LAMPORTS_PER_SOL * amount\n})\n\ntransaction.add(sendSolInstruction)\n")),(0,r.kt)("p",null,"\u8fd9\u5c31\u662f\u521b\u5efa\u8f6c\u8d26\u4ea4\u6613\u6240\u9700\u7684\u5168\u90e8\uff01\u60a8\u53ef\u4ee5\u5411\u4e00\u7b14\u4ea4\u6613\u6dfb\u52a0\u591a\u6761\u6307\u4ee4\uff0c\u5b83\u4eec\u5c06\u6309\u987a\u5e8f\u6267\u884c\u3002\u6211\u4eec\u7a0d\u540e\u4f1a\u5c1d\u8bd5\u8fd9\u4e2a\ud83d\ude08"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"web3.js")," \u5e93\u8fd8\u63d0\u4f9b\u4e86\u53d1\u9001\u4ea4\u6613\u7684\u529f\u80fd\u3002\u4ee5\u4e0b\u662f\u6211\u4eec\u53d1\u9001\u4ea4\u6613\u7684\u65b9\u5f0f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const signature = sendAndConfirmTransaction(\n connection,\n transaction,\n [senderKeypair]\n)\n")),(0,r.kt)("p",null,"\u4f60\u5728\u8fd9\u91cc\u4e86\u89e3\u4e00\u5207 - \u8fde\u63a5\u662f\u6211\u4eec\u901a\u8fc7 JSON RPC \u4e0e\u7f51\u7edc\u8fdb\u884c\u901a\u4fe1\u7684\u65b9\u5f0f\u3002\u4ea4\u6613\u662f\u6211\u4eec\u521a\u521a\u4f7f\u7528\u8f6c\u8d26\u6307\u4ee4\u521b\u5efa\u7684\u4e8b\u52a1\u3002\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u662f\u7b7e\u540d\u8005\u7684\u6570\u7ec4\u3002\u8fd9\u4e9b\u662f\u201c\u7b7e\u7f72\u201d\u4e8b\u52a1\u7684\u5bc6\u94a5\u5bf9\uff0c\u4ee5\u4fbf Solana \u8fd0\u884c\u65f6\u548c\u4f60\u53d1\u9001\u4e8b\u52a1\u7684\u7a0b\u5e8f\u77e5\u9053\u8c01\u6388\u6743\u4e86\u8be5\u4e8b\u52a1\u3002\u67d0\u4e9b\u4ea4\u6613\u9700\u8981\u591a\u65b9\u7b7e\u540d\uff0c\u6240\u4ee5\u8fd9\u91cc\u4e0d\u603b\u662f\u4e00\u4e2a\u5730\u5740\u3002"),(0,r.kt)("p",null,"\u7b7e\u540d\u662f\u5fc5\u8981\u7684\uff0c\u8fd9\u6837\u6211\u4eec\u624d\u80fd\u8fdb\u884c\u6388\u6743\u7684\u66f4\u6539\u3002\u7531\u4e8e\u6b64\u4ea4\u6613\u5c06SOL\u4ece\u4e00\u4e2a\u8d26\u6237\u8f6c\u79fb\u5230\u53e6\u4e00\u4e2a\u8d26\u6237\uff0c\u6211\u4eec\u9700\u8981\u8bc1\u660e\u6211\u4eec\u63a7\u5236\u7740\u8981\u53d1\u9001\u7684\u8d26\u6237\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u5df2\u7ecf\u4e86\u89e3\u4e86\u6240\u6709\u5173\u4e8e\u4ea4\u6613\u7684\u5185\u5bb9\uff0c\u4ee5\u53ca\u6211\u63d0\u5230\u7684\u201c\u6761\u4ef6\u201d\u662f\u4ec0\u4e48 :)"),(0,r.kt)("h2",{id:"-\u6307\u4ee4"},"\u270d \u6307\u4ee4"),(0,r.kt)("p",null,"\u6211\u4eec\u5728\u4e0a\u6b21\u7684\u4ea4\u6613\u4e2d\u6709\u70b9\u8d70\u6377\u5f84\u3002\u5f53\u4e0e\u975e\u672c\u5730\u7a0b\u5e8f\u6216\u4e0d\u5728web3\u5e93\u4e2d\u6784\u5efa\u7684\u7a0b\u5e8f\u4e00\u8d77\u5de5\u4f5c\u65f6\uff0c\u6211\u4eec\u9700\u8981\u975e\u5e38\u660e\u786e\u6211\u4eec\u6240\u521b\u5efa\u7684\u6307\u4ee4\u3002\u8fd9\u662f\u6211\u4eec\u9700\u8981\u4f20\u9012\u7ed9\u6784\u9020\u51fd\u6570\u4ee5\u521b\u5efa\u6307\u4ee4\u7684\u7c7b\u578b\u3002\u770b\u4e00\u4e0b\u5427"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"export type TransactionInstructionCtorFields = {\n keys: Array;\n programId: PublicKey;\n data?: Buffer;\n};\n")),(0,r.kt)("p",null,"\u672c\u8d28\u4e0a\uff0c\u6307\u4ee4\u5305\u542b\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"AccountMeta")," \u7c7b\u578b\u7684\u952e\u6570\u7ec4"),(0,r.kt)("li",{parentName:"ul"},"\u60a8\u8c03\u7528\u7684\u7a0b\u5e8f\u7684\u516c\u94a5/\u5730\u5740"),(0,r.kt)("li",{parentName:"ul"},"\u53ef\u9009 - \u5305\u542b\u8981\u4f20\u9012\u7ed9\u7a0b\u5e8f\u7684\u6570\u636e\u7684 ",(0,r.kt)("inlineCode",{parentName:"li"},"Buffer"))),(0,r.kt)("p",null,"\u4ece",(0,r.kt)("inlineCode",{parentName:"p"},"Keys"),"\u5f00\u59cb-\u8be5\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5bf9\u8c61\u4ee3\u8868\u4e00\u4e2a\u5c06\u5728\u4e8b\u52a1\u6267\u884c\u671f\u95f4\u8bfb\u53d6\u6216\u5199\u5165\u7684\u5e10\u6237\u3002\u8fd9\u6837\u8282\u70b9\u5c31\u77e5\u9053\u54ea\u4e9b\u8d26\u6237\u5c06\u53c2\u4e0e\u4ea4\u6613\uff0c\u4ece\u800c\u52a0\u5feb\u901f\u5ea6\uff01\u8fd9\u610f\u5473\u7740\u60a8\u9700\u8981\u4e86\u89e3\u6b63\u5728\u8c03\u7528\u7684\u7a0b\u5e8f\u7684\u884c\u4e3a\uff0c\u5e76\u786e\u4fdd\u63d0\u4f9b\u6570\u7ec4\u4e2d\u6240\u6709\u5fc5\u8981\u7684\u5e10\u6237\u3002"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"Keys"),"\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5bf9\u8c61\u5fc5\u987b\u5305\u542b\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"pubkey")," - \u8d26\u6237\u7684\u516c\u94a5"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"isSigner")," - \u4e00\u4e2a\u5e03\u5c14\u503c\uff0c\u8868\u793a\u8be5\u5e10\u6237\u662f\u5426\u662f\u4ea4\u6613\u7684\u7b7e\u540d\u8005"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"isWritable")," - \u4e00\u4e2a\u5e03\u5c14\u503c\uff0c\u8868\u793a\u5728\u4ea4\u6613\u6267\u884c\u671f\u95f4\u662f\u5426\u5199\u5165\u5e10\u6237")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"programId")," \u5b57\u6bb5\u662f\u76f8\u5f53\u4e0d\u8a00\u81ea\u660e\u7684\uff1a\u5b83\u662f\u4e0e\u60a8\u60f3\u8981\u4ea4\u4e92\u7684\u7a0b\u5e8f\u5173\u8054\u7684\u516c\u94a5\u3002\u5f97\u77e5\u60a8\u60f3\u8981\u4e0e\u8c01\u4ea4\u8c08\uff01"),(0,r.kt)("p",null,"\u6211\u4eec\u6682\u65f6\u4e0d\u4f1a\u8003\u8651\u6570\u636e\u5b57\u6bb5\uff0c\u5c06\u6765\u4f1a\u91cd\u65b0\u5ba1\u89c6\u5b83\u3002"),(0,r.kt)("p",null,"\u4e0b\u9762\u662f\u5b9e\u9645\u64cd\u4f5c\u4e2d\u7684\u793a\u4f8b\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"async function callProgram(\n connection: web3.Connection,\n payer: web3.Keypair,\n programId: web3.PublicKey,\n programDataAccount: web3.PublicKey\n) {\n const instruction = new web3.TransactionInstruction({\n // We only have one key here\n keys: [\n {\n pubkey: programDataAccount,\n isSigner: false,\n isWritable: true\n },\n ],\n\n // The program we're interacting with\n programId\n\n // We don't have any data here!\n })\n\n const sig = await web3.sendAndConfirmTransaction(\n connection,\n new web3.Transaction().add(instruction),\n [payer]\n )\n}\n")),(0,r.kt)("p",null,"\u6ca1\u90a3\u4e48\u96be\uff01\u6211\u4eec\u5f97\u5230\u4e86\u8fd9\u4e2a\uff1aP"),(0,r.kt)("h2",{id:"-\u4ea4\u6613\u8d39\u7528"},"\u26fd \u4ea4\u6613\u8d39\u7528"),(0,r.kt)("p",null,"\u552f\u4e00\u6211\u4eec\u8fd8\u6ca1\u6709\u8ba8\u8bba\u7684\u4e8b\u60c5\uff1a\u8d39\u7528\u3002Solana\u7684\u8d39\u7528\u975e\u5e38\u4f4e\uff0c\u4f60\u53ef\u4ee5\u5ffd\u7565\u5b83\u4eec\uff01\u53ef\u60dc\u4f5c\u4e3a\u5f00\u53d1\u8005\uff0c\u6211\u4eec\u5fc5\u987b\u5173\u6ce8\u5b83\u4eec\u54c8\u54c8\u3002Solana\u7684\u8d39\u7528\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u4ee5\u592a\u574a\u7b49EVM\u94fe\u3002\u6bcf\u6b21\u4f60\u63d0\u4ea4\u4e00\u7b14\u4ea4\u6613\uff0c\u7f51\u7edc\u4e0a\u7684\u67d0\u4e2a\u4eba\u63d0\u4f9b\u7a7a\u95f4\u548c\u5904\u7406\u80fd\u529b\u6765\u5b9e\u73b0\u5b83\u3002\u8d39\u7528\u6fc0\u52b1\u4eba\u4eec\u63d0\u4f9b\u8fd9\u4e9b\u7a7a\u95f4\u548c\u5904\u7406\u80fd\u529b\u3002"),(0,r.kt)("p",null,"\u9700\u8981\u6ce8\u610f\u7684\u4e3b\u8981\u4e8b\u9879\u662f\uff0c\u5728\u4ea4\u6613\u7684\u7b7e\u540d\u8005\u6570\u7ec4\u4e2d\uff0c\u7b2c\u4e00\u4e2a\u7b7e\u540d\u8005\u59cb\u7ec8\u8d1f\u8d23\u652f\u4ed8\u4ea4\u6613\u8d39\u7528\u3002\u5982\u679c\u4f60\u6ca1\u6709\u8db3\u591f\u7684SOL\u4f1a\u600e\u4e48\u6837\uff1f\u4ea4\u6613\u5c06\u88ab\u53d6\u6d88\uff01"),(0,r.kt)("p",null,"\u5f53\u4f60\u5728devnet\u6216\u672c\u5730\u4e3b\u673a\u4e0a\u65f6\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528CLI\u4e2d\u7684 solana airdrop \u6765\u83b7\u53d6devnet SOL\u3002\u4f60\u8fd8\u53ef\u4ee5\u4f7f\u7528",(0,r.kt)("a",{parentName:"p",href:"https://spl-token-faucet.com/"},"SPL\u4ee3\u5e01\u6c34\u9f99\u5934"),"\u6765\u83b7\u53d6SPL\u4ee3\u5e01\uff08\u6211\u4eec\u7a0d\u540e\u4f1a\u4e86\u89e3\u8fd9\u4e9b\u662f\u4ec0\u4e48:P\uff09\u3002"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b7de6482.1ea8f352.js b/assets/js/b7de6482.1ea8f352.js new file mode 100644 index 000000000..bff0f8c9c --- /dev/null +++ b/assets/js/b7de6482.1ea8f352.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5846],{3905:(n,e,t)=>{t.d(e,{Zo:()=>p,kt:()=>d});var o=t(7294);function a(n,e,t){return e in n?Object.defineProperty(n,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[e]=t,n}function r(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),t.push.apply(t,o)}return t}function i(n){for(var e=1;e=0||(a[t]=n[t]);return a}(n,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(n);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(n,t)&&(a[t]=n[t])}return a}var c=o.createContext({}),s=function(n){var e=o.useContext(c),t=e;return n&&(t="function"==typeof n?n(e):i(i({},e),n)),t},p=function(n){var e=s(n.components);return o.createElement(c.Provider,{value:e},n.children)},u="mdxType",m={inlineCode:"code",wrapper:function(n){var e=n.children;return o.createElement(o.Fragment,{},e)}},k=o.forwardRef((function(n,e){var t=n.components,a=n.mdxType,r=n.originalType,c=n.parentName,p=l(n,["components","mdxType","originalType","parentName"]),u=s(t),k=a,d=u["".concat(c,".").concat(k)]||u[k]||m[k]||r;return t?o.createElement(d,i(i({ref:e},p),{},{components:t})):o.createElement(d,i({ref:e},p))}));function d(n,e){var t=arguments,a=e&&e.mdxType;if("string"==typeof n||a){var r=t.length,i=new Array(r);i[0]=k;var l={};for(var c in e)hasOwnProperty.call(e,c)&&(l[c]=e[c]);l.originalType=n,l[u]="string"==typeof n?n:a,i[1]=l;for(var s=2;s{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var o=t(7462),a=(t(7294),t(3905));const r={sidebar_position:29,sidebar_label:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",sidebar_class_name:"green"},i="\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",l={unversionedId:"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README",id:"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README",title:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",description:"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e0a\u4e00\u8282\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002\u8bf4\u4e86\u8fd9\u4e48\u591a\uff0c\u8ba9\u6211\u4eec\u6765\u521b\u9020\u4e00\u4e9b\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5427\u3002\u5728\u6211\u4eec\u7684\u6700\u7ec8\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u4ee3\u5e01\uff0c\u4f60\u5c06\u968f\u7740\u62b5\u62bc\u4f60\u7684\u793e\u533aNFT\u800c\u9010\u6e10\u83b7\u5f97\u5b83\u3002\u5728\u90a3\u4e4b\u524d\uff0c\u8ba9\u6211\u4eec\u5148\u73a9\u4e00\u4e0b\u5b9e\u9645\u6784\u5efa\u8fd9\u4e2a\u94f8\u5e01\u8fc7\u7a0b\u7684\u8fc7\u7a0b\u3002\u73b0\u5728\u662f\u53d1\u6325\u4f60\u7684\u60f3\u8c61\u529b\uff0c\u5c3d\u60c5\u4eab\u53d7\u7684\u597d\u65f6\u673a\u3002\u4e5f\u8bb8\u4f60\u4e00\u76f4\u60f3\u521b\u5efa\u81ea\u5df1\u7684\u6a21\u56e0\u5e01 - \u73b0\u5728\u662f\u4f60\u7684\u673a\u4f1a\u4e86 \ud83d\ude80",source:"@site/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token/mint-token-on-solana",slug:"/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README.md",tags:[],version:"current",sidebarPosition:29,frontMatter:{sidebar_position:29,sidebar_label:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcb5 The token Program",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/the-token-program/"},next:{title:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/token-metadata/"}},c={},s=[{value:"\ud83c\udf81 \u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668",id:"-\u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668",level:2}],p={toc:s},u="wrapper";function m(n){let{components:e,...r}=n;return(0,a.kt)(u,(0,o.Z)({},p,r,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u5728solana\u4e0a\u94f8\u9020\u4ee3\u5e01"},"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e0a\u4e00\u8282\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece",(0,a.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-token-client/tree/solution-without-burn"},"\u8fd9\u91cc"),"\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"solution-without-burn")," \u5206\u652f\u4e0a\uff09\u3002\u8bf4\u4e86\u8fd9\u4e48\u591a\uff0c\u8ba9\u6211\u4eec\u6765\u521b\u9020\u4e00\u4e9b\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5427\u3002\u5728\u6211\u4eec\u7684\u6700\u7ec8\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u4ee3\u5e01\uff0c\u4f60\u5c06\u968f\u7740\u62b5\u62bc\u4f60\u7684\u793e\u533aNFT\u800c\u9010\u6e10\u83b7\u5f97\u5b83\u3002\u5728\u90a3\u4e4b\u524d\uff0c\u8ba9\u6211\u4eec\u5148\u73a9\u4e00\u4e0b\u5b9e\u9645\u6784\u5efa\u8fd9\u4e2a\u94f8\u5e01\u8fc7\u7a0b\u7684\u8fc7\u7a0b\u3002\u73b0\u5728\u662f\u53d1\u6325\u4f60\u7684\u60f3\u8c61\u529b\uff0c\u5c3d\u60c5\u4eab\u53d7\u7684\u597d\u65f6\u673a\u3002\u4e5f\u8bb8\u4f60\u4e00\u76f4\u60f3\u521b\u5efa\u81ea\u5df1\u7684\u6a21\u56e0\u5e01 - \u73b0\u5728\u662f\u4f60\u7684\u673a\u4f1a\u4e86 \ud83d\ude80"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u4e00\u4e2a\u65b0\u7684Solana\u5ba2\u6237\u7aef\u5f00\u59cb\uff0c\u8f6c\u5230\u60a8\u7684Solana\u5de5\u4f5c\u533a\u5e76\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"npx create-solana-client [name] --initialize-keypair\ncd [name]\nnpm i\n")),(0,a.kt)("p",null,"\u4ee5\u4f60\u7684\u4ee3\u5e01\u6765\u547d\u540d\u4f60\u7684\u5ba2\u6237\u3002\u6211\u8981\u521b\u5efa",(0,a.kt)("inlineCode",{parentName:"p"},"Pizzacoin"),"\uff0c\u56e0\u4e3a\u6211\u6628\u5929\u5403\u4e86\u4e00\u4e9b\u975e\u5e38\u597d\u5403\u7684\u62ab\u8428\u3002\u73b0\u5728\u662f\u4f60\u53d1\u6325\u521b\u610f\u7684\u65f6\u5019\u4e86\u3002\u4e5f\u8bb8\u4f60\u60f3\u5c06\u65f6\u95f4\u672c\u8eab\u8fdb\u884c\u4ee3\u5e01\u5316\uff1f\u4f60\u53ef\u4ee5\u521b\u5efa",(0,a.kt)("inlineCode",{parentName:"p"},"HokageCoin"),"\uff0c\u751a\u81f3\u662f",(0,a.kt)("inlineCode",{parentName:"p"},"TwitterThreadCoin"),"\u3002\u65e0\u9650\u7684\u53ef\u80fd\u6027\uff01"),(0,a.kt)("p",null," ",(0,a.kt)("inlineCode",{parentName:"p"},"--initialize-keypair")," \u6807\u5fd7\u4f4d\u5b8c\u6210\u4e86\u6211\u4eec\u4e0a\u6b21\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"initalizeKeypair")," \u8fdb\u884c\u7684\u6240\u6709\u9b54\u6cd5\u3002\u8fd0\u884c ",(0,a.kt)("inlineCode",{parentName:"p"},"npm run start")," \uff0c\u60a8\u5c06\u83b7\u5f97\u4e00\u5bf9\u65b0\u7684\u5bc6\u94a5\uff0c\u5e76\u83b7\u5f97\u4e00\u4e9bSOL\u7a7a\u6295\u3002\u8ba9\u6211\u4eec\u6253\u5f00\u8d27\u5e01\u6253\u5370\u673a\uff0c\u8ba9\u5b83\u55e1\u55e1\u4f5c\u54cd\u3002"),(0,a.kt)("p",null," ",(0,a.kt)("img",{src:t(1186).Z,width:"480",height:"480"})),(0,a.kt)("p",null," \u56fe\u7247\uff1a\u7f8e\u56fd\u8054\u90a6\u50a8\u5907\u94f6\u884c\u884c\u957f\u6770\u7f57\u59c6\xb7\u9c8d\u5a01\u5c14\u8ba9\u6253\u5370\u673a\u55e1\u55e1\u4f5c\u54cd\u3002"),(0,a.kt)("h2",{id:"-\u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668"},"\ud83c\udf81 \u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668"),(0,a.kt)("p",null," \u8bb0\u4f4f\u8fd9\u4e9b\u6b65\u9aa4\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("ol",{parentName:"li"},(0,a.kt)("li",{parentName:"ol"},"\u521b\u5efa\u4e00\u4e2a",(0,a.kt)("inlineCode",{parentName:"li"},"Token Mint"),"s\u8d26\u6237"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("ol",{parentName:"li",start:2},(0,a.kt)("li",{parentName:"ol"},"\u4e3a\u7279\u5b9a\u7684\u94b1\u5305\u521b\u5efa\u4e00\u4e2a\u5173\u8054\u7684token\u8d26\u6237"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("ol",{parentName:"li",start:3},(0,a.kt)("li",{parentName:"ol"},"\u5c06Mint\u4ee3\u5e01\u53d1\u9001\u5230\u8be5\u94b1\u5305\u4e2d")),(0,a.kt)("p",{parentName:"li"},"\u8fd9\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"src/index.ts")," \u4e2d\u7684\u7b2c\u4e00\u6b65\uff0c\u5728\u5bfc\u5165\u4e4b\u540e\u3001\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"main()")," \u4e4b\u524d\u653e\u7f6e\u8fd9\u4e2a"),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'// Add the spl-token import at the top\nimport * as token from "@solana/spl-token"\n\nasync function createNewMint(\n connection: web3.Connection,\n payer: web3.Keypair,\n mintAuthority: web3.PublicKey,\n freezeAuthority: web3.PublicKey,\n decimals: number\n): Promise {\n\n const tokenMint = await token.createMint(\n connection,\n payer,\n mintAuthority,\n freezeAuthority,\n decimals\n );\n\n console.log(`The token mint account address is ${tokenMint}`)\n console.log(\n `Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`\n );\n\n return tokenMint;\n}\n')))),(0,a.kt)("p",null,"\u8fd9\u5e94\u8be5\u770b\u8d77\u6765\u5f88\u719f\u6089\u3002\u5982\u679c\u4e0d\u662f\u7684\u8bdd\uff0c\u8bf7\u56de\u5230\u4e0a\u4e00\u8282\u518d\u8bfb\u4e00\u904d \ud83d\ude20"),(0,a.kt)("p",null,"\u518d\u6b21 - \u8fd9\u4e2a ",(0,a.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," \u7a0b\u5e8f\u4f7f\u5f97\u8fd9\u4e00\u5207\u53d8\u5f97\u7b80\u5355\u3002 ",(0,a.kt)("inlineCode",{parentName:"p"},"tokenMint")," \u662f",(0,a.kt)("inlineCode",{parentName:"p"},"TokenMint"),"\u8d26\u6237\u7684\u5730\u5740\u3002"),(0,a.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u521b\u5efa\u5173\u8054\u7684\u4ee4\u724c\u8d26\u6237\uff0c\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"createNewMint")," \u51fd\u6570\u4e4b\u540e\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"async function createTokenAccount(\n connection: web3.Connection,\n payer: web3.Keypair,\n mint: web3.PublicKey,\n owner: web3.PublicKey\n) {\n const tokenAccount = await token.getOrCreateAssociatedTokenAccount(\n connection,\n payer,\n mint,\n owner\n )\n\n console.log(\n `Token Account: https://explorer.solana.com/address/${tokenAccount.address}?cluster=devnet`\n )\n\n return tokenAccount\n}\n")),(0,a.kt)("p",null,"\u8fd9\u91cc\u6ca1\u6709\u4ec0\u4e48\u65b0\u9c9c\u4e8b\u3002\u9700\u8981\u6ce8\u610f\u7684\u4e00\u70b9\u662f\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"payer")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"owner")," \u53ef\u80fd\u662f\u4e0d\u540c\u7684 - \u4f60\u53ef\u4ee5\u4ed8\u8d39\u521b\u5efa\u67d0\u4eba\u7684\u8d26\u6237\u3002\u8fd9\u53ef\u80fd\u4f1a\u5f88\u6602\u8d35\uff0c\u56e0\u4e3a\u4f60\u5c06\u4e3a\u4ed6\u4eec\u7684\u8d26\u6237\u652f\u4ed8\u201c\u79df\u91d1\u201d\uff0c\u6240\u4ee5\u786e\u4fdd\u5728\u8fdb\u884c\u8fd9\u9879\u64cd\u4f5c\u4e4b\u524d\u5148\u505a\u597d\u8ba1\u7b97\u3002"),(0,a.kt)("p",null,"\u6700\u540e\uff0cmint function\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"async function mintTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n mint: web3.PublicKey,\n destination: web3.PublicKey,\n authority: web3.Keypair,\n amount: number\n) {\n const mintInfo = await token.getMint(connection, mint)\n\n const transactionSignature = await token.mintTo(\n connection,\n payer,\n mint,\n destination,\n authority,\n amount * 10 ** mintInfo.decimals\n )\n\n console.log(\n `Mint Token Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,a.kt)("p",null,"\u8ba9\u6211\u4eec\u5728\u4e3b\u51fd\u6570\u4e2d\u8c03\u7528\u8fd9\u4e9b\u51fd\u6570\uff0c\u8fd9\u662f\u6211\u5f97\u5230\u7684\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n console.log("PublicKey:", user.publicKey.toBase58())\n\n const mint = await createNewMint(\n connection,\n user, // We\'ll pay the fees\n user.publicKey, // We\'re the mint authority\n user.publicKey, // And the freeze authority >:)\n 2 // Only two decimals!\n )\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey // Associating our address with the token account\n )\n\n // Mint 100 tokens to our address\n await mintTokens(connection, user, mint, tokenAccount.address, user, 100)\n}\n')),(0,a.kt)("p",null,"\u8fd0\u884c ",(0,a.kt)("inlineCode",{parentName:"p"},"npm run start")," - \u4f60\u5e94\u8be5\u5728\u7ec8\u7aef\u4e2d\u770b\u5230\u4e09\u4e2a\u6d4f\u89c8\u5668\u94fe\u63a5\u88ab\u8bb0\u5f55\u4e0b\u6765\u3002\uff08\u6ce8\u610f\uff1a\u786e\u4fdd\u4f60\u5df2\u7ecf ",(0,a.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," \uff0c\u5426\u5219\u4f1a\u663e\u793a\u9519\u8bef\u3002\u8981\u5b89\u88c5\uff0c\u8bf7\u5728\u7ec8\u7aef\u4e2d\u8f93\u5165 ",(0,a.kt)("inlineCode",{parentName:"p"},"npm uninstall @solana/spl-token")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"npm install @solana/spl-token")," \u3002\u4fdd\u5b58\u4ee3\u5e01Mint\u8d26\u6237\u5730\u5740\uff0c\u7a0d\u540e\u4f1a\u7528\u5230\u3002\u6253\u5f00\u6700\u540e\u4e00\u4e2a\u94fe\u63a5\u5e76\u5411\u4e0b\u6eda\u52a8\u5230\u4ee3\u5e01\u4f59\u989d\u90e8\u5206\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(3880).Z,width:"1150",height:"202"})),(0,a.kt)("p",null,"\u4f60\u521a\u521a\u94f8\u9020\u4e86\u4e00\u4e9b\u4ee3\u5e01\uff01\u8fd9\u4e9b\u4ee3\u5e01\u53ef\u4ee5\u4ee3\u8868\u4f60\u60f3\u8981\u7684\u4efb\u4f55\u4e1c\u897f\u3002\u6bcf\u4e2a\u4ee3\u5e01\u4ef7\u503c100\u7f8e\u5143\uff1f100\u5206\u949f\u7684\u65f6\u95f4\uff1f100\u5f20\u732b\u54aa\u8868\u60c5\u5305\uff1f100\u724712\u82f1\u5bf8\u9ec4\u6cb9\u9e21\u8584\u5e95\u5939\u5fc3\u62ab\u8428\uff1f\u8fd9\u662f\u4f60\u7684\u73b0\u5b9e\u3002\u4f60\u662f\u552f\u4e00\u63a7\u5236\u94f8\u5e01\u8d26\u6237\u7684\u4eba\uff0c\u6240\u4ee5\u4ee3\u5e01\u4f9b\u5e94\u7684\u4ef7\u503c\u53d6\u51b3\u4e8e\u4f60\u7684\u51b3\u5b9a\uff0c\u53ef\u4ee5\u662f\u6beb\u65e0\u4ef7\u503c\u6216\u8005\u73cd\u8d35\u65e0\u6bd4\u3002"),(0,a.kt)("p",null,"\u5728\u4f60\u5f00\u59cb\u5728Solana\u533a\u5757\u94fe\u4e0a\u91cd\u65b0\u5b9a\u4e49\u73b0\u4ee3\u91d1\u878d\u4e4b\u524d\uff0c\u8ba9\u6211\u4eec\u6765\u770b\u770b\u5982\u4f55\u8f6c\u79fb\u548c\u9500\u6bc1\u4ee3\u5e01\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"async function transferTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n source: web3.PublicKey,\n destination: web3.PublicKey,\n owner: web3.PublicKey,\n amount: number,\n mint: web3.PublicKey\n) {\n const mintInfo = await token.getMint(connection, mint)\n\n const transactionSignature = await token.transfer(\n connection,\n payer,\n source,\n destination,\n owner,\n amount * 10 ** mintInfo.decimals\n )\n\n console.log(\n `Transfer Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n\nasync function burnTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n account: web3.PublicKey,\n mint: web3.PublicKey,\n owner: web3.Keypair,\n amount: number\n) {\n\n const mintInfo = await token.getMint(connection, mint)\n\n const transactionSignature = await token.burn(\n connection,\n payer,\n account,\n mint,\n owner,\n amount * 10 ** mintInfo.decimals\n )\n\n console.log(\n `Burn Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,a.kt)("p",null,"\u8fd9\u4e9b\u51fd\u6570\u770b\u8d77\u6765\u5f88\u957f\uff0c\u56e0\u4e3a\u6211\u7ed9\u6bcf\u4e2a\u53c2\u6570\u90fd\u5355\u72ec\u5360\u4e86\u4e00\u884c\uff0c\u5b9e\u9645\u4e0a\u5b83\u4eec\u53ea\u67093\u884c\u800c\u5df2\uff0c\u54c8\u54c8\u3002"),(0,a.kt)("p",null,"\u4f7f\u7528\u5b83\u4eec\u540c\u6837\u7b80\u5355\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"async function main() {\n ...\n\n const receiver = web3.Keypair.generate().publicKey\n\n const receiverTokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n receiver\n )\n\n await transferTokens(\n connection,\n user,\n tokenAccount.address,\n receiverTokenAccount.address,\n user.publicKey,\n 50,\n mint\n )\n\n await burnTokens(connection, user, tokenAccount.address, mint, user, 25)\n}\n")),(0,a.kt)("p",null,"\u73a9\u5f04\u8f6c\u8d26\u529f\u80fd\uff0c\u5411\u60a8\u7684\u94b1\u5305\u5730\u5740\u53d1\u9001\u4e00\u4e9b\u4ee3\u5e01\uff0c\u770b\u770b\u5b83\u662f\u4ec0\u4e48\u6837\u5b50\u3002\u8fd9\u662f\u6211\u770b\u5230\u7684\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(2728).Z,width:"359",height:"537"})),(0,a.kt)("p",null,"\u55ef...\u4e3a\u4ec0\u4e48\u663e\u793a\u672a\u77e5\uff1f\u8ba9\u6211\u4eec\u6765\u4fee\u590d\u4e00\u4e0b\uff01"))}m.isMDXComponent=!0},1186:(n,e,t)=>{t.d(e,{Z:()=>o});const o=t.p+"assets/images/giphy-bd8ccbd4d0915affa402473df4f7acdf.gif"},2728:(n,e,t)=>{t.d(e,{Z:()=>o});const o=t.p+"assets/images/mint-token-wallet-e3a55a700372cfe50e8e5c41e6ff4e68.png"},3880:(n,e,t)=>{t.d(e,{Z:()=>o});const o=t.p+"assets/images/mint-token-1be9f8110b98e83220c0df538fe27707.png"}}]); \ No newline at end of file diff --git a/assets/js/b7de6482.cae3afdc.js b/assets/js/b7de6482.cae3afdc.js deleted file mode 100644 index 4e00f2bfe..000000000 --- a/assets/js/b7de6482.cae3afdc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5846],{3905:(n,e,t)=>{t.d(e,{Zo:()=>p,kt:()=>d});var o=t(7294);function a(n,e,t){return e in n?Object.defineProperty(n,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[e]=t,n}function r(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),t.push.apply(t,o)}return t}function i(n){for(var e=1;e=0||(a[t]=n[t]);return a}(n,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(n);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(n,t)&&(a[t]=n[t])}return a}var c=o.createContext({}),s=function(n){var e=o.useContext(c),t=e;return n&&(t="function"==typeof n?n(e):i(i({},e),n)),t},p=function(n){var e=s(n.components);return o.createElement(c.Provider,{value:e},n.children)},u="mdxType",m={inlineCode:"code",wrapper:function(n){var e=n.children;return o.createElement(o.Fragment,{},e)}},k=o.forwardRef((function(n,e){var t=n.components,a=n.mdxType,r=n.originalType,c=n.parentName,p=l(n,["components","mdxType","originalType","parentName"]),u=s(t),k=a,d=u["".concat(c,".").concat(k)]||u[k]||m[k]||r;return t?o.createElement(d,i(i({ref:e},p),{},{components:t})):o.createElement(d,i({ref:e},p))}));function d(n,e){var t=arguments,a=e&&e.mdxType;if("string"==typeof n||a){var r=t.length,i=new Array(r);i[0]=k;var l={};for(var c in e)hasOwnProperty.call(e,c)&&(l[c]=e[c]);l.originalType=n,l[u]="string"==typeof n?n:a,i[1]=l;for(var s=2;s{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var o=t(7462),a=(t(7294),t(3905));const r={sidebar_position:29,sidebar_label:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",sidebar_class_name:"green"},i="\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",l={unversionedId:"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README",id:"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README",title:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",description:"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e0a\u4e00\u8282\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece\u8fd9\u91cc\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 solution-without-burn \u5206\u652f\u4e0a\uff09\u3002\u8bf4\u4e86\u8fd9\u4e48\u591a\uff0c\u8ba9\u6211\u4eec\u6765\u521b\u9020\u4e00\u4e9b\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5427\u3002\u5728\u6211\u4eec\u7684\u6700\u7ec8\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u4ee3\u5e01\uff0c\u4f60\u5c06\u968f\u7740\u62b5\u62bc\u4f60\u7684\u793e\u533aNFT\u800c\u9010\u6e10\u83b7\u5f97\u5b83\u3002\u5728\u90a3\u4e4b\u524d\uff0c\u8ba9\u6211\u4eec\u5148\u73a9\u4e00\u4e0b\u5b9e\u9645\u6784\u5efa\u8fd9\u4e2a\u94f8\u5e01\u8fc7\u7a0b\u7684\u8fc7\u7a0b\u3002\u73b0\u5728\u662f\u53d1\u6325\u4f60\u7684\u60f3\u8c61\u529b\uff0c\u5c3d\u60c5\u4eab\u53d7\u7684\u597d\u65f6\u673a\u3002\u4e5f\u8bb8\u4f60\u4e00\u76f4\u60f3\u521b\u5efa\u81ea\u5df1\u7684\u6a21\u56e0\u5e01 - \u73b0\u5728\u662f\u4f60\u7684\u673a\u4f1a\u4e86 \ud83d\ude80",source:"@site/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token/mint-token-on-solana",slug:"/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/",permalink:"/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README.md",tags:[],version:"current",sidebarPosition:29,frontMatter:{sidebar_position:29,sidebar_label:"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcb5 The token Program",permalink:"/docs/Solana-Co-Learn/module2/spl-token/the-token-program/"},next:{title:"\ud83e\uddee \u4ee4\u724c\u5143\u6570\u636e",permalink:"/docs/Solana-Co-Learn/module2/spl-token/token-metadata/"}},c={},s=[{value:"\ud83c\udf81 \u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668",id:"-\u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668",level:2}],p={toc:s},u="wrapper";function m(n){let{components:e,...r}=n;return(0,a.kt)(u,(0,o.Z)({},p,r,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u5728solana\u4e0a\u94f8\u9020\u4ee3\u5e01"},"\ud83c\udfe7 \u5728Solana\u4e0a\u94f8\u9020\u4ee3\u5e01"),(0,a.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u4ee3\u5e01\u4e0e\u5b83\u4eec\u7684\u521b\u9020\u8005\uff08\u4f60\uff09\u76f8\u9047\u4e86\u3002\u6211\u4eec\u5c06\u4ece\u4e0a\u4e00\u8282\u7684\u6784\u5efa\u90e8\u5206\u7ee7\u7eed\u8fdb\u884c\u3002\u5982\u679c\u9700\u8981\uff0c\u4f60\u53ef\u4ee5\u4ece",(0,a.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-token-client/tree/solution-without-burn"},"\u8fd9\u91cc"),"\u83b7\u53d6\u8d77\u59cb\u4ee3\u7801\uff08\u786e\u4fdd\u4f60\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"solution-without-burn")," \u5206\u652f\u4e0a\uff09\u3002\u8bf4\u4e86\u8fd9\u4e48\u591a\uff0c\u8ba9\u6211\u4eec\u6765\u521b\u9020\u4e00\u4e9b\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5427\u3002\u5728\u6211\u4eec\u7684\u6700\u7ec8\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u4ee3\u5e01\uff0c\u4f60\u5c06\u968f\u7740\u62b5\u62bc\u4f60\u7684\u793e\u533aNFT\u800c\u9010\u6e10\u83b7\u5f97\u5b83\u3002\u5728\u90a3\u4e4b\u524d\uff0c\u8ba9\u6211\u4eec\u5148\u73a9\u4e00\u4e0b\u5b9e\u9645\u6784\u5efa\u8fd9\u4e2a\u94f8\u5e01\u8fc7\u7a0b\u7684\u8fc7\u7a0b\u3002\u73b0\u5728\u662f\u53d1\u6325\u4f60\u7684\u60f3\u8c61\u529b\uff0c\u5c3d\u60c5\u4eab\u53d7\u7684\u597d\u65f6\u673a\u3002\u4e5f\u8bb8\u4f60\u4e00\u76f4\u60f3\u521b\u5efa\u81ea\u5df1\u7684\u6a21\u56e0\u5e01 - \u73b0\u5728\u662f\u4f60\u7684\u673a\u4f1a\u4e86 \ud83d\ude80"),(0,a.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u4e00\u4e2a\u65b0\u7684Solana\u5ba2\u6237\u7aef\u5f00\u59cb\uff0c\u8f6c\u5230\u60a8\u7684Solana\u5de5\u4f5c\u533a\u5e76\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"npx create-solana-client [name] --initialize-keypair\ncd [name]\nnpm i\n")),(0,a.kt)("p",null,"\u4ee5\u4f60\u7684\u4ee3\u5e01\u6765\u547d\u540d\u4f60\u7684\u5ba2\u6237\u3002\u6211\u8981\u521b\u5efa",(0,a.kt)("inlineCode",{parentName:"p"},"Pizzacoin"),"\uff0c\u56e0\u4e3a\u6211\u6628\u5929\u5403\u4e86\u4e00\u4e9b\u975e\u5e38\u597d\u5403\u7684\u62ab\u8428\u3002\u73b0\u5728\u662f\u4f60\u53d1\u6325\u521b\u610f\u7684\u65f6\u5019\u4e86\u3002\u4e5f\u8bb8\u4f60\u60f3\u5c06\u65f6\u95f4\u672c\u8eab\u8fdb\u884c\u4ee3\u5e01\u5316\uff1f\u4f60\u53ef\u4ee5\u521b\u5efa",(0,a.kt)("inlineCode",{parentName:"p"},"HokageCoin"),"\uff0c\u751a\u81f3\u662f",(0,a.kt)("inlineCode",{parentName:"p"},"TwitterThreadCoin"),"\u3002\u65e0\u9650\u7684\u53ef\u80fd\u6027\uff01"),(0,a.kt)("p",null," ",(0,a.kt)("inlineCode",{parentName:"p"},"--initialize-keypair")," \u6807\u5fd7\u4f4d\u5b8c\u6210\u4e86\u6211\u4eec\u4e0a\u6b21\u4f7f\u7528 ",(0,a.kt)("inlineCode",{parentName:"p"},"initalizeKeypair")," \u8fdb\u884c\u7684\u6240\u6709\u9b54\u6cd5\u3002\u8fd0\u884c ",(0,a.kt)("inlineCode",{parentName:"p"},"npm run start")," \uff0c\u60a8\u5c06\u83b7\u5f97\u4e00\u5bf9\u65b0\u7684\u5bc6\u94a5\uff0c\u5e76\u83b7\u5f97\u4e00\u4e9bSOL\u7a7a\u6295\u3002\u8ba9\u6211\u4eec\u6253\u5f00\u8d27\u5e01\u6253\u5370\u673a\uff0c\u8ba9\u5b83\u55e1\u55e1\u4f5c\u54cd\u3002"),(0,a.kt)("p",null," ",(0,a.kt)("img",{src:t(1186).Z,width:"480",height:"480"})),(0,a.kt)("p",null," \u56fe\u7247\uff1a\u7f8e\u56fd\u8054\u90a6\u50a8\u5907\u94f6\u884c\u884c\u957f\u6770\u7f57\u59c6\xb7\u9c8d\u5a01\u5c14\u8ba9\u6253\u5370\u673a\u55e1\u55e1\u4f5c\u54cd\u3002"),(0,a.kt)("h2",{id:"-\u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668"},"\ud83c\udf81 \u6784\u5efa\u4e00\u4e2a\u4ee3\u5e01\u94f8\u9020\u5668"),(0,a.kt)("p",null," \u8bb0\u4f4f\u8fd9\u4e9b\u6b65\u9aa4\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("ol",{parentName:"li"},(0,a.kt)("li",{parentName:"ol"},"\u521b\u5efa\u4e00\u4e2a",(0,a.kt)("inlineCode",{parentName:"li"},"Token Mint"),"s\u8d26\u6237"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("ol",{parentName:"li",start:2},(0,a.kt)("li",{parentName:"ol"},"\u4e3a\u7279\u5b9a\u7684\u94b1\u5305\u521b\u5efa\u4e00\u4e2a\u5173\u8054\u7684token\u8d26\u6237"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("ol",{parentName:"li",start:3},(0,a.kt)("li",{parentName:"ol"},"\u5c06Mint\u4ee3\u5e01\u53d1\u9001\u5230\u8be5\u94b1\u5305\u4e2d")),(0,a.kt)("p",{parentName:"li"},"\u8fd9\u662f ",(0,a.kt)("inlineCode",{parentName:"p"},"src/index.ts")," \u4e2d\u7684\u7b2c\u4e00\u6b65\uff0c\u5728\u5bfc\u5165\u4e4b\u540e\u3001\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"main()")," \u4e4b\u524d\u653e\u7f6e\u8fd9\u4e2a"),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'// Add the spl-token import at the top\nimport * as token from "@solana/spl-token"\n\nasync function createNewMint(\n connection: web3.Connection,\n payer: web3.Keypair,\n mintAuthority: web3.PublicKey,\n freezeAuthority: web3.PublicKey,\n decimals: number\n): Promise {\n\n const tokenMint = await token.createMint(\n connection,\n payer,\n mintAuthority,\n freezeAuthority,\n decimals\n );\n\n console.log(`The token mint account address is ${tokenMint}`)\n console.log(\n `Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`\n );\n\n return tokenMint;\n}\n')))),(0,a.kt)("p",null,"\u8fd9\u5e94\u8be5\u770b\u8d77\u6765\u5f88\u719f\u6089\u3002\u5982\u679c\u4e0d\u662f\u7684\u8bdd\uff0c\u8bf7\u56de\u5230\u4e0a\u4e00\u8282\u518d\u8bfb\u4e00\u904d \ud83d\ude20"),(0,a.kt)("p",null,"\u518d\u6b21 - \u8fd9\u4e2a ",(0,a.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," \u7a0b\u5e8f\u4f7f\u5f97\u8fd9\u4e00\u5207\u53d8\u5f97\u7b80\u5355\u3002 ",(0,a.kt)("inlineCode",{parentName:"p"},"tokenMint")," \u662f",(0,a.kt)("inlineCode",{parentName:"p"},"TokenMint"),"\u8d26\u6237\u7684\u5730\u5740\u3002"),(0,a.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u521b\u5efa\u5173\u8054\u7684\u4ee4\u724c\u8d26\u6237\uff0c\u5728 ",(0,a.kt)("inlineCode",{parentName:"p"},"createNewMint")," \u51fd\u6570\u4e4b\u540e\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"async function createTokenAccount(\n connection: web3.Connection,\n payer: web3.Keypair,\n mint: web3.PublicKey,\n owner: web3.PublicKey\n) {\n const tokenAccount = await token.getOrCreateAssociatedTokenAccount(\n connection,\n payer,\n mint,\n owner\n )\n\n console.log(\n `Token Account: https://explorer.solana.com/address/${tokenAccount.address}?cluster=devnet`\n )\n\n return tokenAccount\n}\n")),(0,a.kt)("p",null,"\u8fd9\u91cc\u6ca1\u6709\u4ec0\u4e48\u65b0\u9c9c\u4e8b\u3002\u9700\u8981\u6ce8\u610f\u7684\u4e00\u70b9\u662f\uff0c ",(0,a.kt)("inlineCode",{parentName:"p"},"payer")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"owner")," \u53ef\u80fd\u662f\u4e0d\u540c\u7684 - \u4f60\u53ef\u4ee5\u4ed8\u8d39\u521b\u5efa\u67d0\u4eba\u7684\u8d26\u6237\u3002\u8fd9\u53ef\u80fd\u4f1a\u5f88\u6602\u8d35\uff0c\u56e0\u4e3a\u4f60\u5c06\u4e3a\u4ed6\u4eec\u7684\u8d26\u6237\u652f\u4ed8\u201c\u79df\u91d1\u201d\uff0c\u6240\u4ee5\u786e\u4fdd\u5728\u8fdb\u884c\u8fd9\u9879\u64cd\u4f5c\u4e4b\u524d\u5148\u505a\u597d\u8ba1\u7b97\u3002"),(0,a.kt)("p",null,"\u6700\u540e\uff0cmint function\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"async function mintTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n mint: web3.PublicKey,\n destination: web3.PublicKey,\n authority: web3.Keypair,\n amount: number\n) {\n const mintInfo = await token.getMint(connection, mint)\n\n const transactionSignature = await token.mintTo(\n connection,\n payer,\n mint,\n destination,\n authority,\n amount * 10 ** mintInfo.decimals\n )\n\n console.log(\n `Mint Token Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,a.kt)("p",null,"\u8ba9\u6211\u4eec\u5728\u4e3b\u51fd\u6570\u4e2d\u8c03\u7528\u8fd9\u4e9b\u51fd\u6570\uff0c\u8fd9\u662f\u6211\u5f97\u5230\u7684\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"))\n const user = await initializeKeypair(connection)\n\n console.log("PublicKey:", user.publicKey.toBase58())\n\n const mint = await createNewMint(\n connection,\n user, // We\'ll pay the fees\n user.publicKey, // We\'re the mint authority\n user.publicKey, // And the freeze authority >:)\n 2 // Only two decimals!\n )\n\n const tokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n user.publicKey // Associating our address with the token account\n )\n\n // Mint 100 tokens to our address\n await mintTokens(connection, user, mint, tokenAccount.address, user, 100)\n}\n')),(0,a.kt)("p",null,"\u8fd0\u884c ",(0,a.kt)("inlineCode",{parentName:"p"},"npm run start")," - \u4f60\u5e94\u8be5\u5728\u7ec8\u7aef\u4e2d\u770b\u5230\u4e09\u4e2a\u6d4f\u89c8\u5668\u94fe\u63a5\u88ab\u8bb0\u5f55\u4e0b\u6765\u3002\uff08\u6ce8\u610f\uff1a\u786e\u4fdd\u4f60\u5df2\u7ecf ",(0,a.kt)("inlineCode",{parentName:"p"},"@solana/spl-token")," \uff0c\u5426\u5219\u4f1a\u663e\u793a\u9519\u8bef\u3002\u8981\u5b89\u88c5\uff0c\u8bf7\u5728\u7ec8\u7aef\u4e2d\u8f93\u5165 ",(0,a.kt)("inlineCode",{parentName:"p"},"npm uninstall @solana/spl-token")," \u548c ",(0,a.kt)("inlineCode",{parentName:"p"},"npm install @solana/spl-token")," \u3002\u4fdd\u5b58\u4ee3\u5e01Mint\u8d26\u6237\u5730\u5740\uff0c\u7a0d\u540e\u4f1a\u7528\u5230\u3002\u6253\u5f00\u6700\u540e\u4e00\u4e2a\u94fe\u63a5\u5e76\u5411\u4e0b\u6eda\u52a8\u5230\u4ee3\u5e01\u4f59\u989d\u90e8\u5206\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(3880).Z,width:"1150",height:"202"})),(0,a.kt)("p",null,"\u4f60\u521a\u521a\u94f8\u9020\u4e86\u4e00\u4e9b\u4ee3\u5e01\uff01\u8fd9\u4e9b\u4ee3\u5e01\u53ef\u4ee5\u4ee3\u8868\u4f60\u60f3\u8981\u7684\u4efb\u4f55\u4e1c\u897f\u3002\u6bcf\u4e2a\u4ee3\u5e01\u4ef7\u503c100\u7f8e\u5143\uff1f100\u5206\u949f\u7684\u65f6\u95f4\uff1f100\u5f20\u732b\u54aa\u8868\u60c5\u5305\uff1f100\u724712\u82f1\u5bf8\u9ec4\u6cb9\u9e21\u8584\u5e95\u5939\u5fc3\u62ab\u8428\uff1f\u8fd9\u662f\u4f60\u7684\u73b0\u5b9e\u3002\u4f60\u662f\u552f\u4e00\u63a7\u5236\u94f8\u5e01\u8d26\u6237\u7684\u4eba\uff0c\u6240\u4ee5\u4ee3\u5e01\u4f9b\u5e94\u7684\u4ef7\u503c\u53d6\u51b3\u4e8e\u4f60\u7684\u51b3\u5b9a\uff0c\u53ef\u4ee5\u662f\u6beb\u65e0\u4ef7\u503c\u6216\u8005\u73cd\u8d35\u65e0\u6bd4\u3002"),(0,a.kt)("p",null,"\u5728\u4f60\u5f00\u59cb\u5728Solana\u533a\u5757\u94fe\u4e0a\u91cd\u65b0\u5b9a\u4e49\u73b0\u4ee3\u91d1\u878d\u4e4b\u524d\uff0c\u8ba9\u6211\u4eec\u6765\u770b\u770b\u5982\u4f55\u8f6c\u79fb\u548c\u9500\u6bc1\u4ee3\u5e01\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"async function transferTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n source: web3.PublicKey,\n destination: web3.PublicKey,\n owner: web3.PublicKey,\n amount: number,\n mint: web3.PublicKey\n) {\n const mintInfo = await token.getMint(connection, mint)\n\n const transactionSignature = await token.transfer(\n connection,\n payer,\n source,\n destination,\n owner,\n amount * 10 ** mintInfo.decimals\n )\n\n console.log(\n `Transfer Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n\nasync function burnTokens(\n connection: web3.Connection,\n payer: web3.Keypair,\n account: web3.PublicKey,\n mint: web3.PublicKey,\n owner: web3.Keypair,\n amount: number\n) {\n\n const mintInfo = await token.getMint(connection, mint)\n\n const transactionSignature = await token.burn(\n connection,\n payer,\n account,\n mint,\n owner,\n amount * 10 ** mintInfo.decimals\n )\n\n console.log(\n `Burn Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,a.kt)("p",null,"\u8fd9\u4e9b\u51fd\u6570\u770b\u8d77\u6765\u5f88\u957f\uff0c\u56e0\u4e3a\u6211\u7ed9\u6bcf\u4e2a\u53c2\u6570\u90fd\u5355\u72ec\u5360\u4e86\u4e00\u884c\uff0c\u5b9e\u9645\u4e0a\u5b83\u4eec\u53ea\u67093\u884c\u800c\u5df2\uff0c\u54c8\u54c8\u3002"),(0,a.kt)("p",null,"\u4f7f\u7528\u5b83\u4eec\u540c\u6837\u7b80\u5355\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},"async function main() {\n ...\n\n const receiver = web3.Keypair.generate().publicKey\n\n const receiverTokenAccount = await createTokenAccount(\n connection,\n user,\n mint,\n receiver\n )\n\n await transferTokens(\n connection,\n user,\n tokenAccount.address,\n receiverTokenAccount.address,\n user.publicKey,\n 50,\n mint\n )\n\n await burnTokens(connection, user, tokenAccount.address, mint, user, 25)\n}\n")),(0,a.kt)("p",null,"\u73a9\u5f04\u8f6c\u8d26\u529f\u80fd\uff0c\u5411\u60a8\u7684\u94b1\u5305\u5730\u5740\u53d1\u9001\u4e00\u4e9b\u4ee3\u5e01\uff0c\u770b\u770b\u5b83\u662f\u4ec0\u4e48\u6837\u5b50\u3002\u8fd9\u662f\u6211\u770b\u5230\u7684\uff1a"),(0,a.kt)("p",null,(0,a.kt)("img",{src:t(2728).Z,width:"359",height:"537"})),(0,a.kt)("p",null,"\u55ef...\u4e3a\u4ec0\u4e48\u663e\u793a\u672a\u77e5\uff1f\u8ba9\u6211\u4eec\u6765\u4fee\u590d\u4e00\u4e0b\uff01"))}m.isMDXComponent=!0},1186:(n,e,t)=>{t.d(e,{Z:()=>o});const o=t.p+"assets/images/giphy-bd8ccbd4d0915affa402473df4f7acdf.gif"},2728:(n,e,t)=>{t.d(e,{Z:()=>o});const o=t.p+"assets/images/mint-token-wallet-e3a55a700372cfe50e8e5c41e6ff4e68.png"},3880:(n,e,t)=>{t.d(e,{Z:()=>o});const o=t.p+"assets/images/mint-token-1be9f8110b98e83220c0df538fe27707.png"}}]); \ No newline at end of file diff --git a/assets/js/be5b884f.12836150.js b/assets/js/be5b884f.12836150.js deleted file mode 100644 index 1d3d785c0..000000000 --- a/assets/js/be5b884f.12836150.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4688],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),s=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},c=function(e){var n=s(e.components);return a.createElement(p.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),u=s(t),m=r,k=u["".concat(p,".").concat(m)]||u[m]||d[m]||l;return t?a.createElement(k,i(i({ref:n},c),{},{components:t})):a.createElement(k,i({ref:n},c))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,i=new Array(l);i[0]=m;var o={};for(var p in n)hasOwnProperty.call(n,p)&&(o[p]=n[p]);o.originalType=e,o[u]="string"==typeof e?e:r,i[1]=o;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:15,sidebar_label:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c",sidebar_class_name:"green"},i="\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c",o={unversionedId:"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README",id:"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README",title:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c",description:"\u51c6\u5907\u597d\u6233\u4e00\u4e0bSolana\u7f51\u7edc\u4e86\u5417\uff1f\u6211\u4eec\u5c06\u7f16\u5199\u4e00\u4e2a\u811a\u672c\uff0c\u751f\u6210\u4e00\u4e2a\u5bc6\u94a5\u5bf9\uff0c\u7528devnet SOL\u8d44\u91d1\u8fdb\u884c\u5145\u503c\uff0c\u5e76\u4e0eSolana\u7f51\u7edc\u4e0a\u7684\u73b0\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002",source:"@site/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README.md",sourceDirName:"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script",slug:"/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README.md",tags:[],version:"current",sidebarPosition:15,frontMatter:{sidebar_position:15,sidebar_label:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/"},next:{title:"\u94b1\u5305\u548c\u524d\u7aef",permalink:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/"}},p={},s=[{value:"\ud83d\udea7 \u5728\u672c\u5730\u8bbe\u7f6e Solana \u5ba2\u6237\u7aef",id:"-\u5728\u672c\u5730\u8bbe\u7f6e-solana-\u5ba2\u6237\u7aef",level:2},{value:"\u2699 \u8bbe\u7f6e\u5ba2\u6237\u7aef\u811a\u672c",id:"-\u8bbe\u7f6e\u5ba2\u6237\u7aef\u811a\u672c",level:2},{value:"\ud83d\uddb1 \u8c03\u7528\u94fe\u4e0a\u7a0b\u5e8f",id:"-\u8c03\u7528\u94fe\u4e0a\u7a0b\u5e8f",level:2},{value:"\ud83d\udea2 Ship \u6311\u6218 - \u4e00\u79cdSOL\u8f6c\u8d26\u811a\u672c",id:"-ship-\u6311\u6218---\u4e00\u79cdsol\u8f6c\u8d26\u811a\u672c",level:2}],c={toc:s},u="wrapper";function d(e){let{components:n,...l}=e;return(0,r.kt)(u,(0,a.Z)({},c,l,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c"},"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c"),(0,r.kt)("p",null,"\u51c6\u5907\u597d\u6233\u4e00\u4e0bSolana\u7f51\u7edc\u4e86\u5417\uff1f\u6211\u4eec\u5c06\u7f16\u5199\u4e00\u4e2a\u811a\u672c\uff0c\u751f\u6210\u4e00\u4e2a\u5bc6\u94a5\u5bf9\uff0c\u7528",(0,r.kt)("inlineCode",{parentName:"p"},"devnet")," SOL\u8d44\u91d1\u8fdb\u884c\u5145\u503c\uff0c\u5e76\u4e0eSolana\u7f51\u7edc\u4e0a\u7684\u73b0\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,r.kt)("p",null,"\u8fd9\u4e2a\u7a0b\u5e8f\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u201cping\u201d\u8ba1\u6570\u5668\uff1a\u6211\u4eec\u51fb\u4e2d\u5b83\uff0c\u5b83\u8bb0\u5f55\u6211\u4eec\u5bf9\u5b83\u7684ping\uff0c\u5e76\u589e\u52a0\u4e00\u4e2a\u8ba1\u6570\u5668\u3002\u6211\u4eec\u4ee5\u540e\u4f1a\u4ecb\u7ecdRust\u548c\u6211\u4eec\u81ea\u5df1\u7684\u7a0b\u5e8f\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u4f7f\u7528JS/TS\u3002"),(0,r.kt)("h2",{id:"-\u5728\u672c\u5730\u8bbe\u7f6e-solana-\u5ba2\u6237\u7aef"},"\ud83d\udea7 \u5728\u672c\u5730\u8bbe\u7f6e Solana \u5ba2\u6237\u7aef"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u6539\u53d8\u4e00\u4e0b\u65b9\u5f0f - \u6211\u4eec\u5c06\u79bb\u5f00",(0,r.kt)("inlineCode",{parentName:"p"},"React/Next.js"),"\uff0c\u5728\u8fd9\u91cc\u4f7f\u7528\u7eafTypeScript\u6784\u5efa\u4e00\u4e2a\u672c\u5730\u5ba2\u6237\u7aef\u3002\u8fd9\u6bd4\u642d\u5efa\u524d\u7aef\u5e76\u6784\u5efa\u5927\u91cf\u7684\u7528\u6237\u754c\u9762\u8981\u5feb\u5f97\u591a\u3002\u4f60\u53ef\u4ee5\u5728\u4e00\u4e2a\u5355\u72ec\u7684TS\u6587\u4ef6\u4e2d\u5de5\u4f5c\uff0c\u5e76\u5f02\u6b65\u8fd0\u884c\u5b83\u4e0e\u7f51\u7edc\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,r.kt)("p",null,"\u5728\u60a8\u7684Solana\u5de5\u4f5c\u533a\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u6587\u4ef6\u5939\uff0c\u5e76\u4f7f\u7528\u8fd9\u4e2a\u65b9\u4fbf\u7684\u547d\u4ee4\u6765\u8bbe\u7f6e\u672c\u5730\u5ba2\u6237\u7aef\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npx create-solana-client solana-intro-client\n")),(0,r.kt)("p",null,"\u5982\u679c\u5b83\u8be2\u95ee\u60a8\u662f\u5426\u8981\u5b89\u88c5 ",(0,r.kt)("inlineCode",{parentName:"p"},"create-solana-client")," \u8f6f\u4ef6\u5305\uff0c\u8bf7\u8bf4\u201c\u662f\u201d\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u53ea\u9700\u5bfc\u822a\u5230\u76ee\u5f55\u5e76\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"VS Code")," \u4e2d\u542f\u52a8\u5b83"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd solana-intro-client\ncode .\n")),(0,r.kt)("h2",{id:"-\u8bbe\u7f6e\u5ba2\u6237\u7aef\u811a\u672c"},"\u2699 \u8bbe\u7f6e\u5ba2\u6237\u7aef\u811a\u672c"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"create-solana-client")," \u7684\u7f8e\u5999\u4e4b\u5904\u5728\u4e8e\u6211\u4eec\u53ef\u4ee5\u7acb\u5373\u5f00\u59cb\u7f16\u5199\u5ba2\u6237\u7aef\u4ee3\u7801\uff01\u8df3\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u5e76\u5bfc\u5165\u6211\u4eec\u7684\u4f9d\u8d56\u9879\u5e76\u6dfb\u52a0\u6b64 ",(0,r.kt)("inlineCode",{parentName:"p"},"initializeKeypair")," \u51fd\u6570\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// We're adding these\nimport * as Web3 from '@solana/web3.js';\nimport * as fs from 'fs';\nimport dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n}\n\nmain()\n .then(() => {\n console.log('Finished successfully');\n process.exit(0);\n })\n .catch((error) => {\n console.log(error);\n process.exit(1);\n });\n")),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start")," \uff0c\u60a8\u5c06\u770b\u5230\u811a\u672c\u5df2\u8fd0\u884c\uff01\u53ea\u9700\u4e00\u4e2a\u547d\u4ee4\u5373\u53ef\u8bbe\u7f6e Solana \u5ba2\u6237\u7aef\u3002"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u6dfb\u52a0\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"initializeKeypair")," \u51fd\u6570\uff0c\u5982\u679c\u6211\u4eec\u6ca1\u6709\u5bc6\u94a5\u5bf9\uff0c\u5b83\u5c06\u81ea\u52a8\u4e3a\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u5bc6\u94a5\u5bf9\u3002\u5728\u5bfc\u5165\u4e4b\u540e\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function initializeKeypair(connection: Web3.Connection): Promise {\n if (!process.env.PRIVATE_KEY) {\n console.log('Generating new keypair... \ud83d\udddd\ufe0f');\n const signer = Web3.Keypair.generate();\n\n console.log('Creating .env file');\n fs.writeFileSync('.env', `PRIVATE_KEY=[${signer.secretKey.toString()}]`);\n\n return signer;\n }\n\n const secret = JSON.parse(process.env.PRIVATE_KEY ?? '') as number[];\n const secretKey = Uint8Array.from(secret);\n const keypairFromSecret = Web3.Keypair.fromSecretKey(secretKey);\n return keypairFromSecret;\n}\n")),(0,r.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u975e\u5e38\u667a\u80fd\u7684\u51fd\u6570 - \u5b83\u4f1a\u68c0\u67e5\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},".env")," \u6587\u4ef6\u4e2d\u662f\u5426\u6709\u79c1\u94a5\uff0c\u5982\u679c\u6ca1\u6709\uff0c\u5b83\u5c31\u4f1a\u521b\u5efa\u4e00\u4e2a\uff01"),(0,r.kt)("p",null,"\u60a8\u5df2\u7ecf\u719f\u6089\u8fd9\u91cc\u53d1\u751f\u7684\u4e00\u5207 - \u6211\u4eec\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"Web3.Keypair.generate()")," \u51fd\u6570\u5e76\u5c06\u7ed3\u679c\u5199\u5165\u672c\u5730 ",(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/dotenv"},(0,r.kt)("inlineCode",{parentName:"a"},"dotenv"))," \u6587\u4ef6\u3002\u521b\u5efa\u540e\uff0c\u6211\u4eec\u5c06\u8fd4\u56de\u5bc6\u94a5\u5bf9\uff0c\u4ee5\u4fbf\u6211\u4eec\u53ef\u4ee5\u5728\u811a\u672c\u7684\u5176\u4f59\u90e8\u5206\u4e2d\u4f7f\u7528\u5b83\u3002"),(0,r.kt)("p",null,"\u66f4\u65b0\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," \u51fd\u6570\u5e76\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start")," \u8fd0\u884c\u811a\u672c\u6765\u6d4b\u8bd5\u5b83\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function main() {\n const connection = new Web3.Connection(Web3.clusterApiUrl('devnet'));\n const signer = await initializeKeypair(connection);\n\n console.log(\"Public key:\", signer.publicKey.toBase58());\n}\n")),(0,r.kt)("p",null,"\u60a8\u5e94\u8be5\u5728\u7ec8\u7aef\u4e2d\u770b\u5230\u7c7b\u4f3c\u8fd9\u6837\u7684\u5185\u5bb9:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"> solana-course-client@1.0.0 start\n> ts-node src/index.ts\n\nGenerating new keypair... \ud83d\udddd\ufe0f\nCreating .env file\nPublic key: jTAsqBrjsYp4uEJNmED5R66gHPnFW4wvQrbmFG3c4QS\nFinished successfully\n")),(0,r.kt)("p",null,"\u597d\u7684\uff01\u5982\u679c\u60a8\u68c0\u67e5 ",(0,r.kt)("inlineCode",{parentName:"p"},".env")," \u6587\u4ef6\uff0c\u60a8\u5c06\u770b\u5230\u4e00\u4e2a\u5b57\u8282\u683c\u5f0f\u7684\u79c1\u94a5\uff01\u8be5\u5bc6\u94a5\u4e0e\u6587\u4ef6\u4e00\u6837\u4fdd\u5bc6\u3002\u5982\u679c\u60a8\u5c06\u6b64\u6587\u4ef6\u63a8\u9001\u5230\u516c\u5171 GitHub \u5b58\u50a8\u5e93\uff0c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u8bbf\u95ee\u5176\u4e2d\u7684\u8d44\u91d1\uff0c\u56e0\u6b64\u8bf7\u786e\u4fdd\u60a8\u4e0d\u8981\u5c06\u5176\u7528\u4e8e\u771f\u6b63\u7684\u8d27\u5e01\u7528\u9014\uff0c\u54c8\u54c8\u3002"),(0,r.kt)("p",null,"\u518d\u6b21\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start")," \u5c06\u4f7f\u7528\u5b83\u800c\u4e0d\u662f\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u3002"),(0,r.kt)("p",null,"\u4fdd\u6301\u6d4b\u8bd5\u5e10\u6237\u72ec\u7acb\u975e\u5e38\u91cd\u8981\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u8fd9\u4e2a\u811a\u672c\u7279\u522b\u9177\u7684\u539f\u56e0 - \u5b83\u6d88\u9664\u4e86\u521b\u5efa\u548c\u7ba1\u7406\u6d4b\u8bd5\u94b1\u5305\u7684\u9ebb\u70e6\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\uff0c\u5982\u679c\u6211\u4eec\u4e5f\u80fd\u81ea\u52a8\u83b7\u53d6 devnet SOL \u5c31\u597d\u4e86\u3002\u54e6\u7b49\u7b49\uff0c\u6211\u4eec\u53ef\u4ee5\uff01"),(0,r.kt)("p",null,"\u5feb\u6765\u770b\u770b\u8fd9\u4e2a\u8d85\u9177\u7684\u7a7a\u6295\u529f\u80fd-"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function airdropSolIfNeeded(\n signer: Web3.Keypair,\n connection: Web3.Connection\n) {\n const balance = await connection.getBalance(signer.publicKey);\n console.log('Current balance is', balance / Web3.LAMPORTS_PER_SOL, 'SOL');\n\n // 1 SOL should be enough for almost anything you wanna do\n if (balance / Web3.LAMPORTS_PER_SOL < 1) {\n // You can only get up to 2 SOL per request\n console.log('Airdropping 1 SOL');\n const airdropSignature = await connection.requestAirdrop(\n signer.publicKey,\n Web3.LAMPORTS_PER_SOL\n );\n\n const latestBlockhash = await connection.getLatestBlockhash();\n\n await connection.confirmTransaction({\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n signature: airdropSignature,\n });\n\n const newBalance = await connection.getBalance(signer.publicKey);\n console.log('New balance is', newBalance / Web3.LAMPORTS_PER_SOL, 'SOL');\n }\n}\n")),(0,r.kt)("p",null,"\u8fd9\u53ef\u80fd\u770b\u8d77\u6765\u6709\u70b9\u538b\u529b\u5c71\u5927\uff0c\u4f46\u5b9e\u9645\u4e0a\u4f60\u5bf9\u8fd9\u91cc\u53d1\u751f\u7684\u4e00\u5207\u90fd\u4e86\u5982\u6307\u638c\uff01\u6211\u4eec\u6b63\u5728\u5229\u7528\u6211\u4eec\u7684\u8001\u670b\u53cb ",(0,r.kt)("inlineCode",{parentName:"p"},"getBalance")," \u6765\u68c0\u67e5\u6211\u4eec\u662f\u5426\u7834\u4ea7\uff0c\u5982\u679c\u662f\u7684\u8bdd\uff0c\u6211\u4eec\u5c31\u4f1a\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"requestAidrop")," \u51fd\u6570\u8ba9\u94b1\u6eda\u6eda\u800c\u6765\u3002"),(0,r.kt)("p",null,"\u533a\u5757\u54c8\u5e0c\u548c\u533a\u5757\u9ad8\u5ea6\u662f\u533a\u5757\u6807\u8bc6\u7b26\uff0c\u7528\u4e8e\u5411\u7f51\u7edc\u4f20\u8fbe\u6211\u4eec\u662f\u6700\u65b0\u7684\u5e76\u4e14\u4e0d\u4f1a\u53d1\u9001\u8fc7\u65f6\u7684\u4ea4\u6613\u3002"),(0,r.kt)("p",null,"\u4e0d\u8fc7\uff0c\u4e0d\u8981\u5c1d\u8bd5\u5faa\u73af\u8fd0\u884c\u5b83 - \u6c34\u9f99\u5934\u6709\u4e00\u4e2a\u51b7\u5374\u65f6\u95f4\uff0c\u5982\u679c\u4f60\u7ee7\u7eed\u5411\u5b83\u53d1\u9001\u5783\u573e\u90ae\u4ef6\uff0c\u8bf7\u6c42\u5c06\u4f1a\u5931\u8d25\uff0c\u54c8\u54c8\u3002"),(0,r.kt)("p",null,"\u786e\u4fdd\u5728\u521b\u5efa/\u83b7\u53d6\u5bc6\u94a5\u5bf9\u540e\u66f4\u65b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"initializeKeypair")," \u51fd\u6570\u4ee5\u8c03\u7528\u7a7a\u6295\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// When generating a keypair\n await airdropSolIfNeeded(signer, connection);\n\n // When creating it from the secret key\n await airdropSolIfNeeded(keypairFromSecret, connection);\n")),(0,r.kt)("p",null,"\u73b0\u5728\uff0c\u5982\u679c\u60a8 ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run start")," \uff0c\u60a8\u5c06\u770b\u5230\u7a7a\u6295\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"Current balance is 0 SOL\nAirdropping 1 SOL\nNew balance is 1 SOL\nPublic key: 7Fw3bXskk5eonycvET6BSufxAsuNudvuxF7MMnS8KMqX\n")),(0,r.kt)("p",null,"\u6211\u4eec\u51c6\u5907\u597d\u4e86 rrrrrrrrrrrrumble \ud83e\udd4a"),(0,r.kt)("h2",{id:"-\u8c03\u7528\u94fe\u4e0a\u7a0b\u5e8f"},"\ud83d\uddb1 \u8c03\u7528\u94fe\u4e0a\u7a0b\u5e8f"),(0,r.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u6211\u4eec\u7684\u5ba2\u6237\u53d1\u6325\u4f5c\u7528\u4e86\u3002\u6211\u4eec\u5c06\u5411Solana\u7f51\u7edc\u4e0a\u7684\u73b0\u6709\u7a0b\u5e8f\u5199\u5165\u6570\u636e\u3002\u4eba\u4eec\u8ba4\u4e3aSolana\u7684\u5f00\u53d1\u53ea\u662f\u5173\u4e8e\u7528Rust\u7f16\u5199\u7a0b\u5e8f\u3002\u4e0d\u5bf9\uff01\u5927\u90e8\u5206\u533a\u5757\u94fe\u5f00\u53d1\u662f\u4e0e\u73b0\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,r.kt)("p",null,"\u4f60\u53ef\u4ee5\u6784\u5efa\u6570\u767e\u4e2a\u53ea\u4e0e\u5df2\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u7684\u5e94\u7528\u3002\u8fd9\u5c31\u662f\u4e50\u8da3\u5f00\u59cb\u7684\u5730\u65b9\uff01\u6211\u4eec\u4f1a\u4fdd\u6301\u7b80\u5355 - \u6211\u4eec\u7684\u5ba2\u6237\u7aef\u4f1a\u53d1\u9001\u4e00\u4e2a\u8ba1\u6570\u5668\u7a0b\u5e8f\uff0c\u8be5\u7a0b\u5e8f\u4f1a\u9012\u589e\u4e00\u4e2a\u8ba1\u6570\u5668\u3002\u4f60\u5c06\u544a\u8bc9\u7f51\u7edc\u4e0a\u7684\u6bcf\u4e2a\u4eba\u4f60\u662f\u4e00\u4e2a\u5f00\u53d1\u8005\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u544a\u8bc9\u5ba2\u6237\u5b83\u5c06\u4e0e\u54ea\u4e9b\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002\u4ece\u9876\u90e8\u5f00\u59cb\uff0c\u5c06\u8fd9\u4e9b\u5730\u5740\u6dfb\u52a0\u5728\u5bfc\u5165\u8bed\u53e5\u7684\u4e0b\u65b9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const PROGRAM_ID = new Web3.PublicKey("ChT1B39WKLS8qUrkLvFDXMhEJ4F1XZzwUNHUt4AU9aVa")\nconst PROGRAM_DATA_PUBLIC_KEY = new Web3.PublicKey("Ah9K7dQ8EHaZqcAsgBW8w37yN2eAy3koFmUn4x3CJtod")\n')),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"PROGRAM_ID")," \u662f",(0,r.kt)("inlineCode",{parentName:"p"},"ping"),"\u7a0b\u5e8f\u672c\u8eab\u7684\u5730\u5740\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"PROGRAM_DATA_PUBLIC_KEY")," \u662f\u5b58\u50a8\u7a0b\u5e8f\u6570\u636e\u7684\u5e10\u6237\u7684\u5730\u5740\u3002\u8bf7\u8bb0\u4f4f - \u53ef\u6267\u884c\u4ee3\u7801\u548c\u72b6\u6001\u6570\u636e\u5355\u72ec\u5b58\u50a8\u5728 Solana \u4e0a\uff01"),(0,r.kt)("p",null,"\u7136\u540e\u6dfb\u52a0\u6b64\u51fd\u6570\u4ee5\u5728\u4efb\u4f55\u5730\u65b9 ",(0,r.kt)("inlineCode",{parentName:"p"},"ping")," \u7a0b\u5e8f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function pingProgram(connection: Web3.Connection, payer: Web3.Keypair) {\n const transaction = new Web3.Transaction()\n const instruction = new Web3.TransactionInstruction({\n // Instructions need 3 things\n\n // 1. The public keys of all the accounts the instruction will read/write\n keys: [\n {\n pubkey: PROGRAM_DATA_PUBLIC_KEY,\n isSigner: false,\n isWritable: true\n }\n ],\n\n // 2. The ID of the program this instruction will be sent to\n programId: PROGRAM_ID\n\n // 3. Data - in this case, there's none!\n })\n\n transaction.add(instruction)\n const transactionSignature = await Web3.sendAndConfirmTransaction(connection, transaction, [payer])\n\n console.log(\n `Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,r.kt)("p",null,"\u8fd9\u5e76\u4e0d\u50cf\u770b\u8d77\u6765\u90a3\u4e48\u590d\u6742\uff01\u4f60\u5df2\u7ecf\u77e5\u9053\u4e86\u8fd9\u4e00\u90e8\u5206"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u6211\u4eec\u8fdb\u884c\u4e00\u7b14\u4ea4\u6613"),(0,r.kt)("li",{parentName:"ul"},"\u6211\u4eec\u5236\u4f5c\u4e00\u4efd\u6307\u4ee4"),(0,r.kt)("li",{parentName:"ul"},"\u6211\u4eec\u5c06\u6307\u4ee4\u6dfb\u52a0\u5230\u4ea4\u6613\u4e2d"),(0,r.kt)("li",{parentName:"ul"},"\u6211\u4eec\u5c06\u4ea4\u6613\u53d1\u9001\u5230\u7f51\u7edc\uff01")),(0,r.kt)("p",null,"\u67e5\u770b\u4e0a\u9762\u7684\u4ee3\u7801\u6ce8\u91ca - \u6211\u56de\u987e\u4e00\u4e0b\u6307\u4ee4\u7684\u4e09\u4e2a\u90e8\u5206\u3002"),(0,r.kt)("p",null,"\u8fd9\u91cc\u7684\u91cd\u70b9\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"keys")," \u503c - \u5b83\u662f\u4e00\u4e2a\u5305\u542b\u6bcf\u4e2a\u8d26\u6237\u5143\u6570\u636e\u7684\u6570\u7ec4\uff0c\u8fd9\u4e2a\u6307\u4ee4\u5c06\u4ece\u4e2d\u8bfb\u53d6\u6216\u5199\u5165\u3002\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c\u6211\u544a\u8bc9\u4f60\u8fd9\u4e2a\u6307\u4ee4\u5c06\u5904\u7406\u54ea\u4e9b\u8d26\u6237\u3002"),(0,r.kt)("p",null,"\u4f60\u9700\u8981\u77e5\u9053\u8fd9\u5c06\u662f\u4ec0\u4e48 - \u4f60\u53ef\u4ee5\u901a\u8fc7\u9605\u8bfb\u7a0b\u5e8f\u672c\u8eab\u6216\u5176\u6587\u6863\u6765\u4e86\u89e3\u3002\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u4e00\u70b9\uff0c\u5c31\u65e0\u6cd5\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\uff0c\u56e0\u4e3a\u6307\u4ee4\u5c06\u65e0\u6548\u3002\u4f60\u5c06\u53d1\u9001\u4e00\u4e2a\u4f1a\u89e6\u53ca\u6570\u636e\u8d26\u6237\u7684\u4ea4\u6613\uff0c\u4f46\u4f60\u4e0d\u4f1a\u544a\u8bc9\u8fd0\u884c\u65f6\u662f\u54ea\u4e2a\u8d26\u6237\uff0c\u6240\u4ee5\u5b83\u5c06\u88ab\u4e22\u5f03\u3002"),(0,r.kt)("p",null,"\u53ef\u4ee5\u5c06\u5176\u60f3\u8c61\u4e3a\u5c1d\u8bd5\u5f00\u8f66\u524d\u5f80\u6ca1\u6709 GPS \u7684\u5730\u5740\u3002\u60a8\u77e5\u9053\u81ea\u5df1\u60f3\u53bb\u54ea\u91cc\uff0c\u4f46\u4e0d\u77e5\u9053\u5230\u8fbe\u90a3\u91cc\u7684\u8def\u7ebf\u3002"),(0,r.kt)("p",null,"\u7531\u4e8e\u6b64\u5199\u5165\u4e0d\u9700\u8981\u6570\u636e\u5e10\u6237\u7684\u7b7e\u540d\uff0c\u56e0\u6b64\u6211\u4eec\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"isSigner")," \u8bbe\u7f6e\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"false"),"\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"isWritable")," \u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"true"),"\uff0c\u56e0\u4e3a\u8be5\u5e10\u6237\u6b63\u5728\u88ab\u5199\u5165\uff01"),(0,r.kt)("p",null,"\u901a\u8fc7\u544a\u8bc9\u7f51\u7edc\u6211\u4eec\u9700\u8981\u4e0e\u54ea\u4e9b\u5e10\u6237\u4ea4\u4e92\u4ee5\u53ca\u6211\u4eec\u662f\u5426\u6b63\u5728\u5411\u5b83\u4eec\u5199\u5165\u6570\u636e\uff0cSolana \u8fd0\u884c\u65f6\u5c31\u77e5\u9053\u53ef\u4ee5\u5e76\u884c\u8fd0\u884c\u54ea\u4e9b\u4e8b\u52a1\u3002\u8fd9\u5c31\u662f Solana \u5982\u6b64\u4e4b\u5feb\u7684\u90e8\u5206\u539f\u56e0\uff01"),(0,r.kt)("p",null,"\u5c06\u6b64\u51fd\u6570\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"await pingProgram(connection, signer)")," \u6dfb\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"main()")," \u5e76\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start")," \u8fd0\u884c\u811a\u672c\u3002\u8bbf\u95ee\u8bb0\u5f55\u7684\u8d44\u6e90\u7ba1\u7406\u5668\u94fe\u63a5\uff0c\u60a8\u5c06\u5728\u9875\u9762\u5e95\u90e8\u770b\u5230\u60a8\u7f16\u5199\u7684\u6570\u636e\uff08\u60a8\u53ef\u4ee5\u5ffd\u7565\u5176\u4ed6\u6240\u6709\u5185\u5bb9\uff09-"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(6245).Z,width:"2284",height:"402"})),(0,r.kt)("p",null,"\u60a8\u521a\u521a\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe\u3002\u90a3\u6709\u591a\u5bb9\u6613\uff1f"),(0,r.kt)("p",null,"\u8fd9\u53ef\u80fd\u770b\u8d77\u6765\u5f88\u7b80\u5355\uff0c\u4f46\u60a8\u786e\u5b9e\u5df2\u7ecf\u53d6\u5f97\u4e86\u6210\u529f\u3002\u5f53\u63a8\u7279\u4e0a\u7684\u6bcf\u4e2a\u4eba\u90fd\u5728\u5927\u558a\u7334\u5b50\u56fe\u7247\u65f6\uff0c\u4f60\u6b63\u5728\u5efa\u9020GGGGGGGGGGGGGGGGGG\u3002\u60a8\u5728\u672c\u8282\u4e2d\u5b66\u5230\u7684\u5185\u5bb9 - \u4ece Solana \u7f51\u7edc\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e\uff0c\u8db3\u4ee5\u5236\u4f5c\u4ef7\u503c 1 \u4e07\u7f8e\u5143\u7684\u4ea7\u54c1\u3002\u60f3\u8c61\u4e00\u4e0b\u5728\u8fd9\u4e2a\u9879\u76ee\u7ed3\u675f\u65f6\u4f60\u80fd\u505a\u4ec0\u4e48 \ud83e\udd18"),(0,r.kt)("h2",{id:"-ship-\u6311\u6218---\u4e00\u79cdsol\u8f6c\u8d26\u811a\u672c"},"\ud83d\udea2 Ship \u6311\u6218 - \u4e00\u79cdSOL\u8f6c\u8d26\u811a\u672c"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u4e00\u8d77\u5b66\u4e60\u4e86\u5982\u4f55\u5c06\u4ea4\u6613\u53d1\u9001\u5230\u7f51\u7edc\uff0c\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u5c1d\u8bd5\u4e86\u3002"),(0,r.kt)("p",null,"\u6309\u7167\u4e0a\u4e00\u6b65\u9aa4\u7684\u7c7b\u4f3c\u6d41\u7a0b\uff0c\u4ece\u5934\u5f00\u59cb\u521b\u5efa\u4e00\u4e2a\u811a\u672c\uff0c\u4f7f\u60a8\u80fd\u591f\u5728Devnet\u4e0a\u5c06SOL\u4ece\u4e00\u4e2a\u8d26\u6237\u8f6c\u79fb\u5230\u53e6\u4e00\u4e2a\u8d26\u6237\u3002\u786e\u4fdd\u6253\u5370\u51fa\u4ea4\u6613\u7b7e\u540d\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u3002"),(0,r.kt)("p",null,"\u60f3\u60f3\u5230\u76ee\u524d\u4e3a\u6b62\u4f60\u5b66\u5230\u4e86\u4ec0\u4e48 -"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u5c06\u6570\u636e\u5199\u5165\u7f51\u7edc\u662f\u901a\u8fc7\u4e8b\u52a1\u8fdb\u884c\u7684"),(0,r.kt)("li",{parentName:"ul"},"\u4ea4\u6613\u9700\u8981\u6307\u4ee4"),(0,r.kt)("li",{parentName:"ul"},"\u6307\u4ee4\u544a\u8bc9\u7f51\u7edc\u5b83\u4eec\u89e6\u53ca\u54ea\u4e9b\u7a0b\u5e8f\u4ee5\u53ca\u5b83\u4eec\u7684\u529f\u80fd"),(0,r.kt)("li",{parentName:"ul"},"\u901a\u8fc7\u7cfb\u7edf\u7a0b\u5e8f\u8fdb\u884cSOL\u7684\u8f6c\u79fb\uff08\u55ef\uff0c\u6211\u60f3\u77e5\u9053\u5b83\u53eb\u4ec0\u4e48\u3002\ud83e\udd14 \u8f6c\u79fb\uff1f\uff09")),(0,r.kt)("p",null,"\u60a8\u5728\u8fd9\u91cc\u6240\u9700\u8981\u505a\u7684\u5c31\u662f\u627e\u51fa\u786e\u5207\u7684\u51fd\u6570\u540d\u79f0\u662f\u4ec0\u4e48\u4ee5\u53ca\u6307\u4ee4\u5e94\u8be5\u662f\u4ec0\u4e48\u6837\u5b50\u3002\u6211\u4f1a\u4ece\u8c37\u6b4c\u5f00\u59cb\uff1aP"),(0,r.kt)("p",null,"\u9644\uff1a\u5982\u679c\u60a8\u786e\u5b9a\u5df2\u7ecf\u5f04\u6e05\u695a\u4e86\uff0c\u4f46\u8f6c\u8d26\u4ecd\u7136\u5931\u8d25\uff0c\u5219\u53ef\u80fd\u662f\u60a8\u8f6c\u8d26\u592a\u5c11 - \u5c1d\u8bd5\u81f3\u5c11\u8f6c\u8d26 0.1 SOL\u3002"),(0,r.kt)("p",null,"\u50cf\u5f80\u5e38\u4e00\u6837\uff0c\u5728\u5f15\u7528\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\u4e4b\u524d\u5c1d\u8bd5\u81ea\u5df1\u6267\u884c\u6b64\u64cd\u4f5c\u3002\u5f53\u60a8\u786e\u5b9e\u9700\u8981\u53c2\u8003\u89e3\u51b3\u65b9\u6848\u65f6\uff0c",(0,r.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-send-sol-client"},"\u8bf7\u67e5\u770b\u6b64\u5904"),"\u3002 \ud83d\udc40"))}d.isMDXComponent=!0},6245:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/ping-solana-f389a9d2201cefa02bb91b1abd8d70a4.png"}}]); \ No newline at end of file diff --git a/assets/js/be5b884f.b6d9a1a3.js b/assets/js/be5b884f.b6d9a1a3.js new file mode 100644 index 000000000..4325efb1e --- /dev/null +++ b/assets/js/be5b884f.b6d9a1a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4688],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function l(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),s=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},c=function(e){var n=s(e.components);return a.createElement(p.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),u=s(t),m=r,k=u["".concat(p,".").concat(m)]||u[m]||d[m]||l;return t?a.createElement(k,i(i({ref:n},c),{},{components:t})):a.createElement(k,i({ref:n},c))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var l=t.length,i=new Array(l);i[0]=m;var o={};for(var p in n)hasOwnProperty.call(n,p)&&(o[p]=n[p]);o.originalType=e,o[u]="string"==typeof e?e:r,i[1]=o;for(var s=2;s{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const l={sidebar_position:15,sidebar_label:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c",sidebar_class_name:"green"},i="\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c",o={unversionedId:"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README",id:"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README",title:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c",description:"\u51c6\u5907\u597d\u6233\u4e00\u4e0bSolana\u7f51\u7edc\u4e86\u5417\uff1f\u6211\u4eec\u5c06\u7f16\u5199\u4e00\u4e2a\u811a\u672c\uff0c\u751f\u6210\u4e00\u4e2a\u5bc6\u94a5\u5bf9\uff0c\u7528devnet SOL\u8d44\u91d1\u8fdb\u884c\u5145\u503c\uff0c\u5e76\u4e0eSolana\u7f51\u7edc\u4e0a\u7684\u73b0\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002",source:"@site/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README.md",sourceDirName:"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script",slug:"/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README.md",tags:[],version:"current",sidebarPosition:15,frontMatter:{sidebar_position:15,sidebar_label:"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u270d\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/"},next:{title:"\u94b1\u5305\u548c\u524d\u7aef",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/"}},p={},s=[{value:"\ud83d\udea7 \u5728\u672c\u5730\u8bbe\u7f6e Solana \u5ba2\u6237\u7aef",id:"-\u5728\u672c\u5730\u8bbe\u7f6e-solana-\u5ba2\u6237\u7aef",level:2},{value:"\u2699 \u8bbe\u7f6e\u5ba2\u6237\u7aef\u811a\u672c",id:"-\u8bbe\u7f6e\u5ba2\u6237\u7aef\u811a\u672c",level:2},{value:"\ud83d\uddb1 \u8c03\u7528\u94fe\u4e0a\u7a0b\u5e8f",id:"-\u8c03\u7528\u94fe\u4e0a\u7a0b\u5e8f",level:2},{value:"\ud83d\udea2 Ship \u6311\u6218 - \u4e00\u79cdSOL\u8f6c\u8d26\u811a\u672c",id:"-ship-\u6311\u6218---\u4e00\u79cdsol\u8f6c\u8d26\u811a\u672c",level:2}],c={toc:s},u="wrapper";function d(e){let{components:n,...l}=e;return(0,r.kt)(u,(0,a.Z)({},c,l,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c"},"\ud83d\udcdd \u6784\u5efa\u4e00\u4e2a\u4e92\u52a8\u811a\u672c"),(0,r.kt)("p",null,"\u51c6\u5907\u597d\u6233\u4e00\u4e0bSolana\u7f51\u7edc\u4e86\u5417\uff1f\u6211\u4eec\u5c06\u7f16\u5199\u4e00\u4e2a\u811a\u672c\uff0c\u751f\u6210\u4e00\u4e2a\u5bc6\u94a5\u5bf9\uff0c\u7528",(0,r.kt)("inlineCode",{parentName:"p"},"devnet")," SOL\u8d44\u91d1\u8fdb\u884c\u5145\u503c\uff0c\u5e76\u4e0eSolana\u7f51\u7edc\u4e0a\u7684\u73b0\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,r.kt)("p",null,"\u8fd9\u4e2a\u7a0b\u5e8f\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u201cping\u201d\u8ba1\u6570\u5668\uff1a\u6211\u4eec\u51fb\u4e2d\u5b83\uff0c\u5b83\u8bb0\u5f55\u6211\u4eec\u5bf9\u5b83\u7684ping\uff0c\u5e76\u589e\u52a0\u4e00\u4e2a\u8ba1\u6570\u5668\u3002\u6211\u4eec\u4ee5\u540e\u4f1a\u4ecb\u7ecdRust\u548c\u6211\u4eec\u81ea\u5df1\u7684\u7a0b\u5e8f\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u4f7f\u7528JS/TS\u3002"),(0,r.kt)("h2",{id:"-\u5728\u672c\u5730\u8bbe\u7f6e-solana-\u5ba2\u6237\u7aef"},"\ud83d\udea7 \u5728\u672c\u5730\u8bbe\u7f6e Solana \u5ba2\u6237\u7aef"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u6539\u53d8\u4e00\u4e0b\u65b9\u5f0f - \u6211\u4eec\u5c06\u79bb\u5f00",(0,r.kt)("inlineCode",{parentName:"p"},"React/Next.js"),"\uff0c\u5728\u8fd9\u91cc\u4f7f\u7528\u7eafTypeScript\u6784\u5efa\u4e00\u4e2a\u672c\u5730\u5ba2\u6237\u7aef\u3002\u8fd9\u6bd4\u642d\u5efa\u524d\u7aef\u5e76\u6784\u5efa\u5927\u91cf\u7684\u7528\u6237\u754c\u9762\u8981\u5feb\u5f97\u591a\u3002\u4f60\u53ef\u4ee5\u5728\u4e00\u4e2a\u5355\u72ec\u7684TS\u6587\u4ef6\u4e2d\u5de5\u4f5c\uff0c\u5e76\u5f02\u6b65\u8fd0\u884c\u5b83\u4e0e\u7f51\u7edc\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,r.kt)("p",null,"\u5728\u60a8\u7684Solana\u5de5\u4f5c\u533a\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u6587\u4ef6\u5939\uff0c\u5e76\u4f7f\u7528\u8fd9\u4e2a\u65b9\u4fbf\u7684\u547d\u4ee4\u6765\u8bbe\u7f6e\u672c\u5730\u5ba2\u6237\u7aef\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npx create-solana-client solana-intro-client\n")),(0,r.kt)("p",null,"\u5982\u679c\u5b83\u8be2\u95ee\u60a8\u662f\u5426\u8981\u5b89\u88c5 ",(0,r.kt)("inlineCode",{parentName:"p"},"create-solana-client")," \u8f6f\u4ef6\u5305\uff0c\u8bf7\u8bf4\u201c\u662f\u201d\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u53ea\u9700\u5bfc\u822a\u5230\u76ee\u5f55\u5e76\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"VS Code")," \u4e2d\u542f\u52a8\u5b83"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"cd solana-intro-client\ncode .\n")),(0,r.kt)("h2",{id:"-\u8bbe\u7f6e\u5ba2\u6237\u7aef\u811a\u672c"},"\u2699 \u8bbe\u7f6e\u5ba2\u6237\u7aef\u811a\u672c"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"create-solana-client")," \u7684\u7f8e\u5999\u4e4b\u5904\u5728\u4e8e\u6211\u4eec\u53ef\u4ee5\u7acb\u5373\u5f00\u59cb\u7f16\u5199\u5ba2\u6237\u7aef\u4ee3\u7801\uff01\u8df3\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u5e76\u5bfc\u5165\u6211\u4eec\u7684\u4f9d\u8d56\u9879\u5e76\u6dfb\u52a0\u6b64 ",(0,r.kt)("inlineCode",{parentName:"p"},"initializeKeypair")," \u51fd\u6570\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// We're adding these\nimport * as Web3 from '@solana/web3.js';\nimport * as fs from 'fs';\nimport dotenv from 'dotenv';\ndotenv.config();\n\nasync function main() {\n}\n\nmain()\n .then(() => {\n console.log('Finished successfully');\n process.exit(0);\n })\n .catch((error) => {\n console.log(error);\n process.exit(1);\n });\n")),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start")," \uff0c\u60a8\u5c06\u770b\u5230\u811a\u672c\u5df2\u8fd0\u884c\uff01\u53ea\u9700\u4e00\u4e2a\u547d\u4ee4\u5373\u53ef\u8bbe\u7f6e Solana \u5ba2\u6237\u7aef\u3002"),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u6dfb\u52a0\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"initializeKeypair")," \u51fd\u6570\uff0c\u5982\u679c\u6211\u4eec\u6ca1\u6709\u5bc6\u94a5\u5bf9\uff0c\u5b83\u5c06\u81ea\u52a8\u4e3a\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u5bc6\u94a5\u5bf9\u3002\u5728\u5bfc\u5165\u4e4b\u540e\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function initializeKeypair(connection: Web3.Connection): Promise {\n if (!process.env.PRIVATE_KEY) {\n console.log('Generating new keypair... \ud83d\udddd\ufe0f');\n const signer = Web3.Keypair.generate();\n\n console.log('Creating .env file');\n fs.writeFileSync('.env', `PRIVATE_KEY=[${signer.secretKey.toString()}]`);\n\n return signer;\n }\n\n const secret = JSON.parse(process.env.PRIVATE_KEY ?? '') as number[];\n const secretKey = Uint8Array.from(secret);\n const keypairFromSecret = Web3.Keypair.fromSecretKey(secretKey);\n return keypairFromSecret;\n}\n")),(0,r.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u975e\u5e38\u667a\u80fd\u7684\u51fd\u6570 - \u5b83\u4f1a\u68c0\u67e5\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},".env")," \u6587\u4ef6\u4e2d\u662f\u5426\u6709\u79c1\u94a5\uff0c\u5982\u679c\u6ca1\u6709\uff0c\u5b83\u5c31\u4f1a\u521b\u5efa\u4e00\u4e2a\uff01"),(0,r.kt)("p",null,"\u60a8\u5df2\u7ecf\u719f\u6089\u8fd9\u91cc\u53d1\u751f\u7684\u4e00\u5207 - \u6211\u4eec\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"Web3.Keypair.generate()")," \u51fd\u6570\u5e76\u5c06\u7ed3\u679c\u5199\u5165\u672c\u5730 ",(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/dotenv"},(0,r.kt)("inlineCode",{parentName:"a"},"dotenv"))," \u6587\u4ef6\u3002\u521b\u5efa\u540e\uff0c\u6211\u4eec\u5c06\u8fd4\u56de\u5bc6\u94a5\u5bf9\uff0c\u4ee5\u4fbf\u6211\u4eec\u53ef\u4ee5\u5728\u811a\u672c\u7684\u5176\u4f59\u90e8\u5206\u4e2d\u4f7f\u7528\u5b83\u3002"),(0,r.kt)("p",null,"\u66f4\u65b0\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," \u51fd\u6570\u5e76\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start")," \u8fd0\u884c\u811a\u672c\u6765\u6d4b\u8bd5\u5b83\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function main() {\n const connection = new Web3.Connection(Web3.clusterApiUrl('devnet'));\n const signer = await initializeKeypair(connection);\n\n console.log(\"Public key:\", signer.publicKey.toBase58());\n}\n")),(0,r.kt)("p",null,"\u60a8\u5e94\u8be5\u5728\u7ec8\u7aef\u4e2d\u770b\u5230\u7c7b\u4f3c\u8fd9\u6837\u7684\u5185\u5bb9:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"> solana-course-client@1.0.0 start\n> ts-node src/index.ts\n\nGenerating new keypair... \ud83d\udddd\ufe0f\nCreating .env file\nPublic key: jTAsqBrjsYp4uEJNmED5R66gHPnFW4wvQrbmFG3c4QS\nFinished successfully\n")),(0,r.kt)("p",null,"\u597d\u7684\uff01\u5982\u679c\u60a8\u68c0\u67e5 ",(0,r.kt)("inlineCode",{parentName:"p"},".env")," \u6587\u4ef6\uff0c\u60a8\u5c06\u770b\u5230\u4e00\u4e2a\u5b57\u8282\u683c\u5f0f\u7684\u79c1\u94a5\uff01\u8be5\u5bc6\u94a5\u4e0e\u6587\u4ef6\u4e00\u6837\u4fdd\u5bc6\u3002\u5982\u679c\u60a8\u5c06\u6b64\u6587\u4ef6\u63a8\u9001\u5230\u516c\u5171 GitHub \u5b58\u50a8\u5e93\uff0c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u8bbf\u95ee\u5176\u4e2d\u7684\u8d44\u91d1\uff0c\u56e0\u6b64\u8bf7\u786e\u4fdd\u60a8\u4e0d\u8981\u5c06\u5176\u7528\u4e8e\u771f\u6b63\u7684\u8d27\u5e01\u7528\u9014\uff0c\u54c8\u54c8\u3002"),(0,r.kt)("p",null,"\u518d\u6b21\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start")," \u5c06\u4f7f\u7528\u5b83\u800c\u4e0d\u662f\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u3002"),(0,r.kt)("p",null,"\u4fdd\u6301\u6d4b\u8bd5\u5e10\u6237\u72ec\u7acb\u975e\u5e38\u91cd\u8981\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u8fd9\u4e2a\u811a\u672c\u7279\u522b\u9177\u7684\u539f\u56e0 - \u5b83\u6d88\u9664\u4e86\u521b\u5efa\u548c\u7ba1\u7406\u6d4b\u8bd5\u94b1\u5305\u7684\u9ebb\u70e6\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\uff0c\u5982\u679c\u6211\u4eec\u4e5f\u80fd\u81ea\u52a8\u83b7\u53d6 devnet SOL \u5c31\u597d\u4e86\u3002\u54e6\u7b49\u7b49\uff0c\u6211\u4eec\u53ef\u4ee5\uff01"),(0,r.kt)("p",null,"\u5feb\u6765\u770b\u770b\u8fd9\u4e2a\u8d85\u9177\u7684\u7a7a\u6295\u529f\u80fd-"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function airdropSolIfNeeded(\n signer: Web3.Keypair,\n connection: Web3.Connection\n) {\n const balance = await connection.getBalance(signer.publicKey);\n console.log('Current balance is', balance / Web3.LAMPORTS_PER_SOL, 'SOL');\n\n // 1 SOL should be enough for almost anything you wanna do\n if (balance / Web3.LAMPORTS_PER_SOL < 1) {\n // You can only get up to 2 SOL per request\n console.log('Airdropping 1 SOL');\n const airdropSignature = await connection.requestAirdrop(\n signer.publicKey,\n Web3.LAMPORTS_PER_SOL\n );\n\n const latestBlockhash = await connection.getLatestBlockhash();\n\n await connection.confirmTransaction({\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n signature: airdropSignature,\n });\n\n const newBalance = await connection.getBalance(signer.publicKey);\n console.log('New balance is', newBalance / Web3.LAMPORTS_PER_SOL, 'SOL');\n }\n}\n")),(0,r.kt)("p",null,"\u8fd9\u53ef\u80fd\u770b\u8d77\u6765\u6709\u70b9\u538b\u529b\u5c71\u5927\uff0c\u4f46\u5b9e\u9645\u4e0a\u4f60\u5bf9\u8fd9\u91cc\u53d1\u751f\u7684\u4e00\u5207\u90fd\u4e86\u5982\u6307\u638c\uff01\u6211\u4eec\u6b63\u5728\u5229\u7528\u6211\u4eec\u7684\u8001\u670b\u53cb ",(0,r.kt)("inlineCode",{parentName:"p"},"getBalance")," \u6765\u68c0\u67e5\u6211\u4eec\u662f\u5426\u7834\u4ea7\uff0c\u5982\u679c\u662f\u7684\u8bdd\uff0c\u6211\u4eec\u5c31\u4f1a\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"requestAidrop")," \u51fd\u6570\u8ba9\u94b1\u6eda\u6eda\u800c\u6765\u3002"),(0,r.kt)("p",null,"\u533a\u5757\u54c8\u5e0c\u548c\u533a\u5757\u9ad8\u5ea6\u662f\u533a\u5757\u6807\u8bc6\u7b26\uff0c\u7528\u4e8e\u5411\u7f51\u7edc\u4f20\u8fbe\u6211\u4eec\u662f\u6700\u65b0\u7684\u5e76\u4e14\u4e0d\u4f1a\u53d1\u9001\u8fc7\u65f6\u7684\u4ea4\u6613\u3002"),(0,r.kt)("p",null,"\u4e0d\u8fc7\uff0c\u4e0d\u8981\u5c1d\u8bd5\u5faa\u73af\u8fd0\u884c\u5b83 - \u6c34\u9f99\u5934\u6709\u4e00\u4e2a\u51b7\u5374\u65f6\u95f4\uff0c\u5982\u679c\u4f60\u7ee7\u7eed\u5411\u5b83\u53d1\u9001\u5783\u573e\u90ae\u4ef6\uff0c\u8bf7\u6c42\u5c06\u4f1a\u5931\u8d25\uff0c\u54c8\u54c8\u3002"),(0,r.kt)("p",null,"\u786e\u4fdd\u5728\u521b\u5efa/\u83b7\u53d6\u5bc6\u94a5\u5bf9\u540e\u66f4\u65b0 ",(0,r.kt)("inlineCode",{parentName:"p"},"initializeKeypair")," \u51fd\u6570\u4ee5\u8c03\u7528\u7a7a\u6295\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// When generating a keypair\n await airdropSolIfNeeded(signer, connection);\n\n // When creating it from the secret key\n await airdropSolIfNeeded(keypairFromSecret, connection);\n")),(0,r.kt)("p",null,"\u73b0\u5728\uff0c\u5982\u679c\u60a8 ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run start")," \uff0c\u60a8\u5c06\u770b\u5230\u7a7a\u6295\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"Current balance is 0 SOL\nAirdropping 1 SOL\nNew balance is 1 SOL\nPublic key: 7Fw3bXskk5eonycvET6BSufxAsuNudvuxF7MMnS8KMqX\n")),(0,r.kt)("p",null,"\u6211\u4eec\u51c6\u5907\u597d\u4e86 rrrrrrrrrrrrumble \ud83e\udd4a"),(0,r.kt)("h2",{id:"-\u8c03\u7528\u94fe\u4e0a\u7a0b\u5e8f"},"\ud83d\uddb1 \u8c03\u7528\u94fe\u4e0a\u7a0b\u5e8f"),(0,r.kt)("p",null,"\u662f\u65f6\u5019\u8ba9\u6211\u4eec\u7684\u5ba2\u6237\u53d1\u6325\u4f5c\u7528\u4e86\u3002\u6211\u4eec\u5c06\u5411Solana\u7f51\u7edc\u4e0a\u7684\u73b0\u6709\u7a0b\u5e8f\u5199\u5165\u6570\u636e\u3002\u4eba\u4eec\u8ba4\u4e3aSolana\u7684\u5f00\u53d1\u53ea\u662f\u5173\u4e8e\u7528Rust\u7f16\u5199\u7a0b\u5e8f\u3002\u4e0d\u5bf9\uff01\u5927\u90e8\u5206\u533a\u5757\u94fe\u5f00\u53d1\u662f\u4e0e\u73b0\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,r.kt)("p",null,"\u4f60\u53ef\u4ee5\u6784\u5efa\u6570\u767e\u4e2a\u53ea\u4e0e\u5df2\u6709\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u7684\u5e94\u7528\u3002\u8fd9\u5c31\u662f\u4e50\u8da3\u5f00\u59cb\u7684\u5730\u65b9\uff01\u6211\u4eec\u4f1a\u4fdd\u6301\u7b80\u5355 - \u6211\u4eec\u7684\u5ba2\u6237\u7aef\u4f1a\u53d1\u9001\u4e00\u4e2a\u8ba1\u6570\u5668\u7a0b\u5e8f\uff0c\u8be5\u7a0b\u5e8f\u4f1a\u9012\u589e\u4e00\u4e2a\u8ba1\u6570\u5668\u3002\u4f60\u5c06\u544a\u8bc9\u7f51\u7edc\u4e0a\u7684\u6bcf\u4e2a\u4eba\u4f60\u662f\u4e00\u4e2a\u5f00\u53d1\u8005\u3002"),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u544a\u8bc9\u5ba2\u6237\u5b83\u5c06\u4e0e\u54ea\u4e9b\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002\u4ece\u9876\u90e8\u5f00\u59cb\uff0c\u5c06\u8fd9\u4e9b\u5730\u5740\u6dfb\u52a0\u5728\u5bfc\u5165\u8bed\u53e5\u7684\u4e0b\u65b9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const PROGRAM_ID = new Web3.PublicKey("ChT1B39WKLS8qUrkLvFDXMhEJ4F1XZzwUNHUt4AU9aVa")\nconst PROGRAM_DATA_PUBLIC_KEY = new Web3.PublicKey("Ah9K7dQ8EHaZqcAsgBW8w37yN2eAy3koFmUn4x3CJtod")\n')),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"PROGRAM_ID")," \u662f",(0,r.kt)("inlineCode",{parentName:"p"},"ping"),"\u7a0b\u5e8f\u672c\u8eab\u7684\u5730\u5740\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"PROGRAM_DATA_PUBLIC_KEY")," \u662f\u5b58\u50a8\u7a0b\u5e8f\u6570\u636e\u7684\u5e10\u6237\u7684\u5730\u5740\u3002\u8bf7\u8bb0\u4f4f - \u53ef\u6267\u884c\u4ee3\u7801\u548c\u72b6\u6001\u6570\u636e\u5355\u72ec\u5b58\u50a8\u5728 Solana \u4e0a\uff01"),(0,r.kt)("p",null,"\u7136\u540e\u6dfb\u52a0\u6b64\u51fd\u6570\u4ee5\u5728\u4efb\u4f55\u5730\u65b9 ",(0,r.kt)("inlineCode",{parentName:"p"},"ping")," \u7a0b\u5e8f\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"async function pingProgram(connection: Web3.Connection, payer: Web3.Keypair) {\n const transaction = new Web3.Transaction()\n const instruction = new Web3.TransactionInstruction({\n // Instructions need 3 things\n\n // 1. The public keys of all the accounts the instruction will read/write\n keys: [\n {\n pubkey: PROGRAM_DATA_PUBLIC_KEY,\n isSigner: false,\n isWritable: true\n }\n ],\n\n // 2. The ID of the program this instruction will be sent to\n programId: PROGRAM_ID\n\n // 3. Data - in this case, there's none!\n })\n\n transaction.add(instruction)\n const transactionSignature = await Web3.sendAndConfirmTransaction(connection, transaction, [payer])\n\n console.log(\n `Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`\n )\n}\n")),(0,r.kt)("p",null,"\u8fd9\u5e76\u4e0d\u50cf\u770b\u8d77\u6765\u90a3\u4e48\u590d\u6742\uff01\u4f60\u5df2\u7ecf\u77e5\u9053\u4e86\u8fd9\u4e00\u90e8\u5206"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u6211\u4eec\u8fdb\u884c\u4e00\u7b14\u4ea4\u6613"),(0,r.kt)("li",{parentName:"ul"},"\u6211\u4eec\u5236\u4f5c\u4e00\u4efd\u6307\u4ee4"),(0,r.kt)("li",{parentName:"ul"},"\u6211\u4eec\u5c06\u6307\u4ee4\u6dfb\u52a0\u5230\u4ea4\u6613\u4e2d"),(0,r.kt)("li",{parentName:"ul"},"\u6211\u4eec\u5c06\u4ea4\u6613\u53d1\u9001\u5230\u7f51\u7edc\uff01")),(0,r.kt)("p",null,"\u67e5\u770b\u4e0a\u9762\u7684\u4ee3\u7801\u6ce8\u91ca - \u6211\u56de\u987e\u4e00\u4e0b\u6307\u4ee4\u7684\u4e09\u4e2a\u90e8\u5206\u3002"),(0,r.kt)("p",null,"\u8fd9\u91cc\u7684\u91cd\u70b9\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"keys")," \u503c - \u5b83\u662f\u4e00\u4e2a\u5305\u542b\u6bcf\u4e2a\u8d26\u6237\u5143\u6570\u636e\u7684\u6570\u7ec4\uff0c\u8fd9\u4e2a\u6307\u4ee4\u5c06\u4ece\u4e2d\u8bfb\u53d6\u6216\u5199\u5165\u3002\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c\u6211\u544a\u8bc9\u4f60\u8fd9\u4e2a\u6307\u4ee4\u5c06\u5904\u7406\u54ea\u4e9b\u8d26\u6237\u3002"),(0,r.kt)("p",null,"\u4f60\u9700\u8981\u77e5\u9053\u8fd9\u5c06\u662f\u4ec0\u4e48 - \u4f60\u53ef\u4ee5\u901a\u8fc7\u9605\u8bfb\u7a0b\u5e8f\u672c\u8eab\u6216\u5176\u6587\u6863\u6765\u4e86\u89e3\u3002\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u4e00\u70b9\uff0c\u5c31\u65e0\u6cd5\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\uff0c\u56e0\u4e3a\u6307\u4ee4\u5c06\u65e0\u6548\u3002\u4f60\u5c06\u53d1\u9001\u4e00\u4e2a\u4f1a\u89e6\u53ca\u6570\u636e\u8d26\u6237\u7684\u4ea4\u6613\uff0c\u4f46\u4f60\u4e0d\u4f1a\u544a\u8bc9\u8fd0\u884c\u65f6\u662f\u54ea\u4e2a\u8d26\u6237\uff0c\u6240\u4ee5\u5b83\u5c06\u88ab\u4e22\u5f03\u3002"),(0,r.kt)("p",null,"\u53ef\u4ee5\u5c06\u5176\u60f3\u8c61\u4e3a\u5c1d\u8bd5\u5f00\u8f66\u524d\u5f80\u6ca1\u6709 GPS \u7684\u5730\u5740\u3002\u60a8\u77e5\u9053\u81ea\u5df1\u60f3\u53bb\u54ea\u91cc\uff0c\u4f46\u4e0d\u77e5\u9053\u5230\u8fbe\u90a3\u91cc\u7684\u8def\u7ebf\u3002"),(0,r.kt)("p",null,"\u7531\u4e8e\u6b64\u5199\u5165\u4e0d\u9700\u8981\u6570\u636e\u5e10\u6237\u7684\u7b7e\u540d\uff0c\u56e0\u6b64\u6211\u4eec\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"isSigner")," \u8bbe\u7f6e\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"false"),"\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"isWritable")," \u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"true"),"\uff0c\u56e0\u4e3a\u8be5\u5e10\u6237\u6b63\u5728\u88ab\u5199\u5165\uff01"),(0,r.kt)("p",null,"\u901a\u8fc7\u544a\u8bc9\u7f51\u7edc\u6211\u4eec\u9700\u8981\u4e0e\u54ea\u4e9b\u5e10\u6237\u4ea4\u4e92\u4ee5\u53ca\u6211\u4eec\u662f\u5426\u6b63\u5728\u5411\u5b83\u4eec\u5199\u5165\u6570\u636e\uff0cSolana \u8fd0\u884c\u65f6\u5c31\u77e5\u9053\u53ef\u4ee5\u5e76\u884c\u8fd0\u884c\u54ea\u4e9b\u4e8b\u52a1\u3002\u8fd9\u5c31\u662f Solana \u5982\u6b64\u4e4b\u5feb\u7684\u90e8\u5206\u539f\u56e0\uff01"),(0,r.kt)("p",null,"\u5c06\u6b64\u51fd\u6570\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"await pingProgram(connection, signer)")," \u6dfb\u52a0\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"main()")," \u5e76\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"npm start")," \u8fd0\u884c\u811a\u672c\u3002\u8bbf\u95ee\u8bb0\u5f55\u7684\u8d44\u6e90\u7ba1\u7406\u5668\u94fe\u63a5\uff0c\u60a8\u5c06\u5728\u9875\u9762\u5e95\u90e8\u770b\u5230\u60a8\u7f16\u5199\u7684\u6570\u636e\uff08\u60a8\u53ef\u4ee5\u5ffd\u7565\u5176\u4ed6\u6240\u6709\u5185\u5bb9\uff09-"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(6245).Z,width:"2284",height:"402"})),(0,r.kt)("p",null,"\u60a8\u521a\u521a\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe\u3002\u90a3\u6709\u591a\u5bb9\u6613\uff1f"),(0,r.kt)("p",null,"\u8fd9\u53ef\u80fd\u770b\u8d77\u6765\u5f88\u7b80\u5355\uff0c\u4f46\u60a8\u786e\u5b9e\u5df2\u7ecf\u53d6\u5f97\u4e86\u6210\u529f\u3002\u5f53\u63a8\u7279\u4e0a\u7684\u6bcf\u4e2a\u4eba\u90fd\u5728\u5927\u558a\u7334\u5b50\u56fe\u7247\u65f6\uff0c\u4f60\u6b63\u5728\u5efa\u9020GGGGGGGGGGGGGGGGGG\u3002\u60a8\u5728\u672c\u8282\u4e2d\u5b66\u5230\u7684\u5185\u5bb9 - \u4ece Solana \u7f51\u7edc\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e\uff0c\u8db3\u4ee5\u5236\u4f5c\u4ef7\u503c 1 \u4e07\u7f8e\u5143\u7684\u4ea7\u54c1\u3002\u60f3\u8c61\u4e00\u4e0b\u5728\u8fd9\u4e2a\u9879\u76ee\u7ed3\u675f\u65f6\u4f60\u80fd\u505a\u4ec0\u4e48 \ud83e\udd18"),(0,r.kt)("h2",{id:"-ship-\u6311\u6218---\u4e00\u79cdsol\u8f6c\u8d26\u811a\u672c"},"\ud83d\udea2 Ship \u6311\u6218 - \u4e00\u79cdSOL\u8f6c\u8d26\u811a\u672c"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u4e00\u8d77\u5b66\u4e60\u4e86\u5982\u4f55\u5c06\u4ea4\u6613\u53d1\u9001\u5230\u7f51\u7edc\uff0c\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u5c1d\u8bd5\u4e86\u3002"),(0,r.kt)("p",null,"\u6309\u7167\u4e0a\u4e00\u6b65\u9aa4\u7684\u7c7b\u4f3c\u6d41\u7a0b\uff0c\u4ece\u5934\u5f00\u59cb\u521b\u5efa\u4e00\u4e2a\u811a\u672c\uff0c\u4f7f\u60a8\u80fd\u591f\u5728Devnet\u4e0a\u5c06SOL\u4ece\u4e00\u4e2a\u8d26\u6237\u8f6c\u79fb\u5230\u53e6\u4e00\u4e2a\u8d26\u6237\u3002\u786e\u4fdd\u6253\u5370\u51fa\u4ea4\u6613\u7b7e\u540d\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u5728Solana Explorer\u4e0a\u67e5\u770b\u3002"),(0,r.kt)("p",null,"\u60f3\u60f3\u5230\u76ee\u524d\u4e3a\u6b62\u4f60\u5b66\u5230\u4e86\u4ec0\u4e48 -"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u5c06\u6570\u636e\u5199\u5165\u7f51\u7edc\u662f\u901a\u8fc7\u4e8b\u52a1\u8fdb\u884c\u7684"),(0,r.kt)("li",{parentName:"ul"},"\u4ea4\u6613\u9700\u8981\u6307\u4ee4"),(0,r.kt)("li",{parentName:"ul"},"\u6307\u4ee4\u544a\u8bc9\u7f51\u7edc\u5b83\u4eec\u89e6\u53ca\u54ea\u4e9b\u7a0b\u5e8f\u4ee5\u53ca\u5b83\u4eec\u7684\u529f\u80fd"),(0,r.kt)("li",{parentName:"ul"},"\u901a\u8fc7\u7cfb\u7edf\u7a0b\u5e8f\u8fdb\u884cSOL\u7684\u8f6c\u79fb\uff08\u55ef\uff0c\u6211\u60f3\u77e5\u9053\u5b83\u53eb\u4ec0\u4e48\u3002\ud83e\udd14 \u8f6c\u79fb\uff1f\uff09")),(0,r.kt)("p",null,"\u60a8\u5728\u8fd9\u91cc\u6240\u9700\u8981\u505a\u7684\u5c31\u662f\u627e\u51fa\u786e\u5207\u7684\u51fd\u6570\u540d\u79f0\u662f\u4ec0\u4e48\u4ee5\u53ca\u6307\u4ee4\u5e94\u8be5\u662f\u4ec0\u4e48\u6837\u5b50\u3002\u6211\u4f1a\u4ece\u8c37\u6b4c\u5f00\u59cb\uff1aP"),(0,r.kt)("p",null,"\u9644\uff1a\u5982\u679c\u60a8\u786e\u5b9a\u5df2\u7ecf\u5f04\u6e05\u695a\u4e86\uff0c\u4f46\u8f6c\u8d26\u4ecd\u7136\u5931\u8d25\uff0c\u5219\u53ef\u80fd\u662f\u60a8\u8f6c\u8d26\u592a\u5c11 - \u5c1d\u8bd5\u81f3\u5c11\u8f6c\u8d26 0.1 SOL\u3002"),(0,r.kt)("p",null,"\u50cf\u5f80\u5e38\u4e00\u6837\uff0c\u5728\u5f15\u7528\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\u4e4b\u524d\u5c1d\u8bd5\u81ea\u5df1\u6267\u884c\u6b64\u64cd\u4f5c\u3002\u5f53\u60a8\u786e\u5b9e\u9700\u8981\u53c2\u8003\u89e3\u51b3\u65b9\u6848\u65f6\uff0c",(0,r.kt)("a",{parentName:"p",href:"https://github.com/RustyCab/solana-send-sol-client"},"\u8bf7\u67e5\u770b\u6b64\u5904"),"\u3002 \ud83d\udc40"))}d.isMDXComponent=!0},6245:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/ping-solana-f389a9d2201cefa02bb91b1abd8d70a4.png"}}]); \ No newline at end of file diff --git a/assets/js/c17a8821.284f6d50.js b/assets/js/c17a8821.284f6d50.js deleted file mode 100644 index 5adc0e0e6..000000000 --- a/assets/js/c17a8821.284f6d50.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6303],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,k=p["".concat(s,".").concat(d)]||p[d]||u[d]||o;return t?a.createElement(k,l(l({ref:n},m),{},{components:t})):a.createElement(k,l({ref:n},m))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=d;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[p]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:43,sidebar_label:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",sidebar_class_name:"green"},l="\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",i={unversionedId:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README",id:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README",title:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u6210\u529f\u521b\u5efa\u4e86\u4ee3\u5e01\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFT\uff09\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u521b\u5efa\u6211\u4eec\u7684\u94f8\u5e01\u7528\u6237\u754c\u9762\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u76f4\u89c2\u5730\u4e0e\u667a\u80fd\u5408\u7ea6\u8fdb\u884c\u4ea4\u4e92\uff0c\u5e76\u5141\u8bb8\u5176\u4ed6\u4eba\u5728\u6211\u4eec\u7684\u6d4f\u89c8\u5668\u4e0a\u94f8\u9020\u6211\u4eec\u7684NFT\uff01\u8fd9\u4e0d\u662f\u5f88\u9177\u5417\uff1f\u5982\u679c\u4f60\u6ce8\u610f\u5230\uff0c\u4f60\u7684\u7f51\u7ad9\u76ee\u524d\u6709\u4e00\u4e2a minting \u6309\u94ae\uff0c\u4f46\u5b83\u8fd8\u6ca1\u6709\u4efb\u4f55\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u51fd\u6570\u5f00\u59cb\uff0c\u5e76\u6dfb\u52a0\u4e00\u4e9b\u903b\u8f91\uff0c\u4ee5\u5141\u8bb8\u6211\u4eec\u94f8\u9020\u6211\u4eec\u7684NFT\u3002\u5982\u679c\u4f60\u6ca1\u6709\u8d77\u59cb\u4ee3\u7801\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u91cc\u514b\u9686\u5b83\u3002",source:"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README.md",sourceDirName:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui",slug:"/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README.md",tags:[],version:"current",sidebarPosition:43,frontMatter:{sidebar_position:43,sidebar_label:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/"},next:{title:"Module3",permalink:"/docs/Solana-Co-Learn/module3/"}},s={},c=[{value:"\ud83d\udee0\ufe0f\u5c0f\u4fee\u590d",id:"\ufe0f\u5c0f\u4fee\u590d",level:2}],m={toc:c},p="wrapper";function u(e){let{components:n,...o}=e;return(0,r.kt)(p,(0,a.Z)({},m,o,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762"},"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u6210\u529f\u521b\u5efa\u4e86\u4ee3\u5e01\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFT\uff09\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u521b\u5efa\u6211\u4eec\u7684\u94f8\u5e01\u7528\u6237\u754c\u9762\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u76f4\u89c2\u5730\u4e0e\u667a\u80fd\u5408\u7ea6\u8fdb\u884c\u4ea4\u4e92\uff0c\u5e76\u5141\u8bb8\u5176\u4ed6\u4eba\u5728\u6211\u4eec\u7684\u6d4f\u89c8\u5668\u4e0a\u94f8\u9020\u6211\u4eec\u7684NFT\uff01\u8fd9\u4e0d\u662f\u5f88\u9177\u5417\uff1f\u5982\u679c\u4f60\u6ce8\u610f\u5230\uff0c\u4f60\u7684\u7f51\u7ad9\u76ee\u524d\u6709\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"minting")," \u6309\u94ae\uff0c\u4f46\u5b83\u8fd8\u6ca1\u6709\u4efb\u4f55\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u51fd\u6570\u5f00\u59cb\uff0c\u5e76\u6dfb\u52a0\u4e00\u4e9b\u903b\u8f91\uff0c\u4ee5\u5141\u8bb8\u6211\u4eec\u94f8\u9020\u6211\u4eec\u7684NFT\u3002\u5982\u679c\u4f60\u6ca1\u6709\u8d77\u59cb\u4ee3\u7801\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u91cc",(0,r.kt)("a",{parentName:"p",href:"https://github.com/buildspace/buildspace-buildoors/tree/solution-core-2-candy-machine"},"\u514b\u9686"),"\u5b83\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\uff0c\u8ba9\u6211\u4eec\u5f00\u59cb\u5c06\u4ee5\u4e0b\u4ee3\u7801\u884c\u6dfb\u52a0\u5230\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"newMint.tsx")," \u4e2d\u3002\u6ce8\u610f\uff1a\u4e0d\u8981\u76f2\u76ee\u590d\u5236\u7c98\u8d34\u4ee3\u7801\u3002\u6211\u53ea\u5305\u542b\u4e86\u5fc5\u8981\u7684\u90e8\u5206\uff0c\u60a8\u5e94\u8be5\u5f04\u6e05\u695a\u8fd9\u4e9b\u4ee3\u7801\u5e94\u8be5\u653e\u5728\u54ea\u91cc\u3002\u63d0\u793a\uff1a\u5e94\u8be5\u653e\u5728\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"Container")," \u5143\u7d20\u4e0b\u65b9\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// REST OF YOUR CODE\nimport { Button, Text, HStack } from "@chakra-ui/react";\nimport { MouseEventHandler, useCallback } from "react";\nimport { ArrowForwardIcon } from "@chakra-ui/icons";\n\nconst Home: NextPage = () => {\n const handleClick: MouseEventHandler = useCallback(\n async (event) => {},\n []\n );\n\n return (\n \n {/* REST OF YOUR CODE */}\n \n \n \n stake my buildoor\n \n \n \n \n );\n};\n')),(0,r.kt)("p",null,"\u4e00\u65e6\u5b8c\u6210\uff0c\u6211\u4eec\u53ef\u4ee5\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Connected.tsx")," \u5e76\u6dfb\u52a0\u4e00\u4e9b\u4ee3\u7801\u3002\u5c31\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"handleClick")," \u51fd\u6570\u7684\u4e0a\u65b9\uff0c\u6211\u4eec\u53ef\u4ee5\u6dfb\u52a0\u8fd9\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"const router = useRouter()")," \u3002\u8bb0\u5f97\u5728\u4e0a\u65b9\u5bfc\u5165",(0,r.kt)("inlineCode",{parentName:"p"},"useRouter"),"\u51fd\u6570\u3002\u63a5\u4e0b\u6765\uff0c\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"handleClick")," \u51fd\u6570\u4e2d\u6dfb\u52a0 ",(0,r.kt)("inlineCode",{parentName:"p"},'router.push("/newMint")')," \u3002\u73b0\u5728\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const handleClick: MouseEventHandler = useCallback(\n async (event) => {\n if (event.defaultPrevented) return;\n if (!walletAdapter.connected || !candyMachine) return;\n\n try {\n setIsMinting(true);\n const nft = await metaplex\n .candyMachinesV2()\n .mint({ candyMachine });\n\n console.log(nft);\n router.push(`/newMint?mint=${nft.nft.address.toBase58()}`);\n } catch (error) {\n alert(error);\n } finally {\n setIsMinting(false);\n }\n },\n [metaplex, walletAdapter, candyMachine]\n);\n")),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u5e94\u8be5\u80fd\u591f\u70b9\u51fb ",(0,r.kt)("inlineCode",{parentName:"p"},"stake my buildoor")," \u6309\u94ae\uff0c\u7136\u540e\u4f1a\u63d0\u793a\u4f60\u4ece\u4f60\u7684\u5e7d\u7075\u94b1\u5305\u4e2d\u6279\u51c6\u4ea4\u6613\u3002\u7136\u800c\uff0c\u4f60\u53ef\u80fd\u4f1a\u6ce8\u610f\u5230\u4e00\u65e6\u4f60\u6210\u529f\u6279\u51c6\u4e86\u4ea4\u6613\uff0c\u9875\u9762\u4f1a\u5237\u65b0\u5e76\u5bfc\u81f4\u4f60\u7684\u94b1\u5305\u88ab\u767b\u51fa\u3002\u4e0d\u8981\u62c5\u5fc3\uff0c\u5728\u4e0b\u4e00\u8282\u4e2d\u6211\u4eec\u4f1a\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002"),(0,r.kt)("p",null,"\u8bf7\u524d\u5f80 ",(0,r.kt)("inlineCode",{parentName:"p"},"newMint.tsx")," \u3002\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u5c06\u6b64\u4ee3\u7801\u6dfb\u52a0\u5230\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"Home")," \u51fd\u6570\u4e4b\u4e0a\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { PublicKey } from "@solana/web3.js";\n\ninterface NewMintProps {\n mint: PublicKey;\n}\n')),(0,r.kt)("p",null,"\u4e00\u65e6\u5b8c\u6210\uff0c\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// REST OF YOUR CODE\nimport { PublicKey } from "@solana/web3.js";\nimport { Metaplex, walletAdapterIdentity } from "@metaplex-foundation/js";\n\ninterface NewMintProps {\n mint: PublicKey;\n}\n\nconst Home: NextPage = ({ mint }) => {\n const [metadata, setMetadata] = useState()\n const { connection } = useConnection()\n const walletAdapter = useWallet()\n const metaplex = useMemo(() => {\n return Metaplex.make(connection).use(walletAdapterIdentity(walletAdapter))\n }, [connection, walletAdapter])\n\n useEffect(() => {\n // What this does is to allow us to find the NFT object\n // based on the given mint address\n metaplex.nfts().findByMint({ mintAddress: new PublicKey(mint) })\n .then((nft) => {\n // We then fetch the NFT uri to fetch the NFT metadata\n fetch(nft.uri)\n .then((res) => res.json())\n .then((metadata) => {\n setMetadata(metadata)\n })\n })\n }, [mint, metaplex, walletAdapter])\n\n // REST OF YOUR CODE\n};\n')),(0,r.kt)("p",null,"\u6ce8\u610f\u5230\u6211\u4eec\u5728\u4e0a\u9762\u7684\u51fd\u6570\u4e2d\u5982\u4f55\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"setMetadata(metadata)")," \u4e86\u5417\uff1f\u8fd9\u662f\u4e3a\u4e86\u8ba9\u6211\u4eec\u80fd\u591f\u5c06\u5143\u6570\u636e\u5bf9\u8c61\u8bbe\u7f6e\u5230\u72b6\u6001\u4e2d\uff0c\u4ee5\u4fbf\u6211\u4eec\u53ef\u4ee5\u7528\u5b83\u6765\u6e32\u67d3\u56fe\u7247\u3002\u73b0\u5728\u8ba9\u6211\u4eec\u5728\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"Image")," \u5143\u7d20\u4e2d\u8c03\u7528\u8fd9\u4e2a\u5bf9\u8c61\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'\n')),(0,r.kt)("p",null,"\u6211\u4eec\u5feb\u5230\u4e86\u3002\u5982\u679c\u4f60\u73b0\u5728\u5c1d\u8bd5\u94f8\u9020\u4e00\u4e2a\u65b0\u7684NFT\uff0c\u4f60\u4f1a\u6ce8\u610f\u5230\u7f51\u7ad9\u4f1a\u629b\u51fa\u4e00\u4e2a\u9519\u8bef\uff0c\u8bf4\u5b83\u65e0\u6cd5\u8bfb\u53d6\u672a\u5b9a\u4e49\u7684\u5c5e\u6027\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5728\u5e95\u90e8\u6dfb\u52a0\u51e0\u884c\u4ee3\u7801\u6765\u4fee\u590d\u8fd9\u4e2a\u95ee\u9898\u3002\u5c31\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"export default NewMint")," \u7a0d\u5fae\u4e0a\u9762\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'NewMint.getInitialProps = async ({ query }) => {\n const { mint } = query;\n if (!mint) throw { error: "No mint" };\n\n try {\n const mintPubkey = new PublicKey(mint);\n return { mint: mintPubkey };\n } catch {\n throws({ error: "Invalid mint" });\n }\n};\n\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff01\u73b0\u5728\u4f60\u5df2\u7ecf\u6dfb\u52a0\u4e86\u6240\u6709\u5fc5\u8981\u7684\u4ee3\u7801\uff0c\u4f60\u5e94\u8be5\u80fd\u591f\u94f8\u9020\u4e00\u4e2aNFT\uff0c\u5e76\u4e14\u80fd\u591f\u770b\u5230\u90a3\u5f20\u56fe\u7247\u3002\u8fd9\u662f\u6211\u7684\u6837\u5b50\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7759).Z,width:"611",height:"554"})),(0,r.kt)("h2",{id:"\ufe0f\u5c0f\u4fee\u590d"},"\ud83d\udee0\ufe0f\u5c0f\u4fee\u590d"),(0,r.kt)("p",null,"\u8bf7\u6ce8\u610f\u7f51\u7ad9\u672a\u80fd\u51c6\u786e\u663e\u793a\u5185\u5bb9\uff0c\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u6211\u4eec\u9700\u8981\u524d\u5f80 ",(0,r.kt)("inlineCode",{parentName:"p"},"WalletContextProvider.tsx")," \u5e76\u4fee\u6539\u4e00\u4e9b\u4ee3\u7801\u3002"),(0,r.kt)("p",null,"\u6539\u53d8"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const phantom = new PhantomWalletAdapter();\n")),(0,r.kt)("p",null,"to"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const phantom = useMemo(() => new PhantomWalletAdapter(), []);\n")),(0,r.kt)("p",null,"\u6211\u4eec\u8fd8\u9700\u8981\u7ed9\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"autoConnect")," \u6dfb\u52a0\u4e00\u4e2a\u5c5e\u6027\u3002\u5c31\u50cf\u8fd9\u6837\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"\n {children}\n\n")),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"useMemo")," \u7684\u539f\u56e0\u662f\u4e3a\u4e86\u9632\u6b62\u94b1\u5305\u9002\u914d\u5668\u88ab\u591a\u6b21\u6784\u5efa\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://reactjs.org/docs/hooks-reference.html#usememo?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u4e86\u89e3\u66f4\u591a\u5173\u4e8euseMemo\u7684\u4fe1\u606f\u3002"))}u.isMDXComponent=!0},7759:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/mint-nft-displayt-33954807227ec79f4bc440dfe8a94591.png"}}]); \ No newline at end of file diff --git a/assets/js/c17a8821.5ce9b118.js b/assets/js/c17a8821.5ce9b118.js new file mode 100644 index 000000000..3daff502c --- /dev/null +++ b/assets/js/c17a8821.5ce9b118.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6303],{3905:(e,n,t)=>{t.d(n,{Zo:()=>m,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},m=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),p=c(t),d=r,k=p["".concat(s,".").concat(d)]||p[d]||u[d]||o;return t?a.createElement(k,l(l({ref:n},m),{},{components:t})):a.createElement(k,l({ref:n},m))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=d;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[p]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:43,sidebar_label:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",sidebar_class_name:"green"},l="\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",i={unversionedId:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README",id:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README",title:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u6210\u529f\u521b\u5efa\u4e86\u4ee3\u5e01\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFT\uff09\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u521b\u5efa\u6211\u4eec\u7684\u94f8\u5e01\u7528\u6237\u754c\u9762\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u76f4\u89c2\u5730\u4e0e\u667a\u80fd\u5408\u7ea6\u8fdb\u884c\u4ea4\u4e92\uff0c\u5e76\u5141\u8bb8\u5176\u4ed6\u4eba\u5728\u6211\u4eec\u7684\u6d4f\u89c8\u5668\u4e0a\u94f8\u9020\u6211\u4eec\u7684NFT\uff01\u8fd9\u4e0d\u662f\u5f88\u9177\u5417\uff1f\u5982\u679c\u4f60\u6ce8\u610f\u5230\uff0c\u4f60\u7684\u7f51\u7ad9\u76ee\u524d\u6709\u4e00\u4e2a minting \u6309\u94ae\uff0c\u4f46\u5b83\u8fd8\u6ca1\u6709\u4efb\u4f55\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u51fd\u6570\u5f00\u59cb\uff0c\u5e76\u6dfb\u52a0\u4e00\u4e9b\u903b\u8f91\uff0c\u4ee5\u5141\u8bb8\u6211\u4eec\u94f8\u9020\u6211\u4eec\u7684NFT\u3002\u5982\u679c\u4f60\u6ca1\u6709\u8d77\u59cb\u4ee3\u7801\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u91cc\u514b\u9686\u5b83\u3002",source:"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README.md",sourceDirName:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui",slug:"/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README.md",tags:[],version:"current",sidebarPosition:43,frontMatter:{sidebar_position:43,sidebar_label:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/"},next:{title:"Module3",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/"}},s={},c=[{value:"\ud83d\udee0\ufe0f\u5c0f\u4fee\u590d",id:"\ufe0f\u5c0f\u4fee\u590d",level:2}],m={toc:c},p="wrapper";function u(e){let{components:n,...o}=e;return(0,r.kt)(p,(0,a.Z)({},m,o,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762"},"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u6210\u529f\u521b\u5efa\u4e86\u4ee3\u5e01\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\uff08NFT\uff09\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u521b\u5efa\u6211\u4eec\u7684\u94f8\u5e01\u7528\u6237\u754c\u9762\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u76f4\u89c2\u5730\u4e0e\u667a\u80fd\u5408\u7ea6\u8fdb\u884c\u4ea4\u4e92\uff0c\u5e76\u5141\u8bb8\u5176\u4ed6\u4eba\u5728\u6211\u4eec\u7684\u6d4f\u89c8\u5668\u4e0a\u94f8\u9020\u6211\u4eec\u7684NFT\uff01\u8fd9\u4e0d\u662f\u5f88\u9177\u5417\uff1f\u5982\u679c\u4f60\u6ce8\u610f\u5230\uff0c\u4f60\u7684\u7f51\u7ad9\u76ee\u524d\u6709\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"minting")," \u6309\u94ae\uff0c\u4f46\u5b83\u8fd8\u6ca1\u6709\u4efb\u4f55\u529f\u80fd\u3002\u8ba9\u6211\u4eec\u4ece\u521b\u5efa\u4e00\u4e2a\u51fd\u6570\u5f00\u59cb\uff0c\u5e76\u6dfb\u52a0\u4e00\u4e9b\u903b\u8f91\uff0c\u4ee5\u5141\u8bb8\u6211\u4eec\u94f8\u9020\u6211\u4eec\u7684NFT\u3002\u5982\u679c\u4f60\u6ca1\u6709\u8d77\u59cb\u4ee3\u7801\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u91cc",(0,r.kt)("a",{parentName:"p",href:"https://github.com/buildspace/buildspace-buildoors/tree/solution-core-2-candy-machine"},"\u514b\u9686"),"\u5b83\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\uff0c\u8ba9\u6211\u4eec\u5f00\u59cb\u5c06\u4ee5\u4e0b\u4ee3\u7801\u884c\u6dfb\u52a0\u5230\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"newMint.tsx")," \u4e2d\u3002\u6ce8\u610f\uff1a\u4e0d\u8981\u76f2\u76ee\u590d\u5236\u7c98\u8d34\u4ee3\u7801\u3002\u6211\u53ea\u5305\u542b\u4e86\u5fc5\u8981\u7684\u90e8\u5206\uff0c\u60a8\u5e94\u8be5\u5f04\u6e05\u695a\u8fd9\u4e9b\u4ee3\u7801\u5e94\u8be5\u653e\u5728\u54ea\u91cc\u3002\u63d0\u793a\uff1a\u5e94\u8be5\u653e\u5728\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"Container")," \u5143\u7d20\u4e0b\u65b9\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// REST OF YOUR CODE\nimport { Button, Text, HStack } from "@chakra-ui/react";\nimport { MouseEventHandler, useCallback } from "react";\nimport { ArrowForwardIcon } from "@chakra-ui/icons";\n\nconst Home: NextPage = () => {\n const handleClick: MouseEventHandler = useCallback(\n async (event) => {},\n []\n );\n\n return (\n \n {/* REST OF YOUR CODE */}\n \n \n \n stake my buildoor\n \n \n \n \n );\n};\n')),(0,r.kt)("p",null,"\u4e00\u65e6\u5b8c\u6210\uff0c\u6211\u4eec\u53ef\u4ee5\u8f6c\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Connected.tsx")," \u5e76\u6dfb\u52a0\u4e00\u4e9b\u4ee3\u7801\u3002\u5c31\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"handleClick")," \u51fd\u6570\u7684\u4e0a\u65b9\uff0c\u6211\u4eec\u53ef\u4ee5\u6dfb\u52a0\u8fd9\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"const router = useRouter()")," \u3002\u8bb0\u5f97\u5728\u4e0a\u65b9\u5bfc\u5165",(0,r.kt)("inlineCode",{parentName:"p"},"useRouter"),"\u51fd\u6570\u3002\u63a5\u4e0b\u6765\uff0c\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"handleClick")," \u51fd\u6570\u4e2d\u6dfb\u52a0 ",(0,r.kt)("inlineCode",{parentName:"p"},'router.push("/newMint")')," \u3002\u73b0\u5728\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const handleClick: MouseEventHandler = useCallback(\n async (event) => {\n if (event.defaultPrevented) return;\n if (!walletAdapter.connected || !candyMachine) return;\n\n try {\n setIsMinting(true);\n const nft = await metaplex\n .candyMachinesV2()\n .mint({ candyMachine });\n\n console.log(nft);\n router.push(`/newMint?mint=${nft.nft.address.toBase58()}`);\n } catch (error) {\n alert(error);\n } finally {\n setIsMinting(false);\n }\n },\n [metaplex, walletAdapter, candyMachine]\n);\n")),(0,r.kt)("p",null,"\u73b0\u5728\u4f60\u5e94\u8be5\u80fd\u591f\u70b9\u51fb ",(0,r.kt)("inlineCode",{parentName:"p"},"stake my buildoor")," \u6309\u94ae\uff0c\u7136\u540e\u4f1a\u63d0\u793a\u4f60\u4ece\u4f60\u7684\u5e7d\u7075\u94b1\u5305\u4e2d\u6279\u51c6\u4ea4\u6613\u3002\u7136\u800c\uff0c\u4f60\u53ef\u80fd\u4f1a\u6ce8\u610f\u5230\u4e00\u65e6\u4f60\u6210\u529f\u6279\u51c6\u4e86\u4ea4\u6613\uff0c\u9875\u9762\u4f1a\u5237\u65b0\u5e76\u5bfc\u81f4\u4f60\u7684\u94b1\u5305\u88ab\u767b\u51fa\u3002\u4e0d\u8981\u62c5\u5fc3\uff0c\u5728\u4e0b\u4e00\u8282\u4e2d\u6211\u4eec\u4f1a\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002"),(0,r.kt)("p",null,"\u8bf7\u524d\u5f80 ",(0,r.kt)("inlineCode",{parentName:"p"},"newMint.tsx")," \u3002\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u754c\u9762\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u5c06\u6b64\u4ee3\u7801\u6dfb\u52a0\u5230\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"Home")," \u51fd\u6570\u4e4b\u4e0a\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { PublicKey } from "@solana/web3.js";\n\ninterface NewMintProps {\n mint: PublicKey;\n}\n')),(0,r.kt)("p",null,"\u4e00\u65e6\u5b8c\u6210\uff0c\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// REST OF YOUR CODE\nimport { PublicKey } from "@solana/web3.js";\nimport { Metaplex, walletAdapterIdentity } from "@metaplex-foundation/js";\n\ninterface NewMintProps {\n mint: PublicKey;\n}\n\nconst Home: NextPage = ({ mint }) => {\n const [metadata, setMetadata] = useState()\n const { connection } = useConnection()\n const walletAdapter = useWallet()\n const metaplex = useMemo(() => {\n return Metaplex.make(connection).use(walletAdapterIdentity(walletAdapter))\n }, [connection, walletAdapter])\n\n useEffect(() => {\n // What this does is to allow us to find the NFT object\n // based on the given mint address\n metaplex.nfts().findByMint({ mintAddress: new PublicKey(mint) })\n .then((nft) => {\n // We then fetch the NFT uri to fetch the NFT metadata\n fetch(nft.uri)\n .then((res) => res.json())\n .then((metadata) => {\n setMetadata(metadata)\n })\n })\n }, [mint, metaplex, walletAdapter])\n\n // REST OF YOUR CODE\n};\n')),(0,r.kt)("p",null,"\u6ce8\u610f\u5230\u6211\u4eec\u5728\u4e0a\u9762\u7684\u51fd\u6570\u4e2d\u5982\u4f55\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"setMetadata(metadata)")," \u4e86\u5417\uff1f\u8fd9\u662f\u4e3a\u4e86\u8ba9\u6211\u4eec\u80fd\u591f\u5c06\u5143\u6570\u636e\u5bf9\u8c61\u8bbe\u7f6e\u5230\u72b6\u6001\u4e2d\uff0c\u4ee5\u4fbf\u6211\u4eec\u53ef\u4ee5\u7528\u5b83\u6765\u6e32\u67d3\u56fe\u7247\u3002\u73b0\u5728\u8ba9\u6211\u4eec\u5728\u6211\u4eec\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"Image")," \u5143\u7d20\u4e2d\u8c03\u7528\u8fd9\u4e2a\u5bf9\u8c61\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'\n')),(0,r.kt)("p",null,"\u6211\u4eec\u5feb\u5230\u4e86\u3002\u5982\u679c\u4f60\u73b0\u5728\u5c1d\u8bd5\u94f8\u9020\u4e00\u4e2a\u65b0\u7684NFT\uff0c\u4f60\u4f1a\u6ce8\u610f\u5230\u7f51\u7ad9\u4f1a\u629b\u51fa\u4e00\u4e2a\u9519\u8bef\uff0c\u8bf4\u5b83\u65e0\u6cd5\u8bfb\u53d6\u672a\u5b9a\u4e49\u7684\u5c5e\u6027\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5728\u5e95\u90e8\u6dfb\u52a0\u51e0\u884c\u4ee3\u7801\u6765\u4fee\u590d\u8fd9\u4e2a\u95ee\u9898\u3002\u5c31\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"export default NewMint")," \u7a0d\u5fae\u4e0a\u9762\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'NewMint.getInitialProps = async ({ query }) => {\n const { mint } = query;\n if (!mint) throw { error: "No mint" };\n\n try {\n const mintPubkey = new PublicKey(mint);\n return { mint: mintPubkey };\n } catch {\n throws({ error: "Invalid mint" });\n }\n};\n\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff01\u73b0\u5728\u4f60\u5df2\u7ecf\u6dfb\u52a0\u4e86\u6240\u6709\u5fc5\u8981\u7684\u4ee3\u7801\uff0c\u4f60\u5e94\u8be5\u80fd\u591f\u94f8\u9020\u4e00\u4e2aNFT\uff0c\u5e76\u4e14\u80fd\u591f\u770b\u5230\u90a3\u5f20\u56fe\u7247\u3002\u8fd9\u662f\u6211\u7684\u6837\u5b50\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7759).Z,width:"611",height:"554"})),(0,r.kt)("h2",{id:"\ufe0f\u5c0f\u4fee\u590d"},"\ud83d\udee0\ufe0f\u5c0f\u4fee\u590d"),(0,r.kt)("p",null,"\u8bf7\u6ce8\u610f\u7f51\u7ad9\u672a\u80fd\u51c6\u786e\u663e\u793a\u5185\u5bb9\uff0c\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u6211\u4eec\u9700\u8981\u524d\u5f80 ",(0,r.kt)("inlineCode",{parentName:"p"},"WalletContextProvider.tsx")," \u5e76\u4fee\u6539\u4e00\u4e9b\u4ee3\u7801\u3002"),(0,r.kt)("p",null,"\u6539\u53d8"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const phantom = new PhantomWalletAdapter();\n")),(0,r.kt)("p",null,"to"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const phantom = useMemo(() => new PhantomWalletAdapter(), []);\n")),(0,r.kt)("p",null,"\u6211\u4eec\u8fd8\u9700\u8981\u7ed9\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"autoConnect")," \u6dfb\u52a0\u4e00\u4e2a\u5c5e\u6027\u3002\u5c31\u50cf\u8fd9\u6837\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"\n {children}\n\n")),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"useMemo")," \u7684\u539f\u56e0\u662f\u4e3a\u4e86\u9632\u6b62\u94b1\u5305\u9002\u914d\u5668\u88ab\u591a\u6b21\u6784\u5efa\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://reactjs.org/docs/hooks-reference.html#usememo?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u4e86\u89e3\u66f4\u591a\u5173\u4e8euseMemo\u7684\u4fe1\u606f\u3002"))}u.isMDXComponent=!0},7759:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/mint-nft-displayt-33954807227ec79f4bc440dfe8a94591.png"}}]); \ No newline at end of file diff --git a/assets/js/cad25036.6173d1b8.js b/assets/js/cad25036.6173d1b8.js deleted file mode 100644 index 736cc1dad..000000000 --- a/assets/js/cad25036.6173d1b8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7974],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),s=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=s(e.components);return a.createElement(c.Provider,{value:n},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=s(t),m=r,k=d["".concat(c,".").concat(m)]||d[m]||u[m]||o;return t?a.createElement(k,l(l({ref:n},p),{},{components:t})):a.createElement(k,l({ref:n},p))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=m;var i={};for(var c in n)hasOwnProperty.call(n,c)&&(i[c]=n[c]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var s=2;s{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:24,sidebar_label:"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",sidebar_class_name:"green"},l="\ud83d\udcbb \u6784\u5efa NFT \u94f8\u5e01\u8005\u524d\u7aef",i={unversionedId:"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README",id:"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README",title:"\ud83d\udcbb \u6784\u5efa NFT \u94f8\u5e01\u8005\u524d\u7aef",description:"\u6b22\u8fce\u6765\u5230\u4f60\u7684\u7b2c\u4e00\u5468\u7684SHIPPING\u3002\u6bcf\u5468\u4f60\u90fd\u4f1a\u6709\u4e00\u4e2a\u4e13\u95e8\u7684\u90e8\u5206\uff0c\u5c06\u4f60\u7684\u5b66\u4e60\u6210\u679c\u5e94\u7528\u5230\u4f60\u7684\u5b9a\u5236NFT\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u8fd8\u6709\u6218\u5229\u54c1\u7bb1\u5b50\uff01",source:"@site/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README.md",sourceDirName:"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end",slug:"/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/",permalink:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README.md",tags:[],version:"current",sidebarPosition:24,frontMatter:{sidebar_position:24,sidebar_label:"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",permalink:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/"},next:{title:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",permalink:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/"}},c={},s=[{value:"\ud83d\udd78 \u8bbe\u7f6e\u9879\u76ee",id:"-\u8bbe\u7f6e\u9879\u76ee",level:2},{value:"\u2728 \u8bbe\u7f6e Chakra UI",id:"-\u8bbe\u7f6e-chakra-ui",level:2},{value:"\ud83c\udf36 \u6dfb\u52a0\u4e00\u4e9b\u6837\u5f0f",id:"-\u6dfb\u52a0\u4e00\u4e9b\u6837\u5f0f",level:2},{value:"\ud83c\udfab \u6dfb\u52a0\u5bfc\u822a\u680f",id:"-\u6dfb\u52a0\u5bfc\u822a\u680f",level:2},{value:"\ud83c\udfe0 \u521b\u5efa\u767b\u9646\u9875\u9762",id:"-\u521b\u5efa\u767b\u9646\u9875\u9762",level:2},{value:"\ud83d\udd0c \u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305",id:"-\u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305",level:2},{value:"\ud83c\udf87 \u521b\u5efa\u8fde\u63a5\u89c6\u56fe",id:"-\u521b\u5efa\u8fde\u63a5\u89c6\u56fe",level:2}],p={toc:s},d="wrapper";function u(e){let{components:n,...o}=e;return(0,r.kt)(d,(0,a.Z)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u6784\u5efa-nft-\u94f8\u5e01\u8005\u524d\u7aef"},"\ud83d\udcbb \u6784\u5efa NFT \u94f8\u5e01\u8005\u524d\u7aef"),(0,r.kt)("p",null,"\u6b22\u8fce\u6765\u5230\u4f60\u7684\u7b2c\u4e00\u5468\u7684SHIPPING\u3002\u6bcf\u5468\u4f60\u90fd\u4f1a\u6709\u4e00\u4e2a\u4e13\u95e8\u7684\u90e8\u5206\uff0c\u5c06\u4f60\u7684\u5b66\u4e60\u6210\u679c\u5e94\u7528\u5230\u4f60\u7684\u5b9a\u5236NFT\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u8fd8\u6709\u6218\u5229\u54c1\u7bb1\u5b50\uff01"),(0,r.kt)("p",null,"\u8fd9\u4e9b\u90e8\u5206\u7684\u6574\u4e2a\u76ee\u7684\u662f\u8ba9\u4f60\u79bb\u5f00\u672c\u5730\u4e3b\u673a\uff0c\u6784\u5efa\u4e00\u4e9b\u771f\u5b9e\u7684\u4e1c\u897f\uff0c\u4f9b\u4ed6\u4eba\u4f7f\u7528\u3002\u4e4b\u524d\u7684\u6240\u6709\u6784\u5efa\u8005\u90fd\u901a\u8fc7\u5c06\u4ed6\u4eec\u7684\u4f5c\u54c1\u516c\u4e4b\u4e8e\u4f17\u5e76\u5728\u516c\u5f00\u573a\u5408\u8fdb\u884c\u6784\u5efa\u800c\u53d6\u5f97\u4e86\u5de8\u5927\u7684\u6210\u529f\u3002\u8fd9\u5c31\u662f\u4f60\u4e00\u76f4\u5728\u51c6\u5907\u7684\u65f6\u523b\u2014\u2014\u8ba9\u6211\u4eec\u5f00\u59cb\u5427\ud83e\udd18\u3002"),(0,r.kt)("p",null,"\u4eca\u5929\u6211\u4eec\u5c06\u4ece\u524d\u7aef\u5f00\u59cb\u5236\u4f5c\u8fd9\u4e9b\u5149\u6ed1\u7684\u767b\u9646\u548c\u8584\u8377\u9875\u9762\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7476).Z,width:"1920",height:"1080"})),(0,r.kt)("p",null,"\u7b2c\u4e00\u4e2a\u5c4f\u5e55\u4e0a\u552f\u4e00\u7684\u529f\u80fd\u662f\u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u5c4f\u5e55\u9876\u90e8\u7684\u6309\u94ae\u6216\u4e2d\u95f4\u7684\u6309\u94ae\u6765\u5b8c\u6210\u6b64\u64cd\u4f5c\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(2607).Z,width:"1920",height:"1080"})),(0,r.kt)("p",null,"\u7b2c\u4e8c\u4e2a\u5c4f\u5e55\u529f\u80fd\u5c06\u5728\u4e0b\u4e00\u4e2a\u6838\u5fc3\u9879\u76ee\u4e2d\u5b9e\u73b0\uff0c\u56e0\u6b64\u65e0\u9700\u4e3a\u201cmint buildoor\u201d\u6309\u94ae\u5b9e\u73b0\u4efb\u4f55\u5185\u5bb9\u3002"),(0,r.kt)("h2",{id:"-\u8bbe\u7f6e\u9879\u76ee"},"\ud83d\udd78 \u8bbe\u7f6e\u9879\u76ee"),(0,r.kt)("p",null,"\u6211\u4eec\u4ece\u5934\u5f00\u59cb\uff0c\u8fd9\u6b21\u6ca1\u6709\u6a21\u677f\uff01\u8bbe\u7f6e\u4e00\u4e2a\u65b0\u7684 Next.js \u5e94\u7528\u7a0b\u5e8f\u5e76\u5411\u5176\u4e2d\u6dfb\u52a0 Chakra UI\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npx create-next-app --typescript\ncd \nnpm i @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^6 @chakra-ui/icons\nnpm i @solana/wallet-adapter-base @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-wallets @solana/web3.js\n")),(0,r.kt)("p",null,"\u6ce8\u610f\uff1a\u5728\u6574\u4e2a\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u5c06\u4f7f\u7528 Typescript\uff01\u5982\u679c\u60a8\u613f\u610f\uff0c\u6211\u4eec\u975e\u5e38\u6b22\u8fce\u60a8\u4f7f\u7528\u666e\u901a\u7684 Javascript :)\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u8981\u6c42\u5b89\u88c5 ",(0,r.kt)("inlineCode",{parentName:"p"},"create-next-app")," \uff0c\u8bf7\u8bf4\u201c\u662f\u201d\u3002\u60a8\u53ef\u4ee5\u4e3a\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u547d\u540d\u4efb\u4f55\u60a8\u60f3\u8981\u7684\u540d\u79f0\uff0c\u6211\u5c06\u6211\u7684\u5e94\u7528\u7a0b\u5e8f\u547d\u540d\u4e3a\u6784\u5efa\u5668\uff0c\u54c8\u54c8\u3002"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\u60a8\u60f3\u8981\u6dfb\u52a0\u4e00\u4e9b\u8d44\u4ea7\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://cdn.disco.co/media%2FAssets_a68f5cab-20c9-45c7-b25c-43bc9dcd9e7d.zip?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u8d2d\u4e70\uff0c\u4e5f\u53ef\u4ee5\u81ea\u5df1\u5236\u4f5c\u3002\u60a8\u5c06\u770b\u5230\u4e94\u4e2a\u201c\u5934\u50cf\u201d\u6587\u4ef6\u548c\u4e00\u4e2a\u80cc\u666f svg\u3002\u5c06\u5b83\u4eec\u653e\u5165\u516c\u5171\u6587\u4ef6\u5939\u4e2d\u3002"),(0,r.kt)("h2",{id:"-\u8bbe\u7f6e-chakra-ui"},"\u2728 \u8bbe\u7f6e Chakra UI"),(0,r.kt)("p",null,"\u7b2c\u4e00\u4e2a\u4efb\u52a1\u662f\u8bbe\u7f6e Chakra UI\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u5fc5\u624b\u52a8\u7f16\u5199\u5927\u91cf CSS\u3002\u6211\u4eec\u5c06\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"pages/_app.tsx")," \u4e2d\u6267\u884c\u6b64\u64cd\u4f5c\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import type { AppProps } from "next/app"\nimport { ChakraProvider } from "@chakra-ui/react"\n\nimport { extendTheme } from "@chakra-ui/react"\n\nconst colors = {\n background: "#1F1F1F",\n accent: "#833BBE",\n bodyText: "rgba(255, 255, 255, 0.75)",\n}\n\nconst theme = extendTheme({ colors })\n\nfunction MyApp({ Component, pageProps }: AppProps) {\n return (\n \n \n \n )\n}\n\nexport default MyApp\n')),(0,r.kt)("p",null,"\u6211\u8981\u4e3a\u6211\u7684\u4e00\u4e9b\u5b9a\u5236\u989c\u8272\uff0c\u8bf7\u786e\u4fdd\u60a8\u6309\u7167\u81ea\u5df1\u7684\u559c\u597d\u6765\u8c03\u5473\uff01"),(0,r.kt)("h2",{id:"-\u6dfb\u52a0\u4e00\u4e9b\u6837\u5f0f"},"\ud83c\udf36 \u6dfb\u52a0\u4e00\u4e9b\u6837\u5f0f"),(0,r.kt)("p",null,"\u6253\u5f00 ",(0,r.kt)("inlineCode",{parentName:"p"},"styles/Home.module.css")," \u5e76\u4f7f\u5176\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-css"},".container {\n background: #1F1F1F;\n}\n.wallet-adapter-button-trigger {\n background-color: #833BBE;\n}\n")),(0,r.kt)("p",null,"\u5982\u679c\u6837\u5f0f\u6587\u4ef6\u5939\u4e2d\u6709 ",(0,r.kt)("inlineCode",{parentName:"p"},"globals.css")," \u6587\u4ef6\uff0c\u8bf7\u5c06\u5176\u5220\u9664\u3002\u6211\u4eec\u4e0d\u4f1a\u9700\u8981\u5b83\uff01"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\u6211\u4eec\u6709 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.tsx")," \uff0c\u6211\u4eec\u5c06\u66f4\u65b0\u5bfc\u5165\u4ee5\u4f7f\u7528 Chakra UI \u5e76\u6e32\u67d3\uff08\u5355\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"
{\n\n return (\n
\n \n Buildoors\n \n \n \n\n \n \n { /* NavBar */ }\n\n \n
\n { /* If connected, the second view, otherwise the first */ }\n
\n \n\n
\n \n \n built with @_buildspace\n \n \n
\n
\n \n
\n )\n}\n\nexport default Home\n')),(0,r.kt)("h2",{id:"-\u6dfb\u52a0\u5bfc\u822a\u680f"},"\ud83c\udfab \u6dfb\u52a0\u5bfc\u822a\u680f"),(0,r.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u6765\u6784\u5efa ",(0,r.kt)("inlineCode",{parentName:"p"},"NavBar")," \u3002\u521b\u5efa\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"components")," \u6587\u4ef6\u5939\u5e76\u6dfb\u52a0\u4e00\u4e2a\u65b0\u6587\u4ef6 ",(0,r.kt)("inlineCode",{parentName:"p"},"NavBar.tsx")," \u3002\u6211\u4eec\u5c06\u5176\u6784\u5efa\u4e3a\u4e00\u4e2a\u6c34\u5e73\u5806\u6808\uff0c\u5176\u4e2d\u5305\u62ec\u4e00\u4e2a\u95f4\u9694\u5668\u548c\u4e00\u4e2a\u7528\u4e8e\u8fde\u63a5\u94b1\u5305\u7684\u6309\u94ae\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { HStack, Spacer } from "@chakra-ui/react"\nimport { FC } from "react"\nimport styles from "../styles/Home.module.css"\nimport dynamic from "next/dynamic";\n\nconst WalletMultiButtonDynamic = dynamic(\n async () =>\n (await import("@solana/wallet-adapter-react-ui")).WalletMultiButton,\n { ssr: false }\n);\n\nconst NavBar: FC = () => {\n return (\n \n \n \n \n )\n}\n\nexport default NavBar\n')),(0,r.kt)("p",null,"\u6211\u4eec\u6709 ",(0,r.kt)("inlineCode",{parentName:"p"},'import dynamic from "next/dynamic"')," \u4ece ",(0,r.kt)("inlineCode",{parentName:"p"},"@solana/wallet-adapter-react-ui")," \u52a8\u6001\u5bfc\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"WalletMultiButton")," \u5e76\u5c06\u5176\u5206\u914d\u7ed9 ",(0,r.kt)("inlineCode",{parentName:"p"},"WalletMultiButtonDynamic")," \uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const WalletMultiButtonDynamic = dynamic(\n async () =>\n (await import("@solana/wallet-adapter-react-ui")).WalletMultiButton,\n { ssr: false }\n);\n')),(0,r.kt)("p",null,"\u8fd9\u662f\u56e0\u4e3a NextJS \u662f\u670d\u52a1\u5668\u7aef\u6e32\u67d3\uff0c\u5728\u52a0\u8f7d\u5230\u5ba2\u6237\u7aef\u4e4b\u524d\u65e0\u6cd5\u8bbf\u95ee\u4f9d\u8d56\u4e8e\u6d4f\u89c8\u5668 API\uff08\u5982 window \uff09\u7684\u5916\u90e8\u4f9d\u8d56\u9879\u6216\u7ec4\u4ef6\u3002\u8fd9\u610f\u5473\u7740 NextJS \u65e0\u6cd5\u4e0e\u53ea\u80fd\u5728\u6d4f\u89c8\u5668\u4e0a\u4f7f\u7528\u7684\u94b1\u5305\u8fdb\u884c\u4ea4\u4e92\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"{ ssr: false }")," \u7981\u7528\u5bfc\u5165\u7684\u670d\u52a1\u5668\u6e32\u67d3\u3002\u5982\u679c\u60a8\u7684\u6a21\u5757\u4e0d\u4f7f\u7528\u52a8\u6001\u5bfc\u5165\uff0c\u60a8\u5f88\u53ef\u80fd\u4f1a\u9047\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Hydration failed because the initial UI does not match what was rendered on the server "),"\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://nextjs.org/docs/advanced-features/dynamic-import?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u9605\u8bfb\u6709\u5173\u52a8\u6001\u5bfc\u5165\u7684\u66f4\u591a\u4fe1\u606f\uff01"),(0,r.kt)("p",null,"\u8fd4\u56de\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.tsx")," \uff0c\u5bfc\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"NavBar")," \u5e76\u5c06\u5176\u653e\u5728\u5806\u6808\u9876\u90e8\uff08\u6211\u7559\u4e0b\u4e86\u5173\u4e8e\u5b83\u5e94\u8be5\u5728\u54ea\u91cc\u7684\u8bc4\u8bba\uff09\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// Existing imports\nimport NavBar from "../components/NavBar"\n\nconst Home: NextPage = () => {\n\n return (\n
\n \n\n \n \n { /* NavBar */ }\n \n\n// Rest of the file remains the same\n')),(0,r.kt)("p",null,"\u6b64\u65f6\uff0c\u9664\u4e86\u201c",(0,r.kt)("inlineCode",{parentName:"p"},"Connect Wallet"),"\u201d\u4e4b\u5916\uff0c\u60a8\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u4e0a\u4ecd\u7136\u6ca1\u6709\u4efb\u4f55\u5185\u5bb9\u3002\u8ba9\u6211\u4eec\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002"),(0,r.kt)("h2",{id:"-\u521b\u5efa\u767b\u9646\u9875\u9762"},"\ud83c\udfe0 \u521b\u5efa\u767b\u9646\u9875\u9762"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"components")," \u6587\u4ef6\u5939\u4e2d\u521b\u5efa ",(0,r.kt)("inlineCode",{parentName:"p"},"Disconnected.tsx")," \u6587\u4ef6\u5e76\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { FC, MouseEventHandler, useCallback } from "react"\nimport {\n Button,\n Container,\n Heading,\n HStack,\n Text,\n VStack,\n} from "@chakra-ui/react"\nimport { ArrowForwardIcon } from "@chakra-ui/icons"\n\nconst Disconnected: FC = () => {\n\n const handleClick: MouseEventHandler = useCallback(\n (event) => {\n if (event.defaultPrevented) {\n return\n }\n },\n []\n )\n\n return (\n \n \n \n Mint your buildoor. Earn $BLD. Level up.\n \n \n \n become a buildoor\n \n \n \n \n \n )\n}\n\nexport default Disconnected\n')),(0,r.kt)("p",null,"\u8fd9\u5c06\u662f\u6211\u4eec\u7684\u767b\u9646\u9875\u9762 - \u7528\u6237\u8bbf\u95ee\u7f51\u7ad9\u65f6\u9996\u5148\u770b\u5230\u7684\u89c6\u56fe\u3002\u60a8\u9700\u8981\u5c06\u5176\u5bfc\u5165\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.tsx")," \u4e2d\uff0c\u5e76\u5c06\u5176\u653e\u7f6e\u5728\u6e32\u67d3\u7ec4\u4ef6\u7684\u4e2d\u95f4\uff08\u518d\u6b21\u67e5\u627e\u6ce8\u91ca\uff09\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// Existing imports\nimport Disconnected from \'../components/Disconnected\'\n\nconst Home: NextPage = () => {\n\n return (\n
\n \n\n \n \n { /* NavBar */ }\n \n\n \n
\n \n
\n \n\n// Rest of the file remains the same\n')),(0,r.kt)("p",null,"\u73b0\u5728\uff0c\u5982\u679c\u60a8\u67e5\u770b ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \uff0c\u60a8\u5e94\u8be5\u4f1a\u770b\u5230\u5e26\u6709\u201c\u6210\u4e3a buildoor\u201d\u6309\u94ae\u7684\u767b\u5f55\u9875\u9762\u3002\u5982\u679c\u4f60\u70b9\u51fb\u5b83\uff0c\u4ec0\u4e48\u4e5f\u4e0d\u4f1a\u53d1\u751f\u3002\u6211\u4eec\u4e0d\u559c\u6b22\u4ec0\u4e48\u90fd\u6ca1\u6709\u53d1\u751f\uff0c\u8ba9\u6211\u4eec\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff01"),(0,r.kt)("h2",{id:"-\u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305"},"\ud83d\udd0c \u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305"),(0,r.kt)("p",null,"\u6211\u4eec\u8fd9\u91cc\u9700\u8981\u5f88\u591a\u94a9\u5b50\u3002\u8ba9\u6211\u4eec\u628a\u5b83\u4eec\u5e26\u8fdb\u6765\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm i @solana/wallet-adapter-base @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-wallets @solana/web3.js\n")),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u6b63\u5728\u4e3a\u7279\u5b9a\u7684\u94b1\u5305\u8fdb\u884c\u6784\u5efa\uff0c\u90a3\u4e48\u60a8\u53ef\u4ee5\u5728\u6b64\u5904\u8fdb\u884c\u66f4\u6539\uff0c\u6211\u53ea\u662f\u575a\u6301\u4f7f\u7528\u9ed8\u8ba4\u503c\uff1aD"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"components")," \u4e2d\u521b\u5efa\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"WalletContextProvider.tsx")," \uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u6240\u6709\u8fd9\u4e9b\u6837\u677f\u6587\u4ef6\u653e\u5165\u5176\u4e2d\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { FC, ReactNode } from "react"\nimport {\n ConnectionProvider,\n WalletProvider,\n} from "@solana/wallet-adapter-react"\nimport { WalletModalProvider } from "@solana/wallet-adapter-react-ui"\nimport { clusterApiUrl } from "@solana/web3.js"\nimport { PhantomWalletAdapter } from "@solana/wallet-adapter-wallets"\nimport { useMemo } from "react"\nrequire("@solana/wallet-adapter-react-ui/styles.css")\n\nconst WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => {\n const url = useMemo(() => clusterApiUrl("devnet"), [])\n const phantom = new PhantomWalletAdapter()\n\n return (\n \n \n {children}\n \n \n )\n}\n\nexport default WalletContextProvider\n')),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u5c06\u5176\u5bfc\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"_app.tsx")," \uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"import WalletContextProvider from '../components/WalletContextProvider'\n\n\n \n \n \n\n")),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u8fd8\u5e0c\u671b\u201c\u6210\u4e3a\u5efa\u9020\u8005\u201d\u6309\u94ae\u4e5f\u80fd\u4e0e\u60a8\u8054\u7cfb\u3002\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"Disconnected.tsx")," \u4e2d\uff0c\u6dfb\u52a0\u8fd9\u4e9b\u5bfc\u5165"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { useWalletModal } from "@solana/wallet-adapter-react-ui"\nimport { useWallet } from "@solana/wallet-adapter-react"\n')),(0,r.kt)("p",null,"\u7136\u540e\u5728\u6e32\u67d3\u4e4b\u524d\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"Disconnected")," \u7684\u4e3b\u4f53\u66f4\u65b0\u4e3a\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const modalState = useWalletModal()\n const { wallet, connect } = useWallet()\n\n const handleClick: MouseEventHandler = useCallback(\n (event) => {\n if (event.defaultPrevented) {\n return\n }\n\n if (!wallet) {\n modalState.setVisible(true)\n } else {\n connect().catch(() => {})\n }\n },\n [wallet, connect, modalState]\n )\n")),(0,r.kt)("p",null,"\u77a7\uff0c\u60a8\u5e94\u8be5\u80fd\u591f\u8fde\u63a5\u4e86\uff01"),(0,r.kt)("h2",{id:"-\u521b\u5efa\u8fde\u63a5\u89c6\u56fe"},"\ud83c\udf87 \u521b\u5efa\u8fde\u63a5\u89c6\u56fe"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u8fde\u63a5\u4e86\uff0c\u6211\u4eec\u9700\u8981\u66f4\u65b0\u89c6\u56fe\u4ee5\u663e\u793a\u8fde\u63a5\u65f6\u7684\u6837\u5b50\u3002\u8ba9\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"components")," \u76ee\u5f55\u4e2d\u521b\u5efa\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"Connected.tsx")," \u6587\u4ef6"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { FC } from "react"\nimport {\n Button,\n Container,\n Heading,\n HStack,\n Text,\n VStack,\n Image,\n} from "@chakra-ui/react"\nimport { ArrowForwardIcon } from "@chakra-ui/icons"\n\nconst Connected: FC = () => {\n return (\n \n \n \n \n Welcome Buildoor.\n \n\n \n Each buildoor is randomly generated and can be staked to receive\n $BLD Use your $BLD to\n upgrade your buildoor and receive perks within the community!\n \n \n \n\n \n \n \n \n \n \n \n\n \n \n )\n}\n\nexport default Connected\n')),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5fc5\u987b\u627e\u5230\u4e00\u79cd\u65b9\u6cd5\u5c06\u5176\u663e\u793a\u5728\u5c4f\u5e55\u4e0a\u3002\u56de\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.tsx")," \uff0c\u8ba9\u6211\u4eec\u6dfb\u52a0\u4e24\u4e2a\u5bfc\u5165\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { useWallet } from "@solana/wallet-adapter-react"\nimport Connected from "../components/Connected"\n')),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"useWallet")," hooks\u6765\u8bbf\u95ee\u4e00\u4e2a\u53d8\u91cf\uff0c\u544a\u8bc9\u6211\u4eec\u662f\u5426\u5df2\u8fde\u63a5\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u6709\u6761\u4ef6\u5730\u6e32\u67d3 ",(0,r.kt)("inlineCode",{parentName:"p"},"Connected")," \u4e0e ",(0,r.kt)("inlineCode",{parentName:"p"},"Disconnected")," \u89c6\u56fe\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const Home: NextPage = () => {\n const { connected } = useWallet()\n\n return (\n
\n \n Buildoors\n \n \n \n\n \n \n \n\n \n
{connected ? : }
\n \n')),(0,r.kt)("p",null,"\u597d\u4e86\uff0c\u6211\u4eec\u641e\u5b9a\u4e86\uff01\u6211\u4eec\u5df2\u7ecf\u8bbe\u7f6e\u597d\u4e86\u524d\u7aef\uff0c\u5e76\u4e14\u6b63\u5728\u987a\u5229\u5730\u8fdb\u884cbuildoors\u7684\u94f8\u9020\u3002"))}u.isMDXComponent=!0},7476:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_1-a5e067d38b19e18cc941d361976de374.png"},2607:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_2-2b41371884be7e2293ea1e308419c827.png"}}]); \ No newline at end of file diff --git a/assets/js/cad25036.a31a2d76.js b/assets/js/cad25036.a31a2d76.js new file mode 100644 index 000000000..d07e62ec2 --- /dev/null +++ b/assets/js/cad25036.a31a2d76.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7974],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var c=a.createContext({}),s=function(e){var n=a.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},p=function(e){var n=s(e.components);return a.createElement(c.Provider,{value:n},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),d=s(t),m=r,k=d["".concat(c,".").concat(m)]||d[m]||u[m]||o;return t?a.createElement(k,l(l({ref:n},p),{},{components:t})):a.createElement(k,l({ref:n},p))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,l=new Array(o);l[0]=m;var i={};for(var c in n)hasOwnProperty.call(n,c)&&(i[c]=n[c]);i.originalType=e,i[d]="string"==typeof e?e:r,l[1]=i;for(var s=2;s{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:24,sidebar_label:"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",sidebar_class_name:"green"},l="\ud83d\udcbb \u6784\u5efa NFT \u94f8\u5e01\u8005\u524d\u7aef",i={unversionedId:"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README",id:"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README",title:"\ud83d\udcbb \u6784\u5efa NFT \u94f8\u5e01\u8005\u524d\u7aef",description:"\u6b22\u8fce\u6765\u5230\u4f60\u7684\u7b2c\u4e00\u5468\u7684SHIPPING\u3002\u6bcf\u5468\u4f60\u90fd\u4f1a\u6709\u4e00\u4e2a\u4e13\u95e8\u7684\u90e8\u5206\uff0c\u5c06\u4f60\u7684\u5b66\u4e60\u6210\u679c\u5e94\u7528\u5230\u4f60\u7684\u5b9a\u5236NFT\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u8fd8\u6709\u6218\u5229\u54c1\u7bb1\u5b50\uff01",source:"@site/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README.md",sourceDirName:"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end",slug:"/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README.md",tags:[],version:"current",sidebarPosition:24,frontMatter:{sidebar_position:24,sidebar_label:"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/"},next:{title:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/"}},c={},s=[{value:"\ud83d\udd78 \u8bbe\u7f6e\u9879\u76ee",id:"-\u8bbe\u7f6e\u9879\u76ee",level:2},{value:"\u2728 \u8bbe\u7f6e Chakra UI",id:"-\u8bbe\u7f6e-chakra-ui",level:2},{value:"\ud83c\udf36 \u6dfb\u52a0\u4e00\u4e9b\u6837\u5f0f",id:"-\u6dfb\u52a0\u4e00\u4e9b\u6837\u5f0f",level:2},{value:"\ud83c\udfab \u6dfb\u52a0\u5bfc\u822a\u680f",id:"-\u6dfb\u52a0\u5bfc\u822a\u680f",level:2},{value:"\ud83c\udfe0 \u521b\u5efa\u767b\u9646\u9875\u9762",id:"-\u521b\u5efa\u767b\u9646\u9875\u9762",level:2},{value:"\ud83d\udd0c \u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305",id:"-\u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305",level:2},{value:"\ud83c\udf87 \u521b\u5efa\u8fde\u63a5\u89c6\u56fe",id:"-\u521b\u5efa\u8fde\u63a5\u89c6\u56fe",level:2}],p={toc:s},d="wrapper";function u(e){let{components:n,...o}=e;return(0,r.kt)(d,(0,a.Z)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u6784\u5efa-nft-\u94f8\u5e01\u8005\u524d\u7aef"},"\ud83d\udcbb \u6784\u5efa NFT \u94f8\u5e01\u8005\u524d\u7aef"),(0,r.kt)("p",null,"\u6b22\u8fce\u6765\u5230\u4f60\u7684\u7b2c\u4e00\u5468\u7684SHIPPING\u3002\u6bcf\u5468\u4f60\u90fd\u4f1a\u6709\u4e00\u4e2a\u4e13\u95e8\u7684\u90e8\u5206\uff0c\u5c06\u4f60\u7684\u5b66\u4e60\u6210\u679c\u5e94\u7528\u5230\u4f60\u7684\u5b9a\u5236NFT\u8d28\u62bc\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u8fd8\u6709\u6218\u5229\u54c1\u7bb1\u5b50\uff01"),(0,r.kt)("p",null,"\u8fd9\u4e9b\u90e8\u5206\u7684\u6574\u4e2a\u76ee\u7684\u662f\u8ba9\u4f60\u79bb\u5f00\u672c\u5730\u4e3b\u673a\uff0c\u6784\u5efa\u4e00\u4e9b\u771f\u5b9e\u7684\u4e1c\u897f\uff0c\u4f9b\u4ed6\u4eba\u4f7f\u7528\u3002\u4e4b\u524d\u7684\u6240\u6709\u6784\u5efa\u8005\u90fd\u901a\u8fc7\u5c06\u4ed6\u4eec\u7684\u4f5c\u54c1\u516c\u4e4b\u4e8e\u4f17\u5e76\u5728\u516c\u5f00\u573a\u5408\u8fdb\u884c\u6784\u5efa\u800c\u53d6\u5f97\u4e86\u5de8\u5927\u7684\u6210\u529f\u3002\u8fd9\u5c31\u662f\u4f60\u4e00\u76f4\u5728\u51c6\u5907\u7684\u65f6\u523b\u2014\u2014\u8ba9\u6211\u4eec\u5f00\u59cb\u5427\ud83e\udd18\u3002"),(0,r.kt)("p",null,"\u4eca\u5929\u6211\u4eec\u5c06\u4ece\u524d\u7aef\u5f00\u59cb\u5236\u4f5c\u8fd9\u4e9b\u5149\u6ed1\u7684\u767b\u9646\u548c\u8584\u8377\u9875\u9762\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7476).Z,width:"1920",height:"1080"})),(0,r.kt)("p",null,"\u7b2c\u4e00\u4e2a\u5c4f\u5e55\u4e0a\u552f\u4e00\u7684\u529f\u80fd\u662f\u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u5c4f\u5e55\u9876\u90e8\u7684\u6309\u94ae\u6216\u4e2d\u95f4\u7684\u6309\u94ae\u6765\u5b8c\u6210\u6b64\u64cd\u4f5c\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(2607).Z,width:"1920",height:"1080"})),(0,r.kt)("p",null,"\u7b2c\u4e8c\u4e2a\u5c4f\u5e55\u529f\u80fd\u5c06\u5728\u4e0b\u4e00\u4e2a\u6838\u5fc3\u9879\u76ee\u4e2d\u5b9e\u73b0\uff0c\u56e0\u6b64\u65e0\u9700\u4e3a\u201cmint buildoor\u201d\u6309\u94ae\u5b9e\u73b0\u4efb\u4f55\u5185\u5bb9\u3002"),(0,r.kt)("h2",{id:"-\u8bbe\u7f6e\u9879\u76ee"},"\ud83d\udd78 \u8bbe\u7f6e\u9879\u76ee"),(0,r.kt)("p",null,"\u6211\u4eec\u4ece\u5934\u5f00\u59cb\uff0c\u8fd9\u6b21\u6ca1\u6709\u6a21\u677f\uff01\u8bbe\u7f6e\u4e00\u4e2a\u65b0\u7684 Next.js \u5e94\u7528\u7a0b\u5e8f\u5e76\u5411\u5176\u4e2d\u6dfb\u52a0 Chakra UI\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npx create-next-app --typescript\ncd \nnpm i @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^6 @chakra-ui/icons\nnpm i @solana/wallet-adapter-base @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-wallets @solana/web3.js\n")),(0,r.kt)("p",null,"\u6ce8\u610f\uff1a\u5728\u6574\u4e2a\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u5c06\u4f7f\u7528 Typescript\uff01\u5982\u679c\u60a8\u613f\u610f\uff0c\u6211\u4eec\u975e\u5e38\u6b22\u8fce\u60a8\u4f7f\u7528\u666e\u901a\u7684 Javascript :)\u3002"),(0,r.kt)("p",null,"\u5982\u679c\u8981\u6c42\u5b89\u88c5 ",(0,r.kt)("inlineCode",{parentName:"p"},"create-next-app")," \uff0c\u8bf7\u8bf4\u201c\u662f\u201d\u3002\u60a8\u53ef\u4ee5\u4e3a\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u547d\u540d\u4efb\u4f55\u60a8\u60f3\u8981\u7684\u540d\u79f0\uff0c\u6211\u5c06\u6211\u7684\u5e94\u7528\u7a0b\u5e8f\u547d\u540d\u4e3a\u6784\u5efa\u5668\uff0c\u54c8\u54c8\u3002"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\u60a8\u60f3\u8981\u6dfb\u52a0\u4e00\u4e9b\u8d44\u4ea7\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://cdn.disco.co/media%2FAssets_a68f5cab-20c9-45c7-b25c-43bc9dcd9e7d.zip?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u8d2d\u4e70\uff0c\u4e5f\u53ef\u4ee5\u81ea\u5df1\u5236\u4f5c\u3002\u60a8\u5c06\u770b\u5230\u4e94\u4e2a\u201c\u5934\u50cf\u201d\u6587\u4ef6\u548c\u4e00\u4e2a\u80cc\u666f svg\u3002\u5c06\u5b83\u4eec\u653e\u5165\u516c\u5171\u6587\u4ef6\u5939\u4e2d\u3002"),(0,r.kt)("h2",{id:"-\u8bbe\u7f6e-chakra-ui"},"\u2728 \u8bbe\u7f6e Chakra UI"),(0,r.kt)("p",null,"\u7b2c\u4e00\u4e2a\u4efb\u52a1\u662f\u8bbe\u7f6e Chakra UI\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u4e0d\u5fc5\u624b\u52a8\u7f16\u5199\u5927\u91cf CSS\u3002\u6211\u4eec\u5c06\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"pages/_app.tsx")," \u4e2d\u6267\u884c\u6b64\u64cd\u4f5c\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import type { AppProps } from "next/app"\nimport { ChakraProvider } from "@chakra-ui/react"\n\nimport { extendTheme } from "@chakra-ui/react"\n\nconst colors = {\n background: "#1F1F1F",\n accent: "#833BBE",\n bodyText: "rgba(255, 255, 255, 0.75)",\n}\n\nconst theme = extendTheme({ colors })\n\nfunction MyApp({ Component, pageProps }: AppProps) {\n return (\n \n \n \n )\n}\n\nexport default MyApp\n')),(0,r.kt)("p",null,"\u6211\u8981\u4e3a\u6211\u7684\u4e00\u4e9b\u5b9a\u5236\u989c\u8272\uff0c\u8bf7\u786e\u4fdd\u60a8\u6309\u7167\u81ea\u5df1\u7684\u559c\u597d\u6765\u8c03\u5473\uff01"),(0,r.kt)("h2",{id:"-\u6dfb\u52a0\u4e00\u4e9b\u6837\u5f0f"},"\ud83c\udf36 \u6dfb\u52a0\u4e00\u4e9b\u6837\u5f0f"),(0,r.kt)("p",null,"\u6253\u5f00 ",(0,r.kt)("inlineCode",{parentName:"p"},"styles/Home.module.css")," \u5e76\u4f7f\u5176\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-css"},".container {\n background: #1F1F1F;\n}\n.wallet-adapter-button-trigger {\n background-color: #833BBE;\n}\n")),(0,r.kt)("p",null,"\u5982\u679c\u6837\u5f0f\u6587\u4ef6\u5939\u4e2d\u6709 ",(0,r.kt)("inlineCode",{parentName:"p"},"globals.css")," \u6587\u4ef6\uff0c\u8bf7\u5c06\u5176\u5220\u9664\u3002\u6211\u4eec\u4e0d\u4f1a\u9700\u8981\u5b83\uff01"),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\u6211\u4eec\u6709 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.tsx")," \uff0c\u6211\u4eec\u5c06\u66f4\u65b0\u5bfc\u5165\u4ee5\u4f7f\u7528 Chakra UI \u5e76\u6e32\u67d3\uff08\u5355\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"
{\n\n return (\n
\n \n Buildoors\n \n \n \n\n \n \n { /* NavBar */ }\n\n \n
\n { /* If connected, the second view, otherwise the first */ }\n
\n \n\n
\n \n \n built with @_buildspace\n \n \n
\n
\n \n
\n )\n}\n\nexport default Home\n')),(0,r.kt)("h2",{id:"-\u6dfb\u52a0\u5bfc\u822a\u680f"},"\ud83c\udfab \u6dfb\u52a0\u5bfc\u822a\u680f"),(0,r.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u6765\u6784\u5efa ",(0,r.kt)("inlineCode",{parentName:"p"},"NavBar")," \u3002\u521b\u5efa\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"components")," \u6587\u4ef6\u5939\u5e76\u6dfb\u52a0\u4e00\u4e2a\u65b0\u6587\u4ef6 ",(0,r.kt)("inlineCode",{parentName:"p"},"NavBar.tsx")," \u3002\u6211\u4eec\u5c06\u5176\u6784\u5efa\u4e3a\u4e00\u4e2a\u6c34\u5e73\u5806\u6808\uff0c\u5176\u4e2d\u5305\u62ec\u4e00\u4e2a\u95f4\u9694\u5668\u548c\u4e00\u4e2a\u7528\u4e8e\u8fde\u63a5\u94b1\u5305\u7684\u6309\u94ae\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { HStack, Spacer } from "@chakra-ui/react"\nimport { FC } from "react"\nimport styles from "../styles/Home.module.css"\nimport dynamic from "next/dynamic";\n\nconst WalletMultiButtonDynamic = dynamic(\n async () =>\n (await import("@solana/wallet-adapter-react-ui")).WalletMultiButton,\n { ssr: false }\n);\n\nconst NavBar: FC = () => {\n return (\n \n \n \n \n )\n}\n\nexport default NavBar\n')),(0,r.kt)("p",null,"\u6211\u4eec\u6709 ",(0,r.kt)("inlineCode",{parentName:"p"},'import dynamic from "next/dynamic"')," \u4ece ",(0,r.kt)("inlineCode",{parentName:"p"},"@solana/wallet-adapter-react-ui")," \u52a8\u6001\u5bfc\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"WalletMultiButton")," \u5e76\u5c06\u5176\u5206\u914d\u7ed9 ",(0,r.kt)("inlineCode",{parentName:"p"},"WalletMultiButtonDynamic")," \uff0c\u5982\u4e0b\u6240\u793a\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const WalletMultiButtonDynamic = dynamic(\n async () =>\n (await import("@solana/wallet-adapter-react-ui")).WalletMultiButton,\n { ssr: false }\n);\n')),(0,r.kt)("p",null,"\u8fd9\u662f\u56e0\u4e3a NextJS \u662f\u670d\u52a1\u5668\u7aef\u6e32\u67d3\uff0c\u5728\u52a0\u8f7d\u5230\u5ba2\u6237\u7aef\u4e4b\u524d\u65e0\u6cd5\u8bbf\u95ee\u4f9d\u8d56\u4e8e\u6d4f\u89c8\u5668 API\uff08\u5982 window \uff09\u7684\u5916\u90e8\u4f9d\u8d56\u9879\u6216\u7ec4\u4ef6\u3002\u8fd9\u610f\u5473\u7740 NextJS \u65e0\u6cd5\u4e0e\u53ea\u80fd\u5728\u6d4f\u89c8\u5668\u4e0a\u4f7f\u7528\u7684\u94b1\u5305\u8fdb\u884c\u4ea4\u4e92\u3002 ",(0,r.kt)("inlineCode",{parentName:"p"},"{ ssr: false }")," \u7981\u7528\u5bfc\u5165\u7684\u670d\u52a1\u5668\u6e32\u67d3\u3002\u5982\u679c\u60a8\u7684\u6a21\u5757\u4e0d\u4f7f\u7528\u52a8\u6001\u5bfc\u5165\uff0c\u60a8\u5f88\u53ef\u80fd\u4f1a\u9047\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"Hydration failed because the initial UI does not match what was rendered on the server "),"\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://nextjs.org/docs/advanced-features/dynamic-import?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u9605\u8bfb\u6709\u5173\u52a8\u6001\u5bfc\u5165\u7684\u66f4\u591a\u4fe1\u606f\uff01"),(0,r.kt)("p",null,"\u8fd4\u56de\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.tsx")," \uff0c\u5bfc\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"NavBar")," \u5e76\u5c06\u5176\u653e\u5728\u5806\u6808\u9876\u90e8\uff08\u6211\u7559\u4e0b\u4e86\u5173\u4e8e\u5b83\u5e94\u8be5\u5728\u54ea\u91cc\u7684\u8bc4\u8bba\uff09\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// Existing imports\nimport NavBar from "../components/NavBar"\n\nconst Home: NextPage = () => {\n\n return (\n
\n \n\n \n \n { /* NavBar */ }\n \n\n// Rest of the file remains the same\n')),(0,r.kt)("p",null,"\u6b64\u65f6\uff0c\u9664\u4e86\u201c",(0,r.kt)("inlineCode",{parentName:"p"},"Connect Wallet"),"\u201d\u4e4b\u5916\uff0c\u60a8\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u4e0a\u4ecd\u7136\u6ca1\u6709\u4efb\u4f55\u5185\u5bb9\u3002\u8ba9\u6211\u4eec\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002"),(0,r.kt)("h2",{id:"-\u521b\u5efa\u767b\u9646\u9875\u9762"},"\ud83c\udfe0 \u521b\u5efa\u767b\u9646\u9875\u9762"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"components")," \u6587\u4ef6\u5939\u4e2d\u521b\u5efa ",(0,r.kt)("inlineCode",{parentName:"p"},"Disconnected.tsx")," \u6587\u4ef6\u5e76\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { FC, MouseEventHandler, useCallback } from "react"\nimport {\n Button,\n Container,\n Heading,\n HStack,\n Text,\n VStack,\n} from "@chakra-ui/react"\nimport { ArrowForwardIcon } from "@chakra-ui/icons"\n\nconst Disconnected: FC = () => {\n\n const handleClick: MouseEventHandler = useCallback(\n (event) => {\n if (event.defaultPrevented) {\n return\n }\n },\n []\n )\n\n return (\n \n \n \n Mint your buildoor. Earn $BLD. Level up.\n \n \n \n become a buildoor\n \n \n \n \n \n )\n}\n\nexport default Disconnected\n')),(0,r.kt)("p",null,"\u8fd9\u5c06\u662f\u6211\u4eec\u7684\u767b\u9646\u9875\u9762 - \u7528\u6237\u8bbf\u95ee\u7f51\u7ad9\u65f6\u9996\u5148\u770b\u5230\u7684\u89c6\u56fe\u3002\u60a8\u9700\u8981\u5c06\u5176\u5bfc\u5165\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.tsx")," \u4e2d\uff0c\u5e76\u5c06\u5176\u653e\u7f6e\u5728\u6e32\u67d3\u7ec4\u4ef6\u7684\u4e2d\u95f4\uff08\u518d\u6b21\u67e5\u627e\u6ce8\u91ca\uff09\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// Existing imports\nimport Disconnected from \'../components/Disconnected\'\n\nconst Home: NextPage = () => {\n\n return (\n
\n \n\n \n \n { /* NavBar */ }\n \n\n \n
\n \n
\n \n\n// Rest of the file remains the same\n')),(0,r.kt)("p",null,"\u73b0\u5728\uff0c\u5982\u679c\u60a8\u67e5\u770b ",(0,r.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \uff0c\u60a8\u5e94\u8be5\u4f1a\u770b\u5230\u5e26\u6709\u201c\u6210\u4e3a buildoor\u201d\u6309\u94ae\u7684\u767b\u5f55\u9875\u9762\u3002\u5982\u679c\u4f60\u70b9\u51fb\u5b83\uff0c\u4ec0\u4e48\u4e5f\u4e0d\u4f1a\u53d1\u751f\u3002\u6211\u4eec\u4e0d\u559c\u6b22\u4ec0\u4e48\u90fd\u6ca1\u6709\u53d1\u751f\uff0c\u8ba9\u6211\u4eec\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff01"),(0,r.kt)("h2",{id:"-\u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305"},"\ud83d\udd0c \u8fde\u63a5\u5230\u7528\u6237\u7684\u94b1\u5305"),(0,r.kt)("p",null,"\u6211\u4eec\u8fd9\u91cc\u9700\u8981\u5f88\u591a\u94a9\u5b50\u3002\u8ba9\u6211\u4eec\u628a\u5b83\u4eec\u5e26\u8fdb\u6765\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm i @solana/wallet-adapter-base @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-wallets @solana/web3.js\n")),(0,r.kt)("p",null,"\u5982\u679c\u60a8\u6b63\u5728\u4e3a\u7279\u5b9a\u7684\u94b1\u5305\u8fdb\u884c\u6784\u5efa\uff0c\u90a3\u4e48\u60a8\u53ef\u4ee5\u5728\u6b64\u5904\u8fdb\u884c\u66f4\u6539\uff0c\u6211\u53ea\u662f\u575a\u6301\u4f7f\u7528\u9ed8\u8ba4\u503c\uff1aD"),(0,r.kt)("p",null,"\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"components")," \u4e2d\u521b\u5efa\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"WalletContextProvider.tsx")," \uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u6240\u6709\u8fd9\u4e9b\u6837\u677f\u6587\u4ef6\u653e\u5165\u5176\u4e2d\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { FC, ReactNode } from "react"\nimport {\n ConnectionProvider,\n WalletProvider,\n} from "@solana/wallet-adapter-react"\nimport { WalletModalProvider } from "@solana/wallet-adapter-react-ui"\nimport { clusterApiUrl } from "@solana/web3.js"\nimport { PhantomWalletAdapter } from "@solana/wallet-adapter-wallets"\nimport { useMemo } from "react"\nrequire("@solana/wallet-adapter-react-ui/styles.css")\n\nconst WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => {\n const url = useMemo(() => clusterApiUrl("devnet"), [])\n const phantom = new PhantomWalletAdapter()\n\n return (\n \n \n {children}\n \n \n )\n}\n\nexport default WalletContextProvider\n')),(0,r.kt)("p",null,"\u6211\u4eec\u9700\u8981\u5c06\u5176\u5bfc\u5165 ",(0,r.kt)("inlineCode",{parentName:"p"},"_app.tsx")," \uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"import WalletContextProvider from '../components/WalletContextProvider'\n\n\n \n \n \n\n")),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u8fd8\u5e0c\u671b\u201c\u6210\u4e3a\u5efa\u9020\u8005\u201d\u6309\u94ae\u4e5f\u80fd\u4e0e\u60a8\u8054\u7cfb\u3002\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"Disconnected.tsx")," \u4e2d\uff0c\u6dfb\u52a0\u8fd9\u4e9b\u5bfc\u5165"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { useWalletModal } from "@solana/wallet-adapter-react-ui"\nimport { useWallet } from "@solana/wallet-adapter-react"\n')),(0,r.kt)("p",null,"\u7136\u540e\u5728\u6e32\u67d3\u4e4b\u524d\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"Disconnected")," \u7684\u4e3b\u4f53\u66f4\u65b0\u4e3a\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"const modalState = useWalletModal()\n const { wallet, connect } = useWallet()\n\n const handleClick: MouseEventHandler = useCallback(\n (event) => {\n if (event.defaultPrevented) {\n return\n }\n\n if (!wallet) {\n modalState.setVisible(true)\n } else {\n connect().catch(() => {})\n }\n },\n [wallet, connect, modalState]\n )\n")),(0,r.kt)("p",null,"\u77a7\uff0c\u60a8\u5e94\u8be5\u80fd\u591f\u8fde\u63a5\u4e86\uff01"),(0,r.kt)("h2",{id:"-\u521b\u5efa\u8fde\u63a5\u89c6\u56fe"},"\ud83c\udf87 \u521b\u5efa\u8fde\u63a5\u89c6\u56fe"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u8fde\u63a5\u4e86\uff0c\u6211\u4eec\u9700\u8981\u66f4\u65b0\u89c6\u56fe\u4ee5\u663e\u793a\u8fde\u63a5\u65f6\u7684\u6837\u5b50\u3002\u8ba9\u6211\u4eec\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"components")," \u76ee\u5f55\u4e2d\u521b\u5efa\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"Connected.tsx")," \u6587\u4ef6"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { FC } from "react"\nimport {\n Button,\n Container,\n Heading,\n HStack,\n Text,\n VStack,\n Image,\n} from "@chakra-ui/react"\nimport { ArrowForwardIcon } from "@chakra-ui/icons"\n\nconst Connected: FC = () => {\n return (\n \n \n \n \n Welcome Buildoor.\n \n\n \n Each buildoor is randomly generated and can be staked to receive\n $BLD Use your $BLD to\n upgrade your buildoor and receive perks within the community!\n \n \n \n\n \n \n \n \n \n \n \n\n \n \n )\n}\n\nexport default Connected\n')),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5fc5\u987b\u627e\u5230\u4e00\u79cd\u65b9\u6cd5\u5c06\u5176\u663e\u793a\u5728\u5c4f\u5e55\u4e0a\u3002\u56de\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.tsx")," \uff0c\u8ba9\u6211\u4eec\u6dfb\u52a0\u4e24\u4e2a\u5bfc\u5165\uff1a"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import { useWallet } from "@solana/wallet-adapter-react"\nimport Connected from "../components/Connected"\n')),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"useWallet")," hooks\u6765\u8bbf\u95ee\u4e00\u4e2a\u53d8\u91cf\uff0c\u544a\u8bc9\u6211\u4eec\u662f\u5426\u5df2\u8fde\u63a5\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u6709\u6761\u4ef6\u5730\u6e32\u67d3 ",(0,r.kt)("inlineCode",{parentName:"p"},"Connected")," \u4e0e ",(0,r.kt)("inlineCode",{parentName:"p"},"Disconnected")," \u89c6\u56fe\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'const Home: NextPage = () => {\n const { connected } = useWallet()\n\n return (\n
\n \n Buildoors\n \n \n \n\n \n \n \n\n \n
{connected ? : }
\n \n')),(0,r.kt)("p",null,"\u597d\u4e86\uff0c\u6211\u4eec\u641e\u5b9a\u4e86\uff01\u6211\u4eec\u5df2\u7ecf\u8bbe\u7f6e\u597d\u4e86\u524d\u7aef\uff0c\u5e76\u4e14\u6b63\u5728\u987a\u5229\u5730\u8fdb\u884cbuildoors\u7684\u94f8\u9020\u3002"))}u.isMDXComponent=!0},7476:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_1-a5e067d38b19e18cc941d361976de374.png"},2607:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/upload_2-2b41371884be7e2293ea1e308419c827.png"}}]); \ No newline at end of file diff --git a/assets/js/d2196d4f.466bf8c4.js b/assets/js/d2196d4f.466bf8c4.js new file mode 100644 index 000000000..8a7d3d34f --- /dev/null +++ b/assets/js/d2196d4f.466bf8c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9675],{9663:l=>{l.exports=JSON.parse('[{"label":"blog","permalink":"/all-in-one-solana/blog/tags/blog","count":1},{"label":"blockchain","permalink":"/all-in-one-solana/blog/tags/blockchain","count":1},{"label":"solana","permalink":"/all-in-one-solana/blog/tags/solana","count":1},{"label":"IBC","permalink":"/all-in-one-solana/blog/tags/ibc","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/d41aa6b4.5cfead72.js b/assets/js/d41aa6b4.5cfead72.js new file mode 100644 index 000000000..7dba9d5f5 --- /dev/null +++ b/assets/js/d41aa6b4.5cfead72.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9390],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||o;return n?r.createElement(f,l(l({ref:t},u),{},{components:n})):r.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(7462),a=(n(7294),n(3905));const o={sidebar_position:62,sidebar_label:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",sidebar_class_name:"green"},l="\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",i={unversionedId:"Solana-Co-Learn/module3/nft-staking/how-staking-works/README",id:"Solana-Co-Learn/module3/nft-staking/how-staking-works/README",title:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",description:"\u4f60\u5df2\u7ecf\u63a5\u8fd1\u5b8c\u6210\u7b2c\u4e09\u5468\u4e86\uff01\u8ba9\u6211\u4eec\u628a\u4f60\u5b66\u5230\u7684\u4e00\u5207\u90fd\u7528\u5728\u4e0e\u4f60\u6b63\u5728\u8fdb\u884c\u7684NFT\u9879\u76ee\uff08buildoors\u9879\u76ee\uff09\u76f8\u5173\u7684\u8d28\u62bc\u8ba1\u5212\u4e0a\u3002",source:"@site/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/README.md",sourceDirName:"Solana-Co-Learn/module3/nft-staking/how-staking-works",slug:"/Solana-Co-Learn/module3/nft-staking/how-staking-works/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/README.md",tags:[],version:"current",sidebarPosition:62,frontMatter:{sidebar_position:62,sidebar_label:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"NFT\u8d28\u62bc",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/"},next:{title:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/"}},s={},c=[],u={toc:c},p="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406"},"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406"),(0,a.kt)("p",null,"\u4f60\u5df2\u7ecf\u63a5\u8fd1\u5b8c\u6210\u7b2c\u4e09\u5468\u4e86\uff01\u8ba9\u6211\u4eec\u628a\u4f60\u5b66\u5230\u7684\u4e00\u5207\u90fd\u7528\u5728\u4e0e\u4f60\u6b63\u5728\u8fdb\u884c\u7684NFT\u9879\u76ee\uff08buildoors\u9879\u76ee\uff09\u76f8\u5173\u7684\u8d28\u62bc\u8ba1\u5212\u4e0a\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u5e0c\u671b\u60a8\u4e3a\u8d28\u62bc\u8ba1\u5212\u642d\u5efa\u6240\u6709\u5185\u5bb9\uff0c\u9664\u4e86\u5b9e\u9645\u7684\u4ee3\u5e01\u529f\u80fd\u3002\u8fd9\u610f\u5473\u7740\u5728\u60a8\u9884\u671f\u4e0e\u4ee3\u5e01\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u7684\u4efb\u4f55\u5730\u65b9\uff0c\u6211\u4eec\u53ea\u4f1a\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\u6216\u8df3\u8fc7\u5b83\uff0c\u5e76\u5728\u4e0b\u5468\u91cd\u65b0\u5ba1\u89c6\u3002"),(0,a.kt)("p",null,"\u76ee\u524d\uff0c\u4e3b\u8981\u76ee\u6807\u662f\u7f16\u5199\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u8ddf\u8e2a\u6bcf\u4e2a\u7528\u6237\u7684\u8d28\u62bc\u72b6\u6001\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5927\u81f4\u7684\u6b65\u9aa4\uff1a"),(0,a.kt)("p",null,"\u5e94\u8be5\u67094\u4e2a\u6307\u793a\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"InitializeStakeAccount - \u8fd9\u5c06\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d26\u6237\uff0c\u7528\u4e8e\u5b58\u50a8\u6bcf\u4e2a\u7528\u6237/\u975e\u540c\u8d28\u5316\u4ee3\u5e01\u7ec4\u5408\u7684\u8d28\u62bc\u8fc7\u7a0b\u7684\u72b6\u6001\u4fe1\u606f\u3002\u8be5PDA\u7684\u79cd\u5b50\u5e94\u4e3a\u7528\u6237\u7684\u516c\u94a5\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\u7684\u4ee4\u724c\u8d26\u6237\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u8d28\u62bc - \u8fd9\u4e2a\u6307\u4ee4\u901a\u5e38\u662f\u5b9e\u9645\u8fdb\u884c\u8d28\u62bc\u7684\u5730\u65b9\u3002\u7136\u800c\uff0c\u6211\u4eec\u76ee\u524d\u4e0d\u4f1a\u8fdb\u884c\u4efb\u4f55\u771f\u6b63\u7684\u8d28\u62bc\u3002\u6211\u4eec\u53ea\u662f\u8981\u66f4\u65b0\u201c\u72b6\u6001\u201d\u8d26\u6237\uff0c\u4ee5\u53cd\u6620\u51fa\u4ee3\u5e01\u5df2\u88ab\u8d28\u62bc\uff0c\u8d28\u62bc\u7684\u65f6\u95f4\u7b49\u4fe1\u606f\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u5151\u6362 - \u8fd9\u662f\u60a8\u6839\u636e\u7528\u6237\u62b5\u62bc\u65f6\u95f4\u6765\u53d1\u9001\u5956\u52b1\u4ee3\u5e01\u7684\u5730\u65b9\u3002\u4f46\u73b0\u5728\u53ea\u9700\u8bb0\u5f55\u4ed6\u4eec\u5e94\u8be5\u83b7\u5f97\u591a\u5c11\u4ee3\u5e01\uff08\u6682\u65f6\u53ef\u4ee5\u5047\u8bbe\u6bcf\u5355\u4f4d\u65f6\u95f41\u4e2a\u4ee3\u5e01\uff09\uff0c\u5e76\u66f4\u65b0\u72b6\u6001\u4ee5\u53cd\u6620\u4ed6\u4eec\u4e0a\u6b21\u5151\u6362\u4ee3\u5e01\u7684\u65f6\u95f4\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u89e3\u9664\u8d28\u62bc - \u8fd9\u662f\u60a8\u8d4e\u56de\u4efb\u4f55\u989d\u5916\u4ee3\u5e01\u5e76\u89e3\u9664 NFT \u8d28\u62bc\u7684\u5730\u65b9\u3002\u76ee\u524d\uff0c\u8fd9\u53ea\u610f\u5473\u7740\u66f4\u65b0\u72b6\u6001\u4ee5\u53cd\u6620 NFT \u672a\u8d28\u62bc\uff0c\u5e76\u8bb0\u5f55\u5e94\u83b7\u5f97\u7684\u5956\u52b1\u4ee3\u5e01\u6570\u91cf\u3002")),(0,a.kt)("p",null,"\u8fd9\u662f\u5177\u6709\u6311\u6218\u6027\u7684\u3002\u5728\u53c2\u8003\u89e3\u51b3\u65b9\u6848\u6216\u89c2\u770b\u89c6\u9891\u6307\u5bfc\u4e4b\u524d\uff0c\u5148\u8bd5\u7740\u81ea\u5df1\u8bbe\u8ba1\u4e00\u4e9b\u4e1c\u897f\u3002\u5982\u679c\u4f60\u505a\u5f97\u4e0d\u5b8c\u7f8e\u4e5f\u6ca1\u5173\u7cfb\uff0c\u6323\u624e\u662f\u5b66\u4e60\u7684\u4e00\u90e8\u5206\u3002\n\u63d0\u793a\uff1a\u60a8\u53ef\u4ee5\u4f7f\u7528solana_program::clock::Clock\u6765\u83b7\u53d6\u65f6\u95f4\u3002\u5982\u679c\u9700\u8981\uff0c\u53ef\u4ee5",(0,a.kt)("a",{parentName:"p",href:"https://docs.rs/solana-program/latest/solana_program/clock/struct.Clock.html?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u67e5\u770b\u6587\u6863"),"\u3002\n\u5982\u679c\u4f60\u5df2\u7ecf\u5c3d\u529b\u5c1d\u8bd5\u4e86\u4e00\u5207\uff0c\u53ef\u4ee5\u968f\u610f\u67e5\u770b",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/6328f26177ea7f12846aee9b?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002\u5982\u679c\u4f60\u60f3\u7ee7\u7eed\uff0c\u6b22\u8fce\u5f00\u59cb\u4e3a\u8d28\u62bc\u548c\u4e0e\u8be5\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u7684\u7528\u6237\u754c\u9762\u8fdb\u884c\u5f00\u53d1\u3002"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d41aa6b4.e9f8ec33.js b/assets/js/d41aa6b4.e9f8ec33.js deleted file mode 100644 index 78e35873d..000000000 --- a/assets/js/d41aa6b4.e9f8ec33.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9390],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(r),d=a,f=p["".concat(s,".").concat(d)]||p[d]||m[d]||o;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const o={sidebar_position:62,sidebar_label:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",sidebar_class_name:"green"},l="\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",i={unversionedId:"Solana-Co-Learn/module3/nft-staking/how-staking-works/README",id:"Solana-Co-Learn/module3/nft-staking/how-staking-works/README",title:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",description:"\u4f60\u5df2\u7ecf\u63a5\u8fd1\u5b8c\u6210\u7b2c\u4e09\u5468\u4e86\uff01\u8ba9\u6211\u4eec\u628a\u4f60\u5b66\u5230\u7684\u4e00\u5207\u90fd\u7528\u5728\u4e0e\u4f60\u6b63\u5728\u8fdb\u884c\u7684NFT\u9879\u76ee\uff08buildoors\u9879\u76ee\uff09\u76f8\u5173\u7684\u8d28\u62bc\u8ba1\u5212\u4e0a\u3002",source:"@site/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/README.md",sourceDirName:"Solana-Co-Learn/module3/nft-staking/how-staking-works",slug:"/Solana-Co-Learn/module3/nft-staking/how-staking-works/",permalink:"/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/README.md",tags:[],version:"current",sidebarPosition:62,frontMatter:{sidebar_position:62,sidebar_label:"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"NFT\u8d28\u62bc",permalink:"/docs/Solana-Co-Learn/module3/nft-staking/"},next:{title:"\ud83d\udee0\ufe0f \u6784\u5efa\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212",permalink:"/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/"}},s={},c=[],u={toc:c},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"-\u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406"},"\ud83d\udd52 \u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406"),(0,a.kt)("p",null,"\u4f60\u5df2\u7ecf\u63a5\u8fd1\u5b8c\u6210\u7b2c\u4e09\u5468\u4e86\uff01\u8ba9\u6211\u4eec\u628a\u4f60\u5b66\u5230\u7684\u4e00\u5207\u90fd\u7528\u5728\u4e0e\u4f60\u6b63\u5728\u8fdb\u884c\u7684NFT\u9879\u76ee\uff08buildoors\u9879\u76ee\uff09\u76f8\u5173\u7684\u8d28\u62bc\u8ba1\u5212\u4e0a\u3002"),(0,a.kt)("p",null,"\u6211\u4eec\u5e0c\u671b\u60a8\u4e3a\u8d28\u62bc\u8ba1\u5212\u642d\u5efa\u6240\u6709\u5185\u5bb9\uff0c\u9664\u4e86\u5b9e\u9645\u7684\u4ee3\u5e01\u529f\u80fd\u3002\u8fd9\u610f\u5473\u7740\u5728\u60a8\u9884\u671f\u4e0e\u4ee3\u5e01\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u7684\u4efb\u4f55\u5730\u65b9\uff0c\u6211\u4eec\u53ea\u4f1a\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\u6216\u8df3\u8fc7\u5b83\uff0c\u5e76\u5728\u4e0b\u5468\u91cd\u65b0\u5ba1\u89c6\u3002"),(0,a.kt)("p",null,"\u76ee\u524d\uff0c\u4e3b\u8981\u76ee\u6807\u662f\u7f16\u5199\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u8ddf\u8e2a\u6bcf\u4e2a\u7528\u6237\u7684\u8d28\u62bc\u72b6\u6001\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5927\u81f4\u7684\u6b65\u9aa4\uff1a"),(0,a.kt)("p",null,"\u5e94\u8be5\u67094\u4e2a\u6307\u793a\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"InitializeStakeAccount - \u8fd9\u5c06\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8d26\u6237\uff0c\u7528\u4e8e\u5b58\u50a8\u6bcf\u4e2a\u7528\u6237/\u975e\u540c\u8d28\u5316\u4ee3\u5e01\u7ec4\u5408\u7684\u8d28\u62bc\u8fc7\u7a0b\u7684\u72b6\u6001\u4fe1\u606f\u3002\u8be5PDA\u7684\u79cd\u5b50\u5e94\u4e3a\u7528\u6237\u7684\u516c\u94a5\u548c\u975e\u540c\u8d28\u5316\u4ee3\u5e01\u7684\u4ee4\u724c\u8d26\u6237\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u8d28\u62bc - \u8fd9\u4e2a\u6307\u4ee4\u901a\u5e38\u662f\u5b9e\u9645\u8fdb\u884c\u8d28\u62bc\u7684\u5730\u65b9\u3002\u7136\u800c\uff0c\u6211\u4eec\u76ee\u524d\u4e0d\u4f1a\u8fdb\u884c\u4efb\u4f55\u771f\u6b63\u7684\u8d28\u62bc\u3002\u6211\u4eec\u53ea\u662f\u8981\u66f4\u65b0\u201c\u72b6\u6001\u201d\u8d26\u6237\uff0c\u4ee5\u53cd\u6620\u51fa\u4ee3\u5e01\u5df2\u88ab\u8d28\u62bc\uff0c\u8d28\u62bc\u7684\u65f6\u95f4\u7b49\u4fe1\u606f\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u5151\u6362 - \u8fd9\u662f\u60a8\u6839\u636e\u7528\u6237\u62b5\u62bc\u65f6\u95f4\u6765\u53d1\u9001\u5956\u52b1\u4ee3\u5e01\u7684\u5730\u65b9\u3002\u4f46\u73b0\u5728\u53ea\u9700\u8bb0\u5f55\u4ed6\u4eec\u5e94\u8be5\u83b7\u5f97\u591a\u5c11\u4ee3\u5e01\uff08\u6682\u65f6\u53ef\u4ee5\u5047\u8bbe\u6bcf\u5355\u4f4d\u65f6\u95f41\u4e2a\u4ee3\u5e01\uff09\uff0c\u5e76\u66f4\u65b0\u72b6\u6001\u4ee5\u53cd\u6620\u4ed6\u4eec\u4e0a\u6b21\u5151\u6362\u4ee3\u5e01\u7684\u65f6\u95f4\u3002"),(0,a.kt)("li",{parentName:"ul"},"\u89e3\u9664\u8d28\u62bc - \u8fd9\u662f\u60a8\u8d4e\u56de\u4efb\u4f55\u989d\u5916\u4ee3\u5e01\u5e76\u89e3\u9664 NFT \u8d28\u62bc\u7684\u5730\u65b9\u3002\u76ee\u524d\uff0c\u8fd9\u53ea\u610f\u5473\u7740\u66f4\u65b0\u72b6\u6001\u4ee5\u53cd\u6620 NFT \u672a\u8d28\u62bc\uff0c\u5e76\u8bb0\u5f55\u5e94\u83b7\u5f97\u7684\u5956\u52b1\u4ee3\u5e01\u6570\u91cf\u3002")),(0,a.kt)("p",null,"\u8fd9\u662f\u5177\u6709\u6311\u6218\u6027\u7684\u3002\u5728\u53c2\u8003\u89e3\u51b3\u65b9\u6848\u6216\u89c2\u770b\u89c6\u9891\u6307\u5bfc\u4e4b\u524d\uff0c\u5148\u8bd5\u7740\u81ea\u5df1\u8bbe\u8ba1\u4e00\u4e9b\u4e1c\u897f\u3002\u5982\u679c\u4f60\u505a\u5f97\u4e0d\u5b8c\u7f8e\u4e5f\u6ca1\u5173\u7cfb\uff0c\u6323\u624e\u662f\u5b66\u4e60\u7684\u4e00\u90e8\u5206\u3002\n\u63d0\u793a\uff1a\u60a8\u53ef\u4ee5\u4f7f\u7528solana_program::clock::Clock\u6765\u83b7\u53d6\u65f6\u95f4\u3002\u5982\u679c\u9700\u8981\uff0c\u53ef\u4ee5",(0,a.kt)("a",{parentName:"p",href:"https://docs.rs/solana-program/latest/solana_program/clock/struct.Clock.html?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u67e5\u770b\u6587\u6863"),"\u3002\n\u5982\u679c\u4f60\u5df2\u7ecf\u5c3d\u529b\u5c1d\u8bd5\u4e86\u4e00\u5207\uff0c\u53ef\u4ee5\u968f\u610f\u67e5\u770b",(0,a.kt)("a",{parentName:"p",href:"https://beta.solpg.io/6328f26177ea7f12846aee9b?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002\u5982\u679c\u4f60\u60f3\u7ee7\u7eed\uff0c\u6b22\u8fce\u5f00\u59cb\u4e3a\u8d28\u62bc\u548c\u4e0e\u8be5\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u7684\u7528\u6237\u754c\u9762\u8fdb\u884c\u5f00\u53d1\u3002"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d846cb9d.8453419f.js b/assets/js/d846cb9d.8453419f.js deleted file mode 100644 index d34df7b2a..000000000 --- a/assets/js/d846cb9d.8453419f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3096],{3905:(e,n,a)=>{a.d(n,{Zo:()=>p,kt:()=>f});var t=a(7294);function i(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function r(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function s(e){for(var n=1;n=0||(i[a]=e[a]);return i}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var c=t.createContext({}),o=function(e){var n=t.useContext(c),a=n;return e&&(a="function"==typeof e?e(n):s(s({},n),e)),a},p=function(e){var n=o(e.components);return t.createElement(c.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},u=t.forwardRef((function(e,n){var a=e.components,i=e.mdxType,r=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=o(a),u=i,f=d["".concat(c,".").concat(u)]||d[u]||m[u]||r;return a?t.createElement(f,s(s({ref:n},p),{},{components:a})):t.createElement(f,s({ref:n},p))}));function f(e,n){var a=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var r=a.length,s=new Array(r);s[0]=u;var l={};for(var c in n)hasOwnProperty.call(n,c)&&(l[c]=n[c]);l.originalType=e,l[d]="string"==typeof e?e:i,s[1]=l;for(var o=2;o{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>o});var t=a(7462),i=(a(7294),a(3905));const r={sidebar_position:39,sidebar_label:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",sidebar_class_name:"green"},s="\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",l={unversionedId:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README",id:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README",title:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u770b\u5230\u95ea\u4eae\u7684\u65b0iPhone\u6709\u591a\u4ee4\u4eba\u5174\u594b\u5417\uff1f\u7a00\u6709\u7684NFT\u6709\u70b9\u50cf\u90a3\u6837\u3002\u5bf9\u4e8e\u4f18\u79c0\u7684\u827a\u672f\u5bb6\u6765\u8bf4\uff0c\u5373\u4f7f\u53ea\u662f\u770b\u7740\u5b83\u4eec\u4e5f\u5f88\u6709\u8da3\u3002\u6bd5\u7adf\uff0c\u827a\u672f\u5c31\u662f\u7528\u6765\u6b23\u8d4f\u7684\uff01\u8ba9\u6211\u4eec\u5f04\u6e05\u695a\u5982\u679c\u6211\u4eec\u53ea\u6709Candy Machine\u7684\u5730\u5740\uff0c\u6211\u4eec\u5982\u4f55\u5c55\u793aNFTs\u3002",source:"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README.md",sourceDirName:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine",slug:"/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README.md",tags:[],version:"current",sidebarPosition:39,frontMatter:{sidebar_position:39,sidebar_label:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/"},next:{title:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/"}},c={},o=[{value:"\ud83e\udd41 \u8bf7\u62ff\u6765\u4e00\u4e2a\u7cd6\u679c\u673a",id:"-\u8bf7\u62ff\u6765\u4e00\u4e2a\u7cd6\u679c\u673a",level:2}],p={toc:o},d="wrapper";function m(e){let{components:n,...r}=e;return(0,i.kt)(d,(0,t.Z)({},p,r,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"-\u4ece\u7cd6\u679c\u673a\u5c55\u793anfts"},"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs"),(0,i.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u770b\u5230\u95ea\u4eae\u7684\u65b0iPhone\u6709\u591a\u4ee4\u4eba\u5174\u594b\u5417\uff1f\u7a00\u6709\u7684NFT\u6709\u70b9\u50cf\u90a3\u6837\u3002\u5bf9\u4e8e\u4f18\u79c0\u7684\u827a\u672f\u5bb6\u6765\u8bf4\uff0c\u5373\u4f7f\u53ea\u662f\u770b\u7740\u5b83\u4eec\u4e5f\u5f88\u6709\u8da3\u3002\u6bd5\u7adf\uff0c\u827a\u672f\u5c31\u662f\u7528\u6765\u6b23\u8d4f\u7684\uff01\u8ba9\u6211\u4eec\u5f04\u6e05\u695a\u5982\u679c\u6211\u4eec\u53ea\u6709Candy Machine\u7684\u5730\u5740\uff0c\u6211\u4eec\u5982\u4f55\u5c55\u793aNFTs\u3002"),(0,i.kt)("p",null,"\u4f60\u80fd\u731c\u5230\u8fd9\u91cc\u53d1\u751f\u4e86\u4ec0\u4e48\u4e0d\u540c\u5417\uff1f\u662f\u7684\uff0c\u6211\u4eec\u53ea\u662f\u5728SDK\u4e0a\u4f7f\u7528\u4e86\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\uff01"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(5207).Z,width:"758",height:"844"})),(0,i.kt)("p",null,"\u65e2\u7136\u8fd9\u91cc\u6ca1\u6709\u94b1\u5305\uff0c\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u4f7f\u7528 ",(0,i.kt)("inlineCode",{parentName:"p"},"walletAdapterIdentity")," \uff0c\u53ea\u9700\u8981\u4f7f\u7528",(0,i.kt)("inlineCode",{parentName:"p"},"metaplex"),"\u5bf9\u8c61\u5373\u53ef\u3002"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(1474).Z,width:"634",height:"253"})),(0,i.kt)("p",null,"\u6211\u4eec\u8fd9\u91cc\u53ea\u6709\u51e0\u4e2a\u9009\u62e9 - ",(0,i.kt)("inlineCode",{parentName:"p"},"findByAddress")," \u662f\u6211\u4eec\u60f3\u8981\u7684\u4e00\u4e2a\u3002"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(4451).Z,width:"1441",height:"844"})),(0,i.kt)("p",null,"\u4e0e\u6211\u4eec\u4e3a\u5355\u4e2aNFT\u6240\u83b7\u5f97\u7684\u7c7b\u4f3c\uff0c\u6211\u4eec\u5c06\u83b7\u5f97\u6574\u4e2a\u7cd6\u679c\u673a\u5b9e\u4f8b\u7684\u5143\u6570\u636e\u3002 ",(0,i.kt)("inlineCode",{parentName:"p"},"items")," \u5b57\u6bb5\u662f\u7cd6\u679c\u673a\u4e2d\u6240\u6709NFT\u7684\u6570\u7ec4\u3002\u6bcf\u4e2a\u9879\u76ee\u90fd\u4e0d\u4f1a\u5305\u542b\u6211\u4eec\u60f3\u8981\u7684\u5185\u5bb9\uff0c\u800c\u662f\u4f1a\u6307\u5411\u4e00\u4e2a\u6211\u4eec\u53ef\u4ee5\u4ece\u4e2d\u83b7\u53d6\u8d44\u4ea7\u7684URI\u3002"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(5858).Z,width:"1177",height:"614"})),(0,i.kt)("p",null,"\u7531\u4e8e\u6536\u85cf\u54c1\u53ef\u80fd\u975e\u5e38\u5e9e\u5927\uff0c\u6211\u4eec\u4e0d\u4f1a\u4e00\u6b21\u6027\u83b7\u53d6\u6240\u6709\u7684NFT\u3002\u76f8\u53cd\uff0c\u6211\u4eec\u5c06\u6839\u636e\u5206\u9875\u7cfb\u7edf\u4ec5\u83b7\u53d6\u6211\u4eec\u60f3\u8981\u5c55\u793a\u7684NFT\u3002"),(0,i.kt)("p",null,"\u8ba9\u6211\u4eec\u6765\u7ed8\u5236\u4e00\u4e9b\u50cf\u7d20\u5427\uff01"),(0,i.kt)("h2",{id:"-\u8bf7\u62ff\u6765\u4e00\u4e2a\u7cd6\u679c\u673a"},"\ud83e\udd41 \u8bf7\u62ff\u6765\u4e00\u4e2a\u7cd6\u679c\u673a"),(0,i.kt)("p",null,"\u60a8\u53ef\u4ee5\u7ee7\u7eed\u4e0a\u4e00\u8282\u7684\u8fdb\u5ea6\uff0c\u6216\u8005\u4f7f\u7528\u4e0a\u6b21\u6211\u4eec\u4f7f\u7528\u7684\u76f8\u540c\u6a21\u677f\uff08\u8d77\u59cb\u5206\u652f\u5373\u53ef\uff09\u3002"),(0,i.kt)("p",null,"\u5feb\u8fdb\u5165 ",(0,i.kt)("inlineCode",{parentName:"p"},"FetchCandyMachine.tsx")," \u3002\u4f60\u4f1a\u770b\u5230\u4e00\u4e9b\u8bbe\u7f6e\u5df2\u7ecf\u4e3a\u4f60\u51c6\u5907\u597d\u4e86\u3002\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,i.kt)("inlineCode",{parentName:"p"},"getPage")," \u51fd\u6570\u4ece\u7cd6\u679c\u673a\u4e0a\u83b7\u53d6\u201c\u9875\u9762\u201d\u4e0a\u7684\u7269\u54c1\u3002\u5728\u6b64\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u83b7\u53d6\u7cd6\u679c\u673a\u7684\u5143\u6570\u636e\u8d26\u6237\u3002"),(0,i.kt)("p",null,"\u5728\u7a7a\u7684 ",(0,i.kt)("inlineCode",{parentName:"p"},"fetchCandyMachine")," \u51fd\u6570\u4e0a\u65b9\u8bbe\u7f6e ",(0,i.kt)("inlineCode",{parentName:"p"},"metaplex")," \u5bf9\u8c61\u7684\u8fde\u63a5"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},'export const FetchCandyMachine: FC = () => {\n // placeholder CMv2 address\n const [candyMachineAddress, setCandyMachineAddress] = useState("")\n const [candyMachineData, setCandyMachineData] = useState(null)\n const [pageItems, setPageItems] = useState(null)\n const [page, setPage] = useState(1)\n\n const { connection } = useConnection()\n const metaplex = Metaplex.make(connection)\n')),(0,i.kt)("p",null,"\u5728\u521b\u5efa\u6709\u72b6\u6001\u53d8\u91cf\u65f6\uff0c\u8bf7\u786e\u4fdd\u6dfb\u52a0\u60a8\u7684Candy Machine\u5730\u5740"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},'export const FetchCandyMachine: FC = () => {\n const [candyMachineAddress, setCandyMachineAddress] = useState("CM_ADDRESS_HERE")\n ...\n')),(0,i.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u5b8c\u6210 ",(0,i.kt)("inlineCode",{parentName:"p"},"fetchCandyMachine")," \u3002\u6211\u4eec\u5c06\u4f7f\u7528\u4e4b\u524d\u770b\u5230\u7684 ",(0,i.kt)("inlineCode",{parentName:"p"},"findByAddress")," \u65b9\u6cd5\u3002"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},'export const FetchCandyMachine: FC = () => {\n ...\n\n // fetch candymachine by address\n const fetchCandyMachine = async () => {\n\n // Set page to 1 - we wanna be at the first page whenever we fetch a new Candy Machine\n setPage(1)\n\n // fetch candymachine data\n try {\n const candyMachine = await metaplex\n .candyMachinesV2()\n .findByAddress({ address: new PublicKey(candyMachineAddress) })\n\n setCandyMachineData(candyMachine)\n } catch (e) {\n alert("Please submit a valid CMv2 address.")\n }\n }\n ...\n}\n')),(0,i.kt)("p",null,"\u6ce8\u610f\uff1aMetaplex CLI\u7684\u6700\u65b0\u7248\u672c\u5728\u51fd\u6570\u8c03\u7528\u7684\u672b\u5c3e\u4e0d\u9700\u8981 ",(0,i.kt)("inlineCode",{parentName:"p"},"run()")," \u3002"),(0,i.kt)("p",null,"\u73b0\u5728\u662f\u91cd\u8981\u7684\u90e8\u5206 - \u6d4f\u89c8\u6211\u4eec\u5c06\u83b7\u5f97\u7684CM\u6570\u636e\u3002\u4ee5\u4e0b\u662f ",(0,i.kt)("inlineCode",{parentName:"p"},"getPage")," \u51fd\u6570\u7684\u6837\u5b50\uff1a"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},"export const FetchCandyMachine: FC = () => {\n ...\n\n // paging\n const getPage = async (page, perPage) => {\n const pageItems = candyMachineData.items.slice(\n (page - 1) * perPage,\n page * perPage\n )\n\n // fetch metadata of NFTs for page\n let nftData = []\n for (let i = 0; i < pageItems.length; i++) {\n let fetchResult = await fetch(pageItems[i].uri)\n let json = await fetchResult.json()\n nftData.push(json)\n }\n\n // set state\n setPageItems(nftData)\n }\n ...\n}\n\n")),(0,i.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u505a\u7684\u662f\u5c06 ",(0,i.kt)("inlineCode",{parentName:"p"},"items")," \u6570\u7ec4\u5207\u5272\u6210\u5927\u5c0f\u4e3a10\u7684\u5757\u3002\u7136\u540e\u6211\u4eec\u83b7\u53d6\u9875\u9762\u4e2d\u6bcf\u4e2aNFT\u7684\u5143\u6570\u636e\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728 ",(0,i.kt)("inlineCode",{parentName:"p"},"nftData")," \u4e2d\u3002\u6700\u540e\uff0c\u6211\u4eec\u5c06 ",(0,i.kt)("inlineCode",{parentName:"p"},"pageItems")," \u72b6\u6001\u53d8\u91cf\u8bbe\u7f6e\u4e3a\u521a\u521a\u83b7\u53d6\u7684 ",(0,i.kt)("inlineCode",{parentName:"p"},"nftData")," \u3002"),(0,i.kt)("p",null,"\u8fd9\u610f\u5473\u7740\u6211\u4eec\u7684\u5e94\u7528\u7a0b\u5e8f\u5728\u4efb\u4f55\u65f6\u5019\u53ea\u4f1a\u6e32\u67d3\u5f53\u524d\u9875\u9762\u7684NFT\u3002\u4e0d\u9519\uff01"),(0,i.kt)("p",null,"\u8ba9\u6211\u4eec\u586b\u5199 ",(0,i.kt)("inlineCode",{parentName:"p"},"prev")," \u548c ",(0,i.kt)("inlineCode",{parentName:"p"},"next")," \u51fd\u6570\uff1a"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},"// previous page\nconst prev = async () => {\n if (page - 1 < 1) {\n setPage(1)\n } else {\n setPage(page - 1)\n }\n}\n\n// next page\nconst next = async () => {\n setPage(page + 1)\n}\n")),(0,i.kt)("p",null,"\u5f53\u7528\u6237\u70b9\u51fb\u201c\u4e0a\u4e00\u4e2a\u201d\u548c\u201c\u4e0b\u4e00\u4e2a\u201d\u6309\u94ae\u65f6\uff0c\u8fd9\u4e9b\u5c06\u4f1a\u8fd0\u884c\uff0c\u8fd9\u4e9b\u6309\u94ae\u53ea\u4f1a\u5728 ",(0,i.kt)("inlineCode",{parentName:"p"},"pageItems")," \u4e0d\u4e3a\u7a7a\u65f6\u663e\u793a\uff08\u5373\u5f53\u6211\u4eec\u83b7\u53d6\u4e86\u4e00\u4e2aCM\u7684NFT\u65f6\uff09\u3002"),(0,i.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u9700\u8981\u4e00\u4e9b ",(0,i.kt)("inlineCode",{parentName:"p"},"useEffects")," \u6765\u5f00\u59cb\u3002\u6574\u4e2a\u8fc7\u7a0b\u4e00\u5f00\u59cb\u53ef\u80fd\u4f1a\u6709\u70b9\u56f0\u60d1\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u4e00\u6b65\u4e00\u6b65\u6765\u89e3\u6790\u3002"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("ol",{parentName:"li"},(0,i.kt)("li",{parentName:"ol"},"\u5728\u9875\u9762\u52a0\u8f7d\u65f6\u8fd0\u884c ",(0,i.kt)("inlineCode",{parentName:"li"},"fetchCandyMachine")," \u51fd\u6570\uff08\u5982\u679c ",(0,i.kt)("inlineCode",{parentName:"li"},"candyMachineAddress")," \u4e0d\u4e3a\u7a7a\uff09"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("ol",{parentName:"li",start:2},(0,i.kt)("li",{parentName:"ol"},"\u6bcf\u5f53\u4f7f\u7528 ",(0,i.kt)("inlineCode",{parentName:"li"},"fetchCandyMachine")," \u83b7\u53d6\u7cd6\u679c\u673a\u65f6\uff0c\u5c06 ",(0,i.kt)("inlineCode",{parentName:"li"},"page")," \u8bbe\u7f6e\u4e3a1\uff0c\u8fd9\u6837\u4f60\u5c31\u53ef\u4ee5\u5f97\u5230\u7b2c\u4e00\u9875\u3002"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("ol",{parentName:"li",start:3},(0,i.kt)("li",{parentName:"ol"},"\u6bcf\u5f53 ",(0,i.kt)("inlineCode",{parentName:"li"},"candyMachineData")," \u6216 ",(0,i.kt)("inlineCode",{parentName:"li"},"page")," \u53d1\u751f\u53d8\u5316\uff08\u5373\u8f93\u5165\u65b0\u7684CM\u5730\u5740\u6216\u70b9\u51fb\u4e0b\u4e00\u4e2a/\u4e0a\u4e00\u4e2a\u6309\u94ae\uff09\uff0c\u52a0\u8f7d\u9875\u9762\u3002")))),(0,i.kt)("p",null,"\u8fd9\u662f\u4ee3\u7801\u4e2d\u7684\u6837\u5b50\uff1a"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},"export const FetchCandyMachine: FC = () => {\n ...\n\n // fetch placeholder candy machine on load\n useEffect(() => {\n fetchCandyMachine()\n }, [])\n\n // fetch metadata for NFTs when page or candy machine changes\n useEffect(() => {\n if (!candyMachineData) {\n return\n }\n getPage(page, 9)\n }, [candyMachineData, page])\n\n}\n")),(0,i.kt)("p",null,"\u5feb\u53bb ",(0,i.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u8bd5\u8bd5\u5427\uff01\u4f60\u5e94\u8be5\u80fd\u770b\u5230\u4f60\u7684\u7cd6\u679c\u673a\u4e0a\u7684NFT\u7684\u7b2c\u4e00\u9875\u3002"))}m.isMDXComponent=!0},5207:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/candy-machine-nft-675170f974878ca6293f960241c6dbb4.png"},5858:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/find-by-address-result-e5eff2626f5a58314f6e35abbc359cf7.png"},4451:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/find-by-address-49e6b96be47f6f70559de3e8d31af886.png"},1474:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/find-nf-5e8b6b7e1b3ecec69d59cf99f80a82c5.png"}}]); \ No newline at end of file diff --git a/assets/js/d846cb9d.c72dd33c.js b/assets/js/d846cb9d.c72dd33c.js new file mode 100644 index 000000000..5afb69579 --- /dev/null +++ b/assets/js/d846cb9d.c72dd33c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3096],{3905:(e,n,a)=>{a.d(n,{Zo:()=>p,kt:()=>f});var t=a(7294);function i(e,n,a){return n in e?Object.defineProperty(e,n,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[n]=a,e}function r(e,n){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);n&&(t=t.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),a.push.apply(a,t)}return a}function l(e){for(var n=1;n=0||(i[a]=e[a]);return i}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var c=t.createContext({}),o=function(e){var n=t.useContext(c),a=n;return e&&(a="function"==typeof e?e(n):l(l({},n),e)),a},p=function(e){var n=o(e.components);return t.createElement(c.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return t.createElement(t.Fragment,{},n)}},u=t.forwardRef((function(e,n){var a=e.components,i=e.mdxType,r=e.originalType,c=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=o(a),u=i,f=d["".concat(c,".").concat(u)]||d[u]||m[u]||r;return a?t.createElement(f,l(l({ref:n},p),{},{components:a})):t.createElement(f,l({ref:n},p))}));function f(e,n){var a=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var r=a.length,l=new Array(r);l[0]=u;var s={};for(var c in n)hasOwnProperty.call(n,c)&&(s[c]=n[c]);s.originalType=e,s[d]="string"==typeof e?e:i,l[1]=s;for(var o=2;o{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>o});var t=a(7462),i=(a(7294),a(3905));const r={sidebar_position:39,sidebar_label:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",sidebar_class_name:"green"},l="\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",s={unversionedId:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README",id:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README",title:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u770b\u5230\u95ea\u4eae\u7684\u65b0iPhone\u6709\u591a\u4ee4\u4eba\u5174\u594b\u5417\uff1f\u7a00\u6709\u7684NFT\u6709\u70b9\u50cf\u90a3\u6837\u3002\u5bf9\u4e8e\u4f18\u79c0\u7684\u827a\u672f\u5bb6\u6765\u8bf4\uff0c\u5373\u4f7f\u53ea\u662f\u770b\u7740\u5b83\u4eec\u4e5f\u5f88\u6709\u8da3\u3002\u6bd5\u7adf\uff0c\u827a\u672f\u5c31\u662f\u7528\u6765\u6b23\u8d4f\u7684\uff01\u8ba9\u6211\u4eec\u5f04\u6e05\u695a\u5982\u679c\u6211\u4eec\u53ea\u6709Candy Machine\u7684\u5730\u5740\uff0c\u6211\u4eec\u5982\u4f55\u5c55\u793aNFTs\u3002",source:"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README.md",sourceDirName:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine",slug:"/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README.md",tags:[],version:"current",sidebarPosition:39,frontMatter:{sidebar_position:39,sidebar_label:"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/"},next:{title:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/"}},c={},o=[{value:"\ud83e\udd41 \u8bf7\u62ff\u6765\u4e00\u4e2a\u7cd6\u679c\u673a",id:"-\u8bf7\u62ff\u6765\u4e00\u4e2a\u7cd6\u679c\u673a",level:2}],p={toc:o},d="wrapper";function m(e){let{components:n,...r}=e;return(0,i.kt)(d,(0,t.Z)({},p,r,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"-\u4ece\u7cd6\u679c\u673a\u5c55\u793anfts"},"\ud83d\uddbc \u4ece\u7cd6\u679c\u673a\u5c55\u793aNFTs"),(0,i.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u4f60\u77e5\u9053\u770b\u5230\u95ea\u4eae\u7684\u65b0iPhone\u6709\u591a\u4ee4\u4eba\u5174\u594b\u5417\uff1f\u7a00\u6709\u7684NFT\u6709\u70b9\u50cf\u90a3\u6837\u3002\u5bf9\u4e8e\u4f18\u79c0\u7684\u827a\u672f\u5bb6\u6765\u8bf4\uff0c\u5373\u4f7f\u53ea\u662f\u770b\u7740\u5b83\u4eec\u4e5f\u5f88\u6709\u8da3\u3002\u6bd5\u7adf\uff0c\u827a\u672f\u5c31\u662f\u7528\u6765\u6b23\u8d4f\u7684\uff01\u8ba9\u6211\u4eec\u5f04\u6e05\u695a\u5982\u679c\u6211\u4eec\u53ea\u6709Candy Machine\u7684\u5730\u5740\uff0c\u6211\u4eec\u5982\u4f55\u5c55\u793aNFTs\u3002"),(0,i.kt)("p",null,"\u4f60\u80fd\u731c\u5230\u8fd9\u91cc\u53d1\u751f\u4e86\u4ec0\u4e48\u4e0d\u540c\u5417\uff1f\u662f\u7684\uff0c\u6211\u4eec\u53ea\u662f\u5728SDK\u4e0a\u4f7f\u7528\u4e86\u4e00\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\uff01"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(6953).Z,width:"758",height:"844"})),(0,i.kt)("p",null,"\u65e2\u7136\u8fd9\u91cc\u6ca1\u6709\u94b1\u5305\uff0c\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u4f7f\u7528 ",(0,i.kt)("inlineCode",{parentName:"p"},"walletAdapterIdentity")," \uff0c\u53ea\u9700\u8981\u4f7f\u7528",(0,i.kt)("inlineCode",{parentName:"p"},"metaplex"),"\u5bf9\u8c61\u5373\u53ef\u3002"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(1474).Z,width:"634",height:"253"})),(0,i.kt)("p",null,"\u6211\u4eec\u8fd9\u91cc\u53ea\u6709\u51e0\u4e2a\u9009\u62e9 - ",(0,i.kt)("inlineCode",{parentName:"p"},"findByAddress")," \u662f\u6211\u4eec\u60f3\u8981\u7684\u4e00\u4e2a\u3002"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(4451).Z,width:"1441",height:"844"})),(0,i.kt)("p",null,"\u4e0e\u6211\u4eec\u4e3a\u5355\u4e2aNFT\u6240\u83b7\u5f97\u7684\u7c7b\u4f3c\uff0c\u6211\u4eec\u5c06\u83b7\u5f97\u6574\u4e2a\u7cd6\u679c\u673a\u5b9e\u4f8b\u7684\u5143\u6570\u636e\u3002 ",(0,i.kt)("inlineCode",{parentName:"p"},"items")," \u5b57\u6bb5\u662f\u7cd6\u679c\u673a\u4e2d\u6240\u6709NFT\u7684\u6570\u7ec4\u3002\u6bcf\u4e2a\u9879\u76ee\u90fd\u4e0d\u4f1a\u5305\u542b\u6211\u4eec\u60f3\u8981\u7684\u5185\u5bb9\uff0c\u800c\u662f\u4f1a\u6307\u5411\u4e00\u4e2a\u6211\u4eec\u53ef\u4ee5\u4ece\u4e2d\u83b7\u53d6\u8d44\u4ea7\u7684URI\u3002"),(0,i.kt)("p",null,(0,i.kt)("img",{src:a(5858).Z,width:"1177",height:"614"})),(0,i.kt)("p",null,"\u7531\u4e8e\u6536\u85cf\u54c1\u53ef\u80fd\u975e\u5e38\u5e9e\u5927\uff0c\u6211\u4eec\u4e0d\u4f1a\u4e00\u6b21\u6027\u83b7\u53d6\u6240\u6709\u7684NFT\u3002\u76f8\u53cd\uff0c\u6211\u4eec\u5c06\u6839\u636e\u5206\u9875\u7cfb\u7edf\u4ec5\u83b7\u53d6\u6211\u4eec\u60f3\u8981\u5c55\u793a\u7684NFT\u3002"),(0,i.kt)("p",null,"\u8ba9\u6211\u4eec\u6765\u7ed8\u5236\u4e00\u4e9b\u50cf\u7d20\u5427\uff01"),(0,i.kt)("h2",{id:"-\u8bf7\u62ff\u6765\u4e00\u4e2a\u7cd6\u679c\u673a"},"\ud83e\udd41 \u8bf7\u62ff\u6765\u4e00\u4e2a\u7cd6\u679c\u673a"),(0,i.kt)("p",null,"\u60a8\u53ef\u4ee5\u7ee7\u7eed\u4e0a\u4e00\u8282\u7684\u8fdb\u5ea6\uff0c\u6216\u8005\u4f7f\u7528\u4e0a\u6b21\u6211\u4eec\u4f7f\u7528\u7684\u76f8\u540c\u6a21\u677f\uff08\u8d77\u59cb\u5206\u652f\u5373\u53ef\uff09\u3002"),(0,i.kt)("p",null,"\u5feb\u8fdb\u5165 ",(0,i.kt)("inlineCode",{parentName:"p"},"FetchCandyMachine.tsx")," \u3002\u4f60\u4f1a\u770b\u5230\u4e00\u4e9b\u8bbe\u7f6e\u5df2\u7ecf\u4e3a\u4f60\u51c6\u5907\u597d\u4e86\u3002\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,i.kt)("inlineCode",{parentName:"p"},"getPage")," \u51fd\u6570\u4ece\u7cd6\u679c\u673a\u4e0a\u83b7\u53d6\u201c\u9875\u9762\u201d\u4e0a\u7684\u7269\u54c1\u3002\u5728\u6b64\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u83b7\u53d6\u7cd6\u679c\u673a\u7684\u5143\u6570\u636e\u8d26\u6237\u3002"),(0,i.kt)("p",null,"\u5728\u7a7a\u7684 ",(0,i.kt)("inlineCode",{parentName:"p"},"fetchCandyMachine")," \u51fd\u6570\u4e0a\u65b9\u8bbe\u7f6e ",(0,i.kt)("inlineCode",{parentName:"p"},"metaplex")," \u5bf9\u8c61\u7684\u8fde\u63a5"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},'export const FetchCandyMachine: FC = () => {\n // placeholder CMv2 address\n const [candyMachineAddress, setCandyMachineAddress] = useState("")\n const [candyMachineData, setCandyMachineData] = useState(null)\n const [pageItems, setPageItems] = useState(null)\n const [page, setPage] = useState(1)\n\n const { connection } = useConnection()\n const metaplex = Metaplex.make(connection)\n')),(0,i.kt)("p",null,"\u5728\u521b\u5efa\u6709\u72b6\u6001\u53d8\u91cf\u65f6\uff0c\u8bf7\u786e\u4fdd\u6dfb\u52a0\u60a8\u7684Candy Machine\u5730\u5740"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},'export const FetchCandyMachine: FC = () => {\n const [candyMachineAddress, setCandyMachineAddress] = useState("CM_ADDRESS_HERE")\n ...\n')),(0,i.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u5b8c\u6210 ",(0,i.kt)("inlineCode",{parentName:"p"},"fetchCandyMachine")," \u3002\u6211\u4eec\u5c06\u4f7f\u7528\u4e4b\u524d\u770b\u5230\u7684 ",(0,i.kt)("inlineCode",{parentName:"p"},"findByAddress")," \u65b9\u6cd5\u3002"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},'export const FetchCandyMachine: FC = () => {\n ...\n\n // fetch candymachine by address\n const fetchCandyMachine = async () => {\n\n // Set page to 1 - we wanna be at the first page whenever we fetch a new Candy Machine\n setPage(1)\n\n // fetch candymachine data\n try {\n const candyMachine = await metaplex\n .candyMachinesV2()\n .findByAddress({ address: new PublicKey(candyMachineAddress) })\n\n setCandyMachineData(candyMachine)\n } catch (e) {\n alert("Please submit a valid CMv2 address.")\n }\n }\n ...\n}\n')),(0,i.kt)("p",null,"\u6ce8\u610f\uff1aMetaplex CLI\u7684\u6700\u65b0\u7248\u672c\u5728\u51fd\u6570\u8c03\u7528\u7684\u672b\u5c3e\u4e0d\u9700\u8981 ",(0,i.kt)("inlineCode",{parentName:"p"},"run()")," \u3002"),(0,i.kt)("p",null,"\u73b0\u5728\u662f\u91cd\u8981\u7684\u90e8\u5206 - \u6d4f\u89c8\u6211\u4eec\u5c06\u83b7\u5f97\u7684CM\u6570\u636e\u3002\u4ee5\u4e0b\u662f ",(0,i.kt)("inlineCode",{parentName:"p"},"getPage")," \u51fd\u6570\u7684\u6837\u5b50\uff1a"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},"export const FetchCandyMachine: FC = () => {\n ...\n\n // paging\n const getPage = async (page, perPage) => {\n const pageItems = candyMachineData.items.slice(\n (page - 1) * perPage,\n page * perPage\n )\n\n // fetch metadata of NFTs for page\n let nftData = []\n for (let i = 0; i < pageItems.length; i++) {\n let fetchResult = await fetch(pageItems[i].uri)\n let json = await fetchResult.json()\n nftData.push(json)\n }\n\n // set state\n setPageItems(nftData)\n }\n ...\n}\n\n")),(0,i.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u505a\u7684\u662f\u5c06 ",(0,i.kt)("inlineCode",{parentName:"p"},"items")," \u6570\u7ec4\u5207\u5272\u6210\u5927\u5c0f\u4e3a10\u7684\u5757\u3002\u7136\u540e\u6211\u4eec\u83b7\u53d6\u9875\u9762\u4e2d\u6bcf\u4e2aNFT\u7684\u5143\u6570\u636e\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728 ",(0,i.kt)("inlineCode",{parentName:"p"},"nftData")," \u4e2d\u3002\u6700\u540e\uff0c\u6211\u4eec\u5c06 ",(0,i.kt)("inlineCode",{parentName:"p"},"pageItems")," \u72b6\u6001\u53d8\u91cf\u8bbe\u7f6e\u4e3a\u521a\u521a\u83b7\u53d6\u7684 ",(0,i.kt)("inlineCode",{parentName:"p"},"nftData")," \u3002"),(0,i.kt)("p",null,"\u8fd9\u610f\u5473\u7740\u6211\u4eec\u7684\u5e94\u7528\u7a0b\u5e8f\u5728\u4efb\u4f55\u65f6\u5019\u53ea\u4f1a\u6e32\u67d3\u5f53\u524d\u9875\u9762\u7684NFT\u3002\u4e0d\u9519\uff01"),(0,i.kt)("p",null,"\u8ba9\u6211\u4eec\u586b\u5199 ",(0,i.kt)("inlineCode",{parentName:"p"},"prev")," \u548c ",(0,i.kt)("inlineCode",{parentName:"p"},"next")," \u51fd\u6570\uff1a"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},"// previous page\nconst prev = async () => {\n if (page - 1 < 1) {\n setPage(1)\n } else {\n setPage(page - 1)\n }\n}\n\n// next page\nconst next = async () => {\n setPage(page + 1)\n}\n")),(0,i.kt)("p",null,"\u5f53\u7528\u6237\u70b9\u51fb\u201c\u4e0a\u4e00\u4e2a\u201d\u548c\u201c\u4e0b\u4e00\u4e2a\u201d\u6309\u94ae\u65f6\uff0c\u8fd9\u4e9b\u5c06\u4f1a\u8fd0\u884c\uff0c\u8fd9\u4e9b\u6309\u94ae\u53ea\u4f1a\u5728 ",(0,i.kt)("inlineCode",{parentName:"p"},"pageItems")," \u4e0d\u4e3a\u7a7a\u65f6\u663e\u793a\uff08\u5373\u5f53\u6211\u4eec\u83b7\u53d6\u4e86\u4e00\u4e2aCM\u7684NFT\u65f6\uff09\u3002"),(0,i.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u9700\u8981\u4e00\u4e9b ",(0,i.kt)("inlineCode",{parentName:"p"},"useEffects")," \u6765\u5f00\u59cb\u3002\u6574\u4e2a\u8fc7\u7a0b\u4e00\u5f00\u59cb\u53ef\u80fd\u4f1a\u6709\u70b9\u56f0\u60d1\uff0c\u6240\u4ee5\u8ba9\u6211\u4eec\u4e00\u6b65\u4e00\u6b65\u6765\u89e3\u6790\u3002"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("ol",{parentName:"li"},(0,i.kt)("li",{parentName:"ol"},"\u5728\u9875\u9762\u52a0\u8f7d\u65f6\u8fd0\u884c ",(0,i.kt)("inlineCode",{parentName:"li"},"fetchCandyMachine")," \u51fd\u6570\uff08\u5982\u679c ",(0,i.kt)("inlineCode",{parentName:"li"},"candyMachineAddress")," \u4e0d\u4e3a\u7a7a\uff09"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("ol",{parentName:"li",start:2},(0,i.kt)("li",{parentName:"ol"},"\u6bcf\u5f53\u4f7f\u7528 ",(0,i.kt)("inlineCode",{parentName:"li"},"fetchCandyMachine")," \u83b7\u53d6\u7cd6\u679c\u673a\u65f6\uff0c\u5c06 ",(0,i.kt)("inlineCode",{parentName:"li"},"page")," \u8bbe\u7f6e\u4e3a1\uff0c\u8fd9\u6837\u4f60\u5c31\u53ef\u4ee5\u5f97\u5230\u7b2c\u4e00\u9875\u3002"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("ol",{parentName:"li",start:3},(0,i.kt)("li",{parentName:"ol"},"\u6bcf\u5f53 ",(0,i.kt)("inlineCode",{parentName:"li"},"candyMachineData")," \u6216 ",(0,i.kt)("inlineCode",{parentName:"li"},"page")," \u53d1\u751f\u53d8\u5316\uff08\u5373\u8f93\u5165\u65b0\u7684CM\u5730\u5740\u6216\u70b9\u51fb\u4e0b\u4e00\u4e2a/\u4e0a\u4e00\u4e2a\u6309\u94ae\uff09\uff0c\u52a0\u8f7d\u9875\u9762\u3002")))),(0,i.kt)("p",null,"\u8fd9\u662f\u4ee3\u7801\u4e2d\u7684\u6837\u5b50\uff1a"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-js"},"export const FetchCandyMachine: FC = () => {\n ...\n\n // fetch placeholder candy machine on load\n useEffect(() => {\n fetchCandyMachine()\n }, [])\n\n // fetch metadata for NFTs when page or candy machine changes\n useEffect(() => {\n if (!candyMachineData) {\n return\n }\n getPage(page, 9)\n }, [candyMachineData, page])\n\n}\n")),(0,i.kt)("p",null,"\u5feb\u53bb ",(0,i.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u8bd5\u8bd5\u5427\uff01\u4f60\u5e94\u8be5\u80fd\u770b\u5230\u4f60\u7684\u7cd6\u679c\u673a\u4e0a\u7684NFT\u7684\u7b2c\u4e00\u9875\u3002"))}m.isMDXComponent=!0},6953:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/candy-machine-nft-675170f974878ca6293f960241c6dbb4.png"},5858:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/find-by-address-result-e5eff2626f5a58314f6e35abbc359cf7.png"},4451:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/find-by-address-49e6b96be47f6f70559de3e8d31af886.png"},1474:(e,n,a)=>{a.d(n,{Z:()=>t});const t=a.p+"assets/images/find-nf-5e8b6b7e1b3ecec69d59cf99f80a82c5.png"}}]); \ No newline at end of file diff --git a/assets/js/d9f1fece.4e3b91e5.js b/assets/js/d9f1fece.4e3b91e5.js deleted file mode 100644 index ea20bdf07..000000000 --- a/assets/js/d9f1fece.4e3b91e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7539],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(t),u=r,k=d["".concat(s,".").concat(u)]||d[u]||m[u]||o;return t?a.createElement(k,i(i({ref:n},p),{},{components:t})):a.createElement(k,i({ref:n},p))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=u;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:41,sidebar_label:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",sidebar_class_name:"green"},i="\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",l={unversionedId:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README",id:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README",title:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u662f\u65f6\u5019\u56de\u5230\u6211\u4eec\u7684\u81ea\u5b9a\u4e49NFT\u8d28\u62bc\u5e94\u7528\u4e86\u3002\u6211\u4eec\u5c06\u5229\u7528\u6211\u4eec\u5728\u4ee3\u5e01\u7a0b\u5e8f\u548c\u7cd6\u679c\u673a\u4e0a\u7684\u7ecf\u9a8c\u6765\u6784\u5efa\u6211\u4eec\u7684\u5e94\u7528\u3002",source:"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README.md",sourceDirName:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens",slug:"/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README.md",tags:[],version:"current",sidebarPosition:41,frontMatter:{sidebar_position:41,sidebar_label:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/"},next:{title:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/"}},s={},c=[{value:"\ud83e\udd73 \u4ee3\u7801\u89e3\u6790",id:"-\u4ee3\u7801\u89e3\u6790",level:2},{value:"\ud83e\uded9 \u5143\u6570\u636e\u7684\u5b58\u50a8",id:"-\u5143\u6570\u636e\u7684\u5b58\u50a8",level:2},{value:"\ud83d\ude80 \u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801",id:"-\u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801",level:2}],p={toc:c},d="wrapper";function m(e){let{components:n,...o}=e;return(0,r.kt)(d,(0,a.Z)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u521b\u5efa\u5956\u52b1\u4ee3\u5e01"},"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u662f\u65f6\u5019\u56de\u5230\u6211\u4eec\u7684\u81ea\u5b9a\u4e49NFT\u8d28\u62bc\u5e94\u7528\u4e86\u3002\u6211\u4eec\u5c06\u5229\u7528\u6211\u4eec\u5728\u4ee3\u5e01\u7a0b\u5e8f\u548c\u7cd6\u679c\u673a\u4e0a\u7684\u7ecf\u9a8c\u6765\u6784\u5efa\u6211\u4eec\u7684\u5e94\u7528\u3002"),(0,r.kt)("p",null,"\u8bf7\u7ee7\u7eed\uff0c\u5728\u60a8\u7684\u6839\u76ee\u5f55\u4e2d\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"tokens")," \u7684\u65b0\u6587\u4ef6\u5939\u3002\u5728\u8be5\u6587\u4ef6\u5939\u5185\uff0c\u6211\u4eec\u9700\u8981\u521b\u5efa2\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"bld")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"candy-machine")," \u7684\u5b50\u6587\u4ef6\u5939\u3002\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7284).Z,width:"150",height:"433"})),(0,r.kt)("p",null,"\u6211\u4eec\u521b\u5efa\u8fd9\u4e2a\u7684\u539f\u56e0\u662f\u4e3a\u4e86\u6211\u4eec\u5806\u53e0 Builder \u65f6\u7684\u5956\u52b1\u4ee3\u5e01\uff0c\u4ee5\u53ca\u4e0e\u6211\u4eec\u7684 NFT \u76f8\u5173\u7684\u4e1c\u897f\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u5f00\u59cb\u521b\u5efa\u6211\u4eec\u7684\u8d44\u6e90\u6587\u4ef6\u5939\u3002\u8fd9\u5c06\u7528\u4e8e\u6211\u4eec\u4ee3\u5e01\u7684\u56fe\u50cf\u3002\u8fdb\u5165\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld")," \u6587\u4ef6\u5939\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"assets")," \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5e76\u5728\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld")," \u6587\u4ef6\u5939\u5185\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u7684\u65b0\u6587\u4ef6\u3002\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"\u251c\u2500\u2500 styles\n\u251c\u2500\u2500 tokens\n\u2502 \u251c\u2500\u2500 bld\n\u2502 | \u251c\u2500\u2500 assets\n\u2502 | \u251c\u2500\u2500 index.ts\n")),(0,r.kt)("p",null,"\u6ce8\u610f\uff1a\u786e\u4fdd\u4f60\u7684",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts"),"\u6587\u4ef6\u5728bld\u6587\u4ef6\u5939\u4e2d\uff0c\u800c\u4e0d\u662f\u5728",(0,r.kt)("inlineCode",{parentName:"p"},"assets"),"\u6587\u4ef6\u5939\u4e2d\u3002"),(0,r.kt)("p",null,"\u4f60\u4f1a\u6ce8\u610f\u5230\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u6587\u4ef6\u88ab\u6807\u8bb0\u4e3a\u7ea2\u8272\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u76ee\u524d\u8fd8\u6ca1\u6709\u4efb\u4f55\u4ee3\u7801\u3002\u8ba9\u6211\u4eec\u901a\u8fc7\u5411\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u4e2d\u6dfb\u52a0\u4e00\u4e9b\u4ee3\u7801\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u6211\u4eec\u8fd8\u9700\u8981\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"initializeKeypair")," \u6587\u4ef6\u79fb\u52a8\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld")," \u6587\u4ef6\u5939\u4e2d\u3002\u4f60\u8fd8\u9700\u8981\u5411 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld/assets")," \u6587\u4ef6\u5939\u4e2d\u6dfb\u52a0\u4e00\u5f20\u56fe\u7247\uff0c\u8fd9\u5c06\u662f\u4f60\u7684\u4ee4\u724c\u56fe\u7247\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import * as web3 from "@solana/web3.js";\nimport * as token from "@solana/spl-token";\nimport { initializeKeypair } from "./initializeKeypair";\n\nasync function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"));\n const payer = await initializeKeypair(connection);\n}\n\nmain()\n .then(() => {\n console.log("Finished successfully");\n process.exit(0);\n })\n .catch((error) => {\n console.log(error);\n process.exit(1);\n });\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff01\u73b0\u5728\u6211\u4eec\u6709\u4e86\u5f00\u59cb\u7684\u4ee3\u7801\uff0c\u8ba9\u6211\u4eec\u628a\u4e0b\u4e00\u6bb5\u4ee3\u7801\u7c98\u8d34\u5230\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u6587\u4ef6\u4e2d\u3002\u4f60\u53ef\u4ee5\u628a\u5b83\u653e\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," \u51fd\u6570\u4e0a\u65b9\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import * as fs from "fs";\nimport {\n bundlrStorage,\n keypairIdentity,\n Metaplex,\n toMetaplexFile,\n} from "@metaplex-foundation/js";\n\nimport {\n DataV2,\n createCreateMetadataAccountV2Instruction,\n} from "@metaplex-foundation/mpl-token-metadata";\n\nconst TOKEN_NAME = "BUILD";\nconst TOKEN_SYMBOL = "BLD";\nconst TOKEN_DESCRIPTION = "A token for buildoors";\nconst TOKEN_IMAGE_NAME = "unicorn.png"; // Replace unicorn.png with your image name\nconst TOKEN_IMAGE_PATH = `tokens/bld/assets/${TOKEN_IMAGE_NAME}`;\n\nasync function createBldToken(\n connection: web3.Connection,\n payer: web3.Keypair\n) {\n // This will create a token with all the necessary inputs\n const tokenMint = await token.createMint(\n connection, // Connection\n payer, // Payer\n payer.publicKey, // Your wallet public key\n payer.publicKey, // Freeze authority\n 2 // Decimals\n );\n\n // Create a metaplex object so that we can create a metaplex metadata\n const metaplex = Metaplex.make(connection)\n .use(keypairIdentity(payer))\n .use(\n bundlrStorage({\n address: "https://devnet.bundlr.network",\n providerUrl: "https://api.devnet.solana.com",\n timeout: 60000,\n })\n );\n\n // Read image file\n const imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);\n const file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);\n const imageUri = await metaplex.storage().upload(file);\n\n // Upload the rest of offchain metadata\n const { uri } = await metaplex\n .nfts()\n .uploadMetadata({\n name: TOKEN_NAME,\n description: TOKEN_DESCRIPTION,\n image: imageUri,\n });\n\n // Finding out the address where the metadata is stored\n const metadataPda = metaplex.nfts().pdas().metadata({mint: tokenMint});\n const tokenMetadata = {\n name: TOKEN_NAME,\n symbol: TOKEN_SYMBOL,\n uri: uri,\n sellerFeeBasisPoints: 0,\n creators: null,\n collection: null,\n uses: null,\n } as DataV2\n\n const instruction = createCreateMetadataAccountV2Instruction({\n metadata: metadataPda,\n mint: tokenMint,\n mintAuthority: payer.publicKey,\n payer: payer.publicKey,\n updateAuthority: payer.publicKey\n },\n {\n createMetadataAccountArgsV2: {\n data: tokenMetadata,\n isMutable: true\n }\n })\n\n const transaction = new web3.Transaction()\n transaction.add(instruction)\n\n const transactionSignature = await web3.sendAndConfirmTransaction(\n connection,\n transaction,\n [payer]\n )\n}\n\n// The rest of your main function\n')),(0,r.kt)("h2",{id:"-\u4ee3\u7801\u89e3\u6790"},"\ud83e\udd73 \u4ee3\u7801\u89e3\u6790"),(0,r.kt)("p",null,"\u597d\u7684\uff0c\u8ba9\u6211\u4eec\u628a\u8fd9\u4e00\u5207\u90fd\u5206\u89e3\u5f00\u6765\uff0c\u5c31\u50cf\u5236\u4f5c\u67e0\u6aac\u6c34\u4e00\u6837\u7b80\u5355\u3002"),(0,r.kt)("p",null,"\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u6b63\u5728\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"createMint")," \u51fd\u6570\u6765\u521b\u5efa\u5e76\u521d\u59cb\u5316\u4e00\u4e2a\u65b0\u7684\u94f8\u5e01\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://solana-labs.github.io/solana-program-library/token/js/modules.html#createMint?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u5173\u4e8e\u8fd9\u4e2a\u51fd\u6570\u7684\u4fe1\u606f\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// This will create a token with all the necessary inputs\nconst tokenMint = await token.createMint(\n connection, // Connection\n payer, // Payer\n payer.publicKey, // Your wallet public key\n payer.publicKey, // Freeze authority\n 2 // Decimals\n);\n")),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u6b63\u5728\u521b\u5efa\u4e00\u4e2ametaplex\u5bf9\u8c61\uff0c\u4ee5\u4fbf\u5b83\u53ef\u4ee5\u751f\u6210metaplex\u5143\u6570\u636e\u5e76\u5c06\u5176\u4e0a\u4f20\u5230bundlrStorage\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// Create a metaplex object so that we can create a metaplex metadata\nconst metaplex = Metaplex.make(connection)\n .use(keypairIdentity(payer))\n .use(\n bundlrStorage({\n address: "https://devnet.bundlr.network",\n providerUrl: "https://api.devnet.solana.com",\n timeout: 60000,\n })\n );\n')),(0,r.kt)("p",null,"\u8fd9\u90e8\u5206\u5f88\u5bb9\u6613\u7406\u89e3\u3002\u6211\u4eec\u73b0\u5728\u6b63\u5728\u5c1d\u8bd5\u8bfb\u53d6\u6211\u4eec\u653e\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld/assets")," \u6587\u4ef6\u5939\u4e2d\u7684\u56fe\u50cf\u6587\u4ef6\uff0c\u5e76\u5c06\u5143\u6570\u636e\u4e0a\u4f20\u5230\u5b58\u50a8\u7a7a\u95f4\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// Read image file\nconst imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);\nconst file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);\nconst imageUri = await metaplex.storage().upload(file);\n// Upload the rest of offchain metadata\nconst { uri } = await metaplex\n .nfts()\n .uploadMetadata({\n name: TOKEN_NAME,\n description: TOKEN_DESCRIPTION,\n image: imageUri,\n });\n")),(0,r.kt)("p",null,"\u4e00\u65e6\u6211\u4eec\u6210\u529f\u5c06\u56fe\u50cf\u4e0a\u4f20\u5230metaplex\uff0c\u6211\u4eec\u5c06\u901a\u8fc7\u8c03\u7528\u4e0b\u9762\u7684\u90e8\u5206\u6765\u83b7\u53d6\u5730\u5740\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// Finding out the address where the metadata is stored\nconst metadataPda = metaplex.nfts().pdas().metadata({mint: tokenMint});\nconst tokenMetadata = {\n name: TOKEN_NAME,\n symbol: TOKEN_SYMBOL,\n uri: uri,\n sellerFeeBasisPoints: 0,\n creators: null,\n collection: null,\n uses: null,\n} as DataV2\n\nconst instruction = createCreateMetadataAccountV2Instruction({\n metadata: metadataPda,\n mint: tokenMint,\n mintAuthority: payer.publicKey,\n payer: payer.publicKey,\n updateAuthority: payer.publicKey\n},\n{\n createMetadataAccountArgsV2: {\n data: tokenMetadata,\n isMutable: true\n }\n})\n\nconst transaction = new web3.Transaction()\ntransaction.add(instruction)\nconst transactionSignature = await web3.sendAndConfirmTransaction(\n connection,\n transaction,\n [payer]\n)\n")),(0,r.kt)("h2",{id:"-\u5143\u6570\u636e\u7684\u5b58\u50a8"},"\ud83e\uded9 \u5143\u6570\u636e\u7684\u5b58\u50a8"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u521b\u5efa\u4e86\u5e26\u6709\u4ee5\u4e0b\u5143\u6570\u636e\u7684\u8584\u8377\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u4e0b\u4e00\u6b65\u5427\uff01\u73b0\u5728\u6211\u4eec\u5c06\u901a\u8fc7\u7f16\u5199\u4ee5\u4e0b\u4ee3\u7801\u5c06\u5143\u6570\u636e\u6587\u4ef6\u5199\u5165\u6211\u4eec\u7684\u6587\u4ef6\u5939\u4e2d\u3002"),(0,r.kt)("p",null,"\u5c31\u5728\u60a8\u5b9a\u4e49 ",(0,r.kt)("inlineCode",{parentName:"p"},"transactionSignature")," \u7684\u4e0b\u65b9\uff0c\u8ba9\u6211\u4eec\u628a\u8fd9\u6bb5\u4ee3\u7801\u653e\u5728\u8fd9\u91cc\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'fs.writeFileSync(\n "tokens/bld/cache.json",\n JSON.stringify({\n mint: tokenMint.toBase58(),\n imageUri: imageUri,\n metadataUri: uri,\n tokenMetadata: metadataPda.toBase58(),\n metadataTransaction: transactionSignature,\n })\n);\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff01\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u7f16\u5199\u6211\u4eec\u7684 createBldToken \u51fd\u6570\u3002\u73b0\u5728\uff0c\u8ba9\u6211\u4eec\u5728\u4e0b\u9762\u7684 main \u51fd\u6570\u4e2d\u5f00\u59cb\u8c03\u7528\u8fd9\u4e2a\u51fd\u6570\u3002\u4f60\u7684 main \u51fd\u6570\u73b0\u5728\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"));\n const payer = await initializeKeypair(connection);\n\n await createBldToken(connection, payer);\n}\n')),(0,r.kt)("p",null,"\u5c31\u8fd9\u6837\u4e86\u3002\u4f60\u73b0\u5728\u5b8c\u6210\u4e86\u3002\u8ba9\u6211\u4eec\u5f00\u59cb\u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801\u3002"),(0,r.kt)("h2",{id:"-\u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801"},"\ud83d\ude80 \u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801"),(0,r.kt)("p",null,"\u5728VS Code\u4e2d\u6253\u5f00\u7ec8\u7aef\u3002\u9996\u5148\u9700\u8981\u5b89\u88c5\u4e00\u4e2a\u540d\u4e3a ts-node \u7684\u6a21\u5757\u3002\u8fd9\u662f\u5fc5\u9700\u7684\uff0c\u56e0\u4e3a\u6211\u4eec\u5c06\u8fd0\u884c\u4e00\u4e9bTypeScript\u547d\u4ee4\u3002\u5728\u7ec8\u7aef\u4e2d\u8f93\u5165 npm install --save-dev ts-node \u3002\u73b0\u5728\uff0c\u8f6c\u5230\u60a8\u7684 package.json \u5e76\u5c06\u6b64\u884c\u6dfb\u52a0\u5230 scripts \u90e8\u5206\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'"create-bld-token": "ts-node ./src/tokens/bld/index.ts"\n')),(0,r.kt)("p",null,"\u73b0\u5728\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7898).Z,width:"582",height:"389"})),(0,r.kt)("p",null,"\u8bb0\u5f97\u4fdd\u5b58\u4f60\u7684\u66f4\u6539\uff01\u73b0\u5728\u4f60\u5e94\u8be5\u80fd\u591f\u901a\u8fc7\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run create-bld-token")," \u6765\u4f7f\u7528\u4f60\u6dfb\u52a0\u7684\u65b0\u547d\u4ee4\u3002\u8fd9\u5c06\u5f00\u59cb\u5728\u5f00\u53d1\u7f51\u7edc\u4e2d\u4e3a\u4f60\u521b\u5efa\u548c\u94f8\u9020\u4ee3\u5e01\u3002\u4e00\u65e6\u5b8c\u6210\uff0c\u4f60\u5e94\u8be5\u80fd\u591f\u5728\u4f60\u7684\u6587\u4ef6\u5939\u4e2d\u770b\u5230\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"cache.json")," \u3002\u6253\u5f00\u5b83\uff0c\u5b83\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50\u3002"),(0,r.kt)("p",null,"\u6ce8\u610f\uff1a\u5982\u679c\u60a8\u6536\u5230\u7c7b\u4f3c ",(0,r.kt)("inlineCode",{parentName:"p"},"SyntaxError: Cannot use import statement outside a module")," \u7684\u9519\u8bef\uff0c\u8bf7\u68c0\u67e5\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"tsconfig.json")," \u5e76\u6dfb\u52a0/\u66f4\u6539\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},'"module": "CommonJS"')),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(1599).Z,width:"1142",height:"199"})),(0,r.kt)("p",null,"\u8bf7\u590d\u5236 ",(0,r.kt)("inlineCode",{parentName:"p"},"mint")," \u4e2d\u5217\u51fa\u7684\u5730\u5740\uff0c\u5e76\u5c06\u5176\u7c98\u8d34\u5230",(0,r.kt)("inlineCode",{parentName:"p"},"https://explorer.solana.com/?cluster=devnet"),"\u3002\u73b0\u5728\uff0c\u60a8\u5e94\u8be5\u80fd\u591f\u770b\u5230\u60a8\u9009\u62e9\u7684\u56fe\u50cf\u7684\u4ee3\u5e01\uff0c\u5c31\u50cf\u8fd9\u6837\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7284).Z,width:"150",height:"433"})))}m.isMDXComponent=!0},1599:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/config-result-ba4b1dd8d70b87f073115981078afe50.png"},7898:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/config-4a50b99edeeb5d01c14685984f916064.png"},7284:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/tokens-25f737d2ae35cffaab66dc9251760e39.png"}}]); \ No newline at end of file diff --git a/assets/js/d9f1fece.b49b73b9.js b/assets/js/d9f1fece.b49b73b9.js new file mode 100644 index 000000000..7c3398aca --- /dev/null +++ b/assets/js/d9f1fece.b49b73b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7539],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>k});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function i(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),c=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},p=function(e){var n=c(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},u=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(t),u=r,k=d["".concat(s,".").concat(u)]||d[u]||m[u]||o;return t?a.createElement(k,i(i({ref:n},p),{},{components:t})):a.createElement(k,i({ref:n},p))}));function k(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,i=new Array(o);i[0]=u;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var a=t(7462),r=(t(7294),t(3905));const o={sidebar_position:41,sidebar_label:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",sidebar_class_name:"green"},i="\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",l={unversionedId:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README",id:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README",title:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",description:"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u662f\u65f6\u5019\u56de\u5230\u6211\u4eec\u7684\u81ea\u5b9a\u4e49NFT\u8d28\u62bc\u5e94\u7528\u4e86\u3002\u6211\u4eec\u5c06\u5229\u7528\u6211\u4eec\u5728\u4ee3\u5e01\u7a0b\u5e8f\u548c\u7cd6\u679c\u673a\u4e0a\u7684\u7ecf\u9a8c\u6765\u6784\u5efa\u6211\u4eec\u7684\u5e94\u7528\u3002",source:"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README.md",sourceDirName:"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens",slug:"/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README.md",tags:[],version:"current",sidebarPosition:41,frontMatter:{sidebar_position:41,sidebar_label:"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u521b\u9020\u795e\u5947\u7684\u4e92\u8054\u7f51\u8d27\u5e01\u5e76\u51fa\u552eJPEG\u56fe\u7247",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/"},next:{title:"\ud83c\udf6c \u521b\u9020\u7cd6\u679c\u673a",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/"}},s={},c=[{value:"\ud83e\udd73 \u4ee3\u7801\u89e3\u6790",id:"-\u4ee3\u7801\u89e3\u6790",level:2},{value:"\ud83e\uded9 \u5143\u6570\u636e\u7684\u5b58\u50a8",id:"-\u5143\u6570\u636e\u7684\u5b58\u50a8",level:2},{value:"\ud83d\ude80 \u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801",id:"-\u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801",level:2}],p={toc:c},d="wrapper";function m(e){let{components:n,...o}=e;return(0,r.kt)(d,(0,a.Z)({},p,o,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"-\u521b\u5efa\u5956\u52b1\u4ee3\u5e01"},"\ud83c\udfa8 \u521b\u5efa\u5956\u52b1\u4ee3\u5e01"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u5141\u8bb8\u521b\u4f5c\u8005\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u662f\u65f6\u5019\u56de\u5230\u6211\u4eec\u7684\u81ea\u5b9a\u4e49NFT\u8d28\u62bc\u5e94\u7528\u4e86\u3002\u6211\u4eec\u5c06\u5229\u7528\u6211\u4eec\u5728\u4ee3\u5e01\u7a0b\u5e8f\u548c\u7cd6\u679c\u673a\u4e0a\u7684\u7ecf\u9a8c\u6765\u6784\u5efa\u6211\u4eec\u7684\u5e94\u7528\u3002"),(0,r.kt)("p",null,"\u8bf7\u7ee7\u7eed\uff0c\u5728\u60a8\u7684\u6839\u76ee\u5f55\u4e2d\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"tokens")," \u7684\u65b0\u6587\u4ef6\u5939\u3002\u5728\u8be5\u6587\u4ef6\u5939\u5185\uff0c\u6211\u4eec\u9700\u8981\u521b\u5efa2\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"bld")," \u548c ",(0,r.kt)("inlineCode",{parentName:"p"},"candy-machine")," \u7684\u5b50\u6587\u4ef6\u5939\u3002\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7284).Z,width:"150",height:"433"})),(0,r.kt)("p",null,"\u6211\u4eec\u521b\u5efa\u8fd9\u4e2a\u7684\u539f\u56e0\u662f\u4e3a\u4e86\u6211\u4eec\u5806\u53e0 Builder \u65f6\u7684\u5956\u52b1\u4ee3\u5e01\uff0c\u4ee5\u53ca\u4e0e\u6211\u4eec\u7684 NFT \u76f8\u5173\u7684\u4e1c\u897f\u3002"),(0,r.kt)("p",null,"\u73b0\u5728\u8ba9\u6211\u4eec\u5f00\u59cb\u521b\u5efa\u6211\u4eec\u7684\u8d44\u6e90\u6587\u4ef6\u5939\u3002\u8fd9\u5c06\u7528\u4e8e\u6211\u4eec\u4ee3\u5e01\u7684\u56fe\u50cf\u3002\u8fdb\u5165\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld")," \u6587\u4ef6\u5939\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"assets")," \u7684\u65b0\u6587\u4ef6\u5939\uff0c\u5e76\u5728\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld")," \u6587\u4ef6\u5939\u5185\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u7684\u65b0\u6587\u4ef6\u3002\u5b83\u5e94\u8be5\u770b\u8d77\u6765\u50cf\u8fd9\u6837\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"\u251c\u2500\u2500 styles\n\u251c\u2500\u2500 tokens\n\u2502 \u251c\u2500\u2500 bld\n\u2502 | \u251c\u2500\u2500 assets\n\u2502 | \u251c\u2500\u2500 index.ts\n")),(0,r.kt)("p",null,"\u6ce8\u610f\uff1a\u786e\u4fdd\u4f60\u7684",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts"),"\u6587\u4ef6\u5728bld\u6587\u4ef6\u5939\u4e2d\uff0c\u800c\u4e0d\u662f\u5728",(0,r.kt)("inlineCode",{parentName:"p"},"assets"),"\u6587\u4ef6\u5939\u4e2d\u3002"),(0,r.kt)("p",null,"\u4f60\u4f1a\u6ce8\u610f\u5230\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u6587\u4ef6\u88ab\u6807\u8bb0\u4e3a\u7ea2\u8272\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u76ee\u524d\u8fd8\u6ca1\u6709\u4efb\u4f55\u4ee3\u7801\u3002\u8ba9\u6211\u4eec\u901a\u8fc7\u5411\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u4e2d\u6dfb\u52a0\u4e00\u4e9b\u4ee3\u7801\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u6211\u4eec\u8fd8\u9700\u8981\u5c06 ",(0,r.kt)("inlineCode",{parentName:"p"},"initializeKeypair")," \u6587\u4ef6\u79fb\u52a8\u5230 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld")," \u6587\u4ef6\u5939\u4e2d\u3002\u4f60\u8fd8\u9700\u8981\u5411 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld/assets")," \u6587\u4ef6\u5939\u4e2d\u6dfb\u52a0\u4e00\u5f20\u56fe\u7247\uff0c\u8fd9\u5c06\u662f\u4f60\u7684\u4ee4\u724c\u56fe\u7247\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import * as web3 from "@solana/web3.js";\nimport * as token from "@solana/spl-token";\nimport { initializeKeypair } from "./initializeKeypair";\n\nasync function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"));\n const payer = await initializeKeypair(connection);\n}\n\nmain()\n .then(() => {\n console.log("Finished successfully");\n process.exit(0);\n })\n .catch((error) => {\n console.log(error);\n process.exit(1);\n });\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff01\u73b0\u5728\u6211\u4eec\u6709\u4e86\u5f00\u59cb\u7684\u4ee3\u7801\uff0c\u8ba9\u6211\u4eec\u628a\u4e0b\u4e00\u6bb5\u4ee3\u7801\u7c98\u8d34\u5230\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"index.ts")," \u6587\u4ef6\u4e2d\u3002\u4f60\u53ef\u4ee5\u628a\u5b83\u653e\u5728\u4f60\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," \u51fd\u6570\u4e0a\u65b9\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'import * as fs from "fs";\nimport {\n bundlrStorage,\n keypairIdentity,\n Metaplex,\n toMetaplexFile,\n} from "@metaplex-foundation/js";\n\nimport {\n DataV2,\n createCreateMetadataAccountV2Instruction,\n} from "@metaplex-foundation/mpl-token-metadata";\n\nconst TOKEN_NAME = "BUILD";\nconst TOKEN_SYMBOL = "BLD";\nconst TOKEN_DESCRIPTION = "A token for buildoors";\nconst TOKEN_IMAGE_NAME = "unicorn.png"; // Replace unicorn.png with your image name\nconst TOKEN_IMAGE_PATH = `tokens/bld/assets/${TOKEN_IMAGE_NAME}`;\n\nasync function createBldToken(\n connection: web3.Connection,\n payer: web3.Keypair\n) {\n // This will create a token with all the necessary inputs\n const tokenMint = await token.createMint(\n connection, // Connection\n payer, // Payer\n payer.publicKey, // Your wallet public key\n payer.publicKey, // Freeze authority\n 2 // Decimals\n );\n\n // Create a metaplex object so that we can create a metaplex metadata\n const metaplex = Metaplex.make(connection)\n .use(keypairIdentity(payer))\n .use(\n bundlrStorage({\n address: "https://devnet.bundlr.network",\n providerUrl: "https://api.devnet.solana.com",\n timeout: 60000,\n })\n );\n\n // Read image file\n const imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);\n const file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);\n const imageUri = await metaplex.storage().upload(file);\n\n // Upload the rest of offchain metadata\n const { uri } = await metaplex\n .nfts()\n .uploadMetadata({\n name: TOKEN_NAME,\n description: TOKEN_DESCRIPTION,\n image: imageUri,\n });\n\n // Finding out the address where the metadata is stored\n const metadataPda = metaplex.nfts().pdas().metadata({mint: tokenMint});\n const tokenMetadata = {\n name: TOKEN_NAME,\n symbol: TOKEN_SYMBOL,\n uri: uri,\n sellerFeeBasisPoints: 0,\n creators: null,\n collection: null,\n uses: null,\n } as DataV2\n\n const instruction = createCreateMetadataAccountV2Instruction({\n metadata: metadataPda,\n mint: tokenMint,\n mintAuthority: payer.publicKey,\n payer: payer.publicKey,\n updateAuthority: payer.publicKey\n },\n {\n createMetadataAccountArgsV2: {\n data: tokenMetadata,\n isMutable: true\n }\n })\n\n const transaction = new web3.Transaction()\n transaction.add(instruction)\n\n const transactionSignature = await web3.sendAndConfirmTransaction(\n connection,\n transaction,\n [payer]\n )\n}\n\n// The rest of your main function\n')),(0,r.kt)("h2",{id:"-\u4ee3\u7801\u89e3\u6790"},"\ud83e\udd73 \u4ee3\u7801\u89e3\u6790"),(0,r.kt)("p",null,"\u597d\u7684\uff0c\u8ba9\u6211\u4eec\u628a\u8fd9\u4e00\u5207\u90fd\u5206\u89e3\u5f00\u6765\uff0c\u5c31\u50cf\u5236\u4f5c\u67e0\u6aac\u6c34\u4e00\u6837\u7b80\u5355\u3002"),(0,r.kt)("p",null,"\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u6b63\u5728\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"createMint")," \u51fd\u6570\u6765\u521b\u5efa\u5e76\u521d\u59cb\u5316\u4e00\u4e2a\u65b0\u7684\u94f8\u5e01\u3002\u60a8\u53ef\u4ee5\u5728",(0,r.kt)("a",{parentName:"p",href:"https://solana-labs.github.io/solana-program-library/token/js/modules.html#createMint?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u5173\u4e8e\u8fd9\u4e2a\u51fd\u6570\u7684\u4fe1\u606f\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// This will create a token with all the necessary inputs\nconst tokenMint = await token.createMint(\n connection, // Connection\n payer, // Payer\n payer.publicKey, // Your wallet public key\n payer.publicKey, // Freeze authority\n 2 // Decimals\n);\n")),(0,r.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u6b63\u5728\u521b\u5efa\u4e00\u4e2ametaplex\u5bf9\u8c61\uff0c\u4ee5\u4fbf\u5b83\u53ef\u4ee5\u751f\u6210metaplex\u5143\u6570\u636e\u5e76\u5c06\u5176\u4e0a\u4f20\u5230bundlrStorage\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'// Create a metaplex object so that we can create a metaplex metadata\nconst metaplex = Metaplex.make(connection)\n .use(keypairIdentity(payer))\n .use(\n bundlrStorage({\n address: "https://devnet.bundlr.network",\n providerUrl: "https://api.devnet.solana.com",\n timeout: 60000,\n })\n );\n')),(0,r.kt)("p",null,"\u8fd9\u90e8\u5206\u5f88\u5bb9\u6613\u7406\u89e3\u3002\u6211\u4eec\u73b0\u5728\u6b63\u5728\u5c1d\u8bd5\u8bfb\u53d6\u6211\u4eec\u653e\u5728 ",(0,r.kt)("inlineCode",{parentName:"p"},"bld/assets")," \u6587\u4ef6\u5939\u4e2d\u7684\u56fe\u50cf\u6587\u4ef6\uff0c\u5e76\u5c06\u5143\u6570\u636e\u4e0a\u4f20\u5230\u5b58\u50a8\u7a7a\u95f4\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// Read image file\nconst imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);\nconst file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);\nconst imageUri = await metaplex.storage().upload(file);\n// Upload the rest of offchain metadata\nconst { uri } = await metaplex\n .nfts()\n .uploadMetadata({\n name: TOKEN_NAME,\n description: TOKEN_DESCRIPTION,\n image: imageUri,\n });\n")),(0,r.kt)("p",null,"\u4e00\u65e6\u6211\u4eec\u6210\u529f\u5c06\u56fe\u50cf\u4e0a\u4f20\u5230metaplex\uff0c\u6211\u4eec\u5c06\u901a\u8fc7\u8c03\u7528\u4e0b\u9762\u7684\u90e8\u5206\u6765\u83b7\u53d6\u5730\u5740\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},"// Finding out the address where the metadata is stored\nconst metadataPda = metaplex.nfts().pdas().metadata({mint: tokenMint});\nconst tokenMetadata = {\n name: TOKEN_NAME,\n symbol: TOKEN_SYMBOL,\n uri: uri,\n sellerFeeBasisPoints: 0,\n creators: null,\n collection: null,\n uses: null,\n} as DataV2\n\nconst instruction = createCreateMetadataAccountV2Instruction({\n metadata: metadataPda,\n mint: tokenMint,\n mintAuthority: payer.publicKey,\n payer: payer.publicKey,\n updateAuthority: payer.publicKey\n},\n{\n createMetadataAccountArgsV2: {\n data: tokenMetadata,\n isMutable: true\n }\n})\n\nconst transaction = new web3.Transaction()\ntransaction.add(instruction)\nconst transactionSignature = await web3.sendAndConfirmTransaction(\n connection,\n transaction,\n [payer]\n)\n")),(0,r.kt)("h2",{id:"-\u5143\u6570\u636e\u7684\u5b58\u50a8"},"\ud83e\uded9 \u5143\u6570\u636e\u7684\u5b58\u50a8"),(0,r.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u521b\u5efa\u4e86\u5e26\u6709\u4ee5\u4e0b\u5143\u6570\u636e\u7684\u8584\u8377\u3002\u8ba9\u6211\u4eec\u7ee7\u7eed\u4e0b\u4e00\u6b65\u5427\uff01\u73b0\u5728\u6211\u4eec\u5c06\u901a\u8fc7\u7f16\u5199\u4ee5\u4e0b\u4ee3\u7801\u5c06\u5143\u6570\u636e\u6587\u4ef6\u5199\u5165\u6211\u4eec\u7684\u6587\u4ef6\u5939\u4e2d\u3002"),(0,r.kt)("p",null,"\u5c31\u5728\u60a8\u5b9a\u4e49 ",(0,r.kt)("inlineCode",{parentName:"p"},"transactionSignature")," \u7684\u4e0b\u65b9\uff0c\u8ba9\u6211\u4eec\u628a\u8fd9\u6bb5\u4ee3\u7801\u653e\u5728\u8fd9\u91cc\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'fs.writeFileSync(\n "tokens/bld/cache.json",\n JSON.stringify({\n mint: tokenMint.toBase58(),\n imageUri: imageUri,\n metadataUri: uri,\n tokenMetadata: metadataPda.toBase58(),\n metadataTransaction: transactionSignature,\n })\n);\n')),(0,r.kt)("p",null,"\u592a\u68d2\u4e86\uff01\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u7f16\u5199\u6211\u4eec\u7684 createBldToken \u51fd\u6570\u3002\u73b0\u5728\uff0c\u8ba9\u6211\u4eec\u5728\u4e0b\u9762\u7684 main \u51fd\u6570\u4e2d\u5f00\u59cb\u8c03\u7528\u8fd9\u4e2a\u51fd\u6570\u3002\u4f60\u7684 main \u51fd\u6570\u73b0\u5728\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ts"},'async function main() {\n const connection = new web3.Connection(web3.clusterApiUrl("devnet"));\n const payer = await initializeKeypair(connection);\n\n await createBldToken(connection, payer);\n}\n')),(0,r.kt)("p",null,"\u5c31\u8fd9\u6837\u4e86\u3002\u4f60\u73b0\u5728\u5b8c\u6210\u4e86\u3002\u8ba9\u6211\u4eec\u5f00\u59cb\u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801\u3002"),(0,r.kt)("h2",{id:"-\u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801"},"\ud83d\ude80 \u8fd0\u884c\u6211\u4eec\u7684\u4ee3\u7801"),(0,r.kt)("p",null,"\u5728VS Code\u4e2d\u6253\u5f00\u7ec8\u7aef\u3002\u9996\u5148\u9700\u8981\u5b89\u88c5\u4e00\u4e2a\u540d\u4e3a ts-node \u7684\u6a21\u5757\u3002\u8fd9\u662f\u5fc5\u9700\u7684\uff0c\u56e0\u4e3a\u6211\u4eec\u5c06\u8fd0\u884c\u4e00\u4e9bTypeScript\u547d\u4ee4\u3002\u5728\u7ec8\u7aef\u4e2d\u8f93\u5165 npm install --save-dev ts-node \u3002\u73b0\u5728\uff0c\u8f6c\u5230\u60a8\u7684 package.json \u5e76\u5c06\u6b64\u884c\u6dfb\u52a0\u5230 scripts \u90e8\u5206\u3002"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'"create-bld-token": "ts-node ./src/tokens/bld/index.ts"\n')),(0,r.kt)("p",null,"\u73b0\u5728\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7898).Z,width:"582",height:"389"})),(0,r.kt)("p",null,"\u8bb0\u5f97\u4fdd\u5b58\u4f60\u7684\u66f4\u6539\uff01\u73b0\u5728\u4f60\u5e94\u8be5\u80fd\u591f\u901a\u8fc7\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c ",(0,r.kt)("inlineCode",{parentName:"p"},"npm run create-bld-token")," \u6765\u4f7f\u7528\u4f60\u6dfb\u52a0\u7684\u65b0\u547d\u4ee4\u3002\u8fd9\u5c06\u5f00\u59cb\u5728\u5f00\u53d1\u7f51\u7edc\u4e2d\u4e3a\u4f60\u521b\u5efa\u548c\u94f8\u9020\u4ee3\u5e01\u3002\u4e00\u65e6\u5b8c\u6210\uff0c\u4f60\u5e94\u8be5\u80fd\u591f\u5728\u4f60\u7684\u6587\u4ef6\u5939\u4e2d\u770b\u5230\u4e00\u4e2a ",(0,r.kt)("inlineCode",{parentName:"p"},"cache.json")," \u3002\u6253\u5f00\u5b83\uff0c\u5b83\u5e94\u8be5\u662f\u8fd9\u4e2a\u6837\u5b50\u3002"),(0,r.kt)("p",null,"\u6ce8\u610f\uff1a\u5982\u679c\u60a8\u6536\u5230\u7c7b\u4f3c ",(0,r.kt)("inlineCode",{parentName:"p"},"SyntaxError: Cannot use import statement outside a module")," \u7684\u9519\u8bef\uff0c\u8bf7\u68c0\u67e5\u60a8\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"tsconfig.json")," \u5e76\u6dfb\u52a0/\u66f4\u6539\u4e3a ",(0,r.kt)("inlineCode",{parentName:"p"},'"module": "CommonJS"')),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(1599).Z,width:"1142",height:"199"})),(0,r.kt)("p",null,"\u8bf7\u590d\u5236 ",(0,r.kt)("inlineCode",{parentName:"p"},"mint")," \u4e2d\u5217\u51fa\u7684\u5730\u5740\uff0c\u5e76\u5c06\u5176\u7c98\u8d34\u5230",(0,r.kt)("inlineCode",{parentName:"p"},"https://explorer.solana.com/?cluster=devnet"),"\u3002\u73b0\u5728\uff0c\u60a8\u5e94\u8be5\u80fd\u591f\u770b\u5230\u60a8\u9009\u62e9\u7684\u56fe\u50cf\u7684\u4ee3\u5e01\uff0c\u5c31\u50cf\u8fd9\u6837\u3002"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(7284).Z,width:"150",height:"433"})))}m.isMDXComponent=!0},1599:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/config-result-ba4b1dd8d70b87f073115981078afe50.png"},7898:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/config-4a50b99edeeb5d01c14685984f916064.png"},7284:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/tokens-25f737d2ae35cffaab66dc9251760e39.png"}}]); \ No newline at end of file diff --git a/assets/js/ddbb43e1.0ee5b354.js b/assets/js/ddbb43e1.0ee5b354.js deleted file mode 100644 index b82c3d017..000000000 --- a/assets/js/ddbb43e1.0ee5b354.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9592],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),p=s(n),m=a,f=p["".concat(c,".").concat(m)]||p[m]||u[m]||o;return n?r.createElement(f,l(l({ref:t},d),{},{components:n})):r.createElement(f,l({ref:t},d))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(7462),a=(n(7294),n(3905));const o={sidebar_position:12,sidebar_label:"\u5ba2\u6237\u7aef\u5f00\u53d1",sidebar_class_name:"green"},l="\u5ba2\u6237\u7aef\u5f00\u53d1",i={unversionedId:"Solana-Co-Learn/module1/client-side-development/README",id:"Solana-Co-Learn/module1/client-side-development/README",title:"\u5ba2\u6237\u7aef\u5f00\u53d1",description:"- \ud83d\udcf9\u4f7f\u7528Gage\u5728Solana\u4e0a\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e",source:"@site/docs/Solana-Co-Learn/module1/client-side-development/README.md",sourceDirName:"Solana-Co-Learn/module1/client-side-development",slug:"/Solana-Co-Learn/module1/client-side-development/",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/client-side-development/README.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{sidebar_position:12,sidebar_label:"\u5ba2\u6237\u7aef\u5f00\u53d1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello"},next:{title:"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e",permalink:"/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/"}},c={},s=[],d={toc:s},p="wrapper";function u(e){let{components:t,...n}=e;return(0,a.kt)(p,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u5ba2\u6237\u7aef\u5f00\u53d1"},"\u5ba2\u6237\u7aef\u5f00\u53d1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u4f7f\u7528Gage\u5728Solana\u4e0a\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/"},"\u4ece\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/"},"\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/"},"\u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ddbb43e1.3ea521b8.js b/assets/js/ddbb43e1.3ea521b8.js new file mode 100644 index 000000000..306d41f5d --- /dev/null +++ b/assets/js/ddbb43e1.3ea521b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9592],{3905:(e,n,t)=>{t.d(n,{Zo:()=>d,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=r.createContext({}),s=function(e){var n=r.useContext(c),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},d=function(e){var n=s(e.components);return r.createElement(c.Provider,{value:n},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),p=s(t),m=a,f=p["".concat(c,".").concat(m)]||p[m]||u[m]||o;return t?r.createElement(f,l(l({ref:n},d),{},{components:t})):r.createElement(f,l({ref:n},d))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=m;var i={};for(var c in n)hasOwnProperty.call(n,c)&&(i[c]=n[c]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var s=2;s{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:12,sidebar_label:"\u5ba2\u6237\u7aef\u5f00\u53d1",sidebar_class_name:"green"},l="\u5ba2\u6237\u7aef\u5f00\u53d1",i={unversionedId:"Solana-Co-Learn/module1/client-side-development/README",id:"Solana-Co-Learn/module1/client-side-development/README",title:"\u5ba2\u6237\u7aef\u5f00\u53d1",description:"- \ud83d\udcf9\u4f7f\u7528Gage\u5728Solana\u4e0a\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e",source:"@site/docs/Solana-Co-Learn/module1/client-side-development/README.md",sourceDirName:"Solana-Co-Learn/module1/client-side-development",slug:"/Solana-Co-Learn/module1/client-side-development/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/client-side-development/README.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{sidebar_position:12,sidebar_label:"\u5ba2\u6237\u7aef\u5f00\u53d1",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u4f7f\u7528Solang\u7f16\u8bd1\u5668\u7f16\u8bd1solidity\u5408\u7ea6\u5b9e\u73b0\u300ahello, World\u300b",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello"},next:{title:"\u4eceSolana \ud83e\udd13\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/"}},c={},s=[],d={toc:s},p="wrapper";function u(e){let{components:n,...t}=e;return(0,a.kt)(p,(0,r.Z)({},d,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u5ba2\u6237\u7aef\u5f00\u53d1"},"\u5ba2\u6237\u7aef\u5f00\u53d1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u4f7f\u7528Gage\u5728Solana\u4e0a\u8bfb\u53d6\u548c\u5199\u5165\u6570\u636e"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/"},"\u4ece\u533a\u5757\u94fe\u4e2d\u8bfb\u53d6\u6570\u636e")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/"},"\u5c06\u6570\u636e\u5199\u5165\u533a\u5757\u94fe")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/"},"\u6784\u5efa\u4e00\u4e2a\u4ea4\u4e92\u811a\u672c"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e7292380.6a4d36c7.js b/assets/js/e7292380.6a4d36c7.js deleted file mode 100644 index f19a67a1b..000000000 --- a/assets/js/e7292380.6a4d36c7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7949],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var u=n.createContext({}),i=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},s=function(e){var t=i(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=i(r),d=o,f=p["".concat(u,".").concat(d)]||p[d]||m[d]||a;return r?n.createElement(f,c(c({ref:t},s),{},{components:r})):n.createElement(f,c({ref:t},s))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,c=new Array(a);c[0]=d;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[p]="string"==typeof e?e:o,c[1]=l;for(var i=2;i{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>a,metadata:()=>l,toc:()=>i});var n=r(7462),o=(r(7294),r(3905));const a={sidebar_position:23,sidebar_label:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",sidebar_class_name:"green"},c="\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",l={unversionedId:"Solana-Co-Learn/module1/start-your-own-custom-project/README",id:"Solana-Co-Learn/module1/start-your-own-custom-project/README",title:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",description:"- \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",source:"@site/docs/Solana-Co-Learn/module1/start-your-own-custom-project/README.md",sourceDirName:"Solana-Co-Learn/module1/start-your-own-custom-project",slug:"/Solana-Co-Learn/module1/start-your-own-custom-project/",permalink:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/start-your-own-custom-project/README.md",tags:[],version:"current",sidebarPosition:23,frontMatter:{sidebar_position:23,sidebar_label:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",permalink:"/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/"},next:{title:"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",permalink:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/"}},u={},i=[],s={toc:i},p="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"},"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/"},"\u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/"},"\u90e8\u7f72\u5230 Vercel"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e7292380.6dffd912.js b/assets/js/e7292380.6dffd912.js new file mode 100644 index 000000000..0ed491615 --- /dev/null +++ b/assets/js/e7292380.6dffd912.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7949],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),s=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=s(r),d=o,f=p["".concat(i,".").concat(d)]||p[d]||m[d]||a;return r?n.createElement(f,l(l({ref:t},u),{},{components:r})):n.createElement(f,l({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[p]="string"==typeof e?e:o,l[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const a={sidebar_position:23,sidebar_label:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",sidebar_class_name:"green"},l="\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",c={unversionedId:"Solana-Co-Learn/module1/start-your-own-custom-project/README",id:"Solana-Co-Learn/module1/start-your-own-custom-project/README",title:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",description:"- \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",source:"@site/docs/Solana-Co-Learn/module1/start-your-own-custom-project/README.md",sourceDirName:"Solana-Co-Learn/module1/start-your-own-custom-project",slug:"/Solana-Co-Learn/module1/start-your-own-custom-project/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/start-your-own-custom-project/README.md",tags:[],version:"current",sidebarPosition:23,frontMatter:{sidebar_position:23,sidebar_label:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udce1 Run is back - \u53cd\u5e8f\u5217\u5316",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/"},next:{title:"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/"}},i={},s=[],u={toc:s},p="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"},"\u5f00\u59cb\u4f60\u81ea\u5df1\u7684\u5b9a\u5236\u9879\u76ee"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/"},"\u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/"},"\u90e8\u7f72\u5230 Vercel"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e9f74709.2f5124fa.js b/assets/js/e9f74709.2f5124fa.js new file mode 100644 index 000000000..0134bd3e5 --- /dev/null +++ b/assets/js/e9f74709.2f5124fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6742],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>y});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},f=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),d=p(t),f=r,y=d["".concat(s,".").concat(f)]||d[f]||u[f]||i;return t?a.createElement(y,l(l({ref:n},c),{},{components:t})):a.createElement(y,l({ref:n},c))}));function y(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,l=new Array(i);l[0]=f;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[d]="string"==typeof e?e:r,l[1]=o;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var a=t(7462),r=(t(7294),t(3905));const i={sidebar_position:37,sidebar_label:"\u5c55\u793aNFTs \ud83d\udc83",sidebar_class_name:"green"},l="\u5c55\u793aNFTs \ud83d\udc83",o={unversionedId:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README",id:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README",title:"\u5c55\u793aNFTs \ud83d\udc83",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u5982\u679c\u4f60\u4e0d\u80fd\u70ab\u8000\u4f60\u7684NFT\uff0c\u90a3\u5b83\u6709\u4ec0\u4e48\u7528\u5462\uff01\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u5e2e\u52a9\u4f60\u5c55\u793a\u4f60\u7684\u4f5c\u54c1\uff08\u5047\u8bbe\u4f60\u7684NFT\u662f\u8d5a\u94b1\u7684\uff09\uff1a\u9996\u5148\u5728\u94b1\u5305\u4e2d\u5c55\u793a\u5b83\uff0c\u7136\u540e\u5728Candy Machine\u4e2d\u5c55\u793a\u5b83\u3002",source:"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README.md",sourceDirName:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts",slug:"/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README.md",tags:[],version:"current",sidebarPosition:37,frontMatter:{sidebar_position:37,sidebar_label:"\u5c55\u793aNFTs \ud83d\udc83",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/"},next:{title:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/"}},s={},p=[],c={toc:p},d="wrapper";function u(e){let{components:n,...i}=e;return(0,r.kt)(d,(0,a.Z)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5c55\u793anfts-"},"\u5c55\u793aNFTs \ud83d\udc83"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u5982\u679c\u4f60\u4e0d\u80fd\u70ab\u8000\u4f60\u7684NFT\uff0c\u90a3\u5b83\u6709\u4ec0\u4e48\u7528\u5462\uff01\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u5e2e\u52a9\u4f60\u5c55\u793a\u4f60\u7684\u4f5c\u54c1\uff08\u5047\u8bbe\u4f60\u7684NFT\u662f\u8d5a\u94b1\u7684\uff09\uff1a\u9996\u5148\u5728\u94b1\u5305\u4e2d\u5c55\u793a\u5b83\uff0c\u7136\u540e\u5728Candy Machine\u4e2d\u5c55\u793a\u5b83\u3002"),(0,r.kt)("p",null,"\u4f60\u53ef\u80fd\u4f1a\u60f3\u8fd9\u6837\u505a\u7684\u610f\u4e49\u662f\u4ec0\u4e48\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u4f60\u7684\u670b\u53cb\u5728\u4f60\u7684\u7f51\u7ad9\u4e0a\u4ece\u4f60\u7684\u6536\u85cf\u4e2d\u94f8\u9020\u4e86\u4e00\u4e2a\u5f88\u9177\u7684Pepe NFT\u3002\u4ed6\u4eec\u94f8\u9020\u4e86\u5f88\u591a\u4e0ePepe\u76f8\u5173\u7684\u4e1c\u897f\uff0c\u6240\u4ee5\u4ed6\u4eec\u7684\u94b1\u5305\u91cc\u6709\u51e0\u5341\u4e2aNFT\u3002\u4ed6\u4eec\u600e\u4e48\u77e5\u9053\u54ea\u4e00\u4e2a\u662f\u6765\u81ea\u4f60\u7684\u6536\u85cf\u5462\uff1f\u4f60\u5f97\u7ed9\u4ed6\u4eec\u770b\uff01"),(0,r.kt)("p",null,"\u4f60\u4f1a\u8bb0\u5f97\u4ece\u7b2c\u4e00\u5468\u5f00\u59cb\uff0c\u6211\u4eec\u60f3\u8981\u7684\u4e00\u5207\u90fd\u5b58\u50a8\u5728\u8d26\u6237\u4e2d\u3002\u8fd9\u610f\u5473\u7740\u4f60\u53ea\u9700\u4f7f\u7528\u94b1\u5305\u5730\u5740\u5c31\u53ef\u4ee5\u83b7\u53d6\u5b83\u4eec\u7684NFT\uff0c\u4f46\u8fd9\u9700\u8981\u66f4\u591a\u7684\u5de5\u4f5c\u3002"),(0,r.kt)("p",null,"\u76f8\u53cd\uff0c\u6211\u4eec\u5c06\u4f7f\u7528Metaplex SDK\uff0c\u5b83\u4f7f\u5f97\u4e00\u5207\u90fd\u53d8\u5f97\u50cf\u8c03\u7528API\u4e00\u6837\u7b80\u5355\u3002\u4ee5\u4e0b\u662f\u5b83\u7684\u6837\u5b50\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(5731).Z,width:"716",height:"844"})),(0,r.kt)("p",null,"\u4f60\u9700\u8981\u8fdb\u884c\u901a\u5e38\u7684Metaplex\u8bbe\u7f6e\uff0c\u4f46\u6211\u4eec\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"walletAdapterIdentity")," \u800c\u4e0d\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"keypairIdentity")," \u6765\u8fdb\u884c\u8fde\u63a5\uff0c\u56e0\u4e3a\u6211\u4eec\u4e0d\u60f3\u8981\u4ed6\u4eec\u7684\u5bc6\u94a5\u5bf9\u54c8\u54c8\u3002\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u53ea\u9700\u4f7f\u7528Metaplex\u5bf9\u8c61\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"findAllByOwner")," \u65b9\u6cd5\u5373\u53ef\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u5355\u4e2aNFT\u7684NFT\u6570\u636e\u5728\u63a7\u5236\u53f0\u4e0a\u7684\u6253\u5370\u7ed3\u679c\uff0c\u6211\u4eec\u4e3b\u8981\u5173\u6ce8\u7684\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"uri")," \u5b57\u6bb5\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(2869).Z,width:"1500",height:"750"})),(0,r.kt)("p",null,"\u987a\u4fbf\u8bf4\u4e00\u4e0b\uff0c\u8fd8\u6709\u5f88\u591a\u5176\u4ed6\u65b9\u6cd5\u53ef\u4ee5\u83b7\u53d6NFT\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(9435).Z,width:"1116",height:"566"})),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u5199\u4e9b\u4ee3\u7801\u5427\uff01"))}u.isMDXComponent=!0},5731:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/display-nft-a9c7b5c0874d024f8f84fdeff19c05c7.png"},2869:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/nft-url-6053c320b078906e1bdd6784c5d1e749.png"},9435:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/other-way-find-nft-c6855fe719c8db53e47b8a18be2dce14.png"}}]); \ No newline at end of file diff --git a/assets/js/e9f74709.906399b9.js b/assets/js/e9f74709.906399b9.js deleted file mode 100644 index 2f135da32..000000000 --- a/assets/js/e9f74709.906399b9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6742],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>y});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},f=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=p(t),f=r,y=d["".concat(s,".").concat(f)]||d[f]||u[f]||i;return t?a.createElement(y,o(o({ref:n},c),{},{components:t})):a.createElement(y,o({ref:n},c))}));function y(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=f;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=t(7462),r=(t(7294),t(3905));const i={sidebar_position:37,sidebar_label:"\u5c55\u793aNFTs \ud83d\udc83",sidebar_class_name:"green"},o="\u5c55\u793aNFTs \ud83d\udc83",l={unversionedId:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README",id:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README",title:"\u5c55\u793aNFTs \ud83d\udc83",description:"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u5982\u679c\u4f60\u4e0d\u80fd\u70ab\u8000\u4f60\u7684NFT\uff0c\u90a3\u5b83\u6709\u4ec0\u4e48\u7528\u5462\uff01\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u5e2e\u52a9\u4f60\u5c55\u793a\u4f60\u7684\u4f5c\u54c1\uff08\u5047\u8bbe\u4f60\u7684NFT\u662f\u8d5a\u94b1\u7684\uff09\uff1a\u9996\u5148\u5728\u94b1\u5305\u4e2d\u5c55\u793a\u5b83\uff0c\u7136\u540e\u5728Candy Machine\u4e2d\u5c55\u793a\u5b83\u3002",source:"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README.md",sourceDirName:"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts",slug:"/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README.md",tags:[],version:"current",sidebarPosition:37,frontMatter:{sidebar_position:37,sidebar_label:"\u5c55\u793aNFTs \ud83d\udc83",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/"},next:{title:"\ud83d\udcf1 \u5728\u94b1\u5305\u4e2d\u5c55\u793aNFTs",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/"}},s={},p=[],c={toc:p},d="wrapper";function u(e){let{components:n,...i}=e;return(0,r.kt)(d,(0,a.Z)({},c,i,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u5c55\u793anfts-"},"\u5c55\u793aNFTs \ud83d\udc83"),(0,r.kt)("p",null,"\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2aNFT\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u8bb8\u591a\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002\u5982\u679c\u4f60\u4e0d\u80fd\u70ab\u8000\u4f60\u7684NFT\uff0c\u90a3\u5b83\u6709\u4ec0\u4e48\u7528\u5462\uff01\u5728\u8fd9\u8282\u8bfe\u4e2d\uff0c\u6211\u4eec\u5c06\u5e2e\u52a9\u4f60\u5c55\u793a\u4f60\u7684\u4f5c\u54c1\uff08\u5047\u8bbe\u4f60\u7684NFT\u662f\u8d5a\u94b1\u7684\uff09\uff1a\u9996\u5148\u5728\u94b1\u5305\u4e2d\u5c55\u793a\u5b83\uff0c\u7136\u540e\u5728Candy Machine\u4e2d\u5c55\u793a\u5b83\u3002"),(0,r.kt)("p",null,"\u4f60\u53ef\u80fd\u4f1a\u60f3\u8fd9\u6837\u505a\u7684\u610f\u4e49\u662f\u4ec0\u4e48\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u4f60\u7684\u670b\u53cb\u5728\u4f60\u7684\u7f51\u7ad9\u4e0a\u4ece\u4f60\u7684\u6536\u85cf\u4e2d\u94f8\u9020\u4e86\u4e00\u4e2a\u5f88\u9177\u7684Pepe NFT\u3002\u4ed6\u4eec\u94f8\u9020\u4e86\u5f88\u591a\u4e0ePepe\u76f8\u5173\u7684\u4e1c\u897f\uff0c\u6240\u4ee5\u4ed6\u4eec\u7684\u94b1\u5305\u91cc\u6709\u51e0\u5341\u4e2aNFT\u3002\u4ed6\u4eec\u600e\u4e48\u77e5\u9053\u54ea\u4e00\u4e2a\u662f\u6765\u81ea\u4f60\u7684\u6536\u85cf\u5462\uff1f\u4f60\u5f97\u7ed9\u4ed6\u4eec\u770b\uff01"),(0,r.kt)("p",null,"\u4f60\u4f1a\u8bb0\u5f97\u4ece\u7b2c\u4e00\u5468\u5f00\u59cb\uff0c\u6211\u4eec\u60f3\u8981\u7684\u4e00\u5207\u90fd\u5b58\u50a8\u5728\u8d26\u6237\u4e2d\u3002\u8fd9\u610f\u5473\u7740\u4f60\u53ea\u9700\u4f7f\u7528\u94b1\u5305\u5730\u5740\u5c31\u53ef\u4ee5\u83b7\u53d6\u5b83\u4eec\u7684NFT\uff0c\u4f46\u8fd9\u9700\u8981\u66f4\u591a\u7684\u5de5\u4f5c\u3002"),(0,r.kt)("p",null,"\u76f8\u53cd\uff0c\u6211\u4eec\u5c06\u4f7f\u7528Metaplex SDK\uff0c\u5b83\u4f7f\u5f97\u4e00\u5207\u90fd\u53d8\u5f97\u50cf\u8c03\u7528API\u4e00\u6837\u7b80\u5355\u3002\u4ee5\u4e0b\u662f\u5b83\u7684\u6837\u5b50\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(5731).Z,width:"716",height:"844"})),(0,r.kt)("p",null,"\u4f60\u9700\u8981\u8fdb\u884c\u901a\u5e38\u7684Metaplex\u8bbe\u7f6e\uff0c\u4f46\u6211\u4eec\u4f7f\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"walletAdapterIdentity")," \u800c\u4e0d\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"keypairIdentity")," \u6765\u8fdb\u884c\u8fde\u63a5\uff0c\u56e0\u4e3a\u6211\u4eec\u4e0d\u60f3\u8981\u4ed6\u4eec\u7684\u5bc6\u94a5\u5bf9\u54c8\u54c8\u3002\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u53ea\u9700\u4f7f\u7528Metaplex\u5bf9\u8c61\u8c03\u7528 ",(0,r.kt)("inlineCode",{parentName:"p"},"findAllByOwner")," \u65b9\u6cd5\u5373\u53ef\u3002"),(0,r.kt)("p",null,"\u8fd9\u662f\u5355\u4e2aNFT\u7684NFT\u6570\u636e\u5728\u63a7\u5236\u53f0\u4e0a\u7684\u6253\u5370\u7ed3\u679c\uff0c\u6211\u4eec\u4e3b\u8981\u5173\u6ce8\u7684\u662f ",(0,r.kt)("inlineCode",{parentName:"p"},"uri")," \u5b57\u6bb5\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(2869).Z,width:"1500",height:"750"})),(0,r.kt)("p",null,"\u987a\u4fbf\u8bf4\u4e00\u4e0b\uff0c\u8fd8\u6709\u5f88\u591a\u5176\u4ed6\u65b9\u6cd5\u53ef\u4ee5\u83b7\u53d6NFT\uff1a"),(0,r.kt)("p",null,(0,r.kt)("img",{src:t(9435).Z,width:"1116",height:"566"})),(0,r.kt)("p",null,"\u8ba9\u6211\u4eec\u5199\u4e9b\u4ee3\u7801\u5427\uff01"))}u.isMDXComponent=!0},5731:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/display-nft-a9c7b5c0874d024f8f84fdeff19c05c7.png"},2869:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/nft-url-6053c320b078906e1bdd6784c5d1e749.png"},9435:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/other-way-find-nft-c6855fe719c8db53e47b8a18be2dce14.png"}}]); \ No newline at end of file diff --git a/assets/js/edb9b04a.9dac8537.js b/assets/js/edb9b04a.9f426b88.js similarity index 50% rename from assets/js/edb9b04a.9dac8537.js rename to assets/js/edb9b04a.9f426b88.js index 89b53d210..f17ae552d 100644 --- a/assets/js/edb9b04a.9dac8537.js +++ b/assets/js/edb9b04a.9f426b88.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4092],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>f});var n=t(7294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=n.createContext({}),u=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):l(l({},r),e)),t},p=function(e){var r=u(e.components);return n.createElement(c.Provider,{value:r},e.children)},s="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),s=u(t),d=a,f=s["".concat(c,".").concat(d)]||s[d]||m[d]||o;return t?n.createElement(f,l(l({ref:r},p),{},{components:t})):n.createElement(f,l({ref:r},p))}));function f(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=d;var i={};for(var c in r)hasOwnProperty.call(r,c)&&(i[c]=r[c]);i.originalType=e,i[s]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=t(7462),a=(t(7294),t(3905));const o={sidebar_position:96,sidebar_label:"Module5",sidebar_class_name:"green"},l="Anchor Program Development",i={unversionedId:"Solana-Co-Learn/module5/README",id:"Solana-Co-Learn/module5/README",title:"Anchor Program Development",description:"- Anchor \u5f00\u53d1\u7b80\u4ecb",source:"@site/docs/Solana-Co-Learn/module5/README.md",sourceDirName:"Solana-Co-Learn/module5",slug:"/Solana-Co-Learn/module5/",permalink:"/docs/Solana-Co-Learn/module5/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module5/README.md",tags:[],version:"current",sidebarPosition:96,frontMatter:{sidebar_position:96,sidebar_label:"Module5",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",permalink:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/"},next:{title:"Module6",permalink:"/docs/Solana-Co-Learn/module6/"}},c={},u=[],p={toc:u},s="wrapper";function m(e){let{components:r,...t}=e;return(0,a.kt)(s,(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"anchor-program-development"},"Anchor Program Development"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Anchor \u5f00\u53d1\u7b80\u4ecb",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"intro to Solana"),(0,a.kt)("li",{parentName:"ul"},"Core Concepts",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"High-level Overview"),(0,a.kt)("li",{parentName:"ul"},"The Accounts Struct"),(0,a.kt)("li",{parentName:"ul"},"The Program Module"),(0,a.kt)("li",{parentName:"ul"},"Errors"),(0,a.kt)("li",{parentName:"ul"},"Cross-Program Invocations"),(0,a.kt)("li",{parentName:"ul"},"Program Derived Address"))))),(0,a.kt)("li",{parentName:"ul"},"anchor client \u5f00\u53d1\u7b80\u4ecb"),(0,a.kt)("li",{parentName:"ul"},"Anchor PDAs\u4e0e\u8d26\u6237"),(0,a.kt)("li",{parentName:"ul"},"Anchor CPIs\u4e0eerror")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4092],{3905:(e,r,t)=>{t.d(r,{Zo:()=>s,kt:()=>f});var n=t(7294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=n.createContext({}),u=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):l(l({},r),e)),t},s=function(e){var r=u(e.components);return n.createElement(c.Provider,{value:r},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),p=u(t),d=a,f=p["".concat(c,".").concat(d)]||p[d]||m[d]||o;return t?n.createElement(f,l(l({ref:r},s),{},{components:t})):n.createElement(f,l({ref:r},s))}));function f(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=d;var i={};for(var c in r)hasOwnProperty.call(r,c)&&(i[c]=r[c]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=t(7462),a=(t(7294),t(3905));const o={sidebar_position:96,sidebar_label:"Module5",sidebar_class_name:"green"},l="Anchor Program Development",i={unversionedId:"Solana-Co-Learn/module5/README",id:"Solana-Co-Learn/module5/README",title:"Anchor Program Development",description:"- Anchor \u5f00\u53d1\u7b80\u4ecb",source:"@site/docs/Solana-Co-Learn/module5/README.md",sourceDirName:"Solana-Co-Learn/module5",slug:"/Solana-Co-Learn/module5/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module5/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module5/README.md",tags:[],version:"current",sidebarPosition:96,frontMatter:{sidebar_position:96,sidebar_label:"Module5",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\uddd0 PDA \u6df1\u5165\u63a2\u7a76",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/"},next:{title:"Module6",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module6/"}},c={},u=[],s={toc:u},p="wrapper";function m(e){let{components:r,...t}=e;return(0,a.kt)(p,(0,n.Z)({},s,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"anchor-program-development"},"Anchor Program Development"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Anchor \u5f00\u53d1\u7b80\u4ecb",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"intro to Solana"),(0,a.kt)("li",{parentName:"ul"},"Core Concepts",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"High-level Overview"),(0,a.kt)("li",{parentName:"ul"},"The Accounts Struct"),(0,a.kt)("li",{parentName:"ul"},"The Program Module"),(0,a.kt)("li",{parentName:"ul"},"Errors"),(0,a.kt)("li",{parentName:"ul"},"Cross-Program Invocations"),(0,a.kt)("li",{parentName:"ul"},"Program Derived Address"))))),(0,a.kt)("li",{parentName:"ul"},"anchor client \u5f00\u53d1\u7b80\u4ecb"),(0,a.kt)("li",{parentName:"ul"},"Anchor PDAs\u4e0e\u8d26\u6237"),(0,a.kt)("li",{parentName:"ul"},"Anchor CPIs\u4e0eerror")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eddf81a1.31a6296f.js b/assets/js/eddf81a1.31a6296f.js deleted file mode 100644 index 129db161d..000000000 --- a/assets/js/eddf81a1.31a6296f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9314],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var a=t(7294);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(t),m=l,k=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return t?a.createElement(k,r(r({ref:n},c),{},{components:t})):a.createElement(k,r({ref:n},c))}));function k(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var o=t.length,r=new Array(o);r[0]=m;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[u]="string"==typeof e?e:l,r[1]=i;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var a=t(7462),l=(t(7294),t(3905));const o={sidebar_position:36,sidebar_label:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",sidebar_class_name:"green"},r="\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",i={unversionedId:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README",id:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README",title:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",description:"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u9020\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u5988\u5988\u4f60\u5728\u533a\u5757\u94fe\u4e0a\u3002\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2a\u5355\u72ec\u7684NFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u8fc7\u7a0b\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002",source:"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README.md",sourceDirName:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli",slug:"/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README.md",tags:[],version:"current",sidebarPosition:36,frontMatter:{sidebar_position:36,sidebar_label:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\udd28 NFT\u4f60\u7684\u8138",permalink:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/"},next:{title:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",permalink:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/"}},s={},p=[{value:"\ud83d\udee0 \u5b89\u88c5\u547d\u4ee4\u884c\u754c\u9762\uff08CLIs\uff09",id:"-\u5b89\u88c5\u547d\u4ee4\u884c\u754c\u9762clis",level:2},{value:"\ud83c\udf6c \u521b\u5efa\u4f60\u7684\u6536\u85cf\u54c1",id:"-\u521b\u5efa\u4f60\u7684\u6536\u85cf\u54c1",level:2},{value:"\ud83c\udf6d \u914d\u7f6e\u60a8\u7684\u7cd6\u679c\u673a",id:"-\u914d\u7f6e\u60a8\u7684\u7cd6\u679c\u673a",level:2},{value:"\ud83d\ude80 \u53d1\u884c\u4f60\u7684NFT\u6536\u85cf\u54c1",id:"-\u53d1\u884c\u4f60\u7684nft\u6536\u85cf\u54c1",level:2},{value:"\ud83c\udf10 \u4e3a\u60a8\u7684NFT\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u524d\u7aef\u754c\u9762",id:"-\u4e3a\u60a8\u7684nft\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u524d\u7aef\u754c\u9762",level:2},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2}],c={toc:p},u="wrapper";function d(e){let{components:n,...o}=e;return(0,l.kt)(u,(0,a.Z)({},c,o,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u7cd6\u679c\u673a\u548csugar-cli"},"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI"),(0,l.kt)("p",null,"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u9020\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u5988\u5988\u4f60\u5728\u533a\u5757\u94fe\u4e0a\u3002\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2a\u5355\u72ec\u7684NFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"Candy Machine"),"\u6765\u5b8c\u6210\u8fd9\u4e2a\u8fc7\u7a0b\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002"),(0,l.kt)("p",null,"\u7531\u4e8e\u8fd9\u662f\u4e00\u4e2a\u94fe\u4e0a\u7a0b\u5e8f\uff0c\u6240\u6709\u7684\u6570\u636e\u90fd\u5b58\u50a8\u5728\u8d26\u6237\u4e2d\u3002\u4f60\u9996\u5148\u9700\u8981\u4e3a\u4f60\u7684\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u7cd6\u679c\u673a\u7684\u5b9e\u4f8b\u3002\u8fd9\u53ea\u662f\u4e00\u4e2a\u8d26\u6237\uff0c\u5b83\u5c06\u5b58\u50a8\u4e00\u4e9b\u91cd\u8981\u7684\u6240\u6709\u8005\u4fe1\u606f\u548c\u7cd6\u679c\u673a\u7684\u914d\u7f6e\u5728\u5143\u6570\u636e\u5b57\u6bb5\u4e2d\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(7135).Z,width:"1152",height:"654"})),(0,l.kt)("p",null,"\u6ce8\u610f\u90a3\u4e2a\u6570\u636e\u5b57\u6bb5\uff1f\u90a3\u5c31\u662f\u5143\u6570\u636e\u6240\u5728\u7684\u5730\u65b9\uff0c\u5b83\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(5270).Z,width:"1190",height:"818"})),(0,l.kt)("p",null,"\u518d\u8bf4\u4e00\u904d - \u8fd9\u91cc\u53d1\u751f\u4e86\u5f88\u591a\u4e8b\u60c5\uff0c\u6211\u4eec\u4f1a\u5728\u76f8\u5173\u7684\u65f6\u5019\u9010\u4e2a\u89e3\u91ca\u3002"),(0,l.kt)("p",null,"\u8981\u4e0e\u7cd6\u679c\u673a\u7a0b\u5e8f\u4e92\u52a8\uff0c\u6211\u4eec\u5c06\u4f7f\u7528",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/overview/introduction"},"Sugar CLI"),"\u3002\u8fd9\u662f\u4e00\u4e2a\u5f88\u68d2\u7684\u5de5\u5177\uff0c\u8ba9\u4f60\u53ef\u4ee5\u76f4\u63a5\u4ece\u547d\u4ee4\u884c\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,l.kt)("h2",{id:"-\u5b89\u88c5\u547d\u4ee4\u884c\u754c\u9762clis"},"\ud83d\udee0 \u5b89\u88c5\u547d\u4ee4\u884c\u754c\u9762\uff08CLIs\uff09"),(0,l.kt)("p",null,"\u5728\u6211\u4eec\u5f00\u59cb\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u5b89\u88c5\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"Solana CLI - Sugar CLI \u9700\u8981\u8fd9\u4e2a\u3002\u60a8\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"li",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"\u6b64\u5904"),"\u4e3a\u60a8\u7684\u64cd\u4f5c\u7cfb\u7edf\u5b89\u88c5\u5b83\u3002"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"Sugar CLI - \u60a8\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"li",href:"https://docs.metaplex.com/developer-tools/sugar/overview/installation"},"\u6b64\u5904"),"\u5b89\u88c5\u3002")))),(0,l.kt)("p",null,"\u6ce8\u610f - \u5982\u679c\u60a8\u60f3\u5c06CLI\u5b89\u88c5\u4e0e\u60a8\u7684\u8ba1\u7b97\u673a\u5206\u5f00\uff0c\u60a8\u53ef\u4ee5\u5728Docker\u4e0a\u8bbe\u7f6eSolana CLI\uff0c\u7136\u540e\u4e0b\u8f7dSugar CLI\u3002Docker\u955c\u50cf\u5728",(0,l.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/solanalabs/solana"},"\u8fd9\u91cc"),"\u3002\u5982\u679c\u60a8\u4e0d\u77e5\u9053Docker\u662f\u4ec0\u4e48\uff0c\u4e0d\u7528\u62c5\u5fc3\uff01"),(0,l.kt)("p",null,"\u5982\u679c\u5b89\u88c5\u6b63\u786e\uff0c\u5f53\u60a8\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"solana --version")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"sugar --version")," \u65f6\uff0c\u60a8\u5e94\u8be5\u770b\u5230\u7248\u672c\u53f7\u800c\u4e0d\u662f\u9519\u8bef\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u672c\u5730\u7684Solana\u94b1\u5305\uff0c\u73b0\u5728\u662f\u8bbe\u7f6e\u5f00\u53d1\u7f51\u7edc\u7684\u597d\u65f6\u673a\u3002\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --url devnet\nsolana-keygen new --outfile ~/.config/solana/devnet.json\nsolana airdrop 2\nsolana balance\n")),(0,l.kt)("p",null,"\u8fd9\u6b63\u662f\u6211\u4eec\u5728\u672c\u5730\u5ba2\u6237\u7aef\u811a\u672c\u4e2d\u6240\u505a\u7684\u4e8b\u60c5\uff0c\u53ea\u4e0d\u8fc7\u662f\u5728\u7ec8\u7aef\u4e2d\u8fdb\u884c\u3002"),(0,l.kt)("h2",{id:"-\u521b\u5efa\u4f60\u7684\u6536\u85cf\u54c1"},"\ud83c\udf6c \u521b\u5efa\u4f60\u7684\u6536\u85cf\u54c1"),(0,l.kt)("p",null,"\u8fd9\u5c06\u662f\u5efa\u7acb\u8fc7\u7a0b\u4e2d\u6700\u56f0\u96be\u7684\u90e8\u5206\u4e4b\u4e00\uff1a\u51b3\u5b9a\u4f60\u60f3\u8981\u5236\u4f5c\u4e00\u4e2aNFT\u6536\u85cf\u7684\u5185\u5bb9\u3002\u4f60\u81f3\u5c11\u9700\u89815\u5f20\u56fe\u7247\uff0c\u6bcf\u5f20\u56fe\u7247\u5bf9\u5e94\u6536\u85cf\u4e2d\u7684\u4e00\u4e2aNFT\u3002\u6211\u9009\u62e9\u4e86\u4e00\u4e9b\u7ecf\u5178\u7684",(0,l.kt)("inlineCode",{parentName:"p"},"pepes"),"\uff0c\u56e0\u4e3a",(0,l.kt)("inlineCode",{parentName:"p"},"pepes"),"\u603b\u662f\u80fd\u5f15\u8d77\u6211\u7684\u5171\u9e23\u3002"),(0,l.kt)("p",null,"\u5728\u4f60\u7684Solana\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u9879\u76ee\u6587\u4ef6\u5939\uff0c\u5e76\u5728\u5176\u4e2d\u521b\u5efa\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"assets")," \u6587\u4ef6\u5939\u3002\u4f60\u9700\u8981\u5c06\u6bcf\u4e2aNFT\u8d44\u4ea7\u4e0e\u4e00\u4e2a\u5143\u6570\u636eJSON\u6587\u4ef6\u914d\u5bf9\uff0c\u4ece\u96f6\u5f00\u59cb\u7f16\u53f7\u6bcf\u4e00\u5bf9\u3002\u56e0\u6b64\uff0c\u4f60\u7684\u6587\u4ef6\u5939\u7ed3\u6784\u5e94\u8be5\u7c7b\u4f3c\u4e8e\u8fd9\u6837\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"...\n|\n|\u2500\u2500 assets\n| |\u2500\u2500 0.png\n| |\u2500\u2500 0.json\n| |...\n| |\u2500\u2500 5.png\n| |\u2500\u2500 5.json\n|\n|\u2500\u2500 node_modules\n|\u2500\u2500 src\n|\u2500\u2500 package.json\n....\n")),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2aJSON\u6587\u4ef6\u7684\u6837\u5b50\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(2993).Z,width:"662",height:"633"})),(0,l.kt)("p",null,"\u5b9e\u9645\u64cd\u4f5c\u4e2d\uff0c\u4f60\u4f1a\u7f16\u5199\u4e00\u4e2a\u811a\u672c\u6765\u751f\u6210\u8fd9\u4e9b\u6587\u4ef6\uff0c\u4f46\u73b0\u5728\u6211\u4eec\u53ea\u80fd\u624b\u52a8\u5b8c\u6210\u3002\u4f60\u53ef\u4ee5\u4ece\u8fd9\u4e9b",(0,l.kt)("a",{parentName:"p",href:"https://arweave.net/RhNCVZoqC6iO0xEL0DnsqZGPSG_CK_KeiU4vluOeIoI?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u793a\u4f8b\u8d44\u4ea7"),"\u5f00\u59cb\uff0c\u7136\u540e\u7528\u4f60\u81ea\u5df1\u7684\u56fe\u7247\u66ff\u6362\u5b83\u4eec\u3002\u786e\u4fdd\u4f60\u4e5f\u66f4\u65b0\u4e86JSON\u6587\u4ef6\uff01"),(0,l.kt)("p",null,"\u60a8\u8fd8\u53ef\u4ee5\u9009\u62e9\u6dfb\u52a0\u4e00\u4e2a\u4e0e\u4e4b\u5339\u914d\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"collection.json")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"collection.png")," - \u8fd9\u4e9b\u5c06\u88ab\u5e02\u573a\u7528\u4f5c\u96c6\u5408\u540d\u79f0\u3001\u63cf\u8ff0\u548c\u7f29\u7565\u56fe\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u6a21\u677f\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-json"},'{\n "name": "Studious Crabs Collection",\n "symbol": "CRAB",\n "description": "Collection of 10 crabs seeking refuge from overfishing on the blockchain.",\n "image": "collection.png",\n "attributes": [],\n "properties": {\n "files": [\n {\n "uri": "collection.png",\n "type": "image/png"\n }\n ]\n }\n}\n')),(0,l.kt)("p",null,"\u62ef\u6551\ud83e\udd80\u8783\u87f9\uff0c\u4f7f\u5176\u514d\u906d\ud83c\udfa3\u6e14\u6c11\u7684\u6355\u635e"),(0,l.kt)("p",null,"\u73b0\u5728\u4f60\u5e94\u8be5\u53ea\u6709\u4e00\u4e2a\u5305\u542b\u5546\u54c1\u7684\u8d44\u4ea7\u6587\u4ef6\u5939\uff08\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662fWindows\u7cfb\u7edf\uff0c\u8fd8\u4f1a\u6709\u4e00\u4e2a~\u6587\u4ef6\u5939\uff09\u3002"),(0,l.kt)("h2",{id:"-\u914d\u7f6e\u60a8\u7684\u7cd6\u679c\u673a"},"\ud83c\udf6d \u914d\u7f6e\u60a8\u7684\u7cd6\u679c\u673a"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\u6211\u4eec\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u7cd6\u679c\u673a\u914d\u7f6e\u6587\u4ef6\u3002\u8fd9\u4e2a\u6587\u4ef6\u7528\u4e8e\u521b\u5efa\u94fe\u4e0a\u7684\u7cd6\u679c\u673a\u5b9e\u4f8b\u3002Sugar CLI\u4f1a\u5f15\u5bfc\u60a8\u5b8c\u6210\u6700\u4f4e\u8981\u6c42\uff0c\u8fd9\u6837\u60a8\u5c31\u4e0d\u5fc5\u624b\u52a8\u64cd\u4f5c\uff01\u4ee5\u4e0b\u662f\u5b83\u7684\u6837\u5b50\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(2747).Z,width:"598",height:"844"})),(0,l.kt)("p",null,"\u4f60\u77e5\u9053\u4ed6\u4eec\u8bf4\u5403\u592a\u591a\u7cd6\u5bf9\u8eab\u4f53\u4e0d\u597d\u5417\uff1f\u5f00\u53d1Sugar CLI\u7684\u4eba\u80af\u5b9a\u4e5f\u8fd9\u4e48\u8ba4\u4e3a\u3002\u8981\u8bbe\u7f6e\u4e00\u4e2a\u7cd6\u679c\u673a\uff0c\u4f60\u53ea\u9700\u8981\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"launch")," \u547d\u4ee4\uff0c\u5176\u4ed6\u7684\u4e8b\u60c5\u5b83\u90fd\u4f1a\u5e2e\u4f60\u5b8c\u6210\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(7e3).Z,width:"1500",height:"732"})),(0,l.kt)("h2",{id:"-\u53d1\u884c\u4f60\u7684nft\u6536\u85cf\u54c1"},"\ud83d\ude80 \u53d1\u884c\u4f60\u7684NFT\u6536\u85cf\u54c1"),(0,l.kt)("p",null,"\u5728\u7ec8\u7aef\u4e2d\u8f93\u5165 ",(0,l.kt)("inlineCode",{parentName:"p"},"sugar launch")," \uff0c\u5f53\u5b83\u8be2\u95ee\u662f\u5426\u8981\u521b\u5efa\u65b0\u7684\u914d\u7f6e\u6587\u4ef6\u65f6\uff0c\u6309\u4e0b",(0,l.kt)("inlineCode",{parentName:"p"},"y"),"\u952e\u3002\u56de\u7b54\u95ee\u9898\u540e\uff0c\u4f60\u7684\u9879\u76ee\u6587\u4ef6\u5939\u4e2d\u5c06\u4f1a\u7559\u4e0b\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"config.json")," \u6587\u4ef6\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u6211\u7684\u7b54\u6848\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},'\u2714 What is the price of each NFT? \xb7 0.3\n\u2714 Found 10 file pairs in "assets". Is this how many NFTs you will have in your candy machine? \xb7 ye\n\u2714 Found symbol "CRAB" in your metadata file. Is this value correct? \xb7 no\n\u2714 What is the symbol of your collection? Hit [ENTER] for no symbol. \xb7 PEPE\n\u2714 What is the seller fee basis points? \xb7 100\n? What is your go live date? Many common formats are supported. \xb7 now\n\u2714 How many creator wallets do you have? (max limit of 4) \xb7 1\n\u2714 Enter creator wallet address #1 \xb7 B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS\n\u2714 Enter royalty percentage share for creator #1 (e.g., 70). Total shares must add to 100. \xb7 100\n? Which extra features do you want to use? \xb7\n\u2714 What is your SOL treasury address? \xb7 B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS\n\u2714 What upload method do you want to use? \xb7 Bundlr\n\u2714 Do you want to retain update authority on your NFTs? We HIGHLY recommend you choose yes. \xb7 yes\n\u2714 Do you want your NFTs to remain mutable? We HIGHLY recommend you choose yes. \xb7 yes\n')),(0,l.kt)("p",null,"\u4f60\u5e94\u8be5\u4f1a\u6536\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"MISSING COLLECTION FILES IN ASSETS FOLDER")," \u7684\u8b66\u544a\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"assets")," \u6587\u4ef6\u5939\u4e2d\u6ca1\u6709\u8bbe\u7f6e ",(0,l.kt)("inlineCode",{parentName:"p"},"collection.png")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"collection.json")," \u6587\u4ef6\u3002\u7ee7\u7eed\u56de\u7b54 y \u3002\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u66f4\u591a\u5173\u4e8e\u8fd9\u4e9b\u6587\u4ef6\u7684\u4fe1\u606f\uff0c\u4f60\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/guides/preparing-assets"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u5185\u5bb9\u3002"),(0,l.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u4e0d\u9700\u8981\u4efb\u4f55\u7279\u6b8a\u529f\u80fd\u3002\u5982\u679c\u4f60\u611f\u5174\u8da3\uff0c\u4f60\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/learning/settings"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u76f8\u5173\u4fe1\u606f\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u6709\u4ec0\u4e48\u4e1c\u897f\u574f\u4e86\uff0c\u6216\u8005\u4f60\u5728\u4e2d\u9014\u6539\u53d8\u4e3b\u610f\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u9000\u51fa\u8fd9\u4e2a\u8fc7\u7a0b\uff0c\u7136\u540e\u91cd\u65b0\u5f00\u59cb\u3002\u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u7f16\u8f91 ",(0,l.kt)("inlineCode",{parentName:"p"},"config.json")," \u6587\u4ef6\u3002Sugar CLI\u4f1a\u6253\u5370\u51fa\u975e\u5e38\u6709\u5e2e\u52a9\u7684\u9519\u8bef\u4fe1\u606f\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u9047\u5230\u56f0\u96be\uff0c\u53ea\u9700\u9605\u8bfb\u5b83\u4eec\uff0c\u4f60\u5f88\u53ef\u80fd\u5c31\u80fd\u89e3\u51b3\u95ee\u9898\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u4e00\u5207\u987a\u5229\uff0c\u6700\u540e\u4f60\u4f1a\u770b\u5230\u4e00\u4e2a\u7eff\u8272\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"Command successful"),". \u6d88\u606f\u3002\u5728\u5b83\u7684\u4e0a\u65b9\uff0c\u4f60\u4f1a\u770b\u5230\u4e00\u4e2aSolanEyes\u94fe\u63a5\u3002\u70b9\u51fb\u90a3\u4e2a\u94fe\u63a5\uff0c\u4f60\u5c31\u80fd\u5728Solana\u7f51\u7edc\u4e0a\u770b\u5230\u4f60\u7684\u7cd6\u679c\u673a\uff01\u4ece\u8fd9\u91cc\u590d\u5236\u7cd6\u679c\u673a\u7684ID\uff0c\u6211\u4eec\u4ee5\u540e\u4f1a\u7528\u5230\u5b83\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u8fd9\u8fd8\u4e0d\u591f\u795e\u5947\uff0c\u90a3\u5c31\u8bd5\u8bd5\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"sugar mint")," \u94f8\u9020\u4e00\u4e2aNFT\u3002\u7b80\u76f4\u7f8e\u5473\u81f3\u6781\u3002"),(0,l.kt)("p",null,"\u4e00\u65e6\u4f60\u6574\u7406\u597d\u4f60\u7684\u6536\u85cf\u54c1\uff0c\u7136\u540e\u5728\u5df4\u5398\u5c9b\u653e\u677e\u65f6\uff0c\u7cd6\u4e5f\u53ef\u4ee5\u5e2e\u52a9\u4f60\u8fdb\u884c\u5404\u79cd\u64cd\u4f5c\uff0c\u5982\u679c\u4f60\u597d\u5947\u7684\u8bdd\uff0c\u53ef\u4ee5\u67e5\u770b\u4e00\u4e0b",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/reference/commands"},"\u547d\u4ee4"),"\u3002"),(0,l.kt)("h2",{id:"-\u4e3a\u60a8\u7684nft\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u524d\u7aef\u754c\u9762"},"\ud83c\udf10 \u4e3a\u60a8\u7684NFT\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u524d\u7aef\u754c\u9762"),(0,l.kt)("p",null,"\u5e0c\u671b\u4f60\u5df2\u7ecf\u5403\u8fc7\u665a\u996d\u4e86\uff0c\u56e0\u4e3a\u73b0\u5728\u662f\u5403\u66f4\u591a\u7cd6\u679c\u7684\u65f6\u5019\u4e86\u3002"),(0,l.kt)("p",null,"Metaplex\u57fa\u91d1\u4f1a\u63d0\u4f9b\u4e86\u4e00\u4e2a\u65f6\u5c1a\u7684React UI\u6a21\u677f\uff0c\u60a8\u53ef\u4ee5\u7528\u5b83\u6765\u4e3a\u60a8\u7684NFT\u6536\u85cf\u521b\u5efa\u524d\u7aef\u754c\u9762\u3002\u8ba9\u6211\u4eec\u6765\u8bbe\u7f6e\u4e00\u4e0b\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/metaplex-foundation/candy-machine-ui\ncd candy-machine-ui\nnpm i\n")),(0,l.kt)("p",null,"\u8fd9\u91cc\u53d1\u751f\u4e86\u5f88\u591a\u4e8b\u60c5\uff0c\u6211\u4eec\u4e0d\u9700\u8981\u62c5\u5fc3\u3002\u5c06 ",(0,l.kt)("inlineCode",{parentName:"p"},".env.example")," \u91cd\u547d\u540d\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},".env")," \uff0c\u5e76\u7c98\u8d34\u60a8\u4e4b\u524d\u590d\u5236\u7684\u7cd6\u679c\u673aID\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"REACT_APP_CANDY_MACHINE_ID=GNfbQEfMA1u1irEFnThTcrzDyefJsoa7sndACShaS5vC\n")),(0,l.kt)("p",null,"\u8fd9\u5c31\u662f\u4f60\u9700\u8981\u505a\u7684\u4e00\u5207\uff01\u73b0\u5728\u5982\u679c\u4f60\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"npm start")," \uff0c\u4f60\u4f1a\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u4e0a\u770b\u5230\u4e00\u4e2a\u6f02\u4eae\u7684\u7528\u6237\u754c\u9762\uff0c\u4f60\u53ef\u4ee5\u7528\u5b83\u6765\u94f8\u9020\u4f60\u7684NFT\u3002"),(0,l.kt)("p",null,"\u5bf9\u4e8eMac\u7528\u6237\uff1a\u5982\u679c\u9047\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"export NODE_OPTIONS=--openssl-legacy-provider")," \uff0c\u8bf7\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c"),(0,l.kt)("p",null,"\u4e00\u65e6\u4f60\u94f8\u9020\u5b8c\u6210\uff0c\u5c31\u5728\u4f60\u7684\u94b1\u5305\u7684\u6536\u85cf\u54c1\u90e8\u5206\u67e5\u770bNFT\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(5363).Z,width:"356",height:"536"})),(0,l.kt)("p",null,"\u4f60\u4f1a\u6ce8\u610f\u5230\uff0c\u94f8\u9020\u7684NFT\u4e0d\u662f",(0,l.kt)("inlineCode",{parentName:"p"},"1.png"),"\u3002\u8fd9\u662f\u56e0\u4e3a\u7cd6\u679c\u673a\u94f8\u9020\u9ed8\u8ba4\u662f\u968f\u673a\u7684\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u53ea\u662f\u52c9\u5f3a\u89e6\u53ca\u5230\u4e86Candy Machine\u548cSugar CLI\u7684\u6f5c\u529b\u3002\u4ee5\u540e\u6211\u4eec\u8fd8\u4f1a\u6db5\u76d6\u66f4\u591a\u5185\u5bb9\u2014\u2014\u672c\u8282\u7684\u76ee\u7684\u662f\u4e3a\u4e86\u8ba9\u4f60\u62e5\u6709\u8db3\u591f\u7684\u77e5\u8bc6\u5e7f\u5ea6\uff0c\u8ba9\u4f60\u80fd\u591f\u81ea\u5df1\u6df1\u5165\u7814\u7a76\u3002\u968f\u7740\u6211\u4eec\u4e0d\u65ad\u5b8c\u5584NFT\u9879\u76ee\uff0c\u6211\u4eec\u5c06\u7ee7\u7eed\u6df1\u5165\u63a2\u7d22\u3002"),(0,l.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,l.kt)("p",null,"\u8ba9\u6211\u4eec\u518d\u591a\u73a9\u4e00\u4f1a\u7cd6\u679c\u673a\u5427\uff01\ud83c\udf6d"),(0,l.kt)("p",null,"\u901a\u8fc7\u66f4\u65b0 ",(0,l.kt)("inlineCode",{parentName:"p"},"config.json")," \u6587\u4ef6\u5e76\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"sugar update")," \uff0c\u53d1\u6325\u521b\u9020\u529b\u5e76\u6d4b\u8bd5\u5176\u4ed6\u7cd6\u679c\u673a\u914d\u7f6e\u3002"),(0,l.kt)("p",null,"\u4f8b\u5b50\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u4fee\u6539 ",(0,l.kt)("inlineCode",{parentName:"li"},"goLiveDate")),(0,l.kt)("li",{parentName:"ul"},"\u542f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"gatekeeper")," \uff08\u9a8c\u8bc1\u7801\uff09"),(0,l.kt)("li",{parentName:"ul"},"\u542f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"whitelistMintSettings"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"\u9700\u8981\u521b\u5efa\u4ee4\u724c"))),(0,l.kt)("li",{parentName:"ul"},"\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"splToken")," \u800c\u4e0d\u662f\u672c\u5730\u7684sol\u8bf7\u6c42\u4ed8\u6b3e",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"\u9700\u8981\u521b\u5efa\u4ee4\u724c")))),(0,l.kt)("p",null,"\u63d0\u793a\n\u6587\u6863 :)"),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/learning/settings"},"https://docs.metaplex.com/developer-tools/sugar/learning/settings")))}d.isMDXComponent=!0},2993:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/candy-cli-00f43bfd4e7b6dba08b124f9534edb47.png"},5270:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/candy-machine-data-d0afaefce7462f15226af24e0370cd95.png"},7135:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/candy-machine-a456ccc69fb9e552cdce1fae74f06bfc.png"},5363:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/candy-nft-875a99a13c64e1b63bfe6f76be91a725.png"},2747:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/config-file-0ff449ad98cddd7f4f2be8c4e741e7a7.png"},7e3:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/launch-09bae10d5aa4b59e0e2a02128b44c565.png"}}]); \ No newline at end of file diff --git a/assets/js/eddf81a1.b6199c4c.js b/assets/js/eddf81a1.b6199c4c.js new file mode 100644 index 000000000..a4b710bd8 --- /dev/null +++ b/assets/js/eddf81a1.b6199c4c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9314],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>k});var a=t(7294);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function r(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var s=a.createContext({}),p=function(e){var n=a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},c=function(e){var n=p(e.components);return a.createElement(s.Provider,{value:n},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},m=a.forwardRef((function(e,n){var t=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(t),m=l,k=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return t?a.createElement(k,r(r({ref:n},c),{},{components:t})):a.createElement(k,r({ref:n},c))}));function k(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var o=t.length,r=new Array(o);r[0]=m;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[u]="string"==typeof e?e:l,r[1]=i;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var a=t(7462),l=(t(7294),t(3905));const o={sidebar_position:36,sidebar_label:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",sidebar_class_name:"green"},r="\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",i={unversionedId:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README",id:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README",title:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",description:"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u9020\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u5988\u5988\u4f60\u5728\u533a\u5757\u94fe\u4e0a\u3002\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2a\u5355\u72ec\u7684NFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528Candy Machine\u6765\u5b8c\u6210\u8fd9\u4e2a\u8fc7\u7a0b\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002",source:"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README.md",sourceDirName:"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli",slug:"/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README.md",tags:[],version:"current",sidebarPosition:36,frontMatter:{sidebar_position:36,sidebar_label:"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83e\udd28 NFT\u4f60\u7684\u8138",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/"},next:{title:"\u5728\u7528\u6237\u754c\u9762\u4e2d\u5c55\u793aNFTS",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/"}},s={},p=[{value:"\ud83d\udee0 \u5b89\u88c5\u547d\u4ee4\u884c\u754c\u9762\uff08CLIs\uff09",id:"-\u5b89\u88c5\u547d\u4ee4\u884c\u754c\u9762clis",level:2},{value:"\ud83c\udf6c \u521b\u5efa\u4f60\u7684\u6536\u85cf\u54c1",id:"-\u521b\u5efa\u4f60\u7684\u6536\u85cf\u54c1",level:2},{value:"\ud83c\udf6d \u914d\u7f6e\u60a8\u7684\u7cd6\u679c\u673a",id:"-\u914d\u7f6e\u60a8\u7684\u7cd6\u679c\u673a",level:2},{value:"\ud83d\ude80 \u53d1\u884c\u4f60\u7684NFT\u6536\u85cf\u54c1",id:"-\u53d1\u884c\u4f60\u7684nft\u6536\u85cf\u54c1",level:2},{value:"\ud83c\udf10 \u4e3a\u60a8\u7684NFT\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u524d\u7aef\u754c\u9762",id:"-\u4e3a\u60a8\u7684nft\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u524d\u7aef\u754c\u9762",level:2},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2}],c={toc:p},u="wrapper";function d(e){let{components:n,...o}=e;return(0,l.kt)(u,(0,a.Z)({},c,o,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u7cd6\u679c\u673a\u548csugar-cli"},"\ud83c\udf6d \u7cd6\u679c\u673a\u548cSugar CLI"),(0,l.kt)("p",null,"\u6709\u4ec0\u4e48\u6bd4\u5c06\u4f60\u7684\u8138\u505a\u6210NFT\u66f4\u597d\u7684\u5462\uff1f\u4f60\u53ef\u4ee5\u5c06\u81ea\u5df1\u6c38\u6052\u5730\u6210\u4e3a\u4e00\u4e2a\u65e9\u671f\u7684\u5efa\u9020\u8005\uff0c\u5e76\u544a\u8bc9\u4f60\u5988\u5988\u4f60\u5728\u533a\u5757\u94fe\u4e0a\u3002\u65e2\u7136\u6211\u4eec\u5df2\u7ecf\u94f8\u9020\u4e86\u4e00\u4e2a\u5355\u72ec\u7684NFT\uff0c\u6211\u4eec\u5c06\u5b66\u4e60\u5982\u4f55\u94f8\u9020\u4e00\u7cfb\u5217\u7684NFT\u3002\u6211\u4eec\u5c06\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"Candy Machine"),"\u6765\u5b8c\u6210\u8fd9\u4e2a\u8fc7\u7a0b\u2014\u2014\u8fd9\u662f\u4e00\u4e2aSolana\u7a0b\u5e8f\uff0c\u8ba9\u521b\u4f5c\u8005\u80fd\u591f\u5c06\u4ed6\u4eec\u7684\u8d44\u4ea7\u4e0a\u94fe\u3002\u8fd9\u4e0d\u662f\u521b\u5efa\u7cfb\u5217\u7684\u552f\u4e00\u65b9\u5f0f\uff0c\u4f46\u5728Solana\u4e0a\u5b83\u662f\u6807\u51c6\u7684\uff0c\u56e0\u4e3a\u5b83\u5177\u6709\u4e00\u4e9b\u6709\u7528\u7684\u529f\u80fd\uff0c\u5982\u673a\u5668\u4eba\u4fdd\u62a4\u548c\u5b89\u5168\u968f\u673a\u5316\u3002"),(0,l.kt)("p",null,"\u7531\u4e8e\u8fd9\u662f\u4e00\u4e2a\u94fe\u4e0a\u7a0b\u5e8f\uff0c\u6240\u6709\u7684\u6570\u636e\u90fd\u5b58\u50a8\u5728\u8d26\u6237\u4e2d\u3002\u4f60\u9996\u5148\u9700\u8981\u4e3a\u4f60\u7684\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u7cd6\u679c\u673a\u7684\u5b9e\u4f8b\u3002\u8fd9\u53ea\u662f\u4e00\u4e2a\u8d26\u6237\uff0c\u5b83\u5c06\u5b58\u50a8\u4e00\u4e9b\u91cd\u8981\u7684\u6240\u6709\u8005\u4fe1\u606f\u548c\u7cd6\u679c\u673a\u7684\u914d\u7f6e\u5728\u5143\u6570\u636e\u5b57\u6bb5\u4e2d\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(7135).Z,width:"1152",height:"654"})),(0,l.kt)("p",null,"\u6ce8\u610f\u90a3\u4e2a\u6570\u636e\u5b57\u6bb5\uff1f\u90a3\u5c31\u662f\u5143\u6570\u636e\u6240\u5728\u7684\u5730\u65b9\uff0c\u5b83\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(5270).Z,width:"1190",height:"818"})),(0,l.kt)("p",null,"\u518d\u8bf4\u4e00\u904d - \u8fd9\u91cc\u53d1\u751f\u4e86\u5f88\u591a\u4e8b\u60c5\uff0c\u6211\u4eec\u4f1a\u5728\u76f8\u5173\u7684\u65f6\u5019\u9010\u4e2a\u89e3\u91ca\u3002"),(0,l.kt)("p",null,"\u8981\u4e0e\u7cd6\u679c\u673a\u7a0b\u5e8f\u4e92\u52a8\uff0c\u6211\u4eec\u5c06\u4f7f\u7528",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/overview/introduction"},"Sugar CLI"),"\u3002\u8fd9\u662f\u4e00\u4e2a\u5f88\u68d2\u7684\u5de5\u5177\uff0c\u8ba9\u4f60\u53ef\u4ee5\u76f4\u63a5\u4ece\u547d\u4ee4\u884c\u4e0e\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,l.kt)("h2",{id:"-\u5b89\u88c5\u547d\u4ee4\u884c\u754c\u9762clis"},"\ud83d\udee0 \u5b89\u88c5\u547d\u4ee4\u884c\u754c\u9762\uff08CLIs\uff09"),(0,l.kt)("p",null,"\u5728\u6211\u4eec\u5f00\u59cb\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u5b89\u88c5\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"Solana CLI - Sugar CLI \u9700\u8981\u8fd9\u4e2a\u3002\u60a8\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"li",href:"https://docs.solana.com/cli/install-solana-cli-tools"},"\u6b64\u5904"),"\u4e3a\u60a8\u7684\u64cd\u4f5c\u7cfb\u7edf\u5b89\u88c5\u5b83\u3002"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"Sugar CLI - \u60a8\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"li",href:"https://docs.metaplex.com/developer-tools/sugar/overview/installation"},"\u6b64\u5904"),"\u5b89\u88c5\u3002")))),(0,l.kt)("p",null,"\u6ce8\u610f - \u5982\u679c\u60a8\u60f3\u5c06CLI\u5b89\u88c5\u4e0e\u60a8\u7684\u8ba1\u7b97\u673a\u5206\u5f00\uff0c\u60a8\u53ef\u4ee5\u5728Docker\u4e0a\u8bbe\u7f6eSolana CLI\uff0c\u7136\u540e\u4e0b\u8f7dSugar CLI\u3002Docker\u955c\u50cf\u5728",(0,l.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/solanalabs/solana"},"\u8fd9\u91cc"),"\u3002\u5982\u679c\u60a8\u4e0d\u77e5\u9053Docker\u662f\u4ec0\u4e48\uff0c\u4e0d\u7528\u62c5\u5fc3\uff01"),(0,l.kt)("p",null,"\u5982\u679c\u5b89\u88c5\u6b63\u786e\uff0c\u5f53\u60a8\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"solana --version")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"sugar --version")," \u65f6\uff0c\u60a8\u5e94\u8be5\u770b\u5230\u7248\u672c\u53f7\u800c\u4e0d\u662f\u9519\u8bef\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u672c\u5730\u7684Solana\u94b1\u5305\uff0c\u73b0\u5728\u662f\u8bbe\u7f6e\u5f00\u53d1\u7f51\u7edc\u7684\u597d\u65f6\u673a\u3002\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"solana config set --url devnet\nsolana-keygen new --outfile ~/.config/solana/devnet.json\nsolana airdrop 2\nsolana balance\n")),(0,l.kt)("p",null,"\u8fd9\u6b63\u662f\u6211\u4eec\u5728\u672c\u5730\u5ba2\u6237\u7aef\u811a\u672c\u4e2d\u6240\u505a\u7684\u4e8b\u60c5\uff0c\u53ea\u4e0d\u8fc7\u662f\u5728\u7ec8\u7aef\u4e2d\u8fdb\u884c\u3002"),(0,l.kt)("h2",{id:"-\u521b\u5efa\u4f60\u7684\u6536\u85cf\u54c1"},"\ud83c\udf6c \u521b\u5efa\u4f60\u7684\u6536\u85cf\u54c1"),(0,l.kt)("p",null,"\u8fd9\u5c06\u662f\u5efa\u7acb\u8fc7\u7a0b\u4e2d\u6700\u56f0\u96be\u7684\u90e8\u5206\u4e4b\u4e00\uff1a\u51b3\u5b9a\u4f60\u60f3\u8981\u5236\u4f5c\u4e00\u4e2aNFT\u6536\u85cf\u7684\u5185\u5bb9\u3002\u4f60\u81f3\u5c11\u9700\u89815\u5f20\u56fe\u7247\uff0c\u6bcf\u5f20\u56fe\u7247\u5bf9\u5e94\u6536\u85cf\u4e2d\u7684\u4e00\u4e2aNFT\u3002\u6211\u9009\u62e9\u4e86\u4e00\u4e9b\u7ecf\u5178\u7684",(0,l.kt)("inlineCode",{parentName:"p"},"pepes"),"\uff0c\u56e0\u4e3a",(0,l.kt)("inlineCode",{parentName:"p"},"pepes"),"\u603b\u662f\u80fd\u5f15\u8d77\u6211\u7684\u5171\u9e23\u3002"),(0,l.kt)("p",null,"\u5728\u4f60\u7684Solana\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u9879\u76ee\u6587\u4ef6\u5939\uff0c\u5e76\u5728\u5176\u4e2d\u521b\u5efa\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"assets")," \u6587\u4ef6\u5939\u3002\u4f60\u9700\u8981\u5c06\u6bcf\u4e2aNFT\u8d44\u4ea7\u4e0e\u4e00\u4e2a\u5143\u6570\u636eJSON\u6587\u4ef6\u914d\u5bf9\uff0c\u4ece\u96f6\u5f00\u59cb\u7f16\u53f7\u6bcf\u4e00\u5bf9\u3002\u56e0\u6b64\uff0c\u4f60\u7684\u6587\u4ef6\u5939\u7ed3\u6784\u5e94\u8be5\u7c7b\u4f3c\u4e8e\u8fd9\u6837\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"...\n|\n|\u2500\u2500 assets\n| |\u2500\u2500 0.png\n| |\u2500\u2500 0.json\n| |...\n| |\u2500\u2500 5.png\n| |\u2500\u2500 5.json\n|\n|\u2500\u2500 node_modules\n|\u2500\u2500 src\n|\u2500\u2500 package.json\n....\n")),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2aJSON\u6587\u4ef6\u7684\u6837\u5b50\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(2993).Z,width:"662",height:"633"})),(0,l.kt)("p",null,"\u5b9e\u9645\u64cd\u4f5c\u4e2d\uff0c\u4f60\u4f1a\u7f16\u5199\u4e00\u4e2a\u811a\u672c\u6765\u751f\u6210\u8fd9\u4e9b\u6587\u4ef6\uff0c\u4f46\u73b0\u5728\u6211\u4eec\u53ea\u80fd\u624b\u52a8\u5b8c\u6210\u3002\u4f60\u53ef\u4ee5\u4ece\u8fd9\u4e9b",(0,l.kt)("a",{parentName:"p",href:"https://arweave.net/RhNCVZoqC6iO0xEL0DnsqZGPSG_CK_KeiU4vluOeIoI?utm_source=buildspace.so&utm_medium=buildspace_project"},"\u793a\u4f8b\u8d44\u4ea7"),"\u5f00\u59cb\uff0c\u7136\u540e\u7528\u4f60\u81ea\u5df1\u7684\u56fe\u7247\u66ff\u6362\u5b83\u4eec\u3002\u786e\u4fdd\u4f60\u4e5f\u66f4\u65b0\u4e86JSON\u6587\u4ef6\uff01"),(0,l.kt)("p",null,"\u60a8\u8fd8\u53ef\u4ee5\u9009\u62e9\u6dfb\u52a0\u4e00\u4e2a\u4e0e\u4e4b\u5339\u914d\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"collection.json")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"collection.png")," - \u8fd9\u4e9b\u5c06\u88ab\u5e02\u573a\u7528\u4f5c\u96c6\u5408\u540d\u79f0\u3001\u63cf\u8ff0\u548c\u7f29\u7565\u56fe\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u4e00\u4e2a\u6a21\u677f\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-json"},'{\n "name": "Studious Crabs Collection",\n "symbol": "CRAB",\n "description": "Collection of 10 crabs seeking refuge from overfishing on the blockchain.",\n "image": "collection.png",\n "attributes": [],\n "properties": {\n "files": [\n {\n "uri": "collection.png",\n "type": "image/png"\n }\n ]\n }\n}\n')),(0,l.kt)("p",null,"\u62ef\u6551\ud83e\udd80\u8783\u87f9\uff0c\u4f7f\u5176\u514d\u906d\ud83c\udfa3\u6e14\u6c11\u7684\u6355\u635e"),(0,l.kt)("p",null,"\u73b0\u5728\u4f60\u5e94\u8be5\u53ea\u6709\u4e00\u4e2a\u5305\u542b\u5546\u54c1\u7684\u8d44\u4ea7\u6587\u4ef6\u5939\uff08\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662fWindows\u7cfb\u7edf\uff0c\u8fd8\u4f1a\u6709\u4e00\u4e2a~\u6587\u4ef6\u5939\uff09\u3002"),(0,l.kt)("h2",{id:"-\u914d\u7f6e\u60a8\u7684\u7cd6\u679c\u673a"},"\ud83c\udf6d \u914d\u7f6e\u60a8\u7684\u7cd6\u679c\u673a"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\u6211\u4eec\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u7cd6\u679c\u673a\u914d\u7f6e\u6587\u4ef6\u3002\u8fd9\u4e2a\u6587\u4ef6\u7528\u4e8e\u521b\u5efa\u94fe\u4e0a\u7684\u7cd6\u679c\u673a\u5b9e\u4f8b\u3002Sugar CLI\u4f1a\u5f15\u5bfc\u60a8\u5b8c\u6210\u6700\u4f4e\u8981\u6c42\uff0c\u8fd9\u6837\u60a8\u5c31\u4e0d\u5fc5\u624b\u52a8\u64cd\u4f5c\uff01\u4ee5\u4e0b\u662f\u5b83\u7684\u6837\u5b50\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(2747).Z,width:"598",height:"844"})),(0,l.kt)("p",null,"\u4f60\u77e5\u9053\u4ed6\u4eec\u8bf4\u5403\u592a\u591a\u7cd6\u5bf9\u8eab\u4f53\u4e0d\u597d\u5417\uff1f\u5f00\u53d1Sugar CLI\u7684\u4eba\u80af\u5b9a\u4e5f\u8fd9\u4e48\u8ba4\u4e3a\u3002\u8981\u8bbe\u7f6e\u4e00\u4e2a\u7cd6\u679c\u673a\uff0c\u4f60\u53ea\u9700\u8981\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"launch")," \u547d\u4ee4\uff0c\u5176\u4ed6\u7684\u4e8b\u60c5\u5b83\u90fd\u4f1a\u5e2e\u4f60\u5b8c\u6210\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(7e3).Z,width:"1500",height:"732"})),(0,l.kt)("h2",{id:"-\u53d1\u884c\u4f60\u7684nft\u6536\u85cf\u54c1"},"\ud83d\ude80 \u53d1\u884c\u4f60\u7684NFT\u6536\u85cf\u54c1"),(0,l.kt)("p",null,"\u5728\u7ec8\u7aef\u4e2d\u8f93\u5165 ",(0,l.kt)("inlineCode",{parentName:"p"},"sugar launch")," \uff0c\u5f53\u5b83\u8be2\u95ee\u662f\u5426\u8981\u521b\u5efa\u65b0\u7684\u914d\u7f6e\u6587\u4ef6\u65f6\uff0c\u6309\u4e0b",(0,l.kt)("inlineCode",{parentName:"p"},"y"),"\u952e\u3002\u56de\u7b54\u95ee\u9898\u540e\uff0c\u4f60\u7684\u9879\u76ee\u6587\u4ef6\u5939\u4e2d\u5c06\u4f1a\u7559\u4e0b\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"config.json")," \u6587\u4ef6\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u6211\u7684\u7b54\u6848\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},'\u2714 What is the price of each NFT? \xb7 0.3\n\u2714 Found 10 file pairs in "assets". Is this how many NFTs you will have in your candy machine? \xb7 ye\n\u2714 Found symbol "CRAB" in your metadata file. Is this value correct? \xb7 no\n\u2714 What is the symbol of your collection? Hit [ENTER] for no symbol. \xb7 PEPE\n\u2714 What is the seller fee basis points? \xb7 100\n? What is your go live date? Many common formats are supported. \xb7 now\n\u2714 How many creator wallets do you have? (max limit of 4) \xb7 1\n\u2714 Enter creator wallet address #1 \xb7 B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS\n\u2714 Enter royalty percentage share for creator #1 (e.g., 70). Total shares must add to 100. \xb7 100\n? Which extra features do you want to use? \xb7\n\u2714 What is your SOL treasury address? \xb7 B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS\n\u2714 What upload method do you want to use? \xb7 Bundlr\n\u2714 Do you want to retain update authority on your NFTs? We HIGHLY recommend you choose yes. \xb7 yes\n\u2714 Do you want your NFTs to remain mutable? We HIGHLY recommend you choose yes. \xb7 yes\n')),(0,l.kt)("p",null,"\u4f60\u5e94\u8be5\u4f1a\u6536\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"MISSING COLLECTION FILES IN ASSETS FOLDER")," \u7684\u8b66\u544a\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"assets")," \u6587\u4ef6\u5939\u4e2d\u6ca1\u6709\u8bbe\u7f6e ",(0,l.kt)("inlineCode",{parentName:"p"},"collection.png")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"collection.json")," \u6587\u4ef6\u3002\u7ee7\u7eed\u56de\u7b54 y \u3002\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u66f4\u591a\u5173\u4e8e\u8fd9\u4e9b\u6587\u4ef6\u7684\u4fe1\u606f\uff0c\u4f60\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/guides/preparing-assets"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u5185\u5bb9\u3002"),(0,l.kt)("p",null,"\u73b0\u5728\u6211\u4eec\u4e0d\u9700\u8981\u4efb\u4f55\u7279\u6b8a\u529f\u80fd\u3002\u5982\u679c\u4f60\u611f\u5174\u8da3\uff0c\u4f60\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/learning/settings"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u76f8\u5173\u4fe1\u606f\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u6709\u4ec0\u4e48\u4e1c\u897f\u574f\u4e86\uff0c\u6216\u8005\u4f60\u5728\u4e2d\u9014\u6539\u53d8\u4e3b\u610f\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u9000\u51fa\u8fd9\u4e2a\u8fc7\u7a0b\uff0c\u7136\u540e\u91cd\u65b0\u5f00\u59cb\u3002\u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u7f16\u8f91 ",(0,l.kt)("inlineCode",{parentName:"p"},"config.json")," \u6587\u4ef6\u3002Sugar CLI\u4f1a\u6253\u5370\u51fa\u975e\u5e38\u6709\u5e2e\u52a9\u7684\u9519\u8bef\u4fe1\u606f\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u9047\u5230\u56f0\u96be\uff0c\u53ea\u9700\u9605\u8bfb\u5b83\u4eec\uff0c\u4f60\u5f88\u53ef\u80fd\u5c31\u80fd\u89e3\u51b3\u95ee\u9898\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u4e00\u5207\u987a\u5229\uff0c\u6700\u540e\u4f60\u4f1a\u770b\u5230\u4e00\u4e2a\u7eff\u8272\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"Command successful"),". \u6d88\u606f\u3002\u5728\u5b83\u7684\u4e0a\u65b9\uff0c\u4f60\u4f1a\u770b\u5230\u4e00\u4e2aSolanEyes\u94fe\u63a5\u3002\u70b9\u51fb\u90a3\u4e2a\u94fe\u63a5\uff0c\u4f60\u5c31\u80fd\u5728Solana\u7f51\u7edc\u4e0a\u770b\u5230\u4f60\u7684\u7cd6\u679c\u673a\uff01\u4ece\u8fd9\u91cc\u590d\u5236\u7cd6\u679c\u673a\u7684ID\uff0c\u6211\u4eec\u4ee5\u540e\u4f1a\u7528\u5230\u5b83\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u8fd9\u8fd8\u4e0d\u591f\u795e\u5947\uff0c\u90a3\u5c31\u8bd5\u8bd5\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"sugar mint")," \u94f8\u9020\u4e00\u4e2aNFT\u3002\u7b80\u76f4\u7f8e\u5473\u81f3\u6781\u3002"),(0,l.kt)("p",null,"\u4e00\u65e6\u4f60\u6574\u7406\u597d\u4f60\u7684\u6536\u85cf\u54c1\uff0c\u7136\u540e\u5728\u5df4\u5398\u5c9b\u653e\u677e\u65f6\uff0c\u7cd6\u4e5f\u53ef\u4ee5\u5e2e\u52a9\u4f60\u8fdb\u884c\u5404\u79cd\u64cd\u4f5c\uff0c\u5982\u679c\u4f60\u597d\u5947\u7684\u8bdd\uff0c\u53ef\u4ee5\u67e5\u770b\u4e00\u4e0b",(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/reference/commands"},"\u547d\u4ee4"),"\u3002"),(0,l.kt)("h2",{id:"-\u4e3a\u60a8\u7684nft\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u524d\u7aef\u754c\u9762"},"\ud83c\udf10 \u4e3a\u60a8\u7684NFT\u6536\u85cf\u521b\u5efa\u4e00\u4e2a\u524d\u7aef\u754c\u9762"),(0,l.kt)("p",null,"\u5e0c\u671b\u4f60\u5df2\u7ecf\u5403\u8fc7\u665a\u996d\u4e86\uff0c\u56e0\u4e3a\u73b0\u5728\u662f\u5403\u66f4\u591a\u7cd6\u679c\u7684\u65f6\u5019\u4e86\u3002"),(0,l.kt)("p",null,"Metaplex\u57fa\u91d1\u4f1a\u63d0\u4f9b\u4e86\u4e00\u4e2a\u65f6\u5c1a\u7684React UI\u6a21\u677f\uff0c\u60a8\u53ef\u4ee5\u7528\u5b83\u6765\u4e3a\u60a8\u7684NFT\u6536\u85cf\u521b\u5efa\u524d\u7aef\u754c\u9762\u3002\u8ba9\u6211\u4eec\u6765\u8bbe\u7f6e\u4e00\u4e0b\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/metaplex-foundation/candy-machine-ui\ncd candy-machine-ui\nnpm i\n")),(0,l.kt)("p",null,"\u8fd9\u91cc\u53d1\u751f\u4e86\u5f88\u591a\u4e8b\u60c5\uff0c\u6211\u4eec\u4e0d\u9700\u8981\u62c5\u5fc3\u3002\u5c06 ",(0,l.kt)("inlineCode",{parentName:"p"},".env.example")," \u91cd\u547d\u540d\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},".env")," \uff0c\u5e76\u7c98\u8d34\u60a8\u4e4b\u524d\u590d\u5236\u7684\u7cd6\u679c\u673aID\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"REACT_APP_CANDY_MACHINE_ID=GNfbQEfMA1u1irEFnThTcrzDyefJsoa7sndACShaS5vC\n")),(0,l.kt)("p",null,"\u8fd9\u5c31\u662f\u4f60\u9700\u8981\u505a\u7684\u4e00\u5207\uff01\u73b0\u5728\u5982\u679c\u4f60\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"npm start")," \uff0c\u4f60\u4f1a\u5728 ",(0,l.kt)("inlineCode",{parentName:"p"},"localhost:3000")," \u4e0a\u770b\u5230\u4e00\u4e2a\u6f02\u4eae\u7684\u7528\u6237\u754c\u9762\uff0c\u4f60\u53ef\u4ee5\u7528\u5b83\u6765\u94f8\u9020\u4f60\u7684NFT\u3002"),(0,l.kt)("p",null,"\u5bf9\u4e8eMac\u7528\u6237\uff1a\u5982\u679c\u9047\u5230 ",(0,l.kt)("inlineCode",{parentName:"p"},"export NODE_OPTIONS=--openssl-legacy-provider")," \uff0c\u8bf7\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c"),(0,l.kt)("p",null,"\u4e00\u65e6\u4f60\u94f8\u9020\u5b8c\u6210\uff0c\u5c31\u5728\u4f60\u7684\u94b1\u5305\u7684\u6536\u85cf\u54c1\u90e8\u5206\u67e5\u770bNFT\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:t(5363).Z,width:"356",height:"536"})),(0,l.kt)("p",null,"\u4f60\u4f1a\u6ce8\u610f\u5230\uff0c\u94f8\u9020\u7684NFT\u4e0d\u662f",(0,l.kt)("inlineCode",{parentName:"p"},"1.png"),"\u3002\u8fd9\u662f\u56e0\u4e3a\u7cd6\u679c\u673a\u94f8\u9020\u9ed8\u8ba4\u662f\u968f\u673a\u7684\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u53ea\u662f\u52c9\u5f3a\u89e6\u53ca\u5230\u4e86Candy Machine\u548cSugar CLI\u7684\u6f5c\u529b\u3002\u4ee5\u540e\u6211\u4eec\u8fd8\u4f1a\u6db5\u76d6\u66f4\u591a\u5185\u5bb9\u2014\u2014\u672c\u8282\u7684\u76ee\u7684\u662f\u4e3a\u4e86\u8ba9\u4f60\u62e5\u6709\u8db3\u591f\u7684\u77e5\u8bc6\u5e7f\u5ea6\uff0c\u8ba9\u4f60\u80fd\u591f\u81ea\u5df1\u6df1\u5165\u7814\u7a76\u3002\u968f\u7740\u6211\u4eec\u4e0d\u65ad\u5b8c\u5584NFT\u9879\u76ee\uff0c\u6211\u4eec\u5c06\u7ee7\u7eed\u6df1\u5165\u63a2\u7d22\u3002"),(0,l.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,l.kt)("p",null,"\u8ba9\u6211\u4eec\u518d\u591a\u73a9\u4e00\u4f1a\u7cd6\u679c\u673a\u5427\uff01\ud83c\udf6d"),(0,l.kt)("p",null,"\u901a\u8fc7\u66f4\u65b0 ",(0,l.kt)("inlineCode",{parentName:"p"},"config.json")," \u6587\u4ef6\u5e76\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"sugar update")," \uff0c\u53d1\u6325\u521b\u9020\u529b\u5e76\u6d4b\u8bd5\u5176\u4ed6\u7cd6\u679c\u673a\u914d\u7f6e\u3002"),(0,l.kt)("p",null,"\u4f8b\u5b50\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u4fee\u6539 ",(0,l.kt)("inlineCode",{parentName:"li"},"goLiveDate")),(0,l.kt)("li",{parentName:"ul"},"\u542f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"gatekeeper")," \uff08\u9a8c\u8bc1\u7801\uff09"),(0,l.kt)("li",{parentName:"ul"},"\u542f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"whitelistMintSettings"),(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"\u9700\u8981\u521b\u5efa\u4ee4\u724c"))),(0,l.kt)("li",{parentName:"ul"},"\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"li"},"splToken")," \u800c\u4e0d\u662f\u672c\u5730\u7684sol\u8bf7\u6c42\u4ed8\u6b3e",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"\u9700\u8981\u521b\u5efa\u4ee4\u724c")))),(0,l.kt)("p",null,"\u63d0\u793a\n\u6587\u6863 :)"),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://docs.metaplex.com/developer-tools/sugar/learning/settings"},"https://docs.metaplex.com/developer-tools/sugar/learning/settings")))}d.isMDXComponent=!0},2993:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/candy-cli-00f43bfd4e7b6dba08b124f9534edb47.png"},5270:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/candy-machine-data-d0afaefce7462f15226af24e0370cd95.png"},7135:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/candy-machine-a456ccc69fb9e552cdce1fae74f06bfc.png"},5363:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/candy-nft-875a99a13c64e1b63bfe6f76be91a725.png"},2747:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/config-file-0ff449ad98cddd7f4f2be8c4e741e7a7.png"},7e3:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/launch-09bae10d5aa4b59e0e2a02128b44c565.png"}}]); \ No newline at end of file diff --git a/assets/js/f0c8024b.3dc76fb9.js b/assets/js/f0c8024b.3dc76fb9.js new file mode 100644 index 000000000..f03ed2a1a --- /dev/null +++ b/assets/js/f0c8024b.3dc76fb9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2106],{1594:l=>{l.exports=JSON.parse('{"label":"blog","permalink":"/all-in-one-solana/blog/tags/blog","allTagsPath":"/all-in-one-solana/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/f18dbc91.205e824d.js b/assets/js/f18dbc91.205e824d.js new file mode 100644 index 000000000..87e94bc1b --- /dev/null +++ b/assets/js/f18dbc91.205e824d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1487],{3905:(e,n,t)=>{t.d(n,{Zo:()=>c,kt:()=>f});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),p=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},c=function(e){var n=p(e.components);return r.createElement(s.Provider,{value:n},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(t),d=a,f=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return t?r.createElement(f,l(l({ref:n},c),{},{components:t})):r.createElement(f,l({ref:n},c))}));function f(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var o=t.length,l=new Array(o);l[0]=d;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i[u]="string"==typeof e?e:a,l[1]=i;for(var p=2;p{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var r=t(7462),a=(t(7294),t(3905));const o={sidebar_position:27,sidebar_label:"Spl token",sidebar_class_name:"green"},l="SPL\u4ee3\u5e01",i={unversionedId:"Solana-Co-Learn/module2/spl-token/README",id:"Solana-Co-Learn/module2/spl-token/README",title:"SPL\u4ee3\u5e01",description:"- \ud83d\udcf9\u5e26\u6709Gage\u7684\u4ee4\u724c",source:"@site/docs/Solana-Co-Learn/module2/spl-token/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token",slug:"/Solana-Co-Learn/module2/spl-token/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/README.md",tags:[],version:"current",sidebarPosition:27,frontMatter:{sidebar_position:27,sidebar_label:"Spl token",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module2",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/"},next:{title:"\ud83d\udcb5 The token Program",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/the-token-program/"}},s={},p=[],c={toc:p},u="wrapper";function m(e){let{components:n,...t}=e;return(0,a.kt)(u,(0,r.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"spl\u4ee3\u5e01"},"SPL\u4ee3\u5e01"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u5e26\u6709Gage\u7684\u4ee4\u724c"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/the-token-program/"},"The Token Program")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/"},"\u5728Solana\u4e0a\u94f8\u9020Token")),(0,a.kt)("li",{parentName:"ul"},"\ud83d\udcf9Metaplex \u4e0e Gage"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/token-metadata/"},"\u4ee4\u724c\u5143\u6570\u636e")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/"},"\u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f18dbc91.8df29e01.js b/assets/js/f18dbc91.8df29e01.js deleted file mode 100644 index b297d4520..000000000 --- a/assets/js/f18dbc91.8df29e01.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1487],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=s(n),d=o,f=u["".concat(p,".").concat(d)]||u[d]||m[d]||a;return n?r.createElement(f,l(l({ref:t},c),{},{components:n})):r.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,l=new Array(a);l[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[u]="string"==typeof e?e:o,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var r=n(7462),o=(n(7294),n(3905));const a={sidebar_position:27,sidebar_label:"Spl token",sidebar_class_name:"green"},l="SPL\u4ee3\u5e01",i={unversionedId:"Solana-Co-Learn/module2/spl-token/README",id:"Solana-Co-Learn/module2/spl-token/README",title:"SPL\u4ee3\u5e01",description:"- \ud83d\udcf9\u5e26\u6709Gage\u7684\u4ee4\u724c",source:"@site/docs/Solana-Co-Learn/module2/spl-token/README.md",sourceDirName:"Solana-Co-Learn/module2/spl-token",slug:"/Solana-Co-Learn/module2/spl-token/",permalink:"/docs/Solana-Co-Learn/module2/spl-token/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module2/spl-token/README.md",tags:[],version:"current",sidebarPosition:27,frontMatter:{sidebar_position:27,sidebar_label:"Spl token",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Module2",permalink:"/docs/Solana-Co-Learn/module2/"},next:{title:"\ud83d\udcb5 The token Program",permalink:"/docs/Solana-Co-Learn/module2/spl-token/the-token-program/"}},p={},s=[],c={toc:s},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"spl\u4ee3\u5e01"},"SPL\u4ee3\u5e01"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\ud83d\udcf9\u5e26\u6709Gage\u7684\u4ee4\u724c"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module2/spl-token/the-token-program/"},"The Token Program")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/"},"\u5728Solana\u4e0a\u94f8\u9020Token")),(0,o.kt)("li",{parentName:"ul"},"\ud83d\udcf9Metaplex \u4e0e Gage"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module2/spl-token/token-metadata/"},"\u4ee4\u724c\u5143\u6570\u636e")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/"},"\u7ed9\u4f60\u7684\u4ee3\u5e01\u8d4b\u4e88\u4e00\u4e2a\u8eab\u4efd"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4cf1efc.a8f6f120.js b/assets/js/f4cf1efc.a8f6f120.js new file mode 100644 index 000000000..74909315a --- /dev/null +++ b/assets/js/f4cf1efc.a8f6f120.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[550],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>y});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=o.createContext({}),u=function(e){var t=o.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=u(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,s=e.parentName,i=c(e,["components","mdxType","originalType","parentName"]),p=u(r),m=n,y=p["".concat(s,".").concat(m)]||p[m]||d[m]||a;return r?o.createElement(y,l(l({ref:t},i),{},{components:r})):o.createElement(y,l({ref:t},i))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,l=new Array(a);l[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[p]="string"==typeof e?e:n,l[1]=c;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var o=r(7462),n=(r(7294),r(3905));const a={sidebar_position:25,sidebar_label:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",sidebar_class_name:"green"},l="\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",c={unversionedId:"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README",id:"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README",title:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",description:"\u8fd9\u662f\u4f60\u672c\u5468\u6240\u505a\u7684\u4e00\u5207\u4e2d\u6700\u91cd\u8981\u7684\u90e8\u5206\u3002\u79bb\u5f00\u672c\u5730\u4e3b\u673a\u3002",source:"@site/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README.md",sourceDirName:"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel",slug:"/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README.md",tags:[],version:"current",sidebarPosition:25,frontMatter:{sidebar_position:25,sidebar_label:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/"},next:{title:"Solana\u94b1\u5305\u4f7f\u7528",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module1/wallet-usage/"}},s={},u=[],i={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,o.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"-\u90e8\u7f72\u5230-vercel"},"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel"),(0,n.kt)("p",null,"\u8fd9\u662f\u4f60\u672c\u5468\u6240\u505a\u7684\u4e00\u5207\u4e2d\u6700\u91cd\u8981\u7684\u90e8\u5206\u3002\u79bb\u5f00\u672c\u5730\u4e3b\u673a\u3002"),(0,n.kt)("p",null,"\u6211\u4eec\u5c06\u628a\u524d\u7aef\u90e8\u7f72\u5230 Vercel\u3002 Vercel \u662f\u4e00\u4e2a\u6258\u7ba1\u5e73\u53f0\uff0c\u53ef\u8ba9\u60a8\u8f7b\u677e\u90e8\u7f72\u5e94\u7528\u7a0b\u5e8f\u3002\u6700\u597d\u7684\u90e8\u5206\uff1f\u514d\u8d39\uff01"),(0,n.kt)("p",null,"\u9996\u5148\uff0c\u60a8\u9700\u8981\u5c06\u9879\u76ee\u63a8\u9001\u5230 Github\u3002\u8fd9\u5e94\u8be5\u9700\u8981\u5927\u7ea6 5 \u5206\u949f\uff0c\u5982\u679c\u60a8\u4e0d\u786e\u5b9a\u5982\u4f55\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u53ea\u9700 Google \u5373\u53ef\uff01"),(0,n.kt)("p",null,"\u5b8c\u6210\u540e\uff0c\u524d\u5f80 ",(0,n.kt)("a",{parentName:"p",href:"https://vercel.com/"},"Vercel")," \u5e76\u8fde\u63a5\u60a8\u7684 Github \u5e10\u6237\u3002\u5b83\u5e94\u8be5\u81ea\u52a8\u68c0\u6d4b\u5230\u8fd9\u662f\u4e00\u4e2a Next.js \u9879\u76ee\uff0c\u5e76\u4e14\u90e8\u7f72\u5e94\u8be5\u5f88\u7b80\u5355\u3002\u6784\u5efa\u5b8c\u6210\u540e\uff0c\u5b83\u4f1a\u8f93\u51fa\u4e00\u4e2a\u94fe\u63a5\u3002"),(0,n.kt)("p",null,"\u60a8\u73b0\u5728\u5df2\u7ecf\u79bb\u5f00\u672c\u5730\u4e3b\u673a\u4e86\uff01 \ud83c\udf89"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f4cf1efc.b79dfb41.js b/assets/js/f4cf1efc.b79dfb41.js deleted file mode 100644 index 2b142f6ff..000000000 --- a/assets/js/f4cf1efc.b79dfb41.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[550],{3905:(e,t,r)=>{r.d(t,{Zo:()=>i,kt:()=>y});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var u=o.createContext({}),s=function(e){var t=o.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},i=function(e){var t=s(e.components);return o.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,u=e.parentName,i=c(e,["components","mdxType","originalType","parentName"]),p=s(r),m=n,y=p["".concat(u,".").concat(m)]||p[m]||d[m]||a;return r?o.createElement(y,l(l({ref:t},i),{},{components:r})):o.createElement(y,l({ref:t},i))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,l=new Array(a);l[0]=m;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c[p]="string"==typeof e?e:n,l[1]=c;for(var s=2;s{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var o=r(7462),n=(r(7294),r(3905));const a={sidebar_position:25,sidebar_label:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",sidebar_class_name:"green"},l="\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",c={unversionedId:"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README",id:"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README",title:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",description:"\u8fd9\u662f\u4f60\u672c\u5468\u6240\u505a\u7684\u4e00\u5207\u4e2d\u6700\u91cd\u8981\u7684\u90e8\u5206\u3002\u79bb\u5f00\u672c\u5730\u4e3b\u673a\u3002",source:"@site/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README.md",sourceDirName:"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel",slug:"/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/",permalink:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README.md",tags:[],version:"current",sidebarPosition:25,frontMatter:{sidebar_position:25,sidebar_label:"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83d\udcbb \u6784\u5efa\u4e00\u4e2aNFT\u94f8\u9020\u5668\u524d\u7aef",permalink:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/"},next:{title:"Solana\u94b1\u5305\u4f7f\u7528",permalink:"/docs/Solana-Co-Learn/module1/wallet-usage/"}},u={},s=[],i={toc:s},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,o.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"-\u90e8\u7f72\u5230-vercel"},"\ud83c\udf10 \u90e8\u7f72\u5230 Vercel"),(0,n.kt)("p",null,"\u8fd9\u662f\u4f60\u672c\u5468\u6240\u505a\u7684\u4e00\u5207\u4e2d\u6700\u91cd\u8981\u7684\u90e8\u5206\u3002\u79bb\u5f00\u672c\u5730\u4e3b\u673a\u3002"),(0,n.kt)("p",null,"\u6211\u4eec\u5c06\u628a\u524d\u7aef\u90e8\u7f72\u5230 Vercel\u3002 Vercel \u662f\u4e00\u4e2a\u6258\u7ba1\u5e73\u53f0\uff0c\u53ef\u8ba9\u60a8\u8f7b\u677e\u90e8\u7f72\u5e94\u7528\u7a0b\u5e8f\u3002\u6700\u597d\u7684\u90e8\u5206\uff1f\u514d\u8d39\uff01"),(0,n.kt)("p",null,"\u9996\u5148\uff0c\u60a8\u9700\u8981\u5c06\u9879\u76ee\u63a8\u9001\u5230 Github\u3002\u8fd9\u5e94\u8be5\u9700\u8981\u5927\u7ea6 5 \u5206\u949f\uff0c\u5982\u679c\u60a8\u4e0d\u786e\u5b9a\u5982\u4f55\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u53ea\u9700 Google \u5373\u53ef\uff01"),(0,n.kt)("p",null,"\u5b8c\u6210\u540e\uff0c\u524d\u5f80 ",(0,n.kt)("a",{parentName:"p",href:"https://vercel.com/"},"Vercel")," \u5e76\u8fde\u63a5\u60a8\u7684 Github \u5e10\u6237\u3002\u5b83\u5e94\u8be5\u81ea\u52a8\u68c0\u6d4b\u5230\u8fd9\u662f\u4e00\u4e2a Next.js \u9879\u76ee\uff0c\u5e76\u4e14\u90e8\u7f72\u5e94\u8be5\u5f88\u7b80\u5355\u3002\u6784\u5efa\u5b8c\u6210\u540e\uff0c\u5b83\u4f1a\u8f93\u51fa\u4e00\u4e2a\u94fe\u63a5\u3002"),(0,n.kt)("p",null,"\u60a8\u73b0\u5728\u5df2\u7ecf\u79bb\u5f00\u672c\u5730\u4e3b\u673a\u4e86\uff01 \ud83c\udf89"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f9b3936f.5c5c2bb4.js b/assets/js/f9b3936f.5c5c2bb4.js deleted file mode 100644 index 474f57256..000000000 --- a/assets/js/f9b3936f.5c5c2bb4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[740],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>k});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=a.createContext({}),u=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),c=u(n),m=l,k=c["".concat(p,".").concat(m)]||c[m]||d[m]||r;return n?a.createElement(k,i(i({ref:t},s),{},{components:n})):a.createElement(k,i({ref:t},s))}));function k(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[c]="string"==typeof e?e:l,i[1]=o;for(var u=2;u{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var a=n(7462),l=(n(7294),n(3905));const r={sidebar_position:57,sidebar_label:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",sidebar_class_name:"green"},i="\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",o={unversionedId:"Solana-Co-Learn/module3/native-solana-development/state-management/README",id:"Solana-Co-Learn/module3/native-solana-development/state-management/README",title:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",description:"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e2d\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u6784\u5efa\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u7535\u5f71\uff0c\u6211\u4e0d\u662f\u4f60\u7238\u7238\u3002\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u7c7b\u578b\u7684\u72b6\u6001\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u72b6\u6001\u662f\u6307\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u7a0b\u5e8f\u6570\u636e\u3002",source:"@site/docs/Solana-Co-Learn/module3/native-solana-development/state-management/README.md",sourceDirName:"Solana-Co-Learn/module3/native-solana-development/state-management",slug:"/Solana-Co-Learn/module3/native-solana-development/state-management/",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/state-management/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/native-solana-development/state-management/README.md",tags:[],version:"current",sidebarPosition:57,frontMatter:{sidebar_position:57,sidebar_label:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",permalink:"/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/"},next:{title:"\u5b89\u5168\u548c\u9a8c\u8bc1",permalink:"/docs/Solana-Co-Learn/module3/security-and-validation/"}},p={},u=[{value:"\ud83d\udcdd \u7a0b\u5e8f\u72b6\u6001\u4f5c\u4e3aRust\u6570\u636e\u7c7b\u578b",id:"-\u7a0b\u5e8f\u72b6\u6001\u4f5c\u4e3arust\u6570\u636e\u7c7b\u578b",level:2},{value:"\ud83c\udfe0 \u7a7a\u95f4\u548c\u79df\u91d1",id:"-\u7a7a\u95f4\u548c\u79df\u91d1",level:2},{value:"\ud83d\udcca \u8ba1\u7b97\u79df\u91d1",id:"-\u8ba1\u7b97\u79df\u91d1",level:2},{value:"\ud83d\udcdc \u7a0b\u5e8f\u6d3e\u751f\u5730\u5740",id:"-\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740",level:2},{value:"\ud83d\udeeb \u8de8\u7a0b\u5e8f\u8c03\u7528",id:"-\u8de8\u7a0b\u5e8f\u8c03\u7528",level:2},{value:"\u2702 \u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e",id:"-\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e",level:2},{value:"\ud83d\udcfc \u603b\u7ed3 - \u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77",id:"-\u603b\u7ed3---\u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77",level:2},{value:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",id:"-\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",level:2},{value:"\u23e9 \u8fed\u4ee3\u8d26\u6237",id:"-\u8fed\u4ee3\u8d26\u6237",level:3},{value:"\ud83e\udd5a \u5bfc\u51faPDA\u5730\u5740",id:"-\u5bfc\u51fapda\u5730\u5740",level:3},{value:"\ud83e\uddee \u8ba1\u7b97\u7a7a\u95f4\u548c\u79df\u91d1",id:"-\u8ba1\u7b97\u7a7a\u95f4\u548c\u79df\u91d1",level:3},{value:"\ud83d\udcdd \u521b\u5efa\u8d26\u6237",id:"-\u521b\u5efa\u8d26\u6237",level:3},{value:"\ud83c\udf89 \u8bd5\u4e00\u8bd5",id:"-\u8bd5\u4e00\u8bd5",level:3},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2}],s={toc:u},c="wrapper";function d(e){let{components:t,...r}=e;return(0,l.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u72b6\u6001\u7ba1\u7406"},"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406"),(0,l.kt)("p",null,"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e2d\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u6784\u5efa\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u7535\u5f71\uff0c\u6211\u4e0d\u662f\u4f60\u7238\u7238\u3002\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u7c7b\u578b\u7684\u72b6\u6001\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u72b6\u6001\u662f\u6307\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u7a0b\u5e8f\u6570\u636e\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u6709\u4e00\u4e2a\u53ef\u9760\u7684\u7a0b\u5e8f\uff0c\u5b83\u63a5\u6536\u6307\u4ee4\u6570\u636e\u5e76\u51c6\u5907\u8fdb\u884c\u5904\u7406\u3002\u8981\u6267\u884c\u8fd9\u4e9b\u6307\u4ee4\uff0c\u6211\u4eec\u9700\u8981\u5b66\u4e60\u66f4\u591a\u5173\u4e8eRust\u7684\u77e5\u8bc6\u3002"),(0,l.kt)("h2",{id:"-\u7a0b\u5e8f\u72b6\u6001\u4f5c\u4e3arust\u6570\u636e\u7c7b\u578b"},"\ud83d\udcdd \u7a0b\u5e8f\u72b6\u6001\u4f5c\u4e3aRust\u6570\u636e\u7c7b\u578b"),(0,l.kt)("p",null,"Solana\u4fdd\u6301\u5176\u901f\u5ea6\u548c\u6548\u7387\u7684\u4e00\u90e8\u5206\u539f\u56e0\u662f\u7a0b\u5e8f\u662f\u65e0\u72b6\u6001\u7684\u3002\u8fd9\u610f\u5473\u7740\u60a8\u65e0\u6cd5\u66f4\u6539\u7a0b\u5e8f\u4e0a\u7684\u6570\u636e - \u6240\u6709\u6570\u636e\u90fd\u5b58\u50a8\u5728\u5916\u90e8\u8d26\u6237\u4e2d\uff0c\u901a\u5e38\u662f\u7531\u7a0b\u5e8f\u62e5\u6709\u7684\u8d26\u6237\u3002\u5927\u591a\u6570\u8fd9\u4e9b\u8d26\u6237\u662fPDA\uff08Program Derived Accounts\uff09 - \u6211\u4eec\u73b0\u5728\u5c06\u67e5\u770b\u5b83\u4eec\u7684\u6570\u636e\u5b58\u50a8\u5143\u7d20\uff0c\u5e76\u7a0d\u540e\u6df1\u5165\u4e86\u89e3\u5176\u4f59\u90e8\u5206\u3002"),(0,l.kt)("p",null,"\u5c31\u50cf\u6211\u4eec\u5c06\u6307\u4ee4\u6570\u636e\u8f6c\u6362\u4e3aRust\u7c7b\u578b\u4e00\u6837\uff0c\u6211\u4eec\u5c06\u628a\u7a0b\u5e8f\u72b6\u6001\u4e5f\u8f6c\u6362\u4e3aRust\u7c7b\u578b\uff0c\u4ee5\u4fbf\u66f4\u5bb9\u6613\u5904\u7406\u3002"),(0,l.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b Solana \u8d26\u6237\u4e2d\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"data")," \u5b57\u6bb5 - \u5b83\u5b58\u50a8\u4e86\u4e00\u4e2a\u539f\u59cb\u5b57\u8282\u6570\u7ec4\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u6765\u8868\u793a\u5b83\u5728 Rust \u7c7b\u578b\u4e2d\u7684\u5f62\u5f0f\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(1587).Z,width:"1398",height:"397"})),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u518d\u6b21\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"borsh macro"),"\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(5628).Z,width:"1388",height:"844"})),(0,l.kt)("p",null,"\u6570\u636e\u5728\u4f20\u8f93\u548c\u5b58\u50a8\u65f6\u4ee5\u539f\u59cb\u5b57\u8282\u7684\u5f62\u5f0f\u8fdb\u884c\uff0c\u4f46\u5728\u6211\u4eec\u5e0c\u671b\u5904\u7406\u6570\u636e\u65f6\uff0c\u4f1a\u5c06\u5176\u8f6c\u6362\u4e3aRust\u7c7b\u578b\u3002\u6709\u9053\u7406\uff0c\u5bf9\u5427\uff1f"),(0,l.kt)("h2",{id:"-\u7a7a\u95f4\u548c\u79df\u91d1"},"\ud83c\udfe0 \u7a7a\u95f4\u548c\u79df\u91d1"),(0,l.kt)("p",null,"\u662f\u7684\uff0cSolana\u4e5f\u6709\u623f\u4e1c\uff1a\u9a8c\u8bc1\u8005\u5c06\u533a\u5757\u94fe\u7684\u72b6\u6001\u5b58\u50a8\u5728\u4ed6\u4eec\u7684\u673a\u5668\u4e0a\u3002"),(0,l.kt)("p",null,"\u79df\u91d1\u4ee5",(0,l.kt)("inlineCode",{parentName:"p"},"Lamports"),"\u652f\u4ed8\uff0c",(0,l.kt)("inlineCode",{parentName:"p"},"Lamport"),"\u662fSOL\u7684\u6700\u5c0f\u5355\u4f4d\uff08",(0,l.kt)("inlineCode",{parentName:"p"},"0.000000001 SOL = 1 Lamport"),"\uff09\uff0c\u6839\u636e\u8d26\u6237\u5360\u7528\u7684\u7a7a\u95f4\u5927\u5c0f\u8ba1\u7b97\u3002\u4ee5\u4e0b\u662f\u5e38\u89c1\u7c7b\u578b\u5360\u7528\u7684\u5b57\u8282\u7a7a\u95f4\u7684\u8868\u683c\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6249).Z,width:"800",height:"819"})),(0,l.kt)("p",null,"\u4ed8\u623f\u79df\u6709\u4e24\u79cd\u65b9\u5f0f\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6309\u6bcf\u4e2a\u65f6\u671f\u652f\u4ed8\u79df\u91d1\u3002\u8fd9\u5c31\u50cf\u6bcf\u6708\u652f\u4ed8\u79df\u91d1\u4e00\u6837 - \u53ea\u8981\u4f60\u7ee7\u7eed\u652f\u4ed8\uff0c\u4f60\u5c31\u53ef\u4ee5\u7ee7\u7eed\u5c45\u4f4f\u3002\u5982\u679c\u8d26\u6237\u6ca1\u6709\u8db3\u591f\u7684SOL\uff0c\u5b83\u5c06\u88ab\u91cd\u7f6e\uff0c\u6570\u636e\u5c06\u4e22\u5931\u3002"),(0,l.kt)("li",{parentName:"ul"},"\u4fdd\u6301\u7b49\u4e8e2\u5e74\u79df\u91d1\u7684\u6700\u4f4e\u4f59\u989d\u3002\u8fd9\u6837\u8d26\u6237\u5c31\u514d\u9664\u4e86\u79df\u91d1\u3002\u8fd9\u91cc\u7684\u903b\u8f91\u662f\u786c\u4ef6\u6210\u672c\u6bcf2\u5e74\u4e0b\u964d50%\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u6709\u8db3\u591f\u7684SOL\u652f\u4ed82\u5e74\u7684\u79df\u91d1\uff0c\u4f60\u5c31\u6c38\u8fdc\u4e0d\u7528\u62c5\u5fc3\u4e86\uff01")),(0,l.kt)("p",null,"\u73b0\u5728\u8981\u6c42\u514d\u79df\u91d1\uff0c\u6240\u4ee5\u53ea\u6709\u9009\u9879#2\u3002\u8fd9\u79cd\u65b9\u6cd5\u7684\u6700\u5927\u4f18\u70b9\u662f\uff0c\u5f53\u60a8\u4e0d\u518d\u9700\u8981\u5b58\u50a8\u6570\u636e\u65f6\uff0c\u53ef\u4ee5\u9500\u6bc1\u8d26\u6237\u5e76\u53d6\u56de\u60a8\u7684SOL\uff01\u533a\u5757\u94fe\u4e0a\u7684\u514d\u8d39\u5b58\u50a8\uff08\u51cf\u53bb\u4ea4\u6613\u8d39\u7528\uff09\ud83e\udd73"),(0,l.kt)("p",null,"\u4e3a\u4ec0\u4e48\u8981\u5728\u533a\u5757\u94fe\u4e0a\u79df\u8d41\u5462\uff1f\u55ef\uff0c\u8fd9\u662f\u4e00\u79cd\u9632\u6b62\u4eba\u4eec\u521b\u5efa\u5927\u91cf\u8d26\u6237\u5374\u4ece\u672a\u4f7f\u7528\u7684\u65b9\u5f0f\u3002\u8fd9\u5c06\u6d6a\u8d39\u7a7a\u95f4\u548c\u9a8c\u8bc1\u8005\u8d44\u6e90\u3002\u8fd9\u4e2a\u7cfb\u7edf\u662fSolana\u4e0a\u5b58\u50a8\u5982\u6b64\u5ec9\u4ef7\u7684\u539f\u56e0\u4e4b\u4e00\u2014\u2014\u4e0e\u4ee5\u592a\u574a\u4e0d\u540c\uff0c\u6211\u7684\u611a\u8822\u7684Hello World NFT\u6536\u85cf\u5c06\u88ab\u6240\u6709\u9a8c\u8bc1\u8005\u6c38\u4e45\u5b58\u50a8\u3002"),(0,l.kt)("p",null,"\u4f60\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://docs.solana.com/implemented-proposals/rent"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u76f8\u5173\u5185\u5bb9\uff0c\u6211\u89c9\u5f97\u633a\u9177\u7684\uff01"),(0,l.kt)("h2",{id:"-\u8ba1\u7b97\u79df\u91d1"},"\ud83d\udcca \u8ba1\u7b97\u79df\u91d1"),(0,l.kt)("p",null,"\u8ba1\u7b97\u79df\u91d1\u5f88\u7b80\u5355 - \u6709\u4e00\u4e2a\u5f88\u6709\u7528\u7684\u529f\u80fd\u53ef\u4ee5\u5e2e\u52a9\u4f60\u3002\u68d8\u624b\u7684\u90e8\u5206\u662f\u5f04\u6e05\u695a\u4f60\u9700\u8981\u591a\u5c11\u7a7a\u95f4\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u7684\u8d85\u7ea7\u7b14\u8bb0\u7a0b\u5e8f\u7684\u6837\u5b50\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"// Calculate account size required for struct NoteState\n// 4 bytes to store the size of the subsequent dynamic data (string)\n// 8 bytes to store the 64 bit interger for the id\nlet account_len: usize = (4 + title.len()) + (4 + body.len()) + 8;\n\n// Calculate rent required\nlet rent = Rent::get()?;\nlet rent_lamports = rent.minimum_balance(account_len);\n")),(0,l.kt)("p",null,"\u6211\u4eec\u9996\u5148\u8981\u505a\u7684\u662f\u8ba1\u7b97\u6211\u4eec\u5b58\u50a8\u7684\u6570\u636e\u7684\u603b\u957f\u5ea6\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u548c8\u4e2a\u5b57\u8282\u7684id\u76f8\u52a0\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\u3002"),(0,l.kt)("p",null,"\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c ",(0,l.kt)("inlineCode",{parentName:"p"},"title")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"body")," \u662f\u52a8\u6001\u6570\u636e\u7c7b\u578b\uff08\u5b57\u7b26\u4e32\uff09-\u5b83\u4eec\u53ef\u4ee5\u662f\u4efb\u610f\u957f\u5ea6\u3002\u6211\u4eec\u4f7f\u7528\u524d4\u4e2a\u5b57\u8282\u6765\u5b58\u50a8\u6bcf\u4e2a\u9879\u76ee\u7684\u957f\u5ea6\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u6bcf\u4e2a\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u52a0\u4e0a4\u3002"),(0,l.kt)("p",null,"\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"Rent::get()")," \u51fd\u6570\u6765\u83b7\u53d6\u8d26\u6237\u7684\u79df\u91d1\u3002\u8f7b\u677e\u6109\u5feb\uff01"),(0,l.kt)("h2",{id:"-\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740"},"\ud83d\udcdc \u7a0b\u5e8f\u6d3e\u751f\u5730\u5740"),(0,l.kt)("p",null,"\u6211\u4eec\u5df2\u7ecf\u4ece\u6307\u4ee4\u4e2d\u83b7\u53d6\u4e86\u6211\u4eec\u7684\u6570\u636e\uff0c\u6211\u4eec\u5df2\u7ecf\u8ba1\u7b97\u51fa\u6211\u4eec\u9700\u8981\u652f\u4ed8\u591a\u5c11\u79df\u91d1\uff0c\u73b0\u5728\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u8d26\u6237\u6765\u5b58\u653e\u5b83\u3002\u55e8\uff0cPDAs\uff01\u8fd8\u8bb0\u5f97\u524d\u7aef\u7684\u9e21\u548c\u86cb\u95ee\u9898\u5417\uff1f\u8fd9\u91cc\u4e5f\u662f\u4e00\u6837\u7684\uff01\u6211\u4eec\u5c06\u4ece\u7a0b\u5e8fID\u548c\u4e00\u7ec4\u79cd\u5b50\u4e2d\u63a8\u5bfc\u51fa\u8d26\u6237\u7684\u5730\u5740\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(4242).Z,width:"1500",height:"285"})),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u672a\u6765\u6df1\u5165\u63a2\u8ba8PDA\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u4f46\u73b0\u5728\u4f60\u53ea\u9700\u8981\u77e5\u9053 ",(0,l.kt)("inlineCode",{parentName:"p"},"find_program_address")," \u529f\u80fd\uff0c\u5e76\u4e14\u53ea\u6709 ",(0,l.kt)("inlineCode",{parentName:"p"},"program_id")," \u4e2d\u7684\u7a0b\u5e8f\u53ef\u4ee5\u4e3aPDA\u7b7e\u540d\u3002\u5c31\u50cf\u5b89\u5168\u5b58\u50a8\u4e00\u6837\uff0c\u4e0d\u9700\u8981\u5bc6\u7801\u3002"),(0,l.kt)("h2",{id:"-\u8de8\u7a0b\u5e8f\u8c03\u7528"},"\ud83d\udeeb \u8de8\u7a0b\u5e8f\u8c03\u7528"),(0,l.kt)("p",null,"\u6700\u540e\u4e00\u6b65\u662f\u521d\u59cb\u5316PDA\uff08\u6211\u4eec\u53ea\u5728\u6700\u540e\u4e00\u6b65\u4e2d\u627e\u5230\u4e86\u5730\u5740\uff09\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u8de8\u7a0b\u5e8f\u8c03\u7528\uff08CPI\uff09\u6765\u5b8c\u6210\u6b64\u64cd\u4f5c\u3002\u6b63\u5982\u5176\u540d\u79f0\u6240\u793a\uff0c\u6211\u4eec\u5c06\u5728\u6211\u4eec\u7684\u7a0b\u5e8f\u4e2d\u4e0eSolana\u7f51\u7edc\u4e0a\u7684\u53e6\u4e00\u4e2a\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,l.kt)("p",null,"CPI\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke")," \u6216 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke_signed")," \u8fdb\u884c"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(1950).Z,width:"782",height:"770"})),(0,l.kt)("p",null,"\u5f53\u60a8\u4e0d\u9700\u8981\u7b7e\u7f72\u4ea4\u6613\u65f6\uff0c\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke")," \u3002\u5f53\u60a8\u9700\u8981\u7b7e\u7f72\u4ea4\u6613\u65f6\uff0c\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke_signed")," \u3002\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u662f\u552f\u4e00\u53ef\u4ee5\u4e3aPDA\u7b7e\u7f72\u7684\u4eba\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke_signed")," \u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6429).Z,width:"1500",height:"514"})),(0,l.kt)("p",null,"\u8fd9\u662f\u5b83\u7684\u6837\u5b50\u3002\u4f60\u53ef\u80fd\u4f1a\u60f3\uff1a\u201c\u8fd9\u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f\u201d - \u522b\u62c5\u5fc3\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u4f1a\u7ec3\u4e60\uff0c\u4e00\u5207\u90fd\u4f1a\u660e\u767d\u7684 :)"),(0,l.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u6240\u505a\u7684\u53ea\u662f\u4f7f\u7528Rust\u5728\u7a0b\u5e8f\u4e2d\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\uff0c\u7c7b\u4f3c\u4e8e\u6211\u4eec\u5728\u5ba2\u6237\u7aef\u4f7f\u7528TypeScript\u65f6\u6240\u505a\u7684\u3002\u6211\u4eec\u5728\u8fd9\u91cc\u6709\u4e00\u4e2a\u7279\u6b8a\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"signers_seeds")," \u4e1c\u897f\uff0c\u8fd9\u5bf9\u4e8ePDA\u662f\u5fc5\u9700\u7684\u3002"),(0,l.kt)("h2",{id:"-\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e"},"\u2702 \u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e"),(0,l.kt)("p",null,"\u4e00\u65e6\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u65b0\u8d26\u6237\uff0c\u6211\u4eec\u9700\u8981\u8bbf\u95ee\u5e76\u66f4\u65b0\u8be5\u8d26\u6237\u7684\u6570\u636e\u5b57\u6bb5\uff08\u76ee\u524d\u4e3a\u7a7a\u5b57\u8282\uff09\u3002\u8fd9\u610f\u5473\u7740\u5c06\u5176\u5b57\u8282\u6570\u7ec4\u53cd\u5e8f\u5217\u5316\u4e3a\u6211\u4eec\u521b\u5efa\u7684\u7c7b\u578b\u7684\u5b9e\u4f8b\uff0c\u66f4\u65b0\u8be5\u5b9e\u4f8b\u4e0a\u7684\u5b57\u6bb5\uff0c\u7136\u540e\u5c06\u8be5\u5b9e\u4f8b\u91cd\u65b0\u5e8f\u5217\u5316\u4e3a\u5b57\u8282\u6570\u7ec4\u3002"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e")),(0,l.kt)("p",null,"\u66f4\u65b0\u5e10\u6237\u6570\u636e\u7684\u7b2c\u4e00\u6b65\u662f\u5c06\u5176\u6570\u636e\u5b57\u8282\u6570\u7ec4\u53cd\u5e8f\u5217\u5316\u4e3aRust\u7c7b\u578b\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u9996\u5148\u501f\u7528\u5e10\u6237\u4e0a\u7684\u6570\u636e\u5b57\u6bb5\u6765\u5b9e\u73b0\u6b64\u64cd\u4f5c\u3002\u8fd9\u6837\u53ef\u4ee5\u5728\u4e0d\u83b7\u53d6\u6240\u6709\u6743\u7684\u60c5\u51b5\u4e0b\u8bbf\u95ee\u6570\u636e\u3002"),(0,l.kt)("p",null,"\u7136\u540e\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"try_from_slice_unchecked"),"\u51fd\u6570\u6765\u53cd\u5e8f\u5217\u5316\u501f\u7528\u8d26\u6237\u7684\u6570\u636e\u5b57\u6bb5\uff0c\u4f7f\u7528\u60a8\u521b\u5efa\u7684\u7c7b\u578b\u6765\u8868\u793a\u6570\u636e\u7684\u683c\u5f0f\u3002\u8fd9\u5c06\u4e3a\u60a8\u63d0\u4f9b\u4e00\u4e2aRust\u7c7b\u578b\u7684\u5b9e\u4f8b\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u4f7f\u7528\u70b9\u7b26\u53f7\u8f7b\u677e\u66f4\u65b0\u5b57\u6bb5\u3002\u5982\u679c\u6211\u4eec\u4f7f\u7528\u6211\u4eec\u4e00\u76f4\u5728\u4f7f\u7528\u7684\u7b14\u8bb0\u5e94\u7528\u7a0b\u5e8f\u793a\u4f8b\u6765\u5b8c\u6210\u8fd9\u4e2a\u64cd\u4f5c\uff0c\u5b83\u4f1a\u662f\u8fd9\u6837\u7684\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"let mut account_data = try_from_slice_unchecked::(note_pda_account.data.borrow()).unwrap();\n\naccount_data.title = title;\naccount_data.body = body;\naccount_data.id = id;\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e")),(0,l.kt)("p",null,"\u4e00\u65e6Rust\u5b9e\u4f8b\u66f4\u65b0\u4e86\u8d26\u6237\u6570\u636e\u7684\u9002\u5f53\u503c\uff0c\u60a8\u53ef\u4ee5\u5c06\u6570\u636e\u201c\u4fdd\u5b58\u201d\u5728\u8d26\u6237\u4e0a\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u901a\u8fc7\u5bf9\u60a8\u521b\u5efa\u7684Rust\u7c7b\u578b\u5b9e\u4f8b\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"serialize"),"\u51fd\u6570\u6765\u5b8c\u6210\u7684\u3002\u60a8\u9700\u8981\u4f20\u5165\u5bf9\u8d26\u6237\u6570\u636e\u7684\u53ef\u53d8\u5f15\u7528\u3002\u8fd9\u91cc\u7684\u8bed\u6cd5\u6709\u4e9b\u68d8\u624b\uff0c\u6240\u4ee5\u5982\u679c\u60a8\u4e0d\u5b8c\u5168\u7406\u89e3\u4e5f\u4e0d\u7528\u62c5\u5fc3\u3002\u501f\u7528\u548c\u5f15\u7528\u662fRust\u4e2d\u6700\u96be\u7684\u6982\u5ff5\u4e4b\u4e00\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"account_data.serialize(&mut &mut note_pda_account.data.borrow_mut()[..])?;\n")),(0,l.kt)("p",null,"\u4e0a\u9762\u7684\u793a\u4f8b\u5c06 ",(0,l.kt)("inlineCode",{parentName:"p"},"account_data")," \u5bf9\u8c61\u8f6c\u6362\u4e3a\u5b57\u8282\u6570\u7ec4\uff0c\u5e76\u5c06\u5176\u8bbe\u7f6e\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},"note_pda_account")," \u4e0a\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"data")," \u5c5e\u6027\u3002\u8fd9\u6709\u6548\u5730\u5c06\u66f4\u65b0\u540e\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"account_data")," \u53d8\u91cf\u4fdd\u5b58\u5230\u65b0\u8d26\u6237\u7684\u6570\u636e\u5b57\u6bb5\u4e2d\u3002\u73b0\u5728\uff0c\u5f53\u7528\u6237\u83b7\u53d6 ",(0,l.kt)("inlineCode",{parentName:"p"},"note_pda_account")," \u5e76\u53cd\u5e8f\u5217\u5316\u6570\u636e\u65f6\uff0c\u5b83\u5c06\u663e\u793a\u6211\u4eec\u5e8f\u5217\u5316\u5230\u8d26\u6237\u4e2d\u7684\u66f4\u65b0\u6570\u636e\u3002"),(0,l.kt)("h2",{id:"-\u603b\u7ed3---\u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77"},"\ud83d\udcfc \u603b\u7ed3 - \u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77"),(0,l.kt)("p",null,"\u90a3\u771f\u662f\u592a\u591a\u4e86\u3002\u6211\u5f97\u4f11\u606f\u4e00\u4e0b\uff0c\u7136\u540e\u56de\u6765\u7ee7\u7eed\u5199\u5b8c\u8fd9\u4e2a\u3002\u8ba9\u6211\u4eec\u56de\u987e\u4e00\u4e0b\u6574\u4e2a\u8fc7\u7a0b\u7684\u59cb\u7ec8\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"\u7528\u6237\u901a\u8fc7\u53d1\u9001\u4e00\u4e2a\u5305\u542b\u6807\u9898\u3001\u6b63\u6587\u548c\u5b57\u8282ID\u7684\u4ea4\u6613\u6765\u521b\u5efa\u4e00\u4e2a\u7b14\u8bb0"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u7684\u7a0b\u5e8f\u63a5\u6536\u6307\u4ee4\uff0c\u63d0\u53d6\u6570\u636e\u5e76\u5c06\u5176\u683c\u5f0f\u5316\u4e3aRust\u7c7b\u578b"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:3},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u4f7f\u7528Rust\u7c7b\u578b\u6765\u8ba1\u7b97\u6211\u4eec\u7684\u8d26\u6237\u9700\u8981\u591a\u5c11\u7a7a\u95f4+\u6211\u4eec\u9700\u8981\u652f\u4ed8\u591a\u5c11\u79df\u91d1"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:4},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u4ece\u7a0b\u5e8fID\u548c\u4e00\u7ec4\u79cd\u5b50\u4e2d\u63a8\u5bfc\u51fa\u8d26\u6237\u7684\u5730\u5740"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:5},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u4f7f\u7528CPI\u521b\u5efa\u4e00\u4e2a\u7a7a\u767d\u6570\u636e\u7684\u8d26\u6237"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:6},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u5c06\u8d26\u6237\u6570\u636e\u53cd\u5e8f\u5217\u5316\u4e3aRust\u7c7b\u578b"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:7},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u4f7f\u7528\u6307\u4ee4\u4e2d\u7684\u6570\u636e\u6765\u66f4\u65b0Rust\u7c7b\u578b\u7684\u8d26\u6237\u6570\u636e"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:8},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u5c06Rust\u7c7b\u578b\u5e8f\u5217\u5316\u4e3a\u539f\u59cb\u5b57\u8282\uff0c\u5e76\u5c06\u5176\u4fdd\u5b58\u5230\u8d26\u6237\u4e2d")))),(0,l.kt)("p",null,"\u8fd9\u5c31\u662f\u5168\u90e8\u4e86\uff0c\u670b\u53cb\u3002\u4f60\u73b0\u5728\u77e5\u9053\u5982\u4f55\u5411Solana\u4e0a\u7684\u8d26\u6237\u5199\u5165\u6570\u636e\u4e86\u3002\u6211\u5728\u5c16\u53eb\uff0c\u56e0\u4e3a\u8fd9\u592a\u91cd\u8981\u4e86\u3002\u7ed9\u4f60\u4e00\u4e2a\u5927\u5927\u7684\u80dc\u5229\uff0c\u62ff\u53bb\u5427\uff0c\u4f60\u503c\u5f97\u62e5\u6709\u5b83\uff1a"),(0,l.kt)("h2",{id:"-\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"},"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"),(0,l.kt)("p",null,"\u5b8c\u6210\u5de5\u4f5c\u7684\u65f6\u95f4\u5230\u4e86\u3002\u6211\u4eec\u7684\u53f2\u8bd7\u7ea7\u7535\u5f71\u8bc4\u8bba\u5c06\u4e0d\u518d\u88ab\u8bb0\u5f55\u5728\u63a7\u5236\u53f0\u4e0a\uff0c\u800c\u662f\u5c06\u5b83\u4eec\u5b58\u50a8\u5728\u533a\u5757\u94fe\u4e0a\uff01"),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528\u4e0e\u4e4b\u524d\u76f8\u540c\u7684\u7a0b\u5e8f\uff0c\u60a8\u53ef\u4ee5",(0,l.kt)("a",{parentName:"p",href:"https://beta.solpg.io/6295b25b0e6ab1eb92d947f7"},"\u4ece\u5934\u5f00\u59cb\u8bbe\u7f6e"),"\u5b83\uff0c\u6216\u8005\u4f7f\u7528\u4e0a\u4e00\u8282\u7684\u90a3\u4e2a\u3002"),(0,l.kt)("h1",{id:"-\u8d26\u6237\u6570\u636e\u7684\u4ee3\u8868"},"\ud83d\udcdd \u8d26\u6237\u6570\u636e\u7684\u4ee3\u8868"),(0,l.kt)("p",null,"\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u65b0\u7684Rust\u7c7b\u578b\u6765\u8868\u793a\u6211\u4eec\u5b58\u50a8\u7684\u6570\u636e\u3002\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},"state.rs")," \u7684\u65b0\u6587\u4ef6\uff0c\u5e76\u5728\u5176\u4e2d\u6dfb\u52a0 ",(0,l.kt)("inlineCode",{parentName:"p"},"MovieAccountState")," \u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"use borsh::{BorshSerialize, BorshDeserialize};\n\n#[derive(BorshSerialize, BorshDeserialize)]\npub struct MovieAccountState {\n pub is_initialized: bool,\n pub rating: u8,\n pub title: String,\n pub description: String,\n}\n")),(0,l.kt)("p",null,"\u6211\u4eec\u8fd9\u91cc\u6709 ",(0,l.kt)("inlineCode",{parentName:"p"},"BorshSerialize")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"BorshDeserialize")," \u4e24\u8005\u90fd\u6709 :)"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u66f4\u65b0 ",(0,l.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u4ee5\u5c06\u6211\u4eec\u6240\u9700\u7684\u6240\u6709\u5185\u5bb9\u5f15\u5165\u8303\u56f4\u3002\u5c06\u6587\u4ef6\u9876\u90e8\u66f4\u65b0\u4e3a\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::{\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg,\n account_info::{next_account_info, AccountInfo},\n system_instruction,\n sysvar::{rent::Rent, Sysvar},\n program::{invoke_signed},\n borsh::try_from_slice_unchecked,\n};\nuse std::convert::TryInto;\npub mod instruction;\npub mod state;\nuse instruction::MovieInstruction;\nuse state::MovieAccountState;\nuse borsh::BorshSerialize;\n")),(0,l.kt)("p",null,"\u597d\u7684\u3002\u6211\u4eec\u9700\u8981\u7684\u65f6\u5019\u6211\u4f1a\u89e3\u91ca\u65b0\u7684\u4e1c\u897f\u3002\u8ba9\u6211\u4eec\u56de\u5230\u6211\u4eec\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \uff0c\u7528\u5b9e\u9645\u7684\u903b\u8f91\u586b\u5145\u5b83\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u6253\u5370\u51fa\u6765\u3002"),(0,l.kt)("h3",{id:"-\u8fed\u4ee3\u8d26\u6237"},"\u23e9 \u8fed\u4ee3\u8d26\u6237"),(0,l.kt)("p",null,"\u6211\u4eec ",(0,l.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\u4e2d\u4f20\u5165\u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u4e00\u4e2a\u8d26\u6237\u6570\u7ec4\u3002\u6211\u4eec\u53ef\u4ee5\u904d\u5386\u8fd9\u4e9b\u8d26\u6237\u6765\u83b7\u53d6\u5b83\u4eec\u7684\u6570\u636e\u5e76\u8fdb\u884c\u76f8\u5e94\u64cd\u4f5c\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"next_account_info")," \u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9 - \u5b83\u662f\u4e00\u4e2a\u51fd\u6570\uff0c\u63a5\u53d7\u4e00\u4e2a\u8fed\u4ee3\u5668\u5e76\u5b89\u5168\u5730\u8fd4\u56de\u5217\u8868\u4e2d\u7684\u4e0b\u4e00\u4e2a\u9879\u3002\u6211\u4eec\u53ef\u4ee5\u50cf\u8fd9\u6837\u4f7f\u7528\u5b83\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"// Get Account iterator\nlet account_info_iter = &mut accounts.iter();\n\n// Get accounts\nlet initializer = next_account_info(account_info_iter)?;\nlet pda_account = next_account_info(account_info_iter)?;\nlet system_program = next_account_info(account_info_iter)?;\n")),(0,l.kt)("p",null,"\u633a\u9177\u7684\uff0c\u5bf9\u5427\uff1f\u5982\u679c\u5217\u8868\u4e3a\u7a7a\uff0c\u6211\u4eec\u4f1a\u5f97\u5230\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"ProgramError::NotEnoughAccountKeys")," \u9519\u8bef\u3002\u5982\u679c\u6211\u4eec\u5c1d\u8bd5\u8bbf\u95ee\u4e00\u4e2a\u4e0d\u5b58\u5728\u7684\u8d26\u6237\uff0c\u6211\u4eec\u4f1a\u5f97\u5230\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"ProgramError::MissingRequiredSignature")," \u9519\u8bef\u3002"),(0,l.kt)("h3",{id:"-\u5bfc\u51fapda\u5730\u5740"},"\ud83e\udd5a \u5bfc\u51faPDA\u5730\u5740"),(0,l.kt)("p",null,"\u6211\u4eec\u6240\u9700\u8981\u505a\u7684\u5c31\u662f\u4e00\u884c\u4ee3\u7801\uff08\u7ee7\u7eed\u6dfb\u52a0\u5230 add_movie_review \uff09\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"let (pda, bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes().as_ref(),], program_id);\n")),(0,l.kt)("p",null,"\u8fd9\u91cc\u7684\u79cd\u5b50\u6709\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"\u521d\u59cb\u5316\u5668\u7684\u516c\u94a5"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"\u7535\u5f71\u7684\u6807\u9898")))),(0,l.kt)("h3",{id:"-\u8ba1\u7b97\u7a7a\u95f4\u548c\u79df\u91d1"},"\ud83e\uddee \u8ba1\u7b97\u7a7a\u95f4\u548c\u79df\u91d1"),(0,l.kt)("p",null,"\u6211\u4eec\u4e4b\u524d\u5df2\u7ecf\u8ba8\u8bba\u8fc7\u8fd9\u4e2a\u4e86 :)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"// Calculate account size required\nlet account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());\n\n// Calculate rent required\nlet rent = Rent::get()?;\nlet rent_lamports = rent.minimum_balance(account_len);\n")),(0,l.kt)("p",null,"\u4f60\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\u5e94\u8be5\u53d8\u5f97\u6709\u70b9\u957f\u4e86\u3002\u6211\u4eec\u8fd8\u5269\u4e0b\u4e24\u4e2a\u5c0f\u90e8\u5206 - \u521b\u5efa\u8d26\u6237\u548c\u66f4\u65b0\u6570\u636e\u3002\u7ee7\u7eed\u524d\u8fdb\u5427\uff01"),(0,l.kt)("h3",{id:"-\u521b\u5efa\u8d26\u6237"},"\ud83d\udcdd \u521b\u5efa\u8d26\u6237"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u8fdb\u884c\u4e00\u4e9b\u8de8\u7a0b\u5e8f\u8c03\u7528\u4e86\uff01"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'// Create the account\ninvoke_signed(\n &system_instruction::create_account(\n initializer.key,\n pda_account.key,\n rent_lamports,\n account_len.try_into().unwrap(),\n program_id,\n ),\n &[initializer.clone(), pda_account.clone(), system_program.clone()],\n &[&[initializer.key.as_ref(), title.as_bytes().as_ref(), &[bump_seed]]],\n)?;\n\nmsg!("PDA created: {}", pda);\n')),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"invoke_signed")," \u662f\u521b\u5efa\u8d26\u6237\u7684\u4ea4\u6613\u3002\u6211\u4eec\u4f20\u5165\u4e86 ",(0,l.kt)("inlineCode",{parentName:"p"},"create_account")," \u6307\u4ee4\uff0c\u6211\u4eec\u4f7f\u7528\u7684\u8d26\u6237\u4ee5\u53ca\u7528\u4e8e\u6d3e\u751fPDA\u5730\u5740\u7684\u79cd\u5b50\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u9700\u8981\u505a\u7684\u6700\u540e\u4e00\u4ef6\u4e8b\u662f\u66f4\u65b0\u8d26\u6237\u6570\u636e\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'msg!("unpacking state account");\nlet mut account_data = try_from_slice_unchecked::(&pda_account.data.borrow()).unwrap();\nmsg!("borrowed account data");\n\naccount_data.title = title;\naccount_data.rating = rating;\naccount_data.description = description;\naccount_data.is_initialized = true;\n\nmsg!("serializing account");\naccount_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;\nmsg!("state account serialized");\n')),(0,l.kt)("p",null,"\u6211\u4eec\u6b63\u5728\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"try_from_slice_unchecked")," \u5c06\u539f\u59cb\u5b57\u8282\u8f6c\u6362\u4e3aRust\u7c7b\u578b\u3002\u7136\u540e\u6211\u4eec\u66f4\u65b0\u6570\u636e\u5e76\u5c06\u5176\u5e8f\u5217\u5316\u56de\u539f\u59cb\u5b57\u8282\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u5df2\u7ecf\u51c6\u5907\u597d\u8fdb\u884c\u5347\u7ea7\u5e76\u90e8\u7f72\uff01\uff08\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\u65f6\u95f4\uff09"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6715).Z,width:"1268",height:"1085"})),(0,l.kt)("h3",{id:"-\u8bd5\u4e00\u8bd5"},"\ud83c\udf89 \u8bd5\u4e00\u8bd5"),(0,l.kt)("p",null,"\u4f60\u77e5\u9053\u8be5\u600e\u4e48\u505a\u3002\u590d\u5236\u5730\u5740\u3002\u8bbe\u7f6e\u4e00\u4e2a\u811a\u672c\u6765\u8c03\u7528\u7a0b\u5e8f\uff08\u4f60\u53ef\u4ee5\u4f7f\u7528\u4e0a\u6b21\u4f7f\u7528\u7684\u90a3\u4e2a\uff0c\u65e0\u9700\u66f4\u6539\uff09\u3002\u8fd0\u884c\u5b83\u3002\u5728Solana Explorer\u4e0a\u68c0\u67e5\u8fd9\u4e2a\u65b0\u7684\u8d26\u6237\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u4f60\u9700\u8981\u4e00\u4e2a\u65b0\u7684\u8bbe\u7f6e\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/buildspace/solana-movie-client\ncd solana-movie-client\nnpm install\n")),(0,l.kt)("p",null,"\u66f4\u65b0 ",(0,l.kt)("inlineCode",{parentName:"p"},"programId")," \u4e2d\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"index.ts")," \u4e3a\u60a8\u7a0b\u5e8f\u7684\u5730\u5740\uff0c\u7136\u540e\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"npm run start")," \u3002"),(0,l.kt)("p",null,"\u5728\u7ec8\u7aef\u4e2d\u70b9\u51fb\u6d4f\u89c8\u5668\u94fe\u63a5\u5e76\u5411\u4e0b\u6eda\u52a8\u5230\u7a0b\u5e8f\u65e5\u5fd7\u90e8\u5206\uff0c\u8fd9\u662f\u6211\u5f97\u5230\u7684\u5185\u5bb9\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(5425).Z,width:"1121",height:"932"})),(0,l.kt)("p",null,"\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c\u6211\u4eec\u7684\u7a0b\u5e8f\u901a\u8fc7CPI\u4e0e\u7cfb\u7edf\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\uff0c\u521b\u5efa\u4e86\u4e00\u4e2a\u8d26\u6237\uff08PDA\uff09\uff0c\u5e76\u5c06\u6211\u4eec\u7684\u8bc4\u8bba\u6dfb\u52a0\u5230\u5176\u4e2d\uff01\u5982\u679c\u6211\u81ea\u5df1\u8bf4\u7684\u8bdd\uff0c\u8fd9\u662f\u4e00\u7bc7\u975e\u5e38\u597d\u7684\u8bc4\u8bba\uff1b\uff09"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6430).Z,width:"512",height:"512"})),(0,l.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,l.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u5efa\u7acb\u4e00\u4e9b\u4e1c\u897f\u4e86\u3002"),(0,l.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b\uff0c\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\u9700\u8981\u7528\u6237\u63d0\u4f9b\u59d3\u540d\u548c\u7b80\u77ed\u7559\u8a00\u4f5c\u4e3a\u8f93\u5165",(0,l.kt)("inlineCode",{parentName:"p"},"instruction_data"),"\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u8d26\u6237\u6765\u5c06\u6570\u636e\u5b58\u50a8\u5728\u533a\u5757\u94fe\u4e0a\u3002"),(0,l.kt)("p",null,"\u5229\u7528\u4f60\u5728\u672c\u8bfe\u7a0b\u4e2d\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u5c1d\u8bd5\u91cd\u65b0\u521b\u5efa\u5b8c\u6574\u7684\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\u3002"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\u63d0\u793a\uff1a\n\u9664\u4e86\u63a5\u6536\u4e00\u4e2a\u540d\u79f0\u548c\u4e00\u4e2a\u7b80\u77ed\u7684\u6d88\u606f\u4f5c\u4e3a\u6307\u4ee4\u6570\u636e\u5916\uff0c\u7a0b\u5e8f\u8fd8\u5e94\u8be5\uff1a"),(0,l.kt)("ul",{parentName:"blockquote"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"\u4e3a\u6bcf\u4e2a\u5b66\u751f\u521b\u5efa\u4e00\u4e2a\u72ec\u7acb\u7684\u8d26\u6237"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"\u5c06 ",(0,l.kt)("inlineCode",{parentName:"li"},"is_initialized")," \u5b58\u50a8\u4e3a\u5e03\u5c14\u503c\uff0c\u5728\u6bcf\u4e2a\u8d26\u6237\u4e2d\u5c06 ",(0,l.kt)("inlineCode",{parentName:"li"},"name")," \u5b58\u50a8\u4e3a\u5b57\u7b26\u4e32\uff0c\u5c06 ",(0,l.kt)("inlineCode",{parentName:"li"},"msg")," \u5b58\u50a8\u4e3a\u5b57\u7b26\u4e32"))))),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Solution Code:")),(0,l.kt)("p",null,"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\uff1a\n\u4f60\u53ef\u4ee5\u4f7f\u7528",(0,l.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-student-intros-frontend"},"\u8fd9\u4e2a"),"\u524d\u7aef\u6765\u6d4b\u8bd5\u4f60\u7684\u7a0b\u5e8f\u3002\u8bb0\u5f97\u7528\u4f60\u90e8\u7f72\u7684\u7a0b\u5e8fID\u66ff\u6362\u524d\u7aef\u4ee3\u7801\u4e2d\u7684\u90a3\u4e2a\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u53ef\u4ee5\u7684\u8bdd\uff0c\u5c3d\u91cf\u72ec\u7acb\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff01\u4f46\u5982\u679c\u9047\u5230\u56f0\u96be\uff0c\u53ef\u4ee5\u53c2\u8003",(0,l.kt)("a",{parentName:"p",href:"https://beta.solpg.io/62b11ce4f6273245aca4f5b2"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002"))}d.isMDXComponent=!0},6430:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/773-6232a70282dc42dbde32df8ea03dd5e0.png"},6429:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/call-invoke-6e4d2dc04e410b46cc9ffdb20ce18137.png"},5425:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/call-logo-d23f5c8d2e25aa5b0374c6a0edc51094.png"},1587:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/data-9a339ca3aef431865b60faee61040804.png"},1950:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/invoke-e150fc95c6ce2f5e6ab482041e5b334b.png"},6715:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/movie-review-pt2-build-deploy-7069ae4fecd50a33e2d8c4b1a76fefaa.gif"},5628:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/note-borsh-17856b11ce54cb57a29f6bacca514085.png"},4242:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/pda-3034cea777caf2e37c5e2dfcc2498094.png"},6249:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/type-rent-7183b6cf326d21f6e53bf0ba29989417.png"}}]); \ No newline at end of file diff --git a/assets/js/f9b3936f.92238fb6.js b/assets/js/f9b3936f.92238fb6.js new file mode 100644 index 000000000..4e4dbdb10 --- /dev/null +++ b/assets/js/f9b3936f.92238fb6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[740],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>k});var a=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=a.createContext({}),u=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=u(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,r=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),c=u(n),m=l,k=c["".concat(p,".").concat(m)]||c[m]||d[m]||r;return n?a.createElement(k,i(i({ref:t},s),{},{components:n})):a.createElement(k,i({ref:t},s))}));function k(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=n.length,i=new Array(r);i[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[c]="string"==typeof e?e:l,i[1]=o;for(var u=2;u{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var a=n(7462),l=(n(7294),n(3905));const r={sidebar_position:57,sidebar_label:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",sidebar_class_name:"green"},i="\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",o={unversionedId:"Solana-Co-Learn/module3/native-solana-development/state-management/README",id:"Solana-Co-Learn/module3/native-solana-development/state-management/README",title:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",description:"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e2d\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u6784\u5efa\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u7535\u5f71\uff0c\u6211\u4e0d\u662f\u4f60\u7238\u7238\u3002\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u7c7b\u578b\u7684\u72b6\u6001\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u72b6\u6001\u662f\u6307\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u7a0b\u5e8f\u6570\u636e\u3002",source:"@site/docs/Solana-Co-Learn/module3/native-solana-development/state-management/README.md",sourceDirName:"Solana-Co-Learn/module3/native-solana-development/state-management",slug:"/Solana-Co-Learn/module3/native-solana-development/state-management/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/state-management/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/native-solana-development/state-management/README.md",tags:[],version:"current",sidebarPosition:57,frontMatter:{sidebar_position:57,sidebar_label:"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/"},next:{title:"\u5b89\u5168\u548c\u9a8c\u8bc1",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/"}},p={},u=[{value:"\ud83d\udcdd \u7a0b\u5e8f\u72b6\u6001\u4f5c\u4e3aRust\u6570\u636e\u7c7b\u578b",id:"-\u7a0b\u5e8f\u72b6\u6001\u4f5c\u4e3arust\u6570\u636e\u7c7b\u578b",level:2},{value:"\ud83c\udfe0 \u7a7a\u95f4\u548c\u79df\u91d1",id:"-\u7a7a\u95f4\u548c\u79df\u91d1",level:2},{value:"\ud83d\udcca \u8ba1\u7b97\u79df\u91d1",id:"-\u8ba1\u7b97\u79df\u91d1",level:2},{value:"\ud83d\udcdc \u7a0b\u5e8f\u6d3e\u751f\u5730\u5740",id:"-\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740",level:2},{value:"\ud83d\udeeb \u8de8\u7a0b\u5e8f\u8c03\u7528",id:"-\u8de8\u7a0b\u5e8f\u8c03\u7528",level:2},{value:"\u2702 \u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e",id:"-\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e",level:2},{value:"\ud83d\udcfc \u603b\u7ed3 - \u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77",id:"-\u603b\u7ed3---\u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77",level:2},{value:"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",id:"-\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f",level:2},{value:"\u23e9 \u8fed\u4ee3\u8d26\u6237",id:"-\u8fed\u4ee3\u8d26\u6237",level:3},{value:"\ud83e\udd5a \u5bfc\u51faPDA\u5730\u5740",id:"-\u5bfc\u51fapda\u5730\u5740",level:3},{value:"\ud83e\uddee \u8ba1\u7b97\u7a7a\u95f4\u548c\u79df\u91d1",id:"-\u8ba1\u7b97\u7a7a\u95f4\u548c\u79df\u91d1",level:3},{value:"\ud83d\udcdd \u521b\u5efa\u8d26\u6237",id:"-\u521b\u5efa\u8d26\u6237",level:3},{value:"\ud83c\udf89 \u8bd5\u4e00\u8bd5",id:"-\u8bd5\u4e00\u8bd5",level:3},{value:"\ud83d\udea2 \u8239\u8236\u6311\u6218",id:"-\u8239\u8236\u6311\u6218",level:2}],s={toc:u},c="wrapper";function d(e){let{components:t,...r}=e;return(0,l.kt)(c,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"-\u72b6\u6001\u7ba1\u7406"},"\ud83e\udd20 \u72b6\u6001\u7ba1\u7406"),(0,l.kt)("p",null,"\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c\u4e00\u8282\u4e2d\u4e92\u52a8\u7684\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f\u5417\uff1f\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u6784\u5efa\u5b83\u3002\u968f\u610f\u8bc4\u8bba\u5176\u4ed6\u4e1c\u897f\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u7535\u5f71\uff0c\u6211\u4e0d\u662f\u4f60\u7238\u7238\u3002\u563f\uff01\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u4f4d\u5dde\u957f\u4e86\u5417\uff1f\u4e0d\u4e0d\uff0c\u6211\u4eec\u4e0d\u662f\u5728\u505a\u90a3\u79cd\u7c7b\u578b\u7684\u72b6\u6001\u7ba1\u7406\u3002\u6211\u4eec\u6240\u8bf4\u7684\u72b6\u6001\u662f\u6307\u5b58\u50a8\u5728\u94fe\u4e0a\u7684\u7a0b\u5e8f\u6570\u636e\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u6709\u4e00\u4e2a\u53ef\u9760\u7684\u7a0b\u5e8f\uff0c\u5b83\u63a5\u6536\u6307\u4ee4\u6570\u636e\u5e76\u51c6\u5907\u8fdb\u884c\u5904\u7406\u3002\u8981\u6267\u884c\u8fd9\u4e9b\u6307\u4ee4\uff0c\u6211\u4eec\u9700\u8981\u5b66\u4e60\u66f4\u591a\u5173\u4e8eRust\u7684\u77e5\u8bc6\u3002"),(0,l.kt)("h2",{id:"-\u7a0b\u5e8f\u72b6\u6001\u4f5c\u4e3arust\u6570\u636e\u7c7b\u578b"},"\ud83d\udcdd \u7a0b\u5e8f\u72b6\u6001\u4f5c\u4e3aRust\u6570\u636e\u7c7b\u578b"),(0,l.kt)("p",null,"Solana\u4fdd\u6301\u5176\u901f\u5ea6\u548c\u6548\u7387\u7684\u4e00\u90e8\u5206\u539f\u56e0\u662f\u7a0b\u5e8f\u662f\u65e0\u72b6\u6001\u7684\u3002\u8fd9\u610f\u5473\u7740\u60a8\u65e0\u6cd5\u66f4\u6539\u7a0b\u5e8f\u4e0a\u7684\u6570\u636e - \u6240\u6709\u6570\u636e\u90fd\u5b58\u50a8\u5728\u5916\u90e8\u8d26\u6237\u4e2d\uff0c\u901a\u5e38\u662f\u7531\u7a0b\u5e8f\u62e5\u6709\u7684\u8d26\u6237\u3002\u5927\u591a\u6570\u8fd9\u4e9b\u8d26\u6237\u662fPDA\uff08Program Derived Accounts\uff09 - \u6211\u4eec\u73b0\u5728\u5c06\u67e5\u770b\u5b83\u4eec\u7684\u6570\u636e\u5b58\u50a8\u5143\u7d20\uff0c\u5e76\u7a0d\u540e\u6df1\u5165\u4e86\u89e3\u5176\u4f59\u90e8\u5206\u3002"),(0,l.kt)("p",null,"\u5c31\u50cf\u6211\u4eec\u5c06\u6307\u4ee4\u6570\u636e\u8f6c\u6362\u4e3aRust\u7c7b\u578b\u4e00\u6837\uff0c\u6211\u4eec\u5c06\u628a\u7a0b\u5e8f\u72b6\u6001\u4e5f\u8f6c\u6362\u4e3aRust\u7c7b\u578b\uff0c\u4ee5\u4fbf\u66f4\u5bb9\u6613\u5904\u7406\u3002"),(0,l.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b Solana \u8d26\u6237\u4e2d\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"data")," \u5b57\u6bb5 - \u5b83\u5b58\u50a8\u4e86\u4e00\u4e2a\u539f\u59cb\u5b57\u8282\u6570\u7ec4\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u6765\u8868\u793a\u5b83\u5728 Rust \u7c7b\u578b\u4e2d\u7684\u5f62\u5f0f\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(1587).Z,width:"1398",height:"397"})),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u518d\u6b21\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"borsh macro"),"\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(5628).Z,width:"1388",height:"844"})),(0,l.kt)("p",null,"\u6570\u636e\u5728\u4f20\u8f93\u548c\u5b58\u50a8\u65f6\u4ee5\u539f\u59cb\u5b57\u8282\u7684\u5f62\u5f0f\u8fdb\u884c\uff0c\u4f46\u5728\u6211\u4eec\u5e0c\u671b\u5904\u7406\u6570\u636e\u65f6\uff0c\u4f1a\u5c06\u5176\u8f6c\u6362\u4e3aRust\u7c7b\u578b\u3002\u6709\u9053\u7406\uff0c\u5bf9\u5427\uff1f"),(0,l.kt)("h2",{id:"-\u7a7a\u95f4\u548c\u79df\u91d1"},"\ud83c\udfe0 \u7a7a\u95f4\u548c\u79df\u91d1"),(0,l.kt)("p",null,"\u662f\u7684\uff0cSolana\u4e5f\u6709\u623f\u4e1c\uff1a\u9a8c\u8bc1\u8005\u5c06\u533a\u5757\u94fe\u7684\u72b6\u6001\u5b58\u50a8\u5728\u4ed6\u4eec\u7684\u673a\u5668\u4e0a\u3002"),(0,l.kt)("p",null,"\u79df\u91d1\u4ee5",(0,l.kt)("inlineCode",{parentName:"p"},"Lamports"),"\u652f\u4ed8\uff0c",(0,l.kt)("inlineCode",{parentName:"p"},"Lamport"),"\u662fSOL\u7684\u6700\u5c0f\u5355\u4f4d\uff08",(0,l.kt)("inlineCode",{parentName:"p"},"0.000000001 SOL = 1 Lamport"),"\uff09\uff0c\u6839\u636e\u8d26\u6237\u5360\u7528\u7684\u7a7a\u95f4\u5927\u5c0f\u8ba1\u7b97\u3002\u4ee5\u4e0b\u662f\u5e38\u89c1\u7c7b\u578b\u5360\u7528\u7684\u5b57\u8282\u7a7a\u95f4\u7684\u8868\u683c\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6249).Z,width:"800",height:"819"})),(0,l.kt)("p",null,"\u4ed8\u623f\u79df\u6709\u4e24\u79cd\u65b9\u5f0f\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"\u6309\u6bcf\u4e2a\u65f6\u671f\u652f\u4ed8\u79df\u91d1\u3002\u8fd9\u5c31\u50cf\u6bcf\u6708\u652f\u4ed8\u79df\u91d1\u4e00\u6837 - \u53ea\u8981\u4f60\u7ee7\u7eed\u652f\u4ed8\uff0c\u4f60\u5c31\u53ef\u4ee5\u7ee7\u7eed\u5c45\u4f4f\u3002\u5982\u679c\u8d26\u6237\u6ca1\u6709\u8db3\u591f\u7684SOL\uff0c\u5b83\u5c06\u88ab\u91cd\u7f6e\uff0c\u6570\u636e\u5c06\u4e22\u5931\u3002"),(0,l.kt)("li",{parentName:"ul"},"\u4fdd\u6301\u7b49\u4e8e2\u5e74\u79df\u91d1\u7684\u6700\u4f4e\u4f59\u989d\u3002\u8fd9\u6837\u8d26\u6237\u5c31\u514d\u9664\u4e86\u79df\u91d1\u3002\u8fd9\u91cc\u7684\u903b\u8f91\u662f\u786c\u4ef6\u6210\u672c\u6bcf2\u5e74\u4e0b\u964d50%\uff0c\u6240\u4ee5\u5982\u679c\u4f60\u6709\u8db3\u591f\u7684SOL\u652f\u4ed82\u5e74\u7684\u79df\u91d1\uff0c\u4f60\u5c31\u6c38\u8fdc\u4e0d\u7528\u62c5\u5fc3\u4e86\uff01")),(0,l.kt)("p",null,"\u73b0\u5728\u8981\u6c42\u514d\u79df\u91d1\uff0c\u6240\u4ee5\u53ea\u6709\u9009\u9879#2\u3002\u8fd9\u79cd\u65b9\u6cd5\u7684\u6700\u5927\u4f18\u70b9\u662f\uff0c\u5f53\u60a8\u4e0d\u518d\u9700\u8981\u5b58\u50a8\u6570\u636e\u65f6\uff0c\u53ef\u4ee5\u9500\u6bc1\u8d26\u6237\u5e76\u53d6\u56de\u60a8\u7684SOL\uff01\u533a\u5757\u94fe\u4e0a\u7684\u514d\u8d39\u5b58\u50a8\uff08\u51cf\u53bb\u4ea4\u6613\u8d39\u7528\uff09\ud83e\udd73"),(0,l.kt)("p",null,"\u4e3a\u4ec0\u4e48\u8981\u5728\u533a\u5757\u94fe\u4e0a\u79df\u8d41\u5462\uff1f\u55ef\uff0c\u8fd9\u662f\u4e00\u79cd\u9632\u6b62\u4eba\u4eec\u521b\u5efa\u5927\u91cf\u8d26\u6237\u5374\u4ece\u672a\u4f7f\u7528\u7684\u65b9\u5f0f\u3002\u8fd9\u5c06\u6d6a\u8d39\u7a7a\u95f4\u548c\u9a8c\u8bc1\u8005\u8d44\u6e90\u3002\u8fd9\u4e2a\u7cfb\u7edf\u662fSolana\u4e0a\u5b58\u50a8\u5982\u6b64\u5ec9\u4ef7\u7684\u539f\u56e0\u4e4b\u4e00\u2014\u2014\u4e0e\u4ee5\u592a\u574a\u4e0d\u540c\uff0c\u6211\u7684\u611a\u8822\u7684Hello World NFT\u6536\u85cf\u5c06\u88ab\u6240\u6709\u9a8c\u8bc1\u8005\u6c38\u4e45\u5b58\u50a8\u3002"),(0,l.kt)("p",null,"\u4f60\u53ef\u4ee5\u5728",(0,l.kt)("a",{parentName:"p",href:"https://docs.solana.com/implemented-proposals/rent"},"\u8fd9\u91cc"),"\u9605\u8bfb\u66f4\u591a\u76f8\u5173\u5185\u5bb9\uff0c\u6211\u89c9\u5f97\u633a\u9177\u7684\uff01"),(0,l.kt)("h2",{id:"-\u8ba1\u7b97\u79df\u91d1"},"\ud83d\udcca \u8ba1\u7b97\u79df\u91d1"),(0,l.kt)("p",null,"\u8ba1\u7b97\u79df\u91d1\u5f88\u7b80\u5355 - \u6709\u4e00\u4e2a\u5f88\u6709\u7528\u7684\u529f\u80fd\u53ef\u4ee5\u5e2e\u52a9\u4f60\u3002\u68d8\u624b\u7684\u90e8\u5206\u662f\u5f04\u6e05\u695a\u4f60\u9700\u8981\u591a\u5c11\u7a7a\u95f4\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u6211\u4eec\u7684\u8d85\u7ea7\u7b14\u8bb0\u7a0b\u5e8f\u7684\u6837\u5b50\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"// Calculate account size required for struct NoteState\n// 4 bytes to store the size of the subsequent dynamic data (string)\n// 8 bytes to store the 64 bit interger for the id\nlet account_len: usize = (4 + title.len()) + (4 + body.len()) + 8;\n\n// Calculate rent required\nlet rent = Rent::get()?;\nlet rent_lamports = rent.minimum_balance(account_len);\n")),(0,l.kt)("p",null,"\u6211\u4eec\u9996\u5148\u8981\u505a\u7684\u662f\u8ba1\u7b97\u6211\u4eec\u5b58\u50a8\u7684\u6570\u636e\u7684\u603b\u957f\u5ea6\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u548c8\u4e2a\u5b57\u8282\u7684id\u76f8\u52a0\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\u3002"),(0,l.kt)("p",null,"\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c ",(0,l.kt)("inlineCode",{parentName:"p"},"title")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"body")," \u662f\u52a8\u6001\u6570\u636e\u7c7b\u578b\uff08\u5b57\u7b26\u4e32\uff09-\u5b83\u4eec\u53ef\u4ee5\u662f\u4efb\u610f\u957f\u5ea6\u3002\u6211\u4eec\u4f7f\u7528\u524d4\u4e2a\u5b57\u8282\u6765\u5b58\u50a8\u6bcf\u4e2a\u9879\u76ee\u7684\u957f\u5ea6\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u6bcf\u4e2a\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u52a0\u4e0a4\u3002"),(0,l.kt)("p",null,"\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"Rent::get()")," \u51fd\u6570\u6765\u83b7\u53d6\u8d26\u6237\u7684\u79df\u91d1\u3002\u8f7b\u677e\u6109\u5feb\uff01"),(0,l.kt)("h2",{id:"-\u7a0b\u5e8f\u6d3e\u751f\u5730\u5740"},"\ud83d\udcdc \u7a0b\u5e8f\u6d3e\u751f\u5730\u5740"),(0,l.kt)("p",null,"\u6211\u4eec\u5df2\u7ecf\u4ece\u6307\u4ee4\u4e2d\u83b7\u53d6\u4e86\u6211\u4eec\u7684\u6570\u636e\uff0c\u6211\u4eec\u5df2\u7ecf\u8ba1\u7b97\u51fa\u6211\u4eec\u9700\u8981\u652f\u4ed8\u591a\u5c11\u79df\u91d1\uff0c\u73b0\u5728\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u8d26\u6237\u6765\u5b58\u653e\u5b83\u3002\u55e8\uff0cPDAs\uff01\u8fd8\u8bb0\u5f97\u524d\u7aef\u7684\u9e21\u548c\u86cb\u95ee\u9898\u5417\uff1f\u8fd9\u91cc\u4e5f\u662f\u4e00\u6837\u7684\uff01\u6211\u4eec\u5c06\u4ece\u7a0b\u5e8fID\u548c\u4e00\u7ec4\u79cd\u5b50\u4e2d\u63a8\u5bfc\u51fa\u8d26\u6237\u7684\u5730\u5740\u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(4242).Z,width:"1500",height:"285"})),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u672a\u6765\u6df1\u5165\u63a2\u8ba8PDA\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u4f46\u73b0\u5728\u4f60\u53ea\u9700\u8981\u77e5\u9053 ",(0,l.kt)("inlineCode",{parentName:"p"},"find_program_address")," \u529f\u80fd\uff0c\u5e76\u4e14\u53ea\u6709 ",(0,l.kt)("inlineCode",{parentName:"p"},"program_id")," \u4e2d\u7684\u7a0b\u5e8f\u53ef\u4ee5\u4e3aPDA\u7b7e\u540d\u3002\u5c31\u50cf\u5b89\u5168\u5b58\u50a8\u4e00\u6837\uff0c\u4e0d\u9700\u8981\u5bc6\u7801\u3002"),(0,l.kt)("h2",{id:"-\u8de8\u7a0b\u5e8f\u8c03\u7528"},"\ud83d\udeeb \u8de8\u7a0b\u5e8f\u8c03\u7528"),(0,l.kt)("p",null,"\u6700\u540e\u4e00\u6b65\u662f\u521d\u59cb\u5316PDA\uff08\u6211\u4eec\u53ea\u5728\u6700\u540e\u4e00\u6b65\u4e2d\u627e\u5230\u4e86\u5730\u5740\uff09\u3002\u6211\u4eec\u5c06\u4f7f\u7528\u8de8\u7a0b\u5e8f\u8c03\u7528\uff08CPI\uff09\u6765\u5b8c\u6210\u6b64\u64cd\u4f5c\u3002\u6b63\u5982\u5176\u540d\u79f0\u6240\u793a\uff0c\u6211\u4eec\u5c06\u5728\u6211\u4eec\u7684\u7a0b\u5e8f\u4e2d\u4e0eSolana\u7f51\u7edc\u4e0a\u7684\u53e6\u4e00\u4e2a\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\u3002"),(0,l.kt)("p",null,"CPI\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke")," \u6216 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke_signed")," \u8fdb\u884c"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(1950).Z,width:"782",height:"770"})),(0,l.kt)("p",null,"\u5f53\u60a8\u4e0d\u9700\u8981\u7b7e\u7f72\u4ea4\u6613\u65f6\uff0c\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke")," \u3002\u5f53\u60a8\u9700\u8981\u7b7e\u7f72\u4ea4\u6613\u65f6\uff0c\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke_signed")," \u3002\u5728\u6211\u4eec\u7684\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u662f\u552f\u4e00\u53ef\u4ee5\u4e3aPDA\u7b7e\u7f72\u7684\u4eba\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"invoke_signed")," \u3002"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6429).Z,width:"1500",height:"514"})),(0,l.kt)("p",null,"\u8fd9\u662f\u5b83\u7684\u6837\u5b50\u3002\u4f60\u53ef\u80fd\u4f1a\u60f3\uff1a\u201c\u8fd9\u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f\u201d - \u522b\u62c5\u5fc3\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u4f1a\u7ec3\u4e60\uff0c\u4e00\u5207\u90fd\u4f1a\u660e\u767d\u7684 :)"),(0,l.kt)("p",null,"\u6211\u4eec\u5728\u8fd9\u91cc\u6240\u505a\u7684\u53ea\u662f\u4f7f\u7528Rust\u5728\u7a0b\u5e8f\u4e2d\u521b\u5efa\u4e00\u4e2a\u4ea4\u6613\uff0c\u7c7b\u4f3c\u4e8e\u6211\u4eec\u5728\u5ba2\u6237\u7aef\u4f7f\u7528TypeScript\u65f6\u6240\u505a\u7684\u3002\u6211\u4eec\u5728\u8fd9\u91cc\u6709\u4e00\u4e2a\u7279\u6b8a\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"signers_seeds")," \u4e1c\u897f\uff0c\u8fd9\u5bf9\u4e8ePDA\u662f\u5fc5\u9700\u7684\u3002"),(0,l.kt)("h2",{id:"-\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e"},"\u2702 \u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e"),(0,l.kt)("p",null,"\u4e00\u65e6\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u65b0\u8d26\u6237\uff0c\u6211\u4eec\u9700\u8981\u8bbf\u95ee\u5e76\u66f4\u65b0\u8be5\u8d26\u6237\u7684\u6570\u636e\u5b57\u6bb5\uff08\u76ee\u524d\u4e3a\u7a7a\u5b57\u8282\uff09\u3002\u8fd9\u610f\u5473\u7740\u5c06\u5176\u5b57\u8282\u6570\u7ec4\u53cd\u5e8f\u5217\u5316\u4e3a\u6211\u4eec\u521b\u5efa\u7684\u7c7b\u578b\u7684\u5b9e\u4f8b\uff0c\u66f4\u65b0\u8be5\u5b9e\u4f8b\u4e0a\u7684\u5b57\u6bb5\uff0c\u7136\u540e\u5c06\u8be5\u5b9e\u4f8b\u91cd\u65b0\u5e8f\u5217\u5316\u4e3a\u5b57\u8282\u6570\u7ec4\u3002"),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u53cd\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e")),(0,l.kt)("p",null,"\u66f4\u65b0\u5e10\u6237\u6570\u636e\u7684\u7b2c\u4e00\u6b65\u662f\u5c06\u5176\u6570\u636e\u5b57\u8282\u6570\u7ec4\u53cd\u5e8f\u5217\u5316\u4e3aRust\u7c7b\u578b\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u9996\u5148\u501f\u7528\u5e10\u6237\u4e0a\u7684\u6570\u636e\u5b57\u6bb5\u6765\u5b9e\u73b0\u6b64\u64cd\u4f5c\u3002\u8fd9\u6837\u53ef\u4ee5\u5728\u4e0d\u83b7\u53d6\u6240\u6709\u6743\u7684\u60c5\u51b5\u4e0b\u8bbf\u95ee\u6570\u636e\u3002"),(0,l.kt)("p",null,"\u7136\u540e\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"try_from_slice_unchecked"),"\u51fd\u6570\u6765\u53cd\u5e8f\u5217\u5316\u501f\u7528\u8d26\u6237\u7684\u6570\u636e\u5b57\u6bb5\uff0c\u4f7f\u7528\u60a8\u521b\u5efa\u7684\u7c7b\u578b\u6765\u8868\u793a\u6570\u636e\u7684\u683c\u5f0f\u3002\u8fd9\u5c06\u4e3a\u60a8\u63d0\u4f9b\u4e00\u4e2aRust\u7c7b\u578b\u7684\u5b9e\u4f8b\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u4f7f\u7528\u70b9\u7b26\u53f7\u8f7b\u677e\u66f4\u65b0\u5b57\u6bb5\u3002\u5982\u679c\u6211\u4eec\u4f7f\u7528\u6211\u4eec\u4e00\u76f4\u5728\u4f7f\u7528\u7684\u7b14\u8bb0\u5e94\u7528\u7a0b\u5e8f\u793a\u4f8b\u6765\u5b8c\u6210\u8fd9\u4e2a\u64cd\u4f5c\uff0c\u5b83\u4f1a\u662f\u8fd9\u6837\u7684\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"let mut account_data = try_from_slice_unchecked::(note_pda_account.data.borrow()).unwrap();\n\naccount_data.title = title;\naccount_data.body = body;\naccount_data.id = id;\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"\u5e8f\u5217\u5316\u8d26\u6237\u6570\u636e")),(0,l.kt)("p",null,"\u4e00\u65e6Rust\u5b9e\u4f8b\u66f4\u65b0\u4e86\u8d26\u6237\u6570\u636e\u7684\u9002\u5f53\u503c\uff0c\u60a8\u53ef\u4ee5\u5c06\u6570\u636e\u201c\u4fdd\u5b58\u201d\u5728\u8d26\u6237\u4e0a\u3002"),(0,l.kt)("p",null,"\u8fd9\u662f\u901a\u8fc7\u5bf9\u60a8\u521b\u5efa\u7684Rust\u7c7b\u578b\u5b9e\u4f8b\u4f7f\u7528",(0,l.kt)("inlineCode",{parentName:"p"},"serialize"),"\u51fd\u6570\u6765\u5b8c\u6210\u7684\u3002\u60a8\u9700\u8981\u4f20\u5165\u5bf9\u8d26\u6237\u6570\u636e\u7684\u53ef\u53d8\u5f15\u7528\u3002\u8fd9\u91cc\u7684\u8bed\u6cd5\u6709\u4e9b\u68d8\u624b\uff0c\u6240\u4ee5\u5982\u679c\u60a8\u4e0d\u5b8c\u5168\u7406\u89e3\u4e5f\u4e0d\u7528\u62c5\u5fc3\u3002\u501f\u7528\u548c\u5f15\u7528\u662fRust\u4e2d\u6700\u96be\u7684\u6982\u5ff5\u4e4b\u4e00\u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"account_data.serialize(&mut &mut note_pda_account.data.borrow_mut()[..])?;\n")),(0,l.kt)("p",null,"\u4e0a\u9762\u7684\u793a\u4f8b\u5c06 ",(0,l.kt)("inlineCode",{parentName:"p"},"account_data")," \u5bf9\u8c61\u8f6c\u6362\u4e3a\u5b57\u8282\u6570\u7ec4\uff0c\u5e76\u5c06\u5176\u8bbe\u7f6e\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},"note_pda_account")," \u4e0a\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"data")," \u5c5e\u6027\u3002\u8fd9\u6709\u6548\u5730\u5c06\u66f4\u65b0\u540e\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"account_data")," \u53d8\u91cf\u4fdd\u5b58\u5230\u65b0\u8d26\u6237\u7684\u6570\u636e\u5b57\u6bb5\u4e2d\u3002\u73b0\u5728\uff0c\u5f53\u7528\u6237\u83b7\u53d6 ",(0,l.kt)("inlineCode",{parentName:"p"},"note_pda_account")," \u5e76\u53cd\u5e8f\u5217\u5316\u6570\u636e\u65f6\uff0c\u5b83\u5c06\u663e\u793a\u6211\u4eec\u5e8f\u5217\u5316\u5230\u8d26\u6237\u4e2d\u7684\u66f4\u65b0\u6570\u636e\u3002"),(0,l.kt)("h2",{id:"-\u603b\u7ed3---\u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77"},"\ud83d\udcfc \u603b\u7ed3 - \u628a\u6240\u6709\u7684\u4e1c\u897f\u653e\u5728\u4e00\u8d77"),(0,l.kt)("p",null,"\u90a3\u771f\u662f\u592a\u591a\u4e86\u3002\u6211\u5f97\u4f11\u606f\u4e00\u4e0b\uff0c\u7136\u540e\u56de\u6765\u7ee7\u7eed\u5199\u5b8c\u8fd9\u4e2a\u3002\u8ba9\u6211\u4eec\u56de\u987e\u4e00\u4e0b\u6574\u4e2a\u8fc7\u7a0b\u7684\u59cb\u7ec8\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"\u7528\u6237\u901a\u8fc7\u53d1\u9001\u4e00\u4e2a\u5305\u542b\u6807\u9898\u3001\u6b63\u6587\u548c\u5b57\u8282ID\u7684\u4ea4\u6613\u6765\u521b\u5efa\u4e00\u4e2a\u7b14\u8bb0"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u7684\u7a0b\u5e8f\u63a5\u6536\u6307\u4ee4\uff0c\u63d0\u53d6\u6570\u636e\u5e76\u5c06\u5176\u683c\u5f0f\u5316\u4e3aRust\u7c7b\u578b"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:3},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u4f7f\u7528Rust\u7c7b\u578b\u6765\u8ba1\u7b97\u6211\u4eec\u7684\u8d26\u6237\u9700\u8981\u591a\u5c11\u7a7a\u95f4+\u6211\u4eec\u9700\u8981\u652f\u4ed8\u591a\u5c11\u79df\u91d1"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:4},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u4ece\u7a0b\u5e8fID\u548c\u4e00\u7ec4\u79cd\u5b50\u4e2d\u63a8\u5bfc\u51fa\u8d26\u6237\u7684\u5730\u5740"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:5},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u4f7f\u7528CPI\u521b\u5efa\u4e00\u4e2a\u7a7a\u767d\u6570\u636e\u7684\u8d26\u6237"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:6},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u5c06\u8d26\u6237\u6570\u636e\u53cd\u5e8f\u5217\u5316\u4e3aRust\u7c7b\u578b"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:7},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u4f7f\u7528\u6307\u4ee4\u4e2d\u7684\u6570\u636e\u6765\u66f4\u65b0Rust\u7c7b\u578b\u7684\u8d26\u6237\u6570\u636e"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:8},(0,l.kt)("li",{parentName:"ol"},"\u6211\u4eec\u5c06Rust\u7c7b\u578b\u5e8f\u5217\u5316\u4e3a\u539f\u59cb\u5b57\u8282\uff0c\u5e76\u5c06\u5176\u4fdd\u5b58\u5230\u8d26\u6237\u4e2d")))),(0,l.kt)("p",null,"\u8fd9\u5c31\u662f\u5168\u90e8\u4e86\uff0c\u670b\u53cb\u3002\u4f60\u73b0\u5728\u77e5\u9053\u5982\u4f55\u5411Solana\u4e0a\u7684\u8d26\u6237\u5199\u5165\u6570\u636e\u4e86\u3002\u6211\u5728\u5c16\u53eb\uff0c\u56e0\u4e3a\u8fd9\u592a\u91cd\u8981\u4e86\u3002\u7ed9\u4f60\u4e00\u4e2a\u5927\u5927\u7684\u80dc\u5229\uff0c\u62ff\u53bb\u5427\uff0c\u4f60\u503c\u5f97\u62e5\u6709\u5b83\uff1a"),(0,l.kt)("h2",{id:"-\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"},"\ud83c\udfa5 \u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"),(0,l.kt)("p",null,"\u5b8c\u6210\u5de5\u4f5c\u7684\u65f6\u95f4\u5230\u4e86\u3002\u6211\u4eec\u7684\u53f2\u8bd7\u7ea7\u7535\u5f71\u8bc4\u8bba\u5c06\u4e0d\u518d\u88ab\u8bb0\u5f55\u5728\u63a7\u5236\u53f0\u4e0a\uff0c\u800c\u662f\u5c06\u5b83\u4eec\u5b58\u50a8\u5728\u533a\u5757\u94fe\u4e0a\uff01"),(0,l.kt)("p",null,"\u6211\u4eec\u5c06\u4f7f\u7528\u4e0e\u4e4b\u524d\u76f8\u540c\u7684\u7a0b\u5e8f\uff0c\u60a8\u53ef\u4ee5",(0,l.kt)("a",{parentName:"p",href:"https://beta.solpg.io/6295b25b0e6ab1eb92d947f7"},"\u4ece\u5934\u5f00\u59cb\u8bbe\u7f6e"),"\u5b83\uff0c\u6216\u8005\u4f7f\u7528\u4e0a\u4e00\u8282\u7684\u90a3\u4e2a\u3002"),(0,l.kt)("h1",{id:"-\u8d26\u6237\u6570\u636e\u7684\u4ee3\u8868"},"\ud83d\udcdd \u8d26\u6237\u6570\u636e\u7684\u4ee3\u8868"),(0,l.kt)("p",null,"\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u65b0\u7684Rust\u7c7b\u578b\u6765\u8868\u793a\u6211\u4eec\u5b58\u50a8\u7684\u6570\u636e\u3002\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a ",(0,l.kt)("inlineCode",{parentName:"p"},"state.rs")," \u7684\u65b0\u6587\u4ef6\uff0c\u5e76\u5728\u5176\u4e2d\u6dfb\u52a0 ",(0,l.kt)("inlineCode",{parentName:"p"},"MovieAccountState")," \u3002"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"use borsh::{BorshSerialize, BorshDeserialize};\n\n#[derive(BorshSerialize, BorshDeserialize)]\npub struct MovieAccountState {\n pub is_initialized: bool,\n pub rating: u8,\n pub title: String,\n pub description: String,\n}\n")),(0,l.kt)("p",null,"\u6211\u4eec\u8fd9\u91cc\u6709 ",(0,l.kt)("inlineCode",{parentName:"p"},"BorshSerialize")," \u548c ",(0,l.kt)("inlineCode",{parentName:"p"},"BorshDeserialize")," \u4e24\u8005\u90fd\u6709 :)"),(0,l.kt)("p",null,"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u9700\u8981\u66f4\u65b0 ",(0,l.kt)("inlineCode",{parentName:"p"},"lib.rs")," \u4ee5\u5c06\u6211\u4eec\u6240\u9700\u7684\u6240\u6709\u5185\u5bb9\u5f15\u5165\u8303\u56f4\u3002\u5c06\u6587\u4ef6\u9876\u90e8\u66f4\u65b0\u4e3a\u4ee5\u4e0b\u5185\u5bb9\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"use solana_program::{\n entrypoint,\n entrypoint::ProgramResult,\n pubkey::Pubkey,\n msg,\n account_info::{next_account_info, AccountInfo},\n system_instruction,\n sysvar::{rent::Rent, Sysvar},\n program::{invoke_signed},\n borsh::try_from_slice_unchecked,\n};\nuse std::convert::TryInto;\npub mod instruction;\npub mod state;\nuse instruction::MovieInstruction;\nuse state::MovieAccountState;\nuse borsh::BorshSerialize;\n")),(0,l.kt)("p",null,"\u597d\u7684\u3002\u6211\u4eec\u9700\u8981\u7684\u65f6\u5019\u6211\u4f1a\u89e3\u91ca\u65b0\u7684\u4e1c\u897f\u3002\u8ba9\u6211\u4eec\u56de\u5230\u6211\u4eec\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \uff0c\u7528\u5b9e\u9645\u7684\u903b\u8f91\u586b\u5145\u5b83\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u6253\u5370\u51fa\u6765\u3002"),(0,l.kt)("h3",{id:"-\u8fed\u4ee3\u8d26\u6237"},"\u23e9 \u8fed\u4ee3\u8d26\u6237"),(0,l.kt)("p",null,"\u6211\u4eec ",(0,l.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\u4e2d\u4f20\u5165\u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u4e00\u4e2a\u8d26\u6237\u6570\u7ec4\u3002\u6211\u4eec\u53ef\u4ee5\u904d\u5386\u8fd9\u4e9b\u8d26\u6237\u6765\u83b7\u53d6\u5b83\u4eec\u7684\u6570\u636e\u5e76\u8fdb\u884c\u76f8\u5e94\u64cd\u4f5c\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"next_account_info")," \u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9 - \u5b83\u662f\u4e00\u4e2a\u51fd\u6570\uff0c\u63a5\u53d7\u4e00\u4e2a\u8fed\u4ee3\u5668\u5e76\u5b89\u5168\u5730\u8fd4\u56de\u5217\u8868\u4e2d\u7684\u4e0b\u4e00\u4e2a\u9879\u3002\u6211\u4eec\u53ef\u4ee5\u50cf\u8fd9\u6837\u4f7f\u7528\u5b83\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"// Get Account iterator\nlet account_info_iter = &mut accounts.iter();\n\n// Get accounts\nlet initializer = next_account_info(account_info_iter)?;\nlet pda_account = next_account_info(account_info_iter)?;\nlet system_program = next_account_info(account_info_iter)?;\n")),(0,l.kt)("p",null,"\u633a\u9177\u7684\uff0c\u5bf9\u5427\uff1f\u5982\u679c\u5217\u8868\u4e3a\u7a7a\uff0c\u6211\u4eec\u4f1a\u5f97\u5230\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"ProgramError::NotEnoughAccountKeys")," \u9519\u8bef\u3002\u5982\u679c\u6211\u4eec\u5c1d\u8bd5\u8bbf\u95ee\u4e00\u4e2a\u4e0d\u5b58\u5728\u7684\u8d26\u6237\uff0c\u6211\u4eec\u4f1a\u5f97\u5230\u4e00\u4e2a ",(0,l.kt)("inlineCode",{parentName:"p"},"ProgramError::MissingRequiredSignature")," \u9519\u8bef\u3002"),(0,l.kt)("h3",{id:"-\u5bfc\u51fapda\u5730\u5740"},"\ud83e\udd5a \u5bfc\u51faPDA\u5730\u5740"),(0,l.kt)("p",null,"\u6211\u4eec\u6240\u9700\u8981\u505a\u7684\u5c31\u662f\u4e00\u884c\u4ee3\u7801\uff08\u7ee7\u7eed\u6dfb\u52a0\u5230 add_movie_review \uff09\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"let (pda, bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes().as_ref(),], program_id);\n")),(0,l.kt)("p",null,"\u8fd9\u91cc\u7684\u79cd\u5b50\u6709\uff1a"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"\u521d\u59cb\u5316\u5668\u7684\u516c\u94a5"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"\u7535\u5f71\u7684\u6807\u9898")))),(0,l.kt)("h3",{id:"-\u8ba1\u7b97\u7a7a\u95f4\u548c\u79df\u91d1"},"\ud83e\uddee \u8ba1\u7b97\u7a7a\u95f4\u548c\u79df\u91d1"),(0,l.kt)("p",null,"\u6211\u4eec\u4e4b\u524d\u5df2\u7ecf\u8ba8\u8bba\u8fc7\u8fd9\u4e2a\u4e86 :)"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"// Calculate account size required\nlet account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());\n\n// Calculate rent required\nlet rent = Rent::get()?;\nlet rent_lamports = rent.minimum_balance(account_len);\n")),(0,l.kt)("p",null,"\u4f60\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"add_movie_review")," \u51fd\u6570\u5e94\u8be5\u53d8\u5f97\u6709\u70b9\u957f\u4e86\u3002\u6211\u4eec\u8fd8\u5269\u4e0b\u4e24\u4e2a\u5c0f\u90e8\u5206 - \u521b\u5efa\u8d26\u6237\u548c\u66f4\u65b0\u6570\u636e\u3002\u7ee7\u7eed\u524d\u8fdb\u5427\uff01"),(0,l.kt)("h3",{id:"-\u521b\u5efa\u8d26\u6237"},"\ud83d\udcdd \u521b\u5efa\u8d26\u6237"),(0,l.kt)("p",null,"\u662f\u65f6\u5019\u8fdb\u884c\u4e00\u4e9b\u8de8\u7a0b\u5e8f\u8c03\u7528\u4e86\uff01"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'// Create the account\ninvoke_signed(\n &system_instruction::create_account(\n initializer.key,\n pda_account.key,\n rent_lamports,\n account_len.try_into().unwrap(),\n program_id,\n ),\n &[initializer.clone(), pda_account.clone(), system_program.clone()],\n &[&[initializer.key.as_ref(), title.as_bytes().as_ref(), &[bump_seed]]],\n)?;\n\nmsg!("PDA created: {}", pda);\n')),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"invoke_signed")," \u662f\u521b\u5efa\u8d26\u6237\u7684\u4ea4\u6613\u3002\u6211\u4eec\u4f20\u5165\u4e86 ",(0,l.kt)("inlineCode",{parentName:"p"},"create_account")," \u6307\u4ee4\uff0c\u6211\u4eec\u4f7f\u7528\u7684\u8d26\u6237\u4ee5\u53ca\u7528\u4e8e\u6d3e\u751fPDA\u5730\u5740\u7684\u79cd\u5b50\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u9700\u8981\u505a\u7684\u6700\u540e\u4e00\u4ef6\u4e8b\u662f\u66f4\u65b0\u8d26\u6237\u6570\u636e\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'msg!("unpacking state account");\nlet mut account_data = try_from_slice_unchecked::(&pda_account.data.borrow()).unwrap();\nmsg!("borrowed account data");\n\naccount_data.title = title;\naccount_data.rating = rating;\naccount_data.description = description;\naccount_data.is_initialized = true;\n\nmsg!("serializing account");\naccount_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;\nmsg!("state account serialized");\n')),(0,l.kt)("p",null,"\u6211\u4eec\u6b63\u5728\u4f7f\u7528 ",(0,l.kt)("inlineCode",{parentName:"p"},"try_from_slice_unchecked")," \u5c06\u539f\u59cb\u5b57\u8282\u8f6c\u6362\u4e3aRust\u7c7b\u578b\u3002\u7136\u540e\u6211\u4eec\u66f4\u65b0\u6570\u636e\u5e76\u5c06\u5176\u5e8f\u5217\u5316\u56de\u539f\u59cb\u5b57\u8282\u3002"),(0,l.kt)("p",null,"\u6211\u4eec\u5df2\u7ecf\u51c6\u5907\u597d\u8fdb\u884c\u5347\u7ea7\u5e76\u90e8\u7f72\uff01\uff08\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\u65f6\u95f4\uff09"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6715).Z,width:"1268",height:"1085"})),(0,l.kt)("h3",{id:"-\u8bd5\u4e00\u8bd5"},"\ud83c\udf89 \u8bd5\u4e00\u8bd5"),(0,l.kt)("p",null,"\u4f60\u77e5\u9053\u8be5\u600e\u4e48\u505a\u3002\u590d\u5236\u5730\u5740\u3002\u8bbe\u7f6e\u4e00\u4e2a\u811a\u672c\u6765\u8c03\u7528\u7a0b\u5e8f\uff08\u4f60\u53ef\u4ee5\u4f7f\u7528\u4e0a\u6b21\u4f7f\u7528\u7684\u90a3\u4e2a\uff0c\u65e0\u9700\u66f4\u6539\uff09\u3002\u8fd0\u884c\u5b83\u3002\u5728Solana Explorer\u4e0a\u68c0\u67e5\u8fd9\u4e2a\u65b0\u7684\u8d26\u6237\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u4f60\u9700\u8981\u4e00\u4e2a\u65b0\u7684\u8bbe\u7f6e\uff1a"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"git clone https://github.com/buildspace/solana-movie-client\ncd solana-movie-client\nnpm install\n")),(0,l.kt)("p",null,"\u66f4\u65b0 ",(0,l.kt)("inlineCode",{parentName:"p"},"programId")," \u4e2d\u7684 ",(0,l.kt)("inlineCode",{parentName:"p"},"index.ts")," \u4e3a\u60a8\u7a0b\u5e8f\u7684\u5730\u5740\uff0c\u7136\u540e\u8fd0\u884c ",(0,l.kt)("inlineCode",{parentName:"p"},"npm run start")," \u3002"),(0,l.kt)("p",null,"\u5728\u7ec8\u7aef\u4e2d\u70b9\u51fb\u6d4f\u89c8\u5668\u94fe\u63a5\u5e76\u5411\u4e0b\u6eda\u52a8\u5230\u7a0b\u5e8f\u65e5\u5fd7\u90e8\u5206\uff0c\u8fd9\u662f\u6211\u5f97\u5230\u7684\u5185\u5bb9\uff1a"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(5425).Z,width:"1121",height:"932"})),(0,l.kt)("p",null,"\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c\u6211\u4eec\u7684\u7a0b\u5e8f\u901a\u8fc7CPI\u4e0e\u7cfb\u7edf\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92\uff0c\u521b\u5efa\u4e86\u4e00\u4e2a\u8d26\u6237\uff08PDA\uff09\uff0c\u5e76\u5c06\u6211\u4eec\u7684\u8bc4\u8bba\u6dfb\u52a0\u5230\u5176\u4e2d\uff01\u5982\u679c\u6211\u81ea\u5df1\u8bf4\u7684\u8bdd\uff0c\u8fd9\u662f\u4e00\u7bc7\u975e\u5e38\u597d\u7684\u8bc4\u8bba\uff1b\uff09"),(0,l.kt)("p",null,(0,l.kt)("img",{src:n(6430).Z,width:"512",height:"512"})),(0,l.kt)("h2",{id:"-\u8239\u8236\u6311\u6218"},"\ud83d\udea2 \u8239\u8236\u6311\u6218"),(0,l.kt)("p",null,"\u73b0\u5728\u8f6e\u5230\u4f60\u72ec\u7acb\u5efa\u7acb\u4e00\u4e9b\u4e1c\u897f\u4e86\u3002"),(0,l.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b\uff0c\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\u9700\u8981\u7528\u6237\u63d0\u4f9b\u59d3\u540d\u548c\u7b80\u77ed\u7559\u8a00\u4f5c\u4e3a\u8f93\u5165",(0,l.kt)("inlineCode",{parentName:"p"},"instruction_data"),"\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u8d26\u6237\u6765\u5c06\u6570\u636e\u5b58\u50a8\u5728\u533a\u5757\u94fe\u4e0a\u3002"),(0,l.kt)("p",null,"\u5229\u7528\u4f60\u5728\u672c\u8bfe\u7a0b\u4e2d\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u5c1d\u8bd5\u91cd\u65b0\u521b\u5efa\u5b8c\u6574\u7684\u5b66\u751f\u4ecb\u7ecd\u7a0b\u5e8f\u3002"),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"\u63d0\u793a\uff1a\n\u9664\u4e86\u63a5\u6536\u4e00\u4e2a\u540d\u79f0\u548c\u4e00\u4e2a\u7b80\u77ed\u7684\u6d88\u606f\u4f5c\u4e3a\u6307\u4ee4\u6570\u636e\u5916\uff0c\u7a0b\u5e8f\u8fd8\u5e94\u8be5\uff1a"),(0,l.kt)("ul",{parentName:"blockquote"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},"\u4e3a\u6bcf\u4e2a\u5b66\u751f\u521b\u5efa\u4e00\u4e2a\u72ec\u7acb\u7684\u8d26\u6237"))),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("ol",{parentName:"li",start:2},(0,l.kt)("li",{parentName:"ol"},"\u5c06 ",(0,l.kt)("inlineCode",{parentName:"li"},"is_initialized")," \u5b58\u50a8\u4e3a\u5e03\u5c14\u503c\uff0c\u5728\u6bcf\u4e2a\u8d26\u6237\u4e2d\u5c06 ",(0,l.kt)("inlineCode",{parentName:"li"},"name")," \u5b58\u50a8\u4e3a\u5b57\u7b26\u4e32\uff0c\u5c06 ",(0,l.kt)("inlineCode",{parentName:"li"},"msg")," \u5b58\u50a8\u4e3a\u5b57\u7b26\u4e32"))))),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Solution Code:")),(0,l.kt)("p",null,"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801\uff1a\n\u4f60\u53ef\u4ee5\u4f7f\u7528",(0,l.kt)("a",{parentName:"p",href:"https://github.com/buildspace/solana-student-intros-frontend"},"\u8fd9\u4e2a"),"\u524d\u7aef\u6765\u6d4b\u8bd5\u4f60\u7684\u7a0b\u5e8f\u3002\u8bb0\u5f97\u7528\u4f60\u90e8\u7f72\u7684\u7a0b\u5e8fID\u66ff\u6362\u524d\u7aef\u4ee3\u7801\u4e2d\u7684\u90a3\u4e2a\u3002"),(0,l.kt)("p",null,"\u5982\u679c\u53ef\u4ee5\u7684\u8bdd\uff0c\u5c3d\u91cf\u72ec\u7acb\u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\uff01\u4f46\u5982\u679c\u9047\u5230\u56f0\u96be\uff0c\u53ef\u4ee5\u53c2\u8003",(0,l.kt)("a",{parentName:"p",href:"https://beta.solpg.io/62b11ce4f6273245aca4f5b2"},"\u89e3\u51b3\u65b9\u6848\u4ee3\u7801"),"\u3002"))}d.isMDXComponent=!0},6430:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/773-6232a70282dc42dbde32df8ea03dd5e0.png"},6429:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/call-invoke-6e4d2dc04e410b46cc9ffdb20ce18137.png"},5425:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/call-logo-d23f5c8d2e25aa5b0374c6a0edc51094.png"},1587:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/data-9a339ca3aef431865b60faee61040804.png"},1950:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/invoke-e150fc95c6ce2f5e6ab482041e5b334b.png"},6715:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/movie-review-pt2-build-deploy-7069ae4fecd50a33e2d8c4b1a76fefaa.gif"},5628:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/note-borsh-17856b11ce54cb57a29f6bacca514085.png"},4242:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/pda-3034cea777caf2e37c5e2dfcc2498094.png"},6249:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/type-rent-7183b6cf326d21f6e53bf0ba29989417.png"}}]); \ No newline at end of file diff --git a/assets/js/fa93d5c7.1ac5e461.js b/assets/js/fa93d5c7.1ac5e461.js deleted file mode 100644 index e74d0d52d..000000000 --- a/assets/js/fa93d5c7.1ac5e461.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[590],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var i=r.createContext({}),c=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=c(e.components);return r.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),p=c(n),m=o,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||a;return n?r.createElement(f,l(l({ref:t},s),{},{components:n})):r.createElement(f,l({ref:t},s))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,l=new Array(a);l[0]=m;var u={};for(var i in t)hasOwnProperty.call(t,i)&&(u[i]=t[i]);u.originalType=e,u[p]="string"==typeof e?e:o,l[1]=u;for(var c=2;c{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>u,toc:()=>c});var r=n(7462),o=(n(7294),n(3905));const a={sidebar_position:51,sidebar_label:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",sidebar_class_name:"green"},l="\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",u={unversionedId:"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README",id:"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README",title:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",description:"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u54c8\u3002\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\u505a\u4e86\u5f88\u591a\u5f88\u9177\u7684\u4e8b\u60c5\u3002\u6211\u4eec\u5efa\u7acb\u4e86\u5404\u79cd\u7c7b\u578b\u7684\u5ba2\u6237\u7aef\uff0c\u521b\u5efa\u4e86NFT\u6536\u85cf\u54c1\uff0c\u94f8\u9020\u4e86SPL\u4ee3\u5e01\uff0c\u751a\u81f3\u6784\u5efa\u4e86\u7528\u6237\u754c\u9762\uff0c\u8ba9\u5176\u4ed6\u4eba\u4e0e\u5b83\u4eec\u8fdb\u884c\u4ea4\u4e92\u3002\u7136\u800c\uff0c\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u6240\u505a\u7684\u4e00\u5207\u90fd\u662f\u57fa\u4e8e\u73b0\u6709\u7684\u7a0b\u5e8f\u3002",source:"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README.md",sourceDirName:"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer",slug:"/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README.md",tags:[],version:"current",sidebarPosition:51,frontMatter:{sidebar_position:51,sidebar_label:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Rust\u7b80\u4ecb",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/"},next:{title:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/"}},i={},c=[{value:"\ud83e\udd14 Rust \u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f",id:"-rust-\u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f",level:2},{value:"\ud83d\udef9 Solana Playground",id:"-solana-playground",level:2}],s={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,o.kt)(p,(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"-\u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a"},"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u54c8\u3002\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\u505a\u4e86\u5f88\u591a\u5f88\u9177\u7684\u4e8b\u60c5\u3002\u6211\u4eec\u5efa\u7acb\u4e86\u5404\u79cd\u7c7b\u578b\u7684\u5ba2\u6237\u7aef\uff0c\u521b\u5efa\u4e86NFT\u6536\u85cf\u54c1\uff0c\u94f8\u9020\u4e86SPL\u4ee3\u5e01\uff0c\u751a\u81f3\u6784\u5efa\u4e86\u7528\u6237\u754c\u9762\uff0c\u8ba9\u5176\u4ed6\u4eba\u4e0e\u5b83\u4eec\u8fdb\u884c\u4ea4\u4e92\u3002\u7136\u800c\uff0c\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u6240\u505a\u7684\u4e00\u5207\u90fd\u662f\u57fa\u4e8e\u73b0\u6709\u7684\u7a0b\u5e8f\u3002"),(0,o.kt)("p",null,"\u4f60\u73b0\u5728\u5df2\u7ecf\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u540d\u5168\u6808Solana\u5f00\u53d1\u8005\uff0c\u5e76\u5b66\u4e60\u5982\u4f55\u7f16\u5199\u81ea\u5df1\u7684\u7a0b\u5e8f\u4e86\u3002"),(0,o.kt)("p",null,"Solana\u7684\u80fd\u529b\u53ef\u4ee5\u8fd0\u884c\u4efb\u610f\u53ef\u6267\u884c\u4ee3\u7801\uff0c\u8fd9\u4e5f\u662f\u5b83\u5982\u6b64\u5f3a\u5927\u7684\u4e00\u90e8\u5206\u3002Solana\u7a0b\u5e8f\uff0c\u7c7b\u4f3c\u4e8e\u5176\u4ed6\u533a\u5757\u94fe\u73af\u5883\u4e2d\u7684\u201c\u667a\u80fd\u5408\u7ea6\u201d\uff0c\u5b9e\u9645\u4e0a\u662fSolana\u751f\u6001\u7cfb\u7edf\u7684\u652f\u67f1\u3002\u8fd9\u610f\u5473\u7740Solana\u57fa\u672c\u4e0a\u662f\u4e00\u4e2a\u4efb\u4f55\u4e92\u8054\u7f51\u7528\u6237\u90fd\u53ef\u4ee5\u8bbf\u95ee\u548c\u8fd0\u884c\u7684\u901a\u7528\u8ba1\u7b97\u673a\u3002\u4f60\u53ef\u80fd\u4f1a\u60f3\u77e5\u9053\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u91cd\u8981\uff0c\u4f46\u5b83\u786e\u5b9e\u5e76\u4e0d\u611f\u89c9\u5982\u6b64\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(1670).Z,width:"480",height:"270"})),(0,o.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b\uff0c\u5f53\u4f60\u7684\u7535\u8111\u6ca1\u6709\u4e92\u8054\u7f51\u63a5\u5165\u65f6\u7684\u60c5\u666f\u3002\u5982\u679c\u4f60\u548c\u6211\u4e00\u6837\u662f\u5a74\u513f\u6f6e\u4e00\u4ee3\uff0c\u90a3\u53ef\u80fd\u662f\u5927\u7ea615\u5e74\u524d\uff0c\u5f53\u65f6\u6c38\u4e45\u4e92\u8054\u7f51\u8fd8\u4e0d\u666e\u53ca\u3002\u6216\u8005\u53ef\u80fd\u662f\u56e0\u4e3a\u4f60\u4e00\u76f4\u5728\u73a9\u89c6\u9891\u6e38\u620f\uff0c\u6240\u4ee5\u4f60\u5988\u5988\u5173\u95ed\u4e86\u65e0\u7ebf\u7f51\u7edc\u3002\u5f53\u6ca1\u6709\u8fde\u63a5\u5230\u5168\u7403\u5176\u4ed6\u8ba1\u7b97\u673a\u65f6\uff0c\u4f60\u7684\u7535\u8111\u611f\u89c9\u5c31\u4e0d\u90a3\u4e48\u5f3a\u5927\u4e86\u3002"),(0,o.kt)("p",null,"\u8fd9\u6b63\u662f\u4e0d\u8fde\u63a5Solana\u4f1a\u611f\u89c9\u5982\u4f55\u3002\u533a\u5757\u94fe\u7f51\u7edc\u662f\u4e92\u8054\u7f51\u7684\u4e0b\u4e00\u4e2a\u6f14\u8fdb\u9636\u6bb5\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6574\u4e2a\u4e8b\u60c5\u88ab\u79f0\u4e3a\u201cWeb 3.0\u201d\u7684\u539f\u56e0\u3002\u80fd\u591f\u5b89\u5168\u4e14\u65e0\u9700\u8bb8\u53ef\u5730\u8fd0\u884c\u53ef\u91cd\u590d\u7684\u4ee3\u7801\uff0c\u6253\u5f00\u4e86\u5168\u65b0\u7684\u53ef\u80fd\u6027\u4e16\u754c\u3002"),(0,o.kt)("p",null,"\u5b83\u8fd8\u6ca1\u6709\u50cf\u201c\u9759\u6001\u7c7b\u578b\u201d\u8bed\u8a00\u90a3\u6837\u6709\u9b54\u529b\uff0c\u56e0\u4e3a\u9b54\u529b\u4ecd\u7136\u7531\u50cf\u4f60\u8fd9\u6837\u7684\u4eba\u6784\u5efa\u3002\u968f\u7740\u5f00\u53d1\u4eba\u5458\u548c\u521b\u4f5c\u8005\u6784\u601d\u548c\u90e8\u7f72\u65b0\u7a0b\u5e8f\uff0c\u7a0b\u5e8f\u7684\u96c6\u5408\u6bcf\u5929\u90fd\u5728\u589e\u957f\u3002"),(0,o.kt)("h2",{id:"-rust-\u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f"},"\ud83e\udd14 Rust \u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f"),(0,o.kt)("p",null,"Solana\u7684\u7a0b\u5e8f\u662f\u7528Rust\u7f16\u5199\u7684\uff0c\u5b83\u662f\u4e00\u79cd\u7c7b\u4f3c\u4e8eC\u7684\u4f4e\u7ea7\u7f16\u7a0b\u8bed\u8a00\uff0c\u975e\u5e38\u5feb\u901f\u3002\u5728\u6211\u4eec\u5f00\u59cb\u4f20\u7edf\u7684\u201cHello World\u201d\u7a0b\u5e8f\u4e4b\u524d\uff0c\u6211\u60f3\u7a0d\u5fae\u8c08\u4e00\u4e0b\u4e3a\u4ec0\u4e48Rust\u88ab\u8ba4\u4e3a\u662f\u5982\u6b64\u56f0\u96be\u3002"),(0,o.kt)("p",null,"\u7b80\u800c\u8a00\u4e4b\uff1aRust\u611f\u89c9\u56f0\u96be\u662f\u56e0\u4e3a\u5b83\u6709\u5f88\u591a\u89c4\u5219\u3002\u60f3\u60f3\u90a3\u4e9b\u5b66\u4e60\u66f2\u7ebf\u9661\u5ced\u7684\u89c6\u9891\u6e38\u620f\u2014\u2014DOTA\u3001\u82f1\u96c4\u8054\u76df\u3001\u661f\u9645\u4e89\u9738\uff08\u751a\u81f3\u662f\u56fd\u9645\u8c61\u68cb\u6216CSGO\u54c8\u54c8\uff09\u3002\u8fd9\u4e9b\u6e38\u620f\u6709\u6570\u767e\u4e2a\u72ec\u7279\u7684\u89d2\u8272/\u7269\u54c1/\u80fd\u529b\uff0c\u6bcf\u4e2a\u90fd\u6709\u81ea\u5df1\u7684\u89c4\u5219\u548c\u4e92\u52a8\u65b9\u5f0f\u3002\u8981\u5728\u8fd9\u4e9b\u6e38\u620f\u4e2d\u53d6\u5f97\u80dc\u5229\uff0c\u4f60\u5fc5\u987b\u5b66\u4f1a\u6240\u6709\u7684\u89c4\u5219\uff0c\u5e76\u4e86\u89e3\u5b83\u4eec\u5982\u4f55\u76f8\u4e92\u4f5c\u7528\u3002"),(0,o.kt)("p",null,"Rust\u5c31\u662f\u8fd9\u6837\u7684\u3002\u5b83\u662f\u4e00\u79cd\u975e\u5e38\u6709\u4e3b\u89c1\u7684\u8bed\u8a00\uff0c\u8feb\u4f7f\u4f60\u4ee5\u4e0d\u540c\u7684\u65b9\u5f0f\u601d\u8003\u4f60\u7684\u4ee3\u7801\u3002\u5b83\u4e0d\u662f\u4e00\u79cd\u4f60\u53ef\u4ee5\u968f\u4fbf\u62ff\u8d77\u6765\u5199\u7a0b\u5e8f\u7684\u8bed\u8a00 - \u5b83\u662f\u4e00\u79cd\u4f60\u5fc5\u987b\u5b66\u4e60\u548c\u7406\u89e3\u7684\u8bed\u8a00\u3002"),(0,o.kt)("p",null,"\u8fd9\u5e76\u4e0d\u662f\u8981\u5413\u552c\u4f60\u2014\u2014\u5b66\u4e60Rust\u5e76\u4e0d\u50cf\u5b66\u4e60DOTA\u90a3\u4e48\u96be\ud83d\udc80\u3002\u6211\u53ea\u662f\u60f3\u544a\u8bc9\u4f60\u6211\u4eec\u5df2\u7ecf\u5f04\u6e05\u695a\u4e86\u3002Rust\u53ef\u4ee5\u975e\u5e38\u6709\u8da3\uff0c\u53ea\u662f\u9700\u8981\u6bd4\u4f60\u4ee5\u5f80\u4e60\u60ef\u7684\u66f4\u591a\u52aa\u529b :)"),(0,o.kt)("p",null,"\u5c31\u50cf\u73a9\u7535\u5b50\u6e38\u620f\u4e00\u6837\uff0c\u6211\u4eec\u4f1a\u4e00\u6b21\u53ea\u4e13\u6ce8\u4e8e\u4e00\u4ef6\u4e8b\u60c5\uff0c\u4ece\u7b80\u5355\u7684\u5f00\u59cb\uff0c\u9010\u6e10\u653b\u514b\u56f0\u96be\u7684\u96be\u9898\uff0c\u4e0d\u65ad\u63d0\u5347\u81ea\u5df1\u7684\u7b49\u7ea7\u2694\ufe0f\u3002"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u6211\u4eec\u6784\u5efa Hello World \u7a0b\u5e8f\u6240\u9700\u7684\u6700\u57fa\u672c\u6982\u5ff5\u5f00\u59cb"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u6a21\u5757\u7cfb\u7edf"),(0,o.kt)("li",{parentName:"ul"},"Solana\u7a0b\u5e8f\u5165\u53e3"),(0,o.kt)("li",{parentName:"ul"},"function"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html"},"reference\u548c\u501f\u7528\uff08\u6709\u70b9\u513f\uff09"))),(0,o.kt)("h2",{id:"-solana-playground"},"\ud83d\udef9 Solana Playground"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u5728",(0,o.kt)("a",{parentName:"p",href:"https://beta.solpg.io/"},"Solana Playground"),"\u4e0a\u5f00\u59cb\u6211\u4eec\u7684\u7a0b\u5e8f\u5f00\u53d1\u4e4b\u65c5\u3002\u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u5b83\u5c06\u5904\u7406\u6240\u6709\u7684\u8bbe\u7f6e\u8981\u6c42\uff0c\u8ba9\u6211\u4eec\u4e13\u6ce8\u4e8eRust\u3002"),(0,o.kt)("p",null,"\u6253\u5f00\u5b83\u5e76\u4f7f\u7528\u539f\u751f\u6846\u67b6\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee - \u6211\u4eec\u4fdd\u6301\u539f\u6c41\u539f\u5473\ud83c\udf3c\u3002Anchor\u662f\u4e00\u4e2a\u7528\u4e8e\u5728Solana\u4e0a\u6784\u5efa\u7684Rust\u6846\u67b6\uff0c\u6709\u70b9\u50cfReact\u5bf9\u4e8eWeb\u7684\u4f5c\u7528\u3002\u7a0d\u540e\u6211\u4eec\u4f1a\u5b66\u4e60\u5982\u4f55\u4f7f\u7528\u5b83\u8fdb\u884c\u6784\u5efa\uff0c\u73b0\u5728\u5148\u4f7f\u7528\u539f\u751f\u6846\u67b6\u3002"),(0,o.kt)("p",null,"\u4f60\u5e94\u8be5\u5f97\u5230\u4e00\u4e2a\u5e26\u6709\u4e00\u79cd\u9ad8\u7ea7\u7684Hello World\u7a0b\u5e8f\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"lib.rs"),"\u6587\u4ef6\u3002\u6452\u5f03\u5b83\uff0c\u6211\u4eec\u8981\u505a\u4e00\u4e2a\u66f4\u7b80\u5355\u7684\u3002"),(0,o.kt)("p",null,"\u5728\u8fd9\u91cc\uff0c\u4f60\u6700\u4e0d\u60f3\u505a\u7684\u4e8b\u60c5\u5c31\u662f\u8bbe\u7f6e\u4e00\u4e2a\u6e38\u4e50\u573a\u94b1\u5305\u3002\u4f60\u4f1a\u5728\u5de6\u4e0b\u89d2\u770b\u5230\u4e00\u4e2a\u201c\u672a\u8fde\u63a5\u201d\u6309\u94ae\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(2785).Z,width:"307",height:"214"})),(0,o.kt)("p",null,"\u70b9\u51fb\u5b83\uff0c\u5b83\u4f1a\u4e3a\u60a8\u751f\u6210\u4e00\u4e2aSolana\u94b1\u5305\uff0c\u5e76\u7528devnet SOL\u8d44\u91d1\u5145\u503c\u3002\u5982\u679c\u60a8\u613f\u610f\uff0c\u53ef\u4ee5\u4fdd\u5b58\u5bc6\u94a5\u5bf9\uff0c\u8fd9\u5728\u6d4b\u8bd5\u7279\u5b9a\u5bc6\u94a5\u5bf9\u90e8\u7f72\u7684\u7a0b\u5e8f\u65f6\u5f88\u6709\u5e2e\u52a9\u3002\u6211\u53ea\u4f1a\u6784\u5efa\u4e00\u4e2a\u7b80\u5355\u7684\u7a0b\u5e8f\uff0c\u6240\u4ee5\u4e0d\u9700\u8981\u5b83 :P"),(0,o.kt)("p",null,"\u662f\u65f6\u5019\u5f00\u59cb\u5199\u4e00\u4e9b Rust \u4ee3\u7801\u4e86\uff01\ud83e\udd80"))}d.isMDXComponent=!0},1670:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/giphy-812bea57ec0eb1f2b053459799c92ceb.gif"},2785:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/solana-playground-7f25ae41522992345ad819049fa214c8.png"}}]); \ No newline at end of file diff --git a/assets/js/fa93d5c7.b6cee6b4.js b/assets/js/fa93d5c7.b6cee6b4.js new file mode 100644 index 000000000..7dda0a4ec --- /dev/null +++ b/assets/js/fa93d5c7.b6cee6b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[590],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=r.createContext({}),s=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=s(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=s(n),m=o,f=p["".concat(u,".").concat(m)]||p[m]||d[m]||a;return n?r.createElement(f,l(l({ref:t},c),{},{components:n})):r.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,l=new Array(a);l[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[p]="string"==typeof e?e:o,l[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var r=n(7462),o=(n(7294),n(3905));const a={sidebar_position:51,sidebar_label:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",sidebar_class_name:"green"},l="\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",i={unversionedId:"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README",id:"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README",title:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",description:"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u54c8\u3002\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\u505a\u4e86\u5f88\u591a\u5f88\u9177\u7684\u4e8b\u60c5\u3002\u6211\u4eec\u5efa\u7acb\u4e86\u5404\u79cd\u7c7b\u578b\u7684\u5ba2\u6237\u7aef\uff0c\u521b\u5efa\u4e86NFT\u6536\u85cf\u54c1\uff0c\u94f8\u9020\u4e86SPL\u4ee3\u5e01\uff0c\u751a\u81f3\u6784\u5efa\u4e86\u7528\u6237\u754c\u9762\uff0c\u8ba9\u5176\u4ed6\u4eba\u4e0e\u5b83\u4eec\u8fdb\u884c\u4ea4\u4e92\u3002\u7136\u800c\uff0c\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u6240\u505a\u7684\u4e00\u5207\u90fd\u662f\u57fa\u4e8e\u73b0\u6709\u7684\u7a0b\u5e8f\u3002",source:"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README.md",sourceDirName:"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer",slug:"/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README.md",tags:[],version:"current",sidebarPosition:51,frontMatter:{sidebar_position:51,sidebar_label:"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"Rust\u7b80\u4ecb",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/"},next:{title:"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/"}},u={},s=[{value:"\ud83e\udd14 Rust \u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f",id:"-rust-\u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f",level:2},{value:"\ud83d\udef9 Solana Playground",id:"-solana-playground",level:2}],c={toc:s},p="wrapper";function d(e){let{components:t,...a}=e;return(0,o.kt)(p,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"-\u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a"},"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u5728\u6e38\u4e50\u573a\u4e0a\u5236\u4f5c\u4e00\u4e2a\u7b80\u5355\u7684Hello World\u7a0b\u5e8f\u3002\u5b83\u53ea\u4f1a\u5728\u4ea4\u6613\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u4e00\u6761\u6d88\u606f\uff0c\u54c8\u54c8\u54c8\u3002\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u5df2\u7ecf\u505a\u4e86\u5f88\u591a\u5f88\u9177\u7684\u4e8b\u60c5\u3002\u6211\u4eec\u5efa\u7acb\u4e86\u5404\u79cd\u7c7b\u578b\u7684\u5ba2\u6237\u7aef\uff0c\u521b\u5efa\u4e86NFT\u6536\u85cf\u54c1\uff0c\u94f8\u9020\u4e86SPL\u4ee3\u5e01\uff0c\u751a\u81f3\u6784\u5efa\u4e86\u7528\u6237\u754c\u9762\uff0c\u8ba9\u5176\u4ed6\u4eba\u4e0e\u5b83\u4eec\u8fdb\u884c\u4ea4\u4e92\u3002\u7136\u800c\uff0c\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u6240\u505a\u7684\u4e00\u5207\u90fd\u662f\u57fa\u4e8e\u73b0\u6709\u7684\u7a0b\u5e8f\u3002"),(0,o.kt)("p",null,"\u4f60\u73b0\u5728\u5df2\u7ecf\u51c6\u5907\u597d\u6210\u4e3a\u4e00\u540d\u5168\u6808Solana\u5f00\u53d1\u8005\uff0c\u5e76\u5b66\u4e60\u5982\u4f55\u7f16\u5199\u81ea\u5df1\u7684\u7a0b\u5e8f\u4e86\u3002"),(0,o.kt)("p",null,"Solana\u7684\u80fd\u529b\u53ef\u4ee5\u8fd0\u884c\u4efb\u610f\u53ef\u6267\u884c\u4ee3\u7801\uff0c\u8fd9\u4e5f\u662f\u5b83\u5982\u6b64\u5f3a\u5927\u7684\u4e00\u90e8\u5206\u3002Solana\u7a0b\u5e8f\uff0c\u7c7b\u4f3c\u4e8e\u5176\u4ed6\u533a\u5757\u94fe\u73af\u5883\u4e2d\u7684\u201c\u667a\u80fd\u5408\u7ea6\u201d\uff0c\u5b9e\u9645\u4e0a\u662fSolana\u751f\u6001\u7cfb\u7edf\u7684\u652f\u67f1\u3002\u8fd9\u610f\u5473\u7740Solana\u57fa\u672c\u4e0a\u662f\u4e00\u4e2a\u4efb\u4f55\u4e92\u8054\u7f51\u7528\u6237\u90fd\u53ef\u4ee5\u8bbf\u95ee\u548c\u8fd0\u884c\u7684\u901a\u7528\u8ba1\u7b97\u673a\u3002\u4f60\u53ef\u80fd\u4f1a\u60f3\u77e5\u9053\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u91cd\u8981\uff0c\u4f46\u5b83\u786e\u5b9e\u5e76\u4e0d\u611f\u89c9\u5982\u6b64\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(1670).Z,width:"480",height:"270"})),(0,o.kt)("p",null,"\u56de\u60f3\u4e00\u4e0b\uff0c\u5f53\u4f60\u7684\u7535\u8111\u6ca1\u6709\u4e92\u8054\u7f51\u63a5\u5165\u65f6\u7684\u60c5\u666f\u3002\u5982\u679c\u4f60\u548c\u6211\u4e00\u6837\u662f\u5a74\u513f\u6f6e\u4e00\u4ee3\uff0c\u90a3\u53ef\u80fd\u662f\u5927\u7ea615\u5e74\u524d\uff0c\u5f53\u65f6\u6c38\u4e45\u4e92\u8054\u7f51\u8fd8\u4e0d\u666e\u53ca\u3002\u6216\u8005\u53ef\u80fd\u662f\u56e0\u4e3a\u4f60\u4e00\u76f4\u5728\u73a9\u89c6\u9891\u6e38\u620f\uff0c\u6240\u4ee5\u4f60\u5988\u5988\u5173\u95ed\u4e86\u65e0\u7ebf\u7f51\u7edc\u3002\u5f53\u6ca1\u6709\u8fde\u63a5\u5230\u5168\u7403\u5176\u4ed6\u8ba1\u7b97\u673a\u65f6\uff0c\u4f60\u7684\u7535\u8111\u611f\u89c9\u5c31\u4e0d\u90a3\u4e48\u5f3a\u5927\u4e86\u3002"),(0,o.kt)("p",null,"\u8fd9\u6b63\u662f\u4e0d\u8fde\u63a5Solana\u4f1a\u611f\u89c9\u5982\u4f55\u3002\u533a\u5757\u94fe\u7f51\u7edc\u662f\u4e92\u8054\u7f51\u7684\u4e0b\u4e00\u4e2a\u6f14\u8fdb\u9636\u6bb5\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6574\u4e2a\u4e8b\u60c5\u88ab\u79f0\u4e3a\u201cWeb 3.0\u201d\u7684\u539f\u56e0\u3002\u80fd\u591f\u5b89\u5168\u4e14\u65e0\u9700\u8bb8\u53ef\u5730\u8fd0\u884c\u53ef\u91cd\u590d\u7684\u4ee3\u7801\uff0c\u6253\u5f00\u4e86\u5168\u65b0\u7684\u53ef\u80fd\u6027\u4e16\u754c\u3002"),(0,o.kt)("p",null,"\u5b83\u8fd8\u6ca1\u6709\u50cf\u201c\u9759\u6001\u7c7b\u578b\u201d\u8bed\u8a00\u90a3\u6837\u6709\u9b54\u529b\uff0c\u56e0\u4e3a\u9b54\u529b\u4ecd\u7136\u7531\u50cf\u4f60\u8fd9\u6837\u7684\u4eba\u6784\u5efa\u3002\u968f\u7740\u5f00\u53d1\u4eba\u5458\u548c\u521b\u4f5c\u8005\u6784\u601d\u548c\u90e8\u7f72\u65b0\u7a0b\u5e8f\uff0c\u7a0b\u5e8f\u7684\u96c6\u5408\u6bcf\u5929\u90fd\u5728\u589e\u957f\u3002"),(0,o.kt)("h2",{id:"-rust-\u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f"},"\ud83e\udd14 Rust \u662f\u4ec0\u4e48\u9b3c\u4e1c\u897f"),(0,o.kt)("p",null,"Solana\u7684\u7a0b\u5e8f\u662f\u7528Rust\u7f16\u5199\u7684\uff0c\u5b83\u662f\u4e00\u79cd\u7c7b\u4f3c\u4e8eC\u7684\u4f4e\u7ea7\u7f16\u7a0b\u8bed\u8a00\uff0c\u975e\u5e38\u5feb\u901f\u3002\u5728\u6211\u4eec\u5f00\u59cb\u4f20\u7edf\u7684\u201cHello World\u201d\u7a0b\u5e8f\u4e4b\u524d\uff0c\u6211\u60f3\u7a0d\u5fae\u8c08\u4e00\u4e0b\u4e3a\u4ec0\u4e48Rust\u88ab\u8ba4\u4e3a\u662f\u5982\u6b64\u56f0\u96be\u3002"),(0,o.kt)("p",null,"\u7b80\u800c\u8a00\u4e4b\uff1aRust\u611f\u89c9\u56f0\u96be\u662f\u56e0\u4e3a\u5b83\u6709\u5f88\u591a\u89c4\u5219\u3002\u60f3\u60f3\u90a3\u4e9b\u5b66\u4e60\u66f2\u7ebf\u9661\u5ced\u7684\u89c6\u9891\u6e38\u620f\u2014\u2014DOTA\u3001\u82f1\u96c4\u8054\u76df\u3001\u661f\u9645\u4e89\u9738\uff08\u751a\u81f3\u662f\u56fd\u9645\u8c61\u68cb\u6216CSGO\u54c8\u54c8\uff09\u3002\u8fd9\u4e9b\u6e38\u620f\u6709\u6570\u767e\u4e2a\u72ec\u7279\u7684\u89d2\u8272/\u7269\u54c1/\u80fd\u529b\uff0c\u6bcf\u4e2a\u90fd\u6709\u81ea\u5df1\u7684\u89c4\u5219\u548c\u4e92\u52a8\u65b9\u5f0f\u3002\u8981\u5728\u8fd9\u4e9b\u6e38\u620f\u4e2d\u53d6\u5f97\u80dc\u5229\uff0c\u4f60\u5fc5\u987b\u5b66\u4f1a\u6240\u6709\u7684\u89c4\u5219\uff0c\u5e76\u4e86\u89e3\u5b83\u4eec\u5982\u4f55\u76f8\u4e92\u4f5c\u7528\u3002"),(0,o.kt)("p",null,"Rust\u5c31\u662f\u8fd9\u6837\u7684\u3002\u5b83\u662f\u4e00\u79cd\u975e\u5e38\u6709\u4e3b\u89c1\u7684\u8bed\u8a00\uff0c\u8feb\u4f7f\u4f60\u4ee5\u4e0d\u540c\u7684\u65b9\u5f0f\u601d\u8003\u4f60\u7684\u4ee3\u7801\u3002\u5b83\u4e0d\u662f\u4e00\u79cd\u4f60\u53ef\u4ee5\u968f\u4fbf\u62ff\u8d77\u6765\u5199\u7a0b\u5e8f\u7684\u8bed\u8a00 - \u5b83\u662f\u4e00\u79cd\u4f60\u5fc5\u987b\u5b66\u4e60\u548c\u7406\u89e3\u7684\u8bed\u8a00\u3002"),(0,o.kt)("p",null,"\u8fd9\u5e76\u4e0d\u662f\u8981\u5413\u552c\u4f60\u2014\u2014\u5b66\u4e60Rust\u5e76\u4e0d\u50cf\u5b66\u4e60DOTA\u90a3\u4e48\u96be\ud83d\udc80\u3002\u6211\u53ea\u662f\u60f3\u544a\u8bc9\u4f60\u6211\u4eec\u5df2\u7ecf\u5f04\u6e05\u695a\u4e86\u3002Rust\u53ef\u4ee5\u975e\u5e38\u6709\u8da3\uff0c\u53ea\u662f\u9700\u8981\u6bd4\u4f60\u4ee5\u5f80\u4e60\u60ef\u7684\u66f4\u591a\u52aa\u529b :)"),(0,o.kt)("p",null,"\u5c31\u50cf\u73a9\u7535\u5b50\u6e38\u620f\u4e00\u6837\uff0c\u6211\u4eec\u4f1a\u4e00\u6b21\u53ea\u4e13\u6ce8\u4e8e\u4e00\u4ef6\u4e8b\u60c5\uff0c\u4ece\u7b80\u5355\u7684\u5f00\u59cb\uff0c\u9010\u6e10\u653b\u514b\u56f0\u96be\u7684\u96be\u9898\uff0c\u4e0d\u65ad\u63d0\u5347\u81ea\u5df1\u7684\u7b49\u7ea7\u2694\ufe0f\u3002"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u4ece\u6211\u4eec\u6784\u5efa Hello World \u7a0b\u5e8f\u6240\u9700\u7684\u6700\u57fa\u672c\u6982\u5ff5\u5f00\u59cb"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u6a21\u5757\u7cfb\u7edf"),(0,o.kt)("li",{parentName:"ul"},"Solana\u7a0b\u5e8f\u5165\u53e3"),(0,o.kt)("li",{parentName:"ul"},"function"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html"},"reference\u548c\u501f\u7528\uff08\u6709\u70b9\u513f\uff09"))),(0,o.kt)("h2",{id:"-solana-playground"},"\ud83d\udef9 Solana Playground"),(0,o.kt)("p",null,"\u6211\u4eec\u5c06\u5728",(0,o.kt)("a",{parentName:"p",href:"https://beta.solpg.io/"},"Solana Playground"),"\u4e0a\u5f00\u59cb\u6211\u4eec\u7684\u7a0b\u5e8f\u5f00\u53d1\u4e4b\u65c5\u3002\u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff0c\u5b83\u5c06\u5904\u7406\u6240\u6709\u7684\u8bbe\u7f6e\u8981\u6c42\uff0c\u8ba9\u6211\u4eec\u4e13\u6ce8\u4e8eRust\u3002"),(0,o.kt)("p",null,"\u6253\u5f00\u5b83\u5e76\u4f7f\u7528\u539f\u751f\u6846\u67b6\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee - \u6211\u4eec\u4fdd\u6301\u539f\u6c41\u539f\u5473\ud83c\udf3c\u3002Anchor\u662f\u4e00\u4e2a\u7528\u4e8e\u5728Solana\u4e0a\u6784\u5efa\u7684Rust\u6846\u67b6\uff0c\u6709\u70b9\u50cfReact\u5bf9\u4e8eWeb\u7684\u4f5c\u7528\u3002\u7a0d\u540e\u6211\u4eec\u4f1a\u5b66\u4e60\u5982\u4f55\u4f7f\u7528\u5b83\u8fdb\u884c\u6784\u5efa\uff0c\u73b0\u5728\u5148\u4f7f\u7528\u539f\u751f\u6846\u67b6\u3002"),(0,o.kt)("p",null,"\u4f60\u5e94\u8be5\u5f97\u5230\u4e00\u4e2a\u5e26\u6709\u4e00\u79cd\u9ad8\u7ea7\u7684Hello World\u7a0b\u5e8f\u7684",(0,o.kt)("inlineCode",{parentName:"p"},"lib.rs"),"\u6587\u4ef6\u3002\u6452\u5f03\u5b83\uff0c\u6211\u4eec\u8981\u505a\u4e00\u4e2a\u66f4\u7b80\u5355\u7684\u3002"),(0,o.kt)("p",null,"\u5728\u8fd9\u91cc\uff0c\u4f60\u6700\u4e0d\u60f3\u505a\u7684\u4e8b\u60c5\u5c31\u662f\u8bbe\u7f6e\u4e00\u4e2a\u6e38\u4e50\u573a\u94b1\u5305\u3002\u4f60\u4f1a\u5728\u5de6\u4e0b\u89d2\u770b\u5230\u4e00\u4e2a\u201c\u672a\u8fde\u63a5\u201d\u6309\u94ae\u3002"),(0,o.kt)("p",null,(0,o.kt)("img",{src:n(2785).Z,width:"307",height:"214"})),(0,o.kt)("p",null,"\u70b9\u51fb\u5b83\uff0c\u5b83\u4f1a\u4e3a\u60a8\u751f\u6210\u4e00\u4e2aSolana\u94b1\u5305\uff0c\u5e76\u7528devnet SOL\u8d44\u91d1\u5145\u503c\u3002\u5982\u679c\u60a8\u613f\u610f\uff0c\u53ef\u4ee5\u4fdd\u5b58\u5bc6\u94a5\u5bf9\uff0c\u8fd9\u5728\u6d4b\u8bd5\u7279\u5b9a\u5bc6\u94a5\u5bf9\u90e8\u7f72\u7684\u7a0b\u5e8f\u65f6\u5f88\u6709\u5e2e\u52a9\u3002\u6211\u53ea\u4f1a\u6784\u5efa\u4e00\u4e2a\u7b80\u5355\u7684\u7a0b\u5e8f\uff0c\u6240\u4ee5\u4e0d\u9700\u8981\u5b83 :P"),(0,o.kt)("p",null,"\u662f\u65f6\u5019\u5f00\u59cb\u5199\u4e00\u4e9b Rust \u4ee3\u7801\u4e86\uff01\ud83e\udd80"))}d.isMDXComponent=!0},1670:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/giphy-812bea57ec0eb1f2b053459799c92ceb.gif"},2785:(e,t,n)=>{n.d(t,{Z:()=>r});const r=n.p+"assets/images/solana-playground-7f25ae41522992345ad819049fa214c8.png"}}]); \ No newline at end of file diff --git a/assets/js/fcc62127.09340d39.js b/assets/js/fcc62127.09340d39.js deleted file mode 100644 index cd3bf3f6b..000000000 --- a/assets/js/fcc62127.09340d39.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1255],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,i=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||l;return r?n.createElement(f,o(o({ref:t},s),{},{components:r})):n.createElement(f,o({ref:t},s))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=m;var u={};for(var i in t)hasOwnProperty.call(t,i)&&(u[i]=t[i]);u.originalType=e,u[p]="string"==typeof e?e:a,o[1]=u;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>u,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const l={sidebar_position:50,sidebar_label:"Module3",sidebar_class_name:"green"},o="Module3: Solana Module3",u={unversionedId:"Solana-Co-Learn/module3/README",id:"Solana-Co-Learn/module3/README",title:"Module3: Solana Module3",description:"Rust\u7b80\u4ecb",source:"@site/docs/Solana-Co-Learn/module3/README.md",sourceDirName:"Solana-Co-Learn/module3",slug:"/Solana-Co-Learn/module3/",permalink:"/docs/Solana-Co-Learn/module3/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/README.md",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_position:50,sidebar_label:"Module3",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",permalink:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/"},next:{title:"Rust\u7b80\u4ecb",permalink:"/docs/Solana-Co-Learn/module3/introduction-to-rust/"}},i={},c=[{value:"Rust\u7b80\u4ecb",id:"rust\u7b80\u4ecb",level:2},{value:"\u539f\u751fSOLANA\u5f00\u53d1",id:"\u539f\u751fsolana\u5f00\u53d1",level:2},{value:"\u5b89\u5168\u548c\u9a8c\u8bc1",id:"\u5b89\u5168\u548c\u9a8c\u8bc1",level:2},{value:"NFT\u8d28\u62bc",id:"nft\u8d28\u62bc",level:2}],s={toc:c},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"module3-solana-module3"},"Module3: Solana Module3"),(0,a.kt)("h2",{id:"rust\u7b80\u4ecb"},"Rust\u7b80\u4ecb"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83c\udfac \u4e0eGage\u4e00\u8d77\u8fdb\u884c\u8282\u76ee\u5f00\u53d1"),(0,a.kt)("li",{parentName:"ul"},"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a"),(0,a.kt)("li",{parentName:"ul"},"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c"),(0,a.kt)("li",{parentName:"ul"},"\u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92")),(0,a.kt)("h2",{id:"\u539f\u751fsolana\u5f00\u53d1"},"\u539f\u751fSOLANA\u5f00\u53d1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The Rust layer cake"),(0,a.kt)("li",{parentName:"ul"},"\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528Gage\u8fdb\u884c\u72b6\u6001\u7ba1\u7406"),(0,a.kt)("li",{parentName:"ul"},"\u72b6\u6001\u7ba1\u7406")),(0,a.kt)("h2",{id:"\u5b89\u5168\u548c\u9a8c\u8bc1"},"\u5b89\u5168\u548c\u9a8c\u8bc1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5b89\u5168\u4e0e\u4fdd\u969c"),(0,a.kt)("li",{parentName:"ul"},"\u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("li",{parentName:"ul"},"Secure our program")),(0,a.kt)("h2",{id:"nft\u8d28\u62bc"},"NFT\u8d28\u62bc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406"),(0,a.kt)("li",{parentName:"ul"},"\u5efa\u7acb\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fcc62127.2efabbf8.js b/assets/js/fcc62127.2efabbf8.js new file mode 100644 index 000000000..ec242afb6 --- /dev/null +++ b/assets/js/fcc62127.2efabbf8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1255],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),s=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,u=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=s(r),m=a,f=p["".concat(u,".").concat(m)]||p[m]||d[m]||l;return r?n.createElement(f,o(o({ref:t},c),{},{components:r})):n.createElement(f,o({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,o=new Array(l);o[0]=m;var i={};for(var u in t)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i[p]="string"==typeof e?e:a,o[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var n=r(7462),a=(r(7294),r(3905));const l={sidebar_position:50,sidebar_label:"Module3",sidebar_class_name:"green"},o="Module3: Solana Module3",i={unversionedId:"Solana-Co-Learn/module3/README",id:"Solana-Co-Learn/module3/README",title:"Module3: Solana Module3",description:"Rust\u7b80\u4ecb",source:"@site/docs/Solana-Co-Learn/module3/README.md",sourceDirName:"Solana-Co-Learn/module3",slug:"/Solana-Co-Learn/module3/",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Solana-Co-Learn/module3/README.md",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_position:50,sidebar_label:"Module3",sidebar_class_name:"green"},sidebar:"tutorialSidebar",previous:{title:"\ud83c\udfa8 \u521b\u5efa\u94f8\u5e01\u7528\u6237\u754c\u9762",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/"},next:{title:"Rust\u7b80\u4ecb",permalink:"/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/"}},u={},s=[{value:"Rust\u7b80\u4ecb",id:"rust\u7b80\u4ecb",level:2},{value:"\u539f\u751fSOLANA\u5f00\u53d1",id:"\u539f\u751fsolana\u5f00\u53d1",level:2},{value:"\u5b89\u5168\u548c\u9a8c\u8bc1",id:"\u5b89\u5168\u548c\u9a8c\u8bc1",level:2},{value:"NFT\u8d28\u62bc",id:"nft\u8d28\u62bc",level:2}],c={toc:s},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"module3-solana-module3"},"Module3: Solana Module3"),(0,a.kt)("h2",{id:"rust\u7b80\u4ecb"},"Rust\u7b80\u4ecb"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\ud83c\udfac \u4e0eGage\u4e00\u8d77\u8fdb\u884c\u8282\u76ee\u5f00\u53d1"),(0,a.kt)("li",{parentName:"ul"},"\u2728 \u9b54\u6cd5\u4e92\u8054\u7f51\u8ba1\u7b97\u673a"),(0,a.kt)("li",{parentName:"ul"},"\ud83d\udcdd \u4f60\u597d\uff0c\u4e16\u754c"),(0,a.kt)("li",{parentName:"ul"},"\u4e0e\u60a8\u90e8\u7f72\u7684\u7a0b\u5e8f\u8fdb\u884c\u4ea4\u4e92")),(0,a.kt)("h2",{id:"\u539f\u751fsolana\u5f00\u53d1"},"\u539f\u751fSOLANA\u5f00\u53d1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The Rust layer cake"),(0,a.kt)("li",{parentName:"ul"},"\u6784\u5efa\u4e00\u4e2a\u7535\u5f71\u8bc4\u8bba\u7a0b\u5e8f"),(0,a.kt)("li",{parentName:"ul"},"\u4f7f\u7528Gage\u8fdb\u884c\u72b6\u6001\u7ba1\u7406"),(0,a.kt)("li",{parentName:"ul"},"\u72b6\u6001\u7ba1\u7406")),(0,a.kt)("h2",{id:"\u5b89\u5168\u548c\u9a8c\u8bc1"},"\u5b89\u5168\u548c\u9a8c\u8bc1"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u5b89\u5168\u4e0e\u4fdd\u969c"),(0,a.kt)("li",{parentName:"ul"},"\u9519\u8bef\u5904\u7406\u548c\u6570\u636e\u9a8c\u8bc1"),(0,a.kt)("li",{parentName:"ul"},"Secure our program")),(0,a.kt)("h2",{id:"nft\u8d28\u62bc"},"NFT\u8d28\u62bc"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u8d28\u62bc\u7684\u5de5\u4f5c\u539f\u7406"),(0,a.kt)("li",{parentName:"ul"},"\u5efa\u7acb\u4e00\u4e2aNFT\u8d28\u62bc\u8ba1\u5212")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.49e15d79.js b/assets/js/main.49e15d79.js deleted file mode 100644 index 255a4b3fa..000000000 --- a/assets/js/main.49e15d79.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.49e15d79.js.LICENSE.txt */ -(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"00660f19":[()=>n.e(2203).then(n.bind(n,7845)),"@site/docs/Solana-Co-Learn/module1/wallets-and-frontends/README.md",7845],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"02293396":[()=>n.e(1905).then(n.bind(n,3726)),"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README.md",3726],"0231789f":[()=>n.e(5932).then(n.bind(n,1177)),"@site/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README.md",1177],"0279d735":[()=>n.e(9673).then(n.bind(n,1287)),"@site/docs/Solana-Co-Learn/module2/README.md",1287],"04e84b79":[()=>n.e(7047).then(n.bind(n,6986)),"@site/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README.md",6986],"05970efd":[()=>n.e(6264).then(n.bind(n,2842)),"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README.md",2842],"07dea239":[()=>n.e(3948).then(n.bind(n,9816)),"@site/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README.md",9816],"0b59e1b8":[()=>n.e(950).then(n.bind(n,208)),"@site/docs/Solana-Co-Learn/module2/spl-token/the-token-program/README.md",208],"0e384e19":[()=>n.e(9671).then(n.bind(n,9881)),"@site/docs/intro.md",9881],"0e5a820c":[()=>n.e(83).then(n.bind(n,3945)),"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README.md",3945],"15911b08":[()=>n.e(5106).then(n.bind(n,7964)),"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README.md",7964],"16fd20c7":[()=>n.e(517).then(n.t.bind(n,7639,19)),"~blog/default/blog-tags-ibc-bf4.json",7639],17896441:[()=>Promise.all([n.e(532),n.e(1506),n.e(7918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1c315ff9":[()=>n.e(3061).then(n.bind(n,8789)),"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README.md",8789],"1ce18368":[()=>n.e(4547).then(n.bind(n,23)),"@site/docs/Solana-Co-Learn/module2/spl-token/token-metadata/README.md",23],"1f391b9e":[()=>Promise.all([n.e(532),n.e(1506),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"1fc16822":[()=>n.e(2828).then(n.bind(n,4352)),"@site/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README.md",4352],"253ecfa8":[()=>n.e(3417).then(n.bind(n,2056)),"@site/docs/Solana-Co-Learn/module3/native-solana-development/README.md",2056],"28898abe":[()=>n.e(2712).then(n.bind(n,6243)),"@site/docs/Solana-Co-Learn/module3/security-and-validation/README.md",6243],"299fc64b":[()=>n.e(821).then(n.bind(n,4188)),"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README.md",4188],"2a910045":[()=>n.e(1815).then(n.t.bind(n,2718,19)),"~blog/default/blog-tags-ibc-bf4-list.json",2718],"32205f1c":[()=>n.e(3603).then(n.t.bind(n,3769,19)),"/Users/davirain/solana/all-in-one-blockchain/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"32aaa719":[()=>n.e(4916).then(n.bind(n,4831)),"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README.md",4831],"3853220b":[()=>n.e(2664).then(n.bind(n,6151)),"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README.md",6151],"3895fba0":[()=>n.e(6636).then(n.bind(n,9125)),"@site/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README.md",9125],"38dec77c":[()=>n.e(7549).then(n.bind(n,1056)),"@site/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README.md",1056],"393be207":[()=>n.e(7414).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],"3f3a03c1":[()=>n.e(4451).then(n.t.bind(n,1721,19)),"~blog/default/blog-tags-blog-476-list.json",1721],"405ac2c3":[()=>n.e(274).then(n.t.bind(n,8057,19)),"~blog/default/blog-tags-solana-1b9-list.json",8057],"468416a0":[()=>n.e(5614).then(n.t.bind(n,9557,19)),"~blog/default/blog-tags-blockchain-bb4.json",9557],"492e7013":[()=>n.e(2102).then(n.bind(n,7710)),"@site/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README.md",7710],"4b5a10c1":[()=>n.e(1556).then(n.bind(n,2526)),"@site/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README.md",2526],"4cbf9b05":[()=>n.e(2769).then(n.bind(n,8055)),"@site/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello.md",8055],"4fc3eaac":[()=>n.e(43).then(n.bind(n,2214)),"@site/docs/Solana-Co-Learn/module1/wallet-usage/README.md",2214],"5c26d4ea":[()=>n.e(297).then(n.bind(n,7458)),"@site/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README.md",7458],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ef08b3b":[()=>n.e(2146).then(n.t.bind(n,5745,19)),"/Users/davirain/solana/all-in-one-blockchain/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"61cdf435":[()=>n.e(4334).then(n.bind(n,2977)),"@site/blog/2023-07-06.md",2977],"631037e5":[()=>n.e(801).then(n.t.bind(n,7064,19)),"~blog/default/blog-tags-blog-476.json",7064],"6360bfde":[()=>n.e(8036).then(n.bind(n,3543)),"@site/docs/Solana-Co-Learn/module4/README.md",3543],"664709d0":[()=>n.e(3555).then(n.bind(n,5176)),"@site/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/README.md",5176],"6875c492":[()=>Promise.all([n.e(532),n.e(1506),n.e(2529),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"6939f7f7":[()=>n.e(9536).then(n.bind(n,641)),"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/README.md",641],"697b977d":[()=>n.e(645).then(n.bind(n,544)),"@site/docs/Solana-Co-Learn/module1/local_program_development/local_program_development.md",544],"70ad3ff0":[()=>n.e(147).then(n.t.bind(n,3478,19)),"~blog/default/blog-tags-blockchain-bb4-list.json",3478],"711fc4ea":[()=>n.e(7664).then(n.bind(n,7119)),"@site/docs/Solana-Co-Learn/module3/nft-staking/README.md",7119],"759c7395":[()=>n.e(4895).then(n.t.bind(n,8855,19)),"~blog/default/blog-tags-solana-1b9.json",8855],"763c4032":[()=>n.e(5404).then(n.bind(n,7151)),"@site/docs/Solana-Co-Learn/module6/README.md",7151],"7a511f30":[()=>n.e(6260).then(n.bind(n,8260)),"@site/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README.md",8260],"7b4b11c5":[()=>n.e(3376).then(n.bind(n,4213)),"@site/blog/2023-07-06.md?truncated=true",4213],"7be9c390":[()=>n.e(210).then(n.bind(n,3750)),"@site/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/README.md",3750],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],"846341e5":[()=>n.e(3355).then(n.bind(n,6665)),"@site/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README.md",6665],"9096fd74":[()=>n.e(6214).then(n.bind(n,6998)),"@site/docs/Solana-Co-Learn/README.md",6998],"918f4956":[()=>n.e(9720).then(n.bind(n,8378)),"@site/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello.md",8378],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9aef0bec":[()=>n.e(3707).then(n.bind(n,3897)),"@site/docs/Solana-Co-Learn/modules/README.md",3897],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9f5c2a59":[()=>n.e(9962).then(n.bind(n,8456)),"@site/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README.md",8456],a4421f51:[()=>n.e(6989).then(n.bind(n,9819)),"@site/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello.md",9819],a5905e0d:[()=>n.e(1894).then(n.bind(n,940)),"@site/docs/Solana-Co-Learn/module1/README.md",940],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(1506),n.e(2529),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],a723cf16:[()=>n.e(2777).then(n.bind(n,3503)),"@site/docs/Solana-Co-Learn/module1/custom-instruction/README.md",3503],af284665:[()=>n.e(106).then(n.bind(n,5860)),"@site/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/README.md",5860],af2b610d:[()=>n.e(7729).then(n.bind(n,5400)),"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/README.md",5400],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b6baa538:[()=>n.e(7919).then(n.bind(n,4726)),"@site/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README.md",4726],b7de6482:[()=>n.e(5846).then(n.bind(n,1835)),"@site/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README.md",1835],be5b884f:[()=>n.e(4688).then(n.bind(n,5092)),"@site/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README.md",5092],c17a8821:[()=>n.e(6303).then(n.bind(n,6104)),"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README.md",6104],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],cad25036:[()=>n.e(7974).then(n.bind(n,7539)),"@site/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README.md",7539],ccc49370:[()=>Promise.all([n.e(532),n.e(1506),n.e(2529),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],ced71b19:[()=>n.e(9131).then(n.bind(n,7857)),"@site/src/pages/hello.js",7857],d41aa6b4:[()=>n.e(9390).then(n.bind(n,4303)),"@site/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/README.md",4303],d846cb9d:[()=>n.e(3096).then(n.bind(n,734)),"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README.md",734],d9f1fece:[()=>n.e(7539).then(n.bind(n,232)),"@site/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README.md",232],ddbb43e1:[()=>n.e(9592).then(n.bind(n,1805)),"@site/docs/Solana-Co-Learn/module1/client-side-development/README.md",1805],e7292380:[()=>n.e(7949).then(n.bind(n,5253)),"@site/docs/Solana-Co-Learn/module1/start-your-own-custom-project/README.md",5253],e9f74709:[()=>n.e(6742).then(n.bind(n,3904)),"@site/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README.md",3904],edb9b04a:[()=>n.e(4092).then(n.bind(n,2987)),"@site/docs/Solana-Co-Learn/module5/README.md",2987],eddf81a1:[()=>n.e(9314).then(n.bind(n,9993)),"@site/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README.md",9993],f18dbc91:[()=>n.e(1487).then(n.bind(n,2110)),"@site/docs/Solana-Co-Learn/module2/spl-token/README.md",2110],f4cf1efc:[()=>n.e(550).then(n.bind(n,2859)),"@site/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README.md",2859],f81bfa87:[()=>n.e(1946).then(n.t.bind(n,4469,19)),"/Users/davirain/solana/all-in-one-blockchain/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],f9b3936f:[()=>n.e(740).then(n.bind(n,8828)),"@site/docs/Solana-Co-Learn/module3/native-solana-development/state-management/README.md",8828],fa93d5c7:[()=>n.e(590).then(n.bind(n,9768)),"@site/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README.md",9768],fcc62127:[()=>n.e(1255).then(n.bind(n,9432)),"@site/docs/Solana-Co-Learn/module3/README.md",9432]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],g=(0,c.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/blog",component:f("/blog","8c7"),exact:!0},{path:"/blog/archive",component:f("/blog/archive","620"),exact:!0},{path:"/blog/first-blog-post",component:f("/blog/first-blog-post","60c"),exact:!0},{path:"/blog/tags",component:f("/blog/tags","b36"),exact:!0},{path:"/blog/tags/blockchain",component:f("/blog/tags/blockchain","e14"),exact:!0},{path:"/blog/tags/blog",component:f("/blog/tags/blog","289"),exact:!0},{path:"/blog/tags/ibc",component:f("/blog/tags/ibc","ad0"),exact:!0},{path:"/blog/tags/solana",component:f("/blog/tags/solana","20b"),exact:!0},{path:"/hello",component:f("/hello","b4a"),exact:!0},{path:"/markdown-page",component:f("/markdown-page","297"),exact:!0},{path:"/docs",component:f("/docs","504"),routes:[{path:"/docs/intro",component:f("/docs/intro","aed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/",component:f("/docs/Solana-Co-Learn/","a74"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/",component:f("/docs/Solana-Co-Learn/module1/","7fa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/client-side-development/",component:f("/docs/Solana-Co-Learn/module1/client-side-development/","e00"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/",component:f("/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/","694"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/",component:f("/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/","885"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/",component:f("/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/","c41"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/custom-instruction/",component:f("/docs/Solana-Co-Learn/module1/custom-instruction/","aba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/",component:f("/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/","cd0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/",component:f("/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/","959"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/",component:f("/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/","963"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/local_program_development/",component:f("/docs/Solana-Co-Learn/module1/local_program_development/","62f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello",component:f("/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello","6c4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello",component:f("/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello","1bb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello",component:f("/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello","552"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/",component:f("/docs/Solana-Co-Learn/module1/start-your-own-custom-project/","43d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/",component:f("/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/","2c8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/",component:f("/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/","aca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/wallet-usage/",component:f("/docs/Solana-Co-Learn/module1/wallet-usage/","c5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/",component:f("/docs/Solana-Co-Learn/module1/wallets-and-frontends/","ba0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/",component:f("/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/","4c3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/",component:f("/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/","f78"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/",component:f("/docs/Solana-Co-Learn/module2/","139"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/",component:f("/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/","cdf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/",component:f("/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/","39d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/",component:f("/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/","5a2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/",component:f("/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/","c5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/",component:f("/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/","762"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/",component:f("/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/","cec"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/",component:f("/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/","2b9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/",component:f("/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/","b3f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/",component:f("/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/","0ba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/",component:f("/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/","bdc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/",component:f("/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/","f99"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/",component:f("/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/","667"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/spl-token/",component:f("/docs/Solana-Co-Learn/module2/spl-token/","da6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/",component:f("/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/","407"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/",component:f("/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/","acd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/spl-token/the-token-program/",component:f("/docs/Solana-Co-Learn/module2/spl-token/the-token-program/","72f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module2/spl-token/token-metadata/",component:f("/docs/Solana-Co-Learn/module2/spl-token/token-metadata/","45d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/",component:f("/docs/Solana-Co-Learn/module3/","647"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/introduction-to-rust/",component:f("/docs/Solana-Co-Learn/module3/introduction-to-rust/","b6d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/",component:f("/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/","024"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/",component:f("/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/","bcf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/",component:f("/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/","918"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/native-solana-development/",component:f("/docs/Solana-Co-Learn/module3/native-solana-development/","17f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/",component:f("/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/","ce5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/native-solana-development/state-management/",component:f("/docs/Solana-Co-Learn/module3/native-solana-development/state-management/","ad2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/",component:f("/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/","279"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/nft-staking/",component:f("/docs/Solana-Co-Learn/module3/nft-staking/","4fb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/",component:f("/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/","47a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/",component:f("/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/","543"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/security-and-validation/",component:f("/docs/Solana-Co-Learn/module3/security-and-validation/","234"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/",component:f("/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/","4fe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/",component:f("/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/","66e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module4/",component:f("/docs/Solana-Co-Learn/module4/","935"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/",component:f("/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/","bfd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/",component:f("/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/","320"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/",component:f("/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/","c28"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module5/",component:f("/docs/Solana-Co-Learn/module5/","d0f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/module6/",component:f("/docs/Solana-Co-Learn/module6/","5ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/Solana-Co-Learn/modules/",component:f("/docs/Solana-Co-Learn/modules/","9ce"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"/",component:f("/","8f0"),exact:!0},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),g=n(2263),h=n(4996),b=n(6668),v=n(1944),y=n(4711),w=n(9727),E=n(3320),S=n(197);function k(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),a=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,c.TH)();return e+(0,h.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function _(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(C,null),r.createElement(k,null),r.createElement(S.Z,{tag:E.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const L=new Map;function x(e){if(L.has(e.pathname))return{...e,pathname:L.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return L.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return L.set(e.pathname,t),{...e,pathname:t}}var T=n(8934),A=n(8940);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),R("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const M=O,D="__docusaurus-base-url-issue-banner-container",I="__docusaurus-base-url-issue-banner",F="__docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return`\nwindow['${B}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${B}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[B]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,z(e))),r.createElement("div",{id:D}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(j,null):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,g.Z)(),i=(0,h.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var Z=n(4763);function H(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(Z.Z,null,r.createElement(A.M,null,r.createElement(T.t,null,r.createElement(f,null,r.createElement(U,null),r.createElement(_,null),r.createElement($,null),r.createElement(M,{location:x(t)},e)))))}var V=n(6887);const W=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var G=n(9670);const q=new Set,Y=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,X={prefetch(e){if(!(e=>!K()&&!Y.has(e)&&!q.has(e))(e))return!1;q.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(V).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,G.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?W(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!Y.has(e))(e)&&(Y.add(e),P(e))},Q=Object.freeze(X);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"intro","docs":[{"id":"intro","path":"/docs/intro","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/README","path":"/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/README","path":"/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/client-side-development/README","path":"/docs/Solana-Co-Learn/module1/client-side-development/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/README","path":"/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/README","path":"/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/custom-instruction/custom-instructions/README","path":"/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/custom-instruction/README","path":"/docs/Solana-Co-Learn/module1/custom-instruction/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/README","path":"/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/local_program_development/anchor_program_hello","path":"/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/local_program_development/local_program_development","path":"/docs/Solana-Co-Learn/module1/local_program_development/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/local_program_development/native_program_hello","path":"/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/local_program_development/solang_program_hello","path":"/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/README","path":"/docs/Solana-Co-Learn/module1/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/README","path":"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/README","path":"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/start-your-own-custom-project/README","path":"/docs/Solana-Co-Learn/module1/start-your-own-custom-project/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/wallet-usage/README","path":"/docs/Solana-Co-Learn/module1/wallet-usage/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/README","path":"/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/README","path":"/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module1/wallets-and-frontends/README","path":"/docs/Solana-Co-Learn/module1/wallets-and-frontends/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/README","path":"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/README","path":"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/README","path":"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/displayings-nfts-in-a-ui/README","path":"/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/README","path":"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/README","path":"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/README","path":"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/README","path":"/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/README","path":"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/README","path":"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/README","path":"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/README","path":"/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/README","path":"/docs/Solana-Co-Learn/module2/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/README","path":"/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/spl-token/mint-token-on-solana/README","path":"/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/spl-token/README","path":"/docs/Solana-Co-Learn/module2/spl-token/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/spl-token/the-token-program/README","path":"/docs/Solana-Co-Learn/module2/spl-token/the-token-program/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module2/spl-token/token-metadata/README","path":"/docs/Solana-Co-Learn/module2/spl-token/token-metadata/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/introduction-to-rust/hello-world/README","path":"/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/README","path":"/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/introduction-to-rust/README","path":"/docs/Solana-Co-Learn/module3/introduction-to-rust/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/README","path":"/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/README","path":"/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/native-solana-development/README","path":"/docs/Solana-Co-Learn/module3/native-solana-development/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/native-solana-development/state-management/README","path":"/docs/Solana-Co-Learn/module3/native-solana-development/state-management/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/README","path":"/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/README","path":"/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/nft-staking/how-staking-works/README","path":"/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/nft-staking/README","path":"/docs/Solana-Co-Learn/module3/nft-staking/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/README","path":"/docs/Solana-Co-Learn/module3/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/README","path":"/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/security-and-validation/README","path":"/docs/Solana-Co-Learn/module3/security-and-validation/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module3/security-and-validation/secure-our-program/README","path":"/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/README","path":"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/README","path":"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/README","path":"/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module4/README","path":"/docs/Solana-Co-Learn/module4/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module5/README","path":"/docs/Solana-Co-Learn/module5/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/module6/README","path":"/docs/Solana-Co-Learn/module6/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/modules/README","path":"/docs/Solana-Co-Learn/modules/","sidebar":"tutorialSidebar"},{"id":"Solana-Co-Learn/README","path":"/docs/Solana-Co-Learn/","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/intro","label":"Start"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.1"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(7961);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:E}=(0,d.C)(),S=(0,a.useContext)(c),k=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>k.current));const C=f||p;const _=(0,s.Z)(C),L=C?.replace("pathname://","");let x=void 0!==L?(T=L,b&&(e=>e.startsWith("/"))(T)?E(T):T):void 0;var T;x&&_&&(x=(0,i.applyTrailingSlash)(x,{trailingSlash:y,baseUrl:w}));const A=(0,a.useRef)(!1),R=n?o.OL:o.rU,N=u.Z.canUseIntersectionObserver,P=(0,a.useRef)(),O=()=>{A.current||null==x||(window.docusaurus.preload(x),A.current=!0)};(0,a.useEffect)((()=>(!N&&_&&null!=x&&window.docusaurus.prefetch(x),()=>{N&&P.current&&P.current.disconnect()})),[P,x,N,_]);const M=x?.startsWith("#")??!1,D=!x||!_||M;return D||h||S.collectLink(x),D?a.createElement("a",(0,r.Z)({ref:k,href:x},C&&!_&&{target:"_blank",rel:"noopener noreferrer"},v)):a.createElement(R,(0,r.Z)({},v,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{k.current=e,N&&e&&_&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=x&&window.docusaurus.prefetch(x))}))})),P.current.observe(e))},to:x},n&&{isActive:g,activeClassName:m}))}const p=a.forwardRef(f)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>f,_r:()=>c,Jo:()=>h,zh:()=>d,yW:()=>m,gB:()=>p});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(4461)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},7961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>dt});var r=n(7294),a=n(6010),o=n(4763),i=n(1944),l=n(7462),s=n(6550),u=n(5999),c=n(5936);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,u.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??m,{containerRef:n,onClick:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var h=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(g,{className:v.skipToContent})}var w=n(6668),E=n(9689);function S(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const k={closeButton:"closeButton_CVFx"};function C(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",k.closeButton,e.className)}),r.createElement(S,{width:14,height:14,strokeWidth:3.1}))}const _={content:"content_knG7"};function L(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const x={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,E.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:x.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:x.announcementBarPlaceholder}),r.createElement(L,{className:x.announcementBarContent}),i&&r.createElement(C,{onClick:n,className:x.announcementBarClose}))}var A=n(2961),R=n(2466);var N=n(902),P=n(3102);const O=r.createContext(null);function M(e){let{children:t}=e;const n=function(){const e=(0,A.e)(),t=(0,P.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(O.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function I(){const e=(0,r.useContext)(O);if(!e)throw new N.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=I();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var B=n(2949),z=n(2389);function j(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function $(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function Z(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,z.Z)(),s=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(U.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!l&&U.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(j,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),r.createElement($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})))}const H=r.memo(Z),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,B.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var G=n(1327);function q(){return r.createElement(G.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,A.e)();return r.createElement("button",{type:"button","aria-label":(0,u.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(S,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(q,null),r.createElement(W,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(9960),Q=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,Q.Z)(a),p=(0,Q.Z)(t),m=(0,Q.Z)(o,{forcePrependBaseUrl:!0}),g=i&&o&&!(0,J.Z)(o),h=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,g&&r.createElement(te.Z,u&&{width:12,height:12}))};return o?r.createElement(X.Z,(0,l.Z)({href:c?m:o},d,h)):r.createElement(X.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},d,h))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Ce,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(Ce,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ce;return r.createElement(a,n)}var pe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ge="iconLanguage_nlXk";var he=n(1875);const be={searchBox:"searchBox_ZlJk"};function ve(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,be.searchBox)},t)}var ye=n(143),we=n(2802);var Ee=n(373);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));const ke={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.Z)(),f=(0,pe.l)(),{search:p,hash:m}=(0,s.TH)(),g=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],h=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(fe,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:ge}),h),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ve,{className:n},r.createElement(he.Z,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),s=(0,we.vY)(t,a);return null===s?null:r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),s=(0,we.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,we.lO)(a)[0],s=t??i.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.Z)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,ye.Iw)(n),m=(0,ye.gB)(n),{savePreferredVersionName:g}=(0,Ee.J)(n),h=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??Se(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...i],b=(0,we.lO)(n)[0],v=t&&h.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:Se(b).path;return h.length<=1?r.createElement(oe,(0,l.Z)({},c,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,l.Z)({},c,{mobile:t,label:v,to:y,items:h,isActive:a?()=>!1:void 0}))}};function Ce(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=ke[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function _e(){const e=(0,A.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ce,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Le(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function xe(){const e=0===(0,w.L)().navbar.items.length,t=I();return r.createElement(r.Fragment,null,!e&&r.createElement(Le,{onClick:()=>t.hide()}),t.content)}function Te(){const e=(0,A.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(K,null),primaryMenu:r.createElement(_e,null),secondaryMenu:r.createElement(xe,null)}):null}const Ae={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Re(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ne(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,A.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ae.navbarHideable,!s&&Ae.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Re,{onClick:i.toggle}),r.createElement(Te,null))}var Pe=n(8780);const Oe={errorBoundaryError:"errorBoundaryError_a6uf"};function Me(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function De(e){let{error:t}=e;const n=(0,Pe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Oe.errorBoundaryError},n)}class Ie extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Fe="right";function Be(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function ze(){const{toggle:e,shown:t}=(0,A.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(Be,null))}const je={colorModeToggle:"colorModeToggle_DEke"};function $e(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Ie,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(Ce,e)))))}function Ue(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Ze(){const e=(0,A.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Ue,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(ze,null),r.createElement(q,null),r.createElement($e,{items:n})),right:r.createElement(r.Fragment,null,r.createElement($e,{items:a}),r.createElement(W,{className:je.colorModeToggle}),!o&&r.createElement(ve,null,r.createElement(he.Z,null)))})}function He(){return r.createElement(Ne,null,r.createElement(Ze,null))}function Ve(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,Q.Z)(n),c=(0,Q.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(X.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function We(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(Ve,{item:t}))}function Ge(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(We,{key:t,item:e})))))}function qe(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Ge,{key:t,column:e}))))}function Ye(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Ke(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ve,{item:t})}function Xe(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(Ke,{item:e}),t.length!==n+1&&r.createElement(Ye,null))))))}function Qe(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(qe,{columns:t}):r.createElement(Xe,{links:t})}var Je=n(941);const et={footerLogoLink:"footerLogoLink_BH7S"};function tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Je.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function nt(e){let{logo:t}=e;return t.href?r.createElement(X.Z,{href:t.href,className:et.footerLogoLink,target:t.target},r.createElement(tt,{logo:t})):r.createElement(tt,{logo:t})}function rt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function at(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function ot(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(at,{style:o,links:n&&n.length>0&&r.createElement(Qe,{links:n}),logo:a&&r.createElement(nt,{logo:a}),copyright:t&&r.createElement(rt,{copyright:t})})}const it=r.memo(ot),lt=(0,N.Qc)([B.S,E.pl,R.OC,Ee.L5,i.VC,function(e){let{children:t}=e;return r.createElement(P.n2,null,r.createElement(A.M,null,r.createElement(M,null,t)))}]);function st(e){let{children:t}=e;return r.createElement(lt,null,t)}function ut(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(Me,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(De,{error:t})))))}const ct={mainWrapper:"mainWrapper_z2l0"};function dt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,b.t)(),r.createElement(st,null,r.createElement(i.d,{title:s,description:u}),r.createElement(y,null),r.createElement(T,null),r.createElement(He,null),r.createElement("div",{id:d,className:(0,a.Z)(h.k.wrapper.main,ct.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(ut,e)},t)),!n&&r.createElement(it,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:u}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(u?.href||"/"),g=n?"":t,h=u?.alt??g;return a.createElement(o.Z,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:h,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,z:()=>h});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const l="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??l}`,height:`${t}px`}}function s(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.Z.canUseDOM)return e?u:c}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),i?.(n))},className:l},r)}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:l})):null}function h(e){let{lazy:t,...n}=e;const r=t?g:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),u="theme",c=(0,i.WA)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>h});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(2802),s=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function h(e){let{children:t}=e;return l.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(6550),l=(n(1688),n(902));function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>g,cE:()=>d,hI:()=>E,lO:()=>v,vY:()=>w,oz:()=>y,s1:()=>b});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(1116);function u(e){return Array.from(new Set(e))}var c=n(8596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.Mg)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function h(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,c.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,c.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function b(){const e=(0,s.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?h({sidebarItems:e.items,pathname:t}):null}function v(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=v(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=v(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(7294),n(1688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>L,ob:()=>p,PP:()=>T,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s{var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],g=n[2],h=n[3],b=n[4],v=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var E=null!=g&&null!=m&&m!==g,S="+"===y||"*"===y,k="?"===y||"*"===y,C=n[2]||c,_=b||v;r.push({name:h||o++,prefix:g||"",delimiter:C,optional:k,repeat:S,partial:E,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+s(C)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);k+=S.value.length,S=S.next){var C=S.value;if(t.length>e.length)return;if(!(C instanceof a)){var _,L=1;if(v){if(!(_=o(E,k,e,b))||_.index>=e.length)break;var x=_.index,T=_.index+_[0].length,A=k;for(A+=S.value.length;x>=A;)A+=(S=S.next).value.length;if(k=A-=S.value.length,S.value instanceof a)continue;for(var R=S;R!==t.tail&&(Ad.reach&&(d.reach=M);var D=S.prev;if(P&&(D=s(t,D,P),k+=P.length),u(t,D,L),S=s(t,D,new a(f,h?r.tokenize(N,h):N,y,N)),O&&s(t,S,O),L>1){var I={cause:f+","+m,reach:M};i(e,t,n,S.prev,k,I),d&&I.reach>d.reach&&(d.reach=I.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];g&&v.push.apply(v,i([g])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(v)):u.content=v}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},4279:()=>{Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean},2731:()=>{!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism)},6862:()=>{!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},767:()=>{!function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism)},9930:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},3358:()=>{!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},4461:(e,t,n)=>{var r={"./prism-c":4279,"./prism-cpp":2731,"./prism-powershell":6862,"./prism-rust":767,"./prism-toml":9930,"./prism-yaml":3358};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=4461},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n
+ + \ No newline at end of file diff --git a/blog/atom.xml b/blog/atom.xml index 10ba62f22..06ad47b20 100644 --- a/blog/atom.xml +++ b/blog/atom.xml @@ -1,16 +1,16 @@ - https://www.all-in-one-blockchain.xyz/blog + https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog All in One Solana Blog 2023-07-06T00:00:00.000Z https://github.com/jpmonette/feed - + All in One Solana Blog - https://www.all-in-one-blockchain.xyz/img/favicon.ico + https://www.all-in-one-blockchain.xyz/all-in-one-solana/img/favicon.ico <![CDATA[All in One Blockchain First Blog]]> - https://www.all-in-one-blockchain.xyz/blog/first-blog-post - + https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/first-blog-post + 2023-07-06T00:00:00.000Z Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

]]>
diff --git a/blog/first-blog-post/index.html b/blog/first-blog-post/index.html index 39ddb7743..3a8dd4be1 100644 --- a/blog/first-blog-post/index.html +++ b/blog/first-blog-post/index.html @@ -3,15 +3,15 @@ -All in One Blockchain First Blog | All in One Solana - - - +All in One Blockchain First Blog | All in One Solana + + +
-

All in One Blockchain First Blog

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

- - +

All in One Blockchain First Blog

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

+ + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html index 7ac59a9a8..2cf2113e0 100644 --- a/blog/index.html +++ b/blog/index.html @@ -3,15 +3,15 @@ -Blog | All in One Solana - - - +Blog | All in One Solana + + +
-

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

- - +

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

+ + \ No newline at end of file diff --git a/blog/rss.xml b/blog/rss.xml index fe00a0a56..72df2e69e 100644 --- a/blog/rss.xml +++ b/blog/rss.xml @@ -2,7 +2,7 @@ All in One Solana Blog - https://www.all-in-one-blockchain.xyz/blog + https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog All in One Solana Blog Thu, 06 Jul 2023 00:00:00 GMT https://validator.w3.org/feed/docs/rss2.html @@ -10,8 +10,8 @@ en <![CDATA[All in One Blockchain First Blog]]> - https://www.all-in-one-blockchain.xyz/blog/first-blog-post - https://www.all-in-one-blockchain.xyz/blog/first-blog-post + https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/first-blog-post + https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/first-blog-post Thu, 06 Jul 2023 00:00:00 GMT Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

]]>
diff --git a/blog/tags/blockchain/index.html b/blog/tags/blockchain/index.html index 219bd7b7c..9ade59597 100644 --- a/blog/tags/blockchain/index.html +++ b/blog/tags/blockchain/index.html @@ -3,15 +3,15 @@ -One post tagged with "blockchain" | All in One Solana - - - +One post tagged with "blockchain" | All in One Solana + + +
-

One post tagged with "blockchain"

View All Tags

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

- - +

One post tagged with "blockchain"

View All Tags

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

+ + \ No newline at end of file diff --git a/blog/tags/blog/index.html b/blog/tags/blog/index.html index f219eb342..f8a3918ed 100644 --- a/blog/tags/blog/index.html +++ b/blog/tags/blog/index.html @@ -3,15 +3,15 @@ -One post tagged with "blog" | All in One Solana - - - +One post tagged with "blog" | All in One Solana + + +
-

One post tagged with "blog"

View All Tags

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

- - +

One post tagged with "blog"

View All Tags

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

+ + \ No newline at end of file diff --git a/blog/tags/ibc/index.html b/blog/tags/ibc/index.html index 677362699..ffe659cb8 100644 --- a/blog/tags/ibc/index.html +++ b/blog/tags/ibc/index.html @@ -3,15 +3,15 @@ -One post tagged with "IBC" | All in One Solana - - - +One post tagged with "IBC" | All in One Solana + + +
-

One post tagged with "IBC"

View All Tags

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

- - +

One post tagged with "IBC"

View All Tags

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

+ + \ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html index e9f7cac22..d6128b884 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -3,15 +3,15 @@ -Tags | All in One Solana - - - +Tags | All in One Solana + + + - - +
+ + \ No newline at end of file diff --git a/blog/tags/solana/index.html b/blog/tags/solana/index.html index 7efb9f7e3..e0112c66d 100644 --- a/blog/tags/solana/index.html +++ b/blog/tags/solana/index.html @@ -3,15 +3,15 @@ -One post tagged with "solana" | All in One Solana - - - +One post tagged with "solana" | All in One Solana + + +
-

One post tagged with "solana"

View All Tags

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

- - +

One post tagged with "solana"

View All Tags

· 2 min read
Davirain

Welcome to our first blog post at All in One Blockchain! We're thrilled to embark on this journey with you, exploring the vast and exciting world of blockchain technology. In this post, we'll delve into the fundamentals of blockchain, focusing on two key players in the space: Solana and the Inter-Blockchain Communication (IBC) protocol.

Understanding Blockchain

Blockchain technology, at its core, is a decentralized and distributed digital ledger that records transactions across multiple computers. Its decentralized nature ensures that no single entity has control over the entire network, promoting transparency, security, and integrity of data.

Spotlight on Solana

Solana is a high-performance, permissionless blockchain that is fast gaining popularity in the crypto space. It's known for its incredible speed and low transaction costs, making it an attractive platform for decentralized applications (dApps).

One of Solana's key innovations is the Proof of History (PoH) consensus algorithm. Unlike traditional blockchain networks that rely on synchronized time across nodes, PoH allows each node to keep track of the time passed, which dramatically increases the network's overall efficiency.

Solana's architecture also includes other novel features like Tower BFT (a PBFT-inspired consensus algorithm), Turbine (a block propagation protocol), Gulf Stream (Mempool-less transaction forwarding protocol), and more. These features work together to make Solana one of the fastest and most secure blockchains in existence.

Inter-Blockchain Communication (IBC) Protocol

The Inter-Blockchain Communication (IBC) protocol is a crucial development in the blockchain ecosystem. It's a standard that allows different blockchain networks to communicate and transact with each other, overcoming the problem of interoperability.

IBC enables the transfer of any type of data or asset across different blockchains, which opens up a myriad of possibilities for cross-chain interactions. This is a significant step towards a fully interconnected, multi-chain blockchain ecosystem.

The Future of Blockchain

The world of blockchain is rapidly evolving, with new developments like Solana and IBC leading the way. As we continue to explore this space, we'll delve into more blockchain platforms, consensus algorithms, dApps, and other related topics.

Join us on this journey as we unravel the complexities of blockchain technology. Whether you're a seasoned developer, a crypto enthusiast, or a curious newcomer, there's always something new to learn in the dynamic world of blockchain.

Stay tuned for more insightful content, and don't hesitate to reach out if you have any questions or topics you'd like us to cover. Welcome aboard!

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/index.html b/docs/Solana-Co-Learn/index.html index db212e39b..0916d58e3 100644 --- a/docs/Solana-Co-Learn/index.html +++ b/docs/Solana-Co-Learn/index.html @@ -3,15 +3,15 @@ -Solana Co Learn | All in One Solana - - - +Solana Co Learn | All in One Solana + + +
-

Solana Co Learn

Module1: Solana Module1

客户端开发

钱包和前端

自定义指令

开始你自己的定制项目

Module2: Solana Module2

SPL token

NFTs + 使用Metaplex进行铸造

在用户界面中展示NFTs

创造神奇的网络货币并出售JPEG图片

Module3: Solana Module3

Introduction to Rust

Native Solana Development

Security and validation

NFT staking

Module4: Solana Module4

Local env setup and PDAs

Cross Program Invocations

Testing

Ship a staking app

Module5: Solana Module5

Introduction to Anchor

Programs in Anchor

Anchor on the front-end

A full-stack Anchor App

Module6: Solana Module6

Ship Week

Randomness

Finishing touches

Modules: Solana Modules

Beyond the Basics

  • Solana程序中的环境变量
  • Solana Pay
  • 版本化的事务和查找表
  • Rust过程宏

Solana程序安全

  • 如何处理程序安全模块
  • 签名人授权
  • Owner check
  • 账户数据匹配
  • 重新初始化攻击
  • 重复的可变账户
  • Type cosplay
  • Arbitrary CPIs
  • 碰撞种子规范化
  • 关闭账户和恢复攻击
  • PDA sharing

其他

  • 使用Solidity 编写Solana合约
    • Solidity 与PDAs
    • Solidity 与 CPIs
  • token2020 token如何发行
  • Compression NFT 如何发行
  • 如何在Solana中使用The Graph
  • Oracles Pyth sdk的使用
  • TipLink 如何使用
  • 如何在quicknode申请RPC endpoint
  • 如何在helius申请RPC endpoint
  • etc ...
- - +

Solana Co Learn

Module1: Solana Module1

客户端开发

钱包和前端

自定义指令

开始你自己的定制项目

Module2: Solana Module2

SPL token

NFTs + 使用Metaplex进行铸造

在用户界面中展示NFTs

创造神奇的网络货币并出售JPEG图片

Module3: Solana Module3

Introduction to Rust

Native Solana Development

Security and validation

NFT staking

Module4: Solana Module4

Local env setup and PDAs

Cross Program Invocations

Testing

Ship a staking app

Module5: Solana Module5

Introduction to Anchor

Programs in Anchor

Anchor on the front-end

A full-stack Anchor App

Module6: Solana Module6

Ship Week

Randomness

Finishing touches

Modules: Solana Modules

Beyond the Basics

  • Solana程序中的环境变量
  • Solana Pay
  • 版本化的事务和查找表
  • Rust过程宏

Solana程序安全

  • 如何处理程序安全模块
  • 签名人授权
  • Owner check
  • 账户数据匹配
  • 重新初始化攻击
  • 重复的可变账户
  • Type cosplay
  • Arbitrary CPIs
  • 碰撞种子规范化
  • 关闭账户和恢复攻击
  • PDA sharing

其他

  • 使用Solidity 编写Solana合约
    • Solidity 与PDAs
    • Solidity 与 CPIs
  • token2020 token如何发行
  • Compression NFT 如何发行
  • 如何在Solana中使用The Graph
  • Oracles Pyth sdk的使用
  • TipLink 如何使用
  • 如何在quicknode申请RPC endpoint
  • 如何在helius申请RPC endpoint
  • etc ...
+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/index.html b/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/index.html index cd1f97be5..dbe9cbe41 100644 --- a/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/index.html +++ b/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/index.html @@ -3,15 +3,15 @@ -📝 构建一个互动脚本 | All in One Solana - - - +📝 构建一个互动脚本 | All in One Solana + + +
-

📝 构建一个互动脚本

准备好戳一下Solana网络了吗?我们将编写一个脚本,生成一个密钥对,用devnet SOL资金进行充值,并与Solana网络上的现有程序进行交互。

这个程序是一个简单的“ping”计数器:我们击中它,它记录我们对它的ping,并增加一个计数器。我们以后会介绍Rust和我们自己的程序,现在我们将使用JS/TS。

🚧 在本地设置 Solana 客户端

让我们改变一下方式 - 我们将离开React/Next.js,在这里使用纯TypeScript构建一个本地客户端。这比搭建前端并构建大量的用户界面要快得多。你可以在一个单独的TS文件中工作,并异步运行它与网络进行交互。

在您的Solana工作区中创建一个新文件夹,并使用这个方便的命令来设置本地客户端:

npx create-solana-client solana-intro-client

如果它询问您是否要安装 create-solana-client 软件包,请说“是”。

现在只需导航到目录并在 VS Code 中启动它

cd solana-intro-client
code .

⚙ 设置客户端脚本

create-solana-client 的美妙之处在于我们可以立即开始编写客户端代码!跳转到 index.ts 并导入我们的依赖项并添加此 initializeKeypair 函数:

// We're adding these
import * as Web3 from '@solana/web3.js';
import * as fs from 'fs';
import dotenv from 'dotenv';
dotenv.config();

async function main() {
}

main()
.then(() => {
console.log('Finished successfully');
process.exit(0);
})
.catch((error) => {
console.log(error);
process.exit(1);
});

如果您在终端中运行 npm start ,您将看到脚本已运行!只需一个命令即可设置 Solana 客户端。

让我们添加一个 initializeKeypair 函数,如果我们没有密钥对,它将自动为我们创建一个密钥对。在导入之后添加以下内容:

async function initializeKeypair(connection: Web3.Connection): Promise<Web3.Keypair> {
if (!process.env.PRIVATE_KEY) {
console.log('Generating new keypair... 🗝️');
const signer = Web3.Keypair.generate();

console.log('Creating .env file');
fs.writeFileSync('.env', `PRIVATE_KEY=[${signer.secretKey.toString()}]`);

return signer;
}

const secret = JSON.parse(process.env.PRIVATE_KEY ?? '') as number[];
const secretKey = Uint8Array.from(secret);
const keypairFromSecret = Web3.Keypair.fromSecretKey(secretKey);
return keypairFromSecret;
}

这是一个非常智能的函数 - 它会检查您的 .env 文件中是否有私钥,如果没有,它就会创建一个!

您已经熟悉这里发生的一切 - 我们调用 Web3.Keypair.generate() 函数并将结果写入本地 dotenv 文件。创建后,我们将返回密钥对,以便我们可以在脚本的其余部分中使用它。

更新您的 main 函数并使用 npm start 运行脚本来测试它:

async function main() {
const connection = new Web3.Connection(Web3.clusterApiUrl('devnet'));
const signer = await initializeKeypair(connection);

console.log("Public key:", signer.publicKey.toBase58());
}

您应该在终端中看到类似这样的内容:

> solana-course-client@1.0.0 start
> ts-node src/index.ts

Generating new keypair... 🗝️
Creating .env file
Public key: jTAsqBrjsYp4uEJNmED5R66gHPnFW4wvQrbmFG3c4QS
Finished successfully

好的!如果您检查 .env 文件,您将看到一个字节格式的私钥!该密钥与文件一样保密。如果您将此文件推送到公共 GitHub 存储库,任何人都可以访问其中的资金,因此请确保您不要将其用于真正的货币用途,哈哈。

再次运行 npm start 将使用它而不是创建一个新的。

保持测试帐户独立非常重要,这就是为什么这个脚本特别酷的原因 - 它消除了创建和管理测试钱包的麻烦。

现在,如果我们也能自动获取 devnet SOL 就好了。哦等等,我们可以!

快来看看这个超酷的空投功能-

async function airdropSolIfNeeded(
signer: Web3.Keypair,
connection: Web3.Connection
) {
const balance = await connection.getBalance(signer.publicKey);
console.log('Current balance is', balance / Web3.LAMPORTS_PER_SOL, 'SOL');

// 1 SOL should be enough for almost anything you wanna do
if (balance / Web3.LAMPORTS_PER_SOL < 1) {
// You can only get up to 2 SOL per request
console.log('Airdropping 1 SOL');
const airdropSignature = await connection.requestAirdrop(
signer.publicKey,
Web3.LAMPORTS_PER_SOL
);

const latestBlockhash = await connection.getLatestBlockhash();

await connection.confirmTransaction({
blockhash: latestBlockhash.blockhash,
lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
signature: airdropSignature,
});

const newBalance = await connection.getBalance(signer.publicKey);
console.log('New balance is', newBalance / Web3.LAMPORTS_PER_SOL, 'SOL');
}
}

这可能看起来有点压力山大,但实际上你对这里发生的一切都了如指掌!我们正在利用我们的老朋友 getBalance 来检查我们是否破产,如果是的话,我们就会使用 requestAidrop 函数让钱滚滚而来。

区块哈希和区块高度是区块标识符,用于向网络传达我们是最新的并且不会发送过时的交易。

不过,不要尝试循环运行它 - 水龙头有一个冷却时间,如果你继续向它发送垃圾邮件,请求将会失败,哈哈。

确保在创建/获取密钥对后更新 initializeKeypair 函数以调用空投。

// When generating a keypair
await airdropSolIfNeeded(signer, connection);

// When creating it from the secret key
await airdropSolIfNeeded(keypairFromSecret, connection);

现在,如果您 npm run start ,您将看到空投:

Current balance is 0 SOL
Airdropping 1 SOL
New balance is 1 SOL
Public key: 7Fw3bXskk5eonycvET6BSufxAsuNudvuxF7MMnS8KMqX

我们准备好了 rrrrrrrrrrrrumble 🥊

🖱 调用链上程序

是时候让我们的客户发挥作用了。我们将向Solana网络上的现有程序写入数据。人们认为Solana的开发只是关于用Rust编写程序。不对!大部分区块链开发是与现有程序进行交互。

你可以构建数百个只与已有程序进行交互的应用。这就是乐趣开始的地方!我们会保持简单 - 我们的客户端会发送一个计数器程序,该程序会递增一个计数器。你将告诉网络上的每个人你是一个开发者。

我们需要告诉客户它将与哪些程序进行交互。从顶部开始,将这些地址添加在导入语句的下方:

const PROGRAM_ID = new Web3.PublicKey("ChT1B39WKLS8qUrkLvFDXMhEJ4F1XZzwUNHUt4AU9aVa")
const PROGRAM_DATA_PUBLIC_KEY = new Web3.PublicKey("Ah9K7dQ8EHaZqcAsgBW8w37yN2eAy3koFmUn4x3CJtod")

PROGRAM_IDping程序本身的地址。 PROGRAM_DATA_PUBLIC_KEY 是存储程序数据的帐户的地址。请记住 - 可执行代码和状态数据单独存储在 Solana 上!

然后添加此函数以在任何地方 ping 程序:

async function pingProgram(connection: Web3.Connection, payer: Web3.Keypair) {
const transaction = new Web3.Transaction()
const instruction = new Web3.TransactionInstruction({
// Instructions need 3 things

// 1. The public keys of all the accounts the instruction will read/write
keys: [
{
pubkey: PROGRAM_DATA_PUBLIC_KEY,
isSigner: false,
isWritable: true
}
],

// 2. The ID of the program this instruction will be sent to
programId: PROGRAM_ID

// 3. Data - in this case, there's none!
})

transaction.add(instruction)
const transactionSignature = await Web3.sendAndConfirmTransaction(connection, transaction, [payer])

console.log(
`Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

这并不像看起来那么复杂!你已经知道了这一部分

  • 我们进行一笔交易
  • 我们制作一份指令
  • 我们将指令添加到交易中
  • 我们将交易发送到网络!

查看上面的代码注释 - 我回顾一下指令的三个部分。

这里的重点是 keys 值 - 它是一个包含每个账户元数据的数组,这个指令将从中读取或写入。在我们的情况下,我告诉你这个指令将处理哪些账户。

你需要知道这将是什么 - 你可以通过阅读程序本身或其文档来了解。如果你不知道这一点,就无法与程序进行交互,因为指令将无效。你将发送一个会触及数据账户的交易,但你不会告诉运行时是哪个账户,所以它将被丢弃。

可以将其想象为尝试开车前往没有 GPS 的地址。您知道自己想去哪里,但不知道到达那里的路线。

由于此写入不需要数据帐户的签名,因此我们将 isSigner 设置为 falseisWritabletrue,因为该帐户正在被写入!

通过告诉网络我们需要与哪些帐户交互以及我们是否正在向它们写入数据,Solana 运行时就知道可以并行运行哪些事务。这就是 Solana 如此之快的部分原因!

将此函数调用 await pingProgram(connection, signer) 添加到 main() 并使用 npm start 运行脚本。访问记录的资源管理器链接,您将在页面底部看到您编写的数据(您可以忽略其他所有内容)-

您刚刚将数据写入区块链。那有多容易?

这可能看起来很简单,但您确实已经取得了成功。当推特上的每个人都在大喊猴子图片时,你正在建造GGGGGGGGGGGGGGGGGG。您在本节中学到的内容 - 从 Solana 网络读取和写入数据,足以制作价值 1 万美元的产品。想象一下在这个项目结束时你能做什么 🤘

🚢 Ship 挑战 - 一种SOL转账脚本

既然我们已经一起学习了如何将交易发送到网络,现在轮到你独立尝试了。

按照上一步骤的类似流程,从头开始创建一个脚本,使您能够在Devnet上将SOL从一个账户转移到另一个账户。确保打印出交易签名,以便您可以在Solana Explorer上查看。

想想到目前为止你学到了什么 -

  • 将数据写入网络是通过事务进行的
  • 交易需要指令
  • 指令告诉网络它们触及哪些程序以及它们的功能
  • 通过系统程序进行SOL的转移(嗯,我想知道它叫什么。🤔 转移?)

您在这里所需要做的就是找出确切的函数名称是什么以及指令应该是什么样子。我会从谷歌开始:P

附:如果您确定已经弄清楚了,但转账仍然失败,则可能是您转账太少 - 尝试至少转账 0.1 SOL。

像往常一样,在引用解决方案代码之前尝试自己执行此操作。当您确实需要参考解决方案时,请查看此处。 👀

- - +

📝 构建一个互动脚本

准备好戳一下Solana网络了吗?我们将编写一个脚本,生成一个密钥对,用devnet SOL资金进行充值,并与Solana网络上的现有程序进行交互。

这个程序是一个简单的“ping”计数器:我们击中它,它记录我们对它的ping,并增加一个计数器。我们以后会介绍Rust和我们自己的程序,现在我们将使用JS/TS。

🚧 在本地设置 Solana 客户端

让我们改变一下方式 - 我们将离开React/Next.js,在这里使用纯TypeScript构建一个本地客户端。这比搭建前端并构建大量的用户界面要快得多。你可以在一个单独的TS文件中工作,并异步运行它与网络进行交互。

在您的Solana工作区中创建一个新文件夹,并使用这个方便的命令来设置本地客户端:

npx create-solana-client solana-intro-client

如果它询问您是否要安装 create-solana-client 软件包,请说“是”。

现在只需导航到目录并在 VS Code 中启动它

cd solana-intro-client
code .

⚙ 设置客户端脚本

create-solana-client 的美妙之处在于我们可以立即开始编写客户端代码!跳转到 index.ts 并导入我们的依赖项并添加此 initializeKeypair 函数:

// We're adding these
import * as Web3 from '@solana/web3.js';
import * as fs from 'fs';
import dotenv from 'dotenv';
dotenv.config();

async function main() {
}

main()
.then(() => {
console.log('Finished successfully');
process.exit(0);
})
.catch((error) => {
console.log(error);
process.exit(1);
});

如果您在终端中运行 npm start ,您将看到脚本已运行!只需一个命令即可设置 Solana 客户端。

让我们添加一个 initializeKeypair 函数,如果我们没有密钥对,它将自动为我们创建一个密钥对。在导入之后添加以下内容:

async function initializeKeypair(connection: Web3.Connection): Promise<Web3.Keypair> {
if (!process.env.PRIVATE_KEY) {
console.log('Generating new keypair... 🗝️');
const signer = Web3.Keypair.generate();

console.log('Creating .env file');
fs.writeFileSync('.env', `PRIVATE_KEY=[${signer.secretKey.toString()}]`);

return signer;
}

const secret = JSON.parse(process.env.PRIVATE_KEY ?? '') as number[];
const secretKey = Uint8Array.from(secret);
const keypairFromSecret = Web3.Keypair.fromSecretKey(secretKey);
return keypairFromSecret;
}

这是一个非常智能的函数 - 它会检查您的 .env 文件中是否有私钥,如果没有,它就会创建一个!

您已经熟悉这里发生的一切 - 我们调用 Web3.Keypair.generate() 函数并将结果写入本地 dotenv 文件。创建后,我们将返回密钥对,以便我们可以在脚本的其余部分中使用它。

更新您的 main 函数并使用 npm start 运行脚本来测试它:

async function main() {
const connection = new Web3.Connection(Web3.clusterApiUrl('devnet'));
const signer = await initializeKeypair(connection);

console.log("Public key:", signer.publicKey.toBase58());
}

您应该在终端中看到类似这样的内容:

> solana-course-client@1.0.0 start
> ts-node src/index.ts

Generating new keypair... 🗝️
Creating .env file
Public key: jTAsqBrjsYp4uEJNmED5R66gHPnFW4wvQrbmFG3c4QS
Finished successfully

好的!如果您检查 .env 文件,您将看到一个字节格式的私钥!该密钥与文件一样保密。如果您将此文件推送到公共 GitHub 存储库,任何人都可以访问其中的资金,因此请确保您不要将其用于真正的货币用途,哈哈。

再次运行 npm start 将使用它而不是创建一个新的。

保持测试帐户独立非常重要,这就是为什么这个脚本特别酷的原因 - 它消除了创建和管理测试钱包的麻烦。

现在,如果我们也能自动获取 devnet SOL 就好了。哦等等,我们可以!

快来看看这个超酷的空投功能-

async function airdropSolIfNeeded(
signer: Web3.Keypair,
connection: Web3.Connection
) {
const balance = await connection.getBalance(signer.publicKey);
console.log('Current balance is', balance / Web3.LAMPORTS_PER_SOL, 'SOL');

// 1 SOL should be enough for almost anything you wanna do
if (balance / Web3.LAMPORTS_PER_SOL < 1) {
// You can only get up to 2 SOL per request
console.log('Airdropping 1 SOL');
const airdropSignature = await connection.requestAirdrop(
signer.publicKey,
Web3.LAMPORTS_PER_SOL
);

const latestBlockhash = await connection.getLatestBlockhash();

await connection.confirmTransaction({
blockhash: latestBlockhash.blockhash,
lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
signature: airdropSignature,
});

const newBalance = await connection.getBalance(signer.publicKey);
console.log('New balance is', newBalance / Web3.LAMPORTS_PER_SOL, 'SOL');
}
}

这可能看起来有点压力山大,但实际上你对这里发生的一切都了如指掌!我们正在利用我们的老朋友 getBalance 来检查我们是否破产,如果是的话,我们就会使用 requestAidrop 函数让钱滚滚而来。

区块哈希和区块高度是区块标识符,用于向网络传达我们是最新的并且不会发送过时的交易。

不过,不要尝试循环运行它 - 水龙头有一个冷却时间,如果你继续向它发送垃圾邮件,请求将会失败,哈哈。

确保在创建/获取密钥对后更新 initializeKeypair 函数以调用空投。

// When generating a keypair
await airdropSolIfNeeded(signer, connection);

// When creating it from the secret key
await airdropSolIfNeeded(keypairFromSecret, connection);

现在,如果您 npm run start ,您将看到空投:

Current balance is 0 SOL
Airdropping 1 SOL
New balance is 1 SOL
Public key: 7Fw3bXskk5eonycvET6BSufxAsuNudvuxF7MMnS8KMqX

我们准备好了 rrrrrrrrrrrrumble 🥊

🖱 调用链上程序

是时候让我们的客户发挥作用了。我们将向Solana网络上的现有程序写入数据。人们认为Solana的开发只是关于用Rust编写程序。不对!大部分区块链开发是与现有程序进行交互。

你可以构建数百个只与已有程序进行交互的应用。这就是乐趣开始的地方!我们会保持简单 - 我们的客户端会发送一个计数器程序,该程序会递增一个计数器。你将告诉网络上的每个人你是一个开发者。

我们需要告诉客户它将与哪些程序进行交互。从顶部开始,将这些地址添加在导入语句的下方:

const PROGRAM_ID = new Web3.PublicKey("ChT1B39WKLS8qUrkLvFDXMhEJ4F1XZzwUNHUt4AU9aVa")
const PROGRAM_DATA_PUBLIC_KEY = new Web3.PublicKey("Ah9K7dQ8EHaZqcAsgBW8w37yN2eAy3koFmUn4x3CJtod")

PROGRAM_IDping程序本身的地址。 PROGRAM_DATA_PUBLIC_KEY 是存储程序数据的帐户的地址。请记住 - 可执行代码和状态数据单独存储在 Solana 上!

然后添加此函数以在任何地方 ping 程序:

async function pingProgram(connection: Web3.Connection, payer: Web3.Keypair) {
const transaction = new Web3.Transaction()
const instruction = new Web3.TransactionInstruction({
// Instructions need 3 things

// 1. The public keys of all the accounts the instruction will read/write
keys: [
{
pubkey: PROGRAM_DATA_PUBLIC_KEY,
isSigner: false,
isWritable: true
}
],

// 2. The ID of the program this instruction will be sent to
programId: PROGRAM_ID

// 3. Data - in this case, there's none!
})

transaction.add(instruction)
const transactionSignature = await Web3.sendAndConfirmTransaction(connection, transaction, [payer])

console.log(
`Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

这并不像看起来那么复杂!你已经知道了这一部分

  • 我们进行一笔交易
  • 我们制作一份指令
  • 我们将指令添加到交易中
  • 我们将交易发送到网络!

查看上面的代码注释 - 我回顾一下指令的三个部分。

这里的重点是 keys 值 - 它是一个包含每个账户元数据的数组,这个指令将从中读取或写入。在我们的情况下,我告诉你这个指令将处理哪些账户。

你需要知道这将是什么 - 你可以通过阅读程序本身或其文档来了解。如果你不知道这一点,就无法与程序进行交互,因为指令将无效。你将发送一个会触及数据账户的交易,但你不会告诉运行时是哪个账户,所以它将被丢弃。

可以将其想象为尝试开车前往没有 GPS 的地址。您知道自己想去哪里,但不知道到达那里的路线。

由于此写入不需要数据帐户的签名,因此我们将 isSigner 设置为 falseisWritabletrue,因为该帐户正在被写入!

通过告诉网络我们需要与哪些帐户交互以及我们是否正在向它们写入数据,Solana 运行时就知道可以并行运行哪些事务。这就是 Solana 如此之快的部分原因!

将此函数调用 await pingProgram(connection, signer) 添加到 main() 并使用 npm start 运行脚本。访问记录的资源管理器链接,您将在页面底部看到您编写的数据(您可以忽略其他所有内容)-

您刚刚将数据写入区块链。那有多容易?

这可能看起来很简单,但您确实已经取得了成功。当推特上的每个人都在大喊猴子图片时,你正在建造GGGGGGGGGGGGGGGGGG。您在本节中学到的内容 - 从 Solana 网络读取和写入数据,足以制作价值 1 万美元的产品。想象一下在这个项目结束时你能做什么 🤘

🚢 Ship 挑战 - 一种SOL转账脚本

既然我们已经一起学习了如何将交易发送到网络,现在轮到你独立尝试了。

按照上一步骤的类似流程,从头开始创建一个脚本,使您能够在Devnet上将SOL从一个账户转移到另一个账户。确保打印出交易签名,以便您可以在Solana Explorer上查看。

想想到目前为止你学到了什么 -

  • 将数据写入网络是通过事务进行的
  • 交易需要指令
  • 指令告诉网络它们触及哪些程序以及它们的功能
  • 通过系统程序进行SOL的转移(嗯,我想知道它叫什么。🤔 转移?)

您在这里所需要做的就是找出确切的函数名称是什么以及指令应该是什么样子。我会从谷歌开始:P

附:如果您确定已经弄清楚了,但转账仍然失败,则可能是您转账太少 - 尝试至少转账 0.1 SOL。

像往常一样,在引用解决方案代码之前尝试自己执行此操作。当您确实需要参考解决方案时,请查看此处。 👀

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/client-side-development/index.html b/docs/Solana-Co-Learn/module1/client-side-development/index.html index 671114640..aa3c204d3 100644 --- a/docs/Solana-Co-Learn/module1/client-side-development/index.html +++ b/docs/Solana-Co-Learn/module1/client-side-development/index.html @@ -3,15 +3,15 @@ -客户端开发 | All in One Solana - - - +客户端开发 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/index.html b/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/index.html index 1a0992744..2f5d55496 100644 --- a/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/index.html +++ b/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/index.html @@ -3,15 +3,15 @@ -从 Solana 🤓 区块链读取数据 | All in One Solana - - - +从 Solana 🤓 区块链读取数据 | All in One Solana + + +
-

从 Solana 🤓 区块链读取数据

是时候回到过去了。回到幼儿园的时光。还记得你学到的第一件事是什么吗?字母表。一旦你征服了全部26个字母,你就学会了阅读。这是你成为Solana开发者之旅的起点。阅读英语的独特技能使你成为了现在这个能够咀嚼知识的超级大脑。

时候再次行动了。我们将从你的幼儿园老师应该教授的地方开始——从区块链中读取数据。

👜 Solana上的账户

从Solana字母表开始,我们有A代表账户。我们从账户开始,因为Solana上的智能合约,也被称为“程序”,是无状态的——意味着它们除了代码之外不存储任何东西。一切都发生在账户中,所以它们对Solana来说至关重要,它们用于存储、合约和本地区块链程序。

Solana 上有三种类型的账户

  • 数据帐户 - 这些存储数据, LOL
  • 程序帐户 - 这些存储可执行程序(又称智能合约)
  • 原生账户 - 这些用于核心区块链功能,例如权益、投票

本地账户(native account)是区块链运行所需的,我们稍后会详细介绍。现在,我们只需要处理数据和程序账户。

在数据账户中,您还有两种进一步的类型

  • 系统拥有的帐户
  • PDA(程序派生地址)帐户

我们很快就会介绍这些到底是什么™️,现在就跟着一起走吧。

每个账户都有一些你应该了解的字段:

FIELD描述
lamports该账户拥有的lamports数量
owner这个账户的所有者程序
executable这个账户成是否可以处理指令
data这个账户存储的数据的字节码
rent_epoch下一个需要付租金的epoch(代)

我们现在只关注我们需要了解的事情,所以如果有些东西不太明白,就继续前进吧 - 我们会边进行下去边填补空白。

Lamport是Solana的最小单位。如果你熟悉以太坊生态系统,这有点像Gwei。一个Lamport等于0.000000001 SOL,所以这个字段告诉我们账户拥有多少SOL。

每个账户都有一个公钥 - 它就像账户的地址。你知道你的钱包有一个地址,用来接收那些辣辣的NFT吗?同样的道理!Solana地址只是base58编码的字符串。

executable 是一个布尔字段,告诉我们该帐户是否包含可执行数据。数据是存储在帐户中的内容,租金我们稍后会支付!

现在让我们先从简单的事情开始吧 :)

📫 从网络中读取

好的,我们知道什么是账户,那么我们如何读取它们呢?我们将使用一个叫做 JSON RPC 终端点的东西!看看这个图表,你将扮演客户端的角色,在 Solana 网络中尝试读取信息。

您可以通过API调用JSON RPC来获取您想要的内容,它会与网络进行通信并返回给您所需的数据。

如果我们想要获取账户的余额,API调用将如下所示

async function getBalanceUsingJSONRPC(address: string): Promise<number> {
const url = clusterApiUrl('devnet')
console.log(url);
return fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"jsonrpc": "2.0",
"id": 1,
"method": "getBalance",
"params": [
address
]
})
}).then(response => response.json())
.then(json => {
if (json.error) {
throw json.error
}

return json['result']['value'] as number;
})
.catch(error => {
throw error
})
}

这里发生了一堆事情。我们正在进行一个POST请求,请求体中有特定的参数告诉RPC要做什么。我们需要指定RPC的版本、id、方法,本例中是getBalance,以及该方法所需的参数,本例中只有address。

我们有一堆针对一个非常简单的方法的样板代码,所以我们可以使用Solana的Web3.js SDK。以下是所需的内容:

async function getBalanceUsingWeb3(address: PublicKey): Promise<number> {
const connection = new Connection(clusterApiUrl('devnet'));
return connection.getBalance(address);
}

这不是很漂亮吗?我们只需要这三行代码就能获取到某人的Solana余额。想象一下,如果获取任何人的银行余额也是这么简单的话。

现在你知道如何从Solana上的账户读取数据了!我知道这可能看起来微不足道,但只要使用这个函数,你就可以获取Solana上任何账户的余额。想象一下,能够获取地球上任何银行账户的余额,这就是它的强大之处

🤑 构建一个余额获取器

是时候构建一个通用的余额获取器了(假设整个宇宙都在Solana上)。这将是一个简单但功能强大的应用程序,可以获取Solana上任何账户的余额。

在你的工作区域创建一个文件夹。我将我的放在桌面上。克隆起始库并进行设置:

git clone https://github.com/RustyCab/solana-intro-frontend.git
cd solana-intro-frontend
git checkout starter
npm i

这是一个简单的 Next.js 应用程序,因此一旦安装了所有依赖项,您就可以在终端中使用 npm run dev 启动它。您应该在localhost上看到此内容:

我们为您提供了一个简单的Next.js应用程序,并添加了一些样式。如果您在地址栏中输入内容并点击“检查SOL余额”按钮,您将看到1,000 SOL的余额。是时候让它正常工作了。

首先,你想要安装Solana/web3.js库:

npm install @solana/web3.js

这将为我们提供一个非常简单的函数来获取余额。转到 index.tsx 并将其导入到顶部:

import * as web3 from '@solana/web3.js'

接下来,我们将着手处理 addressSubmittedHandler 函数。在这里,我们首先要做的是将地址从 string 转换为公钥。记住 - 地址实际上并不是一个字符串,在JS中我们只是将其表示为一个字符串。

const addressSubmittedHandler = (address: string) => {
const key = new web3.PublicKey(address);
setAddress(address)
setBalance(1000)
}

这将验证您传入的内容是否实际上是一个 Solana 地址。现在,如果您在地址字段中输入的内容不是一个密钥,您将会看到应用程序崩溃。不错!

现在我们要使用密钥,我们将建立一个新的连接到JSON RPC。通过这个连接,我们将使用 getBalance 函数,并使用 setBalance 设置结果!这是完成的函数:

const addressSubmittedHandler = (address: string) => {
const key = new web3.PublicKey(address);
setAddress(key.toBase58())

const connection = new web3.Connection(web3.clusterApiUrl('devnet'))

connection.getBalance(key).then(balance => {
setBalance(balance / web3.LAMPORTS_PER_SOL)
})
}

这里有一些新东西

  • 我们正在使用 key.toBase58 设置地址。这是Solana地址的字符串编码。
  • 我们正在连接到 devnet 网络。有三个网络 - 主网、测试网和开发网。我们将在开发网上进行所有操作。
  • 我们正在将余额从Lamports转换为SOL - 余额以Lamports返回,而不是SOL。

我们完成了!如果你在这里粘贴一个地址,你就会看到余额。确保你的账户上有开发网络的 SOL!如果没有,你可以使用我的账户来测试你的应用 - B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS

这个还不错,但是如果地址搞错了,就会出现一个很糟糕的错误。我们来添加一些错误处理来解决这个问题。

const addressSubmittedHandler = (address: string) => {
try {
setAddress(address)
const key = new web3.PublicKey(address)
const connection = new web3.Connection(web3.clusterApiUrl('devnet'))
connection.getBalance(key).then(balance => {
setBalance(balance / web3.LAMPORTS_PER_SOL)
})
} catch (error) {
setAddress('')
setBalance(0)
alert(error)
}
}

现在你应该会收到一个提示了 :D

哇,你刚刚发布了你的第一个Solana应用。加油!

🚢 Ship 挑战

让我们通过一个小挑战来考验一下你的知识。从你刚刚完成的应用开始,向用户界面添加另一行项目,显示输入的地址是否为可执行账户。

要确定一个账户是否可执行,您需要:

  1. 使用方法 getAccountInfo 获取包含账户信息的JSON对象
  2. 检查其属性以确定是否可执行
  3. useState 中添加另一个调用,它允许您从账户信息中设置 executable 属性值,并在用户界面中显示它

这是一个可用于测试的账户地址 - ComputeBudget111111111111111111111111111111

在你自己努力尝试之前,不要看答案!这个很简单!

完成后,请查看此处的挑战解决分支的参考资料。

- - +

从 Solana 🤓 区块链读取数据

是时候回到过去了。回到幼儿园的时光。还记得你学到的第一件事是什么吗?字母表。一旦你征服了全部26个字母,你就学会了阅读。这是你成为Solana开发者之旅的起点。阅读英语的独特技能使你成为了现在这个能够咀嚼知识的超级大脑。

时候再次行动了。我们将从你的幼儿园老师应该教授的地方开始——从区块链中读取数据。

👜 Solana上的账户

从Solana字母表开始,我们有A代表账户。我们从账户开始,因为Solana上的智能合约,也被称为“程序”,是无状态的——意味着它们除了代码之外不存储任何东西。一切都发生在账户中,所以它们对Solana来说至关重要,它们用于存储、合约和本地区块链程序。

Solana 上有三种类型的账户

  • 数据帐户 - 这些存储数据, LOL
  • 程序帐户 - 这些存储可执行程序(又称智能合约)
  • 原生账户 - 这些用于核心区块链功能,例如权益、投票

本地账户(native account)是区块链运行所需的,我们稍后会详细介绍。现在,我们只需要处理数据和程序账户。

在数据账户中,您还有两种进一步的类型

  • 系统拥有的帐户
  • PDA(程序派生地址)帐户

我们很快就会介绍这些到底是什么™️,现在就跟着一起走吧。

每个账户都有一些你应该了解的字段:

FIELD描述
lamports该账户拥有的lamports数量
owner这个账户的所有者程序
executable这个账户成是否可以处理指令
data这个账户存储的数据的字节码
rent_epoch下一个需要付租金的epoch(代)

我们现在只关注我们需要了解的事情,所以如果有些东西不太明白,就继续前进吧 - 我们会边进行下去边填补空白。

Lamport是Solana的最小单位。如果你熟悉以太坊生态系统,这有点像Gwei。一个Lamport等于0.000000001 SOL,所以这个字段告诉我们账户拥有多少SOL。

每个账户都有一个公钥 - 它就像账户的地址。你知道你的钱包有一个地址,用来接收那些辣辣的NFT吗?同样的道理!Solana地址只是base58编码的字符串。

executable 是一个布尔字段,告诉我们该帐户是否包含可执行数据。数据是存储在帐户中的内容,租金我们稍后会支付!

现在让我们先从简单的事情开始吧 :)

📫 从网络中读取

好的,我们知道什么是账户,那么我们如何读取它们呢?我们将使用一个叫做 JSON RPC 终端点的东西!看看这个图表,你将扮演客户端的角色,在 Solana 网络中尝试读取信息。

您可以通过API调用JSON RPC来获取您想要的内容,它会与网络进行通信并返回给您所需的数据。

如果我们想要获取账户的余额,API调用将如下所示

async function getBalanceUsingJSONRPC(address: string): Promise<number> {
const url = clusterApiUrl('devnet')
console.log(url);
return fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"jsonrpc": "2.0",
"id": 1,
"method": "getBalance",
"params": [
address
]
})
}).then(response => response.json())
.then(json => {
if (json.error) {
throw json.error
}

return json['result']['value'] as number;
})
.catch(error => {
throw error
})
}

这里发生了一堆事情。我们正在进行一个POST请求,请求体中有特定的参数告诉RPC要做什么。我们需要指定RPC的版本、id、方法,本例中是getBalance,以及该方法所需的参数,本例中只有address。

我们有一堆针对一个非常简单的方法的样板代码,所以我们可以使用Solana的Web3.js SDK。以下是所需的内容:

async function getBalanceUsingWeb3(address: PublicKey): Promise<number> {
const connection = new Connection(clusterApiUrl('devnet'));
return connection.getBalance(address);
}

这不是很漂亮吗?我们只需要这三行代码就能获取到某人的Solana余额。想象一下,如果获取任何人的银行余额也是这么简单的话。

现在你知道如何从Solana上的账户读取数据了!我知道这可能看起来微不足道,但只要使用这个函数,你就可以获取Solana上任何账户的余额。想象一下,能够获取地球上任何银行账户的余额,这就是它的强大之处

🤑 构建一个余额获取器

是时候构建一个通用的余额获取器了(假设整个宇宙都在Solana上)。这将是一个简单但功能强大的应用程序,可以获取Solana上任何账户的余额。

在你的工作区域创建一个文件夹。我将我的放在桌面上。克隆起始库并进行设置:

git clone https://github.com/RustyCab/solana-intro-frontend.git
cd solana-intro-frontend
git checkout starter
npm i

这是一个简单的 Next.js 应用程序,因此一旦安装了所有依赖项,您就可以在终端中使用 npm run dev 启动它。您应该在localhost上看到此内容:

我们为您提供了一个简单的Next.js应用程序,并添加了一些样式。如果您在地址栏中输入内容并点击“检查SOL余额”按钮,您将看到1,000 SOL的余额。是时候让它正常工作了。

首先,你想要安装Solana/web3.js库:

npm install @solana/web3.js

这将为我们提供一个非常简单的函数来获取余额。转到 index.tsx 并将其导入到顶部:

import * as web3 from '@solana/web3.js'

接下来,我们将着手处理 addressSubmittedHandler 函数。在这里,我们首先要做的是将地址从 string 转换为公钥。记住 - 地址实际上并不是一个字符串,在JS中我们只是将其表示为一个字符串。

const addressSubmittedHandler = (address: string) => {
const key = new web3.PublicKey(address);
setAddress(address)
setBalance(1000)
}

这将验证您传入的内容是否实际上是一个 Solana 地址。现在,如果您在地址字段中输入的内容不是一个密钥,您将会看到应用程序崩溃。不错!

现在我们要使用密钥,我们将建立一个新的连接到JSON RPC。通过这个连接,我们将使用 getBalance 函数,并使用 setBalance 设置结果!这是完成的函数:

const addressSubmittedHandler = (address: string) => {
const key = new web3.PublicKey(address);
setAddress(key.toBase58())

const connection = new web3.Connection(web3.clusterApiUrl('devnet'))

connection.getBalance(key).then(balance => {
setBalance(balance / web3.LAMPORTS_PER_SOL)
})
}

这里有一些新东西

  • 我们正在使用 key.toBase58 设置地址。这是Solana地址的字符串编码。
  • 我们正在连接到 devnet 网络。有三个网络 - 主网、测试网和开发网。我们将在开发网上进行所有操作。
  • 我们正在将余额从Lamports转换为SOL - 余额以Lamports返回,而不是SOL。

我们完成了!如果你在这里粘贴一个地址,你就会看到余额。确保你的账户上有开发网络的 SOL!如果没有,你可以使用我的账户来测试你的应用 - B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS

这个还不错,但是如果地址搞错了,就会出现一个很糟糕的错误。我们来添加一些错误处理来解决这个问题。

const addressSubmittedHandler = (address: string) => {
try {
setAddress(address)
const key = new web3.PublicKey(address)
const connection = new web3.Connection(web3.clusterApiUrl('devnet'))
connection.getBalance(key).then(balance => {
setBalance(balance / web3.LAMPORTS_PER_SOL)
})
} catch (error) {
setAddress('')
setBalance(0)
alert(error)
}
}

现在你应该会收到一个提示了 :D

哇,你刚刚发布了你的第一个Solana应用。加油!

🚢 Ship 挑战

让我们通过一个小挑战来考验一下你的知识。从你刚刚完成的应用开始,向用户界面添加另一行项目,显示输入的地址是否为可执行账户。

要确定一个账户是否可执行,您需要:

  1. 使用方法 getAccountInfo 获取包含账户信息的JSON对象
  2. 检查其属性以确定是否可执行
  3. useState 中添加另一个调用,它允许您从账户信息中设置 executable 属性值,并在用户界面中显示它

这是一个可用于测试的账户地址 - ComputeBudget111111111111111111111111111111

在你自己努力尝试之前,不要看答案!这个很简单!

完成后,请查看此处的挑战解决分支的参考资料。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/index.html b/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/index.html index 497a0b672..76f520830 100644 --- a/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/index.html +++ b/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/index.html @@ -3,15 +3,15 @@ -✍将数据写入区块链 | All in One Solana - - - +✍将数据写入区块链 | All in One Solana + + +
-

✍将数据写入区块链

是时候毕业了幼儿园。我们对阅读了如指掌 - 你只需对JSON RPC端点进行API调用。让我们来写入区块链吧!

🔐 密钥对

要将数据写入区块链,需要提交交易。可以将其视为数据写入命令,如果不满足某些条件,则可以拒绝该命令。

为了理解交易及其工作原理,您需要知道什么是密钥对。顾名思义,这是一对密钥 - 一个是公共的,另一个是私有的。公钥指向网络上帐户的地址,每个公钥都有一个相应的私钥/秘密密钥。

Web3.js 库有几个用于处理密钥对的辅助函数。您可以生成密钥对并使用它们来获取公钥或私钥。

// Create a new keypair
const ownerKeypair = Keypair.generate()

// Get the public key (address)
const publicKey = ownerKeypair.publicKey

// Get the secret key
const secretKey = ownerKeypair.secretKey

密钥可以有几种不同的格式

  1. 助记词——这是最常见的
pill tomorrow foster begin walnut borrow virtual kick shift mutual shoe scatter
  1. bs58 字符串 - 钱包有时会导出该字符串
5MaiiCavjCmn9Hs1o3eznqDEhRwxo7pXiAYez7keQUviUkauRiTMD8DrESdrNjN8zd9mTmVhRvBJeg5vhyvgrAhG
  1. Bytes - 编写代码时,我们通常将原始字节作为数字数组处理
[ 174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56, 222, 53, 138, 189, 224, 216, 117,173, 10, 149, 53, 45, 73, 251, 237, 246, 15, 185, 186, 82, 177, 240, 148, 69, 241, 227, 167, 80, 141, 89, 240, 121, 121, 35, 172, 247, 68, 251, 226, 218, 48, 63, 176, 109, 168, 89, 238, 135, ]

如果您已经有想要使用的密钥对,则可以使用 Keypair.fromSecretKey() 函数从密钥创建 Keypair 对象。

当涉及到主网时,您将面临真实的金钱和真实的后果。花时间研究管理秘密的各种方法是值得的。您可能不想使用 .env 变量注入密钥。这里有一篇很好的读物

//private key as an array of bytes
const secret = JSON.parse(process.env.PRIVATE_KEY ?? "") as number[]
const secretKey = Uint8Array.from(secret)
const keypairFromSecretKey = Keypair.fromSecretKey(secretKey)

我们在这里所做的是以字节格式获取私钥并将其解析为数字数组,然后将其转换为 uint 数组。我们使用这个 uint 数组来创建密钥对。您不需要知道它是如何工作的,但您可以在此处此处阅读更多相关信息。

好吧。现在您对 Solana 密钥对的了解比 98% 的 Solana 开发人员还要多 🕶️

回到交易城。

所有对Solana网络上的数据的修改都是通过交易进行的。所有交易都与网络上的程序进行交互 - 这些程序可以是系统程序或用户构建的程序。交易告诉程序它们想要通过一系列指令做什么,如果它们是有效的,程序就会执行这些操作!

这些指示看起来像什么鬼东西?它们包括:

  1. 您打算调用的程序的标识符
  2. 将要读取和/或写入的账户数组
  3. 以字节数组形式结构化的数据,根据被调用的程序进行指定

如果这感觉很多,别担心,随着我们开始,一切都会明朗起来的!

🚆 创建并发送一笔交易

让我们进行一笔交易。我们将调用系统程序来转移一些SOL。由于我们正在与系统程序进行交互,web3.js库中有一些辅助函数,使这变得非常简单!

const transaction = new Transaction()

const sendSolInstruction = SystemProgram.transfer({
fromPubkey: sender,
toPubkey: recipient,
lamports: LAMPORTS_PER_SOL * amount
})

transaction.add(sendSolInstruction)

这就是创建转账交易所需的全部!您可以向一笔交易添加多条指令,它们将按顺序执行。我们稍后会尝试这个😈

web3.js 库还提供了发送交易的功能。以下是我们发送交易的方式:

const signature = sendAndConfirmTransaction(
connection,
transaction,
[senderKeypair]
)

你在这里了解一切 - 连接是我们通过 JSON RPC 与网络进行通信的方式。交易是我们刚刚使用转账指令创建的事务。最后一个参数是签名者的数组。这些是“签署”事务的密钥对,以便 Solana 运行时和你发送事务的程序知道谁授权了该事务。某些交易需要多方签名,所以这里不总是一个地址。

签名是必要的,这样我们才能进行授权的更改。由于此交易将SOL从一个账户转移到另一个账户,我们需要证明我们控制着要发送的账户。

现在你已经了解了所有关于交易的内容,以及我提到的“条件”是什么 :)

✍ 指令

我们在上次的交易中有点走捷径。当与非本地程序或不在web3库中构建的程序一起工作时,我们需要非常明确我们所创建的指令。这是我们需要传递给构造函数以创建指令的类型。看一下吧

export type TransactionInstructionCtorFields = {
keys: Array<AccountMeta>;
programId: PublicKey;
data?: Buffer;
};

本质上,指令包含:

  • AccountMeta 类型的键数组
  • 您调用的程序的公钥/地址
  • 可选 - 包含要传递给程序的数据的 Buffer

Keys开始-该数组中的每个对象代表一个将在事务执行期间读取或写入的帐户。这样节点就知道哪些账户将参与交易,从而加快速度!这意味着您需要了解正在调用的程序的行为,并确保提供数组中所有必要的帐户。

Keys数组中的每个对象必须包含以下内容:

  • pubkey - 账户的公钥
  • isSigner - 一个布尔值,表示该帐户是否是交易的签名者
  • isWritable - 一个布尔值,表示在交易执行期间是否写入帐户

programId 字段是相当不言自明的:它是与您想要交互的程序关联的公钥。得知您想要与谁交谈!

我们暂时不会考虑数据字段,将来会重新审视它。

下面是实际操作中的示例:

async function callProgram(
connection: web3.Connection,
payer: web3.Keypair,
programId: web3.PublicKey,
programDataAccount: web3.PublicKey
) {
const instruction = new web3.TransactionInstruction({
// We only have one key here
keys: [
{
pubkey: programDataAccount,
isSigner: false,
isWritable: true
},
],

// The program we're interacting with
programId

// We don't have any data here!
})

const sig = await web3.sendAndConfirmTransaction(
connection,
new web3.Transaction().add(instruction),
[payer]
)
}

没那么难!我们得到了这个:P

⛽ 交易费用

唯一我们还没有讨论的事情:费用。Solana的费用非常低,你可以忽略它们!可惜作为开发者,我们必须关注它们哈哈。Solana的费用行为类似于以太坊等EVM链。每次你提交一笔交易,网络上的某个人提供空间和处理能力来实现它。费用激励人们提供这些空间和处理能力。

需要注意的主要事项是,在交易的签名者数组中,第一个签名者始终负责支付交易费用。如果你没有足够的SOL会怎么样?交易将被取消!

当你在devnet或本地主机上时,你可以使用CLI中的 solana airdrop 来获取devnet SOL。你还可以使用SPL代币水龙头来获取SPL代币(我们稍后会了解这些是什么:P)。

- - +

✍将数据写入区块链

是时候毕业了幼儿园。我们对阅读了如指掌 - 你只需对JSON RPC端点进行API调用。让我们来写入区块链吧!

🔐 密钥对

要将数据写入区块链,需要提交交易。可以将其视为数据写入命令,如果不满足某些条件,则可以拒绝该命令。

为了理解交易及其工作原理,您需要知道什么是密钥对。顾名思义,这是一对密钥 - 一个是公共的,另一个是私有的。公钥指向网络上帐户的地址,每个公钥都有一个相应的私钥/秘密密钥。

Web3.js 库有几个用于处理密钥对的辅助函数。您可以生成密钥对并使用它们来获取公钥或私钥。

// Create a new keypair
const ownerKeypair = Keypair.generate()

// Get the public key (address)
const publicKey = ownerKeypair.publicKey

// Get the secret key
const secretKey = ownerKeypair.secretKey

密钥可以有几种不同的格式

  1. 助记词——这是最常见的
pill tomorrow foster begin walnut borrow virtual kick shift mutual shoe scatter
  1. bs58 字符串 - 钱包有时会导出该字符串
5MaiiCavjCmn9Hs1o3eznqDEhRwxo7pXiAYez7keQUviUkauRiTMD8DrESdrNjN8zd9mTmVhRvBJeg5vhyvgrAhG
  1. Bytes - 编写代码时,我们通常将原始字节作为数字数组处理
[ 174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31, 56, 222, 53, 138, 189, 224, 216, 117,173, 10, 149, 53, 45, 73, 251, 237, 246, 15, 185, 186, 82, 177, 240, 148, 69, 241, 227, 167, 80, 141, 89, 240, 121, 121, 35, 172, 247, 68, 251, 226, 218, 48, 63, 176, 109, 168, 89, 238, 135, ]

如果您已经有想要使用的密钥对,则可以使用 Keypair.fromSecretKey() 函数从密钥创建 Keypair 对象。

当涉及到主网时,您将面临真实的金钱和真实的后果。花时间研究管理秘密的各种方法是值得的。您可能不想使用 .env 变量注入密钥。这里有一篇很好的读物

//private key as an array of bytes
const secret = JSON.parse(process.env.PRIVATE_KEY ?? "") as number[]
const secretKey = Uint8Array.from(secret)
const keypairFromSecretKey = Keypair.fromSecretKey(secretKey)

我们在这里所做的是以字节格式获取私钥并将其解析为数字数组,然后将其转换为 uint 数组。我们使用这个 uint 数组来创建密钥对。您不需要知道它是如何工作的,但您可以在此处此处阅读更多相关信息。

好吧。现在您对 Solana 密钥对的了解比 98% 的 Solana 开发人员还要多 🕶️

回到交易城。

所有对Solana网络上的数据的修改都是通过交易进行的。所有交易都与网络上的程序进行交互 - 这些程序可以是系统程序或用户构建的程序。交易告诉程序它们想要通过一系列指令做什么,如果它们是有效的,程序就会执行这些操作!

这些指示看起来像什么鬼东西?它们包括:

  1. 您打算调用的程序的标识符
  2. 将要读取和/或写入的账户数组
  3. 以字节数组形式结构化的数据,根据被调用的程序进行指定

如果这感觉很多,别担心,随着我们开始,一切都会明朗起来的!

🚆 创建并发送一笔交易

让我们进行一笔交易。我们将调用系统程序来转移一些SOL。由于我们正在与系统程序进行交互,web3.js库中有一些辅助函数,使这变得非常简单!

const transaction = new Transaction()

const sendSolInstruction = SystemProgram.transfer({
fromPubkey: sender,
toPubkey: recipient,
lamports: LAMPORTS_PER_SOL * amount
})

transaction.add(sendSolInstruction)

这就是创建转账交易所需的全部!您可以向一笔交易添加多条指令,它们将按顺序执行。我们稍后会尝试这个😈

web3.js 库还提供了发送交易的功能。以下是我们发送交易的方式:

const signature = sendAndConfirmTransaction(
connection,
transaction,
[senderKeypair]
)

你在这里了解一切 - 连接是我们通过 JSON RPC 与网络进行通信的方式。交易是我们刚刚使用转账指令创建的事务。最后一个参数是签名者的数组。这些是“签署”事务的密钥对,以便 Solana 运行时和你发送事务的程序知道谁授权了该事务。某些交易需要多方签名,所以这里不总是一个地址。

签名是必要的,这样我们才能进行授权的更改。由于此交易将SOL从一个账户转移到另一个账户,我们需要证明我们控制着要发送的账户。

现在你已经了解了所有关于交易的内容,以及我提到的“条件”是什么 :)

✍ 指令

我们在上次的交易中有点走捷径。当与非本地程序或不在web3库中构建的程序一起工作时,我们需要非常明确我们所创建的指令。这是我们需要传递给构造函数以创建指令的类型。看一下吧

export type TransactionInstructionCtorFields = {
keys: Array<AccountMeta>;
programId: PublicKey;
data?: Buffer;
};

本质上,指令包含:

  • AccountMeta 类型的键数组
  • 您调用的程序的公钥/地址
  • 可选 - 包含要传递给程序的数据的 Buffer

Keys开始-该数组中的每个对象代表一个将在事务执行期间读取或写入的帐户。这样节点就知道哪些账户将参与交易,从而加快速度!这意味着您需要了解正在调用的程序的行为,并确保提供数组中所有必要的帐户。

Keys数组中的每个对象必须包含以下内容:

  • pubkey - 账户的公钥
  • isSigner - 一个布尔值,表示该帐户是否是交易的签名者
  • isWritable - 一个布尔值,表示在交易执行期间是否写入帐户

programId 字段是相当不言自明的:它是与您想要交互的程序关联的公钥。得知您想要与谁交谈!

我们暂时不会考虑数据字段,将来会重新审视它。

下面是实际操作中的示例:

async function callProgram(
connection: web3.Connection,
payer: web3.Keypair,
programId: web3.PublicKey,
programDataAccount: web3.PublicKey
) {
const instruction = new web3.TransactionInstruction({
// We only have one key here
keys: [
{
pubkey: programDataAccount,
isSigner: false,
isWritable: true
},
],

// The program we're interacting with
programId

// We don't have any data here!
})

const sig = await web3.sendAndConfirmTransaction(
connection,
new web3.Transaction().add(instruction),
[payer]
)
}

没那么难!我们得到了这个:P

⛽ 交易费用

唯一我们还没有讨论的事情:费用。Solana的费用非常低,你可以忽略它们!可惜作为开发者,我们必须关注它们哈哈。Solana的费用行为类似于以太坊等EVM链。每次你提交一笔交易,网络上的某个人提供空间和处理能力来实现它。费用激励人们提供这些空间和处理能力。

需要注意的主要事项是,在交易的签名者数组中,第一个签名者始终负责支付交易费用。如果你没有足够的SOL会怎么样?交易将被取消!

当你在devnet或本地主机上时,你可以使用CLI中的 solana airdrop 来获取devnet SOL。你还可以使用SPL代币水龙头来获取SPL代币(我们稍后会了解这些是什么:P)。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/index.html b/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/index.html index 0f51d8716..af01537b6 100644 --- a/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/index.html +++ b/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/index.html @@ -3,16 +3,16 @@ -🎥 构建一个电影评论应用 | All in One Solana - - - +🎥 构建一个电影评论应用 | All in One Solana + + +
-

🎥 构建一个电影评论应用

现在我们已经完成了钱包连接的设置,让我们让我们的ping按钮真正有用起来吧!为了将所有内容整合在一起,我们将构建一个基于区块链的电影评论应用——它将允许任何人提交他们最喜欢的电影的评论,有点类似于烂番茄网站。

在你的Solana工作空间中设置起始代码

git clone https://github.com/RustyCab/solana-movie-frontend.git
cd solana-movie-frontend
git checkout starter
npm i

如果您运行 npm run dev 您应该在 localhost:3000 上看到以下内容:

这是一个普通的 Next.js 应用程序,安装了一些模板组件和一些 Solana 依赖项,以帮助您节省时间。那里有一些模拟评论,请查看各个组件以感受该应用程序。

您会注意到我们已将钱包上下文提供程序从 _app.tsx 移至其自己的组件。它的工作原理是一样的,只是将其与更大的应用程序分开,性能更高。应用程序现在所做的就是将您的评论记录到控制台中,我们将在 Form.tsx 中设置 handleTransactionSubmit 函数。我们走吧呜呜呜呜

🗺 定义架构

序列化的第一步是为我们要序列化的数据创建一个模式/映射。我们需要告诉Borsh数据将被称为什么以及每个项目的大小。

首先安装 borsh ,在终端中运行:

npm install @project-serum/borsh --force

接下来前往 Movie.ts 导入 borsh 并在 Movie 类中添加架构(不要复制粘贴此内容):

// We're importing borsh
import * as borsh from '@project-serum/borsh'

export class Movie {
title: string;
rating: number;
description: string;

// The constructor and the mocks will remain the same
constructor(title: string, rating: number, description: string) {}
static mocks: Movie[] = []

// Here's our schema!
borshInstructionSchema = borsh.struct([
borsh.u8('variant'),
borsh.str('title'),
borsh.u8('rating'),
borsh.str('description'),
])

}

电影评论程序期望指令数据包含:

    1. variant 作为无符号的 8 位整数,表示应执行哪条指令(换句话说,应调用程序上的哪个函数)。
    1. title 作为表示您正在查看的电影标题的字符串。
    1. rating 作为无符号 8 位整数,表示您对正在评论的电影的评分(满分 5 分)。
    1. description 作为一个字符串,表示您为电影留下的评论的书面部分。

模式需要与程序期望的匹配 - 包括结构中项目的顺序。当程序读取您的数据时,它将按照定义的顺序进行反序列化,如果您的顺序不同,它创建的数据将无效。由于我们正在使用已部署的程序,我已经给您提供了模式。通常,您会阅读文档或自己查看程序代码!

🌭 创建serialize方法

现在我们知道数据是什么样子,我们需要编写将其序列化的方法。将其添加到 Movie 类中架构的正下方:

serialize(): Buffer {
const buffer = Buffer.alloc(1000)
this.borshInstructionSchema.encode({ ...this, variant: 0 }, buffer)
return buffer.slice(0, this.borshInstructionSchema.getSpan(buffer))
}

首先,我们创建一个超大缓冲区 - 这个缓冲区为 1000 字节。为什么是 1000 字节?因为我知道它足以容纳我想要的所有东西,并在最后留下额外的空间。

接下来,我们使用创建的模式对数据进行编码。 encode 接受两个值 - 我们想要编码的数据以及我们想要存储它的位置。 this 指的是我们所在的当前对象 - 因此我们解构电影对象并将其与 ...this 一起传递,就像传递 { title, rating, description, variant } 一样。

最后 - 我们删除缓冲区中的额外空间。 getSpan 有点像 array.length - 它根据模式为我们提供缓冲区中最后使用的项目的索引,因此我们的缓冲区只包含我们需要的数据,而不包含其他数据。

这是我的最终 Movie.ts 的样子:

import * as borsh from '@project-serum/borsh'

export class Movie {
title: string;
rating: number;
description: string;

constructor(title: string, rating: number, description: string) {
this.title = title;
this.rating = rating;
this.description = description;
}

static mocks: Movie[] = [
new Movie('The Shawshank Redemption', 5, `For a movie shot entirely in prison where there is no hope at all, Shawshank redemption's main message and purpose is to remind us of hope, that even in the darkest places hope exists, and only needs someone to find it. Combine this message with a brilliant screenplay, lovely characters, and Martin freeman, and you get a movie that can teach you a lesson every time you watch it. An all-time Classic!!!`),
new Movie('The Godfather', 5, `One of Hollywood's greatest critical and commercial successes, The Godfather gets everything right; not only did the movie transcend expectations, it established new benchmarks for American cinema.`),
new Movie('The Godfather: Part II', 4, `The Godfather: Part II is a continuation of the saga of the late Italian-American crime boss, Francis Ford Coppola, and his son, Vito Corleone. The story follows the continuing saga of the Corleone family as they attempt to successfully start a new life for themselves after years of crime and corruption.`),
new Movie('The Dark Knight', 5, `The Dark Knight is a 2008 superhero film directed, produced, and co-written by Christopher Nolan. Batman, in his darkest hour, faces his greatest challenge yet: he must become the symbol of the opposite of the Batmanian order, the League of Shadows.`),
]

borshInstructionSchema = borsh.struct([
borsh.u8('variant'),
borsh.str('title'),
borsh.u8('rating'),
borsh.str('description'),
])

serialize(): Buffer {
const buffer = Buffer.alloc(1000)
this.borshInstructionSchema.encode({ ...this, variant: 0 }, buffer)
return buffer.slice(0, this.borshInstructionSchema.getSpan(buffer))
}
}

就是这样!我们已经完成了序列化部分。来回顾一下几部电影吧🍿

🤝 用数据创建交易

拼图的最后一块就是获取用户的数据,使用我们刚刚创建的方法进行序列化,并用它创建一个交易。

首先更新 Form.tsx 中的导入:

import { FC } from 'react'
import { Movie } from '../models/Movie'
import { useState } from 'react'
import { Box, Button, FormControl, FormLabel, Input, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, Textarea } from '@chakra-ui/react'
import * as web3 from '@solana/web3.js'
import { useConnection, useWallet } from '@solana/wallet-adapter-react'

我们需要在 handleSubmit 函数之前建立 RPC 连接并获取钱包详细信息:

const { connection } = useConnection();
const { publicKey, sendTransaction } = useWallet();

现在是重点, handleTransactionSubmit 函数。除了序列化位之外,这对于您之前的交易看起来非常熟悉:进行交易、制定指令、提交交易。

前半部分如下所示:

const handleTransactionSubmit = async (movie: Movie) => {
if (!publicKey) {
alert('Please connect your wallet!')
return
}

const buffer = movie.serialize()
const transaction = new web3.Transaction()

const [pda] = await web3.PublicKey.findProgramAddress(
[publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)
)
}

除了 pda 之外,你应该都能认识到这些。回想一下指令的要求。它需要与之交互的程序ID,可选的数据,以及它将从中读取或写入的账户列表。由于我们要将数据提交到网络上进行存储,将会创建一个新的账户来存储它(记住《海绵宝宝》中的Patrick - 程序是无状态的,一切都在账户中)。

Patrick在提到PDA(程序派生地址)!这是一个用来存储我们电影评论的账户。你可能会开始注意到,我们遇到了经典的“先有鸡还是先有蛋”的情况...

我们需要知道帐户地址才能进行有效交易,并且需要处理交易才能创建帐户。解决方案?一个理论蛋。如果交易创建者和程序都使用相同的过程来选择地址,我们可以在交易处理之前导出地址。

这就是 web3.PublicKey.findProgramAddress 方法正在做的事情。它接受两个变量:种子和生成种子的程序(电影评论程序)。在我们的例子中,种子是发件人的地址和电影的标题。通过这个应用程序,我告诉您种子要求,通常您要么阅读文档,查看程序代码,要么对其进行逆向工程。

要完成 handleTransactionSubmit 功能,您所需要做的就是创建一条指令并发送它,以下是完整代码:

const handleTransactionSubmit = async (movie: Movie) => {
if (!publicKey) {
alert('Please connect your wallet!')
return
}

const buffer = movie.serialize()
const transaction = new web3.Transaction()

const [pda] = await web3.PublicKey.findProgramAddress(
[publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)
)

const instruction = new web3.TransactionInstruction({
keys: [
{
// Your account will pay the fees, so it's writing to the network
pubkey: publicKey,
isSigner: true,
isWritable: false,
},
{
// The PDA will store the movie review
pubkey: pda,
isSigner: false,
isWritable: true
},
{
// The system program will be used for creating the PDA
pubkey: web3.SystemProgram.programId,
isSigner: false,
isWritable: false
}
],
// Here's the most important part!
data: buffer,
programId: new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)
})

transaction.add(instruction)

try {
let txid = await sendTransaction(transaction, connection)
console.log(`Transaction submitted: https://explorer.solana.com/tx/${txid}?cluster=devnet`)
} catch (e) {
alert(JSON.stringify(e))
}
}

仔细阅读代码注释,我会解释为什么我们需要指令键数组中的每个地址。

就这样了!确保你的钱包在开发网络上,并且你有开发网络的SOL,然后前往 localhost:3000 。提交评论并访问控制台中记录的浏览器链接。向下滚动到底,你会看到你的电影名称以及其他一些内容:

哇。您刚刚将自定义数据写入 Solana 网络。

给自己一个鼓励,这可不是简单的事情!到这个阶段,可能有些人已经退出了这个项目,给他们一些动力,展示一下你所建立的东西!如果你已经走到这一步,我毫不怀疑你会一直坚持到最后 :)

🚢 船舶挑战

是时候让大脑多折几道皱纹了 🧠

继续创建一个应用程序,让 Solana Core 中的构建者进行自我介绍!我们将在这个地址 HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf 处使用 Solana 程序。它最终看起来与电影评论应用程序类似:

起始代码

您可以设置使用

git clone https://github.com/RustyCab/solana-student-intros-frontend
cd solana-student-intros-frontend
git checkout starter
npm i

提示: -程序期望指令数据按顺序包含以下内容:

    1. variant 作为无符号 8 位整数,表示要调用的指令(在本例中应为 0)
    1. name 作为字符串
    1. message 作为字符串

请注意,该程序使用连接钱包的公钥(而不是其他任何信息)来生成每个学生介绍账户。这意味着每个公钥只能初始化一个学生介绍账户,如果您使用相同的公钥提交两次,交易将失败。

与往常一样,首先尝试独立执行此操作,但如果您陷入困境或只是想将您的解决方案与我们的解决方案进行比较,请查看此存储库中的 solution-serialize-instruction-data 分支。

- - +

🎥 构建一个电影评论应用

现在我们已经完成了钱包连接的设置,让我们让我们的ping按钮真正有用起来吧!为了将所有内容整合在一起,我们将构建一个基于区块链的电影评论应用——它将允许任何人提交他们最喜欢的电影的评论,有点类似于烂番茄网站。

在你的Solana工作空间中设置起始代码

git clone https://github.com/RustyCab/solana-movie-frontend.git
cd solana-movie-frontend
git checkout starter
npm i

如果您运行 npm run dev 您应该在 localhost:3000 上看到以下内容:

这是一个普通的 Next.js 应用程序,安装了一些模板组件和一些 Solana 依赖项,以帮助您节省时间。那里有一些模拟评论,请查看各个组件以感受该应用程序。

您会注意到我们已将钱包上下文提供程序从 _app.tsx 移至其自己的组件。它的工作原理是一样的,只是将其与更大的应用程序分开,性能更高。应用程序现在所做的就是将您的评论记录到控制台中,我们将在 Form.tsx 中设置 handleTransactionSubmit 函数。我们走吧呜呜呜呜

🗺 定义架构

序列化的第一步是为我们要序列化的数据创建一个模式/映射。我们需要告诉Borsh数据将被称为什么以及每个项目的大小。

首先安装 borsh ,在终端中运行:

npm install @project-serum/borsh --force

接下来前往 Movie.ts 导入 borsh 并在 Movie 类中添加架构(不要复制粘贴此内容):

// We're importing borsh
import * as borsh from '@project-serum/borsh'

export class Movie {
title: string;
rating: number;
description: string;

// The constructor and the mocks will remain the same
constructor(title: string, rating: number, description: string) {}
static mocks: Movie[] = []

// Here's our schema!
borshInstructionSchema = borsh.struct([
borsh.u8('variant'),
borsh.str('title'),
borsh.u8('rating'),
borsh.str('description'),
])

}

电影评论程序期望指令数据包含:

    1. variant 作为无符号的 8 位整数,表示应执行哪条指令(换句话说,应调用程序上的哪个函数)。
    1. title 作为表示您正在查看的电影标题的字符串。
    1. rating 作为无符号 8 位整数,表示您对正在评论的电影的评分(满分 5 分)。
    1. description 作为一个字符串,表示您为电影留下的评论的书面部分。

模式需要与程序期望的匹配 - 包括结构中项目的顺序。当程序读取您的数据时,它将按照定义的顺序进行反序列化,如果您的顺序不同,它创建的数据将无效。由于我们正在使用已部署的程序,我已经给您提供了模式。通常,您会阅读文档或自己查看程序代码!

🌭 创建serialize方法

现在我们知道数据是什么样子,我们需要编写将其序列化的方法。将其添加到 Movie 类中架构的正下方:

serialize(): Buffer {
const buffer = Buffer.alloc(1000)
this.borshInstructionSchema.encode({ ...this, variant: 0 }, buffer)
return buffer.slice(0, this.borshInstructionSchema.getSpan(buffer))
}

首先,我们创建一个超大缓冲区 - 这个缓冲区为 1000 字节。为什么是 1000 字节?因为我知道它足以容纳我想要的所有东西,并在最后留下额外的空间。

接下来,我们使用创建的模式对数据进行编码。 encode 接受两个值 - 我们想要编码的数据以及我们想要存储它的位置。 this 指的是我们所在的当前对象 - 因此我们解构电影对象并将其与 ...this 一起传递,就像传递 { title, rating, description, variant } 一样。

最后 - 我们删除缓冲区中的额外空间。 getSpan 有点像 array.length - 它根据模式为我们提供缓冲区中最后使用的项目的索引,因此我们的缓冲区只包含我们需要的数据,而不包含其他数据。

这是我的最终 Movie.ts 的样子:

import * as borsh from '@project-serum/borsh'

export class Movie {
title: string;
rating: number;
description: string;

constructor(title: string, rating: number, description: string) {
this.title = title;
this.rating = rating;
this.description = description;
}

static mocks: Movie[] = [
new Movie('The Shawshank Redemption', 5, `For a movie shot entirely in prison where there is no hope at all, Shawshank redemption's main message and purpose is to remind us of hope, that even in the darkest places hope exists, and only needs someone to find it. Combine this message with a brilliant screenplay, lovely characters, and Martin freeman, and you get a movie that can teach you a lesson every time you watch it. An all-time Classic!!!`),
new Movie('The Godfather', 5, `One of Hollywood's greatest critical and commercial successes, The Godfather gets everything right; not only did the movie transcend expectations, it established new benchmarks for American cinema.`),
new Movie('The Godfather: Part II', 4, `The Godfather: Part II is a continuation of the saga of the late Italian-American crime boss, Francis Ford Coppola, and his son, Vito Corleone. The story follows the continuing saga of the Corleone family as they attempt to successfully start a new life for themselves after years of crime and corruption.`),
new Movie('The Dark Knight', 5, `The Dark Knight is a 2008 superhero film directed, produced, and co-written by Christopher Nolan. Batman, in his darkest hour, faces his greatest challenge yet: he must become the symbol of the opposite of the Batmanian order, the League of Shadows.`),
]

borshInstructionSchema = borsh.struct([
borsh.u8('variant'),
borsh.str('title'),
borsh.u8('rating'),
borsh.str('description'),
])

serialize(): Buffer {
const buffer = Buffer.alloc(1000)
this.borshInstructionSchema.encode({ ...this, variant: 0 }, buffer)
return buffer.slice(0, this.borshInstructionSchema.getSpan(buffer))
}
}

就是这样!我们已经完成了序列化部分。来回顾一下几部电影吧🍿

🤝 用数据创建交易

拼图的最后一块就是获取用户的数据,使用我们刚刚创建的方法进行序列化,并用它创建一个交易。

首先更新 Form.tsx 中的导入:

import { FC } from 'react'
import { Movie } from '../models/Movie'
import { useState } from 'react'
import { Box, Button, FormControl, FormLabel, Input, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, Textarea } from '@chakra-ui/react'
import * as web3 from '@solana/web3.js'
import { useConnection, useWallet } from '@solana/wallet-adapter-react'

我们需要在 handleSubmit 函数之前建立 RPC 连接并获取钱包详细信息:

const { connection } = useConnection();
const { publicKey, sendTransaction } = useWallet();

现在是重点, handleTransactionSubmit 函数。除了序列化位之外,这对于您之前的交易看起来非常熟悉:进行交易、制定指令、提交交易。

前半部分如下所示:

const handleTransactionSubmit = async (movie: Movie) => {
if (!publicKey) {
alert('Please connect your wallet!')
return
}

const buffer = movie.serialize()
const transaction = new web3.Transaction()

const [pda] = await web3.PublicKey.findProgramAddress(
[publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)
)
}

除了 pda 之外,你应该都能认识到这些。回想一下指令的要求。它需要与之交互的程序ID,可选的数据,以及它将从中读取或写入的账户列表。由于我们要将数据提交到网络上进行存储,将会创建一个新的账户来存储它(记住《海绵宝宝》中的Patrick - 程序是无状态的,一切都在账户中)。

Patrick在提到PDA(程序派生地址)!这是一个用来存储我们电影评论的账户。你可能会开始注意到,我们遇到了经典的“先有鸡还是先有蛋”的情况...

我们需要知道帐户地址才能进行有效交易,并且需要处理交易才能创建帐户。解决方案?一个理论蛋。如果交易创建者和程序都使用相同的过程来选择地址,我们可以在交易处理之前导出地址。

这就是 web3.PublicKey.findProgramAddress 方法正在做的事情。它接受两个变量:种子和生成种子的程序(电影评论程序)。在我们的例子中,种子是发件人的地址和电影的标题。通过这个应用程序,我告诉您种子要求,通常您要么阅读文档,查看程序代码,要么对其进行逆向工程。

要完成 handleTransactionSubmit 功能,您所需要做的就是创建一条指令并发送它,以下是完整代码:

const handleTransactionSubmit = async (movie: Movie) => {
if (!publicKey) {
alert('Please connect your wallet!')
return
}

const buffer = movie.serialize()
const transaction = new web3.Transaction()

const [pda] = await web3.PublicKey.findProgramAddress(
[publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)
)

const instruction = new web3.TransactionInstruction({
keys: [
{
// Your account will pay the fees, so it's writing to the network
pubkey: publicKey,
isSigner: true,
isWritable: false,
},
{
// The PDA will store the movie review
pubkey: pda,
isSigner: false,
isWritable: true
},
{
// The system program will be used for creating the PDA
pubkey: web3.SystemProgram.programId,
isSigner: false,
isWritable: false
}
],
// Here's the most important part!
data: buffer,
programId: new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)
})

transaction.add(instruction)

try {
let txid = await sendTransaction(transaction, connection)
console.log(`Transaction submitted: https://explorer.solana.com/tx/${txid}?cluster=devnet`)
} catch (e) {
alert(JSON.stringify(e))
}
}

仔细阅读代码注释,我会解释为什么我们需要指令键数组中的每个地址。

就这样了!确保你的钱包在开发网络上,并且你有开发网络的SOL,然后前往 localhost:3000 。提交评论并访问控制台中记录的浏览器链接。向下滚动到底,你会看到你的电影名称以及其他一些内容:

哇。您刚刚将自定义数据写入 Solana 网络。

给自己一个鼓励,这可不是简单的事情!到这个阶段,可能有些人已经退出了这个项目,给他们一些动力,展示一下你所建立的东西!如果你已经走到这一步,我毫不怀疑你会一直坚持到最后 :)

🚢 船舶挑战

是时候让大脑多折几道皱纹了 🧠

继续创建一个应用程序,让 Solana Core 中的构建者进行自我介绍!我们将在这个地址 HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf 处使用 Solana 程序。它最终看起来与电影评论应用程序类似:

起始代码

您可以设置使用

git clone https://github.com/RustyCab/solana-student-intros-frontend
cd solana-student-intros-frontend
git checkout starter
npm i

提示: +程序期望指令数据按顺序包含以下内容:

    1. variant 作为无符号 8 位整数,表示要调用的指令(在本例中应为 0)
    1. name 作为字符串
    1. message 作为字符串

请注意,该程序使用连接钱包的公钥(而不是其他任何信息)来生成每个学生介绍账户。这意味着每个公钥只能初始化一个学生介绍账户,如果您使用相同的公钥提交两次,交易将失败。

与往常一样,首先尝试独立执行此操作,但如果您陷入困境或只是想将您的解决方案与我们的解决方案进行比较,请查看此存储库中的 solution-serialize-instruction-data 分支。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/index.html b/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/index.html index c2c2e93e4..03df1fe65 100644 --- a/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/index.html +++ b/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/index.html @@ -3,15 +3,15 @@ -🤔 自定义指令 | All in One Solana - - - +🤔 自定义指令 | All in One Solana + + +
-

🤔 自定义指令

既然我们已经完成了钱包连接的设置,让我们让我们的ping按钮真正有所作为吧!你现在知道如何读取数据并通过简单的交易写入网络。几乎立即,你会发现自己想要通过交易发送数据。那么让我们看看如何向Solana区块链讲述你的故事。

Solana中关于数据的棘手之处在于程序是无状态的。与以太坊等其他区块链中的智能合约不同,程序不存储任何数据,只存储逻辑

图为:Solana 创始人 Anatoly Yakovenko 正在制作 Solana。

Solana 程序中绝对不存储任何内容。它不知道所有者是谁,甚至不知道是谁部署了它。一切都存储在帐户内。

📧 指令数据

我们要稍微看一下引擎盖下面的东西。在这一部分,很多工作实际上会由像Anchor这样的库来处理,但是了解原子指令级别上发生的事情是很重要的。

让我们退后一步,看看指令数据的位置。

交易可以有一个或多个指令,每个指令可以有数据。

关于指令数据的重要之处在于其格式 - 它是8位数据。 "位" 意味着它是机器码:1和0。8只是指大小,就像32位或64位一样。如果您的指令数据不符合这个格式,Solana运行时将无法识别它。

这就是为什么Solana如此快速!它不是让网络转换你的数据,而是你提供已经转换好的数据,然后网络只需处理它。想象一下,如果你在开始烹饪之前已经准备好了所有菜肴的食材,你将能够更快地烹饪,因为你不需要切割食材。

你不需要知道机器码是如何工作的。你只需要记住指令数据是某种类型的,当你想要将数据包含在指令中时,你需要将你的数据转换为该类型。

这段话在解释 Solana 网络如何处理事务和指令数据的。在 Solana 中,一个事务可以包含一条或多条指令,每条指令都可以携带一些数据。

重点是,这些指令数据需要以特定格式提供,即 8 位数据。这里的 “8位” 不是指数据的大小,而是指数据的格式,这种格式是机器代码格式,用 1 和 0 表示。如果你提供的指令数据不是这种格式,Solana 运行时就无法识别和处理它。

这种处理方式是 Solana 能够高速运行的一个原因。你不需要让网络转换你的数据,而是自己转换数据并提供给网络,网络只负责处理它。这就像在开始烹饪前就准备好所有食材,这样你就能更快地烹饪,因为你不需要在烹饪过程中去切东西。

作者强调的是,你并不需要了解机器代码是如何工作的。你需要记住的是,当你想要在指令中包含一些数据时,这些数据需要是特定类型的,你需要把你的数据转换为这种类型。这就意味着在你编写和提交给 Solana 网络的代码中,你需要负责把你的数据转换为适当的格式。

这是低级别编程的一个常见特性。虽然很多高级编程语言(比如 Python 或 JavaScript)会自动处理这些类型转换,但在低级语言(比如 Rust,这也是 Solana 主要使用的语言)中,你需要自己处理这些转换。然而,有些库,如 Anchor,可以帮助你处理这些转换,让编程更简单。

🔨 序列化和borsh

这就是序列化的作用 - 它是将常规的代码或数据转换为字节数组(机器代码:1和0)。

我们将在我们的项目中使用 Borsh 序列化格式,因为它有一个方便我们使用的库。

让我们通过一个例子来看看它是如何工作的——目标是装备一个链上游戏物品。为此,我们需要三个数据

  • variant - 我们要调用的命令的名称(即装备或删除)
  • playerId - 装备该物品的玩家的ID
  • itemId - 我们想要装备的物品

序列化此数据有四个步骤:

  1. 创建数据模式/映射,以确定数据的预期结构
  2. 为数据分配一个比实际需要的要大得多的缓冲区
  3. 将我们的数据进行编码并添加到缓冲区中
  4. 去掉缓冲区末尾的额外空格

作为网络开发人员,我们永远不需要处理这样的低级内容,所以我这样做是为了让它感觉不那么抽象:

我希望这是有道理的,哈哈。让我们看一些代码以了解其实际情况。

import * as Borsh from "@project-serum/borsh"

const equipPlayerSchema = Borsh.struct([
Borsh.u8("variant"),
Borsh.u8("playerId"),
Borsh.u8("itemId"),
])

我们将从为装备物品指令创建一个模式开始。我们正在创建一个包含三个数据片段的borsh结构,它们都是无符号整数,但大小不同 - 8位、16位和256位。

由于我们的数据将变成一长串的1和0,我们需要知道每个数据项的起始和结束位置。这就是为什么我们给每个项分配一个特定的大小。当程序需要读取这些数据时,它将知道 variant 的结束位置和 playerId 的起始位置。

想象一下蒙着眼睛试图从链接上切香肠。只有知道每根香肠的长度,才能在正确的位置切。

在我们的例子中,第二根和第三根香肠会长很多,但我想你明白了,哈哈。

import * as Borsh from "@project-serum/borsh"

const equipPlayerSchema = Borsh.struct([
Borsh.u8("variant"),
Borsh.u8("playerId"),
Borsh.u8("itemId"),
])

const buffer = Buffer.alloc(1000)
equipPlayerSchems.encode({ variant: 2, playerId: 1435, itemId: 737498}, buffer)

const instructBuffer = buffer.slice(0, equipPlayerSchems.getSpan(buffer))

这里发生第二步、第三步和第四步。我们创建一个 1000 字节长的缓冲区。我们对数据进行编码并将其添加到缓冲区中。然后我们将末端切成薄片,使其长度达到需要的长度。

const endpoint = clusterApiUrl("devnet")
const connection = new Connection(endpoint)

const transaction = new Transaction().add({
key: [
{
pubkey: player.Publickey,
isSigner: true,
isWritable: false,
},
{
pubkey: playerInfoAccount,
isSigner: false,
isWritable: true,
},
{
pubkey: SystemProgram.programId,
isSigner: false,
isWritable: false,
},
],
data: instructBuffer,
programId: PROGRAM_ID,
})

sendAndConfirmTransaction(connection, transaction, [player])

一旦我们有了正确格式的数据,剩下的就是小菜一碟!这个交易应该看起来很熟悉。唯一的“新”东西就是我们以前没有的可选项 data

我在这里对你的知识做了一些假设 - 你大致了解机器码是什么,以及内存分配如何发挥作用。你不需要了解所有这些东西,我自己也不需要。只需在YouTube上观看一两个视频,直到你对正在发生的事情有一个大致的感觉即可。

现代开发人员很少经常处理字节缓冲区 - 这被认为是低级别的,所以如果你对此感到陌生或新奇,不用担心。接下来我们将使用它构建,这样你就可以称自己为软件工程师了 😎

- - +

🤔 自定义指令

既然我们已经完成了钱包连接的设置,让我们让我们的ping按钮真正有所作为吧!你现在知道如何读取数据并通过简单的交易写入网络。几乎立即,你会发现自己想要通过交易发送数据。那么让我们看看如何向Solana区块链讲述你的故事。

Solana中关于数据的棘手之处在于程序是无状态的。与以太坊等其他区块链中的智能合约不同,程序不存储任何数据,只存储逻辑

图为:Solana 创始人 Anatoly Yakovenko 正在制作 Solana。

Solana 程序中绝对不存储任何内容。它不知道所有者是谁,甚至不知道是谁部署了它。一切都存储在帐户内。

📧 指令数据

我们要稍微看一下引擎盖下面的东西。在这一部分,很多工作实际上会由像Anchor这样的库来处理,但是了解原子指令级别上发生的事情是很重要的。

让我们退后一步,看看指令数据的位置。

交易可以有一个或多个指令,每个指令可以有数据。

关于指令数据的重要之处在于其格式 - 它是8位数据。 "位" 意味着它是机器码:1和0。8只是指大小,就像32位或64位一样。如果您的指令数据不符合这个格式,Solana运行时将无法识别它。

这就是为什么Solana如此快速!它不是让网络转换你的数据,而是你提供已经转换好的数据,然后网络只需处理它。想象一下,如果你在开始烹饪之前已经准备好了所有菜肴的食材,你将能够更快地烹饪,因为你不需要切割食材。

你不需要知道机器码是如何工作的。你只需要记住指令数据是某种类型的,当你想要将数据包含在指令中时,你需要将你的数据转换为该类型。

这段话在解释 Solana 网络如何处理事务和指令数据的。在 Solana 中,一个事务可以包含一条或多条指令,每条指令都可以携带一些数据。

重点是,这些指令数据需要以特定格式提供,即 8 位数据。这里的 “8位” 不是指数据的大小,而是指数据的格式,这种格式是机器代码格式,用 1 和 0 表示。如果你提供的指令数据不是这种格式,Solana 运行时就无法识别和处理它。

这种处理方式是 Solana 能够高速运行的一个原因。你不需要让网络转换你的数据,而是自己转换数据并提供给网络,网络只负责处理它。这就像在开始烹饪前就准备好所有食材,这样你就能更快地烹饪,因为你不需要在烹饪过程中去切东西。

作者强调的是,你并不需要了解机器代码是如何工作的。你需要记住的是,当你想要在指令中包含一些数据时,这些数据需要是特定类型的,你需要把你的数据转换为这种类型。这就意味着在你编写和提交给 Solana 网络的代码中,你需要负责把你的数据转换为适当的格式。

这是低级别编程的一个常见特性。虽然很多高级编程语言(比如 Python 或 JavaScript)会自动处理这些类型转换,但在低级语言(比如 Rust,这也是 Solana 主要使用的语言)中,你需要自己处理这些转换。然而,有些库,如 Anchor,可以帮助你处理这些转换,让编程更简单。

🔨 序列化和borsh

这就是序列化的作用 - 它是将常规的代码或数据转换为字节数组(机器代码:1和0)。

我们将在我们的项目中使用 Borsh 序列化格式,因为它有一个方便我们使用的库。

让我们通过一个例子来看看它是如何工作的——目标是装备一个链上游戏物品。为此,我们需要三个数据

  • variant - 我们要调用的命令的名称(即装备或删除)
  • playerId - 装备该物品的玩家的ID
  • itemId - 我们想要装备的物品

序列化此数据有四个步骤:

  1. 创建数据模式/映射,以确定数据的预期结构
  2. 为数据分配一个比实际需要的要大得多的缓冲区
  3. 将我们的数据进行编码并添加到缓冲区中
  4. 去掉缓冲区末尾的额外空格

作为网络开发人员,我们永远不需要处理这样的低级内容,所以我这样做是为了让它感觉不那么抽象:

我希望这是有道理的,哈哈。让我们看一些代码以了解其实际情况。

import * as Borsh from "@project-serum/borsh"

const equipPlayerSchema = Borsh.struct([
Borsh.u8("variant"),
Borsh.u8("playerId"),
Borsh.u8("itemId"),
])

我们将从为装备物品指令创建一个模式开始。我们正在创建一个包含三个数据片段的borsh结构,它们都是无符号整数,但大小不同 - 8位、16位和256位。

由于我们的数据将变成一长串的1和0,我们需要知道每个数据项的起始和结束位置。这就是为什么我们给每个项分配一个特定的大小。当程序需要读取这些数据时,它将知道 variant 的结束位置和 playerId 的起始位置。

想象一下蒙着眼睛试图从链接上切香肠。只有知道每根香肠的长度,才能在正确的位置切。

在我们的例子中,第二根和第三根香肠会长很多,但我想你明白了,哈哈。

import * as Borsh from "@project-serum/borsh"

const equipPlayerSchema = Borsh.struct([
Borsh.u8("variant"),
Borsh.u8("playerId"),
Borsh.u8("itemId"),
])

const buffer = Buffer.alloc(1000)
equipPlayerSchems.encode({ variant: 2, playerId: 1435, itemId: 737498}, buffer)

const instructBuffer = buffer.slice(0, equipPlayerSchems.getSpan(buffer))

这里发生第二步、第三步和第四步。我们创建一个 1000 字节长的缓冲区。我们对数据进行编码并将其添加到缓冲区中。然后我们将末端切成薄片,使其长度达到需要的长度。

const endpoint = clusterApiUrl("devnet")
const connection = new Connection(endpoint)

const transaction = new Transaction().add({
key: [
{
pubkey: player.Publickey,
isSigner: true,
isWritable: false,
},
{
pubkey: playerInfoAccount,
isSigner: false,
isWritable: true,
},
{
pubkey: SystemProgram.programId,
isSigner: false,
isWritable: false,
},
],
data: instructBuffer,
programId: PROGRAM_ID,
})

sendAndConfirmTransaction(connection, transaction, [player])

一旦我们有了正确格式的数据,剩下的就是小菜一碟!这个交易应该看起来很熟悉。唯一的“新”东西就是我们以前没有的可选项 data

我在这里对你的知识做了一些假设 - 你大致了解机器码是什么,以及内存分配如何发挥作用。你不需要了解所有这些东西,我自己也不需要。只需在YouTube上观看一两个视频,直到你对正在发生的事情有一个大致的感觉即可。

现代开发人员很少经常处理字节缓冲区 - 这被认为是低级别的,所以如果你对此感到陌生或新奇,不用担心。接下来我们将使用它构建,这样你就可以称自己为软件工程师了 😎

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/custom-instruction/index.html b/docs/Solana-Co-Learn/module1/custom-instruction/index.html index c570db954..ec75e5c60 100644 --- a/docs/Solana-Co-Learn/module1/custom-instruction/index.html +++ b/docs/Solana-Co-Learn/module1/custom-instruction/index.html @@ -3,15 +3,15 @@ -自定义指令 | All in One Solana - - - +自定义指令 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/index.html b/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/index.html index 958c7f36c..d31c8ac4c 100644 --- a/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/index.html +++ b/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/index.html @@ -3,15 +3,15 @@ -📡 Run is back - 反序列化 | All in One Solana - - - +📡 Run is back - 反序列化 | All in One Solana + + +
-

📡 Run is back - 反序列化

既然我们已经完成了钱包连接的设置,让我们让我们的ping按钮真正有所作为吧!将数据写入网络账户只是战斗的一半,另一半是读取数据。在第一部分中,我们使用了Web3.js库中的内置函数来读取内容。这仅适用于绝对必要的数据,如余额和交易详情。正如我们在上一部分中所看到的,所有好东西都在PDAs中。

🧾 程序派生地址

账户是Solana的热门话题。如果你听过账户这个词,你可能听到有人谈论PDA。PDA是Solana上用于存储数据的特殊类型账户。但实际上它并不是一个账户——它们被称为地址而不是账户,因为它们没有私钥。它们只能由创建它们的程序控制。

常规 Solana 帐户是使用 Ed25519 签名系统创建的 - 该系统为我们提供了公钥和私钥。由于 PDA 是由程序控制的,因此它们不需要私钥。因此,我们使用不在 Ed25519 曲线上的地址来制作 PDA。

有时, findProgramAddress 给我们一个位于曲线上的密钥(意味着它也有一个私钥),因此我们添加一个可选的“bump”参数以将其移出曲线。

就是这样。您不需要了解 Ed25519,甚至不需要了解数字签名算法是什么。您只需要知道 PDA 看起来就像常规 Solana 地址并且由程序控制。

您需要了解 PDA 工作原理的原因是,它们是链上和链下程序定位数据的确定性方式。把它想象成一个键值存储。 seedsprogramIdbump 组合起来形成密钥,以及网络在该地址存储的值。如果我们知道密钥是什么,这使我们能够可靠且一致地查找存储在网络上的数据。

多亏了程序派生地址(PDAs),我们拥有一个可以被Solana上所有程序访问的通用数据库。回想一下我们与第一个程序互动的情景——我们向其发送了一个ping请求,然后它递增了一个数字。下面是你可能会找到与所有账户互动的程序共享的数据的方法:

const [pda, bump] = await PublicKey.findProgramAddress(
[Buffer.from("GLOBAL_STATE")],
programId
);

这有点像 Javascript 中的全局变量。

如果您想为每个用户存储一个单独的计数器怎么办?使用他们的公钥作为种子:

const [pda, bump] = await PublicKey.findProgramAddress(
[
publickey.toBuffer()
],
programId
);

也许您想制作一个链上笔记系统,每个用户都可以存储自己的笔记?将公钥与标识符结合起来:

const [pda, bump] = await PublicKey.findProgramAddress(
[
publickey.toBuffer(),
Buffer.from("First Note")
],
programId
);

只需记住,无论是您还是来电者都必须支付存储费用,并且每个账户有10兆字节的限制,因此您需要谨慎选择要放在链上的内容。

🎢 反序列化

找到要读取的帐户后,您需要反序列化数据,以便您的应用程序可以使用它。回想一下我们在这个程序中学到的第一件事——帐户及其包含的内容。回顾一下:

FIELD描述
lamports该账户拥有的lamports数量
owner该帐户的程序所有者
executable该账户是否可以处理指令(可执行)
data该账户存储的原始数据字节数组
rent_epoch这个账户将要支付的下一个时期的租金

数据字段包含了一个庞大的字节数组。就像我们将可读数据转换为字节以进行指令一样,我们在这里要做的是相反的操作:将字节数组转换为我们的应用程序可以处理的数据。这时真正的魔法开始了,你会真切地感受到自己像在玻璃上冲浪一样 😎

我们在这里见到了我们最好的新老朋友 Borsh 先生:

impot * as borsh from '@project-serum/borsh';

borshAccountSchema = borsh.struct({
borsh.bool('initialized'),
borsh.u16('playerId'),
borsh.str('name')
});

const { playerId, name } = borshAccountSchema.decode(buffer)

这些步骤与我们对序列化所做的类似:

  1. 创建一个字节数组中存储内容的模式/映射
  2. 使用模式来解码数据
  3. 提取我们想要的物品

这应该感觉很熟悉,但如果不熟悉,当我们付诸行动时就会有意义!

构建一个反序列化器

曾经想过要构建一个反序列化器吗?嗯,我们将继续之前的电影评论应用。你可以继续上一节的项目(推荐),或者你可以使用已完成的版本开始设置:

git clone https://github.com/RustyCab/solana-movie-frontend.git
cd solana-movie-frontend
git checkout solution-serialize-instruction-data
npm i

当您运行 npm run dev 时,您将看到一堆模拟数据。与假 yeezy 不同,假数据是蹩脚的。让我们在 Movie.ts 中保持真实(仅复制/粘贴新内容):

import * as borsh from '@project-serum/borsh'

export class Movie {
title: string;
rating: number;
description: string;
...

static borshAccountSchema = borsh.struct([
borsh.bool('initialized'),
borsh.u8('rating'),
borsh.str('title'),
borsh.str('description'),
])

static deserialize(buffer?: Buffer): Movie|null {
if (!buffer) {
return null
}

try {
const { title, rating, description } = this.borshAccountSchema.decode(buffer)
return new Movie(title, rating, description)
} catch(error) {
console.log('Deserialization error:', error)
return null
}
}
}

就像序列化一样,我们有一个模式和一个方法。该架构具有:

    1. initialized 作为一个布尔值,表示帐户是否已初始化。
    1. rating 作为无符号 8 位整数,表示评论者对电影的评分(满分 5 分)。
    1. title 作为表示所评论电影的标题的字符串。
    1. description 作为表示评论的书面部分的字符串.

看起来很熟悉!好东西在 deserialize 中。这里的返回类型可以是 Movienull ,因为帐户可能根本没有任何数据。

最后,我们需要在页面加载时使用此方法从 PDA 获取数据。我们在 MovieList.tsx 中执行此操作:

import { Card } from './Card'
import { FC, useEffect, useState } from 'react'
import { Movie } from '../models/Movie'
import * as web3 from '@solana/web3.js'

const MOVIE_REVIEW_PROGRAM_ID = 'CenYq6bDRB7p73EjsPEpiYN7uveyPUTdXkDkgUduboaN'

export const MovieList: FC = () => {
const connection = new web3.Connection(web3.clusterApiUrl('devnet'))
const [movies, setMovies] = useState<Movie[]>([])

useEffect(() => {
connection.getProgramAccounts(new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID))
.then(async (accounts) => {
const movies: Movie[] = accounts.reduce((accum: Movie[], { pubkey, account }) => {
const movie = Movie.deserialize(account.data)
if (!movie) {
return accum
}

return [...accum, movie]
}, [])
setMovies(movies)
})
}, [])

return (
<div>
{
movies.map((movie, i) => <Card key={i} movie={movie} /> )
}
</div>
)
}

就像以前一样,我们设置了导入和连接。主要更改在 useEffect 中。

connection.getProgramAccounts(new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID))

在获取电影评论之前,我们需要获取包含它们的帐户。我们可以通过使用 getProgramAccounts 端点获取电影评论程序的所有程序帐户来实现这一点。

这是一个相当繁重的端点 - 如果您在像 Magic Eden 程序这样的大型程序上尝试它,您将得到数十万到数百万的结果。如果你不小心的话,这会破坏东西。在现实世界中,您很少需要同时获得多个帐户,所以现在不用担心。只需知道您不应该对数据进行建模,使得 getProgramAccounts 是必要的。

.then(async (accounts) => {
const movies: Movie[] = accounts.reduce((accum: Movie[], { pubkey, account }) => {
// Try to extract movie item from account data
const movie = Movie.deserialize(account.data)

// If the account does not have a review, movie will be null
if (!movie) {
return accum
}

return [...accum, movie]
}, [])
setMovies(movies)
})

为了存储我们的电影评论,我们将创建一个 Movies 类型的数组。为了填充它,我们将使用 reduce 反序列化每个帐户并尝试解构 movie 项。如果该帐户中有电影数据,那么这将起作用!如果没有,电影将为null,我们可以返回累积的电影列表。

如果这看起来令人困惑,请逐行浏览代码并确保您知道 reduce 方法是如何工作的。

确保您正在运行 npm run dev 并转到 localhost:3000 ,您应该会看到其他构建者添加的一堆随机评论:D

🚢 Ship挑战

我们现在可以序列化和反序列化数据。好的。让我们切换到我们在序列化部分开始的 Student Intros 应用程序。

目标:更新应用程序以获取并反序列化程序的帐户数据。支持此功能的 Solana 程序位于: HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf

您可以从上次挑战中离开的位置开始,也可以从此存储库中获取代码。确保您从 solution-serialize-instruction-data 分支开始。

Hints:

StudentIntro.ts 中创建帐户缓冲区布局。账户数据包含:

    1. initialized 作为一个布尔值,表示帐户是否已初始化
    1. name 作为表示学生姓名的字符串
    1. message 作为表示学生分享的有关 Solana 旅程的消息的字符串

StudentIntro.ts 中创建一个静态方法,该方法将使用缓冲区布局将帐户数据缓冲区反序列化为 StudentIntro 对象。

StudentIntroList 组件的 useEffect 中,获取程序的帐户并将其数据反序列化到 StudentIntro 对象列表中。

Solution code:

解决方案代码:

与往常一样,首先尝试独立执行此操作,但如果您陷入困境或只是想将您的解决方案与我们的解决方案进行比较,请查看此存储库中的 solution-deserialize-account-data 分支

祝你好运!

- - +

📡 Run is back - 反序列化

既然我们已经完成了钱包连接的设置,让我们让我们的ping按钮真正有所作为吧!将数据写入网络账户只是战斗的一半,另一半是读取数据。在第一部分中,我们使用了Web3.js库中的内置函数来读取内容。这仅适用于绝对必要的数据,如余额和交易详情。正如我们在上一部分中所看到的,所有好东西都在PDAs中。

🧾 程序派生地址

账户是Solana的热门话题。如果你听过账户这个词,你可能听到有人谈论PDA。PDA是Solana上用于存储数据的特殊类型账户。但实际上它并不是一个账户——它们被称为地址而不是账户,因为它们没有私钥。它们只能由创建它们的程序控制。

常规 Solana 帐户是使用 Ed25519 签名系统创建的 - 该系统为我们提供了公钥和私钥。由于 PDA 是由程序控制的,因此它们不需要私钥。因此,我们使用不在 Ed25519 曲线上的地址来制作 PDA。

有时, findProgramAddress 给我们一个位于曲线上的密钥(意味着它也有一个私钥),因此我们添加一个可选的“bump”参数以将其移出曲线。

就是这样。您不需要了解 Ed25519,甚至不需要了解数字签名算法是什么。您只需要知道 PDA 看起来就像常规 Solana 地址并且由程序控制。

您需要了解 PDA 工作原理的原因是,它们是链上和链下程序定位数据的确定性方式。把它想象成一个键值存储。 seedsprogramIdbump 组合起来形成密钥,以及网络在该地址存储的值。如果我们知道密钥是什么,这使我们能够可靠且一致地查找存储在网络上的数据。

多亏了程序派生地址(PDAs),我们拥有一个可以被Solana上所有程序访问的通用数据库。回想一下我们与第一个程序互动的情景——我们向其发送了一个ping请求,然后它递增了一个数字。下面是你可能会找到与所有账户互动的程序共享的数据的方法:

const [pda, bump] = await PublicKey.findProgramAddress(
[Buffer.from("GLOBAL_STATE")],
programId
);

这有点像 Javascript 中的全局变量。

如果您想为每个用户存储一个单独的计数器怎么办?使用他们的公钥作为种子:

const [pda, bump] = await PublicKey.findProgramAddress(
[
publickey.toBuffer()
],
programId
);

也许您想制作一个链上笔记系统,每个用户都可以存储自己的笔记?将公钥与标识符结合起来:

const [pda, bump] = await PublicKey.findProgramAddress(
[
publickey.toBuffer(),
Buffer.from("First Note")
],
programId
);

只需记住,无论是您还是来电者都必须支付存储费用,并且每个账户有10兆字节的限制,因此您需要谨慎选择要放在链上的内容。

🎢 反序列化

找到要读取的帐户后,您需要反序列化数据,以便您的应用程序可以使用它。回想一下我们在这个程序中学到的第一件事——帐户及其包含的内容。回顾一下:

FIELD描述
lamports该账户拥有的lamports数量
owner该帐户的程序所有者
executable该账户是否可以处理指令(可执行)
data该账户存储的原始数据字节数组
rent_epoch这个账户将要支付的下一个时期的租金

数据字段包含了一个庞大的字节数组。就像我们将可读数据转换为字节以进行指令一样,我们在这里要做的是相反的操作:将字节数组转换为我们的应用程序可以处理的数据。这时真正的魔法开始了,你会真切地感受到自己像在玻璃上冲浪一样 😎

我们在这里见到了我们最好的新老朋友 Borsh 先生:

impot * as borsh from '@project-serum/borsh';

borshAccountSchema = borsh.struct({
borsh.bool('initialized'),
borsh.u16('playerId'),
borsh.str('name')
});

const { playerId, name } = borshAccountSchema.decode(buffer)

这些步骤与我们对序列化所做的类似:

  1. 创建一个字节数组中存储内容的模式/映射
  2. 使用模式来解码数据
  3. 提取我们想要的物品

这应该感觉很熟悉,但如果不熟悉,当我们付诸行动时就会有意义!

构建一个反序列化器

曾经想过要构建一个反序列化器吗?嗯,我们将继续之前的电影评论应用。你可以继续上一节的项目(推荐),或者你可以使用已完成的版本开始设置:

git clone https://github.com/RustyCab/solana-movie-frontend.git
cd solana-movie-frontend
git checkout solution-serialize-instruction-data
npm i

当您运行 npm run dev 时,您将看到一堆模拟数据。与假 yeezy 不同,假数据是蹩脚的。让我们在 Movie.ts 中保持真实(仅复制/粘贴新内容):

import * as borsh from '@project-serum/borsh'

export class Movie {
title: string;
rating: number;
description: string;
...

static borshAccountSchema = borsh.struct([
borsh.bool('initialized'),
borsh.u8('rating'),
borsh.str('title'),
borsh.str('description'),
])

static deserialize(buffer?: Buffer): Movie|null {
if (!buffer) {
return null
}

try {
const { title, rating, description } = this.borshAccountSchema.decode(buffer)
return new Movie(title, rating, description)
} catch(error) {
console.log('Deserialization error:', error)
return null
}
}
}

就像序列化一样,我们有一个模式和一个方法。该架构具有:

    1. initialized 作为一个布尔值,表示帐户是否已初始化。
    1. rating 作为无符号 8 位整数,表示评论者对电影的评分(满分 5 分)。
    1. title 作为表示所评论电影的标题的字符串。
    1. description 作为表示评论的书面部分的字符串.

看起来很熟悉!好东西在 deserialize 中。这里的返回类型可以是 Movienull ,因为帐户可能根本没有任何数据。

最后,我们需要在页面加载时使用此方法从 PDA 获取数据。我们在 MovieList.tsx 中执行此操作:

import { Card } from './Card'
import { FC, useEffect, useState } from 'react'
import { Movie } from '../models/Movie'
import * as web3 from '@solana/web3.js'

const MOVIE_REVIEW_PROGRAM_ID = 'CenYq6bDRB7p73EjsPEpiYN7uveyPUTdXkDkgUduboaN'

export const MovieList: FC = () => {
const connection = new web3.Connection(web3.clusterApiUrl('devnet'))
const [movies, setMovies] = useState<Movie[]>([])

useEffect(() => {
connection.getProgramAccounts(new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID))
.then(async (accounts) => {
const movies: Movie[] = accounts.reduce((accum: Movie[], { pubkey, account }) => {
const movie = Movie.deserialize(account.data)
if (!movie) {
return accum
}

return [...accum, movie]
}, [])
setMovies(movies)
})
}, [])

return (
<div>
{
movies.map((movie, i) => <Card key={i} movie={movie} /> )
}
</div>
)
}

就像以前一样,我们设置了导入和连接。主要更改在 useEffect 中。

connection.getProgramAccounts(new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID))

在获取电影评论之前,我们需要获取包含它们的帐户。我们可以通过使用 getProgramAccounts 端点获取电影评论程序的所有程序帐户来实现这一点。

这是一个相当繁重的端点 - 如果您在像 Magic Eden 程序这样的大型程序上尝试它,您将得到数十万到数百万的结果。如果你不小心的话,这会破坏东西。在现实世界中,您很少需要同时获得多个帐户,所以现在不用担心。只需知道您不应该对数据进行建模,使得 getProgramAccounts 是必要的。

.then(async (accounts) => {
const movies: Movie[] = accounts.reduce((accum: Movie[], { pubkey, account }) => {
// Try to extract movie item from account data
const movie = Movie.deserialize(account.data)

// If the account does not have a review, movie will be null
if (!movie) {
return accum
}

return [...accum, movie]
}, [])
setMovies(movies)
})

为了存储我们的电影评论,我们将创建一个 Movies 类型的数组。为了填充它,我们将使用 reduce 反序列化每个帐户并尝试解构 movie 项。如果该帐户中有电影数据,那么这将起作用!如果没有,电影将为null,我们可以返回累积的电影列表。

如果这看起来令人困惑,请逐行浏览代码并确保您知道 reduce 方法是如何工作的。

确保您正在运行 npm run dev 并转到 localhost:3000 ,您应该会看到其他构建者添加的一堆随机评论:D

🚢 Ship挑战

我们现在可以序列化和反序列化数据。好的。让我们切换到我们在序列化部分开始的 Student Intros 应用程序。

目标:更新应用程序以获取并反序列化程序的帐户数据。支持此功能的 Solana 程序位于: HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf

您可以从上次挑战中离开的位置开始,也可以从此存储库中获取代码。确保您从 solution-serialize-instruction-data 分支开始。

Hints:

StudentIntro.ts 中创建帐户缓冲区布局。账户数据包含:

    1. initialized 作为一个布尔值,表示帐户是否已初始化
    1. name 作为表示学生姓名的字符串
    1. message 作为表示学生分享的有关 Solana 旅程的消息的字符串

StudentIntro.ts 中创建一个静态方法,该方法将使用缓冲区布局将帐户数据缓冲区反序列化为 StudentIntro 对象。

StudentIntroList 组件的 useEffect 中,获取程序的帐户并将其数据反序列化到 StudentIntro 对象列表中。

Solution code:

解决方案代码:

与往常一样,首先尝试独立执行此操作,但如果您陷入困境或只是想将您的解决方案与我们的解决方案进行比较,请查看此存储库中的 solution-deserialize-account-data 分支

祝你好运!

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/index.html b/docs/Solana-Co-Learn/module1/index.html index 57de2d563..dc5bba208 100644 --- a/docs/Solana-Co-Learn/module1/index.html +++ b/docs/Solana-Co-Learn/module1/index.html @@ -3,15 +3,15 @@ -Solana Module1 | All in One Solana - - - +Solana Module1 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello/index.html b/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello/index.html index 4b8c1839f..5bdca9692 100644 --- a/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello/index.html +++ b/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_hello/index.html @@ -3,15 +3,15 @@ -Anchor 合约框架实现《hello, World》 | All in One Solana - - - +Anchor 合约框架实现《hello, World》 | All in One Solana + + +
-

Anchor 合约框架实现《hello, World》

让我们通过构建和部署“Hello World!”程序来进行练习。

我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保您已经安装了Rust和Solana CLI。如果您还没有安装,请参考概述中的说明进行设置。

Anchor 安装

这里是anchor的安装官方指南.

需要你按照步骤安装好anchor。

安装完成后我们可以通过执行下面的命令,检测anchor是否安装完成✅。

anchor --version
anchor --version
anchor-cli 0.28.0

1. 创建一个新的Rust项目

让我们从创建一个新的Rust项目开始。运行下面的anchor init <you-project-name>命令。随意用你自己的目录名替换它。

anchor init hello_world

2. 编写你的程序

接下来,使用下面的“Hello World!”程序更新hello_world/program/src/lib.rs。当程序被调用时,该程序会简单地将“Hello, world!”打印到程序日志中。

use anchor_lang::prelude::*;

declare_id!("Eo7uunKkgdRe8JtgmDimLkUEuT1oYbua4zWRCysWpv45");

#[program]
pub mod hello_world {
use super::*;

pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
msg!("Hello,World!");
Ok(())
}
}

#[derive(Accounts)]
pub struct Initialize {}

3. 运行本地测试验证器

在编写好你的程序之后,让我们确保我们的Solana CLI配置指向本地主机,使用solana config set --url命令。

solana config set --url localhost

接下来,使用solana config get命令检查Solana CLI配置是否已更新。

solana config get

最后,运行本地测试验证器。在一个单独的终端窗口中运行solana-test-validator命令。只有当我们的RPC URL设置为localhost时才需要这样做。

solana-test-validator

4. 构建和部署

我们现在准备好构建和部署我们的程序了。通过运行 anchor build 命令来构建程序。

anchor build

现在让我们部署我们的程序。

anchor deploy

solana程序部署将输出您的程序的程序ID。您现在可以在Solana Explorer上查找已部署的程序(对于本地主机,请选择“自定义RPC URL”作为集群)。

5. 查看程序日志

在我们调用程序之前,打开一个单独的终端并运行solana logs命令。这将允许我们在终端中查看程序日志。

solana logs <PROGRAM_ID>

或者也可以通过(Solana Exporer)[https://explorer.solana.com/?cluster=custom],查看产生的日志📔。

在测试验证器仍在运行时,尝试使用此处的客户端脚本调用您的程序。

这将返回一个Solana Explorer的URL(Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=custom)。将URL复制到浏览器中,在Solana Explorer上查找该交易,并检查程序日志中是否打印了“Hello, world!”。或者,您可以在运行solana logs命令的终端中查看程序日志。

就是这样!您刚刚在本地开发环境中创建并部署了您的第一个程序。

- - +

Anchor 合约框架实现《hello, World》

让我们通过构建和部署“Hello World!”程序来进行练习。

我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保您已经安装了Rust和Solana CLI。如果您还没有安装,请参考概述中的说明进行设置。

Anchor 安装

这里是anchor的安装官方指南.

需要你按照步骤安装好anchor。

安装完成后我们可以通过执行下面的命令,检测anchor是否安装完成✅。

anchor --version
anchor --version
anchor-cli 0.28.0

1. 创建一个新的Rust项目

让我们从创建一个新的Rust项目开始。运行下面的anchor init <you-project-name>命令。随意用你自己的目录名替换它。

anchor init hello_world

2. 编写你的程序

接下来,使用下面的“Hello World!”程序更新hello_world/program/src/lib.rs。当程序被调用时,该程序会简单地将“Hello, world!”打印到程序日志中。

use anchor_lang::prelude::*;

declare_id!("Eo7uunKkgdRe8JtgmDimLkUEuT1oYbua4zWRCysWpv45");

#[program]
pub mod hello_world {
use super::*;

pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
msg!("Hello,World!");
Ok(())
}
}

#[derive(Accounts)]
pub struct Initialize {}

3. 运行本地测试验证器

在编写好你的程序之后,让我们确保我们的Solana CLI配置指向本地主机,使用solana config set --url命令。

solana config set --url localhost

接下来,使用solana config get命令检查Solana CLI配置是否已更新。

solana config get

最后,运行本地测试验证器。在一个单独的终端窗口中运行solana-test-validator命令。只有当我们的RPC URL设置为localhost时才需要这样做。

solana-test-validator

4. 构建和部署

我们现在准备好构建和部署我们的程序了。通过运行 anchor build 命令来构建程序。

anchor build

现在让我们部署我们的程序。

anchor deploy

solana程序部署将输出您的程序的程序ID。您现在可以在Solana Explorer上查找已部署的程序(对于本地主机,请选择“自定义RPC URL”作为集群)。

5. 查看程序日志

在我们调用程序之前,打开一个单独的终端并运行solana logs命令。这将允许我们在终端中查看程序日志。

solana logs <PROGRAM_ID>

或者也可以通过(Solana Exporer)[https://explorer.solana.com/?cluster=custom],查看产生的日志📔。

在测试验证器仍在运行时,尝试使用此处的客户端脚本调用您的程序。

这将返回一个Solana Explorer的URL(Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=custom)。将URL复制到浏览器中,在Solana Explorer上查找该交易,并检查程序日志中是否打印了“Hello, world!”。或者,您可以在运行solana logs命令的终端中查看程序日志。

就是这样!您刚刚在本地开发环境中创建并部署了您的第一个程序。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/local_program_development/index.html b/docs/Solana-Co-Learn/module1/local_program_development/index.html index eb1dbfd47..2a7dfa476 100644 --- a/docs/Solana-Co-Learn/module1/local_program_development/index.html +++ b/docs/Solana-Co-Learn/module1/local_program_development/index.html @@ -3,15 +3,15 @@ -Local Program Development | All in One Solana - - - +Local Program Development | All in One Solana + + +
-

Local Program Development

简而言之

  • 要在本地开始使用Solana,首先需要安装RustSolana CLI
  • 使用Solana CLI,您可以使用solana-test-validator命令运行本地测试验证器
  • 一旦您安装了Rust和Solana CLI,您就可以使用cargo build-sbfsolana program deploy命令在本地构建和部署您的程序
  • 您可以使用solana logs命令查看程序日志

概述

到目前为止,在这门课程中,我们一直使用Solana Playground来开发和部署Solana程序。

虽然这是一个很好的工具,但对于某些复杂的项目,您可能更喜欢设置一个本地开发环境。

这可能是为了使用Solana Playground不支持的crate,利用您创建的自定义脚本或工具,或者仅仅是出于个人偏好。

话虽如此,这节课与其他课程有些不同。与其涵盖大量关于如何编写程序或与Solana网络交互的内容,这节课主要侧重于设置本地开发环境这个不那么引人注目的任务。

为了从您的计算机上构建、测试和部署Solana程序,您需要安装Rust编译器和Solana命令行界面(CLI)。我们将首先指导您完成这些安装过程,然后介绍如何使用您刚刚安装的工具。

以下安装说明包含了安装Rust和Solana CLI的步骤,截至撰写本文时的最新版本。由于您阅读时可能已有更新,如果遇到问题,请参考官方安装页面:

在Windows上设置(带有Linux)

下载Windows子系统Linux(WSL)

如果你使用的是Windows电脑,建议使用Windows子系统Linux(WSL)来构建你的Solana程序。

打开管理员权限的PowerShell或Windows命令提示符,检查Windows版本

winver

如果您使用的是Windows 10版本2004及更高版本(Build 19041及更高版本)或Windows 11,请运行以下命令。

wsl --install

如果您正在使用较旧版本的Windows,请按照这里的说明进行操作。

您可以在这里阅读更多关于安装WSL的信息。

下载Ubuntu

接下来,在这里下载Ubuntu。Ubuntu提供了一个终端,可以让你在Windows电脑上运行Linux。这就是你将运行Solana CLI命令的地方。

下载 Rust(适用于 WSL)

接下来,打开Ubuntu终端并使用以下命令下载适用于WSL的Rust。您可以在此处阅读有关下载Rust的更多信息。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

下载 Solana CLI

现在我们准备下载适用于Linux的Solana CLI。请在Ubuntu终端中运行以下命令。您可以在此处阅读有关下载Solana CLI的更多信息。

sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)"

在 macOS 上进行设置

下载 Rust

首先,按照这里的说明下载Rust

下载Solana CLI

接下来,在终端中运行以下命令下载Solana CLI。

sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)"

您可以在这里了解更多关于下载Solana CLI的信息。

Solana CLI基础

Solana CLI是一个命令行界面工具,提供了一系列命令,用于与Solana集群进行交互。

在本课程中,我们将介绍一些最常见的命令,但您始终可以通过运行solana --help来查看所有可能的Solana CLI命令列表。

Solana CLI 配置

Solana CLI存储了一些配置设置,这些设置会影响某些命令的行为。您可以使用以下命令查看当前的配置:

solana config get

solana config get命令将返回以下内容:

  • 配置文件 - Solana CLI所在的文件位于您的计算机上
  • RPC URL - 您正在使用的端点,将您连接到本地主机、开发网络或主网络
  • WebSocket URL - 监听来自目标集群的事件的WebSocket(在设置RPC URL时计算)
  • 密钥对路径 - 在运行Solana CLI子命令时使用的密钥对路径
  • Commitment - 提供了网络确认的度量,并描述了一个区块在特定时间点上的最终性程度

您可以随时使用solana config set命令更改您的Solana CLI配置,然后跟上您想要更新的设置。

最常见的更改将是您要定位的集群。使用solana config set --url命令更改RPC URL。

# localhost
solana config set --url localhost

# devnet
solana config set --url devnet


# mainnet-beta
solana config set --url mainnet-beta

同样地,您可以使用solana config set --keypair命令来更改密钥对路径。当运行命令时,Solana CLI将使用指定路径下的密钥对。

solana config set --keypair ~/<FILE_PATH>

测试验证器

你会发现在测试和调试时运行本地验证器比部署到开发网络更有帮助。

您可以使用solana-test-validator命令运行本地测试验证器。该命令会创建一个持续运行的进程,需要单独的命令行窗口。

Stream program logs

通常在打开一个新的控制台并在测试验证器旁边运行solana logs命令会很有帮助。这将创建另一个持续进行的进程,用于流式传输与您配置的集群相关的日志。

如果您的CLI配置指向本地主机,则日志将始终与您创建的测试验证器相关联,但您也可以从其他集群(如Devnet和Mainnet Beta)流式传输日志。当从其他集群流式传输日志时,您需要在命令中包含一个程序ID,以限制您所看到的日志仅针对您的特定程序。

密钥对

您可以使用solana-keygen new --outfile命令生成一个新的密钥对,并指定文件路径以存储该密钥对。

solana-keygen new --outfile ~/<FILE_PATH>

有时候你可能需要检查你的配置指向哪个密钥对。要查看当前在solana config中设置的密钥对的公钥,请使用solana address命令。

solana address

要查看在solana配置中设置的当前密钥对的SOL余额,请使用solana balance命令。

solana balance

要在Devnet或本地主机上进行SOL的空投,请使用solana airdrop命令。请注意,在Devnet上,每次空投限制为2个SOL。

solana airdrop 2

在您开发和测试本地环境中的程序时,很可能会遇到由以下原因引起的错误:

  • 使用错误的密钥对
  • 没有足够的SOL来部署您的程序或执行交易
  • 指向错误的集群

到目前为止,我们已经介绍了一些CLI命令,这些命令应该能帮助您快速解决那些问题。

在您的本地环境中开发Solana程序

尽管Solana Playground非常有帮助,但自己的本地开发环境的灵活性是无法比拟的。随着您构建更复杂的程序,您可能会将它们与一个或多个正在本地环境中开发的客户端集成在一起。在本地编写、构建和部署程序时,程序与客户端之间的测试通常更简单。

创建一个新项目

要创建一个新的Rust包来编写Solana程序,您可以使用cargo new --lib命令,并指定您想要创建的新目录的名称。

cargo new --lib <PROJECT_DIRECTORY_NAME>

这个命令将在命令的末尾创建一个以您指定的名称命名的新目录。这个新目录将包含一个描述包的Cargo.toml清单文件。

清单文件包含元数据,如名称、版本和依赖项(包)。要编写Solana程序,您需要更新Cargo.toml文件,将solana-program作为依赖项包括进去。您可能还需要添加下面显示的[lib]crate-type行。

[package]
name = "<PROJECT_DIRECTORY_NAME>"
version = "0.1.0"
edition = "2021"

[features]
no-entrypoint = []

[dependencies]
solana-program = "~1.8.14"

[lib]
crate-type = ["cdylib", "lib"]

在那个时候,你可以开始在src文件夹中编写你的程序。

构建和部署

当你准备构建你的Solana程序时,你可以使用cargo build-sbf命令。

cargo build-sbf

这个命令的输出将包含部署程序的指令,大致如下:

To deploy this program:
$ solana program deploy /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local.so
The program address will default to this keypair (override with --program-id):
/Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local-keypair.json

当您准备部署程序时,请使用从cargo build-sbf命令输出的solana program deploy命令。这将把您的程序部署到CLI配置中指定的集群。

solana program deploy <PATH>

挑战

现在轮到你独立构建一些东西了。尝试创建一个新的程序,将你自己的消息打印到程序日志中。这次将你的程序部署到Devnet而不是本地主机。

记得使用solana config set --url命令将你的RPC URL更新为Devnet。

只要你将连接和Solana Explorer的URL更新为指向Devnet而不是localhost,你就可以使用与演示中相同的客户端脚本来调用该程序。

let connection = new web3.Connection(web3.clusterApiUrl("devnet"));
console.log(
`Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
);

您还可以打开一个单独的命令行窗口,并使用solana logs | grep " invoke" -A 。在Devnet上使用solana logs时,您必须指定程序ID。否则,solana logs命令将返回来自Devnet的持续日志流。例如,您可以按照以下步骤监视对Token程序的调用,并显示每个调用的前5行日志:

solana logs | grep "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke" -A 5
- - +

Local Program Development

简而言之

  • 要在本地开始使用Solana,首先需要安装RustSolana CLI
  • 使用Solana CLI,您可以使用solana-test-validator命令运行本地测试验证器
  • 一旦您安装了Rust和Solana CLI,您就可以使用cargo build-sbfsolana program deploy命令在本地构建和部署您的程序
  • 您可以使用solana logs命令查看程序日志

概述

到目前为止,在这门课程中,我们一直使用Solana Playground来开发和部署Solana程序。

虽然这是一个很好的工具,但对于某些复杂的项目,您可能更喜欢设置一个本地开发环境。

这可能是为了使用Solana Playground不支持的crate,利用您创建的自定义脚本或工具,或者仅仅是出于个人偏好。

话虽如此,这节课与其他课程有些不同。与其涵盖大量关于如何编写程序或与Solana网络交互的内容,这节课主要侧重于设置本地开发环境这个不那么引人注目的任务。

为了从您的计算机上构建、测试和部署Solana程序,您需要安装Rust编译器和Solana命令行界面(CLI)。我们将首先指导您完成这些安装过程,然后介绍如何使用您刚刚安装的工具。

以下安装说明包含了安装Rust和Solana CLI的步骤,截至撰写本文时的最新版本。由于您阅读时可能已有更新,如果遇到问题,请参考官方安装页面:

在Windows上设置(带有Linux)

下载Windows子系统Linux(WSL)

如果你使用的是Windows电脑,建议使用Windows子系统Linux(WSL)来构建你的Solana程序。

打开管理员权限的PowerShell或Windows命令提示符,检查Windows版本

winver

如果您使用的是Windows 10版本2004及更高版本(Build 19041及更高版本)或Windows 11,请运行以下命令。

wsl --install

如果您正在使用较旧版本的Windows,请按照这里的说明进行操作。

您可以在这里阅读更多关于安装WSL的信息。

下载Ubuntu

接下来,在这里下载Ubuntu。Ubuntu提供了一个终端,可以让你在Windows电脑上运行Linux。这就是你将运行Solana CLI命令的地方。

下载 Rust(适用于 WSL)

接下来,打开Ubuntu终端并使用以下命令下载适用于WSL的Rust。您可以在此处阅读有关下载Rust的更多信息。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

下载 Solana CLI

现在我们准备下载适用于Linux的Solana CLI。请在Ubuntu终端中运行以下命令。您可以在此处阅读有关下载Solana CLI的更多信息。

sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)"

在 macOS 上进行设置

下载 Rust

首先,按照这里的说明下载Rust

下载Solana CLI

接下来,在终端中运行以下命令下载Solana CLI。

sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)"

您可以在这里了解更多关于下载Solana CLI的信息。

Solana CLI基础

Solana CLI是一个命令行界面工具,提供了一系列命令,用于与Solana集群进行交互。

在本课程中,我们将介绍一些最常见的命令,但您始终可以通过运行solana --help来查看所有可能的Solana CLI命令列表。

Solana CLI 配置

Solana CLI存储了一些配置设置,这些设置会影响某些命令的行为。您可以使用以下命令查看当前的配置:

solana config get

solana config get命令将返回以下内容:

  • 配置文件 - Solana CLI所在的文件位于您的计算机上
  • RPC URL - 您正在使用的端点,将您连接到本地主机、开发网络或主网络
  • WebSocket URL - 监听来自目标集群的事件的WebSocket(在设置RPC URL时计算)
  • 密钥对路径 - 在运行Solana CLI子命令时使用的密钥对路径
  • Commitment - 提供了网络确认的度量,并描述了一个区块在特定时间点上的最终性程度

您可以随时使用solana config set命令更改您的Solana CLI配置,然后跟上您想要更新的设置。

最常见的更改将是您要定位的集群。使用solana config set --url命令更改RPC URL。

# localhost
solana config set --url localhost

# devnet
solana config set --url devnet


# mainnet-beta
solana config set --url mainnet-beta

同样地,您可以使用solana config set --keypair命令来更改密钥对路径。当运行命令时,Solana CLI将使用指定路径下的密钥对。

solana config set --keypair ~/<FILE_PATH>

测试验证器

你会发现在测试和调试时运行本地验证器比部署到开发网络更有帮助。

您可以使用solana-test-validator命令运行本地测试验证器。该命令会创建一个持续运行的进程,需要单独的命令行窗口。

Stream program logs

通常在打开一个新的控制台并在测试验证器旁边运行solana logs命令会很有帮助。这将创建另一个持续进行的进程,用于流式传输与您配置的集群相关的日志。

如果您的CLI配置指向本地主机,则日志将始终与您创建的测试验证器相关联,但您也可以从其他集群(如Devnet和Mainnet Beta)流式传输日志。当从其他集群流式传输日志时,您需要在命令中包含一个程序ID,以限制您所看到的日志仅针对您的特定程序。

密钥对

您可以使用solana-keygen new --outfile命令生成一个新的密钥对,并指定文件路径以存储该密钥对。

solana-keygen new --outfile ~/<FILE_PATH>

有时候你可能需要检查你的配置指向哪个密钥对。要查看当前在solana config中设置的密钥对的公钥,请使用solana address命令。

solana address

要查看在solana配置中设置的当前密钥对的SOL余额,请使用solana balance命令。

solana balance

要在Devnet或本地主机上进行SOL的空投,请使用solana airdrop命令。请注意,在Devnet上,每次空投限制为2个SOL。

solana airdrop 2

在您开发和测试本地环境中的程序时,很可能会遇到由以下原因引起的错误:

  • 使用错误的密钥对
  • 没有足够的SOL来部署您的程序或执行交易
  • 指向错误的集群

到目前为止,我们已经介绍了一些CLI命令,这些命令应该能帮助您快速解决那些问题。

在您的本地环境中开发Solana程序

尽管Solana Playground非常有帮助,但自己的本地开发环境的灵活性是无法比拟的。随着您构建更复杂的程序,您可能会将它们与一个或多个正在本地环境中开发的客户端集成在一起。在本地编写、构建和部署程序时,程序与客户端之间的测试通常更简单。

创建一个新项目

要创建一个新的Rust包来编写Solana程序,您可以使用cargo new --lib命令,并指定您想要创建的新目录的名称。

cargo new --lib <PROJECT_DIRECTORY_NAME>

这个命令将在命令的末尾创建一个以您指定的名称命名的新目录。这个新目录将包含一个描述包的Cargo.toml清单文件。

清单文件包含元数据,如名称、版本和依赖项(包)。要编写Solana程序,您需要更新Cargo.toml文件,将solana-program作为依赖项包括进去。您可能还需要添加下面显示的[lib]crate-type行。

[package]
name = "<PROJECT_DIRECTORY_NAME>"
version = "0.1.0"
edition = "2021"

[features]
no-entrypoint = []

[dependencies]
solana-program = "~1.8.14"

[lib]
crate-type = ["cdylib", "lib"]

在那个时候,你可以开始在src文件夹中编写你的程序。

构建和部署

当你准备构建你的Solana程序时,你可以使用cargo build-sbf命令。

cargo build-sbf

这个命令的输出将包含部署程序的指令,大致如下:

To deploy this program:
$ solana program deploy /Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local.so
The program address will default to this keypair (override with --program-id):
/Users/James/Dev/Work/solana-hello-world-local/target/deploy/solana_hello_world_local-keypair.json

当您准备部署程序时,请使用从cargo build-sbf命令输出的solana program deploy命令。这将把您的程序部署到CLI配置中指定的集群。

solana program deploy <PATH>

挑战

现在轮到你独立构建一些东西了。尝试创建一个新的程序,将你自己的消息打印到程序日志中。这次将你的程序部署到Devnet而不是本地主机。

记得使用solana config set --url命令将你的RPC URL更新为Devnet。

只要你将连接和Solana Explorer的URL更新为指向Devnet而不是localhost,你就可以使用与演示中相同的客户端脚本来调用该程序。

let connection = new web3.Connection(web3.clusterApiUrl("devnet"));
console.log(
`Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
);

您还可以打开一个单独的命令行窗口,并使用solana logs | grep " invoke" -A 。在Devnet上使用solana logs时,您必须指定程序ID。否则,solana logs命令将返回来自Devnet的持续日志流。例如,您可以按照以下步骤监视对Token程序的调用,并显示每个调用的前5行日志:

solana logs | grep "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke" -A 5
+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello/index.html b/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello/index.html index b226b995c..27778906b 100644 --- a/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello/index.html +++ b/docs/Solana-Co-Learn/module1/local_program_development/native_program_hello/index.html @@ -3,15 +3,15 @@ -原始Solana合约实现《hello, World》 | All in One Solana - - - +原始Solana合约实现《hello, World》 | All in One Solana + + +
-

原始Solana合约实现《hello, World》

让我们通过构建和部署“Hello World!”程序来进行练习。

我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保您已经安装了Rust和Solana CLI。如果您还没有安装,请参考概述中的说明进行设置。

1. 创建一个新的Rust项目

让我们从创建一个新的Rust项目开始。运行下面的cargo new --lib命令。随意用你自己的目录名替换它。

cargo new --lib solana-hello-world-local

记得更新 cargo.toml 文件,将 solana-program 添加为依赖项,并检查 crate-type 是否已经存在。

[package]
name = "solana-hello-world-local"
version = "0.1.0"
edition = "2021"

[dependencies]
solana-program = "~1.8.14"

[lib]
crate-type = ["cdylib", "lib"]

2. 编写你的程序

接下来,使用下面的“Hello World!”程序更新lib.rs。当程序被调用时,该程序会简单地将“Hello, world!”打印到程序日志中。

use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg
};

entrypoint!(process_instruction);

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult{
msg!("Hello, world!");

Ok(())
}

3. 运行本地测试验证器

在编写好你的程序之后,让我们确保我们的Solana CLI配置指向本地主机,使用solana config set --url命令。

solana config set --url localhost

接下来,使用solana config get命令检查Solana CLI配置是否已更新。

solana config get

最后,运行本地测试验证器。在一个单独的终端窗口中运行solana-test-validator命令。只有当我们的RPC URL设置为localhost时才需要这样做。

solana-test-validator

4. 构建和部署

我们现在准备好构建和部署我们的程序了。通过运行 cargo build-sbf 命令来构建程序。

cargo build-sbf

现在让我们部署我们的程序。运行从cargo build-sbf命令输出的solana program deploy命令。

solana program deploy <PATH>

solana程序部署将输出您的程序的程序ID。您现在可以在Solana Explorer上查找已部署的程序(对于本地主机,请选择“自定义RPC URL”作为集群)。

5. 查看程序日志

在我们调用程序之前,打开一个单独的终端并运行solana logs命令。这将允许我们在终端中查看程序日志。

solana logs <PROGRAM_ID>

在测试验证器仍在运行时,尝试使用此处的客户端脚本调用您的程序。

index.ts中用刚刚部署的程序ID替换掉原来的程序ID,然后运行npm install,接着运行npm start。这将返回一个Solana Explorer的URL。将URL复制到浏览器中,在Solana Explorer上查找该交易,并检查程序日志中是否打印了“Hello, world!”。或者,您可以在运行solana logs命令的终端中查看程序日志。

就是这样!您刚刚在本地开发环境中创建并部署了您的第一个程序。

- - +

原始Solana合约实现《hello, World》

让我们通过构建和部署“Hello World!”程序来进行练习。

我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保您已经安装了Rust和Solana CLI。如果您还没有安装,请参考概述中的说明进行设置。

1. 创建一个新的Rust项目

让我们从创建一个新的Rust项目开始。运行下面的cargo new --lib命令。随意用你自己的目录名替换它。

cargo new --lib solana-hello-world-local

记得更新 cargo.toml 文件,将 solana-program 添加为依赖项,并检查 crate-type 是否已经存在。

[package]
name = "solana-hello-world-local"
version = "0.1.0"
edition = "2021"

[dependencies]
solana-program = "~1.8.14"

[lib]
crate-type = ["cdylib", "lib"]

2. 编写你的程序

接下来,使用下面的“Hello World!”程序更新lib.rs。当程序被调用时,该程序会简单地将“Hello, world!”打印到程序日志中。

use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg
};

entrypoint!(process_instruction);

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult{
msg!("Hello, world!");

Ok(())
}

3. 运行本地测试验证器

在编写好你的程序之后,让我们确保我们的Solana CLI配置指向本地主机,使用solana config set --url命令。

solana config set --url localhost

接下来,使用solana config get命令检查Solana CLI配置是否已更新。

solana config get

最后,运行本地测试验证器。在一个单独的终端窗口中运行solana-test-validator命令。只有当我们的RPC URL设置为localhost时才需要这样做。

solana-test-validator

4. 构建和部署

我们现在准备好构建和部署我们的程序了。通过运行 cargo build-sbf 命令来构建程序。

cargo build-sbf

现在让我们部署我们的程序。运行从cargo build-sbf命令输出的solana program deploy命令。

solana program deploy <PATH>

solana程序部署将输出您的程序的程序ID。您现在可以在Solana Explorer上查找已部署的程序(对于本地主机,请选择“自定义RPC URL”作为集群)。

5. 查看程序日志

在我们调用程序之前,打开一个单独的终端并运行solana logs命令。这将允许我们在终端中查看程序日志。

solana logs <PROGRAM_ID>

在测试验证器仍在运行时,尝试使用此处的客户端脚本调用您的程序。

index.ts中用刚刚部署的程序ID替换掉原来的程序ID,然后运行npm install,接着运行npm start。这将返回一个Solana Explorer的URL。将URL复制到浏览器中,在Solana Explorer上查找该交易,并检查程序日志中是否打印了“Hello, world!”。或者,您可以在运行solana logs命令的终端中查看程序日志。

就是这样!您刚刚在本地开发环境中创建并部署了您的第一个程序。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello/index.html b/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello/index.html index 27ed26d9c..22624cb89 100644 --- a/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello/index.html +++ b/docs/Solana-Co-Learn/module1/local_program_development/solang_program_hello/index.html @@ -3,16 +3,16 @@ -使用Solang编译器编译solidity合约实现《hello, World》 | All in One Solana - - - +使用Solang编译器编译solidity合约实现《hello, World》 | All in One Solana + + +
-

使用Solang编译器编译solidity合约实现《hello, World》

欢迎来到Solana入门指南!Solang是一个Solidity编译器,它允许您使用Solidity编程语言编写Solana程序,其他区块链中称为“智能合约”。

如果你是一位对Solana网络的高速和低费用感兴趣的EVM开发者,那么Solang是你的完美工具。通过Solang,你可以利用你对Solidity的现有知识开始在Solana上进行构建!

安装

在本节中,我们将帮助您设置Solang的开发环境。只需按照下面列出的步骤进行操作即可:

  1. 检查先决条件:在开始之前,请确保您的系统上已安装了RustNode.js。Windows用户还需要设置好Windows子系统以便运行Linux。

  2. Solana工具套件安装:首先安装Solana工具套件,其中包括Solana命令行界面(CLI)和最新版本的Solang。

  3. Anchor框架安装:接下来,安装Anchor框架。Anchor是Solana生态系统中广泛使用的框架,可以简化构建Solana程序的过程。从0.28版本开始,您可以直接通过Anchor开始使用Solang进行构建。

截至撰写本文时,请使用以下命令安装Anchor,以确保与Solang版本0.3.1兼容:

cargo install --git https://github.com/coral-xyz/anchor anchor-cli --locked --force
  1. Solang扩展适用于VSCode:如果您是Visual Studio Code(VSCode)的用户,建议安装Solang扩展以辅助语法高亮显示。请记得禁用任何活动的Solidity扩展,以确保Solang扩展正常工作。

创建一个新项目

一旦您安装了Solana CLI和Anchor,您可以使用以下命令创建一个新项目:

anchor init project_name --solidity

该命令生成一个新项目,其中包含一个基本的Solang on-chain程序(相当于EVM上的智能合约)和一个测试文件,演示了如何从客户端与该程序进行交互。

链上程序概述

接下来,让我们来看一下从链上程序本身开始的初始代码。在您的项目的 ./solidity 目录中,您将找到下面的合约,其中包括:

  • 一个 constructor 用于初始化状态变量的函数
  • 一个用于将消息打印到程序日志的函数
  • 一个用于更新状态变量的函数
  • 一个函数,用于返回状态变量的当前值
@program_id("F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC")
contract starter {
bool private value = true;

@payer(payer)
constructor(address payer) {
print("Hello, World!");
}

/// A message that can be called on instantiated contracts.
/// This one flips the value of the stored `bool` from `true`
/// to `false` and vice versa.
function flip() public {
value = !value;
}

/// Simply returns the current value of our `bool`.
function get() public view returns (bool) {
return value;
}
}

重要的差异

与EVM智能合约相比,你可能会注意到两个重要的区别:

  1. @program_id 注解: -在Solana上,智能合约被称为“程序”。使用 @program_id 注释来指定程序的链上地址。
@program_id("F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC") // on-chain program address
  1. @payer 注解:

在链上存储数据时,需要分配一定数量的SOL来支付存储成本。注释 @payer 指定了将支付所需SOL以创建用于存储状态变量的账户的用户。

@payer(payer) // payer for the "data account"
constructor(address payer) {
print("Hello, World!");
}

状态数据的存储

EVM智能合约和Solana程序之间的一个重要区别在于它们如何存储“状态”变量/数据:

  • EVM智能合约可以直接存储状态变量。
  • Solana的链上程序则会创建单独的账户来存储状态数据。这些账户通常被称为“数据账户”,并且是由程序“拥有”。

在这个例子中,当合约部署时,它被部署到 @program_id 中指定的地址。当程序部署后调用 constructor 时,会创建一个独立的帐户,用于存储状态变量,而不是存储在合约本身内部。

这可能听起来有点不同于你所习惯的,但别担心!让我们来看一下测试文件,以更好地理解这个概念。

测试文件概述

起始测试文件可以在 ./tests 目录中找到。该文件提供了一个与客户端交互的示例。

Anchor设置了 providerprogram ,以帮助我们从客户端连接到合约。这是通过使用IDL文件来完成的,该文件描述了程序的公共接口,类似于EVM智能合约中使用的ABI文件。如果您运行 anchor build ,则会生成IDL文件,并且可以在 ./target/idl 找到。

import * as anchor from "@coral-xyz/anchor"
import { Program } from "@coral-xyz/anchor"
import { Starter } from "../target/types/starter"

describe("starter", () => {
// Configure the client to use the local cluster.
const provider = anchor.AnchorProvider.env()
anchor.setProvider(provider)

const dataAccount = anchor.web3.Keypair.generate()
const wallet = provider.wallet

const program = anchor.workspace.Starter as Program<Starter>

it("Is initialized!", async () => {
// Add your test here.
const tx = await program.methods
.new(wallet.publicKey)
.accounts({ dataAccount: dataAccount.publicKey })
.signers([dataAccount])
.rpc()
console.log("Your transaction signature", tx)

const val1 = await program.methods
.get()
.accounts({ dataAccount: dataAccount.publicKey })
.view()

console.log("state", val1)

await program.methods
.flip()
.accounts({ dataAccount: dataAccount.publicKey })
.rpc()

const val2 = await program.methods
.get()
.accounts({ dataAccount: dataAccount.publicKey })
.view()

console.log("state", val2)
})
})

在测试文件中,我们首先生成一个新的密钥对,用于创建存储合约状态的“数据账户”。

const dataAccount = anchor.web3.Keypair.generate();

接下来,我们使用 new 指令来创建一个新的数据账户。这个指令对应于合约的 constructor 。新创建的数据账户将被初始化,用于存储合约中定义的状态变量。

在这里, payer 被指定为 wallet.publicKey ,并提供了我们计划创建的 dataAccount 的地址。生成的 dataAccount Keypair作为交易的附加签名者包含在其中,因为它被用于创建一个新的账户。基本上,这个操作验证了我们持有与我们正在创建的新账户地址相对应的私钥。

// Client
const tx = await program.methods
.new(wallet.publicKey)
.accounts({ dataAccount: dataAccount.publicKey })
.signers([dataAccount])
.rpc()

// on-chain program
@payer(payer)
constructor(address payer) {
print("Hello, World!");
}

合约的 get 函数被调用以获取存储在指定 dataAccount 中的值。

// Client
const val1 = await program.methods
.get()
.accounts({ dataAccount: dataAccount.publicKey })
.view()

// on-chain program
function get() public view returns (bool) {
return value;
}

接下来,合约的 flip 函数被用来修改指定 dataAccount 的状态。

// Client
await program.methods
.flip()
.accounts({ dataAccount: dataAccount.publicKey })
.rpc()

// on-chain program
function flip() public {
value = !value;
}

要运行测试,请在终端中使用 anchor test 命令。

anchor test 命令执行以下任务:

  • 启动本地Solana验证节点
  • 构建并部署您的链上程序到本地验证节点
  • 运行测试文件

接下来应该在控制台中显示以下输出:

Your transaction signature 2x7jh3yka9LU6ZeJLUZNNDJSzq6vdUAXk3mUKuP1MYwr6ArYMHDGw6i15jJnMtnC7BP7zKactStHhTekjq2vh6hP
state true
state false
✔ Is initialized! (782ms)

您可以在 ./.anchor/program-logs 中查看程序日志,那里会找到“Hello, World!”的消息

Program F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC invoke [1]
Program 11111111111111111111111111111111 invoke [2]
Program 11111111111111111111111111111111 success
Program log: Hello, World!

恭喜!你成功地使用 Solang 构建了你的第一个 Solana 程序!虽然与标准 Solidity 智能合约相比可能存在一些差异,但 Solang 提供了一个极好的桥梁,帮助你利用现有的 Solidity 技能和经验来构建 Solana 上的应用。

下一步

有兴趣深入了解吗?请查看 solana-developers/program-examples 存储库。您将在 basics 和 tokens 部分找到适用于常见Solana用例的Solang实现。

如果你有问题,请随时在Solana Stack exchange上发布。如果你有关于Solang维护者的问题,可以直接在Hyperledger Foundation的discord上联系他们。

玩得开心,尽情建造吧!

- - +

使用Solang编译器编译solidity合约实现《hello, World》

欢迎来到Solana入门指南!Solang是一个Solidity编译器,它允许您使用Solidity编程语言编写Solana程序,其他区块链中称为“智能合约”。

如果你是一位对Solana网络的高速和低费用感兴趣的EVM开发者,那么Solang是你的完美工具。通过Solang,你可以利用你对Solidity的现有知识开始在Solana上进行构建!

安装

在本节中,我们将帮助您设置Solang的开发环境。只需按照下面列出的步骤进行操作即可:

  1. 检查先决条件:在开始之前,请确保您的系统上已安装了RustNode.js。Windows用户还需要设置好Windows子系统以便运行Linux。

  2. Solana工具套件安装:首先安装Solana工具套件,其中包括Solana命令行界面(CLI)和最新版本的Solang。

  3. Anchor框架安装:接下来,安装Anchor框架。Anchor是Solana生态系统中广泛使用的框架,可以简化构建Solana程序的过程。从0.28版本开始,您可以直接通过Anchor开始使用Solang进行构建。

截至撰写本文时,请使用以下命令安装Anchor,以确保与Solang版本0.3.1兼容:

cargo install --git https://github.com/coral-xyz/anchor anchor-cli --locked --force
  1. Solang扩展适用于VSCode:如果您是Visual Studio Code(VSCode)的用户,建议安装Solang扩展以辅助语法高亮显示。请记得禁用任何活动的Solidity扩展,以确保Solang扩展正常工作。

创建一个新项目

一旦您安装了Solana CLI和Anchor,您可以使用以下命令创建一个新项目:

anchor init project_name --solidity

该命令生成一个新项目,其中包含一个基本的Solang on-chain程序(相当于EVM上的智能合约)和一个测试文件,演示了如何从客户端与该程序进行交互。

链上程序概述

接下来,让我们来看一下从链上程序本身开始的初始代码。在您的项目的 ./solidity 目录中,您将找到下面的合约,其中包括:

  • 一个 constructor 用于初始化状态变量的函数
  • 一个用于将消息打印到程序日志的函数
  • 一个用于更新状态变量的函数
  • 一个函数,用于返回状态变量的当前值
@program_id("F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC")
contract starter {
bool private value = true;

@payer(payer)
constructor(address payer) {
print("Hello, World!");
}

/// A message that can be called on instantiated contracts.
/// This one flips the value of the stored `bool` from `true`
/// to `false` and vice versa.
function flip() public {
value = !value;
}

/// Simply returns the current value of our `bool`.
function get() public view returns (bool) {
return value;
}
}

重要的差异

与EVM智能合约相比,你可能会注意到两个重要的区别:

  1. @program_id 注解: +在Solana上,智能合约被称为“程序”。使用 @program_id 注释来指定程序的链上地址。
@program_id("F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC") // on-chain program address
  1. @payer 注解:

在链上存储数据时,需要分配一定数量的SOL来支付存储成本。注释 @payer 指定了将支付所需SOL以创建用于存储状态变量的账户的用户。

@payer(payer) // payer for the "data account"
constructor(address payer) {
print("Hello, World!");
}

状态数据的存储

EVM智能合约和Solana程序之间的一个重要区别在于它们如何存储“状态”变量/数据:

  • EVM智能合约可以直接存储状态变量。
  • Solana的链上程序则会创建单独的账户来存储状态数据。这些账户通常被称为“数据账户”,并且是由程序“拥有”。

在这个例子中,当合约部署时,它被部署到 @program_id 中指定的地址。当程序部署后调用 constructor 时,会创建一个独立的帐户,用于存储状态变量,而不是存储在合约本身内部。

这可能听起来有点不同于你所习惯的,但别担心!让我们来看一下测试文件,以更好地理解这个概念。

测试文件概述

起始测试文件可以在 ./tests 目录中找到。该文件提供了一个与客户端交互的示例。

Anchor设置了 providerprogram ,以帮助我们从客户端连接到合约。这是通过使用IDL文件来完成的,该文件描述了程序的公共接口,类似于EVM智能合约中使用的ABI文件。如果您运行 anchor build ,则会生成IDL文件,并且可以在 ./target/idl 找到。

import * as anchor from "@coral-xyz/anchor"
import { Program } from "@coral-xyz/anchor"
import { Starter } from "../target/types/starter"

describe("starter", () => {
// Configure the client to use the local cluster.
const provider = anchor.AnchorProvider.env()
anchor.setProvider(provider)

const dataAccount = anchor.web3.Keypair.generate()
const wallet = provider.wallet

const program = anchor.workspace.Starter as Program<Starter>

it("Is initialized!", async () => {
// Add your test here.
const tx = await program.methods
.new(wallet.publicKey)
.accounts({ dataAccount: dataAccount.publicKey })
.signers([dataAccount])
.rpc()
console.log("Your transaction signature", tx)

const val1 = await program.methods
.get()
.accounts({ dataAccount: dataAccount.publicKey })
.view()

console.log("state", val1)

await program.methods
.flip()
.accounts({ dataAccount: dataAccount.publicKey })
.rpc()

const val2 = await program.methods
.get()
.accounts({ dataAccount: dataAccount.publicKey })
.view()

console.log("state", val2)
})
})

在测试文件中,我们首先生成一个新的密钥对,用于创建存储合约状态的“数据账户”。

const dataAccount = anchor.web3.Keypair.generate();

接下来,我们使用 new 指令来创建一个新的数据账户。这个指令对应于合约的 constructor 。新创建的数据账户将被初始化,用于存储合约中定义的状态变量。

在这里, payer 被指定为 wallet.publicKey ,并提供了我们计划创建的 dataAccount 的地址。生成的 dataAccount Keypair作为交易的附加签名者包含在其中,因为它被用于创建一个新的账户。基本上,这个操作验证了我们持有与我们正在创建的新账户地址相对应的私钥。

// Client
const tx = await program.methods
.new(wallet.publicKey)
.accounts({ dataAccount: dataAccount.publicKey })
.signers([dataAccount])
.rpc()

// on-chain program
@payer(payer)
constructor(address payer) {
print("Hello, World!");
}

合约的 get 函数被调用以获取存储在指定 dataAccount 中的值。

// Client
const val1 = await program.methods
.get()
.accounts({ dataAccount: dataAccount.publicKey })
.view()

// on-chain program
function get() public view returns (bool) {
return value;
}

接下来,合约的 flip 函数被用来修改指定 dataAccount 的状态。

// Client
await program.methods
.flip()
.accounts({ dataAccount: dataAccount.publicKey })
.rpc()

// on-chain program
function flip() public {
value = !value;
}

要运行测试,请在终端中使用 anchor test 命令。

anchor test 命令执行以下任务:

  • 启动本地Solana验证节点
  • 构建并部署您的链上程序到本地验证节点
  • 运行测试文件

接下来应该在控制台中显示以下输出:

Your transaction signature 2x7jh3yka9LU6ZeJLUZNNDJSzq6vdUAXk3mUKuP1MYwr6ArYMHDGw6i15jJnMtnC7BP7zKactStHhTekjq2vh6hP
state true
state false
✔ Is initialized! (782ms)

您可以在 ./.anchor/program-logs 中查看程序日志,那里会找到“Hello, World!”的消息

Program F1ipperKF9EfD821ZbbYjS319LXYiBmjhzkkf5a26rC invoke [1]
Program 11111111111111111111111111111111 invoke [2]
Program 11111111111111111111111111111111 success
Program log: Hello, World!

恭喜!你成功地使用 Solang 构建了你的第一个 Solana 程序!虽然与标准 Solidity 智能合约相比可能存在一些差异,但 Solang 提供了一个极好的桥梁,帮助你利用现有的 Solidity 技能和经验来构建 Solana 上的应用。

下一步

有兴趣深入了解吗?请查看 solana-developers/program-examples 存储库。您将在 basics 和 tokens 部分找到适用于常见Solana用例的Solang实现。

如果你有问题,请随时在Solana Stack exchange上发布。如果你有关于Solang维护者的问题,可以直接在Hyperledger Foundation的discord上联系他们。

玩得开心,尽情建造吧!

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/index.html b/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/index.html index 875594a0c..1e74cd007 100644 --- a/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/index.html +++ b/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/index.html @@ -3,15 +3,15 @@ -💻 构建 NFT 铸币者前端 | All in One Solana - - - +💻 构建 NFT 铸币者前端 | All in One Solana + + +
-

💻 构建 NFT 铸币者前端

欢迎来到你的第一周的SHIPPING。每周你都会有一个专门的部分,将你的学习成果应用到你的定制NFT质押应用程序中,还有战利品箱子!

这些部分的整个目的是让你离开本地主机,构建一些真实的东西,供他人使用。之前的所有构建者都通过将他们的作品公之于众并在公开场合进行构建而取得了巨大的成功。这就是你一直在准备的时刻——让我们开始吧🤘。

今天我们将从前端开始制作这些光滑的登陆和薄荷页面。

第一个屏幕上唯一的功能是连接到用户的钱包。您可以使用屏幕顶部的按钮或中间的按钮来完成此操作。

第二个屏幕功能将在下一个核心项目中实现,因此无需为“mint buildoor”按钮实现任何内容。

🕸 设置项目

我们从头开始,这次没有模板!设置一个新的 Next.js 应用程序并向其中添加 Chakra UI:

npx create-next-app --typescript
cd <you-project-name>
npm i @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^6 @chakra-ui/icons
npm i @solana/wallet-adapter-base @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-wallets @solana/web3.js

注意:在整个项目中,我们将使用 Typescript!如果您愿意,我们非常欢迎您使用普通的 Javascript :)。

如果要求安装 create-next-app ,请说“是”。您可以为您的应用程序命名任何您想要的名称,我将我的应用程序命名为构建器,哈哈。

接下来您想要添加一些资产。您可以在这里购买,也可以自己制作。您将看到五个“头像”文件和一个背景 svg。将它们放入公共文件夹中。

✨ 设置 Chakra UI

第一个任务是设置 Chakra UI,这样我们就不必手动编写大量 CSS。我们将在 pages/_app.tsx 中执行此操作:

import type { AppProps } from "next/app"
import { ChakraProvider } from "@chakra-ui/react"

import { extendTheme } from "@chakra-ui/react"

const colors = {
background: "#1F1F1F",
accent: "#833BBE",
bodyText: "rgba(255, 255, 255, 0.75)",
}

const theme = extendTheme({ colors })

function MyApp({ Component, pageProps }: AppProps) {
return (
<ChakraProvider theme={theme}>
<Component {...pageProps} />
</ChakraProvider>
)
}

export default MyApp

我要为我的一些定制颜色,请确保您按照自己的喜好来调味!

🌶 添加一些样式

打开 styles/Home.module.css 并使其看起来像这样:

.container {
background: #1F1F1F;
}
.wallet-adapter-button-trigger {
background-color: #833BBE;
}

如果样式文件夹中有 globals.css 文件,请将其删除。我们不会需要它!

接下来我们有 index.tsx ,我们将更新导入以使用 Chakra UI 并渲染(单个 <div className={styles.container} 除外)。然后将导入更新为:

import { Box, Center, Spacer, Stack } from "@chakra-ui/react"
import type { NextPage } from "next"
import Head from "next/head"
import styles from "../styles/Home.module.css"

const Home: NextPage = () => {

return (
<div className={styles.container}>
<Head>
<title>Buildoors</title>
<meta name="The NFT Collection for Buildoors" />
<link rel="icon" href="/favicon.ico" />
</Head>

<Box
w="full"
h="calc(100vh)"
bgImage={"url(/home-background.svg)"}
backgroundPosition="center"
>
<Stack w="full" h="calc(100vh)" justify="center">
{ /* NavBar */ }

<Spacer />
<Center>
{ /* If connected, the second view, otherwise the first */ }
</Center>
<Spacer />

<Center>
<Box marginBottom={4} color="white">
<a
href="https://twitter.com/_buildspace"
target="_blank"
rel="noopener noreferrer"
>
built with @_buildspace
</a>
</Box>
</Center>
</Stack>
</Box>
</div>
)
}

export default Home

🎫 添加导航栏

现在让我们来构建 NavBar 。创建一个 components 文件夹并添加一个新文件 NavBar.tsx 。我们将其构建为一个水平堆栈,其中包括一个间隔器和一个用于连接钱包的按钮:

import { HStack, Spacer } from "@chakra-ui/react"
import { FC } from "react"
import styles from "../styles/Home.module.css"
import dynamic from "next/dynamic";

const WalletMultiButtonDynamic = dynamic(
async () =>
(await import("@solana/wallet-adapter-react-ui")).WalletMultiButton,
{ ssr: false }
);

const NavBar: FC = () => {
return (
<HStack width="full" padding={4}>
<Spacer />
<WalletMultiButtonDynamic className={styles["wallet-adapter-button-trigger"]}/>
</HStack>
)
}

export default NavBar

我们有 import dynamic from "next/dynamic"@solana/wallet-adapter-react-ui 动态导入 WalletMultiButton 并将其分配给 WalletMultiButtonDynamic ,如下所示:

const WalletMultiButtonDynamic = dynamic(
async () =>
(await import("@solana/wallet-adapter-react-ui")).WalletMultiButton,
{ ssr: false }
);

这是因为 NextJS 是服务器端渲染,在加载到客户端之前无法访问依赖于浏览器 API(如 window )的外部依赖项或组件。这意味着 NextJS 无法与只能在浏览器上使用的钱包进行交互。 { ssr: false } 禁用导入的服务器渲染。如果您的模块不使用动态导入,您很可能会遇到 Hydration failed because the initial UI does not match what was rendered on the server 。您可以在这里阅读有关动态导入的更多信息!

返回到 index.tsx ,导入 NavBar 并将其放在堆栈顶部(我留下了关于它应该在哪里的评论):

// Existing imports
import NavBar from "../components/NavBar"

const Home: NextPage = () => {

return (
<div className={styles.container}>
<Head>

<Box
w="full"
h="calc(100vh)"
bgImage={"url(/home-background.svg)"}
backgroundPosition="center"
>
<Stack w="full" h="calc(100vh)" justify="center">
{ /* NavBar */ }
<NavBar />

// Rest of the file remains the same

此时,除了“Connect Wallet”之外,您在 localhost:3000 上仍然没有任何内容。让我们解决这个问题。

🏠 创建登陆页面

components 文件夹中创建 Disconnected.tsx 文件并添加以下内容:

import { FC, MouseEventHandler, useCallback } from "react"
import {
Button,
Container,
Heading,
HStack,
Text,
VStack,
} from "@chakra-ui/react"
import { ArrowForwardIcon } from "@chakra-ui/icons"

const Disconnected: FC = () => {

const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
(event) => {
if (event.defaultPrevented) {
return
}
},
[]
)

return (
<Container>
<VStack spacing={20}>
<Heading
color="white"
as="h1"
size="3xl"
noOfLines={2}
textAlign="center"
>
Mint your buildoor. Earn $BLD. Level up.
</Heading>
<Button
bgColor="accent"
color="white"
maxW="380px"
onClick={handleClick}
>
<HStack>
<Text>become a buildoor</Text>
<ArrowForwardIcon />
</HStack>
</Button>
</VStack>
</Container>
)
}

export default Disconnected

这将是我们的登陆页面 - 用户访问网站时首先看到的视图。您需要将其导入到 index.tsx 中,并将其放置在渲染组件的中间(再次查找注释)。

// Existing imports
import Disconnected from '../components/Disconnected'

const Home: NextPage = () => {

return (
<div className={styles.container}>
<Head>

<Box
w="full"
h="calc(100vh)"
bgImage={"url(/home-background.svg)"}
backgroundPosition="center"
>
<Stack w="full" h="calc(100vh)" justify="center">
{ /* NavBar */ }
<NavBar />

<Spacer />
<Center>
<Disconnected />
</Center>
<Spacer />

// Rest of the file remains the same

现在,如果您查看 localhost:3000 ,您应该会看到带有“成为 buildoor”按钮的登录页面。如果你点击它,什么也不会发生。我们不喜欢什么都没有发生,让我们解决这个问题!

🔌 连接到用户的钱包

我们这里需要很多钩子。让我们把它们带进来:

npm i @solana/wallet-adapter-base @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-wallets @solana/web3.js

如果您正在为特定的钱包进行构建,那么您可以在此处进行更改,我只是坚持使用默认值:D

components 中创建一个 WalletContextProvider.tsx ,这样我们就可以将所有这些样板文件放入其中:

import { FC, ReactNode } from "react"
import {
ConnectionProvider,
WalletProvider,
} from "@solana/wallet-adapter-react"
import { WalletModalProvider } from "@solana/wallet-adapter-react-ui"
import { clusterApiUrl } from "@solana/web3.js"
import { PhantomWalletAdapter } from "@solana/wallet-adapter-wallets"
import { useMemo } from "react"
require("@solana/wallet-adapter-react-ui/styles.css")

const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => {
const url = useMemo(() => clusterApiUrl("devnet"), [])
const phantom = new PhantomWalletAdapter()

return (
<ConnectionProvider endpoint={url}>
<WalletProvider wallets={[phantom]}>
<WalletModalProvider>{children}</WalletModalProvider>
</WalletProvider>
</ConnectionProvider>
)
}

export default WalletContextProvider

我们需要将其导入 _app.tsx

import WalletContextProvider from '../components/WalletContextProvider'

<ChakraProvider theme={theme}>
<WalletContextProvider>
<Component {...pageProps} />
</WalletContextProvider>
</ChakraProvider>

现在我们还希望“成为建造者”按钮也能与您联系。在 Disconnected.tsx 中,添加这些导入

import { useWalletModal } from "@solana/wallet-adapter-react-ui"
import { useWallet } from "@solana/wallet-adapter-react"

然后在渲染之前将 Disconnected 的主体更新为以下内容:

const modalState = useWalletModal()
const { wallet, connect } = useWallet()

const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
(event) => {
if (event.defaultPrevented) {
return
}

if (!wallet) {
modalState.setVisible(true)
} else {
connect().catch(() => {})
}
},
[wallet, connect, modalState]
)

瞧,您应该能够连接了!

🎇 创建连接视图

现在我们可以连接了,我们需要更新视图以显示连接时的样子。让我们在 components 目录中创建一个 Connected.tsx 文件

import { FC } from "react"
import {
Button,
Container,
Heading,
HStack,
Text,
VStack,
Image,
} from "@chakra-ui/react"
import { ArrowForwardIcon } from "@chakra-ui/icons"

const Connected: FC = () => {
return (
<VStack spacing={20}>
<Container>
<VStack spacing={8}>
<Heading
color="white"
as="h1"
size="2xl"
noOfLines={1}
textAlign="center"
>
Welcome Buildoor.
</Heading>

<Text color="bodyText" fontSize="xl" textAlign="center">
Each buildoor is randomly generated and can be staked to receive
<Text as="b"> $BLD</Text> Use your <Text as="b"> $BLD</Text> to
upgrade your buildoor and receive perks within the community!
</Text>
</VStack>
</Container>

<HStack spacing={10}>
<Image src="avatar1.png" alt="" />
<Image src="avatar2.png" alt="" />
<Image src="avatar3.png" alt="" />
<Image src="avatar4.png" alt="" />
<Image src="avatar5.png" alt="" />
</HStack>

<Button bgColor="accent" color="white" maxW="380px">
<HStack>
<Text>mint buildoor</Text>
<ArrowForwardIcon />
</HStack>
</Button>
</VStack>
)
}

export default Connected

现在我们必须找到一种方法将其显示在屏幕上。回到 index.tsx ,让我们添加两个导入:

import { useWallet } from "@solana/wallet-adapter-react"
import Connected from "../components/Connected"

现在我们可以使用 useWallet hooks来访问一个变量,告诉我们是否已连接。我们可以使用它来有条件地渲染 ConnectedDisconnected 视图。

const Home: NextPage = () => {
const { connected } = useWallet()

return (
<div className={styles.container}>
<Head>
<title>Buildoors</title>
<meta name="The NFT Collection for Buildoors" />
<link rel="icon" href="/favicon.ico" />
</Head>

<Box
w="full"
h="calc(100vh)"
bgImage={connected ? "" : "url(/home-background.svg)"}
backgroundPosition="center"
>
<Stack w="full" h="calc(100vh)" justify="center">
<NavBar />

<Spacer />
<Center>{connected ? <Connected /> : <Disconnected />}</Center>
<Spacer />

好了,我们搞定了!我们已经设置好了前端,并且正在顺利地进行buildoors的铸造。

- - +

💻 构建 NFT 铸币者前端

欢迎来到你的第一周的SHIPPING。每周你都会有一个专门的部分,将你的学习成果应用到你的定制NFT质押应用程序中,还有战利品箱子!

这些部分的整个目的是让你离开本地主机,构建一些真实的东西,供他人使用。之前的所有构建者都通过将他们的作品公之于众并在公开场合进行构建而取得了巨大的成功。这就是你一直在准备的时刻——让我们开始吧🤘。

今天我们将从前端开始制作这些光滑的登陆和薄荷页面。

第一个屏幕上唯一的功能是连接到用户的钱包。您可以使用屏幕顶部的按钮或中间的按钮来完成此操作。

第二个屏幕功能将在下一个核心项目中实现,因此无需为“mint buildoor”按钮实现任何内容。

🕸 设置项目

我们从头开始,这次没有模板!设置一个新的 Next.js 应用程序并向其中添加 Chakra UI:

npx create-next-app --typescript
cd <you-project-name>
npm i @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^6 @chakra-ui/icons
npm i @solana/wallet-adapter-base @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-wallets @solana/web3.js

注意:在整个项目中,我们将使用 Typescript!如果您愿意,我们非常欢迎您使用普通的 Javascript :)。

如果要求安装 create-next-app ,请说“是”。您可以为您的应用程序命名任何您想要的名称,我将我的应用程序命名为构建器,哈哈。

接下来您想要添加一些资产。您可以在这里购买,也可以自己制作。您将看到五个“头像”文件和一个背景 svg。将它们放入公共文件夹中。

✨ 设置 Chakra UI

第一个任务是设置 Chakra UI,这样我们就不必手动编写大量 CSS。我们将在 pages/_app.tsx 中执行此操作:

import type { AppProps } from "next/app"
import { ChakraProvider } from "@chakra-ui/react"

import { extendTheme } from "@chakra-ui/react"

const colors = {
background: "#1F1F1F",
accent: "#833BBE",
bodyText: "rgba(255, 255, 255, 0.75)",
}

const theme = extendTheme({ colors })

function MyApp({ Component, pageProps }: AppProps) {
return (
<ChakraProvider theme={theme}>
<Component {...pageProps} />
</ChakraProvider>
)
}

export default MyApp

我要为我的一些定制颜色,请确保您按照自己的喜好来调味!

🌶 添加一些样式

打开 styles/Home.module.css 并使其看起来像这样:

.container {
background: #1F1F1F;
}
.wallet-adapter-button-trigger {
background-color: #833BBE;
}

如果样式文件夹中有 globals.css 文件,请将其删除。我们不会需要它!

接下来我们有 index.tsx ,我们将更新导入以使用 Chakra UI 并渲染(单个 <div className={styles.container} 除外)。然后将导入更新为:

import { Box, Center, Spacer, Stack } from "@chakra-ui/react"
import type { NextPage } from "next"
import Head from "next/head"
import styles from "../styles/Home.module.css"

const Home: NextPage = () => {

return (
<div className={styles.container}>
<Head>
<title>Buildoors</title>
<meta name="The NFT Collection for Buildoors" />
<link rel="icon" href="/favicon.ico" />
</Head>

<Box
w="full"
h="calc(100vh)"
bgImage={"url(/home-background.svg)"}
backgroundPosition="center"
>
<Stack w="full" h="calc(100vh)" justify="center">
{ /* NavBar */ }

<Spacer />
<Center>
{ /* If connected, the second view, otherwise the first */ }
</Center>
<Spacer />

<Center>
<Box marginBottom={4} color="white">
<a
href="https://twitter.com/_buildspace"
target="_blank"
rel="noopener noreferrer"
>
built with @_buildspace
</a>
</Box>
</Center>
</Stack>
</Box>
</div>
)
}

export default Home

🎫 添加导航栏

现在让我们来构建 NavBar 。创建一个 components 文件夹并添加一个新文件 NavBar.tsx 。我们将其构建为一个水平堆栈,其中包括一个间隔器和一个用于连接钱包的按钮:

import { HStack, Spacer } from "@chakra-ui/react"
import { FC } from "react"
import styles from "../styles/Home.module.css"
import dynamic from "next/dynamic";

const WalletMultiButtonDynamic = dynamic(
async () =>
(await import("@solana/wallet-adapter-react-ui")).WalletMultiButton,
{ ssr: false }
);

const NavBar: FC = () => {
return (
<HStack width="full" padding={4}>
<Spacer />
<WalletMultiButtonDynamic className={styles["wallet-adapter-button-trigger"]}/>
</HStack>
)
}

export default NavBar

我们有 import dynamic from "next/dynamic"@solana/wallet-adapter-react-ui 动态导入 WalletMultiButton 并将其分配给 WalletMultiButtonDynamic ,如下所示:

const WalletMultiButtonDynamic = dynamic(
async () =>
(await import("@solana/wallet-adapter-react-ui")).WalletMultiButton,
{ ssr: false }
);

这是因为 NextJS 是服务器端渲染,在加载到客户端之前无法访问依赖于浏览器 API(如 window )的外部依赖项或组件。这意味着 NextJS 无法与只能在浏览器上使用的钱包进行交互。 { ssr: false } 禁用导入的服务器渲染。如果您的模块不使用动态导入,您很可能会遇到 Hydration failed because the initial UI does not match what was rendered on the server 。您可以在这里阅读有关动态导入的更多信息!

返回到 index.tsx ,导入 NavBar 并将其放在堆栈顶部(我留下了关于它应该在哪里的评论):

// Existing imports
import NavBar from "../components/NavBar"

const Home: NextPage = () => {

return (
<div className={styles.container}>
<Head>

<Box
w="full"
h="calc(100vh)"
bgImage={"url(/home-background.svg)"}
backgroundPosition="center"
>
<Stack w="full" h="calc(100vh)" justify="center">
{ /* NavBar */ }
<NavBar />

// Rest of the file remains the same

此时,除了“Connect Wallet”之外,您在 localhost:3000 上仍然没有任何内容。让我们解决这个问题。

🏠 创建登陆页面

components 文件夹中创建 Disconnected.tsx 文件并添加以下内容:

import { FC, MouseEventHandler, useCallback } from "react"
import {
Button,
Container,
Heading,
HStack,
Text,
VStack,
} from "@chakra-ui/react"
import { ArrowForwardIcon } from "@chakra-ui/icons"

const Disconnected: FC = () => {

const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
(event) => {
if (event.defaultPrevented) {
return
}
},
[]
)

return (
<Container>
<VStack spacing={20}>
<Heading
color="white"
as="h1"
size="3xl"
noOfLines={2}
textAlign="center"
>
Mint your buildoor. Earn $BLD. Level up.
</Heading>
<Button
bgColor="accent"
color="white"
maxW="380px"
onClick={handleClick}
>
<HStack>
<Text>become a buildoor</Text>
<ArrowForwardIcon />
</HStack>
</Button>
</VStack>
</Container>
)
}

export default Disconnected

这将是我们的登陆页面 - 用户访问网站时首先看到的视图。您需要将其导入到 index.tsx 中,并将其放置在渲染组件的中间(再次查找注释)。

// Existing imports
import Disconnected from '../components/Disconnected'

const Home: NextPage = () => {

return (
<div className={styles.container}>
<Head>

<Box
w="full"
h="calc(100vh)"
bgImage={"url(/home-background.svg)"}
backgroundPosition="center"
>
<Stack w="full" h="calc(100vh)" justify="center">
{ /* NavBar */ }
<NavBar />

<Spacer />
<Center>
<Disconnected />
</Center>
<Spacer />

// Rest of the file remains the same

现在,如果您查看 localhost:3000 ,您应该会看到带有“成为 buildoor”按钮的登录页面。如果你点击它,什么也不会发生。我们不喜欢什么都没有发生,让我们解决这个问题!

🔌 连接到用户的钱包

我们这里需要很多钩子。让我们把它们带进来:

npm i @solana/wallet-adapter-base @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-wallets @solana/web3.js

如果您正在为特定的钱包进行构建,那么您可以在此处进行更改,我只是坚持使用默认值:D

components 中创建一个 WalletContextProvider.tsx ,这样我们就可以将所有这些样板文件放入其中:

import { FC, ReactNode } from "react"
import {
ConnectionProvider,
WalletProvider,
} from "@solana/wallet-adapter-react"
import { WalletModalProvider } from "@solana/wallet-adapter-react-ui"
import { clusterApiUrl } from "@solana/web3.js"
import { PhantomWalletAdapter } from "@solana/wallet-adapter-wallets"
import { useMemo } from "react"
require("@solana/wallet-adapter-react-ui/styles.css")

const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => {
const url = useMemo(() => clusterApiUrl("devnet"), [])
const phantom = new PhantomWalletAdapter()

return (
<ConnectionProvider endpoint={url}>
<WalletProvider wallets={[phantom]}>
<WalletModalProvider>{children}</WalletModalProvider>
</WalletProvider>
</ConnectionProvider>
)
}

export default WalletContextProvider

我们需要将其导入 _app.tsx

import WalletContextProvider from '../components/WalletContextProvider'

<ChakraProvider theme={theme}>
<WalletContextProvider>
<Component {...pageProps} />
</WalletContextProvider>
</ChakraProvider>

现在我们还希望“成为建造者”按钮也能与您联系。在 Disconnected.tsx 中,添加这些导入

import { useWalletModal } from "@solana/wallet-adapter-react-ui"
import { useWallet } from "@solana/wallet-adapter-react"

然后在渲染之前将 Disconnected 的主体更新为以下内容:

const modalState = useWalletModal()
const { wallet, connect } = useWallet()

const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
(event) => {
if (event.defaultPrevented) {
return
}

if (!wallet) {
modalState.setVisible(true)
} else {
connect().catch(() => {})
}
},
[wallet, connect, modalState]
)

瞧,您应该能够连接了!

🎇 创建连接视图

现在我们可以连接了,我们需要更新视图以显示连接时的样子。让我们在 components 目录中创建一个 Connected.tsx 文件

import { FC } from "react"
import {
Button,
Container,
Heading,
HStack,
Text,
VStack,
Image,
} from "@chakra-ui/react"
import { ArrowForwardIcon } from "@chakra-ui/icons"

const Connected: FC = () => {
return (
<VStack spacing={20}>
<Container>
<VStack spacing={8}>
<Heading
color="white"
as="h1"
size="2xl"
noOfLines={1}
textAlign="center"
>
Welcome Buildoor.
</Heading>

<Text color="bodyText" fontSize="xl" textAlign="center">
Each buildoor is randomly generated and can be staked to receive
<Text as="b"> $BLD</Text> Use your <Text as="b"> $BLD</Text> to
upgrade your buildoor and receive perks within the community!
</Text>
</VStack>
</Container>

<HStack spacing={10}>
<Image src="avatar1.png" alt="" />
<Image src="avatar2.png" alt="" />
<Image src="avatar3.png" alt="" />
<Image src="avatar4.png" alt="" />
<Image src="avatar5.png" alt="" />
</HStack>

<Button bgColor="accent" color="white" maxW="380px">
<HStack>
<Text>mint buildoor</Text>
<ArrowForwardIcon />
</HStack>
</Button>
</VStack>
)
}

export default Connected

现在我们必须找到一种方法将其显示在屏幕上。回到 index.tsx ,让我们添加两个导入:

import { useWallet } from "@solana/wallet-adapter-react"
import Connected from "../components/Connected"

现在我们可以使用 useWallet hooks来访问一个变量,告诉我们是否已连接。我们可以使用它来有条件地渲染 ConnectedDisconnected 视图。

const Home: NextPage = () => {
const { connected } = useWallet()

return (
<div className={styles.container}>
<Head>
<title>Buildoors</title>
<meta name="The NFT Collection for Buildoors" />
<link rel="icon" href="/favicon.ico" />
</Head>

<Box
w="full"
h="calc(100vh)"
bgImage={connected ? "" : "url(/home-background.svg)"}
backgroundPosition="center"
>
<Stack w="full" h="calc(100vh)" justify="center">
<NavBar />

<Spacer />
<Center>{connected ? <Connected /> : <Disconnected />}</Center>
<Spacer />

好了,我们搞定了!我们已经设置好了前端,并且正在顺利地进行buildoors的铸造。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/index.html b/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/index.html index ff3e872fc..c16da6254 100644 --- a/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/index.html +++ b/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/index.html @@ -3,15 +3,15 @@ -🌐 部署到 Vercel | All in One Solana - - - +🌐 部署到 Vercel | All in One Solana + + +
-

🌐 部署到 Vercel

这是你本周所做的一切中最重要的部分。离开本地主机。

我们将把前端部署到 Vercel。 Vercel 是一个托管平台,可让您轻松部署应用程序。最好的部分?免费!

首先,您需要将项目推送到 Github。这应该需要大约 5 分钟,如果您不确定如何执行此操作,只需 Google 即可!

完成后,前往 Vercel 并连接您的 Github 帐户。它应该自动检测到这是一个 Next.js 项目,并且部署应该很简单。构建完成后,它会输出一个链接。

您现在已经离开本地主机了! 🎉

- - +

🌐 部署到 Vercel

这是你本周所做的一切中最重要的部分。离开本地主机。

我们将把前端部署到 Vercel。 Vercel 是一个托管平台,可让您轻松部署应用程序。最好的部分?免费!

首先,您需要将项目推送到 Github。这应该需要大约 5 分钟,如果您不确定如何执行此操作,只需 Google 即可!

完成后,前往 Vercel 并连接您的 Github 帐户。它应该自动检测到这是一个 Next.js 项目,并且部署应该很简单。构建完成后,它会输出一个链接。

您现在已经离开本地主机了! 🎉

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/start-your-own-custom-project/index.html b/docs/Solana-Co-Learn/module1/start-your-own-custom-project/index.html index 6350b1f85..0bad3b4f6 100644 --- a/docs/Solana-Co-Learn/module1/start-your-own-custom-project/index.html +++ b/docs/Solana-Co-Learn/module1/start-your-own-custom-project/index.html @@ -3,15 +3,15 @@ -开始你自己的定制项目 | All in One Solana - - - +开始你自己的定制项目 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/wallet-usage/index.html b/docs/Solana-Co-Learn/module1/wallet-usage/index.html index 2fe1d1dfa..118607207 100644 --- a/docs/Solana-Co-Learn/module1/wallet-usage/index.html +++ b/docs/Solana-Co-Learn/module1/wallet-usage/index.html @@ -3,16 +3,16 @@ -Solana钱包使用 | All in One Solana - - - +Solana钱包使用 | All in One Solana + + +
-

Solana钱包使用

Solana的钱包有很多,比如很有的Phantom钱包。但是这里我不在推荐使用Phantom,因为他对于开发者 -来说,不是很友好。

在本地开发的时候不支持本地RPC地址,只能使用Solana官方的测试网,这样的话,开发者在本地开发的时候就不可以。这也是我推荐Backpack钱包的原因。

下载Backpack钱包

下载地址:https://www.backpack.app/ 是这个。点击里面的Download,然后选择自己的浏览器插件。

目前只支持Chrome和Brave, Arc浏览器。移动端还在开发。

创建账户

下载完之后这个就是登录界面,点击Create Account创建账户。

下面是Claim 账户的名字, 输入你自已要创建的账户名字,然后点击Claim Name。

之后会跳转到创建新的钱包或者导入私钥的界面,这里我们选择创建新的钱包。

之后出现助记词界面,我们这里可以保存自己的助记词到本地,然后点击下一步。

因为backpack也是一个多链钱包,这里我们选择Solana,然后点击下一步。

设置自定义的RPC Endpoint

账户创建好了下面我们开始设置自定义的RPC Endpoint,点击右上角的设置按钮,然后选择Perference。

之后我们点击Perference。

可以看到这里有两个网络一个是Solana一个是以太坊,这里我们选择Solana。

这里就是设置自定义rpc的地方,这里我们选择了localnet。

对于Custom,你可以自定以你的Rpc地址,除了官方提供的testnet或者mainbeta的地址,你可以去quikcnode或者helius申请你自己的rpc地址使用。

- - +

Solana钱包使用

Solana的钱包有很多,比如很有的Phantom钱包。但是这里我不在推荐使用Phantom,因为他对于开发者 +来说,不是很友好。

在本地开发的时候不支持本地RPC地址,只能使用Solana官方的测试网,这样的话,开发者在本地开发的时候就不可以。这也是我推荐Backpack钱包的原因。

下载Backpack钱包

下载地址:https://www.backpack.app/ 是这个。点击里面的Download,然后选择自己的浏览器插件。

目前只支持Chrome和Brave, Arc浏览器。移动端还在开发。

创建账户

下载完之后这个就是登录界面,点击Create Account创建账户。

下面是Claim 账户的名字, 输入你自已要创建的账户名字,然后点击Claim Name。

之后会跳转到创建新的钱包或者导入私钥的界面,这里我们选择创建新的钱包。

之后出现助记词界面,我们这里可以保存自己的助记词到本地,然后点击下一步。

因为backpack也是一个多链钱包,这里我们选择Solana,然后点击下一步。

设置自定义的RPC Endpoint

账户创建好了下面我们开始设置自定义的RPC Endpoint,点击右上角的设置按钮,然后选择Perference。

之后我们点击Perference。

可以看到这里有两个网络一个是Solana一个是以太坊,这里我们选择Solana。

这里就是设置自定义rpc的地方,这里我们选择了localnet。

对于Custom,你可以自定以你的Rpc地址,除了官方提供的testnet或者mainbeta的地址,你可以去quikcnode或者helius申请你自己的rpc地址使用。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/index.html b/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/index.html index 806de23fb..8752f5b7b 100644 --- a/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/index.html +++ b/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/index.html @@ -3,15 +3,15 @@ -🔌 连接到钱包 (TODO by davirain) | All in One Solana - - - +🔌 连接到钱包 (TODO by davirain) | All in One Solana + + +
-

🔌 连接到钱包 (TODO by davirain)

我们现在对通过代码与网络进行交互有了很多了解。为了进行交易,我们使用了私钥。这对用户来说行不通哈哈。为了让人们用真钱从我们这里购买JPEG图像,我们需要与钱包合作。

“钱包”这个名字有点奇怪,因为它们不仅仅是用来存放东西的。钱包是指任何能够安全存储密钥并允许用户签署交易的东西。它们有很多形式,最常见的是浏览器扩展,它们为你(开发者)提供API,以向用户建议交易。钱包使你能够安全地进行以下操作:

我们将使用 Phantom 浏览器扩展程序,因为它是最受欢迎的,如果您愿意,您可以使用另一个:)

让我们将我们的网络应用程序与钱包连接起来,让它为用户提供交易报价!

🛠 Solana 钱包适配器

那里有几十个钱包。他们每个人都以自己的方式做事。想象一下,如果您必须为每个单独的钱包 API 进行构建,那将是一场噩梦。值得庆幸的是,我们有 Solana Wallet-Adapter - 它是一套库,为您提供几乎通用的 API,可与大量钱包一起使用(完整列表见此处)。

您将主要使用 wallet-adapter-basewallet-adapter-react 库。您可以选择您想要支持的特定钱包,或者只支持所有钱包。这里的区别在于您要使用哪些库 - 特定的钱包库或 wallet-adapter-wallets 。由于我们要使用 Phantom,因此我们可以只使用 Phantom 库!

这是我们需要安装的内容(您现在不需要运行它):

npm install @solana/wallet-adapter-base \
@solana/wallet-adapter-react \
@solana/wallet-adapter-phantom \
@solana/wallet-adapter-react-ui

wallet-adapter-react-ui 为我们处理整个 UI - 连接、选择钱包、断开连接,一切都已排序!

多亏了这些牛逼的库,我们在Solana上再也不用自己构建钱包连接的东西了!趁此机会,感谢那些维护者为你节省了时间和头发。

👜 创建一个钱包连接按钮

让我们来看看这些库吧!在您的工作区中设置一个新项目:

git clone https://github.com/RustyCab/solana-ping-frontend.git
cd solana-ping-frontend
git checkout starter
npm i

该模板继承了我们上次构建的内容 - 我们为 ping 客户端提供了一个前端,用于将数据写入区块链。使用 npm run dev 你会在本地主机上看到这个:

这是一个准系统 UI - 让我们将其连接到 wallet-adapter-react 库。

拉起 _app.tsx 并使其看起来像这样:

import React, { useMemo } from "react";
import { WalletAdapterNetwork } from "@solana/wallet-adapter-base";
import { WalletModalProvider } from "@solana/wallet-adapter-react-ui";
import { ConnectionProvider, WalletProvider } from "@solana/wallet-adapter-react";
import {
GlowWalletAdapter,
PhantomWalletAdapter
} from "@solana/wallet-adapter-wallets";
import { clusterApiUrl } from "@solana/web3.js";

require("@solana/wallet-adapter-react-ui/styles.css");
require("../styles/globals.css");
require ("../styles/Home.module.css");

const App = ({ Component, pageProps }) => {
// Can be set to 'devnet', 'testnet', or 'mainnet-beta'
const network = WalletAdapterNetwork.Devnet;

// You can provide a custom RPC endpoint here
const endpoint = useMemo(() => clusterApiUrl(network), [network]);

// @solana/wallet-adapter-wallets includes all the adapters but supports tree shaking and lazy loading --
// Only the wallets you configure here will be compiled into your application, and only the dependencies
// of wallets that your users connect to will be loaded
const wallets = useMemo(
() => [
new PhantomWalletAdapter(),
new GlowWalletAdapter()
],
[network]
);

return (
<ConnectionProvider endpoint={endpoint}>
<WalletProvider wallets={wallets} autoConnect>
<WalletModalProvider>
<Component {...pageProps} />
</WalletModalProvider>
</WalletProvider>
</ConnectionProvider>
);
};

export default App;

这是很多的导入。别担心,你只需要知道每个导入是用来做什么的,不需要深入了解它们的工作原理。下面是每个部分的简要概述。

我们从 React 开始。 useMemo() 是一个钩子,仅当依赖项之一发生更改时才加载内容。在我们的例子中,只有当用户连接的网络发生变化时, clusterApiUrl 的值才会发生变化。

我们首先导入的Solana引用是 wallet-adapter-network 来自 @solana/wallet-adapter-base 。这只是一个可枚举的对象,用于表示可用的网络。

WalletModalProvider 就是这样,哈哈 - 它是一个奇特的 React 组件,会提示用户选择他们的钱包。埃兹普兹。

ConnectionProvider 接收一个RPC端点,并让我们直接与Solana区块链上的节点进行通信。我们将在整个应用程序中使用它来发送交易。

WalletProvider 为我们提供了一个连接各种钱包的标准接口,因此我们不必费心阅读每个钱包的文档呵呵。

接下来您将看到来自 wallet-adapter-wallets 的一堆钱包适配器。我们将使用从中导入的内容来创建我们将提供给 WalletProvider 的钱包列表。还有许多其他钱包适配器可用,甚至有些是为其他区块链制作的!在这里查看它们。我刚刚选择了 Phantom 和 Glow。

最后,我们有 clusterApiURL ,它只是一个根据我们提供的网络为我们生成 RPC 端点的函数。

对于 React App 组件内的 return 语句,我们用一些上下文提供程序包装子组件(应用程序的其余部分)。

总结一下:这个文件是我们网页应用程序的核心。我们在这里提供的任何内容都可以被我们应用程序的其他部分访问到。我们将所有的钱包和网络工具都放在这里,这样我们就不需要在每个子组件中重新初始化它们。

我从官方 wallet-adapter Next.js 模板复制了所有这些代码,所以不要对复制/粘贴(这次)感到难过。

🧞‍♂️ 使用提供商连接钱包

唷,那是一堆设置!现在您可以看到与钱包交互是多么容易。我们所要做的就是在 components/AppBar.tsx 中设置一个 React hook

import { FC } from 'react'
import styles from '../styles/Home.module.css'
import Image from 'next/image'
import { WalletMultiButton } from '@solana/wallet-adapter-react-ui'

export const AppBar: FC = () => {
return (
<div className={styles.AppHeader}>
<Image src="/solanaLogo.png" height={30} width={200} />
<span>Wallet-Adapter Example</span>
<WalletMultiButton/>
</div>
)
}

挺简单的,是吧? WalletMultiButton 为我们做了很多魔法,处理了所有的连接细节。如果你现在强制刷新应用程序,你应该能看到一个漂亮的紫色按钮在右上角!

- - +

🔌 连接到钱包 (TODO by davirain)

我们现在对通过代码与网络进行交互有了很多了解。为了进行交易,我们使用了私钥。这对用户来说行不通哈哈。为了让人们用真钱从我们这里购买JPEG图像,我们需要与钱包合作。

“钱包”这个名字有点奇怪,因为它们不仅仅是用来存放东西的。钱包是指任何能够安全存储密钥并允许用户签署交易的东西。它们有很多形式,最常见的是浏览器扩展,它们为你(开发者)提供API,以向用户建议交易。钱包使你能够安全地进行以下操作:

我们将使用 Phantom 浏览器扩展程序,因为它是最受欢迎的,如果您愿意,您可以使用另一个:)

让我们将我们的网络应用程序与钱包连接起来,让它为用户提供交易报价!

🛠 Solana 钱包适配器

那里有几十个钱包。他们每个人都以自己的方式做事。想象一下,如果您必须为每个单独的钱包 API 进行构建,那将是一场噩梦。值得庆幸的是,我们有 Solana Wallet-Adapter - 它是一套库,为您提供几乎通用的 API,可与大量钱包一起使用(完整列表见此处)。

您将主要使用 wallet-adapter-basewallet-adapter-react 库。您可以选择您想要支持的特定钱包,或者只支持所有钱包。这里的区别在于您要使用哪些库 - 特定的钱包库或 wallet-adapter-wallets 。由于我们要使用 Phantom,因此我们可以只使用 Phantom 库!

这是我们需要安装的内容(您现在不需要运行它):

npm install @solana/wallet-adapter-base \
@solana/wallet-adapter-react \
@solana/wallet-adapter-phantom \
@solana/wallet-adapter-react-ui

wallet-adapter-react-ui 为我们处理整个 UI - 连接、选择钱包、断开连接,一切都已排序!

多亏了这些牛逼的库,我们在Solana上再也不用自己构建钱包连接的东西了!趁此机会,感谢那些维护者为你节省了时间和头发。

👜 创建一个钱包连接按钮

让我们来看看这些库吧!在您的工作区中设置一个新项目:

git clone https://github.com/RustyCab/solana-ping-frontend.git
cd solana-ping-frontend
git checkout starter
npm i

该模板继承了我们上次构建的内容 - 我们为 ping 客户端提供了一个前端,用于将数据写入区块链。使用 npm run dev 你会在本地主机上看到这个:

这是一个准系统 UI - 让我们将其连接到 wallet-adapter-react 库。

拉起 _app.tsx 并使其看起来像这样:

import React, { useMemo } from "react";
import { WalletAdapterNetwork } from "@solana/wallet-adapter-base";
import { WalletModalProvider } from "@solana/wallet-adapter-react-ui";
import { ConnectionProvider, WalletProvider } from "@solana/wallet-adapter-react";
import {
GlowWalletAdapter,
PhantomWalletAdapter
} from "@solana/wallet-adapter-wallets";
import { clusterApiUrl } from "@solana/web3.js";

require("@solana/wallet-adapter-react-ui/styles.css");
require("../styles/globals.css");
require ("../styles/Home.module.css");

const App = ({ Component, pageProps }) => {
// Can be set to 'devnet', 'testnet', or 'mainnet-beta'
const network = WalletAdapterNetwork.Devnet;

// You can provide a custom RPC endpoint here
const endpoint = useMemo(() => clusterApiUrl(network), [network]);

// @solana/wallet-adapter-wallets includes all the adapters but supports tree shaking and lazy loading --
// Only the wallets you configure here will be compiled into your application, and only the dependencies
// of wallets that your users connect to will be loaded
const wallets = useMemo(
() => [
new PhantomWalletAdapter(),
new GlowWalletAdapter()
],
[network]
);

return (
<ConnectionProvider endpoint={endpoint}>
<WalletProvider wallets={wallets} autoConnect>
<WalletModalProvider>
<Component {...pageProps} />
</WalletModalProvider>
</WalletProvider>
</ConnectionProvider>
);
};

export default App;

这是很多的导入。别担心,你只需要知道每个导入是用来做什么的,不需要深入了解它们的工作原理。下面是每个部分的简要概述。

我们从 React 开始。 useMemo() 是一个钩子,仅当依赖项之一发生更改时才加载内容。在我们的例子中,只有当用户连接的网络发生变化时, clusterApiUrl 的值才会发生变化。

我们首先导入的Solana引用是 wallet-adapter-network 来自 @solana/wallet-adapter-base 。这只是一个可枚举的对象,用于表示可用的网络。

WalletModalProvider 就是这样,哈哈 - 它是一个奇特的 React 组件,会提示用户选择他们的钱包。埃兹普兹。

ConnectionProvider 接收一个RPC端点,并让我们直接与Solana区块链上的节点进行通信。我们将在整个应用程序中使用它来发送交易。

WalletProvider 为我们提供了一个连接各种钱包的标准接口,因此我们不必费心阅读每个钱包的文档呵呵。

接下来您将看到来自 wallet-adapter-wallets 的一堆钱包适配器。我们将使用从中导入的内容来创建我们将提供给 WalletProvider 的钱包列表。还有许多其他钱包适配器可用,甚至有些是为其他区块链制作的!在这里查看它们。我刚刚选择了 Phantom 和 Glow。

最后,我们有 clusterApiURL ,它只是一个根据我们提供的网络为我们生成 RPC 端点的函数。

对于 React App 组件内的 return 语句,我们用一些上下文提供程序包装子组件(应用程序的其余部分)。

总结一下:这个文件是我们网页应用程序的核心。我们在这里提供的任何内容都可以被我们应用程序的其他部分访问到。我们将所有的钱包和网络工具都放在这里,这样我们就不需要在每个子组件中重新初始化它们。

我从官方 wallet-adapter Next.js 模板复制了所有这些代码,所以不要对复制/粘贴(这次)感到难过。

🧞‍♂️ 使用提供商连接钱包

唷,那是一堆设置!现在您可以看到与钱包交互是多么容易。我们所要做的就是在 components/AppBar.tsx 中设置一个 React hook

import { FC } from 'react'
import styles from '../styles/Home.module.css'
import Image from 'next/image'
import { WalletMultiButton } from '@solana/wallet-adapter-react-ui'

export const AppBar: FC = () => {
return (
<div className={styles.AppHeader}>
<Image src="/solanaLogo.png" height={30} width={200} />
<span>Wallet-Adapter Example</span>
<WalletMultiButton/>
</div>
)
}

挺简单的,是吧? WalletMultiButton 为我们做了很多魔法,处理了所有的连接细节。如果你现在强制刷新应用程序,你应该能看到一个漂亮的紫色按钮在右上角!

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/wallets-and-frontends/index.html b/docs/Solana-Co-Learn/module1/wallets-and-frontends/index.html index 30e411093..3ba57f283 100644 --- a/docs/Solana-Co-Learn/module1/wallets-and-frontends/index.html +++ b/docs/Solana-Co-Learn/module1/wallets-and-frontends/index.html @@ -3,15 +3,15 @@ -钱包和前端 | All in One Solana - - - +钱包和前端 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/index.html b/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/index.html index b6db240b9..176fc7fd1 100644 --- a/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/index.html +++ b/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/index.html @@ -3,15 +3,15 @@ -🦺 与程序进行交互 | All in One Solana - - - +🦺 与程序进行交互 | All in One Solana + + +
-

🦺 与程序进行交互

既然我们已经完成了钱包连接的设置,那么让我们让我们的ping按钮真正有所作为吧!

这是 PingButton.tsx 应该看起来的样子:

import { useConnection, useWallet } from '@solana/wallet-adapter-react';
import * as Web3 from '@solana/web3.js'
import { FC } from 'react'
import styles from '../styles/PingButton.module.css'

const PROGRAM_ID = new Web3.PublicKey("ChT1B39WKLS8qUrkLvFDXMhEJ4F1XZzwUNHUt4AU9aVa")
const PROGRAM_DATA_PUBLIC_KEY = new Web3.PublicKey("Ah9K7dQ8EHaZqcAsgBW8w37yN2eAy3koFmUn4x3CJtod")

export const PingButton: FC = () => {
const { connection } = useConnection();
const { publicKey, sendTransaction } = useWallet();

const onClick = () => {
if (!connection || !publicKey) {
alert("Please connect your wallet first lol")
return
}

const transaction = new Web3.Transaction()

const instruction = new Web3.TransactionInstruction({
keys: [
{
pubkey: PROGRAM_DATA_PUBLIC_KEY,
isSigner: false,
isWritable: true
},
],
programId: PROGRAM_ID,
});

transaction.add(instruction)
sendTransaction(transaction, connection).then(sig => {
console.log(`Explorer URL: https://explorer.solana.com/tx/${sig}?cluster=devnet`)
})
}

return (
<div className={styles.buttonContainer} onClick={onClick}>
<button className={styles.button}>Ping!</button>
</div>
)
}

这一堆东西对你来说应该很熟悉 - 我们正在做的事情与我们在本地客户端上做的完全一样,只是使用了React hooks

是时候来测试一下了。确保你的钱包在开发网络上 - 设置 -> 开发者设置 -> 更改网络。连接你的钱包并点击那个ping按钮,你将会看到以下内容:

如果您点击确认,您的控制台将打印出交易链接。就像之前一样,向下滚动,您会看到数字已经增加了🚀

现在你可以让用户与应用程序互动了!你在上一节中制作的那个价值1万美元的产品?现在它已经成为了一个价值百万美元的产品。想象一下所有的程序 - Metaplex、Serum、Solana程序库中的任何程序 - 你现在有能力将它们与用户界面连接起来,让人们使用。我的朋友,你可以构建未来。

🚢 Ship挑战 - SOL 发送者

是时候锻炼一下肌肉了。

在此挑战中,使用此起始代码创建一个应用程序,让用户连接其 Phantom 钱包并将 SOL 发送到另一个帐户。确保克隆后使用 git checkout starter 切换到起始分支。

通过两个关键步骤来做到这一点:

  • 将启动应用程序包装在适当的上下文提供程序中。
  • 在表单组件中,设置交易并将其发送到用户的钱包以供批准。

最后它应该看起来像这样!

不要忘记验证地址!

完成后,将您的解决方案与此处的解决方案代码进行比较。

- - +

🦺 与程序进行交互

既然我们已经完成了钱包连接的设置,那么让我们让我们的ping按钮真正有所作为吧!

这是 PingButton.tsx 应该看起来的样子:

import { useConnection, useWallet } from '@solana/wallet-adapter-react';
import * as Web3 from '@solana/web3.js'
import { FC } from 'react'
import styles from '../styles/PingButton.module.css'

const PROGRAM_ID = new Web3.PublicKey("ChT1B39WKLS8qUrkLvFDXMhEJ4F1XZzwUNHUt4AU9aVa")
const PROGRAM_DATA_PUBLIC_KEY = new Web3.PublicKey("Ah9K7dQ8EHaZqcAsgBW8w37yN2eAy3koFmUn4x3CJtod")

export const PingButton: FC = () => {
const { connection } = useConnection();
const { publicKey, sendTransaction } = useWallet();

const onClick = () => {
if (!connection || !publicKey) {
alert("Please connect your wallet first lol")
return
}

const transaction = new Web3.Transaction()

const instruction = new Web3.TransactionInstruction({
keys: [
{
pubkey: PROGRAM_DATA_PUBLIC_KEY,
isSigner: false,
isWritable: true
},
],
programId: PROGRAM_ID,
});

transaction.add(instruction)
sendTransaction(transaction, connection).then(sig => {
console.log(`Explorer URL: https://explorer.solana.com/tx/${sig}?cluster=devnet`)
})
}

return (
<div className={styles.buttonContainer} onClick={onClick}>
<button className={styles.button}>Ping!</button>
</div>
)
}

这一堆东西对你来说应该很熟悉 - 我们正在做的事情与我们在本地客户端上做的完全一样,只是使用了React hooks

是时候来测试一下了。确保你的钱包在开发网络上 - 设置 -> 开发者设置 -> 更改网络。连接你的钱包并点击那个ping按钮,你将会看到以下内容:

如果您点击确认,您的控制台将打印出交易链接。就像之前一样,向下滚动,您会看到数字已经增加了🚀

现在你可以让用户与应用程序互动了!你在上一节中制作的那个价值1万美元的产品?现在它已经成为了一个价值百万美元的产品。想象一下所有的程序 - Metaplex、Serum、Solana程序库中的任何程序 - 你现在有能力将它们与用户界面连接起来,让人们使用。我的朋友,你可以构建未来。

🚢 Ship挑战 - SOL 发送者

是时候锻炼一下肌肉了。

在此挑战中,使用此起始代码创建一个应用程序,让用户连接其 Phantom 钱包并将 SOL 发送到另一个帐户。确保克隆后使用 git checkout starter 切换到起始分支。

通过两个关键步骤来做到这一点:

  • 将启动应用程序包装在适当的上下文提供程序中。
  • 在表单组件中,设置交易并将其发送到用户的钱包以供批准。

最后它应该看起来像这样!

不要忘记验证地址!

完成后,将您的解决方案与此处的解决方案代码进行比较。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/index.html b/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/index.html index d3fb7dfd4..43af89643 100644 --- a/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/index.html +++ b/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/index.html @@ -3,15 +3,15 @@ -🖼 从糖果机展示NFTs | All in One Solana - - - +🖼 从糖果机展示NFTs | All in One Solana + + +
-

🖼 从糖果机展示NFTs

现在我们已经铸造了一个NFT,我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务——这是一个Solana程序,允许创作者将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有许多有用的功能,如机器人保护和安全随机化。你知道看到闪亮的新iPhone有多令人兴奋吗?稀有的NFT有点像那样。对于优秀的艺术家来说,即使只是看着它们也很有趣。毕竟,艺术就是用来欣赏的!让我们弄清楚如果我们只有Candy Machine的地址,我们如何展示NFTs。

你能猜到这里发生了什么不同吗?是的,我们只是在SDK上使用了一种不同的方法!

既然这里没有钱包,我们就不需要使用 walletAdapterIdentity ,只需要使用metaplex对象即可。

我们这里只有几个选择 - findByAddress 是我们想要的一个。

与我们为单个NFT所获得的类似,我们将获得整个糖果机实例的元数据。 items 字段是糖果机中所有NFT的数组。每个项目都不会包含我们想要的内容,而是会指向一个我们可以从中获取资产的URI。

由于收藏品可能非常庞大,我们不会一次性获取所有的NFT。相反,我们将根据分页系统仅获取我们想要展示的NFT。

让我们来绘制一些像素吧!

🥁 请拿来一个糖果机

您可以继续上一节的进度,或者使用上次我们使用的相同模板(起始分支即可)。

快进入 FetchCandyMachine.tsx 。你会看到一些设置已经为你准备好了。我们将使用 getPage 函数从糖果机上获取“页面”上的物品。在此之前,我们需要获取糖果机的元数据账户。

在空的 fetchCandyMachine 函数上方设置 metaplex 对象的连接

export const FetchCandyMachine: FC = () => {
// placeholder CMv2 address
const [candyMachineAddress, setCandyMachineAddress] = useState("")
const [candyMachineData, setCandyMachineData] = useState(null)
const [pageItems, setPageItems] = useState(null)
const [page, setPage] = useState(1)

const { connection } = useConnection()
const metaplex = Metaplex.make(connection)

在创建有状态变量时,请确保添加您的Candy Machine地址

export const FetchCandyMachine: FC = () => {
const [candyMachineAddress, setCandyMachineAddress] = useState("CM_ADDRESS_HERE")
...

接下来,我们将完成 fetchCandyMachine 。我们将使用之前看到的 findByAddress 方法。

export const FetchCandyMachine: FC = () => {
...

// fetch candymachine by address
const fetchCandyMachine = async () => {

// Set page to 1 - we wanna be at the first page whenever we fetch a new Candy Machine
setPage(1)

// fetch candymachine data
try {
const candyMachine = await metaplex
.candyMachinesV2()
.findByAddress({ address: new PublicKey(candyMachineAddress) })

setCandyMachineData(candyMachine)
} catch (e) {
alert("Please submit a valid CMv2 address.")
}
}
...
}

注意:Metaplex CLI的最新版本在函数调用的末尾不需要 run()

现在是重要的部分 - 浏览我们将获得的CM数据。以下是 getPage 函数的样子:

export const FetchCandyMachine: FC = () => {
...

// paging
const getPage = async (page, perPage) => {
const pageItems = candyMachineData.items.slice(
(page - 1) * perPage,
page * perPage
)

// fetch metadata of NFTs for page
let nftData = []
for (let i = 0; i < pageItems.length; i++) {
let fetchResult = await fetch(pageItems[i].uri)
let json = await fetchResult.json()
nftData.push(json)
}

// set state
setPageItems(nftData)
}
...
}

我们在这里做的是将 items 数组切割成大小为10的块。然后我们获取页面中每个NFT的元数据,并将其存储在 nftData 中。最后,我们将 pageItems 状态变量设置为刚刚获取的 nftData

这意味着我们的应用程序在任何时候只会渲染当前页面的NFT。不错!

让我们填写 prevnext 函数:

// previous page
const prev = async () => {
if (page - 1 < 1) {
setPage(1)
} else {
setPage(page - 1)
}
}

// next page
const next = async () => {
setPage(page + 1)
}

当用户点击“上一个”和“下一个”按钮时,这些将会运行,这些按钮只会在 pageItems 不为空时显示(即当我们获取了一个CM的NFT时)。

现在我们需要一些 useEffects 来开始。整个过程一开始可能会有点困惑,所以让我们一步一步来解析。

    1. 在页面加载时运行 fetchCandyMachine 函数(如果 candyMachineAddress 不为空)
    1. 每当使用 fetchCandyMachine 获取糖果机时,将 page 设置为1,这样你就可以得到第一页。
    1. 每当 candyMachineDatapage 发生变化(即输入新的CM地址或点击下一个/上一个按钮),加载页面。

这是代码中的样子:

export const FetchCandyMachine: FC = () => {
...

// fetch placeholder candy machine on load
useEffect(() => {
fetchCandyMachine()
}, [])

// fetch metadata for NFTs when page or candy machine changes
useEffect(() => {
if (!candyMachineData) {
return
}
getPage(page, 9)
}, [candyMachineData, page])

}

快去 localhost:3000 试试吧!你应该能看到你的糖果机上的NFT的第一页。

- - +

🖼 从糖果机展示NFTs

现在我们已经铸造了一个NFT,我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务——这是一个Solana程序,允许创作者将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有许多有用的功能,如机器人保护和安全随机化。你知道看到闪亮的新iPhone有多令人兴奋吗?稀有的NFT有点像那样。对于优秀的艺术家来说,即使只是看着它们也很有趣。毕竟,艺术就是用来欣赏的!让我们弄清楚如果我们只有Candy Machine的地址,我们如何展示NFTs。

你能猜到这里发生了什么不同吗?是的,我们只是在SDK上使用了一种不同的方法!

既然这里没有钱包,我们就不需要使用 walletAdapterIdentity ,只需要使用metaplex对象即可。

我们这里只有几个选择 - findByAddress 是我们想要的一个。

与我们为单个NFT所获得的类似,我们将获得整个糖果机实例的元数据。 items 字段是糖果机中所有NFT的数组。每个项目都不会包含我们想要的内容,而是会指向一个我们可以从中获取资产的URI。

由于收藏品可能非常庞大,我们不会一次性获取所有的NFT。相反,我们将根据分页系统仅获取我们想要展示的NFT。

让我们来绘制一些像素吧!

🥁 请拿来一个糖果机

您可以继续上一节的进度,或者使用上次我们使用的相同模板(起始分支即可)。

快进入 FetchCandyMachine.tsx 。你会看到一些设置已经为你准备好了。我们将使用 getPage 函数从糖果机上获取“页面”上的物品。在此之前,我们需要获取糖果机的元数据账户。

在空的 fetchCandyMachine 函数上方设置 metaplex 对象的连接

export const FetchCandyMachine: FC = () => {
// placeholder CMv2 address
const [candyMachineAddress, setCandyMachineAddress] = useState("")
const [candyMachineData, setCandyMachineData] = useState(null)
const [pageItems, setPageItems] = useState(null)
const [page, setPage] = useState(1)

const { connection } = useConnection()
const metaplex = Metaplex.make(connection)

在创建有状态变量时,请确保添加您的Candy Machine地址

export const FetchCandyMachine: FC = () => {
const [candyMachineAddress, setCandyMachineAddress] = useState("CM_ADDRESS_HERE")
...

接下来,我们将完成 fetchCandyMachine 。我们将使用之前看到的 findByAddress 方法。

export const FetchCandyMachine: FC = () => {
...

// fetch candymachine by address
const fetchCandyMachine = async () => {

// Set page to 1 - we wanna be at the first page whenever we fetch a new Candy Machine
setPage(1)

// fetch candymachine data
try {
const candyMachine = await metaplex
.candyMachinesV2()
.findByAddress({ address: new PublicKey(candyMachineAddress) })

setCandyMachineData(candyMachine)
} catch (e) {
alert("Please submit a valid CMv2 address.")
}
}
...
}

注意:Metaplex CLI的最新版本在函数调用的末尾不需要 run()

现在是重要的部分 - 浏览我们将获得的CM数据。以下是 getPage 函数的样子:

export const FetchCandyMachine: FC = () => {
...

// paging
const getPage = async (page, perPage) => {
const pageItems = candyMachineData.items.slice(
(page - 1) * perPage,
page * perPage
)

// fetch metadata of NFTs for page
let nftData = []
for (let i = 0; i < pageItems.length; i++) {
let fetchResult = await fetch(pageItems[i].uri)
let json = await fetchResult.json()
nftData.push(json)
}

// set state
setPageItems(nftData)
}
...
}

我们在这里做的是将 items 数组切割成大小为10的块。然后我们获取页面中每个NFT的元数据,并将其存储在 nftData 中。最后,我们将 pageItems 状态变量设置为刚刚获取的 nftData

这意味着我们的应用程序在任何时候只会渲染当前页面的NFT。不错!

让我们填写 prevnext 函数:

// previous page
const prev = async () => {
if (page - 1 < 1) {
setPage(1)
} else {
setPage(page - 1)
}
}

// next page
const next = async () => {
setPage(page + 1)
}

当用户点击“上一个”和“下一个”按钮时,这些将会运行,这些按钮只会在 pageItems 不为空时显示(即当我们获取了一个CM的NFT时)。

现在我们需要一些 useEffects 来开始。整个过程一开始可能会有点困惑,所以让我们一步一步来解析。

    1. 在页面加载时运行 fetchCandyMachine 函数(如果 candyMachineAddress 不为空)
    1. 每当使用 fetchCandyMachine 获取糖果机时,将 page 设置为1,这样你就可以得到第一页。
    1. 每当 candyMachineDatapage 发生变化(即输入新的CM地址或点击下一个/上一个按钮),加载页面。

这是代码中的样子:

export const FetchCandyMachine: FC = () => {
...

// fetch placeholder candy machine on load
useEffect(() => {
fetchCandyMachine()
}, [])

// fetch metadata for NFTs when page or candy machine changes
useEffect(() => {
if (!candyMachineData) {
return
}
getPage(page, 9)
}, [candyMachineData, page])

}

快去 localhost:3000 试试吧!你应该能看到你的糖果机上的NFT的第一页。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/index.html b/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/index.html index 1152b0f83..1936b1aa9 100644 --- a/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/index.html +++ b/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/index.html @@ -3,15 +3,15 @@ -📱 在钱包中展示NFTs | All in One Solana - - - +📱 在钱包中展示NFTs | All in One Solana + + +
-

📱 在钱包中展示NFTs

现在我们已经铸造了一个NFT,我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务,它是一个Solana程序,让创作者能够将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有许多有用的功能,如机器人保护和安全随机化。你知道怎么回事。模板时间。然而,随着我们构建的东西变得更好,我们的模板也会变得更好。这次我们将在Solana dApp脚手架的基础上构建一个模板。和之前的模板一样,它是一个使用 create-next-app 制作的Next.js应用程序。不同的是,它有更多的功能。不用担心!我们仍然会使用相同的东西。

git clone https://github.com/buildspace/solana-display-nfts-frontend
cd solana-display-nfts-frontend
git checkout starter
npm install @metaplex-foundation/js@latest
npm i
npm run dev

你应该在 localhost:3000 上看到这个:

“显示NFT”页面目前还没有显示任何内容 - 这就是你的任务所在。

打开 src/components/FetchNFT.tsx ,我们开始吧。我们将从组件顶部的Metaplex设置开始:

export const FetchNft: FC = () => {
const [nftData, setNftData] = useState(null)

const { connection } = useConnection()
const wallet = useWallet()
const metaplex = Metaplex.make(connection).use(walletAdapterIdentity(wallet))

const fetchNfts = async () => {}

return <div></div>
}

看起来很熟悉。

现在让我们来填写 fetchNfts 函数。我们将使用之前看到的 findAllByOwner 方法。我们还需要使用 useWallet 钩子来获取钱包地址。

const fetchNfts = async () => {
if (!wallet.connected) {
return
}

// fetch NFTs for connected wallet
const nfts = await metaplex
.nfts()
.findAllByOwner({ owner: wallet.publicKey })

// fetch off chain metadata for each NFT
let nftData = []
for (let i = 0; i < nfts.length; i++) {
let fetchResult = await fetch(nfts[i].uri)
let json = await fetchResult.json()
nftData.push(json)
}

// set state
setNftData(nftData)
}

我们想要在钱包更改时更新显示的NFTs,所以我们将在 useEffect 函数下方添加一个 fetchNfts 钩子来调用 fetchNfts 函数。

export const FetchNft: FC = () => {
...

const fetchNfts = async () => {
...
}

// fetch nfts when connected wallet changes
useEffect(() => {
fetchNfts()
}, [wallet])

return <div></div>
}

最后,我们需要更新 return 语句以显示NFTs。我们将使用之前创建的 nftData 状态变量。

return (
<div>
{nftData && (
<div className={styles.gridNFT}>
{nftData.map((nft) => (
<div>
<ul>{nft.name}</ul>
<img src={nft.image} />
</div>
))}
</div>
)}
</div>
)

我们现在可以看到我们的NFT了!🎉 这是我的钱包长什么样子 😆

回到过去的日子(大约在2021年10月),我不得不手动完成所有这些工作,而且我一直受到RPC的速率限制,所以请花点时间感激Metaplex开发人员为我们带来这个精彩的SDK!

nftData这里玩一下。将其记录到控制台并尝试显示其他值,如符号或描述!也许添加一个过滤器,以便用户只能显示特定收藏的NFT?

- - +

📱 在钱包中展示NFTs

现在我们已经铸造了一个NFT,我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务,它是一个Solana程序,让创作者能够将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有许多有用的功能,如机器人保护和安全随机化。你知道怎么回事。模板时间。然而,随着我们构建的东西变得更好,我们的模板也会变得更好。这次我们将在Solana dApp脚手架的基础上构建一个模板。和之前的模板一样,它是一个使用 create-next-app 制作的Next.js应用程序。不同的是,它有更多的功能。不用担心!我们仍然会使用相同的东西。

git clone https://github.com/buildspace/solana-display-nfts-frontend
cd solana-display-nfts-frontend
git checkout starter
npm install @metaplex-foundation/js@latest
npm i
npm run dev

你应该在 localhost:3000 上看到这个:

“显示NFT”页面目前还没有显示任何内容 - 这就是你的任务所在。

打开 src/components/FetchNFT.tsx ,我们开始吧。我们将从组件顶部的Metaplex设置开始:

export const FetchNft: FC = () => {
const [nftData, setNftData] = useState(null)

const { connection } = useConnection()
const wallet = useWallet()
const metaplex = Metaplex.make(connection).use(walletAdapterIdentity(wallet))

const fetchNfts = async () => {}

return <div></div>
}

看起来很熟悉。

现在让我们来填写 fetchNfts 函数。我们将使用之前看到的 findAllByOwner 方法。我们还需要使用 useWallet 钩子来获取钱包地址。

const fetchNfts = async () => {
if (!wallet.connected) {
return
}

// fetch NFTs for connected wallet
const nfts = await metaplex
.nfts()
.findAllByOwner({ owner: wallet.publicKey })

// fetch off chain metadata for each NFT
let nftData = []
for (let i = 0; i < nfts.length; i++) {
let fetchResult = await fetch(nfts[i].uri)
let json = await fetchResult.json()
nftData.push(json)
}

// set state
setNftData(nftData)
}

我们想要在钱包更改时更新显示的NFTs,所以我们将在 useEffect 函数下方添加一个 fetchNfts 钩子来调用 fetchNfts 函数。

export const FetchNft: FC = () => {
...

const fetchNfts = async () => {
...
}

// fetch nfts when connected wallet changes
useEffect(() => {
fetchNfts()
}, [wallet])

return <div></div>
}

最后,我们需要更新 return 语句以显示NFTs。我们将使用之前创建的 nftData 状态变量。

return (
<div>
{nftData && (
<div className={styles.gridNFT}>
{nftData.map((nft) => (
<div>
<ul>{nft.name}</ul>
<img src={nft.image} />
</div>
))}
</div>
)}
</div>
)

我们现在可以看到我们的NFT了!🎉 这是我的钱包长什么样子 😆

回到过去的日子(大约在2021年10月),我不得不手动完成所有这些工作,而且我一直受到RPC的速率限制,所以请花点时间感激Metaplex开发人员为我们带来这个精彩的SDK!

nftData这里玩一下。将其记录到控制台并尝试显示其他值,如符号或描述!也许添加一个过滤器,以便用户只能显示特定收藏的NFT?

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/index.html b/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/index.html index eb287240a..c4a4e1153 100644 --- a/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/index.html +++ b/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/index.html @@ -3,15 +3,15 @@ -展示NFTs 💃 | All in One Solana - - - +展示NFTs 💃 | All in One Solana + + +
-

展示NFTs 💃

既然我们已经铸造了一个NFT,现在我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务——这是一个Solana程序,让创作者能够将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有许多有用的功能,如机器人保护和安全随机化。如果你不能炫耀你的NFT,那它有什么用呢!在这节课中,我们将帮助你展示你的作品(假设你的NFT是赚钱的):首先在钱包中展示它,然后在Candy Machine中展示它。

你可能会想这样做的意义是什么。想象一下,你的朋友在你的网站上从你的收藏中铸造了一个很酷的Pepe NFT。他们铸造了很多与Pepe相关的东西,所以他们的钱包里有几十个NFT。他们怎么知道哪一个是来自你的收藏呢?你得给他们看!

你会记得从第一周开始,我们想要的一切都存储在账户中。这意味着你只需使用钱包地址就可以获取它们的NFT,但这需要更多的工作。

相反,我们将使用Metaplex SDK,它使得一切都变得像调用API一样简单。以下是它的样子:

你需要进行通常的Metaplex设置,但我们使用 walletAdapterIdentity 而不是 keypairIdentity 来进行连接,因为我们不想要他们的密钥对哈哈。完成后,我们只需使用Metaplex对象调用 findAllByOwner 方法即可。

这是单个NFT的NFT数据在控制台上的打印结果,我们主要关注的是 uri 字段:

顺便说一下,还有很多其他方法可以获取NFT:

让我们写些代码吧!

- - +

展示NFTs 💃

既然我们已经铸造了一个NFT,现在我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务——这是一个Solana程序,让创作者能够将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有许多有用的功能,如机器人保护和安全随机化。如果你不能炫耀你的NFT,那它有什么用呢!在这节课中,我们将帮助你展示你的作品(假设你的NFT是赚钱的):首先在钱包中展示它,然后在Candy Machine中展示它。

你可能会想这样做的意义是什么。想象一下,你的朋友在你的网站上从你的收藏中铸造了一个很酷的Pepe NFT。他们铸造了很多与Pepe相关的东西,所以他们的钱包里有几十个NFT。他们怎么知道哪一个是来自你的收藏呢?你得给他们看!

你会记得从第一周开始,我们想要的一切都存储在账户中。这意味着你只需使用钱包地址就可以获取它们的NFT,但这需要更多的工作。

相反,我们将使用Metaplex SDK,它使得一切都变得像调用API一样简单。以下是它的样子:

你需要进行通常的Metaplex设置,但我们使用 walletAdapterIdentity 而不是 keypairIdentity 来进行连接,因为我们不想要他们的密钥对哈哈。完成后,我们只需使用Metaplex对象调用 findAllByOwner 方法即可。

这是单个NFT的NFT数据在控制台上的打印结果,我们主要关注的是 uri 字段:

顺便说一下,还有很多其他方法可以获取NFT:

让我们写些代码吧!

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/index.html b/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/index.html index 86accfcc0..b1531b416 100644 --- a/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/index.html +++ b/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/index.html @@ -3,15 +3,15 @@ -在用户界面中展示NFTS | All in One Solana - - - +在用户界面中展示NFTS | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/index.html b/docs/Solana-Co-Learn/module2/index.html index 3427b6674..f2ea1464d 100644 --- a/docs/Solana-Co-Learn/module2/index.html +++ b/docs/Solana-Co-Learn/module2/index.html @@ -3,15 +3,15 @@ -Solana Module2 | All in One Solana - - - +Solana Module2 | All in One Solana + + +
-

Solana Module2

SPL代币

  • 📹带有Gage的令牌
  • The Token Program
  • 在Solana上铸造Token
  • Metaplex 与 Gage
  • 令牌元数据
  • 给你的代币赋予一个身份

NFTS + METAPLEX铸造

  • Solana上的NFT与Gage
  • Solana上的NFTs
  • NFT你的脸
  • 糖果机带Gage
  • 糖果机与Sugar命令行界面

在用户界面中展示NFTS

  • 使用Gage制作用户界面
  • 展示NFTs
  • 展示来自钱包的NFTs
  • 展示来自糖果机的NFTs

创造神奇的互联网货币并出售JPEG图片

  • 创建奖励代币
  • 制作糖果机
  • 创建铸币界面

使用token2022程序创建token

使用压缩nft程序创建压缩nft

- - +

Solana Module2

SPL代币

  • 📹带有Gage的令牌
  • The Token Program
  • 在Solana上铸造Token
  • Metaplex 与 Gage
  • 令牌元数据
  • 给你的代币赋予一个身份

NFTS + METAPLEX铸造

  • Solana上的NFT与Gage
  • Solana上的NFTs
  • NFT你的脸
  • 糖果机带Gage
  • 糖果机与Sugar命令行界面

在用户界面中展示NFTS

  • 使用Gage制作用户界面
  • 展示NFTs
  • 展示来自钱包的NFTs
  • 展示来自糖果机的NFTs

创造神奇的互联网货币并出售JPEG图片

  • 创建奖励代币
  • 制作糖果机
  • 创建铸币界面

使用token2022程序创建token

使用压缩nft程序创建压缩nft

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/index.html b/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/index.html index f911d40be..e217cd864 100644 --- a/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/index.html +++ b/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/index.html @@ -3,15 +3,15 @@ -🍬 创造糖果机 | All in One Solana - - - +🍬 创造糖果机 | All in One Solana + + +
-

🍬 创造糖果机

既然我们已经铸造了一个NFT,现在我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务,它是一个Solana程序,可以让创作者将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有许多有用的功能,如机器人保护和安全的随机化。准备好将一些东西放入我们在上一课中创建但没有使用的文件夹中了吗?

让我们首先在您的 candy-machine 文件夹中创建一个新的资产文件夹。将所有的NFT图像和元数据放入其中。您可以在这里阅读有关如何准备您的NFT资产的更多信息。

使用Sugar CLI

现在您已经成功创建了所有的NFT资产,我们可以通过使用Sugar CLI来开始部署它。如果由于某种原因您尚未安装它,您可以按照这里的指南来安装CLI。

让我们通过运行 cd tokens/candy-machine/ 来开始导航到candy-machine文件夹,并继续通过运行 sugar launch 来启动Sugar CLI。它会询问你一系列的问题。随意配置它,以你想要的方式。最重要的是,确保将NFT的价格设置为 0 ,并将存储方法设置为 bundlr 。你可以选择将 yes 设置为所有内容。

⬆️ 上传你的NFT

现在您已经创建了配置文件。您可以通过在终端中运行 sugar upload 来开始上传您的NFT。这将将所有NFT及其元数据上传到您所选择的存储方式中。成功上传NFT后,它应该是这个样子。

你还应该在你的 cache.json 文件夹中看到一个生成的文件。这将包含你的NFT和其元数据的所有必要信息。复制 collectionMint 地址并粘贴到https://explorer.solana.com/?cluster=devnet,你应该能够看到与我的类似的NFT。

- - +

🍬 创造糖果机

既然我们已经铸造了一个NFT,现在我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务,它是一个Solana程序,可以让创作者将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有许多有用的功能,如机器人保护和安全的随机化。准备好将一些东西放入我们在上一课中创建但没有使用的文件夹中了吗?

让我们首先在您的 candy-machine 文件夹中创建一个新的资产文件夹。将所有的NFT图像和元数据放入其中。您可以在这里阅读有关如何准备您的NFT资产的更多信息。

使用Sugar CLI

现在您已经成功创建了所有的NFT资产,我们可以通过使用Sugar CLI来开始部署它。如果由于某种原因您尚未安装它,您可以按照这里的指南来安装CLI。

让我们通过运行 cd tokens/candy-machine/ 来开始导航到candy-machine文件夹,并继续通过运行 sugar launch 来启动Sugar CLI。它会询问你一系列的问题。随意配置它,以你想要的方式。最重要的是,确保将NFT的价格设置为 0 ,并将存储方法设置为 bundlr 。你可以选择将 yes 设置为所有内容。

⬆️ 上传你的NFT

现在您已经创建了配置文件。您可以通过在终端中运行 sugar upload 来开始上传您的NFT。这将将所有NFT及其元数据上传到您所选择的存储方式中。成功上传NFT后,它应该是这个样子。

你还应该在你的 cache.json 文件夹中看到一个生成的文件。这将包含你的NFT和其元数据的所有必要信息。复制 collectionMint 地址并粘贴到https://explorer.solana.com/?cluster=devnet,你应该能够看到与我的类似的NFT。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/index.html b/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/index.html index bc865679a..a3d4cd2b1 100644 --- a/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/index.html +++ b/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/index.html @@ -3,15 +3,15 @@ -🎨 创建奖励代币 | All in One Solana - - - +🎨 创建奖励代币 | All in One Solana + + +
-

🎨 创建奖励代币

现在我们已经铸造了一个NFT,我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务——这是一个Solana程序,允许创作者将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有一些有用的功能,如机器人保护和安全随机化。是时候回到我们的自定义NFT质押应用了。我们将利用我们在代币程序和糖果机上的经验来构建我们的应用。

请继续,在您的根目录中创建一个名为 tokens 的新文件夹。在该文件夹内,我们需要创建2个名为 bldcandy-machine 的子文件夹。它应该看起来像这样:

我们创建这个的原因是为了我们堆叠 Builder 时的奖励代币,以及与我们的 NFT 相关的东西。

现在让我们开始创建我们的资源文件夹。这将用于我们代币的图像。进入您的 bld 文件夹,并创建一个名为 assets 的新文件夹,并在您的 bld 文件夹内创建一个名为 index.ts 的新文件。它应该看起来像这样。

├── styles
├── tokens
│ ├── bld
| ├── assets
| ├── index.ts

注意:确保你的index.ts文件在bld文件夹中,而不是在assets文件夹中。

你会注意到你的 index.ts 文件被标记为红色。这是因为我们目前还没有任何代码。让我们通过向你的 index.ts 中添加一些代码来解决这个问题。我们还需要将 initializeKeypair 文件移动到 bld 文件夹中。你还需要向 bld/assets 文件夹中添加一张图片,这将是你的令牌图片。

import * as web3 from "@solana/web3.js";
import * as token from "@solana/spl-token";
import { initializeKeypair } from "./initializeKeypair";

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"));
const payer = await initializeKeypair(connection);
}

main()
.then(() => {
console.log("Finished successfully");
process.exit(0);
})
.catch((error) => {
console.log(error);
process.exit(1);
});

太棒了!现在我们有了开始的代码,让我们把下一段代码粘贴到你的 index.ts 文件中。你可以把它放在你的 main 函数上方。

import * as fs from "fs";
import {
bundlrStorage,
keypairIdentity,
Metaplex,
toMetaplexFile,
} from "@metaplex-foundation/js";

import {
DataV2,
createCreateMetadataAccountV2Instruction,
} from "@metaplex-foundation/mpl-token-metadata";

const TOKEN_NAME = "BUILD";
const TOKEN_SYMBOL = "BLD";
const TOKEN_DESCRIPTION = "A token for buildoors";
const TOKEN_IMAGE_NAME = "unicorn.png"; // Replace unicorn.png with your image name
const TOKEN_IMAGE_PATH = `tokens/bld/assets/${TOKEN_IMAGE_NAME}`;

async function createBldToken(
connection: web3.Connection,
payer: web3.Keypair
) {
// This will create a token with all the necessary inputs
const tokenMint = await token.createMint(
connection, // Connection
payer, // Payer
payer.publicKey, // Your wallet public key
payer.publicKey, // Freeze authority
2 // Decimals
);

// Create a metaplex object so that we can create a metaplex metadata
const metaplex = Metaplex.make(connection)
.use(keypairIdentity(payer))
.use(
bundlrStorage({
address: "https://devnet.bundlr.network",
providerUrl: "https://api.devnet.solana.com",
timeout: 60000,
})
);

// Read image file
const imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);
const file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);
const imageUri = await metaplex.storage().upload(file);

// Upload the rest of offchain metadata
const { uri } = await metaplex
.nfts()
.uploadMetadata({
name: TOKEN_NAME,
description: TOKEN_DESCRIPTION,
image: imageUri,
});

// Finding out the address where the metadata is stored
const metadataPda = metaplex.nfts().pdas().metadata({mint: tokenMint});
const tokenMetadata = {
name: TOKEN_NAME,
symbol: TOKEN_SYMBOL,
uri: uri,
sellerFeeBasisPoints: 0,
creators: null,
collection: null,
uses: null,
} as DataV2

const instruction = createCreateMetadataAccountV2Instruction({
metadata: metadataPda,
mint: tokenMint,
mintAuthority: payer.publicKey,
payer: payer.publicKey,
updateAuthority: payer.publicKey
},
{
createMetadataAccountArgsV2: {
data: tokenMetadata,
isMutable: true
}
})

const transaction = new web3.Transaction()
transaction.add(instruction)

const transactionSignature = await web3.sendAndConfirmTransaction(
connection,
transaction,
[payer]
)
}

// The rest of your main function

🥳 代码解析

好的,让我们把这一切都分解开来,就像制作柠檬水一样简单。

在这里,我们正在调用 createMint 函数来创建并初始化一个新的铸币。您可以在这里阅读更多关于这个函数的信息。

// This will create a token with all the necessary inputs
const tokenMint = await token.createMint(
connection, // Connection
payer, // Payer
payer.publicKey, // Your wallet public key
payer.publicKey, // Freeze authority
2 // Decimals
);

接下来,我们正在创建一个metaplex对象,以便它可以生成metaplex元数据并将其上传到bundlrStorage。

// Create a metaplex object so that we can create a metaplex metadata
const metaplex = Metaplex.make(connection)
.use(keypairIdentity(payer))
.use(
bundlrStorage({
address: "https://devnet.bundlr.network",
providerUrl: "https://api.devnet.solana.com",
timeout: 60000,
})
);

这部分很容易理解。我们现在正在尝试读取我们放在 bld/assets 文件夹中的图像文件,并将元数据上传到存储空间。

// Read image file
const imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);
const file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);
const imageUri = await metaplex.storage().upload(file);
// Upload the rest of offchain metadata
const { uri } = await metaplex
.nfts()
.uploadMetadata({
name: TOKEN_NAME,
description: TOKEN_DESCRIPTION,
image: imageUri,
});

一旦我们成功将图像上传到metaplex,我们将通过调用下面的部分来获取地址。

// Finding out the address where the metadata is stored
const metadataPda = metaplex.nfts().pdas().metadata({mint: tokenMint});
const tokenMetadata = {
name: TOKEN_NAME,
symbol: TOKEN_SYMBOL,
uri: uri,
sellerFeeBasisPoints: 0,
creators: null,
collection: null,
uses: null,
} as DataV2

const instruction = createCreateMetadataAccountV2Instruction({
metadata: metadataPda,
mint: tokenMint,
mintAuthority: payer.publicKey,
payer: payer.publicKey,
updateAuthority: payer.publicKey
},
{
createMetadataAccountArgsV2: {
data: tokenMetadata,
isMutable: true
}
})

const transaction = new web3.Transaction()
transaction.add(instruction)
const transactionSignature = await web3.sendAndConfirmTransaction(
connection,
transaction,
[payer]
)

🫙 元数据的存储

现在我们已经创建了带有以下元数据的薄荷。让我们继续下一步吧!现在我们将通过编写以下代码将元数据文件写入我们的文件夹中。

就在您定义 transactionSignature 的下方,让我们把这段代码放在这里。

fs.writeFileSync(
"tokens/bld/cache.json",
JSON.stringify({
mint: tokenMint.toBase58(),
imageUri: imageUri,
metadataUri: uri,
tokenMetadata: metadataPda.toBase58(),
metadataTransaction: transactionSignature,
})
);

太棒了!现在我们已经完成了编写我们的 createBldToken 函数。现在,让我们在下面的 main 函数中开始调用这个函数。你的 main 函数现在应该是这个样子。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"));
const payer = await initializeKeypair(connection);

await createBldToken(connection, payer);
}

就这样了。你现在完成了。让我们开始运行我们的代码。

🚀 运行我们的代码

在VS Code中打开终端。首先需要安装一个名为 ts-node 的模块。这是必需的,因为我们将运行一些TypeScript命令。在终端中输入 npm install --save-dev ts-node 。现在,转到您的 package.json 并将此行添加到 scripts 部分。

"create-bld-token": "ts-node ./src/tokens/bld/index.ts"

现在应该是这个样子。

记得保存你的更改!现在你应该能够通过在终端中运行 npm run create-bld-token 来使用你添加的新命令。这将开始在开发网络中为你创建和铸造代币。一旦完成,你应该能够在你的文件夹中看到一个 cache.json 。打开它,它应该是这个样子。

注意:如果您收到类似 SyntaxError: Cannot use import statement outside a module 的错误,请检查您的 tsconfig.json 并添加/更改为 "module": "CommonJS"

请复制 mint 中列出的地址,并将其粘贴到https://explorer.solana.com/?cluster=devnet。现在,您应该能够看到您选择的图像的代币,就像这样。

- - +

🎨 创建奖励代币

现在我们已经铸造了一个NFT,我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个任务——这是一个Solana程序,允许创作者将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有一些有用的功能,如机器人保护和安全随机化。是时候回到我们的自定义NFT质押应用了。我们将利用我们在代币程序和糖果机上的经验来构建我们的应用。

请继续,在您的根目录中创建一个名为 tokens 的新文件夹。在该文件夹内,我们需要创建2个名为 bldcandy-machine 的子文件夹。它应该看起来像这样:

我们创建这个的原因是为了我们堆叠 Builder 时的奖励代币,以及与我们的 NFT 相关的东西。

现在让我们开始创建我们的资源文件夹。这将用于我们代币的图像。进入您的 bld 文件夹,并创建一个名为 assets 的新文件夹,并在您的 bld 文件夹内创建一个名为 index.ts 的新文件。它应该看起来像这样。

├── styles
├── tokens
│ ├── bld
| ├── assets
| ├── index.ts

注意:确保你的index.ts文件在bld文件夹中,而不是在assets文件夹中。

你会注意到你的 index.ts 文件被标记为红色。这是因为我们目前还没有任何代码。让我们通过向你的 index.ts 中添加一些代码来解决这个问题。我们还需要将 initializeKeypair 文件移动到 bld 文件夹中。你还需要向 bld/assets 文件夹中添加一张图片,这将是你的令牌图片。

import * as web3 from "@solana/web3.js";
import * as token from "@solana/spl-token";
import { initializeKeypair } from "./initializeKeypair";

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"));
const payer = await initializeKeypair(connection);
}

main()
.then(() => {
console.log("Finished successfully");
process.exit(0);
})
.catch((error) => {
console.log(error);
process.exit(1);
});

太棒了!现在我们有了开始的代码,让我们把下一段代码粘贴到你的 index.ts 文件中。你可以把它放在你的 main 函数上方。

import * as fs from "fs";
import {
bundlrStorage,
keypairIdentity,
Metaplex,
toMetaplexFile,
} from "@metaplex-foundation/js";

import {
DataV2,
createCreateMetadataAccountV2Instruction,
} from "@metaplex-foundation/mpl-token-metadata";

const TOKEN_NAME = "BUILD";
const TOKEN_SYMBOL = "BLD";
const TOKEN_DESCRIPTION = "A token for buildoors";
const TOKEN_IMAGE_NAME = "unicorn.png"; // Replace unicorn.png with your image name
const TOKEN_IMAGE_PATH = `tokens/bld/assets/${TOKEN_IMAGE_NAME}`;

async function createBldToken(
connection: web3.Connection,
payer: web3.Keypair
) {
// This will create a token with all the necessary inputs
const tokenMint = await token.createMint(
connection, // Connection
payer, // Payer
payer.publicKey, // Your wallet public key
payer.publicKey, // Freeze authority
2 // Decimals
);

// Create a metaplex object so that we can create a metaplex metadata
const metaplex = Metaplex.make(connection)
.use(keypairIdentity(payer))
.use(
bundlrStorage({
address: "https://devnet.bundlr.network",
providerUrl: "https://api.devnet.solana.com",
timeout: 60000,
})
);

// Read image file
const imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);
const file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);
const imageUri = await metaplex.storage().upload(file);

// Upload the rest of offchain metadata
const { uri } = await metaplex
.nfts()
.uploadMetadata({
name: TOKEN_NAME,
description: TOKEN_DESCRIPTION,
image: imageUri,
});

// Finding out the address where the metadata is stored
const metadataPda = metaplex.nfts().pdas().metadata({mint: tokenMint});
const tokenMetadata = {
name: TOKEN_NAME,
symbol: TOKEN_SYMBOL,
uri: uri,
sellerFeeBasisPoints: 0,
creators: null,
collection: null,
uses: null,
} as DataV2

const instruction = createCreateMetadataAccountV2Instruction({
metadata: metadataPda,
mint: tokenMint,
mintAuthority: payer.publicKey,
payer: payer.publicKey,
updateAuthority: payer.publicKey
},
{
createMetadataAccountArgsV2: {
data: tokenMetadata,
isMutable: true
}
})

const transaction = new web3.Transaction()
transaction.add(instruction)

const transactionSignature = await web3.sendAndConfirmTransaction(
connection,
transaction,
[payer]
)
}

// The rest of your main function

🥳 代码解析

好的,让我们把这一切都分解开来,就像制作柠檬水一样简单。

在这里,我们正在调用 createMint 函数来创建并初始化一个新的铸币。您可以在这里阅读更多关于这个函数的信息。

// This will create a token with all the necessary inputs
const tokenMint = await token.createMint(
connection, // Connection
payer, // Payer
payer.publicKey, // Your wallet public key
payer.publicKey, // Freeze authority
2 // Decimals
);

接下来,我们正在创建一个metaplex对象,以便它可以生成metaplex元数据并将其上传到bundlrStorage。

// Create a metaplex object so that we can create a metaplex metadata
const metaplex = Metaplex.make(connection)
.use(keypairIdentity(payer))
.use(
bundlrStorage({
address: "https://devnet.bundlr.network",
providerUrl: "https://api.devnet.solana.com",
timeout: 60000,
})
);

这部分很容易理解。我们现在正在尝试读取我们放在 bld/assets 文件夹中的图像文件,并将元数据上传到存储空间。

// Read image file
const imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);
const file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);
const imageUri = await metaplex.storage().upload(file);
// Upload the rest of offchain metadata
const { uri } = await metaplex
.nfts()
.uploadMetadata({
name: TOKEN_NAME,
description: TOKEN_DESCRIPTION,
image: imageUri,
});

一旦我们成功将图像上传到metaplex,我们将通过调用下面的部分来获取地址。

// Finding out the address where the metadata is stored
const metadataPda = metaplex.nfts().pdas().metadata({mint: tokenMint});
const tokenMetadata = {
name: TOKEN_NAME,
symbol: TOKEN_SYMBOL,
uri: uri,
sellerFeeBasisPoints: 0,
creators: null,
collection: null,
uses: null,
} as DataV2

const instruction = createCreateMetadataAccountV2Instruction({
metadata: metadataPda,
mint: tokenMint,
mintAuthority: payer.publicKey,
payer: payer.publicKey,
updateAuthority: payer.publicKey
},
{
createMetadataAccountArgsV2: {
data: tokenMetadata,
isMutable: true
}
})

const transaction = new web3.Transaction()
transaction.add(instruction)
const transactionSignature = await web3.sendAndConfirmTransaction(
connection,
transaction,
[payer]
)

🫙 元数据的存储

现在我们已经创建了带有以下元数据的薄荷。让我们继续下一步吧!现在我们将通过编写以下代码将元数据文件写入我们的文件夹中。

就在您定义 transactionSignature 的下方,让我们把这段代码放在这里。

fs.writeFileSync(
"tokens/bld/cache.json",
JSON.stringify({
mint: tokenMint.toBase58(),
imageUri: imageUri,
metadataUri: uri,
tokenMetadata: metadataPda.toBase58(),
metadataTransaction: transactionSignature,
})
);

太棒了!现在我们已经完成了编写我们的 createBldToken 函数。现在,让我们在下面的 main 函数中开始调用这个函数。你的 main 函数现在应该是这个样子。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"));
const payer = await initializeKeypair(connection);

await createBldToken(connection, payer);
}

就这样了。你现在完成了。让我们开始运行我们的代码。

🚀 运行我们的代码

在VS Code中打开终端。首先需要安装一个名为 ts-node 的模块。这是必需的,因为我们将运行一些TypeScript命令。在终端中输入 npm install --save-dev ts-node 。现在,转到您的 package.json 并将此行添加到 scripts 部分。

"create-bld-token": "ts-node ./src/tokens/bld/index.ts"

现在应该是这个样子。

记得保存你的更改!现在你应该能够通过在终端中运行 npm run create-bld-token 来使用你添加的新命令。这将开始在开发网络中为你创建和铸造代币。一旦完成,你应该能够在你的文件夹中看到一个 cache.json 。打开它,它应该是这个样子。

注意:如果您收到类似 SyntaxError: Cannot use import statement outside a module 的错误,请检查您的 tsconfig.json 并添加/更改为 "module": "CommonJS"

请复制 mint 中列出的地址,并将其粘贴到https://explorer.solana.com/?cluster=devnet。现在,您应该能够看到您选择的图像的代币,就像这样。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/index.html b/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/index.html index 21349db03..2c4b6614f 100644 --- a/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/index.html +++ b/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/index.html @@ -3,15 +3,15 @@ -🎨 创建铸币用户界面 | All in One Solana - - - +🎨 创建铸币用户界面 | All in One Solana + + +
-

🎨 创建铸币用户界面

现在我们已经成功创建了代币和非同质化代币(NFT)。让我们继续创建我们的铸币用户界面,这样我们就可以直观地与智能合约进行交互,并允许其他人在我们的浏览器上铸造我们的NFT!这不是很酷吗?如果你注意到,你的网站目前有一个 minting 按钮,但它还没有任何功能。让我们从创建一个函数开始,并添加一些逻辑,以允许我们铸造我们的NFT。如果你没有起始代码,你可以在这里克隆它。

现在,让我们开始将以下代码行添加到您的 newMint.tsx 中。注意:不要盲目复制粘贴代码。我只包含了必要的部分,您应该弄清楚这些代码应该放在哪里。提示:应该放在您的 Container 元素下方。

// REST OF YOUR CODE
import { Button, Text, HStack } from "@chakra-ui/react";
import { MouseEventHandler, useCallback } from "react";
import { ArrowForwardIcon } from "@chakra-ui/icons";

const Home: NextPage = () => {
const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
async (event) => {},
[]
);

return (
<MainLayout>
{/* REST OF YOUR CODE */}
<Image src="" alt="" />
<Button
bgColor="accent"
color="white"
maxWidth="380px"
onClick={handleClick}
>
<HStack>
<Text>stake my buildoor</Text>
<ArrowForwardIcon />
</HStack>
</Button>
</MainLayout>
);
};

一旦完成,我们可以转到 Connected.tsx 并添加一些代码。就在 handleClick 函数的上方,我们可以添加这个 const router = useRouter() 。记得在上方导入useRouter函数。接下来,在你的 handleClick 函数中添加 router.push("/newMint") 。现在它应该看起来像这样。

const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
async (event) => {
if (event.defaultPrevented) return;
if (!walletAdapter.connected || !candyMachine) return;

try {
setIsMinting(true);
const nft = await metaplex
.candyMachinesV2()
.mint({ candyMachine });

console.log(nft);
router.push(`/newMint?mint=${nft.nft.address.toBase58()}`);
} catch (error) {
alert(error);
} finally {
setIsMinting(false);
}
},
[metaplex, walletAdapter, candyMachine]
);

现在你应该能够点击 stake my buildoor 按钮,然后会提示你从你的幽灵钱包中批准交易。然而,你可能会注意到一旦你成功批准了交易,页面会刷新并导致你的钱包被登出。不要担心,在下一节中我们会解决这个问题。

请前往 newMint.tsx 。我们将创建一个界面来解决这个问题。将此代码添加到您的 Home 函数之上。

import { PublicKey } from "@solana/web3.js";

interface NewMintProps {
mint: PublicKey;
}

一旦完成,它应该看起来像这样

// REST OF YOUR CODE
import { PublicKey } from "@solana/web3.js";
import { Metaplex, walletAdapterIdentity } from "@metaplex-foundation/js";

interface NewMintProps {
mint: PublicKey;
}

const Home: NextPage<NewMintProps> = ({ mint }) => {
const [metadata, setMetadata] = useState<any>()
const { connection } = useConnection()
const walletAdapter = useWallet()
const metaplex = useMemo(() => {
return Metaplex.make(connection).use(walletAdapterIdentity(walletAdapter))
}, [connection, walletAdapter])

useEffect(() => {
// What this does is to allow us to find the NFT object
// based on the given mint address
metaplex.nfts().findByMint({ mintAddress: new PublicKey(mint) })
.then((nft) => {
// We then fetch the NFT uri to fetch the NFT metadata
fetch(nft.uri)
.then((res) => res.json())
.then((metadata) => {
setMetadata(metadata)
})
})
}, [mint, metaplex, walletAdapter])

// REST OF YOUR CODE
};

注意到我们在上面的函数中如何调用 setMetadata(metadata) 了吗?这是为了让我们能够将元数据对象设置到状态中,以便我们可以用它来渲染图片。现在让我们在我们的 Image 元素中调用这个对象。

<Image src={metadata?.image ?? ""} alt="" />

我们快到了。如果你现在尝试铸造一个新的NFT,你会注意到网站会抛出一个错误,说它无法读取未定义的属性。我们可以通过在底部添加几行代码来修复这个问题。就在你的 export default NewMint 稍微上面。

NewMint.getInitialProps = async ({ query }) => {
const { mint } = query;
if (!mint) throw { error: "No mint" };

try {
const mintPubkey = new PublicKey(mint);
return { mint: mintPubkey };
} catch {
throws({ error: "Invalid mint" });
}
};

太棒了!现在你已经添加了所有必要的代码,你应该能够铸造一个NFT,并且能够看到那张图片。这是我的样子。

🛠️小修复

请注意网站未能准确显示内容,为了解决这个问题,我们需要前往 WalletContextProvider.tsx 并修改一些代码。

改变

const phantom = new PhantomWalletAdapter();

to

const phantom = useMemo(() => new PhantomWalletAdapter(), []);

我们还需要给你的 autoConnect 添加一个属性。就像这样。

<WalletProvider wallets={[phantom]} autoConnect={true}>
<WalletModalProvider>{children}</WalletModalProvider>
</WalletProvider>

我们需要使用 useMemo 的原因是为了防止钱包适配器被多次构建。您可以在这里了解更多关于useMemo的信息。

- - +

🎨 创建铸币用户界面

现在我们已经成功创建了代币和非同质化代币(NFT)。让我们继续创建我们的铸币用户界面,这样我们就可以直观地与智能合约进行交互,并允许其他人在我们的浏览器上铸造我们的NFT!这不是很酷吗?如果你注意到,你的网站目前有一个 minting 按钮,但它还没有任何功能。让我们从创建一个函数开始,并添加一些逻辑,以允许我们铸造我们的NFT。如果你没有起始代码,你可以在这里克隆它。

现在,让我们开始将以下代码行添加到您的 newMint.tsx 中。注意:不要盲目复制粘贴代码。我只包含了必要的部分,您应该弄清楚这些代码应该放在哪里。提示:应该放在您的 Container 元素下方。

// REST OF YOUR CODE
import { Button, Text, HStack } from "@chakra-ui/react";
import { MouseEventHandler, useCallback } from "react";
import { ArrowForwardIcon } from "@chakra-ui/icons";

const Home: NextPage = () => {
const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
async (event) => {},
[]
);

return (
<MainLayout>
{/* REST OF YOUR CODE */}
<Image src="" alt="" />
<Button
bgColor="accent"
color="white"
maxWidth="380px"
onClick={handleClick}
>
<HStack>
<Text>stake my buildoor</Text>
<ArrowForwardIcon />
</HStack>
</Button>
</MainLayout>
);
};

一旦完成,我们可以转到 Connected.tsx 并添加一些代码。就在 handleClick 函数的上方,我们可以添加这个 const router = useRouter() 。记得在上方导入useRouter函数。接下来,在你的 handleClick 函数中添加 router.push("/newMint") 。现在它应该看起来像这样。

const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
async (event) => {
if (event.defaultPrevented) return;
if (!walletAdapter.connected || !candyMachine) return;

try {
setIsMinting(true);
const nft = await metaplex
.candyMachinesV2()
.mint({ candyMachine });

console.log(nft);
router.push(`/newMint?mint=${nft.nft.address.toBase58()}`);
} catch (error) {
alert(error);
} finally {
setIsMinting(false);
}
},
[metaplex, walletAdapter, candyMachine]
);

现在你应该能够点击 stake my buildoor 按钮,然后会提示你从你的幽灵钱包中批准交易。然而,你可能会注意到一旦你成功批准了交易,页面会刷新并导致你的钱包被登出。不要担心,在下一节中我们会解决这个问题。

请前往 newMint.tsx 。我们将创建一个界面来解决这个问题。将此代码添加到您的 Home 函数之上。

import { PublicKey } from "@solana/web3.js";

interface NewMintProps {
mint: PublicKey;
}

一旦完成,它应该看起来像这样

// REST OF YOUR CODE
import { PublicKey } from "@solana/web3.js";
import { Metaplex, walletAdapterIdentity } from "@metaplex-foundation/js";

interface NewMintProps {
mint: PublicKey;
}

const Home: NextPage<NewMintProps> = ({ mint }) => {
const [metadata, setMetadata] = useState<any>()
const { connection } = useConnection()
const walletAdapter = useWallet()
const metaplex = useMemo(() => {
return Metaplex.make(connection).use(walletAdapterIdentity(walletAdapter))
}, [connection, walletAdapter])

useEffect(() => {
// What this does is to allow us to find the NFT object
// based on the given mint address
metaplex.nfts().findByMint({ mintAddress: new PublicKey(mint) })
.then((nft) => {
// We then fetch the NFT uri to fetch the NFT metadata
fetch(nft.uri)
.then((res) => res.json())
.then((metadata) => {
setMetadata(metadata)
})
})
}, [mint, metaplex, walletAdapter])

// REST OF YOUR CODE
};

注意到我们在上面的函数中如何调用 setMetadata(metadata) 了吗?这是为了让我们能够将元数据对象设置到状态中,以便我们可以用它来渲染图片。现在让我们在我们的 Image 元素中调用这个对象。

<Image src={metadata?.image ?? ""} alt="" />

我们快到了。如果你现在尝试铸造一个新的NFT,你会注意到网站会抛出一个错误,说它无法读取未定义的属性。我们可以通过在底部添加几行代码来修复这个问题。就在你的 export default NewMint 稍微上面。

NewMint.getInitialProps = async ({ query }) => {
const { mint } = query;
if (!mint) throw { error: "No mint" };

try {
const mintPubkey = new PublicKey(mint);
return { mint: mintPubkey };
} catch {
throws({ error: "Invalid mint" });
}
};

太棒了!现在你已经添加了所有必要的代码,你应该能够铸造一个NFT,并且能够看到那张图片。这是我的样子。

🛠️小修复

请注意网站未能准确显示内容,为了解决这个问题,我们需要前往 WalletContextProvider.tsx 并修改一些代码。

改变

const phantom = new PhantomWalletAdapter();

to

const phantom = useMemo(() => new PhantomWalletAdapter(), []);

我们还需要给你的 autoConnect 添加一个属性。就像这样。

<WalletProvider wallets={[phantom]} autoConnect={true}>
<WalletModalProvider>{children}</WalletModalProvider>
</WalletProvider>

我们需要使用 useMemo 的原因是为了防止钱包适配器被多次构建。您可以在这里了解更多关于useMemo的信息。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/index.html b/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/index.html index 84ca51649..566e5eef6 100644 --- a/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/index.html +++ b/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/index.html @@ -3,15 +3,15 @@ -创造神奇的互联网货币并出售JPEG图片 | All in One Solana - - - +创造神奇的互联网货币并出售JPEG图片 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/index.html b/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/index.html index faf7d48ca..289078f8a 100644 --- a/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/index.html +++ b/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/index.html @@ -3,16 +3,16 @@ -🍭 糖果机和Sugar CLI | All in One Solana - - - +🍭 糖果机和Sugar CLI | All in One Solana + + +
-

🍭 糖果机和Sugar CLI

有什么比将你的脸做成NFT更好的呢?你可以将自己永恒地成为一个早期的建造者,并告诉你妈妈你在区块链上。既然我们已经铸造了一个单独的NFT,我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个过程——这是一个Solana程序,让创作者能够将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有一些有用的功能,如机器人保护和安全随机化。

由于这是一个链上程序,所有的数据都存储在账户中。你首先需要为你的收藏创建一个糖果机的实例。这只是一个账户,它将存储一些重要的所有者信息和糖果机的配置在元数据字段中。

注意那个数据字段?那就是元数据所在的地方,它看起来像这样:

再说一遍 - 这里发生了很多事情,我们会在相关的时候逐个解释。

要与糖果机程序互动,我们将使用Sugar CLI。这是一个很棒的工具,让你可以直接从命令行与程序进行交互。

🛠 安装命令行界面(CLIs)

在我们开始之前,我们需要安装:

    1. Solana CLI - Sugar CLI 需要这个。您可以在此处为您的操作系统安装它。
    1. Sugar CLI - 您可以在此处安装。

注意 - 如果您想将CLI安装与您的计算机分开,您可以在Docker上设置Solana CLI,然后下载Sugar CLI。Docker镜像在这里。如果您不知道Docker是什么,不用担心!

如果安装正确,当您在终端中运行 solana --versionsugar --version 时,您应该看到版本号而不是错误。

如果您还没有本地的Solana钱包,现在是设置开发网络的好时机。在终端中运行以下命令:

solana config set --url devnet
solana-keygen new --outfile ~/.config/solana/devnet.json
solana airdrop 2
solana balance

这正是我们在本地客户端脚本中所做的事情,只不过是在终端中进行。

🍬 创建你的收藏品

这将是建立过程中最困难的部分之一:决定你想要制作一个NFT收藏的内容。你至少需要5张图片,每张图片对应收藏中的一个NFT。我选择了一些经典的pepes,因为pepes总是能引起我的共鸣。

在你的Solana工作空间中创建一个新的项目文件夹,并在其中创建一个 assets 文件夹。你需要将每个NFT资产与一个元数据JSON文件配对,从零开始编号每一对。因此,你的文件夹结构应该类似于这样:

...
|
|── assets
| |── 0.png
| |── 0.json
| |...
| |── 5.png
| |── 5.json
|
|── node_modules
|── src
|── package.json
....

这是一个JSON文件的样子:

实际操作中,你会编写一个脚本来生成这些文件,但现在我们只能手动完成。你可以从这些示例资产开始,然后用你自己的图片替换它们。确保你也更新了JSON文件!

您还可以选择添加一个与之匹配的 collection.jsoncollection.png - 这些将被市场用作集合名称、描述和缩略图。

这是一个模板:

{
"name": "Studious Crabs Collection",
"symbol": "CRAB",
"description": "Collection of 10 crabs seeking refuge from overfishing on the blockchain.",
"image": "collection.png",
"attributes": [],
"properties": {
"files": [
{
"uri": "collection.png",
"type": "image/png"
}
]
}
}

拯救🦀螃蟹,使其免遭🎣渔民的捕捞

现在你应该只有一个包含商品的资产文件夹(如果你使用的是Windows系统,还会有一个~文件夹)。

🍭 配置您的糖果机

接下来我们需要创建一个糖果机配置文件。这个文件用于创建链上的糖果机实例。Sugar CLI会引导您完成最低要求,这样您就不必手动操作!以下是它的样子:

你知道他们说吃太多糖对身体不好吗?开发Sugar CLI的人肯定也这么认为。要设置一个糖果机,你只需要运行 launch 命令,其他的事情它都会帮你完成。

🚀 发行你的NFT收藏品

在终端中输入 sugar launch ,当它询问是否要创建新的配置文件时,按下y键。回答问题后,你的项目文件夹中将会留下一个 config.json 文件。

这是我的答案:

✔ What is the price of each NFT? · 0.3
✔ Found 10 file pairs in "assets". Is this how many NFTs you will have in your candy machine? · ye
✔ Found symbol "CRAB" in your metadata file. Is this value correct? · no
✔ What is the symbol of your collection? Hit [ENTER] for no symbol. · PEPE
✔ What is the seller fee basis points? · 100
? What is your go live date? Many common formats are supported. · now
✔ How many creator wallets do you have? (max limit of 4) · 1
✔ Enter creator wallet address #1 · B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS
✔ Enter royalty percentage share for creator #1 (e.g., 70). Total shares must add to 100. · 100
? Which extra features do you want to use? ·
✔ What is your SOL treasury address? · B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS
✔ What upload method do you want to use? · Bundlr
✔ Do you want to retain update authority on your NFTs? We HIGHLY recommend you choose yes. · yes
✔ Do you want your NFTs to remain mutable? We HIGHLY recommend you choose yes. · yes

你应该会收到 MISSING COLLECTION FILES IN ASSETS FOLDER 的警告,不用担心,这是因为我们在 assets 文件夹中没有设置 collection.pngcollection.json 文件。继续回答 y 。如果你想了解更多关于这些文件的信息,你可以在这里阅读更多内容。

现在我们不需要任何特殊功能。如果你感兴趣,你可以在这里阅读更多相关信息。

如果有什么东西坏了,或者你在中途改变主意,你可以直接退出这个过程,然后重新开始。你也可以直接编辑 config.json 文件。Sugar CLI会打印出非常有帮助的错误信息,所以如果你遇到困难,只需阅读它们,你很可能就能解决问题。

如果一切顺利,最后你会看到一个绿色的 Command successful. 消息。在它的上方,你会看到一个SolanEyes链接。点击那个链接,你就能在Solana网络上看到你的糖果机!从这里复制糖果机的ID,我们以后会用到它。

如果这还不够神奇,那就试试用 sugar mint 铸造一个NFT。简直美味至极。

一旦你整理好你的收藏品,然后在巴厘岛放松时,糖也可以帮助你进行各种操作,如果你好奇的话,可以查看一下命令

🌐 为您的NFT收藏创建一个前端界面

希望你已经吃过晚饭了,因为现在是吃更多糖果的时候了。

Metaplex基金会提供了一个时尚的React UI模板,您可以用它来为您的NFT收藏创建前端界面。让我们来设置一下:

git clone https://github.com/metaplex-foundation/candy-machine-ui
cd candy-machine-ui
npm i

这里发生了很多事情,我们不需要担心。将 .env.example 重命名为 .env ,并粘贴您之前复制的糖果机ID。

REACT_APP_CANDY_MACHINE_ID=GNfbQEfMA1u1irEFnThTcrzDyefJsoa7sndACShaS5vC

这就是你需要做的一切!现在如果你运行 npm start ,你会在 localhost:3000 上看到一个漂亮的用户界面,你可以用它来铸造你的NFT。

对于Mac用户:如果遇到 export NODE_OPTIONS=--openssl-legacy-provider ,请在终端中运行

一旦你铸造完成,就在你的钱包的收藏品部分查看NFT。

你会注意到,铸造的NFT不是1.png。这是因为糖果机铸造默认是随机的。

我们只是勉强触及到了Candy Machine和Sugar CLI的潜力。以后我们还会涵盖更多内容——本节的目的是为了让你拥有足够的知识广度,让你能够自己深入研究。随着我们不断完善NFT项目,我们将继续深入探索。

🚢 船舶挑战

让我们再多玩一会糖果机吧!🍭

通过更新 config.json 文件并运行 sugar update ,发挥创造力并测试其他糖果机配置。

例子:

  • 修改 goLiveDate
  • 启用 gatekeeper (验证码)
  • 启用 whitelistMintSettings
    • 需要创建令牌
  • 使用 splToken 而不是本地的sol请求付款
    • 需要创建令牌

提示 -文档 :)

https://docs.metaplex.com/developer-tools/sugar/learning/settings

- - +

🍭 糖果机和Sugar CLI

有什么比将你的脸做成NFT更好的呢?你可以将自己永恒地成为一个早期的建造者,并告诉你妈妈你在区块链上。既然我们已经铸造了一个单独的NFT,我们将学习如何铸造一系列的NFT。我们将使用Candy Machine来完成这个过程——这是一个Solana程序,让创作者能够将他们的资产上链。这不是创建系列的唯一方式,但在Solana上它是标准的,因为它具有一些有用的功能,如机器人保护和安全随机化。

由于这是一个链上程序,所有的数据都存储在账户中。你首先需要为你的收藏创建一个糖果机的实例。这只是一个账户,它将存储一些重要的所有者信息和糖果机的配置在元数据字段中。

注意那个数据字段?那就是元数据所在的地方,它看起来像这样:

再说一遍 - 这里发生了很多事情,我们会在相关的时候逐个解释。

要与糖果机程序互动,我们将使用Sugar CLI。这是一个很棒的工具,让你可以直接从命令行与程序进行交互。

🛠 安装命令行界面(CLIs)

在我们开始之前,我们需要安装:

    1. Solana CLI - Sugar CLI 需要这个。您可以在此处为您的操作系统安装它。
    1. Sugar CLI - 您可以在此处安装。

注意 - 如果您想将CLI安装与您的计算机分开,您可以在Docker上设置Solana CLI,然后下载Sugar CLI。Docker镜像在这里。如果您不知道Docker是什么,不用担心!

如果安装正确,当您在终端中运行 solana --versionsugar --version 时,您应该看到版本号而不是错误。

如果您还没有本地的Solana钱包,现在是设置开发网络的好时机。在终端中运行以下命令:

solana config set --url devnet
solana-keygen new --outfile ~/.config/solana/devnet.json
solana airdrop 2
solana balance

这正是我们在本地客户端脚本中所做的事情,只不过是在终端中进行。

🍬 创建你的收藏品

这将是建立过程中最困难的部分之一:决定你想要制作一个NFT收藏的内容。你至少需要5张图片,每张图片对应收藏中的一个NFT。我选择了一些经典的pepes,因为pepes总是能引起我的共鸣。

在你的Solana工作空间中创建一个新的项目文件夹,并在其中创建一个 assets 文件夹。你需要将每个NFT资产与一个元数据JSON文件配对,从零开始编号每一对。因此,你的文件夹结构应该类似于这样:

...
|
|── assets
| |── 0.png
| |── 0.json
| |...
| |── 5.png
| |── 5.json
|
|── node_modules
|── src
|── package.json
....

这是一个JSON文件的样子:

实际操作中,你会编写一个脚本来生成这些文件,但现在我们只能手动完成。你可以从这些示例资产开始,然后用你自己的图片替换它们。确保你也更新了JSON文件!

您还可以选择添加一个与之匹配的 collection.jsoncollection.png - 这些将被市场用作集合名称、描述和缩略图。

这是一个模板:

{
"name": "Studious Crabs Collection",
"symbol": "CRAB",
"description": "Collection of 10 crabs seeking refuge from overfishing on the blockchain.",
"image": "collection.png",
"attributes": [],
"properties": {
"files": [
{
"uri": "collection.png",
"type": "image/png"
}
]
}
}

拯救🦀螃蟹,使其免遭🎣渔民的捕捞

现在你应该只有一个包含商品的资产文件夹(如果你使用的是Windows系统,还会有一个~文件夹)。

🍭 配置您的糖果机

接下来我们需要创建一个糖果机配置文件。这个文件用于创建链上的糖果机实例。Sugar CLI会引导您完成最低要求,这样您就不必手动操作!以下是它的样子:

你知道他们说吃太多糖对身体不好吗?开发Sugar CLI的人肯定也这么认为。要设置一个糖果机,你只需要运行 launch 命令,其他的事情它都会帮你完成。

🚀 发行你的NFT收藏品

在终端中输入 sugar launch ,当它询问是否要创建新的配置文件时,按下y键。回答问题后,你的项目文件夹中将会留下一个 config.json 文件。

这是我的答案:

✔ What is the price of each NFT? · 0.3
✔ Found 10 file pairs in "assets". Is this how many NFTs you will have in your candy machine? · ye
✔ Found symbol "CRAB" in your metadata file. Is this value correct? · no
✔ What is the symbol of your collection? Hit [ENTER] for no symbol. · PEPE
✔ What is the seller fee basis points? · 100
? What is your go live date? Many common formats are supported. · now
✔ How many creator wallets do you have? (max limit of 4) · 1
✔ Enter creator wallet address #1 · B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS
✔ Enter royalty percentage share for creator #1 (e.g., 70). Total shares must add to 100. · 100
? Which extra features do you want to use? ·
✔ What is your SOL treasury address? · B1aLAAe4vW8nSQCetXnYqJfRxzTjnbooczwkUJAr7yMS
✔ What upload method do you want to use? · Bundlr
✔ Do you want to retain update authority on your NFTs? We HIGHLY recommend you choose yes. · yes
✔ Do you want your NFTs to remain mutable? We HIGHLY recommend you choose yes. · yes

你应该会收到 MISSING COLLECTION FILES IN ASSETS FOLDER 的警告,不用担心,这是因为我们在 assets 文件夹中没有设置 collection.pngcollection.json 文件。继续回答 y 。如果你想了解更多关于这些文件的信息,你可以在这里阅读更多内容。

现在我们不需要任何特殊功能。如果你感兴趣,你可以在这里阅读更多相关信息。

如果有什么东西坏了,或者你在中途改变主意,你可以直接退出这个过程,然后重新开始。你也可以直接编辑 config.json 文件。Sugar CLI会打印出非常有帮助的错误信息,所以如果你遇到困难,只需阅读它们,你很可能就能解决问题。

如果一切顺利,最后你会看到一个绿色的 Command successful. 消息。在它的上方,你会看到一个SolanEyes链接。点击那个链接,你就能在Solana网络上看到你的糖果机!从这里复制糖果机的ID,我们以后会用到它。

如果这还不够神奇,那就试试用 sugar mint 铸造一个NFT。简直美味至极。

一旦你整理好你的收藏品,然后在巴厘岛放松时,糖也可以帮助你进行各种操作,如果你好奇的话,可以查看一下命令

🌐 为您的NFT收藏创建一个前端界面

希望你已经吃过晚饭了,因为现在是吃更多糖果的时候了。

Metaplex基金会提供了一个时尚的React UI模板,您可以用它来为您的NFT收藏创建前端界面。让我们来设置一下:

git clone https://github.com/metaplex-foundation/candy-machine-ui
cd candy-machine-ui
npm i

这里发生了很多事情,我们不需要担心。将 .env.example 重命名为 .env ,并粘贴您之前复制的糖果机ID。

REACT_APP_CANDY_MACHINE_ID=GNfbQEfMA1u1irEFnThTcrzDyefJsoa7sndACShaS5vC

这就是你需要做的一切!现在如果你运行 npm start ,你会在 localhost:3000 上看到一个漂亮的用户界面,你可以用它来铸造你的NFT。

对于Mac用户:如果遇到 export NODE_OPTIONS=--openssl-legacy-provider ,请在终端中运行

一旦你铸造完成,就在你的钱包的收藏品部分查看NFT。

你会注意到,铸造的NFT不是1.png。这是因为糖果机铸造默认是随机的。

我们只是勉强触及到了Candy Machine和Sugar CLI的潜力。以后我们还会涵盖更多内容——本节的目的是为了让你拥有足够的知识广度,让你能够自己深入研究。随着我们不断完善NFT项目,我们将继续深入探索。

🚢 船舶挑战

让我们再多玩一会糖果机吧!🍭

通过更新 config.json 文件并运行 sugar update ,发挥创造力并测试其他糖果机配置。

例子:

  • 修改 goLiveDate
  • 启用 gatekeeper (验证码)
  • 启用 whitelistMintSettings
    • 需要创建令牌
  • 使用 splToken 而不是本地的sol请求付款
    • 需要创建令牌

提示 +文档 :)

https://docs.metaplex.com/developer-tools/sugar/learning/settings

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/index.html b/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/index.html index 762c63431..1583a47b7 100644 --- a/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/index.html +++ b/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/index.html @@ -3,15 +3,15 @@ -Ntfs & Minting with metaplex | All in One Solana - - - +Ntfs & Minting with metaplex | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/index.html b/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/index.html index 9ad37aed4..1a247ad1e 100644 --- a/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/index.html +++ b/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/index.html @@ -3,15 +3,15 @@ -🤨 NFT你的脸 | All in One Solana - - - +🤨 NFT你的脸 | All in One Solana + + +
-

🤨 NFT你的脸

有什么比将你的脸做成NFT更好的选择呢?你可以将自己永恒地成为一个早期的建设者,并告诉你的妈妈你已经登上了区块链。

我们将从一个客户开始

npx create-solana-client [name] --initialize-keypair
cd [name]

请请大招:

npm install @metaplex-foundation/js fs

将两个图像添加到 src 文件夹中。我们将使用其中一个作为初始图像,第二个作为更新后的图像。

这是我们在 src/index.ts 中需要的导入项,没有什么新的东西:

import { Connection, clusterApiUrl, PublicKey } from "@solana/web3.js"
import {
Metaplex,
keypairIdentity,
bundlrStorage,
toMetaplexFile,
NftWithToken,
} from "@metaplex-foundation/js"
import * as fs from "fs"

如果我们声明常量,那么在创建和更新NFT之间更改变量会更容易

const tokenName = "Token Name"
const description = "Description"
const symbol = "SYMBOL"
const sellerFeeBasisPoints = 100
const imageFile = "test.png"

async function main() {
...
}

我们不会创建一个辅助函数,而是可以将所有内容放在 main() 中。我们将首先创建一个 Metaplex 实例:

async function main() {
...

const metaplex = Metaplex.make(connection)
.use(keypairIdentity(user))
.use(
bundlrStorage({
address: "https://devnet.bundlr.network",
providerUrl: "https://api.devnet.solana.com",
timeout: 60000,
})
)
}

上传图片,我们需要:

  • 读取图像文件
  • 转换为Metaplex文件
  • 上传图片
async function main() {
...

// file to buffer
const buffer = fs.readFileSync("src/" + imageFile)

// buffer to metaplex file
const file = toMetaplexFile(buffer, imageFile)

// upload image and get image uri
const imageUri = await metaplex.storage().upload(file)
console.log("image uri:", imageUri)
}

最后,我们可以使用我们得到的图像URI上传元数据

async function main() {
...

// upload metadata and get metadata uri (off chain metadata)
const { uri } = await metaplex
.nfts()
.uploadMetadata({
name: tokenName,
description: description,
image: imageUri,
})

console.log("metadata uri:", uri)
}

在这里,一个专门的铸币NFT功能是一个好主意,将其放在主要功能之外

// create NFT
async function createNft(
metaplex: Metaplex,
uri: string
): Promise<NftWithToken> {
const { nft } = await metaplex
.nfts()
.create({
uri: uri,
name: tokenName,
sellerFeeBasisPoints: sellerFeeBasisPoints,
symbol: symbol,
})

console.log(
`Token Mint: https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`
)

return nft
}

现在你只需要在你的函数末尾调用它即可:

async function main() {
...

await createNft(metaplex, uri)
}

我们准备好铸造我们的NFT了!在终端中运行脚本 npm run start ,并点击Solana Explorer的URL,你应该会看到类似这样的内容:

我们刚在Solana上制作了一个NFT🎉🎉🎉。这就像热一热现成的饭菜一样简单。

🤯 更新你的NFT

总结一下,让我们快速看一下如何更新刚刚铸造的NFT。

在你的脚本顶部,将 imageFile 常量更新为你的NFT最终图像的名称。

唯一改变的是我们称之为Metaplex的方法。将其添加到main之外的任何位置。

async function updateNft(
metaplex: Metaplex,
uri: string,
mintAddress: PublicKey
) {
// get "NftWithToken" type from mint address
const nft = await metaplex.nfts().findByMint({ mintAddress })

// omit any fields to keep unchanged
await metaplex
.nfts()
.update({
nftOrSft: nft,
name: tokenName,
symbol: symbol,
uri: uri,
sellerFeeBasisPoints: sellerFeeBasisPoints,
})

console.log(
`Token Mint: https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`
)
}

现在在主函数中,你可以注释掉 createNFT 的调用,并使用 updateNFT 辅助函数:

async function main() {

...

// await createNft(metaplex, uri)

// You can get this from the Solana Explorer URL
const mintAddress = new PublicKey("EPd324PkQx53Cx2g2B9ZfxVmu6m6gyneMaoWTy2hk2bW")
await updateNft(metaplex, uri, mintAddress)
}

您可以从在铸造NFT时记录的URL中获取薄荷地址。它出现在多个位置 - URL本身、"地址"属性和元数据选项卡中。

- - +

🤨 NFT你的脸

有什么比将你的脸做成NFT更好的选择呢?你可以将自己永恒地成为一个早期的建设者,并告诉你的妈妈你已经登上了区块链。

我们将从一个客户开始

npx create-solana-client [name] --initialize-keypair
cd [name]

请请大招:

npm install @metaplex-foundation/js fs

将两个图像添加到 src 文件夹中。我们将使用其中一个作为初始图像,第二个作为更新后的图像。

这是我们在 src/index.ts 中需要的导入项,没有什么新的东西:

import { Connection, clusterApiUrl, PublicKey } from "@solana/web3.js"
import {
Metaplex,
keypairIdentity,
bundlrStorage,
toMetaplexFile,
NftWithToken,
} from "@metaplex-foundation/js"
import * as fs from "fs"

如果我们声明常量,那么在创建和更新NFT之间更改变量会更容易

const tokenName = "Token Name"
const description = "Description"
const symbol = "SYMBOL"
const sellerFeeBasisPoints = 100
const imageFile = "test.png"

async function main() {
...
}

我们不会创建一个辅助函数,而是可以将所有内容放在 main() 中。我们将首先创建一个 Metaplex 实例:

async function main() {
...

const metaplex = Metaplex.make(connection)
.use(keypairIdentity(user))
.use(
bundlrStorage({
address: "https://devnet.bundlr.network",
providerUrl: "https://api.devnet.solana.com",
timeout: 60000,
})
)
}

上传图片,我们需要:

  • 读取图像文件
  • 转换为Metaplex文件
  • 上传图片
async function main() {
...

// file to buffer
const buffer = fs.readFileSync("src/" + imageFile)

// buffer to metaplex file
const file = toMetaplexFile(buffer, imageFile)

// upload image and get image uri
const imageUri = await metaplex.storage().upload(file)
console.log("image uri:", imageUri)
}

最后,我们可以使用我们得到的图像URI上传元数据

async function main() {
...

// upload metadata and get metadata uri (off chain metadata)
const { uri } = await metaplex
.nfts()
.uploadMetadata({
name: tokenName,
description: description,
image: imageUri,
})

console.log("metadata uri:", uri)
}

在这里,一个专门的铸币NFT功能是一个好主意,将其放在主要功能之外

// create NFT
async function createNft(
metaplex: Metaplex,
uri: string
): Promise<NftWithToken> {
const { nft } = await metaplex
.nfts()
.create({
uri: uri,
name: tokenName,
sellerFeeBasisPoints: sellerFeeBasisPoints,
symbol: symbol,
})

console.log(
`Token Mint: https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`
)

return nft
}

现在你只需要在你的函数末尾调用它即可:

async function main() {
...

await createNft(metaplex, uri)
}

我们准备好铸造我们的NFT了!在终端中运行脚本 npm run start ,并点击Solana Explorer的URL,你应该会看到类似这样的内容:

我们刚在Solana上制作了一个NFT🎉🎉🎉。这就像热一热现成的饭菜一样简单。

🤯 更新你的NFT

总结一下,让我们快速看一下如何更新刚刚铸造的NFT。

在你的脚本顶部,将 imageFile 常量更新为你的NFT最终图像的名称。

唯一改变的是我们称之为Metaplex的方法。将其添加到main之外的任何位置。

async function updateNft(
metaplex: Metaplex,
uri: string,
mintAddress: PublicKey
) {
// get "NftWithToken" type from mint address
const nft = await metaplex.nfts().findByMint({ mintAddress })

// omit any fields to keep unchanged
await metaplex
.nfts()
.update({
nftOrSft: nft,
name: tokenName,
symbol: symbol,
uri: uri,
sellerFeeBasisPoints: sellerFeeBasisPoints,
})

console.log(
`Token Mint: https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`
)
}

现在在主函数中,你可以注释掉 createNFT 的调用,并使用 updateNFT 辅助函数:

async function main() {

...

// await createNft(metaplex, uri)

// You can get this from the Solana Explorer URL
const mintAddress = new PublicKey("EPd324PkQx53Cx2g2B9ZfxVmu6m6gyneMaoWTy2hk2bW")
await updateNft(metaplex, uri, mintAddress)
}

您可以从在铸造NFT时记录的URL中获取薄荷地址。它出现在多个位置 - URL本身、"地址"属性和元数据选项卡中。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/index.html b/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/index.html index bf674f3dc..4dae4cccd 100644 --- a/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/index.html +++ b/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/index.html @@ -3,15 +3,15 @@ -🎨 NFTs on Solana | All in One Solana - - - +🎨 NFTs on Solana | All in One Solana + + +
-

🎨 NFTs on Solana

我们到了。没花太长时间。猴子图片。猿类。岩石。还有其他动物主题的头像,看起来丑得要命,但却能卖到10万美元,这就是NFT。

与以太坊不同,Solana上的NFT铸造非常便宜,这使得它们更加有趣。即使在这些熊市的日子里,在以太坊上铸造一个NFT也只需5美元,这实在是有点无聊。为什么我要支付5美元来让我的模因永垂不朽呢?

🫣 NFTs 是代币

Solana上的NFT价格便宜的一个重要原因是它们并不是特别的代码,它们只是普通的代币,附带了额外的数据。

第一个主要的区别是铸造账户。对于NFTs来说,铸造账户

  • 供应量为1,意味着只有一个代币在流通。
  • 没有小数点,意味着不存在0.5个代币这样的事情。
  • 没有铸币机构,意味着没有人可以铸造额外的代币。

正如你可能猜到的那样,额外的数据存储在程序派生的账户中。让我们来见识一下这些新账户 :D

🐙 Master Edition 账户

Token Metadata程序为NFTs提供了另一个专门的账户,称为Master Edition账户。它不会废除Mint权限,而是将Mint权限和冻结权限都转移到Master Edition PDA

换句话说,造币权被转移到属于Token Metadata程序的PDA上。这确保任何人在未经过Token Metadata程序的情况下无法铸造或冻结代币。

只有程序提供的指令才能使用它,而程序中并不存在这样的指令。这样做的原因是为了让Metaplex能够部署Token Metadata程序的升级,并将现有的NFT迁移到新版本。

🪰 Editions 账户

除了作为不可替代性证据,Master Edition账户还允许用户打印一个或多个NFT的副本。这个功能使创作者能够提供多个1/1 NFT的副本。

Master Edition 账户包含一个可选的 Max Supply 属性:

  • 如果设置为 0 ,则禁用打印功能
  • 如果设置为 None ,可以打印无限数量的副本。

🧰 Metaplex SDK

通过我们的新朋友Metaplex SDK,所有这些都变得轻而易举。它让您轻松创建和更新NFTs - 您只需提供最基本的信息,它会自动填充其余的默认值。

就像令牌元数据一样,我们将使用相同的流程来:

  • 上传一张图片
  • 上传元数据
  • 然后使用元数据 URI 创建一个 NFT

你能猜到代码会是什么样子吗?在我们开始之前,试着在脑海中形象化它,然后我们一起来解决它吧 :)

- - +

🎨 NFTs on Solana

我们到了。没花太长时间。猴子图片。猿类。岩石。还有其他动物主题的头像,看起来丑得要命,但却能卖到10万美元,这就是NFT。

与以太坊不同,Solana上的NFT铸造非常便宜,这使得它们更加有趣。即使在这些熊市的日子里,在以太坊上铸造一个NFT也只需5美元,这实在是有点无聊。为什么我要支付5美元来让我的模因永垂不朽呢?

🫣 NFTs 是代币

Solana上的NFT价格便宜的一个重要原因是它们并不是特别的代码,它们只是普通的代币,附带了额外的数据。

第一个主要的区别是铸造账户。对于NFTs来说,铸造账户

  • 供应量为1,意味着只有一个代币在流通。
  • 没有小数点,意味着不存在0.5个代币这样的事情。
  • 没有铸币机构,意味着没有人可以铸造额外的代币。

正如你可能猜到的那样,额外的数据存储在程序派生的账户中。让我们来见识一下这些新账户 :D

🐙 Master Edition 账户

Token Metadata程序为NFTs提供了另一个专门的账户,称为Master Edition账户。它不会废除Mint权限,而是将Mint权限和冻结权限都转移到Master Edition PDA

换句话说,造币权被转移到属于Token Metadata程序的PDA上。这确保任何人在未经过Token Metadata程序的情况下无法铸造或冻结代币。

只有程序提供的指令才能使用它,而程序中并不存在这样的指令。这样做的原因是为了让Metaplex能够部署Token Metadata程序的升级,并将现有的NFT迁移到新版本。

🪰 Editions 账户

除了作为不可替代性证据,Master Edition账户还允许用户打印一个或多个NFT的副本。这个功能使创作者能够提供多个1/1 NFT的副本。

Master Edition 账户包含一个可选的 Max Supply 属性:

  • 如果设置为 0 ,则禁用打印功能
  • 如果设置为 None ,可以打印无限数量的副本。

🧰 Metaplex SDK

通过我们的新朋友Metaplex SDK,所有这些都变得轻而易举。它让您轻松创建和更新NFTs - 您只需提供最基本的信息,它会自动填充其余的默认值。

就像令牌元数据一样,我们将使用相同的流程来:

  • 上传一张图片
  • 上传元数据
  • 然后使用元数据 URI 创建一个 NFT

你能猜到代码会是什么样子吗?在我们开始之前,试着在脑海中形象化它,然后我们一起来解决它吧 :)

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/index.html b/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/index.html index 8c0ad5729..263a82083 100644 --- a/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/index.html +++ b/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/index.html @@ -3,17 +3,17 @@ -🧬 给你的代币赋予一个身份 | All in One Solana - - - +🧬 给你的代币赋予一个身份 | All in One Solana + + +
-

🧬 给你的代币赋予一个身份

是时候让令牌与它们的创造者(你)相遇了。我们将从之前的构建部分继续进行。如果需要,你可以从这里获取起始代码(确保你在 solution-without-burn 分支上)。

首先添加新的依赖项:

npm install @metaplex-foundation/js fs
npm install @metaplex-foundation/mpl-token-metadata

我们将使用Metaplex SDK来添加元数据和 fs 库,以便我们可以读取代币的标志图片。创建一个名为 assets 的新文件夹,并添加您的标志。这将在测试网络上进行,所以尽情享受吧!我选择了一个比萨饼表情符号,所以我把我的文件命名为pizza.png,哈哈。

Metaplex将为我们承担所有繁重的工作,所以请在顶部添加以下导入: index.ts

import {
Metaplex,
keypairIdentity,
bundlrStorage,
toMetaplexFile,
} from "@metaplex-foundation/js"
import {
DataV2,
createCreateMetadataAccountV3Instruction,
} from "@metaplex-foundation/mpl-token-metadata"
import * as fs from "fs"

现在我们已经准备好了一切,我们将开始处理元数据部分。我们将先进行链下部分,然后创建代币元数据账户。

在高层次上,这是需要发生的事情:

    1. 使用 toMetaplexFile() 将图像文件转换为metaplex文件
    1. 使用 metaplex.storage().upload 上传图片
    1. 使用 metaplex.uploadMetadata() 上传链下元数据
    1. 使用 findMetadataPda() 来推导元数据账户PDA
    1. 构建类型为 DataV2 的链上数据格式
    1. 使用 createCreateMetadataAccountV2Instruction 创建元数据账户的构建指令(不是拼写错误哈哈)
    1. 发送带有指令的交易以创建令牌元数据账户

这里发生了很多事情,但都是基础的东西。花点时间看一下,你会知道发生了什么!

我们将创建一个单一的函数来完成所有这些操作:

async function createTokenMetadata(
connection: web3.Connection,
metaplex: Metaplex,
mint: web3.PublicKey,
user: web3.Keypair,
name: string,
symbol: string,
description: string
) {
// file to buffer
const buffer = fs.readFileSync("assets/1203.png")

// buffer to metaplex file
const file = toMetaplexFile(buffer, "1203.png")

// upload image and get image uri
const imageUri = await metaplex.storage().upload(file)
console.log("image uri:", imageUri)

// upload metadata and get metadata uri (off chain metadata)
const { uri } = await metaplex
.nfts()
.uploadMetadata({
name: name,
description: description,
image: imageUri,
})

console.log("metadata uri:", uri)

// get metadata account address
const metadataPDA = metaplex.nfts().pdas().metadata({ mint })

// onchain metadata format
const tokenMetadata = {
name: name,
symbol: symbol,
uri: uri,
sellerFeeBasisPoints: 0,
creators: null,
collection: null,
uses: null,
} as DataV2

// transaction to create metadata account
const transaction = new web3.Transaction().add(
createCreateMetadataAccountV3Instruction(
{
metadata: metadataPDA,
mint: mint,
mintAuthority: user.publicKey,
payer: user.publicKey,
updateAuthority: user.publicKey,
},
{
createMetadataAccountArgsV3: {
data: tokenMetadata,
isMutable: true,
collectionDetails: null
},
}
)
)

// send transaction
const transactionSignature = await web3.sendAndConfirmTransaction(
connection,
transaction,
[user]
)

console.log(
`Create Metadata Account: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

确保您更新文件名!此外,不用担心 nfts() 的调用 - Metaplex最初是为NFT构建的,最近扩展到了可替代代币的工作。

你会注意到我们在这里留了一堆空的东西 - 那是因为在创建可替代代币时不需要设置这些东西。非可替代代币有更具体的行为需要定义。

我可以逐个解释这个函数,但我只会重复自己哈哈。比起了解它的工作原理,更重要的是知道如何使用它。你需要阅读文档来使用API,以创建类似这样的函数。

我在谈论学会钓鱼,而不仅仅是拿到这条鱼。

你的首要资源应该始终是文档。但是当代码刚刚被编写时,文档可能还不存在。所以你就是这样做 - 在代码被编写时查看它。如果你在Metaplex存储库中查看,你会看到这些内容:

这并不是什么高深的科学,你需要深入代码并找到你需要的东西。你必须理解代码所构建的基本元素(在这种情况下是Solana指令),这可能需要几次尝试,但回报将是巨大的。

通常我尝试做的是:

  • Discord中搜索/询问(MetaplexAnchor等)
  • Stack Exchange上搜索/提问
  • 浏览项目/程序存储库,如果你想弄清楚如何为一个程序设置指令,请参考测试
  • 或者,如果没有测试可以参考,可以复制/粘贴GitHub,并希望能在某个地方找到参考资料

希望这能给你一个关于先驱者是如何做到的想法 :)

回到我们按计划进行的建设!

记得之前保存的代币铸造地址吗?在调用这个新函数时,我们将使用它。如果你忘记了代币铸造账户地址,你可以随时通过浏览器查找钱包地址并检查代币选项卡。

这是我们更新后的 main() 函数在调用 createTokenMetadata 函数时的样子

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

console.log("PublicKey:", user.publicKey.toBase58())

// MAKE SURE YOU REPLACE THIS ADDRESS WITH YOURS!
const MINT_ADDRESS = "87MGWR6EbAqegYXr3LoZmKKC9fSFXQx4EwJEAczcMpMF"

// metaplex setup
const metaplex = Metaplex.make(connection)
.use(keypairIdentity(user))
.use(
bundlrStorage({
address: "https://devnet.bundlr.network",
providerUrl: "https://api.devnet.solana.com",
timeout: 60000,
})
)

// Calling the token
await createTokenMetadata(
connection,
metaplex,
new web3.PublicKey(MINT_ADDRESS),
user,
"Pizza", // Token name - REPLACE THIS WITH YOURS
"PZA", // Token symbol - REPLACE THIS WITH YOURS
"Whoever holds this token is invited to my pizza party" // Token description - REPLACE THIS WITH YOURS
)
}

更新薄荷地址和代币详情并粉碎 npm run start ,你会看到类似这样的东西:

> solana-course-client@1.0.0 start
> ts-node src/index.ts

Current balance is 1.996472479
PublicKey: 5y3G3Rz5vgK9rKRxu3BaC3PvhsMKGyAmtcizgrxojYAA
image uri: https://arweave.net/7sDCnvGRJAqfgEuGOYWhIshfgTC-hNfG4NSjwsKunQs
metadata uri: https://arweave.net/-2vGrM69PNtb2YaHnOErh1_006D28JJa825CIcEGIok
Create Metadata Account: https://explorer.solana.com/tx/4w8XEGCJY82MnBnErW9F5r1i5UL5ffJCCujcgFeXS8TTdZ6tHBEMznWnPoQXVcsPY3WoPbL2Nb1ubXCUJWWt2GWi?cluster=devnet
Finished successfully

一切必要的事情都已经一次性完成!随意点击Arweave链接 - 它就像是去中心化和永久的AWS S3/Google Cloud存储,会展示给你上传的资产是什么样子。

如果你回到浏览器上的代币铸造账户,你会看到一个漂亮的新图标和名称。这是我的:

正如一位智者曾经说过,

你的代币已经准备就绪!记得要传播爱心哦。也许可以给你的朋友或者Discord服务器中的其他建设者发送一些代币。在 #progress 频道分享你的地址,这样别人就可以给你空投他们的代币啦 :D

🚢 船舶挑战

年轻的玻璃咀嚼者,是时候从头开始重新实施课程概念了。

尝试构建一个包含以下指令的单个交易:

这基本上就是你在生产中要做的事情 - 一切都一次性地一起完成。

Note -这比平常更加自由。挑战自己。尝试一下。真正努力去理解每个拼图的部分。

要按照我们设想的方式进行操作,您需要逐步构建每个指令,然后将它们全部添加到一个事务中。在您自己尝试解决这个问题后,您可以在该存储库的挑战分支中查看一个可能的实现。

额外提示:https://solana-labs.github.io/solana-program-library/token/js/modules.html - 查看源代码,不要使用辅助函数。

Reference

- - +

🧬 给你的代币赋予一个身份

是时候让令牌与它们的创造者(你)相遇了。我们将从之前的构建部分继续进行。如果需要,你可以从这里获取起始代码(确保你在 solution-without-burn 分支上)。

首先添加新的依赖项:

npm install @metaplex-foundation/js fs
npm install @metaplex-foundation/mpl-token-metadata

我们将使用Metaplex SDK来添加元数据和 fs 库,以便我们可以读取代币的标志图片。创建一个名为 assets 的新文件夹,并添加您的标志。这将在测试网络上进行,所以尽情享受吧!我选择了一个比萨饼表情符号,所以我把我的文件命名为pizza.png,哈哈。

Metaplex将为我们承担所有繁重的工作,所以请在顶部添加以下导入: index.ts

import {
Metaplex,
keypairIdentity,
bundlrStorage,
toMetaplexFile,
} from "@metaplex-foundation/js"
import {
DataV2,
createCreateMetadataAccountV3Instruction,
} from "@metaplex-foundation/mpl-token-metadata"
import * as fs from "fs"

现在我们已经准备好了一切,我们将开始处理元数据部分。我们将先进行链下部分,然后创建代币元数据账户。

在高层次上,这是需要发生的事情:

    1. 使用 toMetaplexFile() 将图像文件转换为metaplex文件
    1. 使用 metaplex.storage().upload 上传图片
    1. 使用 metaplex.uploadMetadata() 上传链下元数据
    1. 使用 findMetadataPda() 来推导元数据账户PDA
    1. 构建类型为 DataV2 的链上数据格式
    1. 使用 createCreateMetadataAccountV2Instruction 创建元数据账户的构建指令(不是拼写错误哈哈)
    1. 发送带有指令的交易以创建令牌元数据账户

这里发生了很多事情,但都是基础的东西。花点时间看一下,你会知道发生了什么!

我们将创建一个单一的函数来完成所有这些操作:

async function createTokenMetadata(
connection: web3.Connection,
metaplex: Metaplex,
mint: web3.PublicKey,
user: web3.Keypair,
name: string,
symbol: string,
description: string
) {
// file to buffer
const buffer = fs.readFileSync("assets/1203.png")

// buffer to metaplex file
const file = toMetaplexFile(buffer, "1203.png")

// upload image and get image uri
const imageUri = await metaplex.storage().upload(file)
console.log("image uri:", imageUri)

// upload metadata and get metadata uri (off chain metadata)
const { uri } = await metaplex
.nfts()
.uploadMetadata({
name: name,
description: description,
image: imageUri,
})

console.log("metadata uri:", uri)

// get metadata account address
const metadataPDA = metaplex.nfts().pdas().metadata({ mint })

// onchain metadata format
const tokenMetadata = {
name: name,
symbol: symbol,
uri: uri,
sellerFeeBasisPoints: 0,
creators: null,
collection: null,
uses: null,
} as DataV2

// transaction to create metadata account
const transaction = new web3.Transaction().add(
createCreateMetadataAccountV3Instruction(
{
metadata: metadataPDA,
mint: mint,
mintAuthority: user.publicKey,
payer: user.publicKey,
updateAuthority: user.publicKey,
},
{
createMetadataAccountArgsV3: {
data: tokenMetadata,
isMutable: true,
collectionDetails: null
},
}
)
)

// send transaction
const transactionSignature = await web3.sendAndConfirmTransaction(
connection,
transaction,
[user]
)

console.log(
`Create Metadata Account: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

确保您更新文件名!此外,不用担心 nfts() 的调用 - Metaplex最初是为NFT构建的,最近扩展到了可替代代币的工作。

你会注意到我们在这里留了一堆空的东西 - 那是因为在创建可替代代币时不需要设置这些东西。非可替代代币有更具体的行为需要定义。

我可以逐个解释这个函数,但我只会重复自己哈哈。比起了解它的工作原理,更重要的是知道如何使用它。你需要阅读文档来使用API,以创建类似这样的函数。

我在谈论学会钓鱼,而不仅仅是拿到这条鱼。

你的首要资源应该始终是文档。但是当代码刚刚被编写时,文档可能还不存在。所以你就是这样做 - 在代码被编写时查看它。如果你在Metaplex存储库中查看,你会看到这些内容:

这并不是什么高深的科学,你需要深入代码并找到你需要的东西。你必须理解代码所构建的基本元素(在这种情况下是Solana指令),这可能需要几次尝试,但回报将是巨大的。

通常我尝试做的是:

  • Discord中搜索/询问(MetaplexAnchor等)
  • Stack Exchange上搜索/提问
  • 浏览项目/程序存储库,如果你想弄清楚如何为一个程序设置指令,请参考测试
  • 或者,如果没有测试可以参考,可以复制/粘贴GitHub,并希望能在某个地方找到参考资料

希望这能给你一个关于先驱者是如何做到的想法 :)

回到我们按计划进行的建设!

记得之前保存的代币铸造地址吗?在调用这个新函数时,我们将使用它。如果你忘记了代币铸造账户地址,你可以随时通过浏览器查找钱包地址并检查代币选项卡。

这是我们更新后的 main() 函数在调用 createTokenMetadata 函数时的样子

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

console.log("PublicKey:", user.publicKey.toBase58())

// MAKE SURE YOU REPLACE THIS ADDRESS WITH YOURS!
const MINT_ADDRESS = "87MGWR6EbAqegYXr3LoZmKKC9fSFXQx4EwJEAczcMpMF"

// metaplex setup
const metaplex = Metaplex.make(connection)
.use(keypairIdentity(user))
.use(
bundlrStorage({
address: "https://devnet.bundlr.network",
providerUrl: "https://api.devnet.solana.com",
timeout: 60000,
})
)

// Calling the token
await createTokenMetadata(
connection,
metaplex,
new web3.PublicKey(MINT_ADDRESS),
user,
"Pizza", // Token name - REPLACE THIS WITH YOURS
"PZA", // Token symbol - REPLACE THIS WITH YOURS
"Whoever holds this token is invited to my pizza party" // Token description - REPLACE THIS WITH YOURS
)
}

更新薄荷地址和代币详情并粉碎 npm run start ,你会看到类似这样的东西:

> solana-course-client@1.0.0 start
> ts-node src/index.ts

Current balance is 1.996472479
PublicKey: 5y3G3Rz5vgK9rKRxu3BaC3PvhsMKGyAmtcizgrxojYAA
image uri: https://arweave.net/7sDCnvGRJAqfgEuGOYWhIshfgTC-hNfG4NSjwsKunQs
metadata uri: https://arweave.net/-2vGrM69PNtb2YaHnOErh1_006D28JJa825CIcEGIok
Create Metadata Account: https://explorer.solana.com/tx/4w8XEGCJY82MnBnErW9F5r1i5UL5ffJCCujcgFeXS8TTdZ6tHBEMznWnPoQXVcsPY3WoPbL2Nb1ubXCUJWWt2GWi?cluster=devnet
Finished successfully

一切必要的事情都已经一次性完成!随意点击Arweave链接 - 它就像是去中心化和永久的AWS S3/Google Cloud存储,会展示给你上传的资产是什么样子。

如果你回到浏览器上的代币铸造账户,你会看到一个漂亮的新图标和名称。这是我的:

正如一位智者曾经说过,

你的代币已经准备就绪!记得要传播爱心哦。也许可以给你的朋友或者Discord服务器中的其他建设者发送一些代币。在 #progress 频道分享你的地址,这样别人就可以给你空投他们的代币啦 :D

🚢 船舶挑战

年轻的玻璃咀嚼者,是时候从头开始重新实施课程概念了。

尝试构建一个包含以下指令的单个交易:

这基本上就是你在生产中要做的事情 - 一切都一次性地一起完成。

Note +这比平常更加自由。挑战自己。尝试一下。真正努力去理解每个拼图的部分。

要按照我们设想的方式进行操作,您需要逐步构建每个指令,然后将它们全部添加到一个事务中。在您自己尝试解决这个问题后,您可以在该存储库的挑战分支中查看一个可能的实现。

额外提示:https://solana-labs.github.io/solana-program-library/token/js/modules.html - 查看源代码,不要使用辅助函数。

Reference

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/spl-token/index.html b/docs/Solana-Co-Learn/module2/spl-token/index.html index 9cee3152f..510d97efe 100644 --- a/docs/Solana-Co-Learn/module2/spl-token/index.html +++ b/docs/Solana-Co-Learn/module2/spl-token/index.html @@ -3,15 +3,15 @@ -SPL代币 | All in One Solana - - - +SPL代币 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/index.html b/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/index.html index 4d5538a15..cbbd33051 100644 --- a/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/index.html +++ b/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/index.html @@ -3,15 +3,15 @@ -🏧 在Solana上铸造代币 | All in One Solana - - - +🏧 在Solana上铸造代币 | All in One Solana + + +
-

🏧 在Solana上铸造代币

是时候让代币与它们的创造者(你)相遇了。我们将从上一节的构建部分继续进行。如果需要,你可以从这里获取起始代码(确保你在 solution-without-burn 分支上)。说了这么多,让我们来创造一些神奇的互联网货币吧。在我们的最终项目中,我们将创建一个代币,你将随着抵押你的社区NFT而逐渐获得它。在那之前,让我们先玩一下实际构建这个铸币过程的过程。现在是发挥你的想象力,尽情享受的好时机。也许你一直想创建自己的模因币 - 现在是你的机会了 🚀

我们将从一个新的Solana客户端开始,转到您的Solana工作区并运行以下命令:

npx create-solana-client [name] --initialize-keypair
cd [name]
npm i

以你的代币来命名你的客户。我要创建Pizzacoin,因为我昨天吃了一些非常好吃的披萨。现在是你发挥创意的时候了。也许你想将时间本身进行代币化?你可以创建HokageCoin,甚至是TwitterThreadCoin。无限的可能性!

--initialize-keypair 标志位完成了我们上次使用 initalizeKeypair 进行的所有魔法。运行 npm run start ,您将获得一对新的密钥,并获得一些SOL空投。让我们打开货币打印机,让它嗡嗡作响。

图片:美国联邦储备银行行长杰罗姆·鲍威尔让打印机嗡嗡作响。

🎁 构建一个代币铸造器

记住这些步骤:

    1. 创建一个Token Mints账户
    1. 为特定的钱包创建一个关联的token账户
    1. 将Mint代币发送到该钱包中

    这是 src/index.ts 中的第一步,在导入之后、在 main() 之前放置这个

    // Add the spl-token import at the top
    import * as token from "@solana/spl-token"

    async function createNewMint(
    connection: web3.Connection,
    payer: web3.Keypair,
    mintAuthority: web3.PublicKey,
    freezeAuthority: web3.PublicKey,
    decimals: number
    ): Promise<web3.PublicKey> {

    const tokenMint = await token.createMint(
    connection,
    payer,
    mintAuthority,
    freezeAuthority,
    decimals
    );

    console.log(`The token mint account address is ${tokenMint}`)
    console.log(
    `Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`
    );

    return tokenMint;
    }

这应该看起来很熟悉。如果不是的话,请回到上一节再读一遍 😠

再次 - 这个 @solana/spl-token 程序使得这一切变得简单。 tokenMintTokenMint账户的地址。

接下来,我们需要创建关联的令牌账户,在 createNewMint 函数之后添加以下内容:

async function createTokenAccount(
connection: web3.Connection,
payer: web3.Keypair,
mint: web3.PublicKey,
owner: web3.PublicKey
) {
const tokenAccount = await token.getOrCreateAssociatedTokenAccount(
connection,
payer,
mint,
owner
)

console.log(
`Token Account: https://explorer.solana.com/address/${tokenAccount.address}?cluster=devnet`
)

return tokenAccount
}

这里没有什么新鲜事。需要注意的一点是, payerowner 可能是不同的 - 你可以付费创建某人的账户。这可能会很昂贵,因为你将为他们的账户支付“租金”,所以确保在进行这项操作之前先做好计算。

最后,mint function:

async function mintTokens(
connection: web3.Connection,
payer: web3.Keypair,
mint: web3.PublicKey,
destination: web3.PublicKey,
authority: web3.Keypair,
amount: number
) {
const mintInfo = await token.getMint(connection, mint)

const transactionSignature = await token.mintTo(
connection,
payer,
mint,
destination,
authority,
amount * 10 ** mintInfo.decimals
)

console.log(
`Mint Token Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

让我们在主函数中调用这些函数,这是我得到的:

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

console.log("PublicKey:", user.publicKey.toBase58())

const mint = await createNewMint(
connection,
user, // We'll pay the fees
user.publicKey, // We're the mint authority
user.publicKey, // And the freeze authority >:)
2 // Only two decimals!
)

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey // Associating our address with the token account
)

// Mint 100 tokens to our address
await mintTokens(connection, user, mint, tokenAccount.address, user, 100)
}

运行 npm run start - 你应该在终端中看到三个浏览器链接被记录下来。(注意:确保你已经 @solana/spl-token ,否则会显示错误。要安装,请在终端中输入 npm uninstall @solana/spl-tokennpm install @solana/spl-token 。保存代币Mint账户地址,稍后会用到。打开最后一个链接并向下滚动到代币余额部分:

你刚刚铸造了一些代币!这些代币可以代表你想要的任何东西。每个代币价值100美元?100分钟的时间?100张猫咪表情包?100片12英寸黄油鸡薄底夹心披萨?这是你的现实。你是唯一控制铸币账户的人,所以代币供应的价值取决于你的决定,可以是毫无价值或者珍贵无比。

在你开始在Solana区块链上重新定义现代金融之前,让我们来看看如何转移和销毁代币:

async function transferTokens(
connection: web3.Connection,
payer: web3.Keypair,
source: web3.PublicKey,
destination: web3.PublicKey,
owner: web3.PublicKey,
amount: number,
mint: web3.PublicKey
) {
const mintInfo = await token.getMint(connection, mint)

const transactionSignature = await token.transfer(
connection,
payer,
source,
destination,
owner,
amount * 10 ** mintInfo.decimals
)

console.log(
`Transfer Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

async function burnTokens(
connection: web3.Connection,
payer: web3.Keypair,
account: web3.PublicKey,
mint: web3.PublicKey,
owner: web3.Keypair,
amount: number
) {

const mintInfo = await token.getMint(connection, mint)

const transactionSignature = await token.burn(
connection,
payer,
account,
mint,
owner,
amount * 10 ** mintInfo.decimals
)

console.log(
`Burn Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

这些函数看起来很长,因为我给每个参数都单独占了一行,实际上它们只有3行而已,哈哈。

使用它们同样简单:

async function main() {
...

const receiver = web3.Keypair.generate().publicKey

const receiverTokenAccount = await createTokenAccount(
connection,
user,
mint,
receiver
)

await transferTokens(
connection,
user,
tokenAccount.address,
receiverTokenAccount.address,
user.publicKey,
50,
mint
)

await burnTokens(connection, user, tokenAccount.address, mint, user, 25)
}

玩弄转账功能,向您的钱包地址发送一些代币,看看它是什么样子。这是我看到的:

嗯...为什么显示未知?让我们来修复一下!

- - +

🏧 在Solana上铸造代币

是时候让代币与它们的创造者(你)相遇了。我们将从上一节的构建部分继续进行。如果需要,你可以从这里获取起始代码(确保你在 solution-without-burn 分支上)。说了这么多,让我们来创造一些神奇的互联网货币吧。在我们的最终项目中,我们将创建一个代币,你将随着抵押你的社区NFT而逐渐获得它。在那之前,让我们先玩一下实际构建这个铸币过程的过程。现在是发挥你的想象力,尽情享受的好时机。也许你一直想创建自己的模因币 - 现在是你的机会了 🚀

我们将从一个新的Solana客户端开始,转到您的Solana工作区并运行以下命令:

npx create-solana-client [name] --initialize-keypair
cd [name]
npm i

以你的代币来命名你的客户。我要创建Pizzacoin,因为我昨天吃了一些非常好吃的披萨。现在是你发挥创意的时候了。也许你想将时间本身进行代币化?你可以创建HokageCoin,甚至是TwitterThreadCoin。无限的可能性!

--initialize-keypair 标志位完成了我们上次使用 initalizeKeypair 进行的所有魔法。运行 npm run start ,您将获得一对新的密钥,并获得一些SOL空投。让我们打开货币打印机,让它嗡嗡作响。

图片:美国联邦储备银行行长杰罗姆·鲍威尔让打印机嗡嗡作响。

🎁 构建一个代币铸造器

记住这些步骤:

    1. 创建一个Token Mints账户
    1. 为特定的钱包创建一个关联的token账户
    1. 将Mint代币发送到该钱包中

    这是 src/index.ts 中的第一步,在导入之后、在 main() 之前放置这个

    // Add the spl-token import at the top
    import * as token from "@solana/spl-token"

    async function createNewMint(
    connection: web3.Connection,
    payer: web3.Keypair,
    mintAuthority: web3.PublicKey,
    freezeAuthority: web3.PublicKey,
    decimals: number
    ): Promise<web3.PublicKey> {

    const tokenMint = await token.createMint(
    connection,
    payer,
    mintAuthority,
    freezeAuthority,
    decimals
    );

    console.log(`The token mint account address is ${tokenMint}`)
    console.log(
    `Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`
    );

    return tokenMint;
    }

这应该看起来很熟悉。如果不是的话,请回到上一节再读一遍 😠

再次 - 这个 @solana/spl-token 程序使得这一切变得简单。 tokenMintTokenMint账户的地址。

接下来,我们需要创建关联的令牌账户,在 createNewMint 函数之后添加以下内容:

async function createTokenAccount(
connection: web3.Connection,
payer: web3.Keypair,
mint: web3.PublicKey,
owner: web3.PublicKey
) {
const tokenAccount = await token.getOrCreateAssociatedTokenAccount(
connection,
payer,
mint,
owner
)

console.log(
`Token Account: https://explorer.solana.com/address/${tokenAccount.address}?cluster=devnet`
)

return tokenAccount
}

这里没有什么新鲜事。需要注意的一点是, payerowner 可能是不同的 - 你可以付费创建某人的账户。这可能会很昂贵,因为你将为他们的账户支付“租金”,所以确保在进行这项操作之前先做好计算。

最后,mint function:

async function mintTokens(
connection: web3.Connection,
payer: web3.Keypair,
mint: web3.PublicKey,
destination: web3.PublicKey,
authority: web3.Keypair,
amount: number
) {
const mintInfo = await token.getMint(connection, mint)

const transactionSignature = await token.mintTo(
connection,
payer,
mint,
destination,
authority,
amount * 10 ** mintInfo.decimals
)

console.log(
`Mint Token Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

让我们在主函数中调用这些函数,这是我得到的:

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

console.log("PublicKey:", user.publicKey.toBase58())

const mint = await createNewMint(
connection,
user, // We'll pay the fees
user.publicKey, // We're the mint authority
user.publicKey, // And the freeze authority >:)
2 // Only two decimals!
)

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey // Associating our address with the token account
)

// Mint 100 tokens to our address
await mintTokens(connection, user, mint, tokenAccount.address, user, 100)
}

运行 npm run start - 你应该在终端中看到三个浏览器链接被记录下来。(注意:确保你已经 @solana/spl-token ,否则会显示错误。要安装,请在终端中输入 npm uninstall @solana/spl-tokennpm install @solana/spl-token 。保存代币Mint账户地址,稍后会用到。打开最后一个链接并向下滚动到代币余额部分:

你刚刚铸造了一些代币!这些代币可以代表你想要的任何东西。每个代币价值100美元?100分钟的时间?100张猫咪表情包?100片12英寸黄油鸡薄底夹心披萨?这是你的现实。你是唯一控制铸币账户的人,所以代币供应的价值取决于你的决定,可以是毫无价值或者珍贵无比。

在你开始在Solana区块链上重新定义现代金融之前,让我们来看看如何转移和销毁代币:

async function transferTokens(
connection: web3.Connection,
payer: web3.Keypair,
source: web3.PublicKey,
destination: web3.PublicKey,
owner: web3.PublicKey,
amount: number,
mint: web3.PublicKey
) {
const mintInfo = await token.getMint(connection, mint)

const transactionSignature = await token.transfer(
connection,
payer,
source,
destination,
owner,
amount * 10 ** mintInfo.decimals
)

console.log(
`Transfer Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

async function burnTokens(
connection: web3.Connection,
payer: web3.Keypair,
account: web3.PublicKey,
mint: web3.PublicKey,
owner: web3.Keypair,
amount: number
) {

const mintInfo = await token.getMint(connection, mint)

const transactionSignature = await token.burn(
connection,
payer,
account,
mint,
owner,
amount * 10 ** mintInfo.decimals
)

console.log(
`Burn Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

这些函数看起来很长,因为我给每个参数都单独占了一行,实际上它们只有3行而已,哈哈。

使用它们同样简单:

async function main() {
...

const receiver = web3.Keypair.generate().publicKey

const receiverTokenAccount = await createTokenAccount(
connection,
user,
mint,
receiver
)

await transferTokens(
connection,
user,
tokenAccount.address,
receiverTokenAccount.address,
user.publicKey,
50,
mint
)

await burnTokens(connection, user, tokenAccount.address, mint, user, 25)
}

玩弄转账功能,向您的钱包地址发送一些代币,看看它是什么样子。这是我看到的:

嗯...为什么显示未知?让我们来修复一下!

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/spl-token/the-token-program/index.html b/docs/Solana-Co-Learn/module2/spl-token/the-token-program/index.html index 546b5b07a..cb3fd17d1 100644 --- a/docs/Solana-Co-Learn/module2/spl-token/the-token-program/index.html +++ b/docs/Solana-Co-Learn/module2/spl-token/the-token-program/index.html @@ -3,16 +3,16 @@ -💵 The Token Program | All in One Solana - - - +💵 The Token Program | All in One Solana + + +
-

💵 The Token Program

是时候让代币与它们的创造者(你)相遇了。我们将在之前的构建部分中继续进行。如果需要,你可以从这里获取起始代码(确保你在 solution-without-burn 分支上)。作为区块链最初的承诺,也可能是你安装钱包的主要原因,这些谦逊的代币是对区块链上资产的最纯粹的表达,从合成股票到数百种狗币。

这节课主要讲解Solana上的代币工作原理。如果你对其他区块链有所了解,可能会发现这里有一些不同之处,所以尽量不要将当前对代币的理解与之联系起来。

谈论Solana中令牌的工作原理也是一个了解不同程序如何使用账户的绝佳机会。你越深入了解Solana,就越能意识到账户的重要性。它们像文件系统中的文件一样抽象和灵活,但这也意味着任何给定程序上的账户可能变得复杂!刚开始可能会感到困惑,但给它一些时间,它会变得更加清晰。

Solana上的代币是通过Solana Token Program进行创建和管理的,它是Solana Program Library(SPL)中的几个程序之一。常规代币和非同质化代币(NFTs)都是Solana程序库中的代币。今天我们不会涉及NFTs,但不用担心,我们很快会介绍。

🗃 账户关系

我们首先要了解一下情况。The token program需要三个必要的账户:

  • Wallet Account - 这是你的钱包!
  • Mint Account - 存储有关代币Mint的元数据
  • Token Account - 这与钱包绑定,并存储有关该特定钱包的信息,例如它拥有多少令牌。

让我们深入了解每个账户,并看看它们内部的情况。

🌌 Mint Account

Mint账户存储有关代币本身的元数据,而不是您对代币的所有权,而是更广泛地涉及代币。它具有以下属性:

  • mint authority - 只有一个账户可以从Mint账户签名并Mint代币。当您创建Mint账户时,必须指定Mint权限,可以是您的个人钱包或其他程序。
  • supply - 有多少总代币存在。供应基本上是在说,“码农大神,你好!这是发行的总代币数量。”
  • decimals - 小数位数是我们允许令牌被分割成的小数位数 - 我们令牌的精度。这可能会变得棘手,因为实际上链上没有小数。什么?总供应量表示为整数,所以你必须进行数学计算来在小数之间进行转换。例如,如果你将小数位数设置为两位,而你的供应量是一百,那么实际上你只有一个令牌。供应中只有一个令牌,但你允许它被分割成该令牌的较小面额。
  • Is Initialized - 基本上是指该账户是否准备就绪。这与账户本身有关,而不是token program
  • Freeze authority - 冻结权限类似于Mint权限,意味着一个人或程序拥有冻结(或Mint)的权限。

将Mint权限设置给你的钱包是相当标准的做法,你可以Mint任何你想要的东西,然后取消Mint权限,基本上意味着未来不会再发行更多的供应量。或者,如果你有某种动态发行代币的方式,常见的做法是将其放入权限中,作为一个程序来管理代币的Mint。

冻结权限的工作方式相同。

👛 Token Accounts

你可能已经看到了大量在生态系统中流通的不同代币。你的钱包现在可能装满了各种不同的代币。那么,网络是如何知道你持有某些代币的呢?一个账户存储着这些数据!最好的方式是通过一个关联的代币账户来实现。看看吧

这是数据关系和账户属性的样子。

Token账户必须与用户或钱包关联。一个简单的方法是创建一个PDA,其地址链接了Mint账户和钱包。令牌账户PDA的种子是铸币账户的地址和钱包地址(令牌程序ID默认存在)。

有很多不同的信息包含在内,但现在只需要知道你的钱包实际上并不持有具体的代币。它与你拥有的另一个账户相关联,该账户存储了代币的数量。另外,还有一个铸币账户,存储了关于所有代币和铸币的更广泛信息。

花点时间盯着这个图表,然后搜索一下那些不明白的部分(比如关联的令牌程序到底是什么鬼?)。在处理完所有的繁琐事情之后,这就很简单了!

🤑 代币Mint过程

别再看图表了,让我们来看一些代码,看看这一切是如何发生的。

要创建一个新的SPL-Token,首先必须创建一个Token Mint(保存有关该特定代币的数据的账户)。

把它想象成烤比萨饼。你需要一个食谱(关于代币的数据),食材(铸币账户和钱包地址),以及有人把它们组合在一起(派生一个新的PDA)。就像制作比萨饼一样,如果你拥有所有正确的食材并按照食谱操作,最终你将得到一枚美味的新代币!

由于令牌计划是SPL的一部分,您可以使用 @solana/spl-token TypeScript SDK相当容易地创建交易。

这是一个createMint的样子:

const tokenMint = await createMint(
connection,
payer,
mintAuthority,
freezeAuthority,
decimals,
)

你需要这些参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 付款方交易的公钥
  • mintAuthority - 被授权Mint新代币的账户
  • freezeAuthority - 一个被授权冻结代币的账户。如果您不想冻结代币,请将其设置为null!
  • decimals - 指定令牌的所需小数精度

一旦完成这个步骤,你就可以继续下一步了:

  • 创建关联的Token账户
  • 将代币Mint到一个账户中
  • 如果你想要使用转账功能进行空投到多个账户,

你需要的一切都在 @solana/spl-token SDK中。如果你对某个具体部分感兴趣,可以在这里查看文档

大多数情况下,您不需要自己创建原始交易,SDK就足够了。

关于这个很酷的附注——如果出于某种原因,你想要在创建Mint指令的同时创建另一个指令,你会希望自己创建这些指令,并将它们打包成一个事务,以确保所有操作都是原子性的。也许你正在构建一个超级机密的代币程序,你希望在铸币后立即锁定所有代币,而没有人能够转移它们。

不用说,这些代币周围发生了很多疯狂的事情。您可以在这里查看每个功能在幕后发生的情况,甚至可以查看一些关于销毁代币之类的说明。:)

Reference



使用Token程序创建令牌

简而言之

  • SPL代币代表Solana网络上的所有非本地代币。Solana上的可替代和不可替代代币(NFT)都是SPL代币。
  • Token Program包含了创建和与SPL-Tokens进行交互的指令
  • Token Mints 是指保存特定 Token 数据的账户,但不持有 Tokens
  • Token Account用于持有特定Token Mint的Token
  • 创建代币Mint和Token账户需要分配 SOL 作为租金。代币账户的租金在关闭账户时可以退还,然而,目前无法关闭代币铸币。

概述

Token计划是Solana程序库(SPL)提供的众多计划之一。它包含了创建和与SPL-Tokens进行交互的指令。这些代币代表了Solana网络上的所有非本地(即非SOL)代币。

本课程将重点介绍使用Token程序创建和管理新的SPL-Token的基础知识

  1. 创建一个新的Token Mint
  2. 创建Token accounts
  3. Mint
  4. 将代币从一个持有人转移到另一个持有人
  5. 燃烧代币

我们将从开发过程的客户端角度来处理,使用@solana/spl-token JavaScript库。

代币铸造

要创建一个新的SPL-Token,首先必须创建一个Token Mint。Token Mint是保存特定代币数据的账户。

以USD Coin (USDC)在Solana Explorer上为例。USDC的代币铸造地址是EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v。通过浏览器,我们可以查看有关USDC代币铸造的特定细节,例如代币的当前供应量、铸造和冻结权限的地址,以及代币的小数精度。

要创建一个新的代币铸造,您需要向代币程序发送正确的交易指令。为此,我们将使用@solana/spl-token中的createMint函数。

const tokenMint = await createMint(
connection,
payer,
mintAuthority,
freezeAuthority,
decimal
);

createMint函数返回新Token Mint的公钥。此函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • mintAuthority - 授权进行从Token Mint中实际铸造代币的账户。
  • freezeAuthority - 一个被授权冻结代币账户的账户。如果不需要冻结功能,该参数可以设置为null。
  • decimals - 指定令牌的所需小数精度

当使用具有访问您的秘钥权限的脚本创建新的铸币时,您可以简单地使用createMint函数。然而,如果您要构建一个允许用户创建新的代币铸币的网站,您需要在不让用户暴露秘钥给浏览器的情况下完成。在这种情况下,您需要构建并提交一笔包含正确指令的交易。

在内部,createMint函数只是创建了一个包含两个指令的交易:

  1. 创建一个新账户
  2. 初始化一个新的Mint

这将如下所示:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildCreateMintTransaction(
connection: web3.Connection,
payer: web3.PublicKey,
decimals: number
): Promise<web3.Transaction> {
const lamports = await token.getMinimumBalanceForRentExemptMint(connection);
const accountKeypair = web3.Keypair.generate();
const programId = token.TOKEN_PROGRAM_ID

const transaction = new web3.Transaction().add(
web3.SystemProgram.createAccount({
fromPubkey: payer,
newAccountPubkey: accountKeypair.publicKey,
space: token.MINT_SIZE,
lamports,
programId,
}),
token.createInitializeMintInstruction(
accountKeypair.publicKey,
decimals,
payer,
payer,
programId
)
);

return transaction
}

在手动构建创建新代币铸造指令时,请确保将创建账户和初始化铸造指令添加到同一笔交易中。如果您将每个步骤分开进行交易,理论上有可能让其他人接管您创建的账户并将其用于自己的铸造。

租金和租金豁免

请注意,前面代码片段的函数体中的第一行包含对getMinimumBalanceForRentExemptMint的调用,其结果传递给createAccount函数。这是账户初始化中的租金豁免的一部分。

直到最近,Solana上的所有账户都需要执行以下操作之一,以避免被解除分配:

  1. 按特定间隔支付租金
  2. 初始化时存入足够的SOL以被视为免租金

最近,第一个选项被取消了,现在在初始化新账户时,需要存入足够的SOL以免除租金。

在这种情况下,我们正在为一个代币铸造创建一个新的账户,所以我们使用了 @solana/spl-token 库中的 getMinimumBalanceForRentExemptMint 方法。然而,这个概念适用于所有账户,你可以在 Connection 上使用更通用的 getMinimumBalanceForRentExemption 方法来创建其他可能需要的账户。

令牌账户

在您可以铸造代币(发行新供应)之前,您需要一个代币账户来持有新发行的代币。

一个代币账户持有特定“铸币”所发行的代币,并指定了账户的“所有者”。只有所有者有权减少代币账户的余额(转账、销毁等),而任何人都可以向代币账户发送代币以增加其余额。

您可以使用spl-token库的createAccount函数来创建新的令牌账户:

const tokenAccount = await createAccount(
connection,
payer,
mint,
owner,
keypair
);

createAccount函数返回新令牌账户的公钥。此函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • mint - 与新代币账户关联的代币铸币
  • owner - 新代币账户的所有者账户
  • keypair - 这是一个可选参数,用于指定新的令牌账户地址。如果没有提供keypair,则createAccount函数将默认从关联的铸币和所有者账户派生。

请注意,这个createAccount函数与我们在查看createMint函数内部时所展示的createAccount函数不同。之前我们在SystemProgram上使用createAccount函数来返回创建所有账户的指令。而这里的createAccount函数是spl-token库中的一个辅助函数,它会提交一个包含两个指令的交易。第一个指令用于创建账户,第二个指令用于将账户初始化为代币账户。

就像创建一个Token Mint一样,如果我们需要手动构建createAccount的交易,我们可以复制函数在内部所做的操作:

  1. 使用getMint来检索与Mint相关的数据
  2. 使用getAccountLenForMint函数来计算代币账户所需的空间
  3. 使用getMinimumBalanceForRentExemption函数来计算租金豁免所需的Lamports数量
  4. 使用SystemProgram.createAccountcreateInitializeAccountInstruction创建一个新的交易。请注意,这里的createAccount是来自@solana/web3.js,用于创建一个通用的新账户。createInitializeAccountInstruction使用这个新账户来初始化新的代币账户。
import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildCreateTokenAccountTransaction(
connection: web3.Connection,
payer: web3.PublicKey,
mint: web3.PublicKey
): Promise<web3.Transaction> {
const mintState = await token.getMint(connection, mint)
const accountKeypair = await web3.Keypair.generate()
const space = token.getAccountLenForMint(mintState);
const lamports = await connection.getMinimumBalanceForRentExemption(space);
const programId = token.TOKEN_PROGRAM_ID

const transaction = new web3.Transaction().add(
web3.SystemProgram.createAccount({
fromPubkey: payer,
newAccountPubkey: accountKeypair.publicKey,
space,
lamports,
programId,
}),
token.createInitializeAccountInstruction(
accountKeypair.publicKey,
mint,
payer,
programId
)
);

return transaction
}

关联代币账户

关联代币账户是一种使用所有者的公钥和代币铸币地址派生出的代币账户。关联代币账户提供了一种确定性的方式,用于找到特定公钥所拥有的特定代币铸币的代币账户。大多数情况下,创建代币账户时,您希望它成为关联代币账户。

与上述类似,您可以使用spl-token库的createAssociatedTokenAccount函数创建一个关联的代币账户。

const associatedTokenAccount = await createAssociatedTokenAccount(
connection,
payer,
mint,
owner,
);

该函数返回新关联令牌账户的公钥,并需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • mint - 与新代币账户关联的代币铸币
  • owner - 新代币账户的所有者账户

您还可以使用getOrCreateAssociatedTokenAccount来获取与给定地址关联的Token账户,如果该账户不存在,则创建它。例如,如果您正在编写代码向给定用户空投代币,您很可能会使用此函数来确保与给定用户关联的Token账户在不存在时被创建。

在底层,createAssociatedTokenAccount正在执行两个操作:

  1. 使用 getAssociatedTokenAddress从铸币和所有者中推导出关联的代币账户地址
  2. 使用createAssociatedTokenAccountInstruction指令构建交易
import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildCreateAssociatedTokenAccountTransaction(
payer: web3.PublicKey,
mint: web3.PublicKey
): Promise<web3.Transaction> {
const associatedTokenAddress = await token.getAssociatedTokenAddress(mint, payer, false);

const transaction = new web3.Transaction().add(
token.createAssociatedTokenAccountInstruction(
payer,
associatedTokenAddress,
payer,
mint
)
)

return transaction
}

Mint token

铸币是将新代币发行到流通中的过程。当你铸造代币时,你增加了代币铸造的供应,并将新铸造的代币存入代币账户。只有代币铸造的铸币机构才被允许铸造新的代币。

使用spl-token库来铸造代币,您可以使用mintTo函数。

const transactionSignature = await mintTo(
connection,
payer,
mint,
destination,
authority,
amount
);

mintTo函数返回一个可以在Solana Explorer上查看的TransactionSignature。mintTo函数需要以下参数:

  • connection - 与集群的JSON-RPC连接

  • payer - 交易的付款人的公钥

  • mint - 与新代币账户关联的代币铸币

  • destination - 接收新铸造代币的代币账户

  • authority - 授权用于铸造代币的账户

  • amount - 在小数点之外铸造的代币的原始数量,例如,如果Scrooge Coin的小数属性设置为2,则要获得1个完整的Scrooge Coin,您需要将此属性设置为100。

    在代币铸造完成后,将铸币权限更新为null并不罕见。这将设定最大供应量,并确保未来无法再铸造任何代币。相反地,可以将铸币权限授予一个程序,以便代币可以根据固定间隔或可编程条件自动铸造。

在内部,mintTo函数只是使用从createMintToInstruction函数获取的指令创建一个交易。

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildMintToTransaction(
authority: web3.PublicKey,
mint: web3.PublicKey,
amount: number,
destination: web3.PublicKey
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createMintToInstruction(
mint,
destination,
authority,
amount
)
)

return transaction
}

转移代币

SPL-Token转账需要发送方和接收方都拥有相应代币的账户。代币从发送方的账户转移到接收方的账户。

在获取接收者的关联代币账户时,您可以使用getOrCreateAssociatedTokenAccount函数来确保其代币账户在转账之前已存在。只需记住,如果账户尚不存在,该函数将创建该账户,并且交易的付款方将被扣除所需的lamports用于账户创建。

一旦您知道接收者的令牌账户地址,您可以使用spl-token库的转账函数进行令牌转账。

const transactionSignature = await transfer(
connection,
payer,
source,
destination,
owner,
amount
)

转账函数返回一个可以在Solana Explorer上查看的TransactionSignature。 -转账函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • source - 发送代币的代币账户
  • destination - 接收代币的代币账户
  • owner - 发送代币的代币账户的所有者
  • amount - 要转移的代币的数量

在底层,转账函数只是根据从createTransferInstruction函数获取的指令创建一个交易:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildTransferTransaction(
source: web3.PublicKey,
destination: web3.PublicKey,
owner: web3.PublicKey,
amount: number
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createTransferInstruction(
source,
destination,
owner,
amount,
)
)

return transaction
}

燃烧代币

燃烧代币是减少特定代币发行量的过程。燃烧代币会将其从特定代币账户和更广泛的流通中移除。

使用spl-token库烧毁代币时,您需要使用burn函数。

const transactionSignature = await burn(
connection,
payer,
account,
mint,
owner,
amount
)

burn函数返回一个可以在Solana Explorer上查看的TransactionSignatureburn函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • account - 要燃烧的代币账户
  • mint - 与代币账户关联的代币铸币
  • owner - 代币账户的所有者
  • amount - 要燃烧的代币的数量

在内部,burn函数通过createBurnInstruction函数获取的指令创建了一个交易:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildBurnTransaction(
account: web3.PublicKey,
mint: web3.PublicKey,
owner: web3.PublicKey,
amount: number
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createBurnInstruction(
account,
mint,
owner,
amount
)
)

return transaction
}

批准委派

批准委托是授权另一个账户从代币账户中转移或销毁代币的过程。使用委托时,对代币账户的控制权仍归原始所有者所有。委托账户可以在原始所有者批准委托时指定可转移或销毁的代币最大数量。请注意,一个代币账户在任何给定时间只能关联一个委托账户。

使用spl-token库来批准委托人,您需要使用approve函数。

const transactionSignature = await approve(
connection,
payer,
account,
delegate,
owner,
amount
)

批准功能返回一个可以在Solana Explorer上查看的TransactionSignature。批准功能需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 支付人的账户用于交易
  • account - 考虑将代币从令牌账户委托出去
  • delegate - 委托账户的所有者授权转移或销毁代币
  • owner - 账户的所有者令牌账户的所有者
  • amount - 委托账户可以转移或销毁的代币的最大数量

在内部,approve函数使用从createApproveInstruction函数获取的指令创建一个交易:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildApproveTransaction(
account: web3.PublicKey,
delegate: web3.PublicKey,
owner: web3.PublicKey,
amount: number
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createApproveInstruction(
account,
delegate,
owner,
amount
)
)

return transaction
}

撤销委托

之前已批准的代表令牌账户的委托可以被撤销。一旦委托被撤销,委托人将无法再从所有者的令牌账户中转移令牌。之前批准的剩余金额也无法再由委托人进行转移。

使用spl-token库撤销委托,您可以使用revoke函数。

const transactionSignature = await revoke(
connection,
payer,
account,
owner,
)

撤销函数返回一个可以在Solana Explorer上查看的TransactionSignature。撤销函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • account - 撤销代表权限的令牌账户
  • owner - 令牌账户的所有者

在底层,revoke函数通过createRevokeInstruction函数获取的指令创建了一个交易:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildRevokeTransaction(
account: web3.PublicKey,
owner: web3.PublicKey,
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createRevokeInstruction(
account,
owner,
)
)

return transaction
}

演示

我们将创建一个与Token程序上的指令进行交互的脚本。我们将创建一个Token铸造厂,创建Token账户,铸造代币,批准委托人,转移代币,并销毁代币。

1. 基本脚手架

让我们从一些基本的脚手架开始。您可以根据自己的需要设置项目,但我们将使用一个简单的TypeScript项目,并依赖于@solana/web3.js@solana/spl-token包。

您可以在命令行中使用 npx create-solana-client [INSERT_NAME_HERE] --initialize-keypair 命令来克隆我们将要开始的模板。或者您也可以手动在此处克隆模板。请注意,如果您直接使用 git 仓库作为起点,我们将从 with-keypair-env 分支开始。

然后,您需要在@solana/spl-token上添加一个依赖项。从新创建的目录中的命令行中,使用命令npm install @solana/spl-token

2. 创建Token Mint

我们将使用@solana/spl-token库,所以让我们从文件顶部导入它。

import * as token from '@solana/spl-token'

接下来,声明一个名为createNewMint的新函数,它带有参数connectionpayermintAuthorityfreezeAuthoritydecimals

在函数Import的主体中,从@solana/spl-token中创建createMint函数,然后创建一个调用createMint的函数

async function createNewMint(
connection: web3.Connection,
payer: web3.Keypair,
mintAuthority: web3.PublicKey,
freezeAuthority: web3.PublicKey,
decimals: number
): Promise<web3.PublicKey> {

const tokenMint = await token.createMint(
connection,
payer,
mintAuthority,
freezeAuthority,
decimals
);

console.log(
`Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`
);

return tokenMint;
}

完成该功能后,从main函数的主体中调用它,将user设置为付款方,mintAuthorityfreezeAuthority

创建新的铸币后,让我们使用getMint函数获取账户数据,并将其存储在名为mintInfo的变量中。稍后我们将使用这些数据来调整铸币的小数精度。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);
}

3. 创建令牌账户

既然我们已经创建了铸币机构,那么让我们创建一个新的代币账户,指定用户为所有者。

createAccount函数创建一个新的Token账户,并可以选择指定Token账户的地址。请注意,如果没有提供地址,createAccount函数将默认使用通过mintowner派生的关联Token账户。

另外,函数createAssociatedTokenAccount也会根据代币和所有者的公钥派生出相同地址的关联代币账户。

为了进行演示,我们将使用thegetOrCreateAssociatedTokenAccount函数来创建我们的代币账户。如果该函数已存在,则获取代币账户的地址。如果不存在,则在适当的地址上创建一个新的关联代币账户。

async function createTokenAccount(
connection: web3.Connection,
payer: web3.Keypair,
mint: web3.PublicKey,
owner: web3.PublicKey
) {
const tokenAccount = await token.getOrCreateAssociatedTokenAccount(
connection,
payer,
mint,
owner
)

console.log(
`Token Account: https://explorer.solana.com/address/${tokenAccount.address}?cluster=devnet`
)

return tokenAccount
}

在主函数中添加一个调用createTokenAccount的语句,将之前创建的货币传递进去,并将用户设置为支付者和所有者。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)
}

4. Mint token

现在我们有一个代币铸造和一个代币账户,让我们将代币铸造到代币账户中。请注意,只有铸币授权者才能将新的代币铸造到代币账户中。回想一下,我们将用户设置为我们创建的代币的铸币授权者。

创建一个名为mintTokens的函数,该函数使用spl-token函数mintTo来铸造代币:

async function mintTokens(
connection: web3.Connection,
payer: web3.Keypair,
mint: web3.PublicKey,
destination: web3.PublicKey,
authority: web3.Keypair,
amount: number
) {
const transactionSignature = await token.mintTo(
connection,
payer,
mint,
destination,
authority,
amount
)

console.log(
`Mint Token Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

让我们在主函数中使用之前创建的 minttokenAccount 来调用该函数。

请注意,我们需要根据铸币的小数精度调整输入金额。我们的铸币代币具有2位小数精度。如果我们只指定100作为输入金额,那么只会铸造1个代币到我们的代币账户。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)
}

5. 批准委派

现在我们已经有了一个代币铸造和一个代币账户,让我们授权一个代表来代表我们转移代币。

创建一个名为approveDelegate的函数,该函数使用spl-token函数approve来铸造代币:

async function approveDelegate(
connection: web3.Connection,
payer: web3.Keypair,
account: web3.PublicKey,
delegate: web3.PublicKey,
owner: web3.Signer | web3.PublicKey,
amount: number
) {
const transactionSignature = await token.approve(
connection,
payer,
account,
delegate,
owner,
amount
)

console.log(
`Approve Delegate Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

首先,在主函数中,让我们生成一个新的密钥对来代表委托账户。然后,让我们调用我们的新approveDelegate函数,并授权委托账户从用户代币账户中转移最多50个代币。记得根据代币的小数精度调整金额。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)

const delegate = web3.Keypair.generate();

await approveDelegate(
connection,
user,
tokenAccount.address,
delegate.publicKey,
user.publicKey,
50 * 10 ** mintInfo.decimals
)
}

6. 转移代币

接下来,让我们使用spl-token库的转账功能,转移一些刚刚铸造的代币。

async function transferTokens(
connection: web3.Connection,
payer: web3.Keypair,
source: web3.PublicKey,
destination: web3.PublicKey,
owner: web3.Keypair,
amount: number
) {
const transactionSignature = await token.transfer(
connection,
payer,
source,
destination,
owner,
amount
)

console.log(
`Transfer Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

在我们调用这个新功能之前,我们需要知道将要转移代币的账户。

在主函数中,让我们生成一个新的密钥对作为接收者(但请记住,这只是模拟有人可以发送代币给的情况 - 在真实应用中,您需要知道接收代币的人的钱包地址)。

然后,为接收者创建一个令牌账户。最后,让我们调用我们的新的transferTokens函数,将令牌从用户令牌账户转移到接收者令牌账户。我们将使用在前一步中批准的委托来代表我们执行转账。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

const mintInfo = await token.getMint(connection, mint);

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)

const receiver = web3.Keypair.generate().publicKey
const receiverTokenAccount = await createTokenAccount(
connection,
user,
mint,
receiver
)

const delegate = web3.Keypair.generate();
await approveDelegate(
connection,
user,
tokenAccount.address,
delegate.publicKey,
user.publicKey,
50 * 10 ** mintInfo.decimals
)

await transferTokens(
connection,
user,
tokenAccount.address,
receiverTokenAccount.address,
delegate,
50 * 10 ** mintInfo.decimals
)
}

7. 撤销委托

现在我们已经完成了代币的转移,让我们使用spl-token库的revoke函数来撤销委托。

async function revokeDelegate(
connection: web3.Connection,
payer: web3.Keypair,
account: web3.PublicKey,
owner: web3.Signer | web3.PublicKey,
) {
const transactionSignature = await token.revoke(
connection,
payer,
account,
owner,
)

console.log(
`Revote Delegate Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

撤销将会将代币账户的委托设置为null,并将委托数量重置为0。我们只需要代币账户和用户来执行这个功能。让我们调用我们的新revokeDelegate函数来从用户的代币账户中撤销委托。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)

const receiver = web3.Keypair.generate().publicKey
const receiverTokenAccount = await createTokenAccount(
connection,
user,
mint,
receiver
)

const delegate = web3.Keypair.generate();
await approveDelegate(
connection,
user,
tokenAccount.address,
delegate.publicKey,
user.publicKey,
50 * 10 ** mintInfo.decimals
)

await transferTokens(
connection,
user,
tokenAccount.address,
receiverTokenAccount.address,
delegate,
50 * 10 ** mintInfo.decimals
)

await revokeDelegate(
connection,
user,
tokenAccount.address,
user.publicKey,
)
}

8. 燃烧代币

最后,让我们通过销毁一些代币来减少流通量。

创建一个burnTokens函数,该函数使用spl-token库的burn函数将您的代币供应量减少一半。

async function burnTokens(
connection: web3.Connection,
payer: web3.Keypair,
account: web3.PublicKey,
mint: web3.PublicKey,
owner: web3.Keypair,
amount: number
) {
const transactionSignature = await token.burn(
connection,
payer,
account,
mint,
owner,
amount
)

console.log(
`Burn Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

现在在主函数中调用这个新函数,烧掉用户代币中的25个。记得根据铸币的小数精度调整数量。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)

const receiver = web3.Keypair.generate().publicKey
const receiverTokenAccount = await createTokenAccount(
connection,
user,
mint,
receiver
)

const delegate = web3.Keypair.generate();
await approveDelegate(
connection,
user,
tokenAccount.address,
delegate.publicKey,
user.publicKey,
50 * 10 ** mintInfo.decimals
)

await transferTokens(
connection,
user,
tokenAccount.address,
receiverTokenAccount.address,
delegate,
50 * 10 ** mintInfo.decimals
)

await revokeDelegate(
connection,
user,
tokenAccount.address,
user.publicKey,
)

await burnTokens(
connection,
user,
tokenAccount.address,
mint, user,
25 * 10 ** mintInfo.decimals
)
}

9. 全部测试一下

有了这些,运行npm start。您应该在控制台上看到一系列Solana Explorer链接的日志。点击它们,看看每个步骤发生了什么!您创建了一个新的代币铸造,创建了一个代币账户,铸造了100个代币,批准了一个委托人,使用委托人转移了50个代币,撤销了委托人,并烧毁了另外25个代币。您正在成为一个代币专家的道路上进展顺利。

如果你需要更多时间来完成这个项目并感到舒适,可以查看完整的解决方案代码

挑战

现在轮到你独立建立一些东西了。创建一个应用程序,允许用户创建新的铸币、创建代币账户并铸造代币。

请注意,您将无法直接使用我们在演示中介绍的辅助功能。为了使用Phantom钱包适配器与Token程序进行交互,您需要手动构建每个交易并将交易提交给Phantom进行批准。

  1. 你可以从零开始构建这个项目,或者你可以在这里下载起始代码

  2. CreateMint组件中创建一个新的Token Mint。

创建新的货币时,新生成的密钥对也必须对交易进行签名。当除了连接的钱包外还需要额外的签名者时,请使用以下格式:

sendTransaction(transaction, connection, {
signers: [Keypair],
})
  1. CreateTokenAccount组件中创建一个新的Token账户。

  2. MintToForm组件中铸造Mint代币。

如果你遇到困难,随时可以参考解决方案代码

记住,对这些挑战要有创意,让它们成为你自己的!

- - +

💵 The Token Program

是时候让代币与它们的创造者(你)相遇了。我们将在之前的构建部分中继续进行。如果需要,你可以从这里获取起始代码(确保你在 solution-without-burn 分支上)。作为区块链最初的承诺,也可能是你安装钱包的主要原因,这些谦逊的代币是对区块链上资产的最纯粹的表达,从合成股票到数百种狗币。

这节课主要讲解Solana上的代币工作原理。如果你对其他区块链有所了解,可能会发现这里有一些不同之处,所以尽量不要将当前对代币的理解与之联系起来。

谈论Solana中令牌的工作原理也是一个了解不同程序如何使用账户的绝佳机会。你越深入了解Solana,就越能意识到账户的重要性。它们像文件系统中的文件一样抽象和灵活,但这也意味着任何给定程序上的账户可能变得复杂!刚开始可能会感到困惑,但给它一些时间,它会变得更加清晰。

Solana上的代币是通过Solana Token Program进行创建和管理的,它是Solana Program Library(SPL)中的几个程序之一。常规代币和非同质化代币(NFTs)都是Solana程序库中的代币。今天我们不会涉及NFTs,但不用担心,我们很快会介绍。

🗃 账户关系

我们首先要了解一下情况。The token program需要三个必要的账户:

  • Wallet Account - 这是你的钱包!
  • Mint Account - 存储有关代币Mint的元数据
  • Token Account - 这与钱包绑定,并存储有关该特定钱包的信息,例如它拥有多少令牌。

让我们深入了解每个账户,并看看它们内部的情况。

🌌 Mint Account

Mint账户存储有关代币本身的元数据,而不是您对代币的所有权,而是更广泛地涉及代币。它具有以下属性:

  • mint authority - 只有一个账户可以从Mint账户签名并Mint代币。当您创建Mint账户时,必须指定Mint权限,可以是您的个人钱包或其他程序。
  • supply - 有多少总代币存在。供应基本上是在说,“码农大神,你好!这是发行的总代币数量。”
  • decimals - 小数位数是我们允许令牌被分割成的小数位数 - 我们令牌的精度。这可能会变得棘手,因为实际上链上没有小数。什么?总供应量表示为整数,所以你必须进行数学计算来在小数之间进行转换。例如,如果你将小数位数设置为两位,而你的供应量是一百,那么实际上你只有一个令牌。供应中只有一个令牌,但你允许它被分割成该令牌的较小面额。
  • Is Initialized - 基本上是指该账户是否准备就绪。这与账户本身有关,而不是token program
  • Freeze authority - 冻结权限类似于Mint权限,意味着一个人或程序拥有冻结(或Mint)的权限。

将Mint权限设置给你的钱包是相当标准的做法,你可以Mint任何你想要的东西,然后取消Mint权限,基本上意味着未来不会再发行更多的供应量。或者,如果你有某种动态发行代币的方式,常见的做法是将其放入权限中,作为一个程序来管理代币的Mint。

冻结权限的工作方式相同。

👛 Token Accounts

你可能已经看到了大量在生态系统中流通的不同代币。你的钱包现在可能装满了各种不同的代币。那么,网络是如何知道你持有某些代币的呢?一个账户存储着这些数据!最好的方式是通过一个关联的代币账户来实现。看看吧

这是数据关系和账户属性的样子。

Token账户必须与用户或钱包关联。一个简单的方法是创建一个PDA,其地址链接了Mint账户和钱包。令牌账户PDA的种子是铸币账户的地址和钱包地址(令牌程序ID默认存在)。

有很多不同的信息包含在内,但现在只需要知道你的钱包实际上并不持有具体的代币。它与你拥有的另一个账户相关联,该账户存储了代币的数量。另外,还有一个铸币账户,存储了关于所有代币和铸币的更广泛信息。

花点时间盯着这个图表,然后搜索一下那些不明白的部分(比如关联的令牌程序到底是什么鬼?)。在处理完所有的繁琐事情之后,这就很简单了!

🤑 代币Mint过程

别再看图表了,让我们来看一些代码,看看这一切是如何发生的。

要创建一个新的SPL-Token,首先必须创建一个Token Mint(保存有关该特定代币的数据的账户)。

把它想象成烤比萨饼。你需要一个食谱(关于代币的数据),食材(铸币账户和钱包地址),以及有人把它们组合在一起(派生一个新的PDA)。就像制作比萨饼一样,如果你拥有所有正确的食材并按照食谱操作,最终你将得到一枚美味的新代币!

由于令牌计划是SPL的一部分,您可以使用 @solana/spl-token TypeScript SDK相当容易地创建交易。

这是一个createMint的样子:

const tokenMint = await createMint(
connection,
payer,
mintAuthority,
freezeAuthority,
decimals,
)

你需要这些参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 付款方交易的公钥
  • mintAuthority - 被授权Mint新代币的账户
  • freezeAuthority - 一个被授权冻结代币的账户。如果您不想冻结代币,请将其设置为null!
  • decimals - 指定令牌的所需小数精度

一旦完成这个步骤,你就可以继续下一步了:

  • 创建关联的Token账户
  • 将代币Mint到一个账户中
  • 如果你想要使用转账功能进行空投到多个账户,

你需要的一切都在 @solana/spl-token SDK中。如果你对某个具体部分感兴趣,可以在这里查看文档

大多数情况下,您不需要自己创建原始交易,SDK就足够了。

关于这个很酷的附注——如果出于某种原因,你想要在创建Mint指令的同时创建另一个指令,你会希望自己创建这些指令,并将它们打包成一个事务,以确保所有操作都是原子性的。也许你正在构建一个超级机密的代币程序,你希望在铸币后立即锁定所有代币,而没有人能够转移它们。

不用说,这些代币周围发生了很多疯狂的事情。您可以在这里查看每个功能在幕后发生的情况,甚至可以查看一些关于销毁代币之类的说明。:)

Reference



使用Token程序创建令牌

简而言之

  • SPL代币代表Solana网络上的所有非本地代币。Solana上的可替代和不可替代代币(NFT)都是SPL代币。
  • Token Program包含了创建和与SPL-Tokens进行交互的指令
  • Token Mints 是指保存特定 Token 数据的账户,但不持有 Tokens
  • Token Account用于持有特定Token Mint的Token
  • 创建代币Mint和Token账户需要分配 SOL 作为租金。代币账户的租金在关闭账户时可以退还,然而,目前无法关闭代币铸币。

概述

Token计划是Solana程序库(SPL)提供的众多计划之一。它包含了创建和与SPL-Tokens进行交互的指令。这些代币代表了Solana网络上的所有非本地(即非SOL)代币。

本课程将重点介绍使用Token程序创建和管理新的SPL-Token的基础知识

  1. 创建一个新的Token Mint
  2. 创建Token accounts
  3. Mint
  4. 将代币从一个持有人转移到另一个持有人
  5. 燃烧代币

我们将从开发过程的客户端角度来处理,使用@solana/spl-token JavaScript库。

代币铸造

要创建一个新的SPL-Token,首先必须创建一个Token Mint。Token Mint是保存特定代币数据的账户。

以USD Coin (USDC)在Solana Explorer上为例。USDC的代币铸造地址是EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v。通过浏览器,我们可以查看有关USDC代币铸造的特定细节,例如代币的当前供应量、铸造和冻结权限的地址,以及代币的小数精度。

要创建一个新的代币铸造,您需要向代币程序发送正确的交易指令。为此,我们将使用@solana/spl-token中的createMint函数。

const tokenMint = await createMint(
connection,
payer,
mintAuthority,
freezeAuthority,
decimal
);

createMint函数返回新Token Mint的公钥。此函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • mintAuthority - 授权进行从Token Mint中实际铸造代币的账户。
  • freezeAuthority - 一个被授权冻结代币账户的账户。如果不需要冻结功能,该参数可以设置为null。
  • decimals - 指定令牌的所需小数精度

当使用具有访问您的秘钥权限的脚本创建新的铸币时,您可以简单地使用createMint函数。然而,如果您要构建一个允许用户创建新的代币铸币的网站,您需要在不让用户暴露秘钥给浏览器的情况下完成。在这种情况下,您需要构建并提交一笔包含正确指令的交易。

在内部,createMint函数只是创建了一个包含两个指令的交易:

  1. 创建一个新账户
  2. 初始化一个新的Mint

这将如下所示:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildCreateMintTransaction(
connection: web3.Connection,
payer: web3.PublicKey,
decimals: number
): Promise<web3.Transaction> {
const lamports = await token.getMinimumBalanceForRentExemptMint(connection);
const accountKeypair = web3.Keypair.generate();
const programId = token.TOKEN_PROGRAM_ID

const transaction = new web3.Transaction().add(
web3.SystemProgram.createAccount({
fromPubkey: payer,
newAccountPubkey: accountKeypair.publicKey,
space: token.MINT_SIZE,
lamports,
programId,
}),
token.createInitializeMintInstruction(
accountKeypair.publicKey,
decimals,
payer,
payer,
programId
)
);

return transaction
}

在手动构建创建新代币铸造指令时,请确保将创建账户和初始化铸造指令添加到同一笔交易中。如果您将每个步骤分开进行交易,理论上有可能让其他人接管您创建的账户并将其用于自己的铸造。

租金和租金豁免

请注意,前面代码片段的函数体中的第一行包含对getMinimumBalanceForRentExemptMint的调用,其结果传递给createAccount函数。这是账户初始化中的租金豁免的一部分。

直到最近,Solana上的所有账户都需要执行以下操作之一,以避免被解除分配:

  1. 按特定间隔支付租金
  2. 初始化时存入足够的SOL以被视为免租金

最近,第一个选项被取消了,现在在初始化新账户时,需要存入足够的SOL以免除租金。

在这种情况下,我们正在为一个代币铸造创建一个新的账户,所以我们使用了 @solana/spl-token 库中的 getMinimumBalanceForRentExemptMint 方法。然而,这个概念适用于所有账户,你可以在 Connection 上使用更通用的 getMinimumBalanceForRentExemption 方法来创建其他可能需要的账户。

令牌账户

在您可以铸造代币(发行新供应)之前,您需要一个代币账户来持有新发行的代币。

一个代币账户持有特定“铸币”所发行的代币,并指定了账户的“所有者”。只有所有者有权减少代币账户的余额(转账、销毁等),而任何人都可以向代币账户发送代币以增加其余额。

您可以使用spl-token库的createAccount函数来创建新的令牌账户:

const tokenAccount = await createAccount(
connection,
payer,
mint,
owner,
keypair
);

createAccount函数返回新令牌账户的公钥。此函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • mint - 与新代币账户关联的代币铸币
  • owner - 新代币账户的所有者账户
  • keypair - 这是一个可选参数,用于指定新的令牌账户地址。如果没有提供keypair,则createAccount函数将默认从关联的铸币和所有者账户派生。

请注意,这个createAccount函数与我们在查看createMint函数内部时所展示的createAccount函数不同。之前我们在SystemProgram上使用createAccount函数来返回创建所有账户的指令。而这里的createAccount函数是spl-token库中的一个辅助函数,它会提交一个包含两个指令的交易。第一个指令用于创建账户,第二个指令用于将账户初始化为代币账户。

就像创建一个Token Mint一样,如果我们需要手动构建createAccount的交易,我们可以复制函数在内部所做的操作:

  1. 使用getMint来检索与Mint相关的数据
  2. 使用getAccountLenForMint函数来计算代币账户所需的空间
  3. 使用getMinimumBalanceForRentExemption函数来计算租金豁免所需的Lamports数量
  4. 使用SystemProgram.createAccountcreateInitializeAccountInstruction创建一个新的交易。请注意,这里的createAccount是来自@solana/web3.js,用于创建一个通用的新账户。createInitializeAccountInstruction使用这个新账户来初始化新的代币账户。
import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildCreateTokenAccountTransaction(
connection: web3.Connection,
payer: web3.PublicKey,
mint: web3.PublicKey
): Promise<web3.Transaction> {
const mintState = await token.getMint(connection, mint)
const accountKeypair = await web3.Keypair.generate()
const space = token.getAccountLenForMint(mintState);
const lamports = await connection.getMinimumBalanceForRentExemption(space);
const programId = token.TOKEN_PROGRAM_ID

const transaction = new web3.Transaction().add(
web3.SystemProgram.createAccount({
fromPubkey: payer,
newAccountPubkey: accountKeypair.publicKey,
space,
lamports,
programId,
}),
token.createInitializeAccountInstruction(
accountKeypair.publicKey,
mint,
payer,
programId
)
);

return transaction
}

关联代币账户

关联代币账户是一种使用所有者的公钥和代币铸币地址派生出的代币账户。关联代币账户提供了一种确定性的方式,用于找到特定公钥所拥有的特定代币铸币的代币账户。大多数情况下,创建代币账户时,您希望它成为关联代币账户。

与上述类似,您可以使用spl-token库的createAssociatedTokenAccount函数创建一个关联的代币账户。

const associatedTokenAccount = await createAssociatedTokenAccount(
connection,
payer,
mint,
owner,
);

该函数返回新关联令牌账户的公钥,并需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • mint - 与新代币账户关联的代币铸币
  • owner - 新代币账户的所有者账户

您还可以使用getOrCreateAssociatedTokenAccount来获取与给定地址关联的Token账户,如果该账户不存在,则创建它。例如,如果您正在编写代码向给定用户空投代币,您很可能会使用此函数来确保与给定用户关联的Token账户在不存在时被创建。

在底层,createAssociatedTokenAccount正在执行两个操作:

  1. 使用 getAssociatedTokenAddress从铸币和所有者中推导出关联的代币账户地址
  2. 使用createAssociatedTokenAccountInstruction指令构建交易
import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildCreateAssociatedTokenAccountTransaction(
payer: web3.PublicKey,
mint: web3.PublicKey
): Promise<web3.Transaction> {
const associatedTokenAddress = await token.getAssociatedTokenAddress(mint, payer, false);

const transaction = new web3.Transaction().add(
token.createAssociatedTokenAccountInstruction(
payer,
associatedTokenAddress,
payer,
mint
)
)

return transaction
}

Mint token

铸币是将新代币发行到流通中的过程。当你铸造代币时,你增加了代币铸造的供应,并将新铸造的代币存入代币账户。只有代币铸造的铸币机构才被允许铸造新的代币。

使用spl-token库来铸造代币,您可以使用mintTo函数。

const transactionSignature = await mintTo(
connection,
payer,
mint,
destination,
authority,
amount
);

mintTo函数返回一个可以在Solana Explorer上查看的TransactionSignature。mintTo函数需要以下参数:

  • connection - 与集群的JSON-RPC连接

  • payer - 交易的付款人的公钥

  • mint - 与新代币账户关联的代币铸币

  • destination - 接收新铸造代币的代币账户

  • authority - 授权用于铸造代币的账户

  • amount - 在小数点之外铸造的代币的原始数量,例如,如果Scrooge Coin的小数属性设置为2,则要获得1个完整的Scrooge Coin,您需要将此属性设置为100。

    在代币铸造完成后,将铸币权限更新为null并不罕见。这将设定最大供应量,并确保未来无法再铸造任何代币。相反地,可以将铸币权限授予一个程序,以便代币可以根据固定间隔或可编程条件自动铸造。

在内部,mintTo函数只是使用从createMintToInstruction函数获取的指令创建一个交易。

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildMintToTransaction(
authority: web3.PublicKey,
mint: web3.PublicKey,
amount: number,
destination: web3.PublicKey
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createMintToInstruction(
mint,
destination,
authority,
amount
)
)

return transaction
}

转移代币

SPL-Token转账需要发送方和接收方都拥有相应代币的账户。代币从发送方的账户转移到接收方的账户。

在获取接收者的关联代币账户时,您可以使用getOrCreateAssociatedTokenAccount函数来确保其代币账户在转账之前已存在。只需记住,如果账户尚不存在,该函数将创建该账户,并且交易的付款方将被扣除所需的lamports用于账户创建。

一旦您知道接收者的令牌账户地址,您可以使用spl-token库的转账函数进行令牌转账。

const transactionSignature = await transfer(
connection,
payer,
source,
destination,
owner,
amount
)

转账函数返回一个可以在Solana Explorer上查看的TransactionSignature。 +转账函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • source - 发送代币的代币账户
  • destination - 接收代币的代币账户
  • owner - 发送代币的代币账户的所有者
  • amount - 要转移的代币的数量

在底层,转账函数只是根据从createTransferInstruction函数获取的指令创建一个交易:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildTransferTransaction(
source: web3.PublicKey,
destination: web3.PublicKey,
owner: web3.PublicKey,
amount: number
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createTransferInstruction(
source,
destination,
owner,
amount,
)
)

return transaction
}

燃烧代币

燃烧代币是减少特定代币发行量的过程。燃烧代币会将其从特定代币账户和更广泛的流通中移除。

使用spl-token库烧毁代币时,您需要使用burn函数。

const transactionSignature = await burn(
connection,
payer,
account,
mint,
owner,
amount
)

burn函数返回一个可以在Solana Explorer上查看的TransactionSignatureburn函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • account - 要燃烧的代币账户
  • mint - 与代币账户关联的代币铸币
  • owner - 代币账户的所有者
  • amount - 要燃烧的代币的数量

在内部,burn函数通过createBurnInstruction函数获取的指令创建了一个交易:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildBurnTransaction(
account: web3.PublicKey,
mint: web3.PublicKey,
owner: web3.PublicKey,
amount: number
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createBurnInstruction(
account,
mint,
owner,
amount
)
)

return transaction
}

批准委派

批准委托是授权另一个账户从代币账户中转移或销毁代币的过程。使用委托时,对代币账户的控制权仍归原始所有者所有。委托账户可以在原始所有者批准委托时指定可转移或销毁的代币最大数量。请注意,一个代币账户在任何给定时间只能关联一个委托账户。

使用spl-token库来批准委托人,您需要使用approve函数。

const transactionSignature = await approve(
connection,
payer,
account,
delegate,
owner,
amount
)

批准功能返回一个可以在Solana Explorer上查看的TransactionSignature。批准功能需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 支付人的账户用于交易
  • account - 考虑将代币从令牌账户委托出去
  • delegate - 委托账户的所有者授权转移或销毁代币
  • owner - 账户的所有者令牌账户的所有者
  • amount - 委托账户可以转移或销毁的代币的最大数量

在内部,approve函数使用从createApproveInstruction函数获取的指令创建一个交易:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildApproveTransaction(
account: web3.PublicKey,
delegate: web3.PublicKey,
owner: web3.PublicKey,
amount: number
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createApproveInstruction(
account,
delegate,
owner,
amount
)
)

return transaction
}

撤销委托

之前已批准的代表令牌账户的委托可以被撤销。一旦委托被撤销,委托人将无法再从所有者的令牌账户中转移令牌。之前批准的剩余金额也无法再由委托人进行转移。

使用spl-token库撤销委托,您可以使用revoke函数。

const transactionSignature = await revoke(
connection,
payer,
account,
owner,
)

撤销函数返回一个可以在Solana Explorer上查看的TransactionSignature。撤销函数需要以下参数:

  • connection - 与集群的JSON-RPC连接
  • payer - 交易的付款人的公钥
  • account - 撤销代表权限的令牌账户
  • owner - 令牌账户的所有者

在底层,revoke函数通过createRevokeInstruction函数获取的指令创建了一个交易:

import * as web3 from '@solana/web3'
import * as token from '@solana/spl-token'

async function buildRevokeTransaction(
account: web3.PublicKey,
owner: web3.PublicKey,
): Promise<web3.Transaction> {
const transaction = new web3.Transaction().add(
token.createRevokeInstruction(
account,
owner,
)
)

return transaction
}

演示

我们将创建一个与Token程序上的指令进行交互的脚本。我们将创建一个Token铸造厂,创建Token账户,铸造代币,批准委托人,转移代币,并销毁代币。

1. 基本脚手架

让我们从一些基本的脚手架开始。您可以根据自己的需要设置项目,但我们将使用一个简单的TypeScript项目,并依赖于@solana/web3.js@solana/spl-token包。

您可以在命令行中使用 npx create-solana-client [INSERT_NAME_HERE] --initialize-keypair 命令来克隆我们将要开始的模板。或者您也可以手动在此处克隆模板。请注意,如果您直接使用 git 仓库作为起点,我们将从 with-keypair-env 分支开始。

然后,您需要在@solana/spl-token上添加一个依赖项。从新创建的目录中的命令行中,使用命令npm install @solana/spl-token

2. 创建Token Mint

我们将使用@solana/spl-token库,所以让我们从文件顶部导入它。

import * as token from '@solana/spl-token'

接下来,声明一个名为createNewMint的新函数,它带有参数connectionpayermintAuthorityfreezeAuthoritydecimals

在函数Import的主体中,从@solana/spl-token中创建createMint函数,然后创建一个调用createMint的函数

async function createNewMint(
connection: web3.Connection,
payer: web3.Keypair,
mintAuthority: web3.PublicKey,
freezeAuthority: web3.PublicKey,
decimals: number
): Promise<web3.PublicKey> {

const tokenMint = await token.createMint(
connection,
payer,
mintAuthority,
freezeAuthority,
decimals
);

console.log(
`Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`
);

return tokenMint;
}

完成该功能后,从main函数的主体中调用它,将user设置为付款方,mintAuthorityfreezeAuthority

创建新的铸币后,让我们使用getMint函数获取账户数据,并将其存储在名为mintInfo的变量中。稍后我们将使用这些数据来调整铸币的小数精度。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);
}

3. 创建令牌账户

既然我们已经创建了铸币机构,那么让我们创建一个新的代币账户,指定用户为所有者。

createAccount函数创建一个新的Token账户,并可以选择指定Token账户的地址。请注意,如果没有提供地址,createAccount函数将默认使用通过mintowner派生的关联Token账户。

另外,函数createAssociatedTokenAccount也会根据代币和所有者的公钥派生出相同地址的关联代币账户。

为了进行演示,我们将使用thegetOrCreateAssociatedTokenAccount函数来创建我们的代币账户。如果该函数已存在,则获取代币账户的地址。如果不存在,则在适当的地址上创建一个新的关联代币账户。

async function createTokenAccount(
connection: web3.Connection,
payer: web3.Keypair,
mint: web3.PublicKey,
owner: web3.PublicKey
) {
const tokenAccount = await token.getOrCreateAssociatedTokenAccount(
connection,
payer,
mint,
owner
)

console.log(
`Token Account: https://explorer.solana.com/address/${tokenAccount.address}?cluster=devnet`
)

return tokenAccount
}

在主函数中添加一个调用createTokenAccount的语句,将之前创建的货币传递进去,并将用户设置为支付者和所有者。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)
}

4. Mint token

现在我们有一个代币铸造和一个代币账户,让我们将代币铸造到代币账户中。请注意,只有铸币授权者才能将新的代币铸造到代币账户中。回想一下,我们将用户设置为我们创建的代币的铸币授权者。

创建一个名为mintTokens的函数,该函数使用spl-token函数mintTo来铸造代币:

async function mintTokens(
connection: web3.Connection,
payer: web3.Keypair,
mint: web3.PublicKey,
destination: web3.PublicKey,
authority: web3.Keypair,
amount: number
) {
const transactionSignature = await token.mintTo(
connection,
payer,
mint,
destination,
authority,
amount
)

console.log(
`Mint Token Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

让我们在主函数中使用之前创建的 minttokenAccount 来调用该函数。

请注意,我们需要根据铸币的小数精度调整输入金额。我们的铸币代币具有2位小数精度。如果我们只指定100作为输入金额,那么只会铸造1个代币到我们的代币账户。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)
}

5. 批准委派

现在我们已经有了一个代币铸造和一个代币账户,让我们授权一个代表来代表我们转移代币。

创建一个名为approveDelegate的函数,该函数使用spl-token函数approve来铸造代币:

async function approveDelegate(
connection: web3.Connection,
payer: web3.Keypair,
account: web3.PublicKey,
delegate: web3.PublicKey,
owner: web3.Signer | web3.PublicKey,
amount: number
) {
const transactionSignature = await token.approve(
connection,
payer,
account,
delegate,
owner,
amount
)

console.log(
`Approve Delegate Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

首先,在主函数中,让我们生成一个新的密钥对来代表委托账户。然后,让我们调用我们的新approveDelegate函数,并授权委托账户从用户代币账户中转移最多50个代币。记得根据代币的小数精度调整金额。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)

const delegate = web3.Keypair.generate();

await approveDelegate(
connection,
user,
tokenAccount.address,
delegate.publicKey,
user.publicKey,
50 * 10 ** mintInfo.decimals
)
}

6. 转移代币

接下来,让我们使用spl-token库的转账功能,转移一些刚刚铸造的代币。

async function transferTokens(
connection: web3.Connection,
payer: web3.Keypair,
source: web3.PublicKey,
destination: web3.PublicKey,
owner: web3.Keypair,
amount: number
) {
const transactionSignature = await token.transfer(
connection,
payer,
source,
destination,
owner,
amount
)

console.log(
`Transfer Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

在我们调用这个新功能之前,我们需要知道将要转移代币的账户。

在主函数中,让我们生成一个新的密钥对作为接收者(但请记住,这只是模拟有人可以发送代币给的情况 - 在真实应用中,您需要知道接收代币的人的钱包地址)。

然后,为接收者创建一个令牌账户。最后,让我们调用我们的新的transferTokens函数,将令牌从用户令牌账户转移到接收者令牌账户。我们将使用在前一步中批准的委托来代表我们执行转账。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

const mintInfo = await token.getMint(connection, mint);

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)

const receiver = web3.Keypair.generate().publicKey
const receiverTokenAccount = await createTokenAccount(
connection,
user,
mint,
receiver
)

const delegate = web3.Keypair.generate();
await approveDelegate(
connection,
user,
tokenAccount.address,
delegate.publicKey,
user.publicKey,
50 * 10 ** mintInfo.decimals
)

await transferTokens(
connection,
user,
tokenAccount.address,
receiverTokenAccount.address,
delegate,
50 * 10 ** mintInfo.decimals
)
}

7. 撤销委托

现在我们已经完成了代币的转移,让我们使用spl-token库的revoke函数来撤销委托。

async function revokeDelegate(
connection: web3.Connection,
payer: web3.Keypair,
account: web3.PublicKey,
owner: web3.Signer | web3.PublicKey,
) {
const transactionSignature = await token.revoke(
connection,
payer,
account,
owner,
)

console.log(
`Revote Delegate Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

撤销将会将代币账户的委托设置为null,并将委托数量重置为0。我们只需要代币账户和用户来执行这个功能。让我们调用我们的新revokeDelegate函数来从用户的代币账户中撤销委托。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)

const receiver = web3.Keypair.generate().publicKey
const receiverTokenAccount = await createTokenAccount(
connection,
user,
mint,
receiver
)

const delegate = web3.Keypair.generate();
await approveDelegate(
connection,
user,
tokenAccount.address,
delegate.publicKey,
user.publicKey,
50 * 10 ** mintInfo.decimals
)

await transferTokens(
connection,
user,
tokenAccount.address,
receiverTokenAccount.address,
delegate,
50 * 10 ** mintInfo.decimals
)

await revokeDelegate(
connection,
user,
tokenAccount.address,
user.publicKey,
)
}

8. 燃烧代币

最后,让我们通过销毁一些代币来减少流通量。

创建一个burnTokens函数,该函数使用spl-token库的burn函数将您的代币供应量减少一半。

async function burnTokens(
connection: web3.Connection,
payer: web3.Keypair,
account: web3.PublicKey,
mint: web3.PublicKey,
owner: web3.Keypair,
amount: number
) {
const transactionSignature = await token.burn(
connection,
payer,
account,
mint,
owner,
amount
)

console.log(
`Burn Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
)
}

现在在主函数中调用这个新函数,烧掉用户代币中的25个。记得根据铸币的小数精度调整数量。

async function main() {
const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
const user = await initializeKeypair(connection)

const mint = await createNewMint(
connection,
user,
user.publicKey,
user.publicKey,
2
)

const mintInfo = await token.getMint(connection, mint);

const tokenAccount = await createTokenAccount(
connection,
user,
mint,
user.publicKey
)

await mintTokens(
connection,
user,
mint,
tokenAccount.address,
user,
100 * 10 ** mintInfo.decimals
)

const receiver = web3.Keypair.generate().publicKey
const receiverTokenAccount = await createTokenAccount(
connection,
user,
mint,
receiver
)

const delegate = web3.Keypair.generate();
await approveDelegate(
connection,
user,
tokenAccount.address,
delegate.publicKey,
user.publicKey,
50 * 10 ** mintInfo.decimals
)

await transferTokens(
connection,
user,
tokenAccount.address,
receiverTokenAccount.address,
delegate,
50 * 10 ** mintInfo.decimals
)

await revokeDelegate(
connection,
user,
tokenAccount.address,
user.publicKey,
)

await burnTokens(
connection,
user,
tokenAccount.address,
mint, user,
25 * 10 ** mintInfo.decimals
)
}

9. 全部测试一下

有了这些,运行npm start。您应该在控制台上看到一系列Solana Explorer链接的日志。点击它们,看看每个步骤发生了什么!您创建了一个新的代币铸造,创建了一个代币账户,铸造了100个代币,批准了一个委托人,使用委托人转移了50个代币,撤销了委托人,并烧毁了另外25个代币。您正在成为一个代币专家的道路上进展顺利。

如果你需要更多时间来完成这个项目并感到舒适,可以查看完整的解决方案代码

挑战

现在轮到你独立建立一些东西了。创建一个应用程序,允许用户创建新的铸币、创建代币账户并铸造代币。

请注意,您将无法直接使用我们在演示中介绍的辅助功能。为了使用Phantom钱包适配器与Token程序进行交互,您需要手动构建每个交易并将交易提交给Phantom进行批准。

  1. 你可以从零开始构建这个项目,或者你可以在这里下载起始代码

  2. CreateMint组件中创建一个新的Token Mint。

创建新的货币时,新生成的密钥对也必须对交易进行签名。当除了连接的钱包外还需要额外的签名者时,请使用以下格式:

sendTransaction(transaction, connection, {
signers: [Keypair],
})
  1. CreateTokenAccount组件中创建一个新的Token账户。

  2. MintToForm组件中铸造Mint代币。

如果你遇到困难,随时可以参考解决方案代码

记住,对这些挑战要有创意,让它们成为你自己的!

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module2/spl-token/token-metadata/index.html b/docs/Solana-Co-Learn/module2/spl-token/token-metadata/index.html index 6164647ad..5a443fbdf 100644 --- a/docs/Solana-Co-Learn/module2/spl-token/token-metadata/index.html +++ b/docs/Solana-Co-Learn/module2/spl-token/token-metadata/index.html @@ -3,15 +3,15 @@ -🧮 令牌元数据 | All in One Solana - - - +🧮 令牌元数据 | All in One Solana + + +
-

🧮 令牌元数据

是时候让令牌与它们的创造者(你)相遇了。我们将从之前的构建部分继续进行。如果需要,你可以从这里获取起始代码(确保你在 solution-without-burn 分支上)。

Token元数据是一个代币的信息,比如名称、符号和标志。注意一下,你钱包里的各种代币都有这些东西,除了你自己创建的代币。

这就是所有的元数据!这适用于所有的代币,不仅仅是可替代货币。在Solana上,NFT就像任何其他代币一样,只是元数据通过属性(如小数位)将它们定义为NFT。

这一切都是通过Token Metadata Program完成的 - 这是处理Solana区块链上的Token和NFT时最重要的程序之一。它的主要目标是将附加数据附加到Solana上的可替代或不可替代Token上。它使用从Mint账户地址派生出来的程序派生地址(PDAs)来实现这一目标。

🎭 令牌元数据账户

一旦我们制作了一个闪亮的新代币,我们需要让它变得华丽起来。我们将使用Token Metadata Program来实现这一点,以下是生成的账户的样子:

这被称为元数据账户。它可以存储关于特定代币铸造账户的各种信息。你会注意到有一个 URI (统一资源标识符)属性 - 这指向一个链外的 JSON 文件,主要用于非同质化代币(NFT)。由于链外部分不受链上费用的限制,你可以存储高质量的图形和其他大型数据对象。

元数据账户有很多值,你不需要了解其中大部分。我们将在需要时深入了解相关部分。现在,我们只关心离链部分,这是我们制作Pizzacoin所需的第一件事。

🖼 代币标准

off-chain部分遵循Metaplex代币标准,基本上是一种格式,你需要按照这种格式来实现不同类型代币的元数据。我们在元数据账户的链上部分的 Token Standard 字段中告诉网络上的所有应用程序我们的代币类型。我们的选项有:

  • NonFungible :一种带有主版本的非同质化代币(NFTs)。
  • FungibleAsset :具有元数据和属性的令牌,有时也被称为半可替代令牌(例如游戏物品)。
  • Fungible :具有简单元数据的代币。(像USDC或SOL这样的常规代币)
  • NonFungibleEdition :一个具有Edition账户的非同质化代币(从Master版中打印出来的,类似于100个中的1个)。

Metaplex Token标准在整个行业中被广泛接受。各种应用程序、交易所和钱包都希望令牌符合该标准。Token标准由Token元数据程序自动设置,无法手动更新。以下是它如何确定如何应用正确的标准:

  • 如果令牌拥有主版本账户,则为 NonFungible
  • 如果令牌具有Edition账户,则为 NonFungibleEdition
  • 如果代币没有(主)版账户(确保其供应量可以大于1)并且使用零位小数,那么它是一个 FungibleAsset
  • 如果代币没有(主)版账户(确保其供应量可以大于1)并且使用至少一位小数,那么它是一个 Fungible

你现在可以忽略“Master Edition”是什么意思,Pizzacoin是完全可替代的,所以我们将专注于 Fungible 代币。

🧰 Metaplex SDK

欢迎来到Solana上最实用的SDK之一。如果你曾经在Solana上铸造过NFT,那么你很可能在不知情的情况下使用了Metaplex SDK。我们将使用 @metaplex-foundation/js@metaplex-foundation/mpl-token-metadata 库来创建与我们的代币铸造相关联的元数据账户。是时候给Pizzacoin一个身份了。

我们将从链下部分开始,只有在准备就绪后,我们才会继续创建代币元数据账户。

一般的工作流程将是:

    1. 安装Metaplex SDK - 你可能会使用现有的密钥对
    1. 上传一个图像作为标志 - 我们将使用本地文件,但SDK也支持从浏览器上传
    1. 上传链下元数据(以及您上传的图像的URI),您现在可以开始进行链上操作了。
    1. 派生元数据账户PDA(蛋)
    1. 创建链上的Token元数据账户 - 指令、交易等。

感觉不确定?让我们用一些代码来战胜这些感觉吧 🤺

- - +

🧮 令牌元数据

是时候让令牌与它们的创造者(你)相遇了。我们将从之前的构建部分继续进行。如果需要,你可以从这里获取起始代码(确保你在 solution-without-burn 分支上)。

Token元数据是一个代币的信息,比如名称、符号和标志。注意一下,你钱包里的各种代币都有这些东西,除了你自己创建的代币。

这就是所有的元数据!这适用于所有的代币,不仅仅是可替代货币。在Solana上,NFT就像任何其他代币一样,只是元数据通过属性(如小数位)将它们定义为NFT。

这一切都是通过Token Metadata Program完成的 - 这是处理Solana区块链上的Token和NFT时最重要的程序之一。它的主要目标是将附加数据附加到Solana上的可替代或不可替代Token上。它使用从Mint账户地址派生出来的程序派生地址(PDAs)来实现这一目标。

🎭 令牌元数据账户

一旦我们制作了一个闪亮的新代币,我们需要让它变得华丽起来。我们将使用Token Metadata Program来实现这一点,以下是生成的账户的样子:

这被称为元数据账户。它可以存储关于特定代币铸造账户的各种信息。你会注意到有一个 URI (统一资源标识符)属性 - 这指向一个链外的 JSON 文件,主要用于非同质化代币(NFT)。由于链外部分不受链上费用的限制,你可以存储高质量的图形和其他大型数据对象。

元数据账户有很多值,你不需要了解其中大部分。我们将在需要时深入了解相关部分。现在,我们只关心离链部分,这是我们制作Pizzacoin所需的第一件事。

🖼 代币标准

off-chain部分遵循Metaplex代币标准,基本上是一种格式,你需要按照这种格式来实现不同类型代币的元数据。我们在元数据账户的链上部分的 Token Standard 字段中告诉网络上的所有应用程序我们的代币类型。我们的选项有:

  • NonFungible :一种带有主版本的非同质化代币(NFTs)。
  • FungibleAsset :具有元数据和属性的令牌,有时也被称为半可替代令牌(例如游戏物品)。
  • Fungible :具有简单元数据的代币。(像USDC或SOL这样的常规代币)
  • NonFungibleEdition :一个具有Edition账户的非同质化代币(从Master版中打印出来的,类似于100个中的1个)。

Metaplex Token标准在整个行业中被广泛接受。各种应用程序、交易所和钱包都希望令牌符合该标准。Token标准由Token元数据程序自动设置,无法手动更新。以下是它如何确定如何应用正确的标准:

  • 如果令牌拥有主版本账户,则为 NonFungible
  • 如果令牌具有Edition账户,则为 NonFungibleEdition
  • 如果代币没有(主)版账户(确保其供应量可以大于1)并且使用零位小数,那么它是一个 FungibleAsset
  • 如果代币没有(主)版账户(确保其供应量可以大于1)并且使用至少一位小数,那么它是一个 Fungible

你现在可以忽略“Master Edition”是什么意思,Pizzacoin是完全可替代的,所以我们将专注于 Fungible 代币。

🧰 Metaplex SDK

欢迎来到Solana上最实用的SDK之一。如果你曾经在Solana上铸造过NFT,那么你很可能在不知情的情况下使用了Metaplex SDK。我们将使用 @metaplex-foundation/js@metaplex-foundation/mpl-token-metadata 库来创建与我们的代币铸造相关联的元数据账户。是时候给Pizzacoin一个身份了。

我们将从链下部分开始,只有在准备就绪后,我们才会继续创建代币元数据账户。

一般的工作流程将是:

    1. 安装Metaplex SDK - 你可能会使用现有的密钥对
    1. 上传一个图像作为标志 - 我们将使用本地文件,但SDK也支持从浏览器上传
    1. 上传链下元数据(以及您上传的图像的URI),您现在可以开始进行链上操作了。
    1. 派生元数据账户PDA(蛋)
    1. 创建链上的Token元数据账户 - 指令、交易等。

感觉不确定?让我们用一些代码来战胜这些感觉吧 🤺

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/index.html b/docs/Solana-Co-Learn/module3/index.html index 6a4f6bf17..4ea1cb196 100644 --- a/docs/Solana-Co-Learn/module3/index.html +++ b/docs/Solana-Co-Learn/module3/index.html @@ -3,15 +3,15 @@ -Module3: Solana Module3 | All in One Solana - - - +Module3: Solana Module3 | All in One Solana + + +
-

Module3: Solana Module3

Rust简介

  • 🎬 与Gage一起进行节目开发
  • ✨ 魔法互联网计算机
  • 📝 你好,世界
  • 与您部署的程序进行交互

原生SOLANA开发

  • The Rust layer cake
  • 构建一个电影评论程序
  • 使用Gage进行状态管理
  • 状态管理

安全和验证

  • 安全与保障
  • 错误处理和数据验证
  • Secure our program

NFT质押

  • 质押的工作原理
  • 建立一个NFT质押计划
- - +

Module3: Solana Module3

Rust简介

  • 🎬 与Gage一起进行节目开发
  • ✨ 魔法互联网计算机
  • 📝 你好,世界
  • 与您部署的程序进行交互

原生SOLANA开发

  • The Rust layer cake
  • 构建一个电影评论程序
  • 使用Gage进行状态管理
  • 状态管理

安全和验证

  • 安全与保障
  • 错误处理和数据验证
  • Secure our program

NFT质押

  • 质押的工作原理
  • 建立一个NFT质押计划
+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/index.html b/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/index.html index b1f22579f..5e47461f3 100644 --- a/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/index.html +++ b/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/index.html @@ -3,15 +3,15 @@ -📝 你好,世界 | All in One Solana - - - +📝 你好,世界 | All in One Solana + + +
-

📝 你好,世界

我们将在游乐场上制作一个简单的Hello World程序。它只会在交易日志中记录一条消息,哈哈。我们将在游乐场上制作一个简单的Hello World程序。它只会在交易日志中记录一条消息,哈哈。

📦 Rust模块系统

就像我们对待客户一样,我们将使用一系列的库,这样我们就不必写大量的样板代码。Rust使用被统称为“模块系统”的方式来组织代码。这与Node.js中的模块或C++中的命名空间非常相似。

下面是一个方便的可视化:

srouce

这是一个方便的可视化工具:

这个系统的三个部分是:

  • package - 一个包含一组木箱以及用于指定元数据和包之间依赖关系的清单文件的包。将其视为Node.js中的 package.json
  • Crate(板条箱)- 一个crate(板条箱)可以是一个库(library)或一个可执行程序(executable program)。一个crate(板条箱)的源代码通常被细分为多个模块(modules)。这就像一个节点模块(node module)。
  • module - 模块将代码分割成逻辑单元,为组织、作用域和路径的隐私提供了独立的命名空间。这些基本上是单独的文件和文件夹。

🛣 路径和范围

就像你可以在React中重用组件和在Node中重用模块一样,Crate模块可以在项目中被重复使用。模块内部的项目比较棘手的地方在于我们需要知道它们的路径才能引用它们。

将箱子结构看作一棵树,其中箱子是树的基础,模块是树枝,每个模块可以有子模块或者额外的分支。

我们需要的其中一件事是 AccountInfo 子模块中的 account_info 结构体,以下是它的样子:

struct是一种自定义的数据类型,顺便说一下。把它想象成一种自定义的原始数据类型,就像字符串或整数一样。与仅存储单个值不同,struct可以包含多个值。

在Rust中, :: 就像 ./ 一样。因此,要引用 AccountInfo 结构体,我们可以这样写: :: 。

use solana_program::account_info::AccountInfo;
  • 基础箱子是 solana_program
  • solana_program 包含一个名为 account_info 的模块
  • account_info 包含一个名为 AccountInfo 的结构体

在Rust文件的顶部经常会看到一系列的 use 命令,就像 importrequire 语句一样。

我们还需要一些其他的项目。我们可以使用花括号从单个模块中引入多个项目,有点像JS中的解构。

use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg
};

到目前为止,非常直接了当。 AccountInfo 结构体是 Solana 账户数据的通用描述符 - 它定义了账户应具备的所有属性。

如果你以前从未使用过像TypeScript或Java这样的静态类型语言,你可能会想知道为什么我们要导入像 PubKeyAccountInfo 这样的“数据类型”。简而言之,在Rust中,我们需要在声明变量时定义其类型。这有助于我们在编译或运行代码之前捕捉错误。因此,当你的程序在区块链上执行交易时,它不会崩溃,而是在开发过程中崩溃,这样你就可以更快地准备好可运行的代码 :)

我会在需要的时候处理剩下的这些项目。现在继续前进!

🏁 Solana程序入口

回想一下我们的TypeScript客户端。我们在 index.tsmain 中有一个函数,它是我们脚本的入口点。同样的方法也适用于Rust脚本!只不过我们不仅仅是编写任何Rust脚本,我们正在编写一个将在Solana上运行的脚本。

这就是我们的第二个 use 语句的作用 - 它引入了 entrypoint! 宏:一种特殊类型的 main 函数,Solana将用它来执行我们的指令。

宏就像代码的快捷方式 - 它们是一种编写代码的方式,可以编写代码。在编译时, entrypoint!(process_instruction); 会展开为一堆样板代码,有点像模板。你不需要知道宏的工作原理,但你可以在这里阅读更多相关信息。

我们的入口函数将调用 process_instruction ,所以这是我们的 lib.rs 文件目前应该是这样的:

use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg
};

entrypoint!(process_instruction);

现在是关于 process_instruction 函数的部分。

🔨 Rust中的函数

function与Typescript中的function非常相似 - 只需要参数、类型和返回类型。将此添加到 entrypoint! 宏下面:

pub fn process_instruction(
//Arguments and their types
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
// The return type (i.e. what data type the function returns)
) -> ProgramResult{
// Leave the body empty for now :)
}

我们的 process_instruction 函数需要以下参数:

  • program_id :程序账户的公钥。用于验证程序是否由正确的账户调用。类型为 &Pubkey
  • accounts :指令所涉及的账户。必须为类型 &[AccountInfo]
  • instruction_data :我们交易中的8位指令数据。必须为 &[u8] 类型。

[] 的意思是 AccountInfou8 是“切片”类型 - 它们类似于长度未知的数组。我们不称它们为数组,因为它们更低级 - 在Rust中,切片是指向一块内存块的指针 🤯

我们稍后会处理 & :)

📜 Result 枚举

是时候来介绍我们的第三个 use 语句 - ProgramResult 了。这是一个Rust枚举,代表了Solana程序执行的结果。

现在尝试通过点击左侧栏上的“构建”按钮来编译脚本。你应该会得到一个警告和一个错误。这是错误信息:

error[E0308]: mismatched types
--> /src/lib.rs:12:6
|
7 | pub fn process_instruction(
| ------------------- implicitly returns `()` as its body has no tail or `return` expression
...
12 | ) -> ProgramResult {
| ^^^^^^^^^^^^^ expected enum `Result`, found `()`
|
= note: expected enum `Result<(), ProgramError>`
found unit type `()`

我想花点时间赞赏一下Rust错误信息有多么美丽。它准确地告诉你出了什么问题,问题出在哪里以及如何修复。我想知道如果JavaScript也能这么友好,我会少掉多少头发呢 😢

由于我们的函数体为空,它会隐式地返回 () - 空元组。错误消息表示它期望 Result ,但我们声明的返回类型是 ProgramResult 。嗯,这里发生了什么呢🤔?

这是因为Solana的 ProgramResult 类型使用了Rust的 Result 类型:

pub type ProgramResult = Result<(), ProgramError>;

Result 是一个标准库类型,表示两个离散的结果:

  • 成功( Ok )或
  • 失败 ( Err )
pub enum Result<T, E> {
Ok(T),
Err(E),
}

把它想象成HTTP错误代码——200是 Ok ,404是 Err 。所以当我们返回 ProgramResult 时,我们是在说我们的函数可以返回 () (一个空值)表示成功,或者使用自定义的 ProgramError 枚举告诉我们出了什么问题。非常有用!

这是我们需要做的全部事情:

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult{
// Return Ok() for success
Ok(())
}

🚀 部署你的第一个程序

我们的程序几乎完成了!唯一缺少的就是实际上说出“Hello World”,我们可以使用 msg! 宏来实现。我们暂时不会对指令数据做任何操作,为了避免“未使用的变量”警告,只需在变量名前加下划线即可。

这是完整的 process_instruction 函数的样子:

pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8]
) -> ProgramResult{
msg!("Hello World!");
Ok(())
}

如果你点击构建,你应该在控制台上看到一个绿色的“构建成功”消息。恭喜!你已经编写了你的第一个Solana程序🎉

在这个游乐场上部署非常简单。切换到左上角的“构建和部署”选项卡,在“资源管理器”图标下方,点击“部署”按钮。

- - +

📝 你好,世界

我们将在游乐场上制作一个简单的Hello World程序。它只会在交易日志中记录一条消息,哈哈。我们将在游乐场上制作一个简单的Hello World程序。它只会在交易日志中记录一条消息,哈哈。

📦 Rust模块系统

就像我们对待客户一样,我们将使用一系列的库,这样我们就不必写大量的样板代码。Rust使用被统称为“模块系统”的方式来组织代码。这与Node.js中的模块或C++中的命名空间非常相似。

下面是一个方便的可视化:

srouce

这是一个方便的可视化工具:

这个系统的三个部分是:

  • package - 一个包含一组木箱以及用于指定元数据和包之间依赖关系的清单文件的包。将其视为Node.js中的 package.json
  • Crate(板条箱)- 一个crate(板条箱)可以是一个库(library)或一个可执行程序(executable program)。一个crate(板条箱)的源代码通常被细分为多个模块(modules)。这就像一个节点模块(node module)。
  • module - 模块将代码分割成逻辑单元,为组织、作用域和路径的隐私提供了独立的命名空间。这些基本上是单独的文件和文件夹。

🛣 路径和范围

就像你可以在React中重用组件和在Node中重用模块一样,Crate模块可以在项目中被重复使用。模块内部的项目比较棘手的地方在于我们需要知道它们的路径才能引用它们。

将箱子结构看作一棵树,其中箱子是树的基础,模块是树枝,每个模块可以有子模块或者额外的分支。

我们需要的其中一件事是 AccountInfo 子模块中的 account_info 结构体,以下是它的样子:

struct是一种自定义的数据类型,顺便说一下。把它想象成一种自定义的原始数据类型,就像字符串或整数一样。与仅存储单个值不同,struct可以包含多个值。

在Rust中, :: 就像 ./ 一样。因此,要引用 AccountInfo 结构体,我们可以这样写: :: 。

use solana_program::account_info::AccountInfo;
  • 基础箱子是 solana_program
  • solana_program 包含一个名为 account_info 的模块
  • account_info 包含一个名为 AccountInfo 的结构体

在Rust文件的顶部经常会看到一系列的 use 命令,就像 importrequire 语句一样。

我们还需要一些其他的项目。我们可以使用花括号从单个模块中引入多个项目,有点像JS中的解构。

use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg
};

到目前为止,非常直接了当。 AccountInfo 结构体是 Solana 账户数据的通用描述符 - 它定义了账户应具备的所有属性。

如果你以前从未使用过像TypeScript或Java这样的静态类型语言,你可能会想知道为什么我们要导入像 PubKeyAccountInfo 这样的“数据类型”。简而言之,在Rust中,我们需要在声明变量时定义其类型。这有助于我们在编译或运行代码之前捕捉错误。因此,当你的程序在区块链上执行交易时,它不会崩溃,而是在开发过程中崩溃,这样你就可以更快地准备好可运行的代码 :)

我会在需要的时候处理剩下的这些项目。现在继续前进!

🏁 Solana程序入口

回想一下我们的TypeScript客户端。我们在 index.tsmain 中有一个函数,它是我们脚本的入口点。同样的方法也适用于Rust脚本!只不过我们不仅仅是编写任何Rust脚本,我们正在编写一个将在Solana上运行的脚本。

这就是我们的第二个 use 语句的作用 - 它引入了 entrypoint! 宏:一种特殊类型的 main 函数,Solana将用它来执行我们的指令。

宏就像代码的快捷方式 - 它们是一种编写代码的方式,可以编写代码。在编译时, entrypoint!(process_instruction); 会展开为一堆样板代码,有点像模板。你不需要知道宏的工作原理,但你可以在这里阅读更多相关信息。

我们的入口函数将调用 process_instruction ,所以这是我们的 lib.rs 文件目前应该是这样的:

use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg
};

entrypoint!(process_instruction);

现在是关于 process_instruction 函数的部分。

🔨 Rust中的函数

function与Typescript中的function非常相似 - 只需要参数、类型和返回类型。将此添加到 entrypoint! 宏下面:

pub fn process_instruction(
//Arguments and their types
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
// The return type (i.e. what data type the function returns)
) -> ProgramResult{
// Leave the body empty for now :)
}

我们的 process_instruction 函数需要以下参数:

  • program_id :程序账户的公钥。用于验证程序是否由正确的账户调用。类型为 &Pubkey
  • accounts :指令所涉及的账户。必须为类型 &[AccountInfo]
  • instruction_data :我们交易中的8位指令数据。必须为 &[u8] 类型。

[] 的意思是 AccountInfou8 是“切片”类型 - 它们类似于长度未知的数组。我们不称它们为数组,因为它们更低级 - 在Rust中,切片是指向一块内存块的指针 🤯

我们稍后会处理 & :)

📜 Result 枚举

是时候来介绍我们的第三个 use 语句 - ProgramResult 了。这是一个Rust枚举,代表了Solana程序执行的结果。

现在尝试通过点击左侧栏上的“构建”按钮来编译脚本。你应该会得到一个警告和一个错误。这是错误信息:

error[E0308]: mismatched types
--> /src/lib.rs:12:6
|
7 | pub fn process_instruction(
| ------------------- implicitly returns `()` as its body has no tail or `return` expression
...
12 | ) -> ProgramResult {
| ^^^^^^^^^^^^^ expected enum `Result`, found `()`
|
= note: expected enum `Result<(), ProgramError>`
found unit type `()`

我想花点时间赞赏一下Rust错误信息有多么美丽。它准确地告诉你出了什么问题,问题出在哪里以及如何修复。我想知道如果JavaScript也能这么友好,我会少掉多少头发呢 😢

由于我们的函数体为空,它会隐式地返回 () - 空元组。错误消息表示它期望 Result ,但我们声明的返回类型是 ProgramResult 。嗯,这里发生了什么呢🤔?

这是因为Solana的 ProgramResult 类型使用了Rust的 Result 类型:

pub type ProgramResult = Result<(), ProgramError>;

Result 是一个标准库类型,表示两个离散的结果:

  • 成功( Ok )或
  • 失败 ( Err )
pub enum Result<T, E> {
Ok(T),
Err(E),
}

把它想象成HTTP错误代码——200是 Ok ,404是 Err 。所以当我们返回 ProgramResult 时,我们是在说我们的函数可以返回 () (一个空值)表示成功,或者使用自定义的 ProgramError 枚举告诉我们出了什么问题。非常有用!

这是我们需要做的全部事情:

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult{
// Return Ok() for success
Ok(())
}

🚀 部署你的第一个程序

我们的程序几乎完成了!唯一缺少的就是实际上说出“Hello World”,我们可以使用 msg! 宏来实现。我们暂时不会对指令数据做任何操作,为了避免“未使用的变量”警告,只需在变量名前加下划线即可。

这是完整的 process_instruction 函数的样子:

pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8]
) -> ProgramResult{
msg!("Hello World!");
Ok(())
}

如果你点击构建,你应该在控制台上看到一个绿色的“构建成功”消息。恭喜!你已经编写了你的第一个Solana程序🎉

在这个游乐场上部署非常简单。切换到左上角的“构建和部署”选项卡,在“资源管理器”图标下方,点击“部署”按钮。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/introduction-to-rust/index.html b/docs/Solana-Co-Learn/module3/introduction-to-rust/index.html index e08c9aaf2..c2176c88a 100644 --- a/docs/Solana-Co-Learn/module3/introduction-to-rust/index.html +++ b/docs/Solana-Co-Learn/module3/introduction-to-rust/index.html @@ -3,15 +3,15 @@ -Rust简介 | All in One Solana - - - +Rust简介 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/index.html b/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/index.html index 696d8ca18..87e3794c6 100644 --- a/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/index.html +++ b/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/index.html @@ -3,15 +3,15 @@ -👋 与您部署的程序进行交互 | All in One Solana - - - +👋 与您部署的程序进行交互 | All in One Solana + + +
-

👋 与您部署的程序进行交互

我们将在游乐场上创建一个简单的Hello World程序。它只会在交易日志中记录一条消息。现在我们已经部署了我们的程序,我们可以与之交互。在之前的部分中,你已经做过很多次了!你可以像以前一样create-solana-client设置一个本地客户端,也可以使用游乐场。

我会选择操场,因为那里更快 :P

首先,您需要获取您的程序ID。您可以在“程序凭证”选项卡下找到它:

现在让我们来看一下我们的TS脚本。回到“资源管理器”选项卡,然后在左侧的 Client 部分下打开 client.ts 。以下是我们所需要的内容:

const programId = new web3.PublicKey(
"REPLACE_WITH_YOUR_PROGRAM_ID"
);

async function sayHello(
payer: web3.Keypair
): Promise<web3.TransactionSignature> {
const transaction = new web3.Transaction();

const instruction = new web3.TransactionInstruction({
keys: [], // We're not using any accounts yet
programId,
// No need to add data here!
});

transaction.add(instruction);

const transactionSignature = await web3.sendAndConfirmTransaction(
pg.connection,
transaction,
[payer]
);

return transactionSignature;
}

async function main() {
const transactionSignature = await sayHello(pg.wallet.keypair);

console.log(
`Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
);
}

main();

这应该看起来很熟悉。在游乐场中,与密钥对的访问方式和与开发网络的连接方式是两个变化的要点。全局可用的 pg 对象包含了这两个要素。

当你运行这个脚本时,你应该在控制台中看到一条已记录的交易。打开链接并向下滚动,你会看到你的消息!

🚢 船舶挑战

现在轮到你独立构建一些东西了。由于我们从非常简单的程序开始,你所创建的程序几乎与我们刚刚创建的程序完全相同。尽量达到能够独立编写代码而无需参考之前的代码的程度,所以请尽量不要在这里复制粘贴。

在Solana Playground中编写一个新的程序,使用msg!宏将自己的消息打印到程序日志中。像我们在演示中所做的那样构建和部署你的程序。编写一个客户端脚本来调用你新部署的程序,然后使用Solana Explorer来检查你的消息是否已经打印在程序日志中。

除了创建一个简单的程序之外,花点时间去尝试一下Rust也是值得的。查看一下Rust书籍,并使用Rust Playground来更好地了解这门语言的工作原理,这样当我们深入探讨更具挑战性的Solana程序主题时,你就能走在前面。

也许可以让程序使用一组词语的组合来随机生成登出时的消息,而不是固定的消息?

- - +

👋 与您部署的程序进行交互

我们将在游乐场上创建一个简单的Hello World程序。它只会在交易日志中记录一条消息。现在我们已经部署了我们的程序,我们可以与之交互。在之前的部分中,你已经做过很多次了!你可以像以前一样create-solana-client设置一个本地客户端,也可以使用游乐场。

我会选择操场,因为那里更快 :P

首先,您需要获取您的程序ID。您可以在“程序凭证”选项卡下找到它:

现在让我们来看一下我们的TS脚本。回到“资源管理器”选项卡,然后在左侧的 Client 部分下打开 client.ts 。以下是我们所需要的内容:

const programId = new web3.PublicKey(
"REPLACE_WITH_YOUR_PROGRAM_ID"
);

async function sayHello(
payer: web3.Keypair
): Promise<web3.TransactionSignature> {
const transaction = new web3.Transaction();

const instruction = new web3.TransactionInstruction({
keys: [], // We're not using any accounts yet
programId,
// No need to add data here!
});

transaction.add(instruction);

const transactionSignature = await web3.sendAndConfirmTransaction(
pg.connection,
transaction,
[payer]
);

return transactionSignature;
}

async function main() {
const transactionSignature = await sayHello(pg.wallet.keypair);

console.log(
`Transaction: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
);
}

main();

这应该看起来很熟悉。在游乐场中,与密钥对的访问方式和与开发网络的连接方式是两个变化的要点。全局可用的 pg 对象包含了这两个要素。

当你运行这个脚本时,你应该在控制台中看到一条已记录的交易。打开链接并向下滚动,你会看到你的消息!

🚢 船舶挑战

现在轮到你独立构建一些东西了。由于我们从非常简单的程序开始,你所创建的程序几乎与我们刚刚创建的程序完全相同。尽量达到能够独立编写代码而无需参考之前的代码的程度,所以请尽量不要在这里复制粘贴。

在Solana Playground中编写一个新的程序,使用msg!宏将自己的消息打印到程序日志中。像我们在演示中所做的那样构建和部署你的程序。编写一个客户端脚本来调用你新部署的程序,然后使用Solana Explorer来检查你的消息是否已经打印在程序日志中。

除了创建一个简单的程序之外,花点时间去尝试一下Rust也是值得的。查看一下Rust书籍,并使用Rust Playground来更好地了解这门语言的工作原理,这样当我们深入探讨更具挑战性的Solana程序主题时,你就能走在前面。

也许可以让程序使用一组词语的组合来随机生成登出时的消息,而不是固定的消息?

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/index.html b/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/index.html index 84d63146b..390a869e9 100644 --- a/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/index.html +++ b/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/index.html @@ -3,15 +3,15 @@ -✨ 魔法互联网计算机 | All in One Solana - - - +✨ 魔法互联网计算机 | All in One Solana + + +
-

✨ 魔法互联网计算机

我们将在游乐场上制作一个简单的Hello World程序。它只会在交易日志中记录一条消息,哈哈哈。到目前为止,我们已经做了很多很酷的事情。我们建立了各种类型的客户端,创建了NFT收藏品,铸造了SPL代币,甚至构建了用户界面,让其他人与它们进行交互。然而,到目前为止,我们所做的一切都是基于现有的程序。

你现在已经准备好成为一名全栈Solana开发者,并学习如何编写自己的程序了。

Solana的能力可以运行任意可执行代码,这也是它如此强大的一部分。Solana程序,类似于其他区块链环境中的“智能合约”,实际上是Solana生态系统的支柱。这意味着Solana基本上是一个任何互联网用户都可以访问和运行的通用计算机。你可能会想知道为什么这么重要,但它确实并不感觉如此。

回想一下,当你的电脑没有互联网接入时的情景。如果你和我一样是婴儿潮一代,那可能是大约15年前,当时永久互联网还不普及。或者可能是因为你一直在玩视频游戏,所以你妈妈关闭了无线网络。当没有连接到全球其他计算机时,你的电脑感觉就不那么强大了。

这正是不连接Solana会感觉如何。区块链网络是互联网的下一个演进阶段,这就是为什么整个事情被称为“Web 3.0”的原因。能够安全且无需许可地运行可重复的代码,打开了全新的可能性世界。

它还没有像“静态类型”语言那样有魔力,因为魔力仍然由像你这样的人构建。随着开发人员和创作者构思和部署新程序,程序的集合每天都在增长。

🤔 Rust 是什么鬼东西

Solana的程序是用Rust编写的,它是一种类似于C的低级编程语言,非常快速。在我们开始传统的“Hello World”程序之前,我想稍微谈一下为什么Rust被认为是如此困难。

简而言之:Rust感觉困难是因为它有很多规则。想想那些学习曲线陡峭的视频游戏——DOTA、英雄联盟、星际争霸(甚至是国际象棋或CSGO哈哈)。这些游戏有数百个独特的角色/物品/能力,每个都有自己的规则和互动方式。要在这些游戏中取得胜利,你必须学会所有的规则,并了解它们如何相互作用。

Rust就是这样的。它是一种非常有主见的语言,迫使你以不同的方式思考你的代码。它不是一种你可以随便拿起来写程序的语言 - 它是一种你必须学习和理解的语言。

这并不是要吓唬你——学习Rust并不像学习DOTA那么难💀。我只是想告诉你我们已经弄清楚了。Rust可以非常有趣,只是需要比你以往习惯的更多努力 :)

就像玩电子游戏一样,我们会一次只专注于一件事情,从简单的开始,逐渐攻克困难的难题,不断提升自己的等级⚔️。

我们将从我们构建 Hello World 程序所需的最基本概念开始

🛹 Solana Playground

我们将在Solana Playground上开始我们的程序开发之旅。这是一个基于浏览器的集成开发环境,它将处理所有的设置要求,让我们专注于Rust。

打开它并使用原生框架创建一个新项目 - 我们保持原汁原味🌼。Anchor是一个用于在Solana上构建的Rust框架,有点像React对于Web的作用。稍后我们会学习如何使用它进行构建,现在先使用原生框架。

你应该得到一个带有一种高级的Hello World程序的lib.rs文件。摒弃它,我们要做一个更简单的。

在这里,你最不想做的事情就是设置一个游乐场钱包。你会在左下角看到一个“未连接”按钮。

点击它,它会为您生成一个Solana钱包,并用devnet SOL资金充值。如果您愿意,可以保存密钥对,这在测试特定密钥对部署的程序时很有帮助。我只会构建一个简单的程序,所以不需要它 :P

是时候开始写一些 Rust 代码了!🦀

- - +

✨ 魔法互联网计算机

我们将在游乐场上制作一个简单的Hello World程序。它只会在交易日志中记录一条消息,哈哈哈。到目前为止,我们已经做了很多很酷的事情。我们建立了各种类型的客户端,创建了NFT收藏品,铸造了SPL代币,甚至构建了用户界面,让其他人与它们进行交互。然而,到目前为止,我们所做的一切都是基于现有的程序。

你现在已经准备好成为一名全栈Solana开发者,并学习如何编写自己的程序了。

Solana的能力可以运行任意可执行代码,这也是它如此强大的一部分。Solana程序,类似于其他区块链环境中的“智能合约”,实际上是Solana生态系统的支柱。这意味着Solana基本上是一个任何互联网用户都可以访问和运行的通用计算机。你可能会想知道为什么这么重要,但它确实并不感觉如此。

回想一下,当你的电脑没有互联网接入时的情景。如果你和我一样是婴儿潮一代,那可能是大约15年前,当时永久互联网还不普及。或者可能是因为你一直在玩视频游戏,所以你妈妈关闭了无线网络。当没有连接到全球其他计算机时,你的电脑感觉就不那么强大了。

这正是不连接Solana会感觉如何。区块链网络是互联网的下一个演进阶段,这就是为什么整个事情被称为“Web 3.0”的原因。能够安全且无需许可地运行可重复的代码,打开了全新的可能性世界。

它还没有像“静态类型”语言那样有魔力,因为魔力仍然由像你这样的人构建。随着开发人员和创作者构思和部署新程序,程序的集合每天都在增长。

🤔 Rust 是什么鬼东西

Solana的程序是用Rust编写的,它是一种类似于C的低级编程语言,非常快速。在我们开始传统的“Hello World”程序之前,我想稍微谈一下为什么Rust被认为是如此困难。

简而言之:Rust感觉困难是因为它有很多规则。想想那些学习曲线陡峭的视频游戏——DOTA、英雄联盟、星际争霸(甚至是国际象棋或CSGO哈哈)。这些游戏有数百个独特的角色/物品/能力,每个都有自己的规则和互动方式。要在这些游戏中取得胜利,你必须学会所有的规则,并了解它们如何相互作用。

Rust就是这样的。它是一种非常有主见的语言,迫使你以不同的方式思考你的代码。它不是一种你可以随便拿起来写程序的语言 - 它是一种你必须学习和理解的语言。

这并不是要吓唬你——学习Rust并不像学习DOTA那么难💀。我只是想告诉你我们已经弄清楚了。Rust可以非常有趣,只是需要比你以往习惯的更多努力 :)

就像玩电子游戏一样,我们会一次只专注于一件事情,从简单的开始,逐渐攻克困难的难题,不断提升自己的等级⚔️。

我们将从我们构建 Hello World 程序所需的最基本概念开始

🛹 Solana Playground

我们将在Solana Playground上开始我们的程序开发之旅。这是一个基于浏览器的集成开发环境,它将处理所有的设置要求,让我们专注于Rust。

打开它并使用原生框架创建一个新项目 - 我们保持原汁原味🌼。Anchor是一个用于在Solana上构建的Rust框架,有点像React对于Web的作用。稍后我们会学习如何使用它进行构建,现在先使用原生框架。

你应该得到一个带有一种高级的Hello World程序的lib.rs文件。摒弃它,我们要做一个更简单的。

在这里,你最不想做的事情就是设置一个游乐场钱包。你会在左下角看到一个“未连接”按钮。

点击它,它会为您生成一个Solana钱包,并用devnet SOL资金充值。如果您愿意,可以保存密钥对,这在测试特定密钥对部署的程序时很有帮助。我只会构建一个简单的程序,所以不需要它 :P

是时候开始写一些 Rust 代码了!🦀

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/index.html b/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/index.html index 2523aa753..8d385d130 100644 --- a/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/index.html +++ b/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/index.html @@ -3,16 +3,16 @@ -🎥 构建一个电影评论程序 | All in One Solana - - - +🎥 构建一个电影评论程序 | All in One Solana + + +
-

🎥 构建一个电影评论程序

还记得我们在第一节互动的电影评论节目吗?我们要在这里继续开发它。随意评论其他东西,不一定非得是电影,我又不是你爸爸。

回到操场(上一节课的那个,不是中学的那个),并开始一个新项目。我们将从基本结构开始 lib.rs

use solana_program::{
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg,
account_info::AccountInfo,
};

entrypoint!(process_instruction);

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {

Ok(())
}

到目前为止都是一如既往的。与记事程序一样,我们将从定义指令结构和创建反序列化逻辑开始。

🔪 反序列化指令数据

我们将在一个名为 instruction.rs 的新文件中进行此操作。

use borsh::{BorshDeserialize};
use solana_program::{program_error::ProgramError};

pub enum MovieInstruction {
AddMovieReview {
title: String,
rating: u8,
description: String
}
}

#[derive(BorshDeserialize)]
struct MovieReviewPayload {
title: String,
rating: u8,
description: String
}

我们需要引入的只有 BorshDeserialize 宏和 ProgramError 枚举。

虽然我们只有一种指令类型,但我们仍然会使用枚举。以后我们可能会决定添加更多的指令 :)

你可能会想为什么我们需要在有效载荷中指定类型。这些类型告诉Borsh在哪里分割字节。在切割之前,得先知道香肠有多长,记住了吗?

我们在这里需要的最后一件事情是为 MovieInstruction 枚举添加实现。在枚举定义下面添加这个。

impl MovieInstruction {
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {

let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;

let payload = MovieReviewPayload::try_from_slice(rest).unwrap();

Ok(match variant {
0 => Self::AddMovieReview {
title: payload.title,
rating: payload.rating,
description: payload.description },
_ => return Err(ProgramError::InvalidInstructionData)
})
}
}

你已经知道这里发生的一切!我们正在解析指令数据并返回枚举的正确变体。

注意在我们分割第一个字节时的 ?

let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;

如果 unpack 的结果是错误的,这是一种返回错误并退出 unpack 函数的简写方式。就像一个简单的try/catch。这是Rust中常见的模式,你会经常看到它。

let payload = MovieReviewPayload::try_from_slice(rest).unwrap();

我也想更深入地探讨一下: .unwrap(); 在Rust中,“unwrap”意味着“给我计算的结果,如果出现错误,就会发生恐慌并停止程序。”你可能会想:“嗯,但为什么我们需要从函数的结果中返回东西呢?难道 try_from_slice() 函数不会返回我们想要的吗?”

不是的。Rust有 Option 类型:一种使用Rust的类型系统来表示可能的缺失的方式。这与其他语言中的 null 不同。 Option 是一种类型,可以是 SomeNoneSome 是一个值, None 是一个值的缺失。为什么?因为有时候你没有一个值,这是可以接受的。从文档中:

将缺席的可能性编码到类型系统中是一个重要的概念,因为它会迫使编译器强制程序员处理这种缺席。

Rust让你成为一个更好的开发者!现在你又了解了Rust蛋糕的另一个小部分🍰

👀 添加指令到程序中

这里的最后一部分是将指令引入程序中。我们将在 lib.rs 中完成这个步骤。

pub mod instruction;
use instruction::{MovieInstruction};

如果你改变了枚举名称,请确保更新导入

现在我们只需将指令数据记录到控制台。在 process_instruction 函数之后添加这段代码。

pub fn add_movie_review(
program_id: &Pubkey,
accounts: &[AccountInfo],
title: String,
rating: u8,
description: String
) -> ProgramResult {

msg!("Adding movie review...");
msg!("Title: {}", title);
msg!("Rating: {}", rating);
msg!("Description: {}", description);

Ok(())
}

现在我们可以更新 process_instruction 函数,使用 unpackadd_movie_review 函数:

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {

let instruction = MovieInstruction::unpack(instruction_data)?;

match instruction {
MovieInstruction::AddMovieReview { title, rating, description } => {
add_movie_review(program_id, accounts, title, rating, description)
}
}
}

我们在这里所做的只是解析指令数据,然后使用正确的参数调用 add_movie_review 函数。

我们的程序现在已经完成了!确保你点击部署按钮,并从游乐场复制程序ID。

如果你觉得这有点令人失望,那是因为我们在上一课已经讲解了每个部分。让我们尝试使用客户端将电影评论添加到我们的程序中。

提交电影评论

我们飞快地前进着,咱们走吧!

不需要从头开始写脚本,我相信你知道怎么做 :)

这是如何设置一个完整的脚本,包括你所需的一切:

git clone https://github.com/buildspace/solana-movie-client
cd solana-movie-client
npm install

打开 src/index.js 并将第94行的程序ID更新为从playground复制的ID。如果你对程序进行了任何更改,这里也需要更新客户端。

在终端中输入 npm start ,然后你应该会得到一个资源管理器链接。点击那个链接,然后向下滚动到程序指令日志,你应该能看到你的电影评论!

轻松愉快,我们能搞定的,出发!

🚢 船舶挑战

对于本课程的挑战,尝试复制学生介绍程序。

该程序接收用户的姓名和短信作为指令数据,并创建一个账户来将数据存储在区块链上。

利用你在本课程中学到的知识,构建一个学生介绍程序,使得当程序被调用时,能够将用户提供的姓名和信息打印到程序日志中。

解决方案代码 -你可以通过构建这个前端并在Solana Explorer上检查程序日志来测试你的程序。记得用你部署的程序ID替换前端代码中的ID。

如果可以的话,尽量独立完成这个任务!但如果遇到困难,可以参考解决方案代码

我相信你。

- - +

🎥 构建一个电影评论程序

还记得我们在第一节互动的电影评论节目吗?我们要在这里继续开发它。随意评论其他东西,不一定非得是电影,我又不是你爸爸。

回到操场(上一节课的那个,不是中学的那个),并开始一个新项目。我们将从基本结构开始 lib.rs

use solana_program::{
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg,
account_info::AccountInfo,
};

entrypoint!(process_instruction);

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {

Ok(())
}

到目前为止都是一如既往的。与记事程序一样,我们将从定义指令结构和创建反序列化逻辑开始。

🔪 反序列化指令数据

我们将在一个名为 instruction.rs 的新文件中进行此操作。

use borsh::{BorshDeserialize};
use solana_program::{program_error::ProgramError};

pub enum MovieInstruction {
AddMovieReview {
title: String,
rating: u8,
description: String
}
}

#[derive(BorshDeserialize)]
struct MovieReviewPayload {
title: String,
rating: u8,
description: String
}

我们需要引入的只有 BorshDeserialize 宏和 ProgramError 枚举。

虽然我们只有一种指令类型,但我们仍然会使用枚举。以后我们可能会决定添加更多的指令 :)

你可能会想为什么我们需要在有效载荷中指定类型。这些类型告诉Borsh在哪里分割字节。在切割之前,得先知道香肠有多长,记住了吗?

我们在这里需要的最后一件事情是为 MovieInstruction 枚举添加实现。在枚举定义下面添加这个。

impl MovieInstruction {
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {

let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;

let payload = MovieReviewPayload::try_from_slice(rest).unwrap();

Ok(match variant {
0 => Self::AddMovieReview {
title: payload.title,
rating: payload.rating,
description: payload.description },
_ => return Err(ProgramError::InvalidInstructionData)
})
}
}

你已经知道这里发生的一切!我们正在解析指令数据并返回枚举的正确变体。

注意在我们分割第一个字节时的 ?

let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;

如果 unpack 的结果是错误的,这是一种返回错误并退出 unpack 函数的简写方式。就像一个简单的try/catch。这是Rust中常见的模式,你会经常看到它。

let payload = MovieReviewPayload::try_from_slice(rest).unwrap();

我也想更深入地探讨一下: .unwrap(); 在Rust中,“unwrap”意味着“给我计算的结果,如果出现错误,就会发生恐慌并停止程序。”你可能会想:“嗯,但为什么我们需要从函数的结果中返回东西呢?难道 try_from_slice() 函数不会返回我们想要的吗?”

不是的。Rust有 Option 类型:一种使用Rust的类型系统来表示可能的缺失的方式。这与其他语言中的 null 不同。 Option 是一种类型,可以是 SomeNoneSome 是一个值, None 是一个值的缺失。为什么?因为有时候你没有一个值,这是可以接受的。从文档中:

将缺席的可能性编码到类型系统中是一个重要的概念,因为它会迫使编译器强制程序员处理这种缺席。

Rust让你成为一个更好的开发者!现在你又了解了Rust蛋糕的另一个小部分🍰

👀 添加指令到程序中

这里的最后一部分是将指令引入程序中。我们将在 lib.rs 中完成这个步骤。

pub mod instruction;
use instruction::{MovieInstruction};

如果你改变了枚举名称,请确保更新导入

现在我们只需将指令数据记录到控制台。在 process_instruction 函数之后添加这段代码。

pub fn add_movie_review(
program_id: &Pubkey,
accounts: &[AccountInfo],
title: String,
rating: u8,
description: String
) -> ProgramResult {

msg!("Adding movie review...");
msg!("Title: {}", title);
msg!("Rating: {}", rating);
msg!("Description: {}", description);

Ok(())
}

现在我们可以更新 process_instruction 函数,使用 unpackadd_movie_review 函数:

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {

let instruction = MovieInstruction::unpack(instruction_data)?;

match instruction {
MovieInstruction::AddMovieReview { title, rating, description } => {
add_movie_review(program_id, accounts, title, rating, description)
}
}
}

我们在这里所做的只是解析指令数据,然后使用正确的参数调用 add_movie_review 函数。

我们的程序现在已经完成了!确保你点击部署按钮,并从游乐场复制程序ID。

如果你觉得这有点令人失望,那是因为我们在上一课已经讲解了每个部分。让我们尝试使用客户端将电影评论添加到我们的程序中。

提交电影评论

我们飞快地前进着,咱们走吧!

不需要从头开始写脚本,我相信你知道怎么做 :)

这是如何设置一个完整的脚本,包括你所需的一切:

git clone https://github.com/buildspace/solana-movie-client
cd solana-movie-client
npm install

打开 src/index.js 并将第94行的程序ID更新为从playground复制的ID。如果你对程序进行了任何更改,这里也需要更新客户端。

在终端中输入 npm start ,然后你应该会得到一个资源管理器链接。点击那个链接,然后向下滚动到程序指令日志,你应该能看到你的电影评论!

轻松愉快,我们能搞定的,出发!

🚢 船舶挑战

对于本课程的挑战,尝试复制学生介绍程序。

该程序接收用户的姓名和短信作为指令数据,并创建一个账户来将数据存储在区块链上。

利用你在本课程中学到的知识,构建一个学生介绍程序,使得当程序被调用时,能够将用户提供的姓名和信息打印到程序日志中。

解决方案代码 +你可以通过构建这个前端并在Solana Explorer上检查程序日志来测试你的程序。记得用你部署的程序ID替换前端代码中的ID。

如果可以的话,尽量独立完成这个任务!但如果遇到困难,可以参考解决方案代码

我相信你。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/native-solana-development/index.html b/docs/Solana-Co-Learn/module3/native-solana-development/index.html index 7df775bb2..3c84ab79a 100644 --- a/docs/Solana-Co-Learn/module3/native-solana-development/index.html +++ b/docs/Solana-Co-Learn/module3/native-solana-development/index.html @@ -3,15 +3,15 @@ -原生SOLANA开发 | All in One Solana - - - +原生SOLANA开发 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/native-solana-development/state-management/index.html b/docs/Solana-Co-Learn/module3/native-solana-development/state-management/index.html index 821b82c5d..5325ba9ea 100644 --- a/docs/Solana-Co-Learn/module3/native-solana-development/state-management/index.html +++ b/docs/Solana-Co-Learn/module3/native-solana-development/state-management/index.html @@ -3,17 +3,17 @@ -🤠 状态管理 | All in One Solana - - - +🤠 状态管理 | All in One Solana + + +
-

🤠 状态管理

还记得我们在第一节中互动的电影评论程序吗?我们要在这里构建它。随意评论其他东西,而不仅仅是电影,我不是你爸爸。嘿!准备好成为一位州长了吗?不不,我们不是在做那种类型的状态管理。我们所说的状态是指存储在链上的程序数据。

我们有一个可靠的程序,它接收指令数据并准备进行处理。要执行这些指令,我们需要学习更多关于Rust的知识。

📝 程序状态作为Rust数据类型

Solana保持其速度和效率的一部分原因是程序是无状态的。这意味着您无法更改程序上的数据 - 所有数据都存储在外部账户中,通常是由程序拥有的账户。大多数这些账户是PDA(Program Derived Accounts) - 我们现在将查看它们的数据存储元素,并稍后深入了解其余部分。

就像我们将指令数据转换为Rust类型一样,我们将把程序状态也转换为Rust类型,以便更容易处理。

回想一下 Solana 账户中的 data 字段 - 它存储了一个原始字节数组。我们可以通过序列化和反序列化来表示它在 Rust 类型中的形式。

我们将再次使用borsh macro

数据在传输和存储时以原始字节的形式进行,但在我们希望处理数据时,会将其转换为Rust类型。有道理,对吧?

🏠 空间和租金

是的,Solana也有房东:验证者将区块链的状态存储在他们的机器上。

租金以Lamports支付,Lamport是SOL的最小单位(0.000000001 SOL = 1 Lamport),根据账户占用的空间大小计算。以下是常见类型占用的字节空间的表格:

付房租有两种方式:

  • 按每个时期支付租金。这就像每月支付租金一样 - 只要你继续支付,你就可以继续居住。如果账户没有足够的SOL,它将被重置,数据将丢失。
  • 保持等于2年租金的最低余额。这样账户就免除了租金。这里的逻辑是硬件成本每2年下降50%,所以如果你有足够的SOL支付2年的租金,你就永远不用担心了!

现在要求免租金,所以只有选项#2。这种方法的最大优点是,当您不再需要存储数据时,可以销毁账户并取回您的SOL!区块链上的免费存储(减去交易费用)🥳

为什么要在区块链上租赁呢?嗯,这是一种防止人们创建大量账户却从未使用的方式。这将浪费空间和验证者资源。这个系统是Solana上存储如此廉价的原因之一——与以太坊不同,我的愚蠢的Hello World NFT收藏将被所有验证者永久存储。

你可以在这里阅读更多相关内容,我觉得挺酷的!

📊 计算租金

计算租金很简单 - 有一个很有用的功能可以帮助你。棘手的部分是弄清楚你需要多少空间。

这是我们的超级笔记程序的样子:

// Calculate account size required for struct NoteState
// 4 bytes to store the size of the subsequent dynamic data (string)
// 8 bytes to store the 64 bit interger for the id
let account_len: usize = (4 + title.len()) + (4 + body.len()) + 8;

// Calculate rent required
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(account_len);

我们首先要做的是计算我们存储的数据的总长度。我们可以通过将字符串的长度和8个字节的id相加来实现这一点。

在我们的情况下, titlebody 是动态数据类型(字符串)-它们可以是任意长度。我们使用前4个字节来存储每个项目的长度,因此我们将每个字符串的长度加上4。

然后我们可以使用 Rent::get() 函数来获取账户的租金。轻松愉快!

📜 程序派生地址

我们已经从指令中获取了我们的数据,我们已经计算出我们需要支付多少租金,现在我们需要一个账户来存放它。嗨,PDAs!还记得前端的鸡和蛋问题吗?这里也是一样的!我们将从程序ID和一组种子中推导出账户的地址。

我们将在未来深入探讨PDA的工作原理,但现在你只需要知道 find_program_address 功能,并且只有 program_id 中的程序可以为PDA签名。就像安全存储一样,不需要密码。

🛫 跨程序调用

最后一步是初始化PDA(我们只在最后一步中找到了地址)。我们将使用跨程序调用(CPI)来完成此操作。正如其名称所示,我们将在我们的程序中与Solana网络上的另一个程序进行交互。

CPI可以使用 invokeinvoke_signed 进行

当您不需要签署交易时,使用 invoke 。当您需要签署交易时,使用 invoke_signed 。在我们的情况下,我们是唯一可以为PDA签署的人,因此我们将使用 invoke_signed

这是它的样子。你可能会想:“这是什么鬼东西” - 别担心,我们接下来会练习,一切都会明白的 :)

我们在这里所做的只是使用Rust在程序中创建一个交易,类似于我们在客户端使用TypeScript时所做的。我们在这里有一个特殊的 signers_seeds 东西,这对于PDA是必需的。

✂ 序列化和反序列化账户数据

一旦我们创建了一个新账户,我们需要访问并更新该账户的数据字段(目前为空字节)。这意味着将其字节数组反序列化为我们创建的类型的实例,更新该实例上的字段,然后将该实例重新序列化为字节数组。

反序列化账户数据

更新帐户数据的第一步是将其数据字节数组反序列化为Rust类型。您可以通过首先借用帐户上的数据字段来实现此操作。这样可以在不获取所有权的情况下访问数据。

然后,您可以使用try_from_slice_unchecked函数来反序列化借用账户的数据字段,使用您创建的类型来表示数据的格式。这将为您提供一个Rust类型的实例,以便您可以使用点符号轻松更新字段。如果我们使用我们一直在使用的笔记应用程序示例来完成这个操作,它会是这样的:

let mut account_data = try_from_slice_unchecked::<NoteState>(note_pda_account.data.borrow()).unwrap();

account_data.title = title;
account_data.body = body;
account_data.id = id;

序列化账户数据

一旦Rust实例更新了账户数据的适当值,您可以将数据“保存”在账户上。

这是通过对您创建的Rust类型实例使用serialize函数来完成的。您需要传入对账户数据的可变引用。这里的语法有些棘手,所以如果您不完全理解也不用担心。借用和引用是Rust中最难的概念之一。

account_data.serialize(&mut &mut note_pda_account.data.borrow_mut()[..])?;

上面的示例将 account_data 对象转换为字节数组,并将其设置为 note_pda_account 上的 data 属性。这有效地将更新后的 account_data 变量保存到新账户的数据字段中。现在,当用户获取 note_pda_account 并反序列化数据时,它将显示我们序列化到账户中的更新数据。

📼 总结 - 把所有的东西放在一起

那真是太多了。我得休息一下,然后回来继续写完这个。让我们回顾一下整个过程的始终:

    1. 用户通过发送一个包含标题、正文和字节ID的交易来创建一个笔记
    1. 我们的程序接收指令,提取数据并将其格式化为Rust类型
    1. 我们使用Rust类型来计算我们的账户需要多少空间+我们需要支付多少租金
    1. 我们从程序ID和一组种子中推导出账户的地址
    1. 我们使用CPI创建一个空白数据的账户
    1. 我们将账户数据反序列化为Rust类型
    1. 我们使用指令中的数据来更新Rust类型的账户数据
    1. 我们将Rust类型序列化为原始字节,并将其保存到账户中

这就是全部了,朋友。你现在知道如何向Solana上的账户写入数据了。我在尖叫,因为这太重要了。给你一个大大的胜利,拿去吧,你值得拥有它:

🎥 构建一个电影评论程序

完成工作的时间到了。我们的史诗级电影评论将不再被记录在控制台上,而是将它们存储在区块链上!

我们将使用与之前相同的程序,您可以从头开始设置它,或者使用上一节的那个。

📝 账户数据的代表

我们需要一个新的Rust类型来表示我们存储的数据。创建一个名为 state.rs 的新文件,并在其中添加 MovieAccountState

use borsh::{BorshSerialize, BorshDeserialize};

#[derive(BorshSerialize, BorshDeserialize)]
pub struct MovieAccountState {
pub is_initialized: bool,
pub rating: u8,
pub title: String,
pub description: String,
}

我们这里有 BorshSerializeBorshDeserialize 两者都有 :)

接下来,我们需要更新 lib.rs 以将我们所需的所有内容引入范围。将文件顶部更新为以下内容:

use solana_program::{
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg,
account_info::{next_account_info, AccountInfo},
system_instruction,
sysvar::{rent::Rent, Sysvar},
program::{invoke_signed},
borsh::try_from_slice_unchecked,
};
use std::convert::TryInto;
pub mod instruction;
pub mod state;
use instruction::MovieInstruction;
use state::MovieAccountState;
use borsh::BorshSerialize;

好的。我们需要的时候我会解释新的东西。让我们回到我们的 add_movie_review ,用实际的逻辑填充它,而不仅仅是打印出来。

⏩ 迭代账户

我们 add_movie_review 函数中传入的第二个参数是一个账户数组。我们可以遍历这些账户来获取它们的数据并进行相应操作。我们可以使用 next_account_info 来实现这一点 - 它是一个函数,接受一个迭代器并安全地返回列表中的下一个项。我们可以像这样使用它:

// Get Account iterator
let account_info_iter = &mut accounts.iter();

// Get accounts
let initializer = next_account_info(account_info_iter)?;
let pda_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;

挺酷的,对吧?如果列表为空,我们会得到一个 ProgramError::NotEnoughAccountKeys 错误。如果我们尝试访问一个不存在的账户,我们会得到一个 ProgramError::MissingRequiredSignature 错误。

🥚 导出PDA地址

我们所需要做的就是一行代码(继续添加到 add_movie_review ):

let (pda, bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes().as_ref(),], program_id);

这里的种子有:

    1. 初始化器的公钥
    1. 电影的标题

🧮 计算空间和租金

我们之前已经讨论过这个了 :)

// Calculate account size required
let account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());

// Calculate rent required
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(account_len);

你的 add_movie_review 函数应该变得有点长了。我们还剩下两个小部分 - 创建账户和更新数据。继续前进吧!

📝 创建账户

是时候进行一些跨程序调用了!

// Create the account
invoke_signed(
&system_instruction::create_account(
initializer.key,
pda_account.key,
rent_lamports,
account_len.try_into().unwrap(),
program_id,
),
&[initializer.clone(), pda_account.clone(), system_program.clone()],
&[&[initializer.key.as_ref(), title.as_bytes().as_ref(), &[bump_seed]]],
)?;

msg!("PDA created: {}", pda);

invoke_signed 是创建账户的交易。我们传入了 create_account 指令,我们使用的账户以及用于派生PDA地址的种子。

我们需要做的最后一件事是更新账户数据:

msg!("unpacking state account");
let mut account_data = try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();
msg!("borrowed account data");

account_data.title = title;
account_data.rating = rating;
account_data.description = description;
account_data.is_initialized = true;

msg!("serializing account");
account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;
msg!("state account serialized");

我们正在使用 try_from_slice_unchecked 将原始字节转换为Rust类型。然后我们更新数据并将其序列化回原始字节。

我们已经准备好进行升级并部署!(可能需要几分钟时间)

🎉 试一试

你知道该怎么做。复制地址。设置一个脚本来调用程序(你可以使用上次使用的那个,无需更改)。运行它。在Solana Explorer上检查这个新的账户。

如果你需要一个新的设置:

git clone https://github.com/buildspace/solana-movie-client
cd solana-movie-client
npm install

更新 programId 中的 index.ts 为您程序的地址,然后运行 npm run start

在终端中点击浏览器链接并向下滚动到程序日志部分,这是我得到的内容:

我们可以看到,我们的程序通过CPI与系统程序进行交互,创建了一个账户(PDA),并将我们的评论添加到其中!如果我自己说的话,这是一篇非常好的评论;)

🚢 船舶挑战

现在轮到你独立建立一些东西了。

回想一下,学生介绍程序需要用户提供姓名和简短留言作为输入instruction_data,并创建一个账户来将数据存储在区块链上。

利用你在本课程中学到的知识,尝试重新创建完整的学生介绍程序。

提示: +

🤠 状态管理

还记得我们在第一节中互动的电影评论程序吗?我们要在这里构建它。随意评论其他东西,而不仅仅是电影,我不是你爸爸。嘿!准备好成为一位州长了吗?不不,我们不是在做那种类型的状态管理。我们所说的状态是指存储在链上的程序数据。

我们有一个可靠的程序,它接收指令数据并准备进行处理。要执行这些指令,我们需要学习更多关于Rust的知识。

📝 程序状态作为Rust数据类型

Solana保持其速度和效率的一部分原因是程序是无状态的。这意味着您无法更改程序上的数据 - 所有数据都存储在外部账户中,通常是由程序拥有的账户。大多数这些账户是PDA(Program Derived Accounts) - 我们现在将查看它们的数据存储元素,并稍后深入了解其余部分。

就像我们将指令数据转换为Rust类型一样,我们将把程序状态也转换为Rust类型,以便更容易处理。

回想一下 Solana 账户中的 data 字段 - 它存储了一个原始字节数组。我们可以通过序列化和反序列化来表示它在 Rust 类型中的形式。

我们将再次使用borsh macro

数据在传输和存储时以原始字节的形式进行,但在我们希望处理数据时,会将其转换为Rust类型。有道理,对吧?

🏠 空间和租金

是的,Solana也有房东:验证者将区块链的状态存储在他们的机器上。

租金以Lamports支付,Lamport是SOL的最小单位(0.000000001 SOL = 1 Lamport),根据账户占用的空间大小计算。以下是常见类型占用的字节空间的表格:

付房租有两种方式:

  • 按每个时期支付租金。这就像每月支付租金一样 - 只要你继续支付,你就可以继续居住。如果账户没有足够的SOL,它将被重置,数据将丢失。
  • 保持等于2年租金的最低余额。这样账户就免除了租金。这里的逻辑是硬件成本每2年下降50%,所以如果你有足够的SOL支付2年的租金,你就永远不用担心了!

现在要求免租金,所以只有选项#2。这种方法的最大优点是,当您不再需要存储数据时,可以销毁账户并取回您的SOL!区块链上的免费存储(减去交易费用)🥳

为什么要在区块链上租赁呢?嗯,这是一种防止人们创建大量账户却从未使用的方式。这将浪费空间和验证者资源。这个系统是Solana上存储如此廉价的原因之一——与以太坊不同,我的愚蠢的Hello World NFT收藏将被所有验证者永久存储。

你可以在这里阅读更多相关内容,我觉得挺酷的!

📊 计算租金

计算租金很简单 - 有一个很有用的功能可以帮助你。棘手的部分是弄清楚你需要多少空间。

这是我们的超级笔记程序的样子:

// Calculate account size required for struct NoteState
// 4 bytes to store the size of the subsequent dynamic data (string)
// 8 bytes to store the 64 bit interger for the id
let account_len: usize = (4 + title.len()) + (4 + body.len()) + 8;

// Calculate rent required
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(account_len);

我们首先要做的是计算我们存储的数据的总长度。我们可以通过将字符串的长度和8个字节的id相加来实现这一点。

在我们的情况下, titlebody 是动态数据类型(字符串)-它们可以是任意长度。我们使用前4个字节来存储每个项目的长度,因此我们将每个字符串的长度加上4。

然后我们可以使用 Rent::get() 函数来获取账户的租金。轻松愉快!

📜 程序派生地址

我们已经从指令中获取了我们的数据,我们已经计算出我们需要支付多少租金,现在我们需要一个账户来存放它。嗨,PDAs!还记得前端的鸡和蛋问题吗?这里也是一样的!我们将从程序ID和一组种子中推导出账户的地址。

我们将在未来深入探讨PDA的工作原理,但现在你只需要知道 find_program_address 功能,并且只有 program_id 中的程序可以为PDA签名。就像安全存储一样,不需要密码。

🛫 跨程序调用

最后一步是初始化PDA(我们只在最后一步中找到了地址)。我们将使用跨程序调用(CPI)来完成此操作。正如其名称所示,我们将在我们的程序中与Solana网络上的另一个程序进行交互。

CPI可以使用 invokeinvoke_signed 进行

当您不需要签署交易时,使用 invoke 。当您需要签署交易时,使用 invoke_signed 。在我们的情况下,我们是唯一可以为PDA签署的人,因此我们将使用 invoke_signed

这是它的样子。你可能会想:“这是什么鬼东西” - 别担心,我们接下来会练习,一切都会明白的 :)

我们在这里所做的只是使用Rust在程序中创建一个交易,类似于我们在客户端使用TypeScript时所做的。我们在这里有一个特殊的 signers_seeds 东西,这对于PDA是必需的。

✂ 序列化和反序列化账户数据

一旦我们创建了一个新账户,我们需要访问并更新该账户的数据字段(目前为空字节)。这意味着将其字节数组反序列化为我们创建的类型的实例,更新该实例上的字段,然后将该实例重新序列化为字节数组。

反序列化账户数据

更新帐户数据的第一步是将其数据字节数组反序列化为Rust类型。您可以通过首先借用帐户上的数据字段来实现此操作。这样可以在不获取所有权的情况下访问数据。

然后,您可以使用try_from_slice_unchecked函数来反序列化借用账户的数据字段,使用您创建的类型来表示数据的格式。这将为您提供一个Rust类型的实例,以便您可以使用点符号轻松更新字段。如果我们使用我们一直在使用的笔记应用程序示例来完成这个操作,它会是这样的:

let mut account_data = try_from_slice_unchecked::<NoteState>(note_pda_account.data.borrow()).unwrap();

account_data.title = title;
account_data.body = body;
account_data.id = id;

序列化账户数据

一旦Rust实例更新了账户数据的适当值,您可以将数据“保存”在账户上。

这是通过对您创建的Rust类型实例使用serialize函数来完成的。您需要传入对账户数据的可变引用。这里的语法有些棘手,所以如果您不完全理解也不用担心。借用和引用是Rust中最难的概念之一。

account_data.serialize(&mut &mut note_pda_account.data.borrow_mut()[..])?;

上面的示例将 account_data 对象转换为字节数组,并将其设置为 note_pda_account 上的 data 属性。这有效地将更新后的 account_data 变量保存到新账户的数据字段中。现在,当用户获取 note_pda_account 并反序列化数据时,它将显示我们序列化到账户中的更新数据。

📼 总结 - 把所有的东西放在一起

那真是太多了。我得休息一下,然后回来继续写完这个。让我们回顾一下整个过程的始终:

    1. 用户通过发送一个包含标题、正文和字节ID的交易来创建一个笔记
    1. 我们的程序接收指令,提取数据并将其格式化为Rust类型
    1. 我们使用Rust类型来计算我们的账户需要多少空间+我们需要支付多少租金
    1. 我们从程序ID和一组种子中推导出账户的地址
    1. 我们使用CPI创建一个空白数据的账户
    1. 我们将账户数据反序列化为Rust类型
    1. 我们使用指令中的数据来更新Rust类型的账户数据
    1. 我们将Rust类型序列化为原始字节,并将其保存到账户中

这就是全部了,朋友。你现在知道如何向Solana上的账户写入数据了。我在尖叫,因为这太重要了。给你一个大大的胜利,拿去吧,你值得拥有它:

🎥 构建一个电影评论程序

完成工作的时间到了。我们的史诗级电影评论将不再被记录在控制台上,而是将它们存储在区块链上!

我们将使用与之前相同的程序,您可以从头开始设置它,或者使用上一节的那个。

📝 账户数据的代表

我们需要一个新的Rust类型来表示我们存储的数据。创建一个名为 state.rs 的新文件,并在其中添加 MovieAccountState

use borsh::{BorshSerialize, BorshDeserialize};

#[derive(BorshSerialize, BorshDeserialize)]
pub struct MovieAccountState {
pub is_initialized: bool,
pub rating: u8,
pub title: String,
pub description: String,
}

我们这里有 BorshSerializeBorshDeserialize 两者都有 :)

接下来,我们需要更新 lib.rs 以将我们所需的所有内容引入范围。将文件顶部更新为以下内容:

use solana_program::{
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg,
account_info::{next_account_info, AccountInfo},
system_instruction,
sysvar::{rent::Rent, Sysvar},
program::{invoke_signed},
borsh::try_from_slice_unchecked,
};
use std::convert::TryInto;
pub mod instruction;
pub mod state;
use instruction::MovieInstruction;
use state::MovieAccountState;
use borsh::BorshSerialize;

好的。我们需要的时候我会解释新的东西。让我们回到我们的 add_movie_review ,用实际的逻辑填充它,而不仅仅是打印出来。

⏩ 迭代账户

我们 add_movie_review 函数中传入的第二个参数是一个账户数组。我们可以遍历这些账户来获取它们的数据并进行相应操作。我们可以使用 next_account_info 来实现这一点 - 它是一个函数,接受一个迭代器并安全地返回列表中的下一个项。我们可以像这样使用它:

// Get Account iterator
let account_info_iter = &mut accounts.iter();

// Get accounts
let initializer = next_account_info(account_info_iter)?;
let pda_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;

挺酷的,对吧?如果列表为空,我们会得到一个 ProgramError::NotEnoughAccountKeys 错误。如果我们尝试访问一个不存在的账户,我们会得到一个 ProgramError::MissingRequiredSignature 错误。

🥚 导出PDA地址

我们所需要做的就是一行代码(继续添加到 add_movie_review ):

let (pda, bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes().as_ref(),], program_id);

这里的种子有:

    1. 初始化器的公钥
    1. 电影的标题

🧮 计算空间和租金

我们之前已经讨论过这个了 :)

// Calculate account size required
let account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());

// Calculate rent required
let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(account_len);

你的 add_movie_review 函数应该变得有点长了。我们还剩下两个小部分 - 创建账户和更新数据。继续前进吧!

📝 创建账户

是时候进行一些跨程序调用了!

// Create the account
invoke_signed(
&system_instruction::create_account(
initializer.key,
pda_account.key,
rent_lamports,
account_len.try_into().unwrap(),
program_id,
),
&[initializer.clone(), pda_account.clone(), system_program.clone()],
&[&[initializer.key.as_ref(), title.as_bytes().as_ref(), &[bump_seed]]],
)?;

msg!("PDA created: {}", pda);

invoke_signed 是创建账户的交易。我们传入了 create_account 指令,我们使用的账户以及用于派生PDA地址的种子。

我们需要做的最后一件事是更新账户数据:

msg!("unpacking state account");
let mut account_data = try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();
msg!("borrowed account data");

account_data.title = title;
account_data.rating = rating;
account_data.description = description;
account_data.is_initialized = true;

msg!("serializing account");
account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;
msg!("state account serialized");

我们正在使用 try_from_slice_unchecked 将原始字节转换为Rust类型。然后我们更新数据并将其序列化回原始字节。

我们已经准备好进行升级并部署!(可能需要几分钟时间)

🎉 试一试

你知道该怎么做。复制地址。设置一个脚本来调用程序(你可以使用上次使用的那个,无需更改)。运行它。在Solana Explorer上检查这个新的账户。

如果你需要一个新的设置:

git clone https://github.com/buildspace/solana-movie-client
cd solana-movie-client
npm install

更新 programId 中的 index.ts 为您程序的地址,然后运行 npm run start

在终端中点击浏览器链接并向下滚动到程序日志部分,这是我得到的内容:

我们可以看到,我们的程序通过CPI与系统程序进行交互,创建了一个账户(PDA),并将我们的评论添加到其中!如果我自己说的话,这是一篇非常好的评论;)

🚢 船舶挑战

现在轮到你独立建立一些东西了。

回想一下,学生介绍程序需要用户提供姓名和简短留言作为输入instruction_data,并创建一个账户来将数据存储在区块链上。

利用你在本课程中学到的知识,尝试重新创建完整的学生介绍程序。

提示: 除了接收一个名称和一个简短的消息作为指令数据外,程序还应该:

    1. 为每个学生创建一个独立的账户
    1. is_initialized 存储为布尔值,在每个账户中将 name 存储为字符串,将 msg 存储为字符串

Solution Code:

解决方案代码: -你可以使用这个前端来测试你的程序。记得用你部署的程序ID替换前端代码中的那个。

如果可以的话,尽量独立完成这个任务!但如果遇到困难,可以参考解决方案代码

- - +你可以使用这个前端来测试你的程序。记得用你部署的程序ID替换前端代码中的那个。

如果可以的话,尽量独立完成这个任务!但如果遇到困难,可以参考解决方案代码

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/index.html b/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/index.html index 4b5096022..52e71a02a 100644 --- a/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/index.html +++ b/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/index.html @@ -3,16 +3,16 @@ -🎂 Rust的分层蛋糕 | All in One Solana - - - +🎂 Rust的分层蛋糕 | All in One Solana + + +
-

🎂 Rust的分层蛋糕

我们将在游乐场上制作一个简单的Hello World程序。它只会在交易日志中记录一条消息,哈哈,我们已经打招呼了。现在是时候学习如何处理指令数据了,就像我们在客户端开发中所做的一样。

在我们开始构建之前,我想先介绍一些我们将要使用的概念。还记得我提到的规则、能力和互动吗?我会带你了解一下你需要了解的能力和规则,以便编写一个本地的Solana程序。这里的本地很重要 - 我们将在后面由Anchor来处理我们所学到的很多内容。

我们学习原生开发的原因是因为了解底层工作原理非常重要。一旦你理解了事物在原子级别上是如何运作的,你就能够利用像Anchor这样的工具来构建更强大的程序。可以把它想象成与不同类型的敌人进行的首领战 - 在同时对抗它们之前,你需要学会如何对抗每个个体怪物(以及你自己的能力)。

当我刚开始学习这个东西的时候,我很难理解自己缺少了什么,所以我将它分解成了“层次”。你学习的每个主题都是建立在一层知识的基础上的。如果有什么不明白的地方,回到它所建立的层次上,确保你理解它们。

Rust的分层蛋糕

这是一个由Rust制作的蛋糕。

注意 - 图层表示重量哈哈

👶 变量声明和可变性

变量。你知道它们。你用过它们。你甚至可能拼错过它们。关于Rust变量唯一的新东西就是可变性。在Rust中,所有变量默认都是不可变的 - 一旦声明了变量,就不能改变其值。

你所要做的就是告诉编译器你想要一个可变的变量,通过添加 mut 关键字。简单易懂。如果我们不提供类型,编译器会根据我们提供的数据进行推断。然后它会强制我们在时间上保持该类型。

🍱 结构体

结构体是自定义的数据结构:一种将数据组合在一起的方式。它们是您定义的自定义数据类型,类似于JavaScript中的对象。Rust并非完全面向对象 - 结构体本身除了保存有组织的数据外,无法执行任何操作。您可以向结构体添加内容,使其更像对象。

📜 枚举、变体和匹配

枚举很简单 - 它们就像代码中的下拉列表。它们强制你从几个可能的变体中选择一个。

Rust中枚举的酷炫之处在于你可以(可选地)向其添加数据,使其几乎像一个迷你if语句。在这个例子中,你正在选择交通信号灯的状态。如果它是开启的,你需要指定颜色 - 是红色、黄色还是绿色?

当与匹配语句结合使用时,枚举非常有用。它们是一种检查变量值并根据该值执行代码的方式,与JavaScript中的switch语句相同。

📦 Implementations

结构体很酷,但如果你能给它们添加函数会怎样呢?让我们来介绍一下实现:它们允许你给结构体添加方法,使其更像对象。

如果你对“向结构体添加方法”的含义感到困惑 - 就像给结构体赋予能力一样。你可以拥有一个简单的user结构体,它具有速度、健康和伤害属性。通过使用 impl 来添加一个 wordPerMinute 方法,你可以计算用户的打字速度⌨️。

🎁 Traits

最后,来说说“糕点”的顶部。特征与实现类似-它们为类型添加功能。将其视为类型可以具备的品质。

回到我们的 user 结构体,如果我添加了一个 ThreeArms Traits ,用户将能够以更快的速度输入,因为他们将有额外的手臂!Traits有点抽象,所以让我们看一个实际的场景,我们将在其中使用它们:

正如您所记得的,我们的指令数据以字节数组(1和0)的形式提供,并且我们在程序中对其进行反序列化(将其转换为Rust类型)。我们将使用 BorshDeserialize 特性来实现这一点:它具有一个 deserialize 方法,将我们的数据转换为我们想要的类型。这意味着如果我们将 BorshDeserialize 特性添加到我们的指令结构体中,我们就可以使用 deserialize 方法将我们的指令数据实例转换为Rust类型。

如果这段话让你感到困惑,随时可以再读一遍哈哈,我也花了一些时间才理解清楚。

这是实际操作中的样子:

注意 - 你可能忘记了一个层次,宏:它们生成代码。

在我们的情况下,特质与宏一起使用。例如, BorshDeserialize Traits 有两个必须实现的函数。 deserializetry_from_slice 。我们可以使用 #[derive(BorshDeserialize)] 属性告诉编译器在给定类型上(即指令数据结构)为我们实现这两个函数。 -流程是:

  • 通过宏将Traits添加到结构体中
  • 编译器将会寻找Traits定义
  • 编译器将为该Traits实现底层函数
  • 你的结构体现在具有了Traits的功能

这里实际上发生的是宏在编译时生成了用于反序列化字符串的函数。使用这个Traits,我们告诉Rust:“嘿,我想要能够反序列化字符串,请为我生成代码。”

在我们的情况下,唯一的要求是Borsh需要支持所有的结构数据类型(在我们的情况下是字符串)。如果您有一个Borsh不支持的自定义数据类型,您需要通过添加到宏中自己实现这些功能。

如果这还没有点击,别担心!我在看到整个流程运作之前也没有理解,所以现在让我们来做吧!

🎂 把所有的东西放在一起

我们刚刚讨论了一系列相互关联的抽象主题。如果仅仅描述每一层,我无法想象出一个蛋糕的样子,所以让我们把它们整合在一起吧!

假设我们正在构建一个链上的笔记程序。我们将保持简单:你只能创建、更新和删除笔记。我们需要一条指令来完成这些操作,所以让我们为此创建一个枚举类型:

每个指令变体的字节数组都有自己的数据类型,我们在这里有它们!

既然我们知道指令数据的样子,我们需要将其从字节转换为这些类型。第一步是反序列化,我们将使用一个专门为有效负载创建的新结构体上的 BorshDeserialize Traits 来完成。

#[derive(BorshDeserialize)]
struct NoteInstructionPayload {
id: u64,
title: String,
body: String
}

我们在这里有 titlebody ,因为这就是字节数组中的内容。Borsh所做的只是添加反序列化的支持!它实际上并没有进行反序列化。它只是添加了我们可以调用的反序列化函数。

接下来,我们需要实际使用这些函数来反序列化数据。我们将在一个实现中定义这个行为。这是手动工作(暂时)!

impl NoteInstruction {
// Unpack inbound buffer to associated Instruction
// The expected format for input is a Borsh serialized vector
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
// Take the first byte as the variant to
// determine which instruction to execute
let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;
// Use the temporary payload struct to deserialize
let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();
// Match the variant to determine which data struct is expected by
// the function and return the TestStruct or an error
Ok(match variant {
0 => Self::CreateNote {
title: payload.title,
body: payload.body,
id: payload.id
},
1 => Self::UpdateNote {
title: payload.title,
body: payload.body,
id: payload.id
},
2 => Self::DeleteNote {
id: payload.id
},
_ => return Err(ProgramError::InvalidInstructionData)
})
}
}

这可能看起来吓人,但你很快就会笑出声来,因为它其实非常简单!让我们来分解一下 🕺💃👯‍♂️

pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {

我们的解包函数将从指令中获取字节,并返回一个NoteInstruction类型(这就是 Self )或一个 ProgramError

let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;

是时候将我们的数据从字节中解包并调用反序列化函数了。

在这个程序中,我们指令数据的第一个字节是一个整数,告诉我们正在处理哪个指令。我们需要这样做是因为每个指令可能有不同的关联数据。也许我们正在编写一个食谱程序,而不是烹饪食谱,我们最终删除了它。我们需要知道我们正在处理哪个指令,以便能够正确解析数据。

我们这样做的方式是使用Rust内置的 split_first 函数。它接受一个字节切片并返回一个元组。第一个元素是切片中的第一个字节,第二个元素是切片的剩余部分。如果切片为空, ok_or 只是返回 ProgramError 枚举中的 InvalidInstructionData 错误。

let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();

现在我们有两个变量要处理 - 指令指示器和指令的有效载荷(数据)。Borsh在我们的有效载荷结构中添加了 try_from_slice 函数,这样我们就可以在有效载荷变量 rest 上调用它。这就是反序列化的过程!如果没有错误, unwrap 将从这个函数中返回值。

我们快到了!到目前为止,我们已经:

  • 将我们的指令数据定义为 Rust 类型中的枚举
  • 定义了我们的负载结构体
  • 在负载结构体上声明了 BorshDeserialize
  • 为负载结构创建了一个实现(字节 -> 结构体)
  • 创建了一个unpack函数,该函数接收指令数据并对其进行反序列化

我们unpack函数的最后一步是将反序列化的数据转换为枚举变体(即指令数据类型)。

Ok(match variant {
0 => Self::CreateNote {
title: payload.title,
body: payload.body,
id: payload.id
},
1 => Self::UpdateNote {
title: payload.title,
body: payload.body,
id: payload.id
},
2 => Self::DeleteNote {
id: payload.id
},
_ => return Err(ProgramError::InvalidInstructionData)
})

我们将使用匹配语句来完成这个操作。通过匹配指令指示器,我们可以返回枚举的正确变体。可以将其视为使用指令中的数据来创建正确类型的变量。

现在你知道蛋糕的样子了!我发现你需要很多脑力来一次性将蛋糕的每一块都放入工作记忆中,所以如果你需要回过头来读几次也没关系。

这是很多内容。可能会让人感到困惑。别担心:我们会进行大量练习,以便熟悉这些内容。相信经过一段时间和几次重复练习,这些内容会开始变得有意义。

🚀 程序逻辑

我们已经将指令数据解压并准备就绪。现在我们需要为每个指令编写逻辑。这是最简单的部分!反序列化是耗时的“嗯,这是怎么回事”的部分(Anchor会为您处理)。

首先,我们要做的是定义程序的入口点。函数 process_instruction 的定义与我们的Hello World程序相同。然后,我们将在 NoteInstruction 的实现中使用 unpack 函数来获取指令数据。然后,我们可以使用 NoteInstruction 枚举来匹配类型。

我们这里没有这个逻辑,我们会在真正开始建设时添加它!

📂 文件结构说明

当编写自定义程序时,最好将代码分成不同的文件。这样可以重复使用代码,并且更容易找到所需的内容。

除了 lib.rs 文件之外,我们将把程序的各个部分分别放在不同的文件中。最明显的一个就是 instruction.rs 文件。在这里,我们将定义指令数据类型并实现对指令数据的解包。

你做得很棒👏👏👏

我想花点时间来赞赏你所付出的努力。你正在学习一些非常强大的知识,这些知识可以在 Solana 之外的领域中使用,Rust 有很多应用。Solana 可能会有一些困难,这里有一条来自 FormFunction 创始人的推文,大约一年前他提到了他发现它有多么困难:

FormFunction已经筹集了超过470万美元,并且是Solana上最好的1/1 NFT平台(在我看来)。Matt坚持不懈地建立了一些令人难以置信的东西。你能想象一下拥有这些技能一年后你会在哪里吗?

- - +

🎂 Rust的分层蛋糕

我们将在游乐场上制作一个简单的Hello World程序。它只会在交易日志中记录一条消息,哈哈,我们已经打招呼了。现在是时候学习如何处理指令数据了,就像我们在客户端开发中所做的一样。

在我们开始构建之前,我想先介绍一些我们将要使用的概念。还记得我提到的规则、能力和互动吗?我会带你了解一下你需要了解的能力和规则,以便编写一个本地的Solana程序。这里的本地很重要 - 我们将在后面由Anchor来处理我们所学到的很多内容。

我们学习原生开发的原因是因为了解底层工作原理非常重要。一旦你理解了事物在原子级别上是如何运作的,你就能够利用像Anchor这样的工具来构建更强大的程序。可以把它想象成与不同类型的敌人进行的首领战 - 在同时对抗它们之前,你需要学会如何对抗每个个体怪物(以及你自己的能力)。

当我刚开始学习这个东西的时候,我很难理解自己缺少了什么,所以我将它分解成了“层次”。你学习的每个主题都是建立在一层知识的基础上的。如果有什么不明白的地方,回到它所建立的层次上,确保你理解它们。

Rust的分层蛋糕

这是一个由Rust制作的蛋糕。

注意 - 图层表示重量哈哈

👶 变量声明和可变性

变量。你知道它们。你用过它们。你甚至可能拼错过它们。关于Rust变量唯一的新东西就是可变性。在Rust中,所有变量默认都是不可变的 - 一旦声明了变量,就不能改变其值。

你所要做的就是告诉编译器你想要一个可变的变量,通过添加 mut 关键字。简单易懂。如果我们不提供类型,编译器会根据我们提供的数据进行推断。然后它会强制我们在时间上保持该类型。

🍱 结构体

结构体是自定义的数据结构:一种将数据组合在一起的方式。它们是您定义的自定义数据类型,类似于JavaScript中的对象。Rust并非完全面向对象 - 结构体本身除了保存有组织的数据外,无法执行任何操作。您可以向结构体添加内容,使其更像对象。

📜 枚举、变体和匹配

枚举很简单 - 它们就像代码中的下拉列表。它们强制你从几个可能的变体中选择一个。

Rust中枚举的酷炫之处在于你可以(可选地)向其添加数据,使其几乎像一个迷你if语句。在这个例子中,你正在选择交通信号灯的状态。如果它是开启的,你需要指定颜色 - 是红色、黄色还是绿色?

当与匹配语句结合使用时,枚举非常有用。它们是一种检查变量值并根据该值执行代码的方式,与JavaScript中的switch语句相同。

📦 Implementations

结构体很酷,但如果你能给它们添加函数会怎样呢?让我们来介绍一下实现:它们允许你给结构体添加方法,使其更像对象。

如果你对“向结构体添加方法”的含义感到困惑 - 就像给结构体赋予能力一样。你可以拥有一个简单的user结构体,它具有速度、健康和伤害属性。通过使用 impl 来添加一个 wordPerMinute 方法,你可以计算用户的打字速度⌨️。

🎁 Traits

最后,来说说“糕点”的顶部。特征与实现类似-它们为类型添加功能。将其视为类型可以具备的品质。

回到我们的 user 结构体,如果我添加了一个 ThreeArms Traits ,用户将能够以更快的速度输入,因为他们将有额外的手臂!Traits有点抽象,所以让我们看一个实际的场景,我们将在其中使用它们:

正如您所记得的,我们的指令数据以字节数组(1和0)的形式提供,并且我们在程序中对其进行反序列化(将其转换为Rust类型)。我们将使用 BorshDeserialize 特性来实现这一点:它具有一个 deserialize 方法,将我们的数据转换为我们想要的类型。这意味着如果我们将 BorshDeserialize 特性添加到我们的指令结构体中,我们就可以使用 deserialize 方法将我们的指令数据实例转换为Rust类型。

如果这段话让你感到困惑,随时可以再读一遍哈哈,我也花了一些时间才理解清楚。

这是实际操作中的样子:

注意 - 你可能忘记了一个层次,宏:它们生成代码。

在我们的情况下,特质与宏一起使用。例如, BorshDeserialize Traits 有两个必须实现的函数。 deserializetry_from_slice 。我们可以使用 #[derive(BorshDeserialize)] 属性告诉编译器在给定类型上(即指令数据结构)为我们实现这两个函数。 +流程是:

  • 通过宏将Traits添加到结构体中
  • 编译器将会寻找Traits定义
  • 编译器将为该Traits实现底层函数
  • 你的结构体现在具有了Traits的功能

这里实际上发生的是宏在编译时生成了用于反序列化字符串的函数。使用这个Traits,我们告诉Rust:“嘿,我想要能够反序列化字符串,请为我生成代码。”

在我们的情况下,唯一的要求是Borsh需要支持所有的结构数据类型(在我们的情况下是字符串)。如果您有一个Borsh不支持的自定义数据类型,您需要通过添加到宏中自己实现这些功能。

如果这还没有点击,别担心!我在看到整个流程运作之前也没有理解,所以现在让我们来做吧!

🎂 把所有的东西放在一起

我们刚刚讨论了一系列相互关联的抽象主题。如果仅仅描述每一层,我无法想象出一个蛋糕的样子,所以让我们把它们整合在一起吧!

假设我们正在构建一个链上的笔记程序。我们将保持简单:你只能创建、更新和删除笔记。我们需要一条指令来完成这些操作,所以让我们为此创建一个枚举类型:

每个指令变体的字节数组都有自己的数据类型,我们在这里有它们!

既然我们知道指令数据的样子,我们需要将其从字节转换为这些类型。第一步是反序列化,我们将使用一个专门为有效负载创建的新结构体上的 BorshDeserialize Traits 来完成。

#[derive(BorshDeserialize)]
struct NoteInstructionPayload {
id: u64,
title: String,
body: String
}

我们在这里有 titlebody ,因为这就是字节数组中的内容。Borsh所做的只是添加反序列化的支持!它实际上并没有进行反序列化。它只是添加了我们可以调用的反序列化函数。

接下来,我们需要实际使用这些函数来反序列化数据。我们将在一个实现中定义这个行为。这是手动工作(暂时)!

impl NoteInstruction {
// Unpack inbound buffer to associated Instruction
// The expected format for input is a Borsh serialized vector
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
// Take the first byte as the variant to
// determine which instruction to execute
let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;
// Use the temporary payload struct to deserialize
let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();
// Match the variant to determine which data struct is expected by
// the function and return the TestStruct or an error
Ok(match variant {
0 => Self::CreateNote {
title: payload.title,
body: payload.body,
id: payload.id
},
1 => Self::UpdateNote {
title: payload.title,
body: payload.body,
id: payload.id
},
2 => Self::DeleteNote {
id: payload.id
},
_ => return Err(ProgramError::InvalidInstructionData)
})
}
}

这可能看起来吓人,但你很快就会笑出声来,因为它其实非常简单!让我们来分解一下 🕺💃👯‍♂️

pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {

我们的解包函数将从指令中获取字节,并返回一个NoteInstruction类型(这就是 Self )或一个 ProgramError

let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;

是时候将我们的数据从字节中解包并调用反序列化函数了。

在这个程序中,我们指令数据的第一个字节是一个整数,告诉我们正在处理哪个指令。我们需要这样做是因为每个指令可能有不同的关联数据。也许我们正在编写一个食谱程序,而不是烹饪食谱,我们最终删除了它。我们需要知道我们正在处理哪个指令,以便能够正确解析数据。

我们这样做的方式是使用Rust内置的 split_first 函数。它接受一个字节切片并返回一个元组。第一个元素是切片中的第一个字节,第二个元素是切片的剩余部分。如果切片为空, ok_or 只是返回 ProgramError 枚举中的 InvalidInstructionData 错误。

let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();

现在我们有两个变量要处理 - 指令指示器和指令的有效载荷(数据)。Borsh在我们的有效载荷结构中添加了 try_from_slice 函数,这样我们就可以在有效载荷变量 rest 上调用它。这就是反序列化的过程!如果没有错误, unwrap 将从这个函数中返回值。

我们快到了!到目前为止,我们已经:

  • 将我们的指令数据定义为 Rust 类型中的枚举
  • 定义了我们的负载结构体
  • 在负载结构体上声明了 BorshDeserialize
  • 为负载结构创建了一个实现(字节 -> 结构体)
  • 创建了一个unpack函数,该函数接收指令数据并对其进行反序列化

我们unpack函数的最后一步是将反序列化的数据转换为枚举变体(即指令数据类型)。

Ok(match variant {
0 => Self::CreateNote {
title: payload.title,
body: payload.body,
id: payload.id
},
1 => Self::UpdateNote {
title: payload.title,
body: payload.body,
id: payload.id
},
2 => Self::DeleteNote {
id: payload.id
},
_ => return Err(ProgramError::InvalidInstructionData)
})

我们将使用匹配语句来完成这个操作。通过匹配指令指示器,我们可以返回枚举的正确变体。可以将其视为使用指令中的数据来创建正确类型的变量。

现在你知道蛋糕的样子了!我发现你需要很多脑力来一次性将蛋糕的每一块都放入工作记忆中,所以如果你需要回过头来读几次也没关系。

这是很多内容。可能会让人感到困惑。别担心:我们会进行大量练习,以便熟悉这些内容。相信经过一段时间和几次重复练习,这些内容会开始变得有意义。

🚀 程序逻辑

我们已经将指令数据解压并准备就绪。现在我们需要为每个指令编写逻辑。这是最简单的部分!反序列化是耗时的“嗯,这是怎么回事”的部分(Anchor会为您处理)。

首先,我们要做的是定义程序的入口点。函数 process_instruction 的定义与我们的Hello World程序相同。然后,我们将在 NoteInstruction 的实现中使用 unpack 函数来获取指令数据。然后,我们可以使用 NoteInstruction 枚举来匹配类型。

我们这里没有这个逻辑,我们会在真正开始建设时添加它!

📂 文件结构说明

当编写自定义程序时,最好将代码分成不同的文件。这样可以重复使用代码,并且更容易找到所需的内容。

除了 lib.rs 文件之外,我们将把程序的各个部分分别放在不同的文件中。最明显的一个就是 instruction.rs 文件。在这里,我们将定义指令数据类型并实现对指令数据的解包。

你做得很棒👏👏👏

我想花点时间来赞赏你所付出的努力。你正在学习一些非常强大的知识,这些知识可以在 Solana 之外的领域中使用,Rust 有很多应用。Solana 可能会有一些困难,这里有一条来自 FormFunction 创始人的推文,大约一年前他提到了他发现它有多么困难:

FormFunction已经筹集了超过470万美元,并且是Solana上最好的1/1 NFT平台(在我看来)。Matt坚持不懈地建立了一些令人难以置信的东西。你能想象一下拥有这些技能一年后你会在哪里吗?

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/index.html b/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/index.html index f6b053ccc..c5abb2248 100644 --- a/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/index.html +++ b/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/index.html @@ -3,15 +3,15 @@ -🛠️ 构建一个NFT质押计划 | All in One Solana - - - +🛠️ 构建一个NFT质押计划 | All in One Solana + + +
-

🛠️ 构建一个NFT质押计划

今天,我们将编写我们的质押程序,并编写所有必要的质押功能,而不进行任何代币转账。我将与您一起逐步讲解整个过程,解释每个步骤,以便您了解正在发生的事情。让我们首先进入Solana Playground,在 create a new project 上点击,并创建一个名为 src 的新文件夹,其中包含一个名为 lib.rs 的文件。

这就是你的集成开发环境应该看起来的样子

目前,主要目标是编写一个程序,跟踪每个用户的质押状态。以下是一些大致的步骤:

现在你已经准备好了,我们将继续创建剩余的文件,就像我们在之前的课程中所做的那样。让我们继续在你的 src 文件夹中创建以下5个文件。这些文件是 entrypoint.rserror.rsinstruction.rsprocessor.rsstate.rs

现在应该是这个样子

我们已经准备好了!现在让我们用以下代码填充我们的 lib.rs

// Lib.rs
pub mod entrypoint;
pub mod error;
pub mod instruction;
pub mod processor;
pub mod state;

进入 entrypoint.rs 并添加以下代码

// Entrypoint.rs
use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey
};
use crate::processor;

// This macro will help process all incoming instructions
entrypoint!(process_instruction);

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
processor::process_instruction(program_id, accounts, instruction_data)?;
Ok(())
}

当你运行代码时,你会注意到这会抛出一个错误,因为我们没有在 processor.rs 中定义 process_instruction 函数。现在让我们创建这个函数。转到 processor.rs 并添加以下代码。

// Processor.rs
use solana_program::{
account_info::AccountInfo,
entrypoint::ProgramResult,
pubkey::Pubkey
};

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
Ok(())
}

现在我们已经修复了 processor.rs 的错误,你会注意到在编译代码时仍然存在错误。这是因为在你的 lib.rs 中,我们导入了一些空模块。不过不用担心,我们会在下一节中修复它们 😊 在我们开始处理 process_instruction 中的任何内容之前,我们需要在 instruction.rs 中编写出我们的指令,所以让我们开始定义我们的指令吧。

让我们继续创建一个枚举 StakeInstruction 并向其中添加四个指令。基本上,这是定义我们的指令应该做什么的操作。继续将这段代码复制粘贴到你的 instruction.rs 中。

// Instruction.rs
use solana_program::{ program_error::ProgramError };

pub enum StakeInstruction {
InitializeStakeAccount,
Stake,
Redeem,
Unstake
}

impl StakeInstruction {
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
let (&variant, _rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;
Ok(match variant {
0 => Self::InitializeStakeAccount,
1 => Self::Stake,
2 => Self::Redeem,
3 => Self::Unstake,
_ => return Err(ProgramError::InvalidInstructionData)
})
}
}

所以让我们来分解一下我们在这里做的事情。在 instruction.rs 中,我们创建了一个枚举来表示每个离散的指令,并创建了一个解包函数来反序列化数据,这里的数据是一个整数。

让我们回到 processor.rs 并定义我们的 process_instruction 函数:

// processor.rs
use solana_program:: {
account_info:: { AccountInfo, next_account_info },
entrypoint::ProgramResult,
pubkey::Pubkey,
}
use crate::instruction::StakeInstruction;

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
let instruction = StakeInstruction::unpack(instruction_data)?;

match instruction {
StakeInstruction::InitializeStakeAccount => process_initialize_stake_account(program_id, accounts),
StakeInstruction::Stake => process_stake(program_id, accounts),
StakeInstruction::Redeem => process_redeem(program_id, accounts),
StakeInstruction::Unstake => process_unstake(program_id, accounts)
}
}

/**
What this function does is to create a new PDA account that's unique to you
and your NFT. This will store the information about the state of your program
which will determine whether it's staked or not staked.
**/
fn process_initialize_stake_account(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;

Ok(())
}

fn process_stake(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
Ok(())
}

fn process_redeem(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
Ok(())
}

fn process_unstake(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
Ok(())
}

注意我们在 process_initialize_stake_account 函数中定义了变量,但是它在任何地方都没有被使用?这是因为我们需要一个结构体来表示程序的当前状态。所以让我们转到 state.rs 并定义我们的结构体。

// state.rs
use borsh:: { BorshSerialize, BorshDeserialize };
use solana_program:: {
program_pack::{ IsInitialized, Sealed },
pubkey::Pubkey,
clock::UnixTimestamp
};

#[derive(BorshSerialize, BorshDeserialize, Debug)]
pub struct UserStakeInfo {
pub is_initialized: bool,
pub token_account: Pubkey,
pub stake_start_time: UnixTimestamp,
pub last_stake_redeem: UnixTimestamp,
pub user_pubkey: Pubkey,
pub stake_state: StakeState,
}

impl Sealed for UserStakeInfo { }
impl IsInitialized for UserStakeInfo {
fn is_initialized(&self) -> bool {
self.is_initialized
}
}

#[derive(BorshSerialize, BorshDeserialize, Debug, PartialEq)]
pub enum StakeState {
Staked,
Unstaked
}

🚫自定义错误

现在让我们转到 error.rs 来为我们的程序定义自定义错误。

// error.rs
use solana_program::{ program_error::ProgramError };
use thiserror::Error;

#[derive(Debug, Error)]
pub enum StakeError {
#[error("Account not initialized yet")]
UninitializedAccount,

#[error("PDA derived does not equal PDA passed in")]
InvalidPda,

#[error("Invalid token account")]
InvalidTokenAccount,

#[error("Invalid stake account")]
InvalidStakeAccount
}

impl From<StakeError> for ProgramError {
fn from(e: StakeError) -> Self {
ProgramError::Custom(e as u32)
}
}

太棒了,现在你已经成功在 error.rs 中创建了枚举,当你运行程序时不应该再出现任何错误。

🫙 完成代码

让我们回到 processor.rs 并完成 process_initialize_stake_account 函数。

// processor.rs
use solana_program::{
account_info::{ AccountInfo, next_account_info },
entrypoint::ProgramResult,
pubkey::Pubkey,
msg,
sysvar::{ rent::Rent, Sysvar },
clock::Clock,
program_pack::IsInitialized,
system_instruction,
program::invoke_signed,
borsh::try_from_slice_unchecked,
program_error::ProgramError
};
use borsh::BorshSerialize;
use crate::instruction::StakeInstruction;
use crate::error::StakeError;
use crate::state::{ UserStakeInfo, StakeState };

fn process_initialize_stake_account(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token_account = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;

let (stake_state_pda, bump_seed) = Pubkey::find_program_address(
&[user.key.as_ref(), nft_token_account.key.as_ref()],
program_id
);

// Check to ensure that you're using the right PDA
if stake_state_pda != *stake_state.key {
msg!("Invalid seeds for PDA");
return Err(StakeError::InvalidPda.into());
}

let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(UserStakeInfo::SIZE);

msg!("Creating state account at {:?}", stake_state_pda);
invoke_signed(
&system_instruction::create_account(
user.key,
stake_state.key,
rent_lamports,
UserStakeInfo::SIZE.try_into().unwrap(),
program_id
),
&[user.clone(), stake_state.clone(), system_program.clone()],
&[&[
user.key.as_ref(),
nft_token_account.key.as_ref(),
&[bump_seed],
]],
)?;

// Let's create account
let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

if account_data.is_initialized() {
msg!("Account already initialized");
return Err(ProgramError::AccountAlreadyInitialized);
}

account_data.token_account = *nft_token_account.key;
account_data.user_pubkey = *user.key;
account_data.stake_state = StakeState::Unstaked;
account_data.is_initialized = true;

account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;

Ok(())
}

让我们转到 state.rs 并存储用户的接收信息,使用适当的数据大小。您可以将此代码放在 impl Sealed 之上。

// state.rs

impl UserStakeInfo {
/**
Here's how we determine the size of the data. In your UserStakeInfo in struct in state.rs, we have the following data.

pub is_initialized: bool, // 1 bit
pub token_account: Pubkey, // 32 bits
pub stake_start_time: UnixTimestamp, // 64 bits
pub last_stake_redeem: UnixTimestamp, // 64 bits
pub user_pubkey: Pubkey, // 32 bits
pub stake_state: StakeState, // 1 bit
**/
pub const SIZE: usize = 1 + 32 + 64 + 64 + 32 + 1;
}

现在我们刚刚写了很多代码给 process_initialize_stake_account 。如果你还不明白,不要担心。我们将会添加更多的代码来填充其他的功能。让我们进入 process_stake 函数并使用这段代码。请记住,这只是代码的一部分,请不要盲目复制粘贴。

// processor.rs

fn process_stake(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token_account = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;

let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(
&[user.key.as_ref(), nft_token_account.key.as_ref()],
program_id,
);

if stake_state_pda != *stake_state.key {
msg!("Invalid seeds for PDA");
return Err(StakeError::InvalidPda.into());
}

// Let's create account
let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

if !account_data.is_initialized() {
msg!("Account not initialized");
return Err(ProgramError::UninitializedAccount.into());
}

let clock = Clock::get()?;

account_data.token_account = *nft_token_account.key;
account_data.user_pubkey = *user.key;
account_data.stake_state = StakeState::Staked;
account_data.stake_start_time = clock.unix_timestamp;
account_data.last_stake_redeem = clock.unix_timestamp;
account_data.is_initialized = true;

account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;

Ok(())
}

就是这样!我们现在已经完成了我们的 process_stake 函数。现在让我们继续 process_redeem 。代码将与前两个函数非常相似。

// process.rs

fn process_redeem(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token_account = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;

let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(
&[user.key.as_ref(), nft_token_account.key.as_ref()],
program_id,
);

if stake_state_pda != *stake_state.key {
msg!("Invalid seeds for PDA");
return Err(StakeError::InvalidPda.into());
}

// For verification, we need to make sure it's the right signer
if !user.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature);
}

// Let's create account
let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

if !account_data.is_initialized() {
msg!("Account not initialized");
return Err(ProgramError::UninitializedAccount.into());
}

if account_data.stake_state != StakeState::Staked {
msg!("Stake account is not staking anything");
return Err(ProgramError::InvalidArgument);
}

if *user.key != account_data.user_pubkey {
msg!("Incorrect stake account for user");
return Err(StakeError::InvalidStakeAccount.into());
}

if *nft_token_account.key != account_data.token_account {
msg!("NFT Token account do not match");
return Err(StakeError::InvalidTokenAccount.into());
}

let clock = Clock::get()?;
let unix_time = clock.unix_timestamp - account_data.last_stake_redeem;
let redeem_amount = unix_time;
msg!("Redeeming {} tokens", redeem_amount);

account_data.last_stake_redeem = clock.unix_timestamp;
account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;

Ok(())
}

太棒了!我们现在就快到了。接下来进入最后一个功能 process_unstake

// process.rs

fn process_unstake(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token_account = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;

let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(
&[user.key.as_ref(), nft_token_account.key.as_ref()],
program_id,
);

if stake_state_pda != *stake_state.key {
msg!("Invalid seeds for PDA");
return Err(StakeError::InvalidPda.into());
}

// For verification, we need to make sure it's the right signer
if !user.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature);
}

// Let's create account
let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

if !account_data.is_initialized() {
msg!("Account not initialized");
return Err(ProgramError::UninitializedAccount.into());
}

if account_data.stake_state != StakeState::Staked {
msg!("Stake account is not staking anything");
return Err(ProgramError::InvalidArgument)
}

let clock = Clock::get()?;
let unix_time = clock.unix_timestamp - account_data.last_stake_redeem;
let redeem_amount = unix_time;
msg!("Redeeming {} tokens", redeem_amount);

msg!("Setting stake state to unstaked");
account_data.stake_state = StakeState::Unstaked;
account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..]);

Ok(())
}

LFG!!! 我们终于完成了所有的函数定义。现在如果你运行程序,它应该会显示 Build successful 。太棒了!我们已经完成了第三周!HALFWAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

- - +

🛠️ 构建一个NFT质押计划

今天,我们将编写我们的质押程序,并编写所有必要的质押功能,而不进行任何代币转账。我将与您一起逐步讲解整个过程,解释每个步骤,以便您了解正在发生的事情。让我们首先进入Solana Playground,在 create a new project 上点击,并创建一个名为 src 的新文件夹,其中包含一个名为 lib.rs 的文件。

这就是你的集成开发环境应该看起来的样子

目前,主要目标是编写一个程序,跟踪每个用户的质押状态。以下是一些大致的步骤:

现在你已经准备好了,我们将继续创建剩余的文件,就像我们在之前的课程中所做的那样。让我们继续在你的 src 文件夹中创建以下5个文件。这些文件是 entrypoint.rserror.rsinstruction.rsprocessor.rsstate.rs

现在应该是这个样子

我们已经准备好了!现在让我们用以下代码填充我们的 lib.rs

// Lib.rs
pub mod entrypoint;
pub mod error;
pub mod instruction;
pub mod processor;
pub mod state;

进入 entrypoint.rs 并添加以下代码

// Entrypoint.rs
use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey
};
use crate::processor;

// This macro will help process all incoming instructions
entrypoint!(process_instruction);

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
processor::process_instruction(program_id, accounts, instruction_data)?;
Ok(())
}

当你运行代码时,你会注意到这会抛出一个错误,因为我们没有在 processor.rs 中定义 process_instruction 函数。现在让我们创建这个函数。转到 processor.rs 并添加以下代码。

// Processor.rs
use solana_program::{
account_info::AccountInfo,
entrypoint::ProgramResult,
pubkey::Pubkey
};

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
Ok(())
}

现在我们已经修复了 processor.rs 的错误,你会注意到在编译代码时仍然存在错误。这是因为在你的 lib.rs 中,我们导入了一些空模块。不过不用担心,我们会在下一节中修复它们 😊 在我们开始处理 process_instruction 中的任何内容之前,我们需要在 instruction.rs 中编写出我们的指令,所以让我们开始定义我们的指令吧。

让我们继续创建一个枚举 StakeInstruction 并向其中添加四个指令。基本上,这是定义我们的指令应该做什么的操作。继续将这段代码复制粘贴到你的 instruction.rs 中。

// Instruction.rs
use solana_program::{ program_error::ProgramError };

pub enum StakeInstruction {
InitializeStakeAccount,
Stake,
Redeem,
Unstake
}

impl StakeInstruction {
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
let (&variant, _rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;
Ok(match variant {
0 => Self::InitializeStakeAccount,
1 => Self::Stake,
2 => Self::Redeem,
3 => Self::Unstake,
_ => return Err(ProgramError::InvalidInstructionData)
})
}
}

所以让我们来分解一下我们在这里做的事情。在 instruction.rs 中,我们创建了一个枚举来表示每个离散的指令,并创建了一个解包函数来反序列化数据,这里的数据是一个整数。

让我们回到 processor.rs 并定义我们的 process_instruction 函数:

// processor.rs
use solana_program:: {
account_info:: { AccountInfo, next_account_info },
entrypoint::ProgramResult,
pubkey::Pubkey,
}
use crate::instruction::StakeInstruction;

pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
let instruction = StakeInstruction::unpack(instruction_data)?;

match instruction {
StakeInstruction::InitializeStakeAccount => process_initialize_stake_account(program_id, accounts),
StakeInstruction::Stake => process_stake(program_id, accounts),
StakeInstruction::Redeem => process_redeem(program_id, accounts),
StakeInstruction::Unstake => process_unstake(program_id, accounts)
}
}

/**
What this function does is to create a new PDA account that's unique to you
and your NFT. This will store the information about the state of your program
which will determine whether it's staked or not staked.
**/
fn process_initialize_stake_account(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;

Ok(())
}

fn process_stake(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
Ok(())
}

fn process_redeem(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
Ok(())
}

fn process_unstake(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
Ok(())
}

注意我们在 process_initialize_stake_account 函数中定义了变量,但是它在任何地方都没有被使用?这是因为我们需要一个结构体来表示程序的当前状态。所以让我们转到 state.rs 并定义我们的结构体。

// state.rs
use borsh:: { BorshSerialize, BorshDeserialize };
use solana_program:: {
program_pack::{ IsInitialized, Sealed },
pubkey::Pubkey,
clock::UnixTimestamp
};

#[derive(BorshSerialize, BorshDeserialize, Debug)]
pub struct UserStakeInfo {
pub is_initialized: bool,
pub token_account: Pubkey,
pub stake_start_time: UnixTimestamp,
pub last_stake_redeem: UnixTimestamp,
pub user_pubkey: Pubkey,
pub stake_state: StakeState,
}

impl Sealed for UserStakeInfo { }
impl IsInitialized for UserStakeInfo {
fn is_initialized(&self) -> bool {
self.is_initialized
}
}

#[derive(BorshSerialize, BorshDeserialize, Debug, PartialEq)]
pub enum StakeState {
Staked,
Unstaked
}

🚫自定义错误

现在让我们转到 error.rs 来为我们的程序定义自定义错误。

// error.rs
use solana_program::{ program_error::ProgramError };
use thiserror::Error;

#[derive(Debug, Error)]
pub enum StakeError {
#[error("Account not initialized yet")]
UninitializedAccount,

#[error("PDA derived does not equal PDA passed in")]
InvalidPda,

#[error("Invalid token account")]
InvalidTokenAccount,

#[error("Invalid stake account")]
InvalidStakeAccount
}

impl From<StakeError> for ProgramError {
fn from(e: StakeError) -> Self {
ProgramError::Custom(e as u32)
}
}

太棒了,现在你已经成功在 error.rs 中创建了枚举,当你运行程序时不应该再出现任何错误。

🫙 完成代码

让我们回到 processor.rs 并完成 process_initialize_stake_account 函数。

// processor.rs
use solana_program::{
account_info::{ AccountInfo, next_account_info },
entrypoint::ProgramResult,
pubkey::Pubkey,
msg,
sysvar::{ rent::Rent, Sysvar },
clock::Clock,
program_pack::IsInitialized,
system_instruction,
program::invoke_signed,
borsh::try_from_slice_unchecked,
program_error::ProgramError
};
use borsh::BorshSerialize;
use crate::instruction::StakeInstruction;
use crate::error::StakeError;
use crate::state::{ UserStakeInfo, StakeState };

fn process_initialize_stake_account(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token_account = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;

let (stake_state_pda, bump_seed) = Pubkey::find_program_address(
&[user.key.as_ref(), nft_token_account.key.as_ref()],
program_id
);

// Check to ensure that you're using the right PDA
if stake_state_pda != *stake_state.key {
msg!("Invalid seeds for PDA");
return Err(StakeError::InvalidPda.into());
}

let rent = Rent::get()?;
let rent_lamports = rent.minimum_balance(UserStakeInfo::SIZE);

msg!("Creating state account at {:?}", stake_state_pda);
invoke_signed(
&system_instruction::create_account(
user.key,
stake_state.key,
rent_lamports,
UserStakeInfo::SIZE.try_into().unwrap(),
program_id
),
&[user.clone(), stake_state.clone(), system_program.clone()],
&[&[
user.key.as_ref(),
nft_token_account.key.as_ref(),
&[bump_seed],
]],
)?;

// Let's create account
let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

if account_data.is_initialized() {
msg!("Account already initialized");
return Err(ProgramError::AccountAlreadyInitialized);
}

account_data.token_account = *nft_token_account.key;
account_data.user_pubkey = *user.key;
account_data.stake_state = StakeState::Unstaked;
account_data.is_initialized = true;

account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;

Ok(())
}

让我们转到 state.rs 并存储用户的接收信息,使用适当的数据大小。您可以将此代码放在 impl Sealed 之上。

// state.rs

impl UserStakeInfo {
/**
Here's how we determine the size of the data. In your UserStakeInfo in struct in state.rs, we have the following data.

pub is_initialized: bool, // 1 bit
pub token_account: Pubkey, // 32 bits
pub stake_start_time: UnixTimestamp, // 64 bits
pub last_stake_redeem: UnixTimestamp, // 64 bits
pub user_pubkey: Pubkey, // 32 bits
pub stake_state: StakeState, // 1 bit
**/
pub const SIZE: usize = 1 + 32 + 64 + 64 + 32 + 1;
}

现在我们刚刚写了很多代码给 process_initialize_stake_account 。如果你还不明白,不要担心。我们将会添加更多的代码来填充其他的功能。让我们进入 process_stake 函数并使用这段代码。请记住,这只是代码的一部分,请不要盲目复制粘贴。

// processor.rs

fn process_stake(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token_account = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;

let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(
&[user.key.as_ref(), nft_token_account.key.as_ref()],
program_id,
);

if stake_state_pda != *stake_state.key {
msg!("Invalid seeds for PDA");
return Err(StakeError::InvalidPda.into());
}

// Let's create account
let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

if !account_data.is_initialized() {
msg!("Account not initialized");
return Err(ProgramError::UninitializedAccount.into());
}

let clock = Clock::get()?;

account_data.token_account = *nft_token_account.key;
account_data.user_pubkey = *user.key;
account_data.stake_state = StakeState::Staked;
account_data.stake_start_time = clock.unix_timestamp;
account_data.last_stake_redeem = clock.unix_timestamp;
account_data.is_initialized = true;

account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;

Ok(())
}

就是这样!我们现在已经完成了我们的 process_stake 函数。现在让我们继续 process_redeem 。代码将与前两个函数非常相似。

// process.rs

fn process_redeem(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token_account = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;

let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(
&[user.key.as_ref(), nft_token_account.key.as_ref()],
program_id,
);

if stake_state_pda != *stake_state.key {
msg!("Invalid seeds for PDA");
return Err(StakeError::InvalidPda.into());
}

// For verification, we need to make sure it's the right signer
if !user.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature);
}

// Let's create account
let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

if !account_data.is_initialized() {
msg!("Account not initialized");
return Err(ProgramError::UninitializedAccount.into());
}

if account_data.stake_state != StakeState::Staked {
msg!("Stake account is not staking anything");
return Err(ProgramError::InvalidArgument);
}

if *user.key != account_data.user_pubkey {
msg!("Incorrect stake account for user");
return Err(StakeError::InvalidStakeAccount.into());
}

if *nft_token_account.key != account_data.token_account {
msg!("NFT Token account do not match");
return Err(StakeError::InvalidTokenAccount.into());
}

let clock = Clock::get()?;
let unix_time = clock.unix_timestamp - account_data.last_stake_redeem;
let redeem_amount = unix_time;
msg!("Redeeming {} tokens", redeem_amount);

account_data.last_stake_redeem = clock.unix_timestamp;
account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..])?;

Ok(())
}

太棒了!我们现在就快到了。接下来进入最后一个功能 process_unstake

// process.rs

fn process_unstake(
program_id: &Pubkey,
accounts: &[AccountInfo]
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let user = next_account_info(account_info_iter)?;
let nft_token_account = next_account_info(account_info_iter)?;
let stake_state = next_account_info(account_info_iter)?;

let (stake_state_pda, _bump_seed) = Pubkey::find_program_address(
&[user.key.as_ref(), nft_token_account.key.as_ref()],
program_id,
);

if stake_state_pda != *stake_state.key {
msg!("Invalid seeds for PDA");
return Err(StakeError::InvalidPda.into());
}

// For verification, we need to make sure it's the right signer
if !user.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature);
}

// Let's create account
let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

if !account_data.is_initialized() {
msg!("Account not initialized");
return Err(ProgramError::UninitializedAccount.into());
}

if account_data.stake_state != StakeState::Staked {
msg!("Stake account is not staking anything");
return Err(ProgramError::InvalidArgument)
}

let clock = Clock::get()?;
let unix_time = clock.unix_timestamp - account_data.last_stake_redeem;
let redeem_amount = unix_time;
msg!("Redeeming {} tokens", redeem_amount);

msg!("Setting stake state to unstaked");
account_data.stake_state = StakeState::Unstaked;
account_data.serialize(&mut &mut stake_state.data.borrow_mut()[..]);

Ok(())
}

LFG!!! 我们终于完成了所有的函数定义。现在如果你运行程序,它应该会显示 Build successful 。太棒了!我们已经完成了第三周!HALFWAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/index.html b/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/index.html index 38914a1fb..1f339e90e 100644 --- a/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/index.html +++ b/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/index.html @@ -3,17 +3,17 @@ -🕒 质押的工作原理 | All in One Solana - - - +🕒 质押的工作原理 | All in One Solana + + +
-

🕒 质押的工作原理

你已经接近完成第三周了!让我们把你学到的一切都用在与你正在进行的NFT项目(buildoors项目)相关的质押计划上。

我们希望您为质押计划搭建所有内容,除了实际的代币功能。这意味着在您预期与代币程序进行交互的任何地方,我们只会记录一条消息或跳过它,并在下周重新审视。

目前,主要目标是编写一个程序,跟踪每个用户的质押状态。以下是一些大致的步骤:

应该有4个指示:

  • InitializeStakeAccount - 这将创建一个新的账户,用于存储每个用户/非同质化代币组合的质押过程的状态信息。该PDA的种子应为用户的公钥和非同质化代币的令牌账户。
  • 质押 - 这个指令通常是实际进行质押的地方。然而,我们目前不会进行任何真正的质押。我们只是要更新“状态”账户,以反映出代币已被质押,质押的时间等信息。
  • 兑换 - 这是您根据用户抵押时间来发送奖励代币的地方。但现在只需记录他们应该获得多少代币(暂时可以假设每单位时间1个代币),并更新状态以反映他们上次兑换代币的时间。
  • 解除质押 - 这是您赎回任何额外代币并解除 NFT 质押的地方。目前,这只意味着更新状态以反映 NFT 未质押,并记录应获得的奖励代币数量。

这是具有挑战性的。在参考解决方案或观看视频指导之前,先试着自己设计一些东西。如果你做得不完美也没关系,挣扎是学习的一部分。 +

🕒 质押的工作原理

你已经接近完成第三周了!让我们把你学到的一切都用在与你正在进行的NFT项目(buildoors项目)相关的质押计划上。

我们希望您为质押计划搭建所有内容,除了实际的代币功能。这意味着在您预期与代币程序进行交互的任何地方,我们只会记录一条消息或跳过它,并在下周重新审视。

目前,主要目标是编写一个程序,跟踪每个用户的质押状态。以下是一些大致的步骤:

应该有4个指示:

  • InitializeStakeAccount - 这将创建一个新的账户,用于存储每个用户/非同质化代币组合的质押过程的状态信息。该PDA的种子应为用户的公钥和非同质化代币的令牌账户。
  • 质押 - 这个指令通常是实际进行质押的地方。然而,我们目前不会进行任何真正的质押。我们只是要更新“状态”账户,以反映出代币已被质押,质押的时间等信息。
  • 兑换 - 这是您根据用户抵押时间来发送奖励代币的地方。但现在只需记录他们应该获得多少代币(暂时可以假设每单位时间1个代币),并更新状态以反映他们上次兑换代币的时间。
  • 解除质押 - 这是您赎回任何额外代币并解除 NFT 质押的地方。目前,这只意味着更新状态以反映 NFT 未质押,并记录应获得的奖励代币数量。

这是具有挑战性的。在参考解决方案或观看视频指导之前,先试着自己设计一些东西。如果你做得不完美也没关系,挣扎是学习的一部分。 提示:您可以使用solana_program::clock::Clock来获取时间。如果需要,可以查看文档。 -如果你已经尽力尝试了一切,可以随意查看解决方案代码。如果你想继续,欢迎开始为质押和与该程序进行交互的用户界面进行开发。

- - +如果你已经尽力尝试了一切,可以随意查看解决方案代码。如果你想继续,欢迎开始为质押和与该程序进行交互的用户界面进行开发。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/nft-staking/index.html b/docs/Solana-Co-Learn/module3/nft-staking/index.html index 674f9747e..1189bfcbf 100644 --- a/docs/Solana-Co-Learn/module3/nft-staking/index.html +++ b/docs/Solana-Co-Learn/module3/nft-staking/index.html @@ -3,15 +3,15 @@ -NFT质押 | All in One Solana - - - +NFT质押 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/index.html b/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/index.html index 88f23bd59..fdef53010 100644 --- a/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/index.html +++ b/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/index.html @@ -3,16 +3,16 @@ -❗ 错误处理和数据验证 | All in One Solana - - - +❗ 错误处理和数据验证 | All in One Solana + + +
-

❗ 错误处理和数据验证

嘿!准备好成为一位州长了吗?不不,我们不是在做那种国家管理。我们所说的州是指我们程序中存储在链上的数据。如果你要建立,就必须准备好进行防御。在这节课中,我们将介绍一些需要注意的基本陷阱。这远非是程序安全的全面概述,但它将帮助你像攻击者一样思考,并提出重要的问题:我该如何破解这个?

😡 自定义错误

Rust拥有一个非常强大的错误处理系统。你已经遇到了一些规则和编译器如何强制你处理异常情况的情况。

这是我们为我们的笔记程序创建自定义错误的方法:

use solana_program::{program_error::ProgramError};
use thiserror::Error;

#[derive(Error)]
pub enum NoteError {
#[error("Wrong note owner")]
Forbidden,

#[error("Text is too long")]
InvalidLength
}

derive宏属性接受错误特质并将其应用于NoteError枚举,为其提供默认实现以使其成为错误。

我们将为每种错误类型提供自己的#[error("...")]标记来提供错误信息。

返回自定义错误

程序返回的错误必须是类型 ProgramError -使用 impl 将我们的自定义错误和 ProgramError 类型转换

在Solana程序中,我们只能从 solana_program crate返回 ProgramError 类型的错误。我们可以实现 From trait将我们自定义的错误转换为 ProgramError 类型。

impl From<NoteError> for ProgramError {
fn from(e: NoteError) -> Self {
ProgramError::Custom(e as u32)
}
}

然后当我们需要实际返回错误时,我们使用 into() 方法将错误转换为 ProgramError 的实例

if pda != *note_pda.key {
return Err(NoteError::Forbidden.into());
}

🔓 基本安全

有几项基本的安全措施可以帮助您提高程序的安全性:

  • 所有权检查 - 验证账户是否由该程序拥有
  • 签名者检查 - 验证账户是否已签署交易
  • 通用账户验证 - 验证账户是否为预期账户
  • 数据验证 - 验证用户提供的输入

一般来说,你应该始终验证从用户那里收到的输入。当你处理用户提供的数据时,这尤为重要。记住 - 程序不会保存状态。它们不知道它们的所有者是谁,除非你告诉它们,它们也不会检查谁在调用它们。

所有权检查

所有权检查验证账户是否由预期的程序拥有。一定要确保只有你能够访问它。

用户有可能发送与账户数据结构匹配但由不同程序创建的数据。

if note_pda.owner != program_id {
return Err(ProgramError::InvalidNoteAccount);
}

签署者检查

签名者检查只是验证一个账户是否签署了一笔交易

if !initializer.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature)
}

例如,我们希望在处理 update 指令之前验证笔记创建者是否已签署该交易。否则,任何人都可以通过将用户的公钥作为初始化器来更新另一个用户的笔记。

数据验证

在适当的情况下,您还应该验证客户提供的指令数据。

例如,您可能有一个游戏程序,用户可以将角色属性点分配给各个类别。

您可能希望验证现有的积分分配加上新的分配是否超过了最大值

if character.agility + new_agility > 100 {
msg!("Attribute points cannot exceed 100");
return Err(AttributeError::TooHigh.into())
}

或者,角色可能有一定数量的属性点可以分配,你希望确保他们不超过这个限额。

if attribute_allowance > new_agility {
msg!("Trying to allocate more points than allowed");
return Err(AttributeError::ExceedsAllowance.into())
}

整数溢出和下溢

Rust整数具有固定的大小,意味着它们只能支持特定范围的数字。如果进行算术运算得到的值超出了范围,那么结果将会被包裹回来。

如果你曾经听说过电子游戏《文明》中的核甘地,这就是导致这一情况的原因。他本应是一个非常冷静和和平的领导者,具有非常低的攻击性指数。但开发人员没有验证该指数不会溢出,结果从0增加到255,他反而成为了一个具有最高攻击性的核战争领袖。糟糕。

为了避免整数溢出和下溢,可以选择以下方法之一:

  • 确保逻辑上不会发生溢出或下溢的情况
  • 使用已检查的数学符号 checked_add 而不是 +
let first_int: u8 = 5;
let second_int: u8 = 255;
let sum = first_int.checked_add(second_int);

想想那些连最基本的安全措施都没有采取的程序。想象一下那些漏洞赏金🥵🤑。

- - +

❗ 错误处理和数据验证

嘿!准备好成为一位州长了吗?不不,我们不是在做那种国家管理。我们所说的州是指我们程序中存储在链上的数据。如果你要建立,就必须准备好进行防御。在这节课中,我们将介绍一些需要注意的基本陷阱。这远非是程序安全的全面概述,但它将帮助你像攻击者一样思考,并提出重要的问题:我该如何破解这个?

😡 自定义错误

Rust拥有一个非常强大的错误处理系统。你已经遇到了一些规则和编译器如何强制你处理异常情况的情况。

这是我们为我们的笔记程序创建自定义错误的方法:

use solana_program::{program_error::ProgramError};
use thiserror::Error;

#[derive(Error)]
pub enum NoteError {
#[error("Wrong note owner")]
Forbidden,

#[error("Text is too long")]
InvalidLength
}

derive宏属性接受错误特质并将其应用于NoteError枚举,为其提供默认实现以使其成为错误。

我们将为每种错误类型提供自己的#[error("...")]标记来提供错误信息。

返回自定义错误

程序返回的错误必须是类型 ProgramError +使用 impl 将我们的自定义错误和 ProgramError 类型转换

在Solana程序中,我们只能从 solana_program crate返回 ProgramError 类型的错误。我们可以实现 From trait将我们自定义的错误转换为 ProgramError 类型。

impl From<NoteError> for ProgramError {
fn from(e: NoteError) -> Self {
ProgramError::Custom(e as u32)
}
}

然后当我们需要实际返回错误时,我们使用 into() 方法将错误转换为 ProgramError 的实例

if pda != *note_pda.key {
return Err(NoteError::Forbidden.into());
}

🔓 基本安全

有几项基本的安全措施可以帮助您提高程序的安全性:

  • 所有权检查 - 验证账户是否由该程序拥有
  • 签名者检查 - 验证账户是否已签署交易
  • 通用账户验证 - 验证账户是否为预期账户
  • 数据验证 - 验证用户提供的输入

一般来说,你应该始终验证从用户那里收到的输入。当你处理用户提供的数据时,这尤为重要。记住 - 程序不会保存状态。它们不知道它们的所有者是谁,除非你告诉它们,它们也不会检查谁在调用它们。

所有权检查

所有权检查验证账户是否由预期的程序拥有。一定要确保只有你能够访问它。

用户有可能发送与账户数据结构匹配但由不同程序创建的数据。

if note_pda.owner != program_id {
return Err(ProgramError::InvalidNoteAccount);
}

签署者检查

签名者检查只是验证一个账户是否签署了一笔交易

if !initializer.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature)
}

例如,我们希望在处理 update 指令之前验证笔记创建者是否已签署该交易。否则,任何人都可以通过将用户的公钥作为初始化器来更新另一个用户的笔记。

数据验证

在适当的情况下,您还应该验证客户提供的指令数据。

例如,您可能有一个游戏程序,用户可以将角色属性点分配给各个类别。

您可能希望验证现有的积分分配加上新的分配是否超过了最大值

if character.agility + new_agility > 100 {
msg!("Attribute points cannot exceed 100");
return Err(AttributeError::TooHigh.into())
}

或者,角色可能有一定数量的属性点可以分配,你希望确保他们不超过这个限额。

if attribute_allowance > new_agility {
msg!("Trying to allocate more points than allowed");
return Err(AttributeError::ExceedsAllowance.into())
}

整数溢出和下溢

Rust整数具有固定的大小,意味着它们只能支持特定范围的数字。如果进行算术运算得到的值超出了范围,那么结果将会被包裹回来。

如果你曾经听说过电子游戏《文明》中的核甘地,这就是导致这一情况的原因。他本应是一个非常冷静和和平的领导者,具有非常低的攻击性指数。但开发人员没有验证该指数不会溢出,结果从0增加到255,他反而成为了一个具有最高攻击性的核战争领袖。糟糕。

为了避免整数溢出和下溢,可以选择以下方法之一:

  • 确保逻辑上不会发生溢出或下溢的情况
  • 使用已检查的数学符号 checked_add 而不是 +
let first_int: u8 = 5;
let second_int: u8 = 255;
let sum = first_int.checked_add(second_int);

想想那些连最基本的安全措施都没有采取的程序。想象一下那些漏洞赏金🥵🤑。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/security-and-validation/index.html b/docs/Solana-Co-Learn/module3/security-and-validation/index.html index 8ff2dd20c..bb164757c 100644 --- a/docs/Solana-Co-Learn/module3/security-and-validation/index.html +++ b/docs/Solana-Co-Learn/module3/security-and-validation/index.html @@ -3,15 +3,15 @@ -安全和验证 | All in One Solana - - - +安全和验证 | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/index.html b/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/index.html index 42b4e0671..fc0a1b48f 100644 --- a/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/index.html +++ b/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/index.html @@ -3,15 +3,15 @@ -🔑 保护我们的程序 | All in One Solana - - - +🔑 保护我们的程序 | All in One Solana + + +
-

🔑 保护我们的程序

是时候确保没有人能够对我们的Solana电影数据库(SMDB)程序进行干扰了。我们将添加一些基本的安全措施,进行一些输入验证,并添加一条 update_movie_review 指令。

我会在一个点击中帮你开始,看看这个Playground设置

完整的文件结构如下:

  • lib.rs - 注册模块
  • entrypoint.rs - 程序的入口点
  • instruction.rs - 序列化和反序列化指令数据
  • processor.rs - 处理指令的程序逻辑
  • state.rs - 序列化和反序列化状态
  • error.rs - 自定义程序错误

请注意与“状态管理”结束时的起始代码的变化

processor.rs 中:

  • account_len 函数中, add_movie_review 被更改为固定大小的 1000

  • 这样,当用户更新他们的电影评论时,我们就不必担心重新分配大小或重新计算租金。

// from this
let account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());

// to this
let account_len: usize = 1000;

state.rs

  • 实现一个函数,检查 is_initialized 结构体上的 is_initialized 字段。
  • Sealed 实现了 MovieAccountState ,它指定 MovieAccountState 具有已知大小并提供了一些编译器优化。
// inside state.rs
impl Sealed for MovieAccountState {}

impl IsInitialized for MovieAccountState {
fn is_initialized(&self) -> bool {
self.is_initialized
}
}

让我们从一些自定义错误开始!

我们需要一些可以在以下情况下使用的错误

  • 更新指令已在尚未初始化的帐户上调用
  • 提供的PDA与预期或派生的PDA不匹配
  • 输入数据大于程序允许的范围
  • 所提供的评级不在1-5范围内

error.rs 中:

  • 创建枚举类型 ReviewError
  • 实现转换为 ProgramError
// inside error.rs
use solana_program::{program_error::ProgramError};
use thiserror::Error;

#[derive(Debug, Error)]
pub enum ReviewError{
// Error 0
#[error("Account not initialized yet")]
UninitializedAccount,
// Error 1
#[error("PDA derived does not equal PDA passed in")]
InvalidPDA,
// Error 2
#[error("Input data exceeds max length")]
InvalidDataLength,
// Error 3
#[error("Rating greater than 5 or less than 1")]
InvalidRating,
}

impl From<ReviewError> for ProgramError {
fn from(e: ReviewError) -> Self {
ProgramError::Custom(e as u32)
}
}

请前往 processor.rs 并将 ReviewError 纳入范围。

// inside processor.rs
use crate::error::ReviewError;

接下来,我们将为 add_movie_review 函数添加安全检查。

签署人检查

  • 确保评论的 initializer 也是交易的签署人。
let account_info_iter = &mut accounts.iter();

let initializer = next_account_info(account_info_iter)?;
let pda_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;

// add check here
if !initializer.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature)
}

账户验证

  • 确保用户传入的 pda_account 是我们期望的 pda
let (pda, bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes().as_ref(),], program_id);
if pda != *pda_account.key {
msg!("Invalid seeds for PDA");
return Err(ProgramError::InvalidArgument)
}

数据验证

  • 确保 rating15的评分范围内。我们不希望有069星的评价,哈哈。
if rating > 5 || rating < 1 {
msg!("Rating cannot be higher than 5");
return Err(ReviewError::InvalidRating.into())
}
  • 让我们还要检查一下评论的内容是否超出了分配的空间
let total_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());
if total_len > 1000 {
msg!("Data length is larger than 1000 bytes");
return Err(ReviewError::InvalidDataLength.into())
}

⬆ 更新电影评论

现在是有趣的部分!让我们添加 update_movie_review 指令。

我们将从更新 MovieInstruction 枚举在 instruction.rs 文件开始:

// inside instruction.rs
pub enum MovieInstruction {
AddMovieReview {
title: String,
rating: u8,
description: String
},
UpdateMovieReview {
title: String,
rating: u8,
description: String
}
}

Payload结构体可以保持不变,因为除了变体类型之外,指令数据与我们用于 AddMovieReview 的相同。

我们还需要将这个新的变体添加到同一文件中的 unpack 函数中

// inside instruction.rs
impl MovieInstruction {
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;
let payload = MovieReviewPayload::try_from_slice(rest).unwrap();
Ok(match variant {
0 => Self::AddMovieReview {
title: payload.title,
rating: payload.rating,
description: payload.description },
1 => Self::UpdateMovieReview {
title: payload.title,
rating: payload.rating,
description: payload.description },
_ => return Err(ProgramError::InvalidInstructionData)
})
}
}

最后,在 process_instruction 函数的匹配语句中添加 update_movie_review

// inside processor.rs
pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
// unpack instruction data
let instruction = MovieInstruction::unpack(instruction_data)?;
match instruction {
MovieInstruction::AddMovieReview { title, rating, description } => {
add_movie_review(program_id, accounts, title, rating, description)
},
// add UpdateMovieReview to match against our new data structure
MovieInstruction::UpdateMovieReview { title, rating, description } => {
// make call to update function that we'll define next
update_movie_review(program_id, accounts, title, rating, description)
}
}
}

我们需要更新的所有地方的快速回顾,以添加新的指示:

  1. instruction.rs:
  • MovieInstruction 枚举中添加新的变量
  • 添加新的变体到 unpack 函数
  • (可选)- 添加新的负载结构体
  1. processor.rs
  • process_instruction 匹配语句中添加新的变体

现在我们准备好编写实际的 update_movie_review 函数了!

我们将从账户开始迭代:

pub fn update_movie_review(
program_id: &Pubkey,
accounts: &[AccountInfo],
_title: String,
rating: u8,
description: String
) -> ProgramResult {
msg!("Updating movie review...");

// Get Account iterator
let account_info_iter = &mut accounts.iter();

// Get accounts
let initializer = next_account_info(account_info_iter)?;
let pda_account = next_account_info(account_info_iter)?;

Ok(())
}

现在是一个好时机,检查一下 pda_account.owner 是否与 program_id 相同:

if pda_account.owner != program_id {
return Err(ProgramError::IllegalOwner)
}

接下来我们将检查签署者是否与初始化者相同:

if !initializer.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature)
}

现在我们可以从 pda_account 中解压数据:

msg!("unpacking state account");
let mut account_data = try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();
msg!("borrowed account data");

对这些全新数据的最后一次验证:

// Derive PDA and check that it matches client
let (pda, _bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), account_data.title.as_bytes().as_ref(),], program_id);

if pda != *pda_account.key {
msg!("Invalid seeds for PDA");
return Err(ReviewError::InvalidPDA.into())
}

if !account_data.is_initialized() {
msg!("Account is not initialized");
return Err(ReviewError::UninitializedAccount.into());
}

if rating > 5 || rating < 1 {
msg!("Rating cannot be higher than 5");
return Err(ReviewError::InvalidRating.into())
}

let total_len: usize = 1 + 1 + (4 + account_data.title.len()) + (4 + description.len());
if total_len > 1000 {
msg!("Data length is larger than 1000 bytes");
return Err(ReviewError::InvalidDataLength.into())
}

哇,这是一大堆支票啊。让我感觉自己像个银行出纳员,哈哈。

最后一步是更新账户信息并将其序列化为账户

account_data.rating = rating;
account_data.description = description;

account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;

我们做到了!我们在我们的程序中添加了一条新的指令,并使其非常安全。让我们来测试一下吧!

构建 -> 升级 -> 复制地址 -> 粘贴到前端

git clone https://github.com/buildspace/solana-movie-frontend/
cd solana-movie-frontend
git checkout solution-update-reviews
npm install

你的前端现在应该显示评论了!你可以添加评论并更新你的旧评论!

🚢 船舶挑战

现在轮到你独立构建一些东西了,你可以在之前课程中使用过的学生介绍程序的基础上进行构建。

学生介绍计划是Solana的一个项目,让学生们可以介绍自己。该计划会接收用户的姓名和简短留言作为 instruction_data ,并创建一个账户将这些数据存储在链上。

使用你在本课程中学到的知识,尝试将所学应用于学生介绍计划。该计划应该:

  1. 添加一条指示,允许学生更新他们的留言

  2. 在这节课中,实施我们所学的基本安全检查

请随意使用这个起始代码

如果可以的话,尽量独立完成这个任务!但如果遇到困难,可以参考解决方案代码。请注意,根据你实现的检查和错误编写,你的代码可能与解决方案代码略有不同。

- - +

🔑 保护我们的程序

是时候确保没有人能够对我们的Solana电影数据库(SMDB)程序进行干扰了。我们将添加一些基本的安全措施,进行一些输入验证,并添加一条 update_movie_review 指令。

我会在一个点击中帮你开始,看看这个Playground设置

完整的文件结构如下:

  • lib.rs - 注册模块
  • entrypoint.rs - 程序的入口点
  • instruction.rs - 序列化和反序列化指令数据
  • processor.rs - 处理指令的程序逻辑
  • state.rs - 序列化和反序列化状态
  • error.rs - 自定义程序错误

请注意与“状态管理”结束时的起始代码的变化

processor.rs 中:

  • account_len 函数中, add_movie_review 被更改为固定大小的 1000

  • 这样,当用户更新他们的电影评论时,我们就不必担心重新分配大小或重新计算租金。

// from this
let account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());

// to this
let account_len: usize = 1000;

state.rs

  • 实现一个函数,检查 is_initialized 结构体上的 is_initialized 字段。
  • Sealed 实现了 MovieAccountState ,它指定 MovieAccountState 具有已知大小并提供了一些编译器优化。
// inside state.rs
impl Sealed for MovieAccountState {}

impl IsInitialized for MovieAccountState {
fn is_initialized(&self) -> bool {
self.is_initialized
}
}

让我们从一些自定义错误开始!

我们需要一些可以在以下情况下使用的错误

  • 更新指令已在尚未初始化的帐户上调用
  • 提供的PDA与预期或派生的PDA不匹配
  • 输入数据大于程序允许的范围
  • 所提供的评级不在1-5范围内

error.rs 中:

  • 创建枚举类型 ReviewError
  • 实现转换为 ProgramError
// inside error.rs
use solana_program::{program_error::ProgramError};
use thiserror::Error;

#[derive(Debug, Error)]
pub enum ReviewError{
// Error 0
#[error("Account not initialized yet")]
UninitializedAccount,
// Error 1
#[error("PDA derived does not equal PDA passed in")]
InvalidPDA,
// Error 2
#[error("Input data exceeds max length")]
InvalidDataLength,
// Error 3
#[error("Rating greater than 5 or less than 1")]
InvalidRating,
}

impl From<ReviewError> for ProgramError {
fn from(e: ReviewError) -> Self {
ProgramError::Custom(e as u32)
}
}

请前往 processor.rs 并将 ReviewError 纳入范围。

// inside processor.rs
use crate::error::ReviewError;

接下来,我们将为 add_movie_review 函数添加安全检查。

签署人检查

  • 确保评论的 initializer 也是交易的签署人。
let account_info_iter = &mut accounts.iter();

let initializer = next_account_info(account_info_iter)?;
let pda_account = next_account_info(account_info_iter)?;
let system_program = next_account_info(account_info_iter)?;

// add check here
if !initializer.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature)
}

账户验证

  • 确保用户传入的 pda_account 是我们期望的 pda
let (pda, bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes().as_ref(),], program_id);
if pda != *pda_account.key {
msg!("Invalid seeds for PDA");
return Err(ProgramError::InvalidArgument)
}

数据验证

  • 确保 rating15的评分范围内。我们不希望有069星的评价,哈哈。
if rating > 5 || rating < 1 {
msg!("Rating cannot be higher than 5");
return Err(ReviewError::InvalidRating.into())
}
  • 让我们还要检查一下评论的内容是否超出了分配的空间
let total_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());
if total_len > 1000 {
msg!("Data length is larger than 1000 bytes");
return Err(ReviewError::InvalidDataLength.into())
}

⬆ 更新电影评论

现在是有趣的部分!让我们添加 update_movie_review 指令。

我们将从更新 MovieInstruction 枚举在 instruction.rs 文件开始:

// inside instruction.rs
pub enum MovieInstruction {
AddMovieReview {
title: String,
rating: u8,
description: String
},
UpdateMovieReview {
title: String,
rating: u8,
description: String
}
}

Payload结构体可以保持不变,因为除了变体类型之外,指令数据与我们用于 AddMovieReview 的相同。

我们还需要将这个新的变体添加到同一文件中的 unpack 函数中

// inside instruction.rs
impl MovieInstruction {
pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;
let payload = MovieReviewPayload::try_from_slice(rest).unwrap();
Ok(match variant {
0 => Self::AddMovieReview {
title: payload.title,
rating: payload.rating,
description: payload.description },
1 => Self::UpdateMovieReview {
title: payload.title,
rating: payload.rating,
description: payload.description },
_ => return Err(ProgramError::InvalidInstructionData)
})
}
}

最后,在 process_instruction 函数的匹配语句中添加 update_movie_review

// inside processor.rs
pub fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8]
) -> ProgramResult {
// unpack instruction data
let instruction = MovieInstruction::unpack(instruction_data)?;
match instruction {
MovieInstruction::AddMovieReview { title, rating, description } => {
add_movie_review(program_id, accounts, title, rating, description)
},
// add UpdateMovieReview to match against our new data structure
MovieInstruction::UpdateMovieReview { title, rating, description } => {
// make call to update function that we'll define next
update_movie_review(program_id, accounts, title, rating, description)
}
}
}

我们需要更新的所有地方的快速回顾,以添加新的指示:

  1. instruction.rs:
  • MovieInstruction 枚举中添加新的变量
  • 添加新的变体到 unpack 函数
  • (可选)- 添加新的负载结构体
  1. processor.rs
  • process_instruction 匹配语句中添加新的变体

现在我们准备好编写实际的 update_movie_review 函数了!

我们将从账户开始迭代:

pub fn update_movie_review(
program_id: &Pubkey,
accounts: &[AccountInfo],
_title: String,
rating: u8,
description: String
) -> ProgramResult {
msg!("Updating movie review...");

// Get Account iterator
let account_info_iter = &mut accounts.iter();

// Get accounts
let initializer = next_account_info(account_info_iter)?;
let pda_account = next_account_info(account_info_iter)?;

Ok(())
}

现在是一个好时机,检查一下 pda_account.owner 是否与 program_id 相同:

if pda_account.owner != program_id {
return Err(ProgramError::IllegalOwner)
}

接下来我们将检查签署者是否与初始化者相同:

if !initializer.is_signer {
msg!("Missing required signature");
return Err(ProgramError::MissingRequiredSignature)
}

现在我们可以从 pda_account 中解压数据:

msg!("unpacking state account");
let mut account_data = try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();
msg!("borrowed account data");

对这些全新数据的最后一次验证:

// Derive PDA and check that it matches client
let (pda, _bump_seed) = Pubkey::find_program_address(&[initializer.key.as_ref(), account_data.title.as_bytes().as_ref(),], program_id);

if pda != *pda_account.key {
msg!("Invalid seeds for PDA");
return Err(ReviewError::InvalidPDA.into())
}

if !account_data.is_initialized() {
msg!("Account is not initialized");
return Err(ReviewError::UninitializedAccount.into());
}

if rating > 5 || rating < 1 {
msg!("Rating cannot be higher than 5");
return Err(ReviewError::InvalidRating.into())
}

let total_len: usize = 1 + 1 + (4 + account_data.title.len()) + (4 + description.len());
if total_len > 1000 {
msg!("Data length is larger than 1000 bytes");
return Err(ReviewError::InvalidDataLength.into())
}

哇,这是一大堆支票啊。让我感觉自己像个银行出纳员,哈哈。

最后一步是更新账户信息并将其序列化为账户

account_data.rating = rating;
account_data.description = description;

account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;

我们做到了!我们在我们的程序中添加了一条新的指令,并使其非常安全。让我们来测试一下吧!

构建 -> 升级 -> 复制地址 -> 粘贴到前端

git clone https://github.com/buildspace/solana-movie-frontend/
cd solana-movie-frontend
git checkout solution-update-reviews
npm install

你的前端现在应该显示评论了!你可以添加评论并更新你的旧评论!

🚢 船舶挑战

现在轮到你独立构建一些东西了,你可以在之前课程中使用过的学生介绍程序的基础上进行构建。

学生介绍计划是Solana的一个项目,让学生们可以介绍自己。该计划会接收用户的姓名和简短留言作为 instruction_data ,并创建一个账户将这些数据存储在链上。

使用你在本课程中学到的知识,尝试将所学应用于学生介绍计划。该计划应该:

  1. 添加一条指示,允许学生更新他们的留言

  2. 在这节课中,实施我们所学的基本安全检查

请随意使用这个起始代码

如果可以的话,尽量独立完成这个任务!但如果遇到困难,可以参考解决方案代码。请注意,根据你实现的检查和错误编写,你的代码可能与解决方案代码略有不同。

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module4/index.html b/docs/Solana-Co-Learn/module4/index.html index 8cf93ed4b..dffab0945 100644 --- a/docs/Solana-Co-Learn/module4/index.html +++ b/docs/Solana-Co-Learn/module4/index.html @@ -3,15 +3,15 @@ -Solana Module4 | All in One Solana - - - +Solana Module4 | All in One Solana + + +
-

Solana Module4

本地环境设置和PDA

  • 👀 本地设置
  • 带有Gage的PDA
  • PDA深入探究
  • 在链上构建评论

跨程序调用

  • CPIs with Gage
  • 跨项目的Boss战
  • 用户提供薄荷代币
  • 使用CPI构建支付系统

测试

  • 测试用量规
  • 测试Solana程序
  • 使用Rust编写测试

发货一个质押应用程序

  • 构建一个质押用户界面
  • 构建一个代币铸造器
  • 把它们都放在一起
- - +

Solana Module4

本地环境设置和PDA

  • 👀 本地设置
  • 带有Gage的PDA
  • PDA深入探究
  • 在链上构建评论

跨程序调用

  • CPIs with Gage
  • 跨项目的Boss战
  • 用户提供薄荷代币
  • 使用CPI构建支付系统

测试

  • 测试用量规
  • 测试Solana程序
  • 使用Rust编写测试

发货一个质押应用程序

  • 构建一个质押用户界面
  • 构建一个代币铸造器
  • 把它们都放在一起
+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/index.html b/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/index.html index 770635e96..a3ca2bea4 100644 --- a/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/index.html +++ b/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/index.html @@ -3,15 +3,15 @@ -本地环境设置和PDA | All in One Solana - - - +本地环境设置和PDA | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/index.html b/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/index.html index 81cbe4632..1cab1ae5b 100644 --- a/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/index.html +++ b/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/index.html @@ -3,15 +3,15 @@ -🧐 PDA 深入探究 | All in One Solana - - - +🧐 PDA 深入探究 | All in One Solana + + +
-

🧐 PDA 深入探究

啊,鸡蛋。或者正式称之为:程序派生地址。我们之前已经用它们烹饪过。让我们打开它们看看它们是如何工作的。

PDA主要有两个主要功能:

  • 提供一种确定性的方法来查找程序拥有的账户的地址
  • 授权派生自PDA的程序代表其签署,就像用户可以使用他们的私钥签署一样

换句话说,它们是Solana网络上用于存储的安全键值存储。

🔎 寻找 PDAs (PDAs)

到目前为止,每当我们需要派生一个地址时,我们都使用了一个方便的函数。这个函数到底是做什么的呢?要找出答案,我们需要了解Solana密钥对是如何生成的。

回想一下密钥对的作用。它是一种证明你是你所说的那个人的方式。我们使用数字签名系统来实现这一点。Solana的密钥对是基于所谓的Ed25519椭圆曲线(你不需要知道这是什么鬼东西)。

由于PDAs是由程序控制的,所以它们不需要私钥。因此,我们使用不在Ed25519曲线上的地址来创建PDAs。这实际上意味着它们是没有相应私钥的公钥。

就是这样。你不需要理解Ed25519,甚至不需要知道数字签名算法是什么。你只需要知道PDA看起来像普通的Solana地址,并且由程序控制。如果你想进一步了解,可以看看Computerphile关于数字签名的酷炫视频。

要在Solana程序中找到一个PDA,我们将使用 find_program_address 函数。

“种子”是用于派生PDA的 find_program_address 函数的可选输入。例如,种子可以是任意组合:

  • 指令数据
  • 硬编码的值
  • 其他账户的公钥

find_program_address 函数提供了一个额外的种子,称为“bump seed”,以确保结果不在Ed25519曲线上

一旦找到有效的PDA,该函数将返回两个值:

  • PDA
  • the bump that was used to derive the PDA

let (pda, bump_seed) = Pubkey::find_program_address(&[user.key.as_ref(), user_input.as_bytes().as_ref(), "SEED".as_bytes()], program_id)

🍳 Under the hood of find_program_address

find_program_address 是一个冒牌货 - 它实际上将输入 seeds 和 program_id 传递给 try_find_program_address 函数

pub fn find_program_address(seeds: &[&[u8]], program_id: &Pubkey) -> (Pubkey, u8) {
Self::try_find_program_address(seeds, program_id)
.unwrap_or_else(|| panic!("Unable to find a viable program address bump seed"))
}

然后, try_find_program_address 函数引入了 bump_seed 。

bump_seed 是一个 u8 变量,其值范围在0到255之间,它被附加到可选的输入种子中,然后传递给 create_program_address 函数

pub fn try_find_program_address(seeds: &[&[u8]], program_id: &Pubkey) -> Option<(Pubkey, u8)> {

let mut bump_seed = [std::u8::MAX];
for _ in 0..std::u8::MAX {
{
let mut seeds_with_bump = seeds.to_vec();
seeds_with_bump.push(&bump_seed);
match Self::create_program_address(&seeds_with_bump, program_id) {
Ok(address) => return Some((address, bump_seed[0])),
Err(PubkeyError::InvalidSeeds) => (),
_ => break,
}
}
bump_seed[0] -= 1;
}
None

}

create_program_address 函数对种子和 program_id 执行一系列哈希操作。这些操作计算一个密钥,然后验证计算出的密钥是否位于Ed25519椭圆曲线上。

如果找到一个有效的PDA(即一个不在曲线上的地址),则返回该PDA。否则,返回一个错误。

pub fn create_program_address(
seeds: &[&[u8]],
program_id: &Pubkey,
) -> Result<Pubkey, PubkeyError> {

let mut hasher = crate::hash::Hasher::default();
for seed in seeds.iter() {
hasher.hash(seed);
}
hasher.hashv(&[program_id.as_ref(), PDA_MARKER]);
let hash = hasher.result();

if bytes_are_curve_point(hash) {
return Err(PubkeyError::InvalidSeeds);
}

Ok(Pubkey::new(hash.as_ref()))

}

总结一下:

  • 该函数将我们的输入种子和 program_id 传递给 try_find_program_address 函数。
  • try_find_program_address 函数将一个 bump_seed (从255开始)添加到我们的输入种子中,然后调用 create_program_address 函数,直到找到一个有效的PDA。
  • 一旦找到,PDA和 bump_seed 都会被归还。

你不需要记住所有的细节!重要的是要理解在高层次上调用 find_program_address 函数时发生了什么。

🤔 关于(PDA)的注意事项

- - +

🧐 PDA 深入探究

啊,鸡蛋。或者正式称之为:程序派生地址。我们之前已经用它们烹饪过。让我们打开它们看看它们是如何工作的。

PDA主要有两个主要功能:

  • 提供一种确定性的方法来查找程序拥有的账户的地址
  • 授权派生自PDA的程序代表其签署,就像用户可以使用他们的私钥签署一样

换句话说,它们是Solana网络上用于存储的安全键值存储。

🔎 寻找 PDAs (PDAs)

到目前为止,每当我们需要派生一个地址时,我们都使用了一个方便的函数。这个函数到底是做什么的呢?要找出答案,我们需要了解Solana密钥对是如何生成的。

回想一下密钥对的作用。它是一种证明你是你所说的那个人的方式。我们使用数字签名系统来实现这一点。Solana的密钥对是基于所谓的Ed25519椭圆曲线(你不需要知道这是什么鬼东西)。

由于PDAs是由程序控制的,所以它们不需要私钥。因此,我们使用不在Ed25519曲线上的地址来创建PDAs。这实际上意味着它们是没有相应私钥的公钥。

就是这样。你不需要理解Ed25519,甚至不需要知道数字签名算法是什么。你只需要知道PDA看起来像普通的Solana地址,并且由程序控制。如果你想进一步了解,可以看看Computerphile关于数字签名的酷炫视频。

要在Solana程序中找到一个PDA,我们将使用 find_program_address 函数。

“种子”是用于派生PDA的 find_program_address 函数的可选输入。例如,种子可以是任意组合:

  • 指令数据
  • 硬编码的值
  • 其他账户的公钥

find_program_address 函数提供了一个额外的种子,称为“bump seed”,以确保结果不在Ed25519曲线上

一旦找到有效的PDA,该函数将返回两个值:

  • PDA
  • the bump that was used to derive the PDA

let (pda, bump_seed) = Pubkey::find_program_address(&[user.key.as_ref(), user_input.as_bytes().as_ref(), "SEED".as_bytes()], program_id)

🍳 Under the hood of find_program_address

find_program_address 是一个冒牌货 - 它实际上将输入 seeds 和 program_id 传递给 try_find_program_address 函数

pub fn find_program_address(seeds: &[&[u8]], program_id: &Pubkey) -> (Pubkey, u8) {
Self::try_find_program_address(seeds, program_id)
.unwrap_or_else(|| panic!("Unable to find a viable program address bump seed"))
}

然后, try_find_program_address 函数引入了 bump_seed 。

bump_seed 是一个 u8 变量,其值范围在0到255之间,它被附加到可选的输入种子中,然后传递给 create_program_address 函数

pub fn try_find_program_address(seeds: &[&[u8]], program_id: &Pubkey) -> Option<(Pubkey, u8)> {

let mut bump_seed = [std::u8::MAX];
for _ in 0..std::u8::MAX {
{
let mut seeds_with_bump = seeds.to_vec();
seeds_with_bump.push(&bump_seed);
match Self::create_program_address(&seeds_with_bump, program_id) {
Ok(address) => return Some((address, bump_seed[0])),
Err(PubkeyError::InvalidSeeds) => (),
_ => break,
}
}
bump_seed[0] -= 1;
}
None

}

create_program_address 函数对种子和 program_id 执行一系列哈希操作。这些操作计算一个密钥,然后验证计算出的密钥是否位于Ed25519椭圆曲线上。

如果找到一个有效的PDA(即一个不在曲线上的地址),则返回该PDA。否则,返回一个错误。

pub fn create_program_address(
seeds: &[&[u8]],
program_id: &Pubkey,
) -> Result<Pubkey, PubkeyError> {

let mut hasher = crate::hash::Hasher::default();
for seed in seeds.iter() {
hasher.hash(seed);
}
hasher.hashv(&[program_id.as_ref(), PDA_MARKER]);
let hash = hasher.result();

if bytes_are_curve_point(hash) {
return Err(PubkeyError::InvalidSeeds);
}

Ok(Pubkey::new(hash.as_ref()))

}

总结一下:

  • 该函数将我们的输入种子和 program_id 传递给 try_find_program_address 函数。
  • try_find_program_address 函数将一个 bump_seed (从255开始)添加到我们的输入种子中,然后调用 create_program_address 函数,直到找到一个有效的PDA。
  • 一旦找到,PDA和 bump_seed 都会被归还。

你不需要记住所有的细节!重要的是要理解在高层次上调用 find_program_address 函数时发生了什么。

🤔 关于(PDA)的注意事项

+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/index.html b/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/index.html index 89da64754..eb67a0494 100644 --- a/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/index.html +++ b/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/index.html @@ -3,15 +3,15 @@ -👀 本地设置 | All in One Solana - - - +👀 本地设置 | All in One Solana + + +
-

👀 本地设置

是时候进入专业领域了。Solana游乐场是一个令人惊叹的工具,可以帮助你入门并部署到开发网络。然而,它还不适合本地开发,而这正是专业人士的做法。

本地设置需要几个步骤,但它更加强大 - 你基本上将在你的设备上运行一个本地版本的Solana网络。这带来了许多好处,包括几乎无限的SOL。

这个设置有两个主要部分

  • Rust编译器
  • Solana命令行界面

Windows用户

虽然Solana CLI可以在Windows上运行,但在Linux上运行会有更好的体验 - 您不会遇到Windows特定的问题,并且可以使用与MacOS/Linux用户相同的命令。

你在这里想要做的是安装Windows子系统用于Linux。在这里查看相关文档,它们非常有帮助。

从现在开始,每次我要求你运行Solana命令时,你应该在WSL2中运行它。我强烈推荐安装Windows终端应用程序,它具有漂亮的用户界面,并且可以轻松切换到WSL2。

你要在WSL2中安装Solana CLI和Rust编译器。这是一个与你的Windows安装分开的环境,所以如果你试图在错误的位置运行命令,会出现错误!!!

🦀 安装 Rust 编译器

最好的方法是按照官方指南进行操作。在这里查看它们。

🏄‍♂️ 安装 Solana 命令行界面 (CLI)

我还记得以前启动Solana CLI需要几个小时的时间。如今只需要几个命令!

您可以在这里找到适用于您特定操作系统的版本。

Windows用户应该按照Linux安装说明进行操作!

安装完成后,您应该得到一个版本的打印输出,而不是运行时出现错误

solana --version

如果你确定已经安装了所有的东西,但仍然出现错误,请关闭所有的终端窗口,然后在一个新的窗口中再次尝试。

⚙ Solana配置

Solana CLI有一些可以配置的选项,比如你想连接的网络和你的密钥对所在的位置。你可以使用以下命令获取当前配置的报告:

solana config get

这是我看到的:

Config File: /home/endgame/.config/solana/cli/config.yml
RPC URL: http://localhost:8899
WebSocket URL: ws://localhost:8900/ (computed)
Keypair Path: /home/endgame/.config/solana/id.json
Commitment: confirmed

有趣!以下是每个词的意思:

  • Config File - Solana CLI 文件位于您的计算机上
  • RPC URL - 您正在使用的终端点,将您连接到本地主机、开发网络或主网络
  • WebSocket URL - 监听来自目标集群的事件的 WebSocket(在设置 RPC URL 时计算)
  • Keypair Path - 运行Solana CLI子命令时使用的密钥对路径
  • Commitment - 提供了网络确认的度量,并描述了一个区块在特定时间点上的最终性程度

您可以使用 config set --url 命令来更改 RPC URL :

solana config set --url localhost

solana config set --url devnet

solana config set --url mainnet-beta

我们开发人员在生活中需要按键较少,因此可以将它们缩短为:

solana config set --u l

solana config set --u d

solana config set --u m

哇,节省了这么多时间,走起来吧!

密钥对

你经常需要使用不同的密钥对来测试交互,所以命令行界面(CLI)提供了一种简单的方式来管理你的密钥对。它将它们存储在你的文件夹中的JSON文件中。以下是你需要了解的所有与密钥对相关的命令

生成一个新的密钥对

solana-keygen new --outfile ~/<FILE_PATH>

设置默认密钥对

solana config set --keypair ~/<FILE_PATH>

获取当前默认密钥对的 publickey

solana address

获取当前默认密钥对的SOL余额

solana balance

空投到当前默认密钥对

solana airdrop 2

确保你将这些密钥文件保存安全,不要在测试和部署中使用相同的密钥对!你可不想因为不小心将密钥对推送到公共的 GitHub 仓库而丢失所有精美的 NFT。

本地验证器

Solana CLI带有一个方便的命令,可以快速启动本地验证节点。这类似于Solana网络的本地版本,您可以用它来测试您的程序。与部署到Devnet相比,它速度更快,而且您可以在不花费任何Devnet SOL的情况下使用它来测试您的程序。

您可以使用以下命令启动本地验证器:

solana-test-validator

在Windows上的WSL中,在尝试运行验证器之前,您需要运行此命令:

cd ~

我们正在切换目录到 ~ ,这样我们就不会在WSL内部的已挂载的Windows映像中了。这样修复了一些会出错的路径问题。

接下来,打开另一个终端窗口并输入

solana logs

这将为您提供本地网络的所有交易日志。在您进行交易之前,这里不会发生任何事情,所以打开第三个终端窗口并运行。

solana address
solana airdrop 999 YOUR_ADDRESS

你应该能看到空投交易的到来!挺酷的,对吧?

你可以通过日志和本地验证器做很多酷炫的事情,比如筛选特定程序的日志。点击这里查看更多酷炫的内容。

需要记住的一件事是,只要你需要网络运行,就必须保持终端窗口 solana-test-validator 一直运行。如果关闭它,网络也会关闭。在Windows上,您可以使用 CTRL + C 退出,而在Mac上,您可以使用 CMD + C 退出。

🦾 本地程序部署

既然你已经掌握了所有本地开发工具,那么让我们试着在本地部署一个程序吧!

首先,我们需要创建一个Solana程序。这就是我们安装Rust的原因。我们只需要一个简单的Rust项目:

cargo new --lib local-program
cd local-program
code .

Cargo就像Rust的NPM。它会生成我们所需的所有样板代码。如果 code . 无法打开VS Code,请不要担心,只需在代码编辑器中打开该目录的根目录即可。

打开 Cargo.toml 并添加Solana依赖项,将这个Rust项目变成一个Solana程序:

[package]
name = "<PROJECT_DIRECTORY_NAME>"
version = "0.1.0"
edition = "2021"

[features]
no-entrypoint = []

[dependencies]
solana-program = "~1.8.14"

[lib]
crate-type = ["cdylib", "lib"]

我们不能只部署一个空文件,所以打开 lib.rs 并添加以下内容:

use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg,
};

entrypoint!(process_instruction);

pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
msg!("Hello local Solana network!!");
Ok(())
}

这就是我们所需要的!接下来,我们需要构建这个。Cargo配备了一种特殊类型的构建命令,与Solana加载器相匹配:

cargo build-sbf

第一次可能需要几分钟,之后速度会更快。你会注意到出现了一个名为“target”的新文件夹。这是编译好的代码,准备好部署。要部署这个程序,你可以使用命令 solana program deploy <PATH> ,指向你的“target”文件夹,对我来说是

solana program deploy ~/Desktop/solana-core/local-program/target/deploy/local_program.so
- - +

👀 本地设置

是时候进入专业领域了。Solana游乐场是一个令人惊叹的工具,可以帮助你入门并部署到开发网络。然而,它还不适合本地开发,而这正是专业人士的做法。

本地设置需要几个步骤,但它更加强大 - 你基本上将在你的设备上运行一个本地版本的Solana网络。这带来了许多好处,包括几乎无限的SOL。

这个设置有两个主要部分

  • Rust编译器
  • Solana命令行界面

Windows用户

虽然Solana CLI可以在Windows上运行,但在Linux上运行会有更好的体验 - 您不会遇到Windows特定的问题,并且可以使用与MacOS/Linux用户相同的命令。

你在这里想要做的是安装Windows子系统用于Linux。在这里查看相关文档,它们非常有帮助。

从现在开始,每次我要求你运行Solana命令时,你应该在WSL2中运行它。我强烈推荐安装Windows终端应用程序,它具有漂亮的用户界面,并且可以轻松切换到WSL2。

你要在WSL2中安装Solana CLI和Rust编译器。这是一个与你的Windows安装分开的环境,所以如果你试图在错误的位置运行命令,会出现错误!!!

🦀 安装 Rust 编译器

最好的方法是按照官方指南进行操作。在这里查看它们。

🏄‍♂️ 安装 Solana 命令行界面 (CLI)

我还记得以前启动Solana CLI需要几个小时的时间。如今只需要几个命令!

您可以在这里找到适用于您特定操作系统的版本。

Windows用户应该按照Linux安装说明进行操作!

安装完成后,您应该得到一个版本的打印输出,而不是运行时出现错误

solana --version

如果你确定已经安装了所有的东西,但仍然出现错误,请关闭所有的终端窗口,然后在一个新的窗口中再次尝试。

⚙ Solana配置

Solana CLI有一些可以配置的选项,比如你想连接的网络和你的密钥对所在的位置。你可以使用以下命令获取当前配置的报告:

solana config get

这是我看到的:

Config File: /home/endgame/.config/solana/cli/config.yml
RPC URL: http://localhost:8899
WebSocket URL: ws://localhost:8900/ (computed)
Keypair Path: /home/endgame/.config/solana/id.json
Commitment: confirmed

有趣!以下是每个词的意思:

  • Config File - Solana CLI 文件位于您的计算机上
  • RPC URL - 您正在使用的终端点,将您连接到本地主机、开发网络或主网络
  • WebSocket URL - 监听来自目标集群的事件的 WebSocket(在设置 RPC URL 时计算)
  • Keypair Path - 运行Solana CLI子命令时使用的密钥对路径
  • Commitment - 提供了网络确认的度量,并描述了一个区块在特定时间点上的最终性程度

您可以使用 config set --url 命令来更改 RPC URL :

solana config set --url localhost

solana config set --url devnet

solana config set --url mainnet-beta

我们开发人员在生活中需要按键较少,因此可以将它们缩短为:

solana config set --u l

solana config set --u d

solana config set --u m

哇,节省了这么多时间,走起来吧!

密钥对

你经常需要使用不同的密钥对来测试交互,所以命令行界面(CLI)提供了一种简单的方式来管理你的密钥对。它将它们存储在你的文件夹中的JSON文件中。以下是你需要了解的所有与密钥对相关的命令

生成一个新的密钥对

solana-keygen new --outfile ~/<FILE_PATH>

设置默认密钥对

solana config set --keypair ~/<FILE_PATH>

获取当前默认密钥对的 publickey

solana address

获取当前默认密钥对的SOL余额

solana balance

空投到当前默认密钥对

solana airdrop 2

确保你将这些密钥文件保存安全,不要在测试和部署中使用相同的密钥对!你可不想因为不小心将密钥对推送到公共的 GitHub 仓库而丢失所有精美的 NFT。

本地验证器

Solana CLI带有一个方便的命令,可以快速启动本地验证节点。这类似于Solana网络的本地版本,您可以用它来测试您的程序。与部署到Devnet相比,它速度更快,而且您可以在不花费任何Devnet SOL的情况下使用它来测试您的程序。

您可以使用以下命令启动本地验证器:

solana-test-validator

在Windows上的WSL中,在尝试运行验证器之前,您需要运行此命令:

cd ~

我们正在切换目录到 ~ ,这样我们就不会在WSL内部的已挂载的Windows映像中了。这样修复了一些会出错的路径问题。

接下来,打开另一个终端窗口并输入

solana logs

这将为您提供本地网络的所有交易日志。在您进行交易之前,这里不会发生任何事情,所以打开第三个终端窗口并运行。

solana address
solana airdrop 999 YOUR_ADDRESS

你应该能看到空投交易的到来!挺酷的,对吧?

你可以通过日志和本地验证器做很多酷炫的事情,比如筛选特定程序的日志。点击这里查看更多酷炫的内容。

需要记住的一件事是,只要你需要网络运行,就必须保持终端窗口 solana-test-validator 一直运行。如果关闭它,网络也会关闭。在Windows上,您可以使用 CTRL + C 退出,而在Mac上,您可以使用 CMD + C 退出。

🦾 本地程序部署

既然你已经掌握了所有本地开发工具,那么让我们试着在本地部署一个程序吧!

首先,我们需要创建一个Solana程序。这就是我们安装Rust的原因。我们只需要一个简单的Rust项目:

cargo new --lib local-program
cd local-program
code .

Cargo就像Rust的NPM。它会生成我们所需的所有样板代码。如果 code . 无法打开VS Code,请不要担心,只需在代码编辑器中打开该目录的根目录即可。

打开 Cargo.toml 并添加Solana依赖项,将这个Rust项目变成一个Solana程序:

[package]
name = "<PROJECT_DIRECTORY_NAME>"
version = "0.1.0"
edition = "2021"

[features]
no-entrypoint = []

[dependencies]
solana-program = "~1.8.14"

[lib]
crate-type = ["cdylib", "lib"]

我们不能只部署一个空文件,所以打开 lib.rs 并添加以下内容:

use solana_program::{
account_info::AccountInfo,
entrypoint,
entrypoint::ProgramResult,
pubkey::Pubkey,
msg,
};

entrypoint!(process_instruction);

pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
msg!("Hello local Solana network!!");
Ok(())
}

这就是我们所需要的!接下来,我们需要构建这个。Cargo配备了一种特殊类型的构建命令,与Solana加载器相匹配:

cargo build-sbf

第一次可能需要几分钟,之后速度会更快。你会注意到出现了一个名为“target”的新文件夹。这是编译好的代码,准备好部署。要部署这个程序,你可以使用命令 solana program deploy <PATH> ,指向你的“target”文件夹,对我来说是

solana program deploy ~/Desktop/solana-core/local-program/target/deploy/local_program.so
+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module5/index.html b/docs/Solana-Co-Learn/module5/index.html index d9236940b..684a16276 100644 --- a/docs/Solana-Co-Learn/module5/index.html +++ b/docs/Solana-Co-Learn/module5/index.html @@ -3,15 +3,15 @@ -Anchor Program Development | All in One Solana - - - +Anchor Program Development | All in One Solana + + +
-

Anchor Program Development

  • Anchor 开发简介
    • intro to Solana
    • Core Concepts
      • High-level Overview
      • The Accounts Struct
      • The Program Module
      • Errors
      • Cross-Program Invocations
      • Program Derived Address
  • anchor client 开发简介
  • Anchor PDAs与账户
  • Anchor CPIs与error
- - +

Anchor Program Development

  • Anchor 开发简介
    • intro to Solana
    • Core Concepts
      • High-level Overview
      • The Accounts Struct
      • The Program Module
      • Errors
      • Cross-Program Invocations
      • Program Derived Address
  • anchor client 开发简介
  • Anchor PDAs与账户
  • Anchor CPIs与error
+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/module6/index.html b/docs/Solana-Co-Learn/module6/index.html index 59baaef25..dca8de3ad 100644 --- a/docs/Solana-Co-Learn/module6/index.html +++ b/docs/Solana-Co-Learn/module6/index.html @@ -3,15 +3,15 @@ -Beyond the Basics | All in One Solana - - - +Beyond the Basics | All in One Solana + + +
-
- - +
+ + \ No newline at end of file diff --git a/docs/Solana-Co-Learn/modules/index.html b/docs/Solana-Co-Learn/modules/index.html index 1ea1fb81a..97a69442b 100644 --- a/docs/Solana-Co-Learn/modules/index.html +++ b/docs/Solana-Co-Learn/modules/index.html @@ -3,15 +3,15 @@ -README | All in One Solana - - - +README | All in One Solana + + +
-

README

Solana program of Solidity by Solang Developement

  • Solidity 与PDAs
  • Solidity 与 CPIs
  • etc

Solana程序安全

  • 如何处理程序安全模块
  • 签名人授权
  • Owner check
  • 账户数据匹配
  • 重新初始化攻击
  • 重复的可变账户
  • Type cosplay
  • Arbitrary CPIs
  • 碰撞种子规范化
  • 关闭账户和恢复攻击
  • PDA sharing

其他

  • 如何在Solana中使用The Graph
  • Oracles Pyth sdk的使用
  • TipLink 如何使用
  • 如何在quicknode申请RPC endpoint
  • 如何在helius申请RPC endpoint
  • etc ...
- - +

README

Solana program of Solidity by Solang Developement

  • Solidity 与PDAs
  • Solidity 与 CPIs
  • etc

Solana程序安全

  • 如何处理程序安全模块
  • 签名人授权
  • Owner check
  • 账户数据匹配
  • 重新初始化攻击
  • 重复的可变账户
  • Type cosplay
  • Arbitrary CPIs
  • 碰撞种子规范化
  • 关闭账户和恢复攻击
  • PDA sharing

其他

  • 如何在Solana中使用The Graph
  • Oracles Pyth sdk的使用
  • TipLink 如何使用
  • 如何在quicknode申请RPC endpoint
  • 如何在helius申请RPC endpoint
  • etc ...
+ + \ No newline at end of file diff --git a/docs/intro/index.html b/docs/intro/index.html index 8fe9e500a..eba6a6ee6 100644 --- a/docs/intro/index.html +++ b/docs/intro/index.html @@ -3,15 +3,15 @@ -Start | All in One Solana - - - +Start | All in One Solana + + + - - + + + \ No newline at end of file diff --git a/hello/index.html b/hello/index.html index 554c72b97..658d5e45d 100644 --- a/hello/index.html +++ b/hello/index.html @@ -3,15 +3,15 @@ -Hello | All in One Solana - - - +Hello | All in One Solana + + +
-

修改 pages/helloReact.js,然后保存,页面会重载。

- - +

修改 pages/helloReact.js,然后保存,页面会重载。

+ + \ No newline at end of file diff --git a/index.html b/index.html index f16d31a63..7f042e13c 100644 --- a/index.html +++ b/index.html @@ -3,15 +3,15 @@ -Hello from All in One Solana | All in One Solana - - - +Hello from All in One Solana | All in One Solana + + +
-

All in One Solana

Power by Davirain

Solana CookBook Zh

📖Solana CookBook 中文翻译版本

Solana Co Learn

💾Solana 共学学习资料

- - +

All in One Solana

Power by Davirain

Solana CookBook Zh

📖Solana CookBook 中文翻译版本

Solana Co Learn

💾Solana 共学学习资料

+ + \ No newline at end of file diff --git a/markdown-page/index.html b/markdown-page/index.html index e02aa82fe..405855a5d 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -3,15 +3,15 @@ -Markdown page example | All in One Solana - - - +Markdown page example | All in One Solana + + +
-

Markdown page example

You don't need React to write simple standalone pages.

- - +

Markdown page example

You don't need React to write simple standalone pages.

+ + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 2c9face61..5d8e56e3c 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://www.all-in-one-blockchain.xyz/blogweekly0.5https://www.all-in-one-blockchain.xyz/blog/archiveweekly0.5https://www.all-in-one-blockchain.xyz/blog/first-blog-postweekly0.5https://www.all-in-one-blockchain.xyz/blog/tagsweekly0.5https://www.all-in-one-blockchain.xyz/blog/tags/blockchainweekly0.5https://www.all-in-one-blockchain.xyz/blog/tags/blogweekly0.5https://www.all-in-one-blockchain.xyz/blog/tags/ibcweekly0.5https://www.all-in-one-blockchain.xyz/blog/tags/solanaweekly0.5https://www.all-in-one-blockchain.xyz/helloweekly0.5https://www.all-in-one-blockchain.xyz/markdown-pageweekly0.5https://www.all-in-one-blockchain.xyz/docs/introweekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/client-side-development/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/custom-instruction/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/local_program_development/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_helloweekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/local_program_development/native_program_helloweekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/local_program_development/solang_program_helloweekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/start-your-own-custom-project/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/wallet-usage/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/wallets-and-frontends/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/spl-token/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/spl-token/the-token-program/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module2/spl-token/token-metadata/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/introduction-to-rust/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/native-solana-development/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/native-solana-development/state-management/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/nft-staking/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/security-and-validation/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module4/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module5/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/module6/weekly0.5https://www.all-in-one-blockchain.xyz/docs/Solana-Co-Learn/modules/weekly0.5https://www.all-in-one-blockchain.xyz/weekly0.5 \ No newline at end of file +https://www.all-in-one-blockchain.xyz/all-in-one-solana/blogweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/archiveweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/first-blog-postweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/tagsweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/tags/blockchainweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/tags/blogweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/tags/ibcweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/blog/tags/solanaweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/helloweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/markdown-pageweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/introweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/custom-instructions/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/anchor_program_helloweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/native_program_helloweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/local_program_development/solang_program_helloweekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/wallet-usage/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/the-token-program/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module2/spl-token/token-metadata/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/hello-world/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/state-management/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/nft-staking/how-staking-works/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module3/security-and-validation/secure-our-program/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module4/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/pda-deep-dive/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module4/local-ent-setup-and-pdas/setting-up-locally/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module5/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/module6/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/docs/Solana-Co-Learn/modules/weekly0.5https://www.all-in-one-blockchain.xyz/all-in-one-solana/weekly0.5 \ No newline at end of file